@ng-vagabond-lab/ng-dsv 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,24 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { AfterViewInit, ElementRef } from '@angular/core';
3
+ import * as _angular_forms_signals from '@angular/forms/signals';
3
4
  import { FieldTree } from '@angular/forms/signals';
5
+ import { ApiDto } from '@ng-vagabond-lab/ng-dsv/api';
6
+ import { ToastService } from '@ng-vagabond-lab/ng-dsv/ds/toast';
4
7
 
5
- declare abstract class FormSignalInputBase<T> {
6
- form: _angular_core.InputSignal<FieldTree<T, string | number>>;
8
+ declare class FormSignalComponent {
9
+ toastService: ToastService;
10
+ form: _angular_core.InputSignal<() => _angular_forms_signals.FieldState<any, string | number>>;
11
+ urlBack: _angular_core.InputSignal<string | undefined>;
12
+ textValid: _angular_core.InputSignal<string>;
13
+ formValid: _angular_core.InputSignal<string>;
14
+ callback: _angular_core.OutputEmitterRef<ApiDto>;
15
+ onSubmit(event: Event): void;
16
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormSignalComponent, never>;
17
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormSignalComponent, "app-form-signal", never, { "form": { "alias": "form"; "required": true; "isSignal": true; }; "urlBack": { "alias": "urlBack"; "required": false; "isSignal": true; }; "textValid": { "alias": "textValid"; "required": false; "isSignal": true; }; "formValid": { "alias": "formValid"; "required": false; "isSignal": true; }; }, { "callback": "callback"; }, never, ["*"], true, never>;
18
+ }
19
+
20
+ declare abstract class FormSignalInputBase {
21
+ form: _angular_core.InputSignal<() => _angular_forms_signals.FieldState<any, string | number>>;
7
22
  fieldName: _angular_core.InputSignal<string>;
8
23
  withLabel: _angular_core.InputSignal<boolean>;
9
24
  required: _angular_core.InputSignal<boolean>;
@@ -12,18 +27,18 @@ declare abstract class FormSignalInputBase<T> {
12
27
  constructor();
13
28
  getSignal(): FieldTree<any, string | number>;
14
29
  doOnSend(): void;
15
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormSignalInputBase<any>, never>;
16
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormSignalInputBase<any>, "ng-component", never, { "form": { "alias": "form"; "required": true; "isSignal": true; }; "fieldName": { "alias": "fieldName"; "required": true; "isSignal": true; }; "withLabel": { "alias": "withLabel"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, { "onSend": "onSend"; }, never, never, true, never>;
30
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormSignalInputBase, never>;
31
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormSignalInputBase, "ng-component", never, { "form": { "alias": "form"; "required": true; "isSignal": true; }; "fieldName": { "alias": "fieldName"; "required": true; "isSignal": true; }; "withLabel": { "alias": "withLabel"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, { "onSend": "onSend"; }, never, never, true, never>;
17
32
  }
18
33
 
19
34
  type INPUT_TYPE = "text" | "password" | "textarea" | "email" | "number" | "date" | "time" | "datetime-local" | "month" | "week" | "url" | "search" | "tel" | "color" | "range" | "file" | "hidden";
20
- declare class FormSignalInputComponent<T> extends FormSignalInputBase<T> implements AfterViewInit {
35
+ declare class FormSignalInputComponent extends FormSignalInputBase implements AfterViewInit {
21
36
  input: ElementRef<HTMLInputElement>;
22
37
  type: _angular_core.InputSignal<string>;
23
38
  icon: _angular_core.InputSignal<string | undefined>;
24
39
  ngAfterViewInit(): void;
25
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormSignalInputComponent<any>, never>;
26
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormSignalInputComponent<any>, "dsv-form-signal-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
40
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormSignalInputComponent, never>;
41
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormSignalInputComponent, "dsv-form-signal-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
27
42
  }
28
43
 
29
44
  declare class FormSignalLabelComponent<T> {
@@ -36,5 +51,5 @@ declare class FormSignalLabelComponent<T> {
36
51
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormSignalLabelComponent<any>, "dsv-form-signal-label", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "show": { "alias": "show"; "required": false; "isSignal": true; }; "fieldName": { "alias": "fieldName"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
37
52
  }
38
53
 
39
- export { FormSignalInputComponent, FormSignalLabelComponent };
54
+ export { FormSignalComponent, FormSignalInputComponent, FormSignalLabelComponent };
40
55
  export type { INPUT_TYPE };
@@ -1,8 +1,43 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, signal, output, effect, Component, HostBinding, ViewChild } from '@angular/core';
3
- import { Field } from '@angular/forms/signals';
2
+ import { inject, input, output, Component, signal, effect, HostBinding, ViewChild } from '@angular/core';
3
+ import { submit, Field } from '@angular/forms/signals';
4
+ import { RouterLink } from '@angular/router';
5
+ import { DsvButtonComponent } from '@ng-vagabond-lab/ng-dsv/ds/button';
6
+ import { ToastService } from '@ng-vagabond-lab/ng-dsv/ds/toast';
4
7
  import { TranslatePipe } from '@ngx-translate/core';
5
8
 
9
+ class FormSignalComponent {
10
+ toastService = inject(ToastService);
11
+ form = input.required(...(ngDevMode ? [{ debugName: "form" }] : []));
12
+ urlBack = input(...(ngDevMode ? [undefined, { debugName: "urlBack" }] : []));
13
+ textValid = input('ENREGISTRER', ...(ngDevMode ? [{ debugName: "textValid" }] : []));
14
+ formValid = input('Formulaire envoyé !', ...(ngDevMode ? [{ debugName: "formValid" }] : []));
15
+ callback = output();
16
+ onSubmit(event) {
17
+ event.preventDefault();
18
+ submit(this.form(), async (form) => {
19
+ if (form().valid()) {
20
+ console.log(form().value());
21
+ this.toastService.showToast({
22
+ text: this.formValid(),
23
+ });
24
+ }
25
+ else {
26
+ this.toastService.showToast({
27
+ text: 'Erreur dans le formulaire !',
28
+ type: 'error',
29
+ });
30
+ }
31
+ });
32
+ }
33
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0-rc.1", ngImport: i0, type: FormSignalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
34
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0-rc.1", type: FormSignalComponent, isStandalone: true, selector: "app-form-signal", inputs: { form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: true, transformFunction: null }, urlBack: { classPropertyName: "urlBack", publicName: "urlBack", isSignal: true, isRequired: false, transformFunction: null }, textValid: { classPropertyName: "textValid", publicName: "textValid", isSignal: true, isRequired: false, transformFunction: null }, formValid: { classPropertyName: "formValid", publicName: "formValid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { callback: "callback" }, ngImport: i0, template: "<form (submit)=\"onSubmit($event)\" class=\"form-container\">\n <div>\n <ng-content></ng-content>\n </div>\n <div class=\"form-buttons\" [class.hidden]=\"!(urlBack() && textValid() !== '')\">\n @if (urlBack()) {\n <dsv-button\n color=\"default\"\n variant=\"outlined\"\n [routerLink]=\"urlBack()\"\n [prevent]=\"false\"\n >{{ \"RETOUR\" | translate }}</dsv-button\n >\n }\n @if (textValid() && textValid() !== \"\") {\n <dsv-button type=\"submit\" color=\"primary\">{{\n textValid()! | translate\n }}</dsv-button>\n }\n </div>\n</form>\n", styles: [":host{display:flex;width:100%;height:100%}:host form{flex-direction:column;display:flex;margin-top:0;unicode-bidi:isolate}:host form>div:nth-child(1){flex-direction:column;display:flex;gap:10px;overflow:auto;scrollbar-width:thin}:host .form-buttons{display:flex;justify-content:flex-end;gap:10px;padding-top:10px}\n"], dependencies: [{ kind: "component", type: DsvButtonComponent, selector: "dsv-button", inputs: ["libelle", "icon", "iconEnd", "disabled", "noHover", "type", "prevent"], outputs: ["callback"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
35
+ }
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ngImport: i0, type: FormSignalComponent, decorators: [{
37
+ type: Component,
38
+ args: [{ selector: 'app-form-signal', imports: [DsvButtonComponent, RouterLink, TranslatePipe], template: "<form (submit)=\"onSubmit($event)\" class=\"form-container\">\n <div>\n <ng-content></ng-content>\n </div>\n <div class=\"form-buttons\" [class.hidden]=\"!(urlBack() && textValid() !== '')\">\n @if (urlBack()) {\n <dsv-button\n color=\"default\"\n variant=\"outlined\"\n [routerLink]=\"urlBack()\"\n [prevent]=\"false\"\n >{{ \"RETOUR\" | translate }}</dsv-button\n >\n }\n @if (textValid() && textValid() !== \"\") {\n <dsv-button type=\"submit\" color=\"primary\">{{\n textValid()! | translate\n }}</dsv-button>\n }\n </div>\n</form>\n", styles: [":host{display:flex;width:100%;height:100%}:host form{flex-direction:column;display:flex;margin-top:0;unicode-bidi:isolate}:host form>div:nth-child(1){flex-direction:column;display:flex;gap:10px;overflow:auto;scrollbar-width:thin}:host .form-buttons{display:flex;justify-content:flex-end;gap:10px;padding-top:10px}\n"] }]
39
+ }], propDecorators: { form: [{ type: i0.Input, args: [{ isSignal: true, alias: "form", required: true }] }], urlBack: [{ type: i0.Input, args: [{ isSignal: true, alias: "urlBack", required: false }] }], textValid: [{ type: i0.Input, args: [{ isSignal: true, alias: "textValid", required: false }] }], formValid: [{ type: i0.Input, args: [{ isSignal: true, alias: "formValid", required: false }] }], callback: [{ type: i0.Output, args: ["callback"] }] } });
40
+
6
41
  class FormSignalInputBase {
7
42
  form = input.required(...(ngDevMode ? [{ debugName: "form" }] : []));
8
43
  fieldName = input.required(...(ngDevMode ? [{ debugName: "fieldName" }] : []));
@@ -100,5 +135,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ng
100
135
  * Generated bundle index. Do not edit.
101
136
  */
102
137
 
103
- export { FormSignalInputComponent, FormSignalLabelComponent };
138
+ export { FormSignalComponent, FormSignalInputComponent, FormSignalLabelComponent };
104
139
  //# sourceMappingURL=ng-vagabond-lab-ng-dsv-ds-form-signal.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-vagabond-lab-ng-dsv-ds-form-signal.mjs","sources":["../../../projects/ng-dsv/ds/form/signal/base/form.signal.input.base.ts","../../../projects/ng-dsv/ds/form/signal/error/component/form.signal.error.component.ts","../../../projects/ng-dsv/ds/form/signal/error/component/form.signal.error.component.html","../../../projects/ng-dsv/ds/form/signal/input/component/form.signal.input.component.ts","../../../projects/ng-dsv/ds/form/signal/input/component/form.signal.input.component.html","../../../projects/ng-dsv/ds/form/signal/label/component/form.signal.label.component.ts","../../../projects/ng-dsv/ds/form/signal/label/component/form.signal.label.component.html","../../../projects/ng-dsv/ds/form/signal/ng-vagabond-lab-ng-dsv-ds-form-signal.ts"],"sourcesContent":["import { Component, effect, input, output, signal } from \"@angular/core\";\nimport { FieldTree } from \"@angular/forms/signals\";\n\n@Component({\n template: ``\n})\nexport abstract class FormSignalInputBase<T> {\n form = input.required<FieldTree<T, string | number>>();\n fieldName = input.required<string>();\n withLabel = input<boolean>(true);\n required = input<boolean>(false);\n\n isError = signal<boolean>(false);\n\n onSend = output<string>();\n\n constructor() {\n effect(() => {\n this.isError.set(this.getSignal()?.().errors().length > 0);\n });\n }\n\n getSignal() {\n return this.form()?.[this.fieldName() as keyof FieldTree<T, string | number>] as FieldTree<any, string | number>;\n }\n\n doOnSend() {\n const signal = this.getSignal();\n if (signal) {\n const value = signal().value();\n console.log(signal, signal().errors(), value);\n this.onSend.emit(value as string);\n }\n }\n}\n","import { Component, HostBinding, input } from \"@angular/core\";\nimport { ValidationErrorWithField } from \"@angular/forms/signals\";\nimport { TranslatePipe } from \"@ngx-translate/core\";\n\n@Component({\n selector: 'dsv-signal-form-error',\n imports: [TranslatePipe],\n templateUrl: './form.signal.error.component.html',\n styleUrls: ['../../../legacy/error/component/form.error.component.scss']\n})\nexport class FormSignalErrorComponent {\n errors = input.required<ValidationErrorWithField[]>();\n\n @HostBinding('class')\n get hostClasses(): string {\n const classes: string[] = ['text', 'error'];\n return classes.join(' ');\n }\n\n isRequired() {\n return this.errors().some(error => error.kind === 'required');\n }\n}","@if (errors().length > 0) {\n @if (isRequired()) {\n <div>{{ \"Le champ est obligatoire.\" | translate }}</div>\n }\n}\n","import { AfterViewInit, Component, ElementRef, input, ViewChild } from '@angular/core';\nimport { Field } from '@angular/forms/signals';\nimport { FormSignalInputBase } from '../../base/form.signal.input.base';\nimport { FormSignalErrorComponent } from '../../error/component/form.signal.error.component';\nimport { FormSignalLabelComponent } from '../../public-api';\n\nexport type INPUT_TYPE = \"text\" | \"password\" | \"textarea\" | \"email\" | \"number\" | \"date\" | \"time\" | \"datetime-local\" |\n \"month\" | \"week\" | \"url\" | \"search\" | \"tel\" | \"color\" | \"range\" | \"file\" | \"hidden\";\n\n@Component({\n selector: 'dsv-form-signal-input',\n imports: [\n Field,\n FormSignalLabelComponent,\n FormSignalErrorComponent\n ],\n templateUrl: './form.signal.input.component.html',\n styleUrl: '../../../legacy/input/component/form.input.component.scss',\n})\nexport class FormSignalInputComponent<T> extends FormSignalInputBase<T> implements AfterViewInit {\n @ViewChild('input')\n input!: ElementRef<HTMLInputElement>;\n\n type = input<string>('text');\n icon = input<string>();\n\n ngAfterViewInit() {\n this.input.nativeElement.type = this.type();\n }\n\n}\n","<div>\n @if (withLabel()) {\n <dsv-form-signal-label [label]=\"fieldName()\" [fieldName]=\"getSignal()\" />\n }\n @if (type() === \"textarea\") {\n <textarea\n [id]=\"fieldName()\"\n [field]=\"getSignal()\"\n class=\"form-control\"\n ></textarea>\n } @else if (getSignal()) {\n <!-- [type]=\"type()\" -->\n <input\n #input\n [id]=\"fieldName()\"\n class=\"form-control\"\n [class.error]=\"isError()\"\n [field]=\"getSignal()\"\n [class.icon]=\"icon()\"\n (blur)=\"doOnSend()\"\n (keydown.enter)=\"doOnSend()\"\n />\n }\n @if (icon()) {\n <i [class]=\"icon()\"></i>\n }\n @if (getSignal()) {\n <dsv-signal-form-error [errors]=\"getSignal()().errors()\" />\n }\n</div>\n","import { Component, effect, input, signal } from \"@angular/core\";\nimport { FieldTree } from \"@angular/forms/signals\";\n\n@Component({\n selector: 'dsv-form-signal-label',\n templateUrl: './form.signal.label.component.html',\n styleUrls: ['../../../legacy/label/component/form.label.component.scss'],\n})\nexport class FormSignalLabelComponent<T> {\n label = input.required<string>();\n show = input<boolean>(true);\n fieldName = input<FieldTree<T, string | number>>();\n\n isRequired = signal<boolean>(false);\n\n constructor() {\n effect(() => {\n //this.isRequired.set(this.field()?.hasValidator?.(Validators.required) ?? false);\n })\n }\n}","@if (show()) {\n <label\n [for]=\"label()\"\n class=\"text\"\n [class.error]=\"fieldName()?.()?.errors()?.length! > 0\"\n >\n {{ label() }} {{ isRequired() ? \"*\" : \"\" }}\n </label>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-vagabond-lab-ng-dsv-ds-form-signal.mjs","sources":["../../../projects/ng-dsv/ds/form/signal/form/component/form.signal.component.ts","../../../projects/ng-dsv/ds/form/signal/form/component/form.signal.component.html","../../../projects/ng-dsv/ds/form/signal/base/form.signal.input.base.ts","../../../projects/ng-dsv/ds/form/signal/error/component/form.signal.error.component.ts","../../../projects/ng-dsv/ds/form/signal/error/component/form.signal.error.component.html","../../../projects/ng-dsv/ds/form/signal/input/component/form.signal.input.component.ts","../../../projects/ng-dsv/ds/form/signal/input/component/form.signal.input.component.html","../../../projects/ng-dsv/ds/form/signal/label/component/form.signal.label.component.ts","../../../projects/ng-dsv/ds/form/signal/label/component/form.signal.label.component.html","../../../projects/ng-dsv/ds/form/signal/ng-vagabond-lab-ng-dsv-ds-form-signal.ts"],"sourcesContent":["import { Component, inject, input, output } from '@angular/core';\nimport { FieldTree, submit } from '@angular/forms/signals';\nimport { RouterLink } from '@angular/router';\nimport { ApiDto } from '@ng-vagabond-lab/ng-dsv/api';\nimport { DsvButtonComponent } from '@ng-vagabond-lab/ng-dsv/ds/button';\nimport { ToastService } from '@ng-vagabond-lab/ng-dsv/ds/toast';\nimport { TranslatePipe } from '@ngx-translate/core';\n\n@Component({\n selector: 'app-form-signal',\n imports: [DsvButtonComponent, RouterLink, TranslatePipe],\n templateUrl: './form.signal.component.html',\n styleUrl: '../../../legacy/form/component/form.component.scss',\n})\nexport class FormSignalComponent {\n toastService = inject(ToastService);\n\n form = input.required<FieldTree<any, string | number>>();\n\n urlBack = input<string>();\n textValid = input<string>('ENREGISTRER');\n formValid = input<string>('Formulaire envoyé !');\n\n callback = output<ApiDto>();\n\n onSubmit(event: Event) {\n event.preventDefault();\n submit(this.form(), async (form) => {\n if (form().valid()) {\n console.log(form().value());\n this.toastService.showToast({\n text: this.formValid(),\n });\n } else {\n this.toastService.showToast({\n text: 'Erreur dans le formulaire !',\n type: 'error',\n });\n }\n });\n }\n}\n","<form (submit)=\"onSubmit($event)\" class=\"form-container\">\n <div>\n <ng-content></ng-content>\n </div>\n <div class=\"form-buttons\" [class.hidden]=\"!(urlBack() && textValid() !== '')\">\n @if (urlBack()) {\n <dsv-button\n color=\"default\"\n variant=\"outlined\"\n [routerLink]=\"urlBack()\"\n [prevent]=\"false\"\n >{{ \"RETOUR\" | translate }}</dsv-button\n >\n }\n @if (textValid() && textValid() !== \"\") {\n <dsv-button type=\"submit\" color=\"primary\">{{\n textValid()! | translate\n }}</dsv-button>\n }\n </div>\n</form>\n","import { Component, effect, input, output, signal } from \"@angular/core\";\nimport { FieldTree } from \"@angular/forms/signals\";\n\n@Component({\n template: ``\n})\nexport abstract class FormSignalInputBase {\n form = input.required<FieldTree<any, string | number>>();\n fieldName = input.required<string>();\n withLabel = input<boolean>(true);\n required = input<boolean>(false);\n\n isError = signal<boolean>(false);\n\n onSend = output<string>();\n\n constructor() {\n effect(() => {\n this.isError.set(this.getSignal()?.().errors().length > 0);\n });\n }\n\n getSignal() {\n return this.form()?.[this.fieldName() as keyof FieldTree<any, string | number>] as FieldTree<any, string | number>;\n }\n\n doOnSend() {\n const signal = this.getSignal();\n if (signal) {\n const value = signal().value();\n console.log(signal, signal().errors(), value);\n this.onSend.emit(value as string);\n }\n }\n}\n","import { Component, HostBinding, input } from \"@angular/core\";\nimport { ValidationErrorWithField } from \"@angular/forms/signals\";\nimport { TranslatePipe } from \"@ngx-translate/core\";\n\n@Component({\n selector: 'dsv-signal-form-error',\n imports: [TranslatePipe],\n templateUrl: './form.signal.error.component.html',\n styleUrls: ['../../../legacy/error/component/form.error.component.scss']\n})\nexport class FormSignalErrorComponent {\n errors = input.required<ValidationErrorWithField[]>();\n\n @HostBinding('class')\n get hostClasses(): string {\n const classes: string[] = ['text', 'error'];\n return classes.join(' ');\n }\n\n isRequired() {\n return this.errors().some(error => error.kind === 'required');\n }\n}","@if (errors().length > 0) {\n @if (isRequired()) {\n <div>{{ \"Le champ est obligatoire.\" | translate }}</div>\n }\n}\n","import { AfterViewInit, Component, ElementRef, input, ViewChild } from '@angular/core';\nimport { Field } from '@angular/forms/signals';\nimport { FormSignalInputBase } from '../../base/form.signal.input.base';\nimport { FormSignalErrorComponent } from '../../error/component/form.signal.error.component';\nimport { FormSignalLabelComponent } from '../../public-api';\n\nexport type INPUT_TYPE = \"text\" | \"password\" | \"textarea\" | \"email\" | \"number\" | \"date\" | \"time\" | \"datetime-local\" |\n \"month\" | \"week\" | \"url\" | \"search\" | \"tel\" | \"color\" | \"range\" | \"file\" | \"hidden\";\n\n@Component({\n selector: 'dsv-form-signal-input',\n imports: [\n Field,\n FormSignalLabelComponent,\n FormSignalErrorComponent\n ],\n templateUrl: './form.signal.input.component.html',\n styleUrl: '../../../legacy/input/component/form.input.component.scss',\n})\nexport class FormSignalInputComponent extends FormSignalInputBase implements AfterViewInit {\n @ViewChild('input')\n input!: ElementRef<HTMLInputElement>;\n\n type = input<string>('text');\n icon = input<string>();\n\n ngAfterViewInit() {\n this.input.nativeElement.type = this.type();\n }\n\n}\n","<div>\n @if (withLabel()) {\n <dsv-form-signal-label [label]=\"fieldName()\" [fieldName]=\"getSignal()\" />\n }\n @if (type() === \"textarea\") {\n <textarea\n [id]=\"fieldName()\"\n [field]=\"getSignal()\"\n class=\"form-control\"\n ></textarea>\n } @else if (getSignal()) {\n <!-- [type]=\"type()\" -->\n <input\n #input\n [id]=\"fieldName()\"\n class=\"form-control\"\n [class.error]=\"isError()\"\n [field]=\"getSignal()\"\n [class.icon]=\"icon()\"\n (blur)=\"doOnSend()\"\n (keydown.enter)=\"doOnSend()\"\n />\n }\n @if (icon()) {\n <i [class]=\"icon()\"></i>\n }\n @if (getSignal()) {\n <dsv-signal-form-error [errors]=\"getSignal()().errors()\" />\n }\n</div>\n","import { Component, effect, input, signal } from \"@angular/core\";\nimport { FieldTree } from \"@angular/forms/signals\";\n\n@Component({\n selector: 'dsv-form-signal-label',\n templateUrl: './form.signal.label.component.html',\n styleUrls: ['../../../legacy/label/component/form.label.component.scss'],\n})\nexport class FormSignalLabelComponent<T> {\n label = input.required<string>();\n show = input<boolean>(true);\n fieldName = input<FieldTree<T, string | number>>();\n\n isRequired = signal<boolean>(false);\n\n constructor() {\n effect(() => {\n //this.isRequired.set(this.field()?.hasValidator?.(Validators.required) ?? false);\n })\n }\n}","@if (show()) {\n <label\n [for]=\"label()\"\n class=\"text\"\n [class.error]=\"fieldName()?.()?.errors()?.length! > 0\"\n >\n {{ label() }} {{ isRequired() ? \"*\" : \"\" }}\n </label>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-vagabond-lab/ng-dsv",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.0.0",
6
6
  "@angular/core": "^20.0.0"