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>
80 lines
8.9 KiB
JavaScript
Executable File
80 lines
8.9 KiB
JavaScript
Executable File
"use strict";
|
|
|
|
class Ajax_Select_Input extends Select_Input {
|
|
on_create() {
|
|
// Initialize empty select values array
|
|
this.data.select_values = [];
|
|
|
|
// Store for value set before initialization completes
|
|
this._pending_value = null;
|
|
|
|
// Call parent to do basic setup
|
|
super.on_create();
|
|
}
|
|
async on_load() {
|
|
// Load options from Ajax endpoint if provided
|
|
if (this.args.data) {
|
|
try {
|
|
const response = await fetch(this.args.data);
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
const data = await response.json();
|
|
this.data.select_values = data;
|
|
} catch (error) {
|
|
console.error('Failed to load select options:', error);
|
|
this.data.select_values = [];
|
|
}
|
|
}
|
|
}
|
|
on_ready() {
|
|
// Call parent to initialize Tom Select
|
|
super.on_ready();
|
|
|
|
// If a value was set before initialization, apply it now
|
|
if (this._pending_value !== null) {
|
|
if (this.tom_select) {
|
|
this.tom_select.setValue(this._pending_value, true);
|
|
} else if (this.$sid('input').exists()) {
|
|
this.$sid('input').val(this._pending_value);
|
|
}
|
|
this.data.value = this._pending_value;
|
|
this._pending_value = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* val() - Get or set the selected value
|
|
* Handles calls before Tom Select initialization completes
|
|
* @param {string} [value] - If provided, sets the value
|
|
* @returns {string} The current value when called as getter
|
|
*/
|
|
val(value) {
|
|
if (arguments.length === 0) {
|
|
// Getter
|
|
if (this.tom_select) {
|
|
// Initialized - get from Tom Select
|
|
return this.tom_select.getValue();
|
|
} else if (this._pending_value !== null) {
|
|
// Not yet initialized - return pending value
|
|
return this._pending_value;
|
|
} else if (this.data.value) {
|
|
// Return data value
|
|
return this.data.value;
|
|
}
|
|
return '';
|
|
} else {
|
|
// Setter
|
|
if (this.tom_select) {
|
|
// Initialized - set via Tom Select
|
|
this.data.value = value || '';
|
|
this.tom_select.setValue(this.data.value, true);
|
|
} else {
|
|
// Not yet initialized - store for later
|
|
this._pending_value = value || '';
|
|
this.data.value = value || '';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBamF4X1NlbGVjdF9JbnB1dCIsIlNlbGVjdF9JbnB1dCIsIm9uX2NyZWF0ZSIsImRhdGEiLCJzZWxlY3RfdmFsdWVzIiwiX3BlbmRpbmdfdmFsdWUiLCJvbl9sb2FkIiwiYXJncyIsInJlc3BvbnNlIiwiZmV0Y2giLCJvayIsIkVycm9yIiwic3RhdHVzIiwianNvbiIsImVycm9yIiwiY29uc29sZSIsIm9uX3JlYWR5IiwidG9tX3NlbGVjdCIsInNldFZhbHVlIiwiJGlkIiwiZXhpc3RzIiwidmFsIiwidmFsdWUiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJnZXRWYWx1ZSJdLCJzb3VyY2VzIjpbInJzeC90aGVtZS9jb21wb25lbnRzL2lucHV0cy9hamF4X3NlbGVjdF9pbnB1dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBBamF4X1NlbGVjdF9JbnB1dCBleHRlbmRzIFNlbGVjdF9JbnB1dCB7XG4gICAgb25fY3JlYXRlKCkge1xuICAgICAgICAvLyBJbml0aWFsaXplIGVtcHR5IHNlbGVjdCB2YWx1ZXMgYXJyYXlcbiAgICAgICAgdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMgPSBbXTtcblxuICAgICAgICAvLyBTdG9yZSBmb3IgdmFsdWUgc2V0IGJlZm9yZSBpbml0aWFsaXphdGlvbiBjb21wbGV0ZXNcbiAgICAgICAgdGhpcy5fcGVuZGluZ192YWx1ZSA9IG51bGw7XG5cbiAgICAgICAgLy8gQ2FsbCBwYXJlbnQgdG8gZG8gYmFzaWMgc2V0dXBcbiAgICAgICAgc3VwZXIub25fY3JlYXRlKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25fbG9hZCgpIHtcbiAgICAgICAgLy8gTG9hZCBvcHRpb25zIGZyb20gQWpheCBlbmRwb2ludCBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLmRhdGEpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLmFyZ3MuZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMgPSBkYXRhO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZWxlY3Qgb3B0aW9uczonLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBDYWxsIHBhcmVudCB0byBpbml0aWFsaXplIFRvbSBTZWxlY3RcbiAgICAgICAgc3VwZXIub25fcmVhZHkoKTtcblxuICAgICAgICAvLyBJZiBhIHZhbHVlIHdhcyBzZXQgYmVmb3JlIGluaXRpYWxpemF0aW9uLCBhcHBseSBpdCBub3dcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdfdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRvbV9zZWxlY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvbV9zZWxlY3Quc2V0VmFsdWUodGhpcy5fcGVuZGluZ192YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuJGlkKCdpbnB1dCcpLmV4aXN0cygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kaWQoJ2lucHV0JykudmFsKHRoaXMuX3BlbmRpbmdfdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kYXRhLnZhbHVlID0gdGhpcy5fcGVuZGluZ192YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdfdmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdmFsKCkgLSBHZXQgb3Igc2V0IHRoZSBzZWxlY3RlZCB2YWx1ZVxuICAgICAqIEhhbmRsZXMgY2FsbHMgYmVmb3JlIFRvbSBTZWxlY3QgaW5pdGlhbGl6YXRpb24gY29tcGxldGVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBJZiBwcm92aWRlZCwgc2V0cyB0aGUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY3VycmVudCB2YWx1ZSB3aGVuIGNhbGxlZCBhcyBnZXR0ZXJcbiAgICAgKi9cbiAgICB2YWwodmFsdWUpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEdldHRlclxuICAgICAgICAgICAgaWYgKHRoaXMudG9tX3NlbGVjdCkge1xuICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemVkIC0gZ2V0IGZyb20gVG9tIFNlbGVjdFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvbV9zZWxlY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fcGVuZGluZ192YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIE5vdCB5ZXQgaW5pdGlhbGl6ZWQgLSByZXR1cm4gcGVuZGluZyB2YWx1ZVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wZW5kaW5nX3ZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gZGF0YSB2YWx1ZVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZXR0ZXJcbiAgICAgICAgICAgIGlmICh0aGlzLnRvbV9zZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplZCAtIHNldCB2aWEgVG9tIFNlbGVjdFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS52YWx1ZSA9IHZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMudG9tX3NlbGVjdC5zZXRWYWx1ZSh0aGlzLmRhdGEudmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOb3QgeWV0IGluaXRpYWxpemVkIC0gc3RvcmUgZm9yIGxhdGVyXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ192YWx1ZSA9IHZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS52YWx1ZSA9IHZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOztBQUFBLE1BQU1BLGlCQUFpQixTQUFTQyxZQUFZLENBQUM7RUFDekNDLFNBQVNBLENBQUEsRUFBRztJQUNSO0lBQ0EsSUFBSSxDQUFDQyxJQUFJLENBQUNDLGFBQWEsR0FBRyxFQUFFOztJQUU1QjtJQUNBLElBQUksQ0FBQ0MsY0FBYyxHQUFHLElBQUk7O0lBRTFCO0lBQ0EsS0FBSyxDQUFDSCxTQUFTLENBQUMsQ0FBQztFQUNyQjtFQUVBLE1BQU1JLE9BQU9BLENBQUEsRUFBRztJQUNaO0lBQ0EsSUFBSSxJQUFJLENBQUNDLElBQUksQ0FBQ0osSUFBSSxFQUFFO01BQ2hCLElBQUk7UUFDQSxNQUFNSyxRQUFRLEdBQUcsTUFBTUMsS0FBSyxDQUFDLElBQUksQ0FBQ0YsSUFBSSxDQUFDSixJQUFJLENBQUM7UUFDNUMsSUFBSSxDQUFDSyxRQUFRLENBQUNFLEVBQUUsRUFBRTtVQUNkLE1BQU0sSUFBSUMsS0FBSyxDQUFDLHVCQUF1QkgsUUFBUSxDQUFDSSxNQUFNLEVBQUUsQ0FBQztRQUM3RDtRQUNBLE1BQU1ULElBQUksR0FBRyxNQUFNSyxRQUFRLENBQUNLLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQ1YsSUFBSSxDQUFDQyxhQUFhLEdBQUdELElBQUk7TUFDbEMsQ0FBQyxDQUFDLE9BQU9XLEtBQUssRUFBRTtRQUNaQyxPQUFPLENBQUNELEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRUEsS0FBSyxDQUFDO1FBQ3RELElBQUksQ0FBQ1gsSUFBSSxDQUFDQyxhQUFhLEdBQUcsRUFBRTtNQUNoQztJQUNKO0VBQ0o7RUFFQVksUUFBUUEsQ0FBQSxFQUFHO0lBQ1A7SUFDQSxLQUFLLENBQUNBLFFBQVEsQ0FBQyxDQUFDOztJQUVoQjtJQUNBLElBQUksSUFBSSxDQUFDWCxjQUFjLEtBQUssSUFBSSxFQUFFO01BQzlCLElBQUksSUFBSSxDQUFDWSxVQUFVLEVBQUU7UUFDakIsSUFBSSxDQUFDQSxVQUFVLENBQUNDLFFBQVEsQ0FBQyxJQUFJLENBQUNiLGNBQWMsRUFBRSxJQUFJLENBQUM7TUFDdkQsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDYyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUNDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7UUFDbkMsSUFBSSxDQUFDRCxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUNFLEdBQUcsQ0FBQyxJQUFJLENBQUNoQixjQUFjLENBQUM7TUFDOUM7TUFDQSxJQUFJLENBQUNGLElBQUksQ0FBQ21CLEtBQUssR0FBRyxJQUFJLENBQUNqQixjQUFjO01BQ3JDLElBQUksQ0FBQ0EsY0FBYyxHQUFHLElBQUk7SUFDOUI7RUFDSjs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSWdCLEdBQUdBLENBQUNDLEtBQUssRUFBRTtJQUNQLElBQUlDLFNBQVMsQ0FBQ0MsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUN4QjtNQUNBLElBQUksSUFBSSxDQUFDUCxVQUFVLEVBQUU7UUFDakI7UUFDQSxPQUFPLElBQUksQ0FBQ0EsVUFBVSxDQUFDUSxRQUFRLENBQUMsQ0FBQztNQUNyQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUNwQixjQUFjLEtBQUssSUFBSSxFQUFFO1FBQ3JDO1FBQ0EsT0FBTyxJQUFJLENBQUNBLGNBQWM7TUFDOUIsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDRixJQUFJLENBQUNtQixLQUFLLEVBQUU7UUFDeEI7UUFDQSxPQUFPLElBQUksQ0FBQ25CLElBQUksQ0FBQ21CLEtBQUs7TUFDMUI7TUFDQSxPQUFPLEVBQUU7SUFDYixDQUFDLE1BQU07TUFDSDtNQUNBLElBQUksSUFBSSxDQUFDTCxVQUFVLEVBQUU7UUFDakI7UUFDQSxJQUFJLENBQUNkLElBQUksQ0FBQ21CLEtBQUssR0FBR0EsS0FBSyxJQUFJLEVBQUU7UUFDN0IsSUFBSSxDQUFDTCxVQUFVLENBQUNDLFFBQVEsQ0FBQyxJQUFJLENBQUNmLElBQUksQ0FBQ21CLEtBQUssRUFBRSxJQUFJLENBQUM7TUFDbkQsQ0FBQyxNQUFNO1FBQ0g7UUFDQSxJQUFJLENBQUNqQixjQUFjLEdBQUdpQixLQUFLLElBQUksRUFBRTtRQUNqQyxJQUFJLENBQUNuQixJQUFJLENBQUNtQixLQUFLLEdBQUdBLEtBQUssSUFBSSxFQUFFO01BQ2pDO0lBQ0o7RUFDSjtBQUNKIiwiaWdub3JlTGlzdCI6W119
|