@one-paragon/angular-utilities 2.5.3 → 2.5.4-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -920,6 +920,7 @@ class TableSettings {
920
920
  this.groupHeaderHeight = undefined;
921
921
  this.rowClick = undefined;
922
922
  this.exportSettings = undefined;
923
+ this.groupBySettings = [];
923
924
  }
924
925
  }
925
926
  class PersistedTableSettings {
@@ -959,6 +960,7 @@ class NotPersistedTableSettings {
959
960
  this.headerHeight = undefined;
960
961
  this.rowClick = undefined;
961
962
  this.exportSettings = undefined;
963
+ this.groupBySettings = [];
962
964
  }
963
965
  merge(tableSettings) {
964
966
  const newNpts = merge$1(this, new NotPersistedTableSettings());
@@ -984,6 +986,7 @@ class NotPersistedTableSettings {
984
986
  newNpts.rowStyles = tableSettings.tableSettings?.rowStyles ?? newNpts.rowStyles;
985
987
  newNpts.rowClick = tableSettings.tableSettings?.rowClick ?? newNpts.rowClick;
986
988
  newNpts.exportSettings = tableSettings.tableSettings?.exportSettings ?? newNpts.exportSettings;
989
+ newNpts.groupBySettings = tableSettings.tableSettings?.groupBySettings ?? newNpts.groupBySettings ?? [];
987
990
  if (tableSettings.tableSettings?.virtualScrollSettings) {
988
991
  const currVirt = tableSettings.tableSettings?.virtualScrollSettings || newNpts.virtualSettings;
989
992
  if (!currVirt.headerHeight) {
@@ -2940,6 +2943,28 @@ class TableStore extends ComponentStore {
2940
2943
  const state = this.state();
2941
2944
  return mapSaveableState(state);
2942
2945
  });
2946
+ //#region meta order and hidden
2947
+ this.showColumn = this.updater((state, key) => ({
2948
+ ...state,
2949
+ hiddenKeys: state.hiddenKeys.filter(k => k !== key),
2950
+ }));
2951
+ this.hideColumn = this.updater((state, key) => ({
2952
+ ...state,
2953
+ hiddenKeys: [...state.hiddenKeys.filter(k => k !== key), key],
2954
+ }));
2955
+ this.setHiddenColumns = this.updater((state, displayCols) => {
2956
+ return ({ ...state, hiddenKeys: displayCols.filter(d => !d.visible).map(d => d.key) });
2957
+ });
2958
+ this.setUserDefinedOrder = this.updater((state, moved) => {
2959
+ const { newOrder, oldOrder } = moved;
2960
+ const mdsArr = orderedStateVisibleMetaData(state);
2961
+ moveItemInArray(mdsArr, oldOrder, newOrder);
2962
+ const userDefinedOrder = mdsArr.reduce((aggregate, current, index) => {
2963
+ aggregate[current.key] = index;
2964
+ return aggregate;
2965
+ }, {});
2966
+ return ({ ...state, userDefined: { ...state.userDefined, order: userDefinedOrder } });
2967
+ });
2943
2968
  this.$userDefinedOrder = this.selectSignal(state => state.userDefined.order);
2944
2969
  this.metaData$ = this.select(state => state.metaData);
2945
2970
  this.$metaData = this.selectSignal(state => state.metaData);
@@ -2953,15 +2978,87 @@ class TableStore extends ComponentStore {
2953
2978
  });
2954
2979
  this.$hiddenKeys = this.selectSignal(state => state.hiddenKeys);
2955
2980
  this.$orderedVisibleColumns = this.selectSignal(this.$orderedCodeVisibleMetaDatas, this.$hiddenKeys, (cs, hiddenKeys) => cs.filter(m => !hiddenKeys.includes(m.key)).map(m => m.key));
2981
+ //#endregion meta order and hidden
2982
+ //#region widths
2983
+ this.setUserDefinedWidth = this.updater((state, colWidths) => {
2984
+ const userDefinedWidths = { ...state.userDefined.widths };
2985
+ colWidths.forEach(cw => {
2986
+ userDefinedWidths[cw.key] = cw.widthInPixel;
2987
+ });
2988
+ return { ...state, userDefined: { ...state.userDefined, widths: userDefinedWidths } };
2989
+ });
2990
+ this.setTableWidth = this.updater((state, widthInPixels) => ({ ...state, userDefined: { ...state.userDefined, table: { width: widthInPixels } } }));
2956
2991
  this.$getUserDefinedWidths = this.selectSignal(state => state.userDefined.widths);
2957
2992
  this.$tableSettingsMinWidth = this.selectSignal(state => parseTbSizeToPixels(state.notPersistedTableSettings.minColumnWidth));
2958
2993
  this.$getUserDefinedWidth = (key) => this.selectSignal(this.$getUserDefinedWidths, widths => widths[key]);
2994
+ this.$getUserDefinedTableWidth = this.selectSignal(state => state.userDefined.table.width);
2995
+ this.getUserDefinedTableWidth$ = this.select(state => state.userDefined.table.width);
2996
+ //#endregion widths
2997
+ //#region filter
2998
+ this.addFilter = this.updater((state, filter) => {
2999
+ return this.addFiltersToState(state, [filter]);
3000
+ });
3001
+ this.addFilters = this.updater((state, filters) => {
3002
+ return this.addFiltersToState(state, filters);
3003
+ });
3004
+ this.removeFilter = this.updater((state, filterId) => {
3005
+ const filtersCopy = { ...state.filters };
3006
+ delete filtersCopy[filterId];
3007
+ return ({ ...state, filters: filtersCopy });
3008
+ });
3009
+ this.removeFilters = this.updater((state, filterIds) => {
3010
+ const filtersCopy = { ...state.filters };
3011
+ filterIds.forEach(id => { delete filtersCopy[id]; });
3012
+ return ({ ...state, filters: filtersCopy });
3013
+ });
3014
+ this.clearFilters = this.updater((state) => ({ ...state, filters: {} }));
3015
+ this.addFiltersToState = (state, filters) => {
3016
+ var customFilters = filters.filter(isCustomFilter);
3017
+ var filterInfos = filters.filter(isFilterInfo);
3018
+ const filtersObj = filterInfos
3019
+ .filter(fltr => Object.keys(state.metaData).some(key => key === fltr.key) || console.warn(`Meta data with key ${fltr.key} not found`))
3020
+ .reduce((filtersObj, filter) => {
3021
+ if (!filter.filterId) {
3022
+ filter.filterId = crypto.randomUUID();
3023
+ }
3024
+ filtersObj[filter.filterId] = filter;
3025
+ return filtersObj;
3026
+ }, {});
3027
+ customFilters.forEach(fltr => {
3028
+ if (!fltr.filterId) {
3029
+ fltr.filterId = crypto.randomUUID();
3030
+ }
3031
+ filtersObj[fltr.filterId] = fltr;
3032
+ });
3033
+ return {
3034
+ ...state,
3035
+ filters: { ...state.filters, ...filtersObj }
3036
+ };
3037
+ };
2959
3038
  this.$filters = this.selectSignal(state => state.filters);
2960
3039
  this.$filtersArray = computed(() => Object.values(this.state().filters) || []);
2961
3040
  this.filters$ = this.select(state => state.filters);
2962
3041
  this.$getFilter = (filterId) => {
2963
3042
  return this.selectSignal(this.$filters, filters => filters[filterId]);
2964
3043
  };
3044
+ //#endregion filter
3045
+ //#region sort
3046
+ this.setSort = this.updater((state, { key, direction }) => {
3047
+ const sortArray = state.sorted.filter(s => s.active !== key);
3048
+ if (direction) {
3049
+ sortArray.unshift({ active: key, direction });
3050
+ }
3051
+ return {
3052
+ ...state,
3053
+ sorted: sortArray,
3054
+ };
3055
+ });
3056
+ this.setAllSort = this.updater((state, sortArray) => {
3057
+ return {
3058
+ ...state,
3059
+ sorted: sortArray,
3060
+ };
3061
+ });
2965
3062
  this.$preSort = computed(() => createPreSort(this.$metaData()));
2966
3063
  this._$selectSorted = this.selectSignal(state => state.sorted, {
2967
3064
  equal: sortsAreSame
@@ -2978,15 +3075,90 @@ class TableStore extends ComponentStore {
2978
3075
  this.selectSorted$ = this.select(state => state.sorted).pipe(distinctUntilChanged(sortsAreSame));
2979
3076
  this.$getSorts = this.selectSignal(() => this.$initializationState() !== InitializationState.Ready ? [] : this.$selectSorted());
2980
3077
  this.sort$ = toObservable(this.$getSorts);
2981
- this.$getUserDefinedTableWidth = this.selectSignal(state => state.userDefined.table.width);
2982
- this.getUserDefinedTableWidth$ = this.select(state => state.userDefined.table.width);
2983
- this.$userDefinedRowHeight = this.selectSignal(state => (state.userDefined.rowHeight));
2984
- this.$userDefinedHeaderHeight = this.selectSignal(state => (state.userDefined.headerHeight));
2985
- this.$userDefinedPageSize = this.selectSignal(state => (state.userDefined.pageSize));
2986
- this.$footerCollapsed = this.selectSignal(state => state.persistedTableSettings.collapseFooter);
2987
- this.$headerCollapsed = this.selectSignal(state => state.persistedTableSettings.collapseHeader);
2988
- this.$groupBy = this.selectSignal(state => state.groupBy);
2989
- this.$groupByData = this.selectSignal(this.$groupBy, this.$metaDataArray, (gb, mds) => gb.filter(bg => mds.some(md => md.key === bg.key)), {
3078
+ //#endregion sort
3079
+ //#region groupBy
3080
+ this.addGroupByKey = this.updater((state, metaDataKey) => ({
3081
+ ...state,
3082
+ groupBy: [...state.groupBy, { key: metaDataKey, expandedHeaders: [], sort: '' }]
3083
+ }));
3084
+ this.removeGroupByKey = this.updater((state, groupByKey) => ({
3085
+ ...state,
3086
+ groupBy: state.groupBy.filter(key => groupByKey !== key.key)
3087
+ }));
3088
+ this.updateExpandedGroups = this.updater((state, data) => {
3089
+ const gbk = replaceInArrayWithClone(state.groupBy, k => k.key === data.key, gk => {
3090
+ if (data.isExpanded) {
3091
+ if (gk.expandedHeaders === 'all' || gk.expandedHeaders.includes(data.groupUniqueName))
3092
+ return;
3093
+ gk.expandedHeaders = [...gk.expandedHeaders, data.groupUniqueName];
3094
+ }
3095
+ else {
3096
+ //we need to make sure it will not = all at this point. See generic table setExpanded
3097
+ if (gk.expandedHeaders !== 'all') {
3098
+ gk.expandedHeaders = gk.expandedHeaders.filter(g => g !== data.groupUniqueName);
3099
+ }
3100
+ }
3101
+ });
3102
+ return ({
3103
+ ...state,
3104
+ groupBy: gbk
3105
+ });
3106
+ });
3107
+ this.expandAllOfGroup = this.updater((state, data) => {
3108
+ const newGroupedData = state.groupBy.map(gb => ({
3109
+ key: gb.key,
3110
+ expandedHeaders: data.groupHeadersByKey[gb.key]?.map(g => g.uniqueName) ?? gb.expandedHeaders,
3111
+ sort: gb.sort,
3112
+ }));
3113
+ return ({ ...state, groupBy: newGroupedData });
3114
+ });
3115
+ this.collapseAll = this.updater((state) => ({
3116
+ ...state,
3117
+ groupBy: state.groupBy.map(gb => ({ key: gb.key, expandedHeaders: [], sort: gb.sort }))
3118
+ }));
3119
+ this.collapseAllOfKey = this.updater((state, data) => ({
3120
+ ...state,
3121
+ groupBy: state.groupBy.map(gb => ({
3122
+ key: gb.key,
3123
+ expandedHeaders: data.keys.includes(gb.key) ? [] : gb.expandedHeaders,
3124
+ sort: gb.sort,
3125
+ }))
3126
+ }));
3127
+ this.updateGroupBySort = this.updater((state, data) => {
3128
+ const newGroupedData = replaceInArrayWithClone(state.groupBy, gb => gb.key === data.key, gb => {
3129
+ gb.sort = data.sort;
3130
+ });
3131
+ return ({ ...state, groupBy: newGroupedData });
3132
+ });
3133
+ this.getGroupBySortDirection = (key) => computed(() => {
3134
+ const groupBy = this.state().groupBy.find(gb => gb.key === key);
3135
+ return groupBy ? groupBy.sort : '';
3136
+ });
3137
+ this.cycleGroupBySortDirection = this.updater((state, key) => {
3138
+ const currentGroupBy = state.groupBy.find(gb => gb.key === key);
3139
+ console.log(currentGroupBy);
3140
+ if (!currentGroupBy)
3141
+ return state;
3142
+ let nextSort;
3143
+ switch (currentGroupBy.sort) {
3144
+ case '':
3145
+ case undefined:
3146
+ nextSort = 'desc';
3147
+ break;
3148
+ case 'desc':
3149
+ nextSort = 'asc';
3150
+ break;
3151
+ case 'asc':
3152
+ nextSort = '';
3153
+ break;
3154
+ }
3155
+ const newGroupedData = replaceInArrayWithClone(state.groupBy, gb => gb.key === key, gb => {
3156
+ gb.sort = nextSort;
3157
+ });
3158
+ return ({ ...state, groupBy: newGroupedData });
3159
+ });
3160
+ this.#$groupBy = this.selectSignal(state => state.groupBy);
3161
+ this.$groupByData = this.selectSignal(this.#$groupBy, this.$metaDataArray, (gb, mds) => gb.filter(bg => mds.some(md => md.key === bg.key)), {
2990
3162
  equal: (prev, curr) => prev.length === curr.length && curr.every((k, i) => prev[i].key === k.key)
2991
3163
  });
2992
3164
  this.groupByKeys$ = this.select(state => state.groupBy.map(gbk => gbk.key))
@@ -2997,28 +3169,25 @@ class TableStore extends ComponentStore {
2997
3169
  return aa.length === bb.length && aa.every((k) => bb.includes(k));
2998
3170
  }));
2999
3171
  this.$expandGroups = this.selectSignal(state => state.groupBy, { equal: (a, b) => {
3000
- const aa = a.flatMap(g => g.expandedHeaders);
3001
- const bb = b.flatMap(g => g.expandedHeaders);
3172
+ const aa = a.flatMap(g => g.expandedHeaders === 'all' ? ['all'] : g.expandedHeaders);
3173
+ const bb = b.flatMap(g => g.expandedHeaders === 'all' ? ['all'] : g.expandedHeaders);
3002
3174
  return aa.length === bb.length && aa.every((k) => bb.includes(k));
3003
3175
  } });
3004
3176
  this.$getIsExpanded = (columnKey, groupUniqueName) => {
3005
- return this.selectSignal(state => !!state.groupBy.filter(g => g.key === columnKey && g.expandedHeaders.includes(groupUniqueName)).length);
3177
+ return this.selectSignal(state => !!state.groupBy.filter(g => g.key === columnKey && (g.expandedHeaders.includes(groupUniqueName) || g.expandedHeaders === 'all')).length);
3006
3178
  };
3179
+ this.$expandAllGroupsOfKey = (columnKey) => this.selectSignal(state => state.groupBy.find(g => g.key === columnKey)?.expandedHeaders === 'all');
3007
3180
  this.$sortedGroupsUpdates = this.selectSignal(state => state.groupBy, { equal: (a, b) => sortsAreSame(a.map(g => ({ active: g.key, direction: g.sort })), b.map(g => ({ active: g.key, direction: g.sort }))) });
3008
- this.$currentPage = this.selectSignal(state => state.currentPage);
3009
- this.$pageSize = this.selectSignal(s => s.userDefined?.pageSize || s.pageSize);
3010
- this.$showAll = this.selectSignal(s => s.userDefined?.showAll ?? s.showAll);
3011
- this.$tableSettings = this.selectSignal(state => {
3012
- const ts = { ...state.persistedTableSettings, ...state.notPersistedTableSettings };
3013
- return ts;
3014
- });
3015
- this.$notPersistedTableSettings = this.selectSignal(state => state.notPersistedTableSettings);
3016
- this.tableSettings$ = toObservable(this.$tableSettings);
3017
- this.$props = this.selectSignal(s => s.props);
3018
- this.$getLinkInfo = (md) => this.selectSignal(state => state.linkMaps[md.key]);
3181
+ //#endregion groupBy
3182
+ //#region page paginator and show all
3183
+ this.setCurrentPage = this.updater((state, currentPage) => ({ ...state, currentPage }));
3184
+ this.setPageSize = this.updater((state, pageSize) => ({ ...state, pageSize }));
3185
+ this.setUserDefinedPageSize = this.updater((state, pageSize) => ({ ...state, userDefined: { ...state.userDefined, pageSize } }));
3186
+ this.setUserDefinedShowAll = this.updater((state, showAll) => ({ ...state, showAll, userDefined: { ...state.userDefined, showAll } }));
3019
3187
  this.$isVirtual = this.selectSignal(state => state.notPersistedTableSettings.useVirtualScroll
3020
3188
  || state.showAll
3021
3189
  || state.userDefined?.showAll);
3190
+ this.$showAll = this.selectSignal(s => s.userDefined?.showAll ?? s.showAll);
3022
3191
  this.$viewType = this.selectSignal(state => {
3023
3192
  const usePaginator = state.notPersistedTableSettings.usePaginator;
3024
3193
  const showAll = state.showAll || state.userDefined?.showAll;
@@ -3036,6 +3205,30 @@ class TableStore extends ComponentStore {
3036
3205
  return 'all';
3037
3206
  }
3038
3207
  });
3208
+ this.$userDefinedPageSize = this.selectSignal(state => (state.userDefined.pageSize));
3209
+ this.$currentPage = this.selectSignal(state => state.currentPage);
3210
+ this.$pageSize = this.selectSignal(s => s.userDefined?.pageSize || s.pageSize);
3211
+ //#endregion page paginator and show all
3212
+ //#region table settings and props
3213
+ this.$tableSettings = this.selectSignal(state => {
3214
+ const ts = { ...state.persistedTableSettings, ...state.notPersistedTableSettings };
3215
+ return ts;
3216
+ });
3217
+ this.$notPersistedTableSettings = this.selectSignal(state => state.notPersistedTableSettings);
3218
+ this.tableSettings$ = toObservable(this.$tableSettings);
3219
+ this.$props = this.selectSignal(s => s.props);
3220
+ //#endregion table settings and props
3221
+ this.setUserDefinedRowHeight = this.updater((state, rowHeight) => {
3222
+ return ({ ...state, userDefined: { ...state.userDefined, rowHeight } });
3223
+ });
3224
+ this.setUserDefinedHeaderHeight = this.updater((state, headerHeight) => {
3225
+ return ({ ...state, userDefined: { ...state.userDefined, headerHeight } });
3226
+ });
3227
+ this.$userDefinedRowHeight = this.selectSignal(state => (state.userDefined.rowHeight));
3228
+ this.$userDefinedHeaderHeight = this.selectSignal(state => (state.userDefined.headerHeight));
3229
+ this.$footerCollapsed = this.selectSignal(state => state.persistedTableSettings.collapseFooter);
3230
+ this.$headerCollapsed = this.selectSignal(state => state.persistedTableSettings.collapseHeader);
3231
+ this.$getLinkInfo = (md) => this.selectSignal(state => state.linkMaps[md.key]);
3039
3232
  this.resetState = this.updater((state) => {
3040
3233
  const sorted = this.$preSort();
3041
3234
  return ({ ...state, hiddenKeys: [], sorted, filters: {}, groupBy: [], userDefined: { widths: {}, order: {}, table: {} } });
@@ -3097,6 +3290,11 @@ class TableStore extends ComponentStore {
3097
3290
  };
3098
3291
  s.pageSize = settings.tableSettings?.paginatorSettings?.pageSize ?? s.pageSize;
3099
3292
  s.showAll = settings.tableSettings?.paginatorSettings?.defaultAll ?? s.showAll;
3293
+ s.groupBy = (settings.tableSettings?.groupBySettings || []).map(g => ({
3294
+ expandedHeaders: g.expanded ? 'all' : [],
3295
+ key: g.key,
3296
+ sort: ''
3297
+ }));
3100
3298
  return s;
3101
3299
  });
3102
3300
  this.setMetaData = this.updater((state, md) => {
@@ -3116,104 +3314,9 @@ class TableStore extends ComponentStore {
3116
3314
  const initializationState = state.initializationState == InitializationState.Created ? InitializationState.MetaDataLoaded : state.initializationState;
3117
3315
  return { ...state, initializationState, metaData, sorted, userDefined: { ...state.userDefined, order: order } };
3118
3316
  });
3119
- this.showColumn = this.updater((state, key) => ({
3120
- ...state,
3121
- hiddenKeys: state.hiddenKeys.filter(k => k !== key),
3122
- }));
3123
- this.hideColumn = this.updater((state, key) => ({
3124
- ...state,
3125
- hiddenKeys: [...state.hiddenKeys.filter(k => k !== key), key],
3126
- }));
3127
- this.setHiddenColumns = this.updater((state, displayCols) => {
3128
- return ({ ...state, hiddenKeys: displayCols.filter(d => !d.visible).map(d => d.key) });
3129
- });
3130
- this.setUserDefinedWidth = this.updater((state, colWidths) => {
3131
- const userDefinedWidths = { ...state.userDefined.widths };
3132
- colWidths.forEach(cw => {
3133
- userDefinedWidths[cw.key] = cw.widthInPixel;
3134
- });
3135
- return { ...state, userDefined: { ...state.userDefined, widths: userDefinedWidths } };
3136
- });
3137
- this.setUserDefinedOrder = this.updater((state, moved) => {
3138
- const { newOrder, oldOrder } = moved;
3139
- const mdsArr = orderedStateVisibleMetaData(state);
3140
- moveItemInArray(mdsArr, oldOrder, newOrder);
3141
- const userDefinedOrder = mdsArr.reduce((aggregate, current, index) => {
3142
- aggregate[current.key] = index;
3143
- return aggregate;
3144
- }, {});
3145
- return ({ ...state, userDefined: { ...state.userDefined, order: userDefinedOrder } });
3146
- });
3147
- this.setUserDefinedRowHeight = this.updater((state, rowHeight) => {
3148
- return ({ ...state, userDefined: { ...state.userDefined, rowHeight } });
3149
- });
3150
- this.setUserDefinedHeaderHeight = this.updater((state, headerHeight) => {
3151
- return ({ ...state, userDefined: { ...state.userDefined, headerHeight } });
3152
- });
3153
- this.addFilter = this.updater((state, filter) => {
3154
- return this.addFiltersToState(state, [filter]);
3155
- });
3156
- this.addFilters = this.updater((state, filters) => {
3157
- return this.addFiltersToState(state, filters);
3158
- });
3159
- this.removeFilter = this.updater((state, filterId) => {
3160
- const filtersCopy = { ...state.filters };
3161
- delete filtersCopy[filterId];
3162
- return ({ ...state, filters: filtersCopy });
3163
- });
3164
- this.removeFilters = this.updater((state, filterIds) => {
3165
- const filtersCopy = { ...state.filters };
3166
- filterIds.forEach(id => { delete filtersCopy[id]; });
3167
- return ({ ...state, filters: filtersCopy });
3168
- });
3169
- this.clearFilters = this.updater((state) => ({ ...state, filters: {} }));
3170
- this.addFiltersToState = (state, filters) => {
3171
- var customFilters = filters.filter(isCustomFilter);
3172
- var filterInfos = filters.filter(isFilterInfo);
3173
- const filtersObj = filterInfos
3174
- .filter(fltr => Object.keys(state.metaData).some(key => key === fltr.key) || console.warn(`Meta data with key ${fltr.key} not found`))
3175
- .reduce((filtersObj, filter) => {
3176
- if (!filter.filterId) {
3177
- filter.filterId = crypto.randomUUID();
3178
- }
3179
- filtersObj[filter.filterId] = filter;
3180
- return filtersObj;
3181
- }, {});
3182
- customFilters.forEach(fltr => {
3183
- if (!fltr.filterId) {
3184
- fltr.filterId = crypto.randomUUID();
3185
- }
3186
- filtersObj[fltr.filterId] = fltr;
3187
- });
3188
- return {
3189
- ...state,
3190
- filters: { ...state.filters, ...filtersObj }
3191
- };
3192
- };
3193
- this.setSort = this.updater((state, { key, direction }) => {
3194
- const sortArray = state.sorted.filter(s => s.active !== key);
3195
- if (direction) {
3196
- sortArray.unshift({ active: key, direction });
3197
- }
3198
- return {
3199
- ...state,
3200
- sorted: sortArray,
3201
- };
3202
- });
3203
- this.setAllSort = this.updater((state, sortArray) => {
3204
- return {
3205
- ...state,
3206
- sorted: sortArray,
3207
- };
3208
- });
3209
- this.setCurrentPage = this.updater((state, currentPage) => ({ ...state, currentPage }));
3210
- this.setPageSize = this.updater((state, pageSize) => ({ ...state, pageSize }));
3211
- this.setUserDefinedPageSize = this.updater((state, pageSize) => ({ ...state, userDefined: { ...state.userDefined, pageSize } }));
3212
- this.setUserDefinedShowAll = this.updater((state, showAll) => ({ ...state, showAll, userDefined: { ...state.userDefined, showAll } }));
3213
3317
  this.setProps = this.updater((state, props) => {
3214
3318
  return ({ ...state, props });
3215
3319
  });
3216
- this.setTableWidth = this.updater((state, widthInPixels) => ({ ...state, userDefined: { ...state.userDefined, table: { width: widthInPixels } } }));
3217
3320
  this.setInitializationState = this.updater((state, initializationState) => {
3218
3321
  return { ...state, initializationState };
3219
3322
  });
@@ -3227,73 +3330,6 @@ class TableStore extends ComponentStore {
3227
3330
  tableSettings.collapseFooter = options?.collapseFooter ?? !tableSettings.collapseFooter;
3228
3331
  return ({ ...state, persistedTableSettings: new PersistedTableSettings(tableSettings) });
3229
3332
  });
3230
- this.addGroupByKey = this.updater((state, metaDataKey) => ({
3231
- ...state,
3232
- groupBy: [...state.groupBy, { key: metaDataKey, expandedHeaders: [], sort: '' }]
3233
- }));
3234
- this.removeGroupByKey = this.updater((state, groupByKey) => ({
3235
- ...state,
3236
- groupBy: state.groupBy.filter(key => groupByKey !== key.key)
3237
- }));
3238
- this.updateExpandedGroups = this.updater((state, data) => {
3239
- const gbk = replaceInArrayWithClone(state.groupBy, k => k.key === data.key, gk => {
3240
- gk.expandedHeaders = data.isExpanded ? [...gk.expandedHeaders, data.groupUniqueName] : gk.expandedHeaders.filter(g => g !== data.groupUniqueName);
3241
- });
3242
- return ({
3243
- ...state,
3244
- groupBy: gbk
3245
- });
3246
- });
3247
- this.expandAllOfGroup = this.updater((state, data) => {
3248
- const newGroupedData = state.groupBy.map(gb => ({
3249
- key: gb.key,
3250
- expandedHeaders: data.groupHeadersByKey[gb.key]?.map(g => g.uniqueName) ?? gb.expandedHeaders
3251
- }));
3252
- return ({ ...state, groupBy: newGroupedData });
3253
- });
3254
- this.collapseAll = this.updater((state) => ({
3255
- ...state,
3256
- groupBy: state.groupBy.map(gb => ({ key: gb.key, expandedHeaders: [], sort: gb.sort }))
3257
- }));
3258
- this.collapseAllOfKey = this.updater((state, data) => ({
3259
- ...state,
3260
- groupBy: state.groupBy.map(gb => ({
3261
- key: gb.key,
3262
- expandedHeaders: data.keys.includes(gb.key) ? [] : gb.expandedHeaders,
3263
- sort: gb.sort,
3264
- }))
3265
- }));
3266
- this.updateGroupBySort = this.updater((state, data) => {
3267
- const newGroupedData = replaceInArrayWithClone(state.groupBy, gb => gb.key === data.key, gb => {
3268
- gb.sort = data.sort;
3269
- });
3270
- return ({ ...state, groupBy: newGroupedData });
3271
- });
3272
- this.getGroupBySortDirection = (key) => computed(() => {
3273
- const groupBy = this.state().groupBy.find(gb => gb.key === key);
3274
- return groupBy ? groupBy.sort : '';
3275
- });
3276
- this.cycleGroupBySortDirection = this.updater((state, key) => {
3277
- const currentGroupBy = state.groupBy.find(gb => gb.key === key);
3278
- if (!currentGroupBy)
3279
- return state;
3280
- let nextSort;
3281
- switch (currentGroupBy.sort) {
3282
- case '':
3283
- nextSort = 'desc';
3284
- break;
3285
- case 'desc':
3286
- nextSort = 'asc';
3287
- break;
3288
- case 'asc':
3289
- nextSort = '';
3290
- break;
3291
- }
3292
- const newGroupedData = replaceInArrayWithClone(state.groupBy, gb => gb.key === key, gb => {
3293
- gb.sort = nextSort;
3294
- });
3295
- return ({ ...state, groupBy: newGroupedData });
3296
- });
3297
3333
  this.setLinkMaps = this.updater((state, maps) => {
3298
3334
  return ({ ...state, linkMaps: maps });
3299
3335
  });
@@ -3312,6 +3348,7 @@ class TableStore extends ComponentStore {
3312
3348
  return this;
3313
3349
  };
3314
3350
  }
3351
+ #$groupBy;
3315
3352
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: TableStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3316
3353
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: TableStore }); }
3317
3354
  }
