0 Votes

Changes for page LiveTable View Sheet

Last modified by Сергей Коршунов on 2025/05/01 21:19

From version 2.1
edited by Сергей Коршунов
on 2022/03/08 16:59
Change comment: Install extension [org.xwiki.platform:xwiki-platform-appwithinminutes-ui/14.1]
To version 3.1
edited by Сергей Коршунов
on 2022/10/05 21:06
Change comment: Install extension [org.xwiki.platform:xwiki-platform-appwithinminutes-ui/14.8]

Summary

Details

Page properties
Content
... ... @@ -122,23 +122,30 @@
122 122   data-backdrop="static" data-keyboard="false">
123 123   <div class="modal-dialog" role="document">
124 124   <form class="modal-content xform">
125 - <div class="modal-header">
126 - <button type="button" class="close" data-dismiss="modal" aria-label="Close">
127 - <span aria-hidden="true">&times;</span>
128 - </button>
129 - <span class="modal-title" id="renameAppModal-label">Rename Application</span>
130 - </div>
131 - <div class="modal-body">
132 - #renameAppModalBody
133 - </div>
134 - <div class="modal-footer">
135 - <button type="button" class="btn btn-default" data-dismiss="modal">
136 - $escapetool.xml($services.localization.render('cancel'))
137 - </button>
138 - <button type="submit" class="btn btn-primary" disabled="disabled">
139 - $escapetool.xml($services.localization.render('core.rename.submit'))
140 - </button>
141 - </div>
125 + ## The fieldset allows us to disable and enable the entire form quickly and easy.
126 + <fieldset>
127 + <div class="modal-header">
128 + <button type="button" class="close" data-dismiss="modal"
129 + title="$escapetool.xml($services.localization.render('appWithinMinutes.renameApp.close'))"
130 + aria-label="$escapetool.xml($services.localization.render('appWithinMinutes.renameApp.close'))">
131 + <span aria-hidden="true">&times;</span>
132 + </button>
133 + <span class="modal-title" id="renameAppModal-label">
134 + $escapetool.xml($services.localization.render('appWithinMinutes.renameApp.label'))
135 + </span>
136 + </div>
137 + <div class="modal-body">
138 + #renameAppModalBody
139 + </div>
140 + <div class="modal-footer">
141 + <button type="button" class="btn btn-default" data-dismiss="modal">
142 + $escapetool.xml($services.localization.render('cancel'))
143 + </button>
144 + <button type="submit" class="btn btn-primary" disabled="disabled">
145 + $escapetool.xml($services.localization.render('core.rename.submit'))
146 + </button>
147 + </div>
148 + </fieldset>
142 142   </form>
143 143   </div>
144 144   </div>
XWiki.JavaScriptExtension[0]
Code
... ... @@ -58,7 +58,7 @@
58 58  /**
59 59   * Rename Application
60 60   */
61 -require(['jquery', 'bootstrap'], function($) {
61 +require(['jquery', 'bootstrap', 'xwiki-form-validation-async'], function($) {
62 62   #set ($currentDocReference = $xwiki.getDocument($request.currentApp).getDocumentReference())
63 63   // if we cannot find any extension related to this page app, it's not part of an extension.
64 64   var isNotAnExtension = $services.extension.xar.getInstalledExtensions($currentDocReference).isEmpty();
... ... @@ -77,7 +77,6 @@
77 77   // Form validation.
78 78   var appNameInput = $('#renameAppTitle');
79 79   var appParentInput = $('#renameAppParentReference');
80 - var submitButton = renameAppModal.find('.btn-primary[type="submit"]');
81 81  
82 82   var appNameEmptyError = renameAppModal.find('.appNameEmptyError');
83 83   var pageExistsError = renameAppModal.find('.pageExistsError');
... ... @@ -100,49 +100,44 @@
100 100  
101 101   var startValidation = function() {
102 102   if (appNameInput.val() === '') {
103 - endValidation(appNameEmptyError);
102 + return Promise.reject(appNameEmptyError);
104 104   } else {
105 105   var newAppHomePage = getNewAppHomePage();
106 106   if (newAppHomePage.documentReference.equals(XWiki.currentDocument.documentReference)) {
107 - endValidation(pageExistsError);
106 + return Promise.reject(pageExistsError);
108 108   } else {
109 - $.ajax({
110 - type: 'HEAD',
111 - url: newAppHomePage.getURL()
112 - }).then(endValidation.bind(null, pageExistsError), response => {
113 - if (response.status === 404) {
114 - $.ajax({
115 - type: 'HEAD',
116 - url: newAppHomePage.getURL('edit')
117 - }).then(
118 - () => endValidation(),
119 - () => endValidation(locationForbiddenError)
120 - );
121 - } else if (response.status === 403) {
122 - endValidation(locationForbiddenError);
123 - } else {
124 - endValidation();
125 - }
108 + return new Promise((resolve, reject) => {
109 + $.ajax({
110 + type: 'HEAD',
111 + url: newAppHomePage.getURL()
112 + }).then(reject.bind(null, pageExistsError), response => {
113 + if (response.status === 404) {
114 + $.ajax({
115 + type: 'HEAD',
116 + url: newAppHomePage.getURL('edit')
117 + }).then(
118 + () => resolve(),
119 + () => reject(locationForbiddenError)
120 + );
121 + } else if (response.status === 403) {
122 + reject(locationForbiddenError);
123 + } else {
124 + resolve();
125 + }
126 + });
126 126   });
127 127   }
128 128   }
129 129   };
130 130  
131 - var endValidation = function(error) {
132 - if (error) {
133 - error.show();
134 - }
135 - appNameInput.removeClass('loading');
136 - submitButton.prop('disabled', !!error);
137 - };
138 -
139 - var validationTimeout;
140 140   var scheduleValidation = function() {
141 - clearTimeout(validationTimeout);
133 + // Hide all error messages before starting the asynchronous validation.
142 142   renameAppModal.find('.xErrorMsg').hide();
143 - appNameInput.addClass('loading');
144 - submitButton.prop('disabled', true);
145 - validationTimeout = setTimeout(startValidation, 500);
135 + appNameInput.addClass('loading').validateAsync(startValidation, 500, 'awm').catch((error) => {
136 + error.show();
137 + }).finally(() => {
138 + appNameInput.removeClass('loading');
139 + });
146 146   };
147 147  
148 148   appNameInput.add(appParentInput).on('input', scheduleValidation);
... ... @@ -191,13 +191,13 @@
191 191  
192 192   var renameApp = function(data) {
193 193   // Disable the form to prevent it from being submitted twice.
194 - renameAppModal.find(':input').prop('disabled', true);
188 + renameAppModal.find('fieldset').prop('disabled', true);
195 195   var notification = new XWiki.widgets.Notification(
196 196   $jsontool.serialize($services.localization.render('appWithinMinutes.renameApp.inProgress')),
197 197   'inprogress'
198 198   );
199 199   var renameAppURL = new XWiki.Document('RenameApplication', 'AppWithinMinutes').getURL('get');
200 - $.post(renameAppURL, data).then(updateAppHomePage).then(function() {
194 + Promise.resolve($.post(renameAppURL, data)).then(updateAppHomePage).then(function() {
201 201   renameAppModal.modal('hide');
202 202   notification.replace(new XWiki.widgets.Notification(
203 203   $jsontool.serialize($services.localization.render('appWithinMinutes.renameApp.done')),
... ... @@ -214,7 +214,7 @@
214 214   ));
215 215   }).finally(function() {
216 216   // Re-enable the form.
217 - renameAppModal.find(':input').prop('disabled', false);
211 + renameAppModal.find('fieldset').prop('disabled', false);
218 218   });
219 219   };
220 220