@honuware/ui 0.1.0 → 0.1.1

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.
@@ -290,7 +290,7 @@ class LoginComponent {
290
290
  });
291
291
  }
292
292
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: LoginComponent, deps: [{ token: i1.FormBuilder }, { token: AuthService }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.ToastService }, { token: i5.ErrorService }, { token: AUTH_ROUTES }], target: i0.ɵɵFactoryTarget.Component });
293
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: LoginComponent, isStandalone: true, selector: "hw-login", ngImport: i0, template: "<div\n class=\"max-w-[420px] p-6 flex flex-col gap-8 mx-auto my-8 border border-gray-300 rounded-lg\"\n>\n <h1 class=\"text-center text-2xl\">Log In</h1>\n\n <form [formGroup]=\"form\" (submit)=\"onSignIn()\" class=\"flex flex-col gap-4\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"text\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\"\n matInput\n [type]=\"hidePassword ? 'password' : 'text'\"\n formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-checkbox id=\"remember\" formControlName=\"remember\">Remember Me</mat-checkbox>\n\n <button mat-raised-button id=\"signIn\" color=\"primary\" type=\"submit\">Sign in</button>\n </form>\n\n <a\n id=\"create-account-link\"\n [routerLink]=\"'/register'\"\n color=\"primary\"\n class=\"text-center\"\n >\n Create an account\n </a>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
293
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: LoginComponent, isStandalone: true, selector: "hw-login", ngImport: i0, template: "<div class=\"auth-card\">\n <h1 class=\"auth-title\">Log In</h1>\n\n <form [formGroup]=\"form\" (submit)=\"onSignIn()\" class=\"auth-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"text\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\"\n matInput\n [type]=\"hidePassword ? 'password' : 'text'\"\n formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"password-toggle\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-checkbox id=\"remember\" formControlName=\"remember\">Remember Me</mat-checkbox>\n\n <button mat-raised-button id=\"signIn\" color=\"primary\" type=\"submit\">Sign in</button>\n </form>\n\n <a\n id=\"create-account-link\"\n [routerLink]=\"'/register'\"\n color=\"primary\"\n class=\"auth-link\"\n >\n Create an account\n </a>\n</div>\n", styles: [".auth-card{max-width:420px;margin:2rem auto;padding:1.5rem;display:flex;flex-direction:column;gap:2rem;border:1px solid #d1d5db;border-radius:.5rem}.auth-title{margin:0;text-align:center;font-size:1.5rem;line-height:2rem;font-weight:400}.auth-form{display:flex;flex-direction:column;gap:1rem}mat-form-field{width:100%}.password-toggle{margin-right:.5rem}.auth-link{text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
294
294
  }
