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>
111 lines
15 KiB
JavaScript
Executable File
111 lines
15 KiB
JavaScript
Executable File
"use strict";
|
|
|
|
class Multi_Select extends Component {
|
|
on_ready() {
|
|
this.selected_values = this.args.value || [];
|
|
this.all_options = this.args.options || [];
|
|
if (this.all_options.length > 0) {
|
|
this.render_options(this.all_options);
|
|
}
|
|
|
|
// Search functionality
|
|
const $search = this.$sid('search');
|
|
$search.on('input', e => {
|
|
this.filter_options(e.target.value);
|
|
});
|
|
|
|
// Prevent dropdown close when clicking inside
|
|
this.$sid('menu').on('click', e => {
|
|
e.stopPropagation();
|
|
});
|
|
|
|
// Clear/Select all buttons
|
|
this.$sid('clear_all').on('click', () => {
|
|
this.clear_all();
|
|
});
|
|
this.$sid('select_all').on('click', () => {
|
|
this.select_all();
|
|
});
|
|
|
|
// Update display
|
|
this.update_display();
|
|
}
|
|
render_options(options) {
|
|
const $container = this.$sid('options');
|
|
$container.empty();
|
|
if (options.length === 0) {
|
|
$container.append($('<div>').addClass('px-3 py-2 text-muted').text('No options found'));
|
|
return;
|
|
}
|
|
options.forEach(option => {
|
|
const $label = $('<label>').addClass('dropdown-item mb-0');
|
|
const $checkbox = $('<input>').attr('type', 'checkbox').addClass('form-check-input me-2').attr('data-value', option.value).prop('checked', this.selected_values.includes(option.value));
|
|
$checkbox.on('change', e => {
|
|
this.toggle_option(option.value, e.target.checked);
|
|
});
|
|
$label.append($checkbox).append(option.label);
|
|
$container.append($label);
|
|
});
|
|
}
|
|
filter_options(query) {
|
|
const filtered = this.all_options.filter(opt => opt.label.toLowerCase().includes(query.toLowerCase()));
|
|
this.render_options(filtered);
|
|
}
|
|
toggle_option(value, checked) {
|
|
if (checked) {
|
|
if (!this.selected_values.includes(value)) {
|
|
this.selected_values.push(value);
|
|
}
|
|
} else {
|
|
this.selected_values = this.selected_values.filter(v => v !== value);
|
|
}
|
|
this.update_display();
|
|
if (this.args.on_change) {
|
|
this.args.on_change(this.selected_values);
|
|
}
|
|
}
|
|
update_display() {
|
|
const count = this.selected_values.length;
|
|
const $text = this.$sid('selected_text');
|
|
if (count === 0) {
|
|
$text.text(this.args.placeholder || 'Select options');
|
|
} else if (count === 1) {
|
|
const option = this.all_options.find(opt => opt.value === this.selected_values[0]);
|
|
$text.text(option ? option.label : '1 selected');
|
|
} else {
|
|
$text.text(`${count} selected`);
|
|
}
|
|
}
|
|
clear_all() {
|
|
this.selected_values = [];
|
|
this.$sid('options').find('input[type="checkbox"]').prop('checked', false);
|
|
this.update_display();
|
|
if (this.args.on_change) {
|
|
this.args.on_change(this.selected_values);
|
|
}
|
|
}
|
|
select_all() {
|
|
this.selected_values = this.all_options.map(opt => opt.value);
|
|
this.$sid('options').find('input[type="checkbox"]').prop('checked', true);
|
|
this.update_display();
|
|
if (this.args.on_change) {
|
|
this.args.on_change(this.selected_values);
|
|
}
|
|
}
|
|
get_value() {
|
|
return this.selected_values;
|
|
}
|
|
set_value(values) {
|
|
this.selected_values = values;
|
|
this.$sid('options').find('input[type="checkbox"]').each((i, el) => {
|
|
const $el = $(el);
|
|
$el.prop('checked', values.includes($el.attr('data-value')));
|
|
});
|
|
this.update_display();
|
|
}
|
|
set_options(options) {
|
|
this.all_options = options;
|
|
this.render_options(options);
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNdWx0aV9TZWxlY3QiLCJKcWh0bWxfQ29tcG9uZW50Iiwib25fcmVhZHkiLCJzZWxlY3RlZF92YWx1ZXMiLCJhcmdzIiwidmFsdWUiLCJhbGxfb3B0aW9ucyIsIm9wdGlvbnMiLCJsZW5ndGgiLCJyZW5kZXJfb3B0aW9ucyIsIiRzZWFyY2giLCIkaWQiLCJvbiIsImUiLCJmaWx0ZXJfb3B0aW9ucyIsInRhcmdldCIsInN0b3BQcm9wYWdhdGlvbiIsImNsZWFyX2FsbCIsInNlbGVjdF9hbGwiLCJ1cGRhdGVfZGlzcGxheSIsIiRjb250YWluZXIiLCJlbXB0eSIsImFwcGVuZCIsIiQiLCJhZGRDbGFzcyIsInRleHQiLCJmb3JFYWNoIiwib3B0aW9uIiwiJGxhYmVsIiwiJGNoZWNrYm94IiwiYXR0ciIsInByb3AiLCJpbmNsdWRlcyIsInRvZ2dsZV9vcHRpb24iLCJjaGVja2VkIiwibGFiZWwiLCJxdWVyeSIsImZpbHRlcmVkIiwiZmlsdGVyIiwib3B0IiwidG9Mb3dlckNhc2UiLCJwdXNoIiwidiIsIm9uX2NoYW5nZSIsImNvdW50IiwiJHRleHQiLCJwbGFjZWhvbGRlciIsImZpbmQiLCJtYXAiLCJnZXRfdmFsdWUiLCJzZXRfdmFsdWUiLCJ2YWx1ZXMiLCJlYWNoIiwiaSIsImVsIiwiJGVsIiwic2V0X29wdGlvbnMiXSwic291cmNlcyI6WyJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9NdWx0aV9TZWxlY3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgTXVsdGlfU2VsZWN0IGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfdmFsdWVzID0gdGhpcy5hcmdzLnZhbHVlIHx8IFtdO1xuICAgICAgICB0aGlzLmFsbF9vcHRpb25zID0gdGhpcy5hcmdzLm9wdGlvbnMgfHwgW107XG5cbiAgICAgICAgaWYgKHRoaXMuYWxsX29wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfb3B0aW9ucyh0aGlzLmFsbF9vcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNlYXJjaCBmdW5jdGlvbmFsaXR5XG4gICAgICAgIGNvbnN0ICRzZWFyY2ggPSB0aGlzLiRpZCgnc2VhcmNoJyk7XG4gICAgICAgICRzZWFyY2gub24oJ2lucHV0JywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyX29wdGlvbnMoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQcmV2ZW50IGRyb3Bkb3duIGNsb3NlIHdoZW4gY2xpY2tpbmcgaW5zaWRlXG4gICAgICAgIHRoaXMuJGlkKCdtZW51Jykub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENsZWFyL1NlbGVjdCBhbGwgYnV0dG9uc1xuICAgICAgICB0aGlzLiRpZCgnY2xlYXJfYWxsJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhcl9hbGwoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy4kaWQoJ3NlbGVjdF9hbGwnKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdF9hbGwoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGRpc3BsYXlcbiAgICAgICAgdGhpcy51cGRhdGVfZGlzcGxheSgpO1xuICAgIH1cblxuICAgIHJlbmRlcl9vcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9IHRoaXMuJGlkKCdvcHRpb25zJyk7XG4gICAgICAgICRjb250YWluZXIuZW1wdHkoKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICRjb250YWluZXIuYXBwZW5kKCQoJzxkaXY+JykuYWRkQ2xhc3MoJ3B4LTMgcHktMiB0ZXh0LW11dGVkJykudGV4dCgnTm8gb3B0aW9ucyBmb3VuZCcpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgY29uc3QgJGxhYmVsID0gJCgnPGxhYmVsPicpLmFkZENsYXNzKCdkcm9wZG93bi1pdGVtIG1iLTAnKTtcbiAgICAgICAgICAgIGNvbnN0ICRjaGVja2JveCA9ICQoJzxpbnB1dD4nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ2NoZWNrYm94JylcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2Zvcm0tY2hlY2staW5wdXQgbWUtMicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2RhdGEtdmFsdWUnLCBvcHRpb24udmFsdWUpXG4gICAgICAgICAgICAgICAgLnByb3AoJ2NoZWNrZWQnLCB0aGlzLnNlbGVjdGVkX3ZhbHVlcy5pbmNsdWRlcyhvcHRpb24udmFsdWUpKTtcblxuICAgICAgICAgICAgJGNoZWNrYm94Lm9uKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlX29wdGlvbihvcHRpb24udmFsdWUsIGUudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICRsYWJlbC5hcHBlbmQoJGNoZWNrYm94KS5hcHBlbmQob3B0aW9uLmxhYmVsKTtcbiAgICAgICAgICAgICRjb250YWluZXIuYXBwZW5kKCRsYWJlbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZpbHRlcl9vcHRpb25zKHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5hbGxfb3B0aW9ucy5maWx0ZXIob3B0ID0+XG4gICAgICAgICAgICBvcHQubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlbmRlcl9vcHRpb25zKGZpbHRlcmVkKTtcbiAgICB9XG5cbiAgICB0b2dnbGVfb3B0aW9uKHZhbHVlLCBjaGVja2VkKSB7XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRfdmFsdWVzLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRfdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZF92YWx1ZXMgPSB0aGlzLnNlbGVjdGVkX3ZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZV9kaXNwbGF5KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9jaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5vbl9jaGFuZ2UodGhpcy5zZWxlY3RlZF92YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlX2Rpc3BsYXkoKSB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZF92YWx1ZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCAkdGV4dCA9IHRoaXMuJGlkKCdzZWxlY3RlZF90ZXh0Jyk7XG5cbiAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAkdGV4dC50ZXh0KHRoaXMuYXJncy5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IG9wdGlvbnMnKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5hbGxfb3B0aW9ucy5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRfdmFsdWVzWzBdKTtcbiAgICAgICAgICAgICR0ZXh0LnRleHQob3B0aW9uID8gb3B0aW9uLmxhYmVsIDogJzEgc2VsZWN0ZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICR0ZXh0LnRleHQoYCR7Y291bnR9IHNlbGVjdGVkYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhcl9hbGwoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfdmFsdWVzID0gW107XG4gICAgICAgIHRoaXMuJGlkKCdvcHRpb25zJykuZmluZCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVfZGlzcGxheSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmFyZ3Mub25fY2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmFyZ3Mub25fY2hhbmdlKHRoaXMuc2VsZWN0ZWRfdmFsdWVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdF9hbGwoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfdmFsdWVzID0gdGhpcy5hbGxfb3B0aW9ucy5tYXAob3B0ID0+IG9wdC52YWx1ZSk7XG4gICAgICAgIHRoaXMuJGlkKCdvcHRpb25zJykuZmluZCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZV9kaXNwbGF5KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9jaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5vbl9jaGFuZ2UodGhpcy5zZWxlY3RlZF92YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0X3ZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZF92YWx1ZXM7XG4gICAgfVxuXG4gICAgc2V0X3ZhbHVlKHZhbHVlcykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkX3ZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgdGhpcy4kaWQoJ29wdGlvbnMnKS5maW5kKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKS5lYWNoKChpLCBlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJGVsID0gJChlbCk7XG4gICAgICAgICAgICAkZWwucHJvcCgnY2hlY2tlZCcsIHZhbHVlcy5pbmNsdWRlcygkZWwuYXR0cignZGF0YS12YWx1ZScpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZV9kaXNwbGF5KCk7XG4gICAgfVxuXG4gICAgc2V0X29wdGlvbnMob3B0aW9ucykge1xuICAgICAgICB0aGlzLmFsbF9vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5yZW5kZXJfb3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBTUEsWUFBWSxTQUFTQyxnQkFBZ0IsQ0FBQztFQUN4Q0MsUUFBUUEsQ0FBQSxFQUFHO0lBQ1AsSUFBSSxDQUFDQyxlQUFlLEdBQUcsSUFBSSxDQUFDQyxJQUFJLENBQUNDLEtBQUssSUFBSSxFQUFFO0lBQzVDLElBQUksQ0FBQ0MsV0FBVyxHQUFHLElBQUksQ0FBQ0YsSUFBSSxDQUFDRyxPQUFPLElBQUksRUFBRTtJQUUxQyxJQUFJLElBQUksQ0FBQ0QsV0FBVyxDQUFDRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQzdCLElBQUksQ0FBQ0MsY0FBYyxDQUFDLElBQUksQ0FBQ0gsV0FBVyxDQUFDO0lBQ3pDOztJQUVBO0lBQ0EsTUFBTUksT0FBTyxHQUFHLElBQUksQ0FBQ0MsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNsQ0QsT0FBTyxDQUFDRSxFQUFFLENBQUMsT0FBTyxFQUFHQyxDQUFDLElBQUs7TUFDdkIsSUFBSSxDQUFDQyxjQUFjLENBQUNELENBQUMsQ0FBQ0UsTUFBTSxDQUFDVixLQUFLLENBQUM7SUFDdkMsQ0FBQyxDQUFDOztJQUVGO0lBQ0EsSUFBSSxDQUFDTSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUNDLEVBQUUsQ0FBQyxPQUFPLEVBQUdDLENBQUMsSUFBSztNQUNoQ0EsQ0FBQyxDQUFDRyxlQUFlLENBQUMsQ0FBQztJQUN2QixDQUFDLENB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
|