@@ -3332,19 +3369,36 @@ const resetable = [
3332
3369
  ];
3333
3370
 
3334
3371
  class MultiSortDirective extends MatSort {
3372
+ #onSortChange;
3373
+ #onStateSortUpdate;
3335
3374
  constructor() {
3336
3375
  super();
3337
3376
  this.state = inject(TableStore);
3338
- this.state.setSort(this.sortChange.pipe(distinctUntilChanged((f, s) => f.active === s.active && f.direction === s.direction), map(sc => ({ key: sc.active, direction: sc.direction }))));
3339
- this.state.on(this.state.sort$, (rules) => {
3340
- const topRule = { active: rules[0]?.active || '', direction: rules[0]?.direction || '' };
3341
- const topActiveChanged = topRule.active !== this.active || '';
3342
- const topDirectionChanged = topRule.direction !== this.direction || '';
3343
- if (topActiveChanged || topDirectionChanged) {
3344
- this.active = topRule.active;
3345
- this.direction = topRule.direction;
3346
- this.sortChange.emit(topRule);
3347
- }
3377
+ this.$sortChange = toSignal(this.sortChange, {
3378
+ equal: (f, s) => f?.active === s?.active && f?.direction === s?.direction
3379
+ });
3380
+ this.#onSortChange = effect(() => {
3381
+ const sortChange = this.$sortChange();
3382
+ if (!sortChange)
3383
+ return;
3384
+ untracked(() => {
3385
+ this.state.setSort({ key: sortChange.active, direction: sortChange.direction });
3386
+ });
3387
+ });
3388
+ this.#onStateSortUpdate = effect(() => {
3389
+ const rules = this.state.$getSorts();
3390
+ if (!rules)
3391
+ return;
3392
+ untracked(() => {
3393
+ const topRule = { active: rules[0]?.active || '', direction: rules[0]?.direction || '' };
3394
+ const topActiveChanged = topRule.active !== this.active || '';
3395
+ const topDirectionChanged = topRule.direction !== this.direction || '';
3396
+ if (topActiveChanged || topDirectionChanged) {
3397
+ this.active = topRule.active;
3398
+ this.direction = topRule.direction;
3399
+ this.sortChange.emit(topRule);
3400
+ }
3401
+ });
3348
3402
  });
