anguland 0.0.6 → 0.0.10

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.
@@ -8,31 +8,41 @@ export class FormErrorComponent {
8
8
  this.controlName = input.required();
9
9
  this.validationKey = input.required();
10
10
  }
11
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: FormErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: FormErrorComponent, isStandalone: true, selector: "lib-form-error", inputs: { formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: true, transformFunction: null }, controlName: { classPropertyName: "controlName", publicName: "controlName", isSignal: true, isRequired: true, transformFunction: null }, validationKey: { classPropertyName: "validationKey", publicName: "validationKey", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
13
- @for (validation of VALIDATION_MESSAGES[validationKey()]; track $index) {
14
- <ng-container>
15
- @if(formGroup().get(controlName())?.hasError(validation.type) && formGroup().get(controlName())?.touched && !formGroup().get(controlName())?.pristine) {
16
- <small class="smallError">
17
- {{ validation.message }}
18
- </small>
19
- }
20
- </ng-container>
11
+ get validationsForKey() {
12
+ return this.VALIDATION_MESSAGES[this.validationKey()];
13
+ }
14
+ get control() {
15
+ return this.formGroup().get(this.controlName());
16
+ }
17
+ hasError(errorType) {
18
+ const hasError = this.control?.hasError(errorType) && this.control?.touched && !this.control?.pristine || false;
19
+ return hasError;
21
20
  }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: FormErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: FormErrorComponent, isStandalone: true, selector: "lib-form-error", inputs: { formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: true, transformFunction: null }, controlName: { classPropertyName: "controlName", publicName: "controlName", isSignal: true, isRequired: true, transformFunction: null }, validationKey: { classPropertyName: "validationKey", publicName: "validationKey", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
23
+ @for (validation of validationsForKey; track $index) {
24
+ <ng-container>
25
+ @if(hasError(validation.type)) {
26
+ <small class="smallError">
27
+ {{ validation.message }}
28
+ </small>
29
+ }
30
+ </ng-container>
31
+ }
22
32
  `, isInline: true, styles: [".smallError{color:#f44336;font-size:.7rem}\n"] }); }
23
33
  }
24
34
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: FormErrorComponent, decorators: [{
25
35
  type: Component,
26
- args: [{ selector: 'lib-form-error', standalone: true, template: `
27
- @for (validation of VALIDATION_MESSAGES[validationKey()]; track $index) {
28
- <ng-container>
29
- @if(formGroup().get(controlName())?.hasError(validation.type) && formGroup().get(controlName())?.touched && !formGroup().get(controlName())?.pristine) {
30
- <small class="smallError">
31
- {{ validation.message }}
32
- </small>
33
- }
34
- </ng-container>
35
- }
36
+ args: [{ selector: 'lib-form-error', standalone: true, template: `
37
+ @for (validation of validationsForKey; track $index) {
38
+ <ng-container>
39
+ @if(hasError(validation.type)) {
40
+ <small class="smallError">
41
+ {{ validation.message }}
42
+ </small>
43
+ }
44
+ </ng-container>
45
+ }
36
46
  `, styles: [".smallError{color:#f44336;font-size:.7rem}\n"] }]
37
47
  }] });
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybUVycm9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYW5kL3NyYy9saWIvZm9ybUVycm9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBdUJuRCxNQUFNLE9BQU8sa0JBQWtCO0lBckIvQjtRQXNCRSx3QkFBbUIsR0FBdUIsbUJBQW1CLENBQUM7UUFDOUQsY0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQVksRUFBRSxDQUFDLENBQUM7UUFDMUMsZ0JBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7UUFDdkMsa0JBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7S0FDMUM7OEdBTFksa0JBQWtCO2tHQUFsQixrQkFBa0IsaWZBbEJuQjs7Ozs7Ozs7OztHQVVUOzsyRkFRVSxrQkFBa0I7a0JBckI5QixTQUFTOytCQUNFLGdCQUFnQixjQUNkLElBQUksWUFDTjs7Ozs7Ozs7OztHQVVUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVkFMSURBVElPTl9NRVNTQUdFUyB9IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1mb3JtLWVycm9yJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAZm9yICh2YWxpZGF0aW9uIG9mIFZBTElEQVRJT05fTUVTU0FHRVNbdmFsaWRhdGlvbktleSgpXTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICBAaWYoZm9ybUdyb3VwKCkuZ2V0KGNvbnRyb2xOYW1lKCkpPy5oYXNFcnJvcih2YWxpZGF0aW9uLnR5cGUpICYmIGZvcm1Hcm91cCgpLmdldChjb250cm9sTmFtZSgpKT8udG91Y2hlZCAmJiAhZm9ybUdyb3VwKCkuZ2V0KGNvbnRyb2xOYW1lKCkpPy5wcmlzdGluZSkge1xuICAgICAgICA8c21hbGwgY2xhc3M9XCJzbWFsbEVycm9yXCI+XG4gICAgICAgICAge3sgdmFsaWRhdGlvbi5tZXNzYWdlIH19XG4gICAgICAgIDwvc21hbGw+XG4gICAgICAgIH1cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgYCxcbiAgc3R5bGVzOiBgXG4gICAgLnNtYWxsRXJyb3J7XG4gICAgICBjb2xvcjogI2Y0NDMzNjtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICB9XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUVycm9yQ29tcG9uZW50IHtcbiAgVkFMSURBVElPTl9NRVNTQUdFUzogVmFsaWRhdGlvbk1lc3NhZ2VzID0gVkFMSURBVElPTl9NRVNTQUdFUztcbiAgZm9ybUdyb3VwID0gaW5wdXQucmVxdWlyZWQ8Rm9ybUdyb3VwPih7fSk7XG4gIGNvbnRyb2xOYW1lID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuICB2YWxpZGF0aW9uS2V5ID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xufVxuXG5pbnRlcmZhY2UgVmFsaWRhdGlvbk1lc3NhZ2VzIHtcbiAgW2tleTogc3RyaW5nXTogVmFsaWRhdGlvbk1lc3NhZ2VbXTtcbn1cblxuaW50ZXJmYWNlIFZhbGlkYXRpb25NZXNzYWdlIHtcbiAgdHlwZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbiJdfQ==
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybUVycm9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYW5kL3NyYy9saWIvZm9ybUVycm9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQXlDLE1BQU0sY0FBYyxDQUFDOztBQXVCMUYsTUFBTSxPQUFPLGtCQUFrQjtJQXJCL0I7UUFzQkUsd0JBQW1CLEdBQXVCLG1CQUFtQixDQUFDO1FBQzlELGNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLGdCQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVSxDQUFDO1FBQ3ZDLGtCQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVSxDQUFDO0tBZ0IxQztJQVpDLElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELFFBQVEsQ0FBQyxTQUFpQjtRQUN4QixNQUFNLFFBQVEsR0FBWSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUN6SCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOzhHQW5CVSxrQkFBa0I7a0dBQWxCLGtCQUFrQixpZkFsQm5COzs7Ozs7Ozs7O0dBVVQ7OzJGQVFVLGtCQUFrQjtrQkFyQjlCLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxZQUNOOzs7Ozs7Ozs7O0dBVVQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVkFMSURBVElPTl9NRVNTQUdFUywgVmFsaWRhdGlvbk1lc3NhZ2UsIFZhbGlkYXRpb25NZXNzYWdlcyB9IGZyb20gJy4vdmFsaWRhdGlvbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1mb3JtLWVycm9yJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICBAZm9yICh2YWxpZGF0aW9uIG9mIHZhbGlkYXRpb25zRm9yS2V5OyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICBAaWYoaGFzRXJyb3IodmFsaWRhdGlvbi50eXBlKSkge1xyXG4gICAgICAgIDxzbWFsbCBjbGFzcz1cInNtYWxsRXJyb3JcIj5cclxuICAgICAgICAgIHt7IHZhbGlkYXRpb24ubWVzc2FnZSB9fVxyXG4gICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIH1cclxuICBgLFxyXG4gIHN0eWxlczogYFxyXG4gICAgLnNtYWxsRXJyb3J7XHJcbiAgICAgIGNvbG9yOiAjZjQ0MzM2O1xyXG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcclxuICAgIH1cclxuICBgXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtRXJyb3JDb21wb25lbnQge1xyXG4gIFZBTElEQVRJT05fTUVTU0FHRVM6IFZhbGlkYXRpb25NZXNzYWdlcyA9IFZBTElEQVRJT05fTUVTU0FHRVM7XHJcbiAgZm9ybUdyb3VwID0gaW5wdXQucmVxdWlyZWQ8Rm9ybUdyb3VwPih7fSk7XHJcbiAgY29udHJvbE5hbWUgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XHJcbiAgdmFsaWRhdGlvbktleSA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcclxuXHJcblxyXG5cclxuICBnZXQgdmFsaWRhdGlvbnNGb3JLZXkoKTogVmFsaWRhdGlvbk1lc3NhZ2VbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5WQUxJREFUSU9OX01FU1NBR0VTW3RoaXMudmFsaWRhdGlvbktleSgpXTtcclxuICB9XHJcblxyXG4gIGdldCBjb250cm9sKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwKCkuZ2V0KHRoaXMuY29udHJvbE5hbWUoKSk7XHJcbiAgfVxyXG5cclxuICBoYXNFcnJvcihlcnJvclR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaGFzRXJyb3I6IGJvb2xlYW4gPSB0aGlzLmNvbnRyb2w/Lmhhc0Vycm9yKGVycm9yVHlwZSkgJiYgdGhpcy5jb250cm9sPy50b3VjaGVkICYmICF0aGlzLmNvbnRyb2w/LnByaXN0aW5lIHx8IGZhbHNlO1xyXG4gICAgcmV0dXJuIGhhc0Vycm9yO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -68,6 +68,10 @@ export const VALIDATION_MESSAGES = {
68
68
  { type: 'required', message: 'Eingabe erforderlich' },
69
69
  { type: 'unknown', message: 'Unbekannter Fehler' },
70
70
  ],
