@rolatech/angular-user 20.2.4-beta.2 → 20.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Component, viewChild, input, Injectable, model, effect, ViewEncapsulation, output, HostBinding, signal } from '@angular/core';
2
+ import { inject, Component, Pipe, signal, input, Injectable, model, effect, ViewEncapsulation, output, HostBinding, computed } from '@angular/core';
3
3
  import { CommonModule } from '@angular/common';
4
4
  import { BaseComponent, ContainerComponent, ToolbarComponent, RichLabelComponent, EmptyComponent, AcceptDialogComponent, RejectDialogComponent, PdfViewerComponent, TabsComponent, TabComponent, AvatarComponent, RichViewComponent, RichItemComponent } from '@rolatech/angular-components';
5
5
  import { AuthAgentService, AuthUserService, AuthService } from '@rolatech/angular-auth';
@@ -13,18 +13,21 @@ import * as i2$1 from '@angular/material/button';
13
13
  import { MatButtonModule } from '@angular/material/button';
14
14
  import * as i5 from '@angular/material/progress-spinner';
15
15
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
16
+ import { AngularCommonModule } from '@rolatech/angular-common';
16
17
  import * as i1$1 from '@angular/material/paginator';
17
- import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
18
+ import { MatPaginatorModule } from '@angular/material/paginator';
18
19
  import * as i3$1 from '@angular/material/icon';
19
- import { MatIconModule } from '@angular/material/icon';
20
+ import { MatIconModule, MatIcon } from '@angular/material/icon';
20
21
  import * as i4 from '@angular/material/menu';
21
22
  import { MatMenuModule } from '@angular/material/menu';
23
+ import { MatSelectModule } from '@angular/material/select';
24
+ import { map, distinctUntilChanged, switchMap, finalize, BehaviorSubject } from 'rxjs';
22
25
  import { RouterLink, RouterOutlet, ActivatedRoute } from '@angular/router';
23
- import { BehaviorSubject } from 'rxjs';
24
26
  import { CourseService } from '@rolatech/angular-course';
25
27
  import { ProductService } from '@rolatech/angular-services';
26
28
  import { Title } from '@angular/platform-browser';
27
- import { map } from 'lodash';
29
+ import { map as map$1 } from 'lodash';
30
+ import { MatTabsModule } from '@angular/material/tabs';
28
31
 
29
32
  var AgentApplicationStatus;
30
33
  (function (AgentApplicationStatus) {
@@ -124,96 +127,283 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
124
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" }]
125
128
  }] });
126
129
 
130
+ class UserNamePipe {
131
+ transform(user) {
132
+ return userDisplayName$1(user);
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" });
136
+ }
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserNamePipe, decorators: [{
138
+ type: Pipe,
139
+ args: [{
140
+ name: 'userName',
141
+ standalone: true,
142
+ pure: true,
143
+ }]
144
+ }] });
145
+ class UserInitialsPipe {
146
+ transform(user) {
147
+ return userInitials$1(user);
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" });
151
+ }
152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserInitialsPipe, decorators: [{
153
+ type: Pipe,
154
+ args: [{
155
+ name: 'userInitials',
156
+ standalone: true,
157
+ pure: true,
158
+ }]
159
+ }] });
160
+ class UserAvatarPipe {
161
+ transform(user) {
162
+ return userAvatarUrl$1(user);
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" });
166
+ }
167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserAvatarPipe, decorators: [{
168
+ type: Pipe,
169
+ args: [{
170
+ name: 'userAvatar',
171
+ standalone: true,
172
+ pure: true,
173
+ }]
174
+ }] });
175
+ class UserSincePipe {
176
+ transform(user, format = { year: 'numeric', month: 'short', day: '2-digit' }) {
177
+ const d = parseUserDateTime$1(user?.createdAt);
178
+ return d ? new Intl.DateTimeFormat(undefined, format).format(d) : '—';
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" });
182
+ }
183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserSincePipe, decorators: [{
184
+ type: Pipe,
185
+ args: [{
186
+ name: 'userSince',
187
+ standalone: true,
188
+ pure: true,
189
+ }]
190
+ }] });
191
+ /** Best display name with safe fallbacks */
192
+ function userDisplayName$1(u) {
193
+ if (!u)
194
+ return '';
195
+ return (u.name?.trim() || [u.firstName, u.lastName].filter(Boolean).join(' ').trim() || u.username || u.email || 'Unknown User');
196
+ }
197
+ /** Initials for avatar fallback */
198
+ function userInitials$1(u) {
199
+ const name = userDisplayName$1(u);
200
+ if (!name)
201
+ return 'U';
202
+ const parts = name.split(/\s+/).slice(0, 2);
203
+ return parts.map((p) => p[0]?.toUpperCase() ?? '').join('');
204
+ }
205
+ /** Avatar URL or null (let UI render initials) */
206
+ function userAvatarUrl$1(u) {
207
+ if (!u?.avatar)
208
+ return null;
209
+ return u.avatar;
210
+ }
211
+ /**
212
+ * Parses "yyyy-MM-dd HH:mm:ss" into Date (local)
213
+ */
214
+ function parseUserDateTime$1(value) {
215
+ if (!value)
216
+ return null;
217
+ // Convert to ISO-like: "2025-05-06T14:26:17"
218
+ const isoLike = value.replace(' ', 'T');
219
+ const d = new Date(isoLike);
220
+ return isNaN(d.getTime()) ? null : d;
221
+ }
222
+
223
+ class UserRolesPipe {
224
+ transform(user) {
225
+ return userRoleNames(user);
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" });
229
+ }
230
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserRolesPipe, decorators: [{
231
+ type: Pipe,
232
+ args: [{ name: 'userRoles', standalone: true, pure: true }]
233
+ }] });
234
+ class TakePipe {
235
+ transform(arr, count = 2) {
236
+ return (arr ?? []).slice(0, Math.max(0, count));
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" });
240
+ }
241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: TakePipe, decorators: [{
242
+ type: Pipe,
243
+ args: [{ name: 'take', standalone: true, pure: true }]
244
+ }] });
245
+ class SkipPipe {
246
+ transform(arr, count = 2) {
247
+ return (arr ?? []).slice(Math.max(0, count));
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" });
251
+ }
252
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: SkipPipe, decorators: [{
253
+ type: Pipe,
254
+ args: [{ name: 'skip', standalone: true, pure: true }]
255
+ }] });
256
+ class MoreCountPipe {
257
+ transform(arr, shown = 2) {
258
+ const len = (arr ?? []).length;
259
+ return Math.max(0, len - Math.max(0, shown));
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" });
263
+ }
264
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: MoreCountPipe, decorators: [{
265
+ type: Pipe,
266
+ args: [{ name: 'moreCount', standalone: true, pure: true }]
267
+ }] });
268
+ /** Role names: ["USER", "ADMIN"] */
269
+ function userRoleNames(u) {
270
+ return (u?.roles ?? []).map((r) => r.name || r.authority).filter((v) => Boolean(v));
271
+ }
272
+ /** Single primary role (for tables) */
273
+ function userPrimaryRole(u) {
274
+ return userRoleNames(u)[0] ?? '—';
275
+ }
276
+
127
277
  class UserIndexComponent extends BaseComponent {
128
278
  authUserService = inject(AuthUserService);
129
- paginator = viewChild(MatPaginator, ...(ngDevMode ? [{ debugName: "paginator" }] : []));
130
- users = [];
279
+ // data
280
+ // loading = signal(false);
281
+ users = signal([], ...(ngDevMode ? [{ debugName: "users" }] : []));
282
+ // your roles list (load from API if needed)
283
+ roles = signal(['ADMIN', 'AGENT', 'LANDLORD', 'TENANT', 'USER'], ...(ngDevMode ? [{ debugName: "roles" }] : []));
284
+ loading = false;
285
+ meta;
131
286
  pageEvent;
132
- isLoading = false;
133
- isSearch = false;
134
287
  length = 100;
135
288
  pageSize = 15;
136
289
  pageSizeOptions = [5, 10, 25, 100];
137
- orderOptions = [
138
- {
139
- key: 'createdAt',
140
- value: 'Created At',
141
- icon: 'arrow_upward',
142
- sort: 'asc',
143
- },
144
- {
145
- key: 'createdAt',
146
- value: 'Created At',
147
- icon: 'arrow_downward',
148
- sort: 'desc',
149
- },
150
- ];
151
- orderString = 'createdAt desc';
290
+ pageIndex = signal(0, ...(ngDevMode ? [{ debugName: "pageIndex" }] : []));
152
291
  ngOnInit() {
153
- this.findAll();
154
- }
155
- findAll(event) {
156
- this.isLoading = true;
157
- this.isSearch = false;
158
- const page = event ? event.pageIndex + 1 : 1;
159
- const limit = event ? event.pageSize : 15;
160
- const sort = this.orderString;
161
- const options = {
162
- page,
163
- limit,
164
- sort,
165
- };
166
- this.authUserService.findAll(options).subscribe({
292
+ const sub = this.route.queryParamMap
293
+ .pipe(map((p) => {
294
+ const page = p.get('page') ? Number(p.get('page')) : 1;
295
+ this.pageIndex.set(Math.max(page - 1, 0));
296
+ const status = p.get('status') || undefined;
297
+ let filter = '';
298
+ if (status) {
299
+ filter = `status:${status?.toUpperCase()}`;
300
+ }
301
+ return {
302
+ page,
303
+ filter,
304
+ limit: p.get('limit') ? Number(p.get('limit')) : 15,
305
+ sort: p.get('sort') || undefined,
306
+ };
307
+ }),
308
+ // Cheap deep compare via JSON to avoid spam calls when nothing changed
309
+ map((o) => JSON.stringify(o)), distinctUntilChanged(), map((s) => JSON.parse(s)), switchMap((params) => {
310
+ this.loading = true;
311
+ params['sort'] = 'createdAt desc';
312
+ return this.authUserService.findAll(params).pipe(finalize(() => (this.loading = false)));
313
+ }))
314
+ .subscribe({
167
315
  next: (res) => {
168
- this.users = res.data;
316
+ this.users.set(res.data);
317
+ this.meta = res.meta;
169
318
  this.length = res.meta.pagination.count;
170
- this.isLoading = false;
319
+ this.loading = false;
171
320
  },
172
- error: (error) => {
173
- this.isLoading = false;
174
- this.snackBarService.open(error.message);
321
+ error: () => {
322
+ this.users.set([]);
323
+ this.length = 0;
324
+ this.loading = false;
175
325
  },
176
326
  });
327
+ // // auto-unsubscribe on destroy
328
+ this.destroyRef.onDestroy(() => sub.unsubscribe());
177
329
  }
178
- search(e) {
179
- this.isLoading = true;
180
- const word = e.target.value;
181
- const options = {
182
- filter: `name:${word}`,
183
- };
184
- this.authUserService.findAll(options).subscribe({
185
- next: (res) => {
186
- this.users = res.data;
187
- this.length = res.meta.pagination.count;
188
- this.isLoading = false;
189
- },
190
- error: (error) => {
191
- this.isLoading = false;
192
- this.snackBarService.open(error.message);
193
- },
330
+ // fetch(): void {
331
+ // this.loading.set(true);
332
+ // this.authUserService
333
+ // .findAll({
334
+ // // filter: `name:${this.q()}`,
335
+ // // page: this.page(),
336
+ // // limit: this.size(),
337
+ // // sort: 'createdAt desc',
338
+ // })
339
+ // .pipe(finalize(() => this.loading.set(false)))
340
+ // .subscribe((res) => {
341
+ // this.users.set(res.data ?? []);
342
+ // this.total.set(res.meta.pagination.count ?? 0);
343
+ // });
344
+ // }
345
+ // search(e: any) {
346
+ // this.isLoading = true;
347
+ // const word = e.target.value;
348
+ // const options = {
349
+ // filter: `name:${word}`,
350
+ // };
351
+ // this.authUserService.findAll(options).subscribe({
352
+ // next: (res: any) => {
353
+ // this.users = res.data;
354
+ // this.length = res.meta.pagination.count;
355
+ // this.isLoading = false;
356
+ // },
357
+ // error: (error) => {
358
+ // this.isLoading = false;
359
+ // this.snackBarService.open(error.message);
360
+ // },
361
+ // });
362
+ // }
363
+ onPage(e) {
364
+ this.router.navigate([], {
365
+ queryParams: { page: e.pageIndex + 1, limit: e.pageSize },
366
+ queryParamsHandling: 'merge',
367
+ replaceUrl: true, // optional: avoid stacking history on every page click
194
368
  });
195
369
  }
196
- onClick(item) {
197
- this.orderString = item.key + ' ' + item.sort;
198
- this.paginator()?.firstPage();
199
- this.findAll(null);
370
+ openUser(id) {
371
+ this.router.navigate(['/users', id]);
372
+ }
373
+ toggleStatus(u) {
374
+ // call your API then refresh
375
+ // this.api.toggleStatus(u.id)...
376
+ console.log('toggleStatus', u.id);
200
377
  }
378
+ resetPassword(u) {
379
+ console.log('resetPassword', u.id);
380
+ }
381
+ trackById = (_, u) => u.id;
201
382
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserIndexComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
202
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: UserIndexComponent, isStandalone: true, selector: "rolatech-user-index", viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<rolatech-toolbar title=\"Users\">\n <button mat-icon-button (click)=\"isSearch = true\">\n <mat-icon>search</mat-icon>\n </button>\n <button mat-icon-button [matMenuTriggerFor]=\"beforeMenu\">\n <mat-icon>sort</mat-icon>\n </button>\n <mat-menu #beforeMenu=\"matMenu\" xPosition=\"before\">\n @for (item of orderOptions; track item) {\n <button mat-menu-item (click)=\"onClick(item)\">\n <span>{{ item.value }}</span>\n <mat-icon>{{ item.icon }}</mat-icon>\n </button>\n }\n </mat-menu>\n</rolatech-toolbar>\n<div class=\"px-4\">\n @if (isSearch) {\n <mat-form-field floatLabel=\"auto\" subscriptSizing=\"dynamic\">\n <input type=\"text\" matInput placeholder=\"Name\" (keyup.enter)=\"search($event)\" />\n <button matSuffix mat-icon-button (click)=\"findAll(null); isSearch = false\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n }\n <div>\n @for (user of users; track $index) {\n <div class=\"flex w-full justify-between items-center py-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 </div>\n <hr />\n }\n </div>\n</div>\n\n<mat-paginator\n #paginator\n [length]=\"length\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"pageEvent = findAll($event)\"\n hidePageSize\n showFirstLastButtons\n>\n</mat-paginator>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { 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.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", 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: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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"] }] });
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" }] });
203
384
  }
204
385
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserIndexComponent, decorators: [{
205
386
  type: Component,
206
387
  args: [{ selector: 'rolatech-user-index', imports: [
207
388
  CommonModule,
208
- ToolbarComponent,
209
389
  MatPaginatorModule,
210
390
  MatButtonModule,
211
391
  MatIconModule,
212
392
  MatMenuModule,
213
393
  MatFormFieldModule,
214
394
  MatInputModule,
215
- ], template: "<rolatech-toolbar title=\"Users\">\n <button mat-icon-button (click)=\"isSearch = true\">\n <mat-icon>search</mat-icon>\n </button>\n <button mat-icon-button [matMenuTriggerFor]=\"beforeMenu\">\n <mat-icon>sort</mat-icon>\n </button>\n <mat-menu #beforeMenu=\"matMenu\" xPosition=\"before\">\n @for (item of orderOptions; track item) {\n <button mat-menu-item (click)=\"onClick(item)\">\n <span>{{ item.value }}</span>\n <mat-icon>{{ item.icon }}</mat-icon>\n </button>\n }\n </mat-menu>\n</rolatech-toolbar>\n<div class=\"px-4\">\n @if (isSearch) {\n <mat-form-field floatLabel=\"auto\" subscriptSizing=\"dynamic\">\n <input type=\"text\" matInput placeholder=\"Name\" (keyup.enter)=\"search($event)\" />\n <button matSuffix mat-icon-button (click)=\"findAll(null); isSearch = false\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n }\n <div>\n @for (user of users; track $index) {\n <div class=\"flex w-full justify-between items-center py-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 </div>\n <hr />\n }\n </div>\n</div>\n\n<mat-paginator\n #paginator\n [length]=\"length\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"pageEvent = findAll($event)\"\n hidePageSize\n showFirstLastButtons\n>\n</mat-paginator>\n", styles: ["mat-form-field{width:100%}\n"] }]
216
- }], propDecorators: { paginator: [{ type: i0.ViewChild, args: [i0.forwardRef(() => MatPaginator), { isSignal: true }] }] } });
395
+ AngularCommonModule,
396
+ UserInitialsPipe,
397
+ UserAvatarPipe,
398
+ UserNamePipe,
399
+ UserSincePipe,
400
+ UserRolesPipe,
401
+ TakePipe,
402
+ MoreCountPipe,
403
+ MatSelectModule,
404
+ MatMenuModule,
405
+ ], 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"] }]
406
+ }] });
217
407
 
