Remove unused blade settings pages not linked from UI Convert remaining frontend pages to SPA actions Convert settings user_settings and general to SPA actions Convert settings profile pages to SPA actions Convert contacts and projects add/edit pages to SPA actions Convert clients add/edit page to SPA action with loading pattern Refactor component scoped IDs from $id to $sid Fix jqhtml comment syntax and implement universal error component system Update all application code to use new unified error system Remove all backwards compatibility - unified error system complete Phase 5: Remove old response classes Phase 3-4: Ajax response handler sends new format, old helpers deprecated Phase 2: Add client-side unified error foundation Phase 1: Add server-side unified error foundation Add unified Ajax error response system with constants 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
102 lines
12 KiB
JavaScript
Executable File
102 lines
12 KiB
JavaScript
Executable File
"use strict";
|
|
|
|
class Input_With_Validation extends Component {
|
|
on_ready() {
|
|
const $input = this.$sid('input');
|
|
if (this.args.value) {
|
|
$input.val(this.args.value);
|
|
}
|
|
if (this.args.name) {
|
|
$input.attr('name', this.args.name);
|
|
}
|
|
if (this.args.required) {
|
|
$input.prop('required', true);
|
|
}
|
|
if (this.args.disabled) {
|
|
$input.prop('disabled', true);
|
|
}
|
|
if (this.args.readonly) {
|
|
$input.prop('readonly', true);
|
|
}
|
|
|
|
// Real-time validation
|
|
if (this.args.validate) {
|
|
$input.on('blur', () => {
|
|
this.validate();
|
|
});
|
|
$input.on('input', () => {
|
|
if (this.$.hasClass('was-validated')) {
|
|
this.validate();
|
|
}
|
|
});
|
|
}
|
|
if (this.args.on_change) {
|
|
$input.on('change', e => {
|
|
this.args.on_change(e.target.value);
|
|
});
|
|
}
|
|
}
|
|
validate() {
|
|
const value = this.$sid('input').val();
|
|
const $input = this.$sid('input');
|
|
this.$.addClass('was-validated');
|
|
|
|
// Run validation function
|
|
if (this.args.validate) {
|
|
const result = this.args.validate(value);
|
|
if (result === true || result === null || result === undefined) {
|
|
this.set_valid();
|
|
return true;
|
|
} else {
|
|
this.set_error(result);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Basic required check
|
|
if (this.args.required && !value) {
|
|
this.set_error('This field is required');
|
|
return false;
|
|
}
|
|
this.set_valid();
|
|
return true;
|
|
}
|
|
set_error(message) {
|
|
const $input = this.$sid('input');
|
|
const $error = this.$sid('error');
|
|
$input.removeClass('is-valid').addClass('is-invalid');
|
|
$error.text(message).css('display', 'block');
|
|
this.$sid('success').css('display', 'none');
|
|
}
|
|
set_valid(message) {
|
|
const $input = this.$sid('input');
|
|
const $success = this.$sid('success');
|
|
$input.removeClass('is-invalid').addClass('is-valid');
|
|
this.$sid('error').css('display', 'none');
|
|
if (message) {
|
|
$success.text(message).css('display', 'block');
|
|
} else {
|
|
$success.css('display', 'none');
|
|
}
|
|
}
|
|
clear_validation() {
|
|
const $input = this.$sid('input');
|
|
$input.removeClass('is-valid is-invalid');
|
|
this.$sid('error').css('display', 'none');
|
|
this.$sid('success').css('display', 'none');
|
|
this.$.removeClass('was-validated');
|
|
}
|
|
get_value() {
|
|
return this.$sid('input').val();
|
|
}
|
|
set_value(value) {
|
|
this.$sid('input').val(value);
|
|
if (this.$.hasClass('was-validated')) {
|
|
this.validate();
|
|
}
|
|
}
|
|
focus() {
|
|
this.$sid('input').focus();
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnB1dF9XaXRoX1ZhbGlkYXRpb24iLCJKcWh0bWxfQ29tcG9uZW50Iiwib25fcmVhZHkiLCIkaW5wdXQiLCIkaWQiLCJhcmdzIiwidmFsdWUiLCJ2YWwiLCJuYW1lIiwiYXR0ciIsInJlcXVpcmVkIiwicHJvcCIsImRpc2FibGVkIiwicmVhZG9ubHkiLCJ2YWxpZGF0ZSIsIm9uIiwiJCIsImhhc0NsYXNzIiwib25fY2hhbmdlIiwiZSIsInRhcmdldCIsImFkZENsYXNzIiwicmVzdWx0IiwidW5kZWZpbmVkIiwic2V0X3ZhbGlkIiwic2V0X2Vycm9yIiwibWVzc2FnZSIsIiRlcnJvciIsInJlbW92ZUNsYXNzIiwidGV4dCIsImNzcyIsIiRzdWNjZXNzIiwiY2xlYXJfdmFsaWRhdGlvbiIsImdldF92YWx1ZSIsInNldF92YWx1ZSIsImZvY3VzIl0sInNvdXJjZXMiOlsicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvSW5wdXRfV2l0aF9WYWxpZGF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIElucHV0X1dpdGhfVmFsaWRhdGlvbiBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICBjb25zdCAkaW5wdXQgPSB0aGlzLiRpZCgnaW5wdXQnKTtcblxuICAgICAgICBpZiAodGhpcy5hcmdzLnZhbHVlKSB7XG4gICAgICAgICAgICAkaW5wdXQudmFsKHRoaXMuYXJncy52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLm5hbWUpIHtcbiAgICAgICAgICAgICRpbnB1dC5hdHRyKCduYW1lJywgdGhpcy5hcmdzLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5yZXF1aXJlZCkge1xuICAgICAgICAgICAgJGlucHV0LnByb3AoJ3JlcXVpcmVkJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAkaW5wdXQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICRpbnB1dC5wcm9wKCdyZWFkb25seScsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVhbC10aW1lIHZhbGlkYXRpb25cbiAgICAgICAgaWYgKHRoaXMuYXJncy52YWxpZGF0ZSkge1xuICAgICAgICAgICAgJGlucHV0Lm9uKCdibHVyJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkaW5wdXQub24oJ2lucHV0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiQuaGFzQ2xhc3MoJ3dhcy12YWxpZGF0ZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLm9uX2NoYW5nZSkge1xuICAgICAgICAgICAgJGlucHV0Lm9uKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJncy5vbl9jaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YWxpZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiRpZCgnaW5wdXQnKS52YWwoKTtcbiAgICAgICAgY29uc3QgJGlucHV0ID0gdGhpcy4kaWQoJ2lucHV0Jyk7XG5cbiAgICAgICAgdGhpcy4kLmFkZENsYXNzKCd3YXMtdmFsaWRhdGVkJyk7XG5cbiAgICAgICAgLy8gUnVuIHZhbGlkYXRpb24gZnVuY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuYXJncy52YWxpZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcmdzLnZhbGlkYXRlKHZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSB8fCByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldF92YWxpZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldF9lcnJvcihyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJhc2ljIHJlcXVpcmVkIGNoZWNrXG4gICAgICAgIGlmICh0aGlzLmFyZ3MucmVxdWlyZWQgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldF9lcnJvcignVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRfdmFsaWQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc2V0X2Vycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgJGlucHV0ID0gdGhpcy4kaWQoJ2lucHV0Jyk7XG4gICAgICAgIGNvbnN0ICRlcnJvciA9IHRoaXMuJGlkKCdlcnJvcicpO1xuXG4gICAgICAgICRpbnB1dC5yZW1vdmVDbGFzcygnaXMtdmFsaWQnKS5hZGRDbGFzcygnaXMtaW52YWxpZCcpO1xuICAgICAgICAkZXJyb3IudGV4dChtZXNzYWdlKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgdGhpcy4kaWQoJ3N1Y2Nlc3MnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgIH1cblxuICAgIHNldF92YWxpZChtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0ICRpbnB1dCA9IHRoaXMuJGlkKCdpbnB1dCcpO1xuICAgICAgICBjb25zdCAkc3VjY2VzcyA9IHRoaXMuJGlkKCdzdWNjZXNzJyk7XG5cbiAgICAgICAgJGlucHV0LnJlbW92ZUNsYXNzKCdpcy1pbnZhbGlkJykuYWRkQ2xhc3MoJ2lzLXZhbGlkJyk7XG4gICAgICAgIHRoaXMuJGlkKCdlcnJvcicpLmNzcygnZGlzcGxheScsICdub25lJyk7XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICRzdWNjZXNzLnRleHQobWVzc2FnZSkuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkc3VjY2Vzcy5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXJfdmFsaWRhdGlvbigpIHtcbiAgICAgICAgY29uc3QgJGlucHV0ID0gdGhpcy4kaWQoJ2lucHV0Jyk7XG4gICAgICAgICRpbnB1dC5yZW1vdmVDbGFzcygnaXMtdmFsaWQgaXMtaW52YWxpZCcpO1xuICAgICAgICB0aGlzLiRpZCgnZXJyb3InKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICB0aGlzLiRpZCgnc3VjY2VzcycpLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIHRoaXMuJC5yZW1vdmVDbGFzcygnd2FzLXZhbGlkYXRlZCcpO1xuICAgIH1cblxuICAgIGdldF92YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGlkKCdpbnB1dCcpLnZhbCgpO1xuICAgIH1cblxuICAgIHNldF92YWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLiRpZCgnaW5wdXQnKS52YWwodmFsdWUpO1xuICAgICAgICBpZiAodGhpcy4kLmhhc0NsYXNzKCd3YXMtdmFsaWRhdGVkJykpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzKCkge1xuICAgICAgICB0aGlzLiRpZCgn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
|