1 2window.addEventListener("DOMContentLoaded", function () { 3 4 5 /** 6 * 7 * @type ComboModal modalManager 8 */ 9 async function openMetaViewer(modalViewer, modalManager, pageId) { 10 11 12 if (modalViewer.wasBuild()) { 13 modalViewer.show(); 14 return; 15 } 16 17 const viewerCallEndpoint = "combo-meta-viewer"; 18 const combo = /** @type {import('combo.d.ts')} */ (window.combo); 19 let viewerCall = combo 20 .DokuUrl 21 .createAjax(viewerCallEndpoint) 22 .setProperty("id", pageId) 23 .toRequest(); 24 let jsonFormMeta = await viewerCall.getJson(); 25 26 27 let formViewerId = combo.Html.toHtmlId(`combo-metadata-viewer-form-${pageId}`); 28 let formHtmlElement = combo.Form.createFromJson(formViewerId, jsonFormMeta).toHtmlElement(); 29 30 /** 31 * Submit Button 32 */ 33 let submitButton = document.createElement("button"); 34 submitButton.classList.add("btn", "btn-primary"); 35 submitButton.setAttribute("type", "submit"); 36 submitButton.setAttribute("form", formHtmlElement.id); 37 submitButton.innerText = "Submit"; 38 submitButton.addEventListener("click", async function (event) { 39 event.preventDefault(); 40 let formData = new FormData(formHtmlElement); 41 let response = await combo.DokuUrl 42 .createAjax(viewerCallEndpoint) 43 .toRequest() 44 .setMethod("post") 45 .sendFormDataAsJson(formData); 46 modalViewer.reset(); 47 modalManager.reset(); 48 await processResponse(response, () => openMetaViewer(modalViewer, modalManager, pageId)); 49 }); 50 modalViewer 51 .setCallBackOnClose(() => openMetadataManager(pageId)) 52 .setHeader("Metadata Viewer") 53 .addBody(`<p>The metadata viewer shows you the content of the metadata file (ie all metadata managed by ComboStrap or not):</p>`) 54 .addBody(formHtmlElement) 55 .addFooterCloseButton() 56 .addFooterButton(submitButton) 57 .show(); 58 59 60 } 61 62 63 const metaManagerCall = "combo-meta-manager"; 64 65 /** 66 * 67 * @param {Response} response 68 * @param {function} callBack 69 * @return {Promise<void>} 70 */ 71 async function processResponse(response, callBack) { 72 let modalMessage = []; 73 if (response.status !== 200) { 74 modalMessage.push(`Error, unable to save. (return code: ${response.status})`); 75 } 76 try { 77 let json = await response.json(); 78 if (json !== null) { 79 if (json.hasOwnProperty("message")) { 80 let jsonMessage = json["message"]; 81 if (Array.isArray(jsonMessage)) { 82 modalMessage = modalMessage.concat(jsonMessage); 83 } else { 84 modalMessage.push(jsonMessage) 85 } 86 } 87 } 88 } catch (/** @type Error */ e) { 89 modalMessage.push(e.message) 90 } 91 const combo = /** @type {import('combo.d.ts')} */ (window.combo); 92 combo.Modal 93 .createTemporary() 94 .setCallBackOnClose(callBack) 95 .centered() 96 .addBody(modalMessage.join("<br>")) 97 .show(); 98 } 99 100 let openMetadataManager = async function (pageId) { 101 102 103 /** 104 * The manager modal root 105 * (used in button) 106 */ 107 const combo = /** @type {import('combo.d.ts')} */ (window.combo); 108 let modalManagerId = combo.Html.toHtmlId(`combo-meta-manager-page-${pageId}`); 109 let managerModal = combo.Modal.getOrCreate(modalManagerId) 110 .addDialogClass("modal-fullscreen-md-down"); 111 if (managerModal.wasBuild()) { 112 managerModal.show(); 113 return; 114 } 115 116 /** 117 * The viewer 118 * We create it here because it needs to be reset if there is a submit on the manager. 119 */ 120 let modalViewerId = combo.Html.toHtmlId(`combo-metadata-viewer-modal-${pageId}`); 121 let modalViewer = combo.Modal.getOrCreate(modalViewerId) 122 .addDialogClass("modal-fullscreen-md-down"); 123 124 /** 125 * Creating the form 126 */ 127 let formMetadata = await combo 128 .DokuUrl 129 .createAjax(metaManagerCall) 130 .setProperty("id", pageId) 131 .toRequest() 132 .getJson(); 133 let formId = combo.Html.toHtmlId(`${modalManagerId}-form`); 134 let form = combo.Form.createFromJson(formId, formMetadata); 135 let htmlFormElement = form.toHtmlElement(); 136 137 138 /** 139 * Viewer Button 140 */ 141 let viewerButton = document.createElement("button"); 142 viewerButton.classList.add("btn", "btn-link", "text-primary", "text-decoration-bone", "fs-6", "text-muted"); 143 viewerButton.style.setProperty("font-weight", "300"); 144 viewerButton.textContent = "Open Metadata Viewer"; 145 viewerButton.addEventListener("click", async function () { 146 managerModal.dismissHide(); 147 await openMetaViewer(modalViewer, managerModal, pageId); 148 }); 149 150 /** 151 * Submit Button 152 */ 153 let submitButton = document.createElement("button"); 154 submitButton.classList.add("btn", "btn-primary"); 155 submitButton.setAttribute("type", "submit"); 156 submitButton.setAttribute("form", formId); 157 submitButton.innerText = "Submit"; 158 submitButton.addEventListener("click", async function (event) { 159 event.preventDefault(); 160 let formData = new FormData(htmlFormElement); 161 let response = await combo.DokuUrl.createAjax(metaManagerCall) 162 .toRequest() 163 .setMethod("post") 164 .sendFormDataAsJson(formData); 165 managerModal.reset(); 166 modalViewer.reset(); 167 168 /** 169 * Send a cron request to re-render if any 170 */ 171 fetch(combo.DokuUrl.createRunner().toString(), {method: "GET"}) 172 .then((response) => { 173 if (response.status !== 200) { 174 console.error('Bad runner request, status Code is: ' + response.status); 175 } 176 } 177 ); 178 179 await processResponse(response, () => openMetadataManager(pageId)); 180 }) 181 182 /** 183 * The modal 184 */ 185 managerModal 186 .resetIfBuild() 187 .setHeader(`Metadata Manager for Page (${pageId})`) 188 .addBody(htmlFormElement) 189 .addFooterButton(viewerButton) 190 .addFooterCloseButton() 191 .addFooterButton(submitButton) 192 .show(); 193 194 } 195 196 document.querySelectorAll(".combo_metadata_item").forEach((metadataControlItem) => { 197 198 metadataControlItem.addEventListener("click", function (event) { 199 event.preventDefault(); 200 if(!('JSINFO' in window)){ 201 throw new Error("JSINFO is not available") 202 } 203 const JSINFO = window.JSINFO; 204 void openMetadataManager(JSINFO.id) 205 .catch(e => { 206 if (e instanceof Error) { 207 console.error(e.stack) 208 } else { 209 console.error(e.toString()) 210 } 211 }); 212 }); 213 214 }); 215 } 216) 217; 218 219