218
408
  class AgentManageApplicationDetailComponent extends BaseComponent {
219
409
  authAgentService = inject(AuthAgentService);
@@ -699,8 +889,8 @@ class UserFollowInfoComponent {
699
889
  listFollowingByUsername() {
700
890
  this.authUserService.listFollowingByUsername(this.username).subscribe({
701
891
  next: (res) => {
702
- this.users = map(res.data, 'user');
703
- const ids = map(res.data, 'user.id');
892
+ this.users = map$1(res.data, 'user');
893
+ const ids = map$1(res.data, 'user.id');
704
894
  this.friendships(ids);
705
895
  },
706
896
  });
@@ -708,8 +898,8 @@ class UserFollowInfoComponent {
708
898
  listFollowersByUsername() {
709
899
  this.authUserService.listFollowersByUsername(this.username).subscribe({
710
900
  next: (res) => {
711
- this.users = map(res.data, 'follower');
712
- const ids = map(res.data, 'follower.id');
901
+ this.users = map$1(res.data, 'follower');
902
+ const ids = map$1(res.data, 'follower.id');
713
903
  this.friendships(ids);
714
904
  },
715
905
  });
@@ -766,9 +956,89 @@ const userRoutes = [
766
956
  },
767
957
  ];
768
958
 
959
+ class UserDetailComponent extends BaseComponent {
960
+ user = signal(null, ...(ngDevMode ? [{ debugName: "user" }] : []));
961
+ authUserService = inject(AuthUserService);
962
+ name = computed(() => userDisplayName(this.user()), ...(ngDevMode ? [{ debugName: "name" }] : []));
963
+ initials = computed(() => userInitials(this.user()), ...(ngDevMode ? [{ debugName: "initials" }] : []));
964
+ avatarUrl = computed(() => userAvatarUrl(this.user()), ...(ngDevMode ? [{ debugName: "avatarUrl" }] : []));
965
+ createdAtLabel = computed(() => {
966
+ const d = parseUserDateTime(this.user()?.createdAt);
967
+ return d ? new Intl.DateTimeFormat(undefined, { year: 'numeric', month: 'long', day: '2-digit' }).format(d) : '—';
968
+ }, ...(ngDevMode ? [{ debugName: "createdAtLabel" }] : []));
969
+ ngOnInit() {
970
+ this.get();
971
+ }
972
+ get() {
973
+ this.authUserService.get(this.id).subscribe({
974
+ next: (res) => {
975
+ this.user.set(res.data);
976
+ },
977
+ });
978
+ }
979
+ // actions
980
+ openUserObject() { }
981
+ editProfile() { }
982
+ toggleStatus() { }
983
+ resetPassword() { }
984
+ copyId() { }
985
+ addToOrg() { }
986
+ addEmail() { }
987
+ addPhone() { }
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 }] });
991
+ }
992
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserDetailComponent, decorators: [{
993
+ type: Component,
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
+ }] });
996
+ /** Best display name with safe fallbacks */
997
+ function userDisplayName(u) {
998
+ if (!u)
999
+ return '';
1000
+ return (u.name?.trim() || [u.firstName, u.lastName].filter(Boolean).join(' ').trim() || u.username || u.email || 'Unknown User');
1001
+ }
1002
+ /** Initials for avatar fallback */
1003
+ function userInitials(u) {
1004
+ const name = userDisplayName(u);
1005
+ if (!name)
1006
+ return 'U';
1007
+ const parts = name.split(/\s+/).slice(0, 2);
1008
+ return parts.map((p) => p[0]?.toUpperCase() ?? '').join('');
1009
+ }
1010
+ /** Avatar URL or null (let UI render initials) */
1011
+ function userAvatarUrl(u) {
1012
+ if (!u?.avatar)
1013
+ return null;
1014
+ return u.avatar;
1015
+ }
1016
+ /**
1017
+ * Parses "yyyy-MM-dd HH:mm:ss" into Date (local)
1018
+ */
1019
+ function parseUserDateTime(value) {
1020
+ if (!value)
1021
+ return null;
1022
+ // Convert to ISO-like: "2025-05-06T14:26:17"
1023
+ const isoLike = value.replace(' ', 'T');
1024
+ const d = new Date(isoLike);
1025
+ return isNaN(d.getTime()) ? null : d;
1026
+ }
1027
+
1028
+ const userManageRoutes = [
1029
+ {
1030
+ path: '',
1031
+ component: UserIndexComponent,
1032
+ },
1033
+ {
1034
+ path: ':id',
1035
+ component: UserDetailComponent,
1036
+ },
1037
+ ];
1038
+
769
1039
  /**
770
1040
  * Generated bundle index. Do not edit.
771
1041
  */
772
1042
 
