Changes for page LiveTable View Sheet
Last modified by Сергей Коршунов on 2025/05/01 21:19
From 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]
To version 2.1
edited by Сергей Коршунов
on 2022/03/08 16:59
on 2022/03/08 16:59
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-appwithinminutes-ui/14.1]
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Objects (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -122,30 +122,23 @@ 122 122 data-backdrop="static" data-keyboard="false"> 123 123 <div class="modal-dialog" role="document"> 124 124 <form class="modal-content xform"> 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> 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> 149 149 </form> 150 150 </div> 151 151 </div>
- XWiki.JavaScriptExtension[0]
-
- Code
-
... ... @@ -58,7 +58,7 @@ 58 58 /** 59 59 * Rename Application 60 60 */ 61 -require(['jquery', 'bootstrap' , 'xwiki-form-validation-async'], function($) {61 +require(['jquery', 'bootstrap'], 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,6 +77,7 @@ 77 77 // Form validation. 78 78 var appNameInput = $('#renameAppTitle'); 79 79 var appParentInput = $('#renameAppParentReference'); 80 + var submitButton = renameAppModal.find('.btn-primary[type="submit"]'); 80 80 81 81 var appNameEmptyError = renameAppModal.find('.appNameEmptyError'); 82 82 var pageExistsError = renameAppModal.find('.pageExistsError'); ... ... @@ -99,44 +99,49 @@ 99 99 100 100 var startValidation = function() { 101 101 if (appNameInput.val() === '') { 102 - returnPromise.reject(appNameEmptyError);103 + endValidation(appNameEmptyError); 103 103 } else { 104 104 var newAppHomePage = getNewAppHomePage(); 105 105 if (newAppHomePage.documentReference.equals(XWiki.currentDocument.documentReference)) { 106 - returnPromise.reject(pageExistsError);107 + endValidation(pageExistsError); 107 107 } else { 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 - }); 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 + } 127 127 }); 128 128 } 129 129 } 130 130 }; 131 131 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; 132 132 var scheduleValidation = function() { 133 - // Hide allerror messages before starting theasynchronousvalidation.141 + clearTimeout(validationTimeout); 134 134 renameAppModal.find('.xErrorMsg').hide(); 135 - appNameInput.addClass('loading').validateAsync(startValidation, 500, 'awm').catch((error) => { 136 - error.show(); 137 - }).finally(() => { 138 - appNameInput.removeClass('loading'); 139 - }); 143 + appNameInput.addClass('loading'); 144 + submitButton.prop('disabled', true); 145 + validationTimeout = setTimeout(startValidation, 500); 140 140 }; 141 141 142 142 appNameInput.add(appParentInput).on('input', scheduleValidation); ... ... @@ -185,13 +185,13 @@ 185 185 186 186 var renameApp = function(data) { 187 187 // Disable the form to prevent it from being submitted twice. 188 - renameAppModal.find(' fieldset').prop('disabled', true);194 + renameAppModal.find(':input').prop('disabled', true); 189 189 var notification = new XWiki.widgets.Notification( 190 190 $jsontool.serialize($services.localization.render('appWithinMinutes.renameApp.inProgress')), 191 191 'inprogress' 192 192 ); 193 193 var renameAppURL = new XWiki.Document('RenameApplication', 'AppWithinMinutes').getURL('get'); 194 - Promise.resolve($.post(renameAppURL, data)).then(updateAppHomePage).then(function() {200 + $.post(renameAppURL, data).then(updateAppHomePage).then(function() { 195 195 renameAppModal.modal('hide'); 196 196 notification.replace(new XWiki.widgets.Notification( 197 197 $jsontool.serialize($services.localization.render('appWithinMinutes.renameApp.done')), ... ... @@ -208,7 +208,7 @@ 208 208 )); 209 209 }).finally(function() { 210 210 // Re-enable the form. 211 - renameAppModal.find(' fieldset').prop('disabled', false);217 + renameAppModal.find(':input').prop('disabled', false); 212 212 }); 213 213 }; 214 214