verben-authentication-ui 0.6.0 → 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) {
@@ -2650,6 +2650,104 @@ const baseStyle$2 = {
2650
2650
  },
2651
2651
  };
2652
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
+
2653
2751
  class UserAccessRequestService {
2654
2752
  httpService;
2655
2753
  BASE_URL = 'User';
@@ -2685,6 +2783,19 @@ class UserAccessRequestService {
2685
2783
  const url = `${this.BASE_URL}/GetUserAccessRequestWithParam/${param}/${skip}/${limit}/${sortParam}/${sortOrder}`;
2686
2784
  return this.httpService.get(url);
2687
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
+ }
2688
2799
  /**
2689
2800
  * Save multiple user access requests
2690
2801
  * @param requests Array of user access requests to save
@@ -2734,6 +2845,7 @@ class UserAccessRequestState {
2734
2845
  sortParam: 'CreatedAt',
2735
2846
  sortOrder: 'asc',
2736
2847
  });
2848
+ filterParams$ = new BehaviorSubject([]);
2737
2849
  isUpdating$() {
2738
2850
  return this.updating$.asObservable();
2739
2851
  }
@@ -2746,6 +2858,12 @@ class UserAccessRequestState {
2746
2858
  setRequests(requests) {
2747
2859
  this.requests$.next(requests);
2748
2860
  }
2861
+ getFilterParams$() {
2862
+ return this.filterParams$.asObservable();
2863
+ }
2864
+ setFilterParams(params) {
2865
+ this.filterParams$.next(params);
2866
+ }
2749
2867
  getRoles$() {
2750
2868
  return this.roles$.asObservable();
2751
2869
  }
@@ -2816,13 +2934,20 @@ class UserAccessRequestFacade {
2816
2934
  this.utilService = utilService;
2817
2935
  // Set up debounced search handling
2818
2936
  this.searchSubject
2819
- .pipe(debounceTime(500), distinctUntilChanged(), takeUntil(this.destroy$))
2937
+ .pipe(debounceTime(1000), distinctUntilChanged(), takeUntil(this.destroy$))
2820
2938
  .subscribe((searchTerm) => {
2821
2939
  this.handleSearch(searchTerm);
2822
2940
  });
2823
2941
  this.isUpdating$().subscribe((loading) => {
2824
2942
  this.utilService.sendBI(loading);
2825
2943
  });
2944
+ this.getFilterParams$().subscribe((params) => {
2945
+ if (params.length) {
2946
+ }
2947
+ else {
2948
+ this.loadRequests();
2949
+ }
2950
+ });
2826
2951
  }
2827
2952
  destroy() {
2828
2953
  this.destroy$.next();
@@ -2834,6 +2959,9 @@ class UserAccessRequestFacade {
2834
2959
  getRequests$() {
2835
2960
  return this.userAccessRequestState.getRequests$();
2836
2961
  }
2962
+ getFilterParams$() {
2963
+ return this.userAccessRequestState.getFilterParams$();
2964
+ }
2837
2965
  getRoles$() {
2838
2966
  return this.userAccessRequestState.getRoles$();
2839
2967
  }
@@ -2867,6 +2995,10 @@ class UserAccessRequestFacade {
2867
2995
  this.userAccessRequestState.setUpdating(false);
2868
2996
  }
2869
2997
  }
2998
+ async filter(filterParams) {
2999
+ this.userAccessRequestState.resetPagination();
3000
+ this.userAccessRequestState.setFilterParams(filterParams);
3001
+ }
2870
3002
  // Load more handling
2871
3003
  async loadMore() {
2872
3004
  try {
@@ -2935,6 +3067,27 @@ class UserAccessRequestFacade {
2935
3067
  this.userAccessRequestState.setUpdating(false);
2936
3068
  }
2937
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
+ }
2938
3091
  updateQueryParams(params) {
2939
3092
  this.userAccessRequestState.updateQueryParams(params);
2940
3093
  this.loadRequests();
@@ -3011,18 +3164,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
3011
3164
  providedIn: 'root',
3012
3165
  }]
3013
3166
  }], ctorParameters: () => [{ type: UserAccessRequestService }, { type: UserAccessRequestState }, { type: UtilService }] });
3014
-
3015
- var UserAccessRequestStatus;
3016
- (function (UserAccessRequestStatus) {
3017
- UserAccessRequestStatus["Pending"] = "Pending";
3018
- UserAccessRequestStatus["Approved"] = "Approved";
3019
- UserAccessRequestStatus["Declined"] = "Declined";
3020
- })(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 = {}));
3021
3173
 
3022
3174
  class UserRequestFormComponent {
3023
3175
  fb;
3024
3176
  roles = [];
3177
+ get currentData() {
3178
+ return this._currentData;
3179
+ }
3025
3180
  set currentData(value) {
3181
+ this._currentData = value;
3026
3182
  if (value?.data) {
3027
3183
  this.form.patchValue({
3028
3184
  MailAddress: value.data.MailAddress || '',
@@ -3036,6 +3192,7 @@ class UserRequestFormComponent {
3036
3192
  this.form.reset();
3037
3193
  }
3038
3194
  }
3195
+ _currentData = null;
3039
3196
  switchView = new EventEmitter();
3040
3197
  onApproval = new EventEmitter();
3041
3198
  form;
@@ -3060,6 +3217,7 @@ class UserRequestFormComponent {
3060
3217
  // } catch (error) {
3061
3218
  // // Handle error
3062
3219
  // }
3220
+ console.log(this.currentData?.data);
3063
3221
  }
3064
3222
  onSave() {
3065
3223
  if (this.form.valid) {
@@ -3317,7 +3475,7 @@ class UserRequestApprovalComponent {
3317
3475
  {
3318
3476
  name: 'CreatedAt',
3319
3477
  type: DataFilterType.Date,
3320
- checked: false,
3478
+ checked: true,
3321
3479
  },
3322
3480
  ];
3323
3481
  clearData() {
@@ -3355,6 +3513,7 @@ class UserRequestApprovalComponent {
3355
3513
  }
3356
3514
  onFilterSet(event) {
3357
3515
  console.log(event);
3516
+ this.userAccessRequestFacade.filter(event);
3358
3517
  }
3359
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 });
3360
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 });
@@ -3370,51 +3529,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
3370
3529
  args: ['vdv']
3371
3530
  }] } });
3372
3531
 
3373
- var OAuthType;
3374
- (function (OAuthType) {
3375
- OAuthType["InApp"] = "InApp";
3376
- OAuthType["Google"] = "Google";
3377
- OAuthType["Facebook"] = "Facebook";
3378
- OAuthType["OAuth"] = "OAuth";
3379
- OAuthType["MicrosoftAD"] = "MicrosoftAD";
3380
- })(OAuthType || (OAuthType = {}));
3381
-
3382
- const roles = [
3383
- { id: 'admin', name: 'Admin' },
3384
- { id: 'manager', name: 'Manager' },
3385
- { id: 'staff', name: 'Staff' },
3386
- ];
3387
- const mockData = new Array(10)
3388
- .fill(1)
3389
- .map((id, i) => ({
3390
- FirstName: `First ${id + i}`,
3391
- LastName: `Last ${id + i}`,
3392
- OtherName: `Other ${id + i}`,
3393
- Id: id + i,
3394
- id: (id + i).toString(),
3395
- MailAddress: `user${id + i}@mail.com`,
3396
- PhoneNumber: `+23480000000${id + i}`,
3397
- RequestStatus: randomEnum$1(UserAccessRequestStatus),
3398
- RoleID: roles[Math.floor(Math.random() * roles.length)].id,
3399
- Password: '1234567',
3400
- ExpireOn: new Date(),
3401
- IsSeeded: false,
3402
- OTPExpireOn: new Date(),
3403
- Tenants: [],
3404
- SignupType: OAuthType.InApp,
3405
- CreatedAt: new Date(),
3406
- UpdatedAt: new Date(),
3407
- DataState: ObjectState.New,
3408
- TenantId: `Tenant${id + i}`,
3409
- Code: '',
3410
- ServiceName: '',
3411
- }));
3412
- function randomEnum$1(anEnum) {
3413
- const enumValues = Object.values(anEnum);
3414
- const randomIndex = Math.floor(Math.random() * enumValues.length);
3415
- return enumValues[randomIndex];
3416
- }
3417
-
3418
3532
  const SERVICE_CONFIG = new InjectionToken('ServiceConfig');
3419
3533
  class UserRequestApprovalService {
3420
3534
  // protected readonly baseUrl: string;
@@ -3559,17 +3673,6 @@ const columns = [
3559
3673
  },
3560
3674
  ];
3561
3675
 
3562
- var SearchPropertySign;
3563
- (function (SearchPropertySign) {
3564
- SearchPropertySign["EQ"] = "EQ";
3565
- SearchPropertySign["NEQ"] = "NEQ";
3566
- SearchPropertySign["GT"] = "GT";
3567
- SearchPropertySign["GTE"] = "GTE";
3568
- SearchPropertySign["LT"] = "LT";
3569
- SearchPropertySign["LTE"] = "LTE";
3570
- SearchPropertySign["LIKE"] = "LIKE";
3571
- })(SearchPropertySign || (SearchPropertySign = {}));
3572
-
3573
3676
  const baseStyle$1 = {
3574
3677
  width: "100%",
3575
3678
  fontFamily: '"Fraunces", serif',
@@ -4590,23 +4693,6 @@ var ChildrenType;
4590
4693
  ChildrenType["Action"] = "Action";
4591
4694
  })(ChildrenType || (ChildrenType = {}));
4592
4695
 
4593
- var SearchOperator;
4594
- (function (SearchOperator) {
4595
- SearchOperator["And"] = "And";
4596
- SearchOperator["Or"] = "Or";
4597
- })(SearchOperator || (SearchOperator = {}));
4598
-
4599
- var SearchPropertyValueType;
4600
- (function (SearchPropertyValueType) {
4601
- SearchPropertyValueType["Int"] = "Int";
4602
- SearchPropertyValueType["Float"] = "Float";
4603
- SearchPropertyValueType["Decimal"] = "Decimal";
4604
- SearchPropertyValueType["Double"] = "Double";
4605
- SearchPropertyValueType["String"] = "String";
4606
- SearchPropertyValueType["Bool"] = "Bool";
4607
- SearchPropertyValueType["Date"] = "Date";
4608
- })(SearchPropertyValueType || (SearchPropertyValueType = {}));
4609
-
4610
4696
  class RoleControlService {
4611
4697
  constructor() { }
4612
4698
  get roleColumns() {