4 changed files with 201 additions and 135 deletions
@ -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