"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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