Skip to content

Commit

Permalink
feat: integrating basic client-side form validity checking in setting…
Browse files Browse the repository at this point in the history
…s v1 and v2
  • Loading branch information
julianlam committed Nov 24, 2022
1 parent 6fe8797 commit 07a3cee
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 2 deletions.
7 changes: 6 additions & 1 deletion public/src/admin/settings.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use strict';


define('admin/settings', ['uploader', 'mousetrap', 'hooks', 'alerts'], function (uploader, mousetrap, hooks, alerts) {
define('admin/settings', ['uploader', 'mousetrap', 'hooks', 'alerts', 'settings'], function (uploader, mousetrap, hooks, alerts, settings) {
const Settings = {};

Settings.populateTOC = function () {
Expand Down Expand Up @@ -66,6 +66,11 @@ define('admin/settings', ['uploader', 'mousetrap', 'hooks', 'alerts'], function
saveBtn.off('click').on('click', function (e) {
e.preventDefault();

const ok = settings.check(document.querySelectorAll('#content [data-field][pattern]'));
if (!ok) {
return;
}

saveFields(fields, function onFieldsSaved(err) {
if (err) {
return alerts.alert({
Expand Down
26 changes: 26 additions & 0 deletions public/src/modules/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,12 @@ define('settings', ['hooks', 'alerts'], function (hooks, alerts) {
save: function (hash, formEl, callback) {
formEl = $(formEl);

const controls = formEl.get(0).querySelectorAll('input[name][pattern]');
const ok = Settings.check(controls);
if (!ok) {
return;
}

if (formEl.length) {
const values = helper.serializeForm(formEl);

Expand Down Expand Up @@ -559,6 +565,26 @@ define('settings', ['hooks', 'alerts'], function (hooks, alerts) {
});
}
},
check: function (controls) {
const onTrigger = (e) => {
const wrapper = e.target.closest('.form-group');
if (wrapper) {
wrapper.classList.add('has-error');
}

e.target.removeEventListener('invalid', onTrigger);
};

return Array.prototype.map.call(controls, (controlEl) => {
const wrapper = controlEl.closest('.form-group');
if (wrapper) {
wrapper.classList.remove('has-error');
}

controlEl.addEventListener('invalid', onTrigger);
return controlEl.reportValidity();
}).every(Boolean);
},
};


Expand Down
2 changes: 1 addition & 1 deletion src/views/admin/settings/advanced.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@
</div>
<div class="form-group">
<label for="hsts-maxage">[[admin/settings/advanced:hsts.maxAge]]</label>
<input class="form-control" id="hsts-maxage" type="number" placeholder="31536000" data-field="hsts-maxage" /><br />
<input class="form-control" id="hsts-maxage" type="text" pattern="\d+" placeholder="31536000" data-field="hsts-maxage" /><br />
</div>
<div class="checkbox">
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect">
Expand Down

0 comments on commit 07a3cee

Please sign in to comment.