dragoid
Version:
Download and read novels offline
166 lines (138 loc) • 4.57 kB
JavaScript
import { ui } from "../../../utils/ui.js"
import { iconBack, iconCheck, iconDelete, iconPlus, iconSave } from "../../icons.js"
const ReplacementFormInput = ({
text,
replace,
onDelete,
onInput
}) => {
const { input, div, button, p } = ui()
const inputText = input({
onInput: onInput, class: 'input', value: text, 'data-type': 'text', placeholder: 'text'
})
const inputReplace = input({
onInput: onInput, class: 'input', value: replace, 'data-type': 'replace', placeholder: 'replace'
})
const divider = div({ class: 'divider' }, "/");
const btnDelete = button(
{ class: 'btn-delete', onClick: onDelete, type: 'button' },
iconDelete()
)
const errorMessage = p({ class: 'input-error-message' })
return div(
{ class: 'group-input' },
[inputText, divider, inputReplace, btnDelete, errorMessage]
)
}
const AddReplacementFormInput = (onClick) => {
const { button, span } = ui();
return button(
{ class: 'btn-add', onClick: onClick, type: 'button' },
[iconPlus(), span('New replacement')]
)
}
const ReplacementFormActions = (onBack, onSave) => {
const { div, span, button } = ui();
return div({ class: 'editor-actions' }, [
button(
{ onClick: onBack, class: ['button', 'button-back'] },
[iconBack(), span('Back')]),
button(
{ onClick: onSave, disabled: true, class: ['button', 'button-save'] },
[iconSave(), span('Save')])
])
}
export const EditorFormView = (
items = [],
onBack,
onSave,
{ onInput, onDelete }
) => {
const { div, p, form } = ui()
const editor = div({ class: 'editor' })
const wrapper = div({ class: 'wrapper' })
const emptyMessage = p({ class: 'empty' }, 'Your replacement list is empty')
if (items.length === 0) {
wrapper.appendChild(emptyMessage)
}
const itemsForView = items.map(item => ReplacementFormInput({
text: item.text,
replace: item.replace,
onInput: item.onInput,
onDelete: item.onDelete
}))
if (itemsForView.length > 0) {
wrapper.replaceChildren()
wrapper.append(...itemsForView)
}
const addNewReplaceInput = ({ text, replace, onDelete, onInput }) => {
if (wrapper.firstChild === emptyMessage) {
wrapper.firstChild.remove()
}
const item = ReplacementFormInput({
text, replace, onDelete, onInput
})
wrapper.appendChild(item)
}
const editorContainer = form({ class: 'editor-form' }, [
AddReplacementFormInput(
() => addNewReplaceInput({ text: '', replace: '', onDelete, onInput })
),
wrapper
])
editor.append(
editorContainer,
ReplacementFormActions(onBack, onSave)
)
return {
editor: editor,
enableButton: () => {
editor.querySelector('.button-save')?.removeAttribute('disabled')
},
flashSaveSuccess: () => {
const btnSave = editor.querySelector('.button-save');
if (btnSave) {
btnSave.replaceChildren();
btnSave.append(iconCheck(), 'List Updated');
setTimeout(() => {
btnSave.replaceChildren();
btnSave.append(iconSave(), 'Save')
}, 1000);
}
},
getInputValues: () => {
const allGroupInputs = wrapper.querySelectorAll('.group-input');
const collectedData = Array.from(allGroupInputs).map(el => {
const inputText = el.querySelector('input[data-type="text"');
const InputReplacement = el.querySelector('input[data-type="replace"')
return [inputText?.value, InputReplacement?.value]
})
return collectedData;
},
deleteItemInputs: (item) => {
if (!item) return;
item.remove()
// Check if empty list
const allGroupInputs = wrapper.querySelectorAll('.group-input')
if (allGroupInputs.length === 0) {
wrapper.appendChild(emptyMessage)
}
},
showInputError: ({ message, index, key }) => {
const allGroupInputs = wrapper.querySelectorAll('.group-input');
const elErrorMessage = allGroupInputs[index].querySelector('.input-error-message');
const input = allGroupInputs[index].querySelector(`input[data-type="${key}"`);
if (input) {
elErrorMessage.textContent = message;
input.classList.add('invalid')
input.focus()
}
},
clearInvalid: () => {
const allInputs = wrapper.querySelectorAll('input.invalid');
const allMessageErrors = wrapper.querySelectorAll('.input-error-message');
allInputs.forEach(input => input.classList.remove('invalid'));
allMessageErrors.forEach(el => { el.textContent = '' })
}
}
}