diff --git a/src/pages/account/document-validation.ts b/src/pages/account/document-validation.ts index b99fca1..bd67d15 100644 --- a/src/pages/account/document-validation.ts +++ b/src/pages/account/document-validation.ts @@ -17,25 +17,36 @@ export function getDocumentValidation(container: HTMLElement) { } container.innerHTML = ''; - container.style.display = 'flex'; - container.style.justifyContent = 'center'; - container.style.gap = '2rem'; - container.style.padding = '2rem'; + container.style.cssText = ` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + min-height: 100vh; + gap: 2rem; + `; - const createDropButton = (label: string, onDrop: (file: File, updateVisuals: (file: File) => void) => void): HTMLElement => { - const button = document.createElement('div'); - button.style.cssText = ` + function createDropButton( + label: string, + onDrop: (file: File, updateVisuals: (file: File) => void) => void, + accept: string = '*/*' + ): HTMLElement { + const wrapper = document.createElement('div'); + wrapper.style.cssText = ` width: 200px; height: 100px; border: 2px dashed #888; border-radius: 8px; display: flex; + flex-direction: column; align-items: center; justify-content: center; cursor: pointer; font-weight: bold; background: #f8f8f8; text-align: center; + padding: 0.5rem; + box-sizing: border-box; `; const title = document.createElement('div'); @@ -50,35 +61,57 @@ export function getDocumentValidation(container: HTMLElement) { text-align: center; `; - button.appendChild(title); - button.appendChild(filename); + wrapper.appendChild(title); + wrapper.appendChild(filename); const updateVisuals = (file: File) => { - button.style.borderColor = 'green'; - button.style.background = '#e6ffed'; + wrapper.style.borderColor = 'green'; + wrapper.style.background = '#e6ffed'; filename.textContent = file.name; }; - button.ondragover = e => { - e.preventDefault(); - button.style.background = '#e0e0e0'; + // === Hidden file input === + const fileInput = document.createElement('input'); + fileInput.type = 'file'; + fileInput.accept = accept; + fileInput.style.display = 'none'; + document.body.appendChild(fileInput); + + fileInput.onchange = () => { + const file = fileInput.files?.[0]; + if (file) { + onDrop(file, updateVisuals); + fileInput.value = ''; // reset so same file can be re-selected + } }; - button.ondragleave = () => { - button.style.background = '#f8f8f8'; + // === Handle drag-and-drop === + wrapper.ondragover = e => { + e.preventDefault(); + wrapper.style.background = '#e0e0e0'; }; - button.ondrop = async e => { + wrapper.ondragleave = () => { + wrapper.style.background = '#f8f8f8'; + }; + + wrapper.ondrop = e => { e.preventDefault(); - button.style.background = '#f8f8f8'; + wrapper.style.background = '#f8f8f8'; const file = e.dataTransfer?.files?.[0]; - if (!file) return; - onDrop(file, updateVisuals); + if (file) { + onDrop(file, updateVisuals); + } }; - return button; - }; + // === Handle click to open file manager === + wrapper.onclick = () => { + fileInput.click(); + }; + + return wrapper; + } const fileDropButton = createDropButton('Drop file', async (file, updateVisuals) => { try { @@ -120,8 +153,13 @@ export function getDocumentValidation(container: HTMLElement) { } }); - container.appendChild(fileDropButton); - container.appendChild(certDropButton); + const buttonRow = document.createElement('div'); + buttonRow.style.display = 'flex'; + buttonRow.style.gap = '2rem'; + buttonRow.appendChild(fileDropButton); + buttonRow.appendChild(certDropButton); + + container.appendChild(buttonRow); async function checkReady() { if (state.file && state.certificate && state.commitmentHashes.length > 0) {