71
+ url: [
72
+ { type: 'required', message: 'URL erforderlich' },
73
+ { type: 'pattern', message: 'Ungültige URL' },
74
+ ],
71
75
  };
72
76
  export function matchValidator(matchTo, reverse) {
73
77
  return (control) => {
@@ -85,4 +89,13 @@ export function matchValidator(matchTo, reverse) {
85
89
  : { matching: true };
86
90
  };
87
91
  }
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYW5kL3NyYy9saWIvdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRztJQUNqQyxRQUFRLEVBQUU7UUFDUixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLDJCQUEyQixFQUFFO1FBQzFELEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUU7UUFDbEQ7WUFDRSxJQUFJLEVBQUUsV0FBVztZQUNqQixPQUFPLEVBQUUsZ0NBQWdDLG1CQUFtQixvQkFBb0I7U0FDakY7UUFDRDtZQUNFLElBQUksRUFBRSxXQUFXO1lBQ2pCLE9BQU8sRUFBRSwrQkFBK0IsbUJBQW1CLG9CQUFvQjtTQUNoRjtRQUNEO1lBQ0UsSUFBSSxFQUFFLFNBQVM7WUFDZixPQUFPLEVBQUUscUVBQXFFO1NBQy9FO0tBQ0Y7SUFDRCxLQUFLLEVBQUU7UUFDTCxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFO1FBQ3BELEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUU7UUFDOUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRTtRQUMvRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFO1FBQ2xELEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRTtL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O0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5leHBvcnQgY29uc3QgUEFTU1dPUkRfTUlOX0xFTkdUSCA9IDY7XHJcbmV4cG9ydCBjb25zdCBVU0VSTkFNRV9NSU5fTEVOR1RIID0gMjtcclxuZXhwb3J0IGNvbnN0IFVTRVJOQU1FX01BWF9MRU5HVEggPSAzMDtcclxuXHJcbmV4cG9ydCBjb25zdCBWQUxJREFUSU9OX01FU1NBR0VTID0ge1xyXG4gIHVzZXJuYW1lOiBbXHJcbiAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdCZW51dHplcm5hbWUgZXJmb3JkZXJsaWNoJyB9LFxyXG4gICAgeyB0eXBlOiAndW5rbm93bicsIG1lc3NhZ2U6ICdVbmJla2FubnRlciBGZWhsZXInIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6ICdtaW5sZW5ndGgnLFxyXG4gICAgICBtZXNzYWdlOiBgQmVudXR6ZXJuYW1lIG11c3MgbWluZGVzdGVucyAke1VTRVJOQU1FX01JTl9MRU5HVEh9IFplaWNoZW4gbGFuZyBzZWluYCxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6ICdtYXhsZW5ndGgnLFxyXG4gICAgICBtZXNzYWdlOiBgQmVudXR6ZXJuYW1lIGRhcmYgaMO2Y2hzdGVucyAke1VTRVJOQU1FX01BWF9MRU5HVEh9IFplaWNoZW4gbGFuZyBzZWluYCxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6ICdwYXR0ZXJuJyxcclxuICAgICAgbWVzc2FnZTogJ0JlbnV0emVybmFtZSBkYXJmIG51ciBCdWNoc3RhYmVuLCBaYWhsZW4gdW5kIFVudGVyc3RyaWNoZSBlbnRoYWx0ZW4nLFxyXG4gICAgfSxcclxuICBdLFxyXG4gIGVtYWlsOiBbXHJcbiAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdFLU1haWwgZXJmb3JkZXJsaWNoJyB9LFxyXG4gICAgeyB0eXBlOiAnZW1haWwnLCBtZXNzYWdlOiAnVW5nw7xsdGlnZSBFLU1haWwnIH0sXHJcbiAgICB7IHR5cGU6ICdhbHJlYWR5SW5Vc2UnLCBtZXNzYWdlOiAnRS1NYWlsIGJlcmVpdHMgaW4gR2VicmF1Y2gnIH0sXHJcbiAgICB7IHR5cGU6ICd1bmtub3duJywgbWVzc2FnZTogJ1VuYmVrYW5udGVyIEZlaGxlcicgfSxcclxuICAgIHsgdHlwZTogJ3VuYXV0aGVudGljYXRlZCcsIG1lc3NhZ2U6ICdCZW51dHplcm5hbWUgb2RlciBQYXNzd29ydCBmYWxzY2gnIH0sXHJcbiAgXSxcclxuICBjb25maXJtUGFzc3dvcmQ6IFtcclxuICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ1Bhc3N3b3J0IGVyZm9yZGVybGljaCcgfSxcclxuICAgIHsgdHlwZTogJ21hdGNoaW5nJywgbWVzc2FnZTogJ1Bhc3N3b3J0IHN0aW1tdCBuaWNodCDDvGJlcmVpbicgfSxcclxuICBdLFxyXG4gIHBhc3N3b3JkOiBbXHJcbiAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdQYXNzd29ydCBlcmZvcmRlcmxpY2gnIH0sXHJcbiAgICB7IHR5cGU6ICdtaW5sZW5ndGgnLCBtZXNzYWdlOiBgTWluZGVzdGzDpG5nZSAke1BBU1NXT1JEX01JTl9MRU5HVEh9IFplaWNoZW5gIH0sXHJcbiAgICB7IHR5cGU6ICd1bmF1dGhlbnRpY2F0ZWQnLCBtZXNzYWdlOiAnQmVudXR6ZXJuYW1lIG9kZXIgUGFzc3dvcnQgZmFsc2NoJyB9LFxyXG4gIF0sXHJcbiAgbmFtZTogW1xyXG4gICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnTmFtZSBlcmZvcmRlcmxpY2gnIH0sXHJcbiAgICB7IHR5cGU6ICd1bmtub3duJywgbWVzc2FnZTogJ1VuYmVrYW5udGVyIEZlaGxlcicgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogJ21pbmxlbmd0aCcsXHJcbiAgICAgIG1lc3NhZ2U6IGBOYW1lIG11c3MgbWluZGVzdGVucyAke1VTRVJOQU1FX01JTl9MRU5HVEh9IFplaWNoZW4gbGFuZyBzZWluYCxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6ICdtYXhsZW5ndGgnLFxyXG4gICAgICBtZXNzYWdlOiBgTmFtZSBkYXJmIGjDtmNoc3RlbnMgJHtVU0VSTkFNRV9NQVhfTEVOR1RIfSBaZWljaGVuIGxhbmcgc2VpbmAsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiAncGF0dGVybicsXHJcbiAgICAgIG1lc3NhZ2U6ICdOYW1lIGRhcmYgbnVyIEJ1Y2hzdGFiZW4sIFphaGxlbiB1bmQgVW50ZXJzdHJpY2hlIGVudGhhbHRlbicsXHJcbiAgICB9LFxyXG4gIF0sXHJcbiAgcGhvbmU6IFtcclxuICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ1RlbGVmb25udW1tZXIgZXJmb3JkZXJsaWNoJyB9LFxyXG4gICAgeyB0eXBlOiAncGF0dGVybicsIG1lc3NhZ2U6ICdVbmfDvGx0aWdlIFRlbGVmb25udW1tZXInIH0sXHJcbiAgICB7IHR5cGU6ICd1bmtub3duJywgbWVzc2FnZTogJ1VuYmVrYW5udGVyIEZlaGxlcicgfSxcclxuICBdLFxyXG4gIGRhdGU6IFtcclxuICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ0RhdHVtIGVyZm9yZGVybGljaCcgfSxcclxuICAgIHsgdHlwZTogJ3Vua25vd24nLCBtZXNzYWdlOiAnVW5iZWthbm50ZXIgRmVobGVyJyB9LFxyXG4gIF0sXHJcbiAgemlwQ29kZTogW1xyXG4gICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnUExaIGVyZm9yZGVybGljaCcgfSxcclxuICAgIHsgdHlwZTogJ3BhdHRlcm4nLCBtZXNzYWdlOiAnVW5nw7xsdGlnZSBQTFonIH0sXHJcbiAgICB7IHR5cGU6ICd1bmtub3duJywgbWVzc2FnZTogJ1VuYmVrYW5udGVyIEZlaGxlcicgfSxcclxuICBdLFxyXG4gIG90aGVyOiBbXHJcbiAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdFaW5nYWJlIGVyZm9yZGVybGljaCcgfSxcclxuICAgIHsgdHlwZTogJ3Vua25vd24nLCBtZXNzYWdlOiAnVW5iZWthbm50ZXIgRmVobGVyJyB9LFxyXG4gIF0sXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hWYWxpZGF0b3IoXHJcbiAgbWF0Y2hUbzogc3RyaW5nLFxyXG4gIHJldmVyc2U/OiBib29sZWFuXHJcbik6IFZhbGlkYXRvckZuIHtcclxuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcclxuICAgIGlmIChjb250cm9sLnBhcmVudCAmJiByZXZlcnNlKSB7XHJcbiAgICAgIGNvbnN0IGMgPSAoY29udHJvbC5wYXJlbnQ/LmNvbnRyb2xzIGFzIGFueSlbbWF0Y2hUb10gYXMgQWJzdHJhY3RDb250cm9sO1xyXG4gICAgICBpZiAoYykge1xyXG4gICAgICAgIGMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICEhY29udHJvbC5wYXJlbnQgJiZcclxuICAgICAgISFjb250cm9sLnBhcmVudC52YWx1ZSAmJlxyXG4gICAgICBjb250cm9sLnZhbHVlID09PSAoY29udHJvbC5wYXJlbnQ/LmNvbnRyb2xzIGFzIGFueSlbbWF0Y2hUb10udmFsdWVcclxuICAgICAgPyBudWxsXHJcbiAgICAgIDogeyBtYXRjaGluZzogdHJ1ZSB9O1xyXG4gIH07XHJcbn1cclxuIl19
92
+ export function urlValidator() {
93
+ const urlPattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i;
94
+ return (control) => {
95
+ if (!control.value) {
96
+ return null; // Don't validate empty values to allow required validator to handle them
97
+ }
98
+ return urlPattern.test(control.value) ? null : { pattern: true };
99
+ };
100
+ }
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYW5kL3NyYy9saWIvdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBdUI7SUFDckQsUUFBUSxFQUFFO1FBQ1IsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRTtRQUMxRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFO1FBQ2xEO1lBQ0UsSUFBSSxFQUFFLFdBQVc7WUFDakIsT0FBTyxFQUFFLGdDQUFnQyxtQkFBbUIsb0JBQW9CO1NBQ2pGO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsV0FBVztZQUNqQixPQUFPLEVBQUUsK0JBQStCLG1CQUFtQixvQkFBb0I7U0FDaEY7UUFDRDtZQUNFLElBQUksRUFBRSxTQUFTO1lBQ2YsT0FBTyxFQUFFLHFFQUFxRTtTQUMvRTtLQUNGO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRTtRQUNwRCxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFO1FBQzlDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUU7UUFDL0QsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRTtRQUNsRCxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsbUNBQW1DLEVBQUU7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QU0sRUFBRSxRQUFnQixDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSztZQUNsRSxDQUFDLENBQUMsSUFBSTtZQUNOLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVk7SUFDMUIsTUFBTSxVQUFVLEdBQUcsdUNBQXVDLENBQUM7SUFDM0QsT0FBTyxDQUFDLE9BQXdCLEVBQTJCLEVBQUU7UUFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQyxDQUFDLHlFQUF5RTtRQUN4RixDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNuRSxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbk1lc3NhZ2Uge1xyXG4gIHR5cGU6IHN0cmluZztcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbk1lc3NhZ2VzIHtcclxuICBba2V5OiBzdHJpbmddOiBWYWxpZGF0aW9uTWVzc2FnZVtdO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUEFTU1dPUkRfTUlOX0xFTkdUSCA9IDY7XHJcbmV4cG9ydCBjb25zdCBVU0VSTkFNRV9NSU5fTEVOR1RIID0gMjtcclxuZXhwb3J0IGNvbnN0IFVTRVJOQU1FX01BWF9MRU5HVEggPSAzMDtcclxuXHJcbmV4cG9ydCBjb25zdCBWQUxJREFUSU9OX01FU1NBR0VTOiBWYWxpZGF0aW9uTWVzc2FnZXMgPSB7XHJcbiAgdXNlcm5hbWU6IFtcclxuICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ0JlbnV0emVybmFtZSBlcmZvcmRlcmxpY2gnIH0sXHJcbiAgICB7IHR5cGU6ICd1bmtub3duJywgbWVzc2FnZTogJ1VuYmVrYW5udGVyIEZlaGxlcicgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogJ21pbmxlbmd0aCcsXHJcbiAgICAgIG1lc3NhZ2U6IGBCZW51dHplcm5hbWUgbXVzcyBtaW5kZXN0ZW5zICR7VVNFUk5BTUVfTUlOX0xFTkdUSH0gWmVpY2hlbiBsYW5nIHNlaW5gLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogJ21heGxlbmd0aCcsXHJcbiAgICAgIG1lc3NhZ2U6IGBCZW51dHplcm5hbWUgZGFyZiBow7ZjaHN0ZW5zICR7VVNFUk5BTUVfTUFYX0xFTkdUSH0gWmVpY2hlbiBsYW5nIHNlaW5gLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogJ3BhdHRlcm4nLFxyXG4gICAgICBtZXNzYWdlOiAnQmVudXR6ZXJuYW1lIGRhcmYgbnVyIEJ1Y2hzdGFiZW4sIFphaGxlbiB1bmQgVW50ZXJzdHJpY2hlIGVudGhhbHRlbicsXHJcbiAgICB9LFxyXG4gIF0sXHJcbiAgZW1haWw6IFtcclxuICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ0UtTWFpbCBlcmZvcmRlcmxpY2gnIH0sXHJcbiAgICB7IHR5cGU6ICdlbWFpbCcsIG1lc3NhZ2U6ICdVbmfDvGx0aWdlIEUtTWFpbCcgfSxcclxuICAgIHsgdHlwZTogJ2FscmVhZHlJblVzZScsIG1lc3NhZ2U6ICdFLU1haWwgYmVyZWl0cyBpbiBHZWJyYXVjaCcgfSxcclxuICAgIHsgdHlwZTogJ3Vua25vd24nLCBtZXNzYWdlOiAnVW5iZWthbm50ZXIgRmVobGVyJyB9LFxyXG4gICAgeyB0eXBlOiAndW5hdXRoZW50aWNhdGVkJywgbWVzc2FnZTogJ0JlbnV0emVybmFtZSBvZGVyIFBhc3N3b3J0IGZhbHNjaCcgfSxcclxuICBdLFxyXG4gIGNvbmZpcm1QYXNzd29yZDogW1xyXG4gICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnUGFzc3dvcnQgZXJmb3JkZXJsaWNoJyB9LFxyXG4gICAgeyB0eXBlOiAnbWF0Y2hpbmcnLCBtZXNzYWdlOiAnUGFzc3dvcnQgc3RpbW10IG5pY2h0IMO8YmVyZWluJyB9LFxyXG4gIF0sXHJcbiAgcGFzc3dvcmQ6IFtcclxuICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ1Bhc3N3b3J0IGVyZm9yZGVybGljaCcgfSxcclxuICAgIHsgdHlwZTogJ21pbmxlbmd0aCcsIG1lc3NhZ2U6IGBNaW5kZXN0bMOkbmdlICR7UEFTU1dPUkRfTUlOX0xFTkdUSH0gWmVpY2hlbmAgfSxcclxuICAgIHsgdHlwZTogJ3VuYXV0aGVudGljYXRlZCcsIG1lc3NhZ2U6ICdCZW51dHplcm5hbWUgb2RlciBQYXNzd29ydCBmYWxzY2gnIH0sXHJcbiAgXSxcclxuICBuYW1lOiBbXHJcbiAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdOYW1lIGVyZm9yZGVybGljaCcgfSxcclxuICAgIHsgdHlwZTogJ3Vua25vd24nLCBtZXNzYWdlOiAnVW5iZWthbm50ZXIgRmVobGVyJyB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiAnbWlubGVuZ3RoJyxcclxuICAgICAgbWVzc2FnZTogYE5hbWUgbXVzcyBtaW5kZXN0ZW5zICR7VVNFUk5BTUVfTUlOX0xFTkdUSH0gWmVpY2hlbiBsYW5nIHNlaW5gLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogJ21heGxlbmd0aCcsXHJcbiAgICAgIG1lc3NhZ2U6IGBOYW1lIGRhcmYgaMO2Y2hzdGVucyAke1VTRVJOQU1FX01BWF9MRU5HVEh9IFplaWNoZW4gbGFuZyBzZWluYCxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6ICdwYXR0ZXJuJyxcclxuICAgICAgbWVzc2FnZTogJ05hbWUgZGFyZiBudXIgQnVjaHN0YWJlbiwgWmFobGVuIHVuZCBVbnRlcnN0cmljaGUgZW50aGFsdGVuJyxcclxuICAgIH0sXHJcbiAgXSxcclxuICBwaG9uZTogW1xyXG4gICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnVGVsZWZvbm51bW1lciBlcmZvcmRlcmxpY2gnIH0sXHJcbiAgICB7IHR5cGU6ICdwYXR0ZXJuJywgbWVzc2FnZTogJ1VuZ8O8bHRpZ2UgVGVsZWZvbm51bW1lcicgfSxcclxuICAgIHsgdHlwZTogJ3Vua25vd24nLCBtZXNzYWdlOiAnVW5iZWthbm50ZXIgRmVobGVyJyB9LFxyXG4gIF0sXHJcbiAgZGF0ZTogW1xyXG4gICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnRGF0dW0gZXJmb3JkZXJsaWNoJyB9LFxyXG4gICAgeyB0eXBlOiAndW5rbm93bicsIG1lc3NhZ2U6ICdVbmJla2FubnRlciBGZWhsZXInIH0sXHJcbiAgXSxcclxuICB6aXBDb2RlOiBbXHJcbiAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdQTFogZXJmb3JkZXJsaWNoJyB9LFxyXG4gICAgeyB0eXBlOiAncGF0dGVybicsIG1lc3NhZ2U6ICdVbmfDvGx0aWdlIFBMWicgfSxcclxuICAgIHsgdHlwZTogJ3Vua25vd24nLCBtZXNzYWdlOiAnVW5iZWthbm50ZXIgRmVobGVyJyB9LFxyXG4gIF0sXHJcbiAgb3RoZXI6IFtcclxuICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ0VpbmdhYmUgZXJmb3JkZXJsaWNoJyB9LFxyXG4gICAgeyB0eXBlOiAndW5rbm93bicsIG1lc3NhZ2U6ICdVbmJla2FubnRlciBGZWhsZXInIH0sXHJcbiAgXSxcclxuICB1cmw6IFtcclxuICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ1VSTCBlcmZvcmRlcmxpY2gnIH0sXHJcbiAgICB7IHR5cGU6ICdwYXR0ZXJuJywgbWVzc2FnZTogJ1VuZ8O8bHRpZ2UgVVJMJyB9LFxyXG4gIF0sXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hWYWxpZGF0b3IoXHJcbiAgbWF0Y2hUbzogc3RyaW5nLFxyXG4gIHJldmVyc2U/OiBib29sZWFuXHJcbik6IFZhbGlkYXRvckZuIHtcclxuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcclxuICAgIGlmIChjb250cm9sLnBhcmVudCAmJiByZXZlcnNlKSB7XHJcbiAgICAgIGNvbnN0IGMgPSAoY29udHJvbC5wYXJlbnQ/LmNvbnRyb2xzIGFzIGFueSlbbWF0Y2hUb10gYXMgQWJzdHJhY3RDb250cm9sO1xyXG4gICAgICBpZiAoYykge1xyXG4gICAgICAgIGMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICEhY29udHJvbC5wYXJlbnQgJiZcclxuICAgICAgISFjb250cm9sLnBhcmVudC52YWx1ZSAmJlxyXG4gICAgICBjb250cm9sLnZhbHVlID09PSAoY29udHJvbC5wYXJlbnQ/LmNvbnRyb2xzIGFzIGFueSlbbWF0Y2hUb10udmFsdWVcclxuICAgICAgPyBudWxsXHJcbiAgICAgIDogeyBtYXRjaGluZzogdHJ1ZSB9O1xyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1cmxWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xyXG4gIGNvbnN0IHVybFBhdHRlcm4gPSAvXihodHRwcz98ZnRwKTpcXC9cXC9bXlxccy8kLj8jXS5bXlxcc10qJC9pO1xyXG4gIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBudWxsOyAvLyBEb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgcmVxdWlyZWQgdmFsaWRhdG9yIHRvIGhhbmRsZSB0aGVtXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXJsUGF0dGVybi50ZXN0KGNvbnRyb2wudmFsdWUpID8gbnVsbCA6IHsgcGF0dGVybjogdHJ1ZSB9O1xyXG4gIH07XHJcbn0iXX0=
@@ -71,6 +71,10 @@ const VALIDATION_MESSAGES = {
71
71
  { type: 'required', message: 'Eingabe erforderlich' },
72
72
  { type: 'unknown', message: 'Unbekannter Fehler' },
73
73
  ],
74
+ url: [
75
+ { type: 'required', message: 'URL erforderlich' },
76
+ { type: 'pattern', message: 'Ungültige URL' },
77
+ ],
74
78
  };
