UNPKG

smart-webcomponents-angular

Version:

[![Price](https://img.shields.io/badge/price-COMMERCIAL-0098f7.svg)](https://jqwidgets.com/license/)

1 lines 67.7 kB
{"version":3,"file":"smart-webcomponents-angular-form.mjs","sources":["../../form/src/smart.element.ts","../../form/src/smart.form.ts","../../form/src/smart.formcontrol.ts","../../form/src/smart.formgroup.ts","../../form/src/smart.form.module.ts","../../form/src/smart-webcomponents-angular-form.ts"],"sourcesContent":["\ndeclare global {\n interface Window {\n Smart: any;\n}\n}\n\n\nimport { Directive, ElementRef, Input, Output, EventEmitter } from '@angular/core';\nimport { ElementRenderMode } from './../index';\n\n@Directive()\nexport class BaseElement {\n constructor(ref: ElementRef) {\n const that = this;\n this.nativeElement = ref.nativeElement as any;\n\n that.nativeElement.onAttached = () => {\n that.onAttach.emit(that.nativeElement);\n }\n\n that.nativeElement.onDetached = () => {\n that.onDetach.emit(that.nativeElement);\n }\n }\n\n @Output() onCreate: EventEmitter<any> = new EventEmitter();\n @Output() onReady: EventEmitter<any> = new EventEmitter();\n @Output() onAttach: EventEmitter<any> = new EventEmitter();\n @Output() onDetach: EventEmitter<any> = new EventEmitter();\n\n public nativeElement: any;\n\n public addEventListener(type: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions = false): void {\n this.nativeElement.addEventListener(type, listener, options);\n\t}\n\n\tpublic removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions = false): void {\n\t\tthis.nativeElement.removeEventListener(type, listener, options);\n\t}\n\n\tpublic dispatchEvent(event: Event): boolean {\n\t\treturn this.nativeElement.dispatchEvent(event);\n\t}\n\n\tpublic blur(): void {\n\t\tthis.nativeElement.blur();\n\t}\n\n\tpublic click(): void {\n\t\tthis.nativeElement.click();\n\t}\n\n\tpublic focus(options?: FocusOptions): void {\n\t\tthis.nativeElement.focus(options);\n\t}\n\n/** @description Sets or gets the license. */\n\t@Input()\n\tget license(): string {\n\t\treturn this.nativeElement ? this.nativeElement.license : undefined;\n\t}\n\tset license(value: string) {\n\t\tthis.nativeElement ? this.nativeElement.license = value : undefined;\n\t}\n\t\n/** @description Sets or gets the language. Used in conjunction with the property messages. */\n\t@Input()\n\tget locale(): string {\n\t\treturn this.nativeElement ? this.nativeElement.locale : undefined;\n\t}\n\tset locale(value: string) {\n\t\tthis.nativeElement ? this.nativeElement.locale = value : undefined;\n\t}\n\n\t/** @description Callback used to customize the format of the messages that are returned from the Localization Module. */\n\t@Input()\n\tget localizeFormatFunction(): any {\n\t\treturn this.nativeElement ? this.nativeElement.localizeFormatFunction : undefined;\n\t}\n\tset localizeFormatFunction(value: any) {\n\t\tthis.nativeElement ? this.nativeElement.localizeFormatFunction = value : undefined;\n\t}\n\n\t/** @description Sets or gets an object specifying strings used in the widget that can be localized. Used in conjunction with the property locale. */\n\t@Input()\n\tget messages(): any {\n\t\treturn this.nativeElement ? this.nativeElement.messages : undefined;\n\t}\n\tset messages(value: any) {\n\t\tthis.nativeElement ? this.nativeElement.messages = value : undefined;\n\t}\n\n\t/** @description Sets or gets the value indicating whether the element is aligned to support locales using right-to-left fonts. */\n\t@Input()\n\tget rightToLeft(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.rightToLeft : undefined;\n\t}\n\tset rightToLeft(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.rightToLeft = value : undefined;\n\t}\n\n\t/** @description Determines the theme. Theme defines the look of the element */\n\t@Input()\n\tget theme(): string {\n\t\treturn this.nativeElement ? this.nativeElement.theme : undefined;\n\t}\n\tset theme(value: string) {\n\t\tthis.nativeElement ? this.nativeElement.theme = value : undefined;\n\t}\n}\n\nlet Smart: any;\nif (typeof window !== \"undefined\") {\n\tSmart = window.Smart;\n}\nexport { Smart };\n\n","import { Form } from './../index';\nimport { ControlControlType, ControlLabelPosition, ControlViewMode, FormLabelPosition, Control, ElementRenderMode} from './../index';\nimport { Component, Directive, AfterViewInit, ElementRef, Input, OnInit, OnChanges, OnDestroy, SimpleChanges, Output, EventEmitter, QueryList, ContentChildren } from '@angular/core';\nimport { BaseElement, Smart } from './smart.element';\nexport { ControlControlType, ControlLabelPosition, ControlViewMode, FormLabelPosition, Control, ElementRenderMode} from './../index';\nexport { Smart } from './smart.element';\nexport { Form } from './../index';\n\n\nimport { FormControlComponent } from './smart.formcontrol';\n\nimport { FormGroupComponent } from './smart.formgroup';\n\n@Directive({\n\texportAs: 'smart-form',\tselector: 'smart-form, [smart-form]'\n})\n\nexport class FormComponent extends BaseElement implements OnInit, AfterViewInit, OnDestroy, OnChanges {\n\n\tconstructor(ref: ElementRef<Form>) {\n\t\tsuper(ref);\n\t\tthis.nativeElement = ref.nativeElement as Form;\n\t}\n\n\tprivate eventHandlers: any[] = [];\n\n\tpublic declare nativeElement: Form;\n\t/** @description Creates the component on demand.\n\t * @param properties An optional object of properties, which will be added to the template binded ones.\n\t */\n\tpublic createComponent(properties = {}): any {\n \tthis.nativeElement = <Form>document.createElement('smart-form');\n\t\tfor (let propertyName in properties) { \n \t\t\tthis.nativeElement[propertyName] = properties[propertyName];\n\t\t}\n\t\treturn this.nativeElement;\n\t}\n\t/** @description Defines or retrieves the number of columns used to arrange form fields, determining how fields are organized and displayed within the form layout. */\n\t@Input()\n\tget columns(): number {\n\t\treturn this.nativeElement ? this.nativeElement.columns : undefined;\n\t}\n\tset columns(value: number) {\n\t\tthis.nativeElement ? this.nativeElement.columns = value : undefined;\n\t}\n\n\t/** @description Gets or sets the collection of form controls associated with the form. This allows you to retrieve the current controls or update them with a new set of controls. */\n\t@Input()\n\tget controls(): Control[] {\n\t\treturn this.nativeElement ? this.nativeElement.controls : undefined;\n\t}\n\tset controls(value: Control[]) {\n\t\tthis.nativeElement ? this.nativeElement.controls = value : undefined;\n\t}\n\n\t/** @description Defines or retrieves the position of the labels relative to their associated elements. Specify this property to control where labels are displayed (e.g., above, below, left, or right of the element). */\n\t@Input()\n\tget onStatusChanges(): {(value: string): void} {\n\t\treturn this.nativeElement ? this.nativeElement.onStatusChanges : undefined;\n\t}\n\tset onStatusChanges(value: {(value: string): void}) {\n\t\tthis.nativeElement ? this.nativeElement.onStatusChanges = value : undefined;\n\t}\n\n\t/** @description Sets all form fields to read-only mode, preventing users from modifying their input while still allowing them to view the existing data. */\n\t@Input()\n\tget onValueChanges(): {(value: any): void} {\n\t\treturn this.nativeElement ? this.nativeElement.onValueChanges : undefined;\n\t}\n\tset onValueChanges(value: {(value: any): void}) {\n\t\tthis.nativeElement ? this.nativeElement.onValueChanges = value : undefined;\n\t}\n\n\t/** @description Controls the visibility of the colon character that appears after label text. When enabled, a colon is displayed after each label; when disabled, the colon is omitted. */\n\t@Input()\n\tget labelPosition(): FormLabelPosition | string {\n\t\treturn this.nativeElement ? this.nativeElement.labelPosition : undefined;\n\t}\n\tset labelPosition(value: FormLabelPosition | string) {\n\t\tthis.nativeElement ? this.nativeElement.labelPosition = value : undefined;\n\t}\n\n\t/** @description Toggles the visibility of the validation summary, allowing users to display or hide a list of validation errors based on form input. */\n\t@Input()\n\tget readonly(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.readonly : undefined;\n\t}\n\tset readonly(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.readonly = value : undefined;\n\t}\n\n\t/** @description Retrieves the current status of the Form. Each entry within the status object contains the following boolean properties: dirty (indicates if the form field has been modified), untouched (indicates if the field has not been focused by the user), and disabled (indicates if the field is currently disabled). */\n\t@Input()\n\tget showColonAfterLabel(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.showColonAfterLabel : undefined;\n\t}\n\tset showColonAfterLabel(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.showColonAfterLabel = value : undefined;\n\t}\n\n\t/** @description Retrieves or assigns the current value of the form. Use this property to access the form's data for processing or to update the form with new values programmatically. */\n\t@Input()\n\tget showSummary(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.showSummary : undefined;\n\t}\n\tset showSummary(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.showSummary = value : undefined;\n\t}\n\n\t/** @description Automatically triggers form validation immediately upon form initialization, ensuring that all form fields are checked for correctness as soon as the form is rendered or instantiated. */\n\t@Input()\n\tget status(): any {\n\t\treturn this.nativeElement ? this.nativeElement.status : undefined;\n\t}\n\tset status(value: any) {\n\t\tthis.nativeElement ? this.nativeElement.status = value : undefined;\n\t}\n\n\t/** @description undefined */\n\t@Input()\n\tget value(): any {\n\t\treturn this.nativeElement ? this.nativeElement.value : undefined;\n\t}\n\tset value(value: any) {\n\t\tthis.nativeElement ? this.nativeElement.value = value : undefined;\n\t}\n\n\t/** @description undefined */\n\t@Input()\n\tget validateOnLoad(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.validateOnLoad : undefined;\n\t}\n\tset validateOnLoad(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.validateOnLoad = value : undefined;\n\t}\n\n\t/** @description Inserts a new control element, such as an input field, button, or checkbox, into the Form, allowing users to interact with and submit data. \n\t* @param {any} controlOptions. Control options. The control options description is available in the <em>controls</em> property.\n\t*/\n public addControl(controlOptions: any): void {\n if (this.nativeElement.isRendered) {\n this.nativeElement.addControl(controlOptions);\n }\n else\n {\n this.nativeElement.whenRendered(() => {\n this.nativeElement.addControl(controlOptions);\n });\n }\n }\n\n\t/** @description Retrieves a specific control element from the form using its name attribute, as defined by the dataField parameter. This method enables direct access to the control's properties and methods for further manipulation or data retrieval. \n\t* @param {string} dataField. dataField of a FormControl or FormGroup\n\t* @returns {Control}\n */\n\tpublic async getControl(dataField): Promise<any> {\n\t\tconst getResultOnRender = () => {\n return new Promise(resolve => {\n this.nativeElement.whenRendered(() => {\n const result = this.nativeElement.getControl(dataField);\n resolve(result)\n });\n });\n };\n const result = await getResultOnRender();\n\n return result;\n }\n\n\tpublic getControlSync(dataField): Control {\n if (this.nativeElement.isRendered) {\n \t return this.nativeElement.getControl(dataField);\n }\n return null;\n }\n\n\t/** @description Adds a new control element to the Form, allowing users to dynamically extend the form’s functionality. This method enables the inclusion of input fields, buttons, dropdowns, or other interactive components within the Form, ensuring seamless integration and consistent behavior with existing controls. \n\t* @param {number} index. Control insert index\n\t* @param {any} controlOptions. Control options. The control options description is available in the <em>controls</em> property.\n\t*/\n public insertControl(index: number, controlOptions: any): void {\n if (this.nativeElement.isRendered) {\n this.nativeElement.insertControl(index, controlOptions);\n }\n else\n {\n this.nativeElement.whenRendered(() => {\n this.nativeElement.insertControl(index, controlOptions);\n });\n }\n }\n\n\t/** @description Removes a specified control element from the Form, ensuring it is no longer rendered or managed as part of the Form's structure and behavior. \n\t* @param {any} controlOptions. Control options. The control options description is available in the <em>controls</em> property.\n\t*/\n public removeControl(controlOptions: any): void {\n if (this.nativeElement.isRendered) {\n this.nativeElement.removeControl(controlOptions);\n }\n else\n {\n this.nativeElement.whenRendered(() => {\n this.nativeElement.removeControl(controlOptions);\n });\n }\n }\n\n\t/** @description Triggers the submission of the form, sending the user-entered data to the specified server endpoint for processing. This action may also initiate form validation and execute any associated event handlers before transmitting the data. \n\t* @param {any} submitOptions?. Sets the submit options object. The object may have the following properties: <em>async</em>, <em>action</em>, <em>target</em>, <em>method</em>. <em>async</em> determines whether the form will be submitted asynchronously. <em>action</em> determines the submit url, <em>method</em> sets whether the submit is through 'GET' or 'POST'. <em>target</em> determines the submit target.\n\t*/\n public submit(submitOptions?: any): void {\n if (this.nativeElement.isRendered) {\n this.nativeElement.submit(submitOptions);\n }\n else\n {\n this.nativeElement.whenRendered(() => {\n this.nativeElement.submit(submitOptions);\n });\n }\n }\n\n\t/** @description Resets all fields in the form to their initial, default values, effectively clearing any user input or changes made. \n\t*/\n public reset(): void {\n if (this.nativeElement.isRendered) {\n this.nativeElement.reset();\n }\n else\n {\n this.nativeElement.whenRendered(() => {\n this.nativeElement.reset();\n });\n }\n }\n\n\t/** @description Performs comprehensive validation of the form fields, ensuring that all required inputs are provided, data types and formats are correct, and any specified constraints or validation rules are met before allowing form submission. \n\t*/\n public validate(): void {\n if (this.nativeElement.isRendered) {\n this.nativeElement.validate();\n }\n else\n {\n this.nativeElement.whenRendered(() => {\n this.nativeElement.validate();\n });\n }\n }\n\n\n\tget isRendered(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.isRendered : false;\n\t}\n\n\tngOnInit() {\n\t}\n\n ngAfterViewInit() {\n const that = this;\n\n that.onCreate.emit(that.nativeElement);\n\n\t\tif (Smart) Smart.Render();\n\n\t\tthis.nativeElement.classList.add('smart-angular');\n\n\t\tif (this.nativeElement.whenRendered) this.nativeElement.whenRendered(() => { that.onReady.emit(that.nativeElement); });\n\t\tthis.listen();\n\t}\n\n\tngOnDestroy() {\n\t\tthis.unlisten();\n\t}\n\n\tngOnChanges(changes: SimpleChanges) {\n\t\tif (this.nativeElement && this.nativeElement.isRendered) {\n\t\t\tfor (const propName in changes) {\n\t\t\t\tif (changes.hasOwnProperty(propName)) {\n\t\t\t\t\tthis.nativeElement[propName] = changes[propName].currentValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @description Add event listeners. */\n\tprivate listen(): void {\n const that = this;\n\t}\n\n\t/** @description Remove event listeners. */\n\tprivate unlisten(): void {\n const that = this;\n\t}\n}\n","import { FormControl } from './../index';\nimport { FormControlAction, FormControlAlign, FormControlControlType, FormControlLabelPosition, FormControlViewMode, ElementRenderMode} from './../index';\nimport { Component, Directive, AfterViewInit, ElementRef, Input, OnInit, OnChanges, OnDestroy, SimpleChanges, Output, EventEmitter } from '@angular/core';\nimport { BaseElement, Smart } from './smart.element';\nexport { FormControlAction, FormControlAlign, FormControlControlType, FormControlLabelPosition, FormControlViewMode, ElementRenderMode} from './../index';\nexport { Smart } from './smart.element';\nexport { FormControl } from './../index';\n\n\n@Directive({\n\texportAs: 'smart-form-control',\tselector: 'smart-form-control, [smart-form-control]'\n})\n\nexport class FormControlComponent extends BaseElement implements OnInit, AfterViewInit, OnDestroy, OnChanges {\n\tconstructor(ref: ElementRef<FormControl>) {\n\t\tsuper(ref);\n\t\tthis.nativeElement = ref.nativeElement as FormControl;\n\t}\n\n\tprivate eventHandlers: any[] = [];\n\n\tpublic declare nativeElement: FormControl;\n\t/** @description Creates the component on demand.\n\t * @param properties An optional object of properties, which will be added to the template binded ones.\n\t */\n\tpublic createComponent(properties = {}): any {\n \tthis.nativeElement = <FormControl>document.createElement('smart-form-control');\n\t\tfor (let propertyName in properties) { \n \t\t\tthis.nativeElement[propertyName] = properties[propertyName];\n\t\t}\n\t\treturn this.nativeElement;\n\t}\n\t/** @description Retrieves or assigns the action associated with the FormControl component. This property specifically applies when the 'controlType' is set to either 'button' or 'submit', determining the function or operation that will be executed when the control is activated (e.g., when the button is clicked or the form is submitted). */\n\t@Input()\n\tget action(): FormControlAction | string {\n\t\treturn this.nativeElement ? this.nativeElement.action : undefined;\n\t}\n\tset action(value: FormControlAction | string) {\n\t\tthis.nativeElement ? this.nativeElement.action = value : undefined;\n\t}\n\n\t/** @description Specifies or retrieves the alignment setting of the FormControl element, determining how the control is positioned within its parent container (e.g., left, right, center, or justified). */\n\t@Input()\n\tget align(): FormControlAlign | string {\n\t\treturn this.nativeElement ? this.nativeElement.align : undefined;\n\t}\n\tset align(value: FormControlAlign | string) {\n\t\tthis.nativeElement ? this.nativeElement.align = value : undefined;\n\t}\n\n\t/** @description \"Specifies the HTML content that will appear immediately after the form control element. This allows you to display supplementary information, messages, or custom markup directly following the input field.\" */\n\t@Input()\n\tget appendHTML(): any {\n\t\treturn this.nativeElement ? this.nativeElement.appendHTML : undefined;\n\t}\n\tset appendHTML(value: any) {\n\t\tthis.nativeElement ? this.nativeElement.appendHTML = value : undefined;\n\t}\n\n\t/** @description A JSON object containing configuration options for initializing the UI component. For example, providing { dataSource: ['item 1', 'item 2', 'item 3'] } assigns the specified array to the dataSource property of the Form control, defining the data items that will be displayed or used within the component. Use this object to specify properties such as data sources, default values, appearance settings, or behavior options for the UI element during its creation. */\n\t@Input()\n\tget controlOptions(): any {\n\t\treturn this.nativeElement ? this.nativeElement.controlOptions : undefined;\n\t}\n\tset controlOptions(value: any) {\n\t\tthis.nativeElement ? this.nativeElement.controlOptions = value : undefined;\n\t}\n\n\t/** @description Specifies the type of user interface control (such as button, textbox, dropdown, etc.) represented by this component. This property determines the control's behavior and visual appearance. */\n\t@Input()\n\tget controlType(): FormControlControlType | string {\n\t\treturn this.nativeElement ? this.nativeElement.controlType : undefined;\n\t}\n\tset controlType(value: FormControlControlType | string) {\n\t\tthis.nativeElement ? this.nativeElement.controlType = value : undefined;\n\t}\n\n\t/** @description Specifies the number of columns used to arrange the fields within the Form Group, determining how the form elements are organized and displayed in a grid layout. */\n\t@Input()\n\tget columns(): number {\n\t\treturn this.nativeElement ? this.nativeElement.columns : undefined;\n\t}\n\tset columns(value: number) {\n\t\tthis.nativeElement ? this.nativeElement.columns = value : undefined;\n\t}\n\n\t/** @description Specifies the number of columns that the form control should span within a grid layout, allowing you to control the width of the form element across multiple columns. */\n\t@Input()\n\tget columnSpan(): number {\n\t\treturn this.nativeElement ? this.nativeElement.columnSpan : undefined;\n\t}\n\tset columnSpan(value: number) {\n\t\tthis.nativeElement ? this.nativeElement.columnSpan = value : undefined;\n\t}\n\n\t/** @description Specifies the data field associated with the form control. The value of dataField is assigned as the name attribute of the control's internal input element. Additionally, within the parent FormGroup, this form control can be accessed by referencing the same dataField value. This ensures seamless integration between the form control and the FormGroup’s data model. */\n\t@Input()\n\tget dataField(): string {\n\t\treturn this.nativeElement ? this.nativeElement.dataField : undefined;\n\t}\n\tset dataField(value: string) {\n\t\tthis.nativeElement ? this.nativeElement.dataField = value : undefined;\n\t}\n\n\t/** @description Enables or disables the form control, determining whether users can interact with it. When set to disabled, the control will be grayed out and unresponsive to user input. */\n\t@Input()\n\tget disabled(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.disabled : undefined;\n\t}\n\tset disabled(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.disabled = value : undefined;\n\t}\n\n\t/** @description Returns a boolean indicating whether the Form control is 'dirty'—that is, whether the user has modified the control's value from its original (initial) value. This property helps determine if the input has been changed since the form was loaded or last reset. */\n\t@Input()\n\tget dirty(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.dirty : undefined;\n\t}\n\tset dirty(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.dirty = value : undefined;\n\t}\n\n\t/** @description Retrieves or defines the tooltip text that appears when a user hovers over the info icon associated with the Form control. This tooltip provides additional information or guidance about the form field for improved user experience. */\n\t@Input()\n\tget info(): string {\n\t\treturn this.nativeElement ? this.nativeElement.info : undefined;\n\t}\n\tset info(value: string) {\n\t\tthis.nativeElement ? this.nativeElement.info = value : undefined;\n\t}\n\n\t/** @description Determines if the Form control currently has validation errors, indicating that its input data does not meet the specified validation rules. Returns 'true' if the control is invalid; otherwise, returns 'false'. */\n\t@Input()\n\tget invalid(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.invalid : undefined;\n\t}\n\tset invalid(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.invalid = value : undefined;\n\t}\n\n\t/** @description Retrieves or assigns the label text displayed for the Form control, allowing you to specify or update the descriptive text shown to users. */\n\t@Input()\n\tget label(): string {\n\t\treturn this.nativeElement ? this.nativeElement.label : undefined;\n\t}\n\tset label(value: string) {\n\t\tthis.nativeElement ? this.nativeElement.label = value : undefined;\n\t}\n\n\t/** @description Retrieves or specifies the position of the label associated with the form control. This property determines where the label will be displayed relative to the form element (e.g., above, below, to the left, or to the right). */\n\t@Input()\n\tget labelPosition(): FormControlLabelPosition | string {\n\t\treturn this.nativeElement ? this.nativeElement.labelPosition : undefined;\n\t}\n\tset labelPosition(value: FormControlLabelPosition | string) {\n\t\tthis.nativeElement ? this.nativeElement.labelPosition = value : undefined;\n\t}\n\n\t/** @description Gets or sets the distance (in pixels) between the label and its associated control, allowing you to adjust the spacing for layout and visual alignment purposes. */\n\t@Input()\n\tget labelOffset(): number {\n\t\treturn this.nativeElement ? this.nativeElement.labelOffset : undefined;\n\t}\n\tset labelOffset(value: number) {\n\t\tthis.nativeElement ? this.nativeElement.labelOffset = value : undefined;\n\t}\n\n\t/** @description '' *This property is applicable only when the controlType is set to 'group'. It determines whether the navigation buttons are shown within the FormGroup. The property takes effect only when the viewMode property is also configured. Use this setting to control the visibility of navigation controls for multi-step or grouped form layouts.* */\n\t@Input()\n\tget labelAlign(): FormControlAlign | string {\n\t\treturn this.nativeElement ? this.nativeElement.labelAlign : undefined;\n\t}\n\tset labelAlign(value: FormControlAlign | string) {\n\t\tthis.nativeElement ? this.nativeElement.labelAlign = value : undefined;\n\t}\n\n\t/** @description Applies only when the controlType property is set to 'group'. Specifies the label text displayed on the \"Next\" button within a FormGroup, allowing you to get or set a custom label for navigation purposes. */\n\t@Input()\n\tget nextButtonLabel(): string {\n\t\treturn this.nativeElement ? this.nativeElement.nextButtonLabel : undefined;\n\t}\n\tset nextButtonLabel(value: string) {\n\t\tthis.nativeElement ? this.nativeElement.nextButtonLabel = value : undefined;\n\t}\n\n\t/** @description '' Available only when the controlType property is set to 'group' (i.e., for FormGroup controls). This property allows you to get or set the label displayed on the back button within the form group. */\n\t@Input()\n\tget backButtonLabel(): string {\n\t\treturn this.nativeElement ? this.nativeElement.backButtonLabel : undefined;\n\t}\n\tset backButtonLabel(value: string) {\n\t\tthis.nativeElement ? this.nativeElement.backButtonLabel = value : undefined;\n\t}\n\n\t/** @description Allows you to retrieve or specify the placeholder text displayed in the FormControl when the input field is empty. This placeholder provides a hint to users about the expected input. */\n\t@Input()\n\tget placeholder(): string {\n\t\treturn this.nativeElement ? this.nativeElement.placeholder : undefined;\n\t}\n\tset placeholder(value: string) {\n\t\tthis.nativeElement ? this.nativeElement.placeholder = value : undefined;\n\t}\n\n\t/** @description HTML content that appears visually above or before the form control element, typically used for introductory text, instructions, or contextual information. This content is rendered prior to the input field or interactive control in the layout. */\n\t@Input()\n\tget prependHTML(): any {\n\t\treturn this.nativeElement ? this.nativeElement.prependHTML : undefined;\n\t}\n\tset prependHTML(value: any) {\n\t\tthis.nativeElement ? this.nativeElement.prependHTML = value : undefined;\n\t}\n\n\t/** @description Enables you to retrieve or assign the readonly state of the form control. When set to true, the form control becomes non-editable, preventing users from modifying its value while still allowing its content to be viewed. */\n\t@Input()\n\tget readonly(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.readonly : undefined;\n\t}\n\tset readonly(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.readonly = value : undefined;\n\t}\n\n\t/** @description Determines whether this field must be filled in by the user. When set to true, the field is required and validation will fail if it is left empty. When set to false, the field is optional. This property can be both retrieved (get) and updated (set). */\n\t@Input()\n\tget required(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.required : undefined;\n\t}\n\tset required(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.required = value : undefined;\n\t}\n\n\t/** @description Returns whether the Form control is in a \"pristine\" state, meaning it has not been interacted with or \"touched\" by the user. This property remains true until the user focuses on and then blurs (moves away from) the Form control, at which point it is set to false. It is commonly used to determine if the user has interacted with a form field since the component was initialized. */\n\t@Input()\n\tget untouched(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.untouched : undefined;\n\t}\n\tset untouched(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.untouched = value : undefined;\n\t}\n\n\t/** @description Gets or sets whether a colon character (:) is automatically displayed after the label text. When enabled, a colon will appear immediately following the label, typically to visually separate the label from the corresponding input field. */\n\t@Input()\n\tget showColonAfterLabel(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.showColonAfterLabel : undefined;\n\t}\n\tset showColonAfterLabel(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.showColonAfterLabel = value : undefined;\n\t}\n\n\t/** @description Applies only when controlType is set to 'group'. This property determines whether navigation buttons are shown within the FormGroup. It is effective only if the viewMode property is enabled. Use this property to control the visibility of navigation controls for grouped form elements in the specified view mode. */\n\t@Input()\n\tget showButtons(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.showButtons : undefined;\n\t}\n\tset showButtons(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.showButtons = value : undefined;\n\t}\n\n\t/** @description Provides the ability to retrieve (get) or update (set) the current value of a FormControl or FormGroup. This allows you to read the form’s data or programmatically change its values as needed. */\n\t@Input()\n\tget value(): any {\n\t\treturn this.nativeElement ? this.nativeElement.value : undefined;\n\t}\n\tset value(value: any) {\n\t\tthis.nativeElement ? this.nativeElement.value = value : undefined;\n\t}\n\n\t/** @description Determines whether the Form control currently satisfies all validation rules and is considered valid. Returns true if the control’s value passes all validation checks; otherwise, returns false. */\n\t@Input()\n\tget valid(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.valid : undefined;\n\t}\n\tset valid(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.valid = value : undefined;\n\t}\n\n\t/** @description Sets or retrieves the column's validation rules. The value should be an array of objects, where each object defines a specific validation rule for the column. Each validation rule object must include:- A 'type' property, which specifies the type of validation. Valid values for 'type' include: ''required'', ''min'', ''max'', ''minLength'', ''maxLength'', ''email'', ''null'', ''requiredTrue'', ''minDate'', ''maxDate'', and ''pattern''.- A 'value' property, which provides the value used for the validation. For example, for 'minLength', 'value' might be '3', or for 'pattern', it could be a regular expression. Note: For validation types ''required'', ''requiredTrue'', and ''null'', the 'value' property can be omitted.Optionally, you can include a 'message' property to specify a custom error message that is shown when the validation fails.'Example:''''json[ { \"type\": \"required\", \"message\": \"This field is mandatory.\" }, { \"type\": \"minLength\", \"value\": 3, \"message\": \"Minimum 3 characters required.\" }, { \"type\": \"pattern\", \"value\": \"^[A-Za-z]+$\", \"message\": \"Only letters are allowed.\" }]'''This structure allows you to define multiple validation rules for a column, each with its own type, constraints, and error message. */\n\t@Input()\n\tget validationRules(): [] | null {\n\t\treturn this.nativeElement ? this.nativeElement.validationRules : undefined;\n\t}\n\tset validationRules(value: [] | null) {\n\t\tthis.nativeElement ? this.nativeElement.validationRules = value : undefined;\n\t}\n\n\t/** @description 'Applies only when controlType is set to 'group'. This property gets or sets the view mode of the form group, determining how the group of form controls is displayed and interacted with in the UI.' */\n\t@Input()\n\tget viewMode(): FormControlViewMode | string {\n\t\treturn this.nativeElement ? this.nativeElement.viewMode : undefined;\n\t}\n\tset viewMode(value: FormControlViewMode | string) {\n\t\tthis.nativeElement ? this.nativeElement.viewMode = value : undefined;\n\t}\n\n\n\tget isRendered(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.isRendered : false;\n\t}\n\n\tngOnInit() {\n\t}\n\n ngAfterViewInit() {\n const that = this;\n\n that.onCreate.emit(that.nativeElement);\n\n\t\tthis.nativeElement.classList.add('smart-angular');\n\n\t\tif (this.nativeElement.whenRendered) this.nativeElement.whenRendered(() => { that.onReady.emit(that.nativeElement); });\n\t\tthis.listen();\n\t}\n\n\tngOnDestroy() {\n\t\tthis.unlisten();\n\t}\n\n\tngOnChanges(changes: SimpleChanges) {\n\t\tif (this.nativeElement && this.nativeElement.isRendered) {\n\t\t\tfor (const propName in changes) {\n\t\t\t\tif (changes.hasOwnProperty(propName)) {\n\t\t\t\t\tthis.nativeElement[propName] = changes[propName].currentValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @description Add event listeners. */\n\tprivate listen(): void {\n const that = this;\n\t}\n\n\t/** @description Remove event listeners. */\n\tprivate unlisten(): void {\n const that = this;\n\t}\n}\n","import { FormGroup } from './../index';\nimport { ControlControlType, ControlLabelPosition, ControlViewMode, FormGroupLabelPosition, Control, ElementRenderMode} from './../index';\nimport { Component, Directive, AfterViewInit, ElementRef, Input, OnInit, OnChanges, OnDestroy, SimpleChanges, Output, EventEmitter } from '@angular/core';\nimport { BaseElement, Smart } from './smart.element';\nexport { ControlControlType, ControlLabelPosition, ControlViewMode, FormGroupLabelPosition, Control, ElementRenderMode} from './../index';\nexport { Smart } from './smart.element';\nexport { FormGroup } from './../index';\n\n\n@Directive({\n\texportAs: 'smart-form-group',\tselector: 'smart-form-group, [smart-form-group]'\n})\n\nexport class FormGroupComponent extends BaseElement implements OnInit, AfterViewInit, OnDestroy, OnChanges {\n\tconstructor(ref: ElementRef<FormGroup>) {\n\t\tsuper(ref);\n\t\tthis.nativeElement = ref.nativeElement as FormGroup;\n\t}\n\n\tprivate eventHandlers: any[] = [];\n\n\tpublic declare nativeElement: FormGroup;\n\t/** @description Creates the component on demand.\n\t * @param properties An optional object of properties, which will be added to the template binded ones.\n\t */\n\tpublic createComponent(properties = {}): any {\n \tthis.nativeElement = <FormGroup>document.createElement('smart-form-group');\n\t\tfor (let propertyName in properties) { \n \t\t\tthis.nativeElement[propertyName] = properties[propertyName];\n\t\t}\n\t\treturn this.nativeElement;\n\t}\n\t/** @description Gets or sets the number of columns used to layout the form fields, allowing for multi-column form arrangements. */\n\t@Input()\n\tget columns(): number {\n\t\treturn this.nativeElement ? this.nativeElement.columns : undefined;\n\t}\n\tset columns(value: number) {\n\t\tthis.nativeElement ? this.nativeElement.columns = value : undefined;\n\t}\n\n\t/** @description Defines the data field associated with the form control. The inner input element’s name attribute will be set to the specified dataField value, ensuring correct binding and form data serialization. Additionally, this value determines how the control is referenced within the FormGroup, making the form control’s value accessible via the dataField key in the form’s data model. */\n\t@Input()\n\tget dataField(): string {\n\t\treturn this.nativeElement ? this.nativeElement.dataField : undefined;\n\t}\n\tset dataField(value: string) {\n\t\tthis.nativeElement ? this.nativeElement.dataField = value : undefined;\n\t}\n\n\t/** @description Retrieves or updates the text displayed as the label for the form control, allowing you to specify or modify the descriptive text shown to users alongside the input element. */\n\t@Input()\n\tget label(): string {\n\t\treturn this.nativeElement ? this.nativeElement.label : undefined;\n\t}\n\tset label(value: string) {\n\t\tthis.nativeElement ? this.nativeElement.label = value : undefined;\n\t}\n\n\t/** @description */\n\t@Input()\n\tget controls(): Control[] {\n\t\treturn this.nativeElement ? this.nativeElement.controls : undefined;\n\t}\n\tset controls(value: Control[]) {\n\t\tthis.nativeElement ? this.nativeElement.controls = value : undefined;\n\t}\n\n\t/** @description Specifies or retrieves the position of the labels relative to their associated element. This property can be used to define where labels are displayed, such as above, below, to the left, or to the right of the element. */\n\t@Input()\n\tget onStatusChanges(): {(value: string): void} {\n\t\treturn this.nativeElement ? this.nativeElement.onStatusChanges : undefined;\n\t}\n\tset onStatusChanges(value: {(value: string): void}) {\n\t\tthis.nativeElement ? this.nativeElement.onStatusChanges = value : undefined;\n\t}\n\n\t/** @description Sets the form to read-only mode, preventing users from editing or modifying any of the input fields while still allowing them to view the current values. */\n\t@Input()\n\tget onValueChanges(): {(value: any): void} {\n\t\treturn this.nativeElement ? this.nativeElement.onValueChanges : undefined;\n\t}\n\tset onValueChanges(value: {(value: any): void}) {\n\t\tthis.nativeElement ? this.nativeElement.onValueChanges = value : undefined;\n\t}\n\n\t/** @description Toggles the visibility of the colon character that appears immediately after label text, allowing you to choose whether or not a colon is displayed following each label. */\n\t@Input()\n\tget labelPosition(): FormGroupLabelPosition | string {\n\t\treturn this.nativeElement ? this.nativeElement.labelPosition : undefined;\n\t}\n\tset labelPosition(value: FormGroupLabelPosition | string) {\n\t\tthis.nativeElement ? this.nativeElement.labelPosition = value : undefined;\n\t}\n\n\t/** @description Controls the visibility of the validation summary, allowing you to display or hide a summary of form validation errors to users. */\n\t@Input()\n\tget readonly(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.readonly : undefined;\n\t}\n\tset readonly(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.readonly = value : undefined;\n\t}\n\n\t/** @description Retrieves the current value of the form or updates it with a new value. This property can be used to access the form's data or set it programmatically. */\n\t@Input()\n\tget showColonAfterLabel(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.showColonAfterLabel : undefined;\n\t}\n\tset showColonAfterLabel(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.showColonAfterLabel = value : undefined;\n\t}\n\n\t/** @description undefined */\n\t@Input()\n\tget showSummary(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.showSummary : undefined;\n\t}\n\tset showSummary(value: boolean) {\n\t\tthis.nativeElement ? this.nativeElement.showSummary = value : undefined;\n\t}\n\n\t/** @description undefined */\n\t@Input()\n\tget value(): any {\n\t\treturn this.nativeElement ? this.nativeElement.value : undefined;\n\t}\n\tset value(value: any) {\n\t\tthis.nativeElement ? this.nativeElement.value = value : undefined;\n\t}\n\n\t/** @description Inserts a new input control (such as a text box, dropdown, or checkbox) into the Form, allowing users to provide or select additional information as part of their submission. \n\t* @param {any} controlOptions. Control options. The control options description is available in the <em>controls</em> property.\n\t*/\n public addControl(controlOptions: any): void {\n if (this.nativeElement.isRendered) {\n this.nativeElement.addControl(controlOptions);\n }\n else\n {\n this.nativeElement.whenRendered(() => {\n this.nativeElement.addControl(controlOptions);\n });\n }\n }\n\n\t/** @description Retrieves a specific control from the collection using its name, as specified by the dataField parameter. This function searches for a control whose name matches the provided dataField value and returns the corresponding control object, allowing you to access or manipulate its properties and methods. \n\t* @param {string} dataField. dataField of a FormControl or FormGroup\n\t* @returns {Control}\n */\n\tpublic async getControl(dataField): Promise<any> {\n\t\tconst getResultOnRender = () => {\n return new Promise(resolve => {\n this.nativeElement.whenRendered(() => {\n const result = this.nativeElement.getControl(dataField);\n resolve(result)\n });\n });\n };\n const result = await getResultOnRender();\n\n return result;\n }\n\n\tpublic getControlSync(dataField): Control {\n if (this.nativeElement.isRendered) {\n \t return this.nativeElement.getControl(dataField);\n }\n return null;\n }\n\n\t/** @description Adds a user interface control (such as a text box, dropdown, or button) to the specified Form, enabling users to input or interact with form data. This operation dynamically updates the Form’s layout and may include assigning default properties, event handlers, and positioning options for the new control. \n\t* @param {number} index. Control insert index\n\t* @param {any} controlOptions. Control options. The control options description is available in the <em>controls</em> property.\n\t*/\n public insertControl(index: number, controlOptions: any): void {\n if (this.nativeElement.isRendered) {\n this.nativeElement.insertControl(index, controlOptions);\n }\n else\n {\n this.nativeElement.whenRendered(() => {\n this.nativeElement.insertControl(index, controlOptions);\n });\n }\n }\n\n\t/** @description Removes a specified control element from the Form, effectively deleting it from the Form’s structure and user interface. This operation detaches the control, ensuring it is no longer available for user interaction or data capture. Use this action to dynamically update the Form’s contents based on user actions or application logic. \n\t* @param {any} controlOptions. Control options. The control options description is available in the <em>controls</em> property.\n\t*/\n public removeControl(controlOptions: any): void {\n if (this.nativeElement.isRendered) {\n this.nativeElement.removeControl(controlOptions);\n }\n else\n {\n this.nativeElement.whenRendered(() => {\n this.nativeElement.removeControl(controlOptions);\n });\n }\n }\n\n\n\tget isRendered(): boolean {\n\t\treturn this.nativeElement ? this.nativeElement.isRendered : false;\n\t}\n\n\tngOnInit() {\n\t}\n\n ngAfterViewInit() {\n const that = this;\n\n that.onCreate.emit(that.nativeElement);\n\n\t\tthis.nativeElement.classList.add('smart-angular');\n\n\t\tif (this.nativeElement.whenRendered) this.nativeElement.whenRendered(() => { that.onReady.emit(that.nativeElement); });\n\t\tthis.listen();\n\t}\n\n\tngOnDestroy() {\n\t\tthis.unlisten();\n\t}\n\n\tngOnChanges(changes: SimpleChanges) {\n\t\tif (this.nativeElement && this.nativeElement.isRendered) {\n\t\t\tfor (const propName in changes) {\n\t\t\t\tif (changes.hasOwnProperty(propName)) {\n\t\t\t\t\tthis.nativeElement[propName] = changes[propName].currentValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @description Add event listeners. */\n\tprivate listen(): void {\n const that = this;\n\t}\n\n\t/** @description Remove event listeners. */\n\tprivate unlisten(): void {\n const that = this;\n\t}\n}\n","import { NgModule } from '@angular/core';\n\nimport { FormComponent } from './smart.form';\nimport { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\nimport { FormControlComponent } from './smart.formcontrol';\nimport { FormGroupComponent } from './smart.formgroup';\n\n@NgModule({\n declarations: [FormComponent, FormControlComponent, FormGroupComponent],\n\tschemas: [CUSTOM_ELEMENTS_SCHEMA],\n\texports: [FormComponent, FormControlComponent, FormGroupComponent]\n})\n\nexport class FormModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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