Merge pull request 'split page actions into separate module' (#54) from page-actions into main
Reviewed-on: https://codeberg.org/macchiato/pages/pulls/54page-actions
commit
34fb5b07cc
@ -0,0 +1,185 @@
|
||||
export class PageActions {
|
||||
textEn = {
|
||||
download: 'Download',
|
||||
rename: 'Move/Rename',
|
||||
duplicate: 'Duplicate',
|
||||
delete_: 'Delete',
|
||||
confirmDelete: f => (
|
||||
`Are you sure you want to delete ${f}?`
|
||||
),
|
||||
cancel: 'Cancel',
|
||||
alreadyExists: 'There is already a page with that name.',
|
||||
}
|
||||
|
||||
textEs = {
|
||||
download: 'Descargar',
|
||||
rename: 'Mover/Renombrar',
|
||||
duplicate: 'Duplicar',
|
||||
delete_: 'Borrar',
|
||||
confirmDelete: f => (
|
||||
`¿Desea borrar ${f}?`
|
||||
),
|
||||
cancel: 'Cancelar',
|
||||
alreadyExists: 'Ya existe una página con ese nombre.',
|
||||
}
|
||||
|
||||
constructor() {
|
||||
this.language = navigator.language
|
||||
this.menuActions = [
|
||||
{
|
||||
text: this.text.download,
|
||||
click: this.download.bind(this),
|
||||
},
|
||||
{
|
||||
text: this.text.rename,
|
||||
click: this.rename.bind(this),
|
||||
},
|
||||
{
|
||||
text: this.text.duplicate,
|
||||
click: this.duplicate.bind(this),
|
||||
},
|
||||
{
|
||||
text: this.text.delete_,
|
||||
click: this.delete_.bind(this),
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
download() {
|
||||
const text = localStorage.getItem(this.path)
|
||||
const sp = this.path.split('/')
|
||||
const filename = sp[sp.length - 1]
|
||||
const el = document.createElement('a')
|
||||
el.setAttribute(
|
||||
'href',
|
||||
'data:text/plain;charset=utf-8,' +
|
||||
encodeURIComponent(text)
|
||||
)
|
||||
el.setAttribute('download', filename)
|
||||
el.style.display = 'none'
|
||||
this.shadowRoot.appendChild(el)
|
||||
el.click()
|
||||
this.shadowRoot.removeChild(el)
|
||||
}
|
||||
|
||||
rename() {
|
||||
const dialog = document.createElement(
|
||||
'm-dialog'
|
||||
)
|
||||
this.dialogWrap.replaceChildren(dialog)
|
||||
const input = document.createElement('input')
|
||||
input.value = this.path
|
||||
input.style.minWidth = '300px'
|
||||
dialog.bodyEl.appendChild(input)
|
||||
let errorEl
|
||||
const bGroup = document.createElement(
|
||||
'm-forms-button-group'
|
||||
)
|
||||
bGroup.addPrimary(this.text.rename, () => {
|
||||
const newPath = input.value
|
||||
const v = localStorage.getItem(newPath)
|
||||
if (v !== null || newPath === this.path) {
|
||||
if (!errorEl) {
|
||||
errorEl = document.createElement('p')
|
||||
errorEl.style.color = 'red'
|
||||
const errText = this.text.alreadyExists
|
||||
errorEl.innerText = errText
|
||||
dialog.bodyEl.appendChild(errorEl)
|
||||
}
|
||||
return
|
||||
}
|
||||
localStorage.setItem(
|
||||
newPath,
|
||||
localStorage.getItem(this.path)
|
||||
)
|
||||
localStorage.removeItem(this.path)
|
||||
dialog.close()
|
||||
location.hash = newPath
|
||||
})
|
||||
bGroup.addCancel(this.text.cancel, () => {
|
||||
dialog.close()
|
||||
})
|
||||
dialog.footerEl.appendChild(bGroup)
|
||||
dialog.open()
|
||||
}
|
||||
|
||||
duplicate() {
|
||||
const dialog = document.createElement(
|
||||
'm-dialog'
|
||||
)
|
||||
this.dialogWrap.replaceChildren(dialog)
|
||||
const input = document.createElement('input')
|
||||
input.value = this.path
|
||||
input.style.minWidth = '300px'
|
||||
dialog.bodyEl.appendChild(input)
|
||||
let errorEl
|
||||
const bGroup = document.createElement(
|
||||
'm-forms-button-group'
|
||||
)
|
||||
const btnText = this.text.duplicate
|
||||
bGroup.addPrimary(btnText, () => {
|
||||
const newPath = input.value
|
||||
const v = localStorage.getItem(newPath)
|
||||
if (v !== null || newPath === this.path) {
|
||||
if (!errorEl) {
|
||||
errorEl = document.createElement('p')
|
||||
errorEl.style.color = 'red'
|
||||
const errText = this.text.alreadyExists
|
||||
errorEl.innerText = errText
|
||||
dialog.bodyEl.appendChild(errorEl)
|
||||
}
|
||||
return
|
||||
}
|
||||
localStorage.setItem(
|
||||
newPath,
|
||||
localStorage.getItem(this.path)
|
||||
)
|
||||
dialog.close()
|
||||
location.hash = newPath
|
||||
})
|
||||
bGroup.addCancel(this.text.cancel, () => {
|
||||
dialog.close()
|
||||
})
|
||||
dialog.footerEl.appendChild(bGroup)
|
||||
dialog.open()
|
||||
}
|
||||
|
||||
delete_() {
|
||||
const dialog = document.createElement(
|
||||
'm-dialog'
|
||||
)
|
||||
this.dialogWrap.replaceChildren(dialog)
|
||||
const p = document.createElement('p')
|
||||
p.innerText = this.text.confirmDelete(
|
||||
JSON.stringify(this.path)
|
||||
)
|
||||
dialog.bodyEl.appendChild(p)
|
||||
|
||||
const bGroup = document.createElement(
|
||||
'm-forms-button-group'
|
||||
)
|
||||
bGroup.addPrimary(this.text.delete_, () => {
|
||||
localStorage.removeItem(this.path)
|
||||
location.hash = '/'
|
||||
dialog.close()
|
||||
})
|
||||
bGroup.addCancel(this.text.cancel, () => {
|
||||
dialog.close()
|
||||
})
|
||||
dialog.footerEl.appendChild(bGroup)
|
||||
dialog.open()
|
||||
}
|
||||
|
||||
get language() {
|
||||
return this._language
|
||||
}
|
||||
|
||||
set language(language) {
|
||||
this._language = language
|
||||
this.text = this.langEs ? this.textEs : this.textEn
|
||||
}
|
||||
|
||||
get langEs() {
|
||||
return /^es\b/.test(this.language)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue