@rolatech/angular-user 20.2.6-beta.1 → 20.2.7-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -57,10 +57,10 @@ class AgentApplicationDetailComponent extends BaseComponent {
57
57
  },
58
58
  });
59
59
  }
60
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AgentApplicationDetailComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
61
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: AgentApplicationDetailComponent, isStandalone: true, selector: "rolatech-agent-application-detail", usesInheritance: true, ngImport: i0, template: "<rolatech-container>\n <rolatech-toolbar title=\"My application\" large>\n <div class=\"text-lg font-bold\">\n {{ applicationStatus[application.status] }}\n </div>\n </rolatech-toolbar>\n\n <div>\n <hr class=\"my-3\" />\n <div>\n <div class=\"text-lg font-bold py-2\" i18n>Application details</div>\n <div class=\"flex overflow-x-scroll scrollbar-hide\">\n <div class=\"flex flex-col w-full\">\n <rolatech-rich-label label=\"FirstName\" [title]=\"application.firstName\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Email\" [title]=\"application.email\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Phone\" [title]=\"application.phone\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Business Name\" [title]=\"application.businessName\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Experience Years\" [title]=\"application.experienceYears\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Created At\" [title]=\"application.createdAt\"></rolatech-rich-label>\n </div>\n </div>\n <hr class=\"my-3\" />\n </div>\n <div>\n <div class=\"text-lg font-bold py-2\" i18n>Documents</div>\n @if (application.documents?.length > 0) {\n @for (item of application.documents; track $index) {\n <a class=\"underline underline-offset-4\" [href]=\"item\" target=\"_blank\">Document: {{ $index + 1 }}</a>\n }\n } @else {\n <rolatech-empty></rolatech-empty>\n }\n </div>\n </div>\n</rolatech-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ContainerComponent, selector: "rolatech-container" }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "component", type: RichLabelComponent, selector: "rolatech-rich-label", inputs: ["label", "title"] }, { kind: "component", type: EmptyComponent, selector: "rolatech-empty" }] });
60
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AgentApplicationDetailComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
61
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: AgentApplicationDetailComponent, isStandalone: true, selector: "rolatech-agent-application-detail", usesInheritance: true, ngImport: i0, template: "<rolatech-container>\n <rolatech-toolbar title=\"My application\" large>\n <div class=\"text-lg font-bold\">\n {{ applicationStatus[application.status] }}\n </div>\n </rolatech-toolbar>\n\n <div>\n <hr class=\"my-3\" />\n <div>\n <div class=\"text-lg font-bold py-2\" i18n>Application details</div>\n <div class=\"flex overflow-x-scroll scrollbar-hide\">\n <div class=\"flex flex-col w-full\">\n <rolatech-rich-label label=\"FirstName\" [title]=\"application.firstName\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Email\" [title]=\"application.email\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Phone\" [title]=\"application.phone\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Business Name\" [title]=\"application.businessName\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Experience Years\" [title]=\"application.experienceYears\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Created At\" [title]=\"application.createdAt\"></rolatech-rich-label>\n </div>\n </div>\n <hr class=\"my-3\" />\n </div>\n <div>\n <div class=\"text-lg font-bold py-2\" i18n>Documents</div>\n @if (application.documents?.length > 0) {\n @for (item of application.documents; track $index) {\n <a class=\"underline underline-offset-4\" [href]=\"item\" target=\"_blank\">Document: {{ $index + 1 }}</a>\n }\n } @else {\n <rolatech-empty></rolatech-empty>\n }\n </div>\n </div>\n</rolatech-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ContainerComponent, selector: "rolatech-container" }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "component", type: RichLabelComponent, selector: "rolatech-rich-label", inputs: ["label", "title"] }, { kind: "component", type: EmptyComponent, selector: "rolatech-empty" }] });
62
62
  }
63
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AgentApplicationDetailComponent, decorators: [{
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AgentApplicationDetailComponent, decorators: [{
64
64
  type: Component,
65
65
  args: [{ selector: 'rolatech-agent-application-detail', imports: [CommonModule, ContainerComponent, ToolbarComponent, RichLabelComponent, EmptyComponent], template: "<rolatech-container>\n <rolatech-toolbar title=\"My application\" large>\n <div class=\"text-lg font-bold\">\n {{ applicationStatus[application.status] }}\n </div>\n </rolatech-toolbar>\n\n <div>\n <hr class=\"my-3\" />\n <div>\n <div class=\"text-lg font-bold py-2\" i18n>Application details</div>\n <div class=\"flex overflow-x-scroll scrollbar-hide\">\n <div class=\"flex flex-col w-full\">\n <rolatech-rich-label label=\"FirstName\" [title]=\"application.firstName\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Email\" [title]=\"application.email\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Phone\" [title]=\"application.phone\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Business Name\" [title]=\"application.businessName\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Experience Years\" [title]=\"application.experienceYears\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Created At\" [title]=\"application.createdAt\"></rolatech-rich-label>\n </div>\n </div>\n <hr class=\"my-3\" />\n </div>\n <div>\n <div class=\"text-lg font-bold py-2\" i18n>Documents</div>\n @if (application.documents?.length > 0) {\n @for (item of application.documents; track $index) {\n <a class=\"underline underline-offset-4\" [href]=\"item\" target=\"_blank\">Document: {{ $index + 1 }}</a>\n }\n } @else {\n <rolatech-empty></rolatech-empty>\n }\n </div>\n </div>\n</rolatech-container>\n" }]
66
66
  }] });
@@ -119,10 +119,10 @@ class AgentApplicationComponent extends BaseComponent {
119
119
  },
120
120
  });
121
121
  }
122
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AgentApplicationComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
123
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: AgentApplicationComponent, isStandalone: true, selector: "rolatech-agent-application", usesInheritance: true, ngImport: i0, template: "<section id=\"application\" class=\"p-10\">\n <h2 class=\"text-2xl font-semibold text-center mb-6\">Agent Application Form</h2>\n <form class=\"max-w-2xl mx-auto space-y-4\" (submit)=\"submitApplication()\">\n <mat-form-field class=\"w-full\">\n <mat-label>First Name</mat-label>\n <input matInput [(ngModel)]=\"application.firstName\" name=\"firstName\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Last Name</mat-label>\n <input matInput [(ngModel)]=\"application.lastName\" name=\"lastName\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Email Address</mat-label>\n <input matInput [(ngModel)]=\"application.email\" name=\"email\" type=\"email\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Phone Number</mat-label>\n <input matInput [(ngModel)]=\"application.phone\" name=\"phone\" type=\"tel\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Business Name</mat-label>\n <input matInput [(ngModel)]=\"application.businessName\" name=\"businessName\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>WebSite</mat-label>\n <input matInput [(ngModel)]=\"application.website\" name=\"website\" />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Experience Years</mat-label>\n <input matInput [(ngModel)]=\"application.experienceYears\" name=\"experienceYears\" required />\n </mat-form-field>\n\n <div>\n <div class=\"mb-2\">\n <div class=\"text-xl font-bold\" i18n>Upload Certification (PDF)</div>\n <div class=\"text-sm opacity-70\" i18n>Safeagent, UKALA, or Propertymark certification</div>\n </div>\n <input type=\"file\" (change)=\"onFileSelected($event)\" accept=\".pdf\" required />\n </div>\n\n <button mat-flat-button type=\"submit\" [disabled]=\"sending\">\n <span style=\"display: flex; align-items: center\">\n @if (sending) {\n <mat-progress-spinner diameter=\"20\" mode=\"indeterminate\" [style.marginRight.px]=\"8\"></mat-progress-spinner>\n }\n {{ sending ? 'Requesting...' : 'Submit Application' }}\n </span>\n </button>\n <!-- <button mat-flat-button type=\"submit\">Submit Application</button> -->\n </form>\n</section>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.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: FormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.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: MatProgressSpinnerModule }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] });
122
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AgentApplicationComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
123
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: AgentApplicationComponent, isStandalone: true, selector: "rolatech-agent-application", usesInheritance: true, ngImport: i0, template: "<section id=\"application\" class=\"p-10\">\n <h2 class=\"text-2xl font-semibold text-center mb-6\">Agent Application Form</h2>\n <form class=\"max-w-2xl mx-auto space-y-4\" (submit)=\"submitApplication()\">\n <mat-form-field class=\"w-full\">\n <mat-label>First Name</mat-label>\n <input matInput [(ngModel)]=\"application.firstName\" name=\"firstName\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Last Name</mat-label>\n <input matInput [(ngModel)]=\"application.lastName\" name=\"lastName\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Email Address</mat-label>\n <input matInput [(ngModel)]=\"application.email\" name=\"email\" type=\"email\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Phone Number</mat-label>\n <input matInput [(ngModel)]=\"application.phone\" name=\"phone\" type=\"tel\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Business Name</mat-label>\n <input matInput [(ngModel)]=\"application.businessName\" name=\"businessName\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>WebSite</mat-label>\n <input matInput [(ngModel)]=\"application.website\" name=\"website\" />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Experience Years</mat-label>\n <input matInput [(ngModel)]=\"application.experienceYears\" name=\"experienceYears\" required />\n </mat-form-field>\n\n <div>\n <div class=\"mb-2\">\n <div class=\"text-xl font-bold\" i18n>Upload Certification (PDF)</div>\n <div class=\"text-sm opacity-70\" i18n>Safeagent, UKALA, or Propertymark certification</div>\n </div>\n <input type=\"file\" (change)=\"onFileSelected($event)\" accept=\".pdf\" required />\n </div>\n\n <button mat-flat-button type=\"submit\" [disabled]=\"sending\">\n <span style=\"display: flex; align-items: center\">\n @if (sending) {\n <mat-progress-spinner diameter=\"20\" mode=\"indeterminate\" [style.marginRight.px]=\"8\"></mat-progress-spinner>\n }\n {{ sending ? 'Requesting...' : 'Submit Application' }}\n </span>\n </button>\n <!-- <button mat-flat-button type=\"submit\">Submit Application</button> -->\n </form>\n</section>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.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: FormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.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: MatProgressSpinnerModule }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] });
124
124
  }
125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AgentApplicationComponent, decorators: [{
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AgentApplicationComponent, decorators: [{
126
126
  type: Component,
127
127
  args: [{ selector: 'rolatech-agent-application', imports: [CommonModule, MatFormFieldModule, MatInputModule, FormsModule, MatButtonModule, MatProgressSpinnerModule], template: "<section id=\"application\" class=\"p-10\">\n <h2 class=\"text-2xl font-semibold text-center mb-6\">Agent Application Form</h2>\n <form class=\"max-w-2xl mx-auto space-y-4\" (submit)=\"submitApplication()\">\n <mat-form-field class=\"w-full\">\n <mat-label>First Name</mat-label>\n <input matInput [(ngModel)]=\"application.firstName\" name=\"firstName\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Last Name</mat-label>\n <input matInput [(ngModel)]=\"application.lastName\" name=\"lastName\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Email Address</mat-label>\n <input matInput [(ngModel)]=\"application.email\" name=\"email\" type=\"email\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Phone Number</mat-label>\n <input matInput [(ngModel)]=\"application.phone\" name=\"phone\" type=\"tel\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Business Name</mat-label>\n <input matInput [(ngModel)]=\"application.businessName\" name=\"businessName\" required />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>WebSite</mat-label>\n <input matInput [(ngModel)]=\"application.website\" name=\"website\" />\n </mat-form-field>\n\n <mat-form-field class=\"w-full\">\n <mat-label>Experience Years</mat-label>\n <input matInput [(ngModel)]=\"application.experienceYears\" name=\"experienceYears\" required />\n </mat-form-field>\n\n <div>\n <div class=\"mb-2\">\n <div class=\"text-xl font-bold\" i18n>Upload Certification (PDF)</div>\n <div class=\"text-sm opacity-70\" i18n>Safeagent, UKALA, or Propertymark certification</div>\n </div>\n <input type=\"file\" (change)=\"onFileSelected($event)\" accept=\".pdf\" required />\n </div>\n\n <button mat-flat-button type=\"submit\" [disabled]=\"sending\">\n <span style=\"display: flex; align-items: center\">\n @if (sending) {\n <mat-progress-spinner diameter=\"20\" mode=\"indeterminate\" [style.marginRight.px]=\"8\"></mat-progress-spinner>\n }\n {{ sending ? 'Requesting...' : 'Submit Application' }}\n </span>\n </button>\n <!-- <button mat-flat-button type=\"submit\">Submit Application</button> -->\n </form>\n</section>\n" }]
128
128
  }] });
@@ -131,10 +131,10 @@ class UserNamePipe {
131
131
  transform(user) {
132
132
  return userDisplayName$1(user);
133
133
  }
134
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserNamePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
135
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.0", ngImport: i0, type: UserNamePipe, isStandalone: true, name: "userName" });
134
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserNamePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
135
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: UserNamePipe, isStandalone: true, name: "userName" });
136
136
  }
137
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserNamePipe, decorators: [{
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserNamePipe, decorators: [{
138
138
  type: Pipe,
139
139
  args: [{
140
140
  name: 'userName',
@@ -146,10 +146,10 @@ class UserInitialsPipe {
146
146
  transform(user) {
147
147
  return userInitials$1(user);
148
148
  }
149
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserInitialsPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
150
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.0", ngImport: i0, type: UserInitialsPipe, isStandalone: true, name: "userInitials" });
149
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserInitialsPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
150
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: UserInitialsPipe, isStandalone: true, name: "userInitials" });
151
151
  }
152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserInitialsPipe, decorators: [{
152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserInitialsPipe, decorators: [{
153
153
  type: Pipe,
154
154
  args: [{
155
155
  name: 'userInitials',
@@ -161,10 +161,10 @@ class UserAvatarPipe {
161
161
  transform(user) {
162
162
  return userAvatarUrl$1(user);
163
163
  }
164
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserAvatarPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
165
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.0", ngImport: i0, type: UserAvatarPipe, isStandalone: true, name: "userAvatar" });
164
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserAvatarPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
165
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: UserAvatarPipe, isStandalone: true, name: "userAvatar" });
166
166
  }
167
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserAvatarPipe, decorators: [{
167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserAvatarPipe, decorators: [{
168
168
  type: Pipe,
169
169
  args: [{
170
170
  name: 'userAvatar',
@@ -177,10 +177,10 @@ class UserSincePipe {
177
177
  const d = parseUserDateTime$1(user?.createdAt);
178
178
  return d ? new Intl.DateTimeFormat(undefined, format).format(d) : '—';
179
179
  }
180
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserSincePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
181
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.0", ngImport: i0, type: UserSincePipe, isStandalone: true, name: "userSince" });
180
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserSincePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
181
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: UserSincePipe, isStandalone: true, name: "userSince" });
182
182
  }
183
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserSincePipe, decorators: [{
183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserSincePipe, decorators: [{
184
184
  type: Pipe,
185
185
  args: [{
186
186
  name: 'userSince',
@@ -224,10 +224,10 @@ class UserRolesPipe {
224
224
  transform(user) {
225
225
  return userRoleNames(user);
226
226
  }
227
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserRolesPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
228
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.0", ngImport: i0, type: UserRolesPipe, isStandalone: true, name: "userRoles" });
227
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserRolesPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
228
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: UserRolesPipe, isStandalone: true, name: "userRoles" });
229
229
  }
230
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserRolesPipe, decorators: [{
230
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserRolesPipe, decorators: [{
231
231
  type: Pipe,
232
232
  args: [{ name: 'userRoles', standalone: true, pure: true }]
233
233
  }] });
@@ -235,10 +235,10 @@ class TakePipe {
235
235
  transform(arr, count = 2) {
236
236
  return (arr ?? []).slice(0, Math.max(0, count));
237
237
  }
238
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: TakePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
239
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.0", ngImport: i0, type: TakePipe, isStandalone: true, name: "take" });
238
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TakePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
239
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: TakePipe, isStandalone: true, name: "take" });
240
240
  }
241
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: TakePipe, decorators: [{
241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TakePipe, decorators: [{
242
242
  type: Pipe,
243
243
  args: [{ name: 'take', standalone: true, pure: true }]
244
244
  }] });
@@ -246,10 +246,10 @@ class SkipPipe {
246
246
  transform(arr, count = 2) {
247
247
  return (arr ?? []).slice(Math.max(0, count));
248
248
  }
249
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: SkipPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
250
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.0", ngImport: i0, type: SkipPipe, isStandalone: true, name: "skip" });
249
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: SkipPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
250
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: SkipPipe, isStandalone: true, name: "skip" });
251
251
  }
252
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: SkipPipe, decorators: [{
252
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: SkipPipe, decorators: [{
253
253
  type: Pipe,
254
254
  args: [{ name: 'skip', standalone: true, pure: true }]
255
255
  }] });
@@ -258,10 +258,10 @@ class MoreCountPipe {
258
258
  const len = (arr ?? []).length;
259
259
  return Math.max(0, len - Math.max(0, shown));
260
260
  }
261
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: MoreCountPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
262
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.0", ngImport: i0, type: MoreCountPipe, isStandalone: true, name: "moreCount" });
261
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: MoreCountPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
262
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: MoreCountPipe, isStandalone: true, name: "moreCount" });
263
263
  }
264
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: MoreCountPipe, decorators: [{
264
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: MoreCountPipe, decorators: [{
265
265
  type: Pipe,
266
266
  args: [{ name: 'moreCount', standalone: true, pure: true }]
267
267
  }] });
@@ -379,10 +379,10 @@ class UserIndexComponent extends BaseComponent {
379
379
  console.log('resetPassword', u.id);
380
380
  }
381
381
  trackById = (_, u) => u.id;
382
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserIndexComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
383
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: UserIndexComponent, isStandalone: true, selector: "rolatech-user-index", usesInheritance: true, ngImport: i0, template: "<div class=\"p-4 space-y-4\">\n <!-- Header -->\n <div class=\"flex items-start justify-between gap-4\">\n <div>\n <h1 class=\"text-2xl font-semibold\">Users</h1>\n <p class=\"text-sm opacity-70\">Manage users, roles, and access.</p>\n </div>\n\n <div class=\"flex items-center gap-2\">\n <button mat-stroked-button>\n <mat-icon>person_add</mat-icon>\n Invite\n </button>\n </div>\n </div>\n\n <!-- Filters -->\n <!-- <div class=\"grid grid-cols-1 md:grid-cols-12 gap-3\">\n <mat-form-field class=\"md:col-span-6 w-full\">\n <mat-label>Search</mat-label>\n <input matInput [value]=\"q()\" (input)=\"onSearchInput(($any($event.target)).value)\" placeholder=\"Name, email, username\" />\n </mat-form-field>\n\n <mat-form-field class=\"md:col-span-3 w-full\">\n <mat-label>Status</mat-label>\n <mat-select [value]=\"status()\" (valueChange)=\"status.set($event); page.set(0)\">\n <mat-option value=\"\">All</mat-option>\n <mat-option value=\"ACTIVE\">Active</mat-option>\n <mat-option value=\"DISABLED\">Disabled</mat-option>\n <mat-option value=\"LOCKED\">Locked</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"md:col-span-3 w-full\">\n <mat-label>Role</mat-label>\n <mat-select [value]=\"role()\" (valueChange)=\"role.set($event); page.set(0)\">\n <mat-option value=\"\">All</mat-option>\n @for (r of roles(); track r) {\n <mat-option [value]=\"r\">{{ r }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n </div> -->\n\n <!-- Table card -->\n <div class=\"rounded-2xl border border-[--rt-border-color] bg-[--rt-base-background] overflow-hidden\">\n <div class=\"px-5 py-4 border-b border-[--rt-border-color] flex items-center justify-between\">\n <div class=\"font-semibold\">All users</div>\n <div class=\"text-sm opacity-70\">Total: {{ length }}</div>\n </div>\n\n <div class=\"overflow-auto\">\n <table class=\"w-full text-sm\">\n <thead class=\"bg-black/5 text-left\">\n <tr>\n <th class=\"p-4 min-w-[280px]\">User</th>\n <th class=\"p-4 min-w-[220px]\">Email</th>\n <th class=\"p-4 min-w-[220px] hidden md:table-cell\">Roles</th>\n <th class=\"p-4 min-w-[120px] hidden lg:table-cell\">Status</th>\n <th class=\"p-3 min-w-[140px] hidden lg:table-cell\">Since</th>\n <th class=\"p-3 w-[120px]\"></th>\n </tr>\n </thead>\n\n <tbody>\n @if (loading) {\n @for (_ of [1, 2, 3, 4, 5, 6, 7, 8]; track _) {\n <tr class=\"border-t border-[--rt-border-color]\">\n <td class=\"p-3\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 rounded-full bg-black/10\"></div>\n <div class=\"space-y-2\">\n <div class=\"w-44 h-4 bg-black/10 rounded\"></div>\n <div class=\"w-28 h-3 bg-black/10 rounded\"></div>\n </div>\n </div>\n </td>\n <td class=\"p-3\"><div class=\"w-56 h-4 bg-black/10 rounded\"></div></td>\n <td class=\"p-3 hidden md:table-cell\"><div class=\"w-40 h-4 bg-black/10 rounded\"></div></td>\n <td class=\"p-3 hidden lg:table-cell\"><div class=\"w-20 h-4 bg-black/10 rounded\"></div></td>\n <td class=\"p-3 hidden lg:table-cell\"><div class=\"w-24 h-4 bg-black/10 rounded\"></div></td>\n <td class=\"p-3 text-right\"><div class=\"w-16 h-8 bg-black/10 rounded ml-auto\"></div></td>\n </tr>\n }\n } @else {\n @if (users().length === 0) {\n <tr class=\"border-t\">\n <td class=\"p-6 text-sm opacity-70\" colspan=\"6\">No users found.</td>\n </tr>\n } @else {\n @for (u of users(); track u.id) {\n <tr class=\"border-t border-[--rt-border-color] hover:bg-black/5 cursor-pointer\" (click)=\"openUser(u.id!)\">\n <!-- User -->\n <td class=\"p-3\">\n <div class=\"flex items-center gap-3 min-w-0\">\n <div class=\"relative\">\n @if (u | userAvatar; as avatar) {\n <img class=\"w-10 h-10 rounded-full object-cover border\" [src]=\"avatar\" alt=\"avatar\" />\n } @else {\n <div\n class=\"w-10 h-10 rounded-full border bg-[--rt-brand-color] text-white flex items-center justify-center font-semibold\"\n >\n {{ u | userInitials }}\n </div>\n }\n\n <span\n class=\"absolute -right-0 -bottom-0 w-3 h-3 rounded-full border border-[--rt-border-color] bg-[--rt-base-background] flex items-center justify-center\"\n >\n <span\n class=\"w-2 h-2 rounded-full\"\n [class]=\"\n u.status.toString() === 'ACTIVE'\n ? 'bg-green-500'\n : u.status.toString() === 'LOCKED'\n ? 'bg-red-500'\n : 'bg-amber-500'\n \"\n ></span>\n </span>\n </div>\n\n <div class=\"min-w-0\">\n <div class=\"font-medium truncate\">{{ u | userName }}</div>\n <div class=\"text-xs opacity-70 truncate\">&#64;{{ u.username }}</div>\n </div>\n </div>\n </td>\n\n <!-- Email -->\n <td class=\"p-3\">\n <div class=\"truncate\">{{ u?.email ?? '\u2014' }}</div>\n </td>\n\n <!-- Roles -->\n <td class=\"p-3 hidden md:table-cell\" (click)=\"$event.stopPropagation()\">\n @let roles = u | userRoles;\n @let shown = 2;\n\n <div class=\"flex flex-wrap items-center gap-1.5\">\n @for (r of roles | take: shown; track r) {\n <span class=\"px-2 py-0.5 rounded-full text-xs bg-black/5 border border-[--rt-border-color]\">\n {{ r }}\n </span>\n }\n\n @if ((roles | moreCount: shown) > 0) {\n <button mat-button class=\"!min-w-0 !h-6 !px-2 !text-xs\" [matMenuTriggerFor]=\"rolesMenu\">\n +{{ roles | moreCount: shown }}\n </button>\n\n <mat-menu #rolesMenu=\"matMenu\">\n @for (r of roles; track r) {\n <button mat-menu-item disabled>{{ r }}</button>\n }\n </mat-menu>\n }\n </div>\n </td>\n\n <!-- Status -->\n <td class=\"p-3 hidden lg:table-cell\">\n <span\n class=\"px-2 py-0.5 rounded-full text-xs border border-[--rt-border-color]\"\n [class]=\"\n u.status.toString() === 'ACTIVE'\n ? 'bg-green-500/10 text-green-700 border-green-500/20'\n : u.status.toString() === 'LOCKED'\n ? 'bg-red-500/10 text-red-700 border-red-500/20'\n : 'bg-amber-500/10 text-amber-700 border-amber-500/20'\n \"\n >\n {{ u?.status ?? '\u2014' }}\n </span>\n </td>\n\n <!-- Since -->\n <td class=\"p-3 hidden lg:table-cell opacity-80\">\n {{ u | userSince }}\n </td>\n\n <!-- Actions -->\n <td class=\"p-3 text-right\" (click)=\"$event.stopPropagation()\">\n <button mat-button [matMenuTriggerFor]=\"menu\">Actions</button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"openUser(u.id!)\">\n <mat-icon>open_in_new</mat-icon>\n <span>View</span>\n </button>\n <button mat-menu-item (click)=\"toggleStatus(u)\">\n <mat-icon>{{ u.status.toString() === 'ACTIVE' ? 'block' : 'check_circle' }}</mat-icon>\n <span>{{ u.status.toString() === 'ACTIVE' ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"resetPassword(u)\">\n <mat-icon>vpn_key</mat-icon>\n <span>Reset password</span>\n </button>\n </mat-menu>\n </td>\n </tr>\n }\n }\n }\n </tbody>\n </table>\n </div>\n\n <!-- Footer paginator -->\n <div class=\"px-2 py-2 border-t border-[--rt-border-color]\">\n <mat-paginator\n #paginator\n [length]=\"length\"\n [pageSize]=\"pageSize\"\n [pageIndex]=\"pageIndex()\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPage($event)\"\n hidePageSize\n showFirstLastButtons\n >\n </mat-paginator>\n </div>\n </div>\n</div>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i1$1.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.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: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: AngularCommonModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "pipe", type: UserInitialsPipe, name: "userInitials" }, { kind: "pipe", type: UserAvatarPipe, name: "userAvatar" }, { kind: "pipe", type: UserNamePipe, name: "userName" }, { kind: "pipe", type: UserSincePipe, name: "userSince" }, { kind: "pipe", type: UserRolesPipe, name: "userRoles" }, { kind: "pipe", type: TakePipe, name: "take" }, { kind: "pipe", type: MoreCountPipe, name: "moreCount" }] });
382
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserIndexComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
383
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: UserIndexComponent, isStandalone: true, selector: "rolatech-user-index", usesInheritance: true, ngImport: i0, template: "<div class=\"p-4 space-y-4\">\n <!-- Header -->\n <div class=\"flex items-start justify-between gap-4\">\n <div>\n <h1 class=\"text-2xl font-semibold\">Users</h1>\n <p class=\"text-sm opacity-70\">Manage users, roles, and access.</p>\n </div>\n\n <div class=\"flex items-center gap-2\">\n <button mat-stroked-button>\n <mat-icon>person_add</mat-icon>\n Invite\n </button>\n </div>\n </div>\n\n <!-- Filters -->\n <!-- <div class=\"grid grid-cols-1 md:grid-cols-12 gap-3\">\n <mat-form-field class=\"md:col-span-6 w-full\">\n <mat-label>Search</mat-label>\n <input matInput [value]=\"q()\" (input)=\"onSearchInput(($any($event.target)).value)\" placeholder=\"Name, email, username\" />\n </mat-form-field>\n\n <mat-form-field class=\"md:col-span-3 w-full\">\n <mat-label>Status</mat-label>\n <mat-select [value]=\"status()\" (valueChange)=\"status.set($event); page.set(0)\">\n <mat-option value=\"\">All</mat-option>\n <mat-option value=\"ACTIVE\">Active</mat-option>\n <mat-option value=\"DISABLED\">Disabled</mat-option>\n <mat-option value=\"LOCKED\">Locked</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"md:col-span-3 w-full\">\n <mat-label>Role</mat-label>\n <mat-select [value]=\"role()\" (valueChange)=\"role.set($event); page.set(0)\">\n <mat-option value=\"\">All</mat-option>\n @for (r of roles(); track r) {\n <mat-option [value]=\"r\">{{ r }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n </div> -->\n\n <!-- Table card -->\n <div class=\"rounded-2xl border border-[--rt-border-color] bg-[--rt-base-background] overflow-hidden\">\n <div class=\"px-5 py-4 border-b border-[--rt-border-color] flex items-center justify-between\">\n <div class=\"font-semibold\">All users</div>\n <div class=\"text-sm opacity-70\">Total: {{ length }}</div>\n </div>\n\n <div class=\"overflow-auto\">\n <table class=\"w-full text-sm\">\n <thead class=\"bg-black/5 text-left\">\n <tr>\n <th class=\"p-4 min-w-[280px]\">User</th>\n <th class=\"p-4 min-w-[220px]\">Email</th>\n <th class=\"p-4 min-w-[220px] hidden md:table-cell\">Roles</th>\n <th class=\"p-4 min-w-[120px] hidden lg:table-cell\">Status</th>\n <th class=\"p-3 min-w-[140px] hidden lg:table-cell\">Since</th>\n <th class=\"p-3 w-[120px]\"></th>\n </tr>\n </thead>\n\n <tbody>\n @if (loading) {\n @for (_ of [1, 2, 3, 4, 5, 6, 7, 8]; track _) {\n <tr class=\"border-t border-[--rt-border-color]\">\n <td class=\"p-3\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 rounded-full bg-black/10\"></div>\n <div class=\"space-y-2\">\n <div class=\"w-44 h-4 bg-black/10 rounded\"></div>\n <div class=\"w-28 h-3 bg-black/10 rounded\"></div>\n </div>\n </div>\n </td>\n <td class=\"p-3\"><div class=\"w-56 h-4 bg-black/10 rounded\"></div></td>\n <td class=\"p-3 hidden md:table-cell\"><div class=\"w-40 h-4 bg-black/10 rounded\"></div></td>\n <td class=\"p-3 hidden lg:table-cell\"><div class=\"w-20 h-4 bg-black/10 rounded\"></div></td>\n <td class=\"p-3 hidden lg:table-cell\"><div class=\"w-24 h-4 bg-black/10 rounded\"></div></td>\n <td class=\"p-3 text-right\"><div class=\"w-16 h-8 bg-black/10 rounded ml-auto\"></div></td>\n </tr>\n }\n } @else {\n @if (users().length === 0) {\n <tr class=\"border-t\">\n <td class=\"p-6 text-sm opacity-70\" colspan=\"6\">No users found.</td>\n </tr>\n } @else {\n @for (u of users(); track u.id) {\n <tr class=\"border-t border-[--rt-border-color] hover:bg-black/5 cursor-pointer\" (click)=\"openUser(u.id!)\">\n <!-- User -->\n <td class=\"p-3\">\n <div class=\"flex items-center gap-3 min-w-0\">\n <div class=\"relative\">\n @if (u | userAvatar; as avatar) {\n <img class=\"w-10 h-10 rounded-full object-cover border\" [src]=\"avatar\" alt=\"avatar\" />\n } @else {\n <div\n class=\"w-10 h-10 rounded-full border bg-[--rt-brand-color] text-white flex items-center justify-center font-semibold\"\n >\n {{ u | userInitials }}\n </div>\n }\n\n <span\n class=\"absolute -right-0 -bottom-0 w-3 h-3 rounded-full border border-[--rt-border-color] bg-[--rt-base-background] flex items-center justify-center\"\n >\n <span\n class=\"w-2 h-2 rounded-full\"\n [class]=\"\n u.status.toString() === 'ACTIVE'\n ? 'bg-green-500'\n : u.status.toString() === 'LOCKED'\n ? 'bg-red-500'\n : 'bg-amber-500'\n \"\n ></span>\n </span>\n </div>\n\n <div class=\"min-w-0\">\n <div class=\"font-medium truncate\">{{ u | userName }}</div>\n <div class=\"text-xs opacity-70 truncate\">&#64;{{ u.username }}</div>\n </div>\n </div>\n </td>\n\n <!-- Email -->\n <td class=\"p-3\">\n <div class=\"truncate\">{{ u?.email ?? '\u2014' }}</div>\n </td>\n\n <!-- Roles -->\n <td class=\"p-3 hidden md:table-cell\" (click)=\"$event.stopPropagation()\">\n @let roles = u | userRoles;\n @let shown = 2;\n\n <div class=\"flex flex-wrap items-center gap-1.5\">\n @for (r of roles | take: shown; track r) {\n <span class=\"px-2 py-0.5 rounded-full text-xs bg-black/5 border border-[--rt-border-color]\">\n {{ r }}\n </span>\n }\n\n @if ((roles | moreCount: shown) > 0) {\n <button mat-button class=\"!min-w-0 !h-6 !px-2 !text-xs\" [matMenuTriggerFor]=\"rolesMenu\">\n +{{ roles | moreCount: shown }}\n </button>\n\n <mat-menu #rolesMenu=\"matMenu\">\n @for (r of roles; track r) {\n <button mat-menu-item disabled>{{ r }}</button>\n }\n </mat-menu>\n }\n </div>\n </td>\n\n <!-- Status -->\n <td class=\"p-3 hidden lg:table-cell\">\n <span\n class=\"px-2 py-0.5 rounded-full text-xs border border-[--rt-border-color]\"\n [class]=\"\n u.status.toString() === 'ACTIVE'\n ? 'bg-green-500/10 text-green-700 border-green-500/20'\n : u.status.toString() === 'LOCKED'\n ? 'bg-red-500/10 text-red-700 border-red-500/20'\n : 'bg-amber-500/10 text-amber-700 border-amber-500/20'\n \"\n >\n {{ u?.status ?? '\u2014' }}\n </span>\n </td>\n\n <!-- Since -->\n <td class=\"p-3 hidden lg:table-cell opacity-80\">\n {{ u | userSince }}\n </td>\n\n <!-- Actions -->\n <td class=\"p-3 text-right\" (click)=\"$event.stopPropagation()\">\n <button mat-button [matMenuTriggerFor]=\"menu\">Actions</button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"openUser(u.id!)\">\n <mat-icon>open_in_new</mat-icon>\n <span>View</span>\n </button>\n <button mat-menu-item (click)=\"toggleStatus(u)\">\n <mat-icon>{{ u.status.toString() === 'ACTIVE' ? 'block' : 'check_circle' }}</mat-icon>\n <span>{{ u.status.toString() === 'ACTIVE' ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"resetPassword(u)\">\n <mat-icon>vpn_key</mat-icon>\n <span>Reset password</span>\n </button>\n </mat-menu>\n </td>\n </tr>\n }\n }\n }\n </tbody>\n </table>\n </div>\n\n <!-- Footer paginator -->\n <div class=\"px-2 py-2 border-t border-[--rt-border-color]\">\n <mat-paginator\n #paginator\n [length]=\"length\"\n [pageSize]=\"pageSize\"\n [pageIndex]=\"pageIndex()\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPage($event)\"\n hidePageSize\n showFirstLastButtons\n >\n </mat-paginator>\n </div>\n </div>\n</div>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i1$1.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.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: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: AngularCommonModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "pipe", type: UserInitialsPipe, name: "userInitials" }, { kind: "pipe", type: UserAvatarPipe, name: "userAvatar" }, { kind: "pipe", type: UserNamePipe, name: "userName" }, { kind: "pipe", type: UserSincePipe, name: "userSince" }, { kind: "pipe", type: UserRolesPipe, name: "userRoles" }, { kind: "pipe", type: TakePipe, name: "take" }, { kind: "pipe", type: MoreCountPipe, name: "moreCount" }] });
384
384
  }
385
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserIndexComponent, decorators: [{
385
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserIndexComponent, decorators: [{
386
386
  type: Component,
387
387
  args: [{ selector: 'rolatech-user-index', imports: [
388
388
  CommonModule,
@@ -465,10 +465,10 @@ class AgentManageApplicationDetailComponent extends BaseComponent {
465
465
  }
466
466
  });
467
467
  }
468
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AgentManageApplicationDetailComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
469
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: AgentManageApplicationDetailComponent, isStandalone: true, selector: "rolatech-agent-manage-application-detail", usesInheritance: true, ngImport: i0, template: "@if (application) {\n <rolatech-toolbar [title]=\"status[application.status]\" large link=\"../../\">\n @if (application.status.toString() === 'PENDING') {\n <button mat-flat-button (click)=\"approve()\" i18n>Approve</button>\n <button mat-button (click)=\"reject()\" i18n>Reject</button>\n }\n </rolatech-toolbar>\n <div class=\"px-4\">\n <div>\n <div class=\"text-lg font-bold py-2\">User details</div>\n <div class=\"flex\">\n <div class=\"bg-[--rt-brand-color] min-w-12 max-h-12 rounded-full mr-3\">\n @if (application.user.avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"application.user.avatar\" alt=\"avatar img\" />\n }\n </div>\n <div class=\"flex flex-col w-full\">\n @if (application.user.firstName) {\n <div>{{ application.user.firstName }}, {{ application.user.lastName }}</div>\n } @else {\n @if (application.user.name) {\n <div>{{ application.user.name }}</div>\n }\n }\n <div class=\"inline-flex gap-1 mt-2\">\n <div>\n <span i18n>Phone: </span>\n <span class=\"mr-1\">{{ application.phone }}</span>\n </div>\n <div>\n <span i18n>Email: </span>\n <span class=\"mr-1\">{{ application.email }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <hr class=\"my-3\" />\n <div>\n <div class=\"text-lg font-bold py-2\">Application details</div>\n <div class=\"flex overflow-x-scroll scrollbar-hide\">\n <div class=\"flex flex-col w-full\">\n <rolatech-rich-label label=\"Business Name\" [title]=\"application.businessName\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Experience Years\" [title]=\"application.experienceYears\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Created At\" [title]=\"application.createdAt\"></rolatech-rich-label>\n </div>\n </div>\n <hr class=\"my-3\" />\n </div>\n <div>\n <div class=\"text-lg font-bold py-2\">Documents</div>\n @if (application.documents.length > 0) {\n @for (item of application.documents; track $index) {\n <a class=\"underline underline-offset-4\" [href]=\"item\" target=\"_blank\">Document: {{ $index + 1 }}</a>\n }\n } @else {\n <rolatech-empty></rolatech-empty>\n }\n </div>\n </div>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.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: RichLabelComponent, selector: "rolatech-rich-label", inputs: ["label", "title"] }, { kind: "component", type: EmptyComponent, selector: "rolatech-empty" }] });
468
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AgentManageApplicationDetailComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
469
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: AgentManageApplicationDetailComponent, isStandalone: true, selector: "rolatech-agent-manage-application-detail", usesInheritance: true, ngImport: i0, template: "@if (application) {\n <rolatech-toolbar [title]=\"status[application.status]\" large link=\"../../\">\n @if (application.status.toString() === 'PENDING') {\n <button mat-flat-button (click)=\"approve()\" i18n>Approve</button>\n <button mat-button (click)=\"reject()\" i18n>Reject</button>\n }\n </rolatech-toolbar>\n <div class=\"px-4\">\n <div>\n <div class=\"text-lg font-bold py-2\">User details</div>\n <div class=\"flex\">\n <div class=\"bg-[--rt-brand-color] min-w-12 max-h-12 rounded-full mr-3\">\n @if (application.user.avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"application.user.avatar\" alt=\"avatar img\" />\n }\n </div>\n <div class=\"flex flex-col w-full\">\n @if (application.user.firstName) {\n <div>{{ application.user.firstName }}, {{ application.user.lastName }}</div>\n } @else {\n @if (application.user.name) {\n <div>{{ application.user.name }}</div>\n }\n }\n <div class=\"inline-flex gap-1 mt-2\">\n <div>\n <span i18n>Phone: </span>\n <span class=\"mr-1\">{{ application.phone }}</span>\n </div>\n <div>\n <span i18n>Email: </span>\n <span class=\"mr-1\">{{ application.email }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <hr class=\"my-3\" />\n <div>\n <div class=\"text-lg font-bold py-2\">Application details</div>\n <div class=\"flex overflow-x-scroll scrollbar-hide\">\n <div class=\"flex flex-col w-full\">\n <rolatech-rich-label label=\"Business Name\" [title]=\"application.businessName\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Experience Years\" [title]=\"application.experienceYears\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Created At\" [title]=\"application.createdAt\"></rolatech-rich-label>\n </div>\n </div>\n <hr class=\"my-3\" />\n </div>\n <div>\n <div class=\"text-lg font-bold py-2\">Documents</div>\n @if (application.documents.length > 0) {\n @for (item of application.documents; track $index) {\n <a class=\"underline underline-offset-4\" [href]=\"item\" target=\"_blank\">Document: {{ $index + 1 }}</a>\n }\n } @else {\n <rolatech-empty></rolatech-empty>\n }\n </div>\n </div>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.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: RichLabelComponent, selector: "rolatech-rich-label", inputs: ["label", "title"] }, { kind: "component", type: EmptyComponent, selector: "rolatech-empty" }] });
470
470
  }
471
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AgentManageApplicationDetailComponent, decorators: [{
471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AgentManageApplicationDetailComponent, decorators: [{
472
472
  type: Component,
473
473
  args: [{ selector: 'rolatech-agent-manage-application-detail', imports: [CommonModule, ToolbarComponent, MatButtonModule, RichLabelComponent, EmptyComponent], template: "@if (application) {\n <rolatech-toolbar [title]=\"status[application.status]\" large link=\"../../\">\n @if (application.status.toString() === 'PENDING') {\n <button mat-flat-button (click)=\"approve()\" i18n>Approve</button>\n <button mat-button (click)=\"reject()\" i18n>Reject</button>\n }\n </rolatech-toolbar>\n <div class=\"px-4\">\n <div>\n <div class=\"text-lg font-bold py-2\">User details</div>\n <div class=\"flex\">\n <div class=\"bg-[--rt-brand-color] min-w-12 max-h-12 rounded-full mr-3\">\n @if (application.user.avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"application.user.avatar\" alt=\"avatar img\" />\n }\n </div>\n <div class=\"flex flex-col w-full\">\n @if (application.user.firstName) {\n <div>{{ application.user.firstName }}, {{ application.user.lastName }}</div>\n } @else {\n @if (application.user.name) {\n <div>{{ application.user.name }}</div>\n }\n }\n <div class=\"inline-flex gap-1 mt-2\">\n <div>\n <span i18n>Phone: </span>\n <span class=\"mr-1\">{{ application.phone }}</span>\n </div>\n <div>\n <span i18n>Email: </span>\n <span class=\"mr-1\">{{ application.email }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <hr class=\"my-3\" />\n <div>\n <div class=\"text-lg font-bold py-2\">Application details</div>\n <div class=\"flex overflow-x-scroll scrollbar-hide\">\n <div class=\"flex flex-col w-full\">\n <rolatech-rich-label label=\"Business Name\" [title]=\"application.businessName\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Experience Years\" [title]=\"application.experienceYears\"></rolatech-rich-label>\n <rolatech-rich-label label=\"Created At\" [title]=\"application.createdAt\"></rolatech-rich-label>\n </div>\n </div>\n <hr class=\"my-3\" />\n </div>\n <div>\n <div class=\"text-lg font-bold py-2\">Documents</div>\n @if (application.documents.length > 0) {\n @for (item of application.documents; track $index) {\n <a class=\"underline underline-offset-4\" [href]=\"item\" target=\"_blank\">Document: {{ $index + 1 }}</a>\n }\n } @else {\n <rolatech-empty></rolatech-empty>\n }\n </div>\n </div>\n}\n" }]
474
474
  }] });
@@ -476,10 +476,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
476
476
  class AgentApplicationItemComponent {
477
477
  application = input.required(...(ngDevMode ? [{ debugName: "application" }] : []));
478
478
  status = AgentApplicationStatus;
479
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AgentApplicationItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
480
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: AgentApplicationItemComponent, isStandalone: true, selector: "rolatech-agent-application-item", inputs: { application: { classPropertyName: "application", publicName: "application", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex flex-col hover:bg-[--rt-raised-background] cursor-pointer p-3\">\n <div class=\"flex justify-between w-full mb-2\">\n <a class=\"flex items-center gap-3\">\n <span>Application ID: {{ application().id }}</span>\n </a>\n <span class=\"font-medium text-sm\">{{ status[application().status] }}</span>\n </div>\n <div class=\"flex overflow-x-scroll scrollbar-hide\">\n <div class=\"bg-[--rt-brand-color] min-w-12 max-h-12 rounded-full mr-3\">\n @if (application().user.avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"application().user.avatar\" alt=\"avatar img\" />\n }\n </div>\n <div class=\"flex flex-col w-full\">\n <div>{{ application().businessName }}</div>\n <div class=\"inline-flex gap-1 mt-2\">\n <div>\n <span i18n>Phone: </span>\n <span class=\"mr-1\">{{ application().experienceYears }}</span>\n </div>\n <div>\n <span i18n>Email: </span>\n <span class=\"mr-1\">{{ application().user.email }}</span>\n </div>\n </div>\n <div class=\"flex justify-end\">\n <span class=\"text-sm opacity-70\">{{ application().createdAt }}</span>\n </div>\n </div>\n </div>\n <hr />\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }] });
479
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AgentApplicationItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
480
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: AgentApplicationItemComponent, isStandalone: true, selector: "rolatech-agent-application-item", inputs: { application: { classPropertyName: "application", publicName: "application", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex flex-col hover:bg-[--rt-raised-background] cursor-pointer p-3\">\n <div class=\"flex justify-between w-full mb-2\">\n <a class=\"flex items-center gap-3\">\n <span>Application ID: {{ application().id }}</span>\n </a>\n <span class=\"font-medium text-sm\">{{ status[application().status] }}</span>\n </div>\n <div class=\"flex overflow-x-scroll scrollbar-hide\">\n <div class=\"bg-[--rt-brand-color] min-w-12 max-h-12 rounded-full mr-3\">\n @if (application().user.avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"application().user.avatar\" alt=\"avatar img\" />\n }\n </div>\n <div class=\"flex flex-col w-full\">\n <div>{{ application().businessName }}</div>\n <div class=\"inline-flex gap-1 mt-2\">\n <div>\n <span i18n>Phone: </span>\n <span class=\"mr-1\">{{ application().experienceYears }}</span>\n </div>\n <div>\n <span i18n>Email: </span>\n <span class=\"mr-1\">{{ application().user.email }}</span>\n </div>\n </div>\n <div class=\"flex justify-end\">\n <span class=\"text-sm opacity-70\">{{ application().createdAt }}</span>\n </div>\n </div>\n </div>\n <hr />\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }] });
481
481
  }
482
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AgentApplicationItemComponent, decorators: [{
482
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AgentApplicationItemComponent, decorators: [{
483
483
  type: Component,
484
484
  args: [{ selector: 'rolatech-agent-application-item', imports: [MatIconModule], template: "<div class=\"flex flex-col hover:bg-[--rt-raised-background] cursor-pointer p-3\">\n <div class=\"flex justify-between w-full mb-2\">\n <a class=\"flex items-center gap-3\">\n <span>Application ID: {{ application().id }}</span>\n </a>\n <span class=\"font-medium text-sm\">{{ status[application().status] }}</span>\n </div>\n <div class=\"flex overflow-x-scroll scrollbar-hide\">\n <div class=\"bg-[--rt-brand-color] min-w-12 max-h-12 rounded-full mr-3\">\n @if (application().user.avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"application().user.avatar\" alt=\"avatar img\" />\n }\n </div>\n <div class=\"flex flex-col w-full\">\n <div>{{ application().businessName }}</div>\n <div class=\"inline-flex gap-1 mt-2\">\n <div>\n <span i18n>Phone: </span>\n <span class=\"mr-1\">{{ application().experienceYears }}</span>\n </div>\n <div>\n <span i18n>Email: </span>\n <span class=\"mr-1\">{{ application().user.email }}</span>\n </div>\n </div>\n <div class=\"flex justify-end\">\n <span class=\"text-sm opacity-70\">{{ application().createdAt }}</span>\n </div>\n </div>\n </div>\n <hr />\n</div>\n" }]
485
485
  }], propDecorators: { application: [{ type: i0.Input, args: [{ isSignal: true, alias: "application", required: true }] }] } });
@@ -558,10 +558,10 @@ class AgentManageApplicationIndexComponent extends BaseComponent {
558
558
  this.dialogService.open(options);
559
559
  this.dialogService.confirmed();
560
560
  }
561
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AgentManageApplicationIndexComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
562
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: AgentManageApplicationIndexComponent, isStandalone: true, selector: "rolatech-agent-manage-application-index", usesInheritance: true, ngImport: i0, template: "<rolatech-toolbar title=\"Applications\">\n <div class=\"flex items-center gap-2\"></div>\n</rolatech-toolbar>\n<rolatech-tabs [select]=\"select\">\n @for (item of links; track item) {\n @if (item.status) {\n <rolatech-tab [label]=\"item.name\" routerLink=\"./\" [queryParams]=\"{ status: item.status }\"></rolatech-tab>\n } @else {\n <rolatech-tab [label]=\"item.name\" routerLink=\"./\"></rolatech-tab>\n }\n }\n</rolatech-tabs>\n<div>\n @if (applications) {\n @for (application of applications; track $index) {\n <rolatech-agent-application-item\n [application]=\"application\"\n [routerLink]=\"['./', application.id]\"\n ></rolatech-agent-application-item>\n }\n } @else {\n <rolatech-empty></rolatech-empty>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select", "loading"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: AgentApplicationItemComponent, selector: "rolatech-agent-application-item", inputs: ["application"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: EmptyComponent, selector: "rolatech-empty" }] });
561
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AgentManageApplicationIndexComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
562
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: AgentManageApplicationIndexComponent, isStandalone: true, selector: "rolatech-agent-manage-application-index", usesInheritance: true, ngImport: i0, template: "<rolatech-toolbar title=\"Applications\">\n <div class=\"flex items-center gap-2\"></div>\n</rolatech-toolbar>\n<rolatech-tabs [select]=\"select\">\n @for (item of links; track item) {\n @if (item.status) {\n <rolatech-tab [label]=\"item.name\" routerLink=\"./\" [queryParams]=\"{ status: item.status }\"></rolatech-tab>\n } @else {\n <rolatech-tab [label]=\"item.name\" routerLink=\"./\"></rolatech-tab>\n }\n }\n</rolatech-tabs>\n<div>\n @if (applications) {\n @for (application of applications; track $index) {\n <rolatech-agent-application-item\n [application]=\"application\"\n [routerLink]=\"['./', application.id]\"\n ></rolatech-agent-application-item>\n }\n } @else {\n <rolatech-empty></rolatech-empty>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select", "loading", "block"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: AgentApplicationItemComponent, selector: "rolatech-agent-application-item", inputs: ["application"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: EmptyComponent, selector: "rolatech-empty" }] });
563
563
  }
564
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AgentManageApplicationIndexComponent, decorators: [{
564
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: AgentManageApplicationIndexComponent, decorators: [{
565
565
  type: Component,
566
566
  args: [{ selector: 'rolatech-agent-manage-application-index', imports: [
567
567
  CommonModule,
@@ -604,10 +604,10 @@ class UserDataService {
604
604
  send(data) {
605
605
  this.userInfo.next(data);
606
606
  }
607
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
608
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserDataService, providedIn: 'root' });
607
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
608
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserDataService, providedIn: 'root' });
609
609
  }
610
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserDataService, decorators: [{
610
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserDataService, decorators: [{
611
611
  type: Injectable,
612
612
  args: [{
613
613
  providedIn: 'root',
@@ -690,10 +690,10 @@ class UserLayoutComponent extends BaseComponent {
690
690
  },
691
691
  });
692
692
  }
693
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
694
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: UserLayoutComponent, isStandalone: true, selector: "rolatech-user-layout", inputs: { selectIndex: { classPropertyName: "selectIndex", publicName: "selectIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectIndex: "selectIndexChange" }, usesInheritance: true, ngImport: i0, template: "<rolatech-container>\n @if (userInfo) {\n <div>\n <div class=\"h-8\"></div>\n <div class=\"flex\">\n <div\n class=\"w-[80px] h-[80px] md:w-36 md:h-36 sm:w-28 sm:h-28 rounded-full border-white mr-4 bg-[--rt-raised-background]\"\n >\n @defer {\n <rolatech-avatar [src]=\"userInfo.avatar + '!w400'\" size=\"full\"> </rolatech-avatar>\n }\n </div>\n <div class=\"flex flex-col flex-grow\">\n <div class=\"flex justify-between items-center sm:mt-1\">\n <div class=\"flex items-center gap-2\">\n <div class=\"text-xl md:text-2xl font-medium\">\n <span>{{ userInfo.name }}</span>\n </div>\n <mat-icon color=\"primary\">verified</mat-icon>\n </div>\n <div>\n @if (isFollowed) {\n <button mat-flat-button (click)=\"unfollow()\" class=\"w-28 max-h-8\" i18n>Unfollow</button>\n } @else {\n <button mat-flat-button (click)=\"follow()\" class=\"w-28 max-h-8\" i18n>Follow</button>\n }\n </div>\n </div>\n <div class=\"text-sm text-[--rt-text-secondary]\">\n <div class=\"flex gap-3 py-2 items-center\">\n <a>\n <span>&#64;{{ userInfo.username }}</span>\n </a>\n <a class=\"cursor-pointer hover:text-orange-600\" [routerLink]=\"['./following']\">\n <span class=\"font-bold\">{{ statsData?.following }}</span>\n <span class=\"ml-1\" i18n>Following</span>\n </a>\n <a class=\"cursor-pointer hover:text-orange-600\" [routerLink]=\"['./followers']\">\n <span class=\"font-bold\">{{ statsData?.followers }}</span>\n <span class=\"ml-1\" i18n>Followers</span>\n </a>\n </div>\n <div class=\"mb-3\">\n <div>\n {{ userInfo.bio }}\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"py-2\">\n <rolatech-tabs [(select)]=\"selectIndex\" ngSkipHydration>\n <rolatech-tab label=\"Course\" routerLink=\"./\"></rolatech-tab>\n <rolatech-tab label=\"Community\" routerLink=\"./community\"></rolatech-tab>\n <rolatech-tab label=\"Store\" routerLink=\"./store\"></rolatech-tab>\n </rolatech-tabs>\n </div>\n\n <router-outlet></router-outlet>\n </div>\n }\n</rolatech-container>\n", styles: ["mat-icon{transform:scale(.8);color:var(--rt-brand-color)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.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"] }, { kind: "component", type: ContainerComponent, selector: "rolatech-container" }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select", "loading"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.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: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], deferBlockDependencies: [() => [AvatarComponent]] });
693
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
694
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: UserLayoutComponent, isStandalone: true, selector: "rolatech-user-layout", inputs: { selectIndex: { classPropertyName: "selectIndex", publicName: "selectIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectIndex: "selectIndexChange" }, usesInheritance: true, ngImport: i0, template: "<rolatech-container>\n @if (userInfo) {\n <div>\n <div class=\"h-8\"></div>\n <div class=\"flex\">\n <div\n class=\"w-[80px] h-[80px] md:w-36 md:h-36 sm:w-28 sm:h-28 rounded-full border-white mr-4 bg-[--rt-raised-background]\"\n >\n @defer {\n <rolatech-avatar [src]=\"userInfo.avatar + '!w400'\" size=\"full\"> </rolatech-avatar>\n }\n </div>\n <div class=\"flex flex-col flex-grow\">\n <div class=\"flex justify-between items-center sm:mt-1\">\n <div class=\"flex items-center gap-2\">\n <div class=\"text-xl md:text-2xl font-medium\">\n <span>{{ userInfo.name }}</span>\n </div>\n <mat-icon color=\"primary\">verified</mat-icon>\n </div>\n <div>\n @if (isFollowed) {\n <button mat-flat-button (click)=\"unfollow()\" class=\"w-28 max-h-8\" i18n>Unfollow</button>\n } @else {\n <button mat-flat-button (click)=\"follow()\" class=\"w-28 max-h-8\" i18n>Follow</button>\n }\n </div>\n </div>\n <div class=\"text-sm text-[--rt-text-secondary]\">\n <div class=\"flex gap-3 py-2 items-center\">\n <a>\n <span>&#64;{{ userInfo.username }}</span>\n </a>\n <a class=\"cursor-pointer hover:text-orange-600\" [routerLink]=\"['./following']\">\n <span class=\"font-bold\">{{ statsData?.following }}</span>\n <span class=\"ml-1\" i18n>Following</span>\n </a>\n <a class=\"cursor-pointer hover:text-orange-600\" [routerLink]=\"['./followers']\">\n <span class=\"font-bold\">{{ statsData?.followers }}</span>\n <span class=\"ml-1\" i18n>Followers</span>\n </a>\n </div>\n <div class=\"mb-3\">\n <div>\n {{ userInfo.bio }}\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"py-2\">\n <rolatech-tabs [(select)]=\"selectIndex\" ngSkipHydration>\n <rolatech-tab label=\"Course\" routerLink=\"./\"></rolatech-tab>\n <rolatech-tab label=\"Community\" routerLink=\"./community\"></rolatech-tab>\n <rolatech-tab label=\"Store\" routerLink=\"./store\"></rolatech-tab>\n </rolatech-tabs>\n </div>\n\n <router-outlet></router-outlet>\n </div>\n }\n</rolatech-container>\n", styles: ["mat-icon{transform:scale(.8);color:var(--rt-brand-color)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.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"] }, { kind: "component", type: ContainerComponent, selector: "rolatech-container" }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select", "loading", "block"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.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: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], deferBlockDependencies: [() => [AvatarComponent]] });
695
695
  }
696
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserLayoutComponent, decorators: [{
696
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserLayoutComponent, decorators: [{
697
697
  type: Component,
698
698
  args: [{ selector: 'rolatech-user-layout', imports: [
699
699
  MatIconModule,
@@ -736,10 +736,10 @@ class UserInfoComponent extends BaseComponent {
736
736
  },
737
737
  });
738
738
  }
739
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
740
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: UserInfoComponent, isStandalone: true, selector: "rolatech-user-info", usesInheritance: true, ngImport: i0, template: "<rolatech-rich-view list>\n @for (item of courses; track $index) {\n <rolatech-rich-item\n [title]=\"item.name\"\n [thumbnail]=\"item.media[0].url + '!w400'\"\n [price]=\"(item.pricing[0].total / 100).toFixed(2)\"\n [routerLink]=\"['/courses', item.id]\"\n class=\"cursor-pointer hover:bg-[--rt-raised-background]\"\n ></rolatech-rich-item>\n }\n</rolatech-rich-view>\n", styles: [""], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: RichViewComponent, selector: "rolatech-rich-view", inputs: ["list", "wrap"] }, { kind: "component", type: RichItemComponent, selector: "rolatech-rich-item", inputs: ["list", "thumbnail", "avatar", "title", "subtitle", "price", "thumbnailRatio", "thumbnailMode"] }], encapsulation: i0.ViewEncapsulation.None });
739
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
740
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: UserInfoComponent, isStandalone: true, selector: "rolatech-user-info", usesInheritance: true, ngImport: i0, template: "<rolatech-rich-view list>\n @for (item of courses; track $index) {\n <rolatech-rich-item\n [title]=\"item.name\"\n [thumbnail]=\"item.media[0].url + '!w400'\"\n [price]=\"(item.pricing[0].total / 100).toFixed(2)\"\n [routerLink]=\"['/courses', item.id]\"\n class=\"cursor-pointer hover:bg-[--rt-raised-background]\"\n ></rolatech-rich-item>\n }\n</rolatech-rich-view>\n", styles: [""], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: RichViewComponent, selector: "rolatech-rich-view", inputs: ["list", "wrap"] }, { kind: "component", type: RichItemComponent, selector: "rolatech-rich-item", inputs: ["list", "thumbnail", "avatar", "title", "subtitle", "price", "thumbnailRatio", "thumbnailMode"] }], encapsulation: i0.ViewEncapsulation.None });
741
741
  }
742
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserInfoComponent, decorators: [{
742
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserInfoComponent, decorators: [{
743
743
  type: Component,
744
744
  args: [{ selector: 'rolatech-user-info', imports: [RouterLink, RichViewComponent, RichItemComponent], encapsulation: ViewEncapsulation.None, template: "<rolatech-rich-view list>\n @for (item of courses; track $index) {\n <rolatech-rich-item\n [title]=\"item.name\"\n [thumbnail]=\"item.media[0].url + '!w400'\"\n [price]=\"(item.pricing[0].total / 100).toFixed(2)\"\n [routerLink]=\"['/courses', item.id]\"\n class=\"cursor-pointer hover:bg-[--rt-raised-background]\"\n ></rolatech-rich-item>\n }\n</rolatech-rich-view>\n" }]
745
745
  }], ctorParameters: () => [] });
@@ -751,10 +751,10 @@ class UserCommunityComponent {
751
751
  next: (userInfo) => { },
752
752
  });
753
753
  }
754
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserCommunityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
755
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: UserCommunityComponent, isStandalone: true, selector: "rolatech-user-community", ngImport: i0, template: "<rolatech-empty></rolatech-empty>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: EmptyComponent, selector: "rolatech-empty" }], encapsulation: i0.ViewEncapsulation.None });
754
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserCommunityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
755
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: UserCommunityComponent, isStandalone: true, selector: "rolatech-user-community", ngImport: i0, template: "<rolatech-empty></rolatech-empty>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: EmptyComponent, selector: "rolatech-empty" }], encapsulation: i0.ViewEncapsulation.None });
756
756
  }
757
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserCommunityComponent, decorators: [{
757
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserCommunityComponent, decorators: [{
758
758
  type: Component,
759
759
  args: [{ selector: 'rolatech-user-community', imports: [CommonModule, EmptyComponent], encapsulation: ViewEncapsulation.None, template: "<rolatech-empty></rolatech-empty>\n" }]
760
760
  }] });
@@ -781,10 +781,10 @@ class UserStoreComponent {
781
781
  },
782
782
  });
783
783
  }
784
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserStoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
785
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: UserStoreComponent, isStandalone: true, selector: "rolatech-user-store", ngImport: i0, template: "@if (products) {\n <div>\n <rolatech-rich-view wrap>\n @for (item of products; track item) {\n @defer {\n <rolatech-rich-item\n [routerLink]=\"['/products', item.id]\"\n [thumbnail]=\"item.media ? item.media[0].url + '!w400' : ''\"\n [title]=\"item.name\"\n [subtitle]=\"item.description\"\n [price]=\"(item.price / 100).toFixed(2)\"\n thumbnailRatio=\"square\"\n ></rolatech-rich-item>\n }\n }\n </rolatech-rich-view>\n </div>\n} @else {\n <rolatech-empty></rolatech-empty>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: EmptyComponent, selector: "rolatech-empty" }, { kind: "component", type: RichViewComponent, selector: "rolatech-rich-view", inputs: ["list", "wrap"] }], encapsulation: i0.ViewEncapsulation.None, deferBlockDependencies: [() => [RichItemComponent, import('@angular/router').then(m => m.RouterLink)]] });
784
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserStoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
785
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: UserStoreComponent, isStandalone: true, selector: "rolatech-user-store", ngImport: i0, template: "@if (products) {\n <div>\n <rolatech-rich-view wrap>\n @for (item of products; track item) {\n @defer {\n <rolatech-rich-item\n [routerLink]=\"['/products', item.id]\"\n [thumbnail]=\"item.media ? item.media[0].url + '!w400' : ''\"\n [title]=\"item.name\"\n [subtitle]=\"item.description\"\n [price]=\"(item.price / 100).toFixed(2)\"\n thumbnailRatio=\"square\"\n ></rolatech-rich-item>\n }\n }\n </rolatech-rich-view>\n </div>\n} @else {\n <rolatech-empty></rolatech-empty>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: EmptyComponent, selector: "rolatech-empty" }, { kind: "component", type: RichViewComponent, selector: "rolatech-rich-view", inputs: ["list", "wrap"] }], encapsulation: i0.ViewEncapsulation.None, deferBlockDependencies: [() => [RichItemComponent, import('@angular/router').then(m => m.RouterLink)]] });
786
786
  }
787
- i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.0.0", ngImport: i0, type: UserStoreComponent, resolveDeferredDeps: () => [import('@angular/router').then(m => m.RouterLink)], resolveMetadata: RouterLink => ({ decorators: [{
787
+ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.0.6", ngImport: i0, type: UserStoreComponent, resolveDeferredDeps: () => [import('@angular/router').then(m => m.RouterLink)], resolveMetadata: RouterLink => ({ decorators: [{
788
788
  type: Component,
789
789
  args: [{ selector: 'rolatech-user-store', imports: [CommonModule, EmptyComponent, RichViewComponent, RichItemComponent, RouterLink], encapsulation: ViewEncapsulation.None, template: "@if (products) {\n <div>\n <rolatech-rich-view wrap>\n @for (item of products; track item) {\n @defer {\n <rolatech-rich-item\n [routerLink]=\"['/products', item.id]\"\n [thumbnail]=\"item.media ? item.media[0].url + '!w400' : ''\"\n [title]=\"item.name\"\n [subtitle]=\"item.description\"\n [price]=\"(item.price / 100).toFixed(2)\"\n thumbnailRatio=\"square\"\n ></rolatech-rich-item>\n }\n }\n </rolatech-rich-view>\n </div>\n} @else {\n <rolatech-empty></rolatech-empty>\n}\n" }]
790
790
  }], ctorParameters: null, propDecorators: null }) });
@@ -802,10 +802,10 @@ class UserItemComponent {
802
802
  onUnFollow() {
803
803
  this.unfollow.emit(this.user().username);
804
804
  }
805
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
806
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: UserItemComponent, isStandalone: true, selector: "rolatech-user-item", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null }, isFollowing: { classPropertyName: "isFollowing", publicName: "isFollowing", isSignal: true, isRequired: false, transformFunction: null }, own: { classPropertyName: "own", publicName: "own", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { follow: "follow", unfollow: "unfollow" }, host: { properties: { "class.rolatech-user-item": "this.hasClass" } }, ngImport: i0, template: "<div class=\"flex w-full justify-between items-center p-2 hover:bg-[--rt-raised-background] cursor-pointer\">\n <div class=\"flex items-center\">\n <div class=\"bg-[--rt-brand-color] w-12 h-12 rounded-full\">\n @if (user().avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"user().avatar\" alt=\"avatar img\" />\n }\n </div>\n <div class=\"flex flex-col ml-3\">\n <a class=\"text-lg font-bold\">\n <span>{{ user().name }}</span>\n </a>\n <a class=\"text-md\">\n <span>{{ user().username }}</span>\n </a>\n </div>\n </div>\n @if (!own()) {\n @if (isFollowing()) {\n <button mat-flat-button class=\"w-28 max-h-8\" (click)=\"onUnFollow()\" i18n>Unfollow</button>\n } @else {\n <button mat-flat-button class=\"w-28 max-h-8\" (click)=\"onFollow()\" i18n>Follow</button>\n }\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.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"] }], encapsulation: i0.ViewEncapsulation.None });
805
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
806
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: UserItemComponent, isStandalone: true, selector: "rolatech-user-item", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null }, isFollowing: { classPropertyName: "isFollowing", publicName: "isFollowing", isSignal: true, isRequired: false, transformFunction: null }, own: { classPropertyName: "own", publicName: "own", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { follow: "follow", unfollow: "unfollow" }, host: { properties: { "class.rolatech-user-item": "this.hasClass" } }, ngImport: i0, template: "<div class=\"flex w-full justify-between items-center p-2 hover:bg-[--rt-raised-background] cursor-pointer\">\n <div class=\"flex items-center\">\n <div class=\"bg-[--rt-brand-color] w-12 h-12 rounded-full\">\n @if (user().avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"user().avatar\" alt=\"avatar img\" />\n }\n </div>\n <div class=\"flex flex-col ml-3\">\n <a class=\"text-lg font-bold\">\n <span>{{ user().name }}</span>\n </a>\n <a class=\"text-md\">\n <span>{{ user().username }}</span>\n </a>\n </div>\n </div>\n @if (!own()) {\n @if (isFollowing()) {\n <button mat-flat-button class=\"w-28 max-h-8\" (click)=\"onUnFollow()\" i18n>Unfollow</button>\n } @else {\n <button mat-flat-button class=\"w-28 max-h-8\" (click)=\"onFollow()\" i18n>Follow</button>\n }\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.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"] }], encapsulation: i0.ViewEncapsulation.None });
807
807
  }
808
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserItemComponent, decorators: [{
808
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserItemComponent, decorators: [{
809
809
  type: Component,
810
810
  args: [{ selector: 'rolatech-user-item', imports: [CommonModule, MatButtonModule], encapsulation: ViewEncapsulation.None, template: "<div class=\"flex w-full justify-between items-center p-2 hover:bg-[--rt-raised-background] cursor-pointer\">\n <div class=\"flex items-center\">\n <div class=\"bg-[--rt-brand-color] w-12 h-12 rounded-full\">\n @if (user().avatar) {\n <img class=\"w-12 h-12 object-cover rounded-full\" [src]=\"user().avatar\" alt=\"avatar img\" />\n }\n </div>\n <div class=\"flex flex-col ml-3\">\n <a class=\"text-lg font-bold\">\n <span>{{ user().name }}</span>\n </a>\n <a class=\"text-md\">\n <span>{{ user().username }}</span>\n </a>\n </div>\n </div>\n @if (!own()) {\n @if (isFollowing()) {\n <button mat-flat-button class=\"w-28 max-h-8\" (click)=\"onUnFollow()\" i18n>Unfollow</button>\n } @else {\n <button mat-flat-button class=\"w-28 max-h-8\" (click)=\"onFollow()\" i18n>Follow</button>\n }\n }\n</div>\n" }]
811
811
  }], propDecorators: { hasClass: [{
@@ -923,10 +923,10 @@ class UserFollowInfoComponent {
923
923
  item.isFollowing = friendships[item.id].following;
924
924
  });
925
925
  }
926
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserFollowInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
927
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: UserFollowInfoComponent, isStandalone: true, selector: "rolatech-user-follow-info", ngImport: i0, template: "<rolatech-container>\n <rolatech-toolbar [title]=\"userInfo?.name\" link=\"../\" [subtitle]=\"userInfo?.username\"></rolatech-toolbar>\n <div class=\"mb-3\"></div>\n\n <rolatech-tabs [(select)]=\"tabIndex\">\n <rolatech-tab label=\"Following\" [routerLink]=\"['../', 'following']\"></rolatech-tab>\n <rolatech-tab label=\"Followers\" [routerLink]=\"['../', 'followers']\"></rolatech-tab>\n </rolatech-tabs>\n <div class=\"mb-3\"></div>\n @for (user of users; track $index) {\n <rolatech-user-item\n [user]=\"user\"\n [routerLink]=\"'/@' + user.username\"\n [isFollowing]=\"user.isFollowing\"\n (follow)=\"follow(user)\"\n (unfollow)=\"unfollow(user)\"\n [own]=\"user.id === myId\"\n ></rolatech-user-item>\n }\n</rolatech-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select", "loading"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"] }, { kind: "component", type: ContainerComponent, selector: "rolatech-container" }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: UserItemComponent, selector: "rolatech-user-item", inputs: ["user", "isFollowing", "own"], outputs: ["follow", "unfollow"] }], encapsulation: i0.ViewEncapsulation.None });
926
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserFollowInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
927
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: UserFollowInfoComponent, isStandalone: true, selector: "rolatech-user-follow-info", ngImport: i0, template: "<rolatech-container>\n <rolatech-toolbar [title]=\"userInfo?.name\" link=\"../\" [subtitle]=\"userInfo?.username\"></rolatech-toolbar>\n <div class=\"mb-3\"></div>\n\n <rolatech-tabs [(select)]=\"tabIndex\">\n <rolatech-tab label=\"Following\" [routerLink]=\"['../', 'following']\"></rolatech-tab>\n <rolatech-tab label=\"Followers\" [routerLink]=\"['../', 'followers']\"></rolatech-tab>\n </rolatech-tabs>\n <div class=\"mb-3\"></div>\n @for (user of users; track $index) {\n <rolatech-user-item\n [user]=\"user\"\n [routerLink]=\"'/@' + user.username\"\n [isFollowing]=\"user.isFollowing\"\n (follow)=\"follow(user)\"\n (unfollow)=\"unfollow(user)\"\n [own]=\"user.id === myId\"\n ></rolatech-user-item>\n }\n</rolatech-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select", "loading", "block"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"] }, { kind: "component", type: ContainerComponent, selector: "rolatech-container" }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: UserItemComponent, selector: "rolatech-user-item", inputs: ["user", "isFollowing", "own"], outputs: ["follow", "unfollow"] }], encapsulation: i0.ViewEncapsulation.None });
928
928
  }
929
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserFollowInfoComponent, decorators: [{
929
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserFollowInfoComponent, decorators: [{
930
930
  type: Component,
931
931
  args: [{ selector: 'rolatech-user-follow-info', imports: [CommonModule, TabsComponent, TabComponent, ContainerComponent, ToolbarComponent, RouterLink, UserItemComponent], encapsulation: ViewEncapsulation.None, template: "<rolatech-container>\n <rolatech-toolbar [title]=\"userInfo?.name\" link=\"../\" [subtitle]=\"userInfo?.username\"></rolatech-toolbar>\n <div class=\"mb-3\"></div>\n\n <rolatech-tabs [(select)]=\"tabIndex\">\n <rolatech-tab label=\"Following\" [routerLink]=\"['../', 'following']\"></rolatech-tab>\n <rolatech-tab label=\"Followers\" [routerLink]=\"['../', 'followers']\"></rolatech-tab>\n </rolatech-tabs>\n <div class=\"mb-3\"></div>\n @for (user of users; track $index) {\n <rolatech-user-item\n [user]=\"user\"\n [routerLink]=\"'/@' + user.username\"\n [isFollowing]=\"user.isFollowing\"\n (follow)=\"follow(user)\"\n (unfollow)=\"unfollow(user)\"\n [own]=\"user.id === myId\"\n ></rolatech-user-item>\n }\n</rolatech-container>\n" }]
932
932
  }], ctorParameters: () => [] });
@@ -986,10 +986,10 @@ class UserDetailComponent extends BaseComponent {
986
986
  addEmail() { }
987
987
  addPhone() { }
988
988
  connectWallet() { }
989
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserDetailComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
990
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: UserDetailComponent, isStandalone: true, selector: "rolatech-user-detail", usesInheritance: true, ngImport: i0, template: "<rolatech-toolbar title=\"Users\" link=\"../\"> </rolatech-toolbar>\n<div class=\"p-4 space-y-4\">\n <!-- Header -->\n <div class=\"flex items-start justify-between gap-4\">\n <div class=\"flex items-start gap-3 min-w-0\">\n <!-- avatar -->\n <div class=\"relative\">\n @if (avatarUrl()) {\n <img class=\"w-12 h-12 rounded-full object-cover border\" [src]=\"avatarUrl()!\" alt=\"avatar\" />\n } @else {\n <div\n class=\"w-12 h-12 rounded-full border bg-[--rt-brand-color] text-white flex items-center justify-center font-semibold\"\n >\n {{ initials() }}\n </div>\n }\n\n <!-- status dot -->\n <span\n class=\"absolute -right-0 -bottom-0 w-3 h-3 rounded-full border border-[--rt-border-color] bg-[--rt-base-background] flex items-center justify-center\"\n >\n <span\n class=\"w-2 h-2 rounded-full\"\n [class]=\"\n user()?.status?.toString() === 'ACTIVE'\n ? 'bg-green-500'\n : user()?.status?.toString() === 'LOCKED'\n ? 'bg-red-500'\n : 'bg-amber-500'\n \"\n ></span>\n </span>\n </div>\n\n <div class=\"min-w-0\">\n <div class=\"flex items-center gap-2 min-w-0\">\n <h1 class=\"text-2xl font-semibold truncate\">{{ name() }}</h1>\n\n @if (user()?.status?.toString() === 'LOCKED') {\n <span class=\"px-2 py-0.5 rounded-md text-xs bg-red-500/10 text-red-700 border border-red-500/20\">\n <mat-icon class=\"align-middle !text-[14px] mr-1\">lock</mat-icon>\n Locked\n </span>\n } @else if (user()?.status?.toString() === 'DISABLED') {\n <span class=\"px-2 py-0.5 rounded-md text-xs bg-red-500/10 text-red-700 border border-red-500/20\"> Disabled </span>\n }\n </div>\n\n <div class=\"text-sm opacity-70 flex items-center gap-2 mt-1\">\n <span>{{ user()?.status?.toString() === 'ACTIVE' ? 'Active' : (user()?.status ?? '\u2014') }}</span>\n </div>\n </div>\n </div>\n\n <!-- actions -->\n <!-- <div class=\"flex items-center gap-2\">\n <button mat-stroked-button (click)=\"openUserObject()\">User object</button>\n <button mat-flat-button color=\"primary\" (click)=\"editProfile()\">Edit profile</button>\n\n <button mat-icon-button [matMenuTriggerFor]=\"moreMenu\" aria-label=\"More\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n <mat-menu #moreMenu=\"matMenu\">\n <button mat-menu-item (click)=\"toggleStatus()\">\n <mat-icon>{{ user()?.status?.toString() === 'ACTIVE' ? 'block' : 'check_circle' }}</mat-icon>\n <span>{{ user()?.status?.toString() === 'ACTIVE' ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"resetPassword()\">\n <mat-icon>vpn_key</mat-icon>\n <span>Reset password</span>\n </button>\n <button mat-menu-item (click)=\"copyId()\">\n <mat-icon>content_copy</mat-icon>\n <span>Copy user ID</span>\n </button>\n </mat-menu>\n </div> -->\n </div>\n\n <!-- Info strip (2 columns like screenshot) -->\n <div class=\"grid grid-cols-1 lg:grid-cols-2 gap-6 border-b pb-5\">\n <dl class=\"space-y-3 text-sm\">\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">badge</mat-icon> User ID</dt>\n <dd class=\"font-mono text-xs truncate max-w-[65%]\">{{ user()?.id }}</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">alternate_email</mat-icon> Username</dt>\n <dd class=\"truncate max-w-[65%]\">&#64;{{ user()?.username }}</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">call</mat-icon> Phone number</dt>\n <dd class=\"truncate max-w-[65%]\">{{ user()?.phone ?? '\u2014' }}</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">mail</mat-icon> Email address</dt>\n <dd class=\"truncate max-w-[65%]\">{{ user()?.email ?? '\u2014' }}</dd>\n </div>\n </dl>\n\n <dl class=\"space-y-3 text-sm\">\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">lock</mat-icon> Password</dt>\n <dd class=\"truncate max-w-[65%]\">None</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">verified_user</mat-icon> 2-step auth</dt>\n <dd class=\"truncate max-w-[65%]\">\u2014</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">key</mat-icon> Passkey</dt>\n <dd class=\"truncate max-w-[65%]\">\u2014</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">event</mat-icon> User since</dt>\n <dd class=\"truncate max-w-[65%]\">{{ createdAtLabel() }}</dd>\n </div>\n </dl>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }] });
989
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserDetailComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
990
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: UserDetailComponent, isStandalone: true, selector: "rolatech-user-detail", usesInheritance: true, ngImport: i0, template: "<rolatech-toolbar title=\"Users\" link=\"../\"> </rolatech-toolbar>\n<div class=\"p-4 space-y-4\">\n <!-- Header -->\n <div class=\"flex items-start justify-between gap-4\">\n <div class=\"flex items-start gap-3 min-w-0\">\n <!-- avatar -->\n <div class=\"relative\">\n @if (avatarUrl()) {\n <img class=\"w-12 h-12 rounded-full object-cover border\" [src]=\"avatarUrl()!\" alt=\"avatar\" />\n } @else {\n <div\n class=\"w-12 h-12 rounded-full border bg-[--rt-brand-color] text-white flex items-center justify-center font-semibold\"\n >\n {{ initials() }}\n </div>\n }\n\n <!-- status dot -->\n <span\n class=\"absolute -right-0 -bottom-0 w-3 h-3 rounded-full border border-[--rt-border-color] bg-[--rt-base-background] flex items-center justify-center\"\n >\n <span\n class=\"w-2 h-2 rounded-full\"\n [class]=\"\n user()?.status?.toString() === 'ACTIVE'\n ? 'bg-green-500'\n : user()?.status?.toString() === 'LOCKED'\n ? 'bg-red-500'\n : 'bg-amber-500'\n \"\n ></span>\n </span>\n </div>\n\n <div class=\"min-w-0\">\n <div class=\"flex items-center gap-2 min-w-0\">\n <h1 class=\"text-2xl font-semibold truncate\">{{ name() }}</h1>\n\n @if (user()?.status?.toString() === 'LOCKED') {\n <span class=\"px-2 py-0.5 rounded-md text-xs bg-red-500/10 text-red-700 border border-red-500/20\">\n <mat-icon class=\"align-middle !text-[14px] mr-1\">lock</mat-icon>\n Locked\n </span>\n } @else if (user()?.status?.toString() === 'DISABLED') {\n <span class=\"px-2 py-0.5 rounded-md text-xs bg-red-500/10 text-red-700 border border-red-500/20\"> Disabled </span>\n }\n </div>\n\n <div class=\"text-sm opacity-70 flex items-center gap-2 mt-1\">\n <span>{{ user()?.status?.toString() === 'ACTIVE' ? 'Active' : (user()?.status ?? '\u2014') }}</span>\n </div>\n </div>\n </div>\n\n <!-- actions -->\n <!-- <div class=\"flex items-center gap-2\">\n <button mat-stroked-button (click)=\"openUserObject()\">User object</button>\n <button mat-flat-button color=\"primary\" (click)=\"editProfile()\">Edit profile</button>\n\n <button mat-icon-button [matMenuTriggerFor]=\"moreMenu\" aria-label=\"More\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n <mat-menu #moreMenu=\"matMenu\">\n <button mat-menu-item (click)=\"toggleStatus()\">\n <mat-icon>{{ user()?.status?.toString() === 'ACTIVE' ? 'block' : 'check_circle' }}</mat-icon>\n <span>{{ user()?.status?.toString() === 'ACTIVE' ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"resetPassword()\">\n <mat-icon>vpn_key</mat-icon>\n <span>Reset password</span>\n </button>\n <button mat-menu-item (click)=\"copyId()\">\n <mat-icon>content_copy</mat-icon>\n <span>Copy user ID</span>\n </button>\n </mat-menu>\n </div> -->\n </div>\n\n <!-- Info strip (2 columns like screenshot) -->\n <div class=\"grid grid-cols-1 lg:grid-cols-2 gap-6 border-b pb-5\">\n <dl class=\"space-y-3 text-sm\">\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">badge</mat-icon> User ID</dt>\n <dd class=\"font-mono text-xs truncate max-w-[65%]\">{{ user()?.id }}</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">alternate_email</mat-icon> Username</dt>\n <dd class=\"truncate max-w-[65%]\">&#64;{{ user()?.username }}</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">call</mat-icon> Phone number</dt>\n <dd class=\"truncate max-w-[65%]\">{{ user()?.phone ?? '\u2014' }}</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">mail</mat-icon> Email address</dt>\n <dd class=\"truncate max-w-[65%]\">{{ user()?.email ?? '\u2014' }}</dd>\n </div>\n </dl>\n\n <dl class=\"space-y-3 text-sm\">\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">lock</mat-icon> Password</dt>\n <dd class=\"truncate max-w-[65%]\">None</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">verified_user</mat-icon> 2-step auth</dt>\n <dd class=\"truncate max-w-[65%]\">\u2014</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">key</mat-icon> Passkey</dt>\n <dd class=\"truncate max-w-[65%]\">\u2014</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">event</mat-icon> User since</dt>\n <dd class=\"truncate max-w-[65%]\">{{ createdAtLabel() }}</dd>\n </div>\n </dl>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }] });
991
991
  }
992
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserDetailComponent, decorators: [{
992
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: UserDetailComponent, decorators: [{
993
993
  type: Component,
994
994
  args: [{ selector: 'rolatech-user-detail', imports: [CommonModule, MatTabsModule, ToolbarComponent, MatButtonModule, MatIcon, MatMenuModule], template: "<rolatech-toolbar title=\"Users\" link=\"../\"> </rolatech-toolbar>\n<div class=\"p-4 space-y-4\">\n <!-- Header -->\n <div class=\"flex items-start justify-between gap-4\">\n <div class=\"flex items-start gap-3 min-w-0\">\n <!-- avatar -->\n <div class=\"relative\">\n @if (avatarUrl()) {\n <img class=\"w-12 h-12 rounded-full object-cover border\" [src]=\"avatarUrl()!\" alt=\"avatar\" />\n } @else {\n <div\n class=\"w-12 h-12 rounded-full border bg-[--rt-brand-color] text-white flex items-center justify-center font-semibold\"\n >\n {{ initials() }}\n </div>\n }\n\n <!-- status dot -->\n <span\n class=\"absolute -right-0 -bottom-0 w-3 h-3 rounded-full border border-[--rt-border-color] bg-[--rt-base-background] flex items-center justify-center\"\n >\n <span\n class=\"w-2 h-2 rounded-full\"\n [class]=\"\n user()?.status?.toString() === 'ACTIVE'\n ? 'bg-green-500'\n : user()?.status?.toString() === 'LOCKED'\n ? 'bg-red-500'\n : 'bg-amber-500'\n \"\n ></span>\n </span>\n </div>\n\n <div class=\"min-w-0\">\n <div class=\"flex items-center gap-2 min-w-0\">\n <h1 class=\"text-2xl font-semibold truncate\">{{ name() }}</h1>\n\n @if (user()?.status?.toString() === 'LOCKED') {\n <span class=\"px-2 py-0.5 rounded-md text-xs bg-red-500/10 text-red-700 border border-red-500/20\">\n <mat-icon class=\"align-middle !text-[14px] mr-1\">lock</mat-icon>\n Locked\n </span>\n } @else if (user()?.status?.toString() === 'DISABLED') {\n <span class=\"px-2 py-0.5 rounded-md text-xs bg-red-500/10 text-red-700 border border-red-500/20\"> Disabled </span>\n }\n </div>\n\n <div class=\"text-sm opacity-70 flex items-center gap-2 mt-1\">\n <span>{{ user()?.status?.toString() === 'ACTIVE' ? 'Active' : (user()?.status ?? '\u2014') }}</span>\n </div>\n </div>\n </div>\n\n <!-- actions -->\n <!-- <div class=\"flex items-center gap-2\">\n <button mat-stroked-button (click)=\"openUserObject()\">User object</button>\n <button mat-flat-button color=\"primary\" (click)=\"editProfile()\">Edit profile</button>\n\n <button mat-icon-button [matMenuTriggerFor]=\"moreMenu\" aria-label=\"More\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n <mat-menu #moreMenu=\"matMenu\">\n <button mat-menu-item (click)=\"toggleStatus()\">\n <mat-icon>{{ user()?.status?.toString() === 'ACTIVE' ? 'block' : 'check_circle' }}</mat-icon>\n <span>{{ user()?.status?.toString() === 'ACTIVE' ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"resetPassword()\">\n <mat-icon>vpn_key</mat-icon>\n <span>Reset password</span>\n </button>\n <button mat-menu-item (click)=\"copyId()\">\n <mat-icon>content_copy</mat-icon>\n <span>Copy user ID</span>\n </button>\n </mat-menu>\n </div> -->\n </div>\n\n <!-- Info strip (2 columns like screenshot) -->\n <div class=\"grid grid-cols-1 lg:grid-cols-2 gap-6 border-b pb-5\">\n <dl class=\"space-y-3 text-sm\">\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">badge</mat-icon> User ID</dt>\n <dd class=\"font-mono text-xs truncate max-w-[65%]\">{{ user()?.id }}</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">alternate_email</mat-icon> Username</dt>\n <dd class=\"truncate max-w-[65%]\">&#64;{{ user()?.username }}</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">call</mat-icon> Phone number</dt>\n <dd class=\"truncate max-w-[65%]\">{{ user()?.phone ?? '\u2014' }}</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">mail</mat-icon> Email address</dt>\n <dd class=\"truncate max-w-[65%]\">{{ user()?.email ?? '\u2014' }}</dd>\n </div>\n </dl>\n\n <dl class=\"space-y-3 text-sm\">\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">lock</mat-icon> Password</dt>\n <dd class=\"truncate max-w-[65%]\">None</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">verified_user</mat-icon> 2-step auth</dt>\n <dd class=\"truncate max-w-[65%]\">\u2014</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">key</mat-icon> Passkey</dt>\n <dd class=\"truncate max-w-[65%]\">\u2014</dd>\n </div>\n\n <div class=\"flex items-center justify-between gap-3\">\n <dt class=\"flex items-center gap-2 opacity-70\"><mat-icon class=\"!text-base\">event</mat-icon> User since</dt>\n <dd class=\"truncate max-w-[65%]\">{{ createdAtLabel() }}</dd>\n </div>\n </dl>\n </div>\n</div>\n" }]
995
995
  }] });