@one-paragon/angular-utilities 2.8.4 → 2.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/fesm2022/one-paragon-angular-utilities.mjs +7350 -0
  2. package/fesm2022/one-paragon-angular-utilities.mjs.map +1 -0
  3. package/package.json +27 -15
  4. package/types/one-paragon-angular-utilities.d.ts +2211 -0
  5. package/karma.conf.js +0 -43
  6. package/ng-package.json +0 -7
  7. package/src/action-state/action-state-spinner/action-state-spinner.component.css +0 -16
  8. package/src/action-state/action-state-spinner/action-state-spinner.component.html +0 -7
  9. package/src/action-state/action-state-spinner/action-state-spinner.component.spec.ts +0 -25
  10. package/src/action-state/action-state-spinner/action-state-spinner.component.ts +0 -26
  11. package/src/action-state/action-state-ui/action-state-ui.module.ts +0 -13
  12. package/src/action-state/index.ts +0 -8
  13. package/src/action-state/ngrx-ext/ngrx-ext.module.ts +0 -14
  14. package/src/action-state/ngrx.ts +0 -69
  15. package/src/http-request-state/RequestStateFactory.ts +0 -56
  16. package/src/http-request-state/RequestStateStore.ts +0 -360
  17. package/src/http-request-state/deprecated.ts +0 -20
  18. package/src/http-request-state/directives/HttpStateDirectiveBase.ts +0 -29
  19. package/src/http-request-state/directives/http-error-state-directive.ts +0 -21
  20. package/src/http-request-state/directives/http-inProgress-state-directive.ts +0 -19
  21. package/src/http-request-state/directives/http-notStarted-state-directive.ts +0 -19
  22. package/src/http-request-state/directives/http-success-state-directive.ts +0 -29
  23. package/src/http-request-state/directives/index.ts +0 -5
  24. package/src/http-request-state/directives/request-state-directive.spec.ts +0 -73
  25. package/src/http-request-state/directives/request-state-directive.ts +0 -78
  26. package/src/http-request-state/documentation/CREATE-REQUESTOR.md +0 -667
  27. package/src/http-request-state/documentation/README.md +0 -191
  28. package/src/http-request-state/documentation/REQUEST-STATE-STORE-CONFIG.md +0 -648
  29. package/src/http-request-state/documentation/REQUESTOR.md +0 -616
  30. package/src/http-request-state/helpers.ts +0 -30
  31. package/src/http-request-state/http-state-module.ts +0 -23
  32. package/src/http-request-state/index.ts +0 -7
  33. package/src/http-request-state/models/view-context.ts +0 -18
  34. package/src/http-request-state/observable.spec.ts +0 -43
  35. package/src/http-request-state/request-state.ts +0 -66
  36. package/src/http-request-state/rxjs/getRequestorBody.ts +0 -10
  37. package/src/http-request-state/rxjs/getRequestorState.ts +0 -8
  38. package/src/http-request-state/rxjs/index.ts +0 -4
  39. package/src/http-request-state/rxjs/tapError.ts +0 -16
  40. package/src/http-request-state/rxjs/tapSuccess.ts +0 -16
  41. package/src/http-request-state/strategies.spec.ts +0 -42
  42. package/src/http-request-state/types.ts +0 -54
  43. package/src/ngrx/actionable-selector.ts +0 -189
  44. package/src/ngrx/index.ts +0 -1
  45. package/src/public-api.ts +0 -40
  46. package/src/rxjs/defaultShareReplay.ts +0 -8
  47. package/src/rxjs/index.ts +0 -5
  48. package/src/rxjs/mapError.ts +0 -8
  49. package/src/rxjs/rxjs-operators.ts +0 -130
  50. package/src/rxjs/subjectifier.ts +0 -17
  51. package/src/rxjs/subscriber.directive.ts +0 -57
  52. package/src/specs/clickSubject.spec.ts +0 -99
  53. package/src/specs/dialog.spec.ts +0 -101
  54. package/src/specs/toggleGroupDirective.spec.ts +0 -229
  55. package/src/table-builder/classes/DefaultSettings.ts +0 -11
  56. package/src/table-builder/classes/MatTableObservableDataSource.ts +0 -23
  57. package/src/table-builder/classes/TableBuilderConfig.ts +0 -49
  58. package/src/table-builder/classes/TableBuilderDataSource.ts +0 -64
  59. package/src/table-builder/classes/TableState.ts +0 -96
  60. package/src/table-builder/classes/data-store.ts +0 -10
  61. package/src/table-builder/classes/display-col.ts +0 -5
  62. package/src/table-builder/classes/filter-info.ts +0 -129
  63. package/src/table-builder/classes/table-builder-general-settings.ts +0 -233
  64. package/src/table-builder/classes/table-builder.ts +0 -105
  65. package/src/table-builder/classes/table-store.helpers.ts +0 -109
  66. package/src/table-builder/classes/table-store.ts +0 -540
  67. package/src/table-builder/components/array-column.component.ts +0 -34
  68. package/src/table-builder/components/column-builder/column-builder.component.html +0 -109
  69. package/src/table-builder/components/column-builder/column-builder.component.scss +0 -43
  70. package/src/table-builder/components/column-builder/column-builder.component.spec.ts +0 -49
  71. package/src/table-builder/components/column-builder/column-builder.component.ts +0 -130
  72. package/src/table-builder/components/column-builder/column-helpers.ts +0 -54
  73. package/src/table-builder/components/column-header-menu/column-header-menu.component.html +0 -128
  74. package/src/table-builder/components/column-header-menu/column-header-menu.component.scss +0 -97
  75. package/src/table-builder/components/column-header-menu/column-header-menu.component.ts +0 -113
  76. package/src/table-builder/components/date-filter/date-filter.component.html +0 -39
  77. package/src/table-builder/components/date-filter/date-filter.component.ts +0 -33
  78. package/src/table-builder/components/date-time-filter/date-time-filter.component.html +0 -25
  79. package/src/table-builder/components/date-time-filter/date-time-filter.component.ts +0 -33
  80. package/src/table-builder/components/filter/filter.component.html +0 -120
  81. package/src/table-builder/components/filter/filter.component.scss +0 -60
  82. package/src/table-builder/components/filter/filter.component.spec.ts +0 -86
  83. package/src/table-builder/components/filter/filter.component.ts +0 -73
  84. package/src/table-builder/components/filter/in-list/in-list-filter.component.ts +0 -171
  85. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.html +0 -60
  86. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.scss +0 -57
  87. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.ts +0 -44
  88. package/src/table-builder/components/generic-table/generic-table.component.html +0 -140
  89. package/src/table-builder/components/generic-table/generic-table.component.scss +0 -45
  90. package/src/table-builder/components/generic-table/generic-table.component.ts +0 -531
  91. package/src/table-builder/components/generic-table/paginator.component.ts +0 -125
  92. package/src/table-builder/components/group-by-list/group-by-list.component.css +0 -24
  93. package/src/table-builder/components/group-by-list/group-by-list.component.html +0 -21
  94. package/src/table-builder/components/group-by-list/group-by-list.component.spec.ts +0 -23
  95. package/src/table-builder/components/group-by-list/group-by-list.component.ts +0 -26
  96. package/src/table-builder/components/in-filter/in-filter.component.css +0 -22
  97. package/src/table-builder/components/in-filter/in-filter.component.html +0 -38
  98. package/src/table-builder/components/in-filter/in-filter.component.ts +0 -66
  99. package/src/table-builder/components/index.ts +0 -9
  100. package/src/table-builder/components/initialization-component/initialization.component.html +0 -78
  101. package/src/table-builder/components/initialization-component/initialization.component.ts +0 -28
  102. package/src/table-builder/components/link-column.component.ts +0 -42
  103. package/src/table-builder/components/number-filter/number-filter.component.css +0 -10
  104. package/src/table-builder/components/number-filter/number-filter.component.html +0 -32
  105. package/src/table-builder/components/number-filter/number-filter.component.spec.ts +0 -30
  106. package/src/table-builder/components/number-filter/number-filter.component.ts +0 -34
  107. package/src/table-builder/components/profiles-menu/profiles-menu.component.html +0 -77
  108. package/src/table-builder/components/profiles-menu/profiles-menu.component.scss +0 -126
  109. package/src/table-builder/components/profiles-menu/profiles-menu.component.spec.ts +0 -23
  110. package/src/table-builder/components/profiles-menu/profiles-menu.component.ts +0 -64
  111. package/src/table-builder/components/reset-menu/reset-menu.component.css +0 -3
  112. package/src/table-builder/components/reset-menu/reset-menu.component.html +0 -10
  113. package/src/table-builder/components/reset-menu/reset-menu.component.ts +0 -87
  114. package/src/table-builder/components/scroll-strategy.ts +0 -139
  115. package/src/table-builder/components/sort-menu/sort-menu.component-store.ts +0 -57
  116. package/src/table-builder/components/sort-menu/sort-menu.component.html +0 -115
  117. package/src/table-builder/components/sort-menu/sort-menu.component.scss +0 -119
  118. package/src/table-builder/components/sort-menu/sort-menu.component.ts +0 -88
  119. package/src/table-builder/components/table-container/table-container.component.html +0 -94
  120. package/src/table-builder/components/table-container/table-container.component.scss +0 -60
  121. package/src/table-builder/components/table-container/table-container.component.ts +0 -467
  122. package/src/table-builder/components/table-container/table-container.helpers/data-state.helpers.ts +0 -113
  123. package/src/table-builder/components/table-container/table-container.helpers/filter-state.helpers.ts +0 -125
  124. package/src/table-builder/components/table-container/table-container.helpers/groupBy.helpers.ts +0 -172
  125. package/src/table-builder/components/table-container/table-container.helpers/meta-data.helpers.ts +0 -19
  126. package/src/table-builder/components/table-container/table-container.helpers/sort-state.helpers.ts +0 -47
  127. package/src/table-builder/components/table-container/tableProps.ts +0 -21
  128. package/src/table-builder/components/table-container/virtual-scroll-container.ts +0 -216
  129. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.html +0 -42
  130. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.ts +0 -47
  131. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.css +0 -40
  132. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.html +0 -11
  133. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.spec.ts +0 -85
  134. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.ts +0 -35
  135. package/src/table-builder/components/table-container-filter/table-wrapper-filter-store.ts +0 -13
  136. package/src/table-builder/components/table-header-menu/table-header-menu.component.css +0 -21
  137. package/src/table-builder/components/table-header-menu/table-header-menu.component.html +0 -48
  138. package/src/table-builder/components/table-header-menu/table-header-menu.component.ts +0 -36
  139. package/src/table-builder/directives/custom-cell-directive.ts +0 -63
  140. package/src/table-builder/directives/custom-header-directive.ts +0 -16
  141. package/src/table-builder/directives/group-row-directive.ts +0 -91
  142. package/src/table-builder/directives/index.ts +0 -8
  143. package/src/table-builder/directives/multi-sort.directive.spec.ts +0 -124
  144. package/src/table-builder/directives/multi-sort.directive.ts +0 -58
  145. package/src/table-builder/directives/resize-column.directive.ts +0 -107
  146. package/src/table-builder/directives/table-wrapper.directive.ts +0 -13
  147. package/src/table-builder/directives/tb-filter.directive.ts +0 -376
  148. package/src/table-builder/documentation/table-builder/CUSTOM-CELL.md +0 -568
  149. package/src/table-builder/documentation/table-builder/CUSTOM-GROUP-ROW.md +0 -356
  150. package/src/table-builder/documentation/table-builder/METADATA-DOCUMENTATION.md +0 -517
  151. package/src/table-builder/documentation/table-builder/STYLER-STYLE.md +0 -228
  152. package/src/table-builder/documentation/table-builder/TABLE-BUILDER-CONFIG.md +0 -325
  153. package/src/table-builder/documentation/table-builder/TABLE-BUILDER-SETTINGS.md +0 -515
  154. package/src/table-builder/documentation/table-builder/TABLE-BUILDER.md +0 -430
  155. package/src/table-builder/documentation/table-builder/TABLE-CONTAINER.md +0 -628
  156. package/src/table-builder/enums/filterTypes.ts +0 -39
  157. package/src/table-builder/functions/boolean-filter-function.ts +0 -12
  158. package/src/table-builder/functions/date-filter-function.ts +0 -85
  159. package/src/table-builder/functions/download-data.ts +0 -11
  160. package/src/table-builder/functions/null-filter-function.ts +0 -9
  161. package/src/table-builder/functions/number-filter-function.ts +0 -47
  162. package/src/table-builder/functions/sort-data-function.ts +0 -80
  163. package/src/table-builder/functions/string-filter-function.ts +0 -59
  164. package/src/table-builder/interfaces/ColumnInfo.ts +0 -9
  165. package/src/table-builder/interfaces/dictionary.ts +0 -3
  166. package/src/table-builder/interfaces/meta-data.ts +0 -279
  167. package/src/table-builder/ngrx/tableBuilderStateStore.ts +0 -203
  168. package/src/table-builder/pipes/column-total.pipe.ts +0 -16
  169. package/src/table-builder/pipes/format-filter-type.pipe.ts +0 -12
  170. package/src/table-builder/pipes/format-filter-value.pipe.ts +0 -71
  171. package/src/table-builder/pipes/key-display.ts +0 -13
  172. package/src/table-builder/services/all-values-filter-creator.service.ts +0 -92
  173. package/src/table-builder/services/export-to-csv.service.ts +0 -117
  174. package/src/table-builder/services/link-creator.service.ts +0 -98
  175. package/src/table-builder/services/table-template-service.ts +0 -47
  176. package/src/table-builder/services/transform-creator.ts +0 -90
  177. package/src/table-builder/specs/table-custom-filters.spec.ts +0 -262
  178. package/src/table-builder/styles/collapser.styles.scss +0 -16
  179. package/src/table-builder/table-builder.module.ts +0 -42
  180. package/src/table-builder/types/group-types.ts +0 -42
  181. package/src/table-builder/types/index.ts +0 -1
  182. package/src/test.ts +0 -17
  183. package/src/utilities/array-helpers.ts +0 -13
  184. package/src/utilities/directives/auto-focus.directive.ts +0 -20
  185. package/src/utilities/directives/clickEmitterDirective.ts +0 -15
  186. package/src/utilities/directives/clickSubject.ts +0 -19
  187. package/src/utilities/directives/conditional-classes.directive.ts +0 -36
  188. package/src/utilities/directives/dialog-service.ts +0 -19
  189. package/src/utilities/directives/dialog.ts +0 -174
  190. package/src/utilities/directives/mat-toggle-group-directive.ts +0 -60
  191. package/src/utilities/directives/prevent-enter.directive.ts +0 -12
  192. package/src/utilities/directives/stop-propagation.directive.ts +0 -19
  193. package/src/utilities/directives/styler.ts +0 -45
  194. package/src/utilities/directives/trim-whitespace.directive.ts +0 -20
  195. package/src/utilities/index.ts +0 -22
  196. package/src/utilities/module.ts +0 -53
  197. package/src/utilities/pipes/function.pipe.ts +0 -21
  198. package/src/utilities/pipes/phone.pipe.ts +0 -20
  199. package/src/utilities/pipes/space-case.pipes.spec.ts +0 -47
  200. package/src/utilities/pipes/space-case.pipes.ts +0 -29
  201. package/tsconfig.lib.json +0 -20
  202. package/tsconfig.lib.prod.json +0 -10
  203. package/tsconfig.spec.json +0 -17
