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>
96 lines
12 KiB
JavaScript
Executable File
96 lines
12 KiB
JavaScript
Executable File
"use strict";
|
|
|
|
class Select_Input extends Form_Input_Abstract {
|
|
on_create() {
|
|
this.data.value = '';
|
|
|
|
// Parse options if passed as JSON string
|
|
if (typeof this.args.options === 'string') {
|
|
try {
|
|
// Decode HTML entities before parsing JSON
|
|
// This handles cases where JSON is passed through Blade {!! !!} syntax
|
|
const decoded = $('<textarea>').html(this.args.options).text();
|
|
this.args.options = json_decode(decoded);
|
|
} catch (e) {
|
|
console.error('Failed to parse options JSON:', e);
|
|
this.args.options = [];
|
|
}
|
|
}
|
|
|
|
// Convert object options to array format
|
|
if (this.args.options && typeof this.args.options === 'object' && !is_array(this.args.options)) {
|
|
this.args.options = Object.entries(this.args.options).map(_ref => {
|
|
let [value, label] = _ref;
|
|
return {
|
|
value,
|
|
label
|
|
};
|
|
});
|
|
}
|
|
}
|
|
on_ready() {
|
|
// Initialize Tom Select
|
|
let config = {
|
|
placeholder: this.args.placeholder || '',
|
|
allowEmptyOption: true,
|
|
create: false,
|
|
maxOptions: null,
|
|
// Show all options (default is 50)
|
|
plugins: ['dropdown_input'],
|
|
// Enable search in dropdown
|
|
onInitialize: function () {
|
|
// Keep Bootstrap form-select class
|
|
this.control.classList.add('form-select');
|
|
}
|
|
};
|
|
this.tom_select = new TomSelect(this.$sid('input').get(0), config);
|
|
|
|
// Set initial value if provided
|
|
if (this.data.value) {
|
|
this.tom_select.setValue(this.data.value, true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* val() - Get or set the selected value
|
|
* @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) {
|
|
return this.tom_select.getValue();
|
|
}
|
|
return this.$sid('input').val();
|
|
} else {
|
|
// Setter
|
|
this.data.value = value || '';
|
|
if (this.tom_select) {
|
|
this.tom_select.setValue(this.data.value, true);
|
|
} else if (this.$sid('input').exists()) {
|
|
this.$sid('input').val(this.data.value);
|
|
}
|
|
}
|
|
}
|
|
async seed() {
|
|
if (this.args.seeder) {
|
|
// TODO: Implement Rsx_Random_Values endpoint
|
|
let value = 'Test ' + (this.args.seeder || 'Value');
|
|
this.val(value);
|
|
} else if (this.args.options && this.args.options.length > 0) {
|
|
// Select random option
|
|
let random_index = Math.floor(Math.random() * this.args.options.length);
|
|
let random_opt = this.args.options[random_index];
|
|
let random_value = typeof random_opt === 'object' ? random_opt.value : random_opt;
|
|
this.val(random_value);
|
|
}
|
|
}
|
|
on_destroy() {
|
|
// Clean up Tom Select instance
|
|
if (this.tom_select) {
|
|
this.tom_select.destroy();
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTZWxlY3RfSW5wdXQiLCJGb3JtX0lucHV0X0Fic3RyYWN0Iiwib25fY3JlYXRlIiwiZGF0YSIsInZhbHVlIiwiYXJncyIsIm9wdGlvbnMiLCJkZWNvZGVkIiwiJCIsImh0bWwiLCJ0ZXh0IiwianNvbl9kZWNvZGUiLCJlIiwiY29uc29sZSIsImVycm9yIiwiaXNfYXJyYXkiLCJPYmplY3QiLCJlbnRyaWVzIiwibWFwIiwiX3JlZiIsImxhYmVsIiwib25fcmVhZHkiLCJjb25maWciLCJwbGFjZWhvbGRlciIsImFsbG93RW1wdHlPcHRpb24iLCJjcmVhdGUiLCJtYXhPcHRpb25zIiwicGx1Z2lucyIsIm9uSW5pdGlhbGl6ZSIsImNvbnRyb2wiLCJjbGFzc0xpc3QiLCJhZGQiLCJ0b21fc2VsZWN0IiwiVG9tU2VsZWN0IiwiJGlkIiwiZ2V0Iiwic2V0VmFsdWUiLCJ2YWwiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJnZXRWYWx1ZSIsImV4aXN0cyIsInNlZWQiLCJzZWVkZXIiLCJyYW5kb21faW5kZXgiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJyYW5kb21fb3B0IiwicmFuZG9tX3ZhbHVlIiwib25fZGVzdHJveSIsImRlc3Ryb3kiXSwic291cmNlcyI6WyJyc3gvdGhlbWUvY29tcG9uZW50cy9pbnB1dHMvc2VsZWN0X2lucHV0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIFNlbGVjdF9JbnB1dCBleHRlbmRzIEZvcm1fSW5wdXRfQWJzdHJhY3Qge1xuICAgIG9uX2NyZWF0ZSgpIHtcbiAgICAgICAgdGhpcy5kYXRhLnZhbHVlID0gJyc7XG5cbiAgICAgICAgLy8gUGFyc2Ugb3B0aW9ucyBpZiBwYXNzZWQgYXMgSlNPTiBzdHJpbmdcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFyZ3Mub3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gRGVjb2RlIEhUTUwgZW50aXRpZXMgYmVmb3JlIHBhcnNpbmcgSlNPTlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSBKU09OIGlzIHBhc3NlZCB0aHJvdWdoIEJsYWRlIHshISAhIX0gc3ludGF4XG4gICAgICAgICAgICAgICAgY29uc3QgZGVjb2RlZCA9ICQoJzx0ZXh0YXJlYT4nKS5odG1sKHRoaXMuYXJncy5vcHRpb25zKS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmdzLm9wdGlvbnMgPSBqc29uX2RlY29kZShkZWNvZGVkKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcGFyc2Ugb3B0aW9ucyBKU09OOicsIGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXJncy5vcHRpb25zID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IG9iamVjdCBvcHRpb25zIHRvIGFycmF5IGZvcm1hdFxuICAgICAgICBpZiAodGhpcy5hcmdzLm9wdGlvbnMgJiYgdHlwZW9mIHRoaXMuYXJncy5vcHRpb25zID09PSAnb2JqZWN0JyAmJiAhaXNfYXJyYXkodGhpcy5hcmdzLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICB0aGlzLmFyZ3Mub3B0aW9ucyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuYXJncy5vcHRpb25zKS5tYXAoKFt2YWx1ZSwgbGFiZWxdKSA9PiAoe3ZhbHVlLCBsYWJlbH0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBJbml0aWFsaXplIFRvbSBTZWxlY3RcbiAgICAgICAgbGV0IGNvbmZpZyA9IHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLmFyZ3MucGxhY2Vob2xkZXIgfHwgJycsXG4gICAgICAgICAgICBhbGxvd0VtcHR5T3B0aW9uOiB0cnVlLFxuICAgICAgICAgICAgY3JlYXRlOiBmYWxzZSxcbiAgICAgICAgICAgIG1heE9wdGlvbnM6IG51bGwsICAvLyBTaG93IGFsbCBvcHRpb25zIChkZWZhdWx0IGlzIDUwKVxuICAgICAgICAgICAgcGx1Z2luczogWydkcm9wZG93bl9pbnB1dCddLCAgLy8gRW5hYmxlIHNlYXJjaCBpbiBkcm9wZG93blxuICAgICAgICAgICAgb25Jbml0aWFsaXplOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAvLyBLZWVwIEJvb3RzdHJhcCBmb3JtLXNlbGVjdCBjbGFzc1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5jbGFzc0xpc3QuYWRkKCdmb3JtLXNlbGVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMudG9tX3NlbGVjdCA9IG5ldyBUb21TZWxlY3QodGhpcy4kaWQoJ2lucHV0JykuZ2V0KDApLCBjb25maWcpO1xuXG4gICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLmRhdGEudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudG9tX3NlbGVjdC5zZXRWYWx1ZSh0aGlzLmRhdGEudmFsdWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdmFsKCkgLSBHZXQgb3Igc2V0IHRoZSBzZWxlY3RlZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gSWYgcHJvdmlkZWQsIHNldHMgdGhlIHZhbHVlXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnQgdmFsdWUgd2hlbiBjYWxsZWQgYXMgZ2V0dGVyXG4gICAgICovXG4gICAgdmFsKHZhbHVlKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBHZXR0ZXJcbiAgICAgICAgICAgIGlmICh0aGlzLnRvbV9zZWxlY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b21fc2VsZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kaWQoJ2lucHV0JykudmFsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZXR0ZXJcbiAgICAgICAgICAgIHRoaXMuZGF0YS52YWx1ZSA9IHZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgaWYgKHRoaXMudG9tX3NlbGVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9tX3NlbGVjdC5zZXRWYWx1ZSh0aGlzLmRhdGEudmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLiRpZCgnaW5wdXQnKS5leGlzdHMoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdpbnB1dCcpLnZhbCh0aGlzLmRhdGEudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2VlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYXJncy5zZWVkZXIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCBSc3hfUmFuZG9tX1ZhbHVlcyBlbmRwb2ludFxuICAgICAgICAgICAgbGV0IHZhbHVlID0gJ1Rlc3QgJyArICh0aGlzLmFyZ3Muc2VlZGVyIHx8ICdWYWx1ZScpO1xuICAgICAgICAgICAgdGhpcy52YWwodmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXJncy5vcHRpb25zICYmIHRoaXMuYXJncy5vcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFNlbGVjdCByYW5kb20gb3B0aW9uXG4gICAgICAgICAgICBsZXQgcmFuZG9tX2luZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy5hcmdzLm9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgICAgIGxldCByYW5kb21fb3B0ID0gdGhpcy5hcmdzLm9wdGlvbnNbcmFuZG9tX2luZGV4XTtcbiAgICAgICAgICAgIGxldCByYW5kb21fdmFsdWUgPSB0eXBlb2YgcmFuZG9tX29wdCA9PT0gJ29iamVjdCcgPyByYW5kb21fb3B0LnZhbHVlIDogcmFuZG9tX29wdDtcbiAgICAgICAgICAgIHRoaXMudmFsKHJhbmRvbV92YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbl9kZXN0cm95KCkge1xuICAgICAgICAvLyBDbGVhbiB1cCBUb20gU2VsZWN0IGluc3RhbmNlXG4gICAgICAgIGlmICh0aGlzLnRvbV9zZWxlY3QpIHtcbiAgICAgICAgICAgIHRoaXMudG9tX3NlbGVjdC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBTUEsWUFBWSxTQUFTQyxtQkFBbUIsQ0FBQztFQUMzQ0MsU0FBU0EsQ0FBQSxFQUFHO0lBQ1IsSUFBSSxDQUFDQyxJQUFJLENBQUNDLEtBQUssR0FBRyxFQUFFOztJQUVwQjtJQUNBLElBQUksT0FBTyxJQUFJLENBQUNDLElBQUksQ0FBQ0MsT0FBTyxLQUFLLFFBQVEsRUFBRTtNQUN2QyxJQUFJO1FBQ0E7UUFDQTtRQUNBLE1BQU1DLE9BQU8sR0FBR0MsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDSixJQUFJLENBQUNDLE9BQU8sQ0FBQyxDQUFDSSxJQUFJLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUNMLElBQUksQ0FBQ0MsT0FBTyxHQUFHSyxXQUFXLENBQUNKLE9BQU8sQ0FBQztNQUM1QyxDQUFDLENBQUMsT0FBT0ssQ0FBQyxFQUFFO1FBQ1JDLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLCtCQUErQixFQUFFRixDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDUCxJQUFJLENBQUNDLE9BQU8sR0FBRyxFQUFFO01BQzFCO0lBQ0o7O0lBRUE7SUFDQSxJQUFJLElBQUksQ0FBQ0QsSUFBSSxDQUFDQyxPQUFPLElBQUksT0FBTyxJQUFJLENBQUNELElBQUksQ0FBQ0MsT0FBTyxLQUFLLFFBQVEsSUFBSSxDQUFDUyxRQUFRLENBQUMsSUFBSSxDQUFD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
|