|
1 | | -(function (global, doc, ibexa, Translator, moment) { |
| 1 | +(function (global, doc, ibexa, Translator, bootstrap, moment) { |
2 | 2 | const ENTER_KEY_CODE = 13; |
3 | 3 | const STATUS_ERROR = 'error'; |
4 | 4 | const STATUS_OFF = 'off'; |
|
26 | 26 | 'time', |
27 | 27 | 'url', |
28 | 28 | ]; |
| 29 | + const { escapeHTML } = ibexa.helpers.text; |
29 | 30 | const form = doc.querySelector('.ibexa-form-validate'); |
30 | 31 | const submitBtns = form.querySelectorAll('[type="submit"]:not([formnovalidate])'); |
31 | 32 | const menuButtonsToValidate = doc.querySelectorAll('button[data-validate]'); |
32 | 33 | const fields = doc.querySelectorAll('.ibexa-field-edit'); |
| 34 | + const autosaveNode = doc.querySelector('.ibexa-autosave'); |
33 | 35 | const getValidationResults = (validator) => { |
34 | 36 | const isValid = validator.isValid(); |
35 | 37 | const validatorName = validator.constructor.name; |
|
130 | 132 | return ibexa.adminUiConfig.autosave.enabled && form.querySelector('[name="ezplatform_content_forms_content_edit[autosave]"]'); |
131 | 133 | }; |
132 | 134 |
|
133 | | - if (isAutosaveEnabled()) { |
134 | | - const AUTOSAVE_SUBMIT_BUTTON_NAME = 'ezplatform_content_forms_content_edit[autosave]'; |
135 | | - const autosave = doc.querySelector('.ibexa-autosave'); |
136 | | - const autosaveStatusSavedNode = autosave.querySelector('.ibexa-autosave__status-saved'); |
137 | | - let currentAutosaveStatus = autosave.classList.contains('ibexa-autosave--on') ? STATUS_ON : STATUS_OFF; |
| 135 | + if (autosaveNode) { |
| 136 | + let currentAutosaveStatus = autosaveNode.classList.contains('ibexa-autosave--on') ? STATUS_ON : STATUS_OFF; |
| 137 | + let isAutosaveSimple = autosaveNode.classList.contains('ibexa-autosave--simple'); |
| 138 | + const tooltipInstance = bootstrap.Tooltip.getOrCreateInstance(autosaveNode); |
138 | 139 | const generateCssStatusClass = (status) => `ibexa-autosave--${status}`; |
139 | 140 | const setAutosaveStatus = (newStatus) => { |
140 | | - if (!autosave) { |
141 | | - return; |
142 | | - } |
143 | | - |
144 | 141 | const oldCssStatusClass = generateCssStatusClass(currentAutosaveStatus); |
145 | 142 | const newCssStatusClass = generateCssStatusClass(newStatus); |
146 | 143 |
|
147 | | - autosave.classList.remove(oldCssStatusClass); |
148 | | - autosave.classList.remove('ibexa-autosave--saved'); |
149 | | - autosave.classList.add(newCssStatusClass); |
| 144 | + autosaveNode.classList.remove(oldCssStatusClass); |
| 145 | + autosaveNode.classList.remove('ibexa-autosave--saved'); |
| 146 | + autosaveNode.classList.add(newCssStatusClass); |
150 | 147 |
|
151 | 148 | currentAutosaveStatus = newStatus; |
| 149 | + setAutosaveTooltipContent(); |
152 | 150 | }; |
153 | | - const setDraftSavedMessage = () => { |
154 | | - if (!autosave) { |
155 | | - return; |
156 | | - } |
157 | | - |
| 151 | + const setAutosaveTooltipContent = () => { |
| 152 | + const statusMsgFromNode = autosaveNode.querySelector(`.ibexa-autosave__status--${currentAutosaveStatus}`).innerText; |
| 153 | + const tooltipContent = isAutosaveSimple |
| 154 | + ? escapeHTML(statusMsgFromNode) |
| 155 | + : Translator.trans( |
| 156 | + /*@Desc("You can turn autosave off in your user settings")*/ 'content.autosave.turn_off.message', |
| 157 | + {}, |
| 158 | + 'ibexa_content', |
| 159 | + ); |
| 160 | + |
| 161 | + tooltipInstance.setContent({ '.tooltip-inner': tooltipContent }); |
| 162 | + }; |
| 163 | + const setDraftSavedMessage = (autosaveStatusSavedNode) => { |
158 | 164 | const userPreferredTimezone = ibexa.adminUiConfig.timezone; |
159 | 165 | const saveDate = ibexa.helpers.timezone.convertDateToTimezone(new Date(), userPreferredTimezone); |
160 | 166 | const saveTime = moment(saveDate).formatICU('HH:mm'); |
|
165 | 171 | ); |
166 | 172 |
|
167 | 173 | autosaveStatusSavedNode.innerHTML = saveMessage; |
168 | | - autosave.classList.add('ibexa-autosave--saved'); |
| 174 | + autosaveNode.classList.add('ibexa-autosave--saved'); |
169 | 175 | }; |
170 | 176 |
|
171 | | - setInterval(() => { |
172 | | - const formData = new FormData(form); |
173 | | - |
174 | | - formData.set(AUTOSAVE_SUBMIT_BUTTON_NAME, true); |
175 | | - setAutosaveStatus(STATUS_SAVING); |
176 | | - |
177 | | - fetch(form.target || window.location.href, { method: 'POST', body: formData }) |
178 | | - .then(ibexa.helpers.request.getStatusFromResponse) |
179 | | - .then(() => { |
180 | | - setAutosaveStatus(STATUS_SAVED); |
181 | | - setDraftSavedMessage(); |
182 | | - }) |
183 | | - .catch(() => { |
184 | | - setAutosaveStatus(STATUS_ERROR); |
185 | | - }); |
186 | | - }, ibexa.adminUiConfig.autosave.interval); |
| 177 | + setAutosaveTooltipContent(); |
| 178 | + |
| 179 | + doc.body.addEventListener('ibexa:edit-content-change-header-size', ({ detail }) => { |
| 180 | + isAutosaveSimple = detail.isHeaderSlim; |
| 181 | + autosaveNode.classList.toggle('ibexa-autosave--simple', isAutosaveSimple); |
| 182 | + setAutosaveTooltipContent(); |
| 183 | + }); |
| 184 | + |
| 185 | + if (isAutosaveEnabled()) { |
| 186 | + const AUTOSAVE_SUBMIT_BUTTON_NAME = 'ezplatform_content_forms_content_edit[autosave]'; |
| 187 | + const autosaveStatusSavedNode = autosaveNode.querySelector('.ibexa-autosave__status--saved'); |
| 188 | + |
| 189 | + setInterval(() => { |
| 190 | + const formData = new FormData(form); |
| 191 | + |
| 192 | + formData.set(AUTOSAVE_SUBMIT_BUTTON_NAME, true); |
| 193 | + setAutosaveStatus(STATUS_SAVING); |
| 194 | + |
| 195 | + fetch(form.target || window.location.href, { method: 'POST', body: formData }) |
| 196 | + .then(ibexa.helpers.request.getStatusFromResponse) |
| 197 | + .then(() => { |
| 198 | + setAutosaveStatus(STATUS_SAVED); |
| 199 | + setDraftSavedMessage(autosaveStatusSavedNode); |
| 200 | + }) |
| 201 | + .catch(() => { |
| 202 | + setAutosaveStatus(STATUS_ERROR); |
| 203 | + }) |
| 204 | + .finally(() => { |
| 205 | + setAutosaveTooltipContent(); |
| 206 | + }); |
| 207 | + }, ibexa.adminUiConfig.autosave.interval); |
| 208 | + } |
187 | 209 | } |
188 | 210 |
|
189 | 211 | form.setAttribute('novalidate', true); |
|
204 | 226 | menuButtonsToValidate.forEach((btn) => { |
205 | 227 | btn.addEventListener('click', validateHandler, false); |
206 | 228 | }); |
207 | | -})(window, window.document, window.ibexa, window.Translator, window.moment); |
| 229 | +})(window, window.document, window.ibexa, window.Translator, window.bootstrap, window.moment); |
0 commit comments