773
- export { AgentApplicationComponent, AgentApplicationDetailComponent, UserIndexComponent, agentManageApplicationRoutes, agentRoutes, userRoutes };
1043
+ export { AgentApplicationComponent, AgentApplicationDetailComponent, UserIndexComponent, agentManageApplicationRoutes, agentRoutes, userManageRoutes, userRoutes };
774
1044
  //# sourceMappingURL=rolatech-angular-user.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"rolatech-angular-user.mjs","sources":["../../../../packages/angular-user/src/lib/interfaces/agent-application.ts","../../../../packages/angular-user/src/lib/pages/agent/agent-application-detail/agent-application-detail.component.ts","../../../../packages/angular-user/src/lib/pages/agent/agent-application-detail/agent-application-detail.component.html","../../../../packages/angular-user/src/lib/pages/agent/agent-application/agent-application.component.ts","../../../../packages/angular-user/src/lib/pages/agent/agent-application/agent-application.component.html","../../../../packages/angular-user/src/lib/pages/user-index/user-index.component.ts","../../../../packages/angular-user/src/lib/pages/user-index/user-index.component.html","../../../../packages/angular-user/src/lib/pages/agent-manage/agent-manage-application-detail/agent-manage-application-detail.component.ts","../../../../packages/angular-user/src/lib/pages/agent-manage/agent-manage-application-detail/agent-manage-application-detail.component.html","../../../../packages/angular-user/src/lib/components/agent-application-item/agent-application-item.component.ts","../../../../packages/angular-user/src/lib/components/agent-application-item/agent-application-item.component.html","../../../../packages/angular-user/src/lib/pages/agent-manage/agent-manage-application-index/agent-manage-application-index.component.ts","../../../../packages/angular-user/src/lib/pages/agent-manage/agent-manage-application-index/agent-manage-application-index.component.html","../../../../packages/angular-user/src/lib/pages/agent-manage/agent-manage-application.routes.ts","../../../../packages/angular-user/src/lib/pages/agent/agent.routes.ts","../../../../packages/angular-user/src/lib/user-data.service.ts","../../../../packages/angular-user/src/lib/components/user-layout/user-layout.component.ts","../../../../packages/angular-user/src/lib/components/user-layout/user-layout.component.html","../../../../packages/angular-user/src/lib/pages/user-info/user-info.component.ts","../../../../packages/angular-user/src/lib/pages/user-info/user-info.component.html","../../../../packages/angular-user/src/lib/pages/user-community/user-community.component.ts","../../../../packages/angular-user/src/lib/pages/user-community/user-community.component.html","../../../../packages/angular-user/src/lib/pages/user-store/user-store.component.ts","../../../../packages/angular-user/src/lib/pages/user-store/user-store.component.html","../../../../packages/angular-user/src/lib/components/user-item/user-item.component.ts","../../../../packages/angular-user/src/lib/components/user-item/user-item.component.html","../../../../packages/angular-user/src/lib/pages/user-follow-info/user-follow-info.component.ts","../../../../packages/angular-user/src/lib/pages/user-follow-info/user-follow-info.component.html","../../../../packages/angular-user/src/lib/pages/user.routes.ts","../../../../packages/angular-user/src/rolatech-angular-user.ts"],"sourcesContent":["import { User } from '@rolatech/angular-common';\n\nexport interface AgentApplicationRequest {\n firstName: string;\n lastName: string;\n businessName: string;\n website: string;\n email: string;\n phone: string;\n experienceYears: number;\n}\nexport interface AgentApplication {\n id: string;\n firstName: string;\n lastName: string;\n businessName: string;\n website: string;\n email: string;\n phone: string;\n experienceYears: number;\n status: AgentApplicationStatus;\n documents: string[];\n createdAt: string;\n userId: string;\n user: User;\n}\nexport enum AgentApplicationStatus {\n PENDING = 'Pending',\n APPROVED = 'Approved',\n REJECTED = 'Rejected',\n}\n","import { Component, inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n BaseComponent,\n ContainerComponent,\n EmptyComponent,\n RichLabelComponent,\n ToolbarComponent,\n} from '@rolatech/angular-components';\nimport { AuthAgentService } from '@rolatech/angular-auth';\nimport { AgentApplicationStatus } from '../../../interfaces/agent-application';\n\n@Component({\n selector: 'rolatech-agent-application-detail',\n imports: [CommonModule, ContainerComponent, ToolbarComponent, RichLabelComponent, EmptyComponent],\n templateUrl: './agent-application-detail.component.html',\n styleUrl: './agent-application-detail.component.scss',\n})\nexport class AgentApplicationDetailComponent extends BaseComponent implements OnInit {\n authAgentService = inject(AuthAgentService);\n application: any = {\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n businessName: '',\n website: '',\n };\n applicationStatus = AgentApplicationStatus;\n ngOnInit(): void {\n this.getApplication();\n }\n getApplication() {\n this.authAgentService.myApplication().subscribe({\n next: (res) => {\n this.application = res.data;\n },\n });\n }\n}\n","<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","import { Component, inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { AuthAgentService } from '@rolatech/angular-auth';\nimport { BaseComponent } from '@rolatech/angular-components';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\n@Component({\n selector: 'rolatech-agent-application',\n imports: [CommonModule, MatFormFieldModule, MatInputModule, FormsModule, MatButtonModule, MatProgressSpinnerModule],\n templateUrl: './agent-application.component.html',\n styleUrl: './agent-application.component.scss',\n})\nexport class AgentApplicationComponent extends BaseComponent implements OnInit {\n authAgentService = inject(AuthAgentService);\n application: any = {\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n businessName: '',\n website: '',\n };\n selectedFiles: File[] = [];\n sending = false;\n ngOnInit(): void {\n this.getApplication();\n }\n getApplication() {\n this.authAgentService.myApplication().subscribe({\n next: (res) => {\n this.application = res.data;\n if (res.data) {\n this.router.navigate([`./${res.data.id}`], {\n relativeTo: this.route,\n });\n }\n },\n });\n }\n onFileSelected(event: any) {\n const input = event.target as HTMLInputElement;\n if (input?.files?.length) {\n this.selectedFiles = Array.from(input.files);\n }\n }\n submitApplication() {\n this.sending = true;\n const formData = new FormData();\n formData.append('application', new Blob([JSON.stringify(this.application)], { type: 'application/json' }));\n\n for (const file of this.selectedFiles) {\n formData.append('documents', file);\n }\n this.authAgentService.apply(formData).subscribe({\n next: (res) => {\n this.sending = false;\n this.snackBarService.open('Sent successfully');\n this.router.navigate([`./${res.data.id}`], {\n relativeTo: this.route,\n });\n },\n error: (error) => {\n this.sending = false;\n this.snackBarService.open(error.message);\n },\n });\n }\n}\n","<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","import { Component, inject, OnInit, viewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AuthUserService } from '@rolatech/angular-auth';\nimport { BaseComponent, ToolbarComponent } from '@rolatech/angular-components';\nimport { User } from '@rolatech/angular-common';\nimport { MatPaginator, MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\n\n@Component({\n selector: 'rolatech-user-index',\n imports: [\n CommonModule,\n ToolbarComponent,\n MatPaginatorModule,\n MatButtonModule,\n MatIconModule,\n MatMenuModule,\n MatFormFieldModule,\n MatInputModule,\n ],\n templateUrl: './user-index.component.html',\n styleUrl: './user-index.component.scss',\n})\nexport class UserIndexComponent extends BaseComponent implements OnInit {\n authUserService = inject(AuthUserService);\n paginator = viewChild(MatPaginator);\n users: User[] = [];\n pageEvent!: PageEvent;\n isLoading = false;\n isSearch = false;\n length = 100;\n pageSize = 15;\n pageSizeOptions: number[] = [5, 10, 25, 100];\n orderOptions = [\n {\n key: 'createdAt',\n value: 'Created At',\n icon: 'arrow_upward',\n sort: 'asc',\n },\n {\n key: 'createdAt',\n value: 'Created At',\n icon: 'arrow_downward',\n sort: 'desc',\n },\n ];\n orderString = 'createdAt desc';\n ngOnInit(): void {\n this.findAll();\n }\n findAll(event?: PageEvent | null): any {\n this.isLoading = true;\n this.isSearch = false;\n const page = event ? event.pageIndex + 1 : 1;\n const limit = event ? event.pageSize : 15;\n const sort = this.orderString;\n const options = {\n page,\n limit,\n sort,\n };\n this.authUserService.findAll(options).subscribe({\n next: (res) => {\n this.users = res.data;\n this.length = res.meta.pagination.count;\n this.isLoading = false;\n },\n error: (error) => {\n this.isLoading = false;\n this.snackBarService.open(error.message);\n },\n });\n }\n search(e: any) {\n this.isLoading = true;\n const word = e.target.value;\n const options = {\n filter: `name:${word}`,\n };\n this.authUserService.findAll(options).subscribe({\n next: (res: any) => {\n this.users = res.data;\n this.length = res.meta.pagination.count;\n this.isLoading = false;\n },\n error: (error) => {\n this.isLoading = false;\n this.snackBarService.open(error.message);\n },\n });\n }\n onClick(item: any) {\n this.orderString = item.key + ' ' + item.sort;\n this.paginator()?.firstPage();\n this.findAll(null);\n }\n}\n","<rolatech-toolbar title=\"Users\">\n <button mat-icon-button (click)=\"isSearch = true\">\n <mat-icon>search</mat-icon>\n </button>\n <button mat-icon-button [matMenuTriggerFor]=\"beforeMenu\">\n <mat-icon>sort</mat-icon>\n </button>\n <mat-menu #beforeMenu=\"matMenu\" xPosition=\"before\">\n @for (item of orderOptions; track item) {\n <button mat-menu-item (click)=\"onClick(item)\">\n <span>{{ item.value }}</span>\n <mat-icon>{{ item.icon }}</mat-icon>\n </button>\n }\n </mat-menu>\n</rolatech-toolbar>\n<div class=\"px-4\">\n @if (isSearch) {\n <mat-form-field floatLabel=\"auto\" subscriptSizing=\"dynamic\">\n <input type=\"text\" matInput placeholder=\"Name\" (keyup.enter)=\"search($event)\" />\n <button matSuffix mat-icon-button (click)=\"findAll(null); isSearch = false\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n }\n <div>\n @for (user of users; track $index) {\n <div class=\"flex w-full justify-between items-center py-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 </div>\n <hr />\n }\n </div>\n</div>\n\n<mat-paginator\n #paginator\n [length]=\"length\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"pageEvent = findAll($event)\"\n hidePageSize\n showFirstLastButtons\n>\n</mat-paginator>\n","import { Component, inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n AcceptDialogComponent,\n BaseComponent,\n EmptyComponent,\n RejectDialogComponent,\n RichLabelComponent,\n ThumbnailComponent,\n ToolbarComponent,\n} from '@rolatech/angular-components';\nimport { MatButtonModule } from '@angular/material/button';\nimport { AuthAgentService } from '@rolatech/angular-auth';\nimport { AgentApplication, AgentApplicationStatus } from '../../../interfaces/agent-application';\n\n@Component({\n selector: 'rolatech-agent-manage-application-detail',\n imports: [CommonModule, ToolbarComponent, MatButtonModule, RichLabelComponent, EmptyComponent],\n templateUrl: './agent-manage-application-detail.component.html',\n styleUrl: './agent-manage-application-detail.component.scss',\n})\nexport class AgentManageApplicationDetailComponent extends BaseComponent implements OnInit {\n authAgentService = inject(AuthAgentService);\n application!: AgentApplication;\n status = AgentApplicationStatus;\n ngOnInit(): void {\n this.getApplication();\n }\n getApplication() {\n this.authAgentService.getApplication(this.id).subscribe({\n next: (res) => {\n this.application = res.data;\n },\n });\n }\n approve() {\n const dialogRef = this.dialog.open(AcceptDialogComponent, {\n width: '400px',\n data: {\n title: 'Approve',\n message: 'Approve this agent application?',\n },\n });\n dialogRef.afterClosed().subscribe((result) => {\n if (result) {\n this.authAgentService.approve(this.id).subscribe({\n next: (res) => {\n console.log(res);\n // this.application.status = 'APPROVED';\n // this.application.status = AgentApplicationStatus['APPROVED' as keyof typeof AgentApplicationStatus];\n this.application.status = 'APPROVED' as AgentApplicationStatus;\n this.snackBarService.open('Approved');\n },\n error: (e) => {\n this.snackBarService.open(e.message);\n },\n });\n }\n });\n }\n reject() {\n const dialogRef = this.dialog.open(RejectDialogComponent, {\n width: '400px',\n data: {\n content: '',\n },\n });\n dialogRef.afterClosed().subscribe((result) => {\n if (result) {\n this.authAgentService.reject(this.id, result).subscribe({\n next: (res) => {\n this.application.status = 'REJECTED' as AgentApplicationStatus;\n this.snackBarService.open('Rejected');\n },\n error: (e) => {\n this.snackBarService.open(e.message);\n },\n });\n }\n });\n }\n}\n","@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","import { Component, input } from '@angular/core';\nimport { AgentApplication, AgentApplicationStatus } from '../../interfaces/agent-application';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'rolatech-agent-application-item',\n imports: [MatIconModule],\n templateUrl: './agent-application-item.component.html',\n styleUrl: './agent-application-item.component.scss',\n})\nexport class AgentApplicationItemComponent {\n application = input.required<AgentApplication>();\n status: any = AgentApplicationStatus;\n}\n","<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","import { Component, inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AuthAgentService } from '@rolatech/angular-auth';\nimport {\n BaseComponent,\n EmptyComponent,\n PdfViewerComponent,\n TabComponent,\n TabsComponent,\n ToolbarComponent,\n} from '@rolatech/angular-components';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { AgentApplicationItemComponent } from '../../../components/agent-application-item/agent-application-item.component';\nimport { RouterLink } from '@angular/router';\nimport { AgentApplication } from '../../../interfaces/agent-application';\n\n@Component({\n selector: 'rolatech-agent-manage-application-index',\n imports: [\n CommonModule,\n ToolbarComponent,\n TabsComponent,\n TabComponent,\n MatButtonModule,\n MatIconModule,\n AgentApplicationItemComponent,\n RouterLink,\n EmptyComponent,\n ],\n templateUrl: './agent-manage-application-index.component.html',\n styleUrl: './agent-manage-application-index.component.scss',\n})\nexport class AgentManageApplicationIndexComponent extends BaseComponent implements OnInit {\n authAgentService = inject(AuthAgentService);\n applications: AgentApplication[] = [];\n select = 0;\n links = [\n {\n name: 'All',\n icon: 'dashboard',\n },\n {\n name: 'Pending',\n icon: 'category',\n status: 'pending',\n },\n {\n name: 'Approved',\n icon: 'category',\n status: 'approved',\n },\n {\n name: 'Rejected',\n icon: 'category',\n status: 'rejected',\n },\n ];\n filterOptions: any = {\n type: '',\n status: '',\n };\n ngOnInit(): void {\n this.route.queryParams.subscribe(({ status }) => {\n this.select = this.links.findIndex((item) => item.status === status);\n if (status) {\n this.filterOptions.status = (status as string).toUpperCase();\n } else {\n delete this.filterOptions.status;\n }\n this.findApplications();\n });\n }\n findApplications() {\n const options = {\n sort: 'updatedAt desc',\n };\n const filterString = this.convertFilterOptions(this.filterOptions);\n if (filterString) {\n options['filter'] = filterString;\n }\n this.authAgentService.findAllApplications(options).subscribe({\n next: (res) => {\n this.applications = res.data;\n },\n });\n }\n convertFilterOptions(jsonObj) {\n return Object.entries(jsonObj)\n .filter(([key, value]) => value !== '' && value !== undefined)\n .map(([key, value]) => {\n return `${key}:${value}`;\n })\n .join(',');\n }\n viewPdf(url: string) {\n const options = {\n title: '',\n component: PdfViewerComponent,\n data: {\n url: url,\n },\n };\n this.dialogService.open(options);\n this.dialogService.confirmed();\n }\n}\n","<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","import { AgentManageApplicationDetailComponent } from './agent-manage-application-detail/agent-manage-application-detail.component';\nimport { AgentManageApplicationIndexComponent } from './agent-manage-application-index/agent-manage-application-index.component';\n\nexport const agentManageApplicationRoutes = [\n {\n path: '',\n component: AgentManageApplicationIndexComponent,\n },\n {\n path: ':id',\n component: AgentManageApplicationDetailComponent,\n },\n];\n","import { AgentApplicationComponent } from './agent-application/agent-application.component';\nimport { AgentApplicationDetailComponent } from './agent-application-detail/agent-application-detail.component';\n\nexport const agentRoutes = [\n {\n path: 'application',\n component: AgentApplicationComponent,\n },\n {\n path: 'application/:id',\n component: AgentApplicationDetailComponent,\n },\n];\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UserDataService {\n private userInfo = new BehaviorSubject<any>(null);\n data = this.userInfo.asObservable();\n send(data: any) {\n this.userInfo.next(data);\n }\n}\n","import { Component, effect, inject, model, OnInit } from '@angular/core';\nimport { AvatarComponent, BaseComponent, ContainerComponent, TabComponent, TabsComponent } from '@rolatech/angular-components';\nimport { AuthService, AuthUserService } from '@rolatech/angular-auth';\nimport { Course } from '@rolatech/angular-course';\nimport { UserDataService } from '../../user-data.service';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { RouterLink, RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'rolatech-user-layout',\n imports: [\n MatIconModule,\n RouterLink,\n ContainerComponent,\n AvatarComponent,\n TabsComponent,\n TabComponent,\n MatButtonModule,\n TabsComponent,\n TabComponent,\n RouterOutlet,\n ],\n templateUrl: './user-layout.component.html',\n styleUrl: './user-layout.component.scss',\n})\nexport class UserLayoutComponent extends BaseComponent implements OnInit {\n authService = inject(AuthService);\n authUserService = inject(AuthUserService);\n userDataService = inject(UserDataService);\n authenticated = this.authService.authenticated;\n userInfo: any;\n courses: Course[] = [];\n meta: any;\n isFollowed = false;\n username = '';\n selectIndex = model(0);\n path = '';\n statsData: any;\n constructor() {\n super();\n effect(() => {\n if (this.authenticated()) {\n this.checkIfFollowed();\n }\n });\n }\n ngOnInit(): void {\n this.username = this.route.snapshot.params['username'];\n this.stats();\n this.findUserInfo();\n this.route.params.subscribe((params) => {\n if (params['path'] === 'community') {\n this.selectIndex.set(1);\n }\n if (params['path'] === 'store') {\n this.selectIndex.set(2);\n }\n });\n }\n stats() {\n this.authUserService.followersStats(this.username).subscribe({\n next: (res) => {\n this.statsData = res.data;\n },\n });\n }\n findUserInfo() {\n this.authUserService.findUserInfoByUsername(this.username).subscribe({\n next: (res) => {\n this.userInfo = res.data;\n this.userDataService.send(res.data);\n if (res.data) {\n this.titleService.setTitle(`${this.userInfo.name}(@${this.userInfo.username}) - 拼小课`);\n } else {\n this.titleService.setTitle(`拼小课`);\n }\n },\n });\n }\n\n checkIfFollowed() {\n this.authUserService.isFollowing(this.username).subscribe({\n next: (res) => {\n this.isFollowed = res.data;\n },\n });\n }\n follow() {\n this.authUserService.follow(this.username).subscribe({\n next: (res) => {\n this.isFollowed = true;\n },\n });\n }\n unfollow() {\n this.authUserService.unfollow(this.username).subscribe({\n next: (res) => {\n this.isFollowed = false;\n },\n });\n }\n}\n","<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","import { Component, inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { BaseComponent, RichItemComponent, RichViewComponent } from '@rolatech/angular-components';\nimport { UserDataService } from '../../user-data.service';\nimport { CourseService, Course } from '@rolatech/angular-course';\nimport { RouterLink } from '@angular/router';\n\n@Component({\n selector: 'rolatech-user-info',\n imports: [RouterLink, RichViewComponent, RichItemComponent],\n templateUrl: './user-info.component.html',\n styleUrl: './user-info.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class UserInfoComponent extends BaseComponent implements OnInit {\n courseService = inject(CourseService);\n userDataService = inject(UserDataService);\n courses: Course[] = [];\n meta: any;\n constructor() {\n super();\n }\n ngOnInit(): void {\n this.userDataService.data.subscribe({\n next: (userInfo) => {\n this.findCoursesByInstructorId(userInfo.id);\n },\n });\n }\n findCoursesByInstructorId(instructorId: string) {\n const options = {\n filter: `instructorId:${instructorId},published:true`,\n sort: 'updatedAt desc',\n };\n this.courseService.find(options).subscribe({\n next: (res: any) => {\n this.courses = res.data;\n this.meta = res.meta;\n },\n });\n }\n}\n","<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","import { Component, inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UserDataService } from '../../user-data.service';\nimport { EmptyComponent } from '@rolatech/angular-components';\n\n@Component({\n selector: 'rolatech-user-community',\n imports: [CommonModule, EmptyComponent],\n templateUrl: './user-community.component.html',\n styleUrl: './user-community.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class UserCommunityComponent implements OnInit {\n userDataService = inject(UserDataService);\n ngOnInit(): void {\n this.userDataService.data.subscribe({\n next: (userInfo) => {},\n });\n }\n}\n","<rolatech-empty></rolatech-empty>\n","import { Component, inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ProductService } from '@rolatech/angular-services';\nimport { UserDataService } from '../../user-data.service';\nimport { RouterLink } from '@angular/router';\nimport { EmptyComponent, RichViewComponent, RichItemComponent } from '@rolatech/angular-components';\n\n@Component({\n selector: 'rolatech-user-store',\n imports: [CommonModule, EmptyComponent, RichViewComponent, RichItemComponent, RouterLink],\n templateUrl: './user-store.component.html',\n styleUrl: './user-store.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class UserStoreComponent implements OnInit {\n userDataService = inject(UserDataService);\n productService = inject(ProductService);\n products: any;\n ngOnInit(): void {\n this.userDataService.data.subscribe({\n next: (userInfo) => {\n this.findProductsByUserId(userInfo.id);\n },\n });\n }\n findProductsByUserId(userId: string) {\n const options = {\n filter: `userId:${userId}`,\n sort: 'updatedAt desc',\n };\n this.productService.find(options).subscribe({\n next: (res: any) => {\n this.products = res.data;\n },\n });\n }\n}\n","@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","import { Component, HostBinding, ViewEncapsulation, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\n\n@Component({\n selector: 'rolatech-user-item',\n imports: [CommonModule, MatButtonModule],\n templateUrl: './user-item.component.html',\n styleUrl: './user-item.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class UserItemComponent {\n @HostBinding('class.rolatech-user-item') hasClass = true;\n user = input<any>();\n isFollowing = input(true);\n follow = output<string>();\n unfollow = output();\n own = input();\n onFollow() {\n this.follow.emit(this.user().username);\n }\n onUnFollow() {\n this.unfollow.emit(this.user().username);\n }\n}\n","<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","import { Component, effect, inject, OnInit, signal, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Title } from '@angular/platform-browser';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport { AuthService, AuthUserService } from '@rolatech/angular-auth';\nimport { map } from 'lodash';\nimport { TabsComponent, TabComponent, ContainerComponent, ToolbarComponent } from '@rolatech/angular-components';\nimport { UserItemComponent } from '../../components/user-item/user-item.component';\n\n@Component({\n selector: 'rolatech-user-follow-info',\n imports: [CommonModule, TabsComponent, TabComponent, ContainerComponent, ToolbarComponent, RouterLink, UserItemComponent],\n templateUrl: './user-follow-info.component.html',\n styleUrl: './user-follow-info.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class UserFollowInfoComponent implements OnInit {\n title = inject(Title);\n route = inject(ActivatedRoute);\n authService = inject(AuthService);\n authUserService = inject(AuthUserService);\n authenticated = this.authService.authenticated;\n userId = this.authService.userId;\n tabIndex = signal(0);\n userInfo: any;\n users: any[] = [];\n username = '';\n path = '';\n myId = '';\n constructor() {\n this.route.params.subscribe({\n next: (params: any) => {\n this.username = params['username'];\n this.path = params.path;\n },\n });\n effect(() => {\n switch (this.tabIndex()) {\n case 0:\n this.listFollowingByUsername();\n break;\n case 1:\n this.listFollowersByUsername();\n break;\n default:\n break;\n }\n });\n }\n ngOnInit(): void {\n if (this.path === 'following') {\n this.tabIndex.set(0);\n } else {\n this.tabIndex.set(1);\n }\n this.findUserInfo();\n }\n findUserInfo() {\n this.authUserService.findUserInfoByUsername(this.username).subscribe({\n next: (res) => {\n this.userInfo = res.data;\n if (res.data) {\n this.title.setTitle(`${this.userInfo.name}(@${this.userInfo.username}) - 拼小课`);\n } else {\n this.title.setTitle(`拼小课`);\n }\n },\n });\n }\n follow(user: any) {\n this.authUserService.follow(user.username).subscribe({\n next: (res) => {\n user.isFollowing = true;\n },\n });\n }\n unfollow(user: any) {\n this.authUserService.unfollow(user.username).subscribe({\n next: (res) => {\n user.isFollowing = false;\n if (this.myId === this.userInfo.id) {\n const index = this.users.findIndex((item) => item.username === user.username);\n this.users.splice(index, 1);\n }\n },\n });\n }\n listFollowingByUsername() {\n this.authUserService.listFollowingByUsername(this.username).subscribe({\n next: (res) => {\n this.users = map(res.data, 'user');\n const ids = map(res.data, 'user.id');\n this.friendships(ids);\n },\n });\n }\n listFollowersByUsername() {\n this.authUserService.listFollowersByUsername(this.username).subscribe({\n next: (res) => {\n this.users = map(res.data, 'follower');\n const ids = map(res.data, 'follower.id');\n this.friendships(ids);\n },\n });\n }\n friendships(ids: string[]) {\n if (this.authenticated()) {\n this.myId = this.userId();\n const index = this.users.findIndex((item) => item.id === this.myId);\n if (index > 0) {\n this.users.unshift(this.users.splice(index, 1)[0]);\n }\n this.authUserService.friendships(ids).subscribe({\n next: (res) => {\n this.format(res.data);\n },\n });\n }\n }\n format(friendships: any) {\n this.users.map((item: any) => {\n item.isFollowing = friendships[item.id].following;\n });\n }\n}\n","<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","import { UserLayoutComponent } from '../components/user-layout/user-layout.component';\nimport { UserInfoComponent } from './user-info/user-info.component';\nimport { UserCommunityComponent } from './user-community/user-community.component';\nimport { UserStoreComponent } from './user-store/user-store.component';\nimport { UserFollowInfoComponent } from './user-follow-info/user-follow-info.component';\n\nexport const userRoutes = [\n {\n path: '',\n component: UserLayoutComponent,\n children: [\n {\n path: '',\n component: UserInfoComponent,\n },\n {\n path: 'community',\n component: UserCommunityComponent,\n },\n {\n path: 'store',\n component: UserStoreComponent,\n },\n ],\n },\n {\n path: ':path',\n component: UserFollowInfoComponent,\n },\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i3","i6","i2"],"mappings":"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"}
