@one-paragon/angular-utilities 2.2.4 → 2.2.6
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.
- package/karma.conf.js +44 -0
- package/ng-package.json +7 -0
- package/package.json +15 -27
- package/src/action-state/action-state-spinner/action-state-spinner.component.css +16 -0
- package/src/action-state/action-state-spinner/action-state-spinner.component.html +7 -0
- package/src/action-state/action-state-spinner/action-state-spinner.component.spec.ts +25 -0
- package/src/action-state/action-state-spinner/action-state-spinner.component.ts +25 -0
- package/src/action-state/action-state-ui/action-state-ui.module.ts +13 -0
- package/{action-state/index.d.ts → src/action-state/index.ts} +8 -4
- package/src/action-state/ngrx-ext/ngrx-ext.module.ts +14 -0
- package/src/action-state/ngrx.ts +69 -0
- package/src/http-request-state/RequestStateFactory.ts +56 -0
- package/src/http-request-state/RequestStateStore.ts +284 -0
- package/{http-request-state/deprecated.d.ts → src/http-request-state/deprecated.ts} +20 -20
- package/src/http-request-state/directives/HttpStateDirectiveBase.ts +29 -0
- package/src/http-request-state/directives/http-error-state-directive.ts +21 -0
- package/src/http-request-state/directives/http-inProgress-state-directive.ts +19 -0
- package/src/http-request-state/directives/http-notStarted-state-directive.ts +19 -0
- package/src/http-request-state/directives/http-success-state-directive.ts +29 -0
- package/{http-request-state/directives/index.d.ts → src/http-request-state/directives/index.ts} +5 -5
- package/src/http-request-state/directives/request-state-directive.spec.ts +73 -0
- package/src/http-request-state/directives/request-state-directive.ts +78 -0
- package/src/http-request-state/helpers.ts +30 -0
- package/src/http-request-state/http-state-module.ts +23 -0
- package/{http-request-state/index.d.ts → src/http-request-state/index.ts} +7 -7
- package/src/http-request-state/models/view-context.ts +18 -0
- package/src/http-request-state/observable.spec.ts +43 -0
- package/src/http-request-state/request-state.ts +66 -0
- package/src/http-request-state/rxjs/getRequestorBody.ts +10 -0
- package/src/http-request-state/rxjs/getRequestorState.ts +8 -0
- package/{http-request-state/rxjs/index.d.ts → src/http-request-state/rxjs/index.ts} +4 -4
- package/src/http-request-state/rxjs/tapError.ts +16 -0
- package/src/http-request-state/rxjs/tapSuccess.ts +16 -0
- package/src/http-request-state/strategies.spec.ts +42 -0
- package/src/http-request-state/types.ts +54 -0
- package/src/ngrx/actionable-selector.ts +160 -0
- package/src/ngrx/index.ts +1 -0
- package/{public-api.d.ts → src/public-api.ts} +35 -16
- package/src/rxjs/defaultShareReplay.ts +8 -0
- package/{rxjs/index.d.ts → src/rxjs/index.ts} +5 -5
- package/src/rxjs/mapError.ts +8 -0
- package/src/rxjs/rxjs-operators.ts +130 -0
- package/src/rxjs/subjectifier.ts +17 -0
- package/src/rxjs/subscriber.directive.ts +57 -0
- package/src/specs/clickSubject.spec.ts +95 -0
- package/src/specs/dialog.spec.ts +101 -0
- package/src/specs/toggleGroupDirective.spec.ts +229 -0
- package/src/table-builder/classes/DefaultSettings.ts +11 -0
- package/src/table-builder/classes/MatTableObservableDataSource.ts +23 -0
- package/src/table-builder/classes/TableBuilderConfig.ts +50 -0
- package/src/table-builder/classes/TableBuilderDataSource.ts +64 -0
- package/src/table-builder/classes/TableState.ts +125 -0
- package/src/table-builder/classes/data-store.ts +10 -0
- package/{table-builder/classes/display-col.d.ts → src/table-builder/classes/display-col.ts} +5 -5
- package/src/table-builder/classes/filter-info.ts +125 -0
- package/src/table-builder/classes/table-builder-general-settings.ts +205 -0
- package/src/table-builder/classes/table-builder.ts +105 -0
- package/src/table-builder/classes/table-store.helpers.ts +104 -0
- package/src/table-builder/classes/table-store.ts +440 -0
- package/src/table-builder/components/array-column.component.ts +34 -0
- package/src/table-builder/components/column-builder/column-builder.component.html +87 -0
- package/src/table-builder/components/column-builder/column-builder.component.scss +43 -0
- package/src/table-builder/components/column-builder/column-builder.component.spec.ts +49 -0
- package/src/table-builder/components/column-builder/column-builder.component.ts +129 -0
- package/src/table-builder/components/column-builder/column-helpers.ts +54 -0
- package/src/table-builder/components/column-header-menu/column-header-menu.component.html +110 -0
- package/src/table-builder/components/column-header-menu/column-header-menu.component.scss +97 -0
- package/src/table-builder/components/column-header-menu/column-header-menu.component.ts +94 -0
- package/src/table-builder/components/date-filter/date-filter.component.html +25 -0
- package/src/table-builder/components/date-filter/date-filter.component.ts +22 -0
- package/src/table-builder/components/date-time-filter/date-time-filter.component.html +11 -0
- package/src/table-builder/components/date-time-filter/date-time-filter.component.ts +20 -0
- package/src/table-builder/components/filter/filter.component.html +109 -0
- package/src/table-builder/components/filter/filter.component.scss +60 -0
- package/src/table-builder/components/filter/filter.component.spec.ts +86 -0
- package/src/table-builder/components/filter/filter.component.ts +64 -0
- package/src/table-builder/components/filter/in-list/in-list-filter.component.ts +102 -0
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.html +60 -0
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.scss +57 -0
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.ts +44 -0
- package/src/table-builder/components/generic-table/generic-table.component.html +97 -0
- package/src/table-builder/components/generic-table/generic-table.component.scss +38 -0
- package/src/table-builder/components/generic-table/generic-table.component.ts +403 -0
- package/src/table-builder/components/generic-table/paginator.component.ts +112 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.css +17 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.html +14 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.spec.ts +23 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.ts +25 -0
- package/src/table-builder/components/in-filter/in-filter.component.css +3 -0
- package/src/table-builder/components/in-filter/in-filter.component.html +23 -0
- package/src/table-builder/components/in-filter/in-filter.component.ts +65 -0
- package/{table-builder/components/index.d.ts → src/table-builder/components/index.ts} +9 -9
- package/src/table-builder/components/initialization-component/initialization.component.html +78 -0
- package/src/table-builder/components/initialization-component/initialization.component.ts +27 -0
- package/src/table-builder/components/link-column.component.ts +42 -0
- package/src/table-builder/components/number-filter/number-filter.component.css +10 -0
- package/src/table-builder/components/number-filter/number-filter.component.html +25 -0
- package/src/table-builder/components/number-filter/number-filter.component.spec.ts +30 -0
- package/src/table-builder/components/number-filter/number-filter.component.ts +25 -0
- package/src/table-builder/components/profiles-menu/profiles-menu.component.html +77 -0
- package/src/table-builder/components/profiles-menu/profiles-menu.component.scss +126 -0
- package/src/table-builder/components/profiles-menu/profiles-menu.component.spec.ts +23 -0
- package/src/table-builder/components/profiles-menu/profiles-menu.component.ts +63 -0
- package/src/table-builder/components/reset-menu/reset-menu.component.css +3 -0
- package/src/table-builder/components/reset-menu/reset-menu.component.html +10 -0
- package/src/table-builder/components/reset-menu/reset-menu.component.ts +87 -0
- package/src/table-builder/components/scroll-strategy.ts +139 -0
- package/src/table-builder/components/sort-menu/sort-menu.component-store.ts +57 -0
- package/src/table-builder/components/sort-menu/sort-menu.component.html +115 -0
- package/src/table-builder/components/sort-menu/sort-menu.component.scss +119 -0
- package/src/table-builder/components/sort-menu/sort-menu.component.ts +88 -0
- package/src/table-builder/components/table-container/table-container.component.html +81 -0
- package/src/table-builder/components/table-container/table-container.component.ts +403 -0
- package/src/table-builder/components/table-container/table-container.helpers/data-state.helpers.ts +113 -0
- package/src/table-builder/components/table-container/table-container.helpers/filter-state.helpers.ts +125 -0
- package/src/table-builder/components/table-container/table-container.helpers/groupBy.helpers.ts +122 -0
- package/src/table-builder/components/table-container/table-container.helpers/meta-data.helpers.ts +16 -0
- package/src/table-builder/components/table-container/table-container.helpers/sort-state.helpers.ts +47 -0
- package/src/table-builder/components/table-container/table-container.scss +47 -0
- package/src/table-builder/components/table-container/tableProps.ts +18 -0
- package/src/table-builder/components/table-container/virtual-scroll-container.ts +216 -0
- package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.html +35 -0
- package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.ts +44 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.css +40 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.html +11 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.spec.ts +85 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.ts +36 -0
- package/src/table-builder/components/table-container-filter/table-wrapper-filter-store.ts +23 -0
- package/src/table-builder/components/table-header-menu/table-header-menu.component.css +21 -0
- package/src/table-builder/components/table-header-menu/table-header-menu.component.html +50 -0
- package/src/table-builder/components/table-header-menu/table-header-menu.component.ts +35 -0
- package/src/table-builder/directives/custom-cell-directive.ts +57 -0
- package/{table-builder/directives/index.d.ts → src/table-builder/directives/index.ts} +6 -5
- package/src/table-builder/directives/multi-sort.directive.spec.ts +124 -0
- package/src/table-builder/directives/multi-sort.directive.ts +50 -0
- package/src/table-builder/directives/resize-column.directive.ts +107 -0
- package/src/table-builder/directives/table-wrapper.directive.ts +13 -0
- package/src/table-builder/directives/tb-filter.directive.ts +376 -0
- package/src/table-builder/enums/filterTypes.ts +40 -0
- package/src/table-builder/functions/boolean-filter-function.ts +12 -0
- package/src/table-builder/functions/date-filter-function.ts +78 -0
- package/src/table-builder/functions/download-data.ts +11 -0
- package/src/table-builder/functions/null-filter-function.ts +9 -0
- package/src/table-builder/functions/number-filter-function.ts +41 -0
- package/src/table-builder/functions/sort-data-function.ts +80 -0
- package/src/table-builder/functions/string-filter-function.ts +53 -0
- package/{table-builder/interfaces/ColumnInfo.d.ts → src/table-builder/interfaces/ColumnInfo.ts} +7 -6
- package/{table-builder/interfaces/dictionary.d.ts → src/table-builder/interfaces/dictionary.ts} +3 -3
- package/src/table-builder/interfaces/report-def.ts +254 -0
- package/src/table-builder/ngrx/tableBuilderStateStore.ts +197 -0
- package/src/table-builder/pipes/column-total.pipe.ts +16 -0
- package/src/table-builder/pipes/format-filter-type.pipe.ts +12 -0
- package/src/table-builder/pipes/format-filter-value.pipe.ts +67 -0
- package/src/table-builder/pipes/key-display.ts +13 -0
- package/src/table-builder/services/export-to-csv.service.ts +113 -0
- package/src/table-builder/services/link-creator.service.ts +98 -0
- package/src/table-builder/services/table-template-service.ts +47 -0
- package/src/table-builder/services/transform-creator.ts +96 -0
- package/src/table-builder/specs/table-custom-filters.spec.ts +262 -0
- package/src/table-builder/styles/collapser.styles.scss +16 -0
- package/src/table-builder/table-builder.module.ts +38 -0
- package/src/test.ts +17 -0
- package/src/utilities/array-helpers.ts +13 -0
- package/src/utilities/directives/auto-focus.directive.ts +20 -0
- package/src/utilities/directives/clickEmitterDirective.ts +15 -0
- package/src/utilities/directives/clickSubject.ts +19 -0
- package/src/utilities/directives/conditional-classes.directive.ts +36 -0
- package/src/utilities/directives/dialog-service.ts +19 -0
- package/src/utilities/directives/dialog.ts +144 -0
- package/src/utilities/directives/mat-toggle-group-directive.ts +60 -0
- package/src/utilities/directives/prevent-enter.directive.ts +12 -0
- package/src/utilities/directives/stop-propagation.directive.ts +19 -0
- package/src/utilities/directives/styler.ts +44 -0
- package/src/utilities/directives/trim-whitespace.directive.ts +20 -0
- package/{utilities/index.d.ts → src/utilities/index.ts} +22 -15
- package/src/utilities/module.ts +53 -0
- package/src/utilities/pipes/function.pipe.ts +21 -0
- package/src/utilities/pipes/phone.pipe.ts +20 -0
- package/src/utilities/pipes/space-case.pipes.spec.ts +47 -0
- package/src/utilities/pipes/space-case.pipes.ts +26 -0
- package/tsconfig.lib.json +20 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +17 -0
- package/action-state/action-state-spinner/action-state-spinner.component.d.ts +0 -12
- package/action-state/action-state-ui/action-state-ui.module.d.ts +0 -7
- package/action-state/ngrx-ext/ngrx-ext.module.d.ts +0 -8
- package/action-state/ngrx.d.ts +0 -31
- package/fesm2022/one-paragon-angular-utilities.mjs +0 -6531
- package/fesm2022/one-paragon-angular-utilities.mjs.map +0 -1
- package/http-request-state/RequestStateFactory.d.ts +0 -17
- package/http-request-state/RequestStateStore.d.ts +0 -101
- package/http-request-state/directives/HttpStateDirectiveBase.d.ts +0 -14
- package/http-request-state/directives/http-error-state-directive.d.ts +0 -10
- package/http-request-state/directives/http-inProgress-state-directive.d.ts +0 -10
- package/http-request-state/directives/http-notStarted-state-directive.d.ts +0 -10
- package/http-request-state/directives/http-success-state-directive.d.ts +0 -17
- package/http-request-state/directives/request-state-directive.d.ts +0 -34
- package/http-request-state/helpers.d.ts +0 -9
- package/http-request-state/http-state-module.d.ts +0 -11
- package/http-request-state/request-state.d.ts +0 -12
- package/http-request-state/rxjs/getRequestorBody.d.ts +0 -3
- package/http-request-state/rxjs/getRequestorState.d.ts +0 -3
- package/http-request-state/rxjs/tapError.d.ts +0 -3
- package/http-request-state/rxjs/tapSuccess.d.ts +0 -3
- package/http-request-state/types.d.ts +0 -41
- package/index.d.ts +0 -5
- package/ngrx/actionable-selector.d.ts +0 -32
- package/ngrx/index.d.ts +0 -1
- package/rxjs/defaultShareReplay.d.ts +0 -2
- package/rxjs/mapError.d.ts +0 -2
- package/rxjs/rxjs-operators.d.ts +0 -13
- package/rxjs/subjectifier.d.ts +0 -10
- package/rxjs/subscriber.directive.d.ts +0 -14
- package/table-builder/classes/DefaultSettings.d.ts +0 -9
- package/table-builder/classes/MatTableObservableDataSource.d.ts +0 -9
- package/table-builder/classes/TableBuilderConfig.d.ts +0 -23
- package/table-builder/classes/TableBuilderDataSource.d.ts +0 -18
- package/table-builder/classes/TableState.d.ts +0 -81
- package/table-builder/classes/data-store.d.ts +0 -8
- package/table-builder/classes/filter-info.d.ts +0 -39
- package/table-builder/classes/table-builder-general-settings.d.ts +0 -119
- package/table-builder/classes/table-builder.d.ts +0 -22
- package/table-builder/classes/table-store.d.ts +0 -146
- package/table-builder/classes/table-store.helpers.d.ts +0 -31
- package/table-builder/components/array-column.component.d.ts +0 -15
- package/table-builder/components/column-builder/column-builder.component.d.ts +0 -41
- package/table-builder/components/column-builder/column-helpers.d.ts +0 -38
- package/table-builder/components/column-header-menu/column-header-menu.component.d.ts +0 -50
- package/table-builder/components/date-filter/date-filter.component.d.ts +0 -37
- package/table-builder/components/date-time-filter/date-time-filter.component.d.ts +0 -37
- package/table-builder/components/filter/filter.component.d.ts +0 -48
- package/table-builder/components/filter/in-list/in-list-filter.component.d.ts +0 -22
- package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +0 -17
- package/table-builder/components/generic-table/generic-table.component.d.ts +0 -85
- package/table-builder/components/generic-table/paginator.component.d.ts +0 -26
- package/table-builder/components/group-by-list/group-by-list.component.d.ts +0 -11
- package/table-builder/components/in-filter/in-filter.component.d.ts +0 -20
- package/table-builder/components/initialization-component/initialization.component.d.ts +0 -15
- package/table-builder/components/link-column.component.d.ts +0 -23
- package/table-builder/components/number-filter/number-filter.component.d.ts +0 -39
- package/table-builder/components/profiles-menu/profiles-menu.component.d.ts +0 -33
- package/table-builder/components/reset-menu/reset-menu.component.d.ts +0 -25
- package/table-builder/components/scroll-strategy.d.ts +0 -45
- package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +0 -24
- package/table-builder/components/sort-menu/sort-menu.component.d.ts +0 -19
- package/table-builder/components/table-container/table-container.component.d.ts +0 -104
- package/table-builder/components/table-container/table-container.helpers/data-state.helpers.d.ts +0 -7
- package/table-builder/components/table-container/table-container.helpers/filter-state.helpers.d.ts +0 -19
- package/table-builder/components/table-container/table-container.helpers/groupBy.helpers.d.ts +0 -19
- package/table-builder/components/table-container/table-container.helpers/meta-data.helpers.d.ts +0 -2
- package/table-builder/components/table-container/table-container.helpers/sort-state.helpers.d.ts +0 -12
- package/table-builder/components/table-container/tableProps.d.ts +0 -10
- package/table-builder/components/table-container/virtual-scroll-container.d.ts +0 -40
- package/table-builder/components/table-container-filter/filter-list/filter-list.component.d.ts +0 -15
- package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +0 -12
- package/table-builder/components/table-container-filter/table-wrapper-filter-store.d.ts +0 -14
- package/table-builder/components/table-header-menu/table-header-menu.component.d.ts +0 -15
- package/table-builder/directives/custom-cell-directive.d.ts +0 -34
- package/table-builder/directives/multi-sort.directive.d.ts +0 -10
- package/table-builder/directives/resize-column.directive.d.ts +0 -43
- package/table-builder/directives/table-wrapper.directive.d.ts +0 -8
- package/table-builder/directives/tb-filter.directive.d.ts +0 -116
- package/table-builder/enums/filterTypes.d.ts +0 -36
- package/table-builder/functions/boolean-filter-function.d.ts +0 -3
- package/table-builder/functions/date-filter-function.d.ts +0 -4
- package/table-builder/functions/download-data.d.ts +0 -1
- package/table-builder/functions/null-filter-function.d.ts +0 -2
- package/table-builder/functions/number-filter-function.d.ts +0 -4
- package/table-builder/functions/sort-data-function.d.ts +0 -6
- package/table-builder/functions/string-filter-function.d.ts +0 -5
- package/table-builder/interfaces/report-def.d.ts +0 -223
- package/table-builder/ngrx/tableBuilderStateStore.d.ts +0 -69
- package/table-builder/pipes/column-total.pipe.d.ts +0 -8
- package/table-builder/pipes/format-filter-type.pipe.d.ts +0 -8
- package/table-builder/pipes/format-filter-value.pipe.d.ts +0 -11
- package/table-builder/pipes/key-display.d.ts +0 -9
- package/table-builder/services/export-to-csv.service.d.ts +0 -14
- package/table-builder/services/link-creator.service.d.ts +0 -16
- package/table-builder/services/table-template-service.d.ts +0 -14
- package/table-builder/services/transform-creator.d.ts +0 -9
- package/table-builder/table-builder.module.d.ts +0 -14
- package/utilities/array-helpers.d.ts +0 -1
- package/utilities/directives/auto-focus.directive.d.ts +0 -9
- package/utilities/directives/clickEmitterDirective.d.ts +0 -7
- package/utilities/directives/clickSubject.d.ts +0 -9
- package/utilities/directives/conditional-classes.directive.d.ts +0 -12
- package/utilities/directives/dialog-service.d.ts +0 -10
- package/utilities/directives/dialog.d.ts +0 -45
- package/utilities/directives/mat-toggle-group-directive.d.ts +0 -21
- package/utilities/directives/prevent-enter.directive.d.ts +0 -6
- package/utilities/directives/stop-propagation.directive.d.ts +0 -7
- package/utilities/directives/styler.d.ts +0 -16
- package/utilities/directives/trim-whitespace.directive.d.ts +0 -7
- package/utilities/module.d.ts +0 -19
- package/utilities/pipes/function.pipe.d.ts +0 -11
- package/utilities/pipes/phone.pipe.d.ts +0 -8
- package/utilities/pipes/space-case.pipes.d.ts +0 -17
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { EnvironmentInjector, inject, Injector, makeEnvironmentProviders, provideAppInitializer, runInInjectionContext } from "@angular/core";
|
|
2
|
+
import { Action, createSelector, MemoizedSelector, Store } from "@ngrx/store";
|
|
3
|
+
|
|
4
|
+
let _store: Store<any>;
|
|
5
|
+
let _cache: AppStoreCache;
|
|
6
|
+
let _ei : EnvironmentInjector;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Creates a selector that can dispatch an action if conditions are met.
|
|
10
|
+
* Note: The props of the selector factory must include the props of the action.
|
|
11
|
+
* @param selectorFactory A method that returns selector.
|
|
12
|
+
* @param action The action that will be dispatched when conditions are met.
|
|
13
|
+
* @param [dispatchIf = defaultFilter] Optional. A method that takes the result of the selector and returns a boolean. The actions gets dispatched
|
|
14
|
+
* if true is returned. If no method is passed in than the action will be dispatched if the selector returns undefined or null.
|
|
15
|
+
*/
|
|
16
|
+
export const createActionableSelector = <State, Result, Props extends any[]>(
|
|
17
|
+
selectorFactory: ((...props: Props) => MemoizedSelector<State, Result>),
|
|
18
|
+
action: ActionReturner<Props>,
|
|
19
|
+
dispatchIf: (data: Result) => boolean = defaultFilter,
|
|
20
|
+
) => {
|
|
21
|
+
const options = {
|
|
22
|
+
selectorFactory,
|
|
23
|
+
action: (...props: Props) => () => _store.dispatch(action(...props)),
|
|
24
|
+
dispatchIf
|
|
25
|
+
}
|
|
26
|
+
const actionable = createActionResultSelector(options);
|
|
27
|
+
return (...props: Props) => createSelector(actionable(...props), b => b.result);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const createActionSelector = <State, Result, Props extends any[] = any[]>(options: CreateActionResultsOptions<State, Result, Props>) => {
|
|
31
|
+
const actionable = createActionResultSelector(options);
|
|
32
|
+
return ((...props: Props) => createSelector(actionable(...props), b => b.result));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const createActionableResultSelector = <State, Result, Props extends any[]>(
|
|
36
|
+
selectorFactory: ((...props: Props) => MemoizedSelector<State, Result>),
|
|
37
|
+
action: ActionReturner<Props>,
|
|
38
|
+
dispatchIf: (data: Result) => boolean = defaultFilter,
|
|
39
|
+
) => {
|
|
40
|
+
const options: CreateActionResultsOptions<State, Result, Props> = {
|
|
41
|
+
selectorFactory,
|
|
42
|
+
action: (...props: Props) => () => _store.dispatch(action(...props)),
|
|
43
|
+
dispatchIf
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
return createActionResultSelector(options);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const createActionResultSelector = <State, Result, Props extends any[] = any[]>(options: CreateActionResultsOptions<State, Result, Props>) => {
|
|
50
|
+
const id = crypto.randomUUID();
|
|
51
|
+
const slctr = (...props: Props) => createSelector(
|
|
52
|
+
options.selectorFactory(...props),
|
|
53
|
+
(selected: Result) => {
|
|
54
|
+
const needsDispatch = (options.dispatchIf || defaultFilter)(selected);
|
|
55
|
+
if(needsDispatch && !_cache.isInCache(id, ...props)){
|
|
56
|
+
queueMicrotask(() =>
|
|
57
|
+
runInInjectionContext(options.injector || _ei, () => {
|
|
58
|
+
options.action(...props)()
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
return ({
|
|
62
|
+
loading: needsDispatch,
|
|
63
|
+
result: selected
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
) as ActionableMemoizedSelector<State, LoadingState<Result>>;
|
|
67
|
+
return slctr;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
class AppStoreCache {
|
|
71
|
+
cache: Cache = {};
|
|
72
|
+
isInCache = (actionableSelectorId: string, ...p: any[]): boolean => {
|
|
73
|
+
const props = p.reduce((a, b) => {
|
|
74
|
+
if(typeof b != 'object') b = { b };
|
|
75
|
+
return ({ ...a, ...b })
|
|
76
|
+
}, {});
|
|
77
|
+
|
|
78
|
+
let itemsInCache = this.cache[actionableSelectorId] = (this.cache[actionableSelectorId] || []);
|
|
79
|
+
|
|
80
|
+
if(itemsInCache.some(itemInCache => shallowEquals(itemInCache, props))){
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
itemsInCache.push(props);
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const clearActionableSelectorRequestCache = () => _cache.cache = {};
|
|
90
|
+
|
|
91
|
+
const shallowEquals = (cachedItem: object, newItem: object): boolean => {
|
|
92
|
+
const cachedItemKeys = Object.keys(cachedItem);
|
|
93
|
+
const secondKeys = Object.keys(newItem);
|
|
94
|
+
if(cachedItemKeys.length !== secondKeys.length) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
for(let index = 0; index < cachedItemKeys.length; index++) {
|
|
98
|
+
const currentKey = cachedItemKeys[index];
|
|
99
|
+
if(cachedItem[currentKey] !== newItem[currentKey]){
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function defaultFilter(data: any) {
|
|
107
|
+
return data == null || data == undefined;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const setStore = (store: Store) => {
|
|
111
|
+
if(store instanceof Store) _store ??= store;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const setEnvironmentInjector = (ei: EnvironmentInjector) => {
|
|
115
|
+
if(ei instanceof EnvironmentInjector) _ei ??= ei;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export function provideActionableSelector(){
|
|
119
|
+
return makeEnvironmentProviders([
|
|
120
|
+
provideAppInitializer(setUpStoreFactory)
|
|
121
|
+
])
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export const setUpStoreFactory = () => {
|
|
125
|
+
const store = inject(Store);
|
|
126
|
+
const env = inject(EnvironmentInjector);
|
|
127
|
+
_cache ??= new AppStoreCache();
|
|
128
|
+
setStore(store);
|
|
129
|
+
setEnvironmentInjector(env)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function setUpStoreFactoryOld(store: Store, env: EnvironmentInjector){
|
|
133
|
+
_cache ??= new AppStoreCache();
|
|
134
|
+
return () => new Promise((resolve, reject) => {
|
|
135
|
+
setStore(store);
|
|
136
|
+
setEnvironmentInjector(env)
|
|
137
|
+
resolve(null);
|
|
138
|
+
})
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
export interface CreateActionResultsOptions<State, Result, Props extends any[]>{
|
|
143
|
+
selectorFactory: (...props: Props) => MemoizedSelector<State, Result>,
|
|
144
|
+
action: (...props: Props) => () => void,
|
|
145
|
+
dispatchIf?: (data: Result) => boolean,
|
|
146
|
+
injector?: Injector
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
interface LoadingState<T> {
|
|
150
|
+
loading: boolean;
|
|
151
|
+
result?: T;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
type ActionableMemoizedSelector<State, Result> = MemoizedSelector<State, Result>;
|
|
155
|
+
|
|
156
|
+
export type ActionReturner<Props extends any[]> = (...props: Props) => Action;
|
|
157
|
+
|
|
158
|
+
type Cache = {
|
|
159
|
+
[key: string]: { [key: string]: any }[];
|
|
160
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './actionable-selector';
|
|
@@ -1,16 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './
|
|
7
|
-
export * from './
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export * from './table-builder/
|
|
11
|
-
|
|
12
|
-
export * from './table-builder/
|
|
13
|
-
|
|
14
|
-
export * from './
|
|
15
|
-
|
|
16
|
-
export * from './
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of http-request-state
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export * from './http-request-state/directives';
|
|
6
|
+
export * from './http-request-state/rxjs';
|
|
7
|
+
export * from './http-request-state';
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
export * from './table-builder/table-builder.module';
|
|
11
|
+
|
|
12
|
+
export * from './table-builder/classes/TableBuilderConfig';
|
|
13
|
+
|
|
14
|
+
export * from './table-builder/interfaces/report-def';
|
|
15
|
+
|
|
16
|
+
export * from './table-builder/classes/MatTableObservableDataSource';
|
|
17
|
+
|
|
18
|
+
export * from './table-builder/classes/table-builder';
|
|
19
|
+
|
|
20
|
+
export * from './table-builder/classes/table-builder-general-settings';
|
|
21
|
+
|
|
22
|
+
export * from './table-builder/components';
|
|
23
|
+
|
|
24
|
+
export * from './table-builder/directives';
|
|
25
|
+
|
|
26
|
+
export * from './table-builder/enums/filterTypes';
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
export * from './rxjs'
|
|
30
|
+
|
|
31
|
+
export * from './utilities'
|
|
32
|
+
|
|
33
|
+
export * from './action-state';
|
|
34
|
+
|
|
35
|
+
export * from './ngrx';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from './defaultShareReplay'
|
|
2
|
-
export * from './mapError';
|
|
3
|
-
export * from './rxjs-operators';
|
|
4
|
-
export * from './subjectifier';
|
|
5
|
-
export * from './subscriber.directive';
|
|
1
|
+
export * from './defaultShareReplay'
|
|
2
|
+
export * from './mapError';
|
|
3
|
+
export * from './rxjs-operators';
|
|
4
|
+
export * from './subjectifier';
|
|
5
|
+
export * from './subscriber.directive';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Observable, of } from 'rxjs';
|
|
2
|
+
import { catchError } from 'rxjs/operators';
|
|
3
|
+
|
|
4
|
+
export function mapError<T, TResult>(projection: (error: any) => TResult) {
|
|
5
|
+
return function (src: Observable<T>): Observable<T | TResult> {
|
|
6
|
+
return src.pipe(catchError(e => of(projection(e))),);
|
|
7
|
+
};
|
|
8
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Predicate } from '@angular/core';
|
|
2
|
+
import {
|
|
3
|
+
filter,
|
|
4
|
+
first,
|
|
5
|
+
map,
|
|
6
|
+
pairwise,
|
|
7
|
+
startWith,
|
|
8
|
+
Observable,
|
|
9
|
+
combineLatest,
|
|
10
|
+
Subscription,
|
|
11
|
+
MonoTypeOperatorFunction,
|
|
12
|
+
OperatorFunction,
|
|
13
|
+
concatMap,
|
|
14
|
+
merge,
|
|
15
|
+
of,
|
|
16
|
+
delay,
|
|
17
|
+
pipe
|
|
18
|
+
} from 'rxjs';
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
export const onceWhen = <T>(predicate: Predicate<T>) => (src: Observable<T>) : Observable<T> => {
|
|
22
|
+
return src.pipe(filter(predicate), first());
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const mapArray = <T, U>(mapFunc: (src: T, index?: number) => U ) => (source: Observable<T[]>) =>
|
|
26
|
+
source.pipe( map( src => src.map(mapFunc) ) );
|
|
27
|
+
|
|
28
|
+
export const filterArray = <T>(filterFunc: (src: T) => boolean ) => (source: Observable<T[]>) =>
|
|
29
|
+
source.pipe( map( src => src.filter(filterFunc) ) );
|
|
30
|
+
|
|
31
|
+
export const onWait = startWithIfEmpty;
|
|
32
|
+
export function startWithIfEmpty<T, V extends T>(val: V, wait = 0) : MonoTypeOperatorFunction<T> {
|
|
33
|
+
return (source: Observable<T>) => {
|
|
34
|
+
return new Observable<T>(subscriber => {
|
|
35
|
+
let emitted = false;
|
|
36
|
+
setTimeout(() => {
|
|
37
|
+
if(!emitted) {
|
|
38
|
+
subscriber.next(val);
|
|
39
|
+
}
|
|
40
|
+
}, wait);
|
|
41
|
+
const sub = source.subscribe({
|
|
42
|
+
next(x) { emitted = true; subscriber.next(x) },
|
|
43
|
+
error(err) { emitted = true; subscriber.error(err) },
|
|
44
|
+
complete() { emitted = true; subscriber.complete(); }
|
|
45
|
+
});
|
|
46
|
+
return () => sub.unsubscribe();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const combineArrays = <T>(sources: Observable<T[]>[]): Observable<T[]> => {
|
|
53
|
+
return combineLatest(
|
|
54
|
+
sources.map( src => src.pipe(startWithIfEmpty([] as T [])))
|
|
55
|
+
).pipe(
|
|
56
|
+
map( res => res.flat() )
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export function switchOff( switchSource: Observable<boolean>, defaultState: boolean = true) {
|
|
61
|
+
return <T>(source: Observable<T>) : Observable<T> => {
|
|
62
|
+
return new Observable(subsciber => {
|
|
63
|
+
let isOn = defaultState;
|
|
64
|
+
const subscription = new Subscription();
|
|
65
|
+
subscription.add( switchSource.subscribe( on => isOn = on ));
|
|
66
|
+
subscription.add(source.subscribe({
|
|
67
|
+
next(value) {
|
|
68
|
+
if(isOn) {
|
|
69
|
+
subsciber.next(value);
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
error: error => subsciber.error(error),
|
|
73
|
+
complete: () => subsciber.complete()
|
|
74
|
+
}));
|
|
75
|
+
return subscription;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function skipOneWhen( skipper: Observable<any> ) {
|
|
81
|
+
return <T>(source: Observable<T>) : Observable<T> => {
|
|
82
|
+
return new Observable(subsriber => {
|
|
83
|
+
const subscription = new Subscription();
|
|
84
|
+
let skipNext = false;
|
|
85
|
+
subscription.add(skipper.subscribe( _ => skipNext = true));
|
|
86
|
+
subscription.add(source.subscribe({
|
|
87
|
+
next(value) {
|
|
88
|
+
if(skipNext) {
|
|
89
|
+
skipNext = false;
|
|
90
|
+
} else {
|
|
91
|
+
subsriber.next(value);
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
error: error => subsriber.error(error),
|
|
95
|
+
complete: () => subsriber.complete()
|
|
96
|
+
}));
|
|
97
|
+
return subscription;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function previousAndCurrent<T>(startingValue : T) : OperatorFunction<T, [T, T]> {
|
|
103
|
+
return (source: Observable<T>) => {
|
|
104
|
+
return source.pipe(startWith(startingValue), pairwise());
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function notNull<T>() {
|
|
109
|
+
return pipe(filter<T, NonNullable<T>>((o): o is NonNullable<T> => o != null))
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function delayOn<T>(predicate: (t: T) => boolean, delayTime: number) {
|
|
113
|
+
return (src: Observable<T>) => {
|
|
114
|
+
return src.pipe(
|
|
115
|
+
concatMap(r => {
|
|
116
|
+
if(predicate(r)) {
|
|
117
|
+
return merge(
|
|
118
|
+
of({ r }),
|
|
119
|
+
of(null).pipe(delay(delayTime))
|
|
120
|
+
).pipe(
|
|
121
|
+
notNull(),
|
|
122
|
+
map(d => d.r)
|
|
123
|
+
);
|
|
124
|
+
} else {
|
|
125
|
+
return of(r);
|
|
126
|
+
}
|
|
127
|
+
})
|
|
128
|
+
);
|
|
129
|
+
};
|
|
130
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { merge, Observable, Observer, Subject } from 'rxjs';
|
|
2
|
+
type PipeLike<T> = Observable<T>['pipe'];
|
|
3
|
+
export class Subjectifier<T> extends Observable<T>{
|
|
4
|
+
private _subj = new Subject<T>();
|
|
5
|
+
private merged: Observable<T>;
|
|
6
|
+
constructor(_source: Observable<T>){
|
|
7
|
+
super((obs: Observer<T>) => {
|
|
8
|
+
const s = merge( _source, this._subj ).subscribe(obs);
|
|
9
|
+
return s;
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
this.merged = merge(_source, this._subj);
|
|
13
|
+
}
|
|
14
|
+
next: Subject<T>['next'] = this._subj.next.bind(this._subj);
|
|
15
|
+
newSubj = (...operations: Parameters<PipeLike<T>>) =>
|
|
16
|
+
new Subjectifier(this.merged.pipe(...operations));
|
|
17
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { DestroyRef, Directive, Injector, OnDestroy, assertInInjectionContext, inject } from "@angular/core";
|
|
2
|
+
import { Observable, Subscription } from "rxjs";
|
|
3
|
+
|
|
4
|
+
@Directive()
|
|
5
|
+
export class Subscriber implements OnDestroy{
|
|
6
|
+
subscriptions: Subscription[] = [];
|
|
7
|
+
handle = (subscription: Subscription) => {
|
|
8
|
+
this.subscriptions.push(subscription);
|
|
9
|
+
}
|
|
10
|
+
on = <T = any>(obs: Observable<T>, action: (t: T) => any) => {
|
|
11
|
+
this.handle(obs.subscribe(action));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
ngOnDestroy() {
|
|
15
|
+
this.subscriptions.forEach(subscription => {
|
|
16
|
+
subscription.unsubscribe();
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function subscriber(injector: Injector): Subscriber
|
|
22
|
+
export function subscriber(subscription?: Subscription, injector?: Injector): Subscriber
|
|
23
|
+
export function subscriber<T = any>(obs: Observable<T>, action: (t: T) => any, injector?: Injector): Subscriber
|
|
24
|
+
export function subscriber<T = any>(obsOrSubOrInjector?: Observable<T> | Subscription | Injector, actionOrInjector?: ((t: T) => any) | Injector, injector?: Injector): Subscriber {
|
|
25
|
+
|
|
26
|
+
const destroyRef = getDestroyRef(obsOrSubOrInjector, actionOrInjector, injector);
|
|
27
|
+
|
|
28
|
+
const subscriber = new Subscriber();
|
|
29
|
+
|
|
30
|
+
if(obsOrSubOrInjector instanceof Subscription){
|
|
31
|
+
subscriber.handle(obsOrSubOrInjector);
|
|
32
|
+
} else if(obsOrSubOrInjector instanceof Observable){
|
|
33
|
+
subscriber.handle(obsOrSubOrInjector.subscribe(actionOrInjector as (t: T) => any));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
destroyRef.onDestroy(() => subscriber?.ngOnDestroy());
|
|
37
|
+
|
|
38
|
+
return subscriber;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getDestroyRef(obsOrSubOrInjector: any, actionOrInjector?: any, injector?: Injector){
|
|
42
|
+
const providedInjector = obsOrSubOrInjector instanceof Injector ? obsOrSubOrInjector
|
|
43
|
+
: actionOrInjector instanceof Injector ? actionOrInjector
|
|
44
|
+
: injector;
|
|
45
|
+
|
|
46
|
+
if(!providedInjector){
|
|
47
|
+
try {
|
|
48
|
+
assertInInjectionContext(subscriber);
|
|
49
|
+
} catch (error) {
|
|
50
|
+
throw new Error('createRequestor() must be used in an Injection Context or you must provide an injector to createRequestor()');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const destroyRef = providedInjector?.get(DestroyRef) || inject(DestroyRef);
|
|
55
|
+
|
|
56
|
+
return destroyRef;
|
|
57
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Component } from "@angular/core";
|
|
2
|
+
import { ComponentFixture, fakeAsync, TestBed, waitForAsync } from "@angular/core/testing";
|
|
3
|
+
import { Subject } from "rxjs";
|
|
4
|
+
import { ClickEmitterDirective, ClickSubjectDirective } from "../utilities";
|
|
5
|
+
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
|
|
6
|
+
import { HarnessLoader } from '@angular/cdk/testing';
|
|
7
|
+
import { MatButtonModule } from "@angular/material/button";
|
|
8
|
+
import { MatButtonHarness } from "@angular/material/button/testing";
|
|
9
|
+
|
|
10
|
+
@Component({
|
|
11
|
+
template: `
|
|
12
|
+
<a mat-button clickEmitter #subj='clickEmitter' >click me</a>
|
|
13
|
+
<div *ngIf='subj | async'>Hello World!</div>
|
|
14
|
+
`
|
|
15
|
+
}) export class TestComponent {
|
|
16
|
+
subject = new Subject();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Component({
|
|
20
|
+
template: `
|
|
21
|
+
<a mat-button [clickSubject]='{content: "Hello World!" }' #subj='clickSubject' >click me</a>
|
|
22
|
+
<div *ngIf='subj | async as o'>{{o.content}}</div>
|
|
23
|
+
`
|
|
24
|
+
}) export class TestContentComponent {
|
|
25
|
+
subject = new Subject();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
let fixture: ComponentFixture<TestComponent>;
|
|
30
|
+
let loader: HarnessLoader;
|
|
31
|
+
|
|
32
|
+
const setupTest = (): void => {
|
|
33
|
+
TestBed.configureTestingModule({
|
|
34
|
+
imports: [MatButtonModule],
|
|
35
|
+
declarations: [
|
|
36
|
+
TestComponent,
|
|
37
|
+
ClickEmitterDirective,
|
|
38
|
+
],
|
|
39
|
+
providers: []
|
|
40
|
+
});
|
|
41
|
+
fixture = TestBed.createComponent(TestComponent);
|
|
42
|
+
fixture.detectChanges();
|
|
43
|
+
loader = TestbedHarnessEnvironment.documentRootLoader(fixture);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const setupContentTest = (): void => {
|
|
47
|
+
TestBed.configureTestingModule({
|
|
48
|
+
imports: [MatButtonModule],
|
|
49
|
+
declarations: [
|
|
50
|
+
TestContentComponent,
|
|
51
|
+
ClickSubjectDirective,
|
|
52
|
+
],
|
|
53
|
+
providers: []
|
|
54
|
+
});
|
|
55
|
+
fixture = TestBed.createComponent(TestContentComponent);
|
|
56
|
+
fixture.detectChanges();
|
|
57
|
+
loader = TestbedHarnessEnvironment.documentRootLoader(fixture);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
describe("ClickSubjectDirective", () => {
|
|
62
|
+
describe("Default Subject", () => {
|
|
63
|
+
beforeEach(waitForAsync(setupTest));
|
|
64
|
+
|
|
65
|
+
it('before button is clicked the text should remain hidden', async () => {
|
|
66
|
+
expect(fixture.nativeElement.textContent).not.toContain('Hello World!');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('when button is clicked the text should display', fakeAsync( async () => {
|
|
70
|
+
const buttonHarness = await loader.getHarness(MatButtonHarness);
|
|
71
|
+
await buttonHarness.click();
|
|
72
|
+
fixture.detectChanges();
|
|
73
|
+
expect(fixture.nativeElement.textContent).toContain('Hello World!');
|
|
74
|
+
}));
|
|
75
|
+
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe("Subject with Content", () => {
|
|
79
|
+
beforeEach(waitForAsync(setupContentTest));
|
|
80
|
+
|
|
81
|
+
it('before button is clicked the text should remain hidden', async () => {
|
|
82
|
+
expect(fixture.nativeElement.textContent).not.toContain('Hello World!');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('when button is clicked the text should display', fakeAsync( async () => {
|
|
86
|
+
const buttonHarness = await loader.getHarness(MatButtonHarness);
|
|
87
|
+
await buttonHarness.click();
|
|
88
|
+
fixture.detectChanges();
|
|
89
|
+
expect(fixture.nativeElement.textContent).toContain('Hello World!');
|
|
90
|
+
}));
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Component } from "@angular/core";
|
|
2
|
+
import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from "@angular/core/testing";
|
|
3
|
+
import { MatDialogModule } from "@angular/material/dialog";
|
|
4
|
+
import { Subject } from "rxjs";
|
|
5
|
+
import { DialogDirective, DialogWrapper } from "../utilities";
|
|
6
|
+
import { DialogService } from "../utilities/directives/dialog-service";
|
|
7
|
+
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
|
|
8
|
+
import { MatDialogHarness } from '@angular/material/dialog/testing';
|
|
9
|
+
import { NoopAnimationsModule } from "@angular/platform-browser/animations";
|
|
10
|
+
import { HarnessLoader } from '@angular/cdk/testing';
|
|
11
|
+
import { MatButtonModule } from "@angular/material/button";
|
|
12
|
+
import { MatButtonHarness } from "@angular/material/button/testing";
|
|
13
|
+
|
|
14
|
+
@Component({
|
|
15
|
+
template: `
|
|
16
|
+
<ng-container *opDialog='subject; let text; let close = close'>
|
|
17
|
+
If you see this text, I'm open {{text}}
|
|
18
|
+
<button mat-button (click)='close()' >close</button>
|
|
19
|
+
</ng-container>
|
|
20
|
+
`
|
|
21
|
+
}) export class TestComponent {
|
|
22
|
+
subject = new Subject();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
describe("DialogDirective", () => {
|
|
27
|
+
|
|
28
|
+
let fixture: ComponentFixture<TestComponent>;
|
|
29
|
+
let loader: HarnessLoader;
|
|
30
|
+
|
|
31
|
+
beforeEach(
|
|
32
|
+
waitForAsync(async () => {
|
|
33
|
+
await TestBed.configureTestingModule({
|
|
34
|
+
imports: [MatDialogModule, NoopAnimationsModule, MatButtonModule],
|
|
35
|
+
declarations: [
|
|
36
|
+
TestComponent,
|
|
37
|
+
DialogDirective,
|
|
38
|
+
DialogWrapper,
|
|
39
|
+
],
|
|
40
|
+
providers: [DialogService]
|
|
41
|
+
}).compileComponents();
|
|
42
|
+
fixture = TestBed.createComponent(TestComponent);
|
|
43
|
+
fixture.detectChanges();
|
|
44
|
+
loader = TestbedHarnessEnvironment.documentRootLoader(fixture);
|
|
45
|
+
}),
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
it('before observable emits the dialog should remain closed', async () => {
|
|
49
|
+
expect(fixture.nativeElement.textContent).not.toContain('If you see this text, I\'m open');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('when observable emits the dialog should be open', fakeAsync( async () => {
|
|
53
|
+
fixture.componentInstance.subject.next(true);
|
|
54
|
+
fixture.detectChanges();
|
|
55
|
+
const dialogHarness = await loader.getHarness(MatDialogHarness);
|
|
56
|
+
expect(await dialogHarness.getText()).toContain('If you see this text, I\'m open');
|
|
57
|
+
}));
|
|
58
|
+
|
|
59
|
+
it('when observable emits false the dialog should close', fakeAsync( async () => {
|
|
60
|
+
fixture.componentInstance.subject.next(true);
|
|
61
|
+
fixture.detectChanges();
|
|
62
|
+
let dialogHarness = await loader.getAllHarnesses(MatDialogHarness);
|
|
63
|
+
expect(dialogHarness.length).toBe(1);
|
|
64
|
+
fixture.componentInstance.subject.next(false);
|
|
65
|
+
fixture.detectChanges();
|
|
66
|
+
dialogHarness = await loader.getAllHarnesses(MatDialogHarness);
|
|
67
|
+
expect(dialogHarness.length).toBe(0);
|
|
68
|
+
}));
|
|
69
|
+
|
|
70
|
+
it('when close is clicked the dialog should close', fakeAsync( async () => {
|
|
71
|
+
fixture.componentInstance.subject.next(true);
|
|
72
|
+
fixture.detectChanges();
|
|
73
|
+
let dialogHarness = await loader.getAllHarnesses(MatDialogHarness);
|
|
74
|
+
expect(dialogHarness.length).toBe(1);
|
|
75
|
+
let buttonHarness = await dialogHarness[0].getHarness(MatButtonHarness);
|
|
76
|
+
await buttonHarness.click();
|
|
77
|
+
fixture.detectChanges();
|
|
78
|
+
dialogHarness = await loader.getAllHarnesses(MatDialogHarness);
|
|
79
|
+
expect(dialogHarness.length).toBe(0);
|
|
80
|
+
}));
|
|
81
|
+
|
|
82
|
+
it('when observable emits the template should have access to the emitted data', fakeAsync( async () => {
|
|
83
|
+
fixture.componentInstance.subject.next('Text #1');
|
|
84
|
+
fixture.detectChanges();
|
|
85
|
+
const dialogHarness = await loader.getHarness(MatDialogHarness);
|
|
86
|
+
expect(await dialogHarness.getText()).toContain('Text #1');
|
|
87
|
+
}));
|
|
88
|
+
|
|
89
|
+
it('when observable emits a 2nd time the template should have access to the new data', fakeAsync( async () => {
|
|
90
|
+
fixture.componentInstance.subject.next('Text #1');
|
|
91
|
+
fixture.detectChanges();
|
|
92
|
+
const dialogHarness = await loader.getHarness(MatDialogHarness);
|
|
93
|
+
expect(await dialogHarness.getText()).toContain('Text #1');
|
|
94
|
+
fixture.componentInstance.subject.next('Text #2');
|
|
95
|
+
fixture.detectChanges();
|
|
96
|
+
expect(await dialogHarness.getText()).toContain('Text #2');
|
|
97
|
+
}));
|
|
98
|
+
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
|