window.addEventListener("DOMContentLoaded", function () { /** * * @type ComboModal modalManager */ async function openMetaViewer(modalViewer, modalManager, pageId) { if (modalViewer.wasBuild()) { modalViewer.show(); return; } const viewerCallEndpoint = "combo-meta-viewer"; const combo = /** @type {import('combo.d.ts')} */ (window.combo); let viewerCall = combo .DokuUrl .createAjax(viewerCallEndpoint) .setProperty("id", pageId) .toRequest(); let jsonFormMeta = await viewerCall.getJson(); let formViewerId = combo.Html.toHtmlId(`combo-metadata-viewer-form-${pageId}`); let formHtmlElement = combo.Form.createFromJson(formViewerId, jsonFormMeta).toHtmlElement(); /** * Submit Button */ let submitButton = document.createElement("button"); submitButton.classList.add("btn", "btn-primary"); submitButton.setAttribute("type", "submit"); submitButton.setAttribute("form", formHtmlElement.id); submitButton.innerText = "Submit"; submitButton.addEventListener("click", async function (event) { event.preventDefault(); let formData = new FormData(formHtmlElement); let response = await combo.DokuUrl .createAjax(viewerCallEndpoint) .toRequest() .setMethod("post") .sendFormDataAsJson(formData); modalViewer.reset(); modalManager.reset(); await processResponse(response, () => openMetaViewer(modalViewer, modalManager, pageId)); }); modalViewer .setCallBackOnClose(() => openMetadataManager(pageId)) .setHeader("Metadata Viewer") .addBody(`

The metadata viewer shows you the content of the metadata file (ie all metadata managed by ComboStrap or not):

`) .addBody(formHtmlElement) .addFooterCloseButton() .addFooterButton(submitButton) .show(); } const metaManagerCall = "combo-meta-manager"; /** * * @param {Response} response * @param {function} callBack * @return {Promise} */ async function processResponse(response, callBack) { let modalMessage = []; if (response.status !== 200) { modalMessage.push(`Error, unable to save. (return code: ${response.status})`); } try { let json = await response.json(); if (json !== null) { if (json.hasOwnProperty("message")) { let jsonMessage = json["message"]; if (Array.isArray(jsonMessage)) { modalMessage = modalMessage.concat(jsonMessage); } else { modalMessage.push(jsonMessage) } } } } catch (/** @type Error */ e) { modalMessage.push(e.message) } const combo = /** @type {import('combo.d.ts')} */ (window.combo); combo.Modal .createTemporary() .setCallBackOnClose(callBack) .centered() .addBody(modalMessage.join("
")) .show(); } let openMetadataManager = async function (pageId) { /** * The manager modal root * (used in button) */ const combo = /** @type {import('combo.d.ts')} */ (window.combo); let modalManagerId = combo.Html.toHtmlId(`combo-meta-manager-page-${pageId}`); let managerModal = combo.Modal.getOrCreate(modalManagerId) .addDialogClass("modal-fullscreen-md-down"); if (managerModal.wasBuild()) { managerModal.show(); return; } /** * The viewer * We create it here because it needs to be reset if there is a submit on the manager. */ let modalViewerId = combo.Html.toHtmlId(`combo-metadata-viewer-modal-${pageId}`); let modalViewer = combo.Modal.getOrCreate(modalViewerId) .addDialogClass("modal-fullscreen-md-down"); /** * Creating the form */ let formMetadata = await combo .DokuUrl .createAjax(metaManagerCall) .setProperty("id", pageId) .toRequest() .getJson(); let formId = combo.Html.toHtmlId(`${modalManagerId}-form`); let form = combo.Form.createFromJson(formId, formMetadata); let htmlFormElement = form.toHtmlElement(); /** * Viewer Button */ let viewerButton = document.createElement("button"); viewerButton.classList.add("btn", "btn-link", "text-primary", "text-decoration-bone", "fs-6", "text-muted"); viewerButton.style.setProperty("font-weight", "300"); viewerButton.textContent = "Open Metadata Viewer"; viewerButton.addEventListener("click", async function () { managerModal.dismissHide(); await openMetaViewer(modalViewer, managerModal, pageId); }); /** * Submit Button */ let submitButton = document.createElement("button"); submitButton.classList.add("btn", "btn-primary"); submitButton.setAttribute("type", "submit"); submitButton.setAttribute("form", formId); submitButton.innerText = "Submit"; submitButton.addEventListener("click", async function (event) { event.preventDefault(); let formData = new FormData(htmlFormElement); let response = await combo.DokuUrl.createAjax(metaManagerCall) .toRequest() .setMethod("post") .sendFormDataAsJson(formData); managerModal.reset(); modalViewer.reset(); /** * Send a cron request to re-render if any */ fetch(combo.DokuUrl.createRunner().toString(), {method: "GET"}) .then((response) => { if (response.status !== 200) { console.error('Bad runner request, status Code is: ' + response.status); } } ); await processResponse(response, () => openMetadataManager(pageId)); }) /** * The modal */ managerModal .resetIfBuild() .setHeader(`Metadata Manager for Page (${pageId})`) .addBody(htmlFormElement) .addFooterButton(viewerButton) .addFooterCloseButton() .addFooterButton(submitButton) .show(); } document.querySelectorAll(".combo_metadata_item").forEach((metadataControlItem) => { metadataControlItem.addEventListener("click", function (event) { event.preventDefault(); if(!('JSINFO' in window)){ throw new Error("JSINFO is not available") } const JSINFO = window.JSINFO; void openMetadataManager(JSINFO.id) .catch(e => { if (e instanceof Error) { console.error(e.stack) } else { console.error(e.toString()) } }); }); }); } ) ;