verben-authentication-ui 0.5.9 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -61,7 +61,7 @@ class HttpWebRequestService {
61
61
  buildHeaders() {
62
62
  return {
63
63
  'Content-Type': 'application/json',
64
- 'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJNYWlsQWRkcmVzcyI6InZlcmJlbmFAZ21haWwuY29tIiwiQXBwbGljYXRpb24iOiIiLCJOYW1lIjoiVmVyYmVuYSBMb2dpYyBMaW1pdGVkIiwiUm9sZXMiOiIiLCJUZW5hbnRJZCI6IlBETFRDNiIsIlNlcnZpY2VOYW1lIjoiV2hpdGUzNjAiLCJuYmYiOjE3MzU4Mjk1MDMsImV4cCI6MTczNjA0NTUwMywiaWF0IjoxNzM1ODI5NTAzfQ.17pbrSY5giPvVvdjrzWvfTWD2-Ln5vX8WBm4y9vxq2k'
64
+ 'Authorization': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJNYWlsQWRkcmVzcyI6InZlcmJlbmFAZ21haWwuY29tIiwiQXBwbGljYXRpb24iOiIiLCJOYW1lIjoiVmVyYmVuYSBMb2dpYyBMaW1pdGVkIiwiUm9sZXMiOiIiLCJUZW5hbnRJZCI6IlBETFRDNiIsIlNlcnZpY2VOYW1lIjoiV2hpdGUzNjAiLCJuYmYiOjE3MzYxNjM1OTYsImV4cCI6MTczNjM3OTU5NiwiaWF0IjoxNzM2MTYzNTk2fQ.q5ErmDIP0NwKKRlVeb9_EfmrEfd8gsFzkNNszkTeTg4'
65
65
  };
66
66
  }
67
67
  buildUrl(url, baseUrl) {
@@ -448,7 +448,8 @@ class UserRequestComponent {
448
448
  height = 'auto';
449
449
  pd = '32px 48px';
450
450
  isFormEditable = true;
451
- apiKey = '';
451
+ apiKey;
452
+ secret;
452
453
  hidePassword = false;
453
454
  isCode = false;
454
455
  text = 'Send Request';
@@ -481,6 +482,7 @@ class UserRequestComponent {
481
482
  this.envSvc = envSvc;
482
483
  this.route = route;
483
484
  this.apiKey = this.envSvc.environment.Tenant;
485
+ this.secret = this.envSvc.environment.Secret;
484
486
  this.userRequestForm = this.fb.group({
485
487
  Code: new FormControl('', { nonNullable: true }),
486
488
  FirstName: new FormControl('', {
@@ -557,7 +559,7 @@ class UserRequestComponent {
557
559
  }
558
560
  async ngOnInit() {
559
561
  await this.getTenantConfig();
560
- this.route.queryParams.subscribe(params => {
562
+ this.route.queryParams.subscribe((params) => {
561
563
  this.code = params['code'];
562
564
  this.type = params['type'];
563
565
  if (this.code) {
@@ -631,7 +633,7 @@ class UserRequestComponent {
631
633
  const data = this.AuthMechanisms.find((item) => item.AuthMechanism.includes(this.type));
632
634
  const payload = {
633
635
  AuthCode: this.code,
634
- APIKey: this.apiKey,
636
+ Tenant: this.apiKey,
635
637
  AuthMechanism: data.AuthMechanism,
636
638
  };
637
639
  this.utilService.sendBI(true);
@@ -2648,6 +2650,104 @@ const baseStyle$2 = {
2648
2650
  },
2649
2651
  };
2650
2652
 
2653
+ var SearchOperator;
2654
+ (function (SearchOperator) {
2655
+ SearchOperator["And"] = "And";
2656
+ SearchOperator["Or"] = "Or";
2657
+ })(SearchOperator || (SearchOperator = {}));
2658
+
2659
+ var SearchPropertySign;
2660
+ (function (SearchPropertySign) {
2661
+ SearchPropertySign["EQ"] = "EQ";
2662
+ SearchPropertySign["NEQ"] = "NEQ";
2663
+ SearchPropertySign["GT"] = "GT";
2664
+ SearchPropertySign["GTE"] = "GTE";
2665
+ SearchPropertySign["LT"] = "LT";
2666
+ SearchPropertySign["LTE"] = "LTE";
2667
+ SearchPropertySign["LIKE"] = "LIKE";
2668
+ })(SearchPropertySign || (SearchPropertySign = {}));
2669
+
2670
+ var OAuthType;
2671
+ (function (OAuthType) {
2672
+ OAuthType["InApp"] = "InApp";
2673
+ OAuthType["Google"] = "Google";
2674
+ OAuthType["Facebook"] = "Facebook";
2675
+ OAuthType["OAuth"] = "OAuth";
2676
+ OAuthType["MicrosoftAD"] = "MicrosoftAD";
2677
+ })(OAuthType || (OAuthType = {}));
2678
+
2679
+ var UserAccessRequestStatus;
2680
+ (function (UserAccessRequestStatus) {
2681
+ UserAccessRequestStatus["Pending"] = "Pending";
2682
+ UserAccessRequestStatus["Approved"] = "Approved";
2683
+ UserAccessRequestStatus["Declined"] = "Declined";
2684
+ })(UserAccessRequestStatus || (UserAccessRequestStatus = {}));
2685
+
2686
+ var SearchPropertyValueType;
2687
+ (function (SearchPropertyValueType) {
2688
+ SearchPropertyValueType["Int"] = "Int";
2689
+ SearchPropertyValueType["Float"] = "Float";
2690
+ SearchPropertyValueType["Decimal"] = "Decimal";
2691
+ SearchPropertyValueType["Double"] = "Double";
2692
+ SearchPropertyValueType["String"] = "String";
2693
+ SearchPropertyValueType["Bool"] = "Bool";
2694
+ SearchPropertyValueType["Date"] = "Date";
2695
+ })(SearchPropertyValueType || (SearchPropertyValueType = {}));
2696
+
2697
+ const roles = [
2698
+ { id: 'admin', name: 'Admin' },
2699
+ { id: 'manager', name: 'Manager' },
2700
+ { id: 'staff', name: 'Staff' },
2701
+ ];
2702
+ const mockData = new Array(10)
2703
+ .fill(1)
2704
+ .map((id, i) => ({
2705
+ FirstName: `First ${id + i}`,
2706
+ LastName: `Last ${id + i}`,
2707
+ OtherName: `Other ${id + i}`,
2708
+ Id: id + i,
2709
+ id: (id + i).toString(),
2710
+ MailAddress: `user${id + i}@mail.com`,
2711
+ PhoneNumber: `+23480000000${id + i}`,
2712
+ RequestStatus: randomEnum$1(UserAccessRequestStatus),
2713
+ RoleID: roles[Math.floor(Math.random() * roles.length)].id,
2714
+ Password: '1234567',
2715
+ ExpireOn: new Date(),
2716
+ IsSeeded: false,
2717
+ OTPExpireOn: new Date(),
2718
+ Tenants: [],
2719
+ SignupType: OAuthType.InApp,
2720
+ CreatedAt: new Date(),
2721
+ UpdatedAt: new Date(),
2722
+ DataState: ObjectState.New,
2723
+ TenantId: `Tenant${id + i}`,
2724
+ Code: '',
2725
+ ServiceName: '',
2726
+ }));
2727
+ function randomEnum$1(anEnum) {
2728
+ const enumValues = Object.values(anEnum);
2729
+ const randomIndex = Math.floor(Math.random() * enumValues.length);
2730
+ return enumValues[randomIndex];
2731
+ }
2732
+ function convertDataFilterTypeToSearchPropertyValueType(type) {
2733
+ switch (type) {
2734
+ case DataFilterType.String:
2735
+ return SearchPropertyValueType.String;
2736
+ case DataFilterType.Integer:
2737
+ return SearchPropertyValueType.Int;
2738
+ case DataFilterType.Decimal:
2739
+ return SearchPropertyValueType.Decimal;
2740
+ case DataFilterType.Credit:
2741
+ return SearchPropertyValueType.Float;
2742
+ case DataFilterType.Date:
2743
+ return SearchPropertyValueType.Date;
2744
+ case DataFilterType.Bool:
2745
+ return SearchPropertyValueType.Bool;
2746
+ case DataFilterType.Number:
2747
+ return SearchPropertyValueType.Int;
2748
+ }
2749
+ }
2750
+
2651
2751
  class UserAccessRequestService {
2652
2752
  httpService;
2653
2753
  BASE_URL = 'User';
@@ -2683,6 +2783,19 @@ class UserAccessRequestService {
2683
2783
  const url = `${this.BASE_URL}/GetUserAccessRequestWithParam/${param}/${skip}/${limit}/${sortParam}/${sortOrder}`;
2684
2784
  return this.httpService.get(url);
2685
2785
  }
2786
+ /**
2787
+ * Get user access requests with additional parameter, pagination and sorting
2788
+ * @param params Filter parameters
2789
+ * @param skip Number of records to skip
2790
+ * @param limit Number of records to take
2791
+ * @param sortParam Sort parameter
2792
+ * @param sortOrder Sort order ('asc' or 'desc')
2793
+ * @returns Promise containing the filtered user access requests
2794
+ */
2795
+ getUserAccessRequestByFilterParams(params, skip, limit, sortParam, sortOrder) {
2796
+ const url = `${this.BASE_URL}/SearchUserAccessRequest/${skip}/${limit}/${sortParam}/${sortOrder}`;
2797
+ return this.httpService.post(url, params);
2798
+ }
2686
2799
  /**
2687
2800
  * Save multiple user access requests
2688
2801
  * @param requests Array of user access requests to save
@@ -2732,6 +2845,7 @@ class UserAccessRequestState {
2732
2845
  sortParam: 'CreatedAt',
2733
2846
  sortOrder: 'asc',
2734
2847
  });
2848
+ filterParams$ = new BehaviorSubject([]);
2735
2849
  isUpdating$() {
2736
2850
  return this.updating$.asObservable();
2737
2851
  }
@@ -2744,6 +2858,12 @@ class UserAccessRequestState {
2744
2858
  setRequests(requests) {
2745
2859
  this.requests$.next(requests);
2746
2860
  }
2861
+ getFilterParams$() {
2862
+ return this.filterParams$.asObservable();
2863
+ }
2864
+ setFilterParams(params) {
2865
+ this.filterParams$.next(params);
2866
+ }
2747
2867
  getRoles$() {
2748
2868
  return this.roles$.asObservable();
2749
2869
  }
@@ -2814,13 +2934,20 @@ class UserAccessRequestFacade {
2814
2934
  this.utilService = utilService;
2815
2935
  // Set up debounced search handling
2816
2936
  this.searchSubject
2817
- .pipe(debounceTime(500), distinctUntilChanged(), takeUntil(this.destroy$))
2937
+ .pipe(debounceTime(1000), distinctUntilChanged(), takeUntil(this.destroy$))
2818
2938
  .subscribe((searchTerm) => {
2819
2939
  this.handleSearch(searchTerm);
2820
2940
  });
2821
2941
  this.isUpdating$().subscribe((loading) => {
2822
2942
  this.utilService.sendBI(loading);
2823
2943
  });
2944
+ this.getFilterParams$().subscribe((params) => {
2945
+ if (params.length) {
2946
+ }
2947
+ else {
2948
+ this.loadRequests();
2949
+ }
2950
+ });
2824
2951
  }
2825
2952
  destroy() {
2826
2953
  this.destroy$.next();
@@ -2832,6 +2959,9 @@ class UserAccessRequestFacade {
2832
2959
  getRequests$() {
2833
2960
  return this.userAccessRequestState.getRequests$();
2834
2961
  }
2962
+ getFilterParams$() {
2963
+ return this.userAccessRequestState.getFilterParams$();
2964
+ }
2835
2965
  getRoles$() {
2836
2966
  return this.userAccessRequestState.getRoles$();
2837
2967
  }
@@ -2865,6 +2995,10 @@ class UserAccessRequestFacade {
2865
2995
  this.userAccessRequestState.setUpdating(false);
2866
2996
  }
2867
2997
  }
2998
+ async filter(filterParams) {
2999
+ this.userAccessRequestState.resetPagination();
3000
+ this.userAccessRequestState.setFilterParams(filterParams);
3001
+ }
2868
3002
  // Load more handling
2869
3003
  async loadMore() {
2870
3004
  try {
@@ -2933,6 +3067,27 @@ class UserAccessRequestFacade {
2933
3067
  this.userAccessRequestState.setUpdating(false);
2934
3068
  }
2935
3069
  }
3070
+ async loadRequestsByFilterParams(filterParams) {
3071
+ try {
3072
+ this.userAccessRequestState.setUpdating(true);
3073
+ const params = this.userAccessRequestState.getQueryParamsValue();
3074
+ const requests = await this.userAccessRequestService.getUserAccessRequestByFilterParams(filterParams.map((filter) => ({
3075
+ PropertyName: filter.name,
3076
+ EntityValue: filter.value,
3077
+ type: convertDataFilterTypeToSearchPropertyValueType(filter.type),
3078
+ Operator: SearchOperator.And,
3079
+ Sign: SearchPropertySign.EQ,
3080
+ })), params.skip, params.limit, params.sortParam || 'createdDate', params.sortOrder);
3081
+ this.userAccessRequestState.setRequests(requests.Result);
3082
+ }
3083
+ catch (error) {
3084
+ console.error('Failed to load requests with param:', error);
3085
+ throw error;
3086
+ }
3087
+ finally {
3088
+ this.userAccessRequestState.setUpdating(false);
3089
+ }
3090
+ }
2936
3091
  updateQueryParams(params) {
2937
3092
  this.userAccessRequestState.updateQueryParams(params);
2938
3093
  this.loadRequests();
@@ -3009,18 +3164,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
3009
3164
  providedIn: 'root',
3010
3165
  }]
3011
3166
  }], ctorParameters: () => [{ type: UserAccessRequestService }, { type: UserAccessRequestState }, { type: UtilService }] });
3012
-
3013
- var UserAccessRequestStatus;
3014
- (function (UserAccessRequestStatus) {
3015
- UserAccessRequestStatus["Pending"] = "Pending";
3016
- UserAccessRequestStatus["Approved"] = "Approved";
3017
- UserAccessRequestStatus["Declined"] = "Declined";
3018
- })(UserAccessRequestStatus || (UserAccessRequestStatus = {}));
3167
+ var DateFilterTypes$2;
3168
+ (function (DateFilterTypes) {
3169
+ DateFilterTypes["Before"] = "LT";
3170
+ DateFilterTypes["On"] = "EQ";
3171
+ DateFilterTypes["After"] = "GT";
3172
+ })(DateFilterTypes$2 || (DateFilterTypes$2 = {}));
3019
3173
 
3020
3174
  class UserRequestFormComponent {
3021
3175
  fb;
3022
3176
  roles = [];
3177
+ get currentData() {
3178
+ return this._currentData;
3179
+ }
3023
3180
  set currentData(value) {
3181
+ this._currentData = value;
3024
3182
  if (value?.data) {
3025
3183
  this.form.patchValue({
3026
3184
  MailAddress: value.data.MailAddress || '',
@@ -3034,6 +3192,7 @@ class UserRequestFormComponent {
3034
3192
  this.form.reset();
3035
3193
  }
3036
3194
  }
3195
+ _currentData = null;
3037
3196
  switchView = new EventEmitter();
3038
3197
  onApproval = new EventEmitter();
3039
3198
  form;
@@ -3058,6 +3217,7 @@ class UserRequestFormComponent {
3058
3217
  // } catch (error) {
3059
3218
  // // Handle error
3060
3219
  // }
3220
+ console.log(this.currentData?.data);
3061
3221
  }
3062
3222
  onSave() {
3063
3223
  if (this.form.valid) {
@@ -3315,7 +3475,7 @@ class UserRequestApprovalComponent {
3315
3475
  {
3316
3476
  name: 'CreatedAt',
3317
3477
  type: DataFilterType.Date,
3318
- checked: false,
3478
+ checked: true,
3319
3479
  },
3320
3480
  ];
3321
3481
  clearData() {
@@ -3353,6 +3513,7 @@ class UserRequestApprovalComponent {
3353
3513
  }
3354
3514
  onFilterSet(event) {
3355
3515
  console.log(event);
3516
+ this.userAccessRequestFacade.filter(event);
3356
3517
  }
3357
3518
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRequestApprovalComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: UserAccessRequestFacade }], target: i0.ɵɵFactoryTarget.Component });
3358
3519
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserRequestApprovalComponent, selector: "lib-user-request-approval", viewQueries: [{ propertyName: "cardDataView", first: true, predicate: ["vdcv"], descendants: true }, { propertyName: "dataView", first: true, predicate: ["vdv"], descendants: true }], ngImport: i0, template: "<div class=\"space-y-8\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: false,\n isToggle: true,\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"handleSearch($event)\"\n >\n <div table-content>\n <lib-data-table\n [data]=\"data()\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | date }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"status\">\n <ng-template #cell let-value>\n <lib-user-access-request-status-badge\n [status]=\"value\"\n ></lib-user-access-request-status-badge>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-value let-deleteRow>\n <div class=\"flex gap-6\">\n <verben-svg\n (click)=\"openDetailView(value)\"\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n <!-- <button (click)=\"openDetailView(value)\">Open</button>\n <button (click)=\"selected = cardData[rowIndex]; vdv.toggleView()\">\n Switch\n </button> -->\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n <!-- <ng-template #header>\n <strong>Actions</strong>\n </ng-template> -->\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n (loadMoreClick)=\"loadMore()\"\n #vdcv\n dataId=\"MailAddress\"\n border=\"5px\"\n [cardDataList]=\"cardData()\"\n rbgColor=\"#f5f6f9\"\n mg=\"20px\"\n >\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"MailAddress\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData()\"\n >\n <ng-template #card let-item>\n <div (click)=\"currentData = vdcv.onItemClick(item)\" class=\"flex\">\n <div\n (click)=\"currentData = vdcv.onItemClick(item)\"\n class=\"flex cursor-pointer w-full bg-secondary rounded-xl\"\n >\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"flex-1 flex items-end gap-y-2 gap-x-4 p-4\">\n <div class=\"flex-1 space-y-2\">\n <span\n class=\"font-semibold text-[#404040] flex-1 truncate\"\n >{{ item.title }}</span\n >\n\n <p class=\"flex items-center my-1\">\n <label for=\"phone\" class=\"text-[10px] font-light\"\n >Phone Number:</label\n >\n <span id=\"phone\" class=\"text-sm truncate\">{{\n item.data.PhoneNumber\n }}</span>\n </p>\n </div>\n\n <div class=\"grid gap-y-1\">\n <p class=\"grid\">\n <label\n for=\"role\"\n class=\"text-[10px] font-light text-[#404040]\"\n >Role</label\n >\n <span id=\"role\" class=\"text-sm font-medium\">{{\n item.body[0]?.Role\n }}</span>\n </p>\n\n <lib-user-access-request-status-badge\n [status]=\"item.data.RequestStatus\"\n ></lib-user-access-request-status-badge>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n\n <verben-right-card-data-view>\n <ng-template #parent>\n <lib-user-request-form\n [roles]=\"roles()\"\n [currentData]=\"currentData\"\n (switchView)=\"vdv.toggleView()\"\n (onApproval)=\"onApprove($event)\"\n ></lib-user-request-form>\n </ng-template>\n </verben-right-card-data-view>\n\n <verben-card-data-view-footer class=\"w-full\">\n <div\n [ngClass]=\"{\n 'flex gap-2 items-center': true,\n 'justify-between': true,\n 'justify-end': vdcv.hasCurrentItem()\n }\"\n >\n <verbena-button\n *ngIf=\"!vdcv.hasCurrentItem()\"\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [pd]=\"'9.79px 37.28px'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n <div\n class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\"\n >{{ cardData().length }} records loaded</span\n >\n <button\n (click)=\"loadMore()\"\n class=\"load-more view-links text-[#3479E9] underline\"\n >\n Load more\n </button>\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterSet($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data()\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [pd]=\"'9.79px 37.28px'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData().length }} records loaded</span>\n <button\n (click)=\"loadMore()\"\n class=\"load-more view-links text-[#3479E9] underline\"\n >\n Load more\n </button>\n </div>\n </div>\n</div>\n", styles: ["*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:currentColor}:before,:after{--tw-content: \"\"}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.visible{visibility:visible}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.bottom-8{bottom:2rem}.left-0{left:0}.right-0{right:0}.col-span-2{grid-column:span 2 / span 2}.col-span-3{grid-column:span 3 / span 3}.float-right{float:right}.m-0{margin:0}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mb-0{margin-bottom:0}.mb-2{margin-bottom:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-\\[8px\\]{margin-top:8px}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-\\[100\\%\\]{height:100%}.h-\\[max-content\\]{height:-moz-max-content;height:max-content}.h-full{height:100%}.w-2{width:.5rem}.w-3{width:.75rem}.w-full{width:100%}.\\!max-w-\\[304px\\]{max-width:304px!important}.flex-1{flex:1 1 0%}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-20{gap:5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-\\[1\\.5vw\\]{gap:1.5vw}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(2rem * var(--tw-space-x-reverse));margin-left:calc(2rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-wrap{text-wrap:wrap}.break-all{word-break:break-all}.rounded-\\[9px\\]{border-radius:9px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-br-none{border-bottom-right-radius:0}.rounded-tr-none{border-top-right-radius:0}.border,.border-\\[1px\\]{border-width:1px}.border-primary{--tw-border-opacity: 1;border-color:rgb(212 160 7 / var(--tw-border-opacity, 1))}.border-secondary-200{border-color:#d7dbe6}.bg-\\[\\#CAE1CC\\]{--tw-bg-opacity: 1;background-color:rgb(202 225 204 / var(--tw-bg-opacity, 1))}.bg-primary{--tw-bg-opacity: 1;background-color:rgb(212 160 7 / var(--tw-bg-opacity, 1))}.bg-secondary{--tw-bg-opacity: 1;background-color:rgb(232 234 241 / var(--tw-bg-opacity, 1))}.bg-secondary-100{--tw-bg-opacity: 1;background-color:rgb(245 246 249 / var(--tw-bg-opacity, 1))}.bg-secondary-200{background-color:#d7dbe6}.p-3{padding:.75rem}.p-4{padding:1rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pl-6{padding-left:1.5rem}.pr-1{padding-right:.25rem}.text-center{text-align:center}.\\!text-\\[10px\\]{font-size:10px!important}.text-\\[10px\\]{font-size:10px}.text-\\[12px\\]{font-size:12px}.text-\\[13px\\]{font-size:13px}.text-\\[16px\\]{font-size:16px}.text-\\[22px\\]{font-size:22px}.text-\\[24px\\]{font-size:24px}.text-\\[2rem\\]{font-size:2rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.lowercase{text-transform:lowercase}.leading-6{line-height:1.5rem}.leading-\\[12\\.1px\\]{line-height:12.1px}.leading-\\[16\\.6px\\]{line-height:16.6px}.leading-\\[19\\.5px\\]{line-height:19.5px}.leading-\\[29\\.05px\\]{line-height:29.05px}.leading-\\[33px\\]{line-height:33px}.leading-\\[48px\\]{line-height:48px}.text-\\[\\#333\\]{--tw-text-opacity: 1;color:rgb(51 51 51 / var(--tw-text-opacity, 1))}.text-\\[\\#3479E9\\]{--tw-text-opacity: 1;color:rgb(52 121 233 / var(--tw-text-opacity, 1))}.text-\\[\\#404040\\]{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.text-\\[\\#4ABB54\\]{--tw-text-opacity: 1;color:rgb(74 187 84 / var(--tw-text-opacity, 1))}.text-\\[black\\]{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-muted{color:#0009}.underline{text-decoration-line:underline}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.view-links{color:#3479e9;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "groupBy", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowDelete", "selectionChange"] }, { kind: "directive", type: i2.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i2.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i2.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "exportCustomClass", "selectCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "columnTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "showColumnChild", "showSortChild", "showFilterChild", "showExportChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i2.CardDataViewComponent, selector: "verben-card-data-view", inputs: ["pd", "mg", "lHeight", "rHeight", "rWidth", "lWidth", "textColor", "lbgColor", "rbgColor", "border", "display", "borderRadius", "activeCss", "inActiveCss", "displayAsRow", "cardDataList", "dataId", "totalRecords", "footer", "noOfVisibleChildren", "onItemClick", "onCardChildClick"], outputs: ["loadMoreClick"] }, { kind: "component", type: i2.LeftCardDataComponent, selector: "verben-left-card-data", inputs: ["pd", "mg", "height", "weight", "activeCss", "inActiveCss", "cardDataList", "iconCollapse", "iconExpanded", "parent", "dataId"] }, { kind: "component", type: i2.LeftCardDataViewComponent, selector: "verben-left-card-data-view", inputs: ["cardDataList"] }, { kind: "component", type: i2.RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: ["parentData", "chilData", "meth"] }, { kind: "component", type: i2.CardDataViewFooterComponent, selector: "verben-card-data-view-footer" }, { kind: "component", type: i2.SortTableComponent, selector: "verben-sort-table", inputs: ["enableDragAndDrop", "sortOptions", "resetText", "displayedOptions", "propertyText", "showMoreText", "sortButtonText", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "containerHeight"], outputs: ["selectedOptions"] }, { kind: "component", type: i2.VisibleColumnComponent, selector: "verben-visible-column", inputs: ["columns", "items", "enableDragAndDrop", "displayedColumns", "showMore", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "closeColumn"], outputs: ["columnsUpdated"] }, { kind: "component", type: i2.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied"] }, { kind: "component", type: i2.DataExportComponent, selector: "lib-data-export", inputs: ["data"], outputs: ["exportDataEvent"] }, { kind: "component", type: i2.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "svgPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "styleType", "svg", "svgWidth", "svgHeight", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: UserRequestFormComponent, selector: "lib-user-request-form", inputs: ["roles", "currentData"], outputs: ["switchView", "onApproval"] }, { kind: "component", type: UserAccessRequestStatusBadgeComponent, selector: "lib-user-access-request-status-badge", inputs: ["status"] }, { kind: "pipe", type: i2$1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -3368,51 +3529,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
3368
3529
  args: ['vdv']
3369
3530
  }] } });
3370
3531
 
3371
- var OAuthType;
3372
- (function (OAuthType) {
3373
- OAuthType["InApp"] = "InApp";
3374
- OAuthType["Google"] = "Google";
3375
- OAuthType["Facebook"] = "Facebook";
3376
- OAuthType["OAuth"] = "OAuth";
3377
- OAuthType["MicrosoftAD"] = "MicrosoftAD";
3378
- })(OAuthType || (OAuthType = {}));
3379
-
3380
- const roles = [
3381
- { id: 'admin', name: 'Admin' },
3382
- { id: 'manager', name: 'Manager' },
3383
- { id: 'staff', name: 'Staff' },
3384
- ];
3385
- const mockData = new Array(10)
3386
- .fill(1)
3387
- .map((id, i) => ({
3388
- FirstName: `First ${id + i}`,
3389
- LastName: `Last ${id + i}`,
3390
- OtherName: `Other ${id + i}`,
3391
- Id: id + i,
3392
- id: (id + i).toString(),
3393
- MailAddress: `user${id + i}@mail.com`,
3394
- PhoneNumber: `+23480000000${id + i}`,
3395
- RequestStatus: randomEnum$1(UserAccessRequestStatus),
3396
- RoleID: roles[Math.floor(Math.random() * roles.length)].id,
3397
- Password: '1234567',
3398
- ExpireOn: new Date(),
3399
- IsSeeded: false,
3400
- OTPExpireOn: new Date(),
3401
- Tenants: [],
3402
- SignupType: OAuthType.InApp,
3403
- CreatedAt: new Date(),
3404
- UpdatedAt: new Date(),
3405
- DataState: ObjectState.New,
3406
- TenantId: `Tenant${id + i}`,
3407
- Code: '',
3408
- ServiceName: '',
3409
- }));
3410
- function randomEnum$1(anEnum) {
3411
- const enumValues = Object.values(anEnum);
3412
- const randomIndex = Math.floor(Math.random() * enumValues.length);
3413
- return enumValues[randomIndex];
3414
- }
3415
-
3416
3532
  const SERVICE_CONFIG = new InjectionToken('ServiceConfig');
3417
3533
  class UserRequestApprovalService {
3418
3534
  // protected readonly baseUrl: string;
@@ -3557,17 +3673,6 @@ const columns = [
3557
3673
  },
3558
3674
  ];
3559
3675
 
3560
- var SearchPropertySign;
3561
- (function (SearchPropertySign) {
3562
- SearchPropertySign["EQ"] = "EQ";
3563
- SearchPropertySign["NEQ"] = "NEQ";
3564
- SearchPropertySign["GT"] = "GT";
3565
- SearchPropertySign["GTE"] = "GTE";
3566
- SearchPropertySign["LT"] = "LT";
3567
- SearchPropertySign["LTE"] = "LTE";
3568
- SearchPropertySign["LIKE"] = "LIKE";
3569
- })(SearchPropertySign || (SearchPropertySign = {}));
3570
-
3571
3676
  const baseStyle$1 = {
3572
3677
  width: "100%",
3573
3678
  fontFamily: '"Fraunces", serif',
@@ -4588,23 +4693,6 @@ var ChildrenType;
4588
4693
  ChildrenType["Action"] = "Action";
4589
4694
  })(ChildrenType || (ChildrenType = {}));
4590
4695
 
4591
- var SearchOperator;
4592
- (function (SearchOperator) {
4593
- SearchOperator["And"] = "And";
4594
- SearchOperator["Or"] = "Or";
4595
- })(SearchOperator || (SearchOperator = {}));
4596
-
4597
- var SearchPropertyValueType;
4598
- (function (SearchPropertyValueType) {
4599
- SearchPropertyValueType["Int"] = "Int";
4600
- SearchPropertyValueType["Float"] = "Float";
4601
- SearchPropertyValueType["Decimal"] = "Decimal";
4602
- SearchPropertyValueType["Double"] = "Double";
4603
- SearchPropertyValueType["String"] = "String";
4604
- SearchPropertyValueType["Bool"] = "Bool";
4605
- SearchPropertyValueType["Date"] = "Date";
4606
- })(SearchPropertyValueType || (SearchPropertyValueType = {}));
4607
-
4608
4696
  class RoleControlService {
4609
4697
  constructor() { }
4610
4698
  get roleColumns() {