75
79
  function matchValidator(matchTo, reverse) {
76
80
  return (control) => {
@@ -88,6 +92,15 @@ function matchValidator(matchTo, reverse) {
88
92
  : { matching: true };
89
93
  };
90
94
  }
95
+ function urlValidator() {
96
+ const urlPattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i;
97
+ return (control) => {
98
+ if (!control.value) {
99
+ return null; // Don't validate empty values to allow required validator to handle them
100
+ }
101
+ return urlPattern.test(control.value) ? null : { pattern: true };
102
+ };
103
+ }
91
104
 
92
105
  class FormErrorComponent {
93
106
  constructor() {
@@ -96,31 +109,41 @@ class FormErrorComponent {
96
109
  this.controlName = input.required();
97
110
  this.validationKey = input.required();
98
111
  }
99
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: FormErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
100
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: FormErrorComponent, isStandalone: true, selector: "lib-form-error", inputs: { formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: true, transformFunction: null }, controlName: { classPropertyName: "controlName", publicName: "controlName", isSignal: true, isRequired: true, transformFunction: null }, validationKey: { classPropertyName: "validationKey", publicName: "validationKey", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
101
- @for (validation of VALIDATION_MESSAGES[validationKey()]; track $index) {
102
- <ng-container>
103
- @if(formGroup().get(controlName())?.hasError(validation.type) && formGroup().get(controlName())?.touched && !formGroup().get(controlName())?.pristine) {
104
- <small class="smallError">
105
- {{ validation.message }}
106
- </small>
107
- }
108
- </ng-container>
112
+ get validationsForKey() {
113
+ return this.VALIDATION_MESSAGES[this.validationKey()];
114
+ }
115
+ get control() {
116
+ return this.formGroup().get(this.controlName());
117
+ }
118
+ hasError(errorType) {
119
+ const hasError = this.control?.hasError(errorType) && this.control?.touched && !this.control?.pristine || false;
120
+ return hasError;
109
121
  }
122
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: FormErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
123
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: FormErrorComponent, isStandalone: true, selector: "lib-form-error", inputs: { formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: true, transformFunction: null }, controlName: { classPropertyName: "controlName", publicName: "controlName", isSignal: true, isRequired: true, transformFunction: null }, validationKey: { classPropertyName: "validationKey", publicName: "validationKey", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
124
+ @for (validation of validationsForKey; track $index) {
125
+ <ng-container>
126
+ @if(hasError(validation.type)) {
127
+ <small class="smallError">
128
+ {{ validation.message }}
129
+ </small>
130
+ }
131
+ </ng-container>
132
+ }
110
133
  `, isInline: true, styles: [".smallError{color:#f44336;font-size:.7rem}\n"] }); }
111
134
  }
112
135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: FormErrorComponent, decorators: [{
113
136
  type: Component,
114
- args: [{ selector: 'lib-form-error', standalone: true, template: `
115
- @for (validation of VALIDATION_MESSAGES[validationKey()]; track $index) {
116
- <ng-container>
117
- @if(formGroup().get(controlName())?.hasError(validation.type) && formGroup().get(controlName())?.touched && !formGroup().get(controlName())?.pristine) {
118
- <small class="smallError">
119
- {{ validation.message }}
120
- </small>
121
- }
122
- </ng-container>
123
- }
137
+ args: [{ selector: 'lib-form-error', standalone: true, template: `
138
+ @for (validation of validationsForKey; track $index) {
139
+ <ng-container>
140
+ @if(hasError(validation.type)) {
141
+ <small class="smallError">
142
+ {{ validation.message }}
143
+ </small>
144
+ }
145
+ </ng-container>
146
+ }
124
147
  `, styles: [".smallError{color:#f44336;font-size:.7rem}\n"] }]
125
148
  }] });
126
149
 
@@ -172,5 +195,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImpor
172
195
  * Generated bundle index. Do not edit.
173
196
  */
174
197
 
175
- export { DarkModeToggleComponent, FormErrorComponent, PASSWORD_MIN_LENGTH, USERNAME_MAX_LENGTH, USERNAME_MIN_LENGTH, VALIDATION_MESSAGES, matchValidator };
198
+ export { DarkModeToggleComponent, FormErrorComponent, PASSWORD_MIN_LENGTH, USERNAME_MAX_LENGTH, USERNAME_MIN_LENGTH, VALIDATION_MESSAGES, matchValidator, urlValidator };
176
199
  //# sourceMappingURL=anguland.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"anguland.mjs","sources":["../../../projects/anguland/src/lib/validation.ts","../../../projects/anguland/src/lib/formError.component.ts","../../../projects/anguland/src/lib/dark-mode-toggle.component.ts","../../../projects/anguland/src/anguland.ts"],"sourcesContent":["import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport const PASSWORD_MIN_LENGTH = 6;\r\nexport const USERNAME_MIN_LENGTH = 2;\r\nexport const USERNAME_MAX_LENGTH = 30;\r\n\r\nexport const VALIDATION_MESSAGES = {\r\n username: [\r\n { type: 'required', message: 'Benutzername erforderlich' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n {\r\n type: 'minlength',\r\n message: `Benutzername muss mindestens ${USERNAME_MIN_LENGTH} Zeichen lang sein`,\r\n },\r\n {\r\n type: 'maxlength',\r\n message: `Benutzername darf höchstens ${USERNAME_MAX_LENGTH} Zeichen lang sein`,\r\n },\r\n {\r\n type: 'pattern',\r\n message: 'Benutzername darf nur Buchstaben, Zahlen und Unterstriche enthalten',\r\n },\r\n ],\r\n email: [\r\n { type: 'required', message: 'E-Mail erforderlich' },\r\n { type: 'email', message: 'Ungültige E-Mail' },\r\n { type: 'alreadyInUse', message: 'E-Mail bereits in Gebrauch' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n { type: 'unauthenticated', message: 'Benutzername oder Passwort falsch' },\r\n ],\r\n confirmPassword: [\r\n { type: 'required', message: 'Passwort erforderlich' },\r\n { type: 'matching', message: 'Passwort stimmt nicht überein' },\r\n ],\r\n password: [\r\n { type: 'required', message: 'Passwort erforderlich' },\r\n { type: 'minlength', message: `Mindestlänge ${PASSWORD_MIN_LENGTH} Zeichen` },\r\n { type: 'unauthenticated', message: 'Benutzername oder Passwort falsch' },\r\n ],\r\n name: [\r\n { type: 'required', message: 'Name erforderlich' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n {\r\n type: 'minlength',\r\n message: `Name muss mindestens ${USERNAME_MIN_LENGTH} Zeichen lang sein`,\r\n },\r\n {\r\n type: 'maxlength',\r\n message: `Name darf höchstens ${USERNAME_MAX_LENGTH} Zeichen lang sein`,\r\n },\r\n {\r\n type: 'pattern',\r\n message: 'Name darf nur Buchstaben, Zahlen und Unterstriche enthalten',\r\n },\r\n ],\r\n phone: [\r\n { type: 'required', message: 'Telefonnummer erforderlich' },\r\n { type: 'pattern', message: 'Ungültige Telefonnummer' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n ],\r\n date: [\r\n { type: 'required', message: 'Datum erforderlich' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n ],\r\n zipCode: [\r\n { type: 'required', message: 'PLZ erforderlich' },\r\n { type: 'pattern', message: 'Ungültige PLZ' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n ],\r\n other: [\r\n { type: 'required', message: 'Eingabe erforderlich' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n ],\r\n};\r\n\r\nexport function matchValidator(\r\n matchTo: string,\r\n reverse?: boolean\r\n): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (control.parent && reverse) {\r\n const c = (control.parent?.controls as any)[matchTo] as AbstractControl;\r\n if (c) {\r\n c.updateValueAndValidity();\r\n }\r\n return null;\r\n }\r\n return !!control.parent &&\r\n !!control.parent.value &&\r\n control.value === (control.parent?.controls as any)[matchTo].value\r\n ? null\r\n : { matching: true };\r\n };\r\n}\r\n","import { Component, input } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { VALIDATION_MESSAGES } from './validation';\n\n@Component({\n selector: 'lib-form-error',\n standalone: true,\n template: `\n @for (validation of VALIDATION_MESSAGES[validationKey()]; track $index) {\n <ng-container>\n @if(formGroup().get(controlName())?.hasError(validation.type) && formGroup().get(controlName())?.touched && !formGroup().get(controlName())?.pristine) {\n <small class=\"smallError\">\n {{ validation.message }}\n </small>\n }\n </ng-container>\n }\n `,\n styles: `\n .smallError{\n color: #f44336;\n font-size: 0.7rem;\n }\n `\n})\nexport class FormErrorComponent {\n VALIDATION_MESSAGES: ValidationMessages = VALIDATION_MESSAGES;\n formGroup = input.required<FormGroup>({});\n controlName = input.required<string>();\n validationKey = input.required<string>();\n}\n\ninterface ValidationMessages {\n [key: string]: ValidationMessage[];\n}\n\ninterface ValidationMessage {\n type: string;\n message: string;\n}\n\n","import { Component, input, output } from '@angular/core';\n\n@Component({\n selector: 'lib-dark-mode-toggle',\n standalone: true,\n imports: [],\n template: `\n <div class=\"darkModeToggleButton\">\n <input type=\"checkbox\" id=\"switch\" [checked]=\"isDarkMode()\" (change)=\"toggleDarkMode($event)\" />\n <div class=\"switch-btn\">\n <label>\n <div class=\"icons\">\n <span><i class=\"material-icons\">light_mode</i></span>\n <span><i class=\"material-icons\">dark_mode</i></span>\n </div>\n </label>\n </div>\n </div>\n\n `,\n styles: [`\n .darkModeToggleButton {\n position: relative;\n * {\n transition: all 0.75s ease;\n }\n --switch-width: 60px;\n --switch-height: 30px;\n --label-width: 30px;\n --switch-radius: 20px;\n }\n\n input[type=\"checkbox\"] {\n outline: none;\n -webkit-tap-highlight-color: transparent;\n position: absolute; \n top: 0;\n left: 0;\n width: var(--switch-width);\n height: 100%;\n opacity: 0; \n z-index: 2; \n cursor: pointer;\n }\n\n .switch-btn {\n width: var(--switch-width);\n height: var(--switch-height) + 5px;\n background-color: #eceef1;\n border: 3px solid #d1d6db;\n border-radius: var(--switch-radius);\n position: relative;\n z-index: 1;\n padding: 3px;\n }\n\n label {\n width: var(--label-width);\n height: var(--switch-height);\n display: flex;\n align-items: center;\n justify-content: center;\n background: #f8f8f9;\n border-radius: var(--switch-radius);\n overflow: hidden;\n cursor: pointer;\n }\n\n .icons {\n display: flex;\n align-items: center;\n gap: 20px;\n transform: translate(-11px, 19px) rotate(110deg);\n user-select: none;\n color: #17193f;\n }\n\n input[type=\"checkbox\"]:checked ~ .switch-btn {\n border: 3px solid #2e3052;\n background-color: #17193f;\n }\n\n input[type=\"checkbox\"]:checked ~ .switch-btn label {\n transform: translateX(calc(var(--switch-width) - var(--label-width)));\n box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.2);\n }\n\n input[type=\"checkbox\"]:checked ~ .switch-btn label .icons {\n transform: translateX(-20px);\n }\n\n `]\n})\nexport class DarkModeToggleComponent {\n\n isDarkMode = input.required<boolean>();\n //Would also work\n // isDarkMode = model<boolean>();\n darkModeToggled = output<boolean>();\n\n toggleDarkMode(e: any) {\n this.darkModeToggled.emit(e.target.checked);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;AAEO,MAAM,mBAAmB,GAAG,EAAE;AAC9B,MAAM,mBAAmB,GAAG,EAAE;AAC9B,MAAM,mBAAmB,GAAG,GAAG;AAEzB,MAAA,mBAAmB,GAAG;AACjC,IAAA,QAAQ,EAAE;AACR,QAAA,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,2BAA2B,EAAE;AAC1D,QAAA,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE;AAClD,QAAA;AACE,YAAA,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAgC,6BAAA,EAAA,mBAAmB,CAAoB,kBAAA,CAAA;AACjF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAA+B,4BAAA,EAAA,mBAAmB,CAAoB,kBAAA,CAAA;AAChF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,OAAO,EAAE,qEAAqE;AAC/E,SAAA;AACF,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB,EAAE;AACpD,QAAA,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE;AAC9C,QAAA,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,4BAA4B,EAAE;AAC/D,QAAA,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE;AAClD,QAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,mCAAmC,EAAE;AAC1E,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,uBAAuB,EAAE;AACtD,QAAA,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,+BAA+B,EAAE;AAC/D,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,uBAAuB,EAAE;QACtD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAA,aAAA,EAAgB,mBAAmB,CAAA,QAAA,CAAU,EAAE;AAC7E,QAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,mCAAmC,EAAE;AAC1E,KAAA;AACD,IAAA,IAAI,EAAE;AACJ,QAAA,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,mBAAmB,EAAE;AAClD,QAAA,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE;AAClD,QAAA;AACE,YAAA,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAwB,qBAAA,EAAA,mBAAmB,CAAoB,kBAAA,CAAA;AACzE,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAuB,oBAAA,EAAA,mBAAmB,CAAoB,kBAAA,CAAA;AACxE,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,OAAO,EAAE,6DAA6D;AACvE,SAAA;AACF,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,4BAA4B,EAAE;AAC3D,QAAA,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,yBAAyB,EAAE;AACvD,QAAA,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE;AACnD,KAAA;AACD,IAAA,IAAI,EAAE;AACJ,QAAA,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE;AACnD,QAAA,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE;AACnD,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE;AACjD,QAAA,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE;AAC7C,QAAA,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE;AACnD,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE;AACrD,QAAA,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE;AACnD,KAAA;EACD;AAEc,SAAA,cAAc,CAC5B,OAAe,EACf,OAAiB,EAAA;IAEjB,OAAO,CAAC,OAAwB,KAA6B;AAC3D,QAAA,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,EAAE;AAC7B,YAAA,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,QAAgB,EAAC,OAAO,CAAoB,CAAC;YACxE,IAAI,CAAC,EAAE;gBACL,CAAC,CAAC,sBAAsB,EAAE,CAAC;aAC5B;AACD,YAAA,OAAO,IAAI,CAAC;SACb;AACD,QAAA,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM;AACrB,YAAA,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;AACtB,YAAA,OAAO,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAgB,EAAC,OAAO,CAAC,CAAC,KAAK;AAClE,cAAE,IAAI;AACN,cAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACzB,KAAC,CAAC;AACJ;;MCpEa,kBAAkB,CAAA;AArB/B,IAAA,WAAA,GAAA;QAsBE,IAAmB,CAAA,mBAAA,GAAuB,mBAAmB,CAAC;AAC9D,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAY,EAAE,CAAC,CAAC;AAC1C,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAU,CAAC;AACvC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,QAAQ,EAAU,CAAC;AAC1C,KAAA;8GALY,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EAlBnB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;AAUT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,8CAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAQU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBArB9B,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EACN,QAAA,EAAA,CAAA;;;;;;;;;;AAUT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,8CAAA,CAAA,EAAA,CAAA;;;MC4EU,uBAAuB,CAAA;AA3FpC,IAAA,WAAA,GAAA;AA6FE,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAW,CAAC;;;QAGvC,IAAe,CAAA,eAAA,GAAG,MAAM,EAAW,CAAC;AAKrC,KAAA;AAHC,IAAA,cAAc,CAAC,CAAM,EAAA;QACnB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC7C;8GATU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAvFxB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;AAaT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,isCAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FA0EU,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA3FnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EACpB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,EAAE,EACD,QAAA,EAAA,CAAA;;;;;;;;;;;;;AAaT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,isCAAA,CAAA,EAAA,CAAA;;;ACnBH;;AAEG;;;;"}
1
+ {"version":3,"file":"anguland.mjs","sources":["../../../projects/anguland/src/lib/validation.ts","../../../projects/anguland/src/lib/formError.component.ts","../../../projects/anguland/src/lib/dark-mode-toggle.component.ts","../../../projects/anguland/src/anguland.ts"],"sourcesContent":["import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport interface ValidationMessage {\r\n type: string;\r\n message: string;\r\n}\r\n\r\nexport interface ValidationMessages {\r\n [key: string]: ValidationMessage[];\r\n}\r\n\r\nexport const PASSWORD_MIN_LENGTH = 6;\r\nexport const USERNAME_MIN_LENGTH = 2;\r\nexport const USERNAME_MAX_LENGTH = 30;\r\n\r\nexport const VALIDATION_MESSAGES: ValidationMessages = {\r\n username: [\r\n { type: 'required', message: 'Benutzername erforderlich' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n {\r\n type: 'minlength',\r\n message: `Benutzername muss mindestens ${USERNAME_MIN_LENGTH} Zeichen lang sein`,\r\n },\r\n {\r\n type: 'maxlength',\r\n message: `Benutzername darf höchstens ${USERNAME_MAX_LENGTH} Zeichen lang sein`,\r\n },\r\n {\r\n type: 'pattern',\r\n message: 'Benutzername darf nur Buchstaben, Zahlen und Unterstriche enthalten',\r\n },\r\n ],\r\n email: [\r\n { type: 'required', message: 'E-Mail erforderlich' },\r\n { type: 'email', message: 'Ungültige E-Mail' },\r\n { type: 'alreadyInUse', message: 'E-Mail bereits in Gebrauch' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n { type: 'unauthenticated', message: 'Benutzername oder Passwort falsch' },\r\n ],\r\n confirmPassword: [\r\n { type: 'required', message: 'Passwort erforderlich' },\r\n { type: 'matching', message: 'Passwort stimmt nicht überein' },\r\n ],\r\n password: [\r\n { type: 'required', message: 'Passwort erforderlich' },\r\n { type: 'minlength', message: `Mindestlänge ${PASSWORD_MIN_LENGTH} Zeichen` },\r\n { type: 'unauthenticated', message: 'Benutzername oder Passwort falsch' },\r\n ],\r\n name: [\r\n { type: 'required', message: 'Name erforderlich' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n {\r\n type: 'minlength',\r\n message: `Name muss mindestens ${USERNAME_MIN_LENGTH} Zeichen lang sein`,\r\n },\r\n {\r\n type: 'maxlength',\r\n message: `Name darf höchstens ${USERNAME_MAX_LENGTH} Zeichen lang sein`,\r\n },\r\n {\r\n type: 'pattern',\r\n message: 'Name darf nur Buchstaben, Zahlen und Unterstriche enthalten',\r\n },\r\n ],\r\n phone: [\r\n { type: 'required', message: 'Telefonnummer erforderlich' },\r\n { type: 'pattern', message: 'Ungültige Telefonnummer' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n ],\r\n date: [\r\n { type: 'required', message: 'Datum erforderlich' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n ],\r\n zipCode: [\r\n { type: 'required', message: 'PLZ erforderlich' },\r\n { type: 'pattern', message: 'Ungültige PLZ' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n ],\r\n other: [\r\n { type: 'required', message: 'Eingabe erforderlich' },\r\n { type: 'unknown', message: 'Unbekannter Fehler' },\r\n ],\r\n url: [\r\n { type: 'required', message: 'URL erforderlich' },\r\n { type: 'pattern', message: 'Ungültige URL' },\r\n ],\r\n};\r\n\r\nexport function matchValidator(\r\n matchTo: string,\r\n reverse?: boolean\r\n): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (control.parent && reverse) {\r\n const c = (control.parent?.controls as any)[matchTo] as AbstractControl;\r\n if (c) {\r\n c.updateValueAndValidity();\r\n }\r\n return null;\r\n }\r\n return !!control.parent &&\r\n !!control.parent.value &&\r\n control.value === (control.parent?.controls as any)[matchTo].value\r\n ? null\r\n : { matching: true };\r\n };\r\n}\r\n\r\nexport function urlValidator(): ValidatorFn {\r\n const urlPattern = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i;\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null; // Don't validate empty values to allow required validator to handle them\r\n }\r\n return urlPattern.test(control.value) ? null : { pattern: true };\r\n };\r\n}","import { Component, input } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { VALIDATION_MESSAGES, ValidationMessage, ValidationMessages } from './validation';\r\n\r\n@Component({\r\n selector: 'lib-form-error',\r\n standalone: true,\r\n template: `\r\n @for (validation of validationsForKey; track $index) {\r\n <ng-container>\r\n @if(hasError(validation.type)) {\r\n <small class=\"smallError\">\r\n {{ validation.message }}\r\n </small>\r\n }\r\n </ng-container>\r\n }\r\n `,\r\n styles: `\r\n .smallError{\r\n color: #f44336;\r\n font-size: 0.7rem;\r\n }\r\n `\r\n})\r\nexport class FormErrorComponent {\r\n VALIDATION_MESSAGES: ValidationMessages = VALIDATION_MESSAGES;\r\n formGroup = input.required<FormGroup>({});\r\n controlName = input.required<string>();\r\n validationKey = input.required<string>();\r\n\r\n\r\n\r\n get validationsForKey(): ValidationMessage[] {\r\n return this.VALIDATION_MESSAGES[this.validationKey()];\r\n }\r\n\r\n get control() {\r\n return this.formGroup().get(this.controlName());\r\n }\r\n\r\n hasError(errorType: string): boolean {\r\n const hasError: boolean = this.control?.hasError(errorType) && this.control?.touched && !this.control?.pristine || false;\r\n return hasError;\r\n }\r\n}\r\n","import { Component, input, output } from '@angular/core';\n\n@Component({\n selector: 'lib-dark-mode-toggle',\n standalone: true,\n imports: [],\n template: `\n <div class=\"darkModeToggleButton\">\n <input type=\"checkbox\" id=\"switch\" [checked]=\"isDarkMode()\" (change)=\"toggleDarkMode($event)\" />\n <div class=\"switch-btn\">\n <label>\n <div class=\"icons\">\n <span><i class=\"material-icons\">light_mode</i></span>\n <span><i class=\"material-icons\">dark_mode</i></span>\n </div>\n </label>\n </div>\n </div>\n\n `,\n styles: [`\n .darkModeToggleButton {\n position: relative;\n * {\n transition: all 0.75s ease;\n }\n --switch-width: 60px;\n --switch-height: 30px;\n --label-width: 30px;\n --switch-radius: 20px;\n }\n\n input[type=\"checkbox\"] {\n outline: none;\n -webkit-tap-highlight-color: transparent;\n position: absolute; \n top: 0;\n left: 0;\n width: var(--switch-width);\n height: 100%;\n opacity: 0; \n z-index: 2; \n cursor: pointer;\n }\n\n .switch-btn {\n width: var(--switch-width);\n height: var(--switch-height) + 5px;\n background-color: #eceef1;\n border: 3px solid #d1d6db;\n border-radius: var(--switch-radius);\n position: relative;\n z-index: 1;\n padding: 3px;\n }\n\n label {\n width: var(--label-width);\n height: var(--switch-height);\n display: flex;\n align-items: center;\n justify-content: center;\n background: #f8f8f9;\n border-radius: var(--switch-radius);\n overflow: hidden;\n cursor: pointer;\n }\n\n .icons {\n display: flex;\n align-items: center;\n gap: 20px;\n transform: translate(-11px, 19px) rotate(110deg);\n user-select: none;\n color: #17193f;\n }\n\n input[type=\"checkbox\"]:checked ~ .switch-btn {\n border: 3px solid #2e3052;\n background-color: #17193f;\n }\n\n input[type=\"checkbox\"]:checked ~ .switch-btn label {\n transform: translateX(calc(var(--switch-width) - var(--label-width)));\n box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.2);\n }\n\n input[type=\"checkbox\"]:checked ~ .switch-btn label .icons {\n transform: translateX(-20px);\n }\n\n `]\n})\nexport class DarkModeToggleComponent {\n\n isDarkMode = input.required<boolean>();\n //Would also work\n // isDarkMode = model<boolean>();\n darkModeToggled = output<boolean>();\n\n toggleDarkMode(e: any) {\n this.darkModeToggled.emit(e.target.checked);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,18 +1,14 @@
1
1
  import { FormGroup } from '@angular/forms';
2
+ import { ValidationMessage, ValidationMessages } from './validation';
2
3
  import * as i0 from "@angular/core";
3
4
  export declare class FormErrorComponent {
4
5
  VALIDATION_MESSAGES: ValidationMessages;
5
6
  formGroup: import("@angular/core").InputSignal<FormGroup<any>>;
6
7
  controlName: import("@angular/core").InputSignal<string>;
7
8
  validationKey: import("@angular/core").InputSignal<string>;
9
+ get validationsForKey(): ValidationMessage[];
10
+ get control(): import("@angular/forms").AbstractControl<any, any> | null;
11
+ hasError(errorType: string): boolean;
8
12
  static ɵfac: i0.ɵɵFactoryDeclaration<FormErrorComponent, never>;
9
13
  static ɵcmp: i0.ɵɵComponentDeclaration<FormErrorComponent, "lib-form-error", never, { "formGroup": { "alias": "formGroup"; "required": true; "isSignal": true; }; "controlName": { "alias": "controlName"; "required": true; "isSignal": true; }; "validationKey": { "alias": "validationKey"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
10
14
  }
11
- interface ValidationMessages {
12
- [key: string]: ValidationMessage[];
13
- }
14
- interface ValidationMessage {
15
- type: string;
16
- message: string;
17
- }
18
- export {};
@@ -1,43 +1,14 @@
1
1
  import { ValidatorFn } from '@angular/forms';
2
+ export interface ValidationMessage {
3
+ type: string;
4
+ message: string;
5
+ }
6
+ export interface ValidationMessages {
7
+ [key: string]: ValidationMessage[];
8
+ }
2
9
  export declare const PASSWORD_MIN_LENGTH = 6;
3
10
  export declare const USERNAME_MIN_LENGTH = 2;
4
11
  export declare const USERNAME_MAX_LENGTH = 30;
5
- export declare const VALIDATION_MESSAGES: {
6
- username: {
7
- type: string;
8
- message: string;
9
- }[];
10
- email: {
11
- type: string;
12
- message: string;
13
- }[];
14
- confirmPassword: {
15
- type: string;
16
- message: string;
17
- }[];
18
- password: {
19
- type: string;
20
- message: string;
21
- }[];
22
- name: {
23
- type: string;
24
- message: string;
25
- }[];
26
- phone: {
27
- type: string;
28
- message: string;
29
- }[];
30
- date: {
31
- type: string;
32
- message: string;
33
- }[];
34
- zipCode: {
35
- type: string;
36
- message: string;
37
- }[];
38
- other: {
39
- type: string;
40
- message: string;
41
- }[];
42
- };
12
+ export declare const VALIDATION_MESSAGES: ValidationMessages;
43
13
  export declare function matchValidator(matchTo: string, reverse?: boolean): ValidatorFn;
14
+ export declare function urlValidator(): ValidatorFn;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "anguland",
3
- "version": "0.0.6",
3
+ "version": "0.0.10",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^18.0.0",
6
6
  "@angular/core": "^18.0.0"