@fundamental-ngx/cdk 0.38.3-rc.4
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/README.md +89 -0
- package/data-source/README.md +7 -0
- package/data-source/base/abstract-data-provider.class.d.ts +43 -0
- package/data-source/base/base-data-source.class.d.ts +57 -0
- package/data-source/data-source.directive.d.ts +47 -0
- package/data-source/data-source.module.d.ts +7 -0
- package/data-source/helpers/apply-datasource-directive.d.ts +6 -0
- package/data-source/helpers/common.d.ts +7 -0
- package/data-source/helpers/is-datasource.d.ts +5 -0
- package/data-source/index.d.ts +8 -0
- package/data-source/models/data-source-provider.d.ts +23 -0
- package/data-source/models/data-source.d.ts +16 -0
- package/data-source/models/index.d.ts +3 -0
- package/data-source/models/matching-strategy.d.ts +10 -0
- package/data-source/tokens.d.ts +6 -0
- package/esm2020/data-source/base/abstract-data-provider.class.mjs +126 -0
- package/esm2020/data-source/base/base-data-source.class.mjs +99 -0
- package/esm2020/data-source/data-source.directive.mjs +96 -0
- package/esm2020/data-source/data-source.module.mjs +16 -0
- package/esm2020/data-source/fundamental-ngx-cdk-data-source.mjs +5 -0
- package/esm2020/data-source/helpers/apply-datasource-directive.mjs +7 -0
- package/esm2020/data-source/helpers/common.mjs +17 -0
- package/esm2020/data-source/helpers/is-datasource.mjs +7 -0
- package/esm2020/data-source/index.mjs +9 -0
- package/esm2020/data-source/models/data-source-provider.mjs +2 -0
- package/esm2020/data-source/models/data-source.mjs +2 -0
- package/esm2020/data-source/models/index.mjs +4 -0
- package/esm2020/data-source/models/matching-strategy.mjs +7 -0
- package/esm2020/data-source/tokens.mjs +6 -0
- package/esm2020/forms/cva/cva-control.class.mjs +43 -0
- package/esm2020/forms/cva/cva.directive.mjs +309 -0
- package/esm2020/forms/forms.module.mjs +16 -0
- package/esm2020/forms/fundamental-ngx-cdk-forms.mjs +5 -0
- package/esm2020/forms/helpers/state.mjs +6 -0
- package/esm2020/forms/index.mjs +13 -0
- package/esm2020/forms/models/cva.mjs +2 -0
- package/esm2020/forms/models/form-error.mjs +2 -0
- package/esm2020/forms/models/form-field-control.mjs +2 -0
- package/esm2020/forms/models/form-field.mjs +9 -0
- package/esm2020/forms/models/form-state.mjs +2 -0
- package/esm2020/forms/models/select-item.mjs +14 -0
- package/esm2020/forms/tokens/form-field-control.token.mjs +3 -0
- package/esm2020/forms/tokens/form-field.token.mjs +3 -0
- package/esm2020/fundamental-ngx-cdk.mjs +5 -0
- package/esm2020/fundamental-ngx.module.mjs +19 -0
- package/esm2020/public_api.mjs +5 -0
- package/esm2020/utils/abstract-fd-ngx-class.mjs +56 -0
- package/esm2020/utils/coercion/array.mjs +7 -0
- package/esm2020/utils/consts/error-messages.mjs +6 -0
- package/esm2020/utils/consts/index.mjs +5 -0
- package/esm2020/utils/consts/overflow-priority-score.mjs +8 -0
- package/esm2020/utils/consts/unicode-letters.regex.mjs +11 -0
- package/esm2020/utils/consts/unicode-numbers.regex.mjs +8 -0
- package/esm2020/utils/datatypes/color-accent.datatype.mjs +2 -0
- package/esm2020/utils/datatypes/hash.datatype.mjs +2 -0
- package/esm2020/utils/datatypes/index.mjs +4 -0
- package/esm2020/utils/datatypes/size.datatype.mjs +2 -0
- package/esm2020/utils/decorators/apply-css-class.decorator.mjs +60 -0
- package/esm2020/utils/decorators/apply-css-style.decorator.mjs +28 -0
- package/esm2020/utils/decorators/coerce-boolean.mjs +7 -0
- package/esm2020/utils/decorators/coerce-css-pixel.mjs +4 -0
- package/esm2020/utils/decorators/index.mjs +6 -0
- package/esm2020/utils/decorators/setter-alternator.mjs +18 -0
- package/esm2020/utils/deprecated-selector.class.mjs +20 -0
- package/esm2020/utils/directives/auto-complete/auto-complete.directive.mjs +136 -0
- package/esm2020/utils/directives/auto-complete/auto-complete.module.mjs +17 -0
- package/esm2020/utils/directives/clicked/clicked-behavior.module.mjs +45 -0
- package/esm2020/utils/directives/clicked/clicked-event.plugin.mjs +74 -0
- package/esm2020/utils/directives/clicked/clicked.directive.mjs +52 -0
- package/esm2020/utils/directives/clicked/fdk-clicked-provider.service.mjs +49 -0
- package/esm2020/utils/directives/clicked/index.mjs +4 -0
- package/esm2020/utils/directives/disabled/default-disabled-view-modifier.mjs +12 -0
- package/esm2020/utils/directives/disabled/disabled-behavior.directive.mjs +102 -0
- package/esm2020/utils/directives/disabled/disabled-behavior.interface.mjs +2 -0
- package/esm2020/utils/directives/disabled/disabled-behavior.module.mjs +16 -0
- package/esm2020/utils/directives/disabled/disabled-view-modifier.interface.mjs +2 -0
- package/esm2020/utils/directives/disabled/disabled.observer.mjs +35 -0
- package/esm2020/utils/directives/disabled/fdk-disabled-provider.service.mjs +101 -0
- package/esm2020/utils/directives/disabled/fdk-disabled.token.mjs +3 -0
- package/esm2020/utils/directives/disabled/index.mjs +9 -0
- package/esm2020/utils/directives/disabled/set-disabled-state.mjs +16 -0
- package/esm2020/utils/directives/focus-key-manager/focus-key-manager-helpers.module.mjs +33 -0
- package/esm2020/utils/directives/focus-key-manager/focus-key-manager-item.directive.mjs +98 -0
- package/esm2020/utils/directives/focus-key-manager/focus-key-manager-list.directive.mjs +113 -0
- package/esm2020/utils/directives/focus-key-manager/focus-key-manager.tokens.mjs +3 -0
- package/esm2020/utils/directives/focus-key-manager/index.mjs +5 -0
- package/esm2020/utils/directives/focusable-item/default-focusable-item-view-modifier.mjs +14 -0
- package/esm2020/utils/directives/focusable-item/fdk-focusable-item-provider.service.mjs +97 -0
- package/esm2020/utils/directives/focusable-item/focusable-item-view-modifier.interface.mjs +2 -0
- package/esm2020/utils/directives/focusable-item/focusable-item.directive.mjs +106 -0
- package/esm2020/utils/directives/focusable-item/focusable-item.module.mjs +16 -0
- package/esm2020/utils/directives/focusable-item/focusable.observer.mjs +47 -0
- package/esm2020/utils/directives/focusable-item/focusable.tokens.mjs +3 -0
- package/esm2020/utils/directives/focusable-item/index.mjs +9 -0
- package/esm2020/utils/directives/focusable-item/is-element-focusable-by-default.mjs +32 -0
- package/esm2020/utils/directives/focusable-item/set-focusable.mjs +12 -0
- package/esm2020/utils/directives/focusable-list/focusable-list.directive.mjs +79 -0
- package/esm2020/utils/directives/focusable-list/focusable-list.module.mjs +17 -0
- package/esm2020/utils/directives/focusable-list/focusable-list.service.mjs +54 -0
- package/esm2020/utils/directives/focusable-list/index.mjs +4 -0
- package/esm2020/utils/directives/ignore-click-on-selection/ignore-click-on-selection.directive.mjs +79 -0
- package/esm2020/utils/directives/ignore-click-on-selection/ignore-click-on-selection.module.mjs +16 -0
- package/esm2020/utils/directives/ignore-click-on-selection/tokens.mjs +3 -0
- package/esm2020/utils/directives/index.mjs +31 -0
- package/esm2020/utils/directives/initial-focus/initial-focus.directive.mjs +117 -0
- package/esm2020/utils/directives/initial-focus/initial-focus.module.mjs +16 -0
- package/esm2020/utils/directives/line-clamp/line-clamp.directive.mjs +263 -0
- package/esm2020/utils/directives/line-clamp/line-clamp.module.mjs +32 -0
- package/esm2020/utils/directives/only-digits/only-digits.directive.mjs +218 -0
- package/esm2020/utils/directives/only-digits/only-digits.module.mjs +16 -0
- package/esm2020/utils/directives/overflow-list/overflow-list-item.directive.mjs +42 -0
- package/esm2020/utils/directives/overflow-list/overflow-list.directive.mjs +140 -0
- package/esm2020/utils/directives/overflow-list/overflow-list.module.mjs +33 -0
- package/esm2020/utils/directives/readonly/default-readonly-view-modifier.mjs +12 -0
- package/esm2020/utils/directives/readonly/fdk-readonly-provider.service.mjs +102 -0
- package/esm2020/utils/directives/readonly/fdk-readonly.token.mjs +3 -0
- package/esm2020/utils/directives/readonly/index.mjs +10 -0
- package/esm2020/utils/directives/readonly/readonly-behavior.directive.mjs +97 -0
- package/esm2020/utils/directives/readonly/readonly-behavior.interface.mjs +2 -0
- package/esm2020/utils/directives/readonly/readonly-behavior.module.mjs +16 -0
- package/esm2020/utils/directives/readonly/readonly-view-modifier.interface.mjs +2 -0
- package/esm2020/utils/directives/readonly/readonly.observer.mjs +33 -0
- package/esm2020/utils/directives/readonly/set-readonly-state.mjs +14 -0
- package/esm2020/utils/directives/repeat/repeat.directive.mjs +65 -0
- package/esm2020/utils/directives/repeat/repeat.module.mjs +16 -0
- package/esm2020/utils/directives/resize/resize-handle.directive.mjs +42 -0
- package/esm2020/utils/directives/resize/resize.directive.mjs +231 -0
- package/esm2020/utils/directives/resize/resize.module.mjs +17 -0
- package/esm2020/utils/directives/selectable-list/index.mjs +8 -0
- package/esm2020/utils/directives/selectable-list/select-component-root.token.mjs +3 -0
- package/esm2020/utils/directives/selectable-list/selectable-item.directive.mjs +147 -0
- package/esm2020/utils/directives/selectable-list/selectable-item.token.mjs +3 -0
- package/esm2020/utils/directives/selectable-list/selectable-list.directive.mjs +93 -0
- package/esm2020/utils/directives/selectable-list/selectable-list.module.mjs +17 -0
- package/esm2020/utils/directives/selectable-list/selectable-list.tokens.mjs +3 -0
- package/esm2020/utils/directives/selectable-list/selection.service.mjs +135 -0
- package/esm2020/utils/directives/template/template.directive.mjs +49 -0
- package/esm2020/utils/directives/template/template.module.mjs +16 -0
- package/esm2020/utils/directives/truncate/truncate.directive.mjs +96 -0
- package/esm2020/utils/directives/truncate/truncate.module.mjs +16 -0
- package/esm2020/utils/drag-and-drop/dnd-item/dnd-item.directive.mjs +255 -0
- package/esm2020/utils/drag-and-drop/dnd-keyboard-group/dnd-keyboard-group.directive.mjs +88 -0
- package/esm2020/utils/drag-and-drop/dnd-keyboard-item/dnd-keyboard-item.directive.mjs +83 -0
- package/esm2020/utils/drag-and-drop/dnd-list/dnd-list.directive.mjs +220 -0
- package/esm2020/utils/drag-and-drop/dnd.interfaces.mjs +2 -0
- package/esm2020/utils/drag-and-drop/drag-and-drop.module.mjs +22 -0
- package/esm2020/utils/drag-and-drop/index.mjs +8 -0
- package/esm2020/utils/drag-and-drop/tokens.mjs +4 -0
- package/esm2020/utils/dynamic-component/dynamic-component-config.mjs +2 -0
- package/esm2020/utils/dynamic-component/dynamic-component-container.mjs +21 -0
- package/esm2020/utils/dynamic-component/dynamic-component-injector.mjs +20 -0
- package/esm2020/utils/dynamic-component/dynamic-component.service.mjs +90 -0
- package/esm2020/utils/dynamic-component/index.mjs +5 -0
- package/esm2020/utils/functions/consumer-provider-factory.mjs +12 -0
- package/esm2020/utils/functions/element-size.mjs +23 -0
- package/esm2020/utils/functions/get-document-font-size.mjs +5 -0
- package/esm2020/utils/functions/index.mjs +13 -0
- package/esm2020/utils/functions/intersection-observable.mjs +26 -0
- package/esm2020/utils/functions/is-compact-density.mjs +11 -0
- package/esm2020/utils/functions/key-util.mjs +77 -0
- package/esm2020/utils/functions/module-deprecations-provider.mjs +18 -0
- package/esm2020/utils/functions/parser-file-size.mjs +37 -0
- package/esm2020/utils/functions/random-color-accent.mjs +5 -0
- package/esm2020/utils/functions/resize-observable.mjs +33 -0
- package/esm2020/utils/functions/scroll.mjs +19 -0
- package/esm2020/utils/functions/uuidv4-generator.mjs +12 -0
- package/esm2020/utils/fundamental-ngx-cdk-utils.mjs +5 -0
- package/esm2020/utils/helpers/get-native-element.mjs +18 -0
- package/esm2020/utils/helpers/index.mjs +3 -0
- package/esm2020/utils/helpers/range-selector.mjs +117 -0
- package/esm2020/utils/index.mjs +19 -0
- package/esm2020/utils/interfaces/content-density.mjs +2 -0
- package/esm2020/utils/interfaces/css-class-builder.interface.mjs +2 -0
- package/esm2020/utils/interfaces/css-style-builder.interface.mjs +2 -0
- package/esm2020/utils/interfaces/has-element-ref.interface.mjs +2 -0
- package/esm2020/utils/interfaces/index.mjs +8 -0
- package/esm2020/utils/interfaces/keyboard-support-item.interface.mjs +2 -0
- package/esm2020/utils/interfaces/module-deprecation.interface.mjs +2 -0
- package/esm2020/utils/interfaces/require.interface.mjs +2 -0
- package/esm2020/utils/list-item/list-item-utils.mjs +3 -0
- package/esm2020/utils/models/nullable.mjs +2 -0
- package/esm2020/utils/pipes/displayFn.pipe.mjs +17 -0
- package/esm2020/utils/pipes/filter-strings.pipe.mjs +30 -0
- package/esm2020/utils/pipes/index.mjs +10 -0
- package/esm2020/utils/pipes/is-compact.pipe.mjs +16 -0
- package/esm2020/utils/pipes/pipe.module.mjs +55 -0
- package/esm2020/utils/pipes/safe.pipe.mjs +36 -0
- package/esm2020/utils/pipes/search-highlight.pipe.mjs +31 -0
- package/esm2020/utils/pipes/truncate.pipe.mjs +17 -0
- package/esm2020/utils/pipes/two-digits.pipe.mjs +22 -0
- package/esm2020/utils/pipes/value-by-path.pipe.mjs +16 -0
- package/esm2020/utils/services/content-density.service.mjs +34 -0
- package/esm2020/utils/services/destroyed.service.mjs +20 -0
- package/esm2020/utils/services/focus-trap.service.mjs +92 -0
- package/esm2020/utils/services/index.mjs +11 -0
- package/esm2020/utils/services/keyboard-support/keyboard-support.service.mjs +73 -0
- package/esm2020/utils/services/local-storage.service.mjs +38 -0
- package/esm2020/utils/services/observers/attribute.observer.mjs +81 -0
- package/esm2020/utils/services/resize-observer.service.mjs +94 -0
- package/esm2020/utils/services/rtl.service.mjs +29 -0
- package/esm2020/utils/services/tabbable-element.service.mjs +43 -0
- package/esm2020/utils/services/themes.service.mjs +133 -0
- package/esm2020/utils/tokens/module-deprecations.token.mjs +3 -0
- package/esm2020/utils/typecheck.mjs +75 -0
- package/esm2020/utils/utils.module.mjs +136 -0
- package/fesm2015/fundamental-ngx-cdk-data-source.mjs +378 -0
- package/fesm2015/fundamental-ngx-cdk-data-source.mjs.map +1 -0
- package/fesm2015/fundamental-ngx-cdk-forms.mjs +404 -0
- package/fesm2015/fundamental-ngx-cdk-forms.mjs.map +1 -0
- package/fesm2015/fundamental-ngx-cdk-utils.mjs +5767 -0
- package/fesm2015/fundamental-ngx-cdk-utils.mjs.map +1 -0
- package/fesm2015/fundamental-ngx-cdk.mjs +30 -0
- package/fesm2015/fundamental-ngx-cdk.mjs.map +1 -0
- package/fesm2020/fundamental-ngx-cdk-data-source.mjs +374 -0
- package/fesm2020/fundamental-ngx-cdk-data-source.mjs.map +1 -0
- package/fesm2020/fundamental-ngx-cdk-forms.mjs +399 -0
- package/fesm2020/fundamental-ngx-cdk-forms.mjs.map +1 -0
- package/fesm2020/fundamental-ngx-cdk-utils.mjs +5724 -0
- package/fesm2020/fundamental-ngx-cdk-utils.mjs.map +1 -0
- package/fesm2020/fundamental-ngx-cdk.mjs +30 -0
- package/fesm2020/fundamental-ngx-cdk.mjs.map +1 -0
- package/forms/README.md +7 -0
- package/forms/cva/cva-control.class.d.ts +26 -0
- package/forms/cva/cva.directive.d.ts +178 -0
- package/forms/forms.module.d.ts +7 -0
- package/forms/helpers/state.d.ts +3 -0
- package/forms/index.d.ts +12 -0
- package/forms/models/cva.d.ts +4 -0
- package/forms/models/form-error.d.ts +31 -0
- package/forms/models/form-field-control.d.ts +61 -0
- package/forms/models/form-field.d.ts +30 -0
- package/forms/models/form-state.d.ts +1 -0
- package/forms/models/select-item.d.ts +47 -0
- package/forms/tokens/form-field-control.token.d.ts +3 -0
- package/forms/tokens/form-field.token.d.ts +3 -0
- package/fundamental-ngx-cdk-v0.38.3-rc.4.tgz +0 -0
- package/fundamental-ngx.module.d.ts +9 -0
- package/index.d.ts +5 -0
- package/package.json +80 -0
- package/public_api.d.ts +4 -0
- package/utils/README.md +7 -0
- package/utils/abstract-fd-ngx-class.d.ts +27 -0
- package/utils/coercion/array.d.ts +2 -0
- package/utils/consts/error-messages.d.ts +3 -0
- package/utils/consts/index.d.ts +4 -0
- package/utils/consts/overflow-priority-score.d.ts +2 -0
- package/utils/consts/unicode-letters.regex.d.ts +7 -0
- package/utils/consts/unicode-numbers.regex.d.ts +6 -0
- package/utils/datatypes/color-accent.datatype.d.ts +1 -0
- package/utils/datatypes/hash.datatype.d.ts +3 -0
- package/utils/datatypes/index.d.ts +3 -0
- package/utils/datatypes/size.datatype.d.ts +1 -0
- package/utils/decorators/apply-css-class.decorator.d.ts +10 -0
- package/utils/decorators/apply-css-style.decorator.d.ts +10 -0
- package/utils/decorators/coerce-boolean.d.ts +4 -0
- package/utils/decorators/coerce-css-pixel.d.ts +1 -0
- package/utils/decorators/index.d.ts +5 -0
- package/utils/decorators/setter-alternator.d.ts +4 -0
- package/utils/deprecated-selector.class.d.ts +14 -0
- package/utils/directives/auto-complete/auto-complete.directive.d.ts +58 -0
- package/utils/directives/auto-complete/auto-complete.module.d.ts +7 -0
- package/utils/directives/clicked/clicked-behavior.module.d.ts +12 -0
- package/utils/directives/clicked/clicked-event.plugin.d.ts +22 -0
- package/utils/directives/clicked/clicked.directive.d.ts +21 -0
- package/utils/directives/clicked/fdk-clicked-provider.service.d.ts +24 -0
- package/utils/directives/clicked/index.d.ts +3 -0
- package/utils/directives/disabled/default-disabled-view-modifier.d.ts +9 -0
- package/utils/directives/disabled/disabled-behavior.directive.d.ts +35 -0
- package/utils/directives/disabled/disabled-behavior.interface.d.ts +7 -0
- package/utils/directives/disabled/disabled-behavior.module.d.ts +7 -0
- package/utils/directives/disabled/disabled-view-modifier.interface.d.ts +3 -0
- package/utils/directives/disabled/disabled.observer.d.ts +18 -0
- package/utils/directives/disabled/fdk-disabled-provider.service.d.ts +35 -0
- package/utils/directives/disabled/fdk-disabled.token.d.ts +3 -0
- package/utils/directives/disabled/index.d.ts +8 -0
- package/utils/directives/disabled/set-disabled-state.d.ts +4 -0
- package/utils/directives/focus-key-manager/focus-key-manager-helpers.module.d.ts +8 -0
- package/utils/directives/focus-key-manager/focus-key-manager-item.directive.d.ts +37 -0
- package/utils/directives/focus-key-manager/focus-key-manager-list.directive.d.ts +42 -0
- package/utils/directives/focus-key-manager/focus-key-manager.tokens.d.ts +3 -0
- package/utils/directives/focus-key-manager/index.d.ts +4 -0
- package/utils/directives/focusable-item/default-focusable-item-view-modifier.d.ts +11 -0
- package/utils/directives/focusable-item/fdk-focusable-item-provider.service.d.ts +43 -0
- package/utils/directives/focusable-item/focusable-item-view-modifier.interface.d.ts +3 -0
- package/utils/directives/focusable-item/focusable-item.directive.d.ts +37 -0
- package/utils/directives/focusable-item/focusable-item.module.d.ts +7 -0
- package/utils/directives/focusable-item/focusable.observer.d.ts +18 -0
- package/utils/directives/focusable-item/focusable.tokens.d.ts +2 -0
- package/utils/directives/focusable-item/index.d.ts +8 -0
- package/utils/directives/focusable-item/is-element-focusable-by-default.d.ts +4 -0
- package/utils/directives/focusable-item/set-focusable.d.ts +4 -0
- package/utils/directives/focusable-list/focusable-list.directive.d.ts +25 -0
- package/utils/directives/focusable-list/focusable-list.module.d.ts +8 -0
- package/utils/directives/focusable-list/focusable-list.service.d.ts +35 -0
- package/utils/directives/focusable-list/index.d.ts +3 -0
- package/utils/directives/ignore-click-on-selection/ignore-click-on-selection.directive.d.ts +22 -0
- package/utils/directives/ignore-click-on-selection/ignore-click-on-selection.module.d.ts +7 -0
- package/utils/directives/ignore-click-on-selection/tokens.d.ts +2 -0
- package/utils/directives/index.d.ts +30 -0
- package/utils/directives/initial-focus/initial-focus.directive.d.ts +43 -0
- package/utils/directives/initial-focus/initial-focus.module.d.ts +7 -0
- package/utils/directives/line-clamp/line-clamp.directive.d.ts +101 -0
- package/utils/directives/line-clamp/line-clamp.module.d.ts +7 -0
- package/utils/directives/only-digits/only-digits.directive.d.ts +44 -0
- package/utils/directives/only-digits/only-digits.module.d.ts +7 -0
- package/utils/directives/overflow-list/overflow-list-item.directive.d.ts +14 -0
- package/utils/directives/overflow-list/overflow-list.directive.d.ts +62 -0
- package/utils/directives/overflow-list/overflow-list.module.d.ts +8 -0
- package/utils/directives/readonly/default-readonly-view-modifier.d.ts +9 -0
- package/utils/directives/readonly/fdk-readonly-provider.service.d.ts +35 -0
- package/utils/directives/readonly/fdk-readonly.token.d.ts +2 -0
- package/utils/directives/readonly/index.d.ts +9 -0
- package/utils/directives/readonly/readonly-behavior.directive.d.ts +32 -0
- package/utils/directives/readonly/readonly-behavior.interface.d.ts +7 -0
- package/utils/directives/readonly/readonly-behavior.module.d.ts +7 -0
- package/utils/directives/readonly/readonly-view-modifier.interface.d.ts +3 -0
- package/utils/directives/readonly/readonly.observer.d.ts +18 -0
- package/utils/directives/readonly/set-readonly-state.d.ts +4 -0
- package/utils/directives/repeat/repeat.directive.d.ts +28 -0
- package/utils/directives/repeat/repeat.module.d.ts +7 -0
- package/utils/directives/resize/resize-handle.directive.d.ts +14 -0
- package/utils/directives/resize/resize.directive.d.ts +57 -0
- package/utils/directives/resize/resize.module.d.ts +8 -0
- package/utils/directives/selectable-list/index.d.ts +7 -0
- package/utils/directives/selectable-list/select-component-root.token.d.ts +10 -0
- package/utils/directives/selectable-list/selectable-item.directive.d.ts +47 -0
- package/utils/directives/selectable-list/selectable-item.token.d.ts +11 -0
- package/utils/directives/selectable-list/selectable-list.directive.d.ts +33 -0
- package/utils/directives/selectable-list/selectable-list.module.d.ts +8 -0
- package/utils/directives/selectable-list/selectable-list.tokens.d.ts +2 -0
- package/utils/directives/selectable-list/selection.service.d.ts +65 -0
- package/utils/directives/template/template.directive.d.ts +18 -0
- package/utils/directives/template/template.module.d.ts +7 -0
- package/utils/directives/truncate/truncate.directive.d.ts +51 -0
- package/utils/directives/truncate/truncate.module.d.ts +7 -0
- package/utils/drag-and-drop/dnd-item/dnd-item.directive.d.ts +86 -0
- package/utils/drag-and-drop/dnd-keyboard-group/dnd-keyboard-group.directive.d.ts +32 -0
- package/utils/drag-and-drop/dnd-keyboard-item/dnd-keyboard-item.directive.d.ts +61 -0
- package/utils/drag-and-drop/dnd-list/dnd-list.directive.d.ts +65 -0
- package/utils/drag-and-drop/dnd.interfaces.d.ts +33 -0
- package/utils/drag-and-drop/drag-and-drop.module.d.ts +12 -0
- package/utils/drag-and-drop/index.d.ts +7 -0
- package/utils/drag-and-drop/tokens.d.ts +3 -0
- package/utils/dynamic-component/dynamic-component-config.d.ts +6 -0
- package/utils/dynamic-component/dynamic-component-container.d.ts +19 -0
- package/utils/dynamic-component/dynamic-component-injector.d.ts +13 -0
- package/utils/dynamic-component/dynamic-component.service.d.ts +46 -0
- package/utils/dynamic-component/index.d.ts +4 -0
- package/utils/functions/consumer-provider-factory.d.ts +5 -0
- package/utils/functions/element-size.d.ts +12 -0
- package/utils/functions/get-document-font-size.d.ts +2 -0
- package/utils/functions/index.d.ts +12 -0
- package/utils/functions/intersection-observable.d.ts +8 -0
- package/utils/functions/is-compact-density.d.ts +7 -0
- package/utils/functions/key-util.d.ts +16 -0
- package/utils/functions/module-deprecations-provider.d.ts +5 -0
- package/utils/functions/parser-file-size.d.ts +2 -0
- package/utils/functions/random-color-accent.d.ts +3 -0
- package/utils/functions/resize-observable.d.ts +8 -0
- package/utils/functions/scroll.d.ts +7 -0
- package/utils/functions/uuidv4-generator.d.ts +2 -0
- package/utils/helpers/get-native-element.d.ts +13 -0
- package/utils/helpers/index.d.ts +2 -0
- package/utils/helpers/range-selector.d.ts +84 -0
- package/utils/index.d.ts +18 -0
- package/utils/interfaces/content-density.d.ts +1 -0
- package/utils/interfaces/css-class-builder.interface.d.ts +6 -0
- package/utils/interfaces/css-style-builder.interface.d.ts +5 -0
- package/utils/interfaces/has-element-ref.interface.d.ts +5 -0
- package/utils/interfaces/index.d.ts +7 -0
- package/utils/interfaces/keyboard-support-item.interface.d.ts +6 -0
- package/utils/interfaces/module-deprecation.interface.d.ts +8 -0
- package/utils/interfaces/require.interface.d.ts +6 -0
- package/utils/list-item/list-item-utils.d.ts +7 -0
- package/utils/models/nullable.d.ts +6 -0
- package/utils/pipes/displayFn.pipe.d.ts +8 -0
- package/utils/pipes/filter-strings.pipe.d.ts +16 -0
- package/utils/pipes/index.d.ts +9 -0
- package/utils/pipes/is-compact.pipe.d.ts +9 -0
- package/utils/pipes/pipe.module.d.ts +14 -0
- package/utils/pipes/safe.pipe.d.ts +12 -0
- package/utils/pipes/search-highlight.pipe.d.ts +8 -0
- package/utils/pipes/truncate.pipe.d.ts +8 -0
- package/utils/pipes/two-digits.pipe.d.ts +8 -0
- package/utils/pipes/value-by-path.pipe.d.ts +8 -0
- package/utils/services/content-density.service.d.ts +19 -0
- package/utils/services/destroyed.service.d.ts +11 -0
- package/utils/services/focus-trap.service.d.ts +43 -0
- package/utils/services/index.d.ts +10 -0
- package/utils/services/keyboard-support/keyboard-support.service.d.ts +34 -0
- package/utils/services/local-storage.service.d.ts +13 -0
- package/utils/services/observers/attribute.observer.d.ts +26 -0
- package/utils/services/resize-observer.service.d.ts +34 -0
- package/utils/services/rtl.service.d.ts +12 -0
- package/utils/services/tabbable-element.service.d.ts +12 -0
- package/utils/services/themes.service.d.ts +43 -0
- package/utils/tokens/module-deprecations.token.d.ts +3 -0
- package/utils/typecheck.d.ts +47 -0
- package/utils/utils.module.d.ts +23 -0
package/README.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# @Fundamental-NGX/CDK
|
|
2
|
+
|
|
3
|
+
[](//www.npmjs.com/package/@fundamental-ngx/cdk)
|
|
4
|
+

|
|
5
|
+

|
|
6
|
+
[](https://ui-fundamentals.slack.com)
|
|
7
|
+
[](https://api.reuse.software/info/github.com/SAP/fundamental-ngx)
|
|
8
|
+
|
|
9
|
+
## Content
|
|
10
|
+
|
|
11
|
+
- [1. Description](#1)
|
|
12
|
+
- [2. Requirements](#2)
|
|
13
|
+
- [3. Versioning](#3)
|
|
14
|
+
- [4. Getting Started](#4)
|
|
15
|
+
- [5. Known Issues](#5)
|
|
16
|
+
- [6. Support](#6)
|
|
17
|
+
- [7. Contributing](#7)
|
|
18
|
+
- [8. License](https://github.com/SAP/fundamental-ngx/blob/main/LICENSE.txt)
|
|
19
|
+
- [9. Similar Projects](#8)
|
|
20
|
+
|
|
21
|
+
## <a name="1"></a>1. Description
|
|
22
|
+
|
|
23
|
+
The `@fundamental-ngx/cdk` library is a set of utilities and [Angular](https://angular.io/) directives aimed to help developers build custom UI components with common interaction patterns.
|
|
24
|
+
|
|
25
|
+
It includes common behaviour for working with `DataSources` and `ControlValueAccessors`.
|
|
26
|
+
Additionally, it contains injectable helpers to easily control the `rxjs` subscriptions in your components, focusable/selectable list helpers and many more.
|
|
27
|
+
|
|
28
|
+
See [Component Documentation](https://sap.github.io/fundamental-ngx/docs/home) for examples and API details.
|
|
29
|
+
|
|
30
|
+
## <a name="2"></a>2. Requirements
|
|
31
|
+
|
|
32
|
+
To download and use Fundamental Library for Angular, you will first need to install the [node package manager](https://www.npmjs.com/get-npm).
|
|
33
|
+
|
|
34
|
+
Fundamental Library for Angular is intended for use with Angular 15 or newer.
|
|
35
|
+
|
|
36
|
+
Prior knowledge of Angular is recommended, to use the fundamental-ngx library.
|
|
37
|
+
|
|
38
|
+
## <a name="3"></a>3. Versioning
|
|
39
|
+
|
|
40
|
+
Check the [Breaking Changes](https://github.com/SAP/fundamental-ngx/wiki#breaking-changes) for the latest patches changes.
|
|
41
|
+
|
|
42
|
+
## <a name="4"></a>4. Getting Started
|
|
43
|
+
|
|
44
|
+
For an existing Angular CLI application,
|
|
45
|
+
|
|
46
|
+
0. **Video tutorial**
|
|
47
|
+
[How to use the Fundamental Core Library](https://www.youtube.com/watch?v=i4VIiuzD2Fg)
|
|
48
|
+
|
|
49
|
+
1. **Install Fundamental-NGX CDK.**
|
|
50
|
+
`ng add @fundamental-ngx/cdk`
|
|
51
|
+
For versions prior to 0.10 use `fundamental-ngx`
|
|
52
|
+
|
|
53
|
+
_If you do not use the Angular CLI or if this command does not work for you, please see the [full installation guide](https://github.com/SAP/fundamental-ngx/wiki/Full-Installation-Guide)._
|
|
54
|
+
|
|
55
|
+
2. **Import the modules you want to use.**
|
|
56
|
+
|
|
57
|
+
To add the entire library, add the following import to your main application module.
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { FundamentalNgxCDKModule } from '@fundamental-ngx/cdk';
|
|
61
|
+
|
|
62
|
+
@NgModule({
|
|
63
|
+
...
|
|
64
|
+
imports: [FundamentalNgxCDKModule],
|
|
65
|
+
})
|
|
66
|
+
export class DemoModule { }
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
To include an individual Angular Fundamental component in your application, you only need to import the relevant module.
|
|
70
|
+
|
|
71
|
+
For example, to use Drag&Drop directive, add the following import to your main application module.
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
import { DragAndDropModule } from '@fundamental-ngx/cdk/utils';
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## <a name="5"></a>5. Known Issues
|
|
78
|
+
|
|
79
|
+
Please see [Issues](https://github.com/SAP/fundamental-ngx/issues).
|
|
80
|
+
|
|
81
|
+
## <a name="6"></a>6. Support
|
|
82
|
+
|
|
83
|
+
If you encounter an issue, you can [create a ticket](https://github.com/SAP/fundamental-ngx/issues).
|
|
84
|
+
|
|
85
|
+
## <a name="7"></a>7. Contributing
|
|
86
|
+
|
|
87
|
+
If you want to contribute, please check the [CONTRIBUTING.md](https://github.com/SAP/fundamental-ngx/blob/main/CONTRIBUTING.md) documentation for contribution guidelines. Please follow the [Angular commit message guidelines](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit).
|
|
88
|
+
|
|
89
|
+
Check out the [NEW_COMPONENT.md](https://github.com/SAP/fundamental-ngx/blob/main/NEW_COMPONENT.md) guide on building a new component for the library and creating the necessary documentation for your new component.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { ProviderParams } from '../helpers/common';
|
|
3
|
+
import { MatchBy, MatchingBy, MatchingStrategy } from '../models/matching-strategy';
|
|
4
|
+
/**
|
|
5
|
+
* Base data provider class.
|
|
6
|
+
*/
|
|
7
|
+
export declare abstract class AbstractDataProvider<T> {
|
|
8
|
+
/** @hidden */
|
|
9
|
+
protected _keyPath: string;
|
|
10
|
+
/** @hidden */
|
|
11
|
+
protected _matchingStrategy: MatchingStrategy;
|
|
12
|
+
/** @hidden */
|
|
13
|
+
protected _matchingBy: MatchingBy | null;
|
|
14
|
+
abstract fetch(params: ProviderParams, start?: number, end?: number): Observable<T[]>;
|
|
15
|
+
/** @hidden */
|
|
16
|
+
setLookupKey(key: string): void;
|
|
17
|
+
/** @hidden */
|
|
18
|
+
setMatchingBy(matchingBy: MatchingBy): void;
|
|
19
|
+
/** @hidden */
|
|
20
|
+
setMatchingStrategy(strategy: MatchingStrategy): void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Default data provider class used for other components to extend from.
|
|
24
|
+
*/
|
|
25
|
+
export declare class DataProvider<T> extends AbstractDataProvider<T> {
|
|
26
|
+
protected values: Observable<T[]> | T[];
|
|
27
|
+
/** @hidden */
|
|
28
|
+
constructor(values: Observable<T[]> | T[]);
|
|
29
|
+
/** @hidden */
|
|
30
|
+
fetch(params: Map<string, any>): Observable<T[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Warning: If you don't supply search Key and you want fulltext search, and you use this
|
|
33
|
+
* default implementation be aware that it can perform poorly as it is naive implementation
|
|
34
|
+
* that does not do deep compare.
|
|
35
|
+
*/
|
|
36
|
+
matches(item: T, pattern: string): boolean;
|
|
37
|
+
/** @hidden */
|
|
38
|
+
matchesBy(item: any, pattern: string, matchingBy: MatchBy): boolean;
|
|
39
|
+
/** @hidden */
|
|
40
|
+
protected hasObjectValue(obj: any, pattern: string): boolean;
|
|
41
|
+
/** @hidden */
|
|
42
|
+
private withLimit;
|
|
43
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { BehaviorSubject, Observable, Subject } from 'rxjs';
|
|
2
|
+
import { DataSourceProvider } from '../models';
|
|
3
|
+
import { AbstractDataProvider } from './abstract-data-provider.class';
|
|
4
|
+
export declare abstract class BaseDataSource<T> implements DataSourceProvider<T> {
|
|
5
|
+
dataProvider: AbstractDataProvider<any>;
|
|
6
|
+
/**
|
|
7
|
+
* Max limit of items to be returned.
|
|
8
|
+
*/
|
|
9
|
+
static readonly MaxLimit = 5;
|
|
10
|
+
/**
|
|
11
|
+
* Whether to enable limit of max items.
|
|
12
|
+
*/
|
|
13
|
+
limitless: boolean;
|
|
14
|
+
/** @hidden */
|
|
15
|
+
protected readonly _dataChanges$: BehaviorSubject<T[]>;
|
|
16
|
+
/** @hidden */
|
|
17
|
+
protected readonly _dataRequested$: Subject<void>;
|
|
18
|
+
/** @hidden */
|
|
19
|
+
protected readonly _dataReceived$: Subject<void>;
|
|
20
|
+
/** @hidden */
|
|
21
|
+
protected readonly _destroy$: Subject<void>;
|
|
22
|
+
/** @hidden */
|
|
23
|
+
protected readonly _dataLoading$: BehaviorSubject<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Emitted when new data has been requested.
|
|
26
|
+
* @returns Observable
|
|
27
|
+
*/
|
|
28
|
+
get dataRequested(): Observable<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Emitted when new data has been received.
|
|
31
|
+
* @returns Observable
|
|
32
|
+
*/
|
|
33
|
+
get dataReceived(): Observable<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Emitted when loading state has been changed.
|
|
36
|
+
* @returns Observable.
|
|
37
|
+
*/
|
|
38
|
+
get dataLoading(): Observable<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Emits when data from the provides has been changed.
|
|
41
|
+
* @returns Observable of data source objects.
|
|
42
|
+
*/
|
|
43
|
+
get dataChanges(): Observable<T[]>;
|
|
44
|
+
/** @hidden */
|
|
45
|
+
protected constructor(dataProvider: AbstractDataProvider<any>);
|
|
46
|
+
/**
|
|
47
|
+
* Searches through the data source with defined parameters.
|
|
48
|
+
* @param predicate Search query.
|
|
49
|
+
* @param start start index.
|
|
50
|
+
* @param end end index.
|
|
51
|
+
*/
|
|
52
|
+
match(predicate?: string | Map<string, string>, start?: number, end?: number): void;
|
|
53
|
+
/**
|
|
54
|
+
* Closes the stream
|
|
55
|
+
*/
|
|
56
|
+
unsubscribe(): void;
|
|
57
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { EventEmitter, OnDestroy } from '@angular/core';
|
|
2
|
+
import { DestroyedService } from '@fundamental-ngx/cdk/utils';
|
|
3
|
+
import { BehaviorSubject } from 'rxjs';
|
|
4
|
+
import { DataSource, DataSourceParser, DataSourceProvider } from './models';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export declare class DataSourceDirective<T = any, P extends DataSourceProvider<T> = DataSourceProvider<T>> implements OnDestroy {
|
|
7
|
+
private readonly _destroyed$;
|
|
8
|
+
private readonly _dataSourceTransformer;
|
|
9
|
+
/**
|
|
10
|
+
* Data source.
|
|
11
|
+
* @param source
|
|
12
|
+
*/
|
|
13
|
+
set dataSource(source: DataSource<T>);
|
|
14
|
+
get dataSource(): DataSource<T>;
|
|
15
|
+
/** @hidden */
|
|
16
|
+
private _dataSource;
|
|
17
|
+
/** @hidden */
|
|
18
|
+
dataSourceProvider: P | undefined;
|
|
19
|
+
/** @hidden */
|
|
20
|
+
private _dsSubscription;
|
|
21
|
+
/**
|
|
22
|
+
* Data stream. Emits when new data retrieved.
|
|
23
|
+
*/
|
|
24
|
+
readonly dataChanged$: BehaviorSubject<T[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Emits when the data source object has been changed.
|
|
27
|
+
*/
|
|
28
|
+
readonly dataSourceChanged: EventEmitter<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Event emitted when datasource content has been changed.
|
|
31
|
+
*/
|
|
32
|
+
readonly dataChanged: EventEmitter<T[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Event emitted when data provider loading state has been changed.
|
|
35
|
+
*/
|
|
36
|
+
readonly isLoading: EventEmitter<boolean>;
|
|
37
|
+
/** @hidden */
|
|
38
|
+
constructor(_destroyed$: DestroyedService, _dataSourceTransformer: DataSourceParser<T, P>);
|
|
39
|
+
/** @hidden */
|
|
40
|
+
private _initializeDataSource;
|
|
41
|
+
/** @hidden */
|
|
42
|
+
ngOnDestroy(): void;
|
|
43
|
+
/** @Hidden */
|
|
44
|
+
private _toDataStream;
|
|
45
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DataSourceDirective<any, any>, never>;
|
|
46
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<DataSourceDirective<any, any>, "[fdkDataSource]", never, { "dataSource": "dataSource"; }, { "dataSourceChanged": "dataSourceChanged"; "dataChanged": "dataChanged"; "isLoading": "isLoading"; }, never, never, true, never>;
|
|
47
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./data-source.directive";
|
|
3
|
+
export declare class DataSourceModule {
|
|
4
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DataSourceModule, never>;
|
|
5
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<DataSourceModule, never, [typeof i1.DataSourceDirective], [typeof i1.DataSourceDirective]>;
|
|
6
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<DataSourceModule>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare type ProviderParams = ReadonlyMap<string, any>;
|
|
2
|
+
/** @Hidden */
|
|
3
|
+
export declare function getMatchingStrategyStartsWithPerTermReqexp(value: string): RegExp;
|
|
4
|
+
/** @hidden */
|
|
5
|
+
export declare function objectValues(obj: any): any[];
|
|
6
|
+
/** @hidden */
|
|
7
|
+
export declare function objectToName(target: any): string;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './data-source.module';
|
|
2
|
+
export * from './data-source.directive';
|
|
3
|
+
export * from './models';
|
|
4
|
+
export * from './base/base-data-source.class';
|
|
5
|
+
export * from './base/abstract-data-provider.class';
|
|
6
|
+
export * from './tokens';
|
|
7
|
+
export * from './helpers/apply-datasource-directive';
|
|
8
|
+
export * from './helpers/is-datasource';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
/**
|
|
3
|
+
* Data source provider class controls the data stream.
|
|
4
|
+
*/
|
|
5
|
+
export interface DataSourceProvider<T = any> {
|
|
6
|
+
/**
|
|
7
|
+
* Closes the data stream.
|
|
8
|
+
*/
|
|
9
|
+
unsubscribe(): void;
|
|
10
|
+
/**
|
|
11
|
+
* Stream emits when new data has been requested.
|
|
12
|
+
*/
|
|
13
|
+
dataRequested: Observable<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Stream emits when new data has been loaded.
|
|
16
|
+
*/
|
|
17
|
+
dataReceived: Observable<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Stream emits when loading state has been changed.
|
|
20
|
+
*/
|
|
21
|
+
dataLoading: Observable<boolean>;
|
|
22
|
+
dataChanges: Observable<T[]>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { DataSourceProvider } from './data-source-provider';
|
|
3
|
+
/**
|
|
4
|
+
* Acceptable data source types.
|
|
5
|
+
*/
|
|
6
|
+
export declare type DataSource<T = any> = DataSourceProvider<T> | Observable<T[]> | T[];
|
|
7
|
+
/**
|
|
8
|
+
* Data source parser is a special class that parses incoming data into appropriate data source provider.
|
|
9
|
+
*/
|
|
10
|
+
export interface DataSourceParser<T = any, P extends DataSourceProvider<T> = DataSourceProvider<T>> {
|
|
11
|
+
/**
|
|
12
|
+
* Defines which data provider class to initiate.
|
|
13
|
+
* @param source data source to be parsed.
|
|
14
|
+
*/
|
|
15
|
+
parse(source: DataSource<T>): P | undefined;
|
|
16
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare enum MatchingStrategy {
|
|
2
|
+
STARTS_WITH_PER_TERM = "starts with per term",
|
|
3
|
+
STARTS_WITH = "starts with",
|
|
4
|
+
CONTAINS = "contains"
|
|
5
|
+
}
|
|
6
|
+
export declare type MatchBy = (item: any) => any;
|
|
7
|
+
export interface MatchingBy {
|
|
8
|
+
firstBy: MatchBy;
|
|
9
|
+
secondaryBy?: MatchBy;
|
|
10
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { DataSourceParser } from './models/data-source';
|
|
3
|
+
/**
|
|
4
|
+
* Injection token used for passing custom datasource transformer into DataSourceProvider.
|
|
5
|
+
*/
|
|
6
|
+
export declare const FD_DATA_SOURCE_TRANSFORMER: InjectionToken<DataSourceParser<any, import("@fundamental-ngx/cdk/data-source").DataSourceProvider<any>>>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { isFunction, isJsObject } from '@fundamental-ngx/cdk/utils';
|
|
2
|
+
import { isObservable, of } from 'rxjs';
|
|
3
|
+
import { map } from 'rxjs/operators';
|
|
4
|
+
import { getMatchingStrategyStartsWithPerTermReqexp, objectToName, objectValues } from '../helpers/common';
|
|
5
|
+
import { MatchingStrategy } from '../models/matching-strategy';
|
|
6
|
+
/**
|
|
7
|
+
* Base data provider class.
|
|
8
|
+
*/
|
|
9
|
+
export class AbstractDataProvider {
|
|
10
|
+
constructor() {
|
|
11
|
+
/** @hidden */
|
|
12
|
+
this._matchingStrategy = MatchingStrategy.STARTS_WITH;
|
|
13
|
+
/** @hidden */
|
|
14
|
+
this._matchingBy = null;
|
|
15
|
+
}
|
|
16
|
+
/** @hidden */
|
|
17
|
+
setLookupKey(key) {
|
|
18
|
+
this._keyPath = key;
|
|
19
|
+
}
|
|
20
|
+
/** @hidden */
|
|
21
|
+
setMatchingBy(matchingBy) {
|
|
22
|
+
this._matchingBy = matchingBy;
|
|
23
|
+
}
|
|
24
|
+
/** @hidden */
|
|
25
|
+
setMatchingStrategy(strategy) {
|
|
26
|
+
this._matchingStrategy = strategy;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Default data provider class used for other components to extend from.
|
|
31
|
+
*/
|
|
32
|
+
export class DataProvider extends AbstractDataProvider {
|
|
33
|
+
/** @hidden */
|
|
34
|
+
constructor(values) {
|
|
35
|
+
super();
|
|
36
|
+
this.values = values;
|
|
37
|
+
}
|
|
38
|
+
/** @hidden */
|
|
39
|
+
fetch(params) {
|
|
40
|
+
const observable = isObservable(this.values) ? this.values : of(this.values);
|
|
41
|
+
const queryString = params.get('query');
|
|
42
|
+
const limit = params.get('limit') || 50;
|
|
43
|
+
if (!queryString || queryString === '*') {
|
|
44
|
+
return observable.pipe(map((items) => this.withLimit(items, limit)));
|
|
45
|
+
}
|
|
46
|
+
const toLowerPattern = queryString.toLowerCase();
|
|
47
|
+
return observable.pipe(map((items) => {
|
|
48
|
+
const result = [];
|
|
49
|
+
for (let i = 0; i < items.length; i++) {
|
|
50
|
+
const item = items[i];
|
|
51
|
+
if (this.matches(item, toLowerPattern)) {
|
|
52
|
+
result.push(item);
|
|
53
|
+
if (result.length >= limit) {
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Warning: If you don't supply search Key and you want fulltext search, and you use this
|
|
63
|
+
* default implementation be aware that it can perform poorly as it is naive implementation
|
|
64
|
+
* that does not do deep compare.
|
|
65
|
+
*/
|
|
66
|
+
matches(item, pattern) {
|
|
67
|
+
if (!this._matchingBy) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
const { firstBy, secondaryBy } = this._matchingBy;
|
|
71
|
+
let matched = this.matchesBy(item, pattern, firstBy);
|
|
72
|
+
if (!matched && secondaryBy) {
|
|
73
|
+
matched = this.matchesBy(item, pattern, secondaryBy);
|
|
74
|
+
}
|
|
75
|
+
return matched;
|
|
76
|
+
}
|
|
77
|
+
/** @hidden */
|
|
78
|
+
matchesBy(item, pattern, matchingBy) {
|
|
79
|
+
const value = isJsObject(item) && matchingBy ? matchingBy(item) : item;
|
|
80
|
+
if (isFunction(value)) {
|
|
81
|
+
return value.call(item);
|
|
82
|
+
}
|
|
83
|
+
else if (isJsObject(value)) {
|
|
84
|
+
return this.hasObjectValue(item, pattern);
|
|
85
|
+
}
|
|
86
|
+
else if (this._matchingStrategy === MatchingStrategy.STARTS_WITH_PER_TERM) {
|
|
87
|
+
const reqexp = getMatchingStrategyStartsWithPerTermReqexp(pattern);
|
|
88
|
+
return !!pattern && !!value && !!value.match(reqexp);
|
|
89
|
+
}
|
|
90
|
+
else if (this._matchingStrategy === MatchingStrategy.STARTS_WITH) {
|
|
91
|
+
return !!pattern && !!value && value.toString().toLowerCase().startsWith(pattern.toLowerCase());
|
|
92
|
+
}
|
|
93
|
+
else if (this._matchingStrategy === MatchingStrategy.CONTAINS) {
|
|
94
|
+
return !!pattern && !!value && value.toString().toLowerCase().indexOf(pattern) > -1;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
return !!pattern && !!value && value.toString().toLowerCase() === pattern;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** @hidden */
|
|
101
|
+
hasObjectValue(obj, pattern) {
|
|
102
|
+
const values = objectValues(obj);
|
|
103
|
+
const parentObj = objectToName(obj);
|
|
104
|
+
const length2 = values.filter((value) => {
|
|
105
|
+
if (!value || Array.isArray(value)) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
else if (!isJsObject(value) && !isFunction(value)) {
|
|
109
|
+
return value.toString().toLowerCase().indexOf(pattern) !== -1;
|
|
110
|
+
}
|
|
111
|
+
else if (isJsObject(value) && objectToName(value) !== parentObj) {
|
|
112
|
+
return this.hasObjectValue(value, pattern);
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}).length;
|
|
116
|
+
return length2 > 0;
|
|
117
|
+
}
|
|
118
|
+
/** @hidden */
|
|
119
|
+
withLimit(data, limit) {
|
|
120
|
+
if (limit && data.length > limit) {
|
|
121
|
+
return data.slice(0, limit);
|
|
122
|
+
}
|
|
123
|
+
return data;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZGF0YS1wcm92aWRlci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2RrL3NyYy9saWIvZGF0YS1zb3VyY2UvYmFzZS9hYnN0cmFjdC1kYXRhLXByb3ZpZGVyLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFDSCwwQ0FBMEMsRUFDMUMsWUFBWSxFQUNaLFlBQVksRUFFZixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBdUIsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVwRjs7R0FFRztBQUNILE1BQU0sT0FBZ0Isb0JBQW9CO0lBQTFDO1FBSUksY0FBYztRQUNKLHNCQUFpQixHQUFxQixnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7UUFFN0UsY0FBYztRQUNKLGdCQUFXLEdBQXNCLElBQUksQ0FBQztJQWtCcEQsQ0FBQztJQWRHLGNBQWM7SUFDZCxZQUFZLENBQUMsR0FBVztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBRUQsY0FBYztJQUNkLGFBQWEsQ0FBQyxVQUFzQjtRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsY0FBYztJQUNkLG1CQUFtQixDQUFDLFFBQTBCO1FBQzFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUM7SUFDdEMsQ0FBQztDQUNKO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBZ0IsU0FBUSxvQkFBdUI7SUFDeEQsY0FBYztJQUNkLFlBQXNCLE1B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LEVBQUU7Z0JBQ2hDLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO2lCQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pELE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNqRTtpQkFBTSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUMvRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzlDO1lBRUQsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ1YsT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxjQUFjO0lBQ04sU0FBUyxDQUFDLElBQWMsRUFBRSxLQUFjO1FBQzVDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDL0I7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc0pzT2JqZWN0IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBnZXRNYXRjaGluZ1N0cmF0ZWd5U3RhcnRzV2l0aFBlclRlcm1SZXFleHAsXG4gICAgb2JqZWN0VG9OYW1lLFxuICAgIG9iamVjdFZhbHVlcyxcbiAgICBQcm92aWRlclBhcmFtc1xufSBmcm9tICcuLi9oZWxwZXJzL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRjaEJ5LCBNYXRjaGluZ0J5LCBNYXRjaGluZ1N0cmF0ZWd5IH0gZnJvbSAnLi4vbW9kZWxzL21hdGNoaW5nLXN0cmF0ZWd5JztcblxuLyoqXG4gKiBCYXNlIGRhdGEgcHJvdmlkZXIgY2xhc3MuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhdGFQcm92aWRlcjxUPiB7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgX2tleVBhdGg6IHN0cmluZztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIF9tYXRjaGluZ1N0cmF0ZWd5OiBNYXRjaGluZ1N0cmF0ZWd5ID0gTWF0Y2hpbmdTdHJhdGVneS5TVEFSVFNfV0lUSDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIF9tYXRjaGluZ0J5OiBNYXRjaGluZ0J5IHwgbnVsbCA9IG51bGw7XG5cbiAgICBhYnN0cmFjdCBmZXRjaChwYXJhbXM6IFByb3ZpZGVyUGFyYW1zLCBzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKTogT2JzZXJ2YWJsZTxUW10+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBzZXRMb29rdXBLZXkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fa2V5UGF0aCA9IGtleTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNldE1hdGNoaW5nQnkobWF0Y2hpbmdCeTogTWF0Y2hpbmdCeSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9tYXRjaGluZ0J5ID0gbWF0Y2hpbmdCeTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNldE1hdGNoaW5nU3RyYXRlZ3koc3RyYXRlZ3k6IE1hdGNoaW5nU3RyYXRlZ3kpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWF0Y2hpbmdTdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgIH1cbn1cblxuLyoqXG4gKiBEZWZhdWx0IGRhdGEgcHJvdmlkZXIgY2xhc3MgdXNlZCBmb3Igb3RoZXIgY29tcG9uZW50cyB0byBleHRlbmQgZnJvbS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFQcm92aWRlcjxUPiBleHRlbmRzIEFic3RyYWN0RGF0YVByb3ZpZGVyPFQ+IHtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB2YWx1ZXM6IE9ic2VydmFibGU8VFtdPiB8IFRbXSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZmV0Y2gocGFyYW1zOiBNYXA8c3RyaW5nLCBhbnk+KTogT2JzZXJ2YWJsZTxUW10+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IGlzT2JzZXJ2YWJsZSh0aGlzLnZhbHVlcykgPyB0aGlzLnZhbHVlcyA6IG9mKHRoaXMudmFsdWVzKTtcblxuICAgICAgICBjb25zdCBxdWVyeVN0cmluZyA9IHBhcmFtcy5nZXQoJ3F1ZXJ5Jyk7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcGFyYW1zLmdldCgnbGltaXQnKSB8fCA1MDtcblxuICAgICAgICBpZiAoIXF1ZXJ5U3RyaW5nIHx8IHF1ZXJ5U3RyaW5nID09PSAnKicpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNlcnZhYmxlLnBpcGUobWFwKChpdGVtcykgPT4gdGhpcy53aXRoTGltaXQoaXRlbXMsIGxpbWl0KSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9Mb3dlclBhdHRlcm4gPSBxdWVyeVN0cmluZy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIHJldHVybiBvYnNlcnZhYmxlLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoZXMoaXRlbSwgdG9Mb3dlclBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID49IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYXJuaW5nOiBJZiB5b3UgZG9uJ3Qgc3VwcGx5IHNlYXJjaCBLZXkgYW5kIHlvdSB3YW50IGZ1bGx0ZXh0IHNlYXJjaCwgYW5kIHlvdSB1c2UgdGhpc1xuICAgICAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYmUgYXdhcmUgdGhhdCBpdCBjYW4gIHBlcmZvcm0gcG9vcmx5IGFzIGl0IGlzIG5haXZlIGltcGxlbWVudGF0aW9uXG4gICAgICogdGhhdCBkb2VzIG5vdCBkbyBkZWVwIGNvbXBhcmUuXG4gICAgICovXG4gICAgbWF0Y2hlcyhpdGVtOiBULCBwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXRjaGluZ0J5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBmaXJzdEJ5LCBzZWNvbmRhcnlCeSB9ID0gdGhpcy5fbWF0Y2hpbmdCeTtcblxuICAgICAgICBsZXQgbWF0Y2hlZCA9IHRoaXMubWF0Y2hlc0J5KGl0ZW0sIHBhdHRlcm4sIGZpcnN0QnkpO1xuICAgICAgICBpZiAoIW1hdGNoZWQgJiYgc2Vjb25kYXJ5QnkpIHtcbiAgICAgICAgICAgIG1hdGNoZWQgPSB0aGlzLm1hdGNoZXNCeShpdGVtLCBwYXR0ZXJuLCBzZWNvbmRhcnlCeSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF0Y2hlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG1hdGNoZXNCeShpdGVtOiBhbnksIHBhdHRlcm46IHN0cmluZywgbWF0Y2hpbmdCeTogTWF0Y2hCeSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGlzSnNPYmplY3QoaXRlbSkgJiYgbWF0Y2hpbmdCeSA/IG1hdGNoaW5nQnkoaXRlbSkgOiBpdGVtO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmNhbGwoaXRlbSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNKc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc09iamVjdFZhbHVlKGl0ZW0sIHBhdHRlcm4pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX21hdGNoaW5nU3RyYXRlZ3kgPT09IE1hdGNoaW5nU3RyYXRlZ3kuU1RBUlRTX1dJVEhfUEVSX1RFUk0pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcWV4cCA9IGdldE1hdGNoaW5nU3RyYXRlZ3lTdGFydHNXaXRoUGVyVGVybVJlcWV4cChwYXR0ZXJuKTtcbiAgICAgICAgICAgIHJldHVybiAhIXBhdHRlcm4gJiYgISF2YWx1ZSAmJiAhIXZhbHVlLm1hdGNoKHJlcWV4cCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbWF0Y2hpbmdTdHJhdGVneSA9PT0gTWF0Y2hpbmdTdHJhdGVneS5TVEFSVFNfV0lUSCkge1xuICAgICAgICAgICAgcmV0dXJuICEhcGF0dGVybiAmJiAhIXZhbHVlICYmIHZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHBhdHRlcm4udG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbWF0Y2hpbmdTdHJhdGVneSA9PT0gTWF0Y2hpbmdTdHJhdGVneS5DT05UQUlOUykge1xuICAgICAgICAgICAgcmV0dXJuICEhcGF0dGVybiAmJiAhIXZhbHVlICYmIHZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHBhdHRlcm4pID4gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gISFwYXR0ZXJuICYmICEhdmFsdWUgJiYgdmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSBwYXR0ZXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgaGFzT2JqZWN0VmFsdWUob2JqOiBhbnksIHBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBvYmplY3RWYWx1ZXMob2JqKTtcbiAgICAgICAgY29uc3QgcGFyZW50T2JqID0gb2JqZWN0VG9OYW1lKG9iaik7XG4gICAgICAgIGNvbnN0IGxlbmd0aDIgPSB2YWx1ZXMuZmlsdGVyKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNKc09iamVjdCh2YWx1ZSkgJiYgIWlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHBhdHRlcm4pICE9PSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNKc09iamVjdCh2YWx1ZSkgJiYgb2JqZWN0VG9OYW1lKHZhbHVlKSAhPT0gcGFyZW50T2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzT2JqZWN0VmFsdWUodmFsdWUsIHBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGxlbmd0aDIgPiAwO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSB3aXRoTGltaXQoZGF0YTogQXJyYXk8VD4sIGxpbWl0PzogbnVtYmVyKTogQXJyYXk8VD4ge1xuICAgICAgICBpZiAobGltaXQgJiYgZGF0YS5sZW5ndGggPiBsaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEuc2xpY2UoMCwgbGltaXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
|
2
|
+
import { takeUntil } from 'rxjs/operators';
|
|
3
|
+
export class BaseDataSource {
|
|
4
|
+
/** @hidden */
|
|
5
|
+
constructor(dataProvider) {
|
|
6
|
+
this.dataProvider = dataProvider;
|
|
7
|
+
/**
|
|
8
|
+
* Whether to enable limit of max items.
|
|
9
|
+
*/
|
|
10
|
+
this.limitless = false;
|
|
11
|
+
/** @hidden */
|
|
12
|
+
this._dataChanges$ = new BehaviorSubject([]);
|
|
13
|
+
/** @hidden */
|
|
14
|
+
this._dataRequested$ = new Subject();
|
|
15
|
+
/** @hidden */
|
|
16
|
+
this._dataReceived$ = new Subject();
|
|
17
|
+
/** @hidden */
|
|
18
|
+
this._destroy$ = new Subject();
|
|
19
|
+
/** @hidden */
|
|
20
|
+
this._dataLoading$ = new BehaviorSubject(false);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Emitted when new data has been requested.
|
|
24
|
+
* @returns Observable
|
|
25
|
+
*/
|
|
26
|
+
get dataRequested() {
|
|
27
|
+
return this._dataRequested$.asObservable();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Emitted when new data has been received.
|
|
31
|
+
* @returns Observable
|
|
32
|
+
*/
|
|
33
|
+
get dataReceived() {
|
|
34
|
+
return this._dataReceived$.asObservable();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Emitted when loading state has been changed.
|
|
38
|
+
* @returns Observable.
|
|
39
|
+
*/
|
|
40
|
+
get dataLoading() {
|
|
41
|
+
return this._dataLoading$.asObservable();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Emits when data from the provides has been changed.
|
|
45
|
+
* @returns Observable of data source objects.
|
|
46
|
+
*/
|
|
47
|
+
get dataChanges() {
|
|
48
|
+
return this._dataChanges$.asObservable().pipe(takeUntil(this._destroy$));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Searches through the data source with defined parameters.
|
|
52
|
+
* @param predicate Search query.
|
|
53
|
+
* @param start start index.
|
|
54
|
+
* @param end end index.
|
|
55
|
+
*/
|
|
56
|
+
match(predicate = new Map(), start = 0, end = Infinity) {
|
|
57
|
+
this._dataRequested$.next();
|
|
58
|
+
this._dataLoading$.next(true);
|
|
59
|
+
const searchParam = new Map();
|
|
60
|
+
if (typeof predicate === 'string') {
|
|
61
|
+
searchParam.set('query', predicate);
|
|
62
|
+
}
|
|
63
|
+
else if (predicate instanceof Map) {
|
|
64
|
+
predicate.forEach((v, k) => searchParam.set(k, v));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
throw new Error('DataSource.match() predicate can only accepts string and Map');
|
|
68
|
+
}
|
|
69
|
+
if (!searchParam.has('limit') && !this.limitless) {
|
|
70
|
+
searchParam.set('limit', BaseDataSource.MaxLimit);
|
|
71
|
+
}
|
|
72
|
+
this.dataProvider
|
|
73
|
+
.fetch(searchParam, start, end)
|
|
74
|
+
.pipe(takeUntil(this._destroy$))
|
|
75
|
+
.subscribe({
|
|
76
|
+
next: (result) => {
|
|
77
|
+
this._dataReceived$.next();
|
|
78
|
+
this._dataLoading$.next(false);
|
|
79
|
+
this._dataChanges$.next(result);
|
|
80
|
+
},
|
|
81
|
+
error: () => {
|
|
82
|
+
this._dataReceived$.next();
|
|
83
|
+
this._dataLoading$.next(false);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Closes the stream
|
|
89
|
+
*/
|
|
90
|
+
unsubscribe() {
|
|
91
|
+
this._destroy$.next();
|
|
92
|
+
this._destroy$.complete();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Max limit of items to be returned.
|
|
97
|
+
*/
|
|
98
|
+
BaseDataSource.MaxLimit = 5;
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYXRhLXNvdXJjZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2RrL3NyYy9saWIvZGF0YS1zb3VyY2UvYmFzZS9iYXNlLWRhdGEtc291cmNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUkzQyxNQUFNLE9BQWdCLGNBQWM7SUF1RGhDLGNBQWM7SUFDZCxZQUE2QixZQUF1QztRQUF2QyxpQkFBWSxHQUFaLFlBQVksQ0FBMkI7UUFsRHBFOztXQUVHO1FBQ0gsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixjQUFjO1FBQ0ssa0JBQWEsR0FBeUIsSUFBSSxlQUFlLENBQU0sRUFBRSxDQUFDLENBQUM7UUFDdEYsY0FBYztRQUNLLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUN6RCxjQUFjO1FBQ0ssbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3hELGNBQWM7UUFDSyxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUVuRCxjQUFjO1FBQ0ssa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQW1DQSxDQUFDO0lBakN4RTs7O09BR0c7SUFDSCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBS0Q7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsWUFBMEMsSUFBSSxHQUFHLEVBQWtCLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsUUFBUTtRQUNoRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFFOUIsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDL0IsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDdkM7YUFBTSxJQUFJLFNBQVMsWUFBWSxHQUFHLEVBQUU7WUFDakMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEQ7YUFBTTtZQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztTQUNuRjtRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUM5QyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDckQ7UUFFRCxJQUFJLENBQUMsWUFBWTthQUNaLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQzthQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMvQixTQUFTLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxNQUFXLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNSLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLENBQUM7U0FDSixDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzlCLENBQUM7O0FBdEdEOztHQUVHO0FBQ2EsdUJBQVEsR0FBRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERhdGFTb3VyY2VQcm92aWRlciB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBBYnN0cmFjdERhdGFQcm92aWRlciB9IGZyb20gJy4vYWJzdHJhY3QtZGF0YS1wcm92aWRlci5jbGFzcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRGF0YVNvdXJjZTxUPiBpbXBsZW1lbnRzIERhdGFTb3VyY2VQcm92aWRlcjxUPiB7XG4gICAgLyoqXG4gICAgICogTWF4IGxpbWl0IG9mIGl0ZW1zIHRvIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBNYXhMaW1pdCA9IDU7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBsaW1pdCBvZiBtYXggaXRlbXMuXG4gICAgICovXG4gICAgbGltaXRsZXNzID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZGF0YUNoYW5nZXMkOiBCZWhhdmlvclN1YmplY3Q8VFtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VFtdPihbXSk7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2RhdGFSZXF1ZXN0ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZGF0YVJlY2VpdmVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kYXRhTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBuZXcgZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZVxuICAgICAqL1xuICAgIGdldCBkYXRhUmVxdWVzdGVkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVJlcXVlc3RlZCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIG5ldyBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLlxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGVcbiAgICAgKi9cbiAgICBnZXQgZGF0YVJlY2VpdmVkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVJlY2VpdmVkJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gbG9hZGluZyBzdGF0ZSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUuXG4gICAgICovXG4gICAgZ2V0IGRhdGFMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YUxvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHdoZW4gZGF0YSBmcm9tIHRoZSBwcm92aWRlcyBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgZGF0YSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKi9cbiAgICBnZXQgZGF0YUNoYW5nZXMoKTogT2JzZXJ2YWJsZTxUW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFDaGFuZ2VzJC5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhUHJvdmlkZXI6IEFic3RyYWN0RGF0YVByb3ZpZGVyPGFueT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2hlcyB0aHJvdWdoIHRoZSBkYXRhIHNvdXJjZSB3aXRoIGRlZmluZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gcHJlZGljYXRlIFNlYXJjaCBxdWVyeS5cbiAgICAgKiBAcGFyYW0gc3RhcnQgc3RhcnQgaW5kZXguXG4gICAgICogQHBhcmFtIGVuZCBlbmQgaW5kZXguXG4gICAgICovXG4gICAgbWF0Y2gocHJlZGljYXRlOiBzdHJpbmcgfCBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSwgc3RhcnQgPSAwLCBlbmQgPSBJbmZpbml0eSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kYXRhUmVxdWVzdGVkJC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX2RhdGFMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgICBjb25zdCBzZWFyY2hQYXJhbSA9IG5ldyBNYXAoKTtcblxuICAgICAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHNlYXJjaFBhcmFtLnNldCgncXVlcnknLCBwcmVkaWNhdGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHByZWRpY2F0ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgcHJlZGljYXRlLmZvckVhY2goKHYsIGspID0+IHNlYXJjaFBhcmFtLnNldChrLCB2KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGFTb3VyY2UubWF0Y2goKSBwcmVkaWNhdGUgY2FuIG9ubHkgYWNjZXB0cyBzdHJpbmcgYW5kIE1hcCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZWFyY2hQYXJhbS5oYXMoJ2xpbWl0JykgJiYgIXRoaXMubGltaXRsZXNzKSB7XG4gICAgICAgICAgICBzZWFyY2hQYXJhbS5zZXQoJ2xpbWl0JywgQmFzZURhdGFTb3VyY2UuTWF4TGltaXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJcbiAgICAgICAgICAgIC5mZXRjaChzZWFyY2hQYXJhbSwgc3RhcnQsIGVuZClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAocmVzdWx0OiBUW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YVJlY2VpdmVkJC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YUNoYW5nZXMkLm5leHQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFSZWNlaXZlZCQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBzdHJlYW1cbiAgICAgKi9cbiAgICB1bnN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiJdfQ==
|