3349
3403
  }
3350
3404
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: MultiSortDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
@@ -4532,56 +4586,54 @@ function groupData(groupByData, groupData, level = 1, metaData, parentGroupName)
4532
4586
  };
4533
4587
  });
4534
4588
  if (groupByData.sort) {
4535
- groupedDataArr = sortGroups(groupByData, groupedDataArr);
4589
+ groupedDataArr = sortGroupsByGroupSortOneLevel(groupByData, groupedDataArr);
4536
4590
  }
4537
4591
  return groupedDataArr;
4538
4592
  }
4539
4593
  function setCustomGroupBy(customGroupBy) {
4540
4594
  tbGroupBy = customGroupBy;
4541
4595
  }
4542
- function updateGroupByState(groupedData, { data, groups, expanded, sorts }, firstRun, metaData) {
4596
+ function updateGroupByState(groupedData, { data, groups, expanded, groupSorts }, firstRun, metaData) {
4543
4597
  if (firstRun
4544
- || dataUpdated(data, groups, expanded, sorts)
4545
- || groupsUpdated(groups, expanded, sorts)) {
4598
+ || dataUpdated(data, groups, expanded, groupSorts)
4599
+ || groupsUpdated(groups, expanded, groupSorts)) {
4546
4600
  const combinedGroupsAndSorts = groups.value.map(g => {
4547
- const sortForGroup = sorts.value.find(s => s.key === g.key);
4601
+ const sortForGroup = groupSorts.value.find(s => s.key === g.key);
4548
4602
  return { ...g, sort: sortForGroup?.sort || '' };
4549
4603
  });
4550
4604
  groupedData = groups.value.length ? getGroupedData(data.value, combinedGroupsAndSorts, metaData) : data.value;
4551
4605
  }
4552
4606
  else {
4553
- let curr = [...sorts.value];
4554
- groupedData = sort(groupedData);
4555
- function sort(groups) {
4556
- const sortData = sorts.value?.find(gs => gs.key === groups[0]?.key);
4557
- if (sortData?.sort) {
4558
- groups = sortGroups(sortData, groups);
4559
- }
4560
- else {
4561
- groups = groups.toSorted((a, b) => a[initIndexSymbol] - b[initIndexSymbol]);
4562
- }
4563
- curr = curr.filter(c => c.key !== sortData?.key);
4564
- if (!groups[0]?.hasTheData) {
4565
- groups.forEach((g, i) => groups[i].groups = sort(g.groups));
4566
- }
4567
- return groups;
4568
- }
4607
+ groupedData = sortGroupsDeep(groupedData, groupSorts.value);
4569
4608
  }
4570
4609
  const newDisplayData = expanded.value.length === 0
4571
4610
  ? groupedData
4572
- : groupedData.map(group => mapGroupHeader(group, expanded.value.flatMap(g => g.expandedHeaders))).flat();
4611
+ : groupedData.map(group => mapGroupHeader(group, expanded.value.flatMap(g => g.expandedHeaders), expanded.value.filter(g => g.expandedHeaders === 'all').map(g => g.key))).flat();
4573
4612
  return ({ displayData: newDisplayData, groupedData });
4574
4613
  }
4575
- function sortGroups(sortData, groups) {
4614
+ function sortGroupsByGroupSortOneLevel(sortData, groups) {
4576
4615
  const direction = sortData.sort;
4577
4616
  const multiplier = direction === 'asc' ? 1 : -1;
4578
4617
  return groups.toSorted((a, b) => a.length === b.length ? 0 : (a.length > b.length ? 1 : -1) * multiplier);
4579
4618
  }
4580
- function mapGroupHeader(obj, expandedHeaders) {
4581
- const showChildren = expandedHeaders === true || expandedHeaders.includes(obj.uniqueName);
4619
+ function sortGroupsDeep(groups, sorts) {
4620
+ const sortData = sorts?.find(gs => gs.key === groups[0]?.key);
4621
+ if (sortData?.sort) {
4622
+ groups = sortGroupsByGroupSortOneLevel(sortData, groups);
4623
+ }
4624
+ else {
4625
+ groups = groups.toSorted((a, b) => a[initIndexSymbol] - b[initIndexSymbol]);
4626
+ }
4627
+ if (!groups[0]?.hasTheData) {
4628
+ groups.forEach((g, i) => groups[i].groups = sortGroupsDeep(g.groups, sorts));
4629
+ }
4630
+ return groups;
4631
+ }
4632
+ function mapGroupHeader(obj, expandedHeaders, expandAllGroups = []) {
4633
+ const showChildren = expandedHeaders === true || expandedHeaders.includes(obj.uniqueName) || expandAllGroups.includes(obj.key);
4582
4634
  const children = !showChildren ? [] :
4583
4635
  obj.hasTheData ? obj.children
4584
- : obj.groups.map(a => mapGroupHeader(a, expandedHeaders));
4636
+ : obj.groups.map(a => mapGroupHeader(a, expandedHeaders, expandAllGroups));
4585
4637
  return [obj, ...children].flat();
4586
4638
  }
4587
4639
  function dataUpdated(data, groups, expandedGroups, sorts) {
@@ -4600,12 +4652,18 @@ const getAllGroupHeaderNames = (data) => {
4600
4652
  }, {});
4601
4653
  };
4602
4654
  const getAllGroupHeaderNamesByKeys = (data, keys) => {
4603
- const groups = getGroupHeaders(data, (d) => d.isGroupHeader && keys.includes(d.key));
4604
- return supportsGroupBy ? Object.groupBy(groups, group => group.key) : groupBy(groups, 'key');
4655
+ const groups = getGroupHeaders(data, (d) => d.isGroupHeader && keys.includes(d.key), [], keys.length === 1);
4656
+ const a = supportsGroupBy ? Object.groupBy(groups, group => group.key) : groupBy(groups, 'key');
4657
+ return Object.entries(a).reduce((names, [key, groups]) => {
4658
+ names[key] = groups.map(g => ({ uniqueName: g.uniqueName, key: g.key }));
4659
+ return names;
4660
+ }, {});
4605
4661
  };
4606
- const getGroupHeaders = (data, filterFunc, arr = []) => {
4662
+ const getGroupHeaders = (data, filterFunc, arr = [], oneLevel = false) => {
4607
4663
  const headers = data.filter(filterFunc);
4608
4664
  arr.push(...headers);
4665
+ if (oneLevel)
4666
+ return arr;
4609
4667
  headers.forEach(h => { if (h.hasTheData === false && !!h.groups.length)
4610
4668
  getGroupHeaders(h.groups, filterFunc, arr); });
4611
4669
  return arr;
@@ -4625,7 +4683,8 @@ class GenericTableComponent {
4625
4683
  this.$table = viewChild(MatTable);
4626
4684
  this.$dropList = viewChild(CdkDropList);
4627
4685
  this.selection$ = output({ alias: 'selection' });
4628
- this.$displayDataLength = input.required({ alias: 'displayDataLength' });
4686
+ this.$displayData = input.required({ alias: 'displayData' });
4687
+ this.$displayDataLength = computed(() => this.$displayData().length);
4629
4688
  this.$data = input.required({ alias: 'data' });
4630
4689
  this.$rows = input([], { alias: 'rows' });
4631
4690
  this.$columnInfos = input.required({ alias: 'columnInfos' });
@@ -4981,6 +5040,10 @@ class GenericTableComponent {
4981
5040
  return row.isGroupHeader;
4982
5041
  }
4983
5042
  setExpanded(key, groupUniqueName, isExpanded) {
5043
+ if (!isExpanded && this.state.$expandAllGroupsOfKey(key)()) {
5044
+ const groupHeaders = getAllGroupHeaderNamesByKeys(this.$displayData(), [key]);
5045
+ this.state.expandAllOfGroup({ groupHeadersByKey: groupHeaders });
5046
+ }
4984
5047
  this.state.updateExpandedGroups({ key, isExpanded, groupUniqueName });
4985
5048
  }
4986
5049
  buildColumn(column) {
@@ -5047,7 +5110,7 @@ class GenericTableComponent {
5047
5110
  });
5048
5111
  }
5049
5112
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: GenericTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5050
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.3", type: GenericTableComponent, isStandalone: true, selector: "tb-generic-table", inputs: { $displayDataLength: { classPropertyName: "$displayDataLength", publicName: "displayDataLength", isSignal: true, isRequired: true, transformFunction: null }, $data: { classPropertyName: "$data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, $rows: { classPropertyName: "$rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, $columnInfos: { classPropertyName: "$columnInfos", publicName: "columnInfos", isSignal: true, isRequired: true, transformFunction: null }, $dataSource: { classPropertyName: "$dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, $trackBy: { classPropertyName: "$trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selection$: "selection" }, viewQueries: [{ propertyName: "$headerRow", first: true, predicate: MatHeaderRowDef, descendants: true, isSignal: true }, { propertyName: "$footerRow", first: true, predicate: MatFooterRowDef, descendants: true, isSignal: true }, { propertyName: "$table", first: true, predicate: MatTable, descendants: true, isSignal: true }, { propertyName: "$dropList", first: true, predicate: CdkDropList, descendants: true, isSignal: true }], ngImport: i0, template: "<mat-table\r\n #table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n class=\"table-drag-list\"\r\n [dataSource]=\"$dataSource()\"\r\n [trackBy]=\"$trackByFunction()\"\r\n [style]=\"$tableWidth()\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n @let selection = $selection();\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox [checked]=\"!!($masterToggleChecked())\"\r\n [indeterminate]=\"$masterToggleIndeterminate()\"\r\n [matTooltip]=\"$selectAllMessage()\"\r\n (change)=\"$event ? masterToggle() : null\" />\r\n <button mat-icon-button class=\"open-menu-icon-button\" disableRipple [matMenuTriggerFor]=\"menu\" [matMenuTriggerRestoreFocus]=\"false\">\r\n <mat-icon class=\"menu-icon\">more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\" >\r\n <button mat-menu-item>\r\n <mat-slide-toggle [checked]=\"$hasSelectFilter()\" (change)=\"addSelectFilter($event.checked)\">\r\n Show Only Selected\r\n </mat-slide-toggle>\r\n </button>\r\n @if(this.$selection().selected.length)\r\n {\r\n <button mat-menu-item (click)=\"$selection().clear()\">\r\n Clear Selection\r\n </button>\r\n }\r\n <button mat-menu-item (click)=\"selectTop(+i.value)\">\r\n Select top \r\n <input #i class=\"input\" stop-propagation type=\"number\" \r\n placeholder=\"Set Size\"\r\n [value]=\"10\"\r\n [min]=\"1\"\r\n [max]=\"dataStore.state().sortedFilteredDataLength\" />\r\n </button>\r\n </mat-menu>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n [checked]=\"selection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index; let t\" class=\"index-column\">\r\n {{ 1 + i + $offsetIndex() }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\" />\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.$getIsExpanded | func : row.key : row.uniqueName );\r\n @let customTemplate = (getCustomGroupRowTemplate | func : row.key)();\r\n \r\n\r\n\r\n <!-- Default group row template -->\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\" [class]=\"'group-cell'\">\r\n @if($hasSelectColumn())\r\n {\r\n @let contains = (allOfGroupSelected | func : row.uniqueName)();\r\n <mat-checkbox [checked]=\"!!contains.containsAll\"\r\n [indeterminate]=\"!!contains.containsSome && !contains.containsAll\"\r\n [matTooltip]=\"toggleGroupMessage | func : contains.length : contains.containsAll\"\r\n (change)=\"$event ? toggleGroup(row.uniqueName, contains.containsAll) : null\" />\r\n }\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.uniqueName, !expanded());\">\r\n @if (!expanded())\r\n {\r\n <mat-icon>chevron_right</mat-icon>\r\n }\r\n @else\r\n {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ row.custom ? row.groupHeaderDisplay : ((getGroupHeaderTransform | func : row.key : row.groupHeaderDisplay)() + ` (${row.length})`) }}\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n @if(customTemplate)\r\n {\r\n <ng-container *ngTemplateOutlet=\"customTemplate; context: { \r\n $implicit: row, \r\n element: row, \r\n expanded: expanded(), \r\n level: row.level, \r\n key: row.key, \r\n uniqueName: row.uniqueName, \r\n groupHeaderDisplay: row.groupHeaderDisplay, \r\n length: row.length, \r\n padding: row.padding \r\n }\" />\r\n }\r\n @else\r\n {\r\n <ng-container *ngTemplateOutlet=\"state.$props().groupHeaderTemplate!; context: { element: row }\" />\r\n }\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"\r\n [style.height]=\"$rowHeight()\"\r\n [style.min-height]=\"$rowHeight()\"\r\n [styler]=\"$rowStyles()\"\r\n [element]=\"row\"\r\n [conditionalClasses]=\"$rowClasses()\"\r\n (click)=\"rowClicked(row, $event)\"\r\n />\r\n\r\n <!-- group row -->\r\n <mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\"\r\n style=\"background-color: unset;\"\r\n [style.height]=\"state.$props().groupHeaderHeight ? state.$props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.$props().groupHeaderHeight ? state.$props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"/>\r\n</mat-table>\r\n\r\n<mat-header-row *matHeaderRowDef=\"$keys(); sticky: state.$props().isSticky\" [style.height]=\"$headerHeight()\"\r\n [style.min-height]=\"$headerHeight()\" [style.top.px]=\"($offset()! * -1)\"/>\r\n<mat-footer-row *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \" [style.height]=\"$footerHeight()\"\r\n [style.min-height]=\"$footerHeight()\"\r\n [style.bottom.px]=\"$stickyFooter() ? ($offset()) : undefined\"/>\r\n", styles: [":host{--mat-paginator-container-size: var(tb-paginator-container-size, initial)}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}.group-cell{display:flex;align-items:center}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1$6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$6.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1$6.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i1$6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1$6.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i1$6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i1$6.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i1$1.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: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: FunctionPipe, name: "func" }, { kind: "directive", type: StylerDirective, selector: "[styler]", inputs: ["element", "styler"] }, { kind: "directive", type: ConditionalClassesDirective, selector: "[conditionalClasses]", inputs: ["element", "conditionalClasses"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$4.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: i1$4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i1$4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: StopPropagationDirective, selector: "[stop-propagation]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5113
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.3", type: GenericTableComponent, isStandalone: true, selector: "tb-generic-table", inputs: { $displayData: { classPropertyName: "$displayData", publicName: "displayData", isSignal: true, isRequired: true, transformFunction: null }, $data: { classPropertyName: "$data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, $rows: { classPropertyName: "$rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, $columnInfos: { classPropertyName: "$columnInfos", publicName: "columnInfos", isSignal: true, isRequired: true, transformFunction: null }, $dataSource: { classPropertyName: "$dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, $trackBy: { classPropertyName: "$trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selection$: "selection" }, viewQueries: [{ propertyName: "$headerRow", first: true, predicate: MatHeaderRowDef, descendants: true, isSignal: true }, { propertyName: "$footerRow", first: true, predicate: MatFooterRowDef, descendants: true, isSignal: true }, { propertyName: "$table", first: true, predicate: MatTable, descendants: true, isSignal: true }, { propertyName: "$dropList", first: true, predicate: CdkDropList, descendants: true, isSignal: true }], ngImport: i0, template: "<mat-table\r\n #table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n class=\"table-drag-list\"\r\n [dataSource]=\"$dataSource()\"\r\n [trackBy]=\"$trackByFunction()\"\r\n [style]=\"$tableWidth()\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n @let selection = $selection();\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox [checked]=\"!!($masterToggleChecked())\"\r\n [indeterminate]=\"$masterToggleIndeterminate()\"\r\n [matTooltip]=\"$selectAllMessage()\"\r\n (change)=\"$event ? masterToggle() : null\" />\r\n <button mat-icon-button class=\"open-menu-icon-button\" disableRipple [matMenuTriggerFor]=\"menu\" [matMenuTriggerRestoreFocus]=\"false\">\r\n <mat-icon class=\"menu-icon\">more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\" >\r\n <button mat-menu-item>\r\n <mat-slide-toggle [checked]=\"$hasSelectFilter()\" (change)=\"addSelectFilter($event.checked)\">\r\n Show Only Selected\r\n </mat-slide-toggle>\r\n </button>\r\n @if(this.$selection().selected.length)\r\n {\r\n <button mat-menu-item (click)=\"$selection().clear()\">\r\n Clear Selection\r\n </button>\r\n }\r\n <button mat-menu-item (click)=\"selectTop(+i.value)\">\r\n Select top \r\n <input #i class=\"input\" stop-propagation type=\"number\" \r\n placeholder=\"Set Size\"\r\n [value]=\"10\"\r\n [min]=\"1\"\r\n [max]=\"dataStore.state().sortedFilteredDataLength\" />\r\n </button>\r\n </mat-menu>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n [checked]=\"selection.isSelected(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index; let t\" class=\"index-column\">\r\n {{ 1 + i + $offsetIndex() }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\" />\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.$getIsExpanded | func : row.key : row.uniqueName );\r\n @let customTemplate = (getCustomGroupRowTemplate | func : row.key)();\r\n \r\n\r\n\r\n <!-- Default group row template -->\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\" [class]=\"'group-cell'\">\r\n @if($hasSelectColumn())\r\n {\r\n @let contains = (allOfGroupSelected | func : row.uniqueName)();\r\n <mat-checkbox [checked]=\"!!contains.containsAll\"\r\n [indeterminate]=\"!!contains.containsSome && !contains.containsAll\"\r\n [matTooltip]=\"toggleGroupMessage | func : contains.length : contains.containsAll\"\r\n (change)=\"$event ? toggleGroup(row.uniqueName, contains.containsAll) : null\" />\r\n }\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.uniqueName, !expanded());\">\r\n @if (!expanded())\r\n {\r\n <mat-icon>chevron_right</mat-icon>\r\n }\r\n @else\r\n {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ row.custom ? row.groupHeaderDisplay : ((getGroupHeaderTransform | func : row.key : row.groupHeaderDisplay)() + ` (${row.length})`) }}\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n @if(customTemplate)\r\n {\r\n <ng-container *ngTemplateOutlet=\"customTemplate; context: { \r\n $implicit: row, \r\n element: row, \r\n expanded: expanded(), \r\n level: row.level, \r\n key: row.key, \r\n uniqueName: row.uniqueName, \r\n groupHeaderDisplay: row.groupHeaderDisplay, \r\n length: row.length, \r\n padding: row.padding \r\n }\" />\r\n }\r\n @else\r\n {\r\n <ng-container *ngTemplateOutlet=\"state.$props().groupHeaderTemplate!; context: { element: row }\" />\r\n }\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"\r\n [style.height]=\"$rowHeight()\"\r\n [style.min-height]=\"$rowHeight()\"\r\n [styler]=\"$rowStyles()\"\r\n [element]=\"row\"\r\n [conditionalClasses]=\"$rowClasses()\"\r\n (click)=\"rowClicked(row, $event)\"\r\n />\r\n\r\n <!-- group row -->\r\n <mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\"\r\n style=\"background-color: unset;\"\r\n [style.height]=\"state.$props().groupHeaderHeight ? state.$props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.$props().groupHeaderHeight ? state.$props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"/>\r\n</mat-table>\r\n\r\n<mat-header-row *matHeaderRowDef=\"$keys(); sticky: state.$props().isSticky\" [style.height]=\"$headerHeight()\"\r\n [style.min-height]=\"$headerHeight()\" [style.top.px]=\"($offset()! * -1)\"/>\r\n<mat-footer-row *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \" [style.height]=\"$footerHeight()\"\r\n [style.min-height]=\"$footerHeight()\"\r\n [style.bottom.px]=\"$stickyFooter() ? ($offset()) : undefined\"/>\r\n", styles: [":host{--mat-paginator-container-size: var(tb-paginator-container-size, initial)}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}.group-cell{display:flex;align-items:center}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1$6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$6.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1$6.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i1$6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1$6.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i1$6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i1$6.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i1$1.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: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: FunctionPipe, name: "func" }, { kind: "directive", type: StylerDirective, selector: "[styler]", inputs: ["element", "styler"] }, { kind: "directive", type: ConditionalClassesDirective, selector: "[conditionalClasses]", inputs: ["element", "conditionalClasses"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$4.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: i1$4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i1$4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: StopPropagationDirective, selector: "[stop-propagation]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5051
5114
  }
5052
5115
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: GenericTableComponent, decorators: [{
5053
5116
  type: Component,
@@ -6721,14 +6784,14 @@ class TableContainerComponent {
6721
6784
  const data = this.$sortedAndFilteredData();
6722
6785
  const groups = this.$timestampedGroups();
6723
6786
  const expanded = this.$timestampedExpanded();
6724
- const sorts = this.$timestampedGroupSortUpdated();
6787
+ const groupSorts = this.$timestampedGroupSortUpdated();
6725
6788
  if (!data)
6726
6789
  return undefined;
6727
6790
  return ({
6728
6791
  data,
6729
6792
  groups,
6730
6793
  expanded,
6731
- sorts,
6794
+ groupSorts,
6732
6795
  });
6733
6796
  });
6734
6797
  this.$filteredSortedAndGrouped = linkedSignal({
@@ -6766,7 +6829,7 @@ class TableContainerComponent {
6766
6829
  #setUpAllValuesFilters;
6767
6830
  static { this.headerId = 'tb-header-wrapper'; }
6768
6831
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: TableContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6769
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.3", type: TableContainerComponent, isStandalone: true, selector: "tb-table-container", inputs: { $tableBuilder: { classPropertyName: "$tableBuilder", publicName: "tableBuilder", isSignal: true, isRequired: true, transformFunction: null }, $tableIdInput: { classPropertyName: "$tableIdInput", publicName: "tableId", isSignal: true, isRequired: false, transformFunction: null }, $trackByInput: { classPropertyName: "$trackByInput", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null }, $inputFilters: { classPropertyName: "$inputFilters", publicName: "inputFilters", isSignal: true, isRequired: false, transformFunction: null }, $indexColumnInput: { classPropertyName: "$indexColumnInput", publicName: "indexColumn", isSignal: true, isRequired: false, transformFunction: null }, $selectionColumnInput: { classPropertyName: "$selectionColumnInput", publicName: "selectionColumn", isSignal: true, isRequired: false, transformFunction: null }, $stickyHeaderInput: { classPropertyName: "$stickyHeaderInput", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, $stickyFooterInput: { classPropertyName: "$stickyFooterInput", publicName: "stickyFooter", isSignal: true, isRequired: false, transformFunction: null }, $groupHeaderTemplate: { classPropertyName: "$groupHeaderTemplate", publicName: "groupHeaderTemplate", isSignal: true, isRequired: false, transformFunction: null }, $groupHeaderHeight: { classPropertyName: "$groupHeaderHeight", publicName: "groupHeaderHeight", isSignal: true, isRequired: false, transformFunction: null }, $pageSize: { classPropertyName: "$pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selection$: "selection", onStateReset$: "onStateReset", onSaveState$: "onSaveState", state$: "state", data$: "data" }, providers: [TableStore, ExportToCsvService, WrapperFilterStore, DataStore], queries: [{ propertyName: "$filterDirectives", predicate: TableFilterDirective, descendants: true, isSignal: true }, { propertyName: "$customFilterDirectives", predicate: TableCustomFilterDirective, descendants: true, isSignal: true }, { propertyName: "_$customRows", predicate: (MatRowDef), isSignal: true }, { propertyName: "$customCells", predicate: CustomCellDirective, isSignal: true }, { propertyName: "$customGroupRows", predicate: CustomGroupRowDirective, isSignal: true }], viewQueries: [{ propertyName: "$paginatorComponent", first: true, predicate: PaginatorComponent, descendants: true, isSignal: true }, { propertyName: "$genericTable", first: true, predicate: GenericTableComponent, descendants: true, isSignal: true }, { propertyName: "$menu", first: true, predicate: MatMenu, descendants: true, isSignal: true }], ngImport: i0, template: "@let tableId = $tableId();\r\n@let tableSettings = state.$tableSettings();\r\n\r\n<ng-content select=\"[before]\" />\r\n<ng-container multiSort>\r\n <div class=\"tb-header-wrapper\" [id]=\"headerId\">\r\n <div class=\"title\">\r\n @if ((!$collapsedHeader()) || tableSettings.showTitleWhenHeaderCollapsed)\r\n {\r\n <ng-content select=\".tb-header-title\"/>\r\n @if (tableSettings.title)\r\n {\r\n @switch (tableSettings.title.level)\r\n {\r\n @case (1) { <h1 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h1>}\r\n @case (2) { <h2 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h2>}\r\n @case (4) { <h4 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h4>}\r\n @case (5) { <h5 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h5>}\r\n @case (6) { <h6 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h6>}\r\n @default { <h3 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h3>}\r\n }\r\n }\r\n }\r\n </div>\r\n @if(state.$groupByData().length)\r\n {\r\n <group-by-list />\r\n }\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list />\r\n @if (!tableSettings.hideHeader)\r\n {\r\n @if (!$collapsedHeader())\r\n {\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu' [xPosition]=\"'before'\">\r\n <lib-table-header-menu #l/>\r\n </mat-menu>\r\n\r\n }\r\n @else\r\n {\r\n <mat-icon color=\"primary\" class=\"flat-menu-button pointer\" [matMenuTriggerFor]=\"mainMenu\">more_horiz</mat-icon>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"collapsed-head-row\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu; injector menuInjector\"/>\r\n </div>\r\n <lib-table-header-menu />\r\n </mat-menu>\r\n }\r\n <mat-icon class=\"collapse-icon header\" [matTooltip]=\"$collapsedHeader() ? 'expand' : 'collapse'\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{$collapsedHeader() ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n }\r\n\r\n </div>\r\n </div>\r\n\r\n @if($useVirtual())\r\n {\r\n <tb-virtual-scroll-container class=\"scrollable\">\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayDataLength]=\"$displayDataLength()\"\r\n [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" (selection)='_selection$.next($event)' />\r\n </tb-virtual-scroll-container>\r\n }\r\n @else\r\n {\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayDataLength]=\"$displayDataLength()\"\r\n [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" (selection)='_selection$.next($event)' />\r\n }\r\n @if(tableSettings.usePaginator)\r\n {\r\n <div class=\"paginator\">\r\n <tb-paginator #tbPaginator />\r\n\r\n <mat-icon class=\"collapse-icon footer\" [matTooltip]=\"$collapsedFooter() ? 'expand' : 'collapse'\"\r\n (click)=\"state.toggleCollapseFooter()\">\r\n {{$collapsedFooter() ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n </div>\r\n }\r\n</ng-container>\r\n\r\n<ng-template #headerMenu>\r\n @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}\r\n @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}\r\n @if (!tableSettings.hideSort) {<tb-sort-menu/>}\r\n @if (!!tableId && !$collapsedHeader()) {<tb-profiles-menu [tableId]=\"tableId\"/>}\r\n</ng-template>\r\n", styles: [".tb-header-wrapper{display:flex;flex-direction:row;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-left:auto}.flat-menu{line-height:initial;height:initial}.pointer{cursor:pointer}.add-key{width:90%}.paginator{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff;bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}.profiles-menu{visibility:hidden;width:0px;height:0px;display:block;overflow:hidden;position:absolute;top:50px}.collapsed-head-row{display:flex;justify-content:space-evenly}::ng-deep tb-generic-table .mat-mdc-row:nth-child(odd):not(.no-stripe){background-color:var(--tb-odd-row-background-color, #cdeefe)}.tb-container-title{padding-left:var(--tb-container-title-padding-left, 10px);margin:var(--tb-container-title-margin, 0)}\n", ".collapse-icon{font-size:16px;height:16px;color:#3f51b5;align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}.paginator-row{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PaginatorComponent, selector: "tb-paginator" }, { kind: "directive", type: MultiSortDirective, selector: "[multiSort]", inputs: ["matSortDisabled"], exportAs: ["multiSort"] }, { kind: "component", type: GroupByListComponent, selector: "group-by-list" }, { kind: "component", type: FilterChipsComponent, selector: "lib-filter-list" }, { kind: "component", type: GenFilterDisplayerComponent, selector: "tb-filter-displayer" }, { kind: "component", type: GenColDisplayerComponent, selector: "tb-col-displayer" }, { kind: "component", type: SortMenuComponent, selector: "tb-sort-menu" }, { kind: "component", type: GenericTableComponent, selector: "tb-generic-table", inputs: ["displayDataLength", "data", "rows", "columnInfos", "dataSource", "trackBy"], outputs: ["selection"] }, { kind: "component", type: ProfilesMenuComponent, selector: "tb-profiles-menu", inputs: ["tableId", "isMatMenuChild"] }, { kind: "component", type: TableHeaderMenuComponent, selector: "lib-table-header-menu" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i1$4.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: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: VirtualScrollContainer, selector: "tb-virtual-scroll-container" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6832
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.3", type: TableContainerComponent, isStandalone: true, selector: "tb-table-container", inputs: { $tableBuilder: { classPropertyName: "$tableBuilder", publicName: "tableBuilder", isSignal: true, isRequired: true, transformFunction: null }, $tableIdInput: { classPropertyName: "$tableIdInput", publicName: "tableId", isSignal: true, isRequired: false, transformFunction: null }, $trackByInput: { classPropertyName: "$trackByInput", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null }, $inputFilters: { classPropertyName: "$inputFilters", publicName: "inputFilters", isSignal: true, isRequired: false, transformFunction: null }, $indexColumnInput: { classPropertyName: "$indexColumnInput", publicName: "indexColumn", isSignal: true, isRequired: false, transformFunction: null }, $selectionColumnInput: { classPropertyName: "$selectionColumnInput", publicName: "selectionColumn", isSignal: true, isRequired: false, transformFunction: null }, $stickyHeaderInput: { classPropertyName: "$stickyHeaderInput", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, $stickyFooterInput: { classPropertyName: "$stickyFooterInput", publicName: "stickyFooter", isSignal: true, isRequired: false, transformFunction: null }, $groupHeaderTemplate: { classPropertyName: "$groupHeaderTemplate", publicName: "groupHeaderTemplate", isSignal: true, isRequired: false, transformFunction: null }, $groupHeaderHeight: { classPropertyName: "$groupHeaderHeight", publicName: "groupHeaderHeight", isSignal: true, isRequired: false, transformFunction: null }, $pageSize: { classPropertyName: "$pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selection$: "selection", onStateReset$: "onStateReset", onSaveState$: "onSaveState", state$: "state", data$: "data" }, providers: [TableStore, ExportToCsvService, WrapperFilterStore, DataStore], queries: [{ propertyName: "$filterDirectives", predicate: TableFilterDirective, descendants: true, isSignal: true }, { propertyName: "$customFilterDirectives", predicate: TableCustomFilterDirective, descendants: true, isSignal: true }, { propertyName: "_$customRows", predicate: (MatRowDef), isSignal: true }, { propertyName: "$customCells", predicate: CustomCellDirective, isSignal: true }, { propertyName: "$customGroupRows", predicate: CustomGroupRowDirective, isSignal: true }], viewQueries: [{ propertyName: "$paginatorComponent", first: true, predicate: PaginatorComponent, descendants: true, isSignal: true }, { propertyName: "$genericTable", first: true, predicate: GenericTableComponent, descendants: true, isSignal: true }, { propertyName: "$menu", first: true, predicate: MatMenu, descendants: true, isSignal: true }], ngImport: i0, template: "@let tableId = $tableId();\r\n@let tableSettings = state.$tableSettings();\r\n\r\n<ng-content select=\"[before]\" />\r\n<ng-container multiSort>\r\n <div class=\"tb-header-wrapper\" [id]=\"headerId\">\r\n <div class=\"title\">\r\n @if ((!$collapsedHeader()) || tableSettings.showTitleWhenHeaderCollapsed)\r\n {\r\n <ng-content select=\".tb-header-title\"/>\r\n @if (tableSettings.title)\r\n {\r\n @switch (tableSettings.title.level)\r\n {\r\n @case (1) { <h1 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h1>}\r\n @case (2) { <h2 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h2>}\r\n @case (4) { <h4 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h4>}\r\n @case (5) { <h5 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h5>}\r\n @case (6) { <h6 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h6>}\r\n @default { <h3 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h3>}\r\n }\r\n }\r\n }\r\n </div>\r\n @if(state.$groupByData().length)\r\n {\r\n <group-by-list />\r\n }\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list />\r\n @if (!tableSettings.hideHeader)\r\n {\r\n @if (!$collapsedHeader())\r\n {\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu' [xPosition]=\"'before'\">\r\n <lib-table-header-menu #l/>\r\n </mat-menu>\r\n\r\n }\r\n @else\r\n {\r\n <mat-icon color=\"primary\" class=\"flat-menu-button pointer\" [matMenuTriggerFor]=\"mainMenu\">more_horiz</mat-icon>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"collapsed-head-row\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu; injector menuInjector\"/>\r\n </div>\r\n <lib-table-header-menu />\r\n </mat-menu>\r\n }\r\n <mat-icon class=\"collapse-icon header\" [matTooltip]=\"$collapsedHeader() ? 'expand' : 'collapse'\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{$collapsedHeader() ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n }\r\n\r\n </div>\r\n </div>\r\n\r\n @if($useVirtual())\r\n {\r\n <tb-virtual-scroll-container class=\"scrollable\">\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayData]=\"$filteredSortedAndGrouped()?.displayData || []\"\r\n [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" (selection)='_selection$.next($event)' />\r\n </tb-virtual-scroll-container>\r\n }\r\n @else\r\n {\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayData]=\"$filteredSortedAndGrouped()?.displayData || []\"\r\n [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" (selection)='_selection$.next($event)' />\r\n }\r\n @if(tableSettings.usePaginator)\r\n {\r\n <div class=\"paginator\">\r\n <tb-paginator #tbPaginator />\r\n\r\n <mat-icon class=\"collapse-icon footer\" [matTooltip]=\"$collapsedFooter() ? 'expand' : 'collapse'\"\r\n (click)=\"state.toggleCollapseFooter()\">\r\n {{$collapsedFooter() ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n </div>\r\n }\r\n</ng-container>\r\n\r\n<ng-template #headerMenu>\r\n @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}\r\n @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}\r\n @if (!tableSettings.hideSort) {<tb-sort-menu/>}\r\n @if (!!tableId && !$collapsedHeader()) {<tb-profiles-menu [tableId]=\"tableId\"/>}\r\n</ng-template>\r\n", styles: [".tb-header-wrapper{display:flex;flex-direction:row;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-left:auto}.flat-menu{line-height:initial;height:initial}.pointer{cursor:pointer}.add-key{width:90%}.paginator{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff;bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}.profiles-menu{visibility:hidden;width:0px;height:0px;display:block;overflow:hidden;position:absolute;top:50px}.collapsed-head-row{display:flex;justify-content:space-evenly}::ng-deep tb-generic-table .mat-mdc-row:nth-child(odd):not(.no-stripe){background-color:var(--tb-odd-row-background-color, #cdeefe)}.tb-container-title{padding-left:var(--tb-container-title-padding-left, 10px);margin:var(--tb-container-title-margin, 0)}\n", ".collapse-icon{font-size:16px;height:16px;color:#3f51b5;align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}.paginator-row{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PaginatorComponent, selector: "tb-paginator" }, { kind: "directive", type: MultiSortDirective, selector: "[multiSort]", inputs: ["matSortDisabled"], exportAs: ["multiSort"] }, { kind: "component", type: GroupByListComponent, selector: "group-by-list" }, { kind: "component", type: FilterChipsComponent, selector: "lib-filter-list" }, { kind: "component", type: GenFilterDisplayerComponent, selector: "tb-filter-displayer" }, { kind: "component", type: GenColDisplayerComponent, selector: "tb-col-displayer" }, { kind: "component", type: SortMenuComponent, selector: "tb-sort-menu" }, { kind: "component", type: GenericTableComponent, selector: "tb-generic-table", inputs: ["displayData", "data", "rows", "columnInfos", "dataSource", "trackBy"], outputs: ["selection"] }, { kind: "component", type: ProfilesMenuComponent, selector: "tb-profiles-menu", inputs: ["tableId", "isMatMenuChild"] }, { kind: "component", type: TableHeaderMenuComponent, selector: "lib-table-header-menu" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i1$4.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: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: VirtualScrollContainer, selector: "tb-virtual-scroll-container" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6770
6833
  }
6771
6834
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: TableContainerComponent, decorators: [{
6772
6835
  type: Component,
@@ -6776,7 +6839,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImpor
6776
6839
  MultiSortDirective, GroupByListComponent, FilterChipsComponent, GenFilterDisplayerComponent, GenColDisplayerComponent,
6777
6840
  SortMenuComponent, GenericTableComponent, ProfilesMenuComponent, TableHeaderMenuComponent,
6778
6841
  MatButtonModule, MatMenuModule, MatIconModule, MatTooltipModule, VirtualScrollContainer,
6779
- ], template: "@let tableId = $tableId();\r\n@let tableSettings = state.$tableSettings();\r\n\r\n<ng-content select=\"[before]\" />\r\n<ng-container multiSort>\r\n <div class=\"tb-header-wrapper\" [id]=\"headerId\">\r\n <div class=\"title\">\r\n @if ((!$collapsedHeader()) || tableSettings.showTitleWhenHeaderCollapsed)\r\n {\r\n <ng-content select=\".tb-header-title\"/>\r\n @if (tableSettings.title)\r\n {\r\n @switch (tableSettings.title.level)\r\n {\r\n @case (1) { <h1 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h1>}\r\n @case (2) { <h2 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h2>}\r\n @case (4) { <h4 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h4>}\r\n @case (5) { <h5 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h5>}\r\n @case (6) { <h6 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h6>}\r\n @default { <h3 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h3>}\r\n }\r\n }\r\n }\r\n </div>\r\n @if(state.$groupByData().length)\r\n {\r\n <group-by-list />\r\n }\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list />\r\n @if (!tableSettings.hideHeader)\r\n {\r\n @if (!$collapsedHeader())\r\n {\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu' [xPosition]=\"'before'\">\r\n <lib-table-header-menu #l/>\r\n </mat-menu>\r\n\r\n }\r\n @else\r\n {\r\n <mat-icon color=\"primary\" class=\"flat-menu-button pointer\" [matMenuTriggerFor]=\"mainMenu\">more_horiz</mat-icon>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"collapsed-head-row\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu; injector menuInjector\"/>\r\n </div>\r\n <lib-table-header-menu />\r\n </mat-menu>\r\n }\r\n <mat-icon class=\"collapse-icon header\" [matTooltip]=\"$collapsedHeader() ? 'expand' : 'collapse'\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{$collapsedHeader() ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n }\r\n\r\n </div>\r\n </div>\r\n\r\n @if($useVirtual())\r\n {\r\n <tb-virtual-scroll-container class=\"scrollable\">\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayDataLength]=\"$displayDataLength()\"\r\n [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" (selection)='_selection$.next($event)' />\r\n </tb-virtual-scroll-container>\r\n }\r\n @else\r\n {\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayDataLength]=\"$displayDataLength()\"\r\n [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" (selection)='_selection$.next($event)' />\r\n }\r\n @if(tableSettings.usePaginator)\r\n {\r\n <div class=\"paginator\">\r\n <tb-paginator #tbPaginator />\r\n\r\n <mat-icon class=\"collapse-icon footer\" [matTooltip]=\"$collapsedFooter() ? 'expand' : 'collapse'\"\r\n (click)=\"state.toggleCollapseFooter()\">\r\n {{$collapsedFooter() ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n </div>\r\n }\r\n</ng-container>\r\n\r\n<ng-template #headerMenu>\r\n @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}\r\n @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}\r\n @if (!tableSettings.hideSort) {<tb-sort-menu/>}\r\n @if (!!tableId && !$collapsedHeader()) {<tb-profiles-menu [tableId]=\"tableId\"/>}\r\n</ng-template>\r\n", styles: [".tb-header-wrapper{display:flex;flex-direction:row;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-left:auto}.flat-menu{line-height:initial;height:initial}.pointer{cursor:pointer}.add-key{width:90%}.paginator{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff;bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}.profiles-menu{visibility:hidden;width:0px;height:0px;display:block;overflow:hidden;position:absolute;top:50px}.collapsed-head-row{display:flex;justify-content:space-evenly}::ng-deep tb-generic-table .mat-mdc-row:nth-child(odd):not(.no-stripe){background-color:var(--tb-odd-row-background-color, #cdeefe)}.tb-container-title{padding-left:var(--tb-container-title-padding-left, 10px);margin:var(--tb-container-title-margin, 0)}\n", ".collapse-icon{font-size:16px;height:16px;color:#3f51b5;align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}.paginator-row{display:flex;align-items:center}\n"] }]
6842
+ ], template: "@let tableId = $tableId();\r\n@let tableSettings = state.$tableSettings();\r\n\r\n<ng-content select=\"[before]\" />\r\n<ng-container multiSort>\r\n <div class=\"tb-header-wrapper\" [id]=\"headerId\">\r\n <div class=\"title\">\r\n @if ((!$collapsedHeader()) || tableSettings.showTitleWhenHeaderCollapsed)\r\n {\r\n <ng-content select=\".tb-header-title\"/>\r\n @if (tableSettings.title)\r\n {\r\n @switch (tableSettings.title.level)\r\n {\r\n @case (1) { <h1 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h1>}\r\n @case (2) { <h2 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h2>}\r\n @case (4) { <h4 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h4>}\r\n @case (5) { <h5 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h5>}\r\n @case (6) { <h6 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h6>}\r\n @default { <h3 class=\"tb-container-title\" [style]=\"tableSettings.title.styles\">{{tableSettings.title.text}}</h3>}\r\n }\r\n }\r\n }\r\n </div>\r\n @if(state.$groupByData().length)\r\n {\r\n <group-by-list />\r\n }\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list />\r\n @if (!tableSettings.hideHeader)\r\n {\r\n @if (!$collapsedHeader())\r\n {\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu' [xPosition]=\"'before'\">\r\n <lib-table-header-menu #l/>\r\n </mat-menu>\r\n\r\n }\r\n @else\r\n {\r\n <mat-icon color=\"primary\" class=\"flat-menu-button pointer\" [matMenuTriggerFor]=\"mainMenu\">more_horiz</mat-icon>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"collapsed-head-row\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu; injector menuInjector\"/>\r\n </div>\r\n <lib-table-header-menu />\r\n </mat-menu>\r\n }\r\n <mat-icon class=\"collapse-icon header\" [matTooltip]=\"$collapsedHeader() ? 'expand' : 'collapse'\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{$collapsedHeader() ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n }\r\n\r\n </div>\r\n </div>\r\n\r\n @if($useVirtual())\r\n {\r\n <tb-virtual-scroll-container class=\"scrollable\">\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayData]=\"$filteredSortedAndGrouped()?.displayData || []\"\r\n [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" (selection)='_selection$.next($event)' />\r\n </tb-virtual-scroll-container>\r\n }\r\n @else\r\n {\r\n <tb-generic-table [rows]=\"$customRows()\" [data]=\"$data()!\" [displayData]=\"$filteredSortedAndGrouped()?.displayData || []\"\r\n [columnInfos]='$myColumns()' [trackBy]=\"$trackBy()\" [dataSource]=\"dataSource\" (selection)='_selection$.next($event)' />\r\n }\r\n @if(tableSettings.usePaginator)\r\n {\r\n <div class=\"paginator\">\r\n <tb-paginator #tbPaginator />\r\n\r\n <mat-icon class=\"collapse-icon footer\" [matTooltip]=\"$collapsedFooter() ? 'expand' : 'collapse'\"\r\n (click)=\"state.toggleCollapseFooter()\">\r\n {{$collapsedFooter() ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n </div>\r\n }\r\n</ng-container>\r\n\r\n<ng-template #headerMenu>\r\n @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}\r\n @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}\r\n @if (!tableSettings.hideSort) {<tb-sort-menu/>}\r\n @if (!!tableId && !$collapsedHeader()) {<tb-profiles-menu [tableId]=\"tableId\"/>}\r\n</ng-template>\r\n", styles: [".tb-header-wrapper{display:flex;flex-direction:row;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-left:auto}.flat-menu{line-height:initial;height:initial}.pointer{cursor:pointer}.add-key{width:90%}.paginator{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff;bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}.profiles-menu{visibility:hidden;width:0px;height:0px;display:block;overflow:hidden;position:absolute;top:50px}.collapsed-head-row{display:flex;justify-content:space-evenly}::ng-deep tb-generic-table .mat-mdc-row:nth-child(odd):not(.no-stripe){background-color:var(--tb-odd-row-background-color, #cdeefe)}.tb-container-title{padding-left:var(--tb-container-title-padding-left, 10px);margin:var(--tb-container-title-margin, 0)}\n", ".collapse-icon{font-size:16px;height:16px;color:#3f51b5;align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}.paginator-row{display:flex;align-items:center}\n"] }]
6780
6843
  }] });
6781
6844
  function isFunction(a) {
6782
6845
  return typeof a === 'function';