... |
... |
@@ -1,18 +1,24 @@ |
1 |
|
-require(['jquery'], function($) { |
|
1 |
+require(['jquery', 'xwiki-form-validation-async'], function($) { |
2 |
2 |
var appNameInput = $('input[name="appName"]'); |
3 |
3 |
var appParentInput = $('input[name="appParentReference"]'); |
4 |
4 |
var preview = $('.appName-preview'); |
5 |
|
- var submitButton = $('#wizard-next').prop('disabled', true); |
6 |
6 |
|
|
6 |
+ if (appNameInput.val() === '') { |
|
7 |
+ // We use a function instead of passing directly the promise because we want to avoid the "Uncaught (in promise)" |
|
8 |
+ // error. Basically, we want the rejected promise to be caught. |
|
9 |
+ appNameInput.validateAsync(() => Promise.reject(), 'awm'); |
|
10 |
+ } |
|
11 |
+ |
7 |
7 |
var errorMessage = appNameInput.closest('dd').prev('dt').find('.xErrorMsg'); |
8 |
|
- if (errorMessage.size() == 0) { |
|
13 |
+ if (!errorMessage.length) { |
9 |
9 |
errorMessage = $(document.createElement('span')).addClass('xErrorMsg').hide().appendTo(errorMessage.addBack()); |
10 |
10 |
} |
11 |
11 |
|
12 |
12 |
var toggleValidationError = function(message) { |
13 |
13 |
if (message) { |
14 |
|
- appNameInput.addClass('xErrorField').focus(); |
|
19 |
+ appNameInput.addClass('xErrorField'); |
15 |
15 |
errorMessage.text(message).show(); |
|
21 |
+ return Promise.reject(); |
16 |
16 |
} else { |
17 |
17 |
appNameInput.removeClass('xErrorField'); |
18 |
18 |
errorMessage.hide(); |
... |
... |
@@ -22,32 +22,24 @@ |
22 |
22 |
var updatePreview = function(content) { |
23 |
23 |
preview.removeClass('loading').html(content); |
24 |
24 |
var error = preview.find('.xErrorMsg'); |
25 |
|
- submitButton.prop('disabled', error.size() > 0); |
26 |
|
- toggleValidationError(error.remove().text()); |
|
31 |
+ return toggleValidationError(error.remove().text()); |
27 |
27 |
}; |
28 |
28 |
|
29 |
29 |
var fetchPreviewUpdate = function() { |
30 |
|
- if (appNameInput.val() == '') { |
31 |
|
- updatePreview('<span class="xErrorMsg">$escapetool.javascript($services.localization.render("platform.appwithinminutes.appNameEmptyError"))</span>'); |
|
35 |
+ if (appNameInput.val() === '') { |
|
36 |
+ return updatePreview('<span class="xErrorMsg">$escapetool.javascript($services.localization.render("platform.appwithinminutes.appNameEmptyError"))</span>'); |
32 |
32 |
} else { |
33 |
33 |
preview.addClass('loading'); |
34 |
|
- $.get(XWiki.currentDocument.getURL('get'), submitButton.closest('form').serialize(), updatePreview); |
|
39 |
+ return $.get(XWiki.currentDocument.getURL('get'), appNameInput.closest('form').serialize()).then(updatePreview); |
35 |
35 |
} |
36 |
36 |
}; |
37 |
37 |
|
38 |
|
- var previewTimeout; |
39 |
|
- var schedulePreviewUpdate = function() { |
40 |
|
- clearTimeout(previewTimeout); |
41 |
|
- submitButton.prop('disabled', true); |
42 |
|
- setTimeout(fetchPreviewUpdate, 500); |
43 |
|
- }; |
44 |
|
- |
45 |
|
- appNameInput.add(appParentInput) |
46 |
|
- .on('input', schedulePreviewUpdate) |
47 |
|
- .keyup(function(event) { |
48 |
|
- // Show the error message if the user presses Enter before typing anything. |
49 |
|
- if (event.which == 13 && appNameInput.val() == '' && !appNameInput.hasClass('xErrorField')) { |
50 |
|
- fetchPreviewUpdate(); |
51 |
|
- } |
52 |
|
- }); |
|
43 |
+ appNameInput.add(appParentInput).on('input', () => { |
|
44 |
+ appNameInput.validateAsync(fetchPreviewUpdate, 500, 'awm'); |
|
45 |
+ }).on('keyup', function(event) { |
|
46 |
+ // Show the error message if the user presses Enter before typing anything. |
|
47 |
+ if (event.which === 13 && appNameInput.val() === '' && !appNameInput.hasClass('xErrorField')) { |
|
48 |
+ appNameInput.validateAsync(fetchPreviewUpdate, 'awm').catch(() => appNameInput.focus()); |
|
49 |
+ } |
|
50 |
+ }); |
53 |
53 |
}); |