@@ -1,33 +0,0 @@
1
- import { Component, ChangeDetectionStrategy, computed, inject, input } from '@angular/core';
2
- import { PartialFilter } from '../../classes/filter-info';
3
- import { FilterType } from '../../enums/filterTypes';
4
- import { ControlContainer, FormsModule, NgForm } from '@angular/forms';
5
- import { MatInputModule } from '@angular/material/input';
6
- import { MatDatepickerModule } from '@angular/material/datepicker';
7
- import { InFilterComponent } from '../in-filter/in-filter.component';
8
- import { TableStore } from '../../classes/table-store';
9
- import { InListFilterComponent } from '../filter/in-list/in-list-filter.component';
10
- import { AllValueOptions, FieldType } from '../../interfaces/meta-data';
11
-
12
- @Component({
13
- selector: 'tb-date-filter',
14
- templateUrl: './date-filter.component.html',
15
- changeDetection: ChangeDetectionStrategy.OnPush,
16
- styleUrl: '../filter/filter.component.scss',
17
- viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],
18
- imports: [
19
- MatInputModule, FormsModule, MatDatepickerModule, InFilterComponent, InListFilterComponent
20
- ]
21
- })
22
- export class DateFilterComponent {
23
- FilterType = FilterType;
24
- FieldType = FieldType;
25
- $info = input.required<PartialFilter>({ alias: 'info' });
26
- $currentFilterType = input.required<FilterType>({ alias: 'currentFilterType' });
27
- private state = inject(TableStore)
28
- $metaData = computed(() => this.state.$getMetaData(this.$info()?.key)());
29
- $allValuesInMeta = computed(() => {
30
- const filterable = this.$metaData()?.additional?.filterOptions?.filterableValues;
31
- return filterable === 'all values' || (filterable as AllValueOptions)?.allValues === true;
32
- });
33
- }
@@ -1,25 +0,0 @@
1
- @let currentFilterType = $currentFilterType();
2
- @let info = $info();
3
-
4
- @if(currentFilterType !== FilterType.DateTimeBetween && currentFilterType !== FilterType.IsNull && currentFilterType !== FilterType.In)
5
- {
6
- <input type="datetime-local" preventEnter name="filterValue" class="op-date-time-input" [ngModel]="info.filterValue"/>
7
- }
8
- @if(currentFilterType === FilterType.DateTimeBetween)
9
- {
10
- <ng-container ngModelGroup="filterValue">
11
- <input type="datetime-local" preventEnter name="Start" class="op-date-time-input" [ngModel]="info.filterValue?.Start"/>
12
- <input type="datetime-local" preventEnter name="End" class="op-date-time-input" [ngModel]="info.filterValue?.End"/>
13
- </ng-container>
14
- }
15
- @if(currentFilterType === FilterType.In)
16
- {
17
- @if($allValuesInMeta())
18
- {
19
- <tb-in-list-filter name="filterValue" [key]="info.key" [values]="info.filterValue" [(ngModel)]="info.filterValue" />
20
- }
21
- @else
22
- {
23
- <lib-in-filter name="filterValue" [type]="FieldType.Date" [(ngModel)]="info.filterValue" />
24
- }
25
- }
@@ -1,33 +0,0 @@
1
- import { Component, ChangeDetectionStrategy, input, inject, computed } from '@angular/core';
2
- import { PartialFilter } from '../../classes/filter-info';
3
- import { FilterType } from '../../enums/filterTypes';
4
- import { ControlContainer, FormsModule, NgForm } from '@angular/forms';
5
- import { AllValueOptions, FieldType } from '../../interfaces/meta-data';
6
- import { TableStore } from '../../classes/table-store';
7
- import { InFilterComponent } from '../in-filter/in-filter.component';
8
- import { InListFilterComponent } from '../filter/in-list/in-list-filter.component';
9
-
10
- @Component({
11
- selector: 'tb-date-time-filter',
12
- templateUrl: './date-time-filter.component.html',
13
- changeDetection: ChangeDetectionStrategy.OnPush,
14
- styleUrl: '../filter/filter.component.scss',
15
- viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],
16
- imports: [
17
- FormsModule, InFilterComponent, InListFilterComponent
18
- ]
19
- })
20
- export class DateTimeFilterComponent {
21
- FilterType = FilterType;
22
- FieldType = FieldType;
23
-
24
- $info = input.required<PartialFilter>({ alias: 'info' });
25
- $currentFilterType = input.required<FilterType>({ alias: 'currentFilterType' });
26
-
27
- private state = inject(TableStore)
28
- $metaData = computed(() => this.state.$getMetaData(this.$info()?.key)());
29
- $allValuesInMeta = computed(() => {
30
- const filterable = this.$metaData()?.additional?.filterOptions?.filterableValues;
31
- return filterable === 'all values' || (filterable as AllValueOptions)?.allValues === true;
32
- });
33
- }
@@ -1,120 +0,0 @@
1
- @let filter = $filter();
2
- @let currentFilterType = $currentFilterType();
3
-
4
- @if (filter)
5
- {
6
- <mat-card appearance="outlined" class="filter-card">
7
- <mat-card-content>
8
- <form #form="ngForm" (keydown.enter)="onEnter(form.value,$event)" (keydown.escape)="close$.next()">
9
- <input type="hidden" name="filterId" [ngModel]="filter.filterId" />
10
- <input type="hidden" name="key" [ngModel]="filter.key" />
11
- <input type="hidden" name="fieldType" [ngModel]="filter.fieldType" />
12
- <div class="head-row" >
13
- <h4 class="filter-name">{{(filter.key | spaceCase)}} Filter</h4>
14
- <button class="cancel-button small-button" color="primary" mat-icon-button type="button" [matTooltip]="'Close'"
15
- (click)="close$.next();">
16
- <mat-icon class="cancel-button" color="primary">close</mat-icon>
17
- </button>
18
- </div>
19
- <div class="filter-row">
20
- <div class="inline">
21
- <mat-form-field class="my-filter" >
22
- <mat-select placeholder="Select Filter Type" name="filterType" [ngModel]="$currentFilterType()" [panelWidth]="null" (ngModelChange)="$enteredFilterType.set($event)">
23
- @for (kvp of filterTypes[filter.fieldType]; track kvp)
24
- {
25
- <mat-option [value]="kvp">
26
- {{ kvp }}
27
- </mat-option>
28
- }
29
- </mat-select>
30
- </mat-form-field>
31
- </div>
32
- @if(
33
- filter.fieldType === FieldType.String
34
- || filter.fieldType === FieldType.Array
35
- || filter.fieldType === FieldType.Unknown
36
- || filter.fieldType === FieldType.PhoneNumber)
37
- {
38
- <ng-container *ngTemplateOutlet="String" />
39
- }
40
- @else if(filter.fieldType === FieldType.Number || filter.fieldType === FieldType.Currency)
41
- {
42
- <tb-number-filter [info]="filter" [currentFilterType]="currentFilterType!" />
43
- }
44
- @else if(filter.fieldType === FieldType.Boolean)
45
- {
46
- <ng-container *ngTemplateOutlet="Boolean" />
47
- }
48
- @else if(
49
- filter.fieldType === FieldType.Date
50
- || (
51
- filter.fieldType === FieldType.DateTime
52
- && (currentFilterType === FilterType.DateIsOn || currentFilterType === FilterType.DateIsNotOn || currentFilterType === FilterType.DateTimeAtOrAfter || currentFilterType === FilterType.DateTimeAtOrBefore)
53
- ))
54
- {
55
- <tb-date-filter [info]="filter" [currentFilterType]="currentFilterType!" />
56
- }
57
- @else if(filter.fieldType === FieldType.DateTime)
58
- {
59
- <tb-date-time-filter [info]="filter" [currentFilterType]="currentFilterType!" />
60
- }
61
- @else if(filter.fieldType === FieldType.Enum)
62
- {
63
- <ng-container *ngTemplateOutlet="Enum" />
64
- }
65
-
66
- @if(currentFilterType === FilterType.IsNull)
67
- {
68
- <mat-radio-group name="filterValue" [ngModel]="filter.filterValue">
69
- <mat-radio-button [value]="true">True</mat-radio-button>
70
- <mat-radio-button [value]="false">False</mat-radio-button>
71
- </mat-radio-group>
72
- }
73
- </div>
74
- <button mat-button disableRipple [disabled]="form.value.filterValue==undefined || !form.value.filterType" (click)="addFilter(form.value)">
75
- Apply
76
- </button>
77
-
78
-
79
- <ng-template #String>
80
- @if(currentFilterType !== FilterType.IsNull && currentFilterType !== FilterType.In)
81
- {
82
- <mat-form-field class="my-filter">
83
- <input matInput name="filterValue" [ngModel]="filter.filterValue" />
84
- </mat-form-field>
85
- }
86
- @else if(currentFilterType === FilterType.In)
87
- {
88
- @if($allValuesInMeta())
89
- {
90
- <tb-in-list-filter name="filterValue" [key]="filter.key" [values]="filter.filterValue" [(ngModel)]="filter.filterValue" />
91
- }
92
- @else
93
- {
94
- <lib-in-filter name="filterValue" [type]="FieldType.String" [(ngModel)]="filter.filterValue" />
95
- }
96
- }
97
- </ng-template>
98
-
99
- <ng-template #Boolean >
100
- @if(currentFilterType === FilterType.BooleanEquals)
101
- {
102
- <div class="switch">
103
- <mat-radio-group name="filterValue" [ngModel]="filter.filterValue" >
104
- <mat-radio-button preventEnter [value]="true">True</mat-radio-button>
105
- <mat-radio-button preventEnter [value]="false">False</mat-radio-button>
106
- </mat-radio-group>
107
- </div>
108
- }
109
- </ng-template>
110
- <ng-template #Enum>
111
- @if(currentFilterType === FilterType.In)
112
- {
113
- <tb-in-list-filter name='filterValue' [key]="filter.key" [values]="filter.filterValue" [(ngModel)]="filter.filterValue" />
114
-
115
- }
116
- </ng-template>
117
- </form>
118
- </mat-card-content>
119
- </mat-card>
120
- }
@@ -1,60 +0,0 @@
1
- .filter-name {
2
- color: var(tb-filter-name);
3
- margin: 10px 0;
4
- font-weight: 600;
5
- display: inline-block;
6
- }
7
-
8
- .switch {
9
- display: inline-block;
10
- }
11
-
12
- .head-row {
13
- display: flex;
14
- width: 100%;
15
- align-items: center;
16
- justify-content: space-between;
17
- }
18
- .filter-row{
19
- display: flex;
20
- align-items: center;
21
- gap: 1rem;
22
- }
23
- mat-card.filter-card{
24
- &::ng-deep mat-form-field{
25
- width: 150px;
26
- }
27
- &::ng-deep.mat-mdc-form-field-subscript-wrapper{
28
- line-height: 0;
29
- &::before{
30
- height: 0;
31
- }
32
- }
33
- }
34
- .inline{
35
- display: inline-block;
36
- }
37
- .small-button {
38
- height: 18px;
39
- width: 18px;
40
- font-size: 18px;
41
- padding: 0;
42
- margin: 0;
43
- ::ng-deep * {
44
- line-height: initial;
45
- font-size: initial;
46
- height: 18px;
47
- width: 18px;
48
- font-size: 18px;
49
- bottom: initial;
50
-
51
- }
52
- }
53
- .cancel-button{
54
- font-weight: 700;
55
- }
56
- .date-toggle ::ng-deep svg{
57
- position: absolute;
58
- left: 0;
59
- top: 0;
60
- }
@@ -1,86 +0,0 @@
1
- import { TestBed, ComponentFixture } from '@angular/core/testing';
2
- import { FilterComponent } from '../filter/filter.component';
3
- import { CommonModule, DatePipe } from '@angular/common';
4
- import { FormsModule } from '@angular/forms';
5
- import { FieldType } from '../../interfaces/meta-data';
6
- import { By } from '@angular/platform-browser';
7
- import { NoopAnimationsModule } from '@angular/platform-browser/animations';
8
- import { SpaceCasePipe } from '../../../utilities/pipes/space-case.pipes';
9
- import { DateFilterComponent } from '../date-filter/date-filter.component';
10
- import { FilterType } from '../../enums/filterTypes';
11
- import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
12
- import { MatButtonHarness } from '@angular/material/button/testing';
13
- import { MatSelectHarness } from '@angular/material/select/testing';
14
- import { HarnessLoader } from '@angular/cdk/testing';
15
- import { OptionHarnessFilters } from '@angular/material/core/testing';
16
- import { TableBuilderConfigToken } from '../../classes/TableBuilderConfig';
17
- import { provideMockStore } from '@ngrx/store/testing';
18
- import { isObservable } from 'rxjs';
19
-
20
- function fillInput<T>(fixture: ComponentFixture<T>, name: string, value: string) {
21
- const input = fixture.debugElement.query(By.css('input[name=' + name + ']')).nativeElement as HTMLInputElement;
22
- input.value = value;
23
- input.dispatchEvent(new Event('input'));
24
- fixture.detectChanges();
25
- }
26
-
27
- async function setSelect(loader: HarnessLoader, filter: Pick<OptionHarnessFilters, 'isSelected' | 'selector' | 'text'>) {
28
- const select = await loader.getHarness<MatSelectHarness>(MatSelectHarness);
29
- await select.open();
30
- await select.clickOptions(filter);
31
- }
32
-
33
- describe('filter component', () => {
34
-
35
- beforeEach(() => {
36
-
37
- TestBed.configureTestingModule({
38
- declarations: [FilterComponent, DatePipe, SpaceCasePipe, DateFilterComponent],
39
- providers: [
40
- DatePipe,
41
- { provide: TableBuilderConfigToken, useValue: { defaultTableState: { } } },
42
- provideMockStore({ initialState: {} }),
43
- ],
44
- imports: [
45
- NoopAnimationsModule,
46
- CommonModule,
47
- FormsModule,
48
- ]
49
- })
50
- .compileComponents();
51
- });
52
-
53
- it('filter info object should be populated', async () => {
54
- const fixture = TestBed.createComponent(FilterComponent);
55
- const component = fixture.componentInstance;
56
-
57
- const originFunc = component.state.addFilter;
58
-
59
- const spy = spyOn(component.state, 'addFilter');
60
-
61
-
62
- spy.and.callFake( a => {
63
- if(isObservable(a)) {
64
- throw new Error('Observable not supported');
65
- } else {
66
- expect(a.filterType).toBe(FilterType.StringContains);
67
- expect(a.filterValue).toBe('a');
68
- }
69
- return originFunc(a);
70
- });
71
-
72
- component.filter = {
73
- key: 'name',
74
- fieldType: FieldType.String
75
- };
76
-
77
- const loader = TestbedHarnessEnvironment.loader(fixture);
78
- const button = await loader.getHarness<MatButtonHarness>(MatButtonHarness.with( { text: 'Apply' }));
79
-
80
- await setSelect(loader, { text: 'Contains' });
81
- fillInput(fixture, 'filterValue', 'a');
82
- await button.click();
83
-
84
- expect(spy).toHaveBeenCalled();
85
- });
86
- });
@@ -1,73 +0,0 @@
1
- import { Component, ChangeDetectionStrategy, inject, input, computed, output, signal } from '@angular/core';
2
- import { filterTypeMap, FilterInfo, PartialFilter } from '../../classes/filter-info';
3
- import { TableStore } from '../../classes/table-store';
4
- import { FilterType } from '../../enums/filterTypes';
5
- import { AllValueOptions, FieldType } from '../../interfaces/meta-data';
6
- import { MatCardModule } from '@angular/material/card';
7
- import { NgTemplateOutlet } from '@angular/common';
8
- import { FormsModule } from '@angular/forms';
9
- import { SpaceCasePipe } from '../../../utilities';
10
- import { MatButtonModule } from '@angular/material/button';
11
- import { MatTooltipModule } from '@angular/material/tooltip';
12
- import { MatIconModule } from '@angular/material/icon';
13
- import { MatInputModule } from '@angular/material/input';
14
- import { MatSelectModule } from '@angular/material/select';
15
- import { NumberFilterComponent } from '../number-filter/number-filter.component';
16
- import { DateFilterComponent } from '../date-filter/date-filter.component';
17
- import { DateTimeFilterComponent } from '../date-time-filter/date-time-filter.component';
18
- import { MatRadioModule } from '@angular/material/radio';
19
- import { InFilterComponent } from '../in-filter/in-filter.component';
20
- import { InListFilterComponent } from './in-list/in-list-filter.component';
21
- import { merge, Subject } from 'rxjs';
22
- import { outputFromObservable } from '@angular/core/rxjs-interop';
23
-
24
- @Component({
25
- selector: 'tb-filter',
26
- templateUrl: './filter.component.html',
27
- styleUrl: './filter.component.scss',
28
- changeDetection: ChangeDetectionStrategy.OnPush,
29
- imports: [
30
- MatCardModule, FormsModule, SpaceCasePipe, MatButtonModule, MatTooltipModule, MatIconModule,
31
- MatInputModule, MatSelectModule, NumberFilterComponent,
32
- DateFilterComponent, DateTimeFilterComponent, MatRadioModule, InFilterComponent, InListFilterComponent,
33
- NgTemplateOutlet
34
- ]
35
- })
36
- export class FilterComponent {
37
- protected state = inject(TableStore);
38
-
39
- filterTypes = filterTypeMap;
40
- FilterType = FilterType;
41
- FieldType = FieldType;
42
-
43
- $filter = input.required<PartialFilter, PartialFilter>({
44
- alias: 'filter',
45
- transform: (f) => ({ ...f })
46
- });
47
- $metaData = computed(() => this.state.$getMetaData(this.$filter()?.key)());
48
- $allValuesInMeta = computed(() => {
49
- const filterable = this.$metaData()?.additional?.filterOptions?.filterableValues;
50
- return filterable === 'all values' || (filterable as AllValueOptions)?.allValues === true;
51
- });
52
- close$ = new Subject<void>();
53
- done$ = new Subject<void>();
54
- close = outputFromObservable(this.close$);
55
- done = outputFromObservable(merge(this.done$, this.close$));
56
-
57
- $enteredFilterType = signal<FilterType | undefined>(undefined);
58
- $currentFilterType = computed(() => this.$enteredFilterType() || this.$filter()?.filterType);
59
- $availableFilterTypes = computed(() => this.filterTypes[this.$filter()?.fieldType]);
60
-
61
- onEnter(filter: FilterInfo, event: any) {
62
- event.preventDefault();
63
- if(filter.filterValue != null && filter.filterType) {
64
- this.addFilter(filter);
65
- this.close$.next();
66
- }
67
- }
68
-
69
- addFilter(filter: FilterInfo){
70
- this.state.addFilter({ ...filter });
71
- this.done$.next();
72
- }
73
- }
@@ -1,171 +0,0 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, inject, input, signal } from '@angular/core';
2
- import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { TableStore } from '../../../classes/table-store';
4
- import { AllValueOptions, FieldType } from '../../../interfaces/meta-data';
5
- import { CurrencyPipe, DatePipe, KeyValue } from '@angular/common';
6
- import { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox';
7
- import { FunctionPipe, SpaceCasePipe, StopPropagationDirective } from '../../../../utilities';
8
- import { isBlankValueFilter, isNotBlankValueFilter } from '../../../services/all-values-filter-creator.service';
9
-
10
- @Component({
11
- selector: 'tb-in-list-filter',
12
- template: `
13
- @if($specialBlank(); as specialBlank)
14
- {
15
- <div>
16
- <mat-checkbox [checked]="$specialBlankSelected()" stop-propagation (change)='selectFilterChanged($event, specialBlank)' >
17
- {{specialBlank.value}}
18
- </mat-checkbox>
19
- </div>
20
- }
21
- @switch ($metaData().fieldType)
22
- {
23
- @case (FieldType.Enum)
24
- {
25
- @for (item of $keyValues(); track item.key)
26
- {
27
- <div>
28
- <mat-checkbox [checked]="includes | func : item : $selectedKeys()" stop-propagation (change)='selectFilterChanged($event, item)' >
29
- {{(item.key | spaceCase)}}
30
- </mat-checkbox>
31
- </div>
32
- }
33
- }
34
- @case (FieldType.Date)
35
- {
36
- @for (item of $keyValues(); track item.key)
37
- {
38
- <div>
39
- <mat-checkbox [checked]="includes | func : item : $selectedKeys()" stop-propagation (change)='selectFilterChanged($event, item)' >
40
- {{item.value | date: 'shortDate'}}
41
- </mat-checkbox>
42
- </div>
43
- }
44
- }
45
- @case (FieldType.DateTime)
46
- {
47
- @for (item of $keyValues(); track item.key)
48
- {
49
- <div>
50
- <mat-checkbox [checked]="includes | func : item : $selectedKeys()" stop-propagation (change)='selectFilterChanged($event, item)' >
51
- {{item.value | date: 'short'}}
52
- </mat-checkbox>
53
- </div>
54
- }
55
- }
56
- @case (FieldType.Currency)
57
- {
58
- @for (item of $keyValues(); track item.key)
59
- {
60
- <div>
61
- <mat-checkbox [checked]="includes | func : item : $selectedKeys()" stop-propagation (change)='selectFilterChanged($event, item)' >
62
- {{item.value | currency }}
63
- </mat-checkbox>
64
- </div>
65
- }
66
- }
67
- @default
68
- {
69
- @for (item of $keyValues(); track item.key)
70
- {
71
- <div>
72
- <mat-checkbox [checked]="includes | func : item : $selectedKeys()" stop-propagation (change)='selectFilterChanged($event, item)' >
73
- {{item.key}}
74
- </mat-checkbox>
75
- </div>
76
- }
77
- }
78
- }
79
- `,
80
- changeDetection: ChangeDetectionStrategy.OnPush,
81
- styles: [`
82
- :host {
83
- display: block;
84
- max-height: max(50vh, 400px);
85
- overflow-y: auto;
86
- }
87
- `],
88
- providers: [{
89
- provide: NG_VALUE_ACCESSOR,
90
- useExisting: InListFilterComponent,
91
- multi: true
92
- }],
93
- imports: [
94
- MatCheckboxModule, StopPropagationDirective, SpaceCasePipe, FunctionPipe, DatePipe, CurrencyPipe
95
- ]
96
- })
97
- export class InListFilterComponent implements ControlValueAccessor {
98
- private ref = inject(ChangeDetectorRef);
99
- private tableState = inject(TableStore);
100
-
101
- $values = input<string[]>([], { alias: 'values' });
102
- #e = effect(() => this.writeValue(this.$values()));
103
- value: (string)[] = [];
104
- FieldType = FieldType;
105
-
106
- writeValue(obj: string[]): void {
107
- this.value = obj;
108
- if(this.value) {
109
- const selectedKeys = this.$keyValues().filter(item => this.value.includes(this.getValue(this.$metaData().fieldType, item)));
110
- this.$selectedKeys.set(selectedKeys);
111
- }
112
- this.ref.markForCheck();
113
- }
114
-
115
- includes = (value: KeyValue<string, any>, values: KeyValue<string, any>[]) => {
116
- return values.map(item => this.getValue(this.$metaData().fieldType, item)).includes(this.getValue(this.$metaData().fieldType, value));
117
- }
118
-
119
- onChange = (_: any) => { };
120
-
121
- registerOnChange(fn: any): void {
122
- this.onChange = fn;
123
- }
124
- onTouched = () => { };
125
- registerOnTouched(fn: any): void {
126
- this.onTouched = fn;
127
- }
128
-
129
- $key = input.required<string>({ alias: 'key' });
130
- $selectedKeys = signal<KeyValue<string, any>[]>([]);
131
- $metaData = computed(() => this.tableState.$getMetaData(this.$key())());
132
- $allValues = computed(() => {
133
- const filterable = this.$metaData()?.additional?.filterOptions?.filterableValues;
134
- return filterable === 'all values' || (filterable as AllValueOptions)?.allValues === true;
135
- });
136
- $specialBlank = computed(() => {
137
- const specialBlank = this.tableState.selectSignal(s => s.allFilters)()[this.$metaData().key]?.find(k => isBlankValueFilter(k));
138
- if(!specialBlank) return;
139
- return { key: specialBlank, value: 'BLANK' } as KeyValue<string, any>;
140
- });
141
- $specialBlankSelected = computed(() => this.$selectedKeys().some(k => isBlankValueFilter(k.value)));
142
- $keyValues = computed(():
143
- KeyValue<string, any>[] => {
144
- const metaData = this.$metaData();
145
- if(this.$allValues()) {
146
- return this.tableState.selectSignal(s => s.allFilters)()[metaData.key].filter(isNotBlankValueFilter).map(f => ({ key: f, value: f }));
147
- } else if(metaData?.additional?.filterOptions?.filterableValues ) {
148
- return (metaData.additional.filterOptions.filterableValues as []).map(value => ({ key: value, value }));
149
- } else if(metaData?.fieldType === FieldType.Enum ) {
150
- return Object.entries(metaData.additional!.enumMap!).map(([key, value]) => ({ key: value, value: +key }));
151
- }
152
- return [];
153
- });
154
-
155
- selectFilterChanged($event: MatCheckboxChange, val: KeyValue<string, any>) {
156
- if($event.checked) {
157
- this.$selectedKeys.update(keys => [...keys, val]);
158
- } else {
159
- this.$selectedKeys.update(keys => keys.filter( item => item !== val));
160
- }
161
- this.value = this.$selectedKeys().map(item => this.getValue(this.$metaData().fieldType, item));
162
- this.onChange(this.value);
163
- }
164
-
165
- getValue(metaDateType: FieldType, val: KeyValue<string, any>) {
166
- if(metaDateType === FieldType.Enum) {
167
- return val.value;
168
- }
169
- return val.key;
170
- }
171
- }
@@ -1,60 +0,0 @@
1
- @if($columns(); as displayCols)
2
- {
3
- <span matTooltip="Show/hide columns">
4
- <button color="primary" mat-icon-button [matMenuTriggerFor]="menu">
5
- <mat-icon color="primary">visibility_off</mat-icon>
6
- </button>
7
- </span>
8
- <mat-menu #menu="matMenu" class="my-mat-menu">
9
-
10
- <button mat-menu-item>
11
- <span matTooltip="Close">
12
- <button class="filter-button" mat-icon-button>
13
- <mat-icon>close</mat-icon>
14
- </button>
15
- </span>
16
- </button>
17
-
18
- <button mat-menu-item stop-propagation>
19
- <span matTooltip="Show all columns">
20
- <button color="primary" mat-icon-button (click)="reset(displayCols)">
21
- <mat-icon color="primary">done_all</mat-icon>
22
- </button>
23
- </span>
24
-
25
- <span matTooltip="Hide all columns">
26
- <button color="primary" mat-icon-button (click)="unset(displayCols)">
27
- <mat-icon color="primary">cancel</mat-icon>
28
- </button>
29
- </span>
30
- </button>
31
-
32
- <div cdkDropList stop-propagation [cdkDropListLockAxis]="'y'" (cdkDropListDropped)="drop($event)">
33
- @for (col of displayCols; track col.key)
34
- {
35
- <button stop-propagation mat-menu-item cdkDrag [class.isHidden]="!col.isVisible" [cdkDragData]="col">
36
- <div style="display: flex; align-items: center;" (click)="col.isVisible = !col.isVisible; emit(displayCols)">
37
- @if(col.isVisible)
38
- {
39
- <button color="primary" mat-icon-button matTooltip="Hide Column" class="show-hide">
40
- <mat-icon color="primary">check_box</mat-icon>
41
- </button>
42
- }
43
- @else
44
- {
45
- <button mat-icon-button matTooltip="Show Column" class="show-hide">
46
- <mat-icon>indeterminate_check_box</mat-icon>
47
- </button>
48
- }
49
-
50
- <p class="label">
51
- {{col.displayName || (col.key | spaceCase) }}
52
- </p>
53
-
54
- </div>
55
- </button>
56
- }
57
-
58
- </div>
59
- </mat-menu>
60
- }