295
295
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: LoginComponent, decorators: [{
296
296
  type: Component,
@@ -302,7 +302,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
302
302
  MatCheckboxModule,
303
303
  MatIcon,
304
304
  RouterLink
305
- ], template: "<div\n class=\"max-w-[420px] p-6 flex flex-col gap-8 mx-auto my-8 border border-gray-300 rounded-lg\"\n>\n <h1 class=\"text-center text-2xl\">Log In</h1>\n\n <form [formGroup]=\"form\" (submit)=\"onSignIn()\" class=\"flex flex-col gap-4\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"text\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\"\n matInput\n [type]=\"hidePassword ? 'password' : 'text'\"\n formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-checkbox id=\"remember\" formControlName=\"remember\">Remember Me</mat-checkbox>\n\n <button mat-raised-button id=\"signIn\" color=\"primary\" type=\"submit\">Sign in</button>\n </form>\n\n <a\n id=\"create-account-link\"\n [routerLink]=\"'/register'\"\n color=\"primary\"\n class=\"text-center\"\n >\n Create an account\n </a>\n</div>\n" }]
305
+ ], template: "<div class=\"auth-card\">\n <h1 class=\"auth-title\">Log In</h1>\n\n <form [formGroup]=\"form\" (submit)=\"onSignIn()\" class=\"auth-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"text\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\"\n matInput\n [type]=\"hidePassword ? 'password' : 'text'\"\n formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"password-toggle\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-checkbox id=\"remember\" formControlName=\"remember\">Remember Me</mat-checkbox>\n\n <button mat-raised-button id=\"signIn\" color=\"primary\" type=\"submit\">Sign in</button>\n </form>\n\n <a\n id=\"create-account-link\"\n [routerLink]=\"'/register'\"\n color=\"primary\"\n class=\"auth-link\"\n >\n Create an account\n </a>\n</div>\n", styles: [".auth-card{max-width:420px;margin:2rem auto;padding:1.5rem;display:flex;flex-direction:column;gap:2rem;border:1px solid #d1d5db;border-radius:.5rem}.auth-title{margin:0;text-align:center;font-size:1.5rem;line-height:2rem;font-weight:400}.auth-form{display:flex;flex-direction:column;gap:1rem}mat-form-field{width:100%}.password-toggle{margin-right:.5rem}.auth-link{text-align:center}\n"] }]
306
306
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: AuthService }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.ToastService }, { type: i5.ErrorService }, { type: undefined, decorators: [{
307
307
  type: Inject,
308
308
  args: [AUTH_ROUTES]
@@ -382,11 +382,11 @@ class RegisterComponent {
382
382
  return !!password.dirty && !!password2.dirty && password.value !== password2.value;
383
383
  }
384
384
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: RegisterComponent, deps: [{ token: i1.FormBuilder }, { token: AuthService }, { token: i3.Router }, { token: i4.ToastService }, { token: i5.ErrorService }, { token: AUTH_ROUTES }], target: i0.ɵɵFactoryTarget.Component });
385
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: RegisterComponent, isStandalone: true, selector: "hw-register", ngImport: i0, template: "<div\n class=\"max-w-[420px] p-6 flex flex-col gap-8 mx-auto my-8 border border-gray-300 rounded-lg\"\n >\n <h1 class=\"text-center text-2xl\">Create Account</h1>\n\n <form [formGroup]=\"form\" (ngSubmit)=\"onRegister()\" class=\"flex flex-col gap-4\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"email\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>First name</mat-label>\n <input id=\"first_name\" matInput type=\"text\" formControlName=\"first_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Last name</mat-label>\n <input id=\"last_name\" matInput type=\"text\" formControlName=\"last_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Reenter password</mat-label>\n <input id=\"password2\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password2\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n @if (showPasswordMismatch()) {\n <mat-error>\n Passwords do not match.\n </mat-error>\n }\n </mat-form-field>\n\n <button id=\"Register\" mat-raised-button color=\"primary\" type=\"submit\">\n Register\n </button>\n </form>\n</div>\n", styles: [".register-container{max-width:480px;margin:2rem auto;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}form{display:flex;flex-direction:column;gap:1rem}.full-width{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
385
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: RegisterComponent, isStandalone: true, selector: "hw-register", ngImport: i0, template: "<div class=\"auth-card\">\n <h1 class=\"auth-title\">Create Account</h1>\n\n <form [formGroup]=\"form\" (ngSubmit)=\"onRegister()\" class=\"auth-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"email\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>First name</mat-label>\n <input id=\"first_name\" matInput type=\"text\" formControlName=\"first_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Last name</mat-label>\n <input id=\"last_name\" matInput type=\"text\" formControlName=\"last_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"password-toggle\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Reenter password</mat-label>\n <input id=\"password2\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password2\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"password-toggle\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n @if (showPasswordMismatch()) {\n <mat-error>\n Passwords do not match.\n </mat-error>\n }\n </mat-form-field>\n\n <button id=\"Register\" mat-raised-button color=\"primary\" type=\"submit\">\n Register\n </button>\n </form>\n</div>\n", styles: [".auth-card{max-width:420px;margin:2rem auto;padding:1.5rem;display:flex;flex-direction:column;gap:2rem;border:1px solid #d1d5db;border-radius:.5rem}.auth-title{margin:0;text-align:center;font-size:1.5rem;line-height:2rem;font-weight:400}.auth-form{display:flex;flex-direction:column;gap:1rem}mat-form-field{width:100%}.password-toggle{margin-right:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
386
386
  }
387
387
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: RegisterComponent, decorators: [{
388
388
  type: Component,
389
- args: [{ selector: 'hw-register', standalone: true, imports: [ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIcon], template: "<div\n class=\"max-w-[420px] p-6 flex flex-col gap-8 mx-auto my-8 border border-gray-300 rounded-lg\"\n >\n <h1 class=\"text-center text-2xl\">Create Account</h1>\n\n <form [formGroup]=\"form\" (ngSubmit)=\"onRegister()\" class=\"flex flex-col gap-4\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"email\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>First name</mat-label>\n <input id=\"first_name\" matInput type=\"text\" formControlName=\"first_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Last name</mat-label>\n <input id=\"last_name\" matInput type=\"text\" formControlName=\"last_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Reenter password</mat-label>\n <input id=\"password2\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password2\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n @if (showPasswordMismatch()) {\n <mat-error>\n Passwords do not match.\n </mat-error>\n }\n </mat-form-field>\n\n <button id=\"Register\" mat-raised-button color=\"primary\" type=\"submit\">\n Register\n </button>\n </form>\n</div>\n", styles: [".register-container{max-width:480px;margin:2rem auto;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}form{display:flex;flex-direction:column;gap:1rem}.full-width{width:100%}\n"] }]
389
+ args: [{ selector: 'hw-register', standalone: true, imports: [ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIcon], template: "<div class=\"auth-card\">\n <h1 class=\"auth-title\">Create Account</h1>\n\n <form [formGroup]=\"form\" (ngSubmit)=\"onRegister()\" class=\"auth-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"email\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>First name</mat-label>\n <input id=\"first_name\" matInput type=\"text\" formControlName=\"first_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Last name</mat-label>\n <input id=\"last_name\" matInput type=\"text\" formControlName=\"last_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"password-toggle\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Reenter password</mat-label>\n <input id=\"password2\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password2\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"password-toggle\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n @if (showPasswordMismatch()) {\n <mat-error>\n Passwords do not match.\n </mat-error>\n }\n </mat-form-field>\n\n <button id=\"Register\" mat-raised-button color=\"primary\" type=\"submit\">\n Register\n </button>\n </form>\n</div>\n", styles: [".auth-card{max-width:420px;margin:2rem auto;padding:1.5rem;display:flex;flex-direction:column;gap:2rem;border:1px solid #d1d5db;border-radius:.5rem}.auth-title{margin:0;text-align:center;font-size:1.5rem;line-height:2rem;font-weight:400}.auth-form{display:flex;flex-direction:column;gap:1rem}mat-form-field{width:100%}.password-toggle{margin-right:.5rem}\n"] }]
390
390
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: AuthService }, { type: i3.Router }, { type: i4.ToastService }, { type: i5.ErrorService }, { type: undefined, decorators: [{
391
391
  type: Inject,
392
392
  args: [AUTH_ROUTES]
@@ -1 +1 @@
1
- {"version":3,"file":"honuware-ui-auth.mjs","sources":["../../../projects/honuware-ui/auth/src/auth.types.ts","../../../projects/honuware-ui/auth/src/auth.service.ts","../../../projects/honuware-ui/auth/src/auth-routes.ts","../../../projects/honuware-ui/auth/src/auth-guards.ts","../../../projects/honuware-ui/auth/src/error.interceptor.ts","../../../projects/honuware-ui/auth/src/login/login.component.ts","../../../projects/honuware-ui/auth/src/login/login.component.html","../../../projects/honuware-ui/auth/src/register/register.component.ts","../../../projects/honuware-ui/auth/src/register/register.component.html","../../../projects/honuware-ui/auth/src/verify/verify.component.ts","../../../projects/honuware-ui/auth/src/verify/verify.component.html","../../../projects/honuware-ui/auth/src/try-token-login.ts","../../../projects/honuware-ui/auth/src/public-api.ts","../../../projects/honuware-ui/auth/src/honuware-ui-auth.ts"],"sourcesContent":["export type AuthData =\n | {\n isAuth: false;\n }\n | {\n isAuth: true;\n personId: number;\n firstName: string;\n lastName: string;\n email: string;\n createdAt: string;\n isAdmin: boolean;\n roles: string[];\n permissions: string[];\n mustChangePassword: boolean;\n };\n\nexport const DEFAULT_NON_AUTH_DATA: AuthData = {\n isAuth: false,\n};\n\nexport function hasPermission(authData: AuthData, permission: string): boolean {\n return authData.isAuth && authData.permissions.includes(permission);\n}\n\nexport function hasManageProducts(authData: AuthData): boolean {\n return (authData.isAuth && authData.isAdmin) || hasPermission(authData, 'manage_products');\n}\n\nexport function hasStaffAccess(authData: AuthData): boolean {\n return (authData.isAuth && authData.isAdmin)\n || hasPermission(authData, 'instructor')\n || hasPermission(authData, 'admin_portal')\n || hasPermission(authData, 'provider');\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { BehaviorSubject, Observable, of } from 'rxjs';\nimport { catchError, map, mergeMap, tap } from 'rxjs/operators';\nimport {\n AuthData,\n DEFAULT_NON_AUTH_DATA,\n} from './auth.types';\nimport { AuthAccess, LoginInfo, UserInfo, SetUserInfo, UpdateUserPasswordInfo, HONUWARE_AUTH_ACCESS } from '@honuware/ui/access';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService {\n private _authDataSubject = new BehaviorSubject<AuthData>(\n DEFAULT_NON_AUTH_DATA\n );\n public get authData$(): Observable<AuthData> {\n return this._authDataSubject.asObservable();\n }\n public get authData(): AuthData {\n return this._authDataSubject.value;\n }\n\n constructor(\n @Inject(HONUWARE_AUTH_ACCESS) private authAccess: AuthAccess,\n ) {}\n\n public updateAuthData(userInfo: UserInfo): void {\n const isAdmin = (userInfo.roles || []).includes('admin');\n const updated: AuthData = {\n isAuth: true,\n personId: userInfo.person_id,\n firstName: userInfo.first_name,\n lastName: userInfo.last_name,\n email: userInfo.email,\n createdAt: userInfo.created_at,\n roles: userInfo.roles,\n permissions: userInfo.permissions,\n isAdmin: isAdmin,\n mustChangePassword: userInfo.must_change_password ?? false,\n };\n this._authDataSubject.next(updated);\n }\n\n public setUserInfo(firstName: string, lastName: string, email: string): Observable<void> {\n const body: SetUserInfo = {\n first_name: firstName,\n last_name: lastName,\n email: email\n };\n\n return this.authAccess.setUserInfo(body).pipe(\n mergeMap(() => this.authAccess.getUserInfo()),\n tap((ui: UserInfo) => this.updateAuthData(ui)),\n map(() => void 0)\n );\n }\n\n public doSetUserInfo(firstName: string, lastName: string, email: string): void {\n this.setUserInfo(firstName, lastName, email).subscribe();\n }\n\n public updateUserPassword(oldPassword: string, newPassword: string): Observable<void> {\n const body: UpdateUserPasswordInfo = {\n old_password: oldPassword,\n new_password: newPassword,\n };\n return this.authAccess.updateUserPassword(body);\n }\n\n public doUpdateUserPassword(oldPassword: string, newPassword: string): void {\n this.updateUserPassword(oldPassword, newPassword).subscribe();\n }\n\n public tryTokenLogin(): Observable<boolean> {\n // Path A: session token valid -> get user info\n return this.authAccess.me().pipe(\n mergeMap(() =>\n this.authAccess.getUserInfo().pipe(\n tap((ui) => this.updateAuthData(ui)),\n map(() => true)\n )\n ),\n catchError((err) => {\n // If 401, attempt device remember token flow\n if (err?.status === 401) {\n return this.authAccess.remember().pipe(\n mergeMap(() => this.authAccess.me()),\n mergeMap(() =>\n this.authAccess.getUserInfo().pipe(\n tap((ui) => this.updateAuthData(ui)),\n map(() => true)\n )\n ),\n catchError(() => of(false))\n );\n }\n return of(false);\n })\n );\n }\n\n public login(\n email: string,\n password: string,\n remember: boolean\n ): Observable<void> {\n const body: LoginInfo = { email, password, remember };\n return this.authAccess.login(body).pipe(\n mergeMap(() =>\n this.authAccess.getUserInfo().pipe(\n tap((ui) => this.updateAuthData(ui)),\n map(() => void 0)\n )\n )\n );\n }\n\n public logout(): Observable<void> {\n return this.authAccess.logout().pipe(\n tap(() => this._authDataSubject.next(DEFAULT_NON_AUTH_DATA))\n );\n }\n\n public register(\n firstName: string,\n lastName: string,\n email: string,\n password: string\n ): Observable<void> {\n return this.authAccess.register(firstName, lastName, email, password);\n }\n\n // Phase 3.3 of the security review: the SPA's /verify route lands\n // here. The verification email's link points at the SPA, which calls\n // this and then immediately scrubs the URL via history.replaceState.\n public verify(email: string, secret: string): Observable<void> {\n return this.authAccess.verify(email, secret);\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n// Route literals the auth layer (guards, ErrorInterceptor, auth pages) would\n// otherwise hardcode. Injected so a honuware consumer can remap them without\n// forking the components — the seam that lets @honuware/ui/auth ship working\n// auth screens + guards a new site *configures* rather than rewrites.\nexport interface AuthRoutes {\n /** Where the login page lives. */\n loginPath: string;\n /** Where the register page lives. */\n registerPath: string;\n /**\n * Home path — used both after logout and as the \"access denied\" fallback\n * for guard checks that reject the current user.\n */\n postLogoutPath: string;\n /** Forced-password-change page (users with must_change_password). */\n mustChangePasswordPath: string;\n /**\n * Same-origin path prefixes a post-login returnUrl may target. Anything\n * outside this list (or off-origin) is rejected to '/' by sanitizeReturnUrl.\n */\n returnUrlAllowlist: ReadonlyArray<string>;\n}\n\nexport const DEFAULT_AUTH_ROUTES: AuthRoutes = {\n loginPath: '/login',\n registerPath: '/register',\n postLogoutPath: '/',\n mustChangePasswordPath: '/my/update-user-password',\n returnUrlAllowlist: ['/my', '/admin', '/manage', '/staff', '/calendar', '/shop'],\n};\n\n// Root-provided with the knottyyoga defaults, so nothing needs wiring today.\n// When the auth layer moves into @honuware/ui/auth the library token drops the\n// app default and each consumer provides its own AuthRoutes.\nexport const AUTH_ROUTES = new InjectionToken<AuthRoutes>('AUTH_ROUTES', {\n providedIn: 'root',\n factory: () => DEFAULT_AUTH_ROUTES,\n});\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateChildFn, CanActivateFn, Router, RouterStateSnapshot } from '@angular/router';\nimport { AuthService } from './auth.service';\nimport { hasManageProducts, hasStaffAccess } from './auth.types';\nimport { AUTH_ROUTES } from './auth-routes';\n\nexport const AdminGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (!authService.authData.isAuth || !authService.authData.isAdmin) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n\nexport const AuthGuard: CanActivateFn | CanActivateChildFn = (\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot\n) => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n const url = state.url;\n // Allow access to login and register without auth\n if (url.startsWith(routes.loginPath) || url.startsWith(routes.registerPath)) {\n return true;\n }\n\n if (!authService.authData.isAuth) {\n const returnUrl = encodeURIComponent(url);\n return router.parseUrl(`${routes.loginPath}?returnUrl=${returnUrl}`);\n }\n\n // Force password change if required (allow access to the change password page itself)\n if (authService.authData.mustChangePassword &&\n !url.startsWith(routes.mustChangePasswordPath)) {\n return router.parseUrl(routes.mustChangePasswordPath);\n }\n\n return true;\n};\n\nexport const ManageProductsGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (!hasManageProducts(authService.authData)) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n\nexport const StaffGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (!hasStaffAccess(authService.authData)) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n\nexport const NoAuthGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (authService.authData.isAuth) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n","import { Injectable, Inject } from '@angular/core';\nimport {\n HttpInterceptor,\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { Router } from '@angular/router';\nimport { ErrorService, ErrorTypes, ProblemDetails } from '@honuware/ui/access';\nimport { AUTH_ROUTES, AuthRoutes } from './auth-routes';\n\n/**\n * Extended HttpErrorResponse that includes parsed ProblemDetails\n */\nexport interface ParsedHttpErrorResponse extends HttpErrorResponse {\n problemDetails: ProblemDetails;\n}\n\n@Injectable()\nexport class ErrorInterceptor implements HttpInterceptor {\n constructor(\n private errorService: ErrorService,\n private router: Router,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes\n ) {}\n\n intercept(\n request: HttpRequest<unknown>,\n next: HttpHandler\n ): Observable<HttpEvent<unknown>> {\n return next.handle(request).pipe(\n catchError((error: HttpErrorResponse) => {\n const problemDetails = this.errorService.parseError(error);\n\n // Handle session expired globally - redirect to login\n if (\n problemDetails.type === ErrorTypes.SESSION_EXPIRED ||\n (problemDetails.type === ErrorTypes.NOT_AUTHENTICATED &&\n !this.isAuthEndpoint(request.url))\n ) {\n this.router.navigate([this.authRoutes.loginPath]);\n }\n\n // Create extended error with parsed problem details\n const parsedError = Object.assign(error, {\n problemDetails,\n }) as ParsedHttpErrorResponse;\n\n return throwError(() => parsedError);\n })\n );\n }\n\n private isAuthEndpoint(url: string): boolean {\n const authEndpoints = ['/api/login', '/api/register', '/api/me', '/api/remember'];\n return authEndpoints.some((endpoint) => url.includes(endpoint));\n }\n}\n","import { Component, Inject } from '@angular/core';\n\nimport {\n ReactiveFormsModule,\n FormBuilder,\n FormGroup,\n Validators,\n} from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { AuthService } from '../auth.service';\nimport { AUTH_ROUTES, AuthRoutes } from '../auth-routes';\nimport { sanitizeReturnUrl, ToastService } from '@honuware/ui/foundation';\nimport { ErrorService } from '@honuware/ui/access';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n@Component({\n selector: 'hw-login',\n standalone: true,\n imports: [\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatCheckboxModule,\n MatIcon,\n RouterLink\n],\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.scss'],\n})\nexport class LoginComponent {\n form: FormGroup;\n hidePassword = true;\n private returnUrl: string;\n\n constructor(\n private fb: FormBuilder,\n private authService: AuthService,\n private router: Router,\n private route: ActivatedRoute,\n private toastService: ToastService,\n private errorService: ErrorService,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes\n ) {\n this.form = this.fb.group({\n email: ['', [Validators.required]],\n password: ['', [Validators.required]],\n remember: [false],\n });\n // Phase 10.2: never trust the raw query parameter — see\n // sanitizeReturnUrl above for the threat model.\n this.returnUrl = sanitizeReturnUrl(\n this.route.snapshot.queryParamMap.get('returnUrl'),\n this.authRoutes.returnUrlAllowlist,\n );\n }\n\n togglePasswordVisibility(): void {\n this.hidePassword = !this.hidePassword;\n }\n\n onSignIn(): void {\n if (this.form.invalid) {\n this.form.markAllAsTouched();\n return;\n }\n const email = this.form.get('email')?.value ?? '';\n const password = this.form.get('password')?.value ?? '';\n const remember = !!this.form.get('remember')?.value;\n\n this.authService.login(email, password, remember).subscribe({\n next: () => {\n if (this.authService.authData.isAuth && this.authService.authData.mustChangePassword) {\n this.router.navigateByUrl(this.authRoutes.mustChangePasswordPath);\n } else {\n this.router.navigateByUrl(this.returnUrl);\n }\n },\n error: (err: HttpErrorResponse) => {\n const problem = this.errorService.parseError(err);\n this.toastService.error(this.errorService.getUserFriendlyMessage(problem));\n },\n });\n }\n}\n","<div\n class=\"max-w-[420px] p-6 flex flex-col gap-8 mx-auto my-8 border border-gray-300 rounded-lg\"\n>\n <h1 class=\"text-center text-2xl\">Log In</h1>\n\n <form [formGroup]=\"form\" (submit)=\"onSignIn()\" class=\"flex flex-col gap-4\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"text\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\"\n matInput\n [type]=\"hidePassword ? 'password' : 'text'\"\n formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-checkbox id=\"remember\" formControlName=\"remember\">Remember Me</mat-checkbox>\n\n <button mat-raised-button id=\"signIn\" color=\"primary\" type=\"submit\">Sign in</button>\n </form>\n\n <a\n id=\"create-account-link\"\n [routerLink]=\"'/register'\"\n color=\"primary\"\n class=\"text-center\"\n >\n Create an account\n </a>\n</div>\n","import { Component, Inject } from '@angular/core';\n\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { AuthService } from '../auth.service';\nimport { AUTH_ROUTES, AuthRoutes } from '../auth-routes';\nimport { Router } from '@angular/router';\nimport { ToastService } from '@honuware/ui/foundation';\nimport { ErrorService } from '@honuware/ui/access';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n@Component({\n selector: 'hw-register',\n standalone: true,\n imports: [ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIcon],\n templateUrl: './register.component.html',\n styleUrls: ['./register.component.scss']\n})\nexport class RegisterComponent {\n form: FormGroup;\n hidePassword = true;\n\n constructor(\n private fb: FormBuilder,\n private authService: AuthService,\n private router: Router,\n private toastService: ToastService,\n private errorService: ErrorService,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes\n ) {\n this.form = this.fb.group(\n {\n email: ['', [Validators.required, Validators.email]],\n first_name: ['', [Validators.required]],\n last_name: ['', [Validators.required]],\n password: ['', [Validators.required]],\n password2: ['', [Validators.required]],\n },\n { validators: this.passwordsMatchValidator }\n );\n }\n\n togglePasswordVisibility(): void {\n this.hidePassword = !this.hidePassword;\n }\n\n // Custom validator that flags mismatch only when both fields are dirty and values differ\n private passwordsMatchValidator(group: AbstractControl): ValidationErrors | null {\n const password = group.get('password');\n const password2 = group.get('password2');\n if (!password || !password2) return null;\n\n const bothDirty = password.dirty && password2.dirty;\n const mismatch = password.value !== password2.value;\n\n if (bothDirty && mismatch) {\n password2.setErrors({ mismatch: true });\n return { mismatch: true };\n } else {\n // Clear mismatch error when aligned or not both dirty\n if (password2.hasError('mismatch')) {\n const otherErrors = { ...password2.errors };\n delete otherErrors['mismatch'];\n password2.setErrors(Object.keys(otherErrors).length ? otherErrors : null);\n }\n return null;\n }\n }\n\n onRegister(): void {\n if (this.form.invalid) {\n this.form.markAllAsTouched();\n return;\n }\n const email = this.form.get('email')?.value ?? '';\n const firstName = this.form.get('first_name')?.value ?? '';\n const lastName = this.form.get('last_name')?.value ?? '';\n const password = this.form.get('password')?.value ?? '';\n\n this.authService.register(firstName, lastName, email, password).subscribe({\n next: () => this.router.navigate([this.authRoutes.loginPath]),\n error: (err: HttpErrorResponse) => {\n const problem = this.errorService.parseError(err);\n this.toastService.error(this.errorService.getUserFriendlyMessage(problem));\n }\n });\n }\n\n showPasswordMismatch(): boolean {\n const password = this.form.get('password');\n const password2 = this.form.get('password2');\n if (!password || !password2) return false;\n return !!password.dirty && !!password2.dirty && password.value !== password2.value;\n }\n}\n","<div\n class=\"max-w-[420px] p-6 flex flex-col gap-8 mx-auto my-8 border border-gray-300 rounded-lg\"\n >\n <h1 class=\"text-center text-2xl\">Create Account</h1>\n\n <form [formGroup]=\"form\" (ngSubmit)=\"onRegister()\" class=\"flex flex-col gap-4\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"email\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>First name</mat-label>\n <input id=\"first_name\" matInput type=\"text\" formControlName=\"first_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Last name</mat-label>\n <input id=\"last_name\" matInput type=\"text\" formControlName=\"last_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Reenter password</mat-label>\n <input id=\"password2\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password2\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n @if (showPasswordMismatch()) {\n <mat-error>\n Passwords do not match.\n </mat-error>\n }\n </mat-form-field>\n\n <button id=\"Register\" mat-raised-button color=\"primary\" type=\"submit\">\n Register\n </button>\n </form>\n</div>\n","import { Component, Inject, OnInit } from '@angular/core';\n\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { AuthService } from '../auth.service';\nimport { AUTH_ROUTES, AuthRoutes } from '../auth-routes';\nimport { ToastService } from '@honuware/ui/foundation';\n\n/**\n * Phase 3.3 of the security review.\n *\n * The verification email links at this SPA route — `/verify?email=…&secret=…` —\n * rather than at the API. The component:\n *\n * 1. Reads `email` and `secret` from the query string.\n * 2. Immediately calls `AuthService.verify(email, secret)` (POST /api/verify).\n * 3. Right after firing the request, scrubs the URL via\n * `history.replaceState({}, '', '/verify-success')` so the secret\n * stops appearing in the URL bar / browser history. We do this\n * synchronously, NOT inside the response callback, so the URL is\n * sanitized whether the request succeeds, fails, or is delayed.\n * 4. On success or failure, routes to `/login` with a toast. The two\n * paths use different toasts but the toast text never echoes the\n * server's error detail — failed verifications all collapse to one\n * generic message to avoid distinguishing \"wrong secret\" from\n * \"expired\" from \"already verified\".\n */\n@Component({\n selector: 'hw-verify',\n standalone: true,\n imports: [],\n templateUrl: './verify.component.html',\n styleUrls: ['./verify.component.scss']\n})\nexport class VerifyComponent implements OnInit {\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private authService: AuthService,\n private toastService: ToastService,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes,\n ) {}\n\n ngOnInit(): void {\n const email = this.route.snapshot.queryParamMap.get('email') ?? '';\n const secret = this.route.snapshot.queryParamMap.get('secret') ?? '';\n\n if (!email || !secret) {\n this.scrubUrl();\n this.toastService.error(\n 'Verification link is missing required parameters.'\n );\n this.router.navigate([this.authRoutes.loginPath]);\n return;\n }\n\n // Fire the verification request first, THEN scrub the URL. The\n // secret is in memory either way; the goal of the scrub is to keep\n // it out of the browser's URL bar and history. Doing it before\n // we're sure about the response means even a slow / failed request\n // doesn't leave the secret visible.\n const verify$ = this.authService.verify(email, secret);\n this.scrubUrl();\n\n verify$.subscribe({\n next: () => {\n this.toastService.success(\n 'Email verified — please log in.'\n );\n this.router.navigate([this.authRoutes.loginPath]);\n },\n error: () => {\n // Phase 3.3: don't echo the server error detail. All failure\n // modes (wrong secret, expired, already-used) collapse to a\n // single generic message.\n this.toastService.error(\n 'Verification failed or expired. Please try again.'\n );\n this.router.navigate([this.authRoutes.loginPath]);\n },\n });\n }\n\n private scrubUrl(): void {\n // We can't replace the path via Router.navigate without triggering\n // a route change here — `history.replaceState` mutates only the URL\n // bar / history entry. The `/verify-success` path doesn't need to\n // be a real route; we navigate to /login on the next tick anyway.\n window.history.replaceState({}, '', '/verify-success');\n }\n}\n","<div class=\"verify-container\">\n <p>Verifying your email...</p>\n</div>\n","import { firstValueFrom } from 'rxjs';\nimport { AuthService } from './auth.service';\n\n// Phase 10.1 of the security review: try silent re-auth at bootstrap so\n// the SPA hydrates `authData$` BEFORE the first route activates. Without\n// this an authenticated user lands on a public-looking shell, sees the\n// guarded route bounce them to /login, and only then gets logged in by\n// the device-token flow.\n//\n// Returns a thunk (factory) so Angular invokes it AFTER DI sets up the\n// AuthService graph. We resolve regardless of outcome — a network blip\n// or invalid cookie should not block app bootstrap. A consumer wires this\n// into an APP_INITIALIZER with `deps: [AuthService]`.\nexport function tryTokenLoginInitializer(authService: AuthService): () => Promise<void> {\n return () =>\n firstValueFrom(authService.tryTokenLogin())\n .then(() => void 0)\n .catch(() => void 0);\n}\n","/*\n * @honuware/ui/auth — the auth layer: AuthService + AuthData/permission\n * helpers, the five route guards, the ErrorInterceptor, the login/register/\n * verify pages (selectors `hw-`), the AUTH_ROUTES config token, and the\n * tryTokenLogin bootstrap initializer. Depends on foundation + access.\n */\nexport { AuthService } from './auth.service';\n\nexport { DEFAULT_NON_AUTH_DATA, hasPermission, hasManageProducts, hasStaffAccess } from './auth.types';\nexport type { AuthData } from './auth.types';\n\nexport { AUTH_ROUTES, DEFAULT_AUTH_ROUTES } from './auth-routes';\nexport type { AuthRoutes } from './auth-routes';\n\nexport { AdminGuard, AuthGuard, ManageProductsGuard, StaffGuard, NoAuthGuard } from './auth-guards';\n\nexport { ErrorInterceptor } from './error.interceptor';\nexport type { ParsedHttpErrorResponse } from './error.interceptor';\n\nexport { LoginComponent } from './login/login.component';\nexport { RegisterComponent } from './register/register.component';\nexport { VerifyComponent } from './verify/verify.component';\n\nexport { tryTokenLoginInitializer } from './try-token-login';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"honuware-ui-auth.mjs","sources":["../../../projects/honuware-ui/auth/src/auth.types.ts","../../../projects/honuware-ui/auth/src/auth.service.ts","../../../projects/honuware-ui/auth/src/auth-routes.ts","../../../projects/honuware-ui/auth/src/auth-guards.ts","../../../projects/honuware-ui/auth/src/error.interceptor.ts","../../../projects/honuware-ui/auth/src/login/login.component.ts","../../../projects/honuware-ui/auth/src/login/login.component.html","../../../projects/honuware-ui/auth/src/register/register.component.ts","../../../projects/honuware-ui/auth/src/register/register.component.html","../../../projects/honuware-ui/auth/src/verify/verify.component.ts","../../../projects/honuware-ui/auth/src/verify/verify.component.html","../../../projects/honuware-ui/auth/src/try-token-login.ts","../../../projects/honuware-ui/auth/src/public-api.ts","../../../projects/honuware-ui/auth/src/honuware-ui-auth.ts"],"sourcesContent":["export type AuthData =\n | {\n isAuth: false;\n }\n | {\n isAuth: true;\n personId: number;\n firstName: string;\n lastName: string;\n email: string;\n createdAt: string;\n isAdmin: boolean;\n roles: string[];\n permissions: string[];\n mustChangePassword: boolean;\n };\n\nexport const DEFAULT_NON_AUTH_DATA: AuthData = {\n isAuth: false,\n};\n\nexport function hasPermission(authData: AuthData, permission: string): boolean {\n return authData.isAuth && authData.permissions.includes(permission);\n}\n\nexport function hasManageProducts(authData: AuthData): boolean {\n return (authData.isAuth && authData.isAdmin) || hasPermission(authData, 'manage_products');\n}\n\nexport function hasStaffAccess(authData: AuthData): boolean {\n return (authData.isAuth && authData.isAdmin)\n || hasPermission(authData, 'instructor')\n || hasPermission(authData, 'admin_portal')\n || hasPermission(authData, 'provider');\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { BehaviorSubject, Observable, of } from 'rxjs';\nimport { catchError, map, mergeMap, tap } from 'rxjs/operators';\nimport {\n AuthData,\n DEFAULT_NON_AUTH_DATA,\n} from './auth.types';\nimport { AuthAccess, LoginInfo, UserInfo, SetUserInfo, UpdateUserPasswordInfo, HONUWARE_AUTH_ACCESS } from '@honuware/ui/access';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService {\n private _authDataSubject = new BehaviorSubject<AuthData>(\n DEFAULT_NON_AUTH_DATA\n );\n public get authData$(): Observable<AuthData> {\n return this._authDataSubject.asObservable();\n }\n public get authData(): AuthData {\n return this._authDataSubject.value;\n }\n\n constructor(\n @Inject(HONUWARE_AUTH_ACCESS) private authAccess: AuthAccess,\n ) {}\n\n public updateAuthData(userInfo: UserInfo): void {\n const isAdmin = (userInfo.roles || []).includes('admin');\n const updated: AuthData = {\n isAuth: true,\n personId: userInfo.person_id,\n firstName: userInfo.first_name,\n lastName: userInfo.last_name,\n email: userInfo.email,\n createdAt: userInfo.created_at,\n roles: userInfo.roles,\n permissions: userInfo.permissions,\n isAdmin: isAdmin,\n mustChangePassword: userInfo.must_change_password ?? false,\n };\n this._authDataSubject.next(updated);\n }\n\n public setUserInfo(firstName: string, lastName: string, email: string): Observable<void> {\n const body: SetUserInfo = {\n first_name: firstName,\n last_name: lastName,\n email: email\n };\n\n return this.authAccess.setUserInfo(body).pipe(\n mergeMap(() => this.authAccess.getUserInfo()),\n tap((ui: UserInfo) => this.updateAuthData(ui)),\n map(() => void 0)\n );\n }\n\n public doSetUserInfo(firstName: string, lastName: string, email: string): void {\n this.setUserInfo(firstName, lastName, email).subscribe();\n }\n\n public updateUserPassword(oldPassword: string, newPassword: string): Observable<void> {\n const body: UpdateUserPasswordInfo = {\n old_password: oldPassword,\n new_password: newPassword,\n };\n return this.authAccess.updateUserPassword(body);\n }\n\n public doUpdateUserPassword(oldPassword: string, newPassword: string): void {\n this.updateUserPassword(oldPassword, newPassword).subscribe();\n }\n\n public tryTokenLogin(): Observable<boolean> {\n // Path A: session token valid -> get user info\n return this.authAccess.me().pipe(\n mergeMap(() =>\n this.authAccess.getUserInfo().pipe(\n tap((ui) => this.updateAuthData(ui)),\n map(() => true)\n )\n ),\n catchError((err) => {\n // If 401, attempt device remember token flow\n if (err?.status === 401) {\n return this.authAccess.remember().pipe(\n mergeMap(() => this.authAccess.me()),\n mergeMap(() =>\n this.authAccess.getUserInfo().pipe(\n tap((ui) => this.updateAuthData(ui)),\n map(() => true)\n )\n ),\n catchError(() => of(false))\n );\n }\n return of(false);\n })\n );\n }\n\n public login(\n email: string,\n password: string,\n remember: boolean\n ): Observable<void> {\n const body: LoginInfo = { email, password, remember };\n return this.authAccess.login(body).pipe(\n mergeMap(() =>\n this.authAccess.getUserInfo().pipe(\n tap((ui) => this.updateAuthData(ui)),\n map(() => void 0)\n )\n )\n );\n }\n\n public logout(): Observable<void> {\n return this.authAccess.logout().pipe(\n tap(() => this._authDataSubject.next(DEFAULT_NON_AUTH_DATA))\n );\n }\n\n public register(\n firstName: string,\n lastName: string,\n email: string,\n password: string\n ): Observable<void> {\n return this.authAccess.register(firstName, lastName, email, password);\n }\n\n // Phase 3.3 of the security review: the SPA's /verify route lands\n // here. The verification email's link points at the SPA, which calls\n // this and then immediately scrubs the URL via history.replaceState.\n public verify(email: string, secret: string): Observable<void> {\n return this.authAccess.verify(email, secret);\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n// Route literals the auth layer (guards, ErrorInterceptor, auth pages) would\n// otherwise hardcode. Injected so a honuware consumer can remap them without\n// forking the components — the seam that lets @honuware/ui/auth ship working\n// auth screens + guards a new site *configures* rather than rewrites.\nexport interface AuthRoutes {\n /** Where the login page lives. */\n loginPath: string;\n /** Where the register page lives. */\n registerPath: string;\n /**\n * Home path — used both after logout and as the \"access denied\" fallback\n * for guard checks that reject the current user.\n */\n postLogoutPath: string;\n /** Forced-password-change page (users with must_change_password). */\n mustChangePasswordPath: string;\n /**\n * Same-origin path prefixes a post-login returnUrl may target. Anything\n * outside this list (or off-origin) is rejected to '/' by sanitizeReturnUrl.\n */\n returnUrlAllowlist: ReadonlyArray<string>;\n}\n\nexport const DEFAULT_AUTH_ROUTES: AuthRoutes = {\n loginPath: '/login',\n registerPath: '/register',\n postLogoutPath: '/',\n mustChangePasswordPath: '/my/update-user-password',\n returnUrlAllowlist: ['/my', '/admin', '/manage', '/staff', '/calendar', '/shop'],\n};\n\n// Root-provided with the knottyyoga defaults, so nothing needs wiring today.\n// When the auth layer moves into @honuware/ui/auth the library token drops the\n// app default and each consumer provides its own AuthRoutes.\nexport const AUTH_ROUTES = new InjectionToken<AuthRoutes>('AUTH_ROUTES', {\n providedIn: 'root',\n factory: () => DEFAULT_AUTH_ROUTES,\n});\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateChildFn, CanActivateFn, Router, RouterStateSnapshot } from '@angular/router';\nimport { AuthService } from './auth.service';\nimport { hasManageProducts, hasStaffAccess } from './auth.types';\nimport { AUTH_ROUTES } from './auth-routes';\n\nexport const AdminGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (!authService.authData.isAuth || !authService.authData.isAdmin) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n\nexport const AuthGuard: CanActivateFn | CanActivateChildFn = (\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot\n) => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n const url = state.url;\n // Allow access to login and register without auth\n if (url.startsWith(routes.loginPath) || url.startsWith(routes.registerPath)) {\n return true;\n }\n\n if (!authService.authData.isAuth) {\n const returnUrl = encodeURIComponent(url);\n return router.parseUrl(`${routes.loginPath}?returnUrl=${returnUrl}`);\n }\n\n // Force password change if required (allow access to the change password page itself)\n if (authService.authData.mustChangePassword &&\n !url.startsWith(routes.mustChangePasswordPath)) {\n return router.parseUrl(routes.mustChangePasswordPath);\n }\n\n return true;\n};\n\nexport const ManageProductsGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (!hasManageProducts(authService.authData)) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n\nexport const StaffGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (!hasStaffAccess(authService.authData)) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n\nexport const NoAuthGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (authService.authData.isAuth) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n","import { Injectable, Inject } from '@angular/core';\nimport {\n HttpInterceptor,\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { Router } from '@angular/router';\nimport { ErrorService, ErrorTypes, ProblemDetails } from '@honuware/ui/access';\nimport { AUTH_ROUTES, AuthRoutes } from './auth-routes';\n\n/**\n * Extended HttpErrorResponse that includes parsed ProblemDetails\n */\nexport interface ParsedHttpErrorResponse extends HttpErrorResponse {\n problemDetails: ProblemDetails;\n}\n\n@Injectable()\nexport class ErrorInterceptor implements HttpInterceptor {\n constructor(\n private errorService: ErrorService,\n private router: Router,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes\n ) {}\n\n intercept(\n request: HttpRequest<unknown>,\n next: HttpHandler\n ): Observable<HttpEvent<unknown>> {\n return next.handle(request).pipe(\n catchError((error: HttpErrorResponse) => {\n const problemDetails = this.errorService.parseError(error);\n\n // Handle session expired globally - redirect to login\n if (\n problemDetails.type === ErrorTypes.SESSION_EXPIRED ||\n (problemDetails.type === ErrorTypes.NOT_AUTHENTICATED &&\n !this.isAuthEndpoint(request.url))\n ) {\n this.router.navigate([this.authRoutes.loginPath]);\n }\n\n // Create extended error with parsed problem details\n const parsedError = Object.assign(error, {\n problemDetails,\n }) as ParsedHttpErrorResponse;\n\n return throwError(() => parsedError);\n })\n );\n }\n\n private isAuthEndpoint(url: string): boolean {\n const authEndpoints = ['/api/login', '/api/register', '/api/me', '/api/remember'];\n return authEndpoints.some((endpoint) => url.includes(endpoint));\n }\n}\n","import { Component, Inject } from '@angular/core';\n\nimport {\n ReactiveFormsModule,\n FormBuilder,\n FormGroup,\n Validators,\n} from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { AuthService } from '../auth.service';\nimport { AUTH_ROUTES, AuthRoutes } from '../auth-routes';\nimport { sanitizeReturnUrl, ToastService } from '@honuware/ui/foundation';\nimport { ErrorService } from '@honuware/ui/access';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n@Component({\n selector: 'hw-login',\n standalone: true,\n imports: [\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatCheckboxModule,\n MatIcon,\n RouterLink\n],\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.scss'],\n})\nexport class LoginComponent {\n form: FormGroup;\n hidePassword = true;\n private returnUrl: string;\n\n constructor(\n private fb: FormBuilder,\n private authService: AuthService,\n private router: Router,\n private route: ActivatedRoute,\n private toastService: ToastService,\n private errorService: ErrorService,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes\n ) {\n this.form = this.fb.group({\n email: ['', [Validators.required]],\n password: ['', [Validators.required]],\n remember: [false],\n });\n // Phase 10.2: never trust the raw query parameter — see\n // sanitizeReturnUrl above for the threat model.\n this.returnUrl = sanitizeReturnUrl(\n this.route.snapshot.queryParamMap.get('returnUrl'),\n this.authRoutes.returnUrlAllowlist,\n );\n }\n\n togglePasswordVisibility(): void {\n this.hidePassword = !this.hidePassword;\n }\n\n onSignIn(): void {\n if (this.form.invalid) {\n this.form.markAllAsTouched();\n return;\n }\n const email = this.form.get('email')?.value ?? '';\n const password = this.form.get('password')?.value ?? '';\n const remember = !!this.form.get('remember')?.value;\n\n this.authService.login(email, password, remember).subscribe({\n next: () => {\n if (this.authService.authData.isAuth && this.authService.authData.mustChangePassword) {\n this.router.navigateByUrl(this.authRoutes.mustChangePasswordPath);\n } else {\n this.router.navigateByUrl(this.returnUrl);\n }\n },\n error: (err: HttpErrorResponse) => {\n const problem = this.errorService.parseError(err);\n this.toastService.error(this.errorService.getUserFriendlyMessage(problem));\n },\n });\n }\n}\n","<div class=\"auth-card\">\n <h1 class=\"auth-title\">Log In</h1>\n\n <form [formGroup]=\"form\" (submit)=\"onSignIn()\" class=\"auth-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"text\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\"\n matInput\n [type]=\"hidePassword ? 'password' : 'text'\"\n formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"password-toggle\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-checkbox id=\"remember\" formControlName=\"remember\">Remember Me</mat-checkbox>\n\n <button mat-raised-button id=\"signIn\" color=\"primary\" type=\"submit\">Sign in</button>\n </form>\n\n <a\n id=\"create-account-link\"\n [routerLink]=\"'/register'\"\n color=\"primary\"\n class=\"auth-link\"\n >\n Create an account\n </a>\n</div>\n","import { Component, Inject } from '@angular/core';\n\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { AuthService } from '../auth.service';\nimport { AUTH_ROUTES, AuthRoutes } from '../auth-routes';\nimport { Router } from '@angular/router';\nimport { ToastService } from '@honuware/ui/foundation';\nimport { ErrorService } from '@honuware/ui/access';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n@Component({\n selector: 'hw-register',\n standalone: true,\n imports: [ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIcon],\n templateUrl: './register.component.html',\n styleUrls: ['./register.component.scss']\n})\nexport class RegisterComponent {\n form: FormGroup;\n hidePassword = true;\n\n constructor(\n private fb: FormBuilder,\n private authService: AuthService,\n private router: Router,\n private toastService: ToastService,\n private errorService: ErrorService,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes\n ) {\n this.form = this.fb.group(\n {\n email: ['', [Validators.required, Validators.email]],\n first_name: ['', [Validators.required]],\n last_name: ['', [Validators.required]],\n password: ['', [Validators.required]],\n password2: ['', [Validators.required]],\n },\n { validators: this.passwordsMatchValidator }\n );\n }\n\n togglePasswordVisibility(): void {\n this.hidePassword = !this.hidePassword;\n }\n\n // Custom validator that flags mismatch only when both fields are dirty and values differ\n private passwordsMatchValidator(group: AbstractControl): ValidationErrors | null {\n const password = group.get('password');\n const password2 = group.get('password2');\n if (!password || !password2) return null;\n\n const bothDirty = password.dirty && password2.dirty;\n const mismatch = password.value !== password2.value;\n\n if (bothDirty && mismatch) {\n password2.setErrors({ mismatch: true });\n return { mismatch: true };\n } else {\n // Clear mismatch error when aligned or not both dirty\n if (password2.hasError('mismatch')) {\n const otherErrors = { ...password2.errors };\n delete otherErrors['mismatch'];\n password2.setErrors(Object.keys(otherErrors).length ? otherErrors : null);\n }\n return null;\n }\n }\n\n onRegister(): void {\n if (this.form.invalid) {\n this.form.markAllAsTouched();\n return;\n }\n const email = this.form.get('email')?.value ?? '';\n const firstName = this.form.get('first_name')?.value ?? '';\n const lastName = this.form.get('last_name')?.value ?? '';\n const password = this.form.get('password')?.value ?? '';\n\n this.authService.register(firstName, lastName, email, password).subscribe({\n next: () => this.router.navigate([this.authRoutes.loginPath]),\n error: (err: HttpErrorResponse) => {\n const problem = this.errorService.parseError(err);\n this.toastService.error(this.errorService.getUserFriendlyMessage(problem));\n }\n });\n }\n\n showPasswordMismatch(): boolean {\n const password = this.form.get('password');\n const password2 = this.form.get('password2');\n if (!password || !password2) return false;\n return !!password.dirty && !!password2.dirty && password.value !== password2.value;\n }\n}\n","<div class=\"auth-card\">\n <h1 class=\"auth-title\">Create Account</h1>\n\n <form [formGroup]=\"form\" (ngSubmit)=\"onRegister()\" class=\"auth-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"email\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>First name</mat-label>\n <input id=\"first_name\" matInput type=\"text\" formControlName=\"first_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Last name</mat-label>\n <input id=\"last_name\" matInput type=\"text\" formControlName=\"last_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"password-toggle\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Reenter password</mat-label>\n <input id=\"password2\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password2\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"password-toggle\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n @if (showPasswordMismatch()) {\n <mat-error>\n Passwords do not match.\n </mat-error>\n }\n </mat-form-field>\n\n <button id=\"Register\" mat-raised-button color=\"primary\" type=\"submit\">\n Register\n </button>\n </form>\n</div>\n","import { Component, Inject, OnInit } from '@angular/core';\n\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { AuthService } from '../auth.service';\nimport { AUTH_ROUTES, AuthRoutes } from '../auth-routes';\nimport { ToastService } from '@honuware/ui/foundation';\n\n/**\n * Phase 3.3 of the security review.\n *\n * The verification email links at this SPA route — `/verify?email=…&secret=…` —\n * rather than at the API. The component:\n *\n * 1. Reads `email` and `secret` from the query string.\n * 2. Immediately calls `AuthService.verify(email, secret)` (POST /api/verify).\n * 3. Right after firing the request, scrubs the URL via\n * `history.replaceState({}, '', '/verify-success')` so the secret\n * stops appearing in the URL bar / browser history. We do this\n * synchronously, NOT inside the response callback, so the URL is\n * sanitized whether the request succeeds, fails, or is delayed.\n * 4. On success or failure, routes to `/login` with a toast. The two\n * paths use different toasts but the toast text never echoes the\n * server's error detail — failed verifications all collapse to one\n * generic message to avoid distinguishing \"wrong secret\" from\n * \"expired\" from \"already verified\".\n */\n@Component({\n selector: 'hw-verify',\n standalone: true,\n imports: [],\n templateUrl: './verify.component.html',\n styleUrls: ['./verify.component.scss']\n})\nexport class VerifyComponent implements OnInit {\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private authService: AuthService,\n private toastService: ToastService,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes,\n ) {}\n\n ngOnInit(): void {\n const email = this.route.snapshot.queryParamMap.get('email') ?? '';\n const secret = this.route.snapshot.queryParamMap.get('secret') ?? '';\n\n if (!email || !secret) {\n this.scrubUrl();\n this.toastService.error(\n 'Verification link is missing required parameters.'\n );\n this.router.navigate([this.authRoutes.loginPath]);\n return;\n }\n\n // Fire the verification request first, THEN scrub the URL. The\n // secret is in memory either way; the goal of the scrub is to keep\n // it out of the browser's URL bar and history. Doing it before\n // we're sure about the response means even a slow / failed request\n // doesn't leave the secret visible.\n const verify$ = this.authService.verify(email, secret);\n this.scrubUrl();\n\n verify$.subscribe({\n next: () => {\n this.toastService.success(\n 'Email verified — please log in.'\n );\n this.router.navigate([this.authRoutes.loginPath]);\n },\n error: () => {\n // Phase 3.3: don't echo the server error detail. All failure\n // modes (wrong secret, expired, already-used) collapse to a\n // single generic message.\n this.toastService.error(\n 'Verification failed or expired. Please try again.'\n );\n this.router.navigate([this.authRoutes.loginPath]);\n },\n });\n }\n\n private scrubUrl(): void {\n // We can't replace the path via Router.navigate without triggering\n // a route change here — `history.replaceState` mutates only the URL\n // bar / history entry. The `/verify-success` path doesn't need to\n // be a real route; we navigate to /login on the next tick anyway.\n window.history.replaceState({}, '', '/verify-success');\n }\n}\n","<div class=\"verify-container\">\n <p>Verifying your email...</p>\n</div>\n","import { firstValueFrom } from 'rxjs';\nimport { AuthService } from './auth.service';\n\n// Phase 10.1 of the security review: try silent re-auth at bootstrap so\n// the SPA hydrates `authData$` BEFORE the first route activates. Without\n// this an authenticated user lands on a public-looking shell, sees the\n// guarded route bounce them to /login, and only then gets logged in by\n// the device-token flow.\n//\n// Returns a thunk (factory) so Angular invokes it AFTER DI sets up the\n// AuthService graph. We resolve regardless of outcome — a network blip\n// or invalid cookie should not block app bootstrap. A consumer wires this\n// into an APP_INITIALIZER with `deps: [AuthService]`.\nexport function tryTokenLoginInitializer(authService: AuthService): () => Promise<void> {\n return () =>\n firstValueFrom(authService.tryTokenLogin())\n .then(() => void 0)\n .catch(() => void 0);\n}\n","/*\n * @honuware/ui/auth — the auth layer: AuthService + AuthData/permission\n * helpers, the five route guards, the ErrorInterceptor, the login/register/\n * verify pages (selectors `hw-`), the AUTH_ROUTES config token, and the\n * tryTokenLogin bootstrap initializer. Depends on foundation + access.\n */\nexport { AuthService } from './auth.service';\n\nexport { DEFAULT_NON_AUTH_DATA, hasPermission, hasManageProducts, hasStaffAccess } from './auth.types';\nexport type { AuthData } from './auth.types';\n\nexport { AUTH_ROUTES, DEFAULT_AUTH_ROUTES } from './auth-routes';\nexport type { AuthRoutes } from './auth-routes';\n\nexport { AdminGuard, AuthGuard, ManageProductsGuard, StaffGuard, NoAuthGuard } from './auth-guards';\n\nexport { ErrorInterceptor } from './error.interceptor';\nexport type { ParsedHttpErrorResponse } from './error.interceptor';\n\nexport { LoginComponent } from './login/login.component';\nexport { RegisterComponent } from './register/register.component';\nexport { VerifyComponent } from './verify/verify.component';\n\nexport { tryTokenLoginInitializer } from './try-token-login';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAiBO,MAAM,qBAAqB,GAAa;AAC7C,IAAA,MAAM,EAAE,KAAK;;AAGT,SAAU,aAAa,CAAC,QAAkB,EAAE,UAAkB,EAAA;AAClE,IAAA,OAAO,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;AACrE;AAEM,SAAU,iBAAiB,CAAC,QAAkB,EAAA;AAClD,IAAA,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,KAAK,aAAa,CAAC,QAAQ,EAAE,iBAAiB,CAAC;AAC5F;AAEM,SAAU,cAAc,CAAC,QAAkB,EAAA;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO;AACtC,WAAA,aAAa,CAAC,QAAQ,EAAE,YAAY;AACpC,WAAA,aAAa,CAAC,QAAQ,EAAE,cAAc;AACtC,WAAA,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC;AAC1C;;MCtBa,WAAW,CAAA;AAYkB,IAAA,UAAA;AAXhC,IAAA,gBAAgB,GAAG,IAAI,eAAe,CAC5C,qBAAqB,CACtB;AACD,IAAA,IAAW,SAAS,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE;IAC7C;AACA,IAAA,IAAW,QAAQ,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK;IACpC;AAEA,IAAA,WAAA,CACwC,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;IAC/C;AAEI,IAAA,cAAc,CAAC,QAAkB,EAAA;AACtC,QAAA,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC;AACxD,QAAA,MAAM,OAAO,GAAa;AACxB,YAAA,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,QAAQ,CAAC,SAAS;YAC5B,SAAS,EAAE,QAAQ,CAAC,UAAU;YAC9B,QAAQ,EAAE,QAAQ,CAAC,SAAS;YAC5B,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,SAAS,EAAE,QAAQ,CAAC,UAAU;YAC9B,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;AACjC,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,kBAAkB,EAAE,QAAQ,CAAC,oBAAoB,IAAI,KAAK;SAC3D;AACD,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;IACrC;AAEO,IAAA,WAAW,CAAC,SAAiB,EAAE,QAAgB,EAAE,KAAa,EAAA;AACnE,QAAA,MAAM,IAAI,GAAgB;AACxB,YAAA,UAAU,EAAE,SAAS;AACrB,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,KAAK,EAAE;SACR;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAC3C,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,EAC7C,GAAG,CAAC,CAAC,EAAY,KAAK,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EAC9C,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAClB;IACH;AAEO,IAAA,aAAa,CAAC,SAAiB,EAAE,QAAgB,EAAE,KAAa,EAAA;AACrE,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,SAAS,EAAE;IAC1D;IAEO,kBAAkB,CAAC,WAAmB,EAAE,WAAmB,EAAA;AAChE,QAAA,MAAM,IAAI,GAA2B;AACnC,YAAA,YAAY,EAAE,WAAW;AACzB,YAAA,YAAY,EAAE,WAAW;SAC1B;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC;IACjD;IAEO,oBAAoB,CAAC,WAAmB,EAAE,WAAmB,EAAA;QAClE,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,SAAS,EAAE;IAC/D;IAEO,aAAa,GAAA;;QAElB,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,CAC9B,QAAQ,CAAC,MACP,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,CAChC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EACpC,GAAG,CAAC,MAAM,IAAI,CAAC,CAChB,CACF,EACD,UAAU,CAAC,CAAC,GAAG,KAAI;;AAEjB,YAAA,IAAI,GAAG,EAAE,MAAM,KAAK,GAAG,EAAE;AACvB,gBAAA,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,IAAI,CACpC,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EACpC,QAAQ,CAAC,MACP,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,CAChC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EACpC,GAAG,CAAC,MAAM,IAAI,CAAC,CAChB,CACF,EACD,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAC5B;YACH;AACA,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH;IACH;AAEO,IAAA,KAAK,CACV,KAAa,EACb,QAAgB,EAChB,QAAiB,EAAA;QAEjB,MAAM,IAAI,GAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACrD,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CACrC,QAAQ,CAAC,MACP,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,CAChC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EACpC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAClB,CACF,CACF;IACH;IAEO,MAAM,GAAA;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAClC,GAAG,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAC7D;IACH;AAEO,IAAA,QAAQ,CACb,SAAiB,EACjB,QAAgB,EAChB,KAAa,EACb,QAAgB,EAAA;AAEhB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC;IACvE;;;;IAKO,MAAM,CAAC,KAAa,EAAE,MAAc,EAAA;QACzC,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;IAC9C;AA9HW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,kBAYZ,oBAAoB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAZnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA;;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAaI,MAAM;2BAAC,oBAAoB;;;ACCzB,MAAM,mBAAmB,GAAe;AAC7C,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,YAAY,EAAE,WAAW;AACzB,IAAA,cAAc,EAAE,GAAG;AACnB,IAAA,sBAAsB,EAAE,0BAA0B;AAClD,IAAA,kBAAkB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;;AAGlF;AACA;AACA;MACa,WAAW,GAAG,IAAI,cAAc,CAAa,aAAa,EAAE;AACvE,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,mBAAmB;AACnC,CAAA;;ACjCM,MAAM,UAAU,GAAuC,MAAK;AACjE,IAAA,MAAM,MAAM,GAAW,MAAM,CAAC,MAAM,CAAC;AACrC,IAAA,MAAM,WAAW,GAAgB,MAAM,CAAC,WAAW,CAAC;AACpD,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;AAElC,IAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE;QACjE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;IAC/C;AAEA,IAAA,OAAO,IAAI;AACb;MAEa,SAAS,GAAuC,CAC3D,KAA6B,EAC7B,KAA0B,KACxB;AACF,IAAA,MAAM,MAAM,GAAW,MAAM,CAAC,MAAM,CAAC;AACrC,IAAA,MAAM,WAAW,GAAgB,MAAM,CAAC,WAAW,CAAC;AACpD,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;AAElC,IAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG;;AAErB,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;AAC3E,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE;AAChC,QAAA,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC;AACzC,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAA,EAAG,MAAM,CAAC,SAAS,CAAA,WAAA,EAAc,SAAS,CAAA,CAAE,CAAC;IACtE;;AAGA,IAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB;QACvC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,sBAAsB,CAAC,EAAE;QAClD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,sBAAsB,CAAC;IACvD;AAEA,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,mBAAmB,GAAuC,MAAK;AAC1E,IAAA,MAAM,MAAM,GAAW,MAAM,CAAC,MAAM,CAAC;AACrC,IAAA,MAAM,WAAW,GAAgB,MAAM,CAAC,WAAW,CAAC;AACpD,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;IAElC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE;QAC5C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;IAC/C;AAEA,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,UAAU,GAAuC,MAAK;AACjE,IAAA,MAAM,MAAM,GAAW,MAAM,CAAC,MAAM,CAAC;AACrC,IAAA,MAAM,WAAW,GAAgB,MAAM,CAAC,WAAW,CAAC;AACpD,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;IAElC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE;QACzC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;IAC/C;AAEA,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,WAAW,GAAuC,MAAK;AAClE,IAAA,MAAM,MAAM,GAAW,MAAM,CAAC,MAAM,CAAC;AACrC,IAAA,MAAM,WAAW,GAAgB,MAAM,CAAC,WAAW,CAAC;AACpD,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;AAElC,IAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;IAC/C;AAEA,IAAA,OAAO,IAAI;AACb;;MC1Da,gBAAgB,CAAA;AAEjB,IAAA,YAAA;AACA,IAAA,MAAA;AACqB,IAAA,UAAA;AAH/B,IAAA,WAAA,CACU,YAA0B,EAC1B,MAAc,EACO,UAAsB,EAAA;QAF3C,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,MAAM,GAAN,MAAM;QACe,IAAA,CAAA,UAAU,GAAV,UAAU;IACtC;IAEH,SAAS,CACP,OAA6B,EAC7B,IAAiB,EAAA;AAEjB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAC9B,UAAU,CAAC,CAAC,KAAwB,KAAI;YACtC,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC;;AAG1D,YAAA,IACE,cAAc,CAAC,IAAI,KAAK,UAAU,CAAC,eAAe;AAClD,iBAAC,cAAc,CAAC,IAAI,KAAK,UAAU,CAAC,iBAAiB;oBACnD,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EACpC;AACA,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACnD;;AAGA,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;gBACvC,cAAc;AACf,aAAA,CAA4B;AAE7B,YAAA,OAAO,UAAU,CAAC,MAAM,WAAW,CAAC;QACtC,CAAC,CAAC,CACH;IACH;AAEQ,IAAA,cAAc,CAAC,GAAW,EAAA;QAChC,MAAM,aAAa,GAAG,CAAC,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,CAAC;AACjF,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjE;AArCW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,oEAIjB,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAJV,gBAAgB,EAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;0BAKI,MAAM;2BAAC,WAAW;;;MCSV,cAAc,CAAA;AAMf,IAAA,EAAA;AACA,IAAA,WAAA;AACA,IAAA,MAAA;AACA,IAAA,KAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACqB,IAAA,UAAA;AAX/B,IAAA,IAAI;IACJ,YAAY,GAAG,IAAI;AACX,IAAA,SAAS;AAEjB,IAAA,WAAA,CACU,EAAe,EACf,WAAwB,EACxB,MAAc,EACd,KAAqB,EACrB,YAA0B,EAC1B,YAA0B,EACL,UAAsB,EAAA;QAN3C,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,YAAY,GAAZ,YAAY;QACS,IAAA,CAAA,UAAU,GAAV,UAAU;QAEvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YACxB,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAClC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACrC,QAAQ,EAAE,CAAC,KAAK,CAAC;AAClB,SAAA,CAAC;;;QAGF,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAChC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,EAClD,IAAI,CAAC,UAAU,CAAC,kBAAkB,CACnC;IACH;IAEA,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY;IACxC;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACrB,YAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5B;QACF;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE;AACjD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,IAAI,EAAE;AACvD,QAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK;AAEnD,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC;YAC1D,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,kBAAkB,EAAE;oBACpF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;gBACnE;qBAAO;oBACL,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC3C;YACF,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAsB,KAAI;gBAChC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;AACjD,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAC5E,CAAC;AACF,SAAA,CAAC;IACJ;AArDW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,iLAYf,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAZV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnC3B,ivCAyCA,EAAA,MAAA,EAAA,CAAA,mYAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjBI,mBAAmB,w9BACnB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,OAAO,2IACP,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAKD,cAAc,EAAA,UAAA,EAAA,CAAA;kBAf1B,SAAS;+BACE,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,OAAA,EACP;wBACP,mBAAmB;wBACnB,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,iBAAiB;wBACjB,OAAO;wBACP;AACH,qBAAA,EAAA,QAAA,EAAA,ivCAAA,EAAA,MAAA,EAAA,CAAA,mYAAA,CAAA,EAAA;;0BAgBI,MAAM;2BAAC,WAAW;;;ME1BV,iBAAiB,CAAA;AAKlB,IAAA,EAAA;AACA,IAAA,WAAA;AACA,IAAA,MAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACqB,IAAA,UAAA;AAT/B,IAAA,IAAI;IACJ,YAAY,GAAG,IAAI;IAEnB,WAAA,CACU,EAAe,EACf,WAAwB,EACxB,MAAc,EACd,YAA0B,EAC1B,YAA0B,EACL,UAAsB,EAAA;QAL3C,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,YAAY,GAAZ,YAAY;QACS,IAAA,CAAA,UAAU,GAAV,UAAU;QAEvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CACvB;AACE,YAAA,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;YACpD,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACtC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACrC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;SACvC,EACD,EAAE,UAAU,EAAE,IAAI,CAAC,uBAAuB,EAAE,CAC7C;IACH;IAEA,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY;IACxC;;AAGQ,IAAA,uBAAuB,CAAC,KAAsB,EAAA;QACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;QACtC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;AACxC,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;QAExC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK;QACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK;AAEnD,QAAA,IAAI,SAAS,IAAI,QAAQ,EAAE;YACzB,SAAS,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACvC,YAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3B;aAAO;;AAEL,YAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;gBAClC,MAAM,WAAW,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE;AAC3C,gBAAA,OAAO,WAAW,CAAC,UAAU,CAAC;gBAC9B,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;YAC3E;AACA,YAAA,OAAO,IAAI;QACb;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACrB,YAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5B;QACF;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE;AACjD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,IAAI,EAAE;AAC1D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,EAAE;AACxD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,IAAI,EAAE;AAEvD,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC;AACxE,YAAA,IAAI,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC7D,YAAA,KAAK,EAAE,CAAC,GAAsB,KAAI;gBAChC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;AACjD,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAC5E;AACD,SAAA,CAAC;IACJ;IAEA,oBAAoB,GAAA;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;AAC5C,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,KAAK;AACzC,QAAA,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK;IACpF;AA3EW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,mJAUlB,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAVV,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrB9B,w+DA2DA,EAAA,MAAA,EAAA,CAAA,sWAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1CY,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIhF,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,CAAC,EAAA,QAAA,EAAA,w+DAAA,EAAA,MAAA,EAAA,CAAA,sWAAA,CAAA,EAAA;;0BAczF,MAAM;2BAAC,WAAW;;;AEvBvB;;;;;;;;;;;;;;;;;;AAkBG;MAQU,eAAe,CAAA;AAEhB,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,WAAA;AACA,IAAA,YAAA;AACqB,IAAA,UAAA;IAL/B,WAAA,CACU,KAAqB,EACrB,MAAc,EACd,WAAwB,EACxB,YAA0B,EACL,UAAsB,EAAA;QAJ3C,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,YAAY,GAAZ,YAAY;QACS,IAAA,CAAA,UAAU,GAAV,UAAU;IACtC;IAEH,QAAQ,GAAA;AACN,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;AAClE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;AAEpE,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE;YACrB,IAAI,CAAC,QAAQ,EAAE;AACf,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CACrB,mDAAmD,CACpD;AACD,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACjD;QACF;;;;;;AAOA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;QACtD,IAAI,CAAC,QAAQ,EAAE;QAEf,OAAO,CAAC,SAAS,CAAC;YAChB,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CACvB,iCAAiC,CAClC;AACD,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACnD,CAAC;YACD,KAAK,EAAE,MAAK;;;;AAIV,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CACrB,mDAAmD,CACpD;AACD,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACnD,CAAC;AACF,SAAA,CAAC;IACJ;IAEQ,QAAQ,GAAA;;;;;QAKd,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,iBAAiB,CAAC;IACxD;AAvDW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,0HAMhB,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AANV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,qEClC5B,8EAGA,EAAA,MAAA,EAAA,CAAA,4HAAA,CAAA,EAAA,CAAA;;4FD+Ba,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;+BACE,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,QAAA,EAAA,8EAAA,EAAA,MAAA,EAAA,CAAA,4HAAA,CAAA,EAAA;;0BAUR,MAAM;2BAAC,WAAW;;;AErCvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACM,SAAU,wBAAwB,CAAC,WAAwB,EAAA;IAC/D,OAAO,MACL,cAAc,CAAC,WAAW,CAAC,aAAa,EAAE;AACvC,SAAA,IAAI,CAAC,MAAM,KAAK,CAAC;AACjB,SAAA,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;AAC1B;;AClBA;;;;;AAKG;;ACLH;;AAEG;;;;"}
@@ -937,11 +937,11 @@ class TableViewPageComponent {
937
937
  this.destroy$.complete();
938
938
  }
939
939
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TableViewPageComponent, deps: [{ token: i1$1.ActivatedRoute }, { token: CRUD_EDITOR_ROUTES }], target: i0.ɵɵFactoryTarget.Component });
940
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: TableViewPageComponent, isStandalone: true, selector: "hw-table-view-page", ngImport: i0, template: "<a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">&larr; Back to admin portal</a>\n<hw-table-view-control\n [tableName]=\"tableName\"\n [pageSize]=\"pageSize\"\n [pageOffset]=\"pageOffset\"\n [bindingStack]=\"bindingStack\">\n</hw-table-view-control>\n", dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: TableViewControlComponent, selector: "hw-table-view-control", inputs: ["tableName", "pageSize", "pageOffset", "sortColumn", "sortAscending", "bindingStack"] }] });
940
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: TableViewPageComponent, isStandalone: true, selector: "hw-table-view-page", ngImport: i0, template: "<a [routerLink]=\"adminHome\" class=\"din back-link\">&larr; Back to admin portal</a>\n<hw-table-view-control\n [tableName]=\"tableName\"\n [pageSize]=\"pageSize\"\n [pageOffset]=\"pageOffset\"\n [bindingStack]=\"bindingStack\">\n</hw-table-view-control>\n", styles: [".back-link{display:inline-block;margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;color:#2563eb}.back-link:hover{text-decoration:underline}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: TableViewControlComponent, selector: "hw-table-view-control", inputs: ["tableName", "pageSize", "pageOffset", "sortColumn", "sortAscending", "bindingStack"] }] });
941
941
  }
942
942
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TableViewPageComponent, decorators: [{
943
943
  type: Component,
944
- args: [{ selector: 'hw-table-view-page', standalone: true, imports: [RouterModule, TableViewControlComponent], template: "<a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">&larr; Back to admin portal</a>\n<hw-table-view-control\n [tableName]=\"tableName\"\n [pageSize]=\"pageSize\"\n [pageOffset]=\"pageOffset\"\n [bindingStack]=\"bindingStack\">\n</hw-table-view-control>\n" }]
944
+ args: [{ selector: 'hw-table-view-page', standalone: true, imports: [RouterModule, TableViewControlComponent], template: "<a [routerLink]=\"adminHome\" class=\"din back-link\">&larr; Back to admin portal</a>\n<hw-table-view-control\n [tableName]=\"tableName\"\n [pageSize]=\"pageSize\"\n [pageOffset]=\"pageOffset\"\n [bindingStack]=\"bindingStack\">\n</hw-table-view-control>\n", styles: [".back-link{display:inline-block;margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;color:#2563eb}.back-link:hover{text-decoration:underline}\n"] }]
945
945
  }], ctorParameters: () => [{ type: i1$1.ActivatedRoute }, { type: undefined, decorators: [{
946
946
  type: Inject,
947
947
  args: [CRUD_EDITOR_ROUTES]
@@ -1000,7 +1000,7 @@ class TableEditPageComponent {
1000
1000
  this.destroy$.complete();
1001
1001
  }
1002
1002
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TableEditPageComponent, deps: [{ token: i1$1.ActivatedRoute }, { token: DatabaseSchemaService }, { token: CRUD_EDITOR_ROUTES }], target: i0.ɵɵFactoryTarget.Component });
1003
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: TableEditPageComponent, isStandalone: true, selector: "hw-table-edit-page", ngImport: i0, template: "@if (loading) {\n <div class=\"loading-container\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <p>Loading...</p>\n </div>\n}\n@if (!loading && error) {\n <div class=\"error-container\">\n <mat-icon>error</mat-icon>\n <p>{{ error }}</p>\n </div>\n}\n@if (!loading && !error) {\n <div class=\"edit-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold text-2xl mb-6\">Edit {{ tableFriendlyName }}</h1>\n <mat-card class=\"edit-card\">\n <mat-card-content>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [primaryKeyName]=\"primaryKeyName\"\n [primaryKeyValue]=\"primaryKeyValue\"\n [isCreateMode]=\"false\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\">\n </hw-composite-row-control>\n </mat-card-content>\n </mat-card>\n </div>\n}\n", styles: [".edit-page-container{padding:24px;max-width:800px}.edit-card{padding:16px;border:1px solid rgba(0,0,0,.12);box-shadow:0 2px 4px #0000001a}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;gap:16px}.loading-container p{color:#0009}.error-container{display:flex;align-items:center;gap:8px;padding:24px;color:#f44336}.error-container mat-icon{color:#f44336}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: CompositeRowControlComponent, selector: "hw-composite-row-control", inputs: ["tableName", "columnNames", "primaryKeyName", "primaryKeyValue", "isCreateMode", "returnUrl", "bindingStack", "formAssist"] }] });
1003
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: TableEditPageComponent, isStandalone: true, selector: "hw-table-edit-page", ngImport: i0, template: "@if (loading) {\n <div class=\"loading-container\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <p>Loading...</p>\n </div>\n}\n@if (!loading && error) {\n <div class=\"error-container\">\n <mat-icon>error</mat-icon>\n <p>{{ error }}</p>\n </div>\n}\n@if (!loading && !error) {\n <div class=\"edit-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din back-link\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold page-title\">Edit {{ tableFriendlyName }}</h1>\n <mat-card class=\"edit-card\">\n <mat-card-content>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [primaryKeyName]=\"primaryKeyName\"\n [primaryKeyValue]=\"primaryKeyValue\"\n [isCreateMode]=\"false\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\">\n </hw-composite-row-control>\n </mat-card-content>\n </mat-card>\n </div>\n}\n", styles: [".edit-page-container{padding:24px;max-width:800px}.back-link{display:inline-block;margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;color:#2563eb}.back-link:hover{text-decoration:underline}.page-title{margin-bottom:1.5rem;font-size:1.5rem;line-height:2rem}.edit-card{padding:16px;border:1px solid rgba(0,0,0,.12);box-shadow:0 2px 4px #0000001a}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;gap:16px}.loading-container p{color:#0009}.error-container{display:flex;align-items:center;gap:8px;padding:24px;color:#f44336}.error-container mat-icon{color:#f44336}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: CompositeRowControlComponent, selector: "hw-composite-row-control", inputs: ["tableName", "columnNames", "primaryKeyName", "primaryKeyValue", "isCreateMode", "returnUrl", "bindingStack", "formAssist"] }] });
1004
1004
  }
1005
1005
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TableEditPageComponent, decorators: [{
1006
1006
  type: Component,
@@ -1010,7 +1010,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
1010
1010
  MatProgressSpinnerModule,
1011
1011
  MatIconModule,
1012
1012
  CompositeRowControlComponent
1013
- ], template: "@if (loading) {\n <div class=\"loading-container\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <p>Loading...</p>\n </div>\n}\n@if (!loading && error) {\n <div class=\"error-container\">\n <mat-icon>error</mat-icon>\n <p>{{ error }}</p>\n </div>\n}\n@if (!loading && !error) {\n <div class=\"edit-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold text-2xl mb-6\">Edit {{ tableFriendlyName }}</h1>\n <mat-card class=\"edit-card\">\n <mat-card-content>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [primaryKeyName]=\"primaryKeyName\"\n [primaryKeyValue]=\"primaryKeyValue\"\n [isCreateMode]=\"false\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\">\n </hw-composite-row-control>\n </mat-card-content>\n </mat-card>\n </div>\n}\n", styles: [".edit-page-container{padding:24px;max-width:800px}.edit-card{padding:16px;border:1px solid rgba(0,0,0,.12);box-shadow:0 2px 4px #0000001a}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;gap:16px}.loading-container p{color:#0009}.error-container{display:flex;align-items:center;gap:8px;padding:24px;color:#f44336}.error-container mat-icon{color:#f44336}\n"] }]
1013
+ ], template: "@if (loading) {\n <div class=\"loading-container\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <p>Loading...</p>\n </div>\n}\n@if (!loading && error) {\n <div class=\"error-container\">\n <mat-icon>error</mat-icon>\n <p>{{ error }}</p>\n </div>\n}\n@if (!loading && !error) {\n <div class=\"edit-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din back-link\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold page-title\">Edit {{ tableFriendlyName }}</h1>\n <mat-card class=\"edit-card\">\n <mat-card-content>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [primaryKeyName]=\"primaryKeyName\"\n [primaryKeyValue]=\"primaryKeyValue\"\n [isCreateMode]=\"false\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\">\n </hw-composite-row-control>\n </mat-card-content>\n </mat-card>\n </div>\n}\n", styles: [".edit-page-container{padding:24px;max-width:800px}.back-link{display:inline-block;margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;color:#2563eb}.back-link:hover{text-decoration:underline}.page-title{margin-bottom:1.5rem;font-size:1.5rem;line-height:2rem}.edit-card{padding:16px;border:1px solid rgba(0,0,0,.12);box-shadow:0 2px 4px #0000001a}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;gap:16px}.loading-container p{color:#0009}.error-container{display:flex;align-items:center;gap:8px;padding:24px;color:#f44336}.error-container mat-icon{color:#f44336}\n"] }]
1014
1014
  }], ctorParameters: () => [{ type: i1$1.ActivatedRoute }, { type: DatabaseSchemaService }, { type: undefined, decorators: [{
1015
1015
  type: Inject,
1016
1016
  args: [CRUD_EDITOR_ROUTES]
@@ -1076,11 +1076,11 @@ class TableNewPageComponent {
1076
1076
  this.destroy$.complete();
1077
1077
  }
1078
1078
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TableNewPageComponent, deps: [{ token: i1$1.ActivatedRoute }, { token: i1$1.Router }, { token: DatabaseSchemaService }, { token: CRUD_EDITOR_ROUTES }], target: i0.ɵɵFactoryTarget.Component });
1079
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: TableNewPageComponent, isStandalone: true, selector: "hw-table-new-page", ngImport: i0, template: "@if (loading) {\n <div class=\"loading\">Loading...</div>\n}\n@if (!loading && error) {\n <div class=\"error\">{{ error }}</div>\n}\n@if (!loading && !error) {\n <div class=\"new-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold text-2xl mb-6\">New {{ tableFriendlyName }}</h1>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [isCreateMode]=\"true\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\"\n [formAssist]=\"formAssist\">\n </hw-composite-row-control>\n </div>\n}\n", styles: [".new-page-container{padding:16px}h2{margin-bottom:16px}.loading,.error{padding:16px}.error{color:#f44336}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: CompositeRowControlComponent, selector: "hw-composite-row-control", inputs: ["tableName", "columnNames", "primaryKeyName", "primaryKeyValue", "isCreateMode", "returnUrl", "bindingStack", "formAssist"] }] });
1079
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: TableNewPageComponent, isStandalone: true, selector: "hw-table-new-page", ngImport: i0, template: "@if (loading) {\n <div class=\"loading\">Loading...</div>\n}\n@if (!loading && error) {\n <div class=\"error\">{{ error }}</div>\n}\n@if (!loading && !error) {\n <div class=\"new-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din back-link\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold page-title\">New {{ tableFriendlyName }}</h1>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [isCreateMode]=\"true\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\"\n [formAssist]=\"formAssist\">\n </hw-composite-row-control>\n </div>\n}\n", styles: [".new-page-container{padding:16px}.back-link{display:inline-block;margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;color:#2563eb}.back-link:hover{text-decoration:underline}.page-title{margin-bottom:1.5rem;font-size:1.5rem;line-height:2rem}.loading,.error{padding:16px}.error{color:#f44336}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: CompositeRowControlComponent, selector: "hw-composite-row-control", inputs: ["tableName", "columnNames", "primaryKeyName", "primaryKeyValue", "isCreateMode", "returnUrl", "bindingStack", "formAssist"] }] });
1080
1080
  }
1081
1081
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TableNewPageComponent, decorators: [{
1082
1082
  type: Component,
1083
- args: [{ selector: 'hw-table-new-page', standalone: true, imports: [RouterModule, CompositeRowControlComponent], template: "@if (loading) {\n <div class=\"loading\">Loading...</div>\n}\n@if (!loading && error) {\n <div class=\"error\">{{ error }}</div>\n}\n@if (!loading && !error) {\n <div class=\"new-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold text-2xl mb-6\">New {{ tableFriendlyName }}</h1>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [isCreateMode]=\"true\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\"\n [formAssist]=\"formAssist\">\n </hw-composite-row-control>\n </div>\n}\n", styles: [".new-page-container{padding:16px}h2{margin-bottom:16px}.loading,.error{padding:16px}.error{color:#f44336}\n"] }]
1083
+ args: [{ selector: 'hw-table-new-page', standalone: true, imports: [RouterModule, CompositeRowControlComponent], template: "@if (loading) {\n <div class=\"loading\">Loading...</div>\n}\n@if (!loading && error) {\n <div class=\"error\">{{ error }}</div>\n}\n@if (!loading && !error) {\n <div class=\"new-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din back-link\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold page-title\">New {{ tableFriendlyName }}</h1>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [isCreateMode]=\"true\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\"\n [formAssist]=\"formAssist\">\n </hw-composite-row-control>\n </div>\n}\n", styles: [".new-page-container{padding:16px}.back-link{display:inline-block;margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;color:#2563eb}.back-link:hover{text-decoration:underline}.page-title{margin-bottom:1.5rem;font-size:1.5rem;line-height:2rem}.loading,.error{padding:16px}.error{color:#f44336}\n"] }]
1084
1084
  }], ctorParameters: () => [{ type: i1$1.ActivatedRoute }, { type: i1$1.Router }, { type: DatabaseSchemaService }, { type: undefined, decorators: [{
1085
1085
  type: Inject,
1086
1086
  args: [CRUD_EDITOR_ROUTES]
@@ -1 +1 @@
1
- {"version":3,"file":"honuware-ui-crud.mjs","sources":["../../../projects/honuware-ui/crud/src/database-schema.service.ts","../../../projects/honuware-ui/crud/src/table-binding.utils.ts","../../../projects/honuware-ui/crud/src/crud-editor-routes.ts","../../../projects/honuware-ui/crud/src/table-view-control/table-view-control.component.ts","../../../projects/honuware-ui/crud/src/table-view-control/table-view-control.component.html","../../../projects/honuware-ui/crud/src/composite-row-control/composite-row-control.component.ts","../../../projects/honuware-ui/crud/src/composite-row-control/composite-row-control.component.html","../../../projects/honuware-ui/crud/src/table-view-page/table-view-page.component.ts","../../../projects/honuware-ui/crud/src/table-view-page/table-view-page.component.html","../../../projects/honuware-ui/crud/src/table-edit-page/table-edit-page.component.ts","../../../projects/honuware-ui/crud/src/table-edit-page/table-edit-page.component.html","../../../projects/honuware-ui/crud/src/table-new-page/table-new-page.component.ts","../../../projects/honuware-ui/crud/src/table-new-page/table-new-page.component.html","../../../projects/honuware-ui/crud/src/public-api.ts","../../../projects/honuware-ui/crud/src/honuware-ui-crud.ts"],"sourcesContent":["import { Injectable, Inject, DestroyRef, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject, Observable, Subscription, timer, of } from 'rxjs';\nimport { catchError, distinctUntilChanged, filter, map, take, tap } from 'rxjs/operators';\nimport { CrudAccess, HONUWARE_CRUD_ACCESS, DatabaseSchema } from '@honuware/ui/access';\nimport { AuthService } from '@honuware/ui/auth';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatabaseSchemaService {\n private _schema?: DatabaseSchema;\n private _schemaSubject = new BehaviorSubject<DatabaseSchema | undefined>(undefined);\n private _refreshSub?: Subscription;\n private _fetchInProgress = false;\n private _retryTimeoutMs: number = 6000; // configurable timeout\n private readonly destroyRef = inject(DestroyRef);\n\n public readonly schema$: Observable<DatabaseSchema | undefined> = this._schemaSubject.asObservable();\n\n constructor(\n @Inject(HONUWARE_CRUD_ACCESS) private crudAccess: CrudAccess,\n private authService: AuthService\n ) {\n this.startSchemaPolling();\n\n this.authService.authData$.pipe(\n map(authData => authData.isAuth),\n distinctUntilChanged(),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => {\n this.refreshSchema();\n });\n }\n\n private startSchemaPolling(): void {\n this.tryFetchSchema();\n }\n\n public refreshSchema(): void {\n this._schema = undefined;\n this._schemaSubject.next(undefined);\n this.tryFetchSchema();\n }\n\n private tryFetchSchema(): void {\n if (this._fetchInProgress) return;\n\n this._refreshSub?.unsubscribe();\n this._fetchInProgress = true;\n\n this._refreshSub = this.crudAccess.getDbSchema().pipe(\n tap(schema => {\n this._schema = schema;\n this._schemaSubject.next(schema);\n this._fetchInProgress = false;\n this._refreshSub?.unsubscribe(); // Stop further polling\n this._refreshSub = undefined;\n }),\n catchError(() => {\n this._fetchInProgress = false;\n // Schedule retry after timeout\n this._refreshSub = timer(this._retryTimeoutMs).subscribe(() => this.tryFetchSchema());\n return of(undefined);\n })\n ).subscribe();\n }\n\n /**\n * Returns the cached DatabaseSchema if present, otherwise waits for a successful fetch.\n */\n public GetDBSchema(): Observable<DatabaseSchema> {\n if (this._schema) {\n return of(this._schema);\n }\n // Wait for the schema to be available\n return this.schema$.pipe(\n filter((schema): schema is DatabaseSchema => !!schema),\n take(1)\n );\n }\n}\n","import { TableBinding, FilterPair, TableSchema } from '@honuware/ui/access';\n\n/**\n * Serialize a binding stack to a ctx query param string.\n * Format: \"table:pkColumn:pkValue,table:pkColumn:pkValue\"\n */\nexport function serializeBindingStack(stack: TableBinding[]): string {\n return stack.map(b => `${b.tableName}:${b.primaryKeyName}:${b.primaryKeyValue}`).join(',');\n}\n\n/**\n * Deserialize a ctx query param string into a TableBinding array.\n * Returns empty array for null/empty input.\n */\nexport function parseBindingStack(ctx: string | null | undefined): TableBinding[] {\n if (!ctx) return [];\n return ctx.split(',').map(triple => {\n const [tableName, primaryKeyName, primaryKeyValue] = triple.split(':');\n return { tableName, primaryKeyName, primaryKeyValue };\n });\n}\n\n/**\n * Derive filter pairs from the binding stack for the current table.\n * Looks at the current table's foreign keys and matches them against\n * the binding stack to build WHERE clause filters.\n *\n * For example, if viewing purchases with ctx=people:person_id:42,\n * and purchases has FK column payer_person_id -> people.person_id,\n * this returns [{ column_name: 'payer_person_id', column_value: '42' }].\n */\nexport function deriveFilterPairs(\n currentTableSchema: TableSchema,\n bindingStack: TableBinding[]\n): FilterPair[] {\n if (bindingStack.length === 0) return [];\n\n const filterPairs: FilterPair[] = [];\n for (const fk of currentTableSchema.foreign_keys) {\n const binding = bindingStack.find(\n b => b.tableName === fk.parent_table_name && b.primaryKeyName === fk.parent_column_name\n );\n if (binding) {\n filterPairs.push({\n column_name: fk.column_name,\n column_value: binding.primaryKeyValue,\n });\n }\n }\n return filterPairs;\n}\n","import { InjectionToken } from '@angular/core';\n\n// Route literals the generic CRUD editor (the table-view / composite-row\n// containers and the table pages) would otherwise hardcode. Injected so a\n// honuware consumer can mount the editor under a different path without\n// forking the components.\nexport interface CrudEditorRoutes {\n /**\n * Base path for the generic table editor routes. Navigation is built as\n * `[basePath, tableName, 'view'|'edit'|'new', ...]`, so this must be the\n * absolute prefix the editor routes are mounted at.\n */\n basePath: string;\n /** The admin portal home the \"back\" links point at. */\n adminHome: string;\n}\n\nexport const DEFAULT_CRUD_EDITOR_ROUTES: CrudEditorRoutes = {\n basePath: '/admin/tables',\n adminHome: '/admin',\n};\n\n// Root-provided with the knottyyoga defaults, so nothing needs wiring today.\nexport const CRUD_EDITOR_ROUTES = new InjectionToken<CrudEditorRoutes>(\n 'CRUD_EDITOR_ROUTES',\n {\n providedIn: 'root',\n factory: () => DEFAULT_CRUD_EDITOR_ROUTES,\n }\n);\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, Inject } from '@angular/core';\n\nimport { Router } from '@angular/router';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport {\n CrudAccess, HONUWARE_CRUD_ACCESS, PhotoUrlBuilder,\n DatabaseSchema, TableSchema, ColumnDataInfo, ForeignKeyInfo, TableBinding,\n} from '@honuware/ui/access';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\nimport { from } from 'rxjs';\nimport { concatMap, tap } from 'rxjs/operators';\nimport { serializeBindingStack, deriveFilterPairs } from '../table-binding.utils';\nimport { ConfirmDialogComponent } from '@honuware/ui/foundation';\nimport { formatMicroseconds, isMicrosecondTimestamp } from '@honuware/ui/foundation';\n\nexport interface ChildTableReference {\n childTableName: string;\n childTableFriendlyName: string;\n foreignKey: ForeignKeyInfo;\n}\n\n@Component({\n selector: 'hw-table-view-control',\n standalone: true,\n imports: [\n MatTableModule,\n MatButtonModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatDialogModule,\n MatSelectModule,\n MatFormFieldModule\n],\n templateUrl: './table-view-control.component.html',\n styleUrls: ['./table-view-control.component.scss']\n})\nexport class TableViewControlComponent implements OnInit, OnChanges {\n @Input() tableName!: string;\n @Input() pageSize: number = 10;\n @Input() pageOffset: number = 0;\n @Input() sortColumn?: string;\n @Input() sortAscending: boolean = true;\n @Input() bindingStack: TableBinding[] = [];\n\n databaseSchema?: DatabaseSchema;\n tableSchema?: TableSchema;\n columns: ColumnDataInfo[] = [];\n displayedColumns: string[] = [];\n dataSource: Record<string, string>[] = [];\n totalCount: number = 0;\n loading: boolean = true;\n error?: string;\n childTableReferences: ChildTableReference[] = [];\n /** Maps column_name → pk_value → display_text for FK columns. */\n fkDisplayMap: Record<string, Record<string, string>> = {};\n\n pageSizeOptions: number[] = [5, 10, 20, 30, 50, 100];\n\n constructor(\n private dbSchemaService: DatabaseSchemaService,\n @Inject(HONUWARE_CRUD_ACCESS) private crudAccess: CrudAccess,\n private photoUrlBuilder: PhotoUrlBuilder,\n @Inject(CRUD_EDITOR_ROUTES) private editorRoutes: CrudEditorRoutes,\n private router: Router,\n private dialog: MatDialog\n ) {}\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['tableName'] || changes['pageSize'] || changes['pageOffset'] ||\n changes['sortColumn'] || changes['sortAscending'] || changes['bindingStack']) {\n if (!changes['tableName']?.firstChange) {\n this.loadData();\n }\n }\n }\n\n private loadData(): void {\n this.loading = true;\n this.error = undefined;\n\n this.dbSchemaService.GetDBSchema().subscribe({\n next: (schema) => {\n this.databaseSchema = schema;\n this.tableSchema = schema.tables.find(t => t.table_name === this.tableName);\n if (!this.tableSchema) {\n this.error = `Table \"${this.tableName}\" not found in schema`;\n this.loading = false;\n return;\n }\n\n this.columns = this.tableSchema.columns.filter(c => !this.isTrueValue(c.hidden));\n // Display actions column first, then photo column if supported, then data columns\n const photoColumn = this.hasPhotoSupport ? ['photo'] : [];\n this.displayedColumns = ['actions'].concat(photoColumn, this.columns.map(c => c.column_name));\n\n // Compute child table references\n this.childTableReferences = this.getChildTableReferences(schema);\n\n // Derive filter pairs from binding stack + FK info\n const filterPairs = deriveFilterPairs(this.tableSchema, this.bindingStack);\n\n // Use primary key as default sort column if not specified\n const sortCol = this.sortColumn || this.tableSchema.primary_key;\n\n this.crudAccess.getFilteredTableRows(\n this.tableName,\n sortCol,\n this.sortAscending,\n this.pageSize,\n this.pageOffset,\n filterPairs\n ).subscribe({\n next: (result) => {\n this.totalCount = result.totalCount;\n // Convert dataTable array to array of objects\n this.dataSource = result.dataTable.map(row => {\n const obj: Record<string, string> = {};\n result.sortedColumnNames.forEach((colName, idx) => {\n obj[colName] = row[idx];\n });\n return obj;\n });\n this.resolveFkDisplayValues();\n },\n error: (err) => {\n this.error = 'Failed to load data';\n this.loading = false;\n console.error('Error loading table data:', err);\n }\n });\n },\n error: (err) => {\n this.error = 'Failed to load schema';\n this.loading = false;\n console.error('Error loading schema:', err);\n }\n });\n }\n\n private getChildTableReferences(schema: DatabaseSchema): ChildTableReference[] {\n const refs: ChildTableReference[] = [];\n for (const nestedTableName of schema.nested_tables) {\n const childSchema = schema.tables.find(t => t.table_name === nestedTableName);\n if (!childSchema) continue;\n for (const fk of childSchema.foreign_keys) {\n if (fk.parent_table_name === this.tableName) {\n refs.push({\n childTableName: nestedTableName,\n childTableFriendlyName: childSchema.table_friendly_name || nestedTableName,\n foreignKey: fk,\n });\n }\n }\n }\n return refs;\n }\n\n private resolveFkDisplayValues(): void {\n if (!this.tableSchema || this.tableSchema.foreign_keys.length === 0) {\n this.loading = false;\n return;\n }\n\n const fkEntries: { colName: string; parentTable: string; values: string[] }[] = [];\n\n for (const fk of this.tableSchema.foreign_keys) {\n const uniqueValues = [...new Set(\n this.dataSource\n .map(row => row[fk.column_name])\n .filter(v => !!v)\n )];\n if (uniqueValues.length === 0) continue;\n fkEntries.push({\n colName: fk.column_name,\n parentTable: fk.parent_table_name,\n values: uniqueValues,\n });\n }\n\n if (fkEntries.length === 0) {\n this.loading = false;\n return;\n }\n\n // Process sequentially to avoid concurrent transaction errors on the server\n from(fkEntries).pipe(\n concatMap(entry =>\n this.crudAccess.resolveFkDisplay(entry.parentTable, entry.values).pipe(\n tap(response => {\n this.fkDisplayMap[entry.colName] = response.resolved;\n })\n )\n )\n ).subscribe({\n complete: () => {\n this.loading = false;\n },\n error: (err) => {\n console.error('FK display resolution failed:', err);\n this.loading = false;\n }\n });\n }\n\n onNavigateToChild(ref: ChildTableReference, row: Record<string, string>): void {\n const primaryKeyValue = this.getPrimaryKeyValue(row);\n if (!primaryKeyValue || !this.tableSchema) return;\n\n const newStack: TableBinding[] = [\n ...this.bindingStack,\n {\n tableName: this.tableName,\n primaryKeyName: this.tableSchema.primary_key,\n primaryKeyValue,\n }\n ];\n\n this.router.navigate(\n [this.editorRoutes.basePath, ref.childTableName, 'view', this.pageSize, 0],\n { queryParams: { ctx: serializeBindingStack(newStack) } }\n );\n }\n\n private isTrueValue(value: boolean | undefined): boolean {\n return value === true || (value as unknown) === 't';\n }\n\n formatCellValue(column: ColumnDataInfo, value: string): string {\n if (!value) return value;\n // Check FK display map first\n const fkResolved = this.fkDisplayMap[column.column_name];\n if (fkResolved && fkResolved[value]) {\n return fkResolved[value];\n }\n if (column.html_input_type === 'date' && isMicrosecondTimestamp(value)) {\n return formatMicroseconds(value);\n }\n return value;\n }\n\n isBoolColumn(column: ColumnDataInfo): boolean {\n return column.type === 'bool' ||\n column.html_input_type === 'bool' ||\n column.html_input_type === 'checkbox';\n }\n\n getBoolValue(value: string): boolean {\n return value === 't' || value === 'true' || value === '1';\n }\n\n getColumnHeader(column: ColumnDataInfo): string {\n return column.column_friendly_name || column.column_name;\n }\n\n get hasPhotoSupport(): boolean {\n return this.isTrueValue(this.tableSchema?.has_photo_support);\n }\n\n getPhotoUrl(row: Record<string, string>): string {\n const id = this.getPrimaryKeyValue(row);\n return this.photoUrlBuilder.scaledPhotoUrl(this.tableName, id, 50, 50);\n }\n\n getPrimaryKeyValue(row: Record<string, string>): string {\n return this.tableSchema ? row[this.tableSchema.primary_key] : '';\n }\n\n // Pagination helpers\n get currentPage(): number {\n return this.pageOffset;\n }\n\n get totalPages(): number {\n return Math.ceil(this.totalCount / this.pageSize);\n }\n\n get startRow(): number {\n return this.pageOffset * this.pageSize + 1;\n }\n\n get endRow(): number {\n return Math.min((this.pageOffset + 1) * this.pageSize, this.totalCount);\n }\n\n get canGoPrevious(): boolean {\n return this.pageOffset > 0;\n }\n\n get canGoNext(): boolean {\n return this.pageOffset < this.totalPages - 1;\n }\n\n // Navigation methods\n goToFirstPage(): void {\n this.navigateToPage(0);\n }\n\n goToPreviousPage(): void {\n if (this.canGoPrevious) {\n this.navigateToPage(this.pageOffset - 1);\n }\n }\n\n goToNextPage(): void {\n if (this.canGoNext) {\n this.navigateToPage(this.pageOffset + 1);\n }\n }\n\n goToLastPage(): void {\n this.navigateToPage(this.totalPages - 1);\n }\n\n /** Build query params preserving ctx for nested navigation. */\n private buildCtxQueryParams(extra?: Record<string, string>): Record<string, string> {\n const params: Record<string, string> = { ...extra };\n if (this.bindingStack.length > 0) {\n params['ctx'] = serializeBindingStack(this.bindingStack);\n }\n return params;\n }\n\n private navigateToPage(page: number): void {\n this.router.navigate(\n [this.editorRoutes.basePath, this.tableName, 'view', this.pageSize, page],\n { queryParams: this.buildCtxQueryParams() }\n );\n }\n\n onPageSizeChange(newPageSize: number): void {\n // Reset to first page when changing page size\n this.router.navigate(\n [this.editorRoutes.basePath, this.tableName, 'view', newPageSize, 0],\n { queryParams: this.buildCtxQueryParams() }\n );\n }\n\n // Action methods\n onNewItem(): void {\n const returnUrl = this.router.url;\n this.router.navigate([this.editorRoutes.basePath, this.tableName, 'new'], {\n queryParams: this.buildCtxQueryParams({ returnUrl })\n });\n }\n\n onEditRow(row: Record<string, string>): void {\n const primaryKeyValue = this.getPrimaryKeyValue(row);\n if (!primaryKeyValue) {\n console.error('Cannot edit row: no primary key value found', { row, tableSchema: this.tableSchema });\n return;\n }\n const returnUrl = this.router.url;\n this.router.navigate([this.editorRoutes.basePath, this.tableName, 'edit', primaryKeyValue], {\n queryParams: this.buildCtxQueryParams({ returnUrl })\n });\n }\n\n /** Navigate back to the parent table's edit page by popping the binding stack. */\n onNavigateToParent(): void {\n if (this.bindingStack.length === 0) return;\n\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentStack = this.bindingStack.slice(0, -1);\n\n const queryParams: Record<string, string> = {};\n if (parentStack.length > 0) {\n queryParams['ctx'] = serializeBindingStack(parentStack);\n }\n\n this.router.navigate(\n [this.editorRoutes.basePath, parentBinding.tableName, 'edit', parentBinding.primaryKeyValue],\n { queryParams }\n );\n }\n\n get hasParent(): boolean {\n return this.bindingStack.length > 0;\n }\n\n get parentFriendlyName(): string {\n if (this.bindingStack.length === 0) return '';\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentSchema = this.databaseSchema?.tables.find(t => t.table_name === parentBinding.tableName);\n return parentSchema?.table_friendly_name || parentBinding.tableName;\n }\n\n onDeleteRow(row: Record<string, string>): void {\n const primaryKeyValue = this.getPrimaryKeyValue(row);\n const primaryKeyName = this.tableSchema?.primary_key || 'id';\n\n const friendlyName = this.tableSchema?.table_friendly_name || this.tableName;\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\n width: '400px',\n data: {\n title: 'Confirm Delete',\n description: `Are you sure you want to delete this ${friendlyName} record (ID: ${primaryKeyValue})?`,\n buttonText: 'Delete',\n }\n });\n\n dialogRef.afterClosed().subscribe(confirmed => {\n if (confirmed) {\n this.crudAccess.deleteItem(this.tableName, primaryKeyName, primaryKeyValue).subscribe({\n next: () => {\n // Refresh the data after deletion\n this.loadData();\n },\n error: (err) => {\n console.error('Error deleting row:', err);\n this.error = 'Failed to delete row';\n }\n });\n }\n });\n }\n}\n","<div class=\"table-view-container\">\n <!-- Back to Parent button -->\n @if (hasParent) {\n <button mat-stroked-button class=\"parent-button\" (click)=\"onNavigateToParent()\">\n <mat-icon>arrow_back</mat-icon>\n Back to {{ parentFriendlyName }}\n </button>\n }\n\n <!-- Header with New Item button -->\n <div class=\"table-header\">\n <h2>{{ tableSchema?.table_friendly_name || tableName }}</h2>\n <button mat-raised-button color=\"primary\" (click)=\"onNewItem()\">\n <mat-icon>add</mat-icon>\n New Item\n </button>\n </div>\n\n <!-- Loading state -->\n @if (loading) {\n <div class=\"loading-container\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <p>Loading...</p>\n </div>\n }\n\n <!-- Error state -->\n @if (error && !loading) {\n <div class=\"error-container\">\n <mat-icon>error</mat-icon>\n <p>{{ error }}</p>\n </div>\n }\n\n <!-- Empty state -->\n @if (!loading && !error && dataSource.length === 0) {\n <div class=\"empty-container\">\n <mat-icon>inbox</mat-icon>\n <p>No records found</p>\n <button mat-stroked-button color=\"primary\" (click)=\"onNewItem()\">\n Create First Record\n </button>\n </div>\n }\n\n <!-- Data table -->\n @if (!loading && !error && dataSource.length > 0) {\n <div class=\"table-wrapper\">\n <table mat-table [dataSource]=\"dataSource\" multiTemplateDataRows>\n <!-- Dynamic columns -->\n @for (column of columns; track column.column_name) {\n <ng-container [matColumnDef]=\"column.column_name\">\n <th mat-header-cell *matHeaderCellDef>{{ getColumnHeader(column) }}</th>\n <td mat-cell *matCellDef=\"let row\">\n @if (isBoolColumn(column)) {\n <mat-icon [class]=\"getBoolValue(row[column.column_name]) ? 'bool-true' : 'bool-false'\">\n {{ getBoolValue(row[column.column_name]) ? 'check_circle' : 'cancel' }}\n </mat-icon>\n } @else {\n {{ formatCellValue(column, row[column.column_name]) }}\n }\n </td>\n </ng-container>\n }\n\n <!-- Photo column (always defined, only included in displayedColumns when supported) -->\n <ng-container matColumnDef=\"photo\">\n <th mat-header-cell *matHeaderCellDef>Photo</th>\n <td mat-cell *matCellDef=\"let row\">\n <img [src]=\"getPhotoUrl(row)\"\n class=\"photo-thumbnail\"\n (error)=\"$any($event.target).style.display='none'; $any($event.target).nextElementSibling.style.display='inline-flex'\"\n alt=\"Photo\">\n <mat-icon class=\"photo-placeholder\" style=\"display: none\">image</mat-icon>\n </td>\n </ng-container>\n\n <!-- Actions column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"actions-row\">\n <button mat-icon-button color=\"primary\" (click)=\"onEditRow(row); $event.stopPropagation()\" title=\"Edit\">\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-icon-button color=\"warn\" (click)=\"onDeleteRow(row); $event.stopPropagation()\" title=\"Delete\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </td>\n </ng-container>\n\n <!-- Child tables detail row (spans all columns) -->\n <ng-container matColumnDef=\"childTables\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"displayedColumns.length\">\n <div class=\"child-table-pills\">\n @for (ref of childTableReferences; track ref.childTableName + ref.foreignKey.column_name) {\n <button class=\"child-pill\" (click)=\"onNavigateToChild(ref, row); $event.stopPropagation()\">\n <mat-icon>subdirectory_arrow_right</mat-icon>\n {{ ref.childTableFriendlyName }}\n </button>\n }\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['childTables'];\"\n class=\"child-tables-row\"\n [class.hidden-row]=\"childTableReferences.length === 0\"></tr>\n </table>\n </div>\n\n <!-- Pagination controls -->\n <div class=\"pagination-container\">\n <div class=\"pagination-left\">\n <mat-form-field appearance=\"outline\" class=\"page-size-select\">\n <mat-label>Page size</mat-label>\n <mat-select [value]=\"pageSize\" (selectionChange)=\"onPageSizeChange($event.value)\">\n @for (size of pageSizeOptions; track size) {\n <mat-option [value]=\"size\">{{ size }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <span class=\"pagination-info\">\n Showing {{ startRow }} - {{ endRow }} of {{ totalCount }}\n </span>\n </div>\n <div class=\"pagination-buttons\">\n <button mat-icon-button\n [disabled]=\"!canGoPrevious\"\n (click)=\"goToFirstPage()\"\n title=\"First page\">\n <mat-icon>first_page</mat-icon>\n </button>\n <button mat-icon-button\n [disabled]=\"!canGoPrevious\"\n (click)=\"goToPreviousPage()\"\n title=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <span class=\"page-info\">Page {{ currentPage + 1 }} of {{ totalPages }}</span>\n <button mat-icon-button\n [disabled]=\"!canGoNext\"\n (click)=\"goToNextPage()\"\n title=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button mat-icon-button\n [disabled]=\"!canGoNext\"\n (click)=\"goToLastPage()\"\n title=\"Last page\">\n <mat-icon>last_page</mat-icon>\n </button>\n </div>\n </div>\n }\n</div>\n","import { Component, Input, ViewChild, ViewChildren, QueryList, OnInit, Inject } from '@angular/core';\n\nimport { Router } from '@angular/router';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CompositeControlComponent } from '@honuware/ui/controls';\nimport { PhotoUploadComponent } from '@honuware/ui/photos';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport {\n CrudAccess, UpdateItemBody, AddItemBody, HONUWARE_CRUD_ACCESS,\n DatabaseSchema, TableSchema, ColumnDataInfo, ForeignKeyInfo,\n TableBinding, FilterPair, CrudFormAssist, ComputedDateRule,\n} from '@honuware/ui/access';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\nimport { serializeBindingStack } from '../table-binding.utils';\n\n/**\n * A child table reference discovered from the schema.\n * Represents a nested table that has an FK pointing back to the current table.\n */\nexport interface ChildTableReference {\n childTableName: string;\n childTableFriendlyName: string;\n foreignKey: ForeignKeyInfo;\n}\n\n@Component({\n selector: 'hw-composite-row-control',\n standalone: true,\n imports: [MatButtonModule, MatCheckboxModule, MatIconModule, CompositeControlComponent, PhotoUploadComponent],\n templateUrl: './composite-row-control.component.html',\n styleUrls: ['./composite-row-control.component.scss']\n})\nexport class CompositeRowControlComponent implements OnInit {\n @Input() tableName!: string;\n @Input() columnNames!: string[];\n @Input() primaryKeyName?: string;\n @Input() primaryKeyValue?: string;\n @Input() isCreateMode!: boolean;\n @Input() returnUrl?: string;\n @Input() bindingStack: TableBinding[] = [];\n @Input() formAssist?: CrudFormAssist;\n\n @ViewChildren(CompositeControlComponent) controls!: QueryList<CompositeControlComponent>;\n @ViewChild(PhotoUploadComponent) photoUpload?: PhotoUploadComponent;\n\n columnInfos: ColumnDataInfo[] = [];\n loading: boolean = true;\n columnValues: (string | undefined)[] = []; // values for each column\n hasPhotoSupport: boolean = false;\n childTableReferences: ChildTableReference[] = [];\n /** Set of FK column names from navigation context (readonly + pre-filled in create mode). */\n private contextFkColumnNames: Set<string> = new Set();\n private databaseSchema?: DatabaseSchema;\n private tableSchema?: TableSchema;\n /** Tracks whether each computed date dest column is in auto-compute mode. */\n computedDateAutoState: Record<string, boolean> = {};\n\n constructor(\n private dbSchemaService: DatabaseSchemaService,\n @Inject(HONUWARE_CRUD_ACCESS) private crudAccess: CrudAccess,\n @Inject(CRUD_EDITOR_ROUTES) private editorRoutes: CrudEditorRoutes,\n private router: Router\n ) {}\n\n ngOnInit() {\n this.loadColumnInfos();\n }\n\n private loadColumnInfos() {\n this.dbSchemaService.GetDBSchema().subscribe(schema => {\n this.databaseSchema = schema;\n const table = schema.tables.find(t => t.table_name === this.tableName);\n if (!table) {\n this.columnInfos = [];\n this.loading = false;\n return;\n }\n this.tableSchema = table;\n this.hasPhotoSupport = this.isTrueValue(table.has_photo_support);\n this.columnInfos = this.columnNames.map(colName =>\n table.columns.find(col => col.column_name === colName)!\n );\n\n // Compute context FK columns from binding stack\n this.contextFkColumnNames = this.computeContextFkColumns(table);\n\n // Compute child table references (for nested table navigation buttons)\n this.childTableReferences = this.isCreateMode ? [] : this.getChildTableReferences(schema);\n\n if (!this.isCreateMode && this.primaryKeyName && this.primaryKeyValue) {\n // Fetch row data using getRowByValues (unified for root and nested)\n const filterPairs: FilterPair[] = [\n { column_name: this.primaryKeyName, column_value: this.primaryKeyValue }\n ];\n this.crudAccess.getRowByValues(this.tableName, filterPairs).subscribe(result => {\n // Map each columnName to its value in the returned row\n this.columnValues = this.columnNames.map(colName => {\n const sortedIdx = result.sortedColumnNames.indexOf(colName);\n return result.dataTable.length > 0 && sortedIdx !== -1 ? result.dataTable[0][sortedIdx] : undefined;\n });\n this.loading = false;\n });\n } else {\n // Create mode: pre-fill FK columns from binding stack context, then apply formAssist defaults\n this.columnValues = this.columnNames.map(colName => {\n const fkPrefill = this.getContextFkValue(table, colName);\n if (fkPrefill) return fkPrefill;\n // Apply formAssist defaults\n if (this.formAssist?.defaults && colName in this.formAssist.defaults) {\n return this.formAssist.defaults[colName];\n }\n return undefined;\n });\n // Initialize computed date auto state\n this.initComputedDateState();\n this.loading = false;\n }\n });\n }\n\n /**\n * Compute the set of FK column names that come from navigation context.\n * These should be readonly in both edit and create mode.\n */\n private computeContextFkColumns(table: TableSchema): Set<string> {\n const fkColumns = new Set<string>();\n for (const fk of table.foreign_keys) {\n const binding = this.bindingStack.find(\n b => b.tableName === fk.parent_table_name && b.primaryKeyName === fk.parent_column_name\n );\n if (binding) {\n fkColumns.add(fk.column_name);\n }\n }\n return fkColumns;\n }\n\n /**\n * Get the pre-fill value for an FK column from the binding stack.\n * Returns null if the column is not an FK from context.\n */\n private getContextFkValue(table: TableSchema, columnName: string): string | null {\n for (const fk of table.foreign_keys) {\n if (fk.column_name !== columnName) continue;\n const binding = this.bindingStack.find(\n b => b.tableName === fk.parent_table_name && b.primaryKeyName === fk.parent_column_name\n );\n if (binding) {\n return binding.primaryKeyValue;\n }\n }\n return null;\n }\n\n /**\n * Find nested tables that have FK references to the current table.\n * Only includes tables listed in schema.nested_tables.\n */\n private getChildTableReferences(schema: DatabaseSchema): ChildTableReference[] {\n const refs: ChildTableReference[] = [];\n for (const nestedTableName of schema.nested_tables) {\n const childSchema = schema.tables.find(t => t.table_name === nestedTableName);\n if (!childSchema) continue;\n for (const fk of childSchema.foreign_keys) {\n if (fk.parent_table_name === this.tableName) {\n refs.push({\n childTableName: nestedTableName,\n childTableFriendlyName: childSchema.table_friendly_name || nestedTableName,\n foreignKey: fk,\n });\n }\n }\n }\n return refs;\n }\n\n get visibleColumns(): { col: ColumnDataInfo; index: number }[] {\n return this.columnInfos\n .map((col, index) => ({ col, index }))\n .filter(({ col }) => {\n if (this.isTrueValue(col.hidden)) return false;\n if (this.isTrueValue(col.readonly) && this.isCreateMode) return false;\n return true;\n });\n }\n\n /** Check if a column should be readonly. Includes context FK columns. */\n isReadonlyColumn(col: ColumnDataInfo): boolean {\n return this.isPrimaryKeyColumn(col) || this.isTrueValue(col.readonly)\n || this.contextFkColumnNames.has(col.column_name);\n }\n\n /** Whether the column is an FK from navigation context. */\n isContextFkColumn(col: ColumnDataInfo): boolean {\n return this.contextFkColumnNames.has(col.column_name);\n }\n\n onValueChanged(index: number, value: string): void {\n const visible = this.visibleColumns;\n const entry = visible[index];\n if (!entry) return;\n const control = this.controls.get(index);\n if (control) {\n control.value = value;\n }\n // Update the backing columnValues so computed dates can read it\n this.columnValues[entry.index] = value;\n // Propagate to computed date destinations\n this.applyComputedDates(entry.col.column_name);\n }\n\n getControlValues(): Record<string, string | undefined> {\n const values: Record<string, string | undefined> = {};\n const visible = this.visibleColumns;\n this.controls.forEach((control, idx) => {\n const entry = visible[idx];\n if (!entry) return;\n const col = entry.col;\n if (this.isTrueValue(col.readonly)) return;\n // Skip empty strings for non-text columns — PostgreSQL can't cast \"\"\n // to numeric/date/bool types, and empty means \"no change\" for those.\n if (control.value === '' && !this.isTextColumnType(col.type)) return;\n values[this.columnNames[entry.index]] = control.value;\n });\n return values;\n }\n\n private isTextColumnType(type: string): boolean {\n const upper = type.toUpperCase();\n return upper === 'VARCHAR' || upper === 'TEXT' || upper === 'CHAR';\n }\n\n onSubmit() {\n const values = this.getControlValues();\n if (this.isCreateMode) {\n const body: AddItemBody = {\n table_name: this.tableName,\n value: values\n };\n if (this.hasPhotoSupport) {\n this.crudAccess.addItemFetchPrimaryKey(body).subscribe({\n next: (primaryKey) => {\n if (this.photoUpload?.hasPendingFile) {\n this.photoUpload.uploadPendingPhoto(this.tableName, Number(primaryKey)).subscribe({\n next: () => this.navigateBack(),\n error: (err) => {\n console.error('Error uploading photo:', err);\n this.navigateBack();\n }\n });\n } else {\n this.navigateBack();\n }\n },\n error: (err) => console.error('Error creating item:', err)\n });\n } else {\n this.crudAccess.addItem(body).subscribe({\n next: () => this.navigateBack(),\n error: (err) => console.error('Error creating item:', err)\n });\n }\n } else {\n if (!this.primaryKeyName || !this.primaryKeyValue) return;\n const body: UpdateItemBody = {\n table_name: this.tableName,\n value: values,\n column_name: this.primaryKeyName,\n column_value: this.primaryKeyValue\n };\n this.crudAccess.updateItem(body).subscribe({\n next: () => this.navigateBack(),\n error: (err) => console.error('Error updating item:', err)\n });\n }\n }\n\n onCancel() {\n this.navigateBack();\n }\n\n private isTrueValue(value: boolean | undefined): boolean {\n return value === true || (value as unknown) === 't';\n }\n\n get showPhotoUpload(): boolean {\n if (!this.hasPhotoSupport) return false;\n if (this.isCreateMode) return true;\n return !!this.primaryKeyValue;\n }\n\n get photoItemId(): number {\n if (this.isCreateMode) return 0;\n return Number(this.primaryKeyValue);\n }\n\n getForeignKeyInfo(col: ColumnDataInfo): ForeignKeyInfo | undefined {\n return this.tableSchema?.foreign_keys.find(fk => fk.column_name === col.column_name);\n }\n\n isPrimaryKeyColumn(col: ColumnDataInfo): boolean {\n if (this.isCreateMode) return false;\n // Handle both boolean true and string \"t\" from server\n return col.primary_key === true || (col.primary_key as unknown) === 't';\n }\n\n // --- Nested navigation ---\n\n get hasParent(): boolean {\n return this.bindingStack.length > 0;\n }\n\n get parentFriendlyName(): string {\n if (this.bindingStack.length === 0) return '';\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentSchema = this.databaseSchema?.tables.find(t => t.table_name === parentBinding.tableName);\n return parentSchema?.table_friendly_name || parentBinding.tableName;\n }\n\n /** Navigate back to the parent table's edit page by popping the binding stack. */\n onNavigateToParent(): void {\n if (this.bindingStack.length === 0) return;\n\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentStack = this.bindingStack.slice(0, -1);\n\n const queryParams: Record<string, string> = {};\n if (parentStack.length > 0) {\n queryParams['ctx'] = serializeBindingStack(parentStack);\n }\n\n this.router.navigate(\n [this.editorRoutes.basePath, parentBinding.tableName, 'edit', parentBinding.primaryKeyValue],\n { queryParams }\n );\n }\n\n /** Navigate to a child (nested) table filtered by the current row. */\n onNavigateToChild(ref: ChildTableReference): void {\n if (!this.primaryKeyValue || !this.tableSchema) return;\n\n // Push current table onto the binding stack\n const newStack: TableBinding[] = [\n ...this.bindingStack,\n {\n tableName: this.tableName,\n primaryKeyName: this.tableSchema.primary_key,\n primaryKeyValue: this.primaryKeyValue,\n }\n ];\n\n const queryParams: Record<string, string> = {\n ctx: serializeBindingStack(newStack),\n };\n\n this.router.navigate(\n [this.editorRoutes.basePath, ref.childTableName, 'view', 10, 0],\n { queryParams }\n );\n }\n\n // --- Computed date support ---\n\n private initComputedDateState(): void {\n if (!this.formAssist?.computedDates) return;\n for (const rule of this.formAssist.computedDates) {\n this.computedDateAutoState[rule.dest] = rule.autoByDefault;\n }\n }\n\n /** When a source field changes, update any auto-computed dest fields. */\n private applyComputedDates(changedColumn: string): void {\n if (!this.formAssist?.computedDates) return;\n for (const rule of this.formAssist.computedDates) {\n if (rule.source !== changedColumn) continue;\n if (!this.computedDateAutoState[rule.dest]) continue;\n this.computeAndSetDate(rule);\n }\n }\n\n private computeAndSetDate(rule: ComputedDateRule): void {\n const sourceIndex = this.columnNames.indexOf(rule.source);\n const destIndex = this.columnNames.indexOf(rule.dest);\n if (sourceIndex === -1 || destIndex === -1) return;\n\n const sourceValue = this.columnValues[sourceIndex];\n if (!sourceValue) return;\n\n const sourceUs = parseInt(sourceValue, 10);\n if (isNaN(sourceUs)) return;\n\n const destUs = sourceUs + (rule.offsetMinutes * 60 * 1_000_000);\n const destValue = String(destUs);\n this.columnValues[destIndex] = destValue;\n\n // Update the visible control if it exists\n const visible = this.visibleColumns;\n const visibleIdx = visible.findIndex(v => v.index === destIndex);\n if (visibleIdx !== -1) {\n const control = this.controls?.get(visibleIdx);\n if (control) {\n control.value = destValue;\n }\n }\n }\n\n /** Toggle auto-compute for a computed date dest column. */\n onToggleComputedDate(destColumn: string): void {\n this.computedDateAutoState[destColumn] = !this.computedDateAutoState[destColumn];\n if (this.computedDateAutoState[destColumn]) {\n // Re-compute from source\n const rule = this.formAssist?.computedDates?.find(r => r.dest === destColumn);\n if (rule) {\n this.computeAndSetDate(rule);\n }\n }\n }\n\n /** Check if a column is a computed date dest in auto mode. */\n isComputedDateAuto(columnName: string): boolean {\n return this.computedDateAutoState[columnName] === true;\n }\n\n /** Get the computed date rule for a column, if any. */\n getComputedDateRule(columnName: string): ComputedDateRule | undefined {\n return this.formAssist?.computedDates?.find(r => r.dest === columnName);\n }\n\n private navigateBack() {\n if (this.returnUrl) {\n this.router.navigateByUrl(this.returnUrl);\n }\n }\n}\n","@if (loading) {\n<div>Loading...</div>\n}\n@if (!loading) {\n<!-- Back to Parent button -->\n@if (hasParent) {\n <button mat-stroked-button class=\"parent-button\" (click)=\"onNavigateToParent()\">\n <mat-icon>arrow_back</mat-icon>\n Back to {{ parentFriendlyName }}\n </button>\n}\n@if (showPhotoUpload) {\n <hw-photo-upload [tableName]=\"tableName\" [tableItemId]=\"photoItemId\" [deferUpload]=\"isCreateMode\"></hw-photo-upload>\n}\n<form>\n @for (entry of visibleColumns; track entry.col.column_name; let i = $index) {\n <hw-composite-control [dataInfo]=\"entry.col\"\n [value]=\"columnValues[entry.index]\"\n [readOnly]=\"isReadonlyColumn(entry.col) || isComputedDateAuto(entry.col.column_name)\"\n [foreignKeyInfo]=\"getForeignKeyInfo(entry.col)\"\n (valueChanged)=\"onValueChanged(i, $event)\">\n </hw-composite-control>\n @if (getComputedDateRule(entry.col.column_name); as rule) {\n <div class=\"computed-date-toggle\">\n <mat-checkbox [checked]=\"isComputedDateAuto(entry.col.column_name)\"\n (change)=\"onToggleComputedDate(entry.col.column_name)\">\n Auto-compute from {{ rule.source }} + {{ rule.offsetMinutes }} min\n </mat-checkbox>\n </div>\n }\n }\n <div class=\"form-actions\">\n <button type=\"button\" mat-raised-button color=\"primary\" class=\"submit-button\" (click)=\"onSubmit()\">\n {{ isCreateMode ? 'Create' : 'Update' }}\n </button>\n @if (returnUrl) {\n <button type=\"button\" mat-stroked-button class=\"cancel-button\" (click)=\"onCancel()\">\n Cancel\n </button>\n }\n </div>\n</form>\n<!-- Nested table cards (only in edit mode) -->\n@if (!isCreateMode && childTableReferences.length > 0) {\n <div class=\"nested-tables-section\">\n <h3>Related Tables</h3>\n <div class=\"nested-table-cards\">\n @for (ref of childTableReferences; track ref.childTableName + ref.foreignKey.column_name) {\n <button mat-stroked-button class=\"nested-table-card\" (click)=\"onNavigateToChild(ref)\">\n <mat-icon>subdirectory_arrow_right</mat-icon>\n {{ ref.childTableFriendlyName }}\n </button>\n }\n </div>\n </div>\n}\n}\n","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\n\nimport { ActivatedRoute, RouterModule } from '@angular/router';\nimport { Subject, combineLatest, takeUntil } from 'rxjs';\nimport { TableViewControlComponent } from '../table-view-control/table-view-control.component';\nimport { TableBinding } from '@honuware/ui/access';\nimport { parseBindingStack } from '../table-binding.utils';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\n\n@Component({\n selector: 'hw-table-view-page',\n standalone: true,\n imports: [RouterModule, TableViewControlComponent],\n templateUrl: './table-view-page.component.html'\n})\nexport class TableViewPageComponent implements OnInit, OnDestroy {\n tableName: string = '';\n pageSize: number = 10;\n pageOffset: number = 0;\n bindingStack: TableBinding[] = [];\n readonly adminHome: string;\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private route: ActivatedRoute,\n @Inject(CRUD_EDITOR_ROUTES) editorRoutes: CrudEditorRoutes,\n ) {\n this.adminHome = editorRoutes.adminHome;\n }\n\n ngOnInit(): void {\n combineLatest([\n this.route.params,\n this.route.queryParams\n ]).pipe(takeUntil(this.destroy$)).subscribe(([params, queryParams]) => {\n this.tableName = params['tableName'] || '';\n this.pageSize = parseInt(params['pageSize'], 10) || 10;\n this.pageOffset = parseInt(params['pageOffset'], 10) || 0;\n this.bindingStack = parseBindingStack(queryParams['ctx']);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","<a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">&larr; Back to admin portal</a>\n<hw-table-view-control\n [tableName]=\"tableName\"\n [pageSize]=\"pageSize\"\n [pageOffset]=\"pageOffset\"\n [bindingStack]=\"bindingStack\">\n</hw-table-view-control>\n","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\n\nimport { ActivatedRoute, RouterModule } from '@angular/router';\nimport { Subject, takeUntil, combineLatest } from 'rxjs';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CompositeRowControlComponent } from '../composite-row-control/composite-row-control.component';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport { TableBinding } from '@honuware/ui/access';\nimport { parseBindingStack } from '../table-binding.utils';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\n\n@Component({\n selector: 'hw-table-edit-page',\n standalone: true,\n imports: [\n RouterModule,\n MatCardModule,\n MatProgressSpinnerModule,\n MatIconModule,\n CompositeRowControlComponent\n],\n templateUrl: './table-edit-page.component.html',\n styleUrls: ['./table-edit-page.component.scss']\n})\nexport class TableEditPageComponent implements OnInit, OnDestroy {\n tableName: string = '';\n primaryKeyName: string = 'id';\n primaryKeyValue: string = '';\n columnNames: string[] = [];\n tableFriendlyName: string = '';\n returnUrl: string = '';\n bindingStack: TableBinding[] = [];\n loading: boolean = true;\n error?: string;\n readonly adminHome: string;\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private route: ActivatedRoute,\n private dbSchemaService: DatabaseSchemaService,\n @Inject(CRUD_EDITOR_ROUTES) editorRoutes: CrudEditorRoutes,\n ) {\n this.adminHome = editorRoutes.adminHome;\n }\n\n ngOnInit(): void {\n combineLatest([\n this.route.params,\n this.route.queryParams,\n this.dbSchemaService.GetDBSchema()\n ]).pipe(takeUntil(this.destroy$)).subscribe({\n next: ([params, queryParams, schema]) => {\n this.tableName = params['tableName'] || '';\n this.primaryKeyValue = params['id'] || '';\n this.returnUrl = queryParams['returnUrl'] || '';\n this.bindingStack = parseBindingStack(queryParams['ctx']);\n\n const tableSchema = schema.tables.find(t => t.table_name === this.tableName);\n if (!tableSchema) {\n this.error = `Table \"${this.tableName}\" not found`;\n this.loading = false;\n return;\n }\n\n this.tableFriendlyName = tableSchema.table_friendly_name || this.tableName;\n this.primaryKeyName = tableSchema.primary_key;\n this.columnNames = tableSchema.columns.map(c => c.column_name);\n this.loading = false;\n },\n error: (err) => {\n this.error = 'Failed to load schema';\n this.loading = false;\n console.error('Error loading schema:', err);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","@if (loading) {\n <div class=\"loading-container\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <p>Loading...</p>\n </div>\n}\n@if (!loading && error) {\n <div class=\"error-container\">\n <mat-icon>error</mat-icon>\n <p>{{ error }}</p>\n </div>\n}\n@if (!loading && !error) {\n <div class=\"edit-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold text-2xl mb-6\">Edit {{ tableFriendlyName }}</h1>\n <mat-card class=\"edit-card\">\n <mat-card-content>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [primaryKeyName]=\"primaryKeyName\"\n [primaryKeyValue]=\"primaryKeyValue\"\n [isCreateMode]=\"false\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\">\n </hw-composite-row-control>\n </mat-card-content>\n </mat-card>\n </div>\n}\n","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\n\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { Subject, takeUntil, combineLatest } from 'rxjs';\nimport { CompositeRowControlComponent } from '../composite-row-control/composite-row-control.component';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport { TableBinding, CrudFormAssist } from '@honuware/ui/access';\nimport { parseBindingStack } from '../table-binding.utils';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\n\n@Component({\n selector: 'hw-table-new-page',\n standalone: true,\n imports: [RouterModule, CompositeRowControlComponent],\n templateUrl: './table-new-page.component.html',\n styleUrls: ['./table-new-page.component.scss']\n})\nexport class TableNewPageComponent implements OnInit, OnDestroy {\n tableName: string = '';\n columnNames: string[] = [];\n tableFriendlyName: string = '';\n returnUrl: string = '';\n bindingStack: TableBinding[] = [];\n formAssist?: CrudFormAssist;\n loading: boolean = true;\n error?: string;\n readonly adminHome: string;\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private dbSchemaService: DatabaseSchemaService,\n @Inject(CRUD_EDITOR_ROUTES) editorRoutes: CrudEditorRoutes,\n ) {\n this.adminHome = editorRoutes.adminHome;\n // Read formAssist from browser history state. Angular's router.navigate({ state })\n // stores data in the History API. getCurrentNavigation() is unreliable (returns null\n // for lazy-loaded routes), so we read directly from history.state instead.\n this.formAssist = history.state?.formAssist as CrudFormAssist | undefined;\n }\n\n ngOnInit(): void {\n combineLatest([\n this.route.params,\n this.route.queryParams,\n this.dbSchemaService.GetDBSchema()\n ]).pipe(takeUntil(this.destroy$)).subscribe({\n next: ([params, queryParams, schema]) => {\n this.tableName = params['tableName'] || '';\n this.returnUrl = queryParams['returnUrl'] || '';\n this.bindingStack = parseBindingStack(queryParams['ctx']);\n\n const tableSchema = schema.tables.find(t => t.table_name === this.tableName);\n if (!tableSchema) {\n this.error = `Table \"${this.tableName}\" not found`;\n this.loading = false;\n return;\n }\n\n this.tableFriendlyName = tableSchema.table_friendly_name || this.tableName;\n // Filter out primary key column for create mode (auto-generated)\n // Handle both boolean true and string \"t\" from server\n this.columnNames = tableSchema.columns\n .filter(c => c.primary_key !== true && (c.primary_key as unknown) !== 't')\n .map(c => c.column_name);\n this.loading = false;\n },\n error: (err) => {\n this.error = 'Failed to load schema';\n this.loading = false;\n console.error('Error loading schema:', err);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","@if (loading) {\n <div class=\"loading\">Loading...</div>\n}\n@if (!loading && error) {\n <div class=\"error\">{{ error }}</div>\n}\n@if (!loading && !error) {\n <div class=\"new-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din text-sm text-blue-600 hover:underline mb-4 inline-block\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold text-2xl mb-6\">New {{ tableFriendlyName }}</h1>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [isCreateMode]=\"true\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\"\n [formAssist]=\"formAssist\">\n </hw-composite-row-control>\n </div>\n}\n","/*\n * @honuware/ui/crud — the generic table editor: DatabaseSchemaService, the\n * table-binding utils, the table-view / composite-row containers, the\n * TableView/Edit/New pages, and the CRUD_EDITOR_ROUTES config token. Sits on\n * top of foundation + access + auth + controls + photos. Selectors use `hw-`.\n */\nexport { DatabaseSchemaService } from './database-schema.service';\n\nexport { serializeBindingStack, parseBindingStack, deriveFilterPairs } from './table-binding.utils';\n\nexport { CRUD_EDITOR_ROUTES, DEFAULT_CRUD_EDITOR_ROUTES } from './crud-editor-routes';\nexport type { CrudEditorRoutes } from './crud-editor-routes';\n\nexport { TableViewControlComponent } from './table-view-control/table-view-control.component';\nexport { CompositeRowControlComponent } from './composite-row-control/composite-row-control.component';\nexport type { ChildTableReference } from './composite-row-control/composite-row-control.component';\n\nexport { TableViewPageComponent } from './table-view-page/table-view-page.component';\nexport { TableEditPageComponent } from './table-edit-page/table-edit-page.component';\nexport { TableNewPageComponent } from './table-new-page/table-new-page.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DatabaseSchemaService","i3","i7","i2","i4","i5","i1"],"mappings":"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"}
1
+ {"version":3,"file":"honuware-ui-crud.mjs","sources":["../../../projects/honuware-ui/crud/src/database-schema.service.ts","../../../projects/honuware-ui/crud/src/table-binding.utils.ts","../../../projects/honuware-ui/crud/src/crud-editor-routes.ts","../../../projects/honuware-ui/crud/src/table-view-control/table-view-control.component.ts","../../../projects/honuware-ui/crud/src/table-view-control/table-view-control.component.html","../../../projects/honuware-ui/crud/src/composite-row-control/composite-row-control.component.ts","../../../projects/honuware-ui/crud/src/composite-row-control/composite-row-control.component.html","../../../projects/honuware-ui/crud/src/table-view-page/table-view-page.component.ts","../../../projects/honuware-ui/crud/src/table-view-page/table-view-page.component.html","../../../projects/honuware-ui/crud/src/table-edit-page/table-edit-page.component.ts","../../../projects/honuware-ui/crud/src/table-edit-page/table-edit-page.component.html","../../../projects/honuware-ui/crud/src/table-new-page/table-new-page.component.ts","../../../projects/honuware-ui/crud/src/table-new-page/table-new-page.component.html","../../../projects/honuware-ui/crud/src/public-api.ts","../../../projects/honuware-ui/crud/src/honuware-ui-crud.ts"],"sourcesContent":["import { Injectable, Inject, DestroyRef, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject, Observable, Subscription, timer, of } from 'rxjs';\nimport { catchError, distinctUntilChanged, filter, map, take, tap } from 'rxjs/operators';\nimport { CrudAccess, HONUWARE_CRUD_ACCESS, DatabaseSchema } from '@honuware/ui/access';\nimport { AuthService } from '@honuware/ui/auth';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatabaseSchemaService {\n private _schema?: DatabaseSchema;\n private _schemaSubject = new BehaviorSubject<DatabaseSchema | undefined>(undefined);\n private _refreshSub?: Subscription;\n private _fetchInProgress = false;\n private _retryTimeoutMs: number = 6000; // configurable timeout\n private readonly destroyRef = inject(DestroyRef);\n\n public readonly schema$: Observable<DatabaseSchema | undefined> = this._schemaSubject.asObservable();\n\n constructor(\n @Inject(HONUWARE_CRUD_ACCESS) private crudAccess: CrudAccess,\n private authService: AuthService\n ) {\n this.startSchemaPolling();\n\n this.authService.authData$.pipe(\n map(authData => authData.isAuth),\n distinctUntilChanged(),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => {\n this.refreshSchema();\n });\n }\n\n private startSchemaPolling(): void {\n this.tryFetchSchema();\n }\n\n public refreshSchema(): void {\n this._schema = undefined;\n this._schemaSubject.next(undefined);\n this.tryFetchSchema();\n }\n\n private tryFetchSchema(): void {\n if (this._fetchInProgress) return;\n\n this._refreshSub?.unsubscribe();\n this._fetchInProgress = true;\n\n this._refreshSub = this.crudAccess.getDbSchema().pipe(\n tap(schema => {\n this._schema = schema;\n this._schemaSubject.next(schema);\n this._fetchInProgress = false;\n this._refreshSub?.unsubscribe(); // Stop further polling\n this._refreshSub = undefined;\n }),\n catchError(() => {\n this._fetchInProgress = false;\n // Schedule retry after timeout\n this._refreshSub = timer(this._retryTimeoutMs).subscribe(() => this.tryFetchSchema());\n return of(undefined);\n })\n ).subscribe();\n }\n\n /**\n * Returns the cached DatabaseSchema if present, otherwise waits for a successful fetch.\n */\n public GetDBSchema(): Observable<DatabaseSchema> {\n if (this._schema) {\n return of(this._schema);\n }\n // Wait for the schema to be available\n return this.schema$.pipe(\n filter((schema): schema is DatabaseSchema => !!schema),\n take(1)\n );\n }\n}\n","import { TableBinding, FilterPair, TableSchema } from '@honuware/ui/access';\n\n/**\n * Serialize a binding stack to a ctx query param string.\n * Format: \"table:pkColumn:pkValue,table:pkColumn:pkValue\"\n */\nexport function serializeBindingStack(stack: TableBinding[]): string {\n return stack.map(b => `${b.tableName}:${b.primaryKeyName}:${b.primaryKeyValue}`).join(',');\n}\n\n/**\n * Deserialize a ctx query param string into a TableBinding array.\n * Returns empty array for null/empty input.\n */\nexport function parseBindingStack(ctx: string | null | undefined): TableBinding[] {\n if (!ctx) return [];\n return ctx.split(',').map(triple => {\n const [tableName, primaryKeyName, primaryKeyValue] = triple.split(':');\n return { tableName, primaryKeyName, primaryKeyValue };\n });\n}\n\n/**\n * Derive filter pairs from the binding stack for the current table.\n * Looks at the current table's foreign keys and matches them against\n * the binding stack to build WHERE clause filters.\n *\n * For example, if viewing purchases with ctx=people:person_id:42,\n * and purchases has FK column payer_person_id -> people.person_id,\n * this returns [{ column_name: 'payer_person_id', column_value: '42' }].\n */\nexport function deriveFilterPairs(\n currentTableSchema: TableSchema,\n bindingStack: TableBinding[]\n): FilterPair[] {\n if (bindingStack.length === 0) return [];\n\n const filterPairs: FilterPair[] = [];\n for (const fk of currentTableSchema.foreign_keys) {\n const binding = bindingStack.find(\n b => b.tableName === fk.parent_table_name && b.primaryKeyName === fk.parent_column_name\n );\n if (binding) {\n filterPairs.push({\n column_name: fk.column_name,\n column_value: binding.primaryKeyValue,\n });\n }\n }\n return filterPairs;\n}\n","import { InjectionToken } from '@angular/core';\n\n// Route literals the generic CRUD editor (the table-view / composite-row\n// containers and the table pages) would otherwise hardcode. Injected so a\n// honuware consumer can mount the editor under a different path without\n// forking the components.\nexport interface CrudEditorRoutes {\n /**\n * Base path for the generic table editor routes. Navigation is built as\n * `[basePath, tableName, 'view'|'edit'|'new', ...]`, so this must be the\n * absolute prefix the editor routes are mounted at.\n */\n basePath: string;\n /** The admin portal home the \"back\" links point at. */\n adminHome: string;\n}\n\nexport const DEFAULT_CRUD_EDITOR_ROUTES: CrudEditorRoutes = {\n basePath: '/admin/tables',\n adminHome: '/admin',\n};\n\n// Root-provided with the knottyyoga defaults, so nothing needs wiring today.\nexport const CRUD_EDITOR_ROUTES = new InjectionToken<CrudEditorRoutes>(\n 'CRUD_EDITOR_ROUTES',\n {\n providedIn: 'root',\n factory: () => DEFAULT_CRUD_EDITOR_ROUTES,\n }\n);\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, Inject } from '@angular/core';\n\nimport { Router } from '@angular/router';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport {\n CrudAccess, HONUWARE_CRUD_ACCESS, PhotoUrlBuilder,\n DatabaseSchema, TableSchema, ColumnDataInfo, ForeignKeyInfo, TableBinding,\n} from '@honuware/ui/access';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\nimport { from } from 'rxjs';\nimport { concatMap, tap } from 'rxjs/operators';\nimport { serializeBindingStack, deriveFilterPairs } from '../table-binding.utils';\nimport { ConfirmDialogComponent } from '@honuware/ui/foundation';\nimport { formatMicroseconds, isMicrosecondTimestamp } from '@honuware/ui/foundation';\n\nexport interface ChildTableReference {\n childTableName: string;\n childTableFriendlyName: string;\n foreignKey: ForeignKeyInfo;\n}\n\n@Component({\n selector: 'hw-table-view-control',\n standalone: true,\n imports: [\n MatTableModule,\n MatButtonModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatDialogModule,\n MatSelectModule,\n MatFormFieldModule\n],\n templateUrl: './table-view-control.component.html',\n styleUrls: ['./table-view-control.component.scss']\n})\nexport class TableViewControlComponent implements OnInit, OnChanges {\n @Input() tableName!: string;\n @Input() pageSize: number = 10;\n @Input() pageOffset: number = 0;\n @Input() sortColumn?: string;\n @Input() sortAscending: boolean = true;\n @Input() bindingStack: TableBinding[] = [];\n\n databaseSchema?: DatabaseSchema;\n tableSchema?: TableSchema;\n columns: ColumnDataInfo[] = [];\n displayedColumns: string[] = [];\n dataSource: Record<string, string>[] = [];\n totalCount: number = 0;\n loading: boolean = true;\n error?: string;\n childTableReferences: ChildTableReference[] = [];\n /** Maps column_name → pk_value → display_text for FK columns. */\n fkDisplayMap: Record<string, Record<string, string>> = {};\n\n pageSizeOptions: number[] = [5, 10, 20, 30, 50, 100];\n\n constructor(\n private dbSchemaService: DatabaseSchemaService,\n @Inject(HONUWARE_CRUD_ACCESS) private crudAccess: CrudAccess,\n private photoUrlBuilder: PhotoUrlBuilder,\n @Inject(CRUD_EDITOR_ROUTES) private editorRoutes: CrudEditorRoutes,\n private router: Router,\n private dialog: MatDialog\n ) {}\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['tableName'] || changes['pageSize'] || changes['pageOffset'] ||\n changes['sortColumn'] || changes['sortAscending'] || changes['bindingStack']) {\n if (!changes['tableName']?.firstChange) {\n this.loadData();\n }\n }\n }\n\n private loadData(): void {\n this.loading = true;\n this.error = undefined;\n\n this.dbSchemaService.GetDBSchema().subscribe({\n next: (schema) => {\n this.databaseSchema = schema;\n this.tableSchema = schema.tables.find(t => t.table_name === this.tableName);\n if (!this.tableSchema) {\n this.error = `Table \"${this.tableName}\" not found in schema`;\n this.loading = false;\n return;\n }\n\n this.columns = this.tableSchema.columns.filter(c => !this.isTrueValue(c.hidden));\n // Display actions column first, then photo column if supported, then data columns\n const photoColumn = this.hasPhotoSupport ? ['photo'] : [];\n this.displayedColumns = ['actions'].concat(photoColumn, this.columns.map(c => c.column_name));\n\n // Compute child table references\n this.childTableReferences = this.getChildTableReferences(schema);\n\n // Derive filter pairs from binding stack + FK info\n const filterPairs = deriveFilterPairs(this.tableSchema, this.bindingStack);\n\n // Use primary key as default sort column if not specified\n const sortCol = this.sortColumn || this.tableSchema.primary_key;\n\n this.crudAccess.getFilteredTableRows(\n this.tableName,\n sortCol,\n this.sortAscending,\n this.pageSize,\n this.pageOffset,\n filterPairs\n ).subscribe({\n next: (result) => {\n this.totalCount = result.totalCount;\n // Convert dataTable array to array of objects\n this.dataSource = result.dataTable.map(row => {\n const obj: Record<string, string> = {};\n result.sortedColumnNames.forEach((colName, idx) => {\n obj[colName] = row[idx];\n });\n return obj;\n });\n this.resolveFkDisplayValues();\n },\n error: (err) => {\n this.error = 'Failed to load data';\n this.loading = false;\n console.error('Error loading table data:', err);\n }\n });\n },\n error: (err) => {\n this.error = 'Failed to load schema';\n this.loading = false;\n console.error('Error loading schema:', err);\n }\n });\n }\n\n private getChildTableReferences(schema: DatabaseSchema): ChildTableReference[] {\n const refs: ChildTableReference[] = [];\n for (const nestedTableName of schema.nested_tables) {\n const childSchema = schema.tables.find(t => t.table_name === nestedTableName);\n if (!childSchema) continue;\n for (const fk of childSchema.foreign_keys) {\n if (fk.parent_table_name === this.tableName) {\n refs.push({\n childTableName: nestedTableName,\n childTableFriendlyName: childSchema.table_friendly_name || nestedTableName,\n foreignKey: fk,\n });\n }\n }\n }\n return refs;\n }\n\n private resolveFkDisplayValues(): void {\n if (!this.tableSchema || this.tableSchema.foreign_keys.length === 0) {\n this.loading = false;\n return;\n }\n\n const fkEntries: { colName: string; parentTable: string; values: string[] }[] = [];\n\n for (const fk of this.tableSchema.foreign_keys) {\n const uniqueValues = [...new Set(\n this.dataSource\n .map(row => row[fk.column_name])\n .filter(v => !!v)\n )];\n if (uniqueValues.length === 0) continue;\n fkEntries.push({\n colName: fk.column_name,\n parentTable: fk.parent_table_name,\n values: uniqueValues,\n });\n }\n\n if (fkEntries.length === 0) {\n this.loading = false;\n return;\n }\n\n // Process sequentially to avoid concurrent transaction errors on the server\n from(fkEntries).pipe(\n concatMap(entry =>\n this.crudAccess.resolveFkDisplay(entry.parentTable, entry.values).pipe(\n tap(response => {\n this.fkDisplayMap[entry.colName] = response.resolved;\n })\n )\n )\n ).subscribe({\n complete: () => {\n this.loading = false;\n },\n error: (err) => {\n console.error('FK display resolution failed:', err);\n this.loading = false;\n }\n });\n }\n\n onNavigateToChild(ref: ChildTableReference, row: Record<string, string>): void {\n const primaryKeyValue = this.getPrimaryKeyValue(row);\n if (!primaryKeyValue || !this.tableSchema) return;\n\n const newStack: TableBinding[] = [\n ...this.bindingStack,\n {\n tableName: this.tableName,\n primaryKeyName: this.tableSchema.primary_key,\n primaryKeyValue,\n }\n ];\n\n this.router.navigate(\n [this.editorRoutes.basePath, ref.childTableName, 'view', this.pageSize, 0],\n { queryParams: { ctx: serializeBindingStack(newStack) } }\n );\n }\n\n private isTrueValue(value: boolean | undefined): boolean {\n return value === true || (value as unknown) === 't';\n }\n\n formatCellValue(column: ColumnDataInfo, value: string): string {\n if (!value) return value;\n // Check FK display map first\n const fkResolved = this.fkDisplayMap[column.column_name];\n if (fkResolved && fkResolved[value]) {\n return fkResolved[value];\n }\n if (column.html_input_type === 'date' && isMicrosecondTimestamp(value)) {\n return formatMicroseconds(value);\n }\n return value;\n }\n\n isBoolColumn(column: ColumnDataInfo): boolean {\n return column.type === 'bool' ||\n column.html_input_type === 'bool' ||\n column.html_input_type === 'checkbox';\n }\n\n getBoolValue(value: string): boolean {\n return value === 't' || value === 'true' || value === '1';\n }\n\n getColumnHeader(column: ColumnDataInfo): string {\n return column.column_friendly_name || column.column_name;\n }\n\n get hasPhotoSupport(): boolean {\n return this.isTrueValue(this.tableSchema?.has_photo_support);\n }\n\n getPhotoUrl(row: Record<string, string>): string {\n const id = this.getPrimaryKeyValue(row);\n return this.photoUrlBuilder.scaledPhotoUrl(this.tableName, id, 50, 50);\n }\n\n getPrimaryKeyValue(row: Record<string, string>): string {\n return this.tableSchema ? row[this.tableSchema.primary_key] : '';\n }\n\n // Pagination helpers\n get currentPage(): number {\n return this.pageOffset;\n }\n\n get totalPages(): number {\n return Math.ceil(this.totalCount / this.pageSize);\n }\n\n get startRow(): number {\n return this.pageOffset * this.pageSize + 1;\n }\n\n get endRow(): number {\n return Math.min((this.pageOffset + 1) * this.pageSize, this.totalCount);\n }\n\n get canGoPrevious(): boolean {\n return this.pageOffset > 0;\n }\n\n get canGoNext(): boolean {\n return this.pageOffset < this.totalPages - 1;\n }\n\n // Navigation methods\n goToFirstPage(): void {\n this.navigateToPage(0);\n }\n\n goToPreviousPage(): void {\n if (this.canGoPrevious) {\n this.navigateToPage(this.pageOffset - 1);\n }\n }\n\n goToNextPage(): void {\n if (this.canGoNext) {\n this.navigateToPage(this.pageOffset + 1);\n }\n }\n\n goToLastPage(): void {\n this.navigateToPage(this.totalPages - 1);\n }\n\n /** Build query params preserving ctx for nested navigation. */\n private buildCtxQueryParams(extra?: Record<string, string>): Record<string, string> {\n const params: Record<string, string> = { ...extra };\n if (this.bindingStack.length > 0) {\n params['ctx'] = serializeBindingStack(this.bindingStack);\n }\n return params;\n }\n\n private navigateToPage(page: number): void {\n this.router.navigate(\n [this.editorRoutes.basePath, this.tableName, 'view', this.pageSize, page],\n { queryParams: this.buildCtxQueryParams() }\n );\n }\n\n onPageSizeChange(newPageSize: number): void {\n // Reset to first page when changing page size\n this.router.navigate(\n [this.editorRoutes.basePath, this.tableName, 'view', newPageSize, 0],\n { queryParams: this.buildCtxQueryParams() }\n );\n }\n\n // Action methods\n onNewItem(): void {\n const returnUrl = this.router.url;\n this.router.navigate([this.editorRoutes.basePath, this.tableName, 'new'], {\n queryParams: this.buildCtxQueryParams({ returnUrl })\n });\n }\n\n onEditRow(row: Record<string, string>): void {\n const primaryKeyValue = this.getPrimaryKeyValue(row);\n if (!primaryKeyValue) {\n console.error('Cannot edit row: no primary key value found', { row, tableSchema: this.tableSchema });\n return;\n }\n const returnUrl = this.router.url;\n this.router.navigate([this.editorRoutes.basePath, this.tableName, 'edit', primaryKeyValue], {\n queryParams: this.buildCtxQueryParams({ returnUrl })\n });\n }\n\n /** Navigate back to the parent table's edit page by popping the binding stack. */\n onNavigateToParent(): void {\n if (this.bindingStack.length === 0) return;\n\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentStack = this.bindingStack.slice(0, -1);\n\n const queryParams: Record<string, string> = {};\n if (parentStack.length > 0) {\n queryParams['ctx'] = serializeBindingStack(parentStack);\n }\n\n this.router.navigate(\n [this.editorRoutes.basePath, parentBinding.tableName, 'edit', parentBinding.primaryKeyValue],\n { queryParams }\n );\n }\n\n get hasParent(): boolean {\n return this.bindingStack.length > 0;\n }\n\n get parentFriendlyName(): string {\n if (this.bindingStack.length === 0) return '';\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentSchema = this.databaseSchema?.tables.find(t => t.table_name === parentBinding.tableName);\n return parentSchema?.table_friendly_name || parentBinding.tableName;\n }\n\n onDeleteRow(row: Record<string, string>): void {\n const primaryKeyValue = this.getPrimaryKeyValue(row);\n const primaryKeyName = this.tableSchema?.primary_key || 'id';\n\n const friendlyName = this.tableSchema?.table_friendly_name || this.tableName;\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\n width: '400px',\n data: {\n title: 'Confirm Delete',\n description: `Are you sure you want to delete this ${friendlyName} record (ID: ${primaryKeyValue})?`,\n buttonText: 'Delete',\n }\n });\n\n dialogRef.afterClosed().subscribe(confirmed => {\n if (confirmed) {\n this.crudAccess.deleteItem(this.tableName, primaryKeyName, primaryKeyValue).subscribe({\n next: () => {\n // Refresh the data after deletion\n this.loadData();\n },\n error: (err) => {\n console.error('Error deleting row:', err);\n this.error = 'Failed to delete row';\n }\n });\n }\n });\n }\n}\n","<div class=\"table-view-container\">\n <!-- Back to Parent button -->\n @if (hasParent) {\n <button mat-stroked-button class=\"parent-button\" (click)=\"onNavigateToParent()\">\n <mat-icon>arrow_back</mat-icon>\n Back to {{ parentFriendlyName }}\n </button>\n }\n\n <!-- Header with New Item button -->\n <div class=\"table-header\">\n <h2>{{ tableSchema?.table_friendly_name || tableName }}</h2>\n <button mat-raised-button color=\"primary\" (click)=\"onNewItem()\">\n <mat-icon>add</mat-icon>\n New Item\n </button>\n </div>\n\n <!-- Loading state -->\n @if (loading) {\n <div class=\"loading-container\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <p>Loading...</p>\n </div>\n }\n\n <!-- Error state -->\n @if (error && !loading) {\n <div class=\"error-container\">\n <mat-icon>error</mat-icon>\n <p>{{ error }}</p>\n </div>\n }\n\n <!-- Empty state -->\n @if (!loading && !error && dataSource.length === 0) {\n <div class=\"empty-container\">\n <mat-icon>inbox</mat-icon>\n <p>No records found</p>\n <button mat-stroked-button color=\"primary\" (click)=\"onNewItem()\">\n Create First Record\n </button>\n </div>\n }\n\n <!-- Data table -->\n @if (!loading && !error && dataSource.length > 0) {\n <div class=\"table-wrapper\">\n <table mat-table [dataSource]=\"dataSource\" multiTemplateDataRows>\n <!-- Dynamic columns -->\n @for (column of columns; track column.column_name) {\n <ng-container [matColumnDef]=\"column.column_name\">\n <th mat-header-cell *matHeaderCellDef>{{ getColumnHeader(column) }}</th>\n <td mat-cell *matCellDef=\"let row\">\n @if (isBoolColumn(column)) {\n <mat-icon [class]=\"getBoolValue(row[column.column_name]) ? 'bool-true' : 'bool-false'\">\n {{ getBoolValue(row[column.column_name]) ? 'check_circle' : 'cancel' }}\n </mat-icon>\n } @else {\n {{ formatCellValue(column, row[column.column_name]) }}\n }\n </td>\n </ng-container>\n }\n\n <!-- Photo column (always defined, only included in displayedColumns when supported) -->\n <ng-container matColumnDef=\"photo\">\n <th mat-header-cell *matHeaderCellDef>Photo</th>\n <td mat-cell *matCellDef=\"let row\">\n <img [src]=\"getPhotoUrl(row)\"\n class=\"photo-thumbnail\"\n (error)=\"$any($event.target).style.display='none'; $any($event.target).nextElementSibling.style.display='inline-flex'\"\n alt=\"Photo\">\n <mat-icon class=\"photo-placeholder\" style=\"display: none\">image</mat-icon>\n </td>\n </ng-container>\n\n <!-- Actions column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"actions-row\">\n <button mat-icon-button color=\"primary\" (click)=\"onEditRow(row); $event.stopPropagation()\" title=\"Edit\">\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-icon-button color=\"warn\" (click)=\"onDeleteRow(row); $event.stopPropagation()\" title=\"Delete\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </td>\n </ng-container>\n\n <!-- Child tables detail row (spans all columns) -->\n <ng-container matColumnDef=\"childTables\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"displayedColumns.length\">\n <div class=\"child-table-pills\">\n @for (ref of childTableReferences; track ref.childTableName + ref.foreignKey.column_name) {\n <button class=\"child-pill\" (click)=\"onNavigateToChild(ref, row); $event.stopPropagation()\">\n <mat-icon>subdirectory_arrow_right</mat-icon>\n {{ ref.childTableFriendlyName }}\n </button>\n }\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['childTables'];\"\n class=\"child-tables-row\"\n [class.hidden-row]=\"childTableReferences.length === 0\"></tr>\n </table>\n </div>\n\n <!-- Pagination controls -->\n <div class=\"pagination-container\">\n <div class=\"pagination-left\">\n <mat-form-field appearance=\"outline\" class=\"page-size-select\">\n <mat-label>Page size</mat-label>\n <mat-select [value]=\"pageSize\" (selectionChange)=\"onPageSizeChange($event.value)\">\n @for (size of pageSizeOptions; track size) {\n <mat-option [value]=\"size\">{{ size }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <span class=\"pagination-info\">\n Showing {{ startRow }} - {{ endRow }} of {{ totalCount }}\n </span>\n </div>\n <div class=\"pagination-buttons\">\n <button mat-icon-button\n [disabled]=\"!canGoPrevious\"\n (click)=\"goToFirstPage()\"\n title=\"First page\">\n <mat-icon>first_page</mat-icon>\n </button>\n <button mat-icon-button\n [disabled]=\"!canGoPrevious\"\n (click)=\"goToPreviousPage()\"\n title=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <span class=\"page-info\">Page {{ currentPage + 1 }} of {{ totalPages }}</span>\n <button mat-icon-button\n [disabled]=\"!canGoNext\"\n (click)=\"goToNextPage()\"\n title=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button mat-icon-button\n [disabled]=\"!canGoNext\"\n (click)=\"goToLastPage()\"\n title=\"Last page\">\n <mat-icon>last_page</mat-icon>\n </button>\n </div>\n </div>\n }\n</div>\n","import { Component, Input, ViewChild, ViewChildren, QueryList, OnInit, Inject } from '@angular/core';\n\nimport { Router } from '@angular/router';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CompositeControlComponent } from '@honuware/ui/controls';\nimport { PhotoUploadComponent } from '@honuware/ui/photos';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport {\n CrudAccess, UpdateItemBody, AddItemBody, HONUWARE_CRUD_ACCESS,\n DatabaseSchema, TableSchema, ColumnDataInfo, ForeignKeyInfo,\n TableBinding, FilterPair, CrudFormAssist, ComputedDateRule,\n} from '@honuware/ui/access';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\nimport { serializeBindingStack } from '../table-binding.utils';\n\n/**\n * A child table reference discovered from the schema.\n * Represents a nested table that has an FK pointing back to the current table.\n */\nexport interface ChildTableReference {\n childTableName: string;\n childTableFriendlyName: string;\n foreignKey: ForeignKeyInfo;\n}\n\n@Component({\n selector: 'hw-composite-row-control',\n standalone: true,\n imports: [MatButtonModule, MatCheckboxModule, MatIconModule, CompositeControlComponent, PhotoUploadComponent],\n templateUrl: './composite-row-control.component.html',\n styleUrls: ['./composite-row-control.component.scss']\n})\nexport class CompositeRowControlComponent implements OnInit {\n @Input() tableName!: string;\n @Input() columnNames!: string[];\n @Input() primaryKeyName?: string;\n @Input() primaryKeyValue?: string;\n @Input() isCreateMode!: boolean;\n @Input() returnUrl?: string;\n @Input() bindingStack: TableBinding[] = [];\n @Input() formAssist?: CrudFormAssist;\n\n @ViewChildren(CompositeControlComponent) controls!: QueryList<CompositeControlComponent>;\n @ViewChild(PhotoUploadComponent) photoUpload?: PhotoUploadComponent;\n\n columnInfos: ColumnDataInfo[] = [];\n loading: boolean = true;\n columnValues: (string | undefined)[] = []; // values for each column\n hasPhotoSupport: boolean = false;\n childTableReferences: ChildTableReference[] = [];\n /** Set of FK column names from navigation context (readonly + pre-filled in create mode). */\n private contextFkColumnNames: Set<string> = new Set();\n private databaseSchema?: DatabaseSchema;\n private tableSchema?: TableSchema;\n /** Tracks whether each computed date dest column is in auto-compute mode. */\n computedDateAutoState: Record<string, boolean> = {};\n\n constructor(\n private dbSchemaService: DatabaseSchemaService,\n @Inject(HONUWARE_CRUD_ACCESS) private crudAccess: CrudAccess,\n @Inject(CRUD_EDITOR_ROUTES) private editorRoutes: CrudEditorRoutes,\n private router: Router\n ) {}\n\n ngOnInit() {\n this.loadColumnInfos();\n }\n\n private loadColumnInfos() {\n this.dbSchemaService.GetDBSchema().subscribe(schema => {\n this.databaseSchema = schema;\n const table = schema.tables.find(t => t.table_name === this.tableName);\n if (!table) {\n this.columnInfos = [];\n this.loading = false;\n return;\n }\n this.tableSchema = table;\n this.hasPhotoSupport = this.isTrueValue(table.has_photo_support);\n this.columnInfos = this.columnNames.map(colName =>\n table.columns.find(col => col.column_name === colName)!\n );\n\n // Compute context FK columns from binding stack\n this.contextFkColumnNames = this.computeContextFkColumns(table);\n\n // Compute child table references (for nested table navigation buttons)\n this.childTableReferences = this.isCreateMode ? [] : this.getChildTableReferences(schema);\n\n if (!this.isCreateMode && this.primaryKeyName && this.primaryKeyValue) {\n // Fetch row data using getRowByValues (unified for root and nested)\n const filterPairs: FilterPair[] = [\n { column_name: this.primaryKeyName, column_value: this.primaryKeyValue }\n ];\n this.crudAccess.getRowByValues(this.tableName, filterPairs).subscribe(result => {\n // Map each columnName to its value in the returned row\n this.columnValues = this.columnNames.map(colName => {\n const sortedIdx = result.sortedColumnNames.indexOf(colName);\n return result.dataTable.length > 0 && sortedIdx !== -1 ? result.dataTable[0][sortedIdx] : undefined;\n });\n this.loading = false;\n });\n } else {\n // Create mode: pre-fill FK columns from binding stack context, then apply formAssist defaults\n this.columnValues = this.columnNames.map(colName => {\n const fkPrefill = this.getContextFkValue(table, colName);\n if (fkPrefill) return fkPrefill;\n // Apply formAssist defaults\n if (this.formAssist?.defaults && colName in this.formAssist.defaults) {\n return this.formAssist.defaults[colName];\n }\n return undefined;\n });\n // Initialize computed date auto state\n this.initComputedDateState();\n this.loading = false;\n }\n });\n }\n\n /**\n * Compute the set of FK column names that come from navigation context.\n * These should be readonly in both edit and create mode.\n */\n private computeContextFkColumns(table: TableSchema): Set<string> {\n const fkColumns = new Set<string>();\n for (const fk of table.foreign_keys) {\n const binding = this.bindingStack.find(\n b => b.tableName === fk.parent_table_name && b.primaryKeyName === fk.parent_column_name\n );\n if (binding) {\n fkColumns.add(fk.column_name);\n }\n }\n return fkColumns;\n }\n\n /**\n * Get the pre-fill value for an FK column from the binding stack.\n * Returns null if the column is not an FK from context.\n */\n private getContextFkValue(table: TableSchema, columnName: string): string | null {\n for (const fk of table.foreign_keys) {\n if (fk.column_name !== columnName) continue;\n const binding = this.bindingStack.find(\n b => b.tableName === fk.parent_table_name && b.primaryKeyName === fk.parent_column_name\n );\n if (binding) {\n return binding.primaryKeyValue;\n }\n }\n return null;\n }\n\n /**\n * Find nested tables that have FK references to the current table.\n * Only includes tables listed in schema.nested_tables.\n */\n private getChildTableReferences(schema: DatabaseSchema): ChildTableReference[] {\n const refs: ChildTableReference[] = [];\n for (const nestedTableName of schema.nested_tables) {\n const childSchema = schema.tables.find(t => t.table_name === nestedTableName);\n if (!childSchema) continue;\n for (const fk of childSchema.foreign_keys) {\n if (fk.parent_table_name === this.tableName) {\n refs.push({\n childTableName: nestedTableName,\n childTableFriendlyName: childSchema.table_friendly_name || nestedTableName,\n foreignKey: fk,\n });\n }\n }\n }\n return refs;\n }\n\n get visibleColumns(): { col: ColumnDataInfo; index: number }[] {\n return this.columnInfos\n .map((col, index) => ({ col, index }))\n .filter(({ col }) => {\n if (this.isTrueValue(col.hidden)) return false;\n if (this.isTrueValue(col.readonly) && this.isCreateMode) return false;\n return true;\n });\n }\n\n /** Check if a column should be readonly. Includes context FK columns. */\n isReadonlyColumn(col: ColumnDataInfo): boolean {\n return this.isPrimaryKeyColumn(col) || this.isTrueValue(col.readonly)\n || this.contextFkColumnNames.has(col.column_name);\n }\n\n /** Whether the column is an FK from navigation context. */\n isContextFkColumn(col: ColumnDataInfo): boolean {\n return this.contextFkColumnNames.has(col.column_name);\n }\n\n onValueChanged(index: number, value: string): void {\n const visible = this.visibleColumns;\n const entry = visible[index];\n if (!entry) return;\n const control = this.controls.get(index);\n if (control) {\n control.value = value;\n }\n // Update the backing columnValues so computed dates can read it\n this.columnValues[entry.index] = value;\n // Propagate to computed date destinations\n this.applyComputedDates(entry.col.column_name);\n }\n\n getControlValues(): Record<string, string | undefined> {\n const values: Record<string, string | undefined> = {};\n const visible = this.visibleColumns;\n this.controls.forEach((control, idx) => {\n const entry = visible[idx];\n if (!entry) return;\n const col = entry.col;\n if (this.isTrueValue(col.readonly)) return;\n // Skip empty strings for non-text columns — PostgreSQL can't cast \"\"\n // to numeric/date/bool types, and empty means \"no change\" for those.\n if (control.value === '' && !this.isTextColumnType(col.type)) return;\n values[this.columnNames[entry.index]] = control.value;\n });\n return values;\n }\n\n private isTextColumnType(type: string): boolean {\n const upper = type.toUpperCase();\n return upper === 'VARCHAR' || upper === 'TEXT' || upper === 'CHAR';\n }\n\n onSubmit() {\n const values = this.getControlValues();\n if (this.isCreateMode) {\n const body: AddItemBody = {\n table_name: this.tableName,\n value: values\n };\n if (this.hasPhotoSupport) {\n this.crudAccess.addItemFetchPrimaryKey(body).subscribe({\n next: (primaryKey) => {\n if (this.photoUpload?.hasPendingFile) {\n this.photoUpload.uploadPendingPhoto(this.tableName, Number(primaryKey)).subscribe({\n next: () => this.navigateBack(),\n error: (err) => {\n console.error('Error uploading photo:', err);\n this.navigateBack();\n }\n });\n } else {\n this.navigateBack();\n }\n },\n error: (err) => console.error('Error creating item:', err)\n });\n } else {\n this.crudAccess.addItem(body).subscribe({\n next: () => this.navigateBack(),\n error: (err) => console.error('Error creating item:', err)\n });\n }\n } else {\n if (!this.primaryKeyName || !this.primaryKeyValue) return;\n const body: UpdateItemBody = {\n table_name: this.tableName,\n value: values,\n column_name: this.primaryKeyName,\n column_value: this.primaryKeyValue\n };\n this.crudAccess.updateItem(body).subscribe({\n next: () => this.navigateBack(),\n error: (err) => console.error('Error updating item:', err)\n });\n }\n }\n\n onCancel() {\n this.navigateBack();\n }\n\n private isTrueValue(value: boolean | undefined): boolean {\n return value === true || (value as unknown) === 't';\n }\n\n get showPhotoUpload(): boolean {\n if (!this.hasPhotoSupport) return false;\n if (this.isCreateMode) return true;\n return !!this.primaryKeyValue;\n }\n\n get photoItemId(): number {\n if (this.isCreateMode) return 0;\n return Number(this.primaryKeyValue);\n }\n\n getForeignKeyInfo(col: ColumnDataInfo): ForeignKeyInfo | undefined {\n return this.tableSchema?.foreign_keys.find(fk => fk.column_name === col.column_name);\n }\n\n isPrimaryKeyColumn(col: ColumnDataInfo): boolean {\n if (this.isCreateMode) return false;\n // Handle both boolean true and string \"t\" from server\n return col.primary_key === true || (col.primary_key as unknown) === 't';\n }\n\n // --- Nested navigation ---\n\n get hasParent(): boolean {\n return this.bindingStack.length > 0;\n }\n\n get parentFriendlyName(): string {\n if (this.bindingStack.length === 0) return '';\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentSchema = this.databaseSchema?.tables.find(t => t.table_name === parentBinding.tableName);\n return parentSchema?.table_friendly_name || parentBinding.tableName;\n }\n\n /** Navigate back to the parent table's edit page by popping the binding stack. */\n onNavigateToParent(): void {\n if (this.bindingStack.length === 0) return;\n\n const parentBinding = this.bindingStack[this.bindingStack.length - 1];\n const parentStack = this.bindingStack.slice(0, -1);\n\n const queryParams: Record<string, string> = {};\n if (parentStack.length > 0) {\n queryParams['ctx'] = serializeBindingStack(parentStack);\n }\n\n this.router.navigate(\n [this.editorRoutes.basePath, parentBinding.tableName, 'edit', parentBinding.primaryKeyValue],\n { queryParams }\n );\n }\n\n /** Navigate to a child (nested) table filtered by the current row. */\n onNavigateToChild(ref: ChildTableReference): void {\n if (!this.primaryKeyValue || !this.tableSchema) return;\n\n // Push current table onto the binding stack\n const newStack: TableBinding[] = [\n ...this.bindingStack,\n {\n tableName: this.tableName,\n primaryKeyName: this.tableSchema.primary_key,\n primaryKeyValue: this.primaryKeyValue,\n }\n ];\n\n const queryParams: Record<string, string> = {\n ctx: serializeBindingStack(newStack),\n };\n\n this.router.navigate(\n [this.editorRoutes.basePath, ref.childTableName, 'view', 10, 0],\n { queryParams }\n );\n }\n\n // --- Computed date support ---\n\n private initComputedDateState(): void {\n if (!this.formAssist?.computedDates) return;\n for (const rule of this.formAssist.computedDates) {\n this.computedDateAutoState[rule.dest] = rule.autoByDefault;\n }\n }\n\n /** When a source field changes, update any auto-computed dest fields. */\n private applyComputedDates(changedColumn: string): void {\n if (!this.formAssist?.computedDates) return;\n for (const rule of this.formAssist.computedDates) {\n if (rule.source !== changedColumn) continue;\n if (!this.computedDateAutoState[rule.dest]) continue;\n this.computeAndSetDate(rule);\n }\n }\n\n private computeAndSetDate(rule: ComputedDateRule): void {\n const sourceIndex = this.columnNames.indexOf(rule.source);\n const destIndex = this.columnNames.indexOf(rule.dest);\n if (sourceIndex === -1 || destIndex === -1) return;\n\n const sourceValue = this.columnValues[sourceIndex];\n if (!sourceValue) return;\n\n const sourceUs = parseInt(sourceValue, 10);\n if (isNaN(sourceUs)) return;\n\n const destUs = sourceUs + (rule.offsetMinutes * 60 * 1_000_000);\n const destValue = String(destUs);\n this.columnValues[destIndex] = destValue;\n\n // Update the visible control if it exists\n const visible = this.visibleColumns;\n const visibleIdx = visible.findIndex(v => v.index === destIndex);\n if (visibleIdx !== -1) {\n const control = this.controls?.get(visibleIdx);\n if (control) {\n control.value = destValue;\n }\n }\n }\n\n /** Toggle auto-compute for a computed date dest column. */\n onToggleComputedDate(destColumn: string): void {\n this.computedDateAutoState[destColumn] = !this.computedDateAutoState[destColumn];\n if (this.computedDateAutoState[destColumn]) {\n // Re-compute from source\n const rule = this.formAssist?.computedDates?.find(r => r.dest === destColumn);\n if (rule) {\n this.computeAndSetDate(rule);\n }\n }\n }\n\n /** Check if a column is a computed date dest in auto mode. */\n isComputedDateAuto(columnName: string): boolean {\n return this.computedDateAutoState[columnName] === true;\n }\n\n /** Get the computed date rule for a column, if any. */\n getComputedDateRule(columnName: string): ComputedDateRule | undefined {\n return this.formAssist?.computedDates?.find(r => r.dest === columnName);\n }\n\n private navigateBack() {\n if (this.returnUrl) {\n this.router.navigateByUrl(this.returnUrl);\n }\n }\n}\n","@if (loading) {\n<div>Loading...</div>\n}\n@if (!loading) {\n<!-- Back to Parent button -->\n@if (hasParent) {\n <button mat-stroked-button class=\"parent-button\" (click)=\"onNavigateToParent()\">\n <mat-icon>arrow_back</mat-icon>\n Back to {{ parentFriendlyName }}\n </button>\n}\n@if (showPhotoUpload) {\n <hw-photo-upload [tableName]=\"tableName\" [tableItemId]=\"photoItemId\" [deferUpload]=\"isCreateMode\"></hw-photo-upload>\n}\n<form>\n @for (entry of visibleColumns; track entry.col.column_name; let i = $index) {\n <hw-composite-control [dataInfo]=\"entry.col\"\n [value]=\"columnValues[entry.index]\"\n [readOnly]=\"isReadonlyColumn(entry.col) || isComputedDateAuto(entry.col.column_name)\"\n [foreignKeyInfo]=\"getForeignKeyInfo(entry.col)\"\n (valueChanged)=\"onValueChanged(i, $event)\">\n </hw-composite-control>\n @if (getComputedDateRule(entry.col.column_name); as rule) {\n <div class=\"computed-date-toggle\">\n <mat-checkbox [checked]=\"isComputedDateAuto(entry.col.column_name)\"\n (change)=\"onToggleComputedDate(entry.col.column_name)\">\n Auto-compute from {{ rule.source }} + {{ rule.offsetMinutes }} min\n </mat-checkbox>\n </div>\n }\n }\n <div class=\"form-actions\">\n <button type=\"button\" mat-raised-button color=\"primary\" class=\"submit-button\" (click)=\"onSubmit()\">\n {{ isCreateMode ? 'Create' : 'Update' }}\n </button>\n @if (returnUrl) {\n <button type=\"button\" mat-stroked-button class=\"cancel-button\" (click)=\"onCancel()\">\n Cancel\n </button>\n }\n </div>\n</form>\n<!-- Nested table cards (only in edit mode) -->\n@if (!isCreateMode && childTableReferences.length > 0) {\n <div class=\"nested-tables-section\">\n <h3>Related Tables</h3>\n <div class=\"nested-table-cards\">\n @for (ref of childTableReferences; track ref.childTableName + ref.foreignKey.column_name) {\n <button mat-stroked-button class=\"nested-table-card\" (click)=\"onNavigateToChild(ref)\">\n <mat-icon>subdirectory_arrow_right</mat-icon>\n {{ ref.childTableFriendlyName }}\n </button>\n }\n </div>\n </div>\n}\n}\n","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\n\nimport { ActivatedRoute, RouterModule } from '@angular/router';\nimport { Subject, combineLatest, takeUntil } from 'rxjs';\nimport { TableViewControlComponent } from '../table-view-control/table-view-control.component';\nimport { TableBinding } from '@honuware/ui/access';\nimport { parseBindingStack } from '../table-binding.utils';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\n\n@Component({\n selector: 'hw-table-view-page',\n standalone: true,\n imports: [RouterModule, TableViewControlComponent],\n templateUrl: './table-view-page.component.html',\n styleUrls: ['./table-view-page.component.scss']\n})\nexport class TableViewPageComponent implements OnInit, OnDestroy {\n tableName: string = '';\n pageSize: number = 10;\n pageOffset: number = 0;\n bindingStack: TableBinding[] = [];\n readonly adminHome: string;\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private route: ActivatedRoute,\n @Inject(CRUD_EDITOR_ROUTES) editorRoutes: CrudEditorRoutes,\n ) {\n this.adminHome = editorRoutes.adminHome;\n }\n\n ngOnInit(): void {\n combineLatest([\n this.route.params,\n this.route.queryParams\n ]).pipe(takeUntil(this.destroy$)).subscribe(([params, queryParams]) => {\n this.tableName = params['tableName'] || '';\n this.pageSize = parseInt(params['pageSize'], 10) || 10;\n this.pageOffset = parseInt(params['pageOffset'], 10) || 0;\n this.bindingStack = parseBindingStack(queryParams['ctx']);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","<a [routerLink]=\"adminHome\" class=\"din back-link\">&larr; Back to admin portal</a>\n<hw-table-view-control\n [tableName]=\"tableName\"\n [pageSize]=\"pageSize\"\n [pageOffset]=\"pageOffset\"\n [bindingStack]=\"bindingStack\">\n</hw-table-view-control>\n","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\n\nimport { ActivatedRoute, RouterModule } from '@angular/router';\nimport { Subject, takeUntil, combineLatest } from 'rxjs';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CompositeRowControlComponent } from '../composite-row-control/composite-row-control.component';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport { TableBinding } from '@honuware/ui/access';\nimport { parseBindingStack } from '../table-binding.utils';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\n\n@Component({\n selector: 'hw-table-edit-page',\n standalone: true,\n imports: [\n RouterModule,\n MatCardModule,\n MatProgressSpinnerModule,\n MatIconModule,\n CompositeRowControlComponent\n],\n templateUrl: './table-edit-page.component.html',\n styleUrls: ['./table-edit-page.component.scss']\n})\nexport class TableEditPageComponent implements OnInit, OnDestroy {\n tableName: string = '';\n primaryKeyName: string = 'id';\n primaryKeyValue: string = '';\n columnNames: string[] = [];\n tableFriendlyName: string = '';\n returnUrl: string = '';\n bindingStack: TableBinding[] = [];\n loading: boolean = true;\n error?: string;\n readonly adminHome: string;\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private route: ActivatedRoute,\n private dbSchemaService: DatabaseSchemaService,\n @Inject(CRUD_EDITOR_ROUTES) editorRoutes: CrudEditorRoutes,\n ) {\n this.adminHome = editorRoutes.adminHome;\n }\n\n ngOnInit(): void {\n combineLatest([\n this.route.params,\n this.route.queryParams,\n this.dbSchemaService.GetDBSchema()\n ]).pipe(takeUntil(this.destroy$)).subscribe({\n next: ([params, queryParams, schema]) => {\n this.tableName = params['tableName'] || '';\n this.primaryKeyValue = params['id'] || '';\n this.returnUrl = queryParams['returnUrl'] || '';\n this.bindingStack = parseBindingStack(queryParams['ctx']);\n\n const tableSchema = schema.tables.find(t => t.table_name === this.tableName);\n if (!tableSchema) {\n this.error = `Table \"${this.tableName}\" not found`;\n this.loading = false;\n return;\n }\n\n this.tableFriendlyName = tableSchema.table_friendly_name || this.tableName;\n this.primaryKeyName = tableSchema.primary_key;\n this.columnNames = tableSchema.columns.map(c => c.column_name);\n this.loading = false;\n },\n error: (err) => {\n this.error = 'Failed to load schema';\n this.loading = false;\n console.error('Error loading schema:', err);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","@if (loading) {\n <div class=\"loading-container\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <p>Loading...</p>\n </div>\n}\n@if (!loading && error) {\n <div class=\"error-container\">\n <mat-icon>error</mat-icon>\n <p>{{ error }}</p>\n </div>\n}\n@if (!loading && !error) {\n <div class=\"edit-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din back-link\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold page-title\">Edit {{ tableFriendlyName }}</h1>\n <mat-card class=\"edit-card\">\n <mat-card-content>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [primaryKeyName]=\"primaryKeyName\"\n [primaryKeyValue]=\"primaryKeyValue\"\n [isCreateMode]=\"false\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\">\n </hw-composite-row-control>\n </mat-card-content>\n </mat-card>\n </div>\n}\n","import { Component, Inject, OnInit, OnDestroy } from '@angular/core';\n\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { Subject, takeUntil, combineLatest } from 'rxjs';\nimport { CompositeRowControlComponent } from '../composite-row-control/composite-row-control.component';\nimport { DatabaseSchemaService } from '../database-schema.service';\nimport { TableBinding, CrudFormAssist } from '@honuware/ui/access';\nimport { parseBindingStack } from '../table-binding.utils';\nimport { CRUD_EDITOR_ROUTES, CrudEditorRoutes } from '../crud-editor-routes';\n\n@Component({\n selector: 'hw-table-new-page',\n standalone: true,\n imports: [RouterModule, CompositeRowControlComponent],\n templateUrl: './table-new-page.component.html',\n styleUrls: ['./table-new-page.component.scss']\n})\nexport class TableNewPageComponent implements OnInit, OnDestroy {\n tableName: string = '';\n columnNames: string[] = [];\n tableFriendlyName: string = '';\n returnUrl: string = '';\n bindingStack: TableBinding[] = [];\n formAssist?: CrudFormAssist;\n loading: boolean = true;\n error?: string;\n readonly adminHome: string;\n\n private destroy$ = new Subject<void>();\n\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private dbSchemaService: DatabaseSchemaService,\n @Inject(CRUD_EDITOR_ROUTES) editorRoutes: CrudEditorRoutes,\n ) {\n this.adminHome = editorRoutes.adminHome;\n // Read formAssist from browser history state. Angular's router.navigate({ state })\n // stores data in the History API. getCurrentNavigation() is unreliable (returns null\n // for lazy-loaded routes), so we read directly from history.state instead.\n this.formAssist = history.state?.formAssist as CrudFormAssist | undefined;\n }\n\n ngOnInit(): void {\n combineLatest([\n this.route.params,\n this.route.queryParams,\n this.dbSchemaService.GetDBSchema()\n ]).pipe(takeUntil(this.destroy$)).subscribe({\n next: ([params, queryParams, schema]) => {\n this.tableName = params['tableName'] || '';\n this.returnUrl = queryParams['returnUrl'] || '';\n this.bindingStack = parseBindingStack(queryParams['ctx']);\n\n const tableSchema = schema.tables.find(t => t.table_name === this.tableName);\n if (!tableSchema) {\n this.error = `Table \"${this.tableName}\" not found`;\n this.loading = false;\n return;\n }\n\n this.tableFriendlyName = tableSchema.table_friendly_name || this.tableName;\n // Filter out primary key column for create mode (auto-generated)\n // Handle both boolean true and string \"t\" from server\n this.columnNames = tableSchema.columns\n .filter(c => c.primary_key !== true && (c.primary_key as unknown) !== 't')\n .map(c => c.column_name);\n this.loading = false;\n },\n error: (err) => {\n this.error = 'Failed to load schema';\n this.loading = false;\n console.error('Error loading schema:', err);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","@if (loading) {\n <div class=\"loading\">Loading...</div>\n}\n@if (!loading && error) {\n <div class=\"error\">{{ error }}</div>\n}\n@if (!loading && !error) {\n <div class=\"new-page-container\">\n <a [routerLink]=\"adminHome\" class=\"din back-link\">&larr; Back to admin portal</a>\n <h1 class=\"din-condensed-bold page-title\">New {{ tableFriendlyName }}</h1>\n <hw-composite-row-control\n [tableName]=\"tableName\"\n [columnNames]=\"columnNames\"\n [isCreateMode]=\"true\"\n [returnUrl]=\"returnUrl\"\n [bindingStack]=\"bindingStack\"\n [formAssist]=\"formAssist\">\n </hw-composite-row-control>\n </div>\n}\n","/*\n * @honuware/ui/crud — the generic table editor: DatabaseSchemaService, the\n * table-binding utils, the table-view / composite-row containers, the\n * TableView/Edit/New pages, and the CRUD_EDITOR_ROUTES config token. Sits on\n * top of foundation + access + auth + controls + photos. Selectors use `hw-`.\n */\nexport { DatabaseSchemaService } from './database-schema.service';\n\nexport { serializeBindingStack, parseBindingStack, deriveFilterPairs } from './table-binding.utils';\n\nexport { CRUD_EDITOR_ROUTES, DEFAULT_CRUD_EDITOR_ROUTES } from './crud-editor-routes';\nexport type { CrudEditorRoutes } from './crud-editor-routes';\n\nexport { TableViewControlComponent } from './table-view-control/table-view-control.component';\nexport { CompositeRowControlComponent } from './composite-row-control/composite-row-control.component';\nexport type { ChildTableReference } from './composite-row-control/composite-row-control.component';\n\nexport { TableViewPageComponent } from './table-view-page/table-view-page.component';\nexport { TableEditPageComponent } from './table-edit-page/table-edit-page.component';\nexport { TableNewPageComponent } from './table-new-page/table-new-page.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DatabaseSchemaService","i3","i7","i2","i4","i5","i1"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@honuware/ui",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Reusable, brand-free Angular UI + server-access framework.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Mason Bendixen",