1
+ {"version":3,"file":"rolatech-angular-user.mjs","sources":["../../../../packages/angular-user/src/lib/interfaces/agent-application.ts","../../../../packages/angular-user/src/lib/pages/agent/agent-application-detail/agent-application-detail.component.ts","../../../../packages/angular-user/src/lib/pages/agent/agent-application-detail/agent-application-detail.component.html","../../../../packages/angular-user/src/lib/pages/agent/agent-application/agent-application.component.ts","../../../../packages/angular-user/src/lib/pages/agent/agent-application/agent-application.component.html","../../../../packages/angular-user/src/lib/user.pipe.ts","../../../../packages/angular-user/src/lib/user-roles.pipe.ts","../../../../packages/angular-user/src/lib/pages/user-index/user-index.component.ts","../../../../packages/angular-user/src/lib/pages/user-index/user-index.component.html","../../../../packages/angular-user/src/lib/pages/agent-manage/agent-manage-application-detail/agent-manage-application-detail.component.ts","../../../../packages/angular-user/src/lib/pages/agent-manage/agent-manage-application-detail/agent-manage-application-detail.component.html","../../../../packages/angular-user/src/lib/components/agent-application-item/agent-application-item.component.ts","../../../../packages/angular-user/src/lib/components/agent-application-item/agent-application-item.component.html","../../../../packages/angular-user/src/lib/pages/agent-manage/agent-manage-application-index/agent-manage-application-index.component.ts","../../../../packages/angular-user/src/lib/pages/agent-manage/agent-manage-application-index/agent-manage-application-index.component.html","../../../../packages/angular-user/src/lib/pages/agent-manage/agent-manage-application.routes.ts","../../../../packages/angular-user/src/lib/pages/agent/agent.routes.ts","../../../../packages/angular-user/src/lib/user-data.service.ts","../../../../packages/angular-user/src/lib/components/user-layout/user-layout.component.ts","../../../../packages/angular-user/src/lib/components/user-layout/user-layout.component.html","../../../../packages/angular-user/src/lib/pages/user-info/user-info.component.ts","../../../../packages/angular-user/src/lib/pages/user-info/user-info.component.html","../../../../packages/angular-user/src/lib/pages/user-community/user-community.component.ts","../../../../packages/angular-user/src/lib/pages/user-community/user-community.component.html","../../../../packages/angular-user/src/lib/pages/user-store/user-store.component.ts","../../../../packages/angular-user/src/lib/pages/user-store/user-store.component.html","../../../../packages/angular-user/src/lib/components/user-item/user-item.component.ts","../../../../packages/angular-user/src/lib/components/user-item/user-item.component.html","../../../../packages/angular-user/src/lib/pages/user-follow-info/user-follow-info.component.ts","../../../../packages/angular-user/src/lib/pages/user-follow-info/user-follow-info.component.html","../../../../packages/angular-user/src/lib/pages/user.routes.ts","../../../../packages/angular-user/src/lib/pages/user-detail/user-detail.component.ts","../../../../packages/angular-user/src/lib/pages/user-detail/user-detail.component.html","../../../../packages/angular-user/src/lib/pages/user-manage/user-manage.routes.ts","../../../../packages/angular-user/src/rolatech-angular-user.ts"],"sourcesContent":["import { User } from '@rolatech/angular-common';\n\nexport interface AgentApplicationRequest {\n firstName: string;\n lastName: string;\n businessName: string;\n website: string;\n email: string;\n phone: string;\n experienceYears: number;\n}\nexport interface AgentApplication {\n id: string;\n firstName: string;\n lastName: string;\n businessName: string;\n website: string;\n email: string;\n phone: string;\n experienceYears: number;\n status: AgentApplicationStatus;\n documents: string[];\n createdAt: string;\n userId: string;\n user: User;\n}\nexport enum AgentApplicationStatus {\n PENDING = 'Pending',\n APPROVED = 'Approved',\n REJECTED = 'Rejected',\n}\n","import { Component, inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n BaseComponent,\n ContainerComponent,\n EmptyComponent,\n RichLabelComponent,\n ToolbarComponent,\n} from '@rolatech/angular-components';\nimport { AuthAgentService } from '@rolatech/angular-auth';\nimport { AgentApplicationStatus } from '../../../interfaces/agent-application';\n\n@Component({\n selector: 'rolatech-agent-application-detail',\n imports: [CommonModule, ContainerComponent, ToolbarComponent, RichLabelComponent, EmptyComponent],\n templateUrl: './agent-application-detail.component.html',\n styleUrl: './agent-application-detail.component.scss',\n})\nexport class AgentApplicationDetailComponent extends BaseComponent implements OnInit {\n authAgentService = inject(AuthAgentService);\n application: any = {\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n businessName: '',\n website: '',\n };\n applicationStatus = AgentApplicationStatus;\n ngOnInit(): void {\n this.getApplication();\n }\n getApplication() {\n this.authAgentService.myApplication().subscribe({\n next: (res) => {\n this.application = res.data;\n },\n });\n }\n}\n","<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","import { Component, inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { AuthAgentService } from '@rolatech/angular-auth';\nimport { BaseComponent } from '@rolatech/angular-components';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\n@Component({\n selector: 'rolatech-agent-application',\n imports: [CommonModule, MatFormFieldModule, MatInputModule, FormsModule, MatButtonModule, MatProgressSpinnerModule],\n templateUrl: './agent-application.component.html',\n styleUrl: './agent-application.component.scss',\n})\nexport class AgentApplicationComponent extends BaseComponent implements OnInit {\n authAgentService = inject(AuthAgentService);\n application: any = {\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n businessName: '',\n website: '',\n };\n selectedFiles: File[] = [];\n sending = false;\n ngOnInit(): void {\n this.getApplication();\n }\n getApplication() {\n this.authAgentService.myApplication().subscribe({\n next: (res) => {\n this.application = res.data;\n if (res.data) {\n this.router.navigate([`./${res.data.id}`], {\n relativeTo: this.route,\n });\n }\n },\n });\n }\n onFileSelected(event: any) {\n const input = event.target as HTMLInputElement;\n if (input?.files?.length) {\n this.selectedFiles = Array.from(input.files);\n }\n }\n submitApplication() {\n this.sending = true;\n const formData = new FormData();\n formData.append('application', new Blob([JSON.stringify(this.application)], { type: 'application/json' }));\n\n for (const file of this.selectedFiles) {\n formData.append('documents', file);\n }\n this.authAgentService.apply(formData).subscribe({\n next: (res) => {\n this.sending = false;\n this.snackBarService.open('Sent successfully');\n this.router.navigate([`./${res.data.id}`], {\n relativeTo: this.route,\n });\n },\n error: (error) => {\n this.sending = false;\n this.snackBarService.open(error.message);\n },\n });\n }\n}\n","<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","import { Pipe, PipeTransform } from '@angular/core';\nimport { User } from '@rolatech/angular-common';\n\n@Pipe({\n name: 'userName',\n standalone: true,\n pure: true,\n})\nexport class UserNamePipe implements PipeTransform {\n transform(user: User | null | undefined): string {\n return userDisplayName(user);\n }\n}\n\n@Pipe({\n name: 'userInitials',\n standalone: true,\n pure: true,\n})\nexport class UserInitialsPipe implements PipeTransform {\n transform(user: User | null | undefined): string {\n return userInitials(user);\n }\n}\n\n@Pipe({\n name: 'userAvatar',\n standalone: true,\n pure: true,\n})\nexport class UserAvatarPipe implements PipeTransform {\n transform(user: User | null | undefined): string | null {\n return userAvatarUrl(user);\n }\n}\n\n@Pipe({\n name: 'userSince',\n standalone: true,\n pure: true,\n})\nexport class UserSincePipe implements PipeTransform {\n transform(\n user: User | null | undefined,\n format: Intl.DateTimeFormatOptions = { year: 'numeric', month: 'short', day: '2-digit' },\n ): string {\n const d = parseUserDateTime(user?.createdAt);\n return d ? new Intl.DateTimeFormat(undefined, format).format(d) : '—';\n }\n}\n/** Best display name with safe fallbacks */\nexport function userDisplayName(u: User | null | undefined): string {\n if (!u) return '';\n\n return (\n u.name?.trim() || [u.firstName, u.lastName].filter(Boolean).join(' ').trim() || u.username || u.email || 'Unknown User'\n );\n}\n\n/** Initials for avatar fallback */\nexport function userInitials(u: User | null | undefined): string {\n const name = userDisplayName(u);\n if (!name) return 'U';\n\n const parts = name.split(/\\s+/).slice(0, 2);\n return parts.map((p) => p[0]?.toUpperCase() ?? '').join('');\n}\n\n/** Avatar URL or null (let UI render initials) */\nexport function userAvatarUrl(u: User | null | undefined): string | null {\n if (!u?.avatar) return null;\n return u.avatar;\n}\n/**\n * Parses \"yyyy-MM-dd HH:mm:ss\" into Date (local)\n */\nexport function parseUserDateTime(value: string | null | undefined): Date | null {\n if (!value) return null;\n\n // Convert to ISO-like: \"2025-05-06T14:26:17\"\n const isoLike = value.replace(' ', 'T');\n const d = new Date(isoLike);\n\n return isNaN(d.getTime()) ? null : d;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { User } from '@rolatech/angular-common';\n\n@Pipe({ name: 'userRoles', standalone: true, pure: true })\nexport class UserRolesPipe implements PipeTransform {\n transform(user: User | null | undefined): string[] {\n return userRoleNames(user);\n }\n}\n\n@Pipe({ name: 'take', standalone: true, pure: true })\nexport class TakePipe implements PipeTransform {\n transform<T>(arr: T[] | null | undefined, count = 2): T[] {\n return (arr ?? []).slice(0, Math.max(0, count));\n }\n}\n\n@Pipe({ name: 'skip', standalone: true, pure: true })\nexport class SkipPipe implements PipeTransform {\n transform<T>(arr: T[] | null | undefined, count = 2): T[] {\n return (arr ?? []).slice(Math.max(0, count));\n }\n}\n\n@Pipe({ name: 'moreCount', standalone: true, pure: true })\nexport class MoreCountPipe implements PipeTransform {\n transform(arr: unknown[] | null | undefined, shown = 2): number {\n const len = (arr ?? []).length;\n return Math.max(0, len - Math.max(0, shown));\n }\n}\n/** Role names: [\"USER\", \"ADMIN\"] */\nexport function userRoleNames(u: User | null | undefined): string[] {\n return (u?.roles ?? []).map((r) => r.name || r.authority).filter((v): v is string => Boolean(v));\n}\n\n/** Single primary role (for tables) */\nexport function userPrimaryRole(u: User | null | undefined): string {\n return userRoleNames(u)[0] ?? '—';\n}\n","import { Component, computed, effect, inject, OnInit, signal, viewChild } from '@angular/core';\nimport { CommonModule, DatePipe } from '@angular/common';\nimport { AuthUserService } from '@rolatech/angular-auth';\nimport { BaseComponent, ToolbarComponent } from '@rolatech/angular-components';\nimport { User, AngularCommonModule } from '@rolatech/angular-common';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { Router, RouterLink } from '@angular/router';\nimport { UserInitialsPipe, UserAvatarPipe, UserNamePipe, UserSincePipe } from '../../user.pipe';\nimport { UserRolesPipe, TakePipe, MoreCountPipe } from '../../user-roles.pipe';\nimport { MatSelectModule } from '@angular/material/select';\nimport { distinctUntilChanged, finalize, map, switchMap } from 'rxjs';\n\n@Component({\n selector: 'rolatech-user-index',\n imports: [\n CommonModule,\n MatPaginatorModule,\n MatButtonModule,\n MatIconModule,\n MatMenuModule,\n MatFormFieldModule,\n MatInputModule,\n AngularCommonModule,\n UserInitialsPipe,\n UserAvatarPipe,\n UserNamePipe,\n UserSincePipe,\n UserRolesPipe,\n TakePipe,\n MoreCountPipe,\n MatSelectModule,\n MatMenuModule,\n ],\n templateUrl: './user-index.component.html',\n styleUrl: './user-index.component.scss',\n})\nexport class UserIndexComponent extends BaseComponent implements OnInit {\n private readonly authUserService = inject(AuthUserService);\n // data\n // loading = signal(false);\n users = signal<User[]>([]);\n\n // your roles list (load from API if needed)\n roles = signal<string[]>(['ADMIN', 'AGENT', 'LANDLORD', 'TENANT', 'USER']);\n\n loading = false;\n meta: any;\n pageEvent!: PageEvent;\n length = 100;\n pageSize = 15;\n pageSizeOptions: number[] = [5, 10, 25, 100];\n pageIndex = signal(0);\n ngOnInit(): void {\n const sub = this.route.queryParamMap\n .pipe(\n map((p) => {\n const page = p.get('page') ? Number(p.get('page')) : 1;\n this.pageIndex.set(Math.max(page - 1, 0));\n const status = p.get('status') || undefined;\n\n let filter = '';\n if (status) {\n filter = `status:${status?.toUpperCase()}`;\n }\n return {\n page,\n filter,\n limit: p.get('limit') ? Number(p.get('limit')) : 15,\n sort: p.get('sort') || undefined,\n };\n }),\n // Cheap deep compare via JSON to avoid spam calls when nothing changed\n map((o) => JSON.stringify(o)),\n distinctUntilChanged(),\n map((s) => JSON.parse(s)),\n switchMap((params) => {\n this.loading = true;\n params['sort'] = 'createdAt desc';\n return this.authUserService.findAll(params).pipe(finalize(() => (this.loading = false)));\n }),\n )\n .subscribe({\n next: (res) => {\n this.users.set(res.data);\n this.meta = res.meta;\n this.length = res.meta.pagination.count;\n this.loading = false;\n },\n error: () => {\n this.users.set([]);\n this.length = 0;\n this.loading = false;\n },\n });\n\n // // auto-unsubscribe on destroy\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n // fetch(): void {\n // this.loading.set(true);\n // this.authUserService\n // .findAll({\n // // filter: `name:${this.q()}`,\n // // page: this.page(),\n // // limit: this.size(),\n // // sort: 'createdAt desc',\n // })\n // .pipe(finalize(() => this.loading.set(false)))\n // .subscribe((res) => {\n // this.users.set(res.data ?? []);\n // this.total.set(res.meta.pagination.count ?? 0);\n // });\n // }\n\n // search(e: any) {\n // this.isLoading = true;\n // const word = e.target.value;\n // const options = {\n // filter: `name:${word}`,\n // };\n // this.authUserService.findAll(options).subscribe({\n // next: (res: any) => {\n // this.users = res.data;\n // this.length = res.meta.pagination.count;\n // this.isLoading = false;\n // },\n // error: (error) => {\n // this.isLoading = false;\n // this.snackBarService.open(error.message);\n // },\n // });\n // }\n onPage(e: PageEvent) {\n this.router.navigate([], {\n queryParams: { page: e.pageIndex + 1, limit: e.pageSize },\n queryParamsHandling: 'merge',\n replaceUrl: true, // optional: avoid stacking history on every page click\n });\n }\n\n openUser(id: string) {\n this.router.navigate(['/users', id]);\n }\n\n toggleStatus(u: User) {\n // call your API then refresh\n // this.api.toggleStatus(u.id)...\n console.log('toggleStatus', u.id);\n }\n\n resetPassword(u: User) {\n console.log('resetPassword', u.id);\n }\n\n trackById = (_: number, u: User) => u.id;\n}\n","<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 ?? '—' }}</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 ?? '—' }}\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","import { Component, inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n AcceptDialogComponent,\n BaseComponent,\n EmptyComponent,\n RejectDialogComponent,\n RichLabelComponent,\n ThumbnailComponent,\n ToolbarComponent,\n} from '@rolatech/angular-components';\nimport { MatButtonModule } from '@angular/material/button';\nimport { AuthAgentService } from '@rolatech/angular-auth';\nimport { AgentApplication, AgentApplicationStatus } from '../../../interfaces/agent-application';\n\n@Component({\n selector: 'rolatech-agent-manage-application-detail',\n imports: [CommonModule, ToolbarComponent, MatButtonModule, RichLabelComponent, EmptyComponent],\n templateUrl: './agent-manage-application-detail.component.html',\n styleUrl: './agent-manage-application-detail.component.scss',\n})\nexport class AgentManageApplicationDetailComponent extends BaseComponent implements OnInit {\n authAgentService = inject(AuthAgentService);\n application!: AgentApplication;\n status = AgentApplicationStatus;\n ngOnInit(): void {\n this.getApplication();\n }\n getApplication() {\n this.authAgentService.getApplication(this.id).subscribe({\n next: (res) => {\n this.application = res.data;\n },\n });\n }\n approve() {\n const dialogRef = this.dialog.open(AcceptDialogComponent, {\n width: '400px',\n data: {\n title: 'Approve',\n message: 'Approve this agent application?',\n },\n });\n dialogRef.afterClosed().subscribe((result) => {\n if (result) {\n this.authAgentService.approve(this.id).subscribe({\n next: (res) => {\n console.log(res);\n // this.application.status = 'APPROVED';\n // this.application.status = AgentApplicationStatus['APPROVED' as keyof typeof AgentApplicationStatus];\n this.application.status = 'APPROVED' as AgentApplicationStatus;\n this.snackBarService.open('Approved');\n },\n error: (e) => {\n this.snackBarService.open(e.message);\n },\n });\n }\n });\n }\n reject() {\n const dialogRef = this.dialog.open(RejectDialogComponent, {\n width: '400px',\n data: {\n content: '',\n },\n });\n dialogRef.afterClosed().subscribe((result) => {\n if (result) {\n this.authAgentService.reject(this.id, result).subscribe({\n next: (res) => {\n this.application.status = 'REJECTED' as AgentApplicationStatus;\n this.snackBarService.open('Rejected');\n },\n error: (e) => {\n this.snackBarService.open(e.message);\n },\n });\n }\n });\n }\n}\n","@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","import { Component, input } from '@angular/core';\nimport { AgentApplication, AgentApplicationStatus } from '../../interfaces/agent-application';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'rolatech-agent-application-item',\n imports: [MatIconModule],\n templateUrl: './agent-application-item.component.html',\n styleUrl: './agent-application-item.component.scss',\n})\nexport class AgentApplicationItemComponent {\n application = input.required<AgentApplication>();\n status: any = AgentApplicationStatus;\n}\n","<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","import { Component, inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AuthAgentService } from '@rolatech/angular-auth';\nimport {\n BaseComponent,\n EmptyComponent,\n PdfViewerComponent,\n TabComponent,\n TabsComponent,\n ToolbarComponent,\n} from '@rolatech/angular-components';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { AgentApplicationItemComponent } from '../../../components/agent-application-item/agent-application-item.component';\nimport { RouterLink } from '@angular/router';\nimport { AgentApplication } from '../../../interfaces/agent-application';\n\n@Component({\n selector: 'rolatech-agent-manage-application-index',\n imports: [\n CommonModule,\n ToolbarComponent,\n TabsComponent,\n TabComponent,\n MatButtonModule,\n MatIconModule,\n AgentApplicationItemComponent,\n RouterLink,\n EmptyComponent,\n ],\n templateUrl: './agent-manage-application-index.component.html',\n styleUrl: './agent-manage-application-index.component.scss',\n})\nexport class AgentManageApplicationIndexComponent extends BaseComponent implements OnInit {\n authAgentService = inject(AuthAgentService);\n applications: AgentApplication[] = [];\n select = 0;\n links = [\n {\n name: 'All',\n icon: 'dashboard',\n },\n {\n name: 'Pending',\n icon: 'category',\n status: 'pending',\n },\n {\n name: 'Approved',\n icon: 'category',\n status: 'approved',\n },\n {\n name: 'Rejected',\n icon: 'category',\n status: 'rejected',\n },\n ];\n filterOptions: any = {\n type: '',\n status: '',\n };\n ngOnInit(): void {\n this.route.queryParams.subscribe(({ status }) => {\n this.select = this.links.findIndex((item) => item.status === status);\n if (status) {\n this.filterOptions.status = (status as string).toUpperCase();\n } else {\n delete this.filterOptions.status;\n }\n this.findApplications();\n });\n }\n findApplications() {\n const options = {\n sort: 'updatedAt desc',\n };\n const filterString = this.convertFilterOptions(this.filterOptions);\n if (filterString) {\n options['filter'] = filterString;\n }\n this.authAgentService.findAllApplications(options).subscribe({\n next: (res) => {\n this.applications = res.data;\n },\n });\n }\n convertFilterOptions(jsonObj) {\n return Object.entries(jsonObj)\n .filter(([key, value]) => value !== '' && value !== undefined)\n .map(([key, value]) => {\n return `${key}:${value}`;\n })\n .join(',');\n }\n viewPdf(url: string) {\n const options = {\n title: '',\n component: PdfViewerComponent,\n data: {\n url: url,\n },\n };\n this.dialogService.open(options);\n this.dialogService.confirmed();\n }\n}\n","<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","import { AgentManageApplicationDetailComponent } from './agent-manage-application-detail/agent-manage-application-detail.component';\nimport { AgentManageApplicationIndexComponent } from './agent-manage-application-index/agent-manage-application-index.component';\n\nexport const agentManageApplicationRoutes = [\n {\n path: '',\n component: AgentManageApplicationIndexComponent,\n },\n {\n path: ':id',\n component: AgentManageApplicationDetailComponent,\n },\n];\n","import { AgentApplicationComponent } from './agent-application/agent-application.component';\nimport { AgentApplicationDetailComponent } from './agent-application-detail/agent-application-detail.component';\n\nexport const agentRoutes = [\n {\n path: 'application',\n component: AgentApplicationComponent,\n },\n {\n path: 'application/:id',\n component: AgentApplicationDetailComponent,\n },\n];\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UserDataService {\n private userInfo = new BehaviorSubject<any>(null);\n data = this.userInfo.asObservable();\n send(data: any) {\n this.userInfo.next(data);\n }\n}\n","import { Component, effect, inject, model, OnInit } from '@angular/core';\nimport { AvatarComponent, BaseComponent, ContainerComponent, TabComponent, TabsComponent } from '@rolatech/angular-components';\nimport { AuthService, AuthUserService } from '@rolatech/angular-auth';\nimport { Course } from '@rolatech/angular-course';\nimport { UserDataService } from '../../user-data.service';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { RouterLink, RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'rolatech-user-layout',\n imports: [\n MatIconModule,\n RouterLink,\n ContainerComponent,\n AvatarComponent,\n TabsComponent,\n TabComponent,\n MatButtonModule,\n TabsComponent,\n TabComponent,\n RouterOutlet,\n ],\n templateUrl: './user-layout.component.html',\n styleUrl: './user-layout.component.scss',\n})\nexport class UserLayoutComponent extends BaseComponent implements OnInit {\n authService = inject(AuthService);\n authUserService = inject(AuthUserService);\n userDataService = inject(UserDataService);\n authenticated = this.authService.authenticated;\n userInfo: any;\n courses: Course[] = [];\n meta: any;\n isFollowed = false;\n username = '';\n selectIndex = model(0);\n path = '';\n statsData: any;\n constructor() {\n super();\n effect(() => {\n if (this.authenticated()) {\n this.checkIfFollowed();\n }\n });\n }\n ngOnInit(): void {\n this.username = this.route.snapshot.params['username'];\n this.stats();\n this.findUserInfo();\n this.route.params.subscribe((params) => {\n if (params['path'] === 'community') {\n this.selectIndex.set(1);\n }\n if (params['path'] === 'store') {\n this.selectIndex.set(2);\n }\n });\n }\n stats() {\n this.authUserService.followersStats(this.username).subscribe({\n next: (res) => {\n this.statsData = res.data;\n },\n });\n }\n findUserInfo() {\n this.authUserService.findUserInfoByUsername(this.username).subscribe({\n next: (res) => {\n this.userInfo = res.data;\n this.userDataService.send(res.data);\n if (res.data) {\n this.titleService.setTitle(`${this.userInfo.name}(@${this.userInfo.username}) - 拼小课`);\n } else {\n this.titleService.setTitle(`拼小课`);\n }\n },\n });\n }\n\n checkIfFollowed() {\n this.authUserService.isFollowing(this.username).subscribe({\n next: (res) => {\n this.isFollowed = res.data;\n },\n });\n }\n follow() {\n this.authUserService.follow(this.username).subscribe({\n next: (res) => {\n this.isFollowed = true;\n },\n });\n }\n unfollow() {\n this.authUserService.unfollow(this.username).subscribe({\n next: (res) => {\n this.isFollowed = false;\n },\n });\n }\n}\n","<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","import { Component, inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { BaseComponent, RichItemComponent, RichViewComponent } from '@rolatech/angular-components';\nimport { UserDataService } from '../../user-data.service';\nimport { CourseService, Course } from '@rolatech/angular-course';\nimport { RouterLink } from '@angular/router';\n\n@Component({\n selector: 'rolatech-user-info',\n imports: [RouterLink, RichViewComponent, RichItemComponent],\n templateUrl: './user-info.component.html',\n styleUrl: './user-info.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class UserInfoComponent extends BaseComponent implements OnInit {\n courseService = inject(CourseService);\n userDataService = inject(UserDataService);\n courses: Course[] = [];\n meta: any;\n constructor() {\n super();\n }\n ngOnInit(): void {\n this.userDataService.data.subscribe({\n next: (userInfo) => {\n this.findCoursesByInstructorId(userInfo.id);\n },\n });\n }\n findCoursesByInstructorId(instructorId: string) {\n const options = {\n filter: `instructorId:${instructorId},published:true`,\n sort: 'updatedAt desc',\n };\n this.courseService.find(options).subscribe({\n next: (res: any) => {\n this.courses = res.data;\n this.meta = res.meta;\n },\n });\n }\n}\n","<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","import { Component, inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UserDataService } from '../../user-data.service';\nimport { EmptyComponent } from '@rolatech/angular-components';\n\n@Component({\n selector: 'rolatech-user-community',\n imports: [CommonModule, EmptyComponent],\n templateUrl: './user-community.component.html',\n styleUrl: './user-community.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class UserCommunityComponent implements OnInit {\n userDataService = inject(UserDataService);\n ngOnInit(): void {\n this.userDataService.data.subscribe({\n next: (userInfo) => {},\n });\n }\n}\n","<rolatech-empty></rolatech-empty>\n","import { Component, inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ProductService } from '@rolatech/angular-services';\nimport { UserDataService } from '../../user-data.service';\nimport { RouterLink } from '@angular/router';\nimport { EmptyComponent, RichViewComponent, RichItemComponent } from '@rolatech/angular-components';\n\n@Component({\n selector: 'rolatech-user-store',\n imports: [CommonModule, EmptyComponent, RichViewComponent, RichItemComponent, RouterLink],\n templateUrl: './user-store.component.html',\n styleUrl: './user-store.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class UserStoreComponent implements OnInit {\n userDataService = inject(UserDataService);\n productService = inject(ProductService);\n products: any;\n ngOnInit(): void {\n this.userDataService.data.subscribe({\n next: (userInfo) => {\n this.findProductsByUserId(userInfo.id);\n },\n });\n }\n findProductsByUserId(userId: string) {\n const options = {\n filter: `userId:${userId}`,\n sort: 'updatedAt desc',\n };\n this.productService.find(options).subscribe({\n next: (res: any) => {\n this.products = res.data;\n },\n });\n }\n}\n","@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","import { Component, HostBinding, ViewEncapsulation, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\n\n@Component({\n selector: 'rolatech-user-item',\n imports: [CommonModule, MatButtonModule],\n templateUrl: './user-item.component.html',\n styleUrl: './user-item.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class UserItemComponent {\n @HostBinding('class.rolatech-user-item') hasClass = true;\n user = input<any>();\n isFollowing = input(true);\n follow = output<string>();\n unfollow = output();\n own = input();\n onFollow() {\n this.follow.emit(this.user().username);\n }\n onUnFollow() {\n this.unfollow.emit(this.user().username);\n }\n}\n","<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","import { Component, effect, inject, OnInit, signal, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Title } from '@angular/platform-browser';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport { AuthService, AuthUserService } from '@rolatech/angular-auth';\nimport { map } from 'lodash';\nimport { TabsComponent, TabComponent, ContainerComponent, ToolbarComponent } from '@rolatech/angular-components';\nimport { UserItemComponent } from '../../components/user-item/user-item.component';\n\n@Component({\n selector: 'rolatech-user-follow-info',\n imports: [CommonModule, TabsComponent, TabComponent, ContainerComponent, ToolbarComponent, RouterLink, UserItemComponent],\n templateUrl: './user-follow-info.component.html',\n styleUrl: './user-follow-info.component.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class UserFollowInfoComponent implements OnInit {\n title = inject(Title);\n route = inject(ActivatedRoute);\n authService = inject(AuthService);\n authUserService = inject(AuthUserService);\n authenticated = this.authService.authenticated;\n userId = this.authService.userId;\n tabIndex = signal(0);\n userInfo: any;\n users: any[] = [];\n username = '';\n path = '';\n myId = '';\n constructor() {\n this.route.params.subscribe({\n next: (params: any) => {\n this.username = params['username'];\n this.path = params.path;\n },\n });\n effect(() => {\n switch (this.tabIndex()) {\n case 0:\n this.listFollowingByUsername();\n break;\n case 1:\n this.listFollowersByUsername();\n break;\n default:\n break;\n }\n });\n }\n ngOnInit(): void {\n if (this.path === 'following') {\n this.tabIndex.set(0);\n } else {\n this.tabIndex.set(1);\n }\n this.findUserInfo();\n }\n findUserInfo() {\n this.authUserService.findUserInfoByUsername(this.username).subscribe({\n next: (res) => {\n this.userInfo = res.data;\n if (res.data) {\n this.title.setTitle(`${this.userInfo.name}(@${this.userInfo.username}) - 拼小课`);\n } else {\n this.title.setTitle(`拼小课`);\n }\n },\n });\n }\n follow(user: any) {\n this.authUserService.follow(user.username).subscribe({\n next: (res) => {\n user.isFollowing = true;\n },\n });\n }\n unfollow(user: any) {\n this.authUserService.unfollow(user.username).subscribe({\n next: (res) => {\n user.isFollowing = false;\n if (this.myId === this.userInfo.id) {\n const index = this.users.findIndex((item) => item.username === user.username);\n this.users.splice(index, 1);\n }\n },\n });\n }\n listFollowingByUsername() {\n this.authUserService.listFollowingByUsername(this.username).subscribe({\n next: (res) => {\n this.users = map(res.data, 'user');\n const ids = map(res.data, 'user.id');\n this.friendships(ids);\n },\n });\n }\n listFollowersByUsername() {\n this.authUserService.listFollowersByUsername(this.username).subscribe({\n next: (res) => {\n this.users = map(res.data, 'follower');\n const ids = map(res.data, 'follower.id');\n this.friendships(ids);\n },\n });\n }\n friendships(ids: string[]) {\n if (this.authenticated()) {\n this.myId = this.userId();\n const index = this.users.findIndex((item) => item.id === this.myId);\n if (index > 0) {\n this.users.unshift(this.users.splice(index, 1)[0]);\n }\n this.authUserService.friendships(ids).subscribe({\n next: (res) => {\n this.format(res.data);\n },\n });\n }\n }\n format(friendships: any) {\n this.users.map((item: any) => {\n item.isFollowing = friendships[item.id].following;\n });\n }\n}\n","<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","import { UserLayoutComponent } from '../components/user-layout/user-layout.component';\nimport { UserInfoComponent } from './user-info/user-info.component';\nimport { UserCommunityComponent } from './user-community/user-community.component';\nimport { UserStoreComponent } from './user-store/user-store.component';\nimport { UserFollowInfoComponent } from './user-follow-info/user-follow-info.component';\nimport { UserDetailComponent } from './user-detail/user-detail.component';\n\nexport const userRoutes = [\n {\n path: '',\n component: UserLayoutComponent,\n children: [\n {\n path: '',\n component: UserInfoComponent,\n },\n {\n path: 'community',\n component: UserCommunityComponent,\n },\n {\n path: 'store',\n component: UserStoreComponent,\n },\n ],\n },\n {\n path: ':path',\n component: UserFollowInfoComponent,\n },\n];\n","import { Component, computed, inject, OnInit, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { BaseComponent, ToolbarComponent } from '@rolatech/angular-components';\nimport { AuthUserService } from '@rolatech/angular-auth';\nimport { User } from '@rolatech/angular-common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\n\n@Component({\n selector: 'rolatech-user-detail',\n imports: [CommonModule, MatTabsModule, ToolbarComponent, MatButtonModule, MatIcon, MatMenuModule],\n templateUrl: './user-detail.component.html',\n styleUrl: './user-detail.component.scss',\n})\nexport class UserDetailComponent extends BaseComponent implements OnInit {\n user = signal<User | null>(null);\n authUserService = inject(AuthUserService);\n name = computed(() => userDisplayName(this.user()));\n initials = computed(() => userInitials(this.user()));\n avatarUrl = computed(() => userAvatarUrl(this.user()));\n createdAtLabel = computed(() => {\n const d = parseUserDateTime(this.user()?.createdAt);\n return d ? new Intl.DateTimeFormat(undefined, { year: 'numeric', month: 'long', day: '2-digit' }).format(d) : '—';\n });\n ngOnInit(): void {\n this.get();\n }\n get() {\n this.authUserService.get(this.id).subscribe({\n next: (res) => {\n this.user.set(res.data);\n },\n });\n }\n // actions\n openUserObject() {}\n editProfile() {}\n toggleStatus() {}\n resetPassword() {}\n copyId() {}\n addToOrg() {}\n addEmail() {}\n addPhone() {}\n connectWallet() {}\n}\n/** Best display name with safe fallbacks */\nexport function userDisplayName(u: User | null | undefined): string {\n if (!u) return '';\n\n return (\n u.name?.trim() || [u.firstName, u.lastName].filter(Boolean).join(' ').trim() || u.username || u.email || 'Unknown User'\n );\n}\n\n/** Initials for avatar fallback */\nexport function userInitials(u: User | null | undefined): string {\n const name = userDisplayName(u);\n if (!name) return 'U';\n\n const parts = name.split(/\\s+/).slice(0, 2);\n return parts.map((p) => p[0]?.toUpperCase() ?? '').join('');\n}\n\n/** Avatar URL or null (let UI render initials) */\nexport function userAvatarUrl(u: User | null | undefined): string | null {\n if (!u?.avatar) return null;\n return u.avatar;\n}\n/**\n * Parses \"yyyy-MM-dd HH:mm:ss\" into Date (local)\n */\nexport function parseUserDateTime(value: string | null | undefined): Date | null {\n if (!value) return null;\n\n // Convert to ISO-like: \"2025-05-06T14:26:17\"\n const isoLike = value.replace(' ', 'T');\n const d = new Date(isoLike);\n\n return isNaN(d.getTime()) ? null : d;\n}\n","<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 ?? '—') }}</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 ?? '—' }}</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 ?? '—' }}</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%]\">—</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%]\">—</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","import { UserDetailComponent } from '../user-detail/user-detail.component';\nimport { UserIndexComponent } from '../user-index/user-index.component';\n\nexport const userManageRoutes = [\n {\n path: '',\n component: UserIndexComponent,\n },\n {\n path: ':id',\n component: UserDetailComponent,\n },\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["userDisplayName","userInitials","userAvatarUrl","parseUserDateTime","i1","i2","i3","map"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rolatech/angular-user",
3
- "version": "20.2.4-beta.2",
3
+ "version": "20.2.5",
4
4
  "private": false,
5
5
  "peerDependencies": {
6
6
  "@angular/core": "^20.0.0",
@@ -13,10 +13,10 @@
13
13
  "lodash": "^4.17.21"
14
14
  },
15
15
  "dependencies": {
16
- "@rolatech/angular-components": "20.2.4-beta.2",
17
- "@rolatech/angular-services": "20.2.4-beta.2",
18
- "@rolatech/angular-auth": "20.2.4-beta.2",
19
- "@rolatech/angular-course": "20.2.4-beta.2",
16
+ "@rolatech/angular-components": "20.2.5",
17
+ "@rolatech/angular-services": "20.2.5",
18
+ "@rolatech/angular-auth": "20.2.5",
19
+ "@rolatech/angular-course": "20.2.5",
20
20
  "tslib": "^2.3.0"
21
21
  },
22
22
  "sideEffects": false,
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { OnInit } from '@angular/core';
3
3
  import { BaseComponent } from '@rolatech/angular-components';
4
- import { AuthAgentService, AuthUserService, AuthService } from '@rolatech/angular-auth';
4
+ import { AuthAgentService, AuthService, AuthUserService } from '@rolatech/angular-auth';
5
5
  import { User } from '@rolatech/angular-common';
6
- import { MatPaginator, PageEvent } from '@angular/material/paginator';
6
+ import { PageEvent } from '@angular/material/paginator';
7
7
  import { Course } from '@rolatech/angular-course';
8
8
  import * as rxjs from 'rxjs';
9
9
  import { Title } from '@angular/platform-browser';
@@ -54,26 +54,22 @@ declare class AgentApplicationComponent extends BaseComponent implements OnInit
54
54
  }
55
55
 
56
56
  declare class UserIndexComponent extends BaseComponent implements OnInit {
57
- authUserService: AuthUserService;
58
- paginator: i0.Signal<MatPaginator | undefined>;
59
- users: User[];
57
+ private readonly authUserService;
58
+ users: i0.WritableSignal<User[]>;
59
+ roles: i0.WritableSignal<string[]>;
60
+ loading: boolean;
61
+ meta: any;
60
62
  pageEvent: PageEvent;
61
- isLoading: boolean;
62
- isSearch: boolean;
63
63
  length: number;
64
64
  pageSize: number;
65
65
  pageSizeOptions: number[];
66
- orderOptions: {
67
- key: string;
68
- value: string;
69
- icon: string;
70
- sort: string;
71
- }[];
72
- orderString: string;
66
+ pageIndex: i0.WritableSignal<number>;
73
67
  ngOnInit(): void;
74
- findAll(event?: PageEvent | null): any;
75
- search(e: any): void;
76
- onClick(item: any): void;
68
+ onPage(e: PageEvent): void;
69
+ openUser(id: string): void;
70
+ toggleStatus(u: User): void;
71
+ resetPassword(u: User): void;
72
+ trackById: (_: number, u: User) => string | undefined;
77
73
  static ɵfac: i0.ɵɵFactoryDeclaration<UserIndexComponent, never>;
78
74
  static ɵcmp: i0.ɵɵComponentDeclaration<UserIndexComponent, "rolatech-user-index", never, {}, {}, never, never, true, never>;
79
75
  }
@@ -206,4 +202,34 @@ declare const userRoutes: ({
206
202
  children?: undefined;
207
203
  })[];
208
204
 
209
- export { AgentApplicationComponent, AgentApplicationDetailComponent, UserIndexComponent, agentManageApplicationRoutes, agentRoutes, userRoutes };
205
+ declare class UserDetailComponent extends BaseComponent implements OnInit {
206
+ user: i0.WritableSignal<User | null>;
207
+ authUserService: AuthUserService;
208
+ name: i0.Signal<string>;
209
+ initials: i0.Signal<string>;
210
+ avatarUrl: i0.Signal<string | null>;
211
+ createdAtLabel: i0.Signal<string>;
212
+ ngOnInit(): void;
213
+ get(): void;
214
+ openUserObject(): void;
215
+ editProfile(): void;
216
+ toggleStatus(): void;
217
+ resetPassword(): void;
218
+ copyId(): void;
219
+ addToOrg(): void;
220
+ addEmail(): void;
221
+ addPhone(): void;
222
+ connectWallet(): void;
223
+ static ɵfac: i0.ɵɵFactoryDeclaration<UserDetailComponent, never>;
224
+ static ɵcmp: i0.ɵɵComponentDeclaration<UserDetailComponent, "rolatech-user-detail", never, {}, {}, never, never, true, never>;
225
+ }
226
+
227
+ declare const userManageRoutes: ({
228
+ path: string;
229
+ component: typeof UserIndexComponent;
230
+ } | {
231
+ path: string;
232
+ component: typeof UserDetailComponent;
233
+ })[];
234
+
235
+ export { AgentApplicationComponent, AgentApplicationDetailComponent, UserIndexComponent, agentManageApplicationRoutes, agentRoutes, userManageRoutes, userRoutes };