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