ngx-lite-form 1.1.8 → 1.1.9
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.
- package/README.md +7 -7
- package/fesm2022/ngx-lite-form.mjs +83 -2
- package/fesm2022/ngx-lite-form.mjs.map +1 -1
- package/index.d.ts +15 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,16 +21,16 @@ A modern, lightweight Angular form components library with TypeScript support, b
|
|
|
21
21
|
## Installation
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
npm install lite-form
|
|
24
|
+
npm install ngx-lite-form
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
## Quick Usage
|
|
28
28
|
|
|
29
29
|
```typescript
|
|
30
|
-
import { LiteFormModule } from 'lite-form';
|
|
30
|
+
import { LiteFormModule } from 'ngx-lite-form';
|
|
31
31
|
import { FormControl, Validators } from '@angular/forms';
|
|
32
32
|
|
|
33
|
-
import { FieldDto, SelectFieldDto, MultiSelectFieldDto, RadioFieldDto, FileFieldDto } from 'lite-form';
|
|
33
|
+
import { FieldDto, SelectFieldDto, MultiSelectFieldDto, RadioFieldDto, FileFieldDto } from 'ngx-lite-form';
|
|
34
34
|
|
|
35
35
|
@Component({
|
|
36
36
|
standalone: true,
|
|
@@ -92,7 +92,7 @@ Date & time picker component for selecting both date and time, with custom forma
|
|
|
92
92
|
|
|
93
93
|
**Example:**
|
|
94
94
|
```typescript
|
|
95
|
-
import { FieldDto } from 'lite-form';
|
|
95
|
+
import { FieldDto } from 'ngx-lite-form';
|
|
96
96
|
datetimeField = new FieldDto('Event Date & Time', new FormControl(''));
|
|
97
97
|
```
|
|
98
98
|
```html
|
|
@@ -114,7 +114,7 @@ File upload component with drag & drop, badge, file management panel, and camera
|
|
|
114
114
|
|
|
115
115
|
**Example:**
|
|
116
116
|
```typescript
|
|
117
|
-
import { FileFieldDto } from 'lite-form';
|
|
117
|
+
import { FileFieldDto } from 'ngx-lite-form';
|
|
118
118
|
fileField = new FileFieldDto('Upload Files', new FormControl([]));
|
|
119
119
|
```
|
|
120
120
|
```html
|
|
@@ -220,7 +220,7 @@ The library includes comprehensive SCSS styling. To customize:
|
|
|
220
220
|
|
|
221
221
|
### Building the Library
|
|
222
222
|
```bash
|
|
223
|
-
ng build lite-form
|
|
223
|
+
ng build ngx-lite-form
|
|
224
224
|
```
|
|
225
225
|
|
|
226
226
|
### Publishing
|
|
@@ -231,7 +231,7 @@ npm publish
|
|
|
231
231
|
|
|
232
232
|
### Running Tests
|
|
233
233
|
```bash
|
|
234
|
-
ng test lite-form
|
|
234
|
+
ng test ngx-lite-form
|
|
235
235
|
```
|
|
236
236
|
|
|
237
237
|
## Browser Support
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, effect, Component, HostListener, ViewChild, signal, computed, NgModule } from '@angular/core';
|
|
2
|
+
import { input, effect, Component, HostListener, ViewChild, signal, computed, NgModule, Injectable } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/common';
|
|
4
4
|
import { CommonModule } from '@angular/common';
|
|
5
5
|
import * as i2 from '@angular/forms';
|
|
@@ -1920,6 +1920,87 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImpor
|
|
|
1920
1920
|
args: ['document:click', ['$event']]
|
|
1921
1921
|
}] } });
|
|
1922
1922
|
|
|
1923
|
+
class LiteSnackbarService {
|
|
1924
|
+
timeoutId;
|
|
1925
|
+
snackbarElem = null;
|
|
1926
|
+
show(text, type = 'done', duration = 3000) {
|
|
1927
|
+
this.clear();
|
|
1928
|
+
this.snackbarElem = document.createElement('div');
|
|
1929
|
+
this.snackbarElem.className = `lite-snackbar ${type}`;
|
|
1930
|
+
this.snackbarElem.innerHTML = `
|
|
1931
|
+
<div class="icon">${this.getIcon(type)}</div>
|
|
1932
|
+
<div class="text">${this.escapeHtml(text)}</div>
|
|
1933
|
+
`;
|
|
1934
|
+
this.injectStyles();
|
|
1935
|
+
document.body.appendChild(this.snackbarElem);
|
|
1936
|
+
this.timeoutId = setTimeout(() => this.clear(), duration);
|
|
1937
|
+
}
|
|
1938
|
+
clear() {
|
|
1939
|
+
if (this.timeoutId)
|
|
1940
|
+
clearTimeout(this.timeoutId);
|
|
1941
|
+
if (this.snackbarElem && this.snackbarElem.parentNode) {
|
|
1942
|
+
this.snackbarElem.parentNode.removeChild(this.snackbarElem);
|
|
1943
|
+
}
|
|
1944
|
+
this.snackbarElem = null;
|
|
1945
|
+
}
|
|
1946
|
+
getIcon(type) {
|
|
1947
|
+
if (type === 'done') {
|
|
1948
|
+
return `<svg width="30" height="30" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="10"/><path d="M6 10.5L9 13.5L14 8.5" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
|
|
1949
|
+
}
|
|
1950
|
+
if (type === 'warn') {
|
|
1951
|
+
return `<svg width="30" height="30" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="10"/><path d="M10 6V11" stroke="#fff" stroke-width="2" stroke-linecap="round"/><circle cx="10" cy="14" r="1" fill="#fff"/></svg>`;
|
|
1952
|
+
}
|
|
1953
|
+
if (type === 'error') {
|
|
1954
|
+
return `<svg width="30" height="30" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="10"/><path d="M7 7L13 13M13 7L7 13" stroke="#fff" stroke-width="2" stroke-linecap="round"/></svg>`;
|
|
1955
|
+
}
|
|
1956
|
+
return '';
|
|
1957
|
+
}
|
|
1958
|
+
injectStyles() {
|
|
1959
|
+
if (document.getElementById('lite-snackbar-style'))
|
|
1960
|
+
return;
|
|
1961
|
+
const style = document.createElement('style');
|
|
1962
|
+
style.id = 'lite-snackbar-style';
|
|
1963
|
+
style.innerHTML = `
|
|
1964
|
+
.lite-snackbar {
|
|
1965
|
+
position: fixed;
|
|
1966
|
+
left: 50%;
|
|
1967
|
+
top: 20px;
|
|
1968
|
+
transform: translateX(-50%);
|
|
1969
|
+
min-width: 200px;
|
|
1970
|
+
max-width: 90vw;
|
|
1971
|
+
padding: 8px 15px 8px 5px;
|
|
1972
|
+
border-radius: 6px;
|
|
1973
|
+
color: #fff;
|
|
1974
|
+
font-size: 1rem;
|
|
1975
|
+
display: flex;
|
|
1976
|
+
align-items: center;
|
|
1977
|
+
box-shadow: 0 2px 12px rgba(0,0,0,0.18);
|
|
1978
|
+
z-index: 9999;
|
|
1979
|
+
opacity: 0.9;
|
|
1980
|
+
animation: snackbar-in 0.2s;
|
|
1981
|
+
}
|
|
1982
|
+
.lite-snackbar.done { background: #3a82eeff; }
|
|
1983
|
+
.lite-snackbar.warn { background: #f7b731; }
|
|
1984
|
+
.lite-snackbar.error { background: #e74c3c; }
|
|
1985
|
+
.lite-snackbar .icon { margin-right: 5px; height: 30px; }
|
|
1986
|
+
@keyframes snackbar-in {
|
|
1987
|
+
from { opacity: 0; transform: translateX(-50%) translateY(-30px); }
|
|
1988
|
+
to { opacity: 0.9; transform: translateX(-50%) translateY(0); }
|
|
1989
|
+
}
|
|
1990
|
+
`;
|
|
1991
|
+
document.head.appendChild(style);
|
|
1992
|
+
}
|
|
1993
|
+
escapeHtml(text) {
|
|
1994
|
+
return text.replace(/[&<>'"]/g, c => ({ '&': '&', '<': '<', '>': '>', '\'': ''', '"': '"' }[c] || c));
|
|
1995
|
+
}
|
|
1996
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: LiteSnackbarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1997
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: LiteSnackbarService, providedIn: 'root' });
|
|
1998
|
+
}
|
|
1999
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: LiteSnackbarService, decorators: [{
|
|
2000
|
+
type: Injectable,
|
|
2001
|
+
args: [{ providedIn: 'root' }]
|
|
2002
|
+
}] });
|
|
2003
|
+
|
|
1923
2004
|
/*
|
|
1924
2005
|
* Public API Surface of lite-form
|
|
1925
2006
|
*/
|
|
@@ -1928,5 +2009,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImpor
|
|
|
1928
2009
|
* Generated bundle index. Do not edit.
|
|
1929
2010
|
*/
|
|
1930
2011
|
|
|
1931
|
-
export { BaseSelectFieldDto, FieldDto, FileFieldDto, FormUtils, LiteCheckbox, LiteDate, LiteDateTime, LiteFile, LiteFormModule, LiteInput, LiteMultiSelect, LitePassword, LiteRadio, LiteSelect, LiteTextarea, MultiSelectFieldDto, RadioFieldDto, SelectFieldDto };
|
|
2012
|
+
export { BaseSelectFieldDto, FieldDto, FileFieldDto, FormUtils, LiteCheckbox, LiteDate, LiteDateTime, LiteFile, LiteFormModule, LiteInput, LiteMultiSelect, LitePassword, LiteRadio, LiteSelect, LiteSnackbarService, LiteTextarea, MultiSelectFieldDto, RadioFieldDto, SelectFieldDto };
|
|
1932
2013
|
//# sourceMappingURL=ngx-lite-form.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-lite-form.mjs","sources":["../../../projects/lite-form/src/lib/form-utils.ts","../../../projects/lite-form/src/lib/lite-input/lite-input.ts","../../../projects/lite-form/src/lib/lite-input/lite-input.html","../../../projects/lite-form/src/lib/lite-textarea/lite-textarea.ts","../../../projects/lite-form/src/lib/lite-textarea/lite-textarea.html","../../../projects/lite-form/src/lib/lite-select/lite-select.ts","../../../projects/lite-form/src/lib/lite-select/lite-select.html","../../../projects/lite-form/src/lib/lite-multi-select/lite-multi-select.ts","../../../projects/lite-form/src/lib/lite-multi-select/lite-multi-select.html","../../../projects/lite-form/src/lib/lite-radio/lite-radio.ts","../../../projects/lite-form/src/lib/lite-radio/lite-radio.html","../../../projects/lite-form/src/lib/lite-checkbox/lite-checkbox.ts","../../../projects/lite-form/src/lib/lite-checkbox/lite-checkbox.html","../../../projects/lite-form/src/lib/lite-date/lite-date.ts","../../../projects/lite-form/src/lib/lite-date/lite-date.html","../../../projects/lite-form/src/lib/lite-password/lite-password.ts","../../../projects/lite-form/src/lib/lite-password/lite-password.html","../../../projects/lite-form/src/lib/lite-file/lite-file.ts","../../../projects/lite-form/src/lib/lite-file/lite-file.html","../../../projects/lite-form/src/lib/lite-form.module.ts","../../../projects/lite-form/src/lib/field-dto.ts","../../../projects/lite-form/src/lib/lite-datetime/lite-datetime.ts","../../../projects/lite-form/src/lib/lite-datetime/lite-datetime.html","../../../projects/lite-form/src/public-api.ts","../../../projects/lite-form/src/ngx-lite-form.ts"],"sourcesContent":["import { AbstractControl } from '@angular/forms';\n\n/**\n * Utility class for form-related helper functions\n */\nexport class FormUtils {\n /**\n * Check if a FormControl has the required validator\n * @param control - The AbstractControl to check\n * @returns true if the control has a required validator, false otherwise\n */\n static isRequired(control: AbstractControl): boolean {\n if (control.validator) {\n const validator = control.validator({} as any);\n return validator && validator['required'];\n }\n return false;\n }\n\n /**\n * Check if a FormControl has any validation errors\n * @param control - The AbstractControl to check\n * @returns true if the control has errors, false otherwise\n */\n static hasErrors(control: AbstractControl): boolean {\n return control.invalid && (control.dirty || control.touched);\n }\n\n /**\n * Get all error keys for a FormControl\n * @param control - The AbstractControl to check\n * @returns array of error keys or empty array if no errors\n */\n static getErrors(control: AbstractControl): string[] {\n if (control.errors) {\n return Object.keys(control.errors);\n }\n return [];\n }\n\n /**\n * Get user-friendly error messages for a FormControl\n * @param control - The AbstractControl to check\n * @param fieldLabel - The label of the field for error messages\n * @returns array of user-friendly error messages\n */\n static getErrorMessages(control: AbstractControl, fieldLabel: string): string[] {\n const errorMessages: string[] = [];\n \n if (control.errors) {\n if (control.errors['required']) {\n errorMessages.push(`${fieldLabel} is required`);\n }\n if (control.errors['email']) {\n errorMessages.push(`${fieldLabel} must be a valid email`);\n }\n if (control.errors['minlength']) {\n errorMessages.push(`${fieldLabel} must be at least ${control.errors['minlength'].requiredLength} characters`);\n }\n if (control.errors['maxlength']) {\n errorMessages.push(`${fieldLabel} must be no more than ${control.errors['maxlength'].requiredLength} characters`);\n }\n \n // Handle any other validation errors\n const allErrors = FormUtils.getErrors(control);\n const handledErrors = ['required', 'email', 'minlength', 'maxlength'];\n const unhandledErrors = allErrors.filter(error => !handledErrors.includes(error));\n \n unhandledErrors.forEach(error => {\n errorMessages.push(`${fieldLabel} is invalid: ${error}`);\n });\n }\n \n return errorMessages;\n }\n\n /**\n * Get the first error message for a FormControl\n * @param control - The AbstractControl to check\n * @returns the first error key or null if no errors\n */\n static getFirstError(control: AbstractControl): string | null {\n if (control.errors) {\n return Object.keys(control.errors)[0];\n }\n return null;\n }\n\n /**\n * Get detailed password error messages for a FormControl\n * @param control - The AbstractControl to check\n * @param fieldLabel - The label of the field for error messages\n * @returns array of detailed password error messages\n */\n static getPasswordErrorMessages(control: AbstractControl, fieldLabel: string): string[] {\n const errorMessages: string[] = [];\n \n if (control.errors) {\n // Required validation\n if (control.errors['required']) {\n errorMessages.push(`${fieldLabel} is required`);\n }\n \n // Length validations\n if (control.errors['minlength']) {\n const requiredLength = control.errors['minlength'].requiredLength;\n const actualLength = control.errors['minlength'].actualLength;\n errorMessages.push(`${fieldLabel} must be at least ${requiredLength} characters (currently ${actualLength})`);\n }\n \n if (control.errors['maxlength']) {\n const requiredLength = control.errors['maxlength'].requiredLength;\n const actualLength = control.errors['maxlength'].actualLength;\n errorMessages.push(`${fieldLabel} must be no more than ${requiredLength} characters (currently ${actualLength})`);\n }\n \n // Pattern validation with detailed feedback\n if (control.errors['pattern']) {\n const value = control.value || '';\n const patternRequiredValue = control.errors['pattern'].requiredPattern;\n \n // Analyze the actual pattern to provide specific feedback\n const missingRequirements: string[] = [];\n \n // Check what the actual pattern requires by analyzing the regex\n if (patternRequiredValue) {\n // Check if the pattern requires lowercase letters\n if (patternRequiredValue.includes('(?=.*[a-z])') && !/[a-z]/.test(value)) {\n missingRequirements.push('at least one lowercase letter (a-z)');\n }\n \n // Check if the pattern requires uppercase letters\n if (patternRequiredValue.includes('(?=.*[A-Z])') && !/[A-Z]/.test(value)) {\n missingRequirements.push('at least one uppercase letter (A-Z)');\n }\n \n // Check if the pattern requires digits\n if ((patternRequiredValue.includes('(?=.*\\\\d)') || patternRequiredValue.includes('(?=.*[0-9])')) && !/\\d/.test(value)) {\n missingRequirements.push('at least one number (0-9)');\n }\n \n // Check if the pattern requires special characters\n if (patternRequiredValue.includes('(?=.*[@$!%*?&]') && !/[@$!%*?&^()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?#~`]/.test(value)) {\n missingRequirements.push('at least one special character (!@#$%^&*()_+-=[]{}|;\\':\",./<>?)');\n }\n \n // Check for minimum length in pattern (e.g., {8,} or {8,50})\n const lengthMatch = patternRequiredValue.match(/\\{(\\d+),?\\d*\\}/);\n if (lengthMatch) {\n const minLength = parseInt(lengthMatch[1]);\n if (value.length < minLength) {\n missingRequirements.push(`at least ${minLength} characters`);\n }\n }\n \n // Check if spaces are not allowed\n if (patternRequiredValue.includes('[A-Za-z\\\\d') && !patternRequiredValue.includes('\\\\s') && /\\s/.test(value)) {\n missingRequirements.push('no spaces allowed');\n }\n }\n \n // Fallback to generic checks if pattern analysis didn't find specific requirements\n if (missingRequirements.length === 0) {\n // Check for common password requirements as fallback\n if (!/[a-z]/.test(value)) {\n missingRequirements.push('at least one lowercase letter (a-z)');\n }\n \n if (!/[A-Z]/.test(value)) {\n missingRequirements.push('at least one uppercase letter (A-Z)');\n }\n \n if (!/\\d/.test(value)) {\n missingRequirements.push('at least one number (0-9)');\n }\n \n if (!/[@$!%*?&^()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?#~`]/.test(value)) {\n missingRequirements.push('at least one special character (!@#$%^&*()_+-=[]{}|;\\':\",./<>?)');\n }\n }\n \n if (missingRequirements.length > 0) {\n errorMessages.push(`${fieldLabel} must contain ${missingRequirements.join(', ')}`);\n } else {\n // Show the actual pattern if we can't determine specific requirements\n errorMessages.push(`${fieldLabel} does not match required pattern: ${patternRequiredValue}`);\n }\n }\n \n // Custom password complexity validator\n if (control.errors['passwordComplexity']) {\n const complexity = control.errors['passwordComplexity'];\n const missing: string[] = [];\n \n if (!complexity.hasUpperCase) missing.push('uppercase letter');\n if (!complexity.hasLowerCase) missing.push('lowercase letter');\n if (!complexity.hasNumeric) missing.push('number');\n if (!complexity.hasSpecial) missing.push('special character');\n if (!complexity.minLength) missing.push('minimum length requirement');\n \n if (missing.length > 0) {\n errorMessages.push(`${fieldLabel} is missing: ${missing.join(', ')}`);\n }\n }\n \n // Password mismatch (for confirm password fields)\n if (control.errors['passwordMismatch']) {\n errorMessages.push(`${fieldLabel} does not match the password`);\n }\n \n // Common password validator\n if (control.errors['commonPassword']) {\n errorMessages.push(`${fieldLabel} is too common. Please choose a more secure password`);\n }\n \n // Password history validator\n if (control.errors['passwordHistory']) {\n errorMessages.push(`${fieldLabel} has been used recently. Please choose a different password`);\n }\n \n // Handle any other validation errors not specifically handled\n const allErrors = FormUtils.getErrors(control);\n const handledErrors = [\n 'required', 'minlength', 'maxlength', 'pattern', \n 'passwordComplexity', 'passwordMismatch', 'commonPassword', 'passwordHistory'\n ];\n const unhandledErrors = allErrors.filter(error => !handledErrors.includes(error));\n \n unhandledErrors.forEach(error => {\n errorMessages.push(`${fieldLabel} validation error: ${error}`);\n });\n }\n \n return errorMessages;\n }\n\n /**\n * Analyze password strength and return feedback\n * @param password - The password string to analyze\n * @returns object with strength score and detailed feedback\n */\n static analyzePasswordStrength(password: string): {\n score: number;\n level: 'Very Weak' | 'Weak' | 'Fair' | 'Good' | 'Strong';\n feedback: string[];\n } {\n const feedback: string[] = [];\n let score = 0;\n \n if (!password) {\n return { score: 0, level: 'Very Weak', feedback: ['Password is required'] };\n }\n \n // Length scoring\n if (password.length >= 8) score += 1;\n else feedback.push('Use at least 8 characters');\n \n if (password.length >= 12) score += 1;\n else if (password.length >= 8) feedback.push('Consider using 12+ characters for better security');\n \n // Character variety scoring\n if (/[a-z]/.test(password)) score += 1;\n else feedback.push('Add lowercase letters');\n \n if (/[A-Z]/.test(password)) score += 1;\n else feedback.push('Add uppercase letters');\n \n if (/\\d/.test(password)) score += 1;\n else feedback.push('Add numbers');\n \n if (/[@$!%*?&^()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?#~`]/.test(password)) score += 1;\n else feedback.push('Add special characters');\n \n // Additional checks\n if (!/(.)\\1{2,}/.test(password)) score += 1;\n else feedback.push('Avoid repeating characters');\n \n if (!/^(.{1,2})\\1+$/.test(password)) score += 1;\n else feedback.push('Avoid repetitive patterns');\n \n // Determine strength level\n let level: 'Very Weak' | 'Weak' | 'Fair' | 'Good' | 'Strong';\n if (score <= 2) level = 'Very Weak';\n else if (score <= 4) level = 'Weak';\n else if (score <= 5) level = 'Fair';\n else if (score <= 6) level = 'Good';\n else level = 'Strong';\n \n return { score, level, feedback };\n }\n}\n","import { Component, effect, input } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-input',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-input.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteInput {\n inEdit = input<boolean>(true);\n control = input<FieldDto>({ label: '', formControl: new FormControl('') });\n \n readonly FormUtils = FormUtils;\n\n constructor() {\n effect(() => {\n // console.log('LiteInput initialized with control:', this.control());\n\n });\n }\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n}\n","<div class=\"lite-input\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <input type=\"text\" [formControl]=\"control().formControl\" placeholder=\"\" [ngClass]=\"{'invalid': hasErrors()}\" />\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n @if (hasErrors()) {\n <div class=\"error-messages\">\n @for (errorMessage of getErrorMessage(); track errorMessage) {\n <div class=\"error-message\">{{ errorMessage }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">{{ control().formControl.value }}</div>\n }\n</div>","import { Component, effect, input } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-textarea',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-textarea.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteTextarea {\n inEdit = input<boolean>(true);\n control = input<FieldDto>({ label: '', formControl: new FormControl('') });\n \n // Make FormUtils available to the template\n readonly FormUtils = FormUtils;\n \n constructor() {\n effect(() => {\n // Initialization logic can go here if needed\n });\n }\n\n isRequired(): boolean {\n return FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n}\n","<div class=\"lite-textarea\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <textarea [formControl]=\"control().formControl\" placeholder=\"\" rows=\"{{ control().rows }}\" [ngClass]=\"{'invalid': hasErrors()}\"></textarea>\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n @if (hasErrors()) {\n <div class=\"error-messages\">\n @for (errorMessage of getErrorMessage(); track errorMessage) {\n <div class=\"error-message\">{{ errorMessage }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">{{ control().formControl.value }}</div>\n }\n</div>","import { Component, effect, input, ElementRef, HostListener } from '@angular/core';\nimport { SelectFieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-select',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-select.html`,\n styleUrls: [`../lite-styles.scss`],\n animations: [\n trigger('toggleView', [\n state('collapse', style({ height: 0, borderStyle: 'none' })),\n state('expand', style({ height: '*', borderStyle: 'solid' })),\n transition('collapse <=> expand', animate('300ms ease-in-out'))\n ])\n ]\n})\nexport class LiteSelect {\n inEdit = input<boolean>(true);\n control = input<SelectFieldDto>({ label: '', formControl: new FormControl(null), options: [], displayWith: (option) => option });\n showOptions = 'collapse';\n \n // Separate input text from FormControl value\n inputText = '';\n \n readonly FormUtils = FormUtils;\n \n constructor(private elementRef: ElementRef) {\n effect(() => {\n // Sync inputText with FormControl value when it changes\n const value = this.control().formControl.value;\n if (value && typeof value === 'object') {\n this.inputText = this.control().displayWith(value);\n } else if (!value) {\n this.inputText = '';\n }\n });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (this.showOptions === 'expand') {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.showOptions = 'collapse';\n }\n }\n }\n\n isRequired(): boolean {\n return FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n optionSelected(option: any): void {\n this.control().formControl.setValue(option);\n this.inputText = this.control().displayWith(option);\n this.showOptions = 'collapse';\n }\n\n onInputChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.inputText = target.value;\n // Note: FormControl value is only updated when a valid option is selected\n }\n\n onInputBlur(): void {\n this.showOptions = 'collapse';\n // If the typed text matches an option exactly, select it\n const matchingOption = this.control().options.find(option => \n this.control().displayWith(option).toLowerCase() === this.inputText.toLowerCase()\n );\n \n if (matchingOption) {\n this.control().formControl.setValue(matchingOption);\n this.inputText = this.control().displayWith(matchingOption);\n } else {\n // If no match and FormControl has a value, reset inputText to show the current selection\n const currentValue = this.control().formControl.value;\n if (currentValue && typeof currentValue === 'object') {\n this.inputText = this.control().displayWith(currentValue);\n }\n // If no current selection and no match, leave inputText as typed for user feedback\n }\n }\n\n getDisplayValue(): string {\n return this.inputText;\n }\n\n hasTypedValue(): boolean {\n // Check if user has typed something that doesn't match any option\n if (!this.inputText.trim()) return false;\n \n // Check if the current inputText matches any valid option's display value\n const matchesValidOption = this.control().options.some(option => \n this.control().displayWith(option).toLowerCase() === this.inputText.toLowerCase()\n );\n \n return !matchesValidOption;\n }\n\n getFilteredOptions(): any[] {\n if (!this.inputText.trim()) {\n return this.control().options;\n }\n \n return this.control().options.filter(option =>\n this.control().displayWith(option).toLowerCase().includes(this.inputText.toLowerCase())\n );\n }\n\n shouldShowPlaceholder(): boolean {\n // Only show placeholder when label is floating (not overlapping)\n return this.showOptions === 'expand' || !!this.getDisplayValue() || this.hasTypedValue();\n }\n}\n","<div class=\"lite-select\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <input type=\"text\" [value]=\"getDisplayValue()\" (input)=\"onInputChange($event)\" [ngClass]=\"{'selected': control().formControl.value, 'invalid': hasErrors()}\"\n (focus)=\"showOptions = 'expand'\" (blur)=\"onInputBlur()\" \n [placeholder]=\"shouldShowPlaceholder() ? 'Type to search...' : ''\" />\n <div class=\"options\" [@toggleView]=\"showOptions\">\n @for (option of getFilteredOptions(); track option) {\n <div class=\"option\" (click)=\"optionSelected(option)\">{{ control().displayWith(option) }}</div>\n }\n </div>\n <div class=\"label\" [ngClass]=\"{float: showOptions=='expand' || getDisplayValue() || hasTypedValue()}\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"arrow_box\" (click)=\"showOptions = showOptions === 'expand' ? 'collapse' : 'expand'\"><div class=\"arrow\"></div></div>\n @if (hasErrors()) {\n <div class=\"error-messages\">\n @for (errorMessage of getErrorMessage(); track errorMessage) {\n <div class=\"error-message\">{{ errorMessage }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">{{ control().displayWith(control().formControl.value) }}</div>\n }\n</div>","import { Component, effect, input, ElementRef, HostListener, ViewChild, AfterViewInit } from '@angular/core';\nimport { MultiSelectFieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-multi-select',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-multi-select.html`,\n styleUrls: [`../lite-styles.scss`],\n animations: [\n trigger('toggleView', [\n state('collapse', style({ height: 0, opacity: 0 })),\n state('expand', style({ height: '*', opacity: 1 })),\n transition('collapse <=> expand', animate('300ms ease-in-out'))\n ])\n ]\n})\nexport class LiteMultiSelect implements AfterViewInit {\n inEdit = input<boolean>(true);\n control = input<MultiSelectFieldDto>({ \n label: '', \n formControl: new FormControl<any[]>([], { nonNullable: true }), \n options: [], \n displayWith: (option) => option \n });\n showOptions = 'collapse';\n \n // Separate input text for filtering from FormControl values\n inputText = '';\n isFocused = false;\n \n // Separate text for filtering options (different from display text)\n private filterText = '';\n \n // Container height variable\n containerHeight = '36px';\n \n @ViewChild('selectedItemsRef', { static: false }) selectedItemsRef?: ElementRef;\n \n readonly FormUtils = FormUtils;\n \n constructor(private elementRef: ElementRef) {\n effect(() => {\n // Effect to react to FormControl value changes\n // Selected items are now displayed inline, so no need to update inputText\n const values = this.control().formControl.value || [];\n // Component will re-render automatically when values change\n });\n \n // Subscribe to value changes to update container height\n effect(() => {\n const formControl = this.control().formControl;\n if (formControl) {\n formControl.valueChanges.subscribe(() => {\n this.updateContainerHeight();\n });\n }\n });\n }\n\n ngAfterViewInit(): void {\n // ViewChild will be available after view init\n // Set initial container height\n this.updateContainerHeight();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (this.showOptions === 'expand') {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.showOptions = 'collapse';\n this.filterText = ''; // Clear filter when closing\n // No need to update display text since selected items are shown inline\n }\n }\n }\n\n isRequired(): boolean {\n return FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n optionToggled(option: any): void {\n // Set flag to prevent dropdown from closing\n const currentValues = this.control().formControl.value || [];\n const isSelected = this.isOptionSelected(option);\n let newValues: any[];\n if (isSelected) {\n // Remove option\n newValues = currentValues.filter(value => \n JSON.stringify(value) !== JSON.stringify(option)\n );\n } else {\n // Add option\n newValues = [...currentValues, option];\n }\n this.control().formControl.setValue(newValues);\n // Height will be updated by valueChanges subscription\n }\n\n isOptionSelected(option: any): boolean {\n const currentValues = this.control().formControl.value || [];\n return currentValues.some(value => \n JSON.stringify(value) === JSON.stringify(option)\n );\n }\n\n onInputChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.inputText = target.value;\n this.filterText = target.value;\n // Input is used for filtering only - display is handled by selected items\n }\n\n onInputFocus(): void {\n this.showOptions = 'expand';\n this.isFocused = true;\n this.inputText = '';\n this.filterText = '';\n }\n\n onInputBlur(): void {\n this.isFocused = false;\n }\n\n getDisplayValue(): string {\n // Always return filter text for the input - selected items are shown separately\n return this.filterText;\n }\n\n updateDisplayText(): void {\n // No longer needed to update inputText since selected items are shown inline\n // This method can be kept for compatibility but doesn't need to do anything\n }\n\n hasTypedValue(): boolean {\n // Check if user is typing (for filtering)\n if (!this.filterText.trim()) return false;\n const values = this.control().formControl.value || [];\n if (values.length === 0) return true;\n if (values.length === 1) {\n return this.filterText !== this.control().displayWith(values[0]);\n }\n return this.filterText !== `${values.length} items selected`;\n }\n\n getFilteredOptions(): any[] {\n if (!this.filterText.trim()) {\n return this.control().options;\n }\n return this.control().options.filter(option =>\n this.control().displayWith(option).toLowerCase().includes(this.filterText.toLowerCase())\n );\n }\n\n getSelectedCount(): number {\n const values = this.control().formControl.value || [];\n return values.length;\n }\n\n hasSelection(): boolean {\n return this.getSelectedCount() > 0;\n }\n\n getSelectedItems(): any[] {\n return this.control().formControl.value || [];\n }\n\n removeSelectedItem(item: any): void {\n const currentValues = this.control().formControl.value || [];\n const newValues = currentValues.filter(value => \n JSON.stringify(value) !== JSON.stringify(item)\n );\n this.control().formControl.setValue(newValues);\n // Height will be updated by valueChanges subscription\n }\n\n private updateContainerHeight(): void {\n // Schedule height calculation for next tick to ensure DOM is updated\n setTimeout(() => {\n if (this.selectedItemsRef?.nativeElement) {\n const naturalHeight = this.selectedItemsRef.nativeElement.getBoundingClientRect().height;\n const baseHeight = 36;\n const padding = 4;\n this.containerHeight = `${Math.max(baseHeight, naturalHeight + padding)}px`;\n console.log('Updated container height', this.containerHeight, naturalHeight);\n } else if (!this.hasSelection()) {\n this.containerHeight = '36px';\n }\n }, 0);\n }\n shouldFloat() {\n return this.showOptions === 'expand' || this.hasSelection() || this.hasTypedValue();\n }\n\n shouldShowPlaceholder(): boolean {\n // Show placeholder when filtering or when no items are selected\n return (this.isFiltering() || !this.hasSelection()) && this.shouldFloat();\n }\n\n isFiltering(): boolean {\n return !!this.filterText.trim();\n }\n}\n","<div class=\"lite-multi-select\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <div class=\"input-container\" \n [ngClass]=\"{'selected': hasSelection(), 'invalid': hasErrors()}\"\n [style.height]=\"containerHeight\">\n <!-- Selected items overlay on input -->\n @if (hasSelection() && !isFiltering() && !isFocused) {\n <div class=\"selected-items-inline\" #selectedItemsRef>\n @for (item of getSelectedItems(); track item) {\n <span class=\"selected-item-inline\">\n {{ control().displayWith(item) }}\n <button type=\"button\" class=\"remove-item-inline\" (click)=\"removeSelectedItem(item)\">×</button>\n </span>\n }\n </div>\n }\n <input type=\"text\" [value]=\"getDisplayValue()\" (input)=\"onInputChange($event)\" \n (focus)=\"onInputFocus()\" (blur)=\"onInputBlur()\"\n [placeholder]=\"shouldShowPlaceholder() ? 'Type to filter options...' : ''\" \n class=\"filter-input\" />\n </div>\n <div class=\"options\" [@toggleView]=\"showOptions\">\n <!-- Options list -->\n @for (option of getFilteredOptions(); track option) {\n <div class=\"option multi-option\" \n [ngClass]=\"{'selected': isOptionSelected(option)}\"\n (click)=\"optionToggled(option)\">\n <input type=\"checkbox\" [checked]=\"isOptionSelected(option)\" \n (click)=\"$event.stopPropagation(); optionToggled(option)\" readonly />\n <span class=\"option-text\">{{ control().displayWith(option) }}</span>\n </div>\n }\n @if (getFilteredOptions().length === 0) {\n <div class=\"no-options\">No options found</div>\n }\n </div>\n <div class=\"label\" [ngClass]=\"{float: shouldFloat()}\">\n {{ control().label }}<span *ngIf=\"isRequired()\">*</span>\n </div>\n <div class=\"arrow_box\" (click)=\"showOptions = showOptions === 'expand' ? 'collapse' : 'expand'\">\n <div class=\"arrow\"></div>\n </div>\n @if (hasErrors()) {\n <div class=\"error-messages\">\n @for (errorMessage of getErrorMessage(); track errorMessage) {\n <div class=\"error-message\">{{ errorMessage }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">\n @for (item of getSelectedItems(); track item) {\n <span class=\"item\">\n {{ control().displayWith(item) }}\n </span>\n }\n </div>\n }\n</div>\n","import { Component, input } from '@angular/core';\nimport { RadioFieldDto } from '../field-dto';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-radio',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: './lite-radio.html',\n styleUrls: ['../lite-styles.scss']\n})\nexport class LiteRadio {\n inEdit = input<boolean>(true);\n control = input<RadioFieldDto>({ \n label: '', \n formControl: new FormControl(''), \n options: [], \n displayWith: (option) => option \n });\n direction = input<'vertical' | 'horizontal'>('vertical');\n\n readonly FormUtils = FormUtils;\n\n isRequired(): boolean {\n return FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n onRadioChange(value: any): void {\n this.control().formControl.setValue(value);\n }\n\n isSelected(value: any): boolean {\n return this.control().formControl.value === value;\n }\n}\n","<div class=\"lite-radio\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <div class=\"radio-container\">\n <div class=\"label\" [ngClass]=\"{'float': true}\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"radio-options\" [ngClass]=\"{'horizontal': direction() === 'horizontal', 'vertical': direction() === 'vertical'}\">\n @for (option of control().options; track option) {\n <label class=\"radio-option\">\n <input type=\"radio\" [value]=\"option\" [checked]=\"isSelected(option)\"\n (change)=\"onRadioChange(option)\" [name]=\"control().label + '_radio'\" class=\"radio-input\" />\n <span class=\"radio-label\">{{ control().displayWith(option) }}</span>\n </label>\n }\n </div>\n </div>\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">\n @if (control().formControl.value) {\n {{ control().displayWith(control().formControl.value) }}\n } @else {\n <span class=\"no-value\">Not selected</span>\n }\n </div>\n }\n\n @if (inEdit() && hasErrors()) {\n <div class=\"error-messages\">\n @for (error of getErrorMessage(); track error) {\n <div class=\"error-message\">{{ error }}</div>\n }\n </div>\n }\n</div>\n","import { Component, effect, input } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-checkbox',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-checkbox.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteCheckbox {\n inEdit = input<boolean>(true);\n control = input<FieldDto>({ label: '', formControl: new FormControl<boolean>(false, { nonNullable: true }) });\n \n readonly FormUtils = FormUtils;\n\n constructor() {\n effect(() => {\n // console.log('LiteCheckbox initialized with control:', this.control());\n });\n }\n\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n onCheckboxChange(event: Event) {\n const target = event.target as HTMLInputElement;\n this.control().formControl.setValue(target.checked);\n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n }\n}\n","<div class=\"lite-checkbox\" [ngClass]=\"{'in-edit': inEdit(), 'invalid': hasErrors()}\">\n @if (inEdit()) {\n <div class=\"checkbox-container\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" \n [checked]=\"control().formControl.value\" \n (change)=\"onCheckboxChange($event)\"\n class=\"checkbox-input\" />\n <div class=\"checkbox-text\">{{ control().label }}<span *ngIf=\"isRequired()\" class=\"required\">*</span></div>\n\n </label>\n </div>\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">\n @if (control().formControl.value) {\n <span class=\"checked\">✓ Yes</span>\n } @else {\n <span class=\"unchecked\">✗ No</span>\n }\n </div>\n }\n\n @if (inEdit() && hasErrors()) {\n <div class=\"error-messages\">\n @for (error of getErrorMessage(); track error) {\n <div class=\"error-message\">{{ error }}</div>\n }\n </div>\n }\n</div>\n","import { Component, effect, input, signal, ElementRef, HostListener, computed } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\nimport { FieldDto } from '../field-dto';\n\ninterface CalendarDay {\n date: Date;\n day: number;\n isOtherMonth: boolean;\n isToday: boolean;\n isSelected: boolean;\n isRangeStart?: boolean;\n isRangeEnd?: boolean;\n isInRange?: boolean;\n}\n\nexport interface DateRangeFieldDto extends Omit<FieldDto, 'formControl'> {\n formControl: FormControl<string[]>;\n}\n\n@Component({\n selector: 'lite-date',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-date.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteDate {\n inEdit = input<boolean>(true);\n control = input<FieldDto | DateRangeFieldDto>({ \n label: '', \n formControl: new FormControl<string>('', { nonNullable: true }),\n });\n format = input<string>('dd/MM/yyyy');\n range = input<boolean>(false);\n \n // Calendar state\n currentMonth = signal<Date>(new Date());\n showCalendar = signal<boolean>(false);\n calendarPosition = signal<'bottom' | 'top'>('bottom');\n \n // Signal to track form control value changes for reactivity\n private formValueChangeSignal = signal<any>(null);\n \n // Second month for range selection\n secondMonth = computed(() => {\n const current = this.currentMonth();\n return new Date(current.getFullYear(), current.getMonth() + 1, 1);\n });\n \n // Computed calendar days - only recalculates when dependencies change\n calendarDays = computed(() => {\n // This makes the computed reactive to form value changes\n this.formValueChangeSignal();\n return this.getMonthDays(this.currentMonth());\n });\n \n // Second month calendar days for range mode\n secondCalendarDays = computed(() => {\n // This makes the computed reactive to form value changes\n this.formValueChangeSignal();\n return this.range() ? this.getMonthDays(this.secondMonth()) : [];\n });\n\n private getMonthDays(monthDate: Date): CalendarDay[] {\n const year = monthDate.getFullYear();\n const month = monthDate.getMonth();\n \n // First day of the month\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n \n const days: CalendarDay[] = [];\n const today = new Date();\n const selectedValue = this.control().formControl.value;\n \n // Handle both single date and date range\n let selectedDates: Date[] = [];\n let rangeStart: Date | null = null;\n let rangeEnd: Date | null = null;\n \n if (this.range()) {\n // Range mode - value should be string[]\n const rangeValue = selectedValue as string[];\n if (rangeValue && rangeValue.length > 0) {\n if (rangeValue[0]) {\n const startDate = new Date(rangeValue[0]);\n if (!isNaN(startDate.getTime())) {\n selectedDates.push(startDate);\n rangeStart = startDate;\n }\n }\n if (rangeValue[1]) {\n const endDate = new Date(rangeValue[1]);\n if (!isNaN(endDate.getTime())) {\n selectedDates.push(endDate);\n rangeEnd = endDate;\n }\n }\n }\n } else {\n // Single mode - value should be string\n const singleValue = selectedValue as string;\n if (singleValue) {\n const date = new Date(singleValue);\n if (!isNaN(date.getTime())) {\n selectedDates.push(date);\n }\n }\n }\n \n // Only add days from the current month\n const previousMonth = new Date(firstDay);\n while (previousMonth.getDay() !== 0) {\n previousMonth.setDate(previousMonth.getDate() - 1);\n days.unshift({\n date: new Date(previousMonth),\n day: previousMonth.getDate(),\n isOtherMonth: true,\n isToday: this.isSameDay(previousMonth, today),\n isSelected: selectedDates.some(selectedDate => this.isSameDay(previousMonth, selectedDate)),\n });\n }\n const currentDate = new Date(firstDay);\n while (currentDate <= lastDay) {\n const isToday = this.isSameDay(currentDate, today);\n const isSelected = selectedDates.some(selectedDate => this.isSameDay(currentDate, selectedDate));\n \n // Range styling flags\n const isRangeStart = rangeStart ? this.isSameDay(currentDate, rangeStart) : false;\n const isRangeEnd = rangeEnd ? this.isSameDay(currentDate, rangeEnd) : false;\n const isInRange = !!(rangeStart && rangeEnd && currentDate >= rangeStart && currentDate <= rangeEnd && !isRangeStart && !isRangeEnd);\n \n days.push({\n date: new Date(currentDate),\n day: currentDate.getDate(),\n isOtherMonth: false,\n isToday,\n isSelected,\n isRangeStart,\n isRangeEnd,\n isInRange\n });\n currentDate.setDate(currentDate.getDate() + 1);\n }\n const nextMonthDate = new Date(lastDay);\n while (nextMonthDate.getDay() < 6) {\n nextMonthDate.setDate(nextMonthDate.getDate() + 1);\n days.push({\n date: new Date(nextMonthDate),\n day: nextMonthDate.getDate(),\n isOtherMonth: true,\n isToday: this.isSameDay(nextMonthDate, today),\n isSelected: selectedDates.some(selectedDate => this.isSameDay(nextMonthDate, selectedDate)),\n });\n }\n return days;\n }\n \n readonly FormUtils = FormUtils;\n\n constructor(private elementRef: ElementRef) {\n effect(() => {\n const control = this.control();\n // console.log('LiteDate initialized with control:', control);\n \n // Subscribe to form control value changes to trigger reactivity\n if (control && control.formControl) {\n const subscription = control.formControl.valueChanges.subscribe(value => {\n console.log('Form value changed:', value);\n this.formValueChangeSignal.set(Date.now()); // Use timestamp to ensure change detection\n });\n \n // Initial trigger\n this.formValueChangeSignal.set(Date.now());\n }\n });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: Event): void {\n if (!this.elementRef.nativeElement.contains(event.target as Node)) {\n this.showCalendar.set(false);\n }\n }\n\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n onDateChange(event: Event) {\n const target = event.target as HTMLInputElement;\n const inputValue = target.value;\n \n if (!inputValue) {\n if (this.range()) {\n const newValue = ['', ''];\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n } else {\n (this.control().formControl as FormControl<string>).setValue('');\n this.formValueChangeSignal.set(Date.now());\n }\n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n return;\n }\n \n if (this.range()) {\n // Range mode - check if input contains \" - \" separator\n if (inputValue.includes(' - ')) {\n const rangeParts = inputValue.split(' - ');\n if (rangeParts.length === 2) {\n const startDateParsed = this.parseFormattedDate(rangeParts[0].trim(), this.format());\n const endDateParsed = this.parseFormattedDate(rangeParts[1].trim(), this.format());\n \n if (startDateParsed && endDateParsed) {\n // Store as ISO date strings for consistency\n const startIso = this.toLocalISOString(startDateParsed);\n const endIso = this.toLocalISOString(endDateParsed);\n \n // Ensure start date is before end date\n let newValue: string[];\n if (startDateParsed <= endDateParsed) {\n newValue = [startIso, endIso];\n } else {\n newValue = [endIso, startIso];\n }\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n } else {\n // If parsing fails, store the raw input values\n const newValue = [rangeParts[0].trim(), rangeParts[1].trim()];\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n }\n } else {\n // Invalid range format, store as single date\n const parsedDate = this.parseFormattedDate(inputValue, this.format());\n let newValue: string[];\n if (parsedDate) {\n const isoString = this.toLocalISOString(parsedDate);\n newValue = [isoString, ''];\n } else {\n newValue = [inputValue, ''];\n }\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n }\n } else {\n // Single date input in range mode\n const parsedDate = this.parseFormattedDate(inputValue, this.format());\n let newValue: string[];\n if (parsedDate) {\n const isoString = this.toLocalISOString(parsedDate);\n newValue = [isoString, ''];\n } else {\n newValue = [inputValue, ''];\n }\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n }\n } else {\n // Single mode - try to parse the formatted date input\n const parsedDate = this.parseFormattedDate(inputValue, this.format());\n let newValue: string;\n if (parsedDate) {\n // Store as ISO date string for consistency\n newValue = this.toLocalISOString(parsedDate);\n } else {\n // If parsing fails, store the raw input value\n newValue = inputValue;\n }\n (this.control().formControl as FormControl<string>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n }\n \n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n }\n\n private parseFormattedDate(dateString: string, format: string): Date | null {\n try {\n // Create a regex pattern from the format\n let pattern = format\n .replace('dd', '(\\\\d{1,2})')\n .replace('MM', '(\\\\d{1,2})')\n .replace('yyyy', '(\\\\d{4})');\n \n const regex = new RegExp(`^${pattern}$`);\n const match = dateString.match(regex);\n \n if (!match) return null;\n \n // Extract parts based on format\n let day: number, month: number, year: number;\n \n if (format === 'dd/MM/yyyy') {\n day = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n year = parseInt(match[3], 10);\n } else if (format === 'MM/dd/yyyy') {\n month = parseInt(match[1], 10) - 1; // Month is 0-indexed\n day = parseInt(match[2], 10);\n year = parseInt(match[3], 10);\n } else if (format === 'yyyy-MM-dd') {\n year = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n day = parseInt(match[3], 10);\n } else {\n // Default to dd/MM/yyyy\n day = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1;\n year = parseInt(match[3], 10);\n }\n \n const date = new Date(year, month, day);\n \n // Validate the date\n if (date.getFullYear() === year && \n date.getMonth() === month && \n date.getDate() === day) {\n return date;\n }\n \n return null;\n } catch {\n return null;\n }\n }\n\n getFormattedValue(): string {\n const value = this.control().formControl.value;\n if (!value) return '';\n \n if (this.range()) {\n // Range mode - value is string[]\n const rangeValue = value as string[];\n if (rangeValue && rangeValue.length >= 2) {\n const dates = [];\n if (rangeValue[0]) {\n const startDate = new Date(rangeValue[0]);\n if (!isNaN(startDate.getTime())) {\n dates.push(this.formatDate(startDate, this.format()));\n }\n }\n if (rangeValue[1]) {\n const endDate = new Date(rangeValue[1]);\n if (!isNaN(endDate.getTime())) {\n dates.push(this.formatDate(endDate, this.format()));\n }\n }\n if (dates.length === 2) {\n return `${dates[0]} - ${dates[1]}`;\n } else if (dates.length === 1) {\n return dates[0];\n }\n }\n return '';\n } else {\n // Single mode - value is string\n const singleValue = value as string;\n if (singleValue) {\n const date = new Date(singleValue);\n if (!isNaN(date.getTime())) {\n return this.formatDate(date, this.format());\n }\n return singleValue; // Return original value if invalid date\n }\n return '';\n }\n }\n\n getDisplayValue(): string {\n const value = this.control().formControl.value;\n if (!value) return 'Not selected';\n \n if (this.range()) {\n // Range mode - value is string[]\n const rangeValue = value as string[];\n if (rangeValue && rangeValue.length >= 2) {\n const dates = [];\n if (rangeValue[0]) {\n const startDate = new Date(rangeValue[0]);\n if (!isNaN(startDate.getTime())) {\n dates.push(this.formatDate(startDate, this.format()));\n }\n }\n if (rangeValue[1]) {\n const endDate = new Date(rangeValue[1]);\n if (!isNaN(endDate.getTime())) {\n dates.push(this.formatDate(endDate, this.format()));\n }\n }\n if (dates.length === 2) {\n return `${dates[0]} - ${dates[1]}`;\n } else if (dates.length === 1) {\n return dates[0];\n }\n }\n return 'Not selected';\n } else {\n // Single mode - value is string\n const singleValue = value as string;\n if (singleValue) {\n const date = new Date(singleValue);\n if (!isNaN(date.getTime())) {\n return this.formatDate(date, this.format());\n }\n return singleValue;\n }\n return 'Not selected';\n }\n }\n\n private formatDate(date: Date, format: string): string {\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear().toString();\n \n return format\n .replace('dd', day)\n .replace('MM', month)\n .replace('yyyy', year);\n }\n\n // Calendar methods\n toggleCalendar(): void {\n if (!this.showCalendar()) {\n this.calculateCalendarPosition();\n this.setCalendarToSelectedDate();\n }\n this.showCalendar.set(!this.showCalendar());\n }\n\n private setCalendarToSelectedDate(): void {\n const selectedValue = this.control().formControl.value;\n if (selectedValue) {\n let selectedDate: Date | null = null;\n \n if (this.range()) {\n // Range mode - use first date if available\n const rangeValue = selectedValue as string[];\n if (rangeValue && rangeValue.length > 0 && rangeValue[0]) {\n selectedDate = new Date(rangeValue[0]);\n }\n } else {\n // Single mode\n const singleValue = selectedValue as string;\n if (singleValue) {\n selectedDate = new Date(singleValue);\n }\n }\n \n if (selectedDate && !isNaN(selectedDate.getTime())) {\n // Set calendar to show the month of the selected date\n const selectedMonth = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1);\n this.currentMonth.set(selectedMonth);\n }\n }\n }\n\n private calculateCalendarPosition(): void {\n const element = this.elementRef.nativeElement;\n const rect = element.getBoundingClientRect();\n const calendarHeight = 300; // Approximate height of calendar panel\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n \n // If not enough space below and more space above, position on top\n if (spaceBelow < calendarHeight && spaceAbove > spaceBelow) {\n this.calendarPosition.set('top');\n } else {\n this.calendarPosition.set('bottom');\n }\n }\n\n getMonthYearDisplay(): string {\n const date = this.currentMonth();\n return date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n }\n\n getSecondMonthYearDisplay(): string {\n const date = this.secondMonth();\n return date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n }\n\n previousMonth(): void {\n const current = this.currentMonth();\n const newDate = new Date(current.getFullYear(), current.getMonth() - 1, 1);\n this.currentMonth.set(newDate);\n }\n\n nextMonth(): void {\n const current = this.currentMonth();\n const newDate = new Date(current.getFullYear(), current.getMonth() + 1, 1);\n this.currentMonth.set(newDate);\n }\n\n selectDate(day: CalendarDay): void {\n const dateString = this.toLocalISOString(day.date);\n \n if (this.range()) {\n // Range mode - handle start and end date selection\n const currentValue = this.control().formControl.value as string[];\n const currentRange = currentValue || ['', ''];\n \n if (!currentRange[0] || (currentRange[0] && currentRange[1])) {\n // Set start date if no start date or both dates are set (reset)\n // Clear any existing range formatting by setting only the start date\n const newValue = [dateString, ''];\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n } else {\n // Set end date\n const startDate = new Date(currentRange[0]);\n const endDate = new Date(dateString);\n \n // Check if clicking the same date as start date\n if (this.isSameDay(startDate, endDate)) {\n // Reset to just the start date\n const newValue = [dateString, ''];\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n } else {\n // Ensure start date is before end date\n let newValue: string[];\n if (startDate <= endDate) {\n newValue = [currentRange[0], dateString];\n } else {\n newValue = [dateString, currentRange[0]];\n }\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n \n // Auto-hide calendar after 1 second when second date is selected\n setTimeout(() => {\n this.showCalendar.set(false);\n }, 1000);\n }\n }\n } else {\n // Single mode\n (this.control().formControl as FormControl<string>).setValue(dateString);\n this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n this.showCalendar.set(false); // Close calendar after selection\n }\n \n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n }\n\n private isSameDay(date1: Date, date2: Date): boolean {\n return date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate();\n }\n\n // Helper method to convert Date to ISO date string without timezone conversion\n private toLocalISOString(date: Date): string {\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n}\n","<div class=\"lite-date\" [ngClass]=\"{'in-edit': inEdit(), 'invalid': hasErrors()}\">\n @if (inEdit()) {\n <input type=\"text\" \n [value]=\"getFormattedValue()\" \n (change)=\"onDateChange($event)\"\n [class.invalid]=\"hasErrors()\"\n [placeholder]=\"range() ? format() + ' - ' + format() : format()\" />\n <label class=\"label\" [ngClass]=\"{'float': getFormattedValue()}\">\n {{ control().label }}<span *ngIf=\"isRequired()\">*</span>\n </label>\n <div class=\"calendar_icon\" (click)=\"toggleCalendar()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"calendar\" viewBox=\"0 0 16 16\">\n <path d=\"M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1.5A1.5 1.5 0 0 1 16 2.5v11A1.5 1.5 0 0 1 14.5 15H1.5A1.5 1.5 0 0 1 0 13.5v-11A1.5 1.5 0 0 1 1.5 1H3V.5a.5.5 0 0 1 .5-.5zM1.5 2a.5.5 0 0 0-.5.5V4h14V2.5a.5.5 0 0 0-.5-.5H13v.5a.5.5 0 0 1-1 0V2H4v.5a.5.5 0 0 1-1 0V2H1.5zM15 5H1v8.5a.5.5 0 0 0 .5.5h13a.5.5 0 0 0 .5-.5V5z\"/>\n </svg>\n </div>\n \n @if (showCalendar()) {\n <div class=\"calendar-overlay\" [ngClass]=\"'position-' + calendarPosition()\">\n <ng-container *ngTemplateOutlet=\"calendarPanel\"></ng-container>\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">\n {{ getDisplayValue() }}\n </div>\n }\n\n @if (inEdit() && hasErrors()) {\n <div class=\"error-messages\">\n @for (error of getErrorMessage(); track error) {\n <div class=\"error-message\">{{ error }}</div>\n }\n </div>\n }\n</div>\n<ng-template #calendarPanel>\n <div class=\"calendar-panel\" [ngClass]=\"{'range-mode': range()}\">\n @if (range()) {\n <!-- Range mode: Two month calendars side by side -->\n <div class=\"dual-calendar\">\n <!-- First month -->\n <div class=\"calendar-month\">\n <div class=\"calendar-header\">\n <button type=\"button\" class=\"nav-button\" (click)=\"previousMonth()\">‹</button>\n <span class=\"month-year\">{{ getMonthYearDisplay() }}</span>\n <div class=\"nav-spacer\"></div>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"weekdays\">\n <div class=\"weekday\">Su</div>\n <div class=\"weekday\">Mo</div>\n <div class=\"weekday\">Tu</div>\n <div class=\"weekday\">We</div>\n <div class=\"weekday\">Th</div>\n <div class=\"weekday\">Fr</div>\n <div class=\"weekday\">Sa</div>\n </div>\n <div class=\"calendar-days\">\n @for (day of calendarDays(); track day.date) {\n <div class=\"calendar-day\" [ngClass]=\"{ \n 'today': day.isToday, \n 'selected': day.isSelected,\n 'dim': day.isOtherMonth,\n 'range-start': day.isRangeStart,\n 'range-end': day.isRangeEnd,\n 'in-range': day.isInRange\n }\" (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n }\n </div>\n </div>\n </div>\n \n <!-- Second month -->\n <div class=\"calendar-month\">\n <div class=\"calendar-header\">\n <div class=\"nav-spacer\"></div>\n <span class=\"month-year\">{{ getSecondMonthYearDisplay() }}</span>\n <button type=\"button\" class=\"nav-button\" (click)=\"nextMonth()\">›</button>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"weekdays\">\n <div class=\"weekday\">Su</div>\n <div class=\"weekday\">Mo</div>\n <div class=\"weekday\">Tu</div>\n <div class=\"weekday\">We</div>\n <div class=\"weekday\">Th</div>\n <div class=\"weekday\">Fr</div>\n <div class=\"weekday\">Sa</div>\n </div>\n <div class=\"calendar-days\">\n @for (day of secondCalendarDays(); track day.date) {\n <div class=\"calendar-day\" [ngClass]=\"{ \n 'today': day.isToday, \n 'selected': day.isSelected,\n 'dim': day.isOtherMonth,\n 'range-start': day.isRangeStart,\n 'range-end': day.isRangeEnd,\n 'in-range': day.isInRange\n }\" (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n } @else {\n <!-- Single month mode -->\n <div class=\"calendar-header\">\n <button type=\"button\" class=\"nav-button\" (click)=\"previousMonth()\">‹</button>\n <span class=\"month-year\">{{ getMonthYearDisplay() }}</span>\n <button type=\"button\" class=\"nav-button\" (click)=\"nextMonth()\">›</button>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"weekdays\">\n <div class=\"weekday\">Su</div>\n <div class=\"weekday\">Mo</div>\n <div class=\"weekday\">Tu</div>\n <div class=\"weekday\">We</div>\n <div class=\"weekday\">Th</div>\n <div class=\"weekday\">Fr</div>\n <div class=\"weekday\">Sa</div>\n </div>\n <div class=\"calendar-days\">\n @for (day of calendarDays(); track day.date) {\n <div class=\"calendar-day\" [ngClass]=\"{ \n 'today': day.isToday, \n 'selected': day.isSelected,\n 'dim': day.isOtherMonth,\n 'range-start': day.isRangeStart,\n 'range-end': day.isRangeEnd,\n 'in-range': day.isInRange\n }\" (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n }\n </div>\n </div>\n }\n </div>\n</ng-template>\n","import { Component, effect, input, signal, computed } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-password',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-password.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LitePassword {\n inEdit = input<boolean>(true);\n control = input<FieldDto>({ label: '', formControl: new FormControl('') });\n showToggle = input<boolean>(true);\n showStrengthIndicator = input<boolean>(false);\n \n readonly FormUtils = FormUtils;\n showPassword = signal<boolean>(false);\n\n // Computed password strength analysis\n passwordStrength = computed(() => {\n const password = this.control().formControl.value || '';\n return FormUtils.analyzePasswordStrength(password);\n });\n\n constructor() {\n effect(() => {\n // console.log('LitePassword initialized with control:', this.control());\n });\n }\n\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getPasswordErrorMessages(this.control().formControl, this.control().label);\n }\n\n togglePasswordVisibility() {\n this.showPassword.set(!this.showPassword());\n }\n\n getInputType(): string {\n return this.showPassword() ? 'text' : 'password';\n }\n\n getDisplayValue(): string {\n const value = this.control().formControl.value;\n return value ? '••••••••' : '';\n }\n}\n","<div class=\"lite-password\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <div class=\"input-container\">\n <input \n [type]=\"getInputType()\" \n [formControl]=\"control().formControl\" \n placeholder=\"\" \n [ngClass]=\"{'invalid': hasErrors()}\" />\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n @if (showToggle() && control().formControl.value) {\n <button \n type=\"button\" \n class=\"toggle-button\" \n (click)=\"togglePasswordVisibility()\"\n [attr.aria-label]=\"showPassword() ? 'Hide password' : 'Show password'\">\n @if (showPassword()) {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/>\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/>\n </svg>\n } @else {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n </svg>\n }\n </button>\n }\n </div>\n @if (showStrengthIndicator() && control().formControl.value) {\n <div class=\"password-strength\">\n <div class=\"strength-bar\">\n <div class=\"strength-fill\" [ngClass]=\"'strength-' + passwordStrength().level.toLowerCase().replace(' ', '-')\"></div>\n </div>\n <div class=\"strength-info\">\n <span class=\"strength-level\" [ngClass]=\"'level-' + passwordStrength().level.toLowerCase().replace(' ', '-')\">\n {{ passwordStrength().level }}\n </span>\n <span class=\"strength-score\">({{ passwordStrength().score }}/8)</span>\n </div>\n @if (passwordStrength().feedback.length > 0) {\n <div class=\"strength-feedback\">\n @for (tip of passwordStrength().feedback; track tip) {\n <div class=\"feedback-tip\">• {{ tip }}</div>\n }\n </div>\n }\n </div>\n }\n @if (hasErrors()) {\n <div class=\"error-messages\">\n @for (errorMessage of getErrorMessage(); track errorMessage) {\n <div class=\"error-message\">{{ errorMessage }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">{{ getDisplayValue() }}</div>\n }\n</div>\n","import { Component, effect, input, signal, computed, ViewChild, ElementRef } from '@angular/core';\nimport { FieldDto, FileFieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nexport interface FileItem {\n id: string;\n file: File;\n name: string;\n size: number;\n type: string;\n url?: string;\n uploadProgress?: number;\n isUploading?: boolean;\n error?: string;\n}\n\n@Component({\n selector: 'lite-file',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-file.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteFile {\n file_icon = `<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"file-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n <polyline points=\"14,2 14,8 20,8\"></polyline><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line>\n <polyline points=\"10,9 9,9 8,9\"></polyline></svg>`\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n @ViewChild('cameraInput') cameraInput!: ElementRef<HTMLInputElement>;\n\n inEdit = input<boolean>(true);\n control = input<FileFieldDto>({ label: '', formControl: new FormControl<FileItem[]>([]) });\n \n readonly FormUtils = FormUtils;\n \n // State signals\n files = signal<FileItem[]>([]);\n showPanel = signal<boolean>(false);\n isDragOver = signal<boolean>(false);\n isUploading = signal<boolean>(false);\n\n // Computed values\n fileCount = computed(() => this.files().length);\n totalSize = computed(() => \n this.files().reduce((total, file) => total + file.size, 0)\n );\n hasErrors = computed(() => \n this.files().some(file => file.error)\n );\n \n // Get configuration from control\n multiple = computed(() => this.control().multiple ?? true);\n accept = computed(() => this.control().accept ?? '*/*');\n maxFileSize = computed(() => this.control().maxFileSize ?? 10 * 1024 * 1024);\n maxFiles = computed(() => this.control().maxFiles ?? 10);\n showPreview = computed(() => this.control().showPreview ?? true);\n\n constructor(private sanitizer: DomSanitizer) {\n effect(() => {\n // console.log('LiteFile initialized with control:', this.control());\n \n // Sync files with form control\n const controlValue = this.control().formControl.value || [];\n if (Array.isArray(controlValue)) {\n this.files.set(controlValue);\n }\n });\n\n // Watch files changes and update form control\n effect(() => {\n const currentFiles = this.files();\n this.control().formControl.setValue(currentFiles);\n });\n }\n\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasFormErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n // File operations\n onFileSelect(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n this.handleFiles(Array.from(input.files));\n }\n // Reset input\n input.value = '';\n }\n\n onCameraCapture(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n this.handleFiles(Array.from(input.files));\n }\n // Reset input\n input.value = '';\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(true);\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n\n const files = Array.from(event.dataTransfer?.files || []);\n this.handleFiles(files);\n }\n svgToBase64DataUrl(svgString: string): SafeHtml {\n const base64 = btoa(svgString);\n const img = `data:image/svg+xml;base64,${base64}`;\n return this.sanitizer.bypassSecurityTrustUrl(img);\n }\n\n private handleFiles(newFiles: File[]) {\n const currentFiles = this.files();\n const processedFiles: FileItem[] = [];\n\n for (const file of newFiles) {\n // Check file count limit\n if (!this.multiple() && currentFiles.length >= 1) {\n console.warn('Multiple files not allowed');\n break;\n }\n\n if (currentFiles.length + processedFiles.length >= this.maxFiles()) {\n console.warn(`Maximum ${this.maxFiles()} files allowed`);\n break;\n }\n\n // Validate file\n const validation = this.validateFile(file);\n \n const fileItem: FileItem = {\n id: this.generateFileId(),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n error: validation.error\n };\n\n // Create preview URL for images\n if (this.showPreview() && file.type.startsWith('image/')) {\n fileItem.url = URL.createObjectURL(file);\n }\n\n processedFiles.push(fileItem);\n }\n\n // Update files\n if (this.multiple()) {\n this.files.set([...currentFiles, ...processedFiles]);\n } else {\n this.files.set(processedFiles.slice(0, 1));\n }\n }\n\n private validateFile(file: File): { valid: boolean; error?: string } {\n // Check file size\n if (file.size > this.maxFileSize()) {\n return {\n valid: false,\n error: `File size exceeds ${this.formatFileSize(this.maxFileSize())}`\n };\n }\n\n // Check file type if accept is specified\n const acceptTypes = this.accept();\n if (acceptTypes && acceptTypes !== '*/*') {\n const allowedTypes = acceptTypes.split(',').map((type: string) => type.trim());\n const isAllowed = allowedTypes.some((allowedType: string) => {\n if (allowedType.startsWith('.')) {\n return file.name.toLowerCase().endsWith(allowedType.toLowerCase());\n }\n return file.type.match(new RegExp(allowedType.replace('*', '.*')));\n });\n\n if (!isAllowed) {\n return {\n valid: false,\n error: `File type not allowed. Accepted: ${acceptTypes}`\n };\n }\n }\n\n return { valid: true };\n }\n\n removeFile(fileId: string) {\n const currentFiles = this.files();\n const fileToRemove = currentFiles.find(f => f.id === fileId);\n \n // Revoke object URL to prevent memory leaks\n if (fileToRemove?.url) {\n URL.revokeObjectURL(fileToRemove.url);\n }\n\n this.files.set(currentFiles.filter(f => f.id !== fileId));\n }\n\n clearAllFiles() {\n // Revoke all object URLs\n this.files().forEach(file => {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n });\n\n this.files.set([]);\n }\n\n // UI actions\n togglePanel() {\n this.showPanel.set(!this.showPanel());\n }\n\n closePanel() {\n this.showPanel.set(false);\n }\n\n openFileDialog() {\n this.fileInput.nativeElement.click();\n }\n\n openCameraDialog() {\n this.cameraInput.nativeElement.click();\n }\n\n // Utility methods\n private generateFileId(): string {\n return Math.random().toString(36).substr(2, 9);\n }\n\n formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n\n getFileIcon(fileType: string): string {\n if (fileType.startsWith('image/')) return '🖼️';\n if (fileType.startsWith('video/')) return '🎥';\n if (fileType.startsWith('audio/')) return '🎵';\n if (fileType.includes('pdf')) return '📄';\n if (fileType.includes('word')) return '📝';\n if (fileType.includes('excel') || fileType.includes('spreadsheet')) return '📊';\n if (fileType.includes('powerpoint') || fileType.includes('presentation')) return '📋';\n if (fileType.includes('zip') || fileType.includes('rar')) return '🗜️';\n return '📁';\n }\n\n isImage(fileType: string): boolean {\n return fileType.startsWith('image/');\n }\n\n getTotalSizeFormatted(): string {\n return this.formatFileSize(this.totalSize());\n }\n}\n","<div class=\"lite-file\" [class.in-edit]=\"inEdit()\">\n <label class=\"label\" [class.required]=\"isRequired()\">{{ control().label }}</label>\n <button [class.has-files]=\"fileCount() > 0\" [class.has-errors]=\"hasErrors()\" (click)=\"togglePanel()\">\n <img [src]=\"svgToBase64DataUrl(file_icon)\" alt=\"file icon\">\n <!-- Badge -->\n <span class=\"file-badge\">\n {{ fileCount() }}\n </span>\n </button>\n\n</div>\n<!-- Panel overlay -->\n<div class=\"panel-overlay\" \n [class.visible]=\"showPanel()\" \n (click)=\"closePanel()\">\n</div>\n<!-- Management panel -->\n<div class=\"file-panel\" [class.visible]=\"showPanel()\">\n <div class=\"panel-header\">\n <h3>File Management</h3>\n <button (click)=\"closePanel()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n\n <div class=\"panel-content\">\n <!-- File upload area -->\n <div class=\"upload-area\" \n [class.drag-over]=\"isDragOver()\"\n [class.uploading]=\"isUploading()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n (click)=\"openFileDialog()\">\n \n <div class=\"upload-content\">\n <svg class=\"upload-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"7,10 12,15 17,10\"></polyline>\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\n </svg>\n <p>Drop files here or click to browse</p>\n <small>Max {{ maxFiles() }} files, {{ formatFileSize(maxFileSize()) }} each</small>\n </div>\n\n <!-- Hidden file inputs -->\n <input #fileInput\n type=\"file\"\n [multiple]=\"multiple()\"\n [accept]=\"accept()\"\n (change)=\"onFileSelect($event)\"\n style=\"display: none;\">\n\n <input #cameraInput\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n (change)=\"onCameraCapture($event)\"\n style=\"display: none;\">\n </div>\n\n <!-- Action buttons -->\n <div class=\"action-buttons\">\n <button type=\"button\" class=\"action-btn upload-btn\" (click)=\"openFileDialog()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"17,8 12,3 7,8\"></polyline>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"></line>\n </svg>\n Upload Files\n </button>\n\n <button type=\"button\" class=\"action-btn camera-btn\" (click)=\"openCameraDialog()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"></path>\n <circle cx=\"12\" cy=\"13\" r=\"4\"></circle>\n </svg>\n Take Picture\n </button>\n\n <button type=\"button\" class=\"action-btn close-btn\" (click)=\"closePanel()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n Close\n </button>\n </div>\n\n <!-- File list -->\n <div class=\"file-list\" *ngIf=\"fileCount() > 0\">\n <div class=\"file-list-header\">\n <span>Files ({{ fileCount() }})</span>\n <span class=\"total-size\">{{ getTotalSizeFormatted() }}</span>\n <button type=\"button\" class=\"clear-all-btn\" (click)=\"clearAllFiles()\">\n Clear All\n </button>\n </div>\n\n <div class=\"file-items\">\n <div class=\"file-item\" \n *ngFor=\"let file of files()\" \n [class.has-error]=\"file.error\"\n [class.uploading]=\"file.isUploading\">\n \n <!-- File preview/icon -->\n <div class=\"file-preview\">\n <img *ngIf=\"file.url && isImage(file.type)\" \n [src]=\"file.url\" \n [alt]=\"file.name\"\n class=\"preview-image\">\n <span *ngIf=\"!file.url || !isImage(file.type)\" \n class=\"file-type-icon\">\n {{ getFileIcon(file.type) }}\n </span>\n </div>\n\n <!-- File info -->\n <div class=\"file-info\">\n <div class=\"file-name\" [title]=\"file.name\">{{ file.name }}</div>\n <div class=\"file-details\">\n <span class=\"file-size\">{{ formatFileSize(file.size) }}</span>\n <span class=\"file-type\">{{ file.type || 'Unknown' }}</span>\n </div>\n <div class=\"file-error\" *ngIf=\"file.error\">{{ file.error }}</div>\n \n <!-- Upload progress -->\n <div class=\"upload-progress\" *ngIf=\"file.isUploading && file.uploadProgress !== undefined\">\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width.%]=\"file.uploadProgress\"></div>\n </div>\n <span class=\"progress-text\">{{ file.uploadProgress }}%</span>\n </div>\n </div>\n\n <!-- Remove button -->\n <button type=\"button\" \n class=\"remove-file-btn\" \n (click)=\"removeFile(file.id)\"\n [disabled]=\"file.isUploading\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"3,6 5,6 21,6\"></polyline>\n <path d=\"M19,6v14a2,2,0,0,1-2,2H7a2,2,0,0,1-2-2V6m3,0V4a2,2,0,0,1,2-2h4a2,2,0,0,1,2,2V6\"></path>\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"></line>\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"></line>\n </svg>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Empty state -->\n <div class=\"empty-state\" *ngIf=\"fileCount() === 0\">\n <svg class=\"empty-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n <polyline points=\"14,2 14,8 20,8\"></polyline>\n </svg>\n <p>No files uploaded yet</p>\n <small>Click upload or drag files to get started</small>\n </div>\n </div>\n</div>\n\n<!-- Error messages -->\n<div class=\"error-messages\" *ngIf=\"hasFormErrors()\">\n <div class=\"error-message\" *ngFor=\"let error of getErrorMessage()\">{{ error }}</div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LiteInput } from './lite-input/lite-input';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { LiteTextarea } from './lite-textarea/lite-textarea';\nimport { LiteSelect } from './lite-select/lite-select';\nimport { LiteMultiSelect } from './lite-multi-select/lite-multi-select';\nimport { LiteRadio } from './lite-radio/lite-radio';\nimport { LiteCheckbox } from './lite-checkbox/lite-checkbox';\nimport { LiteDate } from './lite-date/lite-date';\nimport { LitePassword } from './lite-password/lite-password';\nimport { LiteFile } from './lite-file/lite-file';\nimport { LiteDateTime } from '../public-api';\n\n@NgModule({\n imports: [\n CommonModule, FormsModule, ReactiveFormsModule,\n LiteInput, LiteTextarea, LiteSelect, LiteMultiSelect, LiteRadio, LiteCheckbox, LiteDate, LitePassword, LiteFile, LiteDateTime\n ],\n exports: [\n LiteInput, LiteTextarea, LiteSelect, LiteMultiSelect, LiteRadio, LiteCheckbox, LiteDate, LitePassword, LiteFile, LiteDateTime\n ]\n})\nexport class LiteFormModule { }","import { Form, FormControl } from \"@angular/forms\";\n\nexport class FieldDto {\n label: string;\n formControl: FormControl;\n rows?: number;\n type?: 'text' | 'number';\n\n constructor(label: string, formControl: FormControl, rows: number = 2, type: 'text' | 'number' = 'text') {\n this.label = label;\n this.formControl = formControl;\n this.rows = rows;\n this.type = type;\n }\n}\n\nexport abstract class BaseSelectFieldDto<T = any> {\n label: string;\n options: T[];\n displayWith: (option: T) => string;\n \n constructor(\n label: string,\n options: T[],\n displayWith: (option: T) => string\n ) {\n this.label = label;\n this.options = options;\n this.displayWith = displayWith;\n }\n}\n\nexport class SelectFieldDto<T = any> extends BaseSelectFieldDto<T> {\n formControl: FormControl<T>;\n \n constructor(\n label: string,\n formControl: FormControl<T>,\n options: T[],\n displayWith: (option: T) => string\n ) {\n super(label, options, displayWith);\n this.formControl = formControl;\n }\n}\n\nexport class MultiSelectFieldDto<T = any> extends BaseSelectFieldDto<T> {\n formControl: FormControl<T[]>;\n \n constructor(\n label: string,\n formControl: FormControl<T[]>,\n options: T[],\n displayWith: (option: T) => string\n ) {\n super(label, options, displayWith);\n this.formControl = formControl;\n }\n}\n\nexport class RadioFieldDto<T = any> extends BaseSelectFieldDto<T> {\n formControl: FormControl<T>;\n \n constructor(\n label: string,\n formControl: FormControl<T>,\n options: T[],\n displayWith: (option: T) => string\n ) {\n super(label, options, displayWith);\n this.formControl = formControl;\n }\n}\n\nexport class FileFieldDto {\n label: string;\n formControl: FormControl;\n multiple?: boolean;\n accept?: string;\n maxFileSize?: number;\n maxFiles?: number;\n showPreview?: boolean;\n\n constructor(\n label: string,\n formControl: FormControl,\n multiple: boolean = true,\n accept: string = '*/*',\n maxFileSize: number = 10 * 1024 * 1024, // 10MB\n maxFiles: number = 10,\n showPreview: boolean = true\n ) {\n this.label = label;\n this.formControl = formControl;\n this.multiple = multiple;\n this.accept = accept;\n this.maxFileSize = maxFileSize;\n this.maxFiles = maxFiles;\n this.showPreview = showPreview;\n }\n}","import { Component, effect, input, signal, ElementRef, HostListener, computed } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\nimport { FieldDto } from '../field-dto';\n\ninterface CalendarDateTime {\n date: Date;\n day: number;\n isOtherMonth: boolean;\n isToday: boolean;\n isSelected: boolean;\n}\n\n@Component({\n selector: 'lite-datetime',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-datetime.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteDateTime {\n inEdit = input<boolean>(true);\n control = input<FieldDto>({ \n label: '', \n formControl: new FormControl<string>('', { nonNullable: true }),\n });\n format = input<string>('dd/MM/yyyy HH:mm');\n \n // Calendar state\n currentMonth = signal<Date>(new Date());\n showCalendar = signal<boolean>(false);\n calendarPosition = signal<'bottom' | 'top'>('bottom');\n formattedValue = signal<string>('');\n hourSet = new Array(24).fill(0).map((_, i) => i);\n minSet = new Array(12).fill(0).map((_, i) => i * 5);\n selectedHour = new Date().getHours();\n selectedMinute = 0;\n selectedDateTime: CalendarDateTime | null = null;\n // Signal to track form control value changes for reactivity\n // private formValueChangeSignal = signal<any>(null);\n \n // Computed calendar days - only recalculates when dependencies change\n calendarDays = computed(() => {\n // This makes the computed reactive to form value changes\n // this.formValueChangeSignal();\n return this.getMonthDays(this.currentMonth());\n });\n\n private getMonthDays(monthDate: Date): CalendarDateTime[] {\n const year = monthDate.getFullYear();\n const month = monthDate.getMonth();\n \n // First day of the month\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n \n const days: CalendarDateTime[] = [];\n const today = new Date();\n const value = this.control().formControl.value;\n\n // Single mode - value should be string\n if (value) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n this.selectedDateTime = {\n date,\n day: date.getDate(),\n isOtherMonth: false,\n isToday: this.isSameDay(date, today),\n isSelected: true,\n };\n }\n }\n \n // Only add days from the current month\n const previousMonthDate = new Date(firstDay);\n while (previousMonthDate.getDay() !== 0) {\n previousMonthDate.setDate(previousMonthDate.getDate() - 1);\n days.unshift({\n date: new Date(previousMonthDate),\n day: previousMonthDate.getDate(),\n isOtherMonth: true,\n isToday: this.isSameDay(previousMonthDate, today),\n isSelected: this.isSameDay(previousMonthDate, this.selectedDateTime ? this.selectedDateTime.date : null),\n });\n }\n const currentDate = new Date(firstDay);\n while (currentDate <= lastDay) {\n const isToday = this.isSameDay(currentDate, today);\n const isSelected = this.isSameDay(currentDate, this.selectedDateTime ? this.selectedDateTime.date : null);\n days.push({\n date: new Date(currentDate),\n day: currentDate.getDate(),\n isOtherMonth: false,\n isToday,\n isSelected,\n });\n currentDate.setDate(currentDate.getDate() + 1);\n }\n const nextMonthDate = new Date(lastDay);\n while (nextMonthDate.getDay() < 6) {\n nextMonthDate.setDate(nextMonthDate.getDate() + 1);\n days.push({\n date: new Date(nextMonthDate),\n day: nextMonthDate.getDate(),\n isOtherMonth: true,\n isToday: this.isSameDay(nextMonthDate, today),\n isSelected: this.isSameDay(nextMonthDate, this.selectedDateTime ? this.selectedDateTime.date : null),\n });\n }\n return days;\n }\n \n readonly FormUtils = FormUtils;\n\n constructor(private elementRef: ElementRef) {\n effect(() => {\n const control = this.control();\n // console.log('LiteDateTime with control:', control);\n \n // Subscribe to form control value changes to trigger reactivity\n if (control && control.formControl) {\n control.formControl.valueChanges.subscribe(value => {\n if (value) {\n const date = new Date(value);\n // console.log('Form value changed:', value, date, isNaN(date.getTime()));\n if (!isNaN(date.getTime())) {\n console.log('Formatted Date:', this.formatDate(date, this.format()))\n this.formattedValue.set(this.formatDate(date, this.format()));\n } else {\n this.formattedValue.set(value);\n }\n }\n });\n }\n });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: Event): void {\n if (!this.elementRef.nativeElement.contains(event.target as Node)) {\n this.showCalendar.set(false);\n }\n }\n\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n onDateChange(event: Event) {\n const target = event.target as HTMLInputElement;\n const inputValue = target.value;\n \n if (!inputValue) {\n (this.control().formControl as FormControl<string>).setValue('');\n // this.formValueChangeSignal.set(Date.now());\n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n return;\n }\n \n\n // Single mode - try to parse the formatted date input\n const parsedDate = this.parseFormattedDate(inputValue, this.format());\n let newValue: string;\n if (parsedDate) {\n // Store as ISO date string for consistency\n newValue = this.toLocalISOString(parsedDate);\n } else {\n // If parsing fails, store the raw input value\n newValue = inputValue;\n }\n (this.control().formControl as FormControl<string>).setValue(newValue);\n // this.formValueChangeSignal.set(Date.now());\n \n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n }\n onSelectHour(hour: number) {\n this.selectedHour = hour;\n this.setDateTimeSelected(this.selectedDateTime ? this.selectedDateTime.date : new Date());\n }\n onSelectMinute(minute: number) {\n this.selectedMinute = minute;\n this.setDateTimeSelected(this.selectedDateTime ? this.selectedDateTime.date : new Date());\n }\n private setDateTimeSelected(date: Date): void {\n this.selectedDateTime = {\n date,\n day: date.getDate(),\n isOtherMonth: false,\n isToday: date.getDate() === new Date().getDate(),\n isSelected: true,\n };\n const dateString = this.toLocalISOString(this.selectedDateTime.date);\n (this.control().formControl as FormControl<string>).setValue(dateString);\n const calDate = this.calendarDays().find(d => this.isSameDay(d.date, date));\n if (calDate) {calDate.isSelected = true;}\n }\n private parseFormattedDate(dateString: string, format: string): Date | null {\n try {\n // Create a regex pattern from the format\n let pattern = format\n .replace('dd', '(\\\\d{1,2})')\n .replace('MM', '(\\\\d{1,2})')\n .replace('yyyy', '(\\\\d{4})');\n \n const regex = new RegExp(`^${pattern}$`);\n const match = dateString.match(regex);\n \n if (!match) return null;\n \n // Extract parts based on format\n let day: number, month: number, year: number;\n \n if (format === 'dd/MM/yyyy') {\n day = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n year = parseInt(match[3], 10);\n } else if (format === 'MM/dd/yyyy') {\n month = parseInt(match[1], 10) - 1; // Month is 0-indexed\n day = parseInt(match[2], 10);\n year = parseInt(match[3], 10);\n } else if (format === 'yyyy-MM-dd') {\n year = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n day = parseInt(match[3], 10);\n } else {\n // Default to dd/MM/yyyy\n day = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1;\n year = parseInt(match[3], 10);\n }\n \n const date = new Date(year, month, day);\n \n // Validate the date\n if (date.getFullYear() === year && \n date.getMonth() === month && \n date.getDate() === day) {\n return date;\n }\n \n return null;\n } catch {\n return null;\n }\n }\n getDisplayValue(): string {\n const value = this.control().formControl.value;\n if (!value) return 'Not selected';\n\n // Single mode - value is string\n const singleValue = value as string;\n if (singleValue) {\n const date = new Date(singleValue);\n if (!isNaN(date.getTime())) {\n return this.formatDate(date, this.format());\n }\n return singleValue;\n }\n return 'Not selected';\n }\n\n private formatDate(date: Date, format: string): string {\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear().toString();\n \n return format\n .replace('dd', day)\n .replace('MM', month)\n .replace('yyyy', year)\n .replace('HH', (this.selectedHour < 10 ? '0' : '') + this.selectedHour)\n .replace('mm', (this.selectedMinute < 10 ? '0' : '') + this.selectedMinute);\n }\n\n // Calendar methods\n toggleCalendar(): void {\n if (!this.showCalendar()) {\n this.calculateCalendarPosition();\n this.setCalendarToSelectedDate();\n }\n this.showCalendar.set(!this.showCalendar());\n }\n\n closeCalendar(): void {\n this.showCalendar.set(false);\n }\n\n private setCalendarToSelectedDate(): void {\n const selectedValue = this.control().formControl.value;\n if (selectedValue) {\n let selectedDate: Date | null = null;\n\n // Single mode\n const singleValue = selectedValue as string;\n if (singleValue) {\n selectedDate = new Date(singleValue);\n }\n \n if (selectedDate && !isNaN(selectedDate.getTime())) {\n // Set calendar to show the month of the selected date\n const selectedMonth = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1);\n this.currentMonth.set(selectedMonth);\n }\n }\n }\n\n private calculateCalendarPosition(): void {\n const element = this.elementRef.nativeElement;\n const rect = element.getBoundingClientRect();\n const calendarHeight = 300; // Approximate height of calendar panel\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n \n // If not enough space below and more space above, position on top\n if (spaceBelow < calendarHeight && spaceAbove > spaceBelow) {\n this.calendarPosition.set('top');\n } else {\n this.calendarPosition.set('bottom');\n }\n }\n\n getMonthYearDisplay(): string {\n const date = this.currentMonth();\n return date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n }\n\n previousMonth(): void {\n const current = this.currentMonth();\n const newDate = new Date(current.getFullYear(), current.getMonth() - 1, 1);\n this.currentMonth.set(newDate);\n }\n\n nextMonth(): void {\n const current = this.currentMonth();\n const newDate = new Date(current.getFullYear(), current.getMonth() + 1, 1);\n this.currentMonth.set(newDate);\n }\n\n selectDate(day: CalendarDateTime): void {\n if (this.selectedDateTime){\n this.selectedDateTime.isSelected = false;\n }\n // this.selectedDateTime = day;\n // this.selectedDateTime.isSelected = true;\n this.setDateTimeSelected(day.date);\n // const dateString = this.toLocalISOString(day.date);\n // (this.control().formControl as FormControl<string>).setValue(dateString);\n // // this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n \n // this.control().formControl.markAsDirty();\n // this.control().formControl.markAsTouched();\n }\n\n private isSameDay(date1: Date, date2: Date | null): boolean {\n if (!date2) return false;\n return date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate();\n }\n\n // Helper method to convert Date to ISO date string without timezone conversion\n private toLocalISOString(date: Date): string {\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n const hh = (this.selectedHour < 10 ? '0' : '') + this.selectedHour;\n const mm = (this.selectedMinute < 10 ? '0' : '') + this.selectedMinute;\n return `${year}-${month}-${day}T${hh}:${mm}:00`;\n }\n\n}\n","<div class=\"lite-date\" [ngClass]=\"{'in-edit': inEdit(), 'invalid': hasErrors()}\">\n @if (inEdit()) {\n <input type=\"text\" \n [value]=\"formattedValue()\" \n (change)=\"onDateChange($event)\"\n [class.invalid]=\"hasErrors()\"\n [placeholder]=\"format()\" />\n <label class=\"label\" [ngClass]=\"{'float': formattedValue()}\">\n {{ control().label }}<span *ngIf=\"isRequired()\">*</span>\n </label>\n <div class=\"calendar_icon\" (click)=\"toggleCalendar()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"calendar\" viewBox=\"0 0 16 16\">\n <path d=\"M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1.5A1.5 1.5 0 0 1 16 2.5v11A1.5 1.5 0 0 1 14.5 15H1.5A1.5 1.5 0 0 1 0 13.5v-11A1.5 1.5 0 0 1 1.5 1H3V.5a.5.5 0 0 1 .5-.5zM1.5 2a.5.5 0 0 0-.5.5V4h14V2.5a.5.5 0 0 0-.5-.5H13v.5a.5.5 0 0 1-1 0V2H4v.5a.5.5 0 0 1-1 0V2H1.5zM15 5H1v8.5a.5.5 0 0 0 .5.5h13a.5.5 0 0 0 .5-.5V5z\"/>\n </svg>\n </div>\n \n @if (showCalendar()) {\n <div class=\"calendar-overlay\" [ngClass]=\"'position-' + calendarPosition()\">\n <ng-container *ngTemplateOutlet=\"calendarPanel\"></ng-container>\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">\n {{ getDisplayValue() }}\n </div>\n }\n\n @if (inEdit() && hasErrors()) {\n <div class=\"error-messages\">\n @for (error of getErrorMessage(); track error) {\n <div class=\"error-message\">{{ error }}</div>\n }\n </div>\n }\n</div>\n<ng-template #calendarPanel>\n <div class=\"calendar-panel datetime\">\n <div class=\"date-panel\">\n <div class=\"calendar-header\">\n <button type=\"button\" class=\"nav-button\" (click)=\"previousMonth()\">‹</button>\n <span class=\"month-year\">{{ getMonthYearDisplay() }}</span>\n <button type=\"button\" class=\"nav-button\" (click)=\"nextMonth()\">›</button>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"weekdays\">\n <div class=\"weekday\">Su</div>\n <div class=\"weekday\">Mo</div>\n <div class=\"weekday\">Tu</div>\n <div class=\"weekday\">We</div>\n <div class=\"weekday\">Th</div>\n <div class=\"weekday\">Fr</div>\n <div class=\"weekday\">Sa</div>\n </div>\n <div class=\"calendar-days\">\n @for (day of calendarDays(); track day.date) {\n <div class=\"calendar-day\" [ngClass]=\"{'today': day.isToday, 'selected': day.isSelected, 'dim': day.isOtherMonth}\" (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"time-panel\">\n <div class=\"control-header\">\n <button type=\"button\" class=\"close-button\" (click)=\"closeCalendar()\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M2.146 2.146a.5.5 0 0 1 .708 0L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"time-header\">HOURS</div>\n <div class=\"hh-grid\">\n @for (hh of hourSet; track hh) {\n <div class=\"hh-slot\" [ngClass]=\"{'selected': selectedHour === hh}\" (click)=\"onSelectHour(hh)\">\n {{ hh < 10 ? '0' + hh : hh }}\n </div>\n }\n </div>\n <div class=\"time-header\">MINUTES</div>\n <div class=\"hh-grid\">\n @for (mm of minSet; track mm) {\n <div class=\"hh-slot\" [ngClass]=\"{'selected': selectedMinute === mm}\" (click)=\"onSelectMinute(mm)\">\n {{ mm < 10 ? '0' + mm : mm }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n","/*\n * Public API Surface of lite-form\n */\n\nexport * from './lib/lite-form.module';\nexport * from './lib/field-dto';\nexport * from './lib/form-utils';\nexport * from './lib/lite-input/lite-input';\nexport * from './lib/lite-textarea/lite-textarea';\nexport * from './lib/lite-select/lite-select';\nexport * from './lib/lite-multi-select/lite-multi-select';\nexport * from './lib/lite-radio/lite-radio';\nexport * from './lib/lite-checkbox/lite-checkbox';\nexport * from './lib/lite-date/lite-date';\nexport * from './lib/lite-datetime/lite-datetime';\nexport * from './lib/lite-password/lite-password';\nexport * from './lib/lite-file/lite-file';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-lite-form.mjs","sources":["../../../projects/lite-form/src/lib/form-utils.ts","../../../projects/lite-form/src/lib/lite-input/lite-input.ts","../../../projects/lite-form/src/lib/lite-input/lite-input.html","../../../projects/lite-form/src/lib/lite-textarea/lite-textarea.ts","../../../projects/lite-form/src/lib/lite-textarea/lite-textarea.html","../../../projects/lite-form/src/lib/lite-select/lite-select.ts","../../../projects/lite-form/src/lib/lite-select/lite-select.html","../../../projects/lite-form/src/lib/lite-multi-select/lite-multi-select.ts","../../../projects/lite-form/src/lib/lite-multi-select/lite-multi-select.html","../../../projects/lite-form/src/lib/lite-radio/lite-radio.ts","../../../projects/lite-form/src/lib/lite-radio/lite-radio.html","../../../projects/lite-form/src/lib/lite-checkbox/lite-checkbox.ts","../../../projects/lite-form/src/lib/lite-checkbox/lite-checkbox.html","../../../projects/lite-form/src/lib/lite-date/lite-date.ts","../../../projects/lite-form/src/lib/lite-date/lite-date.html","../../../projects/lite-form/src/lib/lite-password/lite-password.ts","../../../projects/lite-form/src/lib/lite-password/lite-password.html","../../../projects/lite-form/src/lib/lite-file/lite-file.ts","../../../projects/lite-form/src/lib/lite-file/lite-file.html","../../../projects/lite-form/src/lib/lite-form.module.ts","../../../projects/lite-form/src/lib/field-dto.ts","../../../projects/lite-form/src/lib/lite-datetime/lite-datetime.ts","../../../projects/lite-form/src/lib/lite-datetime/lite-datetime.html","../../../projects/lite-form/src/lib/lite-snackbar/lite-snackbar.service.ts","../../../projects/lite-form/src/public-api.ts","../../../projects/lite-form/src/ngx-lite-form.ts"],"sourcesContent":["import { AbstractControl } from '@angular/forms';\n\n/**\n * Utility class for form-related helper functions\n */\nexport class FormUtils {\n /**\n * Check if a FormControl has the required validator\n * @param control - The AbstractControl to check\n * @returns true if the control has a required validator, false otherwise\n */\n static isRequired(control: AbstractControl): boolean {\n if (control.validator) {\n const validator = control.validator({} as any);\n return validator && validator['required'];\n }\n return false;\n }\n\n /**\n * Check if a FormControl has any validation errors\n * @param control - The AbstractControl to check\n * @returns true if the control has errors, false otherwise\n */\n static hasErrors(control: AbstractControl): boolean {\n return control.invalid && (control.dirty || control.touched);\n }\n\n /**\n * Get all error keys for a FormControl\n * @param control - The AbstractControl to check\n * @returns array of error keys or empty array if no errors\n */\n static getErrors(control: AbstractControl): string[] {\n if (control.errors) {\n return Object.keys(control.errors);\n }\n return [];\n }\n\n /**\n * Get user-friendly error messages for a FormControl\n * @param control - The AbstractControl to check\n * @param fieldLabel - The label of the field for error messages\n * @returns array of user-friendly error messages\n */\n static getErrorMessages(control: AbstractControl, fieldLabel: string): string[] {\n const errorMessages: string[] = [];\n \n if (control.errors) {\n if (control.errors['required']) {\n errorMessages.push(`${fieldLabel} is required`);\n }\n if (control.errors['email']) {\n errorMessages.push(`${fieldLabel} must be a valid email`);\n }\n if (control.errors['minlength']) {\n errorMessages.push(`${fieldLabel} must be at least ${control.errors['minlength'].requiredLength} characters`);\n }\n if (control.errors['maxlength']) {\n errorMessages.push(`${fieldLabel} must be no more than ${control.errors['maxlength'].requiredLength} characters`);\n }\n \n // Handle any other validation errors\n const allErrors = FormUtils.getErrors(control);\n const handledErrors = ['required', 'email', 'minlength', 'maxlength'];\n const unhandledErrors = allErrors.filter(error => !handledErrors.includes(error));\n \n unhandledErrors.forEach(error => {\n errorMessages.push(`${fieldLabel} is invalid: ${error}`);\n });\n }\n \n return errorMessages;\n }\n\n /**\n * Get the first error message for a FormControl\n * @param control - The AbstractControl to check\n * @returns the first error key or null if no errors\n */\n static getFirstError(control: AbstractControl): string | null {\n if (control.errors) {\n return Object.keys(control.errors)[0];\n }\n return null;\n }\n\n /**\n * Get detailed password error messages for a FormControl\n * @param control - The AbstractControl to check\n * @param fieldLabel - The label of the field for error messages\n * @returns array of detailed password error messages\n */\n static getPasswordErrorMessages(control: AbstractControl, fieldLabel: string): string[] {\n const errorMessages: string[] = [];\n \n if (control.errors) {\n // Required validation\n if (control.errors['required']) {\n errorMessages.push(`${fieldLabel} is required`);\n }\n \n // Length validations\n if (control.errors['minlength']) {\n const requiredLength = control.errors['minlength'].requiredLength;\n const actualLength = control.errors['minlength'].actualLength;\n errorMessages.push(`${fieldLabel} must be at least ${requiredLength} characters (currently ${actualLength})`);\n }\n \n if (control.errors['maxlength']) {\n const requiredLength = control.errors['maxlength'].requiredLength;\n const actualLength = control.errors['maxlength'].actualLength;\n errorMessages.push(`${fieldLabel} must be no more than ${requiredLength} characters (currently ${actualLength})`);\n }\n \n // Pattern validation with detailed feedback\n if (control.errors['pattern']) {\n const value = control.value || '';\n const patternRequiredValue = control.errors['pattern'].requiredPattern;\n \n // Analyze the actual pattern to provide specific feedback\n const missingRequirements: string[] = [];\n \n // Check what the actual pattern requires by analyzing the regex\n if (patternRequiredValue) {\n // Check if the pattern requires lowercase letters\n if (patternRequiredValue.includes('(?=.*[a-z])') && !/[a-z]/.test(value)) {\n missingRequirements.push('at least one lowercase letter (a-z)');\n }\n \n // Check if the pattern requires uppercase letters\n if (patternRequiredValue.includes('(?=.*[A-Z])') && !/[A-Z]/.test(value)) {\n missingRequirements.push('at least one uppercase letter (A-Z)');\n }\n \n // Check if the pattern requires digits\n if ((patternRequiredValue.includes('(?=.*\\\\d)') || patternRequiredValue.includes('(?=.*[0-9])')) && !/\\d/.test(value)) {\n missingRequirements.push('at least one number (0-9)');\n }\n \n // Check if the pattern requires special characters\n if (patternRequiredValue.includes('(?=.*[@$!%*?&]') && !/[@$!%*?&^()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?#~`]/.test(value)) {\n missingRequirements.push('at least one special character (!@#$%^&*()_+-=[]{}|;\\':\",./<>?)');\n }\n \n // Check for minimum length in pattern (e.g., {8,} or {8,50})\n const lengthMatch = patternRequiredValue.match(/\\{(\\d+),?\\d*\\}/);\n if (lengthMatch) {\n const minLength = parseInt(lengthMatch[1]);\n if (value.length < minLength) {\n missingRequirements.push(`at least ${minLength} characters`);\n }\n }\n \n // Check if spaces are not allowed\n if (patternRequiredValue.includes('[A-Za-z\\\\d') && !patternRequiredValue.includes('\\\\s') && /\\s/.test(value)) {\n missingRequirements.push('no spaces allowed');\n }\n }\n \n // Fallback to generic checks if pattern analysis didn't find specific requirements\n if (missingRequirements.length === 0) {\n // Check for common password requirements as fallback\n if (!/[a-z]/.test(value)) {\n missingRequirements.push('at least one lowercase letter (a-z)');\n }\n \n if (!/[A-Z]/.test(value)) {\n missingRequirements.push('at least one uppercase letter (A-Z)');\n }\n \n if (!/\\d/.test(value)) {\n missingRequirements.push('at least one number (0-9)');\n }\n \n if (!/[@$!%*?&^()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?#~`]/.test(value)) {\n missingRequirements.push('at least one special character (!@#$%^&*()_+-=[]{}|;\\':\",./<>?)');\n }\n }\n \n if (missingRequirements.length > 0) {\n errorMessages.push(`${fieldLabel} must contain ${missingRequirements.join(', ')}`);\n } else {\n // Show the actual pattern if we can't determine specific requirements\n errorMessages.push(`${fieldLabel} does not match required pattern: ${patternRequiredValue}`);\n }\n }\n \n // Custom password complexity validator\n if (control.errors['passwordComplexity']) {\n const complexity = control.errors['passwordComplexity'];\n const missing: string[] = [];\n \n if (!complexity.hasUpperCase) missing.push('uppercase letter');\n if (!complexity.hasLowerCase) missing.push('lowercase letter');\n if (!complexity.hasNumeric) missing.push('number');\n if (!complexity.hasSpecial) missing.push('special character');\n if (!complexity.minLength) missing.push('minimum length requirement');\n \n if (missing.length > 0) {\n errorMessages.push(`${fieldLabel} is missing: ${missing.join(', ')}`);\n }\n }\n \n // Password mismatch (for confirm password fields)\n if (control.errors['passwordMismatch']) {\n errorMessages.push(`${fieldLabel} does not match the password`);\n }\n \n // Common password validator\n if (control.errors['commonPassword']) {\n errorMessages.push(`${fieldLabel} is too common. Please choose a more secure password`);\n }\n \n // Password history validator\n if (control.errors['passwordHistory']) {\n errorMessages.push(`${fieldLabel} has been used recently. Please choose a different password`);\n }\n \n // Handle any other validation errors not specifically handled\n const allErrors = FormUtils.getErrors(control);\n const handledErrors = [\n 'required', 'minlength', 'maxlength', 'pattern', \n 'passwordComplexity', 'passwordMismatch', 'commonPassword', 'passwordHistory'\n ];\n const unhandledErrors = allErrors.filter(error => !handledErrors.includes(error));\n \n unhandledErrors.forEach(error => {\n errorMessages.push(`${fieldLabel} validation error: ${error}`);\n });\n }\n \n return errorMessages;\n }\n\n /**\n * Analyze password strength and return feedback\n * @param password - The password string to analyze\n * @returns object with strength score and detailed feedback\n */\n static analyzePasswordStrength(password: string): {\n score: number;\n level: 'Very Weak' | 'Weak' | 'Fair' | 'Good' | 'Strong';\n feedback: string[];\n } {\n const feedback: string[] = [];\n let score = 0;\n \n if (!password) {\n return { score: 0, level: 'Very Weak', feedback: ['Password is required'] };\n }\n \n // Length scoring\n if (password.length >= 8) score += 1;\n else feedback.push('Use at least 8 characters');\n \n if (password.length >= 12) score += 1;\n else if (password.length >= 8) feedback.push('Consider using 12+ characters for better security');\n \n // Character variety scoring\n if (/[a-z]/.test(password)) score += 1;\n else feedback.push('Add lowercase letters');\n \n if (/[A-Z]/.test(password)) score += 1;\n else feedback.push('Add uppercase letters');\n \n if (/\\d/.test(password)) score += 1;\n else feedback.push('Add numbers');\n \n if (/[@$!%*?&^()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?#~`]/.test(password)) score += 1;\n else feedback.push('Add special characters');\n \n // Additional checks\n if (!/(.)\\1{2,}/.test(password)) score += 1;\n else feedback.push('Avoid repeating characters');\n \n if (!/^(.{1,2})\\1+$/.test(password)) score += 1;\n else feedback.push('Avoid repetitive patterns');\n \n // Determine strength level\n let level: 'Very Weak' | 'Weak' | 'Fair' | 'Good' | 'Strong';\n if (score <= 2) level = 'Very Weak';\n else if (score <= 4) level = 'Weak';\n else if (score <= 5) level = 'Fair';\n else if (score <= 6) level = 'Good';\n else level = 'Strong';\n \n return { score, level, feedback };\n }\n}\n","import { Component, effect, input } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-input',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-input.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteInput {\n inEdit = input<boolean>(true);\n control = input<FieldDto>({ label: '', formControl: new FormControl('') });\n \n readonly FormUtils = FormUtils;\n\n constructor() {\n effect(() => {\n // console.log('LiteInput initialized with control:', this.control());\n\n });\n }\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n}\n","<div class=\"lite-input\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <input type=\"text\" [formControl]=\"control().formControl\" placeholder=\"\" [ngClass]=\"{'invalid': hasErrors()}\" />\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n @if (hasErrors()) {\n <div class=\"error-messages\">\n @for (errorMessage of getErrorMessage(); track errorMessage) {\n <div class=\"error-message\">{{ errorMessage }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">{{ control().formControl.value }}</div>\n }\n</div>","import { Component, effect, input } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-textarea',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-textarea.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteTextarea {\n inEdit = input<boolean>(true);\n control = input<FieldDto>({ label: '', formControl: new FormControl('') });\n \n // Make FormUtils available to the template\n readonly FormUtils = FormUtils;\n \n constructor() {\n effect(() => {\n // Initialization logic can go here if needed\n });\n }\n\n isRequired(): boolean {\n return FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n}\n","<div class=\"lite-textarea\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <textarea [formControl]=\"control().formControl\" placeholder=\"\" rows=\"{{ control().rows }}\" [ngClass]=\"{'invalid': hasErrors()}\"></textarea>\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n @if (hasErrors()) {\n <div class=\"error-messages\">\n @for (errorMessage of getErrorMessage(); track errorMessage) {\n <div class=\"error-message\">{{ errorMessage }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">{{ control().formControl.value }}</div>\n }\n</div>","import { Component, effect, input, ElementRef, HostListener } from '@angular/core';\nimport { SelectFieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-select',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-select.html`,\n styleUrls: [`../lite-styles.scss`],\n animations: [\n trigger('toggleView', [\n state('collapse', style({ height: 0, borderStyle: 'none' })),\n state('expand', style({ height: '*', borderStyle: 'solid' })),\n transition('collapse <=> expand', animate('300ms ease-in-out'))\n ])\n ]\n})\nexport class LiteSelect {\n inEdit = input<boolean>(true);\n control = input<SelectFieldDto>({ label: '', formControl: new FormControl(null), options: [], displayWith: (option) => option });\n showOptions = 'collapse';\n \n // Separate input text from FormControl value\n inputText = '';\n \n readonly FormUtils = FormUtils;\n \n constructor(private elementRef: ElementRef) {\n effect(() => {\n // Sync inputText with FormControl value when it changes\n const value = this.control().formControl.value;\n if (value && typeof value === 'object') {\n this.inputText = this.control().displayWith(value);\n } else if (!value) {\n this.inputText = '';\n }\n });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (this.showOptions === 'expand') {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.showOptions = 'collapse';\n }\n }\n }\n\n isRequired(): boolean {\n return FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n optionSelected(option: any): void {\n this.control().formControl.setValue(option);\n this.inputText = this.control().displayWith(option);\n this.showOptions = 'collapse';\n }\n\n onInputChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.inputText = target.value;\n // Note: FormControl value is only updated when a valid option is selected\n }\n\n onInputBlur(): void {\n this.showOptions = 'collapse';\n // If the typed text matches an option exactly, select it\n const matchingOption = this.control().options.find(option => \n this.control().displayWith(option).toLowerCase() === this.inputText.toLowerCase()\n );\n \n if (matchingOption) {\n this.control().formControl.setValue(matchingOption);\n this.inputText = this.control().displayWith(matchingOption);\n } else {\n // If no match and FormControl has a value, reset inputText to show the current selection\n const currentValue = this.control().formControl.value;\n if (currentValue && typeof currentValue === 'object') {\n this.inputText = this.control().displayWith(currentValue);\n }\n // If no current selection and no match, leave inputText as typed for user feedback\n }\n }\n\n getDisplayValue(): string {\n return this.inputText;\n }\n\n hasTypedValue(): boolean {\n // Check if user has typed something that doesn't match any option\n if (!this.inputText.trim()) return false;\n \n // Check if the current inputText matches any valid option's display value\n const matchesValidOption = this.control().options.some(option => \n this.control().displayWith(option).toLowerCase() === this.inputText.toLowerCase()\n );\n \n return !matchesValidOption;\n }\n\n getFilteredOptions(): any[] {\n if (!this.inputText.trim()) {\n return this.control().options;\n }\n \n return this.control().options.filter(option =>\n this.control().displayWith(option).toLowerCase().includes(this.inputText.toLowerCase())\n );\n }\n\n shouldShowPlaceholder(): boolean {\n // Only show placeholder when label is floating (not overlapping)\n return this.showOptions === 'expand' || !!this.getDisplayValue() || this.hasTypedValue();\n }\n}\n","<div class=\"lite-select\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <input type=\"text\" [value]=\"getDisplayValue()\" (input)=\"onInputChange($event)\" [ngClass]=\"{'selected': control().formControl.value, 'invalid': hasErrors()}\"\n (focus)=\"showOptions = 'expand'\" (blur)=\"onInputBlur()\" \n [placeholder]=\"shouldShowPlaceholder() ? 'Type to search...' : ''\" />\n <div class=\"options\" [@toggleView]=\"showOptions\">\n @for (option of getFilteredOptions(); track option) {\n <div class=\"option\" (click)=\"optionSelected(option)\">{{ control().displayWith(option) }}</div>\n }\n </div>\n <div class=\"label\" [ngClass]=\"{float: showOptions=='expand' || getDisplayValue() || hasTypedValue()}\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"arrow_box\" (click)=\"showOptions = showOptions === 'expand' ? 'collapse' : 'expand'\"><div class=\"arrow\"></div></div>\n @if (hasErrors()) {\n <div class=\"error-messages\">\n @for (errorMessage of getErrorMessage(); track errorMessage) {\n <div class=\"error-message\">{{ errorMessage }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">{{ control().displayWith(control().formControl.value) }}</div>\n }\n</div>","import { Component, effect, input, ElementRef, HostListener, ViewChild, AfterViewInit } from '@angular/core';\nimport { MultiSelectFieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-multi-select',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-multi-select.html`,\n styleUrls: [`../lite-styles.scss`],\n animations: [\n trigger('toggleView', [\n state('collapse', style({ height: 0, opacity: 0 })),\n state('expand', style({ height: '*', opacity: 1 })),\n transition('collapse <=> expand', animate('300ms ease-in-out'))\n ])\n ]\n})\nexport class LiteMultiSelect implements AfterViewInit {\n inEdit = input<boolean>(true);\n control = input<MultiSelectFieldDto>({ \n label: '', \n formControl: new FormControl<any[]>([], { nonNullable: true }), \n options: [], \n displayWith: (option) => option \n });\n showOptions = 'collapse';\n \n // Separate input text for filtering from FormControl values\n inputText = '';\n isFocused = false;\n \n // Separate text for filtering options (different from display text)\n private filterText = '';\n \n // Container height variable\n containerHeight = '36px';\n \n @ViewChild('selectedItemsRef', { static: false }) selectedItemsRef?: ElementRef;\n \n readonly FormUtils = FormUtils;\n \n constructor(private elementRef: ElementRef) {\n effect(() => {\n // Effect to react to FormControl value changes\n // Selected items are now displayed inline, so no need to update inputText\n const values = this.control().formControl.value || [];\n // Component will re-render automatically when values change\n });\n \n // Subscribe to value changes to update container height\n effect(() => {\n const formControl = this.control().formControl;\n if (formControl) {\n formControl.valueChanges.subscribe(() => {\n this.updateContainerHeight();\n });\n }\n });\n }\n\n ngAfterViewInit(): void {\n // ViewChild will be available after view init\n // Set initial container height\n this.updateContainerHeight();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (this.showOptions === 'expand') {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.showOptions = 'collapse';\n this.filterText = ''; // Clear filter when closing\n // No need to update display text since selected items are shown inline\n }\n }\n }\n\n isRequired(): boolean {\n return FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n optionToggled(option: any): void {\n // Set flag to prevent dropdown from closing\n const currentValues = this.control().formControl.value || [];\n const isSelected = this.isOptionSelected(option);\n let newValues: any[];\n if (isSelected) {\n // Remove option\n newValues = currentValues.filter(value => \n JSON.stringify(value) !== JSON.stringify(option)\n );\n } else {\n // Add option\n newValues = [...currentValues, option];\n }\n this.control().formControl.setValue(newValues);\n // Height will be updated by valueChanges subscription\n }\n\n isOptionSelected(option: any): boolean {\n const currentValues = this.control().formControl.value || [];\n return currentValues.some(value => \n JSON.stringify(value) === JSON.stringify(option)\n );\n }\n\n onInputChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.inputText = target.value;\n this.filterText = target.value;\n // Input is used for filtering only - display is handled by selected items\n }\n\n onInputFocus(): void {\n this.showOptions = 'expand';\n this.isFocused = true;\n this.inputText = '';\n this.filterText = '';\n }\n\n onInputBlur(): void {\n this.isFocused = false;\n }\n\n getDisplayValue(): string {\n // Always return filter text for the input - selected items are shown separately\n return this.filterText;\n }\n\n updateDisplayText(): void {\n // No longer needed to update inputText since selected items are shown inline\n // This method can be kept for compatibility but doesn't need to do anything\n }\n\n hasTypedValue(): boolean {\n // Check if user is typing (for filtering)\n if (!this.filterText.trim()) return false;\n const values = this.control().formControl.value || [];\n if (values.length === 0) return true;\n if (values.length === 1) {\n return this.filterText !== this.control().displayWith(values[0]);\n }\n return this.filterText !== `${values.length} items selected`;\n }\n\n getFilteredOptions(): any[] {\n if (!this.filterText.trim()) {\n return this.control().options;\n }\n return this.control().options.filter(option =>\n this.control().displayWith(option).toLowerCase().includes(this.filterText.toLowerCase())\n );\n }\n\n getSelectedCount(): number {\n const values = this.control().formControl.value || [];\n return values.length;\n }\n\n hasSelection(): boolean {\n return this.getSelectedCount() > 0;\n }\n\n getSelectedItems(): any[] {\n return this.control().formControl.value || [];\n }\n\n removeSelectedItem(item: any): void {\n const currentValues = this.control().formControl.value || [];\n const newValues = currentValues.filter(value => \n JSON.stringify(value) !== JSON.stringify(item)\n );\n this.control().formControl.setValue(newValues);\n // Height will be updated by valueChanges subscription\n }\n\n private updateContainerHeight(): void {\n // Schedule height calculation for next tick to ensure DOM is updated\n setTimeout(() => {\n if (this.selectedItemsRef?.nativeElement) {\n const naturalHeight = this.selectedItemsRef.nativeElement.getBoundingClientRect().height;\n const baseHeight = 36;\n const padding = 4;\n this.containerHeight = `${Math.max(baseHeight, naturalHeight + padding)}px`;\n console.log('Updated container height', this.containerHeight, naturalHeight);\n } else if (!this.hasSelection()) {\n this.containerHeight = '36px';\n }\n }, 0);\n }\n shouldFloat() {\n return this.showOptions === 'expand' || this.hasSelection() || this.hasTypedValue();\n }\n\n shouldShowPlaceholder(): boolean {\n // Show placeholder when filtering or when no items are selected\n return (this.isFiltering() || !this.hasSelection()) && this.shouldFloat();\n }\n\n isFiltering(): boolean {\n return !!this.filterText.trim();\n }\n}\n","<div class=\"lite-multi-select\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <div class=\"input-container\" \n [ngClass]=\"{'selected': hasSelection(), 'invalid': hasErrors()}\"\n [style.height]=\"containerHeight\">\n <!-- Selected items overlay on input -->\n @if (hasSelection() && !isFiltering() && !isFocused) {\n <div class=\"selected-items-inline\" #selectedItemsRef>\n @for (item of getSelectedItems(); track item) {\n <span class=\"selected-item-inline\">\n {{ control().displayWith(item) }}\n <button type=\"button\" class=\"remove-item-inline\" (click)=\"removeSelectedItem(item)\">×</button>\n </span>\n }\n </div>\n }\n <input type=\"text\" [value]=\"getDisplayValue()\" (input)=\"onInputChange($event)\" \n (focus)=\"onInputFocus()\" (blur)=\"onInputBlur()\"\n [placeholder]=\"shouldShowPlaceholder() ? 'Type to filter options...' : ''\" \n class=\"filter-input\" />\n </div>\n <div class=\"options\" [@toggleView]=\"showOptions\">\n <!-- Options list -->\n @for (option of getFilteredOptions(); track option) {\n <div class=\"option multi-option\" \n [ngClass]=\"{'selected': isOptionSelected(option)}\"\n (click)=\"optionToggled(option)\">\n <input type=\"checkbox\" [checked]=\"isOptionSelected(option)\" \n (click)=\"$event.stopPropagation(); optionToggled(option)\" readonly />\n <span class=\"option-text\">{{ control().displayWith(option) }}</span>\n </div>\n }\n @if (getFilteredOptions().length === 0) {\n <div class=\"no-options\">No options found</div>\n }\n </div>\n <div class=\"label\" [ngClass]=\"{float: shouldFloat()}\">\n {{ control().label }}<span *ngIf=\"isRequired()\">*</span>\n </div>\n <div class=\"arrow_box\" (click)=\"showOptions = showOptions === 'expand' ? 'collapse' : 'expand'\">\n <div class=\"arrow\"></div>\n </div>\n @if (hasErrors()) {\n <div class=\"error-messages\">\n @for (errorMessage of getErrorMessage(); track errorMessage) {\n <div class=\"error-message\">{{ errorMessage }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">\n @for (item of getSelectedItems(); track item) {\n <span class=\"item\">\n {{ control().displayWith(item) }}\n </span>\n }\n </div>\n }\n</div>\n","import { Component, input } from '@angular/core';\nimport { RadioFieldDto } from '../field-dto';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-radio',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: './lite-radio.html',\n styleUrls: ['../lite-styles.scss']\n})\nexport class LiteRadio {\n inEdit = input<boolean>(true);\n control = input<RadioFieldDto>({ \n label: '', \n formControl: new FormControl(''), \n options: [], \n displayWith: (option) => option \n });\n direction = input<'vertical' | 'horizontal'>('vertical');\n\n readonly FormUtils = FormUtils;\n\n isRequired(): boolean {\n return FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n onRadioChange(value: any): void {\n this.control().formControl.setValue(value);\n }\n\n isSelected(value: any): boolean {\n return this.control().formControl.value === value;\n }\n}\n","<div class=\"lite-radio\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <div class=\"radio-container\">\n <div class=\"label\" [ngClass]=\"{'float': true}\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"radio-options\" [ngClass]=\"{'horizontal': direction() === 'horizontal', 'vertical': direction() === 'vertical'}\">\n @for (option of control().options; track option) {\n <label class=\"radio-option\">\n <input type=\"radio\" [value]=\"option\" [checked]=\"isSelected(option)\"\n (change)=\"onRadioChange(option)\" [name]=\"control().label + '_radio'\" class=\"radio-input\" />\n <span class=\"radio-label\">{{ control().displayWith(option) }}</span>\n </label>\n }\n </div>\n </div>\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">\n @if (control().formControl.value) {\n {{ control().displayWith(control().formControl.value) }}\n } @else {\n <span class=\"no-value\">Not selected</span>\n }\n </div>\n }\n\n @if (inEdit() && hasErrors()) {\n <div class=\"error-messages\">\n @for (error of getErrorMessage(); track error) {\n <div class=\"error-message\">{{ error }}</div>\n }\n </div>\n }\n</div>\n","import { Component, effect, input } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-checkbox',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-checkbox.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteCheckbox {\n inEdit = input<boolean>(true);\n control = input<FieldDto>({ label: '', formControl: new FormControl<boolean>(false, { nonNullable: true }) });\n \n readonly FormUtils = FormUtils;\n\n constructor() {\n effect(() => {\n // console.log('LiteCheckbox initialized with control:', this.control());\n });\n }\n\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n onCheckboxChange(event: Event) {\n const target = event.target as HTMLInputElement;\n this.control().formControl.setValue(target.checked);\n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n }\n}\n","<div class=\"lite-checkbox\" [ngClass]=\"{'in-edit': inEdit(), 'invalid': hasErrors()}\">\n @if (inEdit()) {\n <div class=\"checkbox-container\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" \n [checked]=\"control().formControl.value\" \n (change)=\"onCheckboxChange($event)\"\n class=\"checkbox-input\" />\n <div class=\"checkbox-text\">{{ control().label }}<span *ngIf=\"isRequired()\" class=\"required\">*</span></div>\n\n </label>\n </div>\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">\n @if (control().formControl.value) {\n <span class=\"checked\">✓ Yes</span>\n } @else {\n <span class=\"unchecked\">✗ No</span>\n }\n </div>\n }\n\n @if (inEdit() && hasErrors()) {\n <div class=\"error-messages\">\n @for (error of getErrorMessage(); track error) {\n <div class=\"error-message\">{{ error }}</div>\n }\n </div>\n }\n</div>\n","import { Component, effect, input, signal, ElementRef, HostListener, computed } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\nimport { FieldDto } from '../field-dto';\n\ninterface CalendarDay {\n date: Date;\n day: number;\n isOtherMonth: boolean;\n isToday: boolean;\n isSelected: boolean;\n isRangeStart?: boolean;\n isRangeEnd?: boolean;\n isInRange?: boolean;\n}\n\nexport interface DateRangeFieldDto extends Omit<FieldDto, 'formControl'> {\n formControl: FormControl<string[]>;\n}\n\n@Component({\n selector: 'lite-date',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-date.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteDate {\n inEdit = input<boolean>(true);\n control = input<FieldDto | DateRangeFieldDto>({ \n label: '', \n formControl: new FormControl<string>('', { nonNullable: true }),\n });\n format = input<string>('dd/MM/yyyy');\n range = input<boolean>(false);\n \n // Calendar state\n currentMonth = signal<Date>(new Date());\n showCalendar = signal<boolean>(false);\n calendarPosition = signal<'bottom' | 'top'>('bottom');\n \n // Signal to track form control value changes for reactivity\n private formValueChangeSignal = signal<any>(null);\n \n // Second month for range selection\n secondMonth = computed(() => {\n const current = this.currentMonth();\n return new Date(current.getFullYear(), current.getMonth() + 1, 1);\n });\n \n // Computed calendar days - only recalculates when dependencies change\n calendarDays = computed(() => {\n // This makes the computed reactive to form value changes\n this.formValueChangeSignal();\n return this.getMonthDays(this.currentMonth());\n });\n \n // Second month calendar days for range mode\n secondCalendarDays = computed(() => {\n // This makes the computed reactive to form value changes\n this.formValueChangeSignal();\n return this.range() ? this.getMonthDays(this.secondMonth()) : [];\n });\n\n private getMonthDays(monthDate: Date): CalendarDay[] {\n const year = monthDate.getFullYear();\n const month = monthDate.getMonth();\n \n // First day of the month\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n \n const days: CalendarDay[] = [];\n const today = new Date();\n const selectedValue = this.control().formControl.value;\n \n // Handle both single date and date range\n let selectedDates: Date[] = [];\n let rangeStart: Date | null = null;\n let rangeEnd: Date | null = null;\n \n if (this.range()) {\n // Range mode - value should be string[]\n const rangeValue = selectedValue as string[];\n if (rangeValue && rangeValue.length > 0) {\n if (rangeValue[0]) {\n const startDate = new Date(rangeValue[0]);\n if (!isNaN(startDate.getTime())) {\n selectedDates.push(startDate);\n rangeStart = startDate;\n }\n }\n if (rangeValue[1]) {\n const endDate = new Date(rangeValue[1]);\n if (!isNaN(endDate.getTime())) {\n selectedDates.push(endDate);\n rangeEnd = endDate;\n }\n }\n }\n } else {\n // Single mode - value should be string\n const singleValue = selectedValue as string;\n if (singleValue) {\n const date = new Date(singleValue);\n if (!isNaN(date.getTime())) {\n selectedDates.push(date);\n }\n }\n }\n \n // Only add days from the current month\n const previousMonth = new Date(firstDay);\n while (previousMonth.getDay() !== 0) {\n previousMonth.setDate(previousMonth.getDate() - 1);\n days.unshift({\n date: new Date(previousMonth),\n day: previousMonth.getDate(),\n isOtherMonth: true,\n isToday: this.isSameDay(previousMonth, today),\n isSelected: selectedDates.some(selectedDate => this.isSameDay(previousMonth, selectedDate)),\n });\n }\n const currentDate = new Date(firstDay);\n while (currentDate <= lastDay) {\n const isToday = this.isSameDay(currentDate, today);\n const isSelected = selectedDates.some(selectedDate => this.isSameDay(currentDate, selectedDate));\n \n // Range styling flags\n const isRangeStart = rangeStart ? this.isSameDay(currentDate, rangeStart) : false;\n const isRangeEnd = rangeEnd ? this.isSameDay(currentDate, rangeEnd) : false;\n const isInRange = !!(rangeStart && rangeEnd && currentDate >= rangeStart && currentDate <= rangeEnd && !isRangeStart && !isRangeEnd);\n \n days.push({\n date: new Date(currentDate),\n day: currentDate.getDate(),\n isOtherMonth: false,\n isToday,\n isSelected,\n isRangeStart,\n isRangeEnd,\n isInRange\n });\n currentDate.setDate(currentDate.getDate() + 1);\n }\n const nextMonthDate = new Date(lastDay);\n while (nextMonthDate.getDay() < 6) {\n nextMonthDate.setDate(nextMonthDate.getDate() + 1);\n days.push({\n date: new Date(nextMonthDate),\n day: nextMonthDate.getDate(),\n isOtherMonth: true,\n isToday: this.isSameDay(nextMonthDate, today),\n isSelected: selectedDates.some(selectedDate => this.isSameDay(nextMonthDate, selectedDate)),\n });\n }\n return days;\n }\n \n readonly FormUtils = FormUtils;\n\n constructor(private elementRef: ElementRef) {\n effect(() => {\n const control = this.control();\n // console.log('LiteDate initialized with control:', control);\n \n // Subscribe to form control value changes to trigger reactivity\n if (control && control.formControl) {\n const subscription = control.formControl.valueChanges.subscribe(value => {\n console.log('Form value changed:', value);\n this.formValueChangeSignal.set(Date.now()); // Use timestamp to ensure change detection\n });\n \n // Initial trigger\n this.formValueChangeSignal.set(Date.now());\n }\n });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: Event): void {\n if (!this.elementRef.nativeElement.contains(event.target as Node)) {\n this.showCalendar.set(false);\n }\n }\n\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n onDateChange(event: Event) {\n const target = event.target as HTMLInputElement;\n const inputValue = target.value;\n \n if (!inputValue) {\n if (this.range()) {\n const newValue = ['', ''];\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n } else {\n (this.control().formControl as FormControl<string>).setValue('');\n this.formValueChangeSignal.set(Date.now());\n }\n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n return;\n }\n \n if (this.range()) {\n // Range mode - check if input contains \" - \" separator\n if (inputValue.includes(' - ')) {\n const rangeParts = inputValue.split(' - ');\n if (rangeParts.length === 2) {\n const startDateParsed = this.parseFormattedDate(rangeParts[0].trim(), this.format());\n const endDateParsed = this.parseFormattedDate(rangeParts[1].trim(), this.format());\n \n if (startDateParsed && endDateParsed) {\n // Store as ISO date strings for consistency\n const startIso = this.toLocalISOString(startDateParsed);\n const endIso = this.toLocalISOString(endDateParsed);\n \n // Ensure start date is before end date\n let newValue: string[];\n if (startDateParsed <= endDateParsed) {\n newValue = [startIso, endIso];\n } else {\n newValue = [endIso, startIso];\n }\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n } else {\n // If parsing fails, store the raw input values\n const newValue = [rangeParts[0].trim(), rangeParts[1].trim()];\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n }\n } else {\n // Invalid range format, store as single date\n const parsedDate = this.parseFormattedDate(inputValue, this.format());\n let newValue: string[];\n if (parsedDate) {\n const isoString = this.toLocalISOString(parsedDate);\n newValue = [isoString, ''];\n } else {\n newValue = [inputValue, ''];\n }\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n }\n } else {\n // Single date input in range mode\n const parsedDate = this.parseFormattedDate(inputValue, this.format());\n let newValue: string[];\n if (parsedDate) {\n const isoString = this.toLocalISOString(parsedDate);\n newValue = [isoString, ''];\n } else {\n newValue = [inputValue, ''];\n }\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n }\n } else {\n // Single mode - try to parse the formatted date input\n const parsedDate = this.parseFormattedDate(inputValue, this.format());\n let newValue: string;\n if (parsedDate) {\n // Store as ISO date string for consistency\n newValue = this.toLocalISOString(parsedDate);\n } else {\n // If parsing fails, store the raw input value\n newValue = inputValue;\n }\n (this.control().formControl as FormControl<string>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now());\n }\n \n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n }\n\n private parseFormattedDate(dateString: string, format: string): Date | null {\n try {\n // Create a regex pattern from the format\n let pattern = format\n .replace('dd', '(\\\\d{1,2})')\n .replace('MM', '(\\\\d{1,2})')\n .replace('yyyy', '(\\\\d{4})');\n \n const regex = new RegExp(`^${pattern}$`);\n const match = dateString.match(regex);\n \n if (!match) return null;\n \n // Extract parts based on format\n let day: number, month: number, year: number;\n \n if (format === 'dd/MM/yyyy') {\n day = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n year = parseInt(match[3], 10);\n } else if (format === 'MM/dd/yyyy') {\n month = parseInt(match[1], 10) - 1; // Month is 0-indexed\n day = parseInt(match[2], 10);\n year = parseInt(match[3], 10);\n } else if (format === 'yyyy-MM-dd') {\n year = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n day = parseInt(match[3], 10);\n } else {\n // Default to dd/MM/yyyy\n day = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1;\n year = parseInt(match[3], 10);\n }\n \n const date = new Date(year, month, day);\n \n // Validate the date\n if (date.getFullYear() === year && \n date.getMonth() === month && \n date.getDate() === day) {\n return date;\n }\n \n return null;\n } catch {\n return null;\n }\n }\n\n getFormattedValue(): string {\n const value = this.control().formControl.value;\n if (!value) return '';\n \n if (this.range()) {\n // Range mode - value is string[]\n const rangeValue = value as string[];\n if (rangeValue && rangeValue.length >= 2) {\n const dates = [];\n if (rangeValue[0]) {\n const startDate = new Date(rangeValue[0]);\n if (!isNaN(startDate.getTime())) {\n dates.push(this.formatDate(startDate, this.format()));\n }\n }\n if (rangeValue[1]) {\n const endDate = new Date(rangeValue[1]);\n if (!isNaN(endDate.getTime())) {\n dates.push(this.formatDate(endDate, this.format()));\n }\n }\n if (dates.length === 2) {\n return `${dates[0]} - ${dates[1]}`;\n } else if (dates.length === 1) {\n return dates[0];\n }\n }\n return '';\n } else {\n // Single mode - value is string\n const singleValue = value as string;\n if (singleValue) {\n const date = new Date(singleValue);\n if (!isNaN(date.getTime())) {\n return this.formatDate(date, this.format());\n }\n return singleValue; // Return original value if invalid date\n }\n return '';\n }\n }\n\n getDisplayValue(): string {\n const value = this.control().formControl.value;\n if (!value) return 'Not selected';\n \n if (this.range()) {\n // Range mode - value is string[]\n const rangeValue = value as string[];\n if (rangeValue && rangeValue.length >= 2) {\n const dates = [];\n if (rangeValue[0]) {\n const startDate = new Date(rangeValue[0]);\n if (!isNaN(startDate.getTime())) {\n dates.push(this.formatDate(startDate, this.format()));\n }\n }\n if (rangeValue[1]) {\n const endDate = new Date(rangeValue[1]);\n if (!isNaN(endDate.getTime())) {\n dates.push(this.formatDate(endDate, this.format()));\n }\n }\n if (dates.length === 2) {\n return `${dates[0]} - ${dates[1]}`;\n } else if (dates.length === 1) {\n return dates[0];\n }\n }\n return 'Not selected';\n } else {\n // Single mode - value is string\n const singleValue = value as string;\n if (singleValue) {\n const date = new Date(singleValue);\n if (!isNaN(date.getTime())) {\n return this.formatDate(date, this.format());\n }\n return singleValue;\n }\n return 'Not selected';\n }\n }\n\n private formatDate(date: Date, format: string): string {\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear().toString();\n \n return format\n .replace('dd', day)\n .replace('MM', month)\n .replace('yyyy', year);\n }\n\n // Calendar methods\n toggleCalendar(): void {\n if (!this.showCalendar()) {\n this.calculateCalendarPosition();\n this.setCalendarToSelectedDate();\n }\n this.showCalendar.set(!this.showCalendar());\n }\n\n private setCalendarToSelectedDate(): void {\n const selectedValue = this.control().formControl.value;\n if (selectedValue) {\n let selectedDate: Date | null = null;\n \n if (this.range()) {\n // Range mode - use first date if available\n const rangeValue = selectedValue as string[];\n if (rangeValue && rangeValue.length > 0 && rangeValue[0]) {\n selectedDate = new Date(rangeValue[0]);\n }\n } else {\n // Single mode\n const singleValue = selectedValue as string;\n if (singleValue) {\n selectedDate = new Date(singleValue);\n }\n }\n \n if (selectedDate && !isNaN(selectedDate.getTime())) {\n // Set calendar to show the month of the selected date\n const selectedMonth = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1);\n this.currentMonth.set(selectedMonth);\n }\n }\n }\n\n private calculateCalendarPosition(): void {\n const element = this.elementRef.nativeElement;\n const rect = element.getBoundingClientRect();\n const calendarHeight = 300; // Approximate height of calendar panel\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n \n // If not enough space below and more space above, position on top\n if (spaceBelow < calendarHeight && spaceAbove > spaceBelow) {\n this.calendarPosition.set('top');\n } else {\n this.calendarPosition.set('bottom');\n }\n }\n\n getMonthYearDisplay(): string {\n const date = this.currentMonth();\n return date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n }\n\n getSecondMonthYearDisplay(): string {\n const date = this.secondMonth();\n return date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n }\n\n previousMonth(): void {\n const current = this.currentMonth();\n const newDate = new Date(current.getFullYear(), current.getMonth() - 1, 1);\n this.currentMonth.set(newDate);\n }\n\n nextMonth(): void {\n const current = this.currentMonth();\n const newDate = new Date(current.getFullYear(), current.getMonth() + 1, 1);\n this.currentMonth.set(newDate);\n }\n\n selectDate(day: CalendarDay): void {\n const dateString = this.toLocalISOString(day.date);\n \n if (this.range()) {\n // Range mode - handle start and end date selection\n const currentValue = this.control().formControl.value as string[];\n const currentRange = currentValue || ['', ''];\n \n if (!currentRange[0] || (currentRange[0] && currentRange[1])) {\n // Set start date if no start date or both dates are set (reset)\n // Clear any existing range formatting by setting only the start date\n const newValue = [dateString, ''];\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n } else {\n // Set end date\n const startDate = new Date(currentRange[0]);\n const endDate = new Date(dateString);\n \n // Check if clicking the same date as start date\n if (this.isSameDay(startDate, endDate)) {\n // Reset to just the start date\n const newValue = [dateString, ''];\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n } else {\n // Ensure start date is before end date\n let newValue: string[];\n if (startDate <= endDate) {\n newValue = [currentRange[0], dateString];\n } else {\n newValue = [dateString, currentRange[0]];\n }\n (this.control().formControl as FormControl<string[]>).setValue(newValue);\n this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n \n // Auto-hide calendar after 1 second when second date is selected\n setTimeout(() => {\n this.showCalendar.set(false);\n }, 1000);\n }\n }\n } else {\n // Single mode\n (this.control().formControl as FormControl<string>).setValue(dateString);\n this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n this.showCalendar.set(false); // Close calendar after selection\n }\n \n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n }\n\n private isSameDay(date1: Date, date2: Date): boolean {\n return date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate();\n }\n\n // Helper method to convert Date to ISO date string without timezone conversion\n private toLocalISOString(date: Date): string {\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n}\n","<div class=\"lite-date\" [ngClass]=\"{'in-edit': inEdit(), 'invalid': hasErrors()}\">\n @if (inEdit()) {\n <input type=\"text\" \n [value]=\"getFormattedValue()\" \n (change)=\"onDateChange($event)\"\n [class.invalid]=\"hasErrors()\"\n [placeholder]=\"range() ? format() + ' - ' + format() : format()\" />\n <label class=\"label\" [ngClass]=\"{'float': getFormattedValue()}\">\n {{ control().label }}<span *ngIf=\"isRequired()\">*</span>\n </label>\n <div class=\"calendar_icon\" (click)=\"toggleCalendar()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"calendar\" viewBox=\"0 0 16 16\">\n <path d=\"M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1.5A1.5 1.5 0 0 1 16 2.5v11A1.5 1.5 0 0 1 14.5 15H1.5A1.5 1.5 0 0 1 0 13.5v-11A1.5 1.5 0 0 1 1.5 1H3V.5a.5.5 0 0 1 .5-.5zM1.5 2a.5.5 0 0 0-.5.5V4h14V2.5a.5.5 0 0 0-.5-.5H13v.5a.5.5 0 0 1-1 0V2H4v.5a.5.5 0 0 1-1 0V2H1.5zM15 5H1v8.5a.5.5 0 0 0 .5.5h13a.5.5 0 0 0 .5-.5V5z\"/>\n </svg>\n </div>\n \n @if (showCalendar()) {\n <div class=\"calendar-overlay\" [ngClass]=\"'position-' + calendarPosition()\">\n <ng-container *ngTemplateOutlet=\"calendarPanel\"></ng-container>\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">\n {{ getDisplayValue() }}\n </div>\n }\n\n @if (inEdit() && hasErrors()) {\n <div class=\"error-messages\">\n @for (error of getErrorMessage(); track error) {\n <div class=\"error-message\">{{ error }}</div>\n }\n </div>\n }\n</div>\n<ng-template #calendarPanel>\n <div class=\"calendar-panel\" [ngClass]=\"{'range-mode': range()}\">\n @if (range()) {\n <!-- Range mode: Two month calendars side by side -->\n <div class=\"dual-calendar\">\n <!-- First month -->\n <div class=\"calendar-month\">\n <div class=\"calendar-header\">\n <button type=\"button\" class=\"nav-button\" (click)=\"previousMonth()\">‹</button>\n <span class=\"month-year\">{{ getMonthYearDisplay() }}</span>\n <div class=\"nav-spacer\"></div>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"weekdays\">\n <div class=\"weekday\">Su</div>\n <div class=\"weekday\">Mo</div>\n <div class=\"weekday\">Tu</div>\n <div class=\"weekday\">We</div>\n <div class=\"weekday\">Th</div>\n <div class=\"weekday\">Fr</div>\n <div class=\"weekday\">Sa</div>\n </div>\n <div class=\"calendar-days\">\n @for (day of calendarDays(); track day.date) {\n <div class=\"calendar-day\" [ngClass]=\"{ \n 'today': day.isToday, \n 'selected': day.isSelected,\n 'dim': day.isOtherMonth,\n 'range-start': day.isRangeStart,\n 'range-end': day.isRangeEnd,\n 'in-range': day.isInRange\n }\" (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n }\n </div>\n </div>\n </div>\n \n <!-- Second month -->\n <div class=\"calendar-month\">\n <div class=\"calendar-header\">\n <div class=\"nav-spacer\"></div>\n <span class=\"month-year\">{{ getSecondMonthYearDisplay() }}</span>\n <button type=\"button\" class=\"nav-button\" (click)=\"nextMonth()\">›</button>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"weekdays\">\n <div class=\"weekday\">Su</div>\n <div class=\"weekday\">Mo</div>\n <div class=\"weekday\">Tu</div>\n <div class=\"weekday\">We</div>\n <div class=\"weekday\">Th</div>\n <div class=\"weekday\">Fr</div>\n <div class=\"weekday\">Sa</div>\n </div>\n <div class=\"calendar-days\">\n @for (day of secondCalendarDays(); track day.date) {\n <div class=\"calendar-day\" [ngClass]=\"{ \n 'today': day.isToday, \n 'selected': day.isSelected,\n 'dim': day.isOtherMonth,\n 'range-start': day.isRangeStart,\n 'range-end': day.isRangeEnd,\n 'in-range': day.isInRange\n }\" (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n } @else {\n <!-- Single month mode -->\n <div class=\"calendar-header\">\n <button type=\"button\" class=\"nav-button\" (click)=\"previousMonth()\">‹</button>\n <span class=\"month-year\">{{ getMonthYearDisplay() }}</span>\n <button type=\"button\" class=\"nav-button\" (click)=\"nextMonth()\">›</button>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"weekdays\">\n <div class=\"weekday\">Su</div>\n <div class=\"weekday\">Mo</div>\n <div class=\"weekday\">Tu</div>\n <div class=\"weekday\">We</div>\n <div class=\"weekday\">Th</div>\n <div class=\"weekday\">Fr</div>\n <div class=\"weekday\">Sa</div>\n </div>\n <div class=\"calendar-days\">\n @for (day of calendarDays(); track day.date) {\n <div class=\"calendar-day\" [ngClass]=\"{ \n 'today': day.isToday, \n 'selected': day.isSelected,\n 'dim': day.isOtherMonth,\n 'range-start': day.isRangeStart,\n 'range-end': day.isRangeEnd,\n 'in-range': day.isInRange\n }\" (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n }\n </div>\n </div>\n }\n </div>\n</ng-template>\n","import { Component, effect, input, signal, computed } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n selector: 'lite-password',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-password.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LitePassword {\n inEdit = input<boolean>(true);\n control = input<FieldDto>({ label: '', formControl: new FormControl('') });\n showToggle = input<boolean>(true);\n showStrengthIndicator = input<boolean>(false);\n \n readonly FormUtils = FormUtils;\n showPassword = signal<boolean>(false);\n\n // Computed password strength analysis\n passwordStrength = computed(() => {\n const password = this.control().formControl.value || '';\n return FormUtils.analyzePasswordStrength(password);\n });\n\n constructor() {\n effect(() => {\n // console.log('LitePassword initialized with control:', this.control());\n });\n }\n\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getPasswordErrorMessages(this.control().formControl, this.control().label);\n }\n\n togglePasswordVisibility() {\n this.showPassword.set(!this.showPassword());\n }\n\n getInputType(): string {\n return this.showPassword() ? 'text' : 'password';\n }\n\n getDisplayValue(): string {\n const value = this.control().formControl.value;\n return value ? '••••••••' : '';\n }\n}\n","<div class=\"lite-password\" [ngClass]=\"{'in-edit': inEdit()}\">\n @if (inEdit()) {\n <div class=\"input-container\">\n <input \n [type]=\"getInputType()\" \n [formControl]=\"control().formControl\" \n placeholder=\"\" \n [ngClass]=\"{'invalid': hasErrors()}\" />\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n @if (showToggle() && control().formControl.value) {\n <button \n type=\"button\" \n class=\"toggle-button\" \n (click)=\"togglePasswordVisibility()\"\n [attr.aria-label]=\"showPassword() ? 'Hide password' : 'Show password'\">\n @if (showPassword()) {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/>\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/>\n </svg>\n } @else {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n </svg>\n }\n </button>\n }\n </div>\n @if (showStrengthIndicator() && control().formControl.value) {\n <div class=\"password-strength\">\n <div class=\"strength-bar\">\n <div class=\"strength-fill\" [ngClass]=\"'strength-' + passwordStrength().level.toLowerCase().replace(' ', '-')\"></div>\n </div>\n <div class=\"strength-info\">\n <span class=\"strength-level\" [ngClass]=\"'level-' + passwordStrength().level.toLowerCase().replace(' ', '-')\">\n {{ passwordStrength().level }}\n </span>\n <span class=\"strength-score\">({{ passwordStrength().score }}/8)</span>\n </div>\n @if (passwordStrength().feedback.length > 0) {\n <div class=\"strength-feedback\">\n @for (tip of passwordStrength().feedback; track tip) {\n <div class=\"feedback-tip\">• {{ tip }}</div>\n }\n </div>\n }\n </div>\n }\n @if (hasErrors()) {\n <div class=\"error-messages\">\n @for (errorMessage of getErrorMessage(); track errorMessage) {\n <div class=\"error-message\">{{ errorMessage }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">{{ getDisplayValue() }}</div>\n }\n</div>\n","import { Component, effect, input, signal, computed, ViewChild, ElementRef } from '@angular/core';\nimport { FieldDto, FileFieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nexport interface FileItem {\n id: string;\n file: File;\n name: string;\n size: number;\n type: string;\n url?: string;\n uploadProgress?: number;\n isUploading?: boolean;\n error?: string;\n}\n\n@Component({\n selector: 'lite-file',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-file.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteFile {\n file_icon = `<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"file-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n <polyline points=\"14,2 14,8 20,8\"></polyline><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line>\n <polyline points=\"10,9 9,9 8,9\"></polyline></svg>`\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n @ViewChild('cameraInput') cameraInput!: ElementRef<HTMLInputElement>;\n\n inEdit = input<boolean>(true);\n control = input<FileFieldDto>({ label: '', formControl: new FormControl<FileItem[]>([]) });\n \n readonly FormUtils = FormUtils;\n \n // State signals\n files = signal<FileItem[]>([]);\n showPanel = signal<boolean>(false);\n isDragOver = signal<boolean>(false);\n isUploading = signal<boolean>(false);\n\n // Computed values\n fileCount = computed(() => this.files().length);\n totalSize = computed(() => \n this.files().reduce((total, file) => total + file.size, 0)\n );\n hasErrors = computed(() => \n this.files().some(file => file.error)\n );\n \n // Get configuration from control\n multiple = computed(() => this.control().multiple ?? true);\n accept = computed(() => this.control().accept ?? '*/*');\n maxFileSize = computed(() => this.control().maxFileSize ?? 10 * 1024 * 1024);\n maxFiles = computed(() => this.control().maxFiles ?? 10);\n showPreview = computed(() => this.control().showPreview ?? true);\n\n constructor(private sanitizer: DomSanitizer) {\n effect(() => {\n // console.log('LiteFile initialized with control:', this.control());\n \n // Sync files with form control\n const controlValue = this.control().formControl.value || [];\n if (Array.isArray(controlValue)) {\n this.files.set(controlValue);\n }\n });\n\n // Watch files changes and update form control\n effect(() => {\n const currentFiles = this.files();\n this.control().formControl.setValue(currentFiles);\n });\n }\n\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasFormErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n // File operations\n onFileSelect(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n this.handleFiles(Array.from(input.files));\n }\n // Reset input\n input.value = '';\n }\n\n onCameraCapture(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n this.handleFiles(Array.from(input.files));\n }\n // Reset input\n input.value = '';\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(true);\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n\n const files = Array.from(event.dataTransfer?.files || []);\n this.handleFiles(files);\n }\n svgToBase64DataUrl(svgString: string): SafeHtml {\n const base64 = btoa(svgString);\n const img = `data:image/svg+xml;base64,${base64}`;\n return this.sanitizer.bypassSecurityTrustUrl(img);\n }\n\n private handleFiles(newFiles: File[]) {\n const currentFiles = this.files();\n const processedFiles: FileItem[] = [];\n\n for (const file of newFiles) {\n // Check file count limit\n if (!this.multiple() && currentFiles.length >= 1) {\n console.warn('Multiple files not allowed');\n break;\n }\n\n if (currentFiles.length + processedFiles.length >= this.maxFiles()) {\n console.warn(`Maximum ${this.maxFiles()} files allowed`);\n break;\n }\n\n // Validate file\n const validation = this.validateFile(file);\n \n const fileItem: FileItem = {\n id: this.generateFileId(),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n error: validation.error\n };\n\n // Create preview URL for images\n if (this.showPreview() && file.type.startsWith('image/')) {\n fileItem.url = URL.createObjectURL(file);\n }\n\n processedFiles.push(fileItem);\n }\n\n // Update files\n if (this.multiple()) {\n this.files.set([...currentFiles, ...processedFiles]);\n } else {\n this.files.set(processedFiles.slice(0, 1));\n }\n }\n\n private validateFile(file: File): { valid: boolean; error?: string } {\n // Check file size\n if (file.size > this.maxFileSize()) {\n return {\n valid: false,\n error: `File size exceeds ${this.formatFileSize(this.maxFileSize())}`\n };\n }\n\n // Check file type if accept is specified\n const acceptTypes = this.accept();\n if (acceptTypes && acceptTypes !== '*/*') {\n const allowedTypes = acceptTypes.split(',').map((type: string) => type.trim());\n const isAllowed = allowedTypes.some((allowedType: string) => {\n if (allowedType.startsWith('.')) {\n return file.name.toLowerCase().endsWith(allowedType.toLowerCase());\n }\n return file.type.match(new RegExp(allowedType.replace('*', '.*')));\n });\n\n if (!isAllowed) {\n return {\n valid: false,\n error: `File type not allowed. Accepted: ${acceptTypes}`\n };\n }\n }\n\n return { valid: true };\n }\n\n removeFile(fileId: string) {\n const currentFiles = this.files();\n const fileToRemove = currentFiles.find(f => f.id === fileId);\n \n // Revoke object URL to prevent memory leaks\n if (fileToRemove?.url) {\n URL.revokeObjectURL(fileToRemove.url);\n }\n\n this.files.set(currentFiles.filter(f => f.id !== fileId));\n }\n\n clearAllFiles() {\n // Revoke all object URLs\n this.files().forEach(file => {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n });\n\n this.files.set([]);\n }\n\n // UI actions\n togglePanel() {\n this.showPanel.set(!this.showPanel());\n }\n\n closePanel() {\n this.showPanel.set(false);\n }\n\n openFileDialog() {\n this.fileInput.nativeElement.click();\n }\n\n openCameraDialog() {\n this.cameraInput.nativeElement.click();\n }\n\n // Utility methods\n private generateFileId(): string {\n return Math.random().toString(36).substr(2, 9);\n }\n\n formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n\n getFileIcon(fileType: string): string {\n if (fileType.startsWith('image/')) return '🖼️';\n if (fileType.startsWith('video/')) return '🎥';\n if (fileType.startsWith('audio/')) return '🎵';\n if (fileType.includes('pdf')) return '📄';\n if (fileType.includes('word')) return '📝';\n if (fileType.includes('excel') || fileType.includes('spreadsheet')) return '📊';\n if (fileType.includes('powerpoint') || fileType.includes('presentation')) return '📋';\n if (fileType.includes('zip') || fileType.includes('rar')) return '🗜️';\n return '📁';\n }\n\n isImage(fileType: string): boolean {\n return fileType.startsWith('image/');\n }\n\n getTotalSizeFormatted(): string {\n return this.formatFileSize(this.totalSize());\n }\n}\n","<div class=\"lite-file\" [class.in-edit]=\"inEdit()\">\n <label class=\"label\" [class.required]=\"isRequired()\">{{ control().label }}</label>\n <button [class.has-files]=\"fileCount() > 0\" [class.has-errors]=\"hasErrors()\" (click)=\"togglePanel()\">\n <img [src]=\"svgToBase64DataUrl(file_icon)\" alt=\"file icon\">\n <!-- Badge -->\n <span class=\"file-badge\">\n {{ fileCount() }}\n </span>\n </button>\n\n</div>\n<!-- Panel overlay -->\n<div class=\"panel-overlay\" \n [class.visible]=\"showPanel()\" \n (click)=\"closePanel()\">\n</div>\n<!-- Management panel -->\n<div class=\"file-panel\" [class.visible]=\"showPanel()\">\n <div class=\"panel-header\">\n <h3>File Management</h3>\n <button (click)=\"closePanel()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n\n <div class=\"panel-content\">\n <!-- File upload area -->\n <div class=\"upload-area\" \n [class.drag-over]=\"isDragOver()\"\n [class.uploading]=\"isUploading()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n (click)=\"openFileDialog()\">\n \n <div class=\"upload-content\">\n <svg class=\"upload-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"7,10 12,15 17,10\"></polyline>\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\n </svg>\n <p>Drop files here or click to browse</p>\n <small>Max {{ maxFiles() }} files, {{ formatFileSize(maxFileSize()) }} each</small>\n </div>\n\n <!-- Hidden file inputs -->\n <input #fileInput\n type=\"file\"\n [multiple]=\"multiple()\"\n [accept]=\"accept()\"\n (change)=\"onFileSelect($event)\"\n style=\"display: none;\">\n\n <input #cameraInput\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n (change)=\"onCameraCapture($event)\"\n style=\"display: none;\">\n </div>\n\n <!-- Action buttons -->\n <div class=\"action-buttons\">\n <button type=\"button\" class=\"action-btn upload-btn\" (click)=\"openFileDialog()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"17,8 12,3 7,8\"></polyline>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"></line>\n </svg>\n Upload Files\n </button>\n\n <button type=\"button\" class=\"action-btn camera-btn\" (click)=\"openCameraDialog()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"></path>\n <circle cx=\"12\" cy=\"13\" r=\"4\"></circle>\n </svg>\n Take Picture\n </button>\n\n <button type=\"button\" class=\"action-btn close-btn\" (click)=\"closePanel()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n Close\n </button>\n </div>\n\n <!-- File list -->\n <div class=\"file-list\" *ngIf=\"fileCount() > 0\">\n <div class=\"file-list-header\">\n <span>Files ({{ fileCount() }})</span>\n <span class=\"total-size\">{{ getTotalSizeFormatted() }}</span>\n <button type=\"button\" class=\"clear-all-btn\" (click)=\"clearAllFiles()\">\n Clear All\n </button>\n </div>\n\n <div class=\"file-items\">\n <div class=\"file-item\" \n *ngFor=\"let file of files()\" \n [class.has-error]=\"file.error\"\n [class.uploading]=\"file.isUploading\">\n \n <!-- File preview/icon -->\n <div class=\"file-preview\">\n <img *ngIf=\"file.url && isImage(file.type)\" \n [src]=\"file.url\" \n [alt]=\"file.name\"\n class=\"preview-image\">\n <span *ngIf=\"!file.url || !isImage(file.type)\" \n class=\"file-type-icon\">\n {{ getFileIcon(file.type) }}\n </span>\n </div>\n\n <!-- File info -->\n <div class=\"file-info\">\n <div class=\"file-name\" [title]=\"file.name\">{{ file.name }}</div>\n <div class=\"file-details\">\n <span class=\"file-size\">{{ formatFileSize(file.size) }}</span>\n <span class=\"file-type\">{{ file.type || 'Unknown' }}</span>\n </div>\n <div class=\"file-error\" *ngIf=\"file.error\">{{ file.error }}</div>\n \n <!-- Upload progress -->\n <div class=\"upload-progress\" *ngIf=\"file.isUploading && file.uploadProgress !== undefined\">\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width.%]=\"file.uploadProgress\"></div>\n </div>\n <span class=\"progress-text\">{{ file.uploadProgress }}%</span>\n </div>\n </div>\n\n <!-- Remove button -->\n <button type=\"button\" \n class=\"remove-file-btn\" \n (click)=\"removeFile(file.id)\"\n [disabled]=\"file.isUploading\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"3,6 5,6 21,6\"></polyline>\n <path d=\"M19,6v14a2,2,0,0,1-2,2H7a2,2,0,0,1-2-2V6m3,0V4a2,2,0,0,1,2-2h4a2,2,0,0,1,2,2V6\"></path>\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"></line>\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"></line>\n </svg>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Empty state -->\n <div class=\"empty-state\" *ngIf=\"fileCount() === 0\">\n <svg class=\"empty-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n <polyline points=\"14,2 14,8 20,8\"></polyline>\n </svg>\n <p>No files uploaded yet</p>\n <small>Click upload or drag files to get started</small>\n </div>\n </div>\n</div>\n\n<!-- Error messages -->\n<div class=\"error-messages\" *ngIf=\"hasFormErrors()\">\n <div class=\"error-message\" *ngFor=\"let error of getErrorMessage()\">{{ error }}</div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LiteInput } from './lite-input/lite-input';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { LiteTextarea } from './lite-textarea/lite-textarea';\nimport { LiteSelect } from './lite-select/lite-select';\nimport { LiteMultiSelect } from './lite-multi-select/lite-multi-select';\nimport { LiteRadio } from './lite-radio/lite-radio';\nimport { LiteCheckbox } from './lite-checkbox/lite-checkbox';\nimport { LiteDate } from './lite-date/lite-date';\nimport { LitePassword } from './lite-password/lite-password';\nimport { LiteFile } from './lite-file/lite-file';\nimport { LiteDateTime } from '../public-api';\n\n@NgModule({\n imports: [\n CommonModule, FormsModule, ReactiveFormsModule,\n LiteInput, LiteTextarea, LiteSelect, LiteMultiSelect, LiteRadio, LiteCheckbox, LiteDate, LitePassword, LiteFile, LiteDateTime\n ],\n exports: [\n LiteInput, LiteTextarea, LiteSelect, LiteMultiSelect, LiteRadio, LiteCheckbox, LiteDate, LitePassword, LiteFile, LiteDateTime\n ]\n})\nexport class LiteFormModule { }","import { Form, FormControl } from \"@angular/forms\";\n\nexport class FieldDto {\n label: string;\n formControl: FormControl;\n rows?: number;\n type?: 'text' | 'number';\n\n constructor(label: string, formControl: FormControl, rows: number = 2, type: 'text' | 'number' = 'text') {\n this.label = label;\n this.formControl = formControl;\n this.rows = rows;\n this.type = type;\n }\n}\n\nexport abstract class BaseSelectFieldDto<T = any> {\n label: string;\n options: T[];\n displayWith: (option: T) => string;\n \n constructor(\n label: string,\n options: T[],\n displayWith: (option: T) => string\n ) {\n this.label = label;\n this.options = options;\n this.displayWith = displayWith;\n }\n}\n\nexport class SelectFieldDto<T = any> extends BaseSelectFieldDto<T> {\n formControl: FormControl<T>;\n \n constructor(\n label: string,\n formControl: FormControl<T>,\n options: T[],\n displayWith: (option: T) => string\n ) {\n super(label, options, displayWith);\n this.formControl = formControl;\n }\n}\n\nexport class MultiSelectFieldDto<T = any> extends BaseSelectFieldDto<T> {\n formControl: FormControl<T[]>;\n \n constructor(\n label: string,\n formControl: FormControl<T[]>,\n options: T[],\n displayWith: (option: T) => string\n ) {\n super(label, options, displayWith);\n this.formControl = formControl;\n }\n}\n\nexport class RadioFieldDto<T = any> extends BaseSelectFieldDto<T> {\n formControl: FormControl<T>;\n \n constructor(\n label: string,\n formControl: FormControl<T>,\n options: T[],\n displayWith: (option: T) => string\n ) {\n super(label, options, displayWith);\n this.formControl = formControl;\n }\n}\n\nexport class FileFieldDto {\n label: string;\n formControl: FormControl;\n multiple?: boolean;\n accept?: string;\n maxFileSize?: number;\n maxFiles?: number;\n showPreview?: boolean;\n\n constructor(\n label: string,\n formControl: FormControl,\n multiple: boolean = true,\n accept: string = '*/*',\n maxFileSize: number = 10 * 1024 * 1024, // 10MB\n maxFiles: number = 10,\n showPreview: boolean = true\n ) {\n this.label = label;\n this.formControl = formControl;\n this.multiple = multiple;\n this.accept = accept;\n this.maxFileSize = maxFileSize;\n this.maxFiles = maxFiles;\n this.showPreview = showPreview;\n }\n}\n\nexport type SnackbarType = 'done' | 'warn' | 'error';\n","import { Component, effect, input, signal, ElementRef, HostListener, computed } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\nimport { FieldDto } from '../field-dto';\n\ninterface CalendarDateTime {\n date: Date;\n day: number;\n isOtherMonth: boolean;\n isToday: boolean;\n isSelected: boolean;\n}\n\n@Component({\n selector: 'lite-datetime',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: `./lite-datetime.html`,\n styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteDateTime {\n inEdit = input<boolean>(true);\n control = input<FieldDto>({ \n label: '', \n formControl: new FormControl<string>('', { nonNullable: true }),\n });\n format = input<string>('dd/MM/yyyy HH:mm');\n \n // Calendar state\n currentMonth = signal<Date>(new Date());\n showCalendar = signal<boolean>(false);\n calendarPosition = signal<'bottom' | 'top'>('bottom');\n formattedValue = signal<string>('');\n hourSet = new Array(24).fill(0).map((_, i) => i);\n minSet = new Array(12).fill(0).map((_, i) => i * 5);\n selectedHour = new Date().getHours();\n selectedMinute = 0;\n selectedDateTime: CalendarDateTime | null = null;\n // Signal to track form control value changes for reactivity\n // private formValueChangeSignal = signal<any>(null);\n \n // Computed calendar days - only recalculates when dependencies change\n calendarDays = computed(() => {\n // This makes the computed reactive to form value changes\n // this.formValueChangeSignal();\n return this.getMonthDays(this.currentMonth());\n });\n\n private getMonthDays(monthDate: Date): CalendarDateTime[] {\n const year = monthDate.getFullYear();\n const month = monthDate.getMonth();\n \n // First day of the month\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n \n const days: CalendarDateTime[] = [];\n const today = new Date();\n const value = this.control().formControl.value;\n\n // Single mode - value should be string\n if (value) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n this.selectedDateTime = {\n date,\n day: date.getDate(),\n isOtherMonth: false,\n isToday: this.isSameDay(date, today),\n isSelected: true,\n };\n }\n }\n \n // Only add days from the current month\n const previousMonthDate = new Date(firstDay);\n while (previousMonthDate.getDay() !== 0) {\n previousMonthDate.setDate(previousMonthDate.getDate() - 1);\n days.unshift({\n date: new Date(previousMonthDate),\n day: previousMonthDate.getDate(),\n isOtherMonth: true,\n isToday: this.isSameDay(previousMonthDate, today),\n isSelected: this.isSameDay(previousMonthDate, this.selectedDateTime ? this.selectedDateTime.date : null),\n });\n }\n const currentDate = new Date(firstDay);\n while (currentDate <= lastDay) {\n const isToday = this.isSameDay(currentDate, today);\n const isSelected = this.isSameDay(currentDate, this.selectedDateTime ? this.selectedDateTime.date : null);\n days.push({\n date: new Date(currentDate),\n day: currentDate.getDate(),\n isOtherMonth: false,\n isToday,\n isSelected,\n });\n currentDate.setDate(currentDate.getDate() + 1);\n }\n const nextMonthDate = new Date(lastDay);\n while (nextMonthDate.getDay() < 6) {\n nextMonthDate.setDate(nextMonthDate.getDate() + 1);\n days.push({\n date: new Date(nextMonthDate),\n day: nextMonthDate.getDate(),\n isOtherMonth: true,\n isToday: this.isSameDay(nextMonthDate, today),\n isSelected: this.isSameDay(nextMonthDate, this.selectedDateTime ? this.selectedDateTime.date : null),\n });\n }\n return days;\n }\n \n readonly FormUtils = FormUtils;\n\n constructor(private elementRef: ElementRef) {\n effect(() => {\n const control = this.control();\n // console.log('LiteDateTime with control:', control);\n \n // Subscribe to form control value changes to trigger reactivity\n if (control && control.formControl) {\n control.formControl.valueChanges.subscribe(value => {\n if (value) {\n const date = new Date(value);\n // console.log('Form value changed:', value, date, isNaN(date.getTime()));\n if (!isNaN(date.getTime())) {\n console.log('Formatted Date:', this.formatDate(date, this.format()))\n this.formattedValue.set(this.formatDate(date, this.format()));\n } else {\n this.formattedValue.set(value);\n }\n }\n });\n }\n });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: Event): void {\n if (!this.elementRef.nativeElement.contains(event.target as Node)) {\n this.showCalendar.set(false);\n }\n }\n\n isRequired() {\n return this.FormUtils.isRequired(this.control().formControl);\n }\n\n hasErrors(): boolean {\n return FormUtils.hasErrors(this.control().formControl);\n }\n\n getErrorMessage(): string[] {\n return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n }\n\n onDateChange(event: Event) {\n const target = event.target as HTMLInputElement;\n const inputValue = target.value;\n \n if (!inputValue) {\n (this.control().formControl as FormControl<string>).setValue('');\n // this.formValueChangeSignal.set(Date.now());\n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n return;\n }\n \n\n // Single mode - try to parse the formatted date input\n const parsedDate = this.parseFormattedDate(inputValue, this.format());\n let newValue: string;\n if (parsedDate) {\n // Store as ISO date string for consistency\n newValue = this.toLocalISOString(parsedDate);\n } else {\n // If parsing fails, store the raw input value\n newValue = inputValue;\n }\n (this.control().formControl as FormControl<string>).setValue(newValue);\n // this.formValueChangeSignal.set(Date.now());\n \n this.control().formControl.markAsDirty();\n this.control().formControl.markAsTouched();\n }\n onSelectHour(hour: number) {\n this.selectedHour = hour;\n this.setDateTimeSelected(this.selectedDateTime ? this.selectedDateTime.date : new Date());\n }\n onSelectMinute(minute: number) {\n this.selectedMinute = minute;\n this.setDateTimeSelected(this.selectedDateTime ? this.selectedDateTime.date : new Date());\n }\n private setDateTimeSelected(date: Date): void {\n this.selectedDateTime = {\n date,\n day: date.getDate(),\n isOtherMonth: false,\n isToday: date.getDate() === new Date().getDate(),\n isSelected: true,\n };\n const dateString = this.toLocalISOString(this.selectedDateTime.date);\n (this.control().formControl as FormControl<string>).setValue(dateString);\n const calDate = this.calendarDays().find(d => this.isSameDay(d.date, date));\n if (calDate) {calDate.isSelected = true;}\n }\n private parseFormattedDate(dateString: string, format: string): Date | null {\n try {\n // Create a regex pattern from the format\n let pattern = format\n .replace('dd', '(\\\\d{1,2})')\n .replace('MM', '(\\\\d{1,2})')\n .replace('yyyy', '(\\\\d{4})');\n \n const regex = new RegExp(`^${pattern}$`);\n const match = dateString.match(regex);\n \n if (!match) return null;\n \n // Extract parts based on format\n let day: number, month: number, year: number;\n \n if (format === 'dd/MM/yyyy') {\n day = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n year = parseInt(match[3], 10);\n } else if (format === 'MM/dd/yyyy') {\n month = parseInt(match[1], 10) - 1; // Month is 0-indexed\n day = parseInt(match[2], 10);\n year = parseInt(match[3], 10);\n } else if (format === 'yyyy-MM-dd') {\n year = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n day = parseInt(match[3], 10);\n } else {\n // Default to dd/MM/yyyy\n day = parseInt(match[1], 10);\n month = parseInt(match[2], 10) - 1;\n year = parseInt(match[3], 10);\n }\n \n const date = new Date(year, month, day);\n \n // Validate the date\n if (date.getFullYear() === year && \n date.getMonth() === month && \n date.getDate() === day) {\n return date;\n }\n \n return null;\n } catch {\n return null;\n }\n }\n getDisplayValue(): string {\n const value = this.control().formControl.value;\n if (!value) return 'Not selected';\n\n // Single mode - value is string\n const singleValue = value as string;\n if (singleValue) {\n const date = new Date(singleValue);\n if (!isNaN(date.getTime())) {\n return this.formatDate(date, this.format());\n }\n return singleValue;\n }\n return 'Not selected';\n }\n\n private formatDate(date: Date, format: string): string {\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear().toString();\n \n return format\n .replace('dd', day)\n .replace('MM', month)\n .replace('yyyy', year)\n .replace('HH', (this.selectedHour < 10 ? '0' : '') + this.selectedHour)\n .replace('mm', (this.selectedMinute < 10 ? '0' : '') + this.selectedMinute);\n }\n\n // Calendar methods\n toggleCalendar(): void {\n if (!this.showCalendar()) {\n this.calculateCalendarPosition();\n this.setCalendarToSelectedDate();\n }\n this.showCalendar.set(!this.showCalendar());\n }\n\n closeCalendar(): void {\n this.showCalendar.set(false);\n }\n\n private setCalendarToSelectedDate(): void {\n const selectedValue = this.control().formControl.value;\n if (selectedValue) {\n let selectedDate: Date | null = null;\n\n // Single mode\n const singleValue = selectedValue as string;\n if (singleValue) {\n selectedDate = new Date(singleValue);\n }\n \n if (selectedDate && !isNaN(selectedDate.getTime())) {\n // Set calendar to show the month of the selected date\n const selectedMonth = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1);\n this.currentMonth.set(selectedMonth);\n }\n }\n }\n\n private calculateCalendarPosition(): void {\n const element = this.elementRef.nativeElement;\n const rect = element.getBoundingClientRect();\n const calendarHeight = 300; // Approximate height of calendar panel\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n \n // If not enough space below and more space above, position on top\n if (spaceBelow < calendarHeight && spaceAbove > spaceBelow) {\n this.calendarPosition.set('top');\n } else {\n this.calendarPosition.set('bottom');\n }\n }\n\n getMonthYearDisplay(): string {\n const date = this.currentMonth();\n return date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n }\n\n previousMonth(): void {\n const current = this.currentMonth();\n const newDate = new Date(current.getFullYear(), current.getMonth() - 1, 1);\n this.currentMonth.set(newDate);\n }\n\n nextMonth(): void {\n const current = this.currentMonth();\n const newDate = new Date(current.getFullYear(), current.getMonth() + 1, 1);\n this.currentMonth.set(newDate);\n }\n\n selectDate(day: CalendarDateTime): void {\n if (this.selectedDateTime){\n this.selectedDateTime.isSelected = false;\n }\n // this.selectedDateTime = day;\n // this.selectedDateTime.isSelected = true;\n this.setDateTimeSelected(day.date);\n // const dateString = this.toLocalISOString(day.date);\n // (this.control().formControl as FormControl<string>).setValue(dateString);\n // // this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n \n // this.control().formControl.markAsDirty();\n // this.control().formControl.markAsTouched();\n }\n\n private isSameDay(date1: Date, date2: Date | null): boolean {\n if (!date2) return false;\n return date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate();\n }\n\n // Helper method to convert Date to ISO date string without timezone conversion\n private toLocalISOString(date: Date): string {\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n const hh = (this.selectedHour < 10 ? '0' : '') + this.selectedHour;\n const mm = (this.selectedMinute < 10 ? '0' : '') + this.selectedMinute;\n return `${year}-${month}-${day}T${hh}:${mm}:00`;\n }\n\n}\n","<div class=\"lite-date\" [ngClass]=\"{'in-edit': inEdit(), 'invalid': hasErrors()}\">\n @if (inEdit()) {\n <input type=\"text\" \n [value]=\"formattedValue()\" \n (change)=\"onDateChange($event)\"\n [class.invalid]=\"hasErrors()\"\n [placeholder]=\"format()\" />\n <label class=\"label\" [ngClass]=\"{'float': formattedValue()}\">\n {{ control().label }}<span *ngIf=\"isRequired()\">*</span>\n </label>\n <div class=\"calendar_icon\" (click)=\"toggleCalendar()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"calendar\" viewBox=\"0 0 16 16\">\n <path d=\"M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1.5A1.5 1.5 0 0 1 16 2.5v11A1.5 1.5 0 0 1 14.5 15H1.5A1.5 1.5 0 0 1 0 13.5v-11A1.5 1.5 0 0 1 1.5 1H3V.5a.5.5 0 0 1 .5-.5zM1.5 2a.5.5 0 0 0-.5.5V4h14V2.5a.5.5 0 0 0-.5-.5H13v.5a.5.5 0 0 1-1 0V2H4v.5a.5.5 0 0 1-1 0V2H1.5zM15 5H1v8.5a.5.5 0 0 0 .5.5h13a.5.5 0 0 0 .5-.5V5z\"/>\n </svg>\n </div>\n \n @if (showCalendar()) {\n <div class=\"calendar-overlay\" [ngClass]=\"'position-' + calendarPosition()\">\n <ng-container *ngTemplateOutlet=\"calendarPanel\"></ng-container>\n </div>\n }\n } @else {\n <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n <div class=\"value\">\n {{ getDisplayValue() }}\n </div>\n }\n\n @if (inEdit() && hasErrors()) {\n <div class=\"error-messages\">\n @for (error of getErrorMessage(); track error) {\n <div class=\"error-message\">{{ error }}</div>\n }\n </div>\n }\n</div>\n<ng-template #calendarPanel>\n <div class=\"calendar-panel datetime\">\n <div class=\"date-panel\">\n <div class=\"calendar-header\">\n <button type=\"button\" class=\"nav-button\" (click)=\"previousMonth()\">‹</button>\n <span class=\"month-year\">{{ getMonthYearDisplay() }}</span>\n <button type=\"button\" class=\"nav-button\" (click)=\"nextMonth()\">›</button>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"weekdays\">\n <div class=\"weekday\">Su</div>\n <div class=\"weekday\">Mo</div>\n <div class=\"weekday\">Tu</div>\n <div class=\"weekday\">We</div>\n <div class=\"weekday\">Th</div>\n <div class=\"weekday\">Fr</div>\n <div class=\"weekday\">Sa</div>\n </div>\n <div class=\"calendar-days\">\n @for (day of calendarDays(); track day.date) {\n <div class=\"calendar-day\" [ngClass]=\"{'today': day.isToday, 'selected': day.isSelected, 'dim': day.isOtherMonth}\" (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"time-panel\">\n <div class=\"control-header\">\n <button type=\"button\" class=\"close-button\" (click)=\"closeCalendar()\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M2.146 2.146a.5.5 0 0 1 .708 0L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"time-header\">HOURS</div>\n <div class=\"hh-grid\">\n @for (hh of hourSet; track hh) {\n <div class=\"hh-slot\" [ngClass]=\"{'selected': selectedHour === hh}\" (click)=\"onSelectHour(hh)\">\n {{ hh < 10 ? '0' + hh : hh }}\n </div>\n }\n </div>\n <div class=\"time-header\">MINUTES</div>\n <div class=\"hh-grid\">\n @for (mm of minSet; track mm) {\n <div class=\"hh-slot\" [ngClass]=\"{'selected': selectedMinute === mm}\" (click)=\"onSelectMinute(mm)\">\n {{ mm < 10 ? '0' + mm : mm }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n","import { Injectable } from '@angular/core';\nimport { SnackbarType } from '../field-dto';\n\n@Injectable({ providedIn: 'root' })\nexport class LiteSnackbarService {\n private timeoutId: any;\n private snackbarElem: HTMLElement | null = null;\n\n show(text: string, type: SnackbarType = 'done', duration: number = 3000) {\n this.clear();\n this.snackbarElem = document.createElement('div');\n this.snackbarElem.className = `lite-snackbar ${type}`;\n this.snackbarElem.innerHTML = `\n <div class=\"icon\">${this.getIcon(type)}</div>\n <div class=\"text\">${this.escapeHtml(text)}</div>\n `;\n this.injectStyles();\n document.body.appendChild(this.snackbarElem);\n this.timeoutId = setTimeout(() => this.clear(), duration);\n }\n\n clear() {\n if (this.timeoutId) clearTimeout(this.timeoutId);\n if (this.snackbarElem && this.snackbarElem.parentNode) {\n this.snackbarElem.parentNode.removeChild(this.snackbarElem);\n }\n this.snackbarElem = null;\n }\n\n private getIcon(type: SnackbarType) {\n if (type === 'done') {\n return `<svg width=\"30\" height=\"30\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"10\" cy=\"10\" r=\"10\"/><path d=\"M6 10.5L9 13.5L14 8.5\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n }\n if (type === 'warn') {\n return `<svg width=\"30\" height=\"30\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"10\" cy=\"10\" r=\"10\"/><path d=\"M10 6V11\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\"/><circle cx=\"10\" cy=\"14\" r=\"1\" fill=\"#fff\"/></svg>`;\n }\n if (type === 'error') {\n return `<svg width=\"30\" height=\"30\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"10\" cy=\"10\" r=\"10\"/><path d=\"M7 7L13 13M13 7L7 13\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>`;\n }\n return '';\n }\n\n private injectStyles() {\n if (document.getElementById('lite-snackbar-style')) return;\n const style = document.createElement('style');\n style.id = 'lite-snackbar-style';\n style.innerHTML = `\n .lite-snackbar {\n position: fixed;\n left: 50%;\n top: 20px;\n transform: translateX(-50%);\n min-width: 200px;\n max-width: 90vw;\n padding: 8px 15px 8px 5px;\n border-radius: 6px;\n color: #fff;\n font-size: 1rem;\n display: flex;\n align-items: center;\n box-shadow: 0 2px 12px rgba(0,0,0,0.18);\n z-index: 9999;\n opacity: 0.9;\n animation: snackbar-in 0.2s;\n }\n .lite-snackbar.done { background: #3a82eeff; }\n .lite-snackbar.warn { background: #f7b731; }\n .lite-snackbar.error { background: #e74c3c; }\n .lite-snackbar .icon { margin-right: 5px; height: 30px; }\n @keyframes snackbar-in {\n from { opacity: 0; transform: translateX(-50%) translateY(-30px); }\n to { opacity: 0.9; transform: translateX(-50%) translateY(0); }\n }\n `;\n document.head.appendChild(style);\n }\n\n private escapeHtml(text: string) {\n return text.replace(/[&<>'\"]/g, c => ({'&':'&','<':'<','>':'>','\\'':''','\"':'"'}[c]||c));\n }\n}\n","/*\n * Public API Surface of lite-form\n */\n\nexport * from './lib/lite-form.module';\nexport * from './lib/field-dto';\nexport * from './lib/form-utils';\nexport * from './lib/lite-input/lite-input';\nexport * from './lib/lite-textarea/lite-textarea';\nexport * from './lib/lite-select/lite-select';\nexport * from './lib/lite-multi-select/lite-multi-select';\nexport * from './lib/lite-radio/lite-radio';\nexport * from './lib/lite-checkbox/lite-checkbox';\nexport * from './lib/lite-date/lite-date';\nexport * from './lib/lite-datetime/lite-datetime';\nexport * from './lib/lite-password/lite-password';\nexport * from './lib/lite-file/lite-file';\nexport * from './lib/lite-snackbar/lite-snackbar.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -41,6 +41,7 @@ declare class FileFieldDto {
|
|
|
41
41
|
constructor(label: string, formControl: FormControl, multiple?: boolean, accept?: string, maxFileSize?: number, // 10MB
|
|
42
42
|
maxFiles?: number, showPreview?: boolean);
|
|
43
43
|
}
|
|
44
|
+
type SnackbarType = 'done' | 'warn' | 'error';
|
|
44
45
|
|
|
45
46
|
/**
|
|
46
47
|
* Utility class for form-related helper functions
|
|
@@ -397,5 +398,17 @@ declare class LiteFormModule {
|
|
|
397
398
|
static ɵinj: _angular_core.ɵɵInjectorDeclaration<LiteFormModule>;
|
|
398
399
|
}
|
|
399
400
|
|
|
400
|
-
|
|
401
|
-
|
|
401
|
+
declare class LiteSnackbarService {
|
|
402
|
+
private timeoutId;
|
|
403
|
+
private snackbarElem;
|
|
404
|
+
show(text: string, type?: SnackbarType, duration?: number): void;
|
|
405
|
+
clear(): void;
|
|
406
|
+
private getIcon;
|
|
407
|
+
private injectStyles;
|
|
408
|
+
private escapeHtml;
|
|
409
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LiteSnackbarService, never>;
|
|
410
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<LiteSnackbarService>;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
export { BaseSelectFieldDto, FieldDto, FileFieldDto, FormUtils, LiteCheckbox, LiteDate, LiteDateTime, LiteFile, LiteFormModule, LiteInput, LiteMultiSelect, LitePassword, LiteRadio, LiteSelect, LiteSnackbarService, LiteTextarea, MultiSelectFieldDto, RadioFieldDto, SelectFieldDto };
|
|
414
|
+
export type { DateRangeFieldDto, FileItem, SnackbarType };
|
package/package.json
CHANGED