Changes for page LiveTable View Sheet
Last modified by Сергей Коршунов on 2025/05/01 21:19
From version 1.1
edited by admins admins
on 2021/12/11 17:11
on 2021/12/11 17:11
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-appwithinminutes-ui/13.10]
To version 3.1
edited by Сергей Коршунов
on 2022/10/05 21:06
on 2022/10/05 21:06
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-appwithinminutes-ui/14.8]
Summary
-
Page properties (2 modified, 0 added, 0 removed)
-
Objects (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Author
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. admins1 +XWiki.skorshunov - 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">×</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">×</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(); ... ... @@ -69,7 +69,7 @@ 69 69 } 70 70 // Hijack the rename page action. 71 71 var renameAppModal = $('#renameAppModal'); 72 - $('#tmActionRename').click (function(event) {72 + $('#tmActionRename').on('click', function(event) { 73 73 event.preventDefault(); 74 74 renameAppModal.modal(); 75 75 }); ... ... @@ -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,52 +100,44 @@ 100 100 101 101 var startValidation = function() { 102 102 if (appNameInput.val() === '') { 103 - en dValidation(appNameEmptyError);102 + return Promise.reject(appNameEmptyError); 104 104 } else { 105 105 var newAppHomePage = getNewAppHomePage(); 106 106 if (newAppHomePage.documentReference.equals(XWiki.currentDocument.documentReference)) { 107 - en dValidation(pageExistsError);106 + return Promise.reject(pageExistsError); 108 108 } else { 109 - $.ajax({ 110 - type: 'HEAD', 111 - url: newAppHomePage.getURL() 112 - }).done(function() { 113 - endValidation(pageExistsError); 114 - }).fail(function(response) { 115 - if (response.status === 404) { 116 - $.ajax({ 117 - type: 'HEAD', 118 - url: newAppHomePage.getURL('edit') 119 - }).done(function() { 120 - endValidation(); 121 - }).fail(function() { 122 - endValidation(locationForbiddenError); 123 - }); 124 - } else if (response.status === 403) { 125 - endValidation(locationForbiddenError); 126 - } else { 127 - endValidation(); 128 - } 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 + }); 129 129 }); 130 130 } 131 131 } 132 132 }; 133 133 134 - var endValidation = function(error) { 135 - if (error) { 136 - error.show(); 137 - } 138 - appNameInput.removeClass('loading'); 139 - submitButton.prop('disabled', !!error); 140 - }; 141 - 142 - var validationTimeout; 143 143 var scheduleValidation = function() { 144 - clearTimeout(validationTimeout);133 + // Hide all error messages before starting the asynchronous validation. 145 145 renameAppModal.find('.xErrorMsg').hide(); 146 - appNameInput.addClass('loading'); 147 - submitButton.prop('disabled', true); 148 - validationTimeout = setTimeout(startValidation, 500); 135 + appNameInput.addClass('loading').validateAsync(startValidation, 500, 'awm').catch((error) => { 136 + error.show(); 137 + }).finally(() => { 138 + appNameInput.removeClass('loading'); 139 + }); 149 149 }; 150 150 151 151 appNameInput.add(appParentInput).on('input', scheduleValidation); ... ... @@ -167,7 +167,7 @@ 167 167 renameAppModal.modal('show'); 168 168 }); 169 169 170 - renameAppModal.find('form').submit (function(event) {161 + renameAppModal.find('form').on('submit', function(event) { 171 171 event.preventDefault(); 172 172 renameApp(getRenameData($(this))); 173 173 }); ... ... @@ -194,13 +194,13 @@ 194 194 195 195 var renameApp = function(data) { 196 196 // Disable the form to prevent it from being submitted twice. 197 - renameAppModal.find(' :input').prop('disabled', true);188 + renameAppModal.find('fieldset').prop('disabled', true); 198 198 var notification = new XWiki.widgets.Notification( 199 199 $jsontool.serialize($services.localization.render('appWithinMinutes.renameApp.inProgress')), 200 200 'inprogress' 201 201 ); 202 202 var renameAppURL = new XWiki.Document('RenameApplication', 'AppWithinMinutes').getURL('get'); 203 - $.post(renameAppURL, data).then(updateAppHomePage). done(function() {194 + Promise.resolve($.post(renameAppURL, data)).then(updateAppHomePage).then(function() { 204 204 renameAppModal.modal('hide'); 205 205 notification.replace(new XWiki.widgets.Notification( 206 206 $jsontool.serialize($services.localization.render('appWithinMinutes.renameApp.done')), ... ... @@ -210,33 +210,29 @@ 210 210 setTimeout(function() { 211 211 window.location.href = getNewAppHomePage().getURL(); 212 212 }, 0); 213 - }). fail(function() {204 + }).catch(function() { 214 214 notification.replace(new XWiki.widgets.Notification( 215 215 $jsontool.serialize($services.localization.render('appWithinMinutes.renameApp.failed')), 216 216 'error' 217 217 )); 218 - }).al ways(function() {209 + }).finally(function() { 219 219 // Re-enable the form. 220 - renameAppModal.find(' :input').prop('disabled', false);211 + renameAppModal.find('fieldset').prop('disabled', false); 221 221 }); 222 222 }; 223 223 224 224 var updateAppHomePage = function() { 225 - var deferred = $.Deferred(); 226 - var newAppHomePageEditURL = getNewAppHomePage().getURL('edit'); 227 - $('<div/>').load(newAppHomePageEditURL + ' #inline', function() { 228 - var formData = $(this).children('form#inline').serializeArray(); 229 - if (formData.length > 0) { 230 - formData.push({name: 'xaction_save', value: true}); 231 - $.post(newAppHomePageEditURL, formData).done(function() { 232 - deferred.resolve(); 233 - }).fail(function() { 234 - deferred.reject(); 235 - }); 236 - } else { 237 - deferred.reject(); 238 - } 216 + return new Promise((resolve, reject) => { 217 + var newAppHomePageEditURL = getNewAppHomePage().getURL('edit'); 218 + $('<div/>').load(newAppHomePageEditURL + ' #inline', function() { 219 + var formData = $(this).children('form#inline').serializeArray(); 220 + if (formData.length) { 221 + formData.push({name: 'xaction_save', value: true}); 222 + $.post(newAppHomePageEditURL, formData).then(resolve, reject); 223 + } else { 224 + reject(); 225 + } 226 + }); 239 239 }); 240 - return deferred.promise(); 241 241 } 242 242 });