ets-fe-ng-sdk 20.3.8 → 20.3.10

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.
@@ -3,7 +3,7 @@ import { FormControl, Validators, FormGroup, FormArray, FormBuilder, NG_VALUE_AC
3
3
  import { ReplaySubject, filter, debounceTime, lastValueFrom, Observable, BehaviorSubject, isObservable, of, merge, firstValueFrom, throwError, interval, map as map$1, startWith, switchMap, forkJoin, catchError as catchError$1, first, distinctUntilChanged, tap as tap$1, fromEvent, mergeMap, debounce, timer, Subject, distinct, concat } from 'rxjs';
4
4
  import 'zone.js/plugins/zone-error';
5
5
  import * as i0 from '@angular/core';
6
- import { signal, computed, Injectable, inject, APP_INITIALIZER, isDevMode, Pipe, NgModule, input, Directive, booleanAttribute, ChangeDetectorRef, model, output, effect, ViewChild, Input, Component, EventEmitter, Output, forwardRef, ChangeDetectionStrategy, HostListener, HostBinding, viewChild, linkedSignal, viewChildren, Inject, DestroyRef, contentChild, ElementRef, Optional, InjectionToken, ErrorHandler } from '@angular/core';
6
+ import { signal, computed, Injectable, inject, APP_INITIALIZER, isDevMode, Pipe, NgModule, input, Directive, booleanAttribute, ChangeDetectorRef, model, output, effect, ViewChild, Input, Component, EventEmitter, Output, forwardRef, ChangeDetectionStrategy, HostListener, HostBinding, viewChild, untracked, linkedSignal, viewChildren, Inject, DestroyRef, contentChild, ElementRef, Optional, InjectionToken, ErrorHandler } from '@angular/core';
7
7
  import { faSpoon, faTable, faCircleExclamation, faHandshake, faPercent, faPlay, faArrowsH, faBank, faReceipt, faTag, faTruck, faStop, faRecycle, faUsers, faUnlock, faUpload, faBellSlash, faEye, faSearch, faSave, faArrowLeft, faPen, faPause, faArrowRight, faLock, faInfoCircle, faFileImport, faHome, faHistory, faUserShield, faPenFancy, faFilter, faFile, faFileExport, faEdit, faDownload, faTrash, faCogs, faClone, faListAlt, faCheck, faCancel, faMoneyCheck, faSlidersH, faPlus } from '@fortawesome/free-solid-svg-icons';
8
8
  import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
9
9
  import { clone, uniqBy, uniq, cloneDeep, isEqual, isEmpty } from 'lodash-es';
@@ -94,68 +94,6 @@ import * as i3$3 from '@angular/cdk/clipboard';
94
94
  import { ClipboardModule } from '@angular/cdk/clipboard';
95
95
  import { MatProgressBarModule } from '@angular/material/progress-bar';
96
96
 
97
- /**
98
- * A utility class for managing loading states in an application.
99
- * Tracks multiple concurrent loading operations and provides methods to start, stop,
100
- * and check the overall loading state.
101
- */
102
- class PageLoader {
103
- constructor() {
104
- /**
105
- * Internal array to track active loading operations.
106
- * Each element represents a single loading operation.
107
- * @private
108
- */
109
- this._pageLoaders = [];
110
- /**
111
- * Starts one or more loading operations.
112
- * @param {number} value - The number of loading operations to start. Defaults to 1.
113
- * @returns {number} The total number of active loading operations after starting.
114
- */
115
- this.startPl = (value = 1) => {
116
- for (let index = 0; index < value; index++) {
117
- this._pageLoaders.push(1);
118
- }
119
- // console.log('length at start',this._pageLoaders.length)
120
- return this._pageLoaders?.length;
121
- };
122
- /**
123
- * Resets and restarts the loading state with a single loading operation.
124
- * Clears all existing loading operations and starts a new one.
125
- */
126
- this.restartPl = () => {
127
- this._pageLoaders = [];
128
- this.startPl();
129
- };
130
- /**
131
- * Stops one or more loading operations.
132
- * @param {number} value - The number of loading operations to stop. Defaults to 1.
133
- * @returns {number} The total number of active loading operations after stopping.
134
- */
135
- this.stopPl = (value = 1) => {
136
- for (let index = 0; index < value; index++) {
137
- this._pageLoaders.pop();
138
- }
139
- // console.log('length at end', this._pageLoaders.length)
140
- return this._pageLoaders?.length;
141
- };
142
- /**
143
- * Stops all active loading operations at once.
144
- * Completely clears the loading state.
145
- */
146
- this.stopAllPls = () => {
147
- this._pageLoaders = [];
148
- };
149
- }
150
- /**
151
- * Indicates whether any loading operations are currently active.
152
- * @returns {boolean} True if at least one loading operation is active, false otherwise.
153
- */
154
- get isLoading() {
155
- return this._pageLoaders?.length > 0;
156
- }
157
- }
158
-
159
97
  /**
160
98
  * Namespace containing form-related utilities and configurations
161
99
  */
@@ -691,1067 +629,1129 @@ var EMenuType;
691
629
  class Constant {
692
630
  }
693
631
 
694
- /**
695
- * Abstract base class for SDK environment configuration.
696
- * Provides core functionality for application settings, routing, translation, and UI state management.
697
- */
698
- class SDKEnvironment {
699
- /**
700
- * Gets the authentication token
701
- * @returns The authentication token or null if not available
702
- */
703
- get token() {
704
- return null;
705
- }
632
+ var EVFunctions;
633
+ (function (EVFunctions) {
706
634
  /**
707
- * Sets the loading state of the application
708
- * @param v Whether the application is loading
635
+ * Removes 'null' strings from text
636
+ * @param text - The string to process
637
+ * @returns The processed string with 'null' strings removed or the original text if null/undefined
709
638
  */
710
- set loading(v) {
711
- if (v)
712
- this.pageLoader.startPl();
713
- else
714
- this.pageLoader.stopPl();
639
+ function stripNull(text) {
640
+ return text
641
+ ? text == 'null'
642
+ ? null
643
+ : text.slice(-5) == ' null'
644
+ ? stripNull(text.slice(0, -5))
645
+ : text.slice(0, 5) == 'null '
646
+ ? stripNull(text.slice(5))
647
+ : text.replace(' null ', ' ')
648
+ : text;
715
649
  }
650
+ EVFunctions.stripNull = stripNull;
716
651
  /**
717
- * Creates a new environment instance
718
- * @param production Whether the application is running in production mode
719
- * @param name Environment name identifier
652
+ * Creates route redirects for a given route
653
+ * @param route - The target route to redirect to
654
+ * @param redirects - Array of redirect configurations
655
+ * @returns An array of routes including the redirects and the original route
720
656
  */
721
- constructor(production, name) {
722
- this.production = production;
723
- /** Map of menus to exclude from display */
724
- this.excludedMenus = new Map([]);
725
- /**
726
- * The storage key for the last timestamp an update was found
727
- */
728
- this.lastUpdateTimeStorageKey = 'lastUpdateTime';
729
- /**
730
- * The storage key for the last timestamp an update was checked
731
- */
732
- this.lastUpdateCheckTimeStorageKey = 'lastUpdateCheckTime';
733
- /** Storage key for target language preference */
734
- this.targetLanguageKey = 'targetLanguage';
735
- /** Storage key for translation settings */
736
- this.translateKey = 'translate';
737
- /** Storage key for user company configuration */
738
- this.userCompanyConfigKey = 'userCompanyConfig';
739
- /** Storage key for user menu preferences */
740
- this.userMenuKey = 'userMenu';
741
- /** Storage mechanism to use (localStorage or sessionStorage) */
742
- this.storageKey = 'localStorage';
743
- /** Whether to use error reporting tools like Sentry */
744
- this.reportError = true;
745
- /**
746
- * Request timeout duration in milliseconds or as a Date object
747
- */
748
- this.requestTimeout = new Date(86400000 * 365 + Date.now());
749
- /** Whether to use the user menu */
750
- this.useUserMenu = true;
751
- /** Page loader instance for managing loading states */
752
- this.pageLoader = new PageLoader();
753
- /** Subject for tracking HTTP request loading state */
754
- this.requestLoader$ = new ReplaySubject();
755
- /** Counter for active HTTP requests */
756
- this.requestCount = 0;
757
- /** Storage key for application logs */
758
- this.logsKey = 'logs';
759
- /** Application name */
760
- this.appName = 'Evolutics';
761
- /** URL for help documentation */
762
- this.helpLink = 'https://help.evoluticstech.com/';
763
- /** Storage key for user profile data */
764
- this.userProfileKey = 'userProfile';
765
- /** Storage key for user authentication data */
766
- this.userStorageKey = 'user';
767
- /** Source language code */
768
- this.sourceLanguage = ELanguage.EN;
769
- /** Application version number */
770
- this.versionNo = '0.0.1';
771
- if (!production)
772
- this.debug = true;
773
- this.name = name;
774
- if (this.logActivities == null)
775
- this.logActivities = production == true;
657
+ function routeRedirects(route, redirects) {
658
+ return [...redirects.map((r) => ({ ...r, redirectTo: route.path })), route];
776
659
  }
660
+ EVFunctions.routeRedirects = routeRedirects;
777
661
  /**
778
- * Gets whether translation is enabled
779
- * @returns The translation enabled state
662
+ * @deprecated Please use extendRoute2 instead
663
+ * @param route
664
+ * @param indexComponent
665
+ * @param indexLazyModule
666
+ * @example
667
+ * ```ts
668
+ * EVFunctions.extendRoute(
669
+ * {
670
+ * path: '',
671
+ * data: { title: 'CRM / Setups / Segment' },
672
+ * loadChildren: () => import('./create-segment/create-segment.module')
673
+ * .then((m) => m.CreateSegmentModule),
674
+ * },
675
+ * null,
676
+ * () => import('./segments-index/segments-index.module')
677
+ * .then((m) => m.SegmentsIndexModule));
678
+ * ```
679
+ * @returns
780
680
  */
781
- get translate() {
782
- return this._translate || false;
681
+ function extendRoute(route, indexComponent, indexLazyModule) {
682
+ const routes = [
683
+ {
684
+ path: '',
685
+ data: {
686
+ ...route.data,
687
+ title: route.data?.title,
688
+ type: EPageType.indexPage,
689
+ },
690
+ component: indexComponent,
691
+ loadChildren: indexLazyModule,
692
+ },
693
+ {
694
+ path: 'index',
695
+ data: {
696
+ ...route.data,
697
+ title: route.data?.title,
698
+ type: EPageType.indexPage,
699
+ },
700
+ component: indexComponent,
701
+ loadChildren: indexLazyModule,
702
+ },
703
+ {
704
+ path: 'clone',
705
+ data: {
706
+ ...route.data,
707
+ title: pageTitler(route.data?.title, 'Clone'),
708
+ type: EPageType.clonePage,
709
+ },
710
+ component: route.component,
711
+ loadChildren: route.loadChildren,
712
+ },
713
+ {
714
+ path: 'create',
715
+ data: {
716
+ ...route.data,
717
+ title: pageTitler(route.data?.title, 'Create'),
718
+ type: EPageType.createPage,
719
+ },
720
+ component: route.component,
721
+ loadChildren: route.loadChildren,
722
+ },
723
+ {
724
+ path: 'edit',
725
+ data: {
726
+ ...route.data,
727
+ title: pageTitler(route.data?.title, 'Edit'),
728
+ type: EPageType.editPage,
729
+ },
730
+ component: route.component,
731
+ loadChildren: route.loadChildren,
732
+ },
733
+ {
734
+ path: 'show',
735
+ data: {
736
+ ...route.data,
737
+ title: pageTitler(route.data?.title, 'Show'),
738
+ type: EPageType.showPage,
739
+ },
740
+ component: route.component,
741
+ loadChildren: route.loadChildren,
742
+ },
743
+ ];
744
+ if (!indexComponent && !indexLazyModule) {
745
+ routes.splice(0, 2);
746
+ }
747
+ return routes;
783
748
  }
749
+ EVFunctions.extendRoute = extendRoute;
784
750
  /**
785
- * Sets whether translation is enabled
786
- * @param value The new translation enabled state
787
- */
788
- set translate(value) {
789
- this._translate = value;
790
- }
791
- /**
792
- * Gets the target language for translations
793
- * @returns The target language code
751
+ *
752
+ * @param route
753
+ * @param indexPage
754
+ * @example
755
+ * ```ts
756
+ * EVFunctions.extendRoute2(
757
+ {
758
+ path: '',
759
+ data: { title: ' Process Actions' },
760
+ loadComponent: () =>
761
+ import('./create-process-actions/create-process-actions.component').then(
762
+ (c) => c.CreateProcessActionsComponent
763
+ ),
764
+ },
765
+ { component: IndexProcessActionsComponent }
766
+ )
767
+ * ```
768
+ * @returns
794
769
  */
795
- get targetLanguage() {
796
- return this._targetLanguage;
770
+ function extendRoute2(route, indexPage) {
771
+ const routes = [
772
+ {
773
+ ...route,
774
+ path: 'clone',
775
+ data: {
776
+ ...route.data,
777
+ title: pageTitler(route.data?.title, 'Clone'),
778
+ type: EPageType.clonePage,
779
+ },
780
+ },
781
+ {
782
+ ...route,
783
+ path: 'create',
784
+ data: {
785
+ ...route.data,
786
+ title: pageTitler(route.data?.title, 'Create'),
787
+ type: EPageType.createPage,
788
+ },
789
+ },
790
+ {
791
+ ...route,
792
+ path: 'edit',
793
+ data: {
794
+ ...route.data,
795
+ title: pageTitler(route.data?.title, 'Edit'),
796
+ type: EPageType.editPage,
797
+ },
798
+ },
799
+ {
800
+ ...route,
801
+ path: 'show',
802
+ data: {
803
+ ...route.data,
804
+ title: pageTitler(route.data?.title, 'Show'),
805
+ type: EPageType.showPage,
806
+ },
807
+ },
808
+ ];
809
+ if (indexPage && Object.keys(indexPage).length > 0) {
810
+ const indexRoute = {
811
+ ...indexPage,
812
+ data: {
813
+ ...route.data,
814
+ title: indexPage?.hideTitle ? undefined : indexPage?.title || route.data?.title,
815
+ type: EPageType.indexPage,
816
+ ...indexPage.data,
817
+ },
818
+ loadChildren: indexPage?.loadChildren ?? indexPage?.lazyModule,
819
+ loadComponent: indexPage?.loadComponent ?? indexPage?.lazyComponent,
820
+ };
821
+ routes.splice(0, 0, indexPage?.redirectToIndex
822
+ ? { path: '', redirectTo: 'index', pathMatch: 'full' }
823
+ : {
824
+ path: '',
825
+ ...indexRoute,
826
+ }, {
827
+ ...indexRoute,
828
+ path: 'index',
829
+ });
830
+ }
831
+ return routes;
832
+ }
833
+ EVFunctions.extendRoute2 = extendRoute2;
834
+ function createModule(path, route, indexPage) {
835
+ return { path, children: extendRoute2(route, indexPage) };
797
836
  }
837
+ EVFunctions.createModule = createModule;
798
838
  /**
799
- * Sets the target language for translations
800
- * @param value The new target language code
839
+ * Concatenates two strings and accounts for null values
840
+ * @param text1 First string to concatenate
841
+ * @param text2 Second string to concatenate
842
+ * @param joinerText String to place in between the two texts
843
+ * @returns
801
844
  */
802
- set targetLanguage(value) {
803
- this._targetLanguage = value;
845
+ function strConcatenator(text1, text2, joinerText = ' - ') {
846
+ return { value: text1, label: strConcatenator2(text1, text2, joinerText) };
847
+ }
848
+ EVFunctions.strConcatenator = strConcatenator;
849
+ function strConcatenator2(param1, param2, joinerText = ' - ') {
850
+ if (Array.isArray(param1)) {
851
+ const jt = param2 != null ? param2 : ' - ';
852
+ return param1
853
+ .map((x) => x?.toString()?.trim())
854
+ .filter((x) => x != null)
855
+ .join(jt);
856
+ }
857
+ else {
858
+ param1 = param1?.toString()?.trim();
859
+ param2 = param2?.toString()?.trim();
860
+ if (param1 != null && param2 != null)
861
+ return param1 + joinerText + param2;
862
+ else
863
+ return param1 || param2;
864
+ }
804
865
  }
866
+ EVFunctions.strConcatenator2 = strConcatenator2;
805
867
  /**
806
- * Reinitializes the environment object with new settings
807
- * @param env New environment object to use to reset this object
868
+ * Generates a RFC4122 version 4 compliant UUID
869
+ * @returns A randomly generated UUID string
808
870
  */
809
- reinit(env) {
810
- Object.assign(this, env);
811
- }
812
- }
813
- /**
814
- * Concrete implementation of SDKEnvironment with typed properties
815
- * for systems, routes, menus and language settings.
816
- */
817
- class Environment extends SDKEnvironment {
871
+ EVFunctions.generateUUID = () => {
872
+ let d = new Date().getTime();
873
+ let d2 = (typeof performance !== 'undefined' && performance.now && performance.now() * 1000) || 0; //Time in microseconds since page-load or 0 if unsupported
874
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
875
+ let r = Math.random() * 16; //random number between 0 and 16
876
+ if (d > 0) {
877
+ //Use timestamp until depleted
878
+ r = (d + r) % 16 | 0;
879
+ d = Math.floor(d / 16);
880
+ }
881
+ else {
882
+ //Use microseconds since page-load if supported
883
+ r = (d2 + r) % 16 | 0;
884
+ d2 = Math.floor(d2 / 16);
885
+ }
886
+ return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
887
+ });
888
+ };
818
889
  /**
819
- * Creates a new environment instance
820
- * @param production Whether the application is running in production mode
821
- * @param name Environment name identifier
890
+ * Formats a page title with an infix
891
+ * @param title - The original title, typically in a path format with slashes
892
+ * @param infix - The text to insert before the last segment of the title
893
+ * @returns The formatted title string
822
894
  */
823
- constructor(production, name) {
824
- super(production, name);
825
- this.production = production;
826
- this.sourceLanguage = ELanguage.EN;
895
+ function pageTitler(title, infix) {
896
+ if (!title)
897
+ return '';
898
+ if (!infix)
899
+ return title;
900
+ const split = title.split('/'), lastSplit = split.pop(), prefix = split.join('/');
901
+ return (prefix ? prefix + ' / ' : ' ') + infix + ' ' + lastSplit;
827
902
  }
828
903
  /**
829
- * Gets the target language for translations
830
- * @returns The target language code
904
+ * Creates a redirect route for user management
905
+ * @param route - The original route to modify
906
+ * @param prefix - The prefix to add to the route path
907
+ * @returns An array of routes including the redirect and the modified route
831
908
  */
832
- get targetLanguage() {
833
- return this._targetLanguage;
909
+ function redirectRouteForUM(route, prefix) {
910
+ const oPath = route?.path + '', nPath = prefix + oPath;
911
+ route.path = nPath;
912
+ const routes = [
913
+ {
914
+ path: oPath,
915
+ redirectTo: nPath,
916
+ },
917
+ route,
918
+ ];
919
+ return routes;
834
920
  }
921
+ EVFunctions.redirectRouteForUM = redirectRouteForUM;
835
922
  /**
836
- * Sets the target language for translations
837
- * @param value The new target language code
923
+ * Type casting utility function that returns the input value with its type preserved
924
+ * @param value - The value to cast
925
+ * @returns The same value with its type information preserved
926
+ * @typeParam T - The type of the value
838
927
  */
839
- set targetLanguage(value) {
840
- this._targetLanguage = value;
928
+ function typeCaster(value) {
929
+ return value;
841
930
  }
842
- }
931
+ EVFunctions.typeCaster = typeCaster;
932
+ })(EVFunctions || (EVFunctions = {}));
843
933
 
844
- // This file can be replaced during build by using the `fileReplacements` array.
845
- // `ng build` replaces `environment.ts` with `environment.prod.ts`.
846
- // The list of file replacements can be found in `angular.json`.
934
+ //#region string */
847
935
  /**
848
- * Environment configuration for the application.
849
- *
850
- * This constant defines the environment settings for the development environment.
851
- * It creates a new Environment instance with parameters:
852
- * @param {boolean} false - Indicates this is not a production environment
853
- * @param {string} 'Development' - The name of the current environment
936
+ * Removes the specified character from the string
937
+ * @param character Character to remove (defaults to '/')
938
+ * @returns String with the character removed
854
939
  */
855
- const environment = new Environment(false, 'Development');
856
- /*
857
- * For easier debugging in development mode, you can import the following file
858
- * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
859
- *
860
- * This import should be commented out in production mode because it will have a negative impact
861
- * on performance if an error is thrown.
940
+ String.prototype.stripChar = function (character = '/') {
941
+ return (this + '').replace(character, '');
942
+ };
943
+ /**
944
+ * Removes the specified character from the end of the string if present
945
+ * @param character Character to remove from the end (defaults to '/')
946
+ * @returns String with the character removed from the end if it was present
862
947
  */
863
-
948
+ String.prototype.lastStripChar = function (character = '/') {
949
+ return this[this?.length - 1] == character ? this.slice(0, this.length - 1) : this;
950
+ };
951
+ String.prototype.removeNull = function () {
952
+ return EVFunctions.stripNull(this);
953
+ };
864
954
  /**
865
- * Class implementation of menu items with additional functionality
866
- * @template TESystemType - The system type, defaults to ESystem
867
- * @template TESubSystem - The subsystem type, defaults to ESubSystem
868
- * @template TEMenuLocation - The menu location type, defaults to EMenuLocation
955
+ * Removes all instances of a character from a string
956
+ * @param character Character to remove (defaults to '/')
957
+ * @param replacement String to replace with (defaults to '')
958
+ * @returns String with all instances of the character removed or replaced
869
959
  */
870
- class ETSMenuItem {
871
- /**
872
- * Gets the edit access status
873
- * @returns Current edit access status
874
- */
875
- get _editAccess() {
876
- console.log(this.editAccess);
877
- return this.editAccess;
878
- }
879
- /**
880
- * Sets the edit access status and propagates to submenu items
881
- * @param value - New edit access status
882
- */
883
- set _editAccess(value) {
884
- this.editAccess = value;
885
- this.toggleEditAllSubMenus();
886
- }
887
- /**
888
- * Gets the view access status
889
- * @returns Current view access status
890
- */
891
- get _viewAccess() {
892
- return this.viewAccess;
960
+ String.prototype.unChar = function (character = '/', replacement = '') {
961
+ let te = '';
962
+ for (let i = 0; i < this.length; i++) {
963
+ const e = this[i];
964
+ te += e != character ? e : '';
893
965
  }
894
- /**
895
- * Sets the view access status and propagates to submenu items
896
- * @param value - New view access status
897
- */
898
- set _viewAccess(value) {
899
- this.viewAccess = value;
900
- this.toggleViewAllSubMenus();
966
+ return te.split(character).join(replacement);
967
+ };
968
+ String.prototype.toSentenceCase = function () {
969
+ return this.replace(/([A-Z])/g, ' $1');
970
+ };
971
+ String.prototype.replaceAllSubStr = function (character = '/', replacement = '') {
972
+ return this.split(character).join(replacement);
973
+ };
974
+ String.prototype.addPrecedingChar = function (character, expectedLength) {
975
+ if (this.length >= expectedLength)
976
+ return this;
977
+ return character.repeat(expectedLength - this.length) + this;
978
+ };
979
+ //#endregion
980
+ //#region array */
981
+ /**
982
+ * Concatenates all elements of the array into a single string
983
+ * @returns Combined string of all array elements
984
+ */
985
+ Array.prototype.merge = function () {
986
+ let r = '';
987
+ for (const i of this) {
988
+ r += i;
901
989
  }
902
- /**
903
- * Creates a new menu item
904
- * @param menuItem - Source menu item data
905
- * @param parent - Optional parent menu item
906
- */
907
- constructor(menuItem, parent) {
908
- Object.assign(this, menuItem);
909
- this.labelLowerCase = menuItem?.label?.toLowerCase();
910
- this.hasSub = !!menuItem?.subs?.length;
911
- this.isP = true;
912
- this.parentID = parent?.id;
913
- // debugger
914
- this.system = this.system || parent?.system;
915
- this.subSystem = this.subSystem || parent?.subSystem;
916
- this.subs = menuItem?.subs
917
- ?.filter((x) => !environment.excludedMenus || !environment.excludedMenus.has(x.id))
918
- ?.map((m) => new ETSMenuItem(m, this));
990
+ return r;
991
+ };
992
+ Array.prototype.reverseIndex = function (index = 0) {
993
+ return this[this?.length - (1 + index)];
994
+ };
995
+ /**
996
+ * Returns the last item in the array
997
+ * @returns The last element in the array
998
+ */
999
+ Array.prototype.lastItem = function () {
1000
+ return this.reverseIndex();
1001
+ };
1002
+ Array.prototype.sortByFieldLength = function (field, reverse = false) {
1003
+ if (reverse) {
1004
+ return this.filter((x) => x != null).sort((b, a) => (a[field]?.length || 0) - (b[field]?.length || 0));
919
1005
  }
920
- /**
921
- * Toggles the disabled state of the menu item
922
- */
923
- toggle() {
924
- this.disabled = !this.disabled;
1006
+ else {
1007
+ return this.filter((x) => x != null).sort((a, b) => (a[field]?.length || 0) - (b[field]?.length || 0));
925
1008
  }
926
- /**
927
- * Toggles view access for this menu item
928
- */
929
- toggleView() {
930
- this.viewAccess = !this.viewAccess;
931
- if (this.editAccess)
932
- this.viewAccess = true;
1009
+ };
1010
+ Array.prototype.sort2 = function (field, isString = false, reverse = false) {
1011
+ if (reverse)
1012
+ return isString
1013
+ ? this.filter((x) => x != null).sort((b, a) => sortAlphaNum(a[field]?.toString(), b[field]?.toString()))
1014
+ : this.filter((x) => x != null).sort((b, a) => (a[field] || 0) - (b[field] || 0));
1015
+ else
1016
+ return isString
1017
+ ? this.filter((x) => x != null).sort((a, b) => sortAlphaNum(a[field]?.toString(), b[field]?.toString()))
1018
+ : this.filter((x) => x != null).sort((a, b) => (a[field] || 0) - (b[field] || 0));
1019
+ };
1020
+ Array.prototype.sort3 = function (field, reverse = false) {
1021
+ let isString = this.some((x) => isNaN(x[field]));
1022
+ return isString ? this.sort2(field, true, reverse) : this.sort2(field, false, reverse);
1023
+ };
1024
+ const reA = /[^a-zA-Z]/g;
1025
+ const reN = /[^0-9]/g;
1026
+ /**
1027
+ * Sorts an array by comparing alphanumeric strings
1028
+ * @param a First string to compare
1029
+ * @param b Second string to compare
1030
+ * @returns Comparison result (-1, 0, or 1)
1031
+ */
1032
+ function sortAlphaNum(a, b) {
1033
+ var aA = a?.toUpperCase()?.replace(reA, '');
1034
+ var bA = b?.toUpperCase()?.replace(reA, '');
1035
+ if (aA === bA) {
1036
+ var aN = parseInt(a?.replace(reN, ''), 10);
1037
+ var bN = parseInt(b?.replace(reN, ''), 10);
1038
+ return aN === bN ? 0 : aN > bN ? 1 : -1;
933
1039
  }
934
- /**
935
- * Toggles edit/create access for this menu item
936
- */
937
- toggleCreate() {
938
- this.editAccess = !this.editAccess;
939
- if (this.editAccess)
940
- this.viewAccess = true;
1040
+ else {
1041
+ return aA > bA ? 1 : -1;
941
1042
  }
942
- /**
943
- * Grants edit access to this menu item and all its submenu items
944
- */
945
- allowEditAllSubMenus() {
946
- this.subs?.forEach((x) => x?.allowEditAllSubMenus());
947
- //debugger;
948
- this.viewAccess = true;
949
- this.editAccess = true;
1043
+ }
1044
+ Array.prototype.removeEmptyItems = function (expectedFields, config) {
1045
+ // debugger;
1046
+ const ignoreBooleanFields = config?.ignoreBooleanFields == true;
1047
+ const fieldsType = config?.fieldsType || 'included';
1048
+ if (!this.length)
1049
+ return this;
1050
+ let fieldList;
1051
+ if (fieldsType == 'included')
1052
+ fieldList = expectedFields?.length ? expectedFields : Object.keys(this[0]);
1053
+ else if (fieldsType == 'excluded')
1054
+ fieldList = expectedFields?.length
1055
+ ? Object.keys(this[0]).filter((x) => !expectedFields.includes(x))
1056
+ : Object.keys(this[0]);
1057
+ const removedItems = [];
1058
+ if (fieldList)
1059
+ for (let i = 0; i < this.length; i++) {
1060
+ if (ignoreBooleanFields && i == 0)
1061
+ fieldList = fieldList.filter((f) => typeof this[0][f] != 'boolean');
1062
+ const item = this[i];
1063
+ if (fieldList.some((f) => item[f] != null))
1064
+ continue; //Don't remove row
1065
+ removedItems.push(...this.splice(i, 1)); //Remove row
1066
+ i = i--;
1067
+ }
1068
+ return removedItems;
1069
+ };
1070
+ Array.prototype.toMap = function (arg1, valueMap) {
1071
+ // debugger;
1072
+ const ret = {};
1073
+ if (typeof arg1 == 'function')
1074
+ for (const item of this)
1075
+ ret[arg1(item)] = item;
1076
+ else if (valueMap)
1077
+ for (const item of this)
1078
+ ret[item[arg1?.toString()]] = valueMap(item);
1079
+ else
1080
+ for (const item of this)
1081
+ ret[item[arg1?.toString()]] = item;
1082
+ return ret;
1083
+ };
1084
+ Array.prototype.groupBy = function (keyField, keyMap) {
1085
+ // debugger;
1086
+ const ret = {};
1087
+ for (const iterator of this) {
1088
+ const group = keyMap ? keyMap(iterator) : iterator[keyField];
1089
+ if (ret[group])
1090
+ ret[group].push(iterator);
1091
+ else
1092
+ ret[group] = [iterator];
950
1093
  }
951
- /**
952
- * Removes edit access from this menu item and all its submenu items
953
- */
954
- disableEditAllSubMenus() {
955
- this.subs?.forEach((x) => x?.disableEditAllSubMenus());
956
- this.editAccess = false;
1094
+ return ret;
1095
+ };
1096
+ /**
1097
+ * Creates a map where each array element becomes a key with value true
1098
+ * @returns Object with array elements as keys and boolean true as values
1099
+ */
1100
+ Array.prototype.toBooleanMap = function () {
1101
+ // debugger;
1102
+ const ret = {};
1103
+ for (const iterator of this) {
1104
+ ret[iterator] = true;
957
1105
  }
958
- /**
959
- * Grants view access to this menu item and all its submenu items
960
- */
961
- allowViewAllSubMenus() {
962
- this.subs?.forEach((x) => x?.allowViewAllSubMenus());
963
- //debugger;
964
- this.viewAccess = true;
965
- this.editAccess = false;
1106
+ return ret;
1107
+ };
1108
+ /**
1109
+ * Randomly shuffles the elements of the array
1110
+ * @returns A new array with the elements in random order
1111
+ */
1112
+ Array.prototype.shuffle = function () {
1113
+ // debugger;
1114
+ const newArr = [];
1115
+ while (this.length) {
1116
+ newArr.push(...this.splice(Math.floor(Math.random() * this.length - 1), 1));
966
1117
  }
967
- /**
968
- * Removes view access from this menu item and all its submenu items
969
- */
970
- disableViewAllSubMenus() {
971
- this.subs?.forEach((x) => x?.disableViewAllSubMenus());
972
- this.viewAccess = false;
973
- this.editAccess = false;
1118
+ return newArr;
1119
+ };
1120
+ //#endregion
1121
+ //#region Function
1122
+ /**
1123
+ * Creates a clone of the function
1124
+ * @returns A new function that behaves the same as the original
1125
+ */
1126
+ Function.prototype.clone = function () {
1127
+ var that = this;
1128
+ var temp = function temporary() {
1129
+ return that.apply(this, arguments);
1130
+ };
1131
+ for (var key in this) {
1132
+ if (this.hasOwnProperty(key)) {
1133
+ temp[key] = this[key];
1134
+ }
974
1135
  }
975
- /**
976
- * Toggles edit access for this menu item and all its submenu items
977
- */
978
- toggleEditAllSubMenus() {
979
- // if (this.editAccess == undefined) return;
980
- !this.editAccess ? this.allowEditAllSubMenus() : this.disableEditAllSubMenus();
981
- console.log(this.subs);
1136
+ return temp;
1137
+ };
1138
+ //#endregion
1139
+ //#region FORMARRAY
1140
+ /**
1141
+ * Gets the formatted value of the FormGroup
1142
+ * @returns An object containing the formatted values of all controls
1143
+ */
1144
+ FormGroup.prototype.getFormattedValue = function () {
1145
+ const data = {};
1146
+ if (!this.controls)
1147
+ return this.formattedValue;
1148
+ else
1149
+ for (const controlName in this.controls) {
1150
+ data[controlName] = (this.controls[controlName]).getFormattedValue();
1151
+ }
1152
+ return data;
1153
+ };
1154
+ /**
1155
+ * Gets the formatted value of the FormArray
1156
+ * @returns An array containing the formatted values of all controls
1157
+ */
1158
+ FormArray.prototype.getFormattedValue = function () {
1159
+ const data = [];
1160
+ if (!this.controls)
1161
+ return this.formattedValue;
1162
+ else
1163
+ for (const control of this.controls) {
1164
+ data.push(control.getFormattedValue());
1165
+ }
1166
+ return data;
1167
+ };
1168
+ /**
1169
+ * Gets the formatted value of the FormControl
1170
+ * @returns The formatted value of the control
1171
+ */
1172
+ FormControl.prototype.getFormattedValue = function () {
1173
+ return this.formattedValue;
1174
+ };
1175
+
1176
+ var prototypes = /*#__PURE__*/Object.freeze({
1177
+ __proto__: null
1178
+ });
1179
+
1180
+ /**
1181
+ * A utility class for managing loading states in an application.
1182
+ * Tracks multiple concurrent loading operations and provides methods to start, stop,
1183
+ * and check the overall loading state.
1184
+ */
1185
+ class PageLoader {
1186
+ constructor() {
1187
+ /**
1188
+ * Internal array to track active loading operations.
1189
+ * Each element represents a single loading operation.
1190
+ * @private
1191
+ */
1192
+ this._pageLoaders = [];
1193
+ /**
1194
+ * Starts one or more loading operations.
1195
+ * @param {number} value - The number of loading operations to start. Defaults to 1.
1196
+ * @returns {number} The total number of active loading operations after starting.
1197
+ */
1198
+ this.startPl = (value = 1) => {
1199
+ for (let index = 0; index < value; index++) {
1200
+ this._pageLoaders.push(1);
1201
+ }
1202
+ // console.log('length at start',this._pageLoaders.length)
1203
+ return this._pageLoaders?.length;
1204
+ };
1205
+ /**
1206
+ * Resets and restarts the loading state with a single loading operation.
1207
+ * Clears all existing loading operations and starts a new one.
1208
+ */
1209
+ this.restartPl = () => {
1210
+ this._pageLoaders = [];
1211
+ this.startPl();
1212
+ };
1213
+ /**
1214
+ * Stops one or more loading operations.
1215
+ * @param {number} value - The number of loading operations to stop. Defaults to 1.
1216
+ * @returns {number} The total number of active loading operations after stopping.
1217
+ */
1218
+ this.stopPl = (value = 1) => {
1219
+ for (let index = 0; index < value; index++) {
1220
+ this._pageLoaders.pop();
1221
+ }
1222
+ // console.log('length at end', this._pageLoaders.length)
1223
+ return this._pageLoaders?.length;
1224
+ };
1225
+ /**
1226
+ * Stops all active loading operations at once.
1227
+ * Completely clears the loading state.
1228
+ */
1229
+ this.stopAllPls = () => {
1230
+ this._pageLoaders = [];
1231
+ };
982
1232
  }
983
1233
  /**
984
- * Toggles view access for this menu item and all its submenu items
1234
+ * Indicates whether any loading operations are currently active.
1235
+ * @returns {boolean} True if at least one loading operation is active, false otherwise.
985
1236
  */
986
- toggleViewAllSubMenus() {
987
- // if (this.viewAccess == undefined) return;
988
- // debugger
989
- !this.viewAccess ? this.allowViewAllSubMenus() : this.disableViewAllSubMenus();
990
- console.log(this.subs);
1237
+ get isLoading() {
1238
+ return this._pageLoaders?.length > 0;
991
1239
  }
1240
+ }
1241
+
1242
+ /**
1243
+ * Abstract base class for SDK environment configuration.
1244
+ * Provides core functionality for application settings, routing, translation, and UI state management.
1245
+ */
1246
+ class SDKEnvironment {
992
1247
  /**
993
- * Grants both view and edit access to this menu item
1248
+ * Gets the authentication token
1249
+ * @returns The authentication token or null if not available
994
1250
  */
995
- allowAuthorization() {
996
- this.viewAccess = true;
997
- this.editAccess = true;
1251
+ get token() {
1252
+ return null;
998
1253
  }
999
1254
  /**
1000
- * Removes both view and edit access from this menu item
1255
+ * Sets the loading state of the application
1256
+ * @param v Whether the application is loading
1001
1257
  */
1002
- disableAuthorization() {
1003
- this.viewAccess = false;
1004
- this.viewAccess = false;
1258
+ set loading(v) {
1259
+ if (v)
1260
+ this.pageLoader.startPl();
1261
+ else
1262
+ this.pageLoader.stopPl();
1005
1263
  }
1006
1264
  /**
1007
- * Toggles both view and edit access for this menu item
1265
+ * Creates a new environment instance
1266
+ * @param production Whether the application is running in production mode
1267
+ * @param name Environment name identifier
1008
1268
  */
1009
- toggleAuthorization() {
1010
- this.viewAccess = !this.viewAccess;
1011
- this.editAccess = !this.editAccess;
1269
+ constructor(production, name) {
1270
+ this.production = production;
1271
+ /** Map of menus to exclude from display */
1272
+ this.excludedMenus = new Map([]);
1273
+ /**
1274
+ * The storage key for the last timestamp an update was found
1275
+ */
1276
+ this.lastUpdateTimeStorageKey = 'lastUpdateTime';
1277
+ /**
1278
+ * The storage key for the last timestamp an update was checked
1279
+ */
1280
+ this.lastUpdateCheckTimeStorageKey = 'lastUpdateCheckTime';
1281
+ /** Storage key for target language preference */
1282
+ this.targetLanguageKey = 'targetLanguage';
1283
+ /** Storage key for translation settings */
1284
+ this.translateKey = 'translate';
1285
+ /** Storage key for user company configuration */
1286
+ this.userCompanyConfigKey = 'userCompanyConfig';
1287
+ /** Storage key for user menu preferences */
1288
+ this.userMenuKey = 'userMenu';
1289
+ /** Storage mechanism to use (localStorage or sessionStorage) */
1290
+ this.storageKey = 'localStorage';
1291
+ /** Whether to use error reporting tools like Sentry */
1292
+ this.reportError = true;
1293
+ /**
1294
+ * Request timeout duration in milliseconds or as a Date object
1295
+ */
1296
+ this.requestTimeout = new Date(86400000 * 365 + Date.now());
1297
+ /** Whether to use the user menu */
1298
+ this.useUserMenu = true;
1299
+ /** Page loader instance for managing loading states */
1300
+ this.pageLoader = new PageLoader();
1301
+ /** Subject for tracking HTTP request loading state */
1302
+ this.requestLoader$ = new ReplaySubject();
1303
+ /** Counter for active HTTP requests */
1304
+ this.requestCount = 0;
1305
+ /** Storage key for application logs */
1306
+ this.logsKey = 'logs';
1307
+ /** Application name */
1308
+ this.appName = 'Evolutics';
1309
+ /** URL for help documentation */
1310
+ this.helpLink = 'https://help.evoluticstech.com/';
1311
+ /** Storage key for user profile data */
1312
+ this.userProfileKey = 'userProfile';
1313
+ /** Storage key for user authentication data */
1314
+ this.userStorageKey = 'user';
1315
+ /** Source language code */
1316
+ this.sourceLanguage = ELanguage.EN;
1317
+ /** Application version number */
1318
+ this.versionNo = '0.0.1';
1319
+ if (!production)
1320
+ this.debug = true;
1321
+ this.name = name;
1322
+ if (this.logActivities == null)
1323
+ this.logActivities = production == true;
1012
1324
  }
1013
- }
1014
- /**
1015
- * Special menu item class that represents a divider
1016
- */
1017
- class ETSMenuItemDivider extends ETSMenuItem {
1018
1325
  /**
1019
- * Creates a new divider menu item
1326
+ * Gets whether translation is enabled
1327
+ * @returns The translation enabled state
1020
1328
  */
1021
- constructor() {
1022
- super(null);
1023
- this.isDivider = true;
1329
+ get translate() {
1330
+ return this._translate || false;
1024
1331
  }
1025
- }
1026
- /**
1027
- * Enum for page button IDs
1028
- */
1029
- var EETSPageBtnID;
1030
- (function (EETSPageBtnID) {
1031
- EETSPageBtnID["agentCommissions"] = "PAC8";
1032
- EETSPageBtnID["agentCreditNotes"] = "PACN10";
1033
- EETSPageBtnID["agentDocuments"] = "PAD2";
1034
- EETSPageBtnID["agentEndorsements"] = "PAE3";
1035
- EETSPageBtnID["agentLoan"] = "PAL1";
1036
- EETSPageBtnID["agentNotes"] = "PAN6";
1037
- EETSPageBtnID["agentPendingQuotes"] = "PAPQ11";
1038
- EETSPageBtnID["agentPolicies"] = "PAP7";
1039
- EETSPageBtnID["agentProduction"] = "PAP9";
1040
- EETSPageBtnID["agentWebLogIn"] = "PAWL4";
1041
- EETSPageBtnID["agentWorkflows"] = "PAW5";
1042
- EETSPageBtnID["agentCalendar"] = "PAC6";
1043
- EETSPageBtnID["agentFutureActions"] = "PAFA23";
1044
- EETSPageBtnID["clientCalendar"] = "PCC11";
1045
- EETSPageBtnID["clientDocuments"] = "PCD12";
1046
- EETSPageBtnID["clientEndorsements"] = "PCE13";
1047
- EETSPageBtnID["clientNotes"] = "PCN14";
1048
- EETSPageBtnID["clientOtherBusiness"] = "PCOB15";
1049
- EETSPageBtnID["clientPendingPayments"] = "PCPP16";
1050
- EETSPageBtnID["clientPendingQuotes"] = "PCPQ17";
1051
- EETSPageBtnID["clientPolicies"] = "PCP18";
1052
- EETSPageBtnID["clientRelationships"] = "PCR19";
1053
- EETSPageBtnID["clientUnderwritingEvents"] = "PCUE20";
1054
- EETSPageBtnID["clientWebLogIn"] = "PCWL21";
1055
- EETSPageBtnID["clientWorkflows"] = "PCW22";
1056
- EETSPageBtnID["clientFutureActions"] = "PCFA23";
1057
- })(EETSPageBtnID || (EETSPageBtnID = {}));
1058
-
1059
- // import '../prototypes/prototypes';
1060
- /**
1061
- * Represents a basic route item with path generation capabilities.
1062
- * Handles route path construction with optional parameters.
1063
- */
1064
- class RouteItem {
1065
1332
  /**
1066
- * Creates a new RouteItem instance.
1067
- * @param base - The base route segment
1068
- * @param parentPub - The parent public path (defaults to empty string)
1069
- * @param params - Optional route parameters to append
1333
+ * Sets whether translation is enabled
1334
+ * @param value The new translation enabled state
1070
1335
  */
1071
- constructor(base, parentPub = '', ...params) {
1072
- // console.log(params);
1073
- this._ = base + (params?.length ? '/:' + params.join('/:') : '');
1074
- this.__ = base;
1075
- this.pub = parentPub + '/' + base;
1336
+ set translate(value) {
1337
+ this._translate = value;
1076
1338
  }
1077
- }
1078
- /**
1079
- * Extended route class that provides common application routes and utility methods.
1080
- * Creates a standard set of routes for CRUD operations and navigation.
1081
- */
1082
- class AppRouteBase extends RouteItem {
1083
1339
  /**
1084
- * Creates a new AppRouteBase with standard child routes.
1085
- * @param base - The base route segment
1086
- * @param parentPub - The parent public path (defaults to empty string)
1087
- * @param params - Optional route parameters to append
1340
+ * Gets the target language for translations
1341
+ * @returns The target language code
1088
1342
  */
1089
- constructor(base, parentPub = '', ...params) {
1090
- super(base, parentPub, ...params);
1091
- this.all = new RouteItem('all', this.pub);
1092
- this.clone = new RouteItem('clone', this.pub, 'id');
1093
- this.create = new CreateRoute('create', this.pub);
1094
- this.edit = new RouteItem('edit', this.pub, 'id');
1095
- this.find = new FindRoute('find', this.pub);
1096
- this.index = new RouteItem('index', this.pub);
1097
- this.overview = new RouteItem('overview', this.pub);
1098
- this.show = new RouteItem('show', this.pub, 'id');
1099
- this.start = new RouteItem('start', this.pub);
1343
+ get targetLanguage() {
1344
+ return this._targetLanguage;
1100
1345
  }
1101
- //#region funcs
1102
1346
  /**
1103
- * Combines a route with a parent ID.
1104
- * @param route - The base route
1105
- * @param prtID - The parent ID to append
1106
- * @returns The combined route string or null if route is falsy
1347
+ * Sets the target language for translations
1348
+ * @param value The new target language code
1107
1349
  */
1108
- routeIdPipe(route, prtID) {
1109
- return route ? route + '/' + prtID : null;
1350
+ set targetLanguage(value) {
1351
+ this._targetLanguage = value;
1110
1352
  }
1111
1353
  /**
1112
- * Creates a route with ID and formatted title.
1113
- * @param route - The base route
1114
- * @param id - The item ID
1115
- * @param title - Optional title to format and append
1116
- * @returns The formatted route string
1354
+ * Reinitializes the environment object with new settings
1355
+ * @param env New environment object to use to reset this object
1117
1356
  */
1118
- routeIdTitlePipe(route, id, title) {
1119
- return route + '/' + id + '/' + this.routeNamer(title);
1357
+ reinit(env) {
1358
+ Object.assign(this, env);
1120
1359
  }
1360
+ }
1361
+ /**
1362
+ * Concrete implementation of SDKEnvironment with typed properties
1363
+ * for systems, routes, menus and language settings.
1364
+ */
1365
+ class Environment extends SDKEnvironment {
1121
1366
  /**
1122
- * Creates a route with parent ID, item ID, and formatted title.
1123
- * @param route - The base route
1124
- * @param parentID - The parent item ID
1125
- * @param id - The item ID
1126
- * @param title - Optional title to format and append
1127
- * @returns The formatted route string
1367
+ * Creates a new environment instance
1368
+ * @param production Whether the application is running in production mode
1369
+ * @param name Environment name identifier
1128
1370
  */
1129
- routePIdIdTitlePipe(route, parentID, id, title) {
1130
- return route + '/' + parentID + '/' + id + '/' + this.routeNamer(title);
1371
+ constructor(production, name) {
1372
+ super(production, name);
1373
+ this.production = production;
1374
+ this.sourceLanguage = ELanguage.EN;
1131
1375
  }
1132
1376
  /**
1133
- * Creates a route with parent ID, sub-item ID, item ID, and formatted title.
1134
- * @param route - The base route
1135
- * @param parentID - The parent item ID
1136
- * @param subID - The sub-item ID
1137
- * @param id - The item ID
1138
- * @param title - Optional title to format and append
1139
- * @returns The formatted route string
1377
+ * Gets the target language for translations
1378
+ * @returns The target language code
1140
1379
  */
1141
- routePidSidIdTitlePipe(route, parentID, subID, id, title) {
1142
- return (route +
1143
- '/' +
1144
- parentID +
1145
- '/' +
1146
- subID +
1147
- '/' +
1148
- id +
1149
- '/' +
1150
- this.routeNamer(title));
1380
+ get targetLanguage() {
1381
+ return this._targetLanguage;
1151
1382
  }
1152
1383
  /**
1153
- * Formats a title for use in a URL.
1154
- * Trims, removes special characters, converts to lowercase, and replaces spaces with hyphens.
1155
- * @param title - The title to format
1156
- * @returns The URL-friendly formatted title or empty string if no title provided
1384
+ * Sets the target language for translations
1385
+ * @param value The new target language code
1157
1386
  */
1158
- routeNamer(title) {
1159
- return title
1160
- ? title
1161
- .substr(0, 30)
1162
- .unChar('/')
1163
- .trim()
1164
- .toLowerCase()
1165
- .split(' ')
1166
- .filter((x) => x)
1167
- .join('-')
1168
- : '';
1387
+ set targetLanguage(value) {
1388
+ this._targetLanguage = value;
1169
1389
  }
1170
1390
  }
1391
+
1392
+ // This file can be replaced during build by using the `fileReplacements` array.
1393
+ // `ng build` replaces `environment.ts` with `environment.prod.ts`.
1394
+ // The list of file replacements can be found in `angular.json`.
1171
1395
  /**
1172
- * Specialized route for creation operations with different entity types.
1396
+ * Environment configuration for the application.
1397
+ *
1398
+ * This constant defines the environment settings for the development environment.
1399
+ * It creates a new Environment instance with parameters:
1400
+ * @param {boolean} false - Indicates this is not a production environment
1401
+ * @param {string} 'Development' - The name of the current environment
1173
1402
  */
1174
- class CreateRoute extends RouteItem {
1175
- constructor() {
1176
- super(...arguments);
1177
- /** Route for corporate entity creation */
1178
- this.corporate = new RouteItem('corporate', this.pub);
1179
- /** Route for group entity creation */
1180
- this.group = new RouteItem('group', this.pub);
1181
- /** Route for individual entity creation */
1182
- this.individual = new RouteItem('individual', this.pub);
1183
- /** Route for provider entity creation with sub-routes */
1184
- this.provider = new CreateProviderRoute('provider', this.pub);
1185
- }
1186
- }
1187
- /**
1188
- * Specialized route for provider creation operations.
1403
+ const environment = new Environment(false, 'Development');
1404
+ /*
1405
+ * For easier debugging in development mode, you can import the following file
1406
+ * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
1407
+ *
1408
+ * This import should be commented out in production mode because it will have a negative impact
1409
+ * on performance if an error is thrown.
1189
1410
  */
1190
- class CreateProviderRoute extends RouteItem {
1191
- constructor() {
1192
- super(...arguments);
1193
- /** Index route for provider creation */
1194
- this.index = new RouteItem('index', this.pub);
1195
- }
1196
- }
1411
+
1197
1412
  /**
1198
- * Specialized route for find/search operations.
1413
+ * Class implementation of menu items with additional functionality
1414
+ * @template TESystemType - The system type, defaults to ESystem
1415
+ * @template TESubSystem - The subsystem type, defaults to ESubSystem
1416
+ * @template TEMenuLocation - The menu location type, defaults to EMenuLocation
1199
1417
  */
1200
- class FindRoute extends RouteItem {
1201
- constructor() {
1202
- super(...arguments);
1203
- /** Route for search results list */
1204
- this.searchList = new RouteItem('search-list', this.pub);
1205
- }
1206
- }
1207
-
1208
- var EVFunctions;
1209
- (function (EVFunctions) {
1210
- /**
1211
- * Removes 'null' strings from text
1212
- * @param text - The string to process
1213
- * @returns The processed string with 'null' strings removed or the original text if null/undefined
1214
- */
1215
- function stripNull(text) {
1216
- return text
1217
- ? text == 'null'
1218
- ? null
1219
- : text.slice(-5) == ' null'
1220
- ? stripNull(text.slice(0, -5))
1221
- : text.slice(0, 5) == 'null '
1222
- ? stripNull(text.slice(5))
1223
- : text.replace(' null ', ' ')
1224
- : text;
1225
- }
1226
- EVFunctions.stripNull = stripNull;
1418
+ class ETSMenuItem {
1227
1419
  /**
1228
- * Creates route redirects for a given route
1229
- * @param route - The target route to redirect to
1230
- * @param redirects - Array of redirect configurations
1231
- * @returns An array of routes including the redirects and the original route
1420
+ * Gets the edit access status
1421
+ * @returns Current edit access status
1232
1422
  */
1233
- function routeRedirects(route, redirects) {
1234
- return [...redirects.map((r) => ({ ...r, redirectTo: route.path })), route];
1423
+ get _editAccess() {
1424
+ console.log(this.editAccess);
1425
+ return this.editAccess;
1235
1426
  }
1236
- EVFunctions.routeRedirects = routeRedirects;
1237
1427
  /**
1238
- * @deprecated Please use extendRoute2 instead
1239
- * @param route
1240
- * @param indexComponent
1241
- * @param indexLazyModule
1242
- * @example
1243
- * ```ts
1244
- * EVFunctions.extendRoute(
1245
- * {
1246
- * path: '',
1247
- * data: { title: 'CRM / Setups / Segment' },
1248
- * loadChildren: () => import('./create-segment/create-segment.module')
1249
- * .then((m) => m.CreateSegmentModule),
1250
- * },
1251
- * null,
1252
- * () => import('./segments-index/segments-index.module')
1253
- * .then((m) => m.SegmentsIndexModule));
1254
- * ```
1255
- * @returns
1428
+ * Sets the edit access status and propagates to submenu items
1429
+ * @param value - New edit access status
1256
1430
  */
1257
- function extendRoute(route, indexComponent, indexLazyModule) {
1258
- const routes = [
1259
- {
1260
- path: '',
1261
- data: {
1262
- ...route.data,
1263
- title: route.data?.title,
1264
- type: EPageType.indexPage,
1265
- },
1266
- component: indexComponent,
1267
- loadChildren: indexLazyModule,
1268
- },
1269
- {
1270
- path: 'index',
1271
- data: {
1272
- ...route.data,
1273
- title: route.data?.title,
1274
- type: EPageType.indexPage,
1275
- },
1276
- component: indexComponent,
1277
- loadChildren: indexLazyModule,
1278
- },
1279
- {
1280
- path: 'clone',
1281
- data: {
1282
- ...route.data,
1283
- title: pageTitler(route.data?.title, 'Clone'),
1284
- type: EPageType.clonePage,
1285
- },
1286
- component: route.component,
1287
- loadChildren: route.loadChildren,
1288
- },
1289
- {
1290
- path: 'create',
1291
- data: {
1292
- ...route.data,
1293
- title: pageTitler(route.data?.title, 'Create'),
1294
- type: EPageType.createPage,
1295
- },
1296
- component: route.component,
1297
- loadChildren: route.loadChildren,
1298
- },
1299
- {
1300
- path: 'edit',
1301
- data: {
1302
- ...route.data,
1303
- title: pageTitler(route.data?.title, 'Edit'),
1304
- type: EPageType.editPage,
1305
- },
1306
- component: route.component,
1307
- loadChildren: route.loadChildren,
1308
- },
1309
- {
1310
- path: 'show',
1311
- data: {
1312
- ...route.data,
1313
- title: pageTitler(route.data?.title, 'Show'),
1314
- type: EPageType.showPage,
1315
- },
1316
- component: route.component,
1317
- loadChildren: route.loadChildren,
1318
- },
1319
- ];
1320
- if (!indexComponent && !indexLazyModule) {
1321
- routes.splice(0, 2);
1322
- }
1323
- return routes;
1431
+ set _editAccess(value) {
1432
+ this.editAccess = value;
1433
+ this.toggleEditAllSubMenus();
1324
1434
  }
1325
- EVFunctions.extendRoute = extendRoute;
1326
1435
  /**
1327
- *
1328
- * @param route
1329
- * @param indexPage
1330
- * @example
1331
- * ```ts
1332
- * EVFunctions.extendRoute2(
1333
- {
1334
- path: '',
1335
- data: { title: ' Process Actions' },
1336
- loadComponent: () =>
1337
- import('./create-process-actions/create-process-actions.component').then(
1338
- (c) => c.CreateProcessActionsComponent
1339
- ),
1340
- },
1341
- { component: IndexProcessActionsComponent }
1342
- )
1343
- * ```
1344
- * @returns
1436
+ * Gets the view access status
1437
+ * @returns Current view access status
1345
1438
  */
1346
- function extendRoute2(route, indexPage) {
1347
- const routes = [
1348
- {
1349
- ...route,
1350
- path: 'clone',
1351
- data: {
1352
- ...route.data,
1353
- title: pageTitler(route.data?.title, 'Clone'),
1354
- type: EPageType.clonePage,
1355
- },
1356
- },
1357
- {
1358
- ...route,
1359
- path: 'create',
1360
- data: {
1361
- ...route.data,
1362
- title: pageTitler(route.data?.title, 'Create'),
1363
- type: EPageType.createPage,
1364
- },
1365
- },
1366
- {
1367
- ...route,
1368
- path: 'edit',
1369
- data: {
1370
- ...route.data,
1371
- title: pageTitler(route.data?.title, 'Edit'),
1372
- type: EPageType.editPage,
1373
- },
1374
- },
1375
- {
1376
- ...route,
1377
- path: 'show',
1378
- data: {
1379
- ...route.data,
1380
- title: pageTitler(route.data?.title, 'Show'),
1381
- type: EPageType.showPage,
1382
- },
1383
- },
1384
- ];
1385
- if (indexPage && Object.keys(indexPage).length > 0) {
1386
- const indexRoute = {
1387
- ...indexPage,
1388
- data: {
1389
- ...route.data,
1390
- title: indexPage?.hideTitle ? undefined : indexPage?.title || route.data?.title,
1391
- type: EPageType.indexPage,
1392
- ...indexPage.data,
1393
- },
1394
- loadChildren: indexPage?.loadChildren ?? indexPage?.lazyModule,
1395
- loadComponent: indexPage?.loadComponent ?? indexPage?.lazyComponent,
1396
- };
1397
- routes.splice(0, 0, indexPage?.redirectToIndex
1398
- ? { path: '', redirectTo: 'index', pathMatch: 'full' }
1399
- : {
1400
- path: '',
1401
- ...indexRoute,
1402
- }, {
1403
- ...indexRoute,
1404
- path: 'index',
1405
- });
1406
- }
1407
- return routes;
1408
- }
1409
- EVFunctions.extendRoute2 = extendRoute2;
1410
- function createModule(path, route, indexPage) {
1411
- return { path, children: extendRoute2(route, indexPage) };
1439
+ get _viewAccess() {
1440
+ return this.viewAccess;
1412
1441
  }
1413
- EVFunctions.createModule = createModule;
1414
1442
  /**
1415
- * Concatenates two strings and accounts for null values
1416
- * @param text1 First string to concatenate
1417
- * @param text2 Second string to concatenate
1418
- * @param joinerText String to place in between the two texts
1419
- * @returns
1443
+ * Sets the view access status and propagates to submenu items
1444
+ * @param value - New view access status
1420
1445
  */
1421
- function strConcatenator(text1, text2, joinerText = ' - ') {
1422
- return { value: text1, label: strConcatenator2(text1, text2, joinerText) };
1446
+ set _viewAccess(value) {
1447
+ this.viewAccess = value;
1448
+ this.toggleViewAllSubMenus();
1423
1449
  }
1424
- EVFunctions.strConcatenator = strConcatenator;
1425
- function strConcatenator2(param1, param2, joinerText = ' - ') {
1426
- if (Array.isArray(param1)) {
1427
- const jt = param2 != null ? param2 : ' - ';
1428
- return param1
1429
- .map((x) => x?.toString()?.trim())
1430
- .filter((x) => x != null)
1431
- .join(jt);
1432
- }
1433
- else {
1434
- param1 = param1?.toString()?.trim();
1435
- param2 = param2?.toString()?.trim();
1436
- if (param1 != null && param2 != null)
1437
- return param1 + joinerText + param2;
1438
- else
1439
- return param1 || param2;
1440
- }
1450
+ /**
1451
+ * Creates a new menu item
1452
+ * @param menuItem - Source menu item data
1453
+ * @param parent - Optional parent menu item
1454
+ */
1455
+ constructor(menuItem, parent) {
1456
+ Object.assign(this, menuItem);
1457
+ this.labelLowerCase = menuItem?.label?.toLowerCase();
1458
+ this.hasSub = !!menuItem?.subs?.length;
1459
+ this.isP = true;
1460
+ this.parentID = parent?.id;
1461
+ // debugger
1462
+ this.system = this.system || parent?.system;
1463
+ this.subSystem = this.subSystem || parent?.subSystem;
1464
+ this.subs = menuItem?.subs
1465
+ ?.filter((x) => !environment.excludedMenus || !environment.excludedMenus.has(x.id))
1466
+ ?.map((m) => new ETSMenuItem(m, this));
1441
1467
  }
1442
- EVFunctions.strConcatenator2 = strConcatenator2;
1443
1468
  /**
1444
- * Generates a RFC4122 version 4 compliant UUID
1445
- * @returns A randomly generated UUID string
1469
+ * Toggles the disabled state of the menu item
1446
1470
  */
1447
- EVFunctions.generateUUID = () => {
1448
- let d = new Date().getTime();
1449
- let d2 = (typeof performance !== 'undefined' && performance.now && performance.now() * 1000) || 0; //Time in microseconds since page-load or 0 if unsupported
1450
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
1451
- let r = Math.random() * 16; //random number between 0 and 16
1452
- if (d > 0) {
1453
- //Use timestamp until depleted
1454
- r = (d + r) % 16 | 0;
1455
- d = Math.floor(d / 16);
1456
- }
1457
- else {
1458
- //Use microseconds since page-load if supported
1459
- r = (d2 + r) % 16 | 0;
1460
- d2 = Math.floor(d2 / 16);
1461
- }
1462
- return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
1463
- });
1464
- };
1471
+ toggle() {
1472
+ this.disabled = !this.disabled;
1473
+ }
1465
1474
  /**
1466
- * Formats a page title with an infix
1467
- * @param title - The original title, typically in a path format with slashes
1468
- * @param infix - The text to insert before the last segment of the title
1469
- * @returns The formatted title string
1475
+ * Toggles view access for this menu item
1470
1476
  */
1471
- function pageTitler(title, infix) {
1472
- if (!title)
1473
- return '';
1474
- if (!infix)
1475
- return title;
1476
- const split = title.split('/'), lastSplit = split.pop(), prefix = split.join('/');
1477
- return (prefix ? prefix + ' / ' : ' ') + infix + ' ' + lastSplit;
1477
+ toggleView() {
1478
+ this.viewAccess = !this.viewAccess;
1479
+ if (this.editAccess)
1480
+ this.viewAccess = true;
1478
1481
  }
1479
1482
  /**
1480
- * Creates a redirect route for user management
1481
- * @param route - The original route to modify
1482
- * @param prefix - The prefix to add to the route path
1483
- * @returns An array of routes including the redirect and the modified route
1483
+ * Toggles edit/create access for this menu item
1484
1484
  */
1485
- function redirectRouteForUM(route, prefix) {
1486
- const oPath = route?.path + '', nPath = prefix + oPath;
1487
- route.path = nPath;
1488
- const routes = [
1489
- {
1490
- path: oPath,
1491
- redirectTo: nPath,
1492
- },
1493
- route,
1494
- ];
1495
- return routes;
1485
+ toggleCreate() {
1486
+ this.editAccess = !this.editAccess;
1487
+ if (this.editAccess)
1488
+ this.viewAccess = true;
1496
1489
  }
1497
- EVFunctions.redirectRouteForUM = redirectRouteForUM;
1498
1490
  /**
1499
- * Type casting utility function that returns the input value with its type preserved
1500
- * @param value - The value to cast
1501
- * @returns The same value with its type information preserved
1502
- * @typeParam T - The type of the value
1491
+ * Grants edit access to this menu item and all its submenu items
1503
1492
  */
1504
- function typeCaster(value) {
1505
- return value;
1493
+ allowEditAllSubMenus() {
1494
+ this.subs?.forEach((x) => x?.allowEditAllSubMenus());
1495
+ //debugger;
1496
+ this.viewAccess = true;
1497
+ this.editAccess = true;
1506
1498
  }
1507
- EVFunctions.typeCaster = typeCaster;
1508
- })(EVFunctions || (EVFunctions = {}));
1509
-
1510
- //#region string */
1511
- /**
1512
- * Removes the specified character from the string
1513
- * @param character Character to remove (defaults to '/')
1514
- * @returns String with the character removed
1515
- */
1516
- String.prototype.stripChar = function (character = '/') {
1517
- return (this + '').replace(character, '');
1518
- };
1519
- /**
1520
- * Removes the specified character from the end of the string if present
1521
- * @param character Character to remove from the end (defaults to '/')
1522
- * @returns String with the character removed from the end if it was present
1523
- */
1524
- String.prototype.lastStripChar = function (character = '/') {
1525
- return this[this?.length - 1] == character ? this.slice(0, this.length - 1) : this;
1526
- };
1527
- String.prototype.removeNull = function () {
1528
- return EVFunctions.stripNull(this);
1529
- };
1530
- /**
1531
- * Removes all instances of a character from a string
1532
- * @param character Character to remove (defaults to '/')
1533
- * @param replacement String to replace with (defaults to '')
1534
- * @returns String with all instances of the character removed or replaced
1535
- */
1536
- String.prototype.unChar = function (character = '/', replacement = '') {
1537
- let te = '';
1538
- for (let i = 0; i < this.length; i++) {
1539
- const e = this[i];
1540
- te += e != character ? e : '';
1499
+ /**
1500
+ * Removes edit access from this menu item and all its submenu items
1501
+ */
1502
+ disableEditAllSubMenus() {
1503
+ this.subs?.forEach((x) => x?.disableEditAllSubMenus());
1504
+ this.editAccess = false;
1541
1505
  }
1542
- return te.split(character).join(replacement);
1543
- };
1544
- String.prototype.toSentenceCase = function () {
1545
- return this.replace(/([A-Z])/g, ' $1');
1546
- };
1547
- String.prototype.replaceAllSubStr = function (character = '/', replacement = '') {
1548
- return this.split(character).join(replacement);
1549
- };
1550
- String.prototype.addPrecedingChar = function (character, expectedLength) {
1551
- if (this.length >= expectedLength)
1552
- return this;
1553
- return character.repeat(expectedLength - this.length) + this;
1554
- };
1555
- //#endregion
1556
- //#region array */
1557
- /**
1558
- * Concatenates all elements of the array into a single string
1559
- * @returns Combined string of all array elements
1560
- */
1561
- Array.prototype.merge = function () {
1562
- let r = '';
1563
- for (const i of this) {
1564
- r += i;
1506
+ /**
1507
+ * Grants view access to this menu item and all its submenu items
1508
+ */
1509
+ allowViewAllSubMenus() {
1510
+ this.subs?.forEach((x) => x?.allowViewAllSubMenus());
1511
+ //debugger;
1512
+ this.viewAccess = true;
1513
+ this.editAccess = false;
1565
1514
  }
1566
- return r;
1567
- };
1568
- Array.prototype.reverseIndex = function (index = 0) {
1569
- return this[this?.length - (1 + index)];
1570
- };
1571
- /**
1572
- * Returns the last item in the array
1573
- * @returns The last element in the array
1574
- */
1575
- Array.prototype.lastItem = function () {
1576
- return this.reverseIndex();
1577
- };
1578
- Array.prototype.sortByFieldLength = function (field, reverse = false) {
1579
- if (reverse) {
1580
- return this.filter((x) => x != null).sort((b, a) => (a[field]?.length || 0) - (b[field]?.length || 0));
1515
+ /**
1516
+ * Removes view access from this menu item and all its submenu items
1517
+ */
1518
+ disableViewAllSubMenus() {
1519
+ this.subs?.forEach((x) => x?.disableViewAllSubMenus());
1520
+ this.viewAccess = false;
1521
+ this.editAccess = false;
1581
1522
  }
1582
- else {
1583
- return this.filter((x) => x != null).sort((a, b) => (a[field]?.length || 0) - (b[field]?.length || 0));
1523
+ /**
1524
+ * Toggles edit access for this menu item and all its submenu items
1525
+ */
1526
+ toggleEditAllSubMenus() {
1527
+ // if (this.editAccess == undefined) return;
1528
+ !this.editAccess ? this.allowEditAllSubMenus() : this.disableEditAllSubMenus();
1529
+ console.log(this.subs);
1584
1530
  }
1585
- };
1586
- Array.prototype.sort2 = function (field, isString = false, reverse = false) {
1587
- if (reverse)
1588
- return isString
1589
- ? this.filter((x) => x != null).sort((b, a) => sortAlphaNum(a[field]?.toString(), b[field]?.toString()))
1590
- : this.filter((x) => x != null).sort((b, a) => (a[field] || 0) - (b[field] || 0));
1591
- else
1592
- return isString
1593
- ? this.filter((x) => x != null).sort((a, b) => sortAlphaNum(a[field]?.toString(), b[field]?.toString()))
1594
- : this.filter((x) => x != null).sort((a, b) => (a[field] || 0) - (b[field] || 0));
1595
- };
1596
- Array.prototype.sort3 = function (field, reverse = false) {
1597
- let isString = this.some((x) => isNaN(x[field]));
1598
- return isString ? this.sort2(field, true, reverse) : this.sort2(field, false, reverse);
1599
- };
1600
- const reA = /[^a-zA-Z]/g;
1601
- const reN = /[^0-9]/g;
1602
- /**
1603
- * Sorts an array by comparing alphanumeric strings
1604
- * @param a First string to compare
1605
- * @param b Second string to compare
1606
- * @returns Comparison result (-1, 0, or 1)
1607
- */
1608
- function sortAlphaNum(a, b) {
1609
- var aA = a?.toUpperCase()?.replace(reA, '');
1610
- var bA = b?.toUpperCase()?.replace(reA, '');
1611
- if (aA === bA) {
1612
- var aN = parseInt(a?.replace(reN, ''), 10);
1613
- var bN = parseInt(b?.replace(reN, ''), 10);
1614
- return aN === bN ? 0 : aN > bN ? 1 : -1;
1531
+ /**
1532
+ * Toggles view access for this menu item and all its submenu items
1533
+ */
1534
+ toggleViewAllSubMenus() {
1535
+ // if (this.viewAccess == undefined) return;
1536
+ // debugger
1537
+ !this.viewAccess ? this.allowViewAllSubMenus() : this.disableViewAllSubMenus();
1538
+ console.log(this.subs);
1615
1539
  }
1616
- else {
1617
- return aA > bA ? 1 : -1;
1540
+ /**
1541
+ * Grants both view and edit access to this menu item
1542
+ */
1543
+ allowAuthorization() {
1544
+ this.viewAccess = true;
1545
+ this.editAccess = true;
1618
1546
  }
1619
- }
1620
- Array.prototype.removeEmptyItems = function (expectedFields, config) {
1621
- // debugger;
1622
- const ignoreBooleanFields = config?.ignoreBooleanFields == true;
1623
- const fieldsType = config?.fieldsType || 'included';
1624
- if (!this.length)
1625
- return this;
1626
- let fieldList;
1627
- if (fieldsType == 'included')
1628
- fieldList = expectedFields?.length ? expectedFields : Object.keys(this[0]);
1629
- else if (fieldsType == 'excluded')
1630
- fieldList = expectedFields?.length
1631
- ? Object.keys(this[0]).filter((x) => !expectedFields.includes(x))
1632
- : Object.keys(this[0]);
1633
- const removedItems = [];
1634
- if (fieldList)
1635
- for (let i = 0; i < this.length; i++) {
1636
- if (ignoreBooleanFields && i == 0)
1637
- fieldList = fieldList.filter((f) => typeof this[0][f] != 'boolean');
1638
- const item = this[i];
1639
- if (fieldList.some((f) => item[f] != null))
1640
- continue; //Don't remove row
1641
- removedItems.push(...this.splice(i, 1)); //Remove row
1642
- i = i--;
1643
- }
1644
- return removedItems;
1645
- };
1646
- Array.prototype.toMap = function (arg1, valueMap) {
1647
- // debugger;
1648
- const ret = {};
1649
- if (typeof arg1 == 'function')
1650
- for (const item of this)
1651
- ret[arg1(item)] = item;
1652
- else if (valueMap)
1653
- for (const item of this)
1654
- ret[item[arg1?.toString()]] = valueMap(item);
1655
- else
1656
- for (const item of this)
1657
- ret[item[arg1?.toString()]] = item;
1658
- return ret;
1659
- };
1660
- Array.prototype.groupBy = function (keyField, keyMap) {
1661
- // debugger;
1662
- const ret = {};
1663
- for (const iterator of this) {
1664
- const group = keyMap ? keyMap(iterator) : iterator[keyField];
1665
- if (ret[group])
1666
- ret[group].push(iterator);
1667
- else
1668
- ret[group] = [iterator];
1547
+ /**
1548
+ * Removes both view and edit access from this menu item
1549
+ */
1550
+ disableAuthorization() {
1551
+ this.viewAccess = false;
1552
+ this.viewAccess = false;
1553
+ }
1554
+ /**
1555
+ * Toggles both view and edit access for this menu item
1556
+ */
1557
+ toggleAuthorization() {
1558
+ this.viewAccess = !this.viewAccess;
1559
+ this.editAccess = !this.editAccess;
1669
1560
  }
1670
- return ret;
1671
- };
1561
+ }
1672
1562
  /**
1673
- * Creates a map where each array element becomes a key with value true
1674
- * @returns Object with array elements as keys and boolean true as values
1563
+ * Special menu item class that represents a divider
1675
1564
  */
1676
- Array.prototype.toBooleanMap = function () {
1677
- // debugger;
1678
- const ret = {};
1679
- for (const iterator of this) {
1680
- ret[iterator] = true;
1565
+ class ETSMenuItemDivider extends ETSMenuItem {
1566
+ /**
1567
+ * Creates a new divider menu item
1568
+ */
1569
+ constructor() {
1570
+ super(null);
1571
+ this.isDivider = true;
1681
1572
  }
1682
- return ret;
1683
- };
1573
+ }
1684
1574
  /**
1685
- * Randomly shuffles the elements of the array
1686
- * @returns A new array with the elements in random order
1575
+ * Enum for page button IDs
1687
1576
  */
1688
- Array.prototype.shuffle = function () {
1689
- // debugger;
1690
- const newArr = [];
1691
- while (this.length) {
1692
- newArr.push(...this.splice(Math.floor(Math.random() * this.length - 1), 1));
1577
+ var EETSPageBtnID;
1578
+ (function (EETSPageBtnID) {
1579
+ EETSPageBtnID["agentCommissions"] = "PAC8";
1580
+ EETSPageBtnID["agentCreditNotes"] = "PACN10";
1581
+ EETSPageBtnID["agentDocuments"] = "PAD2";
1582
+ EETSPageBtnID["agentEndorsements"] = "PAE3";
1583
+ EETSPageBtnID["agentLoan"] = "PAL1";
1584
+ EETSPageBtnID["agentNotes"] = "PAN6";
1585
+ EETSPageBtnID["agentPendingQuotes"] = "PAPQ11";
1586
+ EETSPageBtnID["agentPolicies"] = "PAP7";
1587
+ EETSPageBtnID["agentProduction"] = "PAP9";
1588
+ EETSPageBtnID["agentWebLogIn"] = "PAWL4";
1589
+ EETSPageBtnID["agentWorkflows"] = "PAW5";
1590
+ EETSPageBtnID["agentCalendar"] = "PAC6";
1591
+ EETSPageBtnID["agentFutureActions"] = "PAFA23";
1592
+ EETSPageBtnID["clientCalendar"] = "PCC11";
1593
+ EETSPageBtnID["clientDocuments"] = "PCD12";
1594
+ EETSPageBtnID["clientEndorsements"] = "PCE13";
1595
+ EETSPageBtnID["clientNotes"] = "PCN14";
1596
+ EETSPageBtnID["clientOtherBusiness"] = "PCOB15";
1597
+ EETSPageBtnID["clientPendingPayments"] = "PCPP16";
1598
+ EETSPageBtnID["clientPendingQuotes"] = "PCPQ17";
1599
+ EETSPageBtnID["clientPolicies"] = "PCP18";
1600
+ EETSPageBtnID["clientRelationships"] = "PCR19";
1601
+ EETSPageBtnID["clientUnderwritingEvents"] = "PCUE20";
1602
+ EETSPageBtnID["clientWebLogIn"] = "PCWL21";
1603
+ EETSPageBtnID["clientWorkflows"] = "PCW22";
1604
+ EETSPageBtnID["clientFutureActions"] = "PCFA23";
1605
+ })(EETSPageBtnID || (EETSPageBtnID = {}));
1606
+
1607
+ // import '../prototypes/prototypes';
1608
+ /**
1609
+ * Represents a basic route item with path generation capabilities.
1610
+ * Handles route path construction with optional parameters.
1611
+ */
1612
+ class RouteItem {
1613
+ /**
1614
+ * Creates a new RouteItem instance.
1615
+ * @param base - The base route segment
1616
+ * @param parentPub - The parent public path (defaults to empty string)
1617
+ * @param params - Optional route parameters to append
1618
+ */
1619
+ constructor(base, parentPub = '', ...params) {
1620
+ // console.log(params);
1621
+ this._ = base + (params?.length ? '/:' + params.join('/:') : '');
1622
+ this.__ = base;
1623
+ this.pub = parentPub + '/' + base;
1693
1624
  }
1694
- return newArr;
1695
- };
1696
- //#endregion
1697
- //#region Function
1625
+ }
1698
1626
  /**
1699
- * Creates a clone of the function
1700
- * @returns A new function that behaves the same as the original
1627
+ * Extended route class that provides common application routes and utility methods.
1628
+ * Creates a standard set of routes for CRUD operations and navigation.
1701
1629
  */
1702
- Function.prototype.clone = function () {
1703
- var that = this;
1704
- var temp = function temporary() {
1705
- return that.apply(this, arguments);
1706
- };
1707
- for (var key in this) {
1708
- if (this.hasOwnProperty(key)) {
1709
- temp[key] = this[key];
1710
- }
1630
+ class AppRouteBase extends RouteItem {
1631
+ /**
1632
+ * Creates a new AppRouteBase with standard child routes.
1633
+ * @param base - The base route segment
1634
+ * @param parentPub - The parent public path (defaults to empty string)
1635
+ * @param params - Optional route parameters to append
1636
+ */
1637
+ constructor(base, parentPub = '', ...params) {
1638
+ super(base, parentPub, ...params);
1639
+ this.all = new RouteItem('all', this.pub);
1640
+ this.clone = new RouteItem('clone', this.pub, 'id');
1641
+ this.create = new CreateRoute('create', this.pub);
1642
+ this.edit = new RouteItem('edit', this.pub, 'id');
1643
+ this.find = new FindRoute('find', this.pub);
1644
+ this.index = new RouteItem('index', this.pub);
1645
+ this.overview = new RouteItem('overview', this.pub);
1646
+ this.show = new RouteItem('show', this.pub, 'id');
1647
+ this.start = new RouteItem('start', this.pub);
1711
1648
  }
1712
- return temp;
1713
- };
1714
- //#endregion
1715
- //#region FORMARRAY
1649
+ //#region funcs
1650
+ /**
1651
+ * Combines a route with a parent ID.
1652
+ * @param route - The base route
1653
+ * @param prtID - The parent ID to append
1654
+ * @returns The combined route string or null if route is falsy
1655
+ */
1656
+ routeIdPipe(route, prtID) {
1657
+ return route ? route + '/' + prtID : null;
1658
+ }
1659
+ /**
1660
+ * Creates a route with ID and formatted title.
1661
+ * @param route - The base route
1662
+ * @param id - The item ID
1663
+ * @param title - Optional title to format and append
1664
+ * @returns The formatted route string
1665
+ */
1666
+ routeIdTitlePipe(route, id, title) {
1667
+ return route + '/' + id + '/' + this.routeNamer(title);
1668
+ }
1669
+ /**
1670
+ * Creates a route with parent ID, item ID, and formatted title.
1671
+ * @param route - The base route
1672
+ * @param parentID - The parent item ID
1673
+ * @param id - The item ID
1674
+ * @param title - Optional title to format and append
1675
+ * @returns The formatted route string
1676
+ */
1677
+ routePIdIdTitlePipe(route, parentID, id, title) {
1678
+ return route + '/' + parentID + '/' + id + '/' + this.routeNamer(title);
1679
+ }
1680
+ /**
1681
+ * Creates a route with parent ID, sub-item ID, item ID, and formatted title.
1682
+ * @param route - The base route
1683
+ * @param parentID - The parent item ID
1684
+ * @param subID - The sub-item ID
1685
+ * @param id - The item ID
1686
+ * @param title - Optional title to format and append
1687
+ * @returns The formatted route string
1688
+ */
1689
+ routePidSidIdTitlePipe(route, parentID, subID, id, title) {
1690
+ return (route +
1691
+ '/' +
1692
+ parentID +
1693
+ '/' +
1694
+ subID +
1695
+ '/' +
1696
+ id +
1697
+ '/' +
1698
+ this.routeNamer(title));
1699
+ }
1700
+ /**
1701
+ * Formats a title for use in a URL.
1702
+ * Trims, removes special characters, converts to lowercase, and replaces spaces with hyphens.
1703
+ * @param title - The title to format
1704
+ * @returns The URL-friendly formatted title or empty string if no title provided
1705
+ */
1706
+ routeNamer(title) {
1707
+ return title
1708
+ ? title
1709
+ .substr(0, 30)
1710
+ .unChar('/')
1711
+ .trim()
1712
+ .toLowerCase()
1713
+ .split(' ')
1714
+ .filter((x) => x)
1715
+ .join('-')
1716
+ : '';
1717
+ }
1718
+ }
1716
1719
  /**
1717
- * Gets the formatted value of the FormGroup
1718
- * @returns An object containing the formatted values of all controls
1720
+ * Specialized route for creation operations with different entity types.
1719
1721
  */
1720
- FormGroup.prototype.getFormattedValue = function () {
1721
- const data = {};
1722
- if (!this.controls)
1723
- return this.formattedValue;
1724
- else
1725
- for (const controlName in this.controls) {
1726
- data[controlName] = (this.controls[controlName]).getFormattedValue();
1727
- }
1728
- return data;
1729
- };
1722
+ class CreateRoute extends RouteItem {
1723
+ constructor() {
1724
+ super(...arguments);
1725
+ /** Route for corporate entity creation */
1726
+ this.corporate = new RouteItem('corporate', this.pub);
1727
+ /** Route for group entity creation */
1728
+ this.group = new RouteItem('group', this.pub);
1729
+ /** Route for individual entity creation */
1730
+ this.individual = new RouteItem('individual', this.pub);
1731
+ /** Route for provider entity creation with sub-routes */
1732
+ this.provider = new CreateProviderRoute('provider', this.pub);
1733
+ }
1734
+ }
1730
1735
  /**
1731
- * Gets the formatted value of the FormArray
1732
- * @returns An array containing the formatted values of all controls
1736
+ * Specialized route for provider creation operations.
1733
1737
  */
1734
- FormArray.prototype.getFormattedValue = function () {
1735
- const data = [];
1736
- if (!this.controls)
1737
- return this.formattedValue;
1738
- else
1739
- for (const control of this.controls) {
1740
- data.push(control.getFormattedValue());
1741
- }
1742
- return data;
1743
- };
1738
+ class CreateProviderRoute extends RouteItem {
1739
+ constructor() {
1740
+ super(...arguments);
1741
+ /** Index route for provider creation */
1742
+ this.index = new RouteItem('index', this.pub);
1743
+ }
1744
+ }
1744
1745
  /**
1745
- * Gets the formatted value of the FormControl
1746
- * @returns The formatted value of the control
1746
+ * Specialized route for find/search operations.
1747
1747
  */
1748
- FormControl.prototype.getFormattedValue = function () {
1749
- return this.formattedValue;
1750
- };
1751
-
1752
- var prototypes = /*#__PURE__*/Object.freeze({
1753
- __proto__: null
1754
- });
1748
+ class FindRoute extends RouteItem {
1749
+ constructor() {
1750
+ super(...arguments);
1751
+ /** Route for search results list */
1752
+ this.searchList = new RouteItem('search-list', this.pub);
1753
+ }
1754
+ }
1755
1755
 
1756
1756
  /**
1757
1757
  * Configuration class containing application-wide constants and settings
@@ -1793,17 +1793,11 @@ class Config {
1793
1793
  /**
1794
1794
  * Map of months by lowercase short name
1795
1795
  */
1796
- static { this.ShortMonthsMap = Config.Months.map((x) => ({
1797
- ...x,
1798
- _short: x.short?.toLowerCase(),
1799
- })).toMap('_short'); }
1796
+ static { this.ShortMonthsMap = Object.fromEntries(Config.Months.map((x) => [x.short?.toLowerCase(), x])); }
1800
1797
  /**
1801
1798
  * Map of months by ISO string representation
1802
1799
  */
1803
- static { this.MonthsIsoStrMap = Config.Months.map((x) => ({
1804
- ...x,
1805
- _short: x.short?.toLowerCase(),
1806
- })).toMap('isoStr'); }
1800
+ static { this.MonthsIsoStrMap = Object.fromEntries(Config.Months.map((x) => [x.isoStr, x])); }
1807
1801
  /**
1808
1802
  * List of days of the week with index values
1809
1803
  */
@@ -1862,6 +1856,8 @@ class Config {
1862
1856
  * @security This should be stored securely and not exposed in client-side code
1863
1857
  */
1864
1858
  static { this.secretKey = 'MIICXAIBAAfBgQDfmljld9rdhvakQApmLCDOgdwdwdwo2/iwdoiP0nNERInBheMh7J/r5aU8PUAssIpGXET/8'; }
1859
+ /** Collection of subscriptions to be closed when navigating between routes */
1860
+ static { this.subsToCloseOnRoute = []; }
1865
1861
  }
1866
1862
 
1867
1863
  /**
@@ -5713,7 +5709,7 @@ class BtnComponent {
5713
5709
  this._mclass.update((mclass) => _mclass || mclass);
5714
5710
  if (_icon)
5715
5711
  this._icon = _icon;
5716
- if (_type)
5712
+ if (_type != v)
5717
5713
  this._type = _type;
5718
5714
  }
5719
5715
  /**
@@ -10207,6 +10203,15 @@ class InputBase {
10207
10203
  this.labelField = model(...(ngDevMode ? [undefined, { debugName: "labelField" }] : []));
10208
10204
  /** Field to use for option hints */
10209
10205
  this.optionHintField = model(...(ngDevMode ? [undefined, { debugName: "optionHintField" }] : []));
10206
+ this.ctOptions = model(...(ngDevMode ? [undefined, { debugName: "ctOptions" }] : []));
10207
+ this.ctOptionsEffect = effect(() => {
10208
+ if (this.ctOptions())
10209
+ untracked(() => {
10210
+ this.rawOptionsSignal.set(this.ctOptions());
10211
+ this.valueField.set('code');
10212
+ this.labelType.set('ct');
10213
+ });
10214
+ }, ...(ngDevMode ? [{ debugName: "ctOptionsEffect" }] : []));
10210
10215
  /** Preset label type for options */
10211
10216
  this.labelType = model(...(ngDevMode ? [undefined, { debugName: "labelType" }] : []));
10212
10217
  /** Custom formatter function for options */
@@ -10478,7 +10483,7 @@ class InputBase {
10478
10483
  this.mchange.emit(value);
10479
10484
  }
10480
10485
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: InputBase, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10481
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.2", type: InputBase, isStandalone: true, selector: "ng-component", inputs: { cls: { classPropertyName: "cls", publicName: "cls", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, dontFormatAsInputSignal: { classPropertyName: "dontFormatAsInputSignal", publicName: "dontFormatAsInput", isSignal: true, isRequired: false, transformFunction: null }, duplicateCheckSignal: { classPropertyName: "duplicateCheckSignal", publicName: "duplicateCheck", isSignal: true, isRequired: false, transformFunction: null }, presetValue: { classPropertyName: "presetValue", publicName: "presetValue", isSignal: true, isRequired: false, transformFunction: null }, endLabelSignal: { classPropertyName: "endLabelSignal", publicName: "endLabel", isSignal: true, isRequired: false, transformFunction: null }, endLabelTooltipSignal: { classPropertyName: "endLabelTooltipSignal", publicName: "endLabelTooltip", isSignal: true, isRequired: false, transformFunction: null }, idSignal: { classPropertyName: "idSignal", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, inputContClassSignal: { classPropertyName: "inputContClassSignal", publicName: "inputContClass", isSignal: true, isRequired: false, transformFunction: null }, labelSignal: { classPropertyName: "labelSignal", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, lblCl: { classPropertyName: "lblCl", publicName: "lblCl", isSignal: true, isRequired: false, transformFunction: null }, light: { classPropertyName: "light", publicName: "light", isSignal: true, isRequired: false, transformFunction: null }, noFormat: { classPropertyName: "noFormat", publicName: "noFormat", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, readonlySignal: { classPropertyName: "readonlySignal", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, requiredSignal: { classPropertyName: "requiredSignal", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, showRequiredTagSignal: { classPropertyName: "showRequiredTagSignal", publicName: "showRequiredTag", isSignal: true, isRequired: false, transformFunction: null }, suffix: { classPropertyName: "suffix", publicName: "suffix", isSignal: true, isRequired: false, transformFunction: null }, textareaRowsSignal: { classPropertyName: "textareaRowsSignal", publicName: "textareaRows", isSignal: true, isRequired: false, transformFunction: null }, translatorOptions: { classPropertyName: "translatorOptions", publicName: "translatorOptions", isSignal: true, isRequired: false, transformFunction: null }, setFormattedValue: { classPropertyName: "setFormattedValue", publicName: "setFormattedValue", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, inlineHint: { classPropertyName: "inlineHint", publicName: "inlineHint", isSignal: true, isRequired: false, transformFunction: null }, autoPickValueField: { classPropertyName: "autoPickValueField", publicName: "autoPickValueField", isSignal: true, isRequired: false, transformFunction: null }, labelField: { classPropertyName: "labelField", publicName: "labelField", isSignal: true, isRequired: false, transformFunction: null }, optionHintField: { classPropertyName: "optionHintField", publicName: "optionHintField", isSignal: true, isRequired: false, transformFunction: null }, labelType: { classPropertyName: "labelType", publicName: "labelType", isSignal: true, isRequired: false, transformFunction: null }, optionFormatter: { classPropertyName: "optionFormatter", publicName: "optionFormatter", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, xsmall: { classPropertyName: "xsmall", publicName: "xsmall", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, _indeterminate: { classPropertyName: "_indeterminate", publicName: "indeterminate", isSignal: false, isRequired: false, transformFunction: null }, maxToday: { classPropertyName: "maxToday", publicName: "maxToday", isSignal: false, isRequired: false, transformFunction: null }, minToday: { classPropertyName: "minToday", publicName: "minToday", isSignal: false, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, prefixSignal: { classPropertyName: "prefixSignal", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, miniSignal: { classPropertyName: "miniSignal", publicName: "mini", isSignal: true, isRequired: false, transformFunction: null }, inpClSignal: { classPropertyName: "inpClSignal", publicName: "inpCl", isSignal: true, isRequired: false, transformFunction: null }, showEmptyOptionSignal: { classPropertyName: "showEmptyOptionSignal", publicName: "showEmptyOption", isSignal: true, isRequired: false, transformFunction: null }, showLabelSignal: { classPropertyName: "showLabelSignal", publicName: "showLabel", isSignal: true, isRequired: false, transformFunction: null }, showValidationSignal: { classPropertyName: "showValidationSignal", publicName: "showValidation", isSignal: true, isRequired: false, transformFunction: null }, showValidationIconSignal: { classPropertyName: "showValidationIconSignal", publicName: "showValidationIcon", isSignal: true, isRequired: false, transformFunction: null }, smallSignal: { classPropertyName: "smallSignal", publicName: "small", isSignal: true, isRequired: false, transformFunction: null }, showValidationMsgSignal: { classPropertyName: "showValidationMsgSignal", publicName: "showValidationMsg", isSignal: true, isRequired: false, transformFunction: null }, stackedSignal: { classPropertyName: "stackedSignal", publicName: "stacked", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null }, verbose: { classPropertyName: "verbose", publicName: "verbose", isSignal: true, isRequired: false, transformFunction: null }, timeType: { classPropertyName: "timeType", publicName: "timeType", isSignal: true, isRequired: false, transformFunction: null }, checkParentBeforeDisable: { classPropertyName: "checkParentBeforeDisable", publicName: "checkParentBeforeDisable", isSignal: true, isRequired: false, transformFunction: null }, clearOnDisable: { classPropertyName: "clearOnDisable", publicName: "clearOnDisable", isSignal: true, isRequired: false, transformFunction: null }, minLength: { classPropertyName: "minLength", publicName: "minLength", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, _disabled: { classPropertyName: "_disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, _type: { classPropertyName: "_type", publicName: "type", isSignal: false, isRequired: false, transformFunction: null }, maxSignal: { classPropertyName: "maxSignal", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, minSignal: { classPropertyName: "minSignal", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, coloredSignal: { classPropertyName: "coloredSignal", publicName: "colored", isSignal: true, isRequired: false, transformFunction: null }, checkedSignal: { classPropertyName: "checkedSignal", publicName: "checkedSignal", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { form: "formChange", labelField: "labelFieldChange", optionHintField: "optionHintFieldChange", labelType: "labelTypeChange", name: "nameChange", valueField: "valueFieldChange", prefixSignal: "prefixChange", miniSignal: "miniChange", inpClSignal: "inpClChange", showEmptyOptionSignal: "showEmptyOptionChange", showLabelSignal: "showLabelChange", showValidationSignal: "showValidationChange", showValidationIconSignal: "showValidationIconChange", smallSignal: "smallChange", showValidationMsgSignal: "showValidationMsgChange", checkParentBeforeDisable: "checkParentBeforeDisableChange", maxSignal: "maxChange", minSignal: "minChange", mchange: "mchange", mSelectOptionChange: "mSelectOptionChange" }, viewQueries: [{ propertyName: "dateInputRef", first: true, predicate: DateInputComponent, descendants: true, isSignal: true }], ngImport: i0, template: '', isInline: true }); }
10486
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.2", type: InputBase, isStandalone: true, selector: "ng-component", inputs: { cls: { classPropertyName: "cls", publicName: "cls", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, dontFormatAsInputSignal: { classPropertyName: "dontFormatAsInputSignal", publicName: "dontFormatAsInput", isSignal: true, isRequired: false, transformFunction: null }, duplicateCheckSignal: { classPropertyName: "duplicateCheckSignal", publicName: "duplicateCheck", isSignal: true, isRequired: false, transformFunction: null }, presetValue: { classPropertyName: "presetValue", publicName: "presetValue", isSignal: true, isRequired: false, transformFunction: null }, endLabelSignal: { classPropertyName: "endLabelSignal", publicName: "endLabel", isSignal: true, isRequired: false, transformFunction: null }, endLabelTooltipSignal: { classPropertyName: "endLabelTooltipSignal", publicName: "endLabelTooltip", isSignal: true, isRequired: false, transformFunction: null }, idSignal: { classPropertyName: "idSignal", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, inputContClassSignal: { classPropertyName: "inputContClassSignal", publicName: "inputContClass", isSignal: true, isRequired: false, transformFunction: null }, labelSignal: { classPropertyName: "labelSignal", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, lblCl: { classPropertyName: "lblCl", publicName: "lblCl", isSignal: true, isRequired: false, transformFunction: null }, light: { classPropertyName: "light", publicName: "light", isSignal: true, isRequired: false, transformFunction: null }, noFormat: { classPropertyName: "noFormat", publicName: "noFormat", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, readonlySignal: { classPropertyName: "readonlySignal", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, requiredSignal: { classPropertyName: "requiredSignal", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, showRequiredTagSignal: { classPropertyName: "showRequiredTagSignal", publicName: "showRequiredTag", isSignal: true, isRequired: false, transformFunction: null }, suffix: { classPropertyName: "suffix", publicName: "suffix", isSignal: true, isRequired: false, transformFunction: null }, textareaRowsSignal: { classPropertyName: "textareaRowsSignal", publicName: "textareaRows", isSignal: true, isRequired: false, transformFunction: null }, translatorOptions: { classPropertyName: "translatorOptions", publicName: "translatorOptions", isSignal: true, isRequired: false, transformFunction: null }, setFormattedValue: { classPropertyName: "setFormattedValue", publicName: "setFormattedValue", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, inlineHint: { classPropertyName: "inlineHint", publicName: "inlineHint", isSignal: true, isRequired: false, transformFunction: null }, autoPickValueField: { classPropertyName: "autoPickValueField", publicName: "autoPickValueField", isSignal: true, isRequired: false, transformFunction: null }, labelField: { classPropertyName: "labelField", publicName: "labelField", isSignal: true, isRequired: false, transformFunction: null }, optionHintField: { classPropertyName: "optionHintField", publicName: "optionHintField", isSignal: true, isRequired: false, transformFunction: null }, ctOptions: { classPropertyName: "ctOptions", publicName: "ctOptions", isSignal: true, isRequired: false, transformFunction: null }, labelType: { classPropertyName: "labelType", publicName: "labelType", isSignal: true, isRequired: false, transformFunction: null }, optionFormatter: { classPropertyName: "optionFormatter", publicName: "optionFormatter", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, xsmall: { classPropertyName: "xsmall", publicName: "xsmall", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, _indeterminate: { classPropertyName: "_indeterminate", publicName: "indeterminate", isSignal: false, isRequired: false, transformFunction: null }, maxToday: { classPropertyName: "maxToday", publicName: "maxToday", isSignal: false, isRequired: false, transformFunction: null }, minToday: { classPropertyName: "minToday", publicName: "minToday", isSignal: false, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, prefixSignal: { classPropertyName: "prefixSignal", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, miniSignal: { classPropertyName: "miniSignal", publicName: "mini", isSignal: true, isRequired: false, transformFunction: null }, inpClSignal: { classPropertyName: "inpClSignal", publicName: "inpCl", isSignal: true, isRequired: false, transformFunction: null }, showEmptyOptionSignal: { classPropertyName: "showEmptyOptionSignal", publicName: "showEmptyOption", isSignal: true, isRequired: false, transformFunction: null }, showLabelSignal: { classPropertyName: "showLabelSignal", publicName: "showLabel", isSignal: true, isRequired: false, transformFunction: null }, showValidationSignal: { classPropertyName: "showValidationSignal", publicName: "showValidation", isSignal: true, isRequired: false, transformFunction: null }, showValidationIconSignal: { classPropertyName: "showValidationIconSignal", publicName: "showValidationIcon", isSignal: true, isRequired: false, transformFunction: null }, smallSignal: { classPropertyName: "smallSignal", publicName: "small", isSignal: true, isRequired: false, transformFunction: null }, showValidationMsgSignal: { classPropertyName: "showValidationMsgSignal", publicName: "showValidationMsg", isSignal: true, isRequired: false, transformFunction: null }, stackedSignal: { classPropertyName: "stackedSignal", publicName: "stacked", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null }, verbose: { classPropertyName: "verbose", publicName: "verbose", isSignal: true, isRequired: false, transformFunction: null }, timeType: { classPropertyName: "timeType", publicName: "timeType", isSignal: true, isRequired: false, transformFunction: null }, checkParentBeforeDisable: { classPropertyName: "checkParentBeforeDisable", publicName: "checkParentBeforeDisable", isSignal: true, isRequired: false, transformFunction: null }, clearOnDisable: { classPropertyName: "clearOnDisable", publicName: "clearOnDisable", isSignal: true, isRequired: false, transformFunction: null }, minLength: { classPropertyName: "minLength", publicName: "minLength", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, _disabled: { classPropertyName: "_disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, _type: { classPropertyName: "_type", publicName: "type", isSignal: false, isRequired: false, transformFunction: null }, maxSignal: { classPropertyName: "maxSignal", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, minSignal: { classPropertyName: "minSignal", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, coloredSignal: { classPropertyName: "coloredSignal", publicName: "colored", isSignal: true, isRequired: false, transformFunction: null }, checkedSignal: { classPropertyName: "checkedSignal", publicName: "checkedSignal", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { form: "formChange", labelField: "labelFieldChange", optionHintField: "optionHintFieldChange", ctOptions: "ctOptionsChange", labelType: "labelTypeChange", name: "nameChange", valueField: "valueFieldChange", prefixSignal: "prefixChange", miniSignal: "miniChange", inpClSignal: "inpClChange", showEmptyOptionSignal: "showEmptyOptionChange", showLabelSignal: "showLabelChange", showValidationSignal: "showValidationChange", showValidationIconSignal: "showValidationIconChange", smallSignal: "smallChange", showValidationMsgSignal: "showValidationMsgChange", checkParentBeforeDisable: "checkParentBeforeDisableChange", maxSignal: "maxChange", minSignal: "minChange", mchange: "mchange", mSelectOptionChange: "mSelectOptionChange" }, viewQueries: [{ propertyName: "dateInputRef", first: true, predicate: DateInputComponent, descendants: true, isSignal: true }], ngImport: i0, template: '', isInline: true }); }
10482
10487
  }
10483
10488
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: InputBase, decorators: [{
10484
10489
  type: Component,
@@ -11048,7 +11053,7 @@ class AutocompleteComponent extends InputBasicComponent {
11048
11053
  */
11049
11054
  this.retriggerDisplayWith = effect(() => {
11050
11055
  this.optionsMap();
11051
- this.control().patchValue(this.control().value, { emitEvent: false });
11056
+ this.control()?.patchValue(this.control().value, { emitEvent: false });
11052
11057
  }, ...(ngDevMode ? [{ debugName: "retriggerDisplayWith" }] : []));
11053
11058
  /**
11054
11059
  * Function used by the autocomplete to display the selected value
@@ -19849,6 +19854,7 @@ class TableBaseComponent {
19849
19854
  this.rowOptionsMap = input(...(ngDevMode ? [undefined, { debugName: "rowOptionsMap" }] : []));
19850
19855
  /** Whether to center the content of table cells */
19851
19856
  this.centerCells = input(false, ...(ngDevMode ? [{ debugName: "centerCells" }] : []));
19857
+ this.enableRowClick = input(true, ...(ngDevMode ? [{ debugName: "enableRowClick" }] : []));
19852
19858
  /** Whether to apply rounded corners to the table */
19853
19859
  this.curvy = input(false, ...(ngDevMode ? [{ debugName: "curvy" }] : []));
19854
19860
  /** Whether to filter out duplicate rows */
@@ -19895,8 +19901,6 @@ class TableBaseComponent {
19895
19901
  this.showAdditionalColumns = input(false, ...(ngDevMode ? [{ debugName: "showAdditionalColumns" }] : []));
19896
19902
  /** Whether to show export functionality */
19897
19903
  this.showExport = input(false, ...(ngDevMode ? [{ debugName: "showExport" }] : []));
19898
- /** Whether to show pointer cursor on rows */
19899
- this.showRowPointer = input(false, ...(ngDevMode ? [{ debugName: "showRowPointer" }] : []));
19900
19904
  /** Whether to use smaller font sizes */
19901
19905
  this.smallerFonts = input(false, ...(ngDevMode ? [{ debugName: "smallerFonts" }] : []));
19902
19906
  /** Whether to apply striped styling to rows */
@@ -20185,7 +20189,7 @@ class TableBaseComponent {
20185
20189
  this.cdr.detectChanges();
20186
20190
  }
20187
20191
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: TableBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
20188
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.2", type: TableBaseComponent, isStandalone: true, selector: "ng-component", inputs: { _rowOptions: { classPropertyName: "_rowOptions", publicName: "rowOptions", isSignal: true, isRequired: false, transformFunction: null }, rowOptionsMap: { classPropertyName: "rowOptionsMap", publicName: "rowOptionsMap", isSignal: true, isRequired: false, transformFunction: null }, centerCells: { classPropertyName: "centerCells", publicName: "centerCells", isSignal: true, isRequired: false, transformFunction: null }, curvy: { classPropertyName: "curvy", publicName: "curvy", isSignal: true, isRequired: false, transformFunction: null }, distinct: { classPropertyName: "distinct", publicName: "distinct", isSignal: true, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, isExpandable: { classPropertyName: "isExpandable", publicName: "isExpandable", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, isDisabledFunc: { classPropertyName: "isDisabledFunc", publicName: "isDisabledFunc", isSignal: true, isRequired: false, transformFunction: null }, noItemTxt: { classPropertyName: "noItemTxt", publicName: "noItemTxt", isSignal: true, isRequired: false, transformFunction: null }, nowrap: { classPropertyName: "nowrap", publicName: "nowrap", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, orderDirection: { classPropertyName: "orderDirection", publicName: "orderDirection", isSignal: true, isRequired: false, transformFunction: null }, orderField: { classPropertyName: "orderField", publicName: "orderField", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, customTemplates: { classPropertyName: "customTemplates", publicName: "customTemplates", isSignal: true, isRequired: false, transformFunction: null }, startSectionTemplate: { classPropertyName: "startSectionTemplate", publicName: "startSectionTemplate", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, placeSelectionAtRight: { classPropertyName: "placeSelectionAtRight", publicName: "placeSelectionAtRight", isSignal: true, isRequired: false, transformFunction: null }, showAdditionalColumns: { classPropertyName: "showAdditionalColumns", publicName: "showAdditionalColumns", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, showRowPointer: { classPropertyName: "showRowPointer", publicName: "showRowPointer", isSignal: true, isRequired: false, transformFunction: null }, smallerFonts: { classPropertyName: "smallerFonts", publicName: "smallerFonts", isSignal: true, isRequired: false, transformFunction: null }, striped: { classPropertyName: "striped", publicName: "striped", isSignal: true, isRequired: false, transformFunction: null }, tableContainerClass: { classPropertyName: "tableContainerClass", publicName: "tableContainerClass", isSignal: true, isRequired: false, transformFunction: null }, useSelection: { classPropertyName: "useSelection", publicName: "useSelection", isSignal: true, isRequired: false, transformFunction: null }, formSchemaToColumns: { classPropertyName: "formSchemaToColumns", publicName: "formSchemaToColumns", isSignal: true, isRequired: false, transformFunction: null }, uploadSchemaToColumns: { classPropertyName: "uploadSchemaToColumns", publicName: "uploadSchemaToColumns", isSignal: true, isRequired: false, transformFunction: null }, _displayedColumns: { classPropertyName: "_displayedColumns", publicName: "displayedColumns", isSignal: true, isRequired: false, transformFunction: null }, useCustomLabels: { classPropertyName: "useCustomLabels", publicName: "useCustomLabels", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clickedExpandRow: "clickedExpandRow", _rowClick: "rowClick", emitCheckbox: "emitCheckbox", selectionChanged: "selectionChanged", useCustomLabels: "useCustomLabelsChange" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "table", first: true, predicate: ["table"], descendants: true }], ngImport: i0, template: '', isInline: true }); }
20192
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.2", type: TableBaseComponent, isStandalone: true, selector: "ng-component", inputs: { _rowOptions: { classPropertyName: "_rowOptions", publicName: "rowOptions", isSignal: true, isRequired: false, transformFunction: null }, rowOptionsMap: { classPropertyName: "rowOptionsMap", publicName: "rowOptionsMap", isSignal: true, isRequired: false, transformFunction: null }, centerCells: { classPropertyName: "centerCells", publicName: "centerCells", isSignal: true, isRequired: false, transformFunction: null }, enableRowClick: { classPropertyName: "enableRowClick", publicName: "enableRowClick", isSignal: true, isRequired: false, transformFunction: null }, curvy: { classPropertyName: "curvy", publicName: "curvy", isSignal: true, isRequired: false, transformFunction: null }, distinct: { classPropertyName: "distinct", publicName: "distinct", isSignal: true, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, isExpandable: { classPropertyName: "isExpandable", publicName: "isExpandable", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, isDisabledFunc: { classPropertyName: "isDisabledFunc", publicName: "isDisabledFunc", isSignal: true, isRequired: false, transformFunction: null }, noItemTxt: { classPropertyName: "noItemTxt", publicName: "noItemTxt", isSignal: true, isRequired: false, transformFunction: null }, nowrap: { classPropertyName: "nowrap", publicName: "nowrap", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, orderDirection: { classPropertyName: "orderDirection", publicName: "orderDirection", isSignal: true, isRequired: false, transformFunction: null }, orderField: { classPropertyName: "orderField", publicName: "orderField", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, customTemplates: { classPropertyName: "customTemplates", publicName: "customTemplates", isSignal: true, isRequired: false, transformFunction: null }, startSectionTemplate: { classPropertyName: "startSectionTemplate", publicName: "startSectionTemplate", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, placeSelectionAtRight: { classPropertyName: "placeSelectionAtRight", publicName: "placeSelectionAtRight", isSignal: true, isRequired: false, transformFunction: null }, showAdditionalColumns: { classPropertyName: "showAdditionalColumns", publicName: "showAdditionalColumns", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, smallerFonts: { classPropertyName: "smallerFonts", publicName: "smallerFonts", isSignal: true, isRequired: false, transformFunction: null }, striped: { classPropertyName: "striped", publicName: "striped", isSignal: true, isRequired: false, transformFunction: null }, tableContainerClass: { classPropertyName: "tableContainerClass", publicName: "tableContainerClass", isSignal: true, isRequired: false, transformFunction: null }, useSelection: { classPropertyName: "useSelection", publicName: "useSelection", isSignal: true, isRequired: false, transformFunction: null }, formSchemaToColumns: { classPropertyName: "formSchemaToColumns", publicName: "formSchemaToColumns", isSignal: true, isRequired: false, transformFunction: null }, uploadSchemaToColumns: { classPropertyName: "uploadSchemaToColumns", publicName: "uploadSchemaToColumns", isSignal: true, isRequired: false, transformFunction: null }, _displayedColumns: { classPropertyName: "_displayedColumns", publicName: "displayedColumns", isSignal: true, isRequired: false, transformFunction: null }, useCustomLabels: { classPropertyName: "useCustomLabels", publicName: "useCustomLabels", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clickedExpandRow: "clickedExpandRow", _rowClick: "rowClick", emitCheckbox: "emitCheckbox", selectionChanged: "selectionChanged", useCustomLabels: "useCustomLabelsChange" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "table", first: true, predicate: ["table"], descendants: true }], ngImport: i0, template: '', isInline: true }); }
20189
20193
  }
20190
20194
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: TableBaseComponent, decorators: [{
20191
20195
  type: Component,
@@ -20644,7 +20648,7 @@ class TableHttpsComponent extends TableBaseComponent {
20644
20648
  this.search();
20645
20649
  }
20646
20650
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: TableHttpsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
20647
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.2", type: TableHttpsComponent, isStandalone: true, selector: "table-https", inputs: { observableFunc: { classPropertyName: "observableFunc", publicName: "observableFunc", isSignal: true, isRequired: false, transformFunction: null }, pageNumber: { classPropertyName: "pageNumber", publicName: "pageNumber", isSignal: false, isRequired: false, transformFunction: null }, queryData: { classPropertyName: "queryData", publicName: "queryData", isSignal: true, isRequired: false, transformFunction: null }, searchIfNoQuery: { classPropertyName: "searchIfNoQuery", publicName: "searchIfNoQuery", isSignal: true, isRequired: false, transformFunction: null }, showRefreshBtn: { classPropertyName: "showRefreshBtn", publicName: "showRefreshBtn", isSignal: true, isRequired: false, transformFunction: null }, useStaticLoader: { classPropertyName: "useStaticLoader", publicName: "useStaticLoader", isSignal: true, isRequired: false, transformFunction: null }, searchPromptText: { classPropertyName: "searchPromptText", publicName: "searchPromptText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { queryData: "queryDataChange", dataFetched: "dataFetched" }, usesInheritance: true, ngImport: i0, template: "<div class=\"table-https\">\n @if (header()) {\n <h6 class=\"text-primary\">\n {{ header() | appTranslate | async }}\n </h6>\n }\n\n <!-- {{queryData()|json}} -->\n <div class=\"\" [hidden]=\"!allowSearch()\">\n <div class=\"row g-3 m-0 row-cols-md-auto justify-content-between align-items-center\">\n <div class=\"ps-0\">\n @if (startSectionTemplate()) {\n <div class=\"{{ starterSectionClass() }}\">\n <ng-container [ngTemplateOutlet]=\"startSectionTemplate()\" />\n </div>\n }\n </div>\n <div class=\"pe-0\">\n <div class=\"row g-3 row-cols-lg-auto align-items-center justify-content-between\">\n <div class=\"col-auto\">\n @if (showExport()) {\n <app-export-table\n [disabled]=\"!resultsLength()\"\n [label]=\"label()\"\n [debug]=\"debug()\"\n [searchQuery]=\"allQueryData() | toAny\"\n [searchFunc]=\"observableFunc()\"\n [displayedColumns]=\"computedDisplayedColumns()\"></app-export-table>\n }\n </div>\n @if (showAdditionalColumns()) {\n <div class=\"col-auto\">\n <fields-to-display\n [fields]=\"allTableColumns()\"\n [currentColumns]=\"computedDisplayedColumns()\"\n (fieldsChanged)=\"fieldsChanged($event)\" />\n </div>\n }\n @if (showRefreshBtn()) {\n <div class=\"col-auto\">\n <app-btn icon=\"refresh\" [iconBtn]=\"true\" (mclick)=\"refresh()\" />\n </div>\n }\n </div>\n </div>\n </div>\n <div\n class=\"mt-2 overflow-auto {{ tableContainerClass() }} table-container rounded-10\"\n [ngClass]=\"{ border: distinct() }\">\n <loader\n [loading]=\"isLoadingResults()\"\n [useStaticLoader]=\"useStaticLoader()\"\n [height]=\"container?.scrollHeight + 400\">\n <div #container>\n <div class=\"table-responsive\">\n <table\n mat-table\n [dataSource]=\"filteredAndPagedResults()\"\n class=\"w-100 d-table table\"\n [multiTemplateDataRows]=\"isExpandable()\"\n [ngClass]=\"{\n smallerFonts: smallerFonts(),\n nowrap: nowrap(),\n centerCells: centerCells(),\n curvy: curvy(),\n 'table-striped': striped(),\n }\"\n matSort\n matSortActive=\"{{ orderField() | toAny }}\"\n matSortDisableClear\n [matSortDirection]=\"orderDirection()\"\n #table\n (matSortChange)=\"resetPaging()\">\n <!-- Checkbox Column -->\n <ng-container\n matColumnDef=\"mselect\"\n [sticky]=\"!placeSelectionAtRight()\"\n [stickyEnd]=\"placeSelectionAtRight()\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [aria-label]=\"checkboxLabel()\"></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"checkboxLabel(row)\"></mat-checkbox>\n </td>\n </ng-container>\n <!-- COLUMNS -->\n @for (col of computedDisplayedColumns(); track col.f; let i = $index) {\n @switch (col.type) {\n <!-- CHECKBOX -->\n @case ('checkbox') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-ngmodel\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"checkbox\"\n [disabled]=\"col.disabled\"\n [checked]=\"col.checked\"\n [(model)]=\"row[col.f]\"\n (mchange)=\"outputCheckbox(col.f, row, $event)\"></app-input-ngmodel>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Sub Table -->\n @case ('table') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n {{ col.t | appTranslate | async }}\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <app-btn\n [icon]=\"col.icon\"\n type=\"dark\"\n (mclick)=\"col.action ? col.action(row, col.f) : null\"\n [help]=\"col.subTable | tableToString: row | async\"\n [showHelpIcon]=\"false\"\n [iconBtn]=\"true\"\n mclass=\"w-auto\" />\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- COLOR -->\n @case ('color') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"square-2\" [style]=\"'background-color:' + row[col.f]\"></div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Button -->\n @case ('button') {\n <ng-container [sticky]=\"col.stickyStart\" [stickyEnd]=\"col.stickyEnd||col.sticky\" matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index\" class=\"btn-cell\">\n <app-btn\n [icon]=\"col.icon || col.btn?.icon\"\n [type]=\"col.btn?.type\"\n (mclick)=\"\n col.action\n ? col.action(row, col.f, getActionStatusCallback(col), index)\n : null\n \"\n [help]=\"col.btn?.help\"\n [showHelpIcon]=\"col.btn?.showHelpIcon\"\n [text]=\"col.btn?.label\"\n [mini]=\"col.btn?.mini\"\n [loading]=\"col.btn?.loading\"\n [iconBtn]=\"col.btn?.iconBtn\"\n mclass=\"w-auto\"\n [disabled]=\"col.btn?.disabled || col.btn?.loading\" />\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- ACTION/BTNS COLUMNS -->\n @case ('btns') {\n <ng-container\n matColumnDef=\"{{ col.f | toAny }}\"\n [stickyEnd]=\"true\"\n [sticky]=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"btn-cell text-center\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"btn-cell\">\n <div class=\"d-flex col-md-auto col-sm-auto\">\n @for (button of col.buttons; track button.icon + button.label) {\n <div class=\"mx-2\">\n <app-btn\n [icon]=\"button.icon\"\n [text]=\"button.label\"\n [help]=\"button.help\"\n [showHelpIcon]=\"button.showHelpIcon\"\n [type]=\"button.type\"\n [group]=\"button.group\"\n [mini]=\"button.mini\"\n [iconBtn]=\"!button.label\"\n mclass=\"w-auto\"\n (mclick)=\"button.action(row, i + paginator.pageIndex * paginator.pageSize, btn)\"\n #btn />\n </div>\n }\n </div>\n </td>\n </ng-container>\n }\n <!-- EDITABLE -->\n @case ('editable') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n {{ col.t | appTranslate | async }}\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <a\n class=\"cell\"\n [mqueryParams]=\"col.mqueryParams | functionCaller2: row : col.f\"\n [mrouterLink]=\"col.routeFormatter | functionCaller2: row : col.f\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n <i\n (click)=\"col.action ? col.action(row, col.f) : null\"\n class=\"ps-1 pointer fas fa-pencil-alt\"></i>\n </td>\n </ng-container>\n }\n <!-- DEFAULT -->\n @default {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\" [sticky]=\"col.stickyStart\" [stickyEnd]=\"col.stickyEnd||col.sticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear>\n {{ col.t | appTranslate | async }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let rowIndex = index\"\n [matTooltip]=\"\n col.hintFormatter\n ? (col.hintFormatter | functionCaller1: row | async)\n : null\n \">\n <ng-template #cellContent>\n @switch (true) {\n @case (!!col.routeFormatter) {\n @if (extractRoute | functionCaller2: col : row; as cellRoute) {\n <a\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [queryParams]=\"cellRoute.queryParams\"\n routerLink=\"{{ cellRoute.route }}\"\n [innerHTML]=\"\n row | getColFormatted: col | async | valueOrX: '-'\n \"></a>\n }\n }\n @case (!!col.customTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n col.customTemplate;\n context: { $implicit: { row, rowIndex } }\n \" />\n }\n @default {\n <span\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [innerHTML]=\"\n row | getColFormatted: col | async | valueOrX: '-'\n \"></span>\n }\n }\n @if (col.expandable) {\n <button\n matTooltip=\"Exapnd\"\n [matTooltipShowDelay]=\"1000\"\n mat-icon-button\n (click)=\"expandCell(row, col, expandModal)\"\n class=\"expandBtn\">\n <mat-icon [inline]=\"true\">open_in_full</mat-icon>\n </button>\n }\n </ng-template>\n\n @if (col._onHoverFunction) {\n <span\n class=\"\"\n [nelDebug]=\"debug()\"\n [nelMouseEntered]=\"{ action: col._onHoverFunction, argument: row }\"\n [nelDelay]=\"col._onHoverDelay\">\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n </span>\n } @else {\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n }\n </td>\n </ng-container>\n }\n <!--// -->\n }\n }\n <!--// -->\n <!-- EXPANDABLE COLUMN-->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"_expandCol\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- {{expandedElement()|json}} -->\n <div class=\"d-flex justify-content-end\">\n <app-btn\n [iconBtn]=\"true\"\n type=\"clear\"\n [customIcon]=\"\n expandedElement() !== row ? 'fa fa-chevron-down' : 'fa fa-chevron-up'\n \"\n aria-label=\"expand row\"\n loggingValue=\"Expand Row Button {{ row | json }}\"\n (mclick)=\"\n expandedElement.set(expandedElement() === row ? null : row);\n clickedExpandRow.emit({ open: expandedElement() === row, row });\n $event?.stopPropagation()\n \" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- OPTIONS COLUMN -->\n @if (hasRowOptions()) {\n <ng-container matColumnDef=\"option\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef disableClear></th>\n <td mat-cell *matCellDef=\"let row\">\n @if (rowOptionsMap()) {\n @if (formOptionsMap() | functionCaller: row; as _rowoptions) {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of _rowoptions; track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n } @else {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of rowOptions(); track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n </td>\n </ng-container>\n }\n <!--// -->\n\n @if (rawColumns(); as dcols) {\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td\n mat-cell\n *matCellDef=\"let row\"\n [attr.colspan]=\"dcols?.length || 1\"\n [ngClass]=\"{ hideBorder: row != expandedElement() }\">\n <div\n class=\"example-element-detail\"\n [@detailExpand]=\"row == expandedElement() ? 'expanded' : 'collapsed'\">\n @if (row == expandedElement()) {\n <ng-container\n *ngTemplateOutlet=\"\n expandedRowTemplate();\n context: { $implicit: { row } }\n \"></ng-container>\n }\n </div>\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"dcols\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: dcols\"\n [ngClass]=\"{\n pointer: showRowPointer(),\n disabled: isDisabledFunc() ? isDisabledFunc()(row) : false,\n }\"\n [matTooltip]=\"isDisabledFunc() && isDisabledFunc()(row) ? 'Disabled' : null\"\n (click)=\"rowClick(row)\"></tr>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell no-item\" [attr.colspan]=\"dcols?.length || 1\">\n {{ noItemTxt() | appTranslate | async }}\n </td>\n </tr>\n @if (isExpandable()) {\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['expandedDetail']\"\n class=\"expanded-detail-row\"\n [style.height.px]=\"0\"></tr>\n }\n }\n </table>\n </div>\n <mat-paginator\n [length]=\"resultsLength()\"\n [pageSizeOptions]=\"computedPageSizeOptions()\"\n [pageSize]=\"pageSize()\"\n showFirstLastButtons />\n </div>\n </loader>\n </div>\n </div>\n @if (!allowSearch()) {\n <div class=\"not-allowed-search\">{{ searchPromptText() | appTranslateNL | async }}</div>\n }\n</div>\n<modal-comp\n [width]=\"selectedCellForExpansion()?.column?.expandedWidth || '900px'\"\n [header]=\"selectedCellForExpansion()?.column?.t\"\n [showFooter]=\"false\"\n (modalClose)=\"closeExpandedCell()\"\n #expandModal>\n <ng-template modalBody>\n @if (selectedCellForExpansion(); as _selected) {\n <div\n class=\"\"\n [innerHTML]=\"\n _selected.row | getColFormattedE: _selected.column | async | valueOrX: '-'\n \"></div>\n }\n </ng-template>\n</modal-comp>\n", styles: [":host ::ng-deep .table-plain .w-1,:host ::ng-deep .table-https .w-1{width:1%}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail{padding:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder{border-bottom:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail{overflow:hidden;display:flex}:host ::ng-deep .table-plain .mat-cell,:host ::ng-deep .table-https .mat-cell{padding:3px 5px!important}:host ::ng-deep .table-plain .colour,:host ::ng-deep .table-https .colour{height:15px;width:15px;display:inline-block;border-radius:5px}:host ::ng-deep .table-plain .centerCells .mat-sort-header-container,:host ::ng-deep .table-plain .centerCells .mat-mdc-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-mdc-sort-header-container{justify-content:center}:host ::ng-deep .table-plain .default.colour,:host ::ng-deep .table-https .default.colour{background-color:#545454}:host ::ng-deep .table-plain .btn-cell,:host ::ng-deep .table-https .btn-cell{width:1%}:host ::ng-deep .table-plain input[type=checkbox]:not(.form-control),:host ::ng-deep .table-https input[type=checkbox]:not(.form-control){border:1px solid rgba(80,78,245,.3019607843)}:host ::ng-deep .table-plain .mat-header-cell,:host ::ng-deep .table-plain .mat-mdc-header-cell,:host ::ng-deep .table-https .mat-header-cell,:host ::ng-deep .table-https .mat-mdc-header-cell{vertical-align:middle;color:var(--primary);font-style:normal;font-weight:600;font-size:14px;text-align:center}:host ::ng-deep .table-plain .mat-table-sticky-border-elem-left,:host ::ng-deep .table-plain .mat-mdc-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0;background-color:#fff}:host ::ng-deep .table-plain .mat-mdc-table-sticky,:host ::ng-deep .table-https .mat-mdc-table-sticky{background-color:#fff!important}:host ::ng-deep .table-plain .smallerFonts td,:host ::ng-deep .table-plain .smallerFonts th,:host ::ng-deep .table-https .smallerFonts td,:host ::ng-deep .table-https .smallerFonts th{font-size:.7rem}:host ::ng-deep .table-plain .nowrap td,:host ::ng-deep .table-plain .nowrap th,:host ::ng-deep .table-https .nowrap td,:host ::ng-deep .table-https .nowrap th{white-space:nowrap;text-align:left;padding:5px}:host ::ng-deep .table-plain table tr,:host ::ng-deep .table-https table tr{position:relative}:host ::ng-deep .table-plain table tr.mat-mdc-row,:host ::ng-deep .table-plain table tr.mat-mdc-header-row,:host ::ng-deep .table-plain table tr .mat-header-row,:host ::ng-deep .table-https table tr.mat-mdc-row,:host ::ng-deep .table-https table tr.mat-mdc-header-row,:host ::ng-deep .table-https table tr .mat-header-row{height:52px}:host ::ng-deep .table-plain table tr td:hover,:host ::ng-deep .table-https table tr td:hover{color:unset!important;text-decoration:unset;cursor:unset}:host ::ng-deep .table-plain table tr.disabled:after,:host ::ng-deep .table-https table tr.disabled:after{content:\" \";display:block;background-color:#c7c7c726;width:100%;height:100%;position:absolute;top:0;left:0;z-index:11111;cursor:not-allowed}:host ::ng-deep .table-plain .centerCells td,:host ::ng-deep .table-https .centerCells td{text-align:center}:host ::ng-deep .table-plain .curvy tr,:host ::ng-deep .table-https .curvy tr{border-radius:0 10px}:host ::ng-deep .table-plain .inline-block,:host ::ng-deep .table-https .inline-block{display:inline-block}:host ::ng-deep .table-plain td.no-item,:host ::ng-deep .table-https td.no-item{border-bottom:none!important;height:50px}\n"], dependencies: [{ kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "verbose", "translatorOptions", "loading", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "form", "forms", "help", "helpShowDelay", "iconBtn", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid", "disabled"], outputs: ["loadingChange", "leftCustomIconChange", "mclick", "disabledChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ExportTableComponent, selector: "app-export-table", inputs: ["data", "displayedColumns", "searchFunc", "searchQuery", "label", "debug", "disabled"] }, { kind: "component", type: FieldsToDisplayComponent, selector: "fields-to-display", inputs: ["query1", "query2", "fields", "currentColumns"], outputs: ["query1Change", "query2Change", "fieldsChanged"] }, { kind: "component", type: InfoIconComponent, selector: "app-info-icon", inputs: ["text", "coloured", "left", "right"] }, { kind: "component", type: InputNGModelComponent, selector: "app-input-ngmodel", inputs: ["mvalue", "cls", "colored", "disabled", "hide", "hint", "id", "inpCl", "label", "lblCl", "lblPosition", "mini", "light", "name", "model", "optionFormatter", "options", "checked", "contextData", "decimalPoints", "labelField", "max", "min", "placeholder", "prefix", "readonly", "required", "showEmptyOption", "showLabel", "showValidation", "showValidationIcon", "small", "stacked", "suffix", "theme", "type", "valueField", "labelType", "xsmall"], outputs: ["modelChange", "mchange"] }, { kind: "component", type: LoaderComponent, selector: "loader", inputs: ["class", "text", "loading", "height", "width", "useStaticLoader", "ratioHW"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i2$5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3$1.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: i3$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3$1.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: MatPaginatorModule }, { kind: "component", type: i1$6.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i5.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i5.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: ModalComponent, selector: "modal-comp", inputs: ["header", "bodyTemplateRef", "footerTemplateRef", "showHeader", "loading", "isFullscreen", "showFooter", "width", "minWidth", "height", "maxHeight", "icon", "data", "disableClose", "hasBackdrop", "baseConfig"], outputs: ["headerChange", "showHeaderChange", "mouseLeft", "loadingChange", "showFooterChange", "modalOpen", "modalClose"] }, { kind: "directive", type: ModalBodyDirective, selector: "[modalBody]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MouseEnterListenerDirective, selector: "[nelMouseEntered]", inputs: ["nelMouseEntered"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i10$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i10$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i10$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i10$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i10$1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i10$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i10$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i10$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i10$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i10$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i10$1.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: MrouterLinkirective, selector: "[mrouterLink]", inputs: ["mrouterLink", "mrouterLinkActivatedRoute", "mqueryParams", "isPhone", "isEmail"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: TablePipesModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.JsonPipe, name: "json" }, { kind: "pipe", type: FunctionCaller2, name: "functionCaller2" }, { kind: "pipe", type: GetColFormattedPipe, name: "getColFormatted" }, { kind: "pipe", type: GetColFormattedEPipe, name: "getColFormattedE" }, { kind: "pipe", type: ValueOrXPipe, name: "valueOrX" }, { kind: "pipe", type: TableToStringPipe, name: "tableToString" }, { kind: "pipe", type: ToAnyPipe, name: "toAny" }, { kind: "pipe", type: SDKTranslatePipe, name: "appTranslate" }, { kind: "pipe", type: FunctionCaller, name: "functionCaller" }, { kind: "pipe", type: FunctionCaller1, name: "functionCaller1" }, { kind: "pipe", type: SDKTranslateNoLoaderPipe, name: "appTranslateNL" }], animations: [
20651
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.2", type: TableHttpsComponent, isStandalone: true, selector: "table-https", inputs: { observableFunc: { classPropertyName: "observableFunc", publicName: "observableFunc", isSignal: true, isRequired: false, transformFunction: null }, pageNumber: { classPropertyName: "pageNumber", publicName: "pageNumber", isSignal: false, isRequired: false, transformFunction: null }, queryData: { classPropertyName: "queryData", publicName: "queryData", isSignal: true, isRequired: false, transformFunction: null }, searchIfNoQuery: { classPropertyName: "searchIfNoQuery", publicName: "searchIfNoQuery", isSignal: true, isRequired: false, transformFunction: null }, showRefreshBtn: { classPropertyName: "showRefreshBtn", publicName: "showRefreshBtn", isSignal: true, isRequired: false, transformFunction: null }, useStaticLoader: { classPropertyName: "useStaticLoader", publicName: "useStaticLoader", isSignal: true, isRequired: false, transformFunction: null }, searchPromptText: { classPropertyName: "searchPromptText", publicName: "searchPromptText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { queryData: "queryDataChange", dataFetched: "dataFetched" }, usesInheritance: true, ngImport: i0, template: "<div class=\"table-https\">\n @if (header()) {\n <h6 class=\"text-primary\">\n {{ header() | appTranslate | async }}\n </h6>\n }\n\n <!-- {{queryData()|json}} -->\n <div class=\"\" [hidden]=\"!allowSearch()\">\n <div class=\"row g-3 m-0 row-cols-md-auto justify-content-between align-items-center\">\n <div class=\"ps-0\">\n @if (startSectionTemplate()) {\n <div class=\"{{ starterSectionClass() }}\">\n <ng-container [ngTemplateOutlet]=\"startSectionTemplate()\" />\n </div>\n }\n </div>\n <div class=\"pe-0\">\n <div class=\"row g-3 row-cols-lg-auto align-items-center justify-content-between\">\n <div class=\"col-auto\">\n @if (showExport()) {\n <app-export-table\n [disabled]=\"!resultsLength()\"\n [label]=\"label()\"\n [debug]=\"debug()\"\n [searchQuery]=\"allQueryData() | toAny\"\n [searchFunc]=\"observableFunc()\"\n [displayedColumns]=\"computedDisplayedColumns()\"></app-export-table>\n }\n </div>\n @if (showAdditionalColumns()) {\n <div class=\"col-auto\">\n <fields-to-display\n [fields]=\"allTableColumns()\"\n [currentColumns]=\"computedDisplayedColumns()\"\n (fieldsChanged)=\"fieldsChanged($event)\" />\n </div>\n }\n @if (showRefreshBtn()) {\n <div class=\"col-auto\">\n <app-btn icon=\"refresh\" [iconBtn]=\"true\" (mclick)=\"refresh()\" />\n </div>\n }\n </div>\n </div>\n </div>\n <div\n class=\"mt-2 overflow-auto {{ tableContainerClass() }} table-container rounded-10\"\n [ngClass]=\"{ border: distinct() }\">\n <loader\n [loading]=\"isLoadingResults()\"\n [useStaticLoader]=\"useStaticLoader()\"\n [height]=\"container?.scrollHeight + 400\">\n <div #container>\n <div class=\"table-responsive\">\n <table\n mat-table\n [dataSource]=\"filteredAndPagedResults()\"\n class=\"w-100 d-table table\"\n [multiTemplateDataRows]=\"isExpandable()\"\n [ngClass]=\"{\n smallerFonts: smallerFonts(),\n nowrap: nowrap(),\n centerCells: centerCells(),\n curvy: curvy(),\n 'table-striped': striped(),\n }\"\n matSort\n matSortActive=\"{{ orderField() | toAny }}\"\n matSortDisableClear\n [matSortDirection]=\"orderDirection()\"\n #table\n (matSortChange)=\"resetPaging()\">\n <!-- Checkbox Column -->\n <ng-container\n matColumnDef=\"mselect\"\n [sticky]=\"!placeSelectionAtRight()\"\n [stickyEnd]=\"placeSelectionAtRight()\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [aria-label]=\"checkboxLabel()\"></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"checkboxLabel(row)\"></mat-checkbox>\n </td>\n </ng-container>\n <!-- COLUMNS -->\n @for (col of computedDisplayedColumns(); track col.f; let i = $index) {\n @switch (col.type) {\n <!-- CHECKBOX -->\n @case ('checkbox') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-ngmodel\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"checkbox\"\n [disabled]=\"col.disabled\"\n [checked]=\"col.checked\"\n [(model)]=\"row[col.f]\"\n (mchange)=\"outputCheckbox(col.f, row, $event)\"></app-input-ngmodel>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Sub Table -->\n @case ('table') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n {{ col.t | appTranslate | async }}\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <app-btn\n [icon]=\"col.icon\"\n type=\"dark\"\n (mclick)=\"col.action ? col.action(row, col.f) : null\"\n [help]=\"col.subTable | tableToString: row | async\"\n [showHelpIcon]=\"false\"\n [iconBtn]=\"true\"\n mclass=\"w-auto\" />\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- COLOR -->\n @case ('color') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"square-2\" [style]=\"'background-color:' + row[col.f]\"></div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Button -->\n @case ('button') {\n <ng-container [sticky]=\"col.stickyStart\" [stickyEnd]=\"col.stickyEnd||col.sticky\" matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index\" class=\"btn-cell\">\n <app-btn\n [icon]=\"col.icon || col.btn?.icon\"\n [type]=\"col.btn?.type\"\n (mclick)=\"\n col.action\n ? col.action(row, col.f, getActionStatusCallback(col), index)\n : null\n \"\n [help]=\"col.btn?.help\"\n [showHelpIcon]=\"col.btn?.showHelpIcon\"\n [text]=\"col.btn?.label\"\n [mini]=\"col.btn?.mini\"\n [loading]=\"col.btn?.loading\"\n [iconBtn]=\"col.btn?.iconBtn\"\n mclass=\"w-auto\"\n [disabled]=\"col.btn?.disabled || col.btn?.loading\" />\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- ACTION/BTNS COLUMNS -->\n @case ('btns') {\n <ng-container\n matColumnDef=\"{{ col.f | toAny }}\"\n [stickyEnd]=\"true\"\n [sticky]=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"btn-cell text-center\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"btn-cell\">\n <div class=\"d-flex col-md-auto col-sm-auto\">\n @for (button of col.buttons; track button.icon + button.label) {\n <div class=\"mx-2\">\n <app-btn\n [icon]=\"button.icon\"\n [text]=\"button.label\"\n [help]=\"button.help\"\n [showHelpIcon]=\"button.showHelpIcon\"\n [type]=\"button.type\"\n [group]=\"button.group\"\n [mini]=\"button.mini\"\n [iconBtn]=\"!button.label\"\n mclass=\"w-auto\"\n (mclick)=\"button.action(row, i + paginator.pageIndex * paginator.pageSize, btn)\"\n #btn />\n </div>\n }\n </div>\n </td>\n </ng-container>\n }\n <!-- EDITABLE -->\n @case ('editable') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n {{ col.t | appTranslate | async }}\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <a\n class=\"cell\"\n [mqueryParams]=\"col.mqueryParams | functionCaller2: row : col.f\"\n [mrouterLink]=\"col.routeFormatter | functionCaller2: row : col.f\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n <i\n (click)=\"col.action ? col.action(row, col.f) : null\"\n class=\"ps-1 pointer fas fa-pencil-alt\"></i>\n </td>\n </ng-container>\n }\n <!-- DEFAULT -->\n @default {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\" [sticky]=\"col.stickyStart\" [stickyEnd]=\"col.stickyEnd||col.sticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear>\n {{ col.t | appTranslate | async }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let rowIndex = index\"\n [matTooltip]=\"\n col.hintFormatter\n ? (col.hintFormatter | functionCaller1: row | async)\n : null\n \">\n <ng-template #cellContent>\n @switch (true) {\n @case (!!col.routeFormatter) {\n @if (extractRoute | functionCaller2: col : row; as cellRoute) {\n <a\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [queryParams]=\"cellRoute.queryParams\"\n routerLink=\"{{ cellRoute.route }}\"\n [innerHTML]=\"\n row | getColFormatted: col | async | valueOrX: '-'\n \"></a>\n }\n }\n @case (!!col.customTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n col.customTemplate;\n context: { $implicit: { row, rowIndex } }\n \" />\n }\n @default {\n <span\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [innerHTML]=\"\n row | getColFormatted: col | async | valueOrX: '-'\n \"></span>\n }\n }\n @if (col.expandable) {\n <button\n matTooltip=\"Exapnd\"\n [matTooltipShowDelay]=\"1000\"\n mat-icon-button\n (click)=\"expandCell(row, col, expandModal)\"\n class=\"expandBtn\">\n <mat-icon [inline]=\"true\">open_in_full</mat-icon>\n </button>\n }\n </ng-template>\n\n @if (col._onHoverFunction) {\n <span\n class=\"\"\n [nelDebug]=\"debug()\"\n [nelMouseEntered]=\"{ action: col._onHoverFunction, argument: row }\"\n [nelDelay]=\"col._onHoverDelay\">\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n </span>\n } @else {\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n }\n </td>\n </ng-container>\n }\n <!--// -->\n }\n }\n <!--// -->\n <!-- EXPANDABLE COLUMN-->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"_expandCol\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- {{expandedElement()|json}} -->\n <div class=\"d-flex justify-content-end\">\n <app-btn\n [iconBtn]=\"true\"\n type=\"clear\"\n [customIcon]=\"\n expandedElement() !== row ? 'fa fa-chevron-down' : 'fa fa-chevron-up'\n \"\n aria-label=\"expand row\"\n loggingValue=\"Expand Row Button {{ row | json }}\"\n (mclick)=\"\n expandedElement.set(expandedElement() === row ? null : row);\n clickedExpandRow.emit({ open: expandedElement() === row, row });\n $event?.stopPropagation()\n \" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- OPTIONS COLUMN -->\n @if (hasRowOptions()) {\n <ng-container matColumnDef=\"option\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef disableClear></th>\n <td mat-cell *matCellDef=\"let row\">\n @if (rowOptionsMap()) {\n @if (formOptionsMap() | functionCaller: row; as _rowoptions) {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of _rowoptions; track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n } @else {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of rowOptions(); track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n </td>\n </ng-container>\n }\n <!--// -->\n\n @if (rawColumns(); as dcols) {\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td\n mat-cell\n *matCellDef=\"let row\"\n [attr.colspan]=\"dcols?.length || 1\"\n [ngClass]=\"{ hideBorder: row != expandedElement() }\">\n <div\n class=\"example-element-detail\"\n [@detailExpand]=\"row == expandedElement() ? 'expanded' : 'collapsed'\">\n @if (row == expandedElement()) {\n <ng-container\n *ngTemplateOutlet=\"\n expandedRowTemplate();\n context: { $implicit: { row } }\n \"></ng-container>\n }\n </div>\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"dcols\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: dcols\"\n [ngClass]=\"{\n pointer: enableRowClick(),\n disabled: isDisabledFunc() ? isDisabledFunc()(row) : false,\n }\"\n [matTooltip]=\"isDisabledFunc() && isDisabledFunc()(row) ? 'Disabled' : null\"\n (click)=\"rowClick(row)\"></tr>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell no-item\" [attr.colspan]=\"dcols?.length || 1\">\n {{ noItemTxt() | appTranslate | async }}\n </td>\n </tr>\n @if (isExpandable()) {\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['expandedDetail']\"\n class=\"expanded-detail-row\"\n [style.height.px]=\"0\"></tr>\n }\n }\n </table>\n </div>\n <mat-paginator\n [length]=\"resultsLength()\"\n [pageSizeOptions]=\"computedPageSizeOptions()\"\n [pageSize]=\"pageSize()\"\n showFirstLastButtons />\n </div>\n </loader>\n </div>\n </div>\n @if (!allowSearch()) {\n <div class=\"not-allowed-search\">{{ searchPromptText() | appTranslateNL | async }}</div>\n }\n</div>\n<modal-comp\n [width]=\"selectedCellForExpansion()?.column?.expandedWidth || '900px'\"\n [header]=\"selectedCellForExpansion()?.column?.t\"\n [showFooter]=\"false\"\n (modalClose)=\"closeExpandedCell()\"\n #expandModal>\n <ng-template modalBody>\n @if (selectedCellForExpansion(); as _selected) {\n <div\n class=\"\"\n [innerHTML]=\"\n _selected.row | getColFormattedE: _selected.column | async | valueOrX: '-'\n \"></div>\n }\n </ng-template>\n</modal-comp>\n", styles: [":host ::ng-deep .table-plain .w-1,:host ::ng-deep .table-https .w-1{width:1%}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail{padding:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder{border-bottom:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail{overflow:hidden;display:flex}:host ::ng-deep .table-plain .mat-cell,:host ::ng-deep .table-https .mat-cell{padding:3px 5px!important}:host ::ng-deep .table-plain .colour,:host ::ng-deep .table-https .colour{height:15px;width:15px;display:inline-block;border-radius:5px}:host ::ng-deep .table-plain .centerCells .mat-sort-header-container,:host ::ng-deep .table-plain .centerCells .mat-mdc-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-mdc-sort-header-container{justify-content:center}:host ::ng-deep .table-plain .default.colour,:host ::ng-deep .table-https .default.colour{background-color:#545454}:host ::ng-deep .table-plain .btn-cell,:host ::ng-deep .table-https .btn-cell{width:1%}:host ::ng-deep .table-plain input[type=checkbox]:not(.form-control),:host ::ng-deep .table-https input[type=checkbox]:not(.form-control){border:1px solid rgba(80,78,245,.3019607843)}:host ::ng-deep .table-plain .mat-header-cell,:host ::ng-deep .table-plain .mat-mdc-header-cell,:host ::ng-deep .table-https .mat-header-cell,:host ::ng-deep .table-https .mat-mdc-header-cell{vertical-align:middle;color:var(--primary);font-style:normal;font-weight:600;font-size:14px;text-align:center}:host ::ng-deep .table-plain .mat-table-sticky-border-elem-left,:host ::ng-deep .table-plain .mat-mdc-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0;background-color:#fff}:host ::ng-deep .table-plain .mat-mdc-table-sticky,:host ::ng-deep .table-https .mat-mdc-table-sticky{background-color:#fff!important}:host ::ng-deep .table-plain .smallerFonts td,:host ::ng-deep .table-plain .smallerFonts th,:host ::ng-deep .table-https .smallerFonts td,:host ::ng-deep .table-https .smallerFonts th{font-size:.7rem}:host ::ng-deep .table-plain .nowrap td,:host ::ng-deep .table-plain .nowrap th,:host ::ng-deep .table-https .nowrap td,:host ::ng-deep .table-https .nowrap th{white-space:nowrap;text-align:left;padding:5px}:host ::ng-deep .table-plain table tr,:host ::ng-deep .table-https table tr{position:relative}:host ::ng-deep .table-plain table tr.mat-mdc-row,:host ::ng-deep .table-plain table tr.mat-mdc-header-row,:host ::ng-deep .table-plain table tr .mat-header-row,:host ::ng-deep .table-https table tr.mat-mdc-row,:host ::ng-deep .table-https table tr.mat-mdc-header-row,:host ::ng-deep .table-https table tr .mat-header-row{height:52px}:host ::ng-deep .table-plain table tr td:hover,:host ::ng-deep .table-https table tr td:hover{color:unset!important;text-decoration:unset;cursor:unset}:host ::ng-deep .table-plain table tr.disabled:after,:host ::ng-deep .table-https table tr.disabled:after{content:\" \";display:block;background-color:#c7c7c726;width:100%;height:100%;position:absolute;top:0;left:0;z-index:11111;cursor:not-allowed}:host ::ng-deep .table-plain .centerCells td,:host ::ng-deep .table-https .centerCells td{text-align:center}:host ::ng-deep .table-plain .curvy tr,:host ::ng-deep .table-https .curvy tr{border-radius:0 10px}:host ::ng-deep .table-plain .inline-block,:host ::ng-deep .table-https .inline-block{display:inline-block}:host ::ng-deep .table-plain td.no-item,:host ::ng-deep .table-https td.no-item{border-bottom:none!important;height:50px}\n"], dependencies: [{ kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "verbose", "translatorOptions", "loading", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "form", "forms", "help", "helpShowDelay", "iconBtn", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid", "disabled"], outputs: ["loadingChange", "leftCustomIconChange", "mclick", "disabledChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ExportTableComponent, selector: "app-export-table", inputs: ["data", "displayedColumns", "searchFunc", "searchQuery", "label", "debug", "disabled"] }, { kind: "component", type: FieldsToDisplayComponent, selector: "fields-to-display", inputs: ["query1", "query2", "fields", "currentColumns"], outputs: ["query1Change", "query2Change", "fieldsChanged"] }, { kind: "component", type: InfoIconComponent, selector: "app-info-icon", inputs: ["text", "coloured", "left", "right"] }, { kind: "component", type: InputNGModelComponent, selector: "app-input-ngmodel", inputs: ["mvalue", "cls", "colored", "disabled", "hide", "hint", "id", "inpCl", "label", "lblCl", "lblPosition", "mini", "light", "name", "model", "optionFormatter", "options", "checked", "contextData", "decimalPoints", "labelField", "max", "min", "placeholder", "prefix", "readonly", "required", "showEmptyOption", "showLabel", "showValidation", "showValidationIcon", "small", "stacked", "suffix", "theme", "type", "valueField", "labelType", "xsmall"], outputs: ["modelChange", "mchange"] }, { kind: "component", type: LoaderComponent, selector: "loader", inputs: ["class", "text", "loading", "height", "width", "useStaticLoader", "ratioHW"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i2$5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3$1.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: i3$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3$1.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: MatPaginatorModule }, { kind: "component", type: i1$6.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i5.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i5.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: ModalComponent, selector: "modal-comp", inputs: ["header", "bodyTemplateRef", "footerTemplateRef", "showHeader", "loading", "isFullscreen", "showFooter", "width", "minWidth", "height", "maxHeight", "icon", "data", "disableClose", "hasBackdrop", "baseConfig"], outputs: ["headerChange", "showHeaderChange", "mouseLeft", "loadingChange", "showFooterChange", "modalOpen", "modalClose"] }, { kind: "directive", type: ModalBodyDirective, selector: "[modalBody]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MouseEnterListenerDirective, selector: "[nelMouseEntered]", inputs: ["nelMouseEntered"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i10$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i10$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i10$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i10$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i10$1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i10$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i10$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i10$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i10$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i10$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i10$1.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: MrouterLinkirective, selector: "[mrouterLink]", inputs: ["mrouterLink", "mrouterLinkActivatedRoute", "mqueryParams", "isPhone", "isEmail"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: TablePipesModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.JsonPipe, name: "json" }, { kind: "pipe", type: FunctionCaller2, name: "functionCaller2" }, { kind: "pipe", type: GetColFormattedPipe, name: "getColFormatted" }, { kind: "pipe", type: GetColFormattedEPipe, name: "getColFormattedE" }, { kind: "pipe", type: ValueOrXPipe, name: "valueOrX" }, { kind: "pipe", type: TableToStringPipe, name: "tableToString" }, { kind: "pipe", type: ToAnyPipe, name: "toAny" }, { kind: "pipe", type: SDKTranslatePipe, name: "appTranslate" }, { kind: "pipe", type: FunctionCaller, name: "functionCaller" }, { kind: "pipe", type: FunctionCaller1, name: "functionCaller1" }, { kind: "pipe", type: SDKTranslateNoLoaderPipe, name: "appTranslateNL" }], animations: [
20648
20652
  trigger('detailExpand', [
20649
20653
  state('collapsed', style({ height: '0px', minHeight: '0' })),
20650
20654
  state('expanded', style({ height: '*' })),
@@ -20692,7 +20696,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImpor
20692
20696
  FunctionCaller,
20693
20697
  FunctionCaller1,
20694
20698
  SDKTranslateNoLoaderPipe
20695
- ], template: "<div class=\"table-https\">\n @if (header()) {\n <h6 class=\"text-primary\">\n {{ header() | appTranslate | async }}\n </h6>\n }\n\n <!-- {{queryData()|json}} -->\n <div class=\"\" [hidden]=\"!allowSearch()\">\n <div class=\"row g-3 m-0 row-cols-md-auto justify-content-between align-items-center\">\n <div class=\"ps-0\">\n @if (startSectionTemplate()) {\n <div class=\"{{ starterSectionClass() }}\">\n <ng-container [ngTemplateOutlet]=\"startSectionTemplate()\" />\n </div>\n }\n </div>\n <div class=\"pe-0\">\n <div class=\"row g-3 row-cols-lg-auto align-items-center justify-content-between\">\n <div class=\"col-auto\">\n @if (showExport()) {\n <app-export-table\n [disabled]=\"!resultsLength()\"\n [label]=\"label()\"\n [debug]=\"debug()\"\n [searchQuery]=\"allQueryData() | toAny\"\n [searchFunc]=\"observableFunc()\"\n [displayedColumns]=\"computedDisplayedColumns()\"></app-export-table>\n }\n </div>\n @if (showAdditionalColumns()) {\n <div class=\"col-auto\">\n <fields-to-display\n [fields]=\"allTableColumns()\"\n [currentColumns]=\"computedDisplayedColumns()\"\n (fieldsChanged)=\"fieldsChanged($event)\" />\n </div>\n }\n @if (showRefreshBtn()) {\n <div class=\"col-auto\">\n <app-btn icon=\"refresh\" [iconBtn]=\"true\" (mclick)=\"refresh()\" />\n </div>\n }\n </div>\n </div>\n </div>\n <div\n class=\"mt-2 overflow-auto {{ tableContainerClass() }} table-container rounded-10\"\n [ngClass]=\"{ border: distinct() }\">\n <loader\n [loading]=\"isLoadingResults()\"\n [useStaticLoader]=\"useStaticLoader()\"\n [height]=\"container?.scrollHeight + 400\">\n <div #container>\n <div class=\"table-responsive\">\n <table\n mat-table\n [dataSource]=\"filteredAndPagedResults()\"\n class=\"w-100 d-table table\"\n [multiTemplateDataRows]=\"isExpandable()\"\n [ngClass]=\"{\n smallerFonts: smallerFonts(),\n nowrap: nowrap(),\n centerCells: centerCells(),\n curvy: curvy(),\n 'table-striped': striped(),\n }\"\n matSort\n matSortActive=\"{{ orderField() | toAny }}\"\n matSortDisableClear\n [matSortDirection]=\"orderDirection()\"\n #table\n (matSortChange)=\"resetPaging()\">\n <!-- Checkbox Column -->\n <ng-container\n matColumnDef=\"mselect\"\n [sticky]=\"!placeSelectionAtRight()\"\n [stickyEnd]=\"placeSelectionAtRight()\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [aria-label]=\"checkboxLabel()\"></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"checkboxLabel(row)\"></mat-checkbox>\n </td>\n </ng-container>\n <!-- COLUMNS -->\n @for (col of computedDisplayedColumns(); track col.f; let i = $index) {\n @switch (col.type) {\n <!-- CHECKBOX -->\n @case ('checkbox') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-ngmodel\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"checkbox\"\n [disabled]=\"col.disabled\"\n [checked]=\"col.checked\"\n [(model)]=\"row[col.f]\"\n (mchange)=\"outputCheckbox(col.f, row, $event)\"></app-input-ngmodel>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Sub Table -->\n @case ('table') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n {{ col.t | appTranslate | async }}\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <app-btn\n [icon]=\"col.icon\"\n type=\"dark\"\n (mclick)=\"col.action ? col.action(row, col.f) : null\"\n [help]=\"col.subTable | tableToString: row | async\"\n [showHelpIcon]=\"false\"\n [iconBtn]=\"true\"\n mclass=\"w-auto\" />\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- COLOR -->\n @case ('color') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"square-2\" [style]=\"'background-color:' + row[col.f]\"></div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Button -->\n @case ('button') {\n <ng-container [sticky]=\"col.stickyStart\" [stickyEnd]=\"col.stickyEnd||col.sticky\" matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index\" class=\"btn-cell\">\n <app-btn\n [icon]=\"col.icon || col.btn?.icon\"\n [type]=\"col.btn?.type\"\n (mclick)=\"\n col.action\n ? col.action(row, col.f, getActionStatusCallback(col), index)\n : null\n \"\n [help]=\"col.btn?.help\"\n [showHelpIcon]=\"col.btn?.showHelpIcon\"\n [text]=\"col.btn?.label\"\n [mini]=\"col.btn?.mini\"\n [loading]=\"col.btn?.loading\"\n [iconBtn]=\"col.btn?.iconBtn\"\n mclass=\"w-auto\"\n [disabled]=\"col.btn?.disabled || col.btn?.loading\" />\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- ACTION/BTNS COLUMNS -->\n @case ('btns') {\n <ng-container\n matColumnDef=\"{{ col.f | toAny }}\"\n [stickyEnd]=\"true\"\n [sticky]=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"btn-cell text-center\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"btn-cell\">\n <div class=\"d-flex col-md-auto col-sm-auto\">\n @for (button of col.buttons; track button.icon + button.label) {\n <div class=\"mx-2\">\n <app-btn\n [icon]=\"button.icon\"\n [text]=\"button.label\"\n [help]=\"button.help\"\n [showHelpIcon]=\"button.showHelpIcon\"\n [type]=\"button.type\"\n [group]=\"button.group\"\n [mini]=\"button.mini\"\n [iconBtn]=\"!button.label\"\n mclass=\"w-auto\"\n (mclick)=\"button.action(row, i + paginator.pageIndex * paginator.pageSize, btn)\"\n #btn />\n </div>\n }\n </div>\n </td>\n </ng-container>\n }\n <!-- EDITABLE -->\n @case ('editable') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n {{ col.t | appTranslate | async }}\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <a\n class=\"cell\"\n [mqueryParams]=\"col.mqueryParams | functionCaller2: row : col.f\"\n [mrouterLink]=\"col.routeFormatter | functionCaller2: row : col.f\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n <i\n (click)=\"col.action ? col.action(row, col.f) : null\"\n class=\"ps-1 pointer fas fa-pencil-alt\"></i>\n </td>\n </ng-container>\n }\n <!-- DEFAULT -->\n @default {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\" [sticky]=\"col.stickyStart\" [stickyEnd]=\"col.stickyEnd||col.sticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear>\n {{ col.t | appTranslate | async }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let rowIndex = index\"\n [matTooltip]=\"\n col.hintFormatter\n ? (col.hintFormatter | functionCaller1: row | async)\n : null\n \">\n <ng-template #cellContent>\n @switch (true) {\n @case (!!col.routeFormatter) {\n @if (extractRoute | functionCaller2: col : row; as cellRoute) {\n <a\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [queryParams]=\"cellRoute.queryParams\"\n routerLink=\"{{ cellRoute.route }}\"\n [innerHTML]=\"\n row | getColFormatted: col | async | valueOrX: '-'\n \"></a>\n }\n }\n @case (!!col.customTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n col.customTemplate;\n context: { $implicit: { row, rowIndex } }\n \" />\n }\n @default {\n <span\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [innerHTML]=\"\n row | getColFormatted: col | async | valueOrX: '-'\n \"></span>\n }\n }\n @if (col.expandable) {\n <button\n matTooltip=\"Exapnd\"\n [matTooltipShowDelay]=\"1000\"\n mat-icon-button\n (click)=\"expandCell(row, col, expandModal)\"\n class=\"expandBtn\">\n <mat-icon [inline]=\"true\">open_in_full</mat-icon>\n </button>\n }\n </ng-template>\n\n @if (col._onHoverFunction) {\n <span\n class=\"\"\n [nelDebug]=\"debug()\"\n [nelMouseEntered]=\"{ action: col._onHoverFunction, argument: row }\"\n [nelDelay]=\"col._onHoverDelay\">\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n </span>\n } @else {\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n }\n </td>\n </ng-container>\n }\n <!--// -->\n }\n }\n <!--// -->\n <!-- EXPANDABLE COLUMN-->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"_expandCol\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- {{expandedElement()|json}} -->\n <div class=\"d-flex justify-content-end\">\n <app-btn\n [iconBtn]=\"true\"\n type=\"clear\"\n [customIcon]=\"\n expandedElement() !== row ? 'fa fa-chevron-down' : 'fa fa-chevron-up'\n \"\n aria-label=\"expand row\"\n loggingValue=\"Expand Row Button {{ row | json }}\"\n (mclick)=\"\n expandedElement.set(expandedElement() === row ? null : row);\n clickedExpandRow.emit({ open: expandedElement() === row, row });\n $event?.stopPropagation()\n \" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- OPTIONS COLUMN -->\n @if (hasRowOptions()) {\n <ng-container matColumnDef=\"option\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef disableClear></th>\n <td mat-cell *matCellDef=\"let row\">\n @if (rowOptionsMap()) {\n @if (formOptionsMap() | functionCaller: row; as _rowoptions) {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of _rowoptions; track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n } @else {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of rowOptions(); track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n </td>\n </ng-container>\n }\n <!--// -->\n\n @if (rawColumns(); as dcols) {\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td\n mat-cell\n *matCellDef=\"let row\"\n [attr.colspan]=\"dcols?.length || 1\"\n [ngClass]=\"{ hideBorder: row != expandedElement() }\">\n <div\n class=\"example-element-detail\"\n [@detailExpand]=\"row == expandedElement() ? 'expanded' : 'collapsed'\">\n @if (row == expandedElement()) {\n <ng-container\n *ngTemplateOutlet=\"\n expandedRowTemplate();\n context: { $implicit: { row } }\n \"></ng-container>\n }\n </div>\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"dcols\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: dcols\"\n [ngClass]=\"{\n pointer: showRowPointer(),\n disabled: isDisabledFunc() ? isDisabledFunc()(row) : false,\n }\"\n [matTooltip]=\"isDisabledFunc() && isDisabledFunc()(row) ? 'Disabled' : null\"\n (click)=\"rowClick(row)\"></tr>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell no-item\" [attr.colspan]=\"dcols?.length || 1\">\n {{ noItemTxt() | appTranslate | async }}\n </td>\n </tr>\n @if (isExpandable()) {\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['expandedDetail']\"\n class=\"expanded-detail-row\"\n [style.height.px]=\"0\"></tr>\n }\n }\n </table>\n </div>\n <mat-paginator\n [length]=\"resultsLength()\"\n [pageSizeOptions]=\"computedPageSizeOptions()\"\n [pageSize]=\"pageSize()\"\n showFirstLastButtons />\n </div>\n </loader>\n </div>\n </div>\n @if (!allowSearch()) {\n <div class=\"not-allowed-search\">{{ searchPromptText() | appTranslateNL | async }}</div>\n }\n</div>\n<modal-comp\n [width]=\"selectedCellForExpansion()?.column?.expandedWidth || '900px'\"\n [header]=\"selectedCellForExpansion()?.column?.t\"\n [showFooter]=\"false\"\n (modalClose)=\"closeExpandedCell()\"\n #expandModal>\n <ng-template modalBody>\n @if (selectedCellForExpansion(); as _selected) {\n <div\n class=\"\"\n [innerHTML]=\"\n _selected.row | getColFormattedE: _selected.column | async | valueOrX: '-'\n \"></div>\n }\n </ng-template>\n</modal-comp>\n", styles: [":host ::ng-deep .table-plain .w-1,:host ::ng-deep .table-https .w-1{width:1%}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail{padding:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder{border-bottom:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail{overflow:hidden;display:flex}:host ::ng-deep .table-plain .mat-cell,:host ::ng-deep .table-https .mat-cell{padding:3px 5px!important}:host ::ng-deep .table-plain .colour,:host ::ng-deep .table-https .colour{height:15px;width:15px;display:inline-block;border-radius:5px}:host ::ng-deep .table-plain .centerCells .mat-sort-header-container,:host ::ng-deep .table-plain .centerCells .mat-mdc-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-mdc-sort-header-container{justify-content:center}:host ::ng-deep .table-plain .default.colour,:host ::ng-deep .table-https .default.colour{background-color:#545454}:host ::ng-deep .table-plain .btn-cell,:host ::ng-deep .table-https .btn-cell{width:1%}:host ::ng-deep .table-plain input[type=checkbox]:not(.form-control),:host ::ng-deep .table-https input[type=checkbox]:not(.form-control){border:1px solid rgba(80,78,245,.3019607843)}:host ::ng-deep .table-plain .mat-header-cell,:host ::ng-deep .table-plain .mat-mdc-header-cell,:host ::ng-deep .table-https .mat-header-cell,:host ::ng-deep .table-https .mat-mdc-header-cell{vertical-align:middle;color:var(--primary);font-style:normal;font-weight:600;font-size:14px;text-align:center}:host ::ng-deep .table-plain .mat-table-sticky-border-elem-left,:host ::ng-deep .table-plain .mat-mdc-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0;background-color:#fff}:host ::ng-deep .table-plain .mat-mdc-table-sticky,:host ::ng-deep .table-https .mat-mdc-table-sticky{background-color:#fff!important}:host ::ng-deep .table-plain .smallerFonts td,:host ::ng-deep .table-plain .smallerFonts th,:host ::ng-deep .table-https .smallerFonts td,:host ::ng-deep .table-https .smallerFonts th{font-size:.7rem}:host ::ng-deep .table-plain .nowrap td,:host ::ng-deep .table-plain .nowrap th,:host ::ng-deep .table-https .nowrap td,:host ::ng-deep .table-https .nowrap th{white-space:nowrap;text-align:left;padding:5px}:host ::ng-deep .table-plain table tr,:host ::ng-deep .table-https table tr{position:relative}:host ::ng-deep .table-plain table tr.mat-mdc-row,:host ::ng-deep .table-plain table tr.mat-mdc-header-row,:host ::ng-deep .table-plain table tr .mat-header-row,:host ::ng-deep .table-https table tr.mat-mdc-row,:host ::ng-deep .table-https table tr.mat-mdc-header-row,:host ::ng-deep .table-https table tr .mat-header-row{height:52px}:host ::ng-deep .table-plain table tr td:hover,:host ::ng-deep .table-https table tr td:hover{color:unset!important;text-decoration:unset;cursor:unset}:host ::ng-deep .table-plain table tr.disabled:after,:host ::ng-deep .table-https table tr.disabled:after{content:\" \";display:block;background-color:#c7c7c726;width:100%;height:100%;position:absolute;top:0;left:0;z-index:11111;cursor:not-allowed}:host ::ng-deep .table-plain .centerCells td,:host ::ng-deep .table-https .centerCells td{text-align:center}:host ::ng-deep .table-plain .curvy tr,:host ::ng-deep .table-https .curvy tr{border-radius:0 10px}:host ::ng-deep .table-plain .inline-block,:host ::ng-deep .table-https .inline-block{display:inline-block}:host ::ng-deep .table-plain td.no-item,:host ::ng-deep .table-https td.no-item{border-bottom:none!important;height:50px}\n"] }]
20699
+ ], template: "<div class=\"table-https\">\n @if (header()) {\n <h6 class=\"text-primary\">\n {{ header() | appTranslate | async }}\n </h6>\n }\n\n <!-- {{queryData()|json}} -->\n <div class=\"\" [hidden]=\"!allowSearch()\">\n <div class=\"row g-3 m-0 row-cols-md-auto justify-content-between align-items-center\">\n <div class=\"ps-0\">\n @if (startSectionTemplate()) {\n <div class=\"{{ starterSectionClass() }}\">\n <ng-container [ngTemplateOutlet]=\"startSectionTemplate()\" />\n </div>\n }\n </div>\n <div class=\"pe-0\">\n <div class=\"row g-3 row-cols-lg-auto align-items-center justify-content-between\">\n <div class=\"col-auto\">\n @if (showExport()) {\n <app-export-table\n [disabled]=\"!resultsLength()\"\n [label]=\"label()\"\n [debug]=\"debug()\"\n [searchQuery]=\"allQueryData() | toAny\"\n [searchFunc]=\"observableFunc()\"\n [displayedColumns]=\"computedDisplayedColumns()\"></app-export-table>\n }\n </div>\n @if (showAdditionalColumns()) {\n <div class=\"col-auto\">\n <fields-to-display\n [fields]=\"allTableColumns()\"\n [currentColumns]=\"computedDisplayedColumns()\"\n (fieldsChanged)=\"fieldsChanged($event)\" />\n </div>\n }\n @if (showRefreshBtn()) {\n <div class=\"col-auto\">\n <app-btn icon=\"refresh\" [iconBtn]=\"true\" (mclick)=\"refresh()\" />\n </div>\n }\n </div>\n </div>\n </div>\n <div\n class=\"mt-2 overflow-auto {{ tableContainerClass() }} table-container rounded-10\"\n [ngClass]=\"{ border: distinct() }\">\n <loader\n [loading]=\"isLoadingResults()\"\n [useStaticLoader]=\"useStaticLoader()\"\n [height]=\"container?.scrollHeight + 400\">\n <div #container>\n <div class=\"table-responsive\">\n <table\n mat-table\n [dataSource]=\"filteredAndPagedResults()\"\n class=\"w-100 d-table table\"\n [multiTemplateDataRows]=\"isExpandable()\"\n [ngClass]=\"{\n smallerFonts: smallerFonts(),\n nowrap: nowrap(),\n centerCells: centerCells(),\n curvy: curvy(),\n 'table-striped': striped(),\n }\"\n matSort\n matSortActive=\"{{ orderField() | toAny }}\"\n matSortDisableClear\n [matSortDirection]=\"orderDirection()\"\n #table\n (matSortChange)=\"resetPaging()\">\n <!-- Checkbox Column -->\n <ng-container\n matColumnDef=\"mselect\"\n [sticky]=\"!placeSelectionAtRight()\"\n [stickyEnd]=\"placeSelectionAtRight()\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [aria-label]=\"checkboxLabel()\"></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"checkboxLabel(row)\"></mat-checkbox>\n </td>\n </ng-container>\n <!-- COLUMNS -->\n @for (col of computedDisplayedColumns(); track col.f; let i = $index) {\n @switch (col.type) {\n <!-- CHECKBOX -->\n @case ('checkbox') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-ngmodel\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"checkbox\"\n [disabled]=\"col.disabled\"\n [checked]=\"col.checked\"\n [(model)]=\"row[col.f]\"\n (mchange)=\"outputCheckbox(col.f, row, $event)\"></app-input-ngmodel>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Sub Table -->\n @case ('table') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n {{ col.t | appTranslate | async }}\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <app-btn\n [icon]=\"col.icon\"\n type=\"dark\"\n (mclick)=\"col.action ? col.action(row, col.f) : null\"\n [help]=\"col.subTable | tableToString: row | async\"\n [showHelpIcon]=\"false\"\n [iconBtn]=\"true\"\n mclass=\"w-auto\" />\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- COLOR -->\n @case ('color') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"square-2\" [style]=\"'background-color:' + row[col.f]\"></div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Button -->\n @case ('button') {\n <ng-container [sticky]=\"col.stickyStart\" [stickyEnd]=\"col.stickyEnd||col.sticky\" matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index\" class=\"btn-cell\">\n <app-btn\n [icon]=\"col.icon || col.btn?.icon\"\n [type]=\"col.btn?.type\"\n (mclick)=\"\n col.action\n ? col.action(row, col.f, getActionStatusCallback(col), index)\n : null\n \"\n [help]=\"col.btn?.help\"\n [showHelpIcon]=\"col.btn?.showHelpIcon\"\n [text]=\"col.btn?.label\"\n [mini]=\"col.btn?.mini\"\n [loading]=\"col.btn?.loading\"\n [iconBtn]=\"col.btn?.iconBtn\"\n mclass=\"w-auto\"\n [disabled]=\"col.btn?.disabled || col.btn?.loading\" />\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- ACTION/BTNS COLUMNS -->\n @case ('btns') {\n <ng-container\n matColumnDef=\"{{ col.f | toAny }}\"\n [stickyEnd]=\"true\"\n [sticky]=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"btn-cell text-center\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"btn-cell\">\n <div class=\"d-flex col-md-auto col-sm-auto\">\n @for (button of col.buttons; track button.icon + button.label) {\n <div class=\"mx-2\">\n <app-btn\n [icon]=\"button.icon\"\n [text]=\"button.label\"\n [help]=\"button.help\"\n [showHelpIcon]=\"button.showHelpIcon\"\n [type]=\"button.type\"\n [group]=\"button.group\"\n [mini]=\"button.mini\"\n [iconBtn]=\"!button.label\"\n mclass=\"w-auto\"\n (mclick)=\"button.action(row, i + paginator.pageIndex * paginator.pageSize, btn)\"\n #btn />\n </div>\n }\n </div>\n </td>\n </ng-container>\n }\n <!-- EDITABLE -->\n @case ('editable') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n {{ col.t | appTranslate | async }}\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <a\n class=\"cell\"\n [mqueryParams]=\"col.mqueryParams | functionCaller2: row : col.f\"\n [mrouterLink]=\"col.routeFormatter | functionCaller2: row : col.f\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n <i\n (click)=\"col.action ? col.action(row, col.f) : null\"\n class=\"ps-1 pointer fas fa-pencil-alt\"></i>\n </td>\n </ng-container>\n }\n <!-- DEFAULT -->\n @default {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\" [sticky]=\"col.stickyStart\" [stickyEnd]=\"col.stickyEnd||col.sticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear>\n {{ col.t | appTranslate | async }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let rowIndex = index\"\n [matTooltip]=\"\n col.hintFormatter\n ? (col.hintFormatter | functionCaller1: row | async)\n : null\n \">\n <ng-template #cellContent>\n @switch (true) {\n @case (!!col.routeFormatter) {\n @if (extractRoute | functionCaller2: col : row; as cellRoute) {\n <a\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [queryParams]=\"cellRoute.queryParams\"\n routerLink=\"{{ cellRoute.route }}\"\n [innerHTML]=\"\n row | getColFormatted: col | async | valueOrX: '-'\n \"></a>\n }\n }\n @case (!!col.customTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n col.customTemplate;\n context: { $implicit: { row, rowIndex } }\n \" />\n }\n @default {\n <span\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [innerHTML]=\"\n row | getColFormatted: col | async | valueOrX: '-'\n \"></span>\n }\n }\n @if (col.expandable) {\n <button\n matTooltip=\"Exapnd\"\n [matTooltipShowDelay]=\"1000\"\n mat-icon-button\n (click)=\"expandCell(row, col, expandModal)\"\n class=\"expandBtn\">\n <mat-icon [inline]=\"true\">open_in_full</mat-icon>\n </button>\n }\n </ng-template>\n\n @if (col._onHoverFunction) {\n <span\n class=\"\"\n [nelDebug]=\"debug()\"\n [nelMouseEntered]=\"{ action: col._onHoverFunction, argument: row }\"\n [nelDelay]=\"col._onHoverDelay\">\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n </span>\n } @else {\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n }\n </td>\n </ng-container>\n }\n <!--// -->\n }\n }\n <!--// -->\n <!-- EXPANDABLE COLUMN-->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"_expandCol\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- {{expandedElement()|json}} -->\n <div class=\"d-flex justify-content-end\">\n <app-btn\n [iconBtn]=\"true\"\n type=\"clear\"\n [customIcon]=\"\n expandedElement() !== row ? 'fa fa-chevron-down' : 'fa fa-chevron-up'\n \"\n aria-label=\"expand row\"\n loggingValue=\"Expand Row Button {{ row | json }}\"\n (mclick)=\"\n expandedElement.set(expandedElement() === row ? null : row);\n clickedExpandRow.emit({ open: expandedElement() === row, row });\n $event?.stopPropagation()\n \" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- OPTIONS COLUMN -->\n @if (hasRowOptions()) {\n <ng-container matColumnDef=\"option\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef disableClear></th>\n <td mat-cell *matCellDef=\"let row\">\n @if (rowOptionsMap()) {\n @if (formOptionsMap() | functionCaller: row; as _rowoptions) {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of _rowoptions; track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n } @else {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of rowOptions(); track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n </td>\n </ng-container>\n }\n <!--// -->\n\n @if (rawColumns(); as dcols) {\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td\n mat-cell\n *matCellDef=\"let row\"\n [attr.colspan]=\"dcols?.length || 1\"\n [ngClass]=\"{ hideBorder: row != expandedElement() }\">\n <div\n class=\"example-element-detail\"\n [@detailExpand]=\"row == expandedElement() ? 'expanded' : 'collapsed'\">\n @if (row == expandedElement()) {\n <ng-container\n *ngTemplateOutlet=\"\n expandedRowTemplate();\n context: { $implicit: { row } }\n \"></ng-container>\n }\n </div>\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"dcols\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: dcols\"\n [ngClass]=\"{\n pointer: enableRowClick(),\n disabled: isDisabledFunc() ? isDisabledFunc()(row) : false,\n }\"\n [matTooltip]=\"isDisabledFunc() && isDisabledFunc()(row) ? 'Disabled' : null\"\n (click)=\"rowClick(row)\"></tr>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell no-item\" [attr.colspan]=\"dcols?.length || 1\">\n {{ noItemTxt() | appTranslate | async }}\n </td>\n </tr>\n @if (isExpandable()) {\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['expandedDetail']\"\n class=\"expanded-detail-row\"\n [style.height.px]=\"0\"></tr>\n }\n }\n </table>\n </div>\n <mat-paginator\n [length]=\"resultsLength()\"\n [pageSizeOptions]=\"computedPageSizeOptions()\"\n [pageSize]=\"pageSize()\"\n showFirstLastButtons />\n </div>\n </loader>\n </div>\n </div>\n @if (!allowSearch()) {\n <div class=\"not-allowed-search\">{{ searchPromptText() | appTranslateNL | async }}</div>\n }\n</div>\n<modal-comp\n [width]=\"selectedCellForExpansion()?.column?.expandedWidth || '900px'\"\n [header]=\"selectedCellForExpansion()?.column?.t\"\n [showFooter]=\"false\"\n (modalClose)=\"closeExpandedCell()\"\n #expandModal>\n <ng-template modalBody>\n @if (selectedCellForExpansion(); as _selected) {\n <div\n class=\"\"\n [innerHTML]=\"\n _selected.row | getColFormattedE: _selected.column | async | valueOrX: '-'\n \"></div>\n }\n </ng-template>\n</modal-comp>\n", styles: [":host ::ng-deep .table-plain .w-1,:host ::ng-deep .table-https .w-1{width:1%}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail{padding:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder{border-bottom:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail{overflow:hidden;display:flex}:host ::ng-deep .table-plain .mat-cell,:host ::ng-deep .table-https .mat-cell{padding:3px 5px!important}:host ::ng-deep .table-plain .colour,:host ::ng-deep .table-https .colour{height:15px;width:15px;display:inline-block;border-radius:5px}:host ::ng-deep .table-plain .centerCells .mat-sort-header-container,:host ::ng-deep .table-plain .centerCells .mat-mdc-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-mdc-sort-header-container{justify-content:center}:host ::ng-deep .table-plain .default.colour,:host ::ng-deep .table-https .default.colour{background-color:#545454}:host ::ng-deep .table-plain .btn-cell,:host ::ng-deep .table-https .btn-cell{width:1%}:host ::ng-deep .table-plain input[type=checkbox]:not(.form-control),:host ::ng-deep .table-https input[type=checkbox]:not(.form-control){border:1px solid rgba(80,78,245,.3019607843)}:host ::ng-deep .table-plain .mat-header-cell,:host ::ng-deep .table-plain .mat-mdc-header-cell,:host ::ng-deep .table-https .mat-header-cell,:host ::ng-deep .table-https .mat-mdc-header-cell{vertical-align:middle;color:var(--primary);font-style:normal;font-weight:600;font-size:14px;text-align:center}:host ::ng-deep .table-plain .mat-table-sticky-border-elem-left,:host ::ng-deep .table-plain .mat-mdc-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0;background-color:#fff}:host ::ng-deep .table-plain .mat-mdc-table-sticky,:host ::ng-deep .table-https .mat-mdc-table-sticky{background-color:#fff!important}:host ::ng-deep .table-plain .smallerFonts td,:host ::ng-deep .table-plain .smallerFonts th,:host ::ng-deep .table-https .smallerFonts td,:host ::ng-deep .table-https .smallerFonts th{font-size:.7rem}:host ::ng-deep .table-plain .nowrap td,:host ::ng-deep .table-plain .nowrap th,:host ::ng-deep .table-https .nowrap td,:host ::ng-deep .table-https .nowrap th{white-space:nowrap;text-align:left;padding:5px}:host ::ng-deep .table-plain table tr,:host ::ng-deep .table-https table tr{position:relative}:host ::ng-deep .table-plain table tr.mat-mdc-row,:host ::ng-deep .table-plain table tr.mat-mdc-header-row,:host ::ng-deep .table-plain table tr .mat-header-row,:host ::ng-deep .table-https table tr.mat-mdc-row,:host ::ng-deep .table-https table tr.mat-mdc-header-row,:host ::ng-deep .table-https table tr .mat-header-row{height:52px}:host ::ng-deep .table-plain table tr td:hover,:host ::ng-deep .table-https table tr td:hover{color:unset!important;text-decoration:unset;cursor:unset}:host ::ng-deep .table-plain table tr.disabled:after,:host ::ng-deep .table-https table tr.disabled:after{content:\" \";display:block;background-color:#c7c7c726;width:100%;height:100%;position:absolute;top:0;left:0;z-index:11111;cursor:not-allowed}:host ::ng-deep .table-plain .centerCells td,:host ::ng-deep .table-https .centerCells td{text-align:center}:host ::ng-deep .table-plain .curvy tr,:host ::ng-deep .table-https .curvy tr{border-radius:0 10px}:host ::ng-deep .table-plain .inline-block,:host ::ng-deep .table-https .inline-block{display:inline-block}:host ::ng-deep .table-plain td.no-item,:host ::ng-deep .table-https td.no-item{border-bottom:none!important;height:50px}\n"] }]
20696
20700
  }], propDecorators: { pageNumber: [{
20697
20701
  type: Input
20698
20702
  }] } });
@@ -21422,7 +21426,7 @@ class TablePlainComponent extends TableBaseComponent {
21422
21426
  this.filterChange.emit(e);
21423
21427
  }
21424
21428
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: TablePlainComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
21425
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.2", type: TablePlainComponent, isStandalone: true, selector: "table-plain", inputs: { customSelectClass: { classPropertyName: "customSelectClass", publicName: "customSelectClass", isSignal: true, isRequired: false, transformFunction: null }, idField: { classPropertyName: "idField", publicName: "idField", isSignal: true, isRequired: false, transformFunction: null }, obsDataSource: { classPropertyName: "obsDataSource", publicName: "obsDataSource", isSignal: true, isRequired: false, transformFunction: null }, showFilter: { classPropertyName: "showFilter", publicName: "showFilter", isSignal: true, isRequired: false, transformFunction: null }, showPager: { classPropertyName: "showPager", publicName: "showPager", isSignal: true, isRequired: false, transformFunction: null }, disableSelectionByField: { classPropertyName: "disableSelectionByField", publicName: "disableSelectionByField", isSignal: false, isRequired: false, transformFunction: null }, filterExactMatch: { classPropertyName: "filterExactMatch", publicName: "filterExactMatch", isSignal: true, isRequired: false, transformFunction: null }, _data: { classPropertyName: "_data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, _filterFields: { classPropertyName: "_filterFields", publicName: "filterFields", isSignal: false, isRequired: false, transformFunction: null }, _filterFieldsMap: { classPropertyName: "_filterFieldsMap", publicName: "filterFieldsMap", isSignal: false, isRequired: false, transformFunction: null }, selectionPerPage: { classPropertyName: "selectionPerPage", publicName: "selectionPerPage", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { _view: "view", dataChanged: "dataChanged", filterChange: "filterChange", listMutated: "listMutated" }, usesInheritance: true, ngImport: i0, template: "<div class=\"table-plain\">\n @if (header()) {\n <h6 class=\"text-primary\">\n {{ header() | appTranslate | async }}\n </h6>\n }\n\n @if (filterFields()) {\n <div class=\"d-flex\">\n <app-btn\n text=\"{{ filterCont.hidden ? 'Show Filter' : 'Hide Filter' }}\"\n [icon]=\"filterCont.hidden ? 'search' : 'close'\"\n (mclick)=\"filterCont.hidden = !filterCont.hidden\" />\n </div>\n <div class=\"row align-items-center mt-2\" [hidden]=\"true\" #filterCont>\n @for (scheme of filterFields(); track scheme.field) {\n <div class=\"col-md-4 col-xxl-3\">\n @switch (scheme.type) {\n @case ('autocomplete') {\n <div class=\"col\">\n <app-autocomplete\n [form]=\"filterForm\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [labelType]=\"scheme.labelType | toAny\"\n [name]=\"scheme.field | toAny\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [hint]=\"scheme.hint\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n #inputTag\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\" />\n <app-validation-message [input]=\"inputTag\" />\n </div>\n }\n @default {\n <app-input-basic\n #formField\n [name]=\"scheme.field | toAny\"\n [form]=\"filterForm\"\n [stacked]=\"true\"\n [type]=\"scheme.type\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [labelField]=\"scheme.labelField\"\n [noFormat]=\"true\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\" />\n <app-validation-message [input]=\"formField\" />\n }\n }\n </div>\n }\n <div class=\"col-md justify-content-end d-flex\">\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilter()\" />\n </div>\n </div>\n }\n\n @if (startSectionTemplate() || showFilter() || showExport() || showAdditionalColumns()) {\n <div class=\" \">\n <div class=\"row g-3 justify-content-between align-items-end\">\n <div class=\"col-md\">\n @if (startSectionTemplate()) {\n <div class=\"{{ starterSectionClass() }}\">\n <ng-container [ngTemplateOutlet]=\"startSectionTemplate()\" />\n </div>\n }\n @if (showFilter()) {\n <form [formGroup]=\"filterForm\">\n <div class=\"row justify-content-center align-items-end\">\n <div class=\"col-md-auto\">\n <app-autocomplete\n label=\"Filter\"\n type=\"select\"\n [form]=\"filterForm\"\n name=\"field\"\n [stacked]=\"false\"\n [options]=\"filterOptions()\"\n valueField=\"code\"\n labelField=\"description\" />\n </div>\n <div class=\"col-md-auto\">\n <app-input-basic\n label=\"Value\"\n type=\"text\"\n [form]=\"filterForm\"\n name=\"value\"\n [stacked]=\"false\" />\n </div>\n <div class=\"col-md-auto\">\n <app-btn text=\"Clear\" type=\"secondary\" (mclick)=\"clearFilter()\" />\n </div>\n </div>\n </form>\n }\n </div>\n @if (showExport() || showAdditionalColumns()) {\n <div class=\"col-md-auto\">\n <div class=\"row row-cols-auto g-3 justify-content-end\">\n <span>\n @if (showExport()) {\n <app-export-table\n [disabled]=\"!dataSource()?.data?.length\"\n [label]=\"label()\"\n [debug]=\"debug()\"\n [displayedColumns]=\"computedDisplayedColumns()\"\n [data]=\"dataSource()?.data\" />\n }\n </span>\n @if (showAdditionalColumns()) {\n <div class=\"d-flex\">\n <fields-to-display\n [fields]=\"allTableColumns()\"\n [currentColumns]=\"computedDisplayedColumns()\"\n (fieldsChanged)=\"fieldsChanged($event)\" />\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <div\n [ngClass]=\"{ border: distinct() }\"\n class=\"mt-2 rounded-10 overflow-auto table-container {{ tableContainerClass() }} \">\n <div class=\"table-responsive\">\n <table\n mat-table\n [dataSource]=\"dataSource() || obsDataSource()\"\n matSort\n class=\"w-100 d-table table mb-0\"\n [multiTemplateDataRows]=\"isExpandable()\"\n #table\n [ngClass]=\"{\n smallerFonts: smallerFonts(),\n nowrap: nowrap(),\n centerCells: centerCells(),\n curvy: curvy(),\n 'table-striped': striped(),\n }\">\n <!-- Checkbox Column -->\n <ng-container\n matColumnDef=\"mselect\"\n [sticky]=\"!placeSelectionAtRight()\"\n [stickyEnd]=\"placeSelectionAtRight()\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n @if (customSelectClass()) {\n <input\n type=\"checkbox\"\n [class]=\"customSelectClass()\"\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [attr.aria-label]=\"checkboxLabel()\" />\n }\n @if (!customSelectClass()) {\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [aria-label]=\"checkboxLabel()\"></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n @if (customSelectClass()) {\n <input\n type=\"checkbox\"\n class=\"form-control control-bg-gray\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"checkboxLabel(row)\" />\n }\n @if (!customSelectClass()) {\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"checkboxLabel(row)\"\n [disabled]=\"this.disableSelectionByField | functionCaller1: row\"></mat-checkbox>\n }\n </td>\n </ng-container>\n <!-- Columns -->\n @for (col of computedDisplayedColumns(); track col.f; let i = $index) {\n <ng-template #thContent>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </ng-template>\n\n @switch (col.type) {\n <!-- CHECKBOX -->\n @case ('textarea') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- <app-input-td-rf [(model)]=\"col.\" [showLabel]=\"false\" /> -->\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- CHECKBOX -->\n @case ('checkbox') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-ngmodel\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"checkbox\"\n [disabled]=\"col.disabled\"\n [checked]=\"col.checked\"\n [(model)]=\"row[col.f]\"\n (mchange)=\"outputCheckbox(col.f, row, $event)\"></app-input-ngmodel>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Input -->\n @case ('input') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-basic\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"text\"\n [disabled]=\"col.disabled\"\n [form]=\"row\"\n [name]=\"col.f\"\n [noFormat]=\"true\" />\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- PROGRESS BAR -->\n @case ('progress') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"progress\">\n <div\n class=\"progress-bar progress-bar-striped bg-success\"\n role=\"progressbar\"\n [ngStyle]=\"{ width: row[col.f] }\">\n {{ row[col.f] }}\n </div>\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- COLOR -->\n @case ('color') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"square-2\" [style]=\"'background-color:' + row[col.f]\"></div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Button -->\n @case ('button') {\n <ng-container\n [sticky]=\"col.stickyStart\"\n [stickyEnd]=\"col.stickyEnd || col.sticky\"\n matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index\" class=\"btn-cell\">\n <app-btn\n [icon]=\"col.icon || col.btn?.icon\"\n [type]=\"col.btn?.type\"\n (mclick)=\"\n col.action\n ? col.action(row, col.f, getActionStatusCallback(col), index)\n : null\n \"\n [help]=\"col.btn?.help\"\n [showHelpIcon]=\"col.btn?.showHelpIcon\"\n [text]=\"col.btn?.label\"\n [loading]=\"col.btn?.loading\"\n [iconBtn]=\"col.btn?.iconBtn\"\n mclass=\"w-auto\"\n [disabled]=\"col.btn?.disabled || col.btn?.loading\" />\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Sub Table -->\n @case ('table') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell class=\"text-center\" *matCellDef=\"let row\">\n <div class=\"inline-block\">\n <app-btn\n [icon]=\"col.icon\"\n [type]=\"col.btn?.type || 'dark'\"\n (mclick)=\"col.action ? col.action(row, col.f) : null\"\n [group]=\"col.btn?.group\"\n [help]=\"col.subTable | tableToString: row | async\"\n [showHelpIcon]=\"false\"\n [text]=\"col.btn?.label\"\n [iconBtn]=\"true\"\n mclass=\"w-auto\" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- ACTION COLUMNS -->\n @case ('btns') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\" [stickyEnd]=\"true\" [sticky]=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"btn-cell text-center\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"btn-cell\">\n <div class=\"d-flex col-md-auto col-sm-auto justify-content-center\">\n @for (button of col.buttons; track button.icon + button.label) {\n <div class=\"mx-2\">\n <app-btn\n [icon]=\"button.icon\"\n [text]=\"button.label\"\n [help]=\"button.help\"\n [showHelpIcon]=\"button.showHelpIcon\"\n [type]=\"button.type\"\n [group]=\"button.group\"\n [iconBtn]=\"!button.label\"\n mclass=\"w-auto\"\n (mclick)=\"\n button.action(\n row,\n i + (paginator ? paginator.pageIndex * paginator.pageSize : 0),\n btn\n )\n \"\n #btn />\n </div>\n }\n </div>\n </td>\n </ng-container>\n }\n\n <!-- EDITABLE -->\n @case ('editable') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <a\n class=\"cell\"\n [mqueryParams]=\"col.mqueryParams | functionCaller2: row : col.f\"\n [mrouterLink]=\"col.routeFormatter | functionCaller2: row : col.f\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n <i\n (click)=\"col.action ? col.action(row, col.f) : null\"\n class=\"ps-1 pointer fas fa-pencil-alt\"></i>\n </td>\n </ng-container>\n }\n\n <!-- DEFAULT -->\n @default {\n <ng-container\n [sticky]=\"col.stickyStart\"\n [stickyEnd]=\"col.stickyEnd || col.sticky\"\n matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let rowIndex = index\"\n [matTooltip]=\"\n col.hintFormatter ? (col.hintFormatter | functionCaller1: row | async) : null\n \">\n <ng-template #cellContent>\n @switch (true) {\n @case (!!col.routeFormatter) {\n @if (extractRoute | functionCaller2: col : row; as cellRoute) {\n <a\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [queryParams]=\"cellRoute.queryParams\"\n routerLink=\"{{ cellRoute.route }}\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n }\n }\n @case (!!col.customTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n col.customTemplate;\n context: { $implicit: { row, rowIndex } }\n \" />\n }\n @default {\n <span\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></span>\n }\n }\n @if (col.expandable) {\n <button\n matTooltip=\"Exapnd\"\n [matTooltipShowDelay]=\"1000\"\n mat-icon-button\n (click)=\"expandCell(row, col, expandModal)\"\n class=\"expandBtn\">\n <mat-icon [inline]=\"true\">open_in_full</mat-icon>\n </button>\n }\n </ng-template>\n\n @if (col._onHoverFunction) {\n <span\n class=\"\"\n [nelDebug]=\"debug()\"\n [nelMouseEntered]=\"{ action: col._onHoverFunction, argument: row }\"\n [nelDelay]=\"col._onHoverDelay\">\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n </span>\n } @else {\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n }\n </td>\n </ng-container>\n }\n\n <!--// -->\n }\n }\n <!-- EXPANDABLE COLUMN-->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"_expandCol\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"d-flex justify-content-end\">\n <app-btn\n [iconBtn]=\"true\"\n type=\"clear\"\n [customIcon]=\"\n expandedElement() !== row ? 'fa fa-chevron-down' : 'fa fa-chevron-up'\n \"\n aria-label=\"expand row\"\n (mclick)=\"\n expandedElement.set(expandedElement() === row ? null : row);\n clickedExpandRow.emit({ open: expandedElement() === row, row });\n $event.stopPropagation()\n \" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Options Column -->\n @if (hasRowOptions()) {\n <ng-container matColumnDef=\"option\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef disableClear></th>\n <td mat-cell *matCellDef=\"let row\">\n @if (rowOptionsMap()) {\n @if (formOptionsMap() | functionCaller: row; as _rowoptions) {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of _rowoptions; track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n } @else {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of rowOptions(); track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n </td>\n </ng-container>\n }\n\n @if (rawColumns(); as dcols) {\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td\n mat-cell\n *matCellDef=\"let row\"\n [attr.colspan]=\"dcols?.length || 1\"\n [ngClass]=\"{ hideBorder: row != expandedElement() }\">\n <div\n class=\"example-element-detail\"\n [@detailExpand]=\"row == expandedElement() ? 'expanded' : 'collapsed'\">\n @if (row == expandedElement()) {\n <ng-container\n *ngTemplateOutlet=\"\n expandedRowTemplate();\n context: { $implicit: { row } }\n \"></ng-container>\n }\n </div>\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"dcols\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: dcols\"\n [ngClass]=\"{\n pointer: showRowPointer(),\n disabled: isDisabledFunc() ? isDisabledFunc()(row) : false,\n }\"\n [matTooltip]=\"isDisabledFunc() && isDisabledFunc()(row) ? 'Disabled' : null\"\n (click)=\"rowClick(row)\"></tr>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell no-item\" [attr.colspan]=\"dcols?.length || 1\">\n {{ noItemTxt() | appTranslate | async }}\n </td>\n </tr>\n @if (isExpandable()) {\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['expandedDetail']\"\n class=\"expanded-detail-row\"\n [style.height.px]=\"0\"></tr>\n }\n }\n </table>\n </div>\n @if (showPager()) {\n <mat-paginator\n [length]=\"resultsLength()\"\n [pageSizeOptions]=\"computedPageSizeOptions()\"\n [pageSize]=\"pageSize()\"\n showFirstLastButtons></mat-paginator>\n }\n </div>\n</div>\n\n<modal-comp\n [width]=\"selectedCellForExpansion()?.column?.expandedWidth || '900px'\"\n [header]=\"selectedCellForExpansion()?.column?.t\"\n [showFooter]=\"false\"\n (modalClose)=\"closeExpandedCell()\"\n #expandModal>\n <ng-template modalBody>\n @if (selectedCellForExpansion(); as _selected) {\n <div\n class=\"\"\n [innerHTML]=\"\n _selected.row | getColFormattedE: _selected.column | async | valueOrX: '-'\n \"></div>\n }\n </ng-template>\n</modal-comp>\n", styles: [":host ::ng-deep .table-plain .w-1,:host ::ng-deep .table-https .w-1{width:1%}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail{padding:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder{border-bottom:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail{overflow:hidden;display:flex}:host ::ng-deep .table-plain .mat-cell,:host ::ng-deep .table-https .mat-cell{padding:3px 5px!important}:host ::ng-deep .table-plain .colour,:host ::ng-deep .table-https .colour{height:15px;width:15px;display:inline-block;border-radius:5px}:host ::ng-deep .table-plain .centerCells .mat-sort-header-container,:host ::ng-deep .table-plain .centerCells .mat-mdc-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-mdc-sort-header-container{justify-content:center}:host ::ng-deep .table-plain .default.colour,:host ::ng-deep .table-https .default.colour{background-color:#545454}:host ::ng-deep .table-plain .btn-cell,:host ::ng-deep .table-https .btn-cell{width:1%}:host ::ng-deep .table-plain input[type=checkbox]:not(.form-control),:host ::ng-deep .table-https input[type=checkbox]:not(.form-control){border:1px solid rgba(80,78,245,.3019607843)}:host ::ng-deep .table-plain .mat-header-cell,:host ::ng-deep .table-plain .mat-mdc-header-cell,:host ::ng-deep .table-https .mat-header-cell,:host ::ng-deep .table-https .mat-mdc-header-cell{vertical-align:middle;color:var(--primary);font-style:normal;font-weight:600;font-size:14px;text-align:center}:host ::ng-deep .table-plain .mat-table-sticky-border-elem-left,:host ::ng-deep .table-plain .mat-mdc-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0;background-color:#fff}:host ::ng-deep .table-plain .mat-mdc-table-sticky,:host ::ng-deep .table-https .mat-mdc-table-sticky{background-color:#fff!important}:host ::ng-deep .table-plain .smallerFonts td,:host ::ng-deep .table-plain .smallerFonts th,:host ::ng-deep .table-https .smallerFonts td,:host ::ng-deep .table-https .smallerFonts th{font-size:.7rem}:host ::ng-deep .table-plain .nowrap td,:host ::ng-deep .table-plain .nowrap th,:host ::ng-deep .table-https .nowrap td,:host ::ng-deep .table-https .nowrap th{white-space:nowrap;text-align:left;padding:5px}:host ::ng-deep .table-plain table tr,:host ::ng-deep .table-https table tr{position:relative}:host ::ng-deep .table-plain table tr.mat-mdc-row,:host ::ng-deep .table-plain table tr.mat-mdc-header-row,:host ::ng-deep .table-plain table tr .mat-header-row,:host ::ng-deep .table-https table tr.mat-mdc-row,:host ::ng-deep .table-https table tr.mat-mdc-header-row,:host ::ng-deep .table-https table tr .mat-header-row{height:52px}:host ::ng-deep .table-plain table tr td:hover,:host ::ng-deep .table-https table tr td:hover{color:unset!important;text-decoration:unset;cursor:unset}:host ::ng-deep .table-plain table tr.disabled:after,:host ::ng-deep .table-https table tr.disabled:after{content:\" \";display:block;background-color:#c7c7c726;width:100%;height:100%;position:absolute;top:0;left:0;z-index:11111;cursor:not-allowed}:host ::ng-deep .table-plain .centerCells td,:host ::ng-deep .table-https .centerCells td{text-align:center}:host ::ng-deep .table-plain .curvy tr,:host ::ng-deep .table-https .curvy tr{border-radius:0 10px}:host ::ng-deep .table-plain .inline-block,:host ::ng-deep .table-https .inline-block{display:inline-block}:host ::ng-deep .table-plain td.no-item,:host ::ng-deep .table-https td.no-item{border-bottom:none!important;height:50px}\n"], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "app-autocomplete,autocomplete", inputs: ["showRequiredTag", "validate", "skipDoesOptionExistCheck", "options"], outputs: ["skipDoesOptionExistCheckChange"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "verbose", "translatorOptions", "loading", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "form", "forms", "help", "helpShowDelay", "iconBtn", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid", "disabled"], outputs: ["loadingChange", "leftCustomIconChange", "mclick", "disabledChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ExportTableComponent, selector: "app-export-table", inputs: ["data", "displayedColumns", "searchFunc", "searchQuery", "label", "debug", "disabled"] }, { kind: "component", type: FieldsToDisplayComponent, selector: "fields-to-display", inputs: ["query1", "query2", "fields", "currentColumns"], outputs: ["query1Change", "query2Change", "fieldsChanged"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: InfoIconComponent, selector: "app-info-icon", inputs: ["text", "coloured", "left", "right"] }, { kind: "component", type: InputBasicComponent, selector: "app-input-basic,app-input", inputs: ["accept", "autocomplete", "input", "contextData", "decimalPoints", "files", "hide", "clearOnDisable", "labelLink", "loading", "multiple", "optionsFunc", "vms", "setCurrentDate", "options"], outputs: ["loadingChange", "mSelectedOptionLabel"] }, { kind: "directive", type: InputFormatDirective, selector: "input:not([matInput]):not([noformat])", inputs: ["value"] }, { kind: "component", type: ModalComponent, selector: "modal-comp", inputs: ["header", "bodyTemplateRef", "footerTemplateRef", "showHeader", "loading", "isFullscreen", "showFooter", "width", "minWidth", "height", "maxHeight", "icon", "data", "disableClose", "hasBackdrop", "baseConfig"], outputs: ["headerChange", "showHeaderChange", "mouseLeft", "loadingChange", "showFooterChange", "modalOpen", "modalClose"] }, { kind: "directive", type: ModalBodyDirective, selector: "[modalBody]" }, { kind: "component", type: InputNGModelComponent, selector: "app-input-ngmodel", inputs: ["mvalue", "cls", "colored", "disabled", "hide", "hint", "id", "inpCl", "label", "lblCl", "lblPosition", "mini", "light", "name", "model", "optionFormatter", "options", "checked", "contextData", "decimalPoints", "labelField", "max", "min", "placeholder", "prefix", "readonly", "required", "showEmptyOption", "showLabel", "showValidation", "showValidationIcon", "small", "stacked", "suffix", "theme", "type", "valueField", "labelType", "xsmall"], outputs: ["modelChange", "mchange"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i2$5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3$1.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: i3$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3$1.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: MatButtonModule }, { kind: "component", type: i2$4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i1$6.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i5.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i5.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i10$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i10$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i10$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i10$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i10$1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i10$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i10$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i10$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i10$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i10$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i10$1.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: MouseEnterListenerDirective, selector: "[nelMouseEntered]", inputs: ["nelMouseEntered"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: MrouterLinkirective, selector: "[mrouterLink]", inputs: ["mrouterLink", "mrouterLinkActivatedRoute", "mqueryParams", "isPhone", "isEmail"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TablePipesModule }, { kind: "component", type: ValidationMessageComponent, selector: "app-validation-message", inputs: ["maxLength", "minLength", "control", "customMessage", "debug", "applyMargin", "ignoreDirtiness", "input", "label", "hideOverflow"], outputs: ["labelChange"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: FunctionCaller1, name: "functionCaller1" }, { kind: "pipe", type: FunctionCaller2, name: "functionCaller2" }, { kind: "pipe", type: GetColFormattedPipe, name: "getColFormatted" }, { kind: "pipe", type: GetColFormattedEPipe, name: "getColFormattedE" }, { kind: "pipe", type: TableToStringPipe, name: "tableToString" }, { kind: "pipe", type: ToAnyPipe, name: "toAny" }, { kind: "pipe", type: SDKTranslatePipe, name: "appTranslate" }, { kind: "pipe", type: ValueOrXPipe, name: "valueOrX" }, { kind: "pipe", type: FunctionCaller, name: "functionCaller" }], animations: [
21429
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.2", type: TablePlainComponent, isStandalone: true, selector: "table-plain", inputs: { customSelectClass: { classPropertyName: "customSelectClass", publicName: "customSelectClass", isSignal: true, isRequired: false, transformFunction: null }, idField: { classPropertyName: "idField", publicName: "idField", isSignal: true, isRequired: false, transformFunction: null }, obsDataSource: { classPropertyName: "obsDataSource", publicName: "obsDataSource", isSignal: true, isRequired: false, transformFunction: null }, showFilter: { classPropertyName: "showFilter", publicName: "showFilter", isSignal: true, isRequired: false, transformFunction: null }, showPager: { classPropertyName: "showPager", publicName: "showPager", isSignal: true, isRequired: false, transformFunction: null }, disableSelectionByField: { classPropertyName: "disableSelectionByField", publicName: "disableSelectionByField", isSignal: false, isRequired: false, transformFunction: null }, filterExactMatch: { classPropertyName: "filterExactMatch", publicName: "filterExactMatch", isSignal: true, isRequired: false, transformFunction: null }, _data: { classPropertyName: "_data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, _filterFields: { classPropertyName: "_filterFields", publicName: "filterFields", isSignal: false, isRequired: false, transformFunction: null }, _filterFieldsMap: { classPropertyName: "_filterFieldsMap", publicName: "filterFieldsMap", isSignal: false, isRequired: false, transformFunction: null }, selectionPerPage: { classPropertyName: "selectionPerPage", publicName: "selectionPerPage", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { _view: "view", dataChanged: "dataChanged", filterChange: "filterChange", listMutated: "listMutated" }, usesInheritance: true, ngImport: i0, template: "<div class=\"table-plain\">\n @if (header()) {\n <h6 class=\"text-primary\">\n {{ header() | appTranslate | async }}\n </h6>\n }\n\n @if (filterFields()) {\n <div class=\"d-flex\">\n <app-btn\n text=\"{{ filterCont.hidden ? 'Show Filter' : 'Hide Filter' }}\"\n [icon]=\"filterCont.hidden ? 'search' : 'close'\"\n (mclick)=\"filterCont.hidden = !filterCont.hidden\" />\n </div>\n <div class=\"row align-items-center mt-2\" [hidden]=\"true\" #filterCont>\n @for (scheme of filterFields(); track scheme.field) {\n <div class=\"col-md-4 col-xxl-3\">\n @switch (scheme.type) {\n @case ('autocomplete') {\n <div class=\"col\">\n <app-autocomplete\n [form]=\"filterForm\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [labelType]=\"scheme.labelType | toAny\"\n [name]=\"scheme.field | toAny\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [hint]=\"scheme.hint\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n #inputTag\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\" />\n <app-validation-message [input]=\"inputTag\" />\n </div>\n }\n @default {\n <app-input-basic\n #formField\n [name]=\"scheme.field | toAny\"\n [form]=\"filterForm\"\n [stacked]=\"true\"\n [type]=\"scheme.type\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [labelField]=\"scheme.labelField\"\n [noFormat]=\"true\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\" />\n <app-validation-message [input]=\"formField\" />\n }\n }\n </div>\n }\n <div class=\"col-md justify-content-end d-flex\">\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilter()\" />\n </div>\n </div>\n }\n\n @if (startSectionTemplate() || showFilter() || showExport() || showAdditionalColumns()) {\n <div class=\" \">\n <div class=\"row g-3 justify-content-between align-items-end\">\n <div class=\"col-md\">\n @if (startSectionTemplate()) {\n <div class=\"{{ starterSectionClass() }}\">\n <ng-container [ngTemplateOutlet]=\"startSectionTemplate()\" />\n </div>\n }\n @if (showFilter()) {\n <form [formGroup]=\"filterForm\">\n <div class=\"row justify-content-center align-items-end\">\n <div class=\"col-md-auto\">\n <app-autocomplete\n label=\"Filter\"\n type=\"select\"\n [form]=\"filterForm\"\n name=\"field\"\n [stacked]=\"false\"\n [options]=\"filterOptions()\"\n valueField=\"code\"\n labelField=\"description\" />\n </div>\n <div class=\"col-md-auto\">\n <app-input-basic\n label=\"Value\"\n type=\"text\"\n [form]=\"filterForm\"\n name=\"value\"\n [stacked]=\"false\" />\n </div>\n <div class=\"col-md-auto\">\n <app-btn text=\"Clear\" type=\"secondary\" (mclick)=\"clearFilter()\" />\n </div>\n </div>\n </form>\n }\n </div>\n @if (showExport() || showAdditionalColumns()) {\n <div class=\"col-md-auto\">\n <div class=\"row row-cols-auto g-3 justify-content-end\">\n <span>\n @if (showExport()) {\n <app-export-table\n [disabled]=\"!dataSource()?.data?.length\"\n [label]=\"label()\"\n [debug]=\"debug()\"\n [displayedColumns]=\"computedDisplayedColumns()\"\n [data]=\"dataSource()?.data\" />\n }\n </span>\n @if (showAdditionalColumns()) {\n <div class=\"d-flex\">\n <fields-to-display\n [fields]=\"allTableColumns()\"\n [currentColumns]=\"computedDisplayedColumns()\"\n (fieldsChanged)=\"fieldsChanged($event)\" />\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <div\n [ngClass]=\"{ border: distinct() }\"\n class=\"mt-2 rounded-10 overflow-auto table-container {{ tableContainerClass() }} \">\n <div class=\"table-responsive\">\n <table\n mat-table\n [dataSource]=\"dataSource() || obsDataSource()\"\n matSort\n class=\"w-100 d-table table mb-0\"\n [multiTemplateDataRows]=\"isExpandable()\"\n #table\n [ngClass]=\"{\n smallerFonts: smallerFonts(),\n nowrap: nowrap(),\n centerCells: centerCells(),\n curvy: curvy(),\n 'table-striped': striped(),\n }\">\n <!-- Checkbox Column -->\n <ng-container\n matColumnDef=\"mselect\"\n [sticky]=\"!placeSelectionAtRight()\"\n [stickyEnd]=\"placeSelectionAtRight()\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n @if (customSelectClass()) {\n <input\n type=\"checkbox\"\n [class]=\"customSelectClass()\"\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [attr.aria-label]=\"checkboxLabel()\" />\n }\n @if (!customSelectClass()) {\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [aria-label]=\"checkboxLabel()\"></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n @if (customSelectClass()) {\n <input\n type=\"checkbox\"\n class=\"form-control control-bg-gray\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"checkboxLabel(row)\" />\n }\n @if (!customSelectClass()) {\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"checkboxLabel(row)\"\n [disabled]=\"this.disableSelectionByField | functionCaller1: row\"></mat-checkbox>\n }\n </td>\n </ng-container>\n <!-- Columns -->\n @for (col of computedDisplayedColumns(); track col.f; let i = $index) {\n <ng-template #thContent>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </ng-template>\n\n @switch (col.type) {\n <!-- CHECKBOX -->\n @case ('textarea') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- <app-input-td-rf [(model)]=\"col.\" [showLabel]=\"false\" /> -->\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- CHECKBOX -->\n @case ('checkbox') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-ngmodel\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"checkbox\"\n [disabled]=\"col.disabled\"\n [checked]=\"col.checked\"\n [(model)]=\"row[col.f]\"\n (mchange)=\"outputCheckbox(col.f, row, $event)\"></app-input-ngmodel>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Input -->\n @case ('input') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-basic\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"text\"\n [disabled]=\"col.disabled\"\n [form]=\"row\"\n [name]=\"col.f\"\n [noFormat]=\"true\" />\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- PROGRESS BAR -->\n @case ('progress') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"progress\">\n <div\n class=\"progress-bar progress-bar-striped bg-success\"\n role=\"progressbar\"\n [ngStyle]=\"{ width: row[col.f] }\">\n {{ row[col.f] }}\n </div>\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- COLOR -->\n @case ('color') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"square-2\" [style]=\"'background-color:' + row[col.f]\"></div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Button -->\n @case ('button') {\n <ng-container\n [sticky]=\"col.stickyStart\"\n [stickyEnd]=\"col.stickyEnd || col.sticky\"\n matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index\" class=\"btn-cell\">\n <app-btn\n [icon]=\"col.icon || col.btn?.icon\"\n [type]=\"col.btn?.type\"\n (mclick)=\"\n col.action\n ? col.action(row, col.f, getActionStatusCallback(col), index)\n : null\n \"\n [help]=\"col.btn?.help\"\n [showHelpIcon]=\"col.btn?.showHelpIcon\"\n [text]=\"col.btn?.label\"\n [loading]=\"col.btn?.loading\"\n [iconBtn]=\"col.btn?.iconBtn\"\n mclass=\"w-auto\"\n [disabled]=\"col.btn?.disabled || col.btn?.loading\" />\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Sub Table -->\n @case ('table') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell class=\"text-center\" *matCellDef=\"let row\">\n <div class=\"inline-block\">\n <app-btn\n [icon]=\"col.icon\"\n [type]=\"col.btn?.type || 'dark'\"\n (mclick)=\"col.action ? col.action(row, col.f) : null\"\n [group]=\"col.btn?.group\"\n [help]=\"col.subTable | tableToString: row | async\"\n [showHelpIcon]=\"false\"\n [text]=\"col.btn?.label\"\n [iconBtn]=\"true\"\n mclass=\"w-auto\" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- ACTION COLUMNS -->\n @case ('btns') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\" [stickyEnd]=\"true\" [sticky]=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"btn-cell text-center\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"btn-cell\">\n <div class=\"d-flex col-md-auto col-sm-auto justify-content-center\">\n @for (button of col.buttons; track button.icon + button.label) {\n <div class=\"mx-2\">\n <app-btn\n [icon]=\"button.icon\"\n [text]=\"button.label\"\n [help]=\"button.help\"\n [showHelpIcon]=\"button.showHelpIcon\"\n [type]=\"button.type\"\n [group]=\"button.group\"\n [iconBtn]=\"!button.label\"\n mclass=\"w-auto\"\n (mclick)=\"\n button.action(\n row,\n i + (paginator ? paginator.pageIndex * paginator.pageSize : 0),\n btn\n )\n \"\n #btn />\n </div>\n }\n </div>\n </td>\n </ng-container>\n }\n\n <!-- EDITABLE -->\n @case ('editable') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <a\n class=\"cell\"\n [mqueryParams]=\"col.mqueryParams | functionCaller2: row : col.f\"\n [mrouterLink]=\"col.routeFormatter | functionCaller2: row : col.f\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n <i\n (click)=\"col.action ? col.action(row, col.f) : null\"\n class=\"ps-1 pointer fas fa-pencil-alt\"></i>\n </td>\n </ng-container>\n }\n\n <!-- DEFAULT -->\n @default {\n <ng-container\n [sticky]=\"col.stickyStart\"\n [stickyEnd]=\"col.stickyEnd || col.sticky\"\n matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let rowIndex = index\"\n [matTooltip]=\"\n col.hintFormatter ? (col.hintFormatter | functionCaller1: row | async) : null\n \">\n <ng-template #cellContent>\n @switch (true) {\n @case (!!col.routeFormatter) {\n @if (extractRoute | functionCaller2: col : row; as cellRoute) {\n <a\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [queryParams]=\"cellRoute.queryParams\"\n routerLink=\"{{ cellRoute.route }}\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n }\n }\n @case (!!col.customTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n col.customTemplate;\n context: { $implicit: { row, rowIndex } }\n \" />\n }\n @default {\n <span\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></span>\n }\n }\n @if (col.expandable) {\n <button\n matTooltip=\"Exapnd\"\n [matTooltipShowDelay]=\"1000\"\n mat-icon-button\n (click)=\"expandCell(row, col, expandModal)\"\n class=\"expandBtn\">\n <mat-icon [inline]=\"true\">open_in_full</mat-icon>\n </button>\n }\n </ng-template>\n\n @if (col._onHoverFunction) {\n <span\n class=\"\"\n [nelDebug]=\"debug()\"\n [nelMouseEntered]=\"{ action: col._onHoverFunction, argument: row }\"\n [nelDelay]=\"col._onHoverDelay\">\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n </span>\n } @else {\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n }\n </td>\n </ng-container>\n }\n\n <!--// -->\n }\n }\n <!-- EXPANDABLE COLUMN-->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"_expandCol\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"d-flex justify-content-end\">\n <app-btn\n [iconBtn]=\"true\"\n type=\"clear\"\n [customIcon]=\"\n expandedElement() !== row ? 'fa fa-chevron-down' : 'fa fa-chevron-up'\n \"\n aria-label=\"expand row\"\n (mclick)=\"\n expandedElement.set(expandedElement() === row ? null : row);\n clickedExpandRow.emit({ open: expandedElement() === row, row });\n $event.stopPropagation()\n \" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Options Column -->\n @if (hasRowOptions()) {\n <ng-container matColumnDef=\"option\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef disableClear></th>\n <td mat-cell *matCellDef=\"let row\">\n @if (rowOptionsMap()) {\n @if (formOptionsMap() | functionCaller: row; as _rowoptions) {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of _rowoptions; track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n } @else {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of rowOptions(); track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n </td>\n </ng-container>\n }\n\n @if (rawColumns(); as dcols) {\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td\n mat-cell\n *matCellDef=\"let row\"\n [attr.colspan]=\"dcols?.length || 1\"\n [ngClass]=\"{ hideBorder: row != expandedElement() }\">\n <div\n class=\"example-element-detail\"\n [@detailExpand]=\"row == expandedElement() ? 'expanded' : 'collapsed'\">\n @if (row == expandedElement()) {\n <ng-container\n *ngTemplateOutlet=\"\n expandedRowTemplate();\n context: { $implicit: { row } }\n \"></ng-container>\n }\n </div>\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"dcols\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: dcols\"\n [ngClass]=\"{\n pointer: enableRowClick(),\n disabled: isDisabledFunc() ? isDisabledFunc()(row) : false,\n }\"\n [matTooltip]=\"isDisabledFunc() && isDisabledFunc()(row) ? 'Disabled' : null\"\n (click)=\"enableRowClick() ? rowClick(row) : null\"></tr>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell no-item\" [attr.colspan]=\"dcols?.length || 1\">\n {{ noItemTxt() | appTranslate | async }}\n </td>\n </tr>\n @if (isExpandable()) {\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['expandedDetail']\"\n class=\"expanded-detail-row\"\n [style.height.px]=\"0\"></tr>\n }\n }\n </table>\n </div>\n @if (showPager()) {\n <mat-paginator\n [length]=\"resultsLength()\"\n [pageSizeOptions]=\"computedPageSizeOptions()\"\n [pageSize]=\"pageSize()\"\n showFirstLastButtons></mat-paginator>\n }\n </div>\n</div>\n\n<modal-comp\n [width]=\"selectedCellForExpansion()?.column?.expandedWidth || '900px'\"\n [header]=\"selectedCellForExpansion()?.column?.t\"\n [showFooter]=\"false\"\n (modalClose)=\"closeExpandedCell()\"\n #expandModal>\n <ng-template modalBody>\n @if (selectedCellForExpansion(); as _selected) {\n <div\n class=\"\"\n [innerHTML]=\"\n _selected.row | getColFormattedE: _selected.column | async | valueOrX: '-'\n \"></div>\n }\n </ng-template>\n</modal-comp>\n", styles: [":host ::ng-deep .table-plain .w-1,:host ::ng-deep .table-https .w-1{width:1%}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail{padding:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder{border-bottom:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail{overflow:hidden;display:flex}:host ::ng-deep .table-plain .mat-cell,:host ::ng-deep .table-https .mat-cell{padding:3px 5px!important}:host ::ng-deep .table-plain .colour,:host ::ng-deep .table-https .colour{height:15px;width:15px;display:inline-block;border-radius:5px}:host ::ng-deep .table-plain .centerCells .mat-sort-header-container,:host ::ng-deep .table-plain .centerCells .mat-mdc-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-mdc-sort-header-container{justify-content:center}:host ::ng-deep .table-plain .default.colour,:host ::ng-deep .table-https .default.colour{background-color:#545454}:host ::ng-deep .table-plain .btn-cell,:host ::ng-deep .table-https .btn-cell{width:1%}:host ::ng-deep .table-plain input[type=checkbox]:not(.form-control),:host ::ng-deep .table-https input[type=checkbox]:not(.form-control){border:1px solid rgba(80,78,245,.3019607843)}:host ::ng-deep .table-plain .mat-header-cell,:host ::ng-deep .table-plain .mat-mdc-header-cell,:host ::ng-deep .table-https .mat-header-cell,:host ::ng-deep .table-https .mat-mdc-header-cell{vertical-align:middle;color:var(--primary);font-style:normal;font-weight:600;font-size:14px;text-align:center}:host ::ng-deep .table-plain .mat-table-sticky-border-elem-left,:host ::ng-deep .table-plain .mat-mdc-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0;background-color:#fff}:host ::ng-deep .table-plain .mat-mdc-table-sticky,:host ::ng-deep .table-https .mat-mdc-table-sticky{background-color:#fff!important}:host ::ng-deep .table-plain .smallerFonts td,:host ::ng-deep .table-plain .smallerFonts th,:host ::ng-deep .table-https .smallerFonts td,:host ::ng-deep .table-https .smallerFonts th{font-size:.7rem}:host ::ng-deep .table-plain .nowrap td,:host ::ng-deep .table-plain .nowrap th,:host ::ng-deep .table-https .nowrap td,:host ::ng-deep .table-https .nowrap th{white-space:nowrap;text-align:left;padding:5px}:host ::ng-deep .table-plain table tr,:host ::ng-deep .table-https table tr{position:relative}:host ::ng-deep .table-plain table tr.mat-mdc-row,:host ::ng-deep .table-plain table tr.mat-mdc-header-row,:host ::ng-deep .table-plain table tr .mat-header-row,:host ::ng-deep .table-https table tr.mat-mdc-row,:host ::ng-deep .table-https table tr.mat-mdc-header-row,:host ::ng-deep .table-https table tr .mat-header-row{height:52px}:host ::ng-deep .table-plain table tr td:hover,:host ::ng-deep .table-https table tr td:hover{color:unset!important;text-decoration:unset;cursor:unset}:host ::ng-deep .table-plain table tr.disabled:after,:host ::ng-deep .table-https table tr.disabled:after{content:\" \";display:block;background-color:#c7c7c726;width:100%;height:100%;position:absolute;top:0;left:0;z-index:11111;cursor:not-allowed}:host ::ng-deep .table-plain .centerCells td,:host ::ng-deep .table-https .centerCells td{text-align:center}:host ::ng-deep .table-plain .curvy tr,:host ::ng-deep .table-https .curvy tr{border-radius:0 10px}:host ::ng-deep .table-plain .inline-block,:host ::ng-deep .table-https .inline-block{display:inline-block}:host ::ng-deep .table-plain td.no-item,:host ::ng-deep .table-https td.no-item{border-bottom:none!important;height:50px}\n"], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "app-autocomplete,autocomplete", inputs: ["showRequiredTag", "validate", "skipDoesOptionExistCheck", "options"], outputs: ["skipDoesOptionExistCheckChange"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "verbose", "translatorOptions", "loading", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "form", "forms", "help", "helpShowDelay", "iconBtn", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid", "disabled"], outputs: ["loadingChange", "leftCustomIconChange", "mclick", "disabledChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ExportTableComponent, selector: "app-export-table", inputs: ["data", "displayedColumns", "searchFunc", "searchQuery", "label", "debug", "disabled"] }, { kind: "component", type: FieldsToDisplayComponent, selector: "fields-to-display", inputs: ["query1", "query2", "fields", "currentColumns"], outputs: ["query1Change", "query2Change", "fieldsChanged"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: InfoIconComponent, selector: "app-info-icon", inputs: ["text", "coloured", "left", "right"] }, { kind: "component", type: InputBasicComponent, selector: "app-input-basic,app-input", inputs: ["accept", "autocomplete", "input", "contextData", "decimalPoints", "files", "hide", "clearOnDisable", "labelLink", "loading", "multiple", "optionsFunc", "vms", "setCurrentDate", "options"], outputs: ["loadingChange", "mSelectedOptionLabel"] }, { kind: "directive", type: InputFormatDirective, selector: "input:not([matInput]):not([noformat])", inputs: ["value"] }, { kind: "component", type: ModalComponent, selector: "modal-comp", inputs: ["header", "bodyTemplateRef", "footerTemplateRef", "showHeader", "loading", "isFullscreen", "showFooter", "width", "minWidth", "height", "maxHeight", "icon", "data", "disableClose", "hasBackdrop", "baseConfig"], outputs: ["headerChange", "showHeaderChange", "mouseLeft", "loadingChange", "showFooterChange", "modalOpen", "modalClose"] }, { kind: "directive", type: ModalBodyDirective, selector: "[modalBody]" }, { kind: "component", type: InputNGModelComponent, selector: "app-input-ngmodel", inputs: ["mvalue", "cls", "colored", "disabled", "hide", "hint", "id", "inpCl", "label", "lblCl", "lblPosition", "mini", "light", "name", "model", "optionFormatter", "options", "checked", "contextData", "decimalPoints", "labelField", "max", "min", "placeholder", "prefix", "readonly", "required", "showEmptyOption", "showLabel", "showValidation", "showValidationIcon", "small", "stacked", "suffix", "theme", "type", "valueField", "labelType", "xsmall"], outputs: ["modelChange", "mchange"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i2$5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3$1.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: i3$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3$1.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: MatButtonModule }, { kind: "component", type: i2$4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i1$6.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i5.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i5.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i10$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i10$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i10$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i10$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i10$1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i10$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i10$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i10$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i10$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i10$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i10$1.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: MouseEnterListenerDirective, selector: "[nelMouseEntered]", inputs: ["nelMouseEntered"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: MrouterLinkirective, selector: "[mrouterLink]", inputs: ["mrouterLink", "mrouterLinkActivatedRoute", "mqueryParams", "isPhone", "isEmail"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TablePipesModule }, { kind: "component", type: ValidationMessageComponent, selector: "app-validation-message", inputs: ["maxLength", "minLength", "control", "customMessage", "debug", "applyMargin", "ignoreDirtiness", "input", "label", "hideOverflow"], outputs: ["labelChange"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: FunctionCaller1, name: "functionCaller1" }, { kind: "pipe", type: FunctionCaller2, name: "functionCaller2" }, { kind: "pipe", type: GetColFormattedPipe, name: "getColFormatted" }, { kind: "pipe", type: GetColFormattedEPipe, name: "getColFormattedE" }, { kind: "pipe", type: TableToStringPipe, name: "tableToString" }, { kind: "pipe", type: ToAnyPipe, name: "toAny" }, { kind: "pipe", type: SDKTranslatePipe, name: "appTranslate" }, { kind: "pipe", type: ValueOrXPipe, name: "valueOrX" }, { kind: "pipe", type: FunctionCaller, name: "functionCaller" }], animations: [
21426
21430
  trigger('detailExpand', [
21427
21431
  state('collapsed', style({ height: '0px', minHeight: '0' })),
21428
21432
  state('expanded', style({ height: '*' })),
@@ -21476,7 +21480,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImpor
21476
21480
  ValidationMessageComponent,
21477
21481
  ValueOrXPipe,
21478
21482
  FunctionCaller,
21479
- ], template: "<div class=\"table-plain\">\n @if (header()) {\n <h6 class=\"text-primary\">\n {{ header() | appTranslate | async }}\n </h6>\n }\n\n @if (filterFields()) {\n <div class=\"d-flex\">\n <app-btn\n text=\"{{ filterCont.hidden ? 'Show Filter' : 'Hide Filter' }}\"\n [icon]=\"filterCont.hidden ? 'search' : 'close'\"\n (mclick)=\"filterCont.hidden = !filterCont.hidden\" />\n </div>\n <div class=\"row align-items-center mt-2\" [hidden]=\"true\" #filterCont>\n @for (scheme of filterFields(); track scheme.field) {\n <div class=\"col-md-4 col-xxl-3\">\n @switch (scheme.type) {\n @case ('autocomplete') {\n <div class=\"col\">\n <app-autocomplete\n [form]=\"filterForm\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [labelType]=\"scheme.labelType | toAny\"\n [name]=\"scheme.field | toAny\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [hint]=\"scheme.hint\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n #inputTag\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\" />\n <app-validation-message [input]=\"inputTag\" />\n </div>\n }\n @default {\n <app-input-basic\n #formField\n [name]=\"scheme.field | toAny\"\n [form]=\"filterForm\"\n [stacked]=\"true\"\n [type]=\"scheme.type\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [labelField]=\"scheme.labelField\"\n [noFormat]=\"true\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\" />\n <app-validation-message [input]=\"formField\" />\n }\n }\n </div>\n }\n <div class=\"col-md justify-content-end d-flex\">\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilter()\" />\n </div>\n </div>\n }\n\n @if (startSectionTemplate() || showFilter() || showExport() || showAdditionalColumns()) {\n <div class=\" \">\n <div class=\"row g-3 justify-content-between align-items-end\">\n <div class=\"col-md\">\n @if (startSectionTemplate()) {\n <div class=\"{{ starterSectionClass() }}\">\n <ng-container [ngTemplateOutlet]=\"startSectionTemplate()\" />\n </div>\n }\n @if (showFilter()) {\n <form [formGroup]=\"filterForm\">\n <div class=\"row justify-content-center align-items-end\">\n <div class=\"col-md-auto\">\n <app-autocomplete\n label=\"Filter\"\n type=\"select\"\n [form]=\"filterForm\"\n name=\"field\"\n [stacked]=\"false\"\n [options]=\"filterOptions()\"\n valueField=\"code\"\n labelField=\"description\" />\n </div>\n <div class=\"col-md-auto\">\n <app-input-basic\n label=\"Value\"\n type=\"text\"\n [form]=\"filterForm\"\n name=\"value\"\n [stacked]=\"false\" />\n </div>\n <div class=\"col-md-auto\">\n <app-btn text=\"Clear\" type=\"secondary\" (mclick)=\"clearFilter()\" />\n </div>\n </div>\n </form>\n }\n </div>\n @if (showExport() || showAdditionalColumns()) {\n <div class=\"col-md-auto\">\n <div class=\"row row-cols-auto g-3 justify-content-end\">\n <span>\n @if (showExport()) {\n <app-export-table\n [disabled]=\"!dataSource()?.data?.length\"\n [label]=\"label()\"\n [debug]=\"debug()\"\n [displayedColumns]=\"computedDisplayedColumns()\"\n [data]=\"dataSource()?.data\" />\n }\n </span>\n @if (showAdditionalColumns()) {\n <div class=\"d-flex\">\n <fields-to-display\n [fields]=\"allTableColumns()\"\n [currentColumns]=\"computedDisplayedColumns()\"\n (fieldsChanged)=\"fieldsChanged($event)\" />\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <div\n [ngClass]=\"{ border: distinct() }\"\n class=\"mt-2 rounded-10 overflow-auto table-container {{ tableContainerClass() }} \">\n <div class=\"table-responsive\">\n <table\n mat-table\n [dataSource]=\"dataSource() || obsDataSource()\"\n matSort\n class=\"w-100 d-table table mb-0\"\n [multiTemplateDataRows]=\"isExpandable()\"\n #table\n [ngClass]=\"{\n smallerFonts: smallerFonts(),\n nowrap: nowrap(),\n centerCells: centerCells(),\n curvy: curvy(),\n 'table-striped': striped(),\n }\">\n <!-- Checkbox Column -->\n <ng-container\n matColumnDef=\"mselect\"\n [sticky]=\"!placeSelectionAtRight()\"\n [stickyEnd]=\"placeSelectionAtRight()\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n @if (customSelectClass()) {\n <input\n type=\"checkbox\"\n [class]=\"customSelectClass()\"\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [attr.aria-label]=\"checkboxLabel()\" />\n }\n @if (!customSelectClass()) {\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [aria-label]=\"checkboxLabel()\"></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n @if (customSelectClass()) {\n <input\n type=\"checkbox\"\n class=\"form-control control-bg-gray\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"checkboxLabel(row)\" />\n }\n @if (!customSelectClass()) {\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"checkboxLabel(row)\"\n [disabled]=\"this.disableSelectionByField | functionCaller1: row\"></mat-checkbox>\n }\n </td>\n </ng-container>\n <!-- Columns -->\n @for (col of computedDisplayedColumns(); track col.f; let i = $index) {\n <ng-template #thContent>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </ng-template>\n\n @switch (col.type) {\n <!-- CHECKBOX -->\n @case ('textarea') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- <app-input-td-rf [(model)]=\"col.\" [showLabel]=\"false\" /> -->\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- CHECKBOX -->\n @case ('checkbox') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-ngmodel\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"checkbox\"\n [disabled]=\"col.disabled\"\n [checked]=\"col.checked\"\n [(model)]=\"row[col.f]\"\n (mchange)=\"outputCheckbox(col.f, row, $event)\"></app-input-ngmodel>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Input -->\n @case ('input') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-basic\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"text\"\n [disabled]=\"col.disabled\"\n [form]=\"row\"\n [name]=\"col.f\"\n [noFormat]=\"true\" />\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- PROGRESS BAR -->\n @case ('progress') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"progress\">\n <div\n class=\"progress-bar progress-bar-striped bg-success\"\n role=\"progressbar\"\n [ngStyle]=\"{ width: row[col.f] }\">\n {{ row[col.f] }}\n </div>\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- COLOR -->\n @case ('color') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"square-2\" [style]=\"'background-color:' + row[col.f]\"></div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Button -->\n @case ('button') {\n <ng-container\n [sticky]=\"col.stickyStart\"\n [stickyEnd]=\"col.stickyEnd || col.sticky\"\n matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index\" class=\"btn-cell\">\n <app-btn\n [icon]=\"col.icon || col.btn?.icon\"\n [type]=\"col.btn?.type\"\n (mclick)=\"\n col.action\n ? col.action(row, col.f, getActionStatusCallback(col), index)\n : null\n \"\n [help]=\"col.btn?.help\"\n [showHelpIcon]=\"col.btn?.showHelpIcon\"\n [text]=\"col.btn?.label\"\n [loading]=\"col.btn?.loading\"\n [iconBtn]=\"col.btn?.iconBtn\"\n mclass=\"w-auto\"\n [disabled]=\"col.btn?.disabled || col.btn?.loading\" />\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Sub Table -->\n @case ('table') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell class=\"text-center\" *matCellDef=\"let row\">\n <div class=\"inline-block\">\n <app-btn\n [icon]=\"col.icon\"\n [type]=\"col.btn?.type || 'dark'\"\n (mclick)=\"col.action ? col.action(row, col.f) : null\"\n [group]=\"col.btn?.group\"\n [help]=\"col.subTable | tableToString: row | async\"\n [showHelpIcon]=\"false\"\n [text]=\"col.btn?.label\"\n [iconBtn]=\"true\"\n mclass=\"w-auto\" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- ACTION COLUMNS -->\n @case ('btns') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\" [stickyEnd]=\"true\" [sticky]=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"btn-cell text-center\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"btn-cell\">\n <div class=\"d-flex col-md-auto col-sm-auto justify-content-center\">\n @for (button of col.buttons; track button.icon + button.label) {\n <div class=\"mx-2\">\n <app-btn\n [icon]=\"button.icon\"\n [text]=\"button.label\"\n [help]=\"button.help\"\n [showHelpIcon]=\"button.showHelpIcon\"\n [type]=\"button.type\"\n [group]=\"button.group\"\n [iconBtn]=\"!button.label\"\n mclass=\"w-auto\"\n (mclick)=\"\n button.action(\n row,\n i + (paginator ? paginator.pageIndex * paginator.pageSize : 0),\n btn\n )\n \"\n #btn />\n </div>\n }\n </div>\n </td>\n </ng-container>\n }\n\n <!-- EDITABLE -->\n @case ('editable') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <a\n class=\"cell\"\n [mqueryParams]=\"col.mqueryParams | functionCaller2: row : col.f\"\n [mrouterLink]=\"col.routeFormatter | functionCaller2: row : col.f\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n <i\n (click)=\"col.action ? col.action(row, col.f) : null\"\n class=\"ps-1 pointer fas fa-pencil-alt\"></i>\n </td>\n </ng-container>\n }\n\n <!-- DEFAULT -->\n @default {\n <ng-container\n [sticky]=\"col.stickyStart\"\n [stickyEnd]=\"col.stickyEnd || col.sticky\"\n matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let rowIndex = index\"\n [matTooltip]=\"\n col.hintFormatter ? (col.hintFormatter | functionCaller1: row | async) : null\n \">\n <ng-template #cellContent>\n @switch (true) {\n @case (!!col.routeFormatter) {\n @if (extractRoute | functionCaller2: col : row; as cellRoute) {\n <a\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [queryParams]=\"cellRoute.queryParams\"\n routerLink=\"{{ cellRoute.route }}\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n }\n }\n @case (!!col.customTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n col.customTemplate;\n context: { $implicit: { row, rowIndex } }\n \" />\n }\n @default {\n <span\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></span>\n }\n }\n @if (col.expandable) {\n <button\n matTooltip=\"Exapnd\"\n [matTooltipShowDelay]=\"1000\"\n mat-icon-button\n (click)=\"expandCell(row, col, expandModal)\"\n class=\"expandBtn\">\n <mat-icon [inline]=\"true\">open_in_full</mat-icon>\n </button>\n }\n </ng-template>\n\n @if (col._onHoverFunction) {\n <span\n class=\"\"\n [nelDebug]=\"debug()\"\n [nelMouseEntered]=\"{ action: col._onHoverFunction, argument: row }\"\n [nelDelay]=\"col._onHoverDelay\">\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n </span>\n } @else {\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n }\n </td>\n </ng-container>\n }\n\n <!--// -->\n }\n }\n <!-- EXPANDABLE COLUMN-->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"_expandCol\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"d-flex justify-content-end\">\n <app-btn\n [iconBtn]=\"true\"\n type=\"clear\"\n [customIcon]=\"\n expandedElement() !== row ? 'fa fa-chevron-down' : 'fa fa-chevron-up'\n \"\n aria-label=\"expand row\"\n (mclick)=\"\n expandedElement.set(expandedElement() === row ? null : row);\n clickedExpandRow.emit({ open: expandedElement() === row, row });\n $event.stopPropagation()\n \" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Options Column -->\n @if (hasRowOptions()) {\n <ng-container matColumnDef=\"option\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef disableClear></th>\n <td mat-cell *matCellDef=\"let row\">\n @if (rowOptionsMap()) {\n @if (formOptionsMap() | functionCaller: row; as _rowoptions) {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of _rowoptions; track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n } @else {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of rowOptions(); track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n </td>\n </ng-container>\n }\n\n @if (rawColumns(); as dcols) {\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td\n mat-cell\n *matCellDef=\"let row\"\n [attr.colspan]=\"dcols?.length || 1\"\n [ngClass]=\"{ hideBorder: row != expandedElement() }\">\n <div\n class=\"example-element-detail\"\n [@detailExpand]=\"row == expandedElement() ? 'expanded' : 'collapsed'\">\n @if (row == expandedElement()) {\n <ng-container\n *ngTemplateOutlet=\"\n expandedRowTemplate();\n context: { $implicit: { row } }\n \"></ng-container>\n }\n </div>\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"dcols\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: dcols\"\n [ngClass]=\"{\n pointer: showRowPointer(),\n disabled: isDisabledFunc() ? isDisabledFunc()(row) : false,\n }\"\n [matTooltip]=\"isDisabledFunc() && isDisabledFunc()(row) ? 'Disabled' : null\"\n (click)=\"rowClick(row)\"></tr>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell no-item\" [attr.colspan]=\"dcols?.length || 1\">\n {{ noItemTxt() | appTranslate | async }}\n </td>\n </tr>\n @if (isExpandable()) {\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['expandedDetail']\"\n class=\"expanded-detail-row\"\n [style.height.px]=\"0\"></tr>\n }\n }\n </table>\n </div>\n @if (showPager()) {\n <mat-paginator\n [length]=\"resultsLength()\"\n [pageSizeOptions]=\"computedPageSizeOptions()\"\n [pageSize]=\"pageSize()\"\n showFirstLastButtons></mat-paginator>\n }\n </div>\n</div>\n\n<modal-comp\n [width]=\"selectedCellForExpansion()?.column?.expandedWidth || '900px'\"\n [header]=\"selectedCellForExpansion()?.column?.t\"\n [showFooter]=\"false\"\n (modalClose)=\"closeExpandedCell()\"\n #expandModal>\n <ng-template modalBody>\n @if (selectedCellForExpansion(); as _selected) {\n <div\n class=\"\"\n [innerHTML]=\"\n _selected.row | getColFormattedE: _selected.column | async | valueOrX: '-'\n \"></div>\n }\n </ng-template>\n</modal-comp>\n", styles: [":host ::ng-deep .table-plain .w-1,:host ::ng-deep .table-https .w-1{width:1%}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail{padding:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder{border-bottom:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail{overflow:hidden;display:flex}:host ::ng-deep .table-plain .mat-cell,:host ::ng-deep .table-https .mat-cell{padding:3px 5px!important}:host ::ng-deep .table-plain .colour,:host ::ng-deep .table-https .colour{height:15px;width:15px;display:inline-block;border-radius:5px}:host ::ng-deep .table-plain .centerCells .mat-sort-header-container,:host ::ng-deep .table-plain .centerCells .mat-mdc-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-mdc-sort-header-container{justify-content:center}:host ::ng-deep .table-plain .default.colour,:host ::ng-deep .table-https .default.colour{background-color:#545454}:host ::ng-deep .table-plain .btn-cell,:host ::ng-deep .table-https .btn-cell{width:1%}:host ::ng-deep .table-plain input[type=checkbox]:not(.form-control),:host ::ng-deep .table-https input[type=checkbox]:not(.form-control){border:1px solid rgba(80,78,245,.3019607843)}:host ::ng-deep .table-plain .mat-header-cell,:host ::ng-deep .table-plain .mat-mdc-header-cell,:host ::ng-deep .table-https .mat-header-cell,:host ::ng-deep .table-https .mat-mdc-header-cell{vertical-align:middle;color:var(--primary);font-style:normal;font-weight:600;font-size:14px;text-align:center}:host ::ng-deep .table-plain .mat-table-sticky-border-elem-left,:host ::ng-deep .table-plain .mat-mdc-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0;background-color:#fff}:host ::ng-deep .table-plain .mat-mdc-table-sticky,:host ::ng-deep .table-https .mat-mdc-table-sticky{background-color:#fff!important}:host ::ng-deep .table-plain .smallerFonts td,:host ::ng-deep .table-plain .smallerFonts th,:host ::ng-deep .table-https .smallerFonts td,:host ::ng-deep .table-https .smallerFonts th{font-size:.7rem}:host ::ng-deep .table-plain .nowrap td,:host ::ng-deep .table-plain .nowrap th,:host ::ng-deep .table-https .nowrap td,:host ::ng-deep .table-https .nowrap th{white-space:nowrap;text-align:left;padding:5px}:host ::ng-deep .table-plain table tr,:host ::ng-deep .table-https table tr{position:relative}:host ::ng-deep .table-plain table tr.mat-mdc-row,:host ::ng-deep .table-plain table tr.mat-mdc-header-row,:host ::ng-deep .table-plain table tr .mat-header-row,:host ::ng-deep .table-https table tr.mat-mdc-row,:host ::ng-deep .table-https table tr.mat-mdc-header-row,:host ::ng-deep .table-https table tr .mat-header-row{height:52px}:host ::ng-deep .table-plain table tr td:hover,:host ::ng-deep .table-https table tr td:hover{color:unset!important;text-decoration:unset;cursor:unset}:host ::ng-deep .table-plain table tr.disabled:after,:host ::ng-deep .table-https table tr.disabled:after{content:\" \";display:block;background-color:#c7c7c726;width:100%;height:100%;position:absolute;top:0;left:0;z-index:11111;cursor:not-allowed}:host ::ng-deep .table-plain .centerCells td,:host ::ng-deep .table-https .centerCells td{text-align:center}:host ::ng-deep .table-plain .curvy tr,:host ::ng-deep .table-https .curvy tr{border-radius:0 10px}:host ::ng-deep .table-plain .inline-block,:host ::ng-deep .table-https .inline-block{display:inline-block}:host ::ng-deep .table-plain td.no-item,:host ::ng-deep .table-https td.no-item{border-bottom:none!important;height:50px}\n"] }]
21483
+ ], template: "<div class=\"table-plain\">\n @if (header()) {\n <h6 class=\"text-primary\">\n {{ header() | appTranslate | async }}\n </h6>\n }\n\n @if (filterFields()) {\n <div class=\"d-flex\">\n <app-btn\n text=\"{{ filterCont.hidden ? 'Show Filter' : 'Hide Filter' }}\"\n [icon]=\"filterCont.hidden ? 'search' : 'close'\"\n (mclick)=\"filterCont.hidden = !filterCont.hidden\" />\n </div>\n <div class=\"row align-items-center mt-2\" [hidden]=\"true\" #filterCont>\n @for (scheme of filterFields(); track scheme.field) {\n <div class=\"col-md-4 col-xxl-3\">\n @switch (scheme.type) {\n @case ('autocomplete') {\n <div class=\"col\">\n <app-autocomplete\n [form]=\"filterForm\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [labelType]=\"scheme.labelType | toAny\"\n [name]=\"scheme.field | toAny\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [hint]=\"scheme.hint\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n #inputTag\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\" />\n <app-validation-message [input]=\"inputTag\" />\n </div>\n }\n @default {\n <app-input-basic\n #formField\n [name]=\"scheme.field | toAny\"\n [form]=\"filterForm\"\n [stacked]=\"true\"\n [type]=\"scheme.type\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [labelField]=\"scheme.labelField\"\n [noFormat]=\"true\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"scheme.disabledIf | functionCaller2: filterForm.value : scheme.field\"\n [options]=\"scheme.options || cellOptions[scheme.field | toAny]\"\n (mchange)=\"onFilterChange(dataSource().filteredData)\" />\n <app-validation-message [input]=\"formField\" />\n }\n }\n </div>\n }\n <div class=\"col-md justify-content-end d-flex\">\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilter()\" />\n </div>\n </div>\n }\n\n @if (startSectionTemplate() || showFilter() || showExport() || showAdditionalColumns()) {\n <div class=\" \">\n <div class=\"row g-3 justify-content-between align-items-end\">\n <div class=\"col-md\">\n @if (startSectionTemplate()) {\n <div class=\"{{ starterSectionClass() }}\">\n <ng-container [ngTemplateOutlet]=\"startSectionTemplate()\" />\n </div>\n }\n @if (showFilter()) {\n <form [formGroup]=\"filterForm\">\n <div class=\"row justify-content-center align-items-end\">\n <div class=\"col-md-auto\">\n <app-autocomplete\n label=\"Filter\"\n type=\"select\"\n [form]=\"filterForm\"\n name=\"field\"\n [stacked]=\"false\"\n [options]=\"filterOptions()\"\n valueField=\"code\"\n labelField=\"description\" />\n </div>\n <div class=\"col-md-auto\">\n <app-input-basic\n label=\"Value\"\n type=\"text\"\n [form]=\"filterForm\"\n name=\"value\"\n [stacked]=\"false\" />\n </div>\n <div class=\"col-md-auto\">\n <app-btn text=\"Clear\" type=\"secondary\" (mclick)=\"clearFilter()\" />\n </div>\n </div>\n </form>\n }\n </div>\n @if (showExport() || showAdditionalColumns()) {\n <div class=\"col-md-auto\">\n <div class=\"row row-cols-auto g-3 justify-content-end\">\n <span>\n @if (showExport()) {\n <app-export-table\n [disabled]=\"!dataSource()?.data?.length\"\n [label]=\"label()\"\n [debug]=\"debug()\"\n [displayedColumns]=\"computedDisplayedColumns()\"\n [data]=\"dataSource()?.data\" />\n }\n </span>\n @if (showAdditionalColumns()) {\n <div class=\"d-flex\">\n <fields-to-display\n [fields]=\"allTableColumns()\"\n [currentColumns]=\"computedDisplayedColumns()\"\n (fieldsChanged)=\"fieldsChanged($event)\" />\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <div\n [ngClass]=\"{ border: distinct() }\"\n class=\"mt-2 rounded-10 overflow-auto table-container {{ tableContainerClass() }} \">\n <div class=\"table-responsive\">\n <table\n mat-table\n [dataSource]=\"dataSource() || obsDataSource()\"\n matSort\n class=\"w-100 d-table table mb-0\"\n [multiTemplateDataRows]=\"isExpandable()\"\n #table\n [ngClass]=\"{\n smallerFonts: smallerFonts(),\n nowrap: nowrap(),\n centerCells: centerCells(),\n curvy: curvy(),\n 'table-striped': striped(),\n }\">\n <!-- Checkbox Column -->\n <ng-container\n matColumnDef=\"mselect\"\n [sticky]=\"!placeSelectionAtRight()\"\n [stickyEnd]=\"placeSelectionAtRight()\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n @if (customSelectClass()) {\n <input\n type=\"checkbox\"\n [class]=\"customSelectClass()\"\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [attr.aria-label]=\"checkboxLabel()\" />\n }\n @if (!customSelectClass()) {\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [aria-label]=\"checkboxLabel()\"></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n @if (customSelectClass()) {\n <input\n type=\"checkbox\"\n class=\"form-control control-bg-gray\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"checkboxLabel(row)\" />\n }\n @if (!customSelectClass()) {\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"checkboxLabel(row)\"\n [disabled]=\"this.disableSelectionByField | functionCaller1: row\"></mat-checkbox>\n }\n </td>\n </ng-container>\n <!-- Columns -->\n @for (col of computedDisplayedColumns(); track col.f; let i = $index) {\n <ng-template #thContent>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </ng-template>\n\n @switch (col.type) {\n <!-- CHECKBOX -->\n @case ('textarea') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- <app-input-td-rf [(model)]=\"col.\" [showLabel]=\"false\" /> -->\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- CHECKBOX -->\n @case ('checkbox') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef class=\"w-1\">\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"w-1\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-ngmodel\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"checkbox\"\n [disabled]=\"col.disabled\"\n [checked]=\"col.checked\"\n [(model)]=\"row[col.f]\"\n (mchange)=\"outputCheckbox(col.f, row, $event)\"></app-input-ngmodel>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Input -->\n @case ('input') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <!-- Removing the empty space above checkboxes -->\n <app-input-basic\n [showLabel]=\"false\"\n [stacked]=\"true\"\n type=\"text\"\n [disabled]=\"col.disabled\"\n [form]=\"row\"\n [name]=\"col.f\"\n [noFormat]=\"true\" />\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- PROGRESS BAR -->\n @case ('progress') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngTemplateOutlet=\"thContent\"></ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"progress\">\n <div\n class=\"progress-bar progress-bar-striped bg-success\"\n role=\"progressbar\"\n [ngStyle]=\"{ width: row[col.f] }\">\n {{ row[col.f] }}\n </div>\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- COLOR -->\n @case ('color') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"square-2\" [style]=\"'background-color:' + row[col.f]\"></div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Button -->\n @case ('button') {\n <ng-container\n [sticky]=\"col.stickyStart\"\n [stickyEnd]=\"col.stickyEnd || col.sticky\"\n matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index\" class=\"btn-cell\">\n <app-btn\n [icon]=\"col.icon || col.btn?.icon\"\n [type]=\"col.btn?.type\"\n (mclick)=\"\n col.action\n ? col.action(row, col.f, getActionStatusCallback(col), index)\n : null\n \"\n [help]=\"col.btn?.help\"\n [showHelpIcon]=\"col.btn?.showHelpIcon\"\n [text]=\"col.btn?.label\"\n [loading]=\"col.btn?.loading\"\n [iconBtn]=\"col.btn?.iconBtn\"\n mclass=\"w-auto\"\n [disabled]=\"col.btn?.disabled || col.btn?.loading\" />\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- Sub Table -->\n @case ('table') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell class=\"text-center\" *matHeaderCellDef>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell class=\"text-center\" *matCellDef=\"let row\">\n <div class=\"inline-block\">\n <app-btn\n [icon]=\"col.icon\"\n [type]=\"col.btn?.type || 'dark'\"\n (mclick)=\"col.action ? col.action(row, col.f) : null\"\n [group]=\"col.btn?.group\"\n [help]=\"col.subTable | tableToString: row | async\"\n [showHelpIcon]=\"false\"\n [text]=\"col.btn?.label\"\n [iconBtn]=\"true\"\n mclass=\"w-auto\" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n\n <!-- ACTION COLUMNS -->\n @case ('btns') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\" [stickyEnd]=\"true\" [sticky]=\"true\">\n <th mat-header-cell *matHeaderCellDef class=\"btn-cell text-center\">\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"btn-cell\">\n <div class=\"d-flex col-md-auto col-sm-auto justify-content-center\">\n @for (button of col.buttons; track button.icon + button.label) {\n <div class=\"mx-2\">\n <app-btn\n [icon]=\"button.icon\"\n [text]=\"button.label\"\n [help]=\"button.help\"\n [showHelpIcon]=\"button.showHelpIcon\"\n [type]=\"button.type\"\n [group]=\"button.group\"\n [iconBtn]=\"!button.label\"\n mclass=\"w-auto\"\n (mclick)=\"\n button.action(\n row,\n i + (paginator ? paginator.pageIndex * paginator.pageSize : 0),\n btn\n )\n \"\n #btn />\n </div>\n }\n </div>\n </td>\n </ng-container>\n }\n\n <!-- EDITABLE -->\n @case ('editable') {\n <ng-container matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <a\n class=\"cell\"\n [mqueryParams]=\"col.mqueryParams | functionCaller2: row : col.f\"\n [mrouterLink]=\"col.routeFormatter | functionCaller2: row : col.f\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n <i\n (click)=\"col.action ? col.action(row, col.f) : null\"\n class=\"ps-1 pointer fas fa-pencil-alt\"></i>\n </td>\n </ng-container>\n }\n\n <!-- DEFAULT -->\n @default {\n <ng-container\n [sticky]=\"col.stickyStart\"\n [stickyEnd]=\"col.stickyEnd || col.sticky\"\n matColumnDef=\"{{ col.f | toAny }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <app-info-icon [text]=\"col.hint\">\n {{ col.t | appTranslate | async }}\n </app-info-icon>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let rowIndex = index\"\n [matTooltip]=\"\n col.hintFormatter ? (col.hintFormatter | functionCaller1: row | async) : null\n \">\n <ng-template #cellContent>\n @switch (true) {\n @case (!!col.routeFormatter) {\n @if (extractRoute | functionCaller2: col : row; as cellRoute) {\n <a\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [queryParams]=\"cellRoute.queryParams\"\n routerLink=\"{{ cellRoute.route }}\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></a>\n }\n }\n @case (!!col.customTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n col.customTemplate;\n context: { $implicit: { row, rowIndex } }\n \" />\n }\n @default {\n <span\n class=\"cell\"\n [ngClass]=\"{ pointer: col.action, link: col.action }\"\n (click)=\"col.action ? col.action(row, col.f) : null\"\n [innerHTML]=\"row | getColFormatted: col | async | valueOrX: '-'\"></span>\n }\n }\n @if (col.expandable) {\n <button\n matTooltip=\"Exapnd\"\n [matTooltipShowDelay]=\"1000\"\n mat-icon-button\n (click)=\"expandCell(row, col, expandModal)\"\n class=\"expandBtn\">\n <mat-icon [inline]=\"true\">open_in_full</mat-icon>\n </button>\n }\n </ng-template>\n\n @if (col._onHoverFunction) {\n <span\n class=\"\"\n [nelDebug]=\"debug()\"\n [nelMouseEntered]=\"{ action: col._onHoverFunction, argument: row }\"\n [nelDelay]=\"col._onHoverDelay\">\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n </span>\n } @else {\n <ng-container *ngTemplateOutlet=\"cellContent\" />\n }\n </td>\n </ng-container>\n }\n\n <!--// -->\n }\n }\n <!-- EXPANDABLE COLUMN-->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"_expandCol\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef aria-label=\"row actions\">&nbsp;</th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"d-flex justify-content-end\">\n <app-btn\n [iconBtn]=\"true\"\n type=\"clear\"\n [customIcon]=\"\n expandedElement() !== row ? 'fa fa-chevron-down' : 'fa fa-chevron-up'\n \"\n aria-label=\"expand row\"\n (mclick)=\"\n expandedElement.set(expandedElement() === row ? null : row);\n clickedExpandRow.emit({ open: expandedElement() === row, row });\n $event.stopPropagation()\n \" />\n </div>\n </td>\n </ng-container>\n }\n <!--// -->\n <!-- Options Column -->\n @if (hasRowOptions()) {\n <ng-container matColumnDef=\"option\" stickyEnd>\n <th mat-header-cell *matHeaderCellDef disableClear></th>\n <td mat-cell *matCellDef=\"let row\">\n @if (rowOptionsMap()) {\n @if (formOptionsMap() | functionCaller: row; as _rowoptions) {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of _rowoptions; track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n } @else {\n <button type=\"button\" [matMenuTriggerFor]=\"menu\" class=\"btn ms-2\">\n <i class=\"fa fa-ellipsis-v me-0\"></i>\n </button>\n <mat-menu #menu=\"matMenu\">\n @for (option of rowOptions(); track option.t) {\n <button\n mat-menu-item\n class=\"{{ option.itemClass }}\"\n (click)=\"option.action?.(row)\">\n @if (option.iconClass) {\n <i class=\"{{ option.iconClass }}\"></i>\n }\n {{ option.t | appTranslate | async }}\n </button>\n }\n </mat-menu>\n }\n </td>\n </ng-container>\n }\n\n @if (rawColumns(); as dcols) {\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n @if (isExpandable()) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td\n mat-cell\n *matCellDef=\"let row\"\n [attr.colspan]=\"dcols?.length || 1\"\n [ngClass]=\"{ hideBorder: row != expandedElement() }\">\n <div\n class=\"example-element-detail\"\n [@detailExpand]=\"row == expandedElement() ? 'expanded' : 'collapsed'\">\n @if (row == expandedElement()) {\n <ng-container\n *ngTemplateOutlet=\"\n expandedRowTemplate();\n context: { $implicit: { row } }\n \"></ng-container>\n }\n </div>\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"dcols\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: dcols\"\n [ngClass]=\"{\n pointer: enableRowClick(),\n disabled: isDisabledFunc() ? isDisabledFunc()(row) : false,\n }\"\n [matTooltip]=\"isDisabledFunc() && isDisabledFunc()(row) ? 'Disabled' : null\"\n (click)=\"enableRowClick() ? rowClick(row) : null\"></tr>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell no-item\" [attr.colspan]=\"dcols?.length || 1\">\n {{ noItemTxt() | appTranslate | async }}\n </td>\n </tr>\n @if (isExpandable()) {\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['expandedDetail']\"\n class=\"expanded-detail-row\"\n [style.height.px]=\"0\"></tr>\n }\n }\n </table>\n </div>\n @if (showPager()) {\n <mat-paginator\n [length]=\"resultsLength()\"\n [pageSizeOptions]=\"computedPageSizeOptions()\"\n [pageSize]=\"pageSize()\"\n showFirstLastButtons></mat-paginator>\n }\n </div>\n</div>\n\n<modal-comp\n [width]=\"selectedCellForExpansion()?.column?.expandedWidth || '900px'\"\n [header]=\"selectedCellForExpansion()?.column?.t\"\n [showFooter]=\"false\"\n (modalClose)=\"closeExpandedCell()\"\n #expandModal>\n <ng-template modalBody>\n @if (selectedCellForExpansion(); as _selected) {\n <div\n class=\"\"\n [innerHTML]=\"\n _selected.row | getColFormattedE: _selected.column | async | valueOrX: '-'\n \"></div>\n }\n </ng-template>\n</modal-comp>\n", styles: [":host ::ng-deep .table-plain .w-1,:host ::ng-deep .table-https .w-1{width:1%}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail{padding:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail.hideBorder{border-bottom:0}:host ::ng-deep .table-plain td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail,:host ::ng-deep .table-https td.cdk-column-expandedDetail.mat-column-expandedDetail .example-element-detail{overflow:hidden;display:flex}:host ::ng-deep .table-plain .mat-cell,:host ::ng-deep .table-https .mat-cell{padding:3px 5px!important}:host ::ng-deep .table-plain .colour,:host ::ng-deep .table-https .colour{height:15px;width:15px;display:inline-block;border-radius:5px}:host ::ng-deep .table-plain .centerCells .mat-sort-header-container,:host ::ng-deep .table-plain .centerCells .mat-mdc-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-sort-header-container,:host ::ng-deep .table-https .centerCells .mat-mdc-sort-header-container{justify-content:center}:host ::ng-deep .table-plain .default.colour,:host ::ng-deep .table-https .default.colour{background-color:#545454}:host ::ng-deep .table-plain .btn-cell,:host ::ng-deep .table-https .btn-cell{width:1%}:host ::ng-deep .table-plain input[type=checkbox]:not(.form-control),:host ::ng-deep .table-https input[type=checkbox]:not(.form-control){border:1px solid rgba(80,78,245,.3019607843)}:host ::ng-deep .table-plain .mat-header-cell,:host ::ng-deep .table-plain .mat-mdc-header-cell,:host ::ng-deep .table-https .mat-header-cell,:host ::ng-deep .table-https .mat-mdc-header-cell{vertical-align:middle;color:var(--primary);font-style:normal;font-weight:600;font-size:14px;text-align:center}:host ::ng-deep .table-plain .mat-table-sticky-border-elem-left,:host ::ng-deep .table-plain .mat-mdc-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-table-sticky-border-elem-left,:host ::ng-deep .table-https .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0;background-color:#fff}:host ::ng-deep .table-plain .mat-mdc-table-sticky,:host ::ng-deep .table-https .mat-mdc-table-sticky{background-color:#fff!important}:host ::ng-deep .table-plain .smallerFonts td,:host ::ng-deep .table-plain .smallerFonts th,:host ::ng-deep .table-https .smallerFonts td,:host ::ng-deep .table-https .smallerFonts th{font-size:.7rem}:host ::ng-deep .table-plain .nowrap td,:host ::ng-deep .table-plain .nowrap th,:host ::ng-deep .table-https .nowrap td,:host ::ng-deep .table-https .nowrap th{white-space:nowrap;text-align:left;padding:5px}:host ::ng-deep .table-plain table tr,:host ::ng-deep .table-https table tr{position:relative}:host ::ng-deep .table-plain table tr.mat-mdc-row,:host ::ng-deep .table-plain table tr.mat-mdc-header-row,:host ::ng-deep .table-plain table tr .mat-header-row,:host ::ng-deep .table-https table tr.mat-mdc-row,:host ::ng-deep .table-https table tr.mat-mdc-header-row,:host ::ng-deep .table-https table tr .mat-header-row{height:52px}:host ::ng-deep .table-plain table tr td:hover,:host ::ng-deep .table-https table tr td:hover{color:unset!important;text-decoration:unset;cursor:unset}:host ::ng-deep .table-plain table tr.disabled:after,:host ::ng-deep .table-https table tr.disabled:after{content:\" \";display:block;background-color:#c7c7c726;width:100%;height:100%;position:absolute;top:0;left:0;z-index:11111;cursor:not-allowed}:host ::ng-deep .table-plain .centerCells td,:host ::ng-deep .table-https .centerCells td{text-align:center}:host ::ng-deep .table-plain .curvy tr,:host ::ng-deep .table-https .curvy tr{border-radius:0 10px}:host ::ng-deep .table-plain .inline-block,:host ::ng-deep .table-https .inline-block{display:inline-block}:host ::ng-deep .table-plain td.no-item,:host ::ng-deep .table-https td.no-item{border-bottom:none!important;height:50px}\n"] }]
21480
21484
  }], ctorParameters: () => [], propDecorators: { disableSelectionByField: [{
21481
21485
  type: Input
21482
21486
  }], _view: [{
@@ -24605,6 +24609,7 @@ class FindItemComponent extends BaseFormGenerator {
24605
24609
  this.id = input(location.href, ...(ngDevMode ? [{ debugName: "id" }] : []));
24606
24610
  /** Whether to automatically order form fields */
24607
24611
  this.autoOrder = input(true, ...(ngDevMode ? [{ debugName: "autoOrder" }] : []));
24612
+ this.enableRowClick = input(true, ...(ngDevMode ? [{ debugName: "enableRowClick" }] : []));
24608
24613
  /** Text to display on the search button */
24609
24614
  this.searchButtonText = input('Search', ...(ngDevMode ? [{ debugName: "searchButtonText" }] : []));
24610
24615
  /** Icon to display on the search button */
@@ -25077,7 +25082,7 @@ class FindItemComponent extends BaseFormGenerator {
25077
25082
  this._loading.set(false);
25078
25083
  }
25079
25084
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: FindItemComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
25080
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.2", type: FindItemComponent, isStandalone: true, selector: "app-find-item,find-item", inputs: { autoFormatSchema: { classPropertyName: "autoFormatSchema", publicName: "autoFormatSchema", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, autoOrder: { classPropertyName: "autoOrder", publicName: "autoOrder", isSignal: true, isRequired: false, transformFunction: null }, searchButtonText: { classPropertyName: "searchButtonText", publicName: "searchButtonText", isSignal: true, isRequired: false, transformFunction: null }, searchButtonIcon: { classPropertyName: "searchButtonIcon", publicName: "searchButtonIcon", isSignal: true, isRequired: false, transformFunction: null }, centerCells: { classPropertyName: "centerCells", publicName: "centerCells", isSignal: true, isRequired: false, transformFunction: null }, _displayedColumns: { classPropertyName: "_displayedColumns", publicName: "displayedColumns", isSignal: true, isRequired: false, transformFunction: null }, gridClass: { classPropertyName: "gridClass", publicName: "gridClass", isSignal: true, isRequired: false, transformFunction: null }, hideForm: { classPropertyName: "hideForm", publicName: "hideForm", isSignal: true, isRequired: false, transformFunction: null }, customTableCellTemplates: { classPropertyName: "customTableCellTemplates", publicName: "customTableCellTemplates", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, rowOptionsMap: { classPropertyName: "rowOptionsMap", publicName: "rowOptionsMap", isSignal: true, isRequired: false, transformFunction: null }, isExpandable: { classPropertyName: "isExpandable", publicName: "isExpandable", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, nowrap: { classPropertyName: "nowrap", publicName: "nowrap", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "rowOptions", isSignal: true, isRequired: false, transformFunction: null }, orderDirection: { classPropertyName: "orderDirection", publicName: "orderDirection", isSignal: true, isRequired: false, transformFunction: null }, orderField: { classPropertyName: "orderField", publicName: "orderField", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, searchFunction: { classPropertyName: "searchFunction", publicName: "searchFunction", isSignal: true, isRequired: false, transformFunction: null }, showData: { classPropertyName: "showData", publicName: "showData", isSignal: true, isRequired: false, transformFunction: null }, searchIfNoQuery: { classPropertyName: "searchIfNoQuery", publicName: "searchIfNoQuery", isSignal: true, isRequired: false, transformFunction: null }, isCompact: { classPropertyName: "isCompact", publicName: "isCompact", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, showFilter: { classPropertyName: "showFilter", publicName: "showFilter", isSignal: true, isRequired: false, transformFunction: null }, showRefreshBtn: { classPropertyName: "showRefreshBtn", publicName: "showRefreshBtn", isSignal: true, isRequired: false, transformFunction: null }, useStaticLoader: { classPropertyName: "useStaticLoader", publicName: "useStaticLoader", isSignal: true, isRequired: false, transformFunction: null }, striped: { classPropertyName: "striped", publicName: "striped", isSignal: true, isRequired: false, transformFunction: null }, searchPromptText: { classPropertyName: "searchPromptText", publicName: "searchPromptText", isSignal: true, isRequired: false, transformFunction: null }, startSectionTemplate: { classPropertyName: "startSectionTemplate", publicName: "startSectionTemplate", isSignal: true, isRequired: false, transformFunction: null }, showSearchBtn: { classPropertyName: "showSearchBtn", publicName: "showSearchBtn", isSignal: true, isRequired: false, transformFunction: null }, showClearBtn: { classPropertyName: "showClearBtn", publicName: "showClearBtn", isSignal: true, isRequired: false, transformFunction: null }, showFormError: { classPropertyName: "showFormError", publicName: "showFormError", isSignal: true, isRequired: false, transformFunction: null }, showValidationMsg: { classPropertyName: "showValidationMsg", publicName: "showValidationMsg", isSignal: true, isRequired: false, transformFunction: null }, createBtnRoute: { classPropertyName: "createBtnRoute", publicName: "createBtnRoute", isSignal: true, isRequired: false, transformFunction: null }, showAdditionalColumns: { classPropertyName: "showAdditionalColumns", publicName: "showAdditionalColumns", isSignal: true, isRequired: false, transformFunction: null }, smallerFonts: { classPropertyName: "smallerFonts", publicName: "smallerFonts", isSignal: true, isRequired: false, transformFunction: null }, useSelection: { classPropertyName: "useSelection", publicName: "useSelection", isSignal: true, isRequired: false, transformFunction: null }, initialQuery: { classPropertyName: "initialQuery", publicName: "initialQuery", isSignal: true, isRequired: false, transformFunction: null }, createButton: { classPropertyName: "createButton", publicName: "createButton", isSignal: true, isRequired: false, transformFunction: null }, _formSchema: { classPropertyName: "_formSchema", publicName: "formSchema", isSignal: false, isRequired: false, transformFunction: null }, searchObservableFunc: { classPropertyName: "searchObservableFunc", publicName: "searchObservableFunc", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { initialQuery: "initialQueryChange", _rowClick: "rowClick", clickedExpandRow: "clickedExpandRow", clickedCreate: "clickedCreate" }, viewQueries: [{ propertyName: "actionBtns", predicate: ["actionBtn"], descendants: true, isSignal: true }, { propertyName: "tableHTTPSREF", first: true, predicate: (TableHttpsComponent), descendants: true, isSignal: true }, { propertyName: "tablePlainRef", first: true, predicate: (TablePlainComponent), descendants: true, isSignal: true }, { propertyName: "tableHTTPSREFSignal", first: true, predicate: TableHttpsComponent, descendants: true, isSignal: true }, { propertyName: "tablePlainRefSignal", first: true, predicate: TablePlainComponent, descendants: true, isSignal: true }, { propertyName: "formErrorRef", first: true, predicate: FormErrorComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<loader [loading]=\"_loading()\" [useStaticLoader]=\"useStaticLoader()\">\n @if (!hideForm() && searchForm()) {\n <div class=\"row align-items-center\">\n @for (scheme of computedFormSchema(); track scheme.field) {\n <form class=\"{{ gridClass() }} \" (ngSubmit)=\"fieldAction(scheme)\">\n <div class=\"form-cell\" [ngClass]=\"{ showValidationMsg: showValidationMsg() }\">\n <ng-template #actionCell let-formField>\n <span #actionBtn [id]=\"formField.name()\">\n <app-btn\n [icon]=\"scheme.icon || 'show'\"\n [group]=\"scheme.standalone && scheme.action ? 'show' : null\"\n actionType=\"submit\"\n [disabled]=\"!formField?.validSignal()\" />\n </span>\n </ng-template>\n\n @switch (scheme.type) {\n @case ('template') {\n <ng-container\n *ngTemplateOutlet=\"\n customTemplates()[scheme.field];\n context: { $implicit: { scheme, form: scheme.form } }\n \" />\n }\n @case ('tel') {\n <app-phone-number\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [name]=\"scheme.field\"\n [showLabel]=\"false\"\n [showValidation]=\"scheme.showValidation\"\n [showValidationIcon]=\"scheme.showValidationIcon\"\n [countryCode3]=\"scheme.countryCode3\"\n [showValidationMsg]=\"showValidationMsg()\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue() : (scheme.field | toAny)\n \"\n #inputTag />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n @case ('autocomplete') {\n <app-autocomplete\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [optionsFunc]=\"scheme.optionsFunc\"\n [name]=\"scheme.field\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [options]=\"scheme.options\"\n [showValidationMsg]=\"showValidationMsg()\"\n [hint]=\"scheme.hint\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \"\n #inputTag />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n @default {\n <app-input-basic\n #inputTag\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"inputTag.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"inputTag.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [showValidationMsg]=\"showValidationMsg()\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n }\n </div>\n </form>\n }\n <div class=\"col-md justify-content-end gap-1 align-items-center d-flex\">\n @if (showFormError()) {\n <form-error #feTag [customResult]=\"true\" [inline]=\"true\" [form]=\"searchForm()\" />\n }\n @if (showClearBtn()) {\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilters()\" />\n }\n @if (showSearchBtn()) {\n <app-btn\n [group]=\"'search'\"\n [iconBtn]=\"true\"\n [text]=\"searchButtonText()\"\n [icon]=\"searchButtonIcon()\"\n actionType=\"submit\"\n [form]=\"searchForm()\"\n (mclick)=\"search()\"\n [excludeLogging]=\"true\"\n [disabled]=\"!searchFunction() && !isTablePaginated()\" />\n }\n @if (isCompact()) {\n <app-btn\n [showHelpIcon]=\"false\"\n [excludeLogging]=\"true\"\n help=\"Search Fields\"\n customIcon=\"fa fa-ellipsis-v\"\n (mclick)=\"extraFieldsModal.open(); tempSelectedCompactedFields.set([])\" />\n <modal-comp #extraFieldsModal header=\"Additional Search Fields\" width=\"800px\">\n <ng-template modalBody>\n <toggle-input-form\n [valueField]=\"'field' | toAny\"\n labelField=\"label\"\n [gridNo]=\"3\"\n [checkedChecker]=\"asfCheckedChecker()\"\n [list]=\"compactedFields()\"\n (selected)=\"tempSelectedCompactedFields.set($event)\" />\n </ng-template>\n <ng-template modalFooter>\n <app-btn\n icon=\"save\"\n (mclick)=\"extraFieldsModal.close(); selectedCompactedFields()\"\n text=\"Save\" />\n </ng-template>\n </modal-comp>\n }\n @if (createButton()) {\n @if (createBtnRoute()) {\n <app-btn\n type=\"outline\"\n text=\"Create\"\n icon=\"add\"\n (mclick)=\"clickedCreate.emit()\"\n routerLink=\"{{ createBtnRoute() }}\" />\n } @else {\n <app-btn type=\"outline\" text=\"Create\" icon=\"add\" (mclick)=\"clickedCreate.emit()\" />\n }\n }\n </div>\n </div>\n @if (showFormError()) {\n <ng-container *ngTemplateOutlet=\"formErrorRef().resultTemplateRef()\"></ng-container>\n }\n }\n\n <ng-content select=\"[tablePanel]\"></ng-content>\n <!-- {{searchForm()?.getRawValue()|json}}\n <hr>\n {{standaloneForm()?.getRawValue()|json}} -->\n @if (hasColumns()) {\n <div class=\"mt-3\" [hidden]=\"hideTable()\">\n <ng-container>\n @if (isTablePaginated()) {\n <table-https\n #tableHTTPS\n [searchIfNoQuery]=\"searchIfNoQuery()\"\n [displayedColumns]=\"displayedColumns()\"\n [observableFunc]=\"searchObservableFunc()\"\n (rowClick)=\"rowClick($event)\"\n [centerCells]=\"centerCells()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [isExpandable]=\"isExpandable()\"\n [customTemplates]=\"customTableCellTemplates()\"\n [label]=\"label()\"\n [striped]=\"striped()\"\n [nowrap]=\"nowrap()\"\n [orderDirection]=\"orderDirection()\"\n [orderField]=\"orderField()\"\n [pageSize]=\"pageSize()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [searchPromptText]=\"searchPromptText()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [(queryData)]=\"initialQuery\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [showExport]=\"showExport()\"\n [showRefreshBtn]=\"showRefreshBtn()\"\n [smallerFonts]=\"smallerFonts()\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [useSelection]=\"useSelection()\"\n (clickedExpandRow)=\"clickedExpandRow.emit($event)\"\n noItemTxt=\"No results found\" />\n } @else {\n @if (searchIfNoQuery() || data()?.length || searched()) {\n <table-plain\n [distinct]=\"true\"\n [showPager]=\"true\"\n [pageSize]=\"pageSize()\"\n [centerCells]=\"false\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [smallerFonts]=\"smallerFonts()\"\n [nowrap]=\"nowrap()\"\n [showFilter]=\"showFilter()\"\n [showExport]=\"showExport()\"\n [isExpandable]=\"isExpandable()\"\n [customTemplates]=\"customTableCellTemplates()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [label]=\"label()\"\n [striped]=\"striped()\"\n noItemTxt=\"No results found\"\n (rowClick)=\"rowClick($event)\"\n [orderField]=\"orderField()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [orderDirection]=\"orderDirection()\"\n [displayedColumns]=\"displayedColumns()\"\n (clickedExpandRow)=\"clickedExpandRow.emit($event)\"\n [data]=\"data()\" />\n } @else {\n <div class=\"text-center p-3\">\n {{ 'Please type a search query' | appTranslate | async }}\n </div>\n }\n }\n </ng-container>\n </div>\n }\n</loader>\n", styles: [":host .form-cell{display:flex;align-items:end;gap:8px}:host .form-cell.showValidationMsg{align-items:center}:host .form-cell>*:first-child{width:100%}\n"], dependencies: [{ kind: "component", type: LoaderComponent, selector: "loader", inputs: ["class", "text", "loading", "height", "width", "useStaticLoader", "ratioHW"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: PhoneNumberComponent, selector: "app-phone-number", inputs: ["showLabel", "countryCode3", "config"], outputs: ["onCountrySelect"] }, { kind: "component", type: AutocompleteComponent, selector: "app-autocomplete,autocomplete", inputs: ["showRequiredTag", "validate", "skipDoesOptionExistCheck", "options"], outputs: ["skipDoesOptionExistCheckChange"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: InputBasicComponent, selector: "app-input-basic,app-input", inputs: ["accept", "autocomplete", "input", "contextData", "decimalPoints", "files", "hide", "clearOnDisable", "labelLink", "loading", "multiple", "optionsFunc", "vms", "setCurrentDate", "options"], outputs: ["loadingChange", "mSelectedOptionLabel"] }, { kind: "component", type: ModalComponent, selector: "modal-comp", inputs: ["header", "bodyTemplateRef", "footerTemplateRef", "showHeader", "loading", "isFullscreen", "showFooter", "width", "minWidth", "height", "maxHeight", "icon", "data", "disableClose", "hasBackdrop", "baseConfig"], outputs: ["headerChange", "showHeaderChange", "mouseLeft", "loadingChange", "showFooterChange", "modalOpen", "modalClose"] }, { kind: "directive", type: ModalBodyDirective, selector: "[modalBody]" }, { kind: "directive", type: ModalFooterDirective, selector: "[modalFooter]" }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "verbose", "translatorOptions", "loading", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "form", "forms", "help", "helpShowDelay", "iconBtn", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid", "disabled"], outputs: ["loadingChange", "leftCustomIconChange", "mclick", "disabledChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ToggleInputFormComponent, selector: "toggle-input-form", inputs: ["addToFormFunc", "defaultToggleAll", "readOnly", "hideSearchMenu", "hideGridMenu", "hideToggle", "deleteFromFormFunc", "gridNo", "labelField", "labelSeparator", "searchQuery", "showToggleAll", "valueField", "checkedChecker", "list"], outputs: ["gridNoChange", "searchQueryChange", "selected"] }, { kind: "component", type: TableHttpsComponent, selector: "table-https", inputs: ["observableFunc", "pageNumber", "queryData", "searchIfNoQuery", "showRefreshBtn", "useStaticLoader", "searchPromptText"], outputs: ["queryDataChange", "dataFetched"] }, { kind: "component", type: TablePlainComponent, selector: "table-plain", inputs: ["customSelectClass", "idField", "obsDataSource", "showFilter", "showPager", "disableSelectionByField", "filterExactMatch", "data", "filterFields", "filterFieldsMap", "selectionPerPage"], outputs: ["view", "dataChanged", "filterChange", "listMutated"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: FormErrorComponent, selector: "form-error", inputs: ["form", "customResult", "inline", "lgGridNo", "xxlGridNo"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "appTranslate" }, { kind: "pipe", type: FunctionCaller2, name: "functionCaller2" }, { kind: "pipe", type: ToAnyPipe, name: "toAny" }, { kind: "pipe", type: widthOffsetPipe, name: "widthOffsetPipe" }] }); }
25085
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.2", type: FindItemComponent, isStandalone: true, selector: "app-find-item,find-item", inputs: { autoFormatSchema: { classPropertyName: "autoFormatSchema", publicName: "autoFormatSchema", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, autoOrder: { classPropertyName: "autoOrder", publicName: "autoOrder", isSignal: true, isRequired: false, transformFunction: null }, enableRowClick: { classPropertyName: "enableRowClick", publicName: "enableRowClick", isSignal: true, isRequired: false, transformFunction: null }, searchButtonText: { classPropertyName: "searchButtonText", publicName: "searchButtonText", isSignal: true, isRequired: false, transformFunction: null }, searchButtonIcon: { classPropertyName: "searchButtonIcon", publicName: "searchButtonIcon", isSignal: true, isRequired: false, transformFunction: null }, centerCells: { classPropertyName: "centerCells", publicName: "centerCells", isSignal: true, isRequired: false, transformFunction: null }, _displayedColumns: { classPropertyName: "_displayedColumns", publicName: "displayedColumns", isSignal: true, isRequired: false, transformFunction: null }, gridClass: { classPropertyName: "gridClass", publicName: "gridClass", isSignal: true, isRequired: false, transformFunction: null }, hideForm: { classPropertyName: "hideForm", publicName: "hideForm", isSignal: true, isRequired: false, transformFunction: null }, customTableCellTemplates: { classPropertyName: "customTableCellTemplates", publicName: "customTableCellTemplates", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, rowOptionsMap: { classPropertyName: "rowOptionsMap", publicName: "rowOptionsMap", isSignal: true, isRequired: false, transformFunction: null }, isExpandable: { classPropertyName: "isExpandable", publicName: "isExpandable", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, nowrap: { classPropertyName: "nowrap", publicName: "nowrap", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "rowOptions", isSignal: true, isRequired: false, transformFunction: null }, orderDirection: { classPropertyName: "orderDirection", publicName: "orderDirection", isSignal: true, isRequired: false, transformFunction: null }, orderField: { classPropertyName: "orderField", publicName: "orderField", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, searchFunction: { classPropertyName: "searchFunction", publicName: "searchFunction", isSignal: true, isRequired: false, transformFunction: null }, showData: { classPropertyName: "showData", publicName: "showData", isSignal: true, isRequired: false, transformFunction: null }, searchIfNoQuery: { classPropertyName: "searchIfNoQuery", publicName: "searchIfNoQuery", isSignal: true, isRequired: false, transformFunction: null }, isCompact: { classPropertyName: "isCompact", publicName: "isCompact", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, showFilter: { classPropertyName: "showFilter", publicName: "showFilter", isSignal: true, isRequired: false, transformFunction: null }, showRefreshBtn: { classPropertyName: "showRefreshBtn", publicName: "showRefreshBtn", isSignal: true, isRequired: false, transformFunction: null }, useStaticLoader: { classPropertyName: "useStaticLoader", publicName: "useStaticLoader", isSignal: true, isRequired: false, transformFunction: null }, striped: { classPropertyName: "striped", publicName: "striped", isSignal: true, isRequired: false, transformFunction: null }, searchPromptText: { classPropertyName: "searchPromptText", publicName: "searchPromptText", isSignal: true, isRequired: false, transformFunction: null }, startSectionTemplate: { classPropertyName: "startSectionTemplate", publicName: "startSectionTemplate", isSignal: true, isRequired: false, transformFunction: null }, showSearchBtn: { classPropertyName: "showSearchBtn", publicName: "showSearchBtn", isSignal: true, isRequired: false, transformFunction: null }, showClearBtn: { classPropertyName: "showClearBtn", publicName: "showClearBtn", isSignal: true, isRequired: false, transformFunction: null }, showFormError: { classPropertyName: "showFormError", publicName: "showFormError", isSignal: true, isRequired: false, transformFunction: null }, showValidationMsg: { classPropertyName: "showValidationMsg", publicName: "showValidationMsg", isSignal: true, isRequired: false, transformFunction: null }, createBtnRoute: { classPropertyName: "createBtnRoute", publicName: "createBtnRoute", isSignal: true, isRequired: false, transformFunction: null }, showAdditionalColumns: { classPropertyName: "showAdditionalColumns", publicName: "showAdditionalColumns", isSignal: true, isRequired: false, transformFunction: null }, smallerFonts: { classPropertyName: "smallerFonts", publicName: "smallerFonts", isSignal: true, isRequired: false, transformFunction: null }, useSelection: { classPropertyName: "useSelection", publicName: "useSelection", isSignal: true, isRequired: false, transformFunction: null }, initialQuery: { classPropertyName: "initialQuery", publicName: "initialQuery", isSignal: true, isRequired: false, transformFunction: null }, createButton: { classPropertyName: "createButton", publicName: "createButton", isSignal: true, isRequired: false, transformFunction: null }, _formSchema: { classPropertyName: "_formSchema", publicName: "formSchema", isSignal: false, isRequired: false, transformFunction: null }, searchObservableFunc: { classPropertyName: "searchObservableFunc", publicName: "searchObservableFunc", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { initialQuery: "initialQueryChange", _rowClick: "rowClick", clickedExpandRow: "clickedExpandRow", clickedCreate: "clickedCreate" }, viewQueries: [{ propertyName: "actionBtns", predicate: ["actionBtn"], descendants: true, isSignal: true }, { propertyName: "tableHTTPSREF", first: true, predicate: (TableHttpsComponent), descendants: true, isSignal: true }, { propertyName: "tablePlainRef", first: true, predicate: (TablePlainComponent), descendants: true, isSignal: true }, { propertyName: "tableHTTPSREFSignal", first: true, predicate: TableHttpsComponent, descendants: true, isSignal: true }, { propertyName: "tablePlainRefSignal", first: true, predicate: TablePlainComponent, descendants: true, isSignal: true }, { propertyName: "formErrorRef", first: true, predicate: FormErrorComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<loader [loading]=\"_loading()\" [useStaticLoader]=\"useStaticLoader()\">\n @if (!hideForm() && searchForm()) {\n <div class=\"row align-items-center\">\n @for (scheme of computedFormSchema(); track scheme.field) {\n <form class=\"{{ gridClass() }} \" (ngSubmit)=\"fieldAction(scheme)\">\n <div class=\"form-cell\" [ngClass]=\"{ showValidationMsg: showValidationMsg() }\">\n <ng-template #actionCell let-formField>\n <span #actionBtn [id]=\"formField.name()\">\n <app-btn\n [icon]=\"scheme.icon || 'show'\"\n [group]=\"scheme.standalone && scheme.action ? 'show' : null\"\n actionType=\"submit\"\n [disabled]=\"!formField?.validSignal()\" />\n </span>\n </ng-template>\n\n @switch (scheme.type) {\n @case ('template') {\n <ng-container\n *ngTemplateOutlet=\"\n customTemplates()[scheme.field];\n context: { $implicit: { scheme, form: scheme.form } }\n \" />\n }\n @case ('tel') {\n <app-phone-number\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [name]=\"scheme.field\"\n [showLabel]=\"false\"\n [showValidation]=\"scheme.showValidation\"\n [showValidationIcon]=\"scheme.showValidationIcon\"\n [countryCode3]=\"scheme.countryCode3\"\n [showValidationMsg]=\"showValidationMsg()\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue() : (scheme.field | toAny)\n \"\n #inputTag />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n @case ('autocomplete') {\n <app-autocomplete\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [optionsFunc]=\"scheme.optionsFunc\"\n [name]=\"scheme.field\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [options]=\"scheme.options\"\n [showValidationMsg]=\"showValidationMsg()\"\n [hint]=\"scheme.hint\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \"\n #inputTag />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n @default {\n <app-input-basic\n #inputTag\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"inputTag.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"inputTag.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [showValidationMsg]=\"showValidationMsg()\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n }\n </div>\n </form>\n }\n <div class=\"col-md justify-content-end gap-1 align-items-center d-flex\">\n @if (showFormError()) {\n <form-error #feTag [customResult]=\"true\" [inline]=\"true\" [form]=\"searchForm()\" />\n }\n @if (showClearBtn()) {\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilters()\" />\n }\n @if (showSearchBtn()) {\n <app-btn\n [group]=\"'search'\"\n [iconBtn]=\"true\"\n [text]=\"searchButtonText()\"\n [icon]=\"searchButtonIcon()\"\n actionType=\"submit\"\n [form]=\"searchForm()\"\n (mclick)=\"search()\"\n [excludeLogging]=\"true\"\n [disabled]=\"!searchFunction() && !isTablePaginated()\" />\n }\n @if (isCompact()) {\n <app-btn\n [showHelpIcon]=\"false\"\n [excludeLogging]=\"true\"\n help=\"Search Fields\"\n customIcon=\"fa fa-ellipsis-v\"\n (mclick)=\"extraFieldsModal.open(); tempSelectedCompactedFields.set([])\" />\n <modal-comp #extraFieldsModal header=\"Additional Search Fields\" width=\"800px\">\n <ng-template modalBody>\n <toggle-input-form\n [valueField]=\"'field' | toAny\"\n labelField=\"label\"\n [gridNo]=\"3\"\n [checkedChecker]=\"asfCheckedChecker()\"\n [list]=\"compactedFields()\"\n (selected)=\"tempSelectedCompactedFields.set($event)\" />\n </ng-template>\n <ng-template modalFooter>\n <app-btn\n icon=\"save\"\n (mclick)=\"extraFieldsModal.close(); selectedCompactedFields()\"\n text=\"Save\" />\n </ng-template>\n </modal-comp>\n }\n @if (createButton()) {\n @if (createBtnRoute()) {\n <app-btn\n type=\"outline\"\n text=\"Create\"\n icon=\"add\"\n (mclick)=\"clickedCreate.emit()\"\n routerLink=\"{{ createBtnRoute() }}\" />\n } @else {\n <app-btn type=\"outline\" text=\"Create\" icon=\"add\" (mclick)=\"clickedCreate.emit()\" />\n }\n }\n </div>\n </div>\n @if (showFormError()) {\n <ng-container *ngTemplateOutlet=\"formErrorRef().resultTemplateRef()\"></ng-container>\n }\n }\n\n <ng-content select=\"[tablePanel]\"></ng-content>\n <!-- {{searchForm()?.getRawValue()|json}}\n <hr>\n {{standaloneForm()?.getRawValue()|json}} -->\n @if (hasColumns()) {\n <div class=\"mt-3\" [hidden]=\"hideTable()\">\n <ng-container>\n @if (isTablePaginated()) {\n <table-https\n #tableHTTPS\n [searchIfNoQuery]=\"searchIfNoQuery()\"\n [displayedColumns]=\"displayedColumns()\"\n [observableFunc]=\"searchObservableFunc()\"\n (rowClick)=\"rowClick($event)\"\n [centerCells]=\"centerCells()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [isExpandable]=\"isExpandable()\"\n [customTemplates]=\"customTableCellTemplates()\"\n [label]=\"label()\"\n [enableRowClick]=\"enableRowClick()\"\n [striped]=\"striped()\"\n [nowrap]=\"nowrap()\"\n [orderDirection]=\"orderDirection()\"\n [orderField]=\"orderField()\"\n [pageSize]=\"pageSize()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [searchPromptText]=\"searchPromptText()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [(queryData)]=\"initialQuery\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [showExport]=\"showExport()\"\n [showRefreshBtn]=\"showRefreshBtn()\"\n [smallerFonts]=\"smallerFonts()\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [useSelection]=\"useSelection()\"\n (clickedExpandRow)=\"clickedExpandRow.emit($event)\"\n noItemTxt=\"No results found\" />\n } @else {\n @if (searchIfNoQuery() || data()?.length || searched()) {\n <table-plain\n [distinct]=\"true\"\n [showPager]=\"true\"\n [pageSize]=\"pageSize()\"\n [centerCells]=\"false\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [smallerFonts]=\"smallerFonts()\"\n [nowrap]=\"nowrap()\"\n [enableRowClick]=\"enableRowClick()\"\n [showFilter]=\"showFilter()\"\n [showExport]=\"showExport()\"\n [isExpandable]=\"isExpandable()\"\n [customTemplates]=\"customTableCellTemplates()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [label]=\"label()\"\n [striped]=\"striped()\"\n noItemTxt=\"No results found\"\n (rowClick)=\"rowClick($event)\"\n [orderField]=\"orderField()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [orderDirection]=\"orderDirection()\"\n [displayedColumns]=\"displayedColumns()\"\n (clickedExpandRow)=\"clickedExpandRow.emit($event)\"\n [data]=\"data()\" />\n } @else {\n <div class=\"text-center p-3\">\n {{ 'Please type a search query' | appTranslate | async }}\n </div>\n }\n }\n </ng-container>\n </div>\n }\n</loader>\n", styles: [":host .form-cell{display:flex;align-items:end;gap:8px}:host .form-cell.showValidationMsg{align-items:center}:host .form-cell>*:first-child{width:100%}\n"], dependencies: [{ kind: "component", type: LoaderComponent, selector: "loader", inputs: ["class", "text", "loading", "height", "width", "useStaticLoader", "ratioHW"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: PhoneNumberComponent, selector: "app-phone-number", inputs: ["showLabel", "countryCode3", "config"], outputs: ["onCountrySelect"] }, { kind: "component", type: AutocompleteComponent, selector: "app-autocomplete,autocomplete", inputs: ["showRequiredTag", "validate", "skipDoesOptionExistCheck", "options"], outputs: ["skipDoesOptionExistCheckChange"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: InputBasicComponent, selector: "app-input-basic,app-input", inputs: ["accept", "autocomplete", "input", "contextData", "decimalPoints", "files", "hide", "clearOnDisable", "labelLink", "loading", "multiple", "optionsFunc", "vms", "setCurrentDate", "options"], outputs: ["loadingChange", "mSelectedOptionLabel"] }, { kind: "component", type: ModalComponent, selector: "modal-comp", inputs: ["header", "bodyTemplateRef", "footerTemplateRef", "showHeader", "loading", "isFullscreen", "showFooter", "width", "minWidth", "height", "maxHeight", "icon", "data", "disableClose", "hasBackdrop", "baseConfig"], outputs: ["headerChange", "showHeaderChange", "mouseLeft", "loadingChange", "showFooterChange", "modalOpen", "modalClose"] }, { kind: "directive", type: ModalBodyDirective, selector: "[modalBody]" }, { kind: "directive", type: ModalFooterDirective, selector: "[modalFooter]" }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "verbose", "translatorOptions", "loading", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "form", "forms", "help", "helpShowDelay", "iconBtn", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid", "disabled"], outputs: ["loadingChange", "leftCustomIconChange", "mclick", "disabledChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ToggleInputFormComponent, selector: "toggle-input-form", inputs: ["addToFormFunc", "defaultToggleAll", "readOnly", "hideSearchMenu", "hideGridMenu", "hideToggle", "deleteFromFormFunc", "gridNo", "labelField", "labelSeparator", "searchQuery", "showToggleAll", "valueField", "checkedChecker", "list"], outputs: ["gridNoChange", "searchQueryChange", "selected"] }, { kind: "component", type: TableHttpsComponent, selector: "table-https", inputs: ["observableFunc", "pageNumber", "queryData", "searchIfNoQuery", "showRefreshBtn", "useStaticLoader", "searchPromptText"], outputs: ["queryDataChange", "dataFetched"] }, { kind: "component", type: TablePlainComponent, selector: "table-plain", inputs: ["customSelectClass", "idField", "obsDataSource", "showFilter", "showPager", "disableSelectionByField", "filterExactMatch", "data", "filterFields", "filterFieldsMap", "selectionPerPage"], outputs: ["view", "dataChanged", "filterChange", "listMutated"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: FormErrorComponent, selector: "form-error", inputs: ["form", "customResult", "inline", "lgGridNo", "xxlGridNo"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "appTranslate" }, { kind: "pipe", type: FunctionCaller2, name: "functionCaller2" }, { kind: "pipe", type: ToAnyPipe, name: "toAny" }, { kind: "pipe", type: widthOffsetPipe, name: "widthOffsetPipe" }] }); }
25081
25086
  }
25082
25087
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: FindItemComponent, decorators: [{
25083
25088
  type: Component,
@@ -25105,7 +25110,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImpor
25105
25110
  ToAnyPipe,
25106
25111
  FormErrorComponent,
25107
25112
  widthOffsetPipe,
25108
- ], template: "<loader [loading]=\"_loading()\" [useStaticLoader]=\"useStaticLoader()\">\n @if (!hideForm() && searchForm()) {\n <div class=\"row align-items-center\">\n @for (scheme of computedFormSchema(); track scheme.field) {\n <form class=\"{{ gridClass() }} \" (ngSubmit)=\"fieldAction(scheme)\">\n <div class=\"form-cell\" [ngClass]=\"{ showValidationMsg: showValidationMsg() }\">\n <ng-template #actionCell let-formField>\n <span #actionBtn [id]=\"formField.name()\">\n <app-btn\n [icon]=\"scheme.icon || 'show'\"\n [group]=\"scheme.standalone && scheme.action ? 'show' : null\"\n actionType=\"submit\"\n [disabled]=\"!formField?.validSignal()\" />\n </span>\n </ng-template>\n\n @switch (scheme.type) {\n @case ('template') {\n <ng-container\n *ngTemplateOutlet=\"\n customTemplates()[scheme.field];\n context: { $implicit: { scheme, form: scheme.form } }\n \" />\n }\n @case ('tel') {\n <app-phone-number\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [name]=\"scheme.field\"\n [showLabel]=\"false\"\n [showValidation]=\"scheme.showValidation\"\n [showValidationIcon]=\"scheme.showValidationIcon\"\n [countryCode3]=\"scheme.countryCode3\"\n [showValidationMsg]=\"showValidationMsg()\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue() : (scheme.field | toAny)\n \"\n #inputTag />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n @case ('autocomplete') {\n <app-autocomplete\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [optionsFunc]=\"scheme.optionsFunc\"\n [name]=\"scheme.field\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [options]=\"scheme.options\"\n [showValidationMsg]=\"showValidationMsg()\"\n [hint]=\"scheme.hint\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \"\n #inputTag />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n @default {\n <app-input-basic\n #inputTag\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"inputTag.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"inputTag.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [showValidationMsg]=\"showValidationMsg()\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n }\n </div>\n </form>\n }\n <div class=\"col-md justify-content-end gap-1 align-items-center d-flex\">\n @if (showFormError()) {\n <form-error #feTag [customResult]=\"true\" [inline]=\"true\" [form]=\"searchForm()\" />\n }\n @if (showClearBtn()) {\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilters()\" />\n }\n @if (showSearchBtn()) {\n <app-btn\n [group]=\"'search'\"\n [iconBtn]=\"true\"\n [text]=\"searchButtonText()\"\n [icon]=\"searchButtonIcon()\"\n actionType=\"submit\"\n [form]=\"searchForm()\"\n (mclick)=\"search()\"\n [excludeLogging]=\"true\"\n [disabled]=\"!searchFunction() && !isTablePaginated()\" />\n }\n @if (isCompact()) {\n <app-btn\n [showHelpIcon]=\"false\"\n [excludeLogging]=\"true\"\n help=\"Search Fields\"\n customIcon=\"fa fa-ellipsis-v\"\n (mclick)=\"extraFieldsModal.open(); tempSelectedCompactedFields.set([])\" />\n <modal-comp #extraFieldsModal header=\"Additional Search Fields\" width=\"800px\">\n <ng-template modalBody>\n <toggle-input-form\n [valueField]=\"'field' | toAny\"\n labelField=\"label\"\n [gridNo]=\"3\"\n [checkedChecker]=\"asfCheckedChecker()\"\n [list]=\"compactedFields()\"\n (selected)=\"tempSelectedCompactedFields.set($event)\" />\n </ng-template>\n <ng-template modalFooter>\n <app-btn\n icon=\"save\"\n (mclick)=\"extraFieldsModal.close(); selectedCompactedFields()\"\n text=\"Save\" />\n </ng-template>\n </modal-comp>\n }\n @if (createButton()) {\n @if (createBtnRoute()) {\n <app-btn\n type=\"outline\"\n text=\"Create\"\n icon=\"add\"\n (mclick)=\"clickedCreate.emit()\"\n routerLink=\"{{ createBtnRoute() }}\" />\n } @else {\n <app-btn type=\"outline\" text=\"Create\" icon=\"add\" (mclick)=\"clickedCreate.emit()\" />\n }\n }\n </div>\n </div>\n @if (showFormError()) {\n <ng-container *ngTemplateOutlet=\"formErrorRef().resultTemplateRef()\"></ng-container>\n }\n }\n\n <ng-content select=\"[tablePanel]\"></ng-content>\n <!-- {{searchForm()?.getRawValue()|json}}\n <hr>\n {{standaloneForm()?.getRawValue()|json}} -->\n @if (hasColumns()) {\n <div class=\"mt-3\" [hidden]=\"hideTable()\">\n <ng-container>\n @if (isTablePaginated()) {\n <table-https\n #tableHTTPS\n [searchIfNoQuery]=\"searchIfNoQuery()\"\n [displayedColumns]=\"displayedColumns()\"\n [observableFunc]=\"searchObservableFunc()\"\n (rowClick)=\"rowClick($event)\"\n [centerCells]=\"centerCells()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [isExpandable]=\"isExpandable()\"\n [customTemplates]=\"customTableCellTemplates()\"\n [label]=\"label()\"\n [striped]=\"striped()\"\n [nowrap]=\"nowrap()\"\n [orderDirection]=\"orderDirection()\"\n [orderField]=\"orderField()\"\n [pageSize]=\"pageSize()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [searchPromptText]=\"searchPromptText()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [(queryData)]=\"initialQuery\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [showExport]=\"showExport()\"\n [showRefreshBtn]=\"showRefreshBtn()\"\n [smallerFonts]=\"smallerFonts()\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [useSelection]=\"useSelection()\"\n (clickedExpandRow)=\"clickedExpandRow.emit($event)\"\n noItemTxt=\"No results found\" />\n } @else {\n @if (searchIfNoQuery() || data()?.length || searched()) {\n <table-plain\n [distinct]=\"true\"\n [showPager]=\"true\"\n [pageSize]=\"pageSize()\"\n [centerCells]=\"false\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [smallerFonts]=\"smallerFonts()\"\n [nowrap]=\"nowrap()\"\n [showFilter]=\"showFilter()\"\n [showExport]=\"showExport()\"\n [isExpandable]=\"isExpandable()\"\n [customTemplates]=\"customTableCellTemplates()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [label]=\"label()\"\n [striped]=\"striped()\"\n noItemTxt=\"No results found\"\n (rowClick)=\"rowClick($event)\"\n [orderField]=\"orderField()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [orderDirection]=\"orderDirection()\"\n [displayedColumns]=\"displayedColumns()\"\n (clickedExpandRow)=\"clickedExpandRow.emit($event)\"\n [data]=\"data()\" />\n } @else {\n <div class=\"text-center p-3\">\n {{ 'Please type a search query' | appTranslate | async }}\n </div>\n }\n }\n </ng-container>\n </div>\n }\n</loader>\n", styles: [":host .form-cell{display:flex;align-items:end;gap:8px}:host .form-cell.showValidationMsg{align-items:center}:host .form-cell>*:first-child{width:100%}\n"] }]
25113
+ ], template: "<loader [loading]=\"_loading()\" [useStaticLoader]=\"useStaticLoader()\">\n @if (!hideForm() && searchForm()) {\n <div class=\"row align-items-center\">\n @for (scheme of computedFormSchema(); track scheme.field) {\n <form class=\"{{ gridClass() }} \" (ngSubmit)=\"fieldAction(scheme)\">\n <div class=\"form-cell\" [ngClass]=\"{ showValidationMsg: showValidationMsg() }\">\n <ng-template #actionCell let-formField>\n <span #actionBtn [id]=\"formField.name()\">\n <app-btn\n [icon]=\"scheme.icon || 'show'\"\n [group]=\"scheme.standalone && scheme.action ? 'show' : null\"\n actionType=\"submit\"\n [disabled]=\"!formField?.validSignal()\" />\n </span>\n </ng-template>\n\n @switch (scheme.type) {\n @case ('template') {\n <ng-container\n *ngTemplateOutlet=\"\n customTemplates()[scheme.field];\n context: { $implicit: { scheme, form: scheme.form } }\n \" />\n }\n @case ('tel') {\n <app-phone-number\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [name]=\"scheme.field\"\n [showLabel]=\"false\"\n [showValidation]=\"scheme.showValidation\"\n [showValidationIcon]=\"scheme.showValidationIcon\"\n [countryCode3]=\"scheme.countryCode3\"\n [showValidationMsg]=\"showValidationMsg()\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue() : (scheme.field | toAny)\n \"\n #inputTag />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n @case ('autocomplete') {\n <app-autocomplete\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [optionsFunc]=\"scheme.optionsFunc\"\n [name]=\"scheme.field\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [options]=\"scheme.options\"\n [showValidationMsg]=\"showValidationMsg()\"\n [hint]=\"scheme.hint\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \"\n #inputTag />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n @default {\n <app-input-basic\n #inputTag\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"inputTag.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"inputTag.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [showValidationMsg]=\"showValidationMsg()\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [style.width]=\"\n 'calc(100% - ' +\n (fieldWidthOffsets()[inputTag.nameStrSignal()]?.nativeElement.offsetWidth\n | widthOffsetPipe) +\n 'px )'\n \"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n @if (scheme.needsButton) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { $implicit: inputTag }\" />\n }\n }\n }\n </div>\n </form>\n }\n <div class=\"col-md justify-content-end gap-1 align-items-center d-flex\">\n @if (showFormError()) {\n <form-error #feTag [customResult]=\"true\" [inline]=\"true\" [form]=\"searchForm()\" />\n }\n @if (showClearBtn()) {\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilters()\" />\n }\n @if (showSearchBtn()) {\n <app-btn\n [group]=\"'search'\"\n [iconBtn]=\"true\"\n [text]=\"searchButtonText()\"\n [icon]=\"searchButtonIcon()\"\n actionType=\"submit\"\n [form]=\"searchForm()\"\n (mclick)=\"search()\"\n [excludeLogging]=\"true\"\n [disabled]=\"!searchFunction() && !isTablePaginated()\" />\n }\n @if (isCompact()) {\n <app-btn\n [showHelpIcon]=\"false\"\n [excludeLogging]=\"true\"\n help=\"Search Fields\"\n customIcon=\"fa fa-ellipsis-v\"\n (mclick)=\"extraFieldsModal.open(); tempSelectedCompactedFields.set([])\" />\n <modal-comp #extraFieldsModal header=\"Additional Search Fields\" width=\"800px\">\n <ng-template modalBody>\n <toggle-input-form\n [valueField]=\"'field' | toAny\"\n labelField=\"label\"\n [gridNo]=\"3\"\n [checkedChecker]=\"asfCheckedChecker()\"\n [list]=\"compactedFields()\"\n (selected)=\"tempSelectedCompactedFields.set($event)\" />\n </ng-template>\n <ng-template modalFooter>\n <app-btn\n icon=\"save\"\n (mclick)=\"extraFieldsModal.close(); selectedCompactedFields()\"\n text=\"Save\" />\n </ng-template>\n </modal-comp>\n }\n @if (createButton()) {\n @if (createBtnRoute()) {\n <app-btn\n type=\"outline\"\n text=\"Create\"\n icon=\"add\"\n (mclick)=\"clickedCreate.emit()\"\n routerLink=\"{{ createBtnRoute() }}\" />\n } @else {\n <app-btn type=\"outline\" text=\"Create\" icon=\"add\" (mclick)=\"clickedCreate.emit()\" />\n }\n }\n </div>\n </div>\n @if (showFormError()) {\n <ng-container *ngTemplateOutlet=\"formErrorRef().resultTemplateRef()\"></ng-container>\n }\n }\n\n <ng-content select=\"[tablePanel]\"></ng-content>\n <!-- {{searchForm()?.getRawValue()|json}}\n <hr>\n {{standaloneForm()?.getRawValue()|json}} -->\n @if (hasColumns()) {\n <div class=\"mt-3\" [hidden]=\"hideTable()\">\n <ng-container>\n @if (isTablePaginated()) {\n <table-https\n #tableHTTPS\n [searchIfNoQuery]=\"searchIfNoQuery()\"\n [displayedColumns]=\"displayedColumns()\"\n [observableFunc]=\"searchObservableFunc()\"\n (rowClick)=\"rowClick($event)\"\n [centerCells]=\"centerCells()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [isExpandable]=\"isExpandable()\"\n [customTemplates]=\"customTableCellTemplates()\"\n [label]=\"label()\"\n [enableRowClick]=\"enableRowClick()\"\n [striped]=\"striped()\"\n [nowrap]=\"nowrap()\"\n [orderDirection]=\"orderDirection()\"\n [orderField]=\"orderField()\"\n [pageSize]=\"pageSize()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [searchPromptText]=\"searchPromptText()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [(queryData)]=\"initialQuery\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [showExport]=\"showExport()\"\n [showRefreshBtn]=\"showRefreshBtn()\"\n [smallerFonts]=\"smallerFonts()\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [useSelection]=\"useSelection()\"\n (clickedExpandRow)=\"clickedExpandRow.emit($event)\"\n noItemTxt=\"No results found\" />\n } @else {\n @if (searchIfNoQuery() || data()?.length || searched()) {\n <table-plain\n [distinct]=\"true\"\n [showPager]=\"true\"\n [pageSize]=\"pageSize()\"\n [centerCells]=\"false\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [smallerFonts]=\"smallerFonts()\"\n [nowrap]=\"nowrap()\"\n [enableRowClick]=\"enableRowClick()\"\n [showFilter]=\"showFilter()\"\n [showExport]=\"showExport()\"\n [isExpandable]=\"isExpandable()\"\n [customTemplates]=\"customTableCellTemplates()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [label]=\"label()\"\n [striped]=\"striped()\"\n noItemTxt=\"No results found\"\n (rowClick)=\"rowClick($event)\"\n [orderField]=\"orderField()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [orderDirection]=\"orderDirection()\"\n [displayedColumns]=\"displayedColumns()\"\n (clickedExpandRow)=\"clickedExpandRow.emit($event)\"\n [data]=\"data()\" />\n } @else {\n <div class=\"text-center p-3\">\n {{ 'Please type a search query' | appTranslate | async }}\n </div>\n }\n }\n </ng-container>\n </div>\n }\n</loader>\n", styles: [":host .form-cell{display:flex;align-items:end;gap:8px}:host .form-cell.showValidationMsg{align-items:center}:host .form-cell>*:first-child{width:100%}\n"] }]
25109
25114
  }], propDecorators: { _formSchema: [{
25110
25115
  type: Input,
25111
25116
  args: ['formSchema']