Files
rspade_system/storage-broken/rsx-tmp/babel_888f0fb92f79023349e10ffdbecfa2bd.js
root 78553d4edf Fix code quality violations for publish
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>
2025-11-21 04:35:01 +00:00

78 lines
9.4 KiB
JavaScript
Executable File

"use strict";
/**
* Form_Field_Abstract
*
* Abstract base class for form field wrappers. Provides core functionality without visual formatting.
* See form_field_abstract.jqhtml for full documentation.
*
* JavaScript Responsibilities:
* - Discovers and configures child Widget component
* - Sets data-name attribute on widget for form value collection
* - Sets name attribute on native inputs for Form_Utils compatibility
* - Wires label 'for' attribute to input element ID for accessibility (if label exists)
* - Provides seed() support for debug/testing data
* - Bridges between form validation state and child widget
*/
class Form_Field_Abstract extends Component {
on_create() {
// Find parent form for error display
this.form = this.closest('.Rsx_Form');
if (!this.form) {
shouldnt_happen('Form_Field_Abstract must be inside a Rsx_Form component');
}
}
on_ready() {
// Find child widget and set its data-name attribute
let $widget = this.$.find('.Widget').first();
if (!$widget.exists()) {
shouldnt_happen(`Form_Field_Abstract "${this.args.name}" has no .Widget child. Every Form_Field must contain exactly one widget (Text_Input, Wysiwyg_Input, etc.)`);
}
// Set data-name on the widget so Rsx_Form can collect values
$widget.attr('data-name', this.args.name);
let $input = this.$.find('input, select, textarea').first();
if ($input.exists()) {
// Also set name attribute on native inputs for Form_Utils compatibility
// Todo: clever way to deal with this for non standard input elements
$input.attr('name', this.args.name);
// Set the for field to the element if label exists (for child classes)
// Todo: clever way to deal with this for non standard input elements
let $label = this.$sid('form_label');
if ($label.exists()) {
$label.attr('for', $input.attr('id'));
}
}
}
get_error() {
return this.form.get_error(this.args.name);
}
has_error() {
return !!this.get_error();
}
async seed() {
if (!this.args.seeder) {
return;
}
// Find child widget
let $widget = this.$.find('.Widget').first();
if (!$widget.exists()) {
return;
}
let widget_component = $widget.component();
if (!widget_component || !widget_component.val) {
return;
}
// Call the seeder endpoint (Ajax route reference like form $action)
try {
let value = await Ajax.call(this.args.seeder, {});
widget_component.val(value);
} catch (error) {
console.error(`Seeder error for ${this.args.name}:`, error);
}
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGb3JtX0ZpZWxkX0Fic3RyYWN0IiwiSnFodG1sX0NvbXBvbmVudCIsIm9uX2NyZWF0ZSIsImZvcm0iLCJjbG9zZXN0Iiwic2hvdWxkbnRfaGFwcGVuIiwib25fcmVhZHkiLCIkd2lkZ2V0IiwiJCIsImZpbmQiLCJmaXJzdCIsImV4aXN0cyIsImFyZ3MiLCJuYW1lIiwiYXR0ciIsIiRpbnB1dCIsIiRsYWJlbCIsIiRpZCIsImdldF9lcnJvciIsImhhc19lcnJvciIsInNlZWQiLCJzZWVkZXIiLCJ3aWRnZXRfY29tcG9uZW50IiwiY29tcG9uZW50IiwidmFsIiwidmFsdWUiLCJBamF4IiwiY2FsbCIsImVycm9yIiwiY29uc29sZSJdLCJzb3VyY2VzIjpbInJzeC90aGVtZS9jb21wb25lbnRzL2Zvcm1zL2Zvcm1fZmllbGRfYWJzdHJhY3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGb3JtX0ZpZWxkX0Fic3RyYWN0XG4gKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgZm9ybSBmaWVsZCB3cmFwcGVycy4gUHJvdmlkZXMgY29yZSBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgdmlzdWFsIGZvcm1hdHRpbmcuXG4gKiBTZWUgZm9ybV9maWVsZF9hYnN0cmFjdC5qcWh0bWwgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi5cbiAqXG4gKiBKYXZhU2NyaXB0IFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIERpc2NvdmVycyBhbmQgY29uZmlndXJlcyBjaGlsZCBXaWRnZXQgY29tcG9uZW50XG4gKiAtIFNldHMgZGF0YS1uYW1lIGF0dHJpYnV0ZSBvbiB3aWRnZXQgZm9yIGZvcm0gdmFsdWUgY29sbGVjdGlvblxuICogLSBTZXRzIG5hbWUgYXR0cmlidXRlIG9uIG5hdGl2ZSBpbnB1dHMgZm9yIEZvcm1fVXRpbHMgY29tcGF0aWJpbGl0eVxuICogLSBXaXJlcyBsYWJlbCAnZm9yJyBhdHRyaWJ1dGUgdG8gaW5wdXQgZWxlbWVudCBJRCBmb3IgYWNjZXNzaWJpbGl0eSAoaWYgbGFiZWwgZXhpc3RzKVxuICogLSBQcm92aWRlcyBzZWVkKCkgc3VwcG9ydCBmb3IgZGVidWcvdGVzdGluZyBkYXRhXG4gKiAtIEJyaWRnZXMgYmV0d2VlbiBmb3JtIHZhbGlkYXRpb24gc3RhdGUgYW5kIGNoaWxkIHdpZGdldFxuICovXG5jbGFzcyBGb3JtX0ZpZWxkX0Fic3RyYWN0IGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fY3JlYXRlKCkge1xuICAgICAgICAvLyBGaW5kIHBhcmVudCBmb3JtIGZvciBlcnJvciBkaXNwbGF5XG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuY2xvc2VzdCgnLlJzeF9Gb3JtJyk7XG4gICAgICAgIGlmICghdGhpcy5mb3JtKSB7XG4gICAgICAgICAgICBzaG91bGRudF9oYXBwZW4oJ0Zvcm1fRmllbGRfQWJzdHJhY3QgbXVzdCBiZSBpbnNpZGUgYSBSc3hfRm9ybSBjb21wb25lbnQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBGaW5kIGNoaWxkIHdpZGdldCBhbmQgc2V0IGl0cyBkYXRhLW5hbWUgYXR0cmlidXRlXG4gICAgICAgIGxldCAkd2lkZ2V0ID0gdGhpcy4kLmZpbmQoJy5XaWRnZXQnKS5maXJzdCgpO1xuXG4gICAgICAgIGlmICghJHdpZGdldC5leGlzdHMoKSkge1xuICAgICAgICAgICAgc2hvdWxkbnRfaGFwcGVuKFxuICAgICAgICAgICAgICAgIGBGb3JtX0ZpZWxkX0Fic3RyYWN0IFwiJHt0aGlzLmFyZ3MubmFtZX1cIiBoYXMgbm8gLldpZGdldCBjaGlsZC4gRXZlcnkgRm9ybV9GaWVsZCBtdXN0IGNvbnRhaW4gZXhhY3RseSBvbmUgd2lkZ2V0IChUZXh0X0lucHV0LCBXeXNpd3lnX0lucHV0LCBldGMuKWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgZGF0YS1uYW1lIG9uIHRoZSB3aWRnZXQgc28gUnN4X0Zvcm0gY2FuIGNvbGxlY3QgdmFsdWVzXG4gICAgICAgICR3aWRnZXQuYXR0cignZGF0YS1uYW1lJywgdGhpcy5hcmdzLm5hbWUpO1xuXG4gICAgICAgIGxldCAkaW5wdXQgPSB0aGlzLiQuZmluZCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKS5maXJzdCgpO1xuICAgICAgICBpZiAoJGlucHV0LmV4aXN0cygpKSB7XG4gICAgICAgICAgICAvLyBBbHNvIHNldCBuYW1lIGF0dHJpYnV0ZSBvbiBuYXRpdmUgaW5wdXRzIGZvciBGb3JtX1V0aWxzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIC8vIFRvZG86IGNsZXZlciB3YXkgdG8gZGVhbCB3aXRoIHRoaXMgZm9yIG5vbiBzdGFuZGFyZCBpbnB1dCBlbGVtZW50c1xuICAgICAgICAgICAgJGlucHV0LmF0dHIoJ25hbWUnLCB0aGlzLmFyZ3MubmFtZSk7XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9yIGZpZWxkIHRvIHRoZSBlbGVtZW50IGlmIGxhYmVsIGV4aXN0cyAoZm9yIGNoaWxkIGNsYXNzZXMpXG4gICAgICAgICAgICAvLyBUb2RvOiBjbGV2ZXIgd2F5IHRvIGRlYWwgd2l0aCB0aGlzIGZvciBub24gc3RhbmRhcmQgaW5wdXQgZWxlbWVudHNcbiAgICAgICAgICAgIGxldCAkbGFiZWwgPSB0aGlzLiRpZCgnZm9ybV9sYWJlbCcpO1xuICAgICAgICAgICAgaWYgKCRsYWJlbC5leGlzdHMoKSkge1xuICAgICAgICAgICAgICAgICRsYWJlbC5hdHRyKCdmb3InLCAkaW5wdXQuYXR0cignaWQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRfZXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0X2Vycm9yKHRoaXMuYXJncy5uYW1lKTtcbiAgICB9XG5cbiAgICBoYXNfZXJyb3IoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZ2V0X2Vycm9yKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFyZ3Muc2VlZGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5kIGNoaWxkIHdpZGdldFxuICAgICAgICBsZXQgJHdpZGdldCA9IHRoaXMuJC5maW5kKCcuV2lkZ2V0JykuZmlyc3QoKTtcbiAgICAgICAgaWYgKCEkd2lkZ2V0LmV4aXN0cygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgd2lkZ2V0X2NvbXBvbmVudCA9ICR3aWRnZXQuY29tcG9uZW50KCk7XG4gICAgICAgIGlmICghd2lkZ2V0X2NvbXBvbmVudCB8fCAhd2lkZ2V0X2NvbXBvbmVudC52YWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGwgdGhlIHNlZWRlciBlbmRwb2ludCAoQWpheCByb3V0ZSByZWZlcmVuY2UgbGlrZSBmb3JtICRhY3Rpb24pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCBBamF4LmNhbGwodGhpcy5hcmdzLnNlZWRlciwge30pO1xuICAgICAgICAgICAgd2lkZ2V0X2NvbXBvbmVudC52YWwodmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU2VlZGVyIGVycm9yIGZvciAke3RoaXMuYXJncy5uYW1lfTpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLG1CQUFtQixTQUFTQyxnQkFBZ0IsQ0FBQztFQUMvQ0MsU0FBU0EsQ0FBQSxFQUFHO0lBQ1I7SUFDQSxJQUFJLENBQUNDLElBQUksR0FBRyxJQUFJLENBQUNDLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDckMs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