@firestitch/filter 13.4.1 → 14.0.0
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/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/16/25/214635fa124a83a4fe3a52bde70e7124d9d011a5d176790a9c607bf1f5ed27cadefc4a1b5a225c0bda11250a180ca5798773e0c108e8d5e2d8559d2f9eed +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/44/f9/ee834587d4ac4a429d8c4af2e1562028c7432ac179f9699f2990ab3dadc8e4f66ae45bf22625aedf47fad137e2de39a9b99141784e56d5123544f90c922a +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/4d/89/993c2eaff9e0cfca023676bf3f2d3d446f6b6cc90eec839075529d155102b2808a8b44e259d357704acd43143c12af5a5916b4e291a799164b722142ee8e +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/52/cb/71f80b48163c432fcb05ac0f736ae7cae10318713c98c74739b3eb5d83ebce635b1a7c77d357b1a4b13a9ae9cfe43348538e4336c25c234551f1e80f0567 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/54/f6/73f0d8ea64a18aa71d80a2cf99d6eb4a2cd345e943127e018913d0f76e9575fabe3aee5002ee4da996e661662d474ad31e9a77f2858c68eed532c2d45d47 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/61/84/7f56389ef39faf5c5b6ad292f668ec6cc5cb6e476d94b1740bdadb9832e3de22a0032b90811f02c80d3d56be5f5e32d8bb900e17ebcb09db379befddc221 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/69/d3/d48ad36dd0a576c4d6f8af3a2ee671037639b0a8d91679992dcbd9dabc284bf316c3126201837e931a162f23cdc4a505608bb64df8e87f59a17364890873 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/70/92/ac80dcd48732b949f163abf36c48b0912598d2bb66e5c1f2056fef872f59fb1b591abbf3bfdbf461a46cbd507eea05a6bd0f14ba3d573f1684cbc78bd094 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/73/10/12664696206dcdab6b084331532b234c439acef8a6428af667a2e1bb1c15e2055b3ac70f44fd8bf508396d3e11a798b40849fd66dbdbd0ff9d9d7e780edd +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/74/f6/4c2db73499d08279895e1ab6e2fb65baa613d31218b6968f74143ba03819c72a2720b927ca5a708dd484c0bc6763124e62ce9c2e652f71b740cb2d29ae03 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/78/30/8eedd8d752a08df898806b01abde5b4c1809f6edcba95fcf112c006833b34986c295b62a7e47cd73297c3da78ca6072ef18ba502b6efdd6048dbdbbcd257 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/8c/f8/d9f30e3e898c99e8c3157d4c9157dead1b1115ea4db50aced0c33713cd394bb770b182d1d5087c821d22b2abb99e288191ba9e30954ea4ed9ab6ff70d391 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/8d/53/ad58764bc240411378ae1c47c0c20525da378a3b143795a11bc3fdbf6c9cde6fb2de6c3947d673d5872b9ce205d6274114b3b4dfd27609a636df7fd0b600 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/8f/74/3ed29367f32f9c909f5898704561eb1ebe5cdabba507ba08cbeeaeecd274d020b1401ba871938be899025a265299f8be66c59d59b574a996a74b2987d98e +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/a1/ac/1dbcf215585477c3f70180cb40186b5119d9ad1d27b2e0dcde66034c950e334ce0577409535c29bb15d2e6c9238eb9e841177fc62d3949a58bbbb397238d +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/a3/08/068a7a29e9cc2385b62d4b0fc14b04a7f09ed469d9b79bb754e37d4933b0ab8aa171b286080e20a11e67f42b8558a4bda64aa03ca097001ecda5c25a9015 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/ae/6c/352ab77e603fa53f25ab95cd6fd19a230095b212464689ab76c89db8d97bd0f221c27fbd84d0767fb5ce7e33f5feb175a9256ab35cf216d30dd3263b6b14 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/content-v2/sha512/b6/38/eb8a1b6bd6265968335935cbc2763fbcbb9cd4e32dd58a5234bfd87379ee840044338eeae5f126da9936d21ed423071cfbca6748ee153235addf874824f7 +1 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/01/3c/d4dca899e5bd80c43ed2e78ec79687adc272ff835d03f0ae48cb881ddd83 +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/05/a7/da2d9625c1bc294409dbf750062e363a1abbe39b51177bfb7e5a9aa9ae81 +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/08/f1/b2e705e45544df7c77f4238b558d569a1215422c2086df9140963f960eef +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/21/1d/398c87beb2402502d4e706beedd98ea707f31b441d6aa7711eef62a0439b +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/26/0b/ee2b1cad7f114e99f8d4da848bd6ceb4e849178b50723d9dcd10f39fb05c +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/26/98/b8614f38ea6fefe80f96f06adb98d925eccfae9eec0937c645a42034614c +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/64/4d/18a7b240783e7b3de33ad33724d2b43e8f3349e840ccab571ca3c6c51c00 +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/64/70/77036e049a76cab5a64caa9cba4b603631c7e9e2f47e6c5fbc7f39d67a2f +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/6c/5d/700bf777ddebfd9b8f15e2709674069747b6fcd37376049712828252ca92 +3 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/71/89/4e4e3808e28a4a95a98391ab38f87f165ae234aefd4231092d1f531f56b3 +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/7c/c2/bd7b21a07f8b1da7797f40df86dc4289416305c26464c6b965a336fd3975 +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/85/64/cb2f22b4df13a70eb519564e382de3d7dd3747bc0cab1109017f8934cff8 +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/96/b1/2730596477eee53fc70082999f48e373f6795e68d21e04234a45131added +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/af/e4/165326aa8daa8e07ac9e02bde3d64a31b00d1b2b59a797a51a89456d2ad6 +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/cd/96/32e83b96bce723e8ad58fdb7c43cf0002b3e0561309899e8b2a75204cbff +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/dd/38/1f423a0e17cf4e99ef3c880daeb533cdce9275226cb2f617aed52e881e59 +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/e4/e8/f48bdfbec024c932fd928e4db790b6454d090d4db31e9d69201a5e1ea466 +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/ee/59/16a63690de125da5067876d4ccf122230175174f3489e48893448bcbdcd3 +2 -0
- package/.angular/cache/14.2.13/ng-packagr/index-v5/fd/46/71e9d6d1a123ed68ce03aa617dcaaad4ad9c5a9193f1281166766c453621 +3 -0
- package/.angulardoc.json +4 -0
- package/.editorconfig +15 -0
- package/.eslintrc.json +9 -0
- package/.gitmodules +3 -0
- package/angular.json +163 -0
- package/babel.config.js +11 -0
- package/jest.config.js +24 -0
- package/{app → package/app}/classes/actions-controller.d.ts +41 -41
- package/{app → package/app}/components/action-button/action-button.component.d.ts +9 -9
- package/{app → package/app}/components/action-kebab-actions/action-kebab-actions.component.d.ts +7 -7
- package/{app → package/app}/components/actions/actions.component.d.ts +13 -13
- package/{app → package/app}/components/filter/filter.component.d.ts +204 -204
- package/{app → package/app}/components/filter-chip/filter-chip.component.d.ts +26 -26
- package/{app → package/app}/components/filter-chip-content/filter-chip-content.component.d.ts +18 -18
- package/{app → package/app}/components/filter-chips/filter-chips.component.d.ts +9 -9
- package/{app → package/app}/components/filter-drawer/filter-drawer.component.d.ts +30 -30
- package/{app → package/app}/components/filter-drawer-actions/filter-drawer-actions.component.d.ts +15 -15
- package/{app → package/app}/components/filters-item/autocomplete/autocomplete.component.d.ts +14 -14
- package/{app → package/app}/components/filters-item/autocompletechips/autocompletechips.component.d.ts +16 -16
- package/{app → package/app}/components/filters-item/base-item/base-item.component.d.ts +25 -25
- package/{app → package/app}/components/filters-item/checkbox/checkbox.component.d.ts +11 -11
- package/{app → package/app}/components/filters-item/chips/chips.component.d.ts +13 -13
- package/{app → package/app}/components/filters-item/date/date.component.d.ts +20 -20
- package/{app → package/app}/components/filters-item/date-range/date-range.component.d.ts +15 -15
- package/{app → package/app}/components/filters-item/filter-item.component.d.ts +39 -39
- package/{app → package/app}/components/filters-item/range/range.component.d.ts +15 -15
- package/{app → package/app}/components/filters-item/select/backdrop/backdrop.component.d.ts +6 -6
- package/{app → package/app}/components/filters-item/select/groups/groups.component.d.ts +12 -12
- package/{app → package/app}/components/filters-item/select/multiple/multiple.component.d.ts +15 -15
- package/{app → package/app}/components/filters-item/select/select.component.d.ts +23 -23
- package/{app → package/app}/components/filters-item/select/simple/simple.component.d.ts +14 -14
- package/{app → package/app}/components/filters-item/text/text.component.d.ts +19 -19
- package/{app → package/app}/components/filters-item/week/week.component.d.ts +12 -12
- package/{app → package/app}/components/saved-filter/index.d.ts +3 -3
- package/{app → package/app}/components/saved-filter/saved-filter-edit/index.d.ts +1 -1
- package/{app → package/app}/components/saved-filter/saved-filter-edit/saved-filter-edit.component.d.ts +18 -18
- package/{app → package/app}/components/saved-filter/saved-filter-manage/index.d.ts +1 -1
- package/{app → package/app}/components/saved-filter/saved-filter-manage/saved-filter-manage.component.d.ts +16 -16
- package/{app → package/app}/components/saved-filter/saved-filters-menu/index.d.ts +1 -1
- package/{app → package/app}/components/saved-filter/saved-filters-menu/saved-filters-menu.component.d.ts +23 -23
- package/{app → package/app}/consts/query-param-delimiter.d.ts +1 -1
- package/{app → package/app}/directives/focus-to-item/focus-to-item.directive.d.ts +27 -27
- package/{app → package/app}/directives/status-bar/status-bar.directive.d.ts +8 -8
- package/{app → package/app}/enums/action-mode.enum.d.ts +6 -6
- package/{app → package/app}/enums/action-type.enum.d.ts +9 -9
- package/{app → package/app}/enums/button-style.d.ts +9 -9
- package/{app → package/app}/enums/index.d.ts +6 -6
- package/{app → package/app}/enums/item-date-mode.enum.d.ts +5 -5
- package/{app → package/app}/enums/item-type.enum.d.ts +15 -15
- package/{app → package/app}/enums/picker-view-type.enum.d.ts +7 -7
- package/{app → package/app}/fs-filter.module.d.ts +70 -70
- package/{app → package/app}/helpers/build-query-params.d.ts +3 -3
- package/{app → package/app}/helpers/compare.d.ts +2 -2
- package/{app → package/app}/helpers/create-filter-item.d.ts +14 -14
- package/{app → package/app}/helpers/find-value.d.ts +1 -1
- package/{app → package/app}/helpers/get-range-name.d.ts +1 -1
- package/{app → package/app}/helpers/parse-date.d.ts +1 -1
- package/{app → package/app}/helpers/parse-item-value-from-stored.d.ts +1 -1
- package/{app → package/app}/helpers/query-param-transformers.d.ts +2 -2
- package/{app → package/app}/helpers/restore-items.d.ts +12 -12
- package/{app → package/app}/injectors/filter-config.d.ts +2 -2
- package/{app → package/app}/injectors/filter-drawer-data.d.ts +2 -2
- package/{app → package/app}/injectors/filter-drawer-overlay.d.ts +2 -2
- package/{app → package/app}/interfaces/action.interface.d.ts +81 -81
- package/{app → package/app}/interfaces/config.interface.d.ts +66 -66
- package/{app → package/app}/interfaces/external-params.interface.d.ts +3 -3
- package/{app → package/app}/interfaces/filter.interface.d.ts +4 -4
- package/{app → package/app}/interfaces/index.d.ts +6 -6
- package/{app → package/app}/interfaces/items/autocomplete-chips.interface.d.ts +15 -15
- package/{app → package/app}/interfaces/items/autocomplete.interface.d.ts +9 -9
- package/{app → package/app}/interfaces/items/base.interface.d.ts +29 -29
- package/{app → package/app}/interfaces/items/checkbox.interface.d.ts +7 -7
- package/{app → package/app}/interfaces/items/chips.interface.d.ts +6 -6
- package/{app → package/app}/interfaces/items/date-range.interface.d.ts +8 -8
- package/{app → package/app}/interfaces/items/date.interface.d.ts +7 -7
- package/{app → package/app}/interfaces/items/range.interface.d.ts +13 -13
- package/{app → package/app}/interfaces/items/select.interface.d.ts +20 -20
- package/{app → package/app}/interfaces/items/text.interface.d.ts +9 -9
- package/{app → package/app}/interfaces/items/week.interface.d.ts +7 -7
- package/{app → package/app}/interfaces/saved-filters.interface.d.ts +18 -18
- package/{app → package/app}/interfaces/update-filter-item.interface.d.ts +4 -4
- package/{app → package/app}/models/action-menu-item.model.d.ts +23 -23
- package/{app → package/app}/models/action.model.d.ts +54 -54
- package/{app → package/app}/models/filter-config.d.ts +31 -31
- package/{app → package/app}/models/items/autocomplete/base-autocomplete-item.d.ts +12 -12
- package/{app → package/app}/models/items/autocomplete-chips-item.d.ts +20 -20
- package/{app → package/app}/models/items/autocomplete-item.d.ts +11 -11
- package/{app → package/app}/models/items/base-item.d.ts +80 -80
- package/{app → package/app}/models/items/checkbox-item.d.ts +17 -17
- package/{app → package/app}/models/items/chips-item.d.ts +18 -18
- package/{app → package/app}/models/items/date/base-date-item.d.ts +14 -14
- package/{app → package/app}/models/items/date-item.d.ts +8 -8
- package/{app → package/app}/models/items/date-range/base-date-range-item.d.ts +21 -21
- package/{app → package/app}/models/items/date-range-item.d.ts +6 -6
- package/{app → package/app}/models/items/date-time-item.d.ts +7 -7
- package/{app → package/app}/models/items/date-time-range-item.d.ts +6 -6
- package/{app → package/app}/models/items/range-item.d.ts +23 -23
- package/{app → package/app}/models/items/select/base-select-item.d.ts +13 -13
- package/{app → package/app}/models/items/select/multiple-select-item.d.ts +14 -14
- package/{app → package/app}/models/items/select/simple-select-item.d.ts +14 -14
- package/{app → package/app}/models/items/select-item.d.ts +8 -8
- package/{app → package/app}/models/items/text-item.d.ts +15 -15
- package/{app → package/app}/models/items/week-item.d.ts +18 -18
- package/{app → package/app}/pipes/remove-isolate-value.pipe.d.ts +8 -8
- package/{app → package/app}/providers/filter-meta.d.ts +5 -5
- package/{app → package/app}/services/external-params/persistance-params-controller.service.d.ts +22 -22
- package/{app → package/app}/services/external-params/query-params-controller.service.d.ts +22 -22
- package/{app → package/app}/services/external-params/saved-filters-controller.service.d.ts +40 -40
- package/{app → package/app}/services/external-params-controller.service.d.ts +42 -42
- package/{app → package/app}/services/filter-overlay.service.d.ts +36 -36
- package/{app → package/app}/services/focus-controller.service.d.ts +18 -18
- package/{app → package/app}/services/items-store.service.d.ts +69 -69
- package/{esm2020 → package/esm2020}/app/classes/actions-controller.mjs +126 -126
- package/{esm2020 → package/esm2020}/app/components/action-button/action-button.component.mjs +21 -21
- package/{esm2020 → package/esm2020}/app/components/action-kebab-actions/action-kebab-actions.component.mjs +16 -16
- package/{esm2020 → package/esm2020}/app/components/actions/actions.component.mjs +41 -41
- package/{esm2020 → package/esm2020}/app/components/filter/filter.component.mjs +613 -613
- package/{esm2020 → package/esm2020}/app/components/filter-chip/filter-chip.component.mjs +85 -85
- package/{esm2020 → package/esm2020}/app/components/filter-chip-content/filter-chip-content.component.mjs +78 -78
- package/{esm2020 → package/esm2020}/app/components/filter-chips/filter-chips.component.mjs +18 -18
- package/{esm2020 → package/esm2020}/app/components/filter-drawer/filter-drawer.component.mjs +70 -70
- package/{esm2020 → package/esm2020}/app/components/filter-drawer-actions/filter-drawer-actions.component.mjs +40 -40
- package/{esm2020 → package/esm2020}/app/components/filters-item/autocomplete/autocomplete.component.mjs +26 -26
- package/{esm2020 → package/esm2020}/app/components/filters-item/autocompletechips/autocompletechips.component.mjs +41 -41
- package/{esm2020 → package/esm2020}/app/components/filters-item/base-item/base-item.component.mjs +62 -62
- package/{esm2020 → package/esm2020}/app/components/filters-item/checkbox/checkbox.component.mjs +20 -20
- package/{esm2020 → package/esm2020}/app/components/filters-item/chips/chips.component.mjs +27 -27
- package/{esm2020 → package/esm2020}/app/components/filters-item/date/date.component.mjs +42 -42
- package/{esm2020 → package/esm2020}/app/components/filters-item/date-range/date-range.component.mjs +33 -33
- package/{esm2020 → package/esm2020}/app/components/filters-item/filter-item.component.mjs +79 -79
- package/{esm2020 → package/esm2020}/app/components/filters-item/range/range.component.mjs +44 -44
- package/{esm2020 → package/esm2020}/app/components/filters-item/select/backdrop/backdrop.component.mjs +11 -11
- package/{esm2020 → package/esm2020}/app/components/filters-item/select/groups/groups.component.mjs +29 -29
- package/{esm2020 → package/esm2020}/app/components/filters-item/select/multiple/multiple.component.mjs +56 -56
- package/{esm2020 → package/esm2020}/app/components/filters-item/select/select.component.mjs +50 -50
- package/{esm2020 → package/esm2020}/app/components/filters-item/select/simple/simple.component.mjs +42 -42
- package/package/esm2020/app/components/filters-item/text/text.component.mjs +49 -0
- package/{esm2020 → package/esm2020}/app/components/filters-item/week/week.component.mjs +24 -24
- package/{esm2020 → package/esm2020}/app/components/saved-filter/index.mjs +3 -3
- package/{esm2020 → package/esm2020}/app/components/saved-filter/saved-filter-edit/index.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/components/saved-filter/saved-filter-edit/saved-filter-edit.component.mjs +49 -49
- package/{esm2020 → package/esm2020}/app/components/saved-filter/saved-filter-manage/index.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.mjs +39 -39
- package/{esm2020 → package/esm2020}/app/components/saved-filter/saved-filters-menu/index.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/components/saved-filter/saved-filters-menu/saved-filters-menu.component.mjs +51 -51
- package/{esm2020 → package/esm2020}/app/consts/query-param-delimiter.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/directives/focus-to-item/focus-to-item.directive.mjs +129 -129
- package/{esm2020 → package/esm2020}/app/directives/status-bar/status-bar.directive.mjs +15 -15
- package/{esm2020 → package/esm2020}/app/enums/action-mode.enum.mjs +7 -7
- package/{esm2020 → package/esm2020}/app/enums/action-type.enum.mjs +11 -11
- package/{esm2020 → package/esm2020}/app/enums/button-style.mjs +10 -10
- package/{esm2020 → package/esm2020}/app/enums/index.mjs +6 -6
- package/{esm2020 → package/esm2020}/app/enums/item-date-mode.enum.mjs +6 -6
- package/{esm2020 → package/esm2020}/app/enums/item-type.enum.mjs +16 -16
- package/{esm2020 → package/esm2020}/app/enums/picker-view-type.enum.mjs +8 -8
- package/{esm2020 → package/esm2020}/app/fs-filter.module.mjs +261 -263
- package/{esm2020 → package/esm2020}/app/helpers/build-query-params.mjs +32 -32
- package/{esm2020 → package/esm2020}/app/helpers/compare.mjs +37 -37
- package/{esm2020 → package/esm2020}/app/helpers/create-filter-item.mjs +54 -54
- package/{esm2020 → package/esm2020}/app/helpers/find-value.mjs +12 -12
- package/{esm2020 → package/esm2020}/app/helpers/get-range-name.mjs +8 -8
- package/{esm2020 → package/esm2020}/app/helpers/parse-date.mjs +7 -7
- package/{esm2020 → package/esm2020}/app/helpers/parse-item-value-from-stored.mjs +80 -80
- package/{esm2020 → package/esm2020}/app/helpers/query-param-transformers.mjs +8 -8
- package/{esm2020 → package/esm2020}/app/helpers/restore-items.mjs +48 -48
- package/{esm2020 → package/esm2020}/app/injectors/filter-config.mjs +2 -2
- package/{esm2020 → package/esm2020}/app/injectors/filter-drawer-data.mjs +2 -2
- package/{esm2020 → package/esm2020}/app/injectors/filter-drawer-overlay.mjs +2 -2
- package/{esm2020 → package/esm2020}/app/interfaces/action.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/config.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/external-params.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/filter.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/index.mjs +6 -6
- package/{esm2020 → package/esm2020}/app/interfaces/items/autocomplete-chips.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/items/autocomplete.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/items/base.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/items/checkbox.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/items/chips.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/items/date-range.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/items/date.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/items/range.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/items/select.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/items/text.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/items/week.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/saved-filters.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/interfaces/update-filter-item.interface.mjs +1 -1
- package/{esm2020 → package/esm2020}/app/models/action-menu-item.model.mjs +66 -66
- package/{esm2020 → package/esm2020}/app/models/action.model.mjs +129 -129
- package/{esm2020 → package/esm2020}/app/models/filter-config.mjs +66 -66
- package/{esm2020 → package/esm2020}/app/models/items/autocomplete/base-autocomplete-item.mjs +13 -13
- package/{esm2020 → package/esm2020}/app/models/items/autocomplete-chips-item.mjs +60 -60
- package/{esm2020 → package/esm2020}/app/models/items/autocomplete-item.mjs +32 -32
- package/{esm2020 → package/esm2020}/app/models/items/base-item.mjs +233 -233
- package/{esm2020 → package/esm2020}/app/models/items/checkbox-item.mjs +49 -49
- package/{esm2020 → package/esm2020}/app/models/items/chips-item.mjs +88 -88
- package/{esm2020 → package/esm2020}/app/models/items/date/base-date-item.mjs +47 -47
- package/{esm2020 → package/esm2020}/app/models/items/date-item.mjs +18 -18
- package/{esm2020 → package/esm2020}/app/models/items/date-range/base-date-range-item.mjs +134 -134
- package/{esm2020 → package/esm2020}/app/models/items/date-range-item.mjs +6 -6
- package/{esm2020 → package/esm2020}/app/models/items/date-time-item.mjs +9 -9
- package/{esm2020 → package/esm2020}/app/models/items/date-time-range-item.mjs +6 -6
- package/{esm2020 → package/esm2020}/app/models/items/range-item.mjs +82 -82
- package/{esm2020 → package/esm2020}/app/models/items/select/base-select-item.mjs +36 -36
- package/{esm2020 → package/esm2020}/app/models/items/select/multiple-select-item.mjs +87 -87
- package/{esm2020 → package/esm2020}/app/models/items/select/simple-select-item.mjs +65 -65
- package/{esm2020 → package/esm2020}/app/models/items/select-item.mjs +10 -10
- package/{esm2020 → package/esm2020}/app/models/items/text-item.mjs +33 -33
- package/{esm2020 → package/esm2020}/app/models/items/week-item.mjs +93 -93
- package/{esm2020 → package/esm2020}/app/pipes/remove-isolate-value.pipe.mjs +20 -20
- package/{esm2020 → package/esm2020}/app/providers/filter-meta.mjs +9 -9
- package/{esm2020 → package/esm2020}/app/services/external-params/persistance-params-controller.service.mjs +57 -57
- package/{esm2020 → package/esm2020}/app/services/external-params/query-params-controller.service.mjs +61 -61
- package/{esm2020 → package/esm2020}/app/services/external-params/saved-filters-controller.service.mjs +162 -162
- package/{esm2020 → package/esm2020}/app/services/external-params-controller.service.mjs +178 -178
- package/{esm2020 → package/esm2020}/app/services/filter-overlay.service.mjs +121 -121
- package/{esm2020 → package/esm2020}/app/services/focus-controller.service.mjs +29 -29
- package/{esm2020 → package/esm2020}/app/services/items-store.service.mjs +344 -344
- package/{esm2020 → package/esm2020}/firestitch-filter.mjs +4 -4
- package/{esm2020 → package/esm2020}/public_api.mjs +35 -35
- package/{fesm2015 → package/fesm2015}/firestitch-filter.mjs +4383 -4385
- package/package/fesm2015/firestitch-filter.mjs.map +1 -0
- package/{fesm2020 → package/fesm2020}/firestitch-filter.mjs +4372 -4374
- package/package/fesm2020/firestitch-filter.mjs.map +1 -0
- package/{firestitch-filter.d.ts → package/index.d.ts} +5 -5
- package/package/package.json +56 -0
- package/{public_api.d.ts → package/public_api.d.ts} +40 -40
- package/package/styles.scss +0 -0
- package/package.json +79 -22
- package/tsconfig.compodoc.json +12 -0
- package/tsconfig.json +10 -0
- package/tslint.json +8 -0
- package/esm2020/app/components/filters-item/text/text.component.mjs +0 -49
- package/fesm2015/firestitch-filter.mjs.map +0 -1
- package/fesm2020/firestitch-filter.mjs.map +0 -1
- /package/{styles.scss → README.MD} +0 -0
|
@@ -1,345 +1,345 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, forkJoin, Subject } from 'rxjs';
|
|
3
|
-
import { debounceTime, filter, finalize, takeUntil } from 'rxjs/operators';
|
|
4
|
-
import { pickBy } from 'lodash-es';
|
|
5
|
-
import { ItemType } from '../enums/item-type.enum';
|
|
6
|
-
import { createFilterItem } from '../helpers/create-filter-item';
|
|
7
|
-
import { SORT_BY_FIELD, SORT_DIRECTION_FIELD } from '../models/filter-config';
|
|
8
|
-
import { BaseDateRangeItem } from '../models/items/date-range/base-date-range-item';
|
|
9
|
-
import { RangeItem } from '../models/items/range-item';
|
|
10
|
-
import { MultipleSelectItem } from '../models/items/select/multiple-select-item';
|
|
11
|
-
import { SimpleSelectItem } from '../models/items/select/simple-select-item';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
export class FsFilterItemsStore {
|
|
14
|
-
constructor() {
|
|
15
|
-
this.sortByItem = null;
|
|
16
|
-
this.sortDirectionItem = null;
|
|
17
|
-
this.keywordItem = null;
|
|
18
|
-
this._ready$ = new BehaviorSubject(false);
|
|
19
|
-
this._items = [];
|
|
20
|
-
this._visibleItems$ = new BehaviorSubject([]);
|
|
21
|
-
this._itemsByName = new Map();
|
|
22
|
-
this._itemsValuesLoaded = false;
|
|
23
|
-
this._hasKeyword = false;
|
|
24
|
-
this._itemsChange$ = new Subject();
|
|
25
|
-
this._destroy$ = new Subject();
|
|
26
|
-
this._lazyInit();
|
|
27
|
-
}
|
|
28
|
-
get items() {
|
|
29
|
-
return this._items;
|
|
30
|
-
}
|
|
31
|
-
get itemNames() {
|
|
32
|
-
return this._items.map((item) => item.name);
|
|
33
|
-
}
|
|
34
|
-
get visibleItems() {
|
|
35
|
-
return this._visibleItems$.getValue();
|
|
36
|
-
}
|
|
37
|
-
set visibleItems(items) {
|
|
38
|
-
this._visibleItems$.next(items);
|
|
39
|
-
}
|
|
40
|
-
get visibleItems$() {
|
|
41
|
-
return this._visibleItems$.asObservable();
|
|
42
|
-
}
|
|
43
|
-
get hasKeyword() {
|
|
44
|
-
return this._hasKeyword;
|
|
45
|
-
}
|
|
46
|
-
get itemsChange$() {
|
|
47
|
-
return this._itemsChange$.pipe(debounceTime(30));
|
|
48
|
-
}
|
|
49
|
-
get ready$() {
|
|
50
|
-
return this._ready$.asObservable();
|
|
51
|
-
}
|
|
52
|
-
ngOnDestroy() {
|
|
53
|
-
this.destroyItems();
|
|
54
|
-
this._destroy$.next();
|
|
55
|
-
this._destroy$.complete();
|
|
56
|
-
}
|
|
57
|
-
setConfig(config) {
|
|
58
|
-
this._itemsByName.clear();
|
|
59
|
-
this._config = config;
|
|
60
|
-
this.initItems(config.items);
|
|
61
|
-
}
|
|
62
|
-
getItemByName(name) {
|
|
63
|
-
return this._itemsByName.get(name);
|
|
64
|
-
}
|
|
65
|
-
initItems(items) {
|
|
66
|
-
this._itemsValuesLoaded = false;
|
|
67
|
-
if (Array.isArray(items)) {
|
|
68
|
-
this._createItems(items);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
filtersClear() {
|
|
72
|
-
this.items.forEach((item) => {
|
|
73
|
-
if (item instanceof RangeItem) {
|
|
74
|
-
item.clearRange(null, item.defaultValue);
|
|
75
|
-
}
|
|
76
|
-
else if (item instanceof BaseDateRangeItem) {
|
|
77
|
-
item.clearDateRange(null, item.defaultValue);
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
item.clear(item.defaultValue);
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
if (this.sortByItem) {
|
|
84
|
-
if (this._config.sort) {
|
|
85
|
-
this.sortByItem.model = this._config.sort.value;
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
this.sortByItem.clear(this.sortByItem.defaultValue);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
if (this.sortDirectionItem) {
|
|
92
|
-
if (this._config.sort) {
|
|
93
|
-
this.sortDirectionItem.model = this._config.sort.direction;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
this.sortDirectionItem.clear(this.sortDirectionItem.defaultValue);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
this.keywordItem?.clear();
|
|
100
|
-
}
|
|
101
|
-
loadAsyncValues() {
|
|
102
|
-
this.items
|
|
103
|
-
.filter((item) => item.hasPendingValues)
|
|
104
|
-
.forEach((item) => item.loadAsyncValues());
|
|
105
|
-
}
|
|
106
|
-
loadAsyncDefaults() {
|
|
107
|
-
// default values can be asynchronous, and we must load them if there is no persisted value instead
|
|
108
|
-
const defaultValuesToBeLoaded = this.items
|
|
109
|
-
.filter((item) => {
|
|
110
|
-
return item.defaultValueFn
|
|
111
|
-
&& (item.persistedValue === null || item.persistedValue === undefined);
|
|
112
|
-
});
|
|
113
|
-
// special hack for isolate multiple select
|
|
114
|
-
// values for this type of select must be preloaded
|
|
115
|
-
// Read more in class MultipleSelectItem._init()
|
|
116
|
-
const valuesToBeLoaded = this.items
|
|
117
|
-
.filter((item) => {
|
|
118
|
-
return (item instanceof MultipleSelectItem) && item.hasPendingValues && item.isolate;
|
|
119
|
-
});
|
|
120
|
-
if (defaultValuesToBeLoaded.length > 0 || valuesToBeLoaded.length > 0) {
|
|
121
|
-
forkJoin([
|
|
122
|
-
...defaultValuesToBeLoaded
|
|
123
|
-
.map((item) => item.loadDefaultValue()),
|
|
124
|
-
...valuesToBeLoaded
|
|
125
|
-
.map((item) => {
|
|
126
|
-
item.loadAsyncValues();
|
|
127
|
-
return item.loading$
|
|
128
|
-
.pipe();
|
|
129
|
-
}),
|
|
130
|
-
])
|
|
131
|
-
.pipe(finalize(() => {
|
|
132
|
-
this._ready$.next(true);
|
|
133
|
-
}), takeUntil(this._destroy$))
|
|
134
|
-
.subscribe();
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
this._ready$.next(true);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
getSort() {
|
|
141
|
-
let sortBy = this.getSortByValue();
|
|
142
|
-
sortBy = sortBy === '__all' ? null : sortBy;
|
|
143
|
-
let sortDirection = this.getSortDirectionValue();
|
|
144
|
-
sortDirection = sortDirection === '__all' ? null : sortDirection;
|
|
145
|
-
return {
|
|
146
|
-
value: sortBy,
|
|
147
|
-
direction: sortDirection,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
getSortByValue() {
|
|
151
|
-
return this.sortByItem ? this.sortByItem.model : null;
|
|
152
|
-
}
|
|
153
|
-
getSortDirectionValue() {
|
|
154
|
-
return this.sortDirectionItem ? this.sortDirectionItem.model : null;
|
|
155
|
-
}
|
|
156
|
-
updateSort(sort) {
|
|
157
|
-
if (sort.sortBy) {
|
|
158
|
-
this.sortByItem.model = sort.sortBy;
|
|
159
|
-
}
|
|
160
|
-
if (sort.sortDirection) {
|
|
161
|
-
this.sortDirectionItem.model = sort.sortDirection;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
values(onlyPresented = false) {
|
|
165
|
-
return this.items
|
|
166
|
-
.reduce((acc, item) => {
|
|
167
|
-
const value = item.value;
|
|
168
|
-
if (!onlyPresented || value !== null) {
|
|
169
|
-
acc[item.name] = value;
|
|
170
|
-
}
|
|
171
|
-
return acc;
|
|
172
|
-
}, {});
|
|
173
|
-
}
|
|
174
|
-
valuesAsQuery({ onlyPresented = true, items = null, persisted = false, } = {}) {
|
|
175
|
-
const params = {};
|
|
176
|
-
(items || this.items)
|
|
177
|
-
.forEach((filterItem) => {
|
|
178
|
-
const values = persisted
|
|
179
|
-
? filterItem.persistanceObject
|
|
180
|
-
: filterItem.queryObject;
|
|
181
|
-
Object.assign(params, values);
|
|
182
|
-
});
|
|
183
|
-
if (onlyPresented) {
|
|
184
|
-
return pickBy(params, (val) => {
|
|
185
|
-
return val !== void 0;
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
return params;
|
|
189
|
-
}
|
|
190
|
-
init(p) {
|
|
191
|
-
this.items
|
|
192
|
-
.forEach((item) => {
|
|
193
|
-
item.initValues(p[item.name]);
|
|
194
|
-
});
|
|
195
|
-
this._initSortingItems(p);
|
|
196
|
-
this.loadAsyncDefaults();
|
|
197
|
-
this._subscribeToItemsChanges();
|
|
198
|
-
}
|
|
199
|
-
updateItemsWithValues(values) {
|
|
200
|
-
this.items
|
|
201
|
-
.forEach((item) => {
|
|
202
|
-
if (values[item.name]) {
|
|
203
|
-
item.model = values[item.name];
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
if (item instanceof RangeItem) {
|
|
207
|
-
item.clearRange(null, item.defaultValue);
|
|
208
|
-
}
|
|
209
|
-
else if (item instanceof BaseDateRangeItem) {
|
|
210
|
-
item.clearDateRange(null, item.defaultValue);
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
item.clear();
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
if (this.sortByItem) {
|
|
218
|
-
this.sortByItem.clear();
|
|
219
|
-
}
|
|
220
|
-
if (this.sortDirectionItem) {
|
|
221
|
-
this.sortDirectionItem.clear();
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
updateSortingItemsValues(items) {
|
|
225
|
-
this.sortByItem.values = items;
|
|
226
|
-
}
|
|
227
|
-
destroyItems() {
|
|
228
|
-
this.items
|
|
229
|
-
.forEach((item) => item.destroy());
|
|
230
|
-
this.sortByItem?.destroy();
|
|
231
|
-
this.sortDirectionItem?.destroy();
|
|
232
|
-
this._items = [];
|
|
233
|
-
this.sortByItem = null;
|
|
234
|
-
this.sortDirectionItem = null;
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Some items might need to load async values before they will be shown
|
|
238
|
-
*/
|
|
239
|
-
prepareItems() {
|
|
240
|
-
if (!this._itemsValuesLoaded) {
|
|
241
|
-
this._itemsValuesLoaded = true;
|
|
242
|
-
this.loadAsyncValues();
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
updateItemsVisiblity() {
|
|
246
|
-
this.visibleItems = this.items
|
|
247
|
-
.filter((item) => !item.isTypeKeyword && !item.hide);
|
|
248
|
-
}
|
|
249
|
-
_createItems(items) {
|
|
250
|
-
this._items = items
|
|
251
|
-
.filter((item) => !item.disable)
|
|
252
|
-
.filter((item) => {
|
|
253
|
-
if (this._itemsByName.has(item.name)) {
|
|
254
|
-
throw Error('Filter init error. Items name must be unique.');
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
this._itemsByName.set(item.name, null);
|
|
258
|
-
return true;
|
|
259
|
-
}
|
|
260
|
-
})
|
|
261
|
-
.map((item) => {
|
|
262
|
-
const filterItem = createFilterItem(item, { case: this._config.case }, this.filter);
|
|
263
|
-
if (filterItem.type === ItemType.Keyword) {
|
|
264
|
-
this._hasKeyword = true;
|
|
265
|
-
}
|
|
266
|
-
this._itemsByName.set(item.name, filterItem);
|
|
267
|
-
return filterItem;
|
|
268
|
-
});
|
|
269
|
-
this._createSortingItems();
|
|
270
|
-
}
|
|
271
|
-
_subscribeToItemsChanges() {
|
|
272
|
-
this.items
|
|
273
|
-
.forEach((item) => {
|
|
274
|
-
item.valueChange$
|
|
275
|
-
.pipe(takeUntil(item.destroy$))
|
|
276
|
-
.subscribe(() => {
|
|
277
|
-
this._itemsChange$.next(item);
|
|
278
|
-
});
|
|
279
|
-
});
|
|
280
|
-
if (this._config.sortValues?.length) {
|
|
281
|
-
this.sortByItem.valueChange$
|
|
282
|
-
.pipe(takeUntil(this.sortByItem.destroy$))
|
|
283
|
-
.subscribe(() => {
|
|
284
|
-
this._itemsChange$.next(this.sortByItem);
|
|
285
|
-
});
|
|
286
|
-
this.sortDirectionItem.valueChange$
|
|
287
|
-
.pipe(takeUntil(this.sortDirectionItem.destroy$))
|
|
288
|
-
.subscribe(() => {
|
|
289
|
-
this._itemsChange$.next(this.sortDirectionItem);
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
_lazyInit() {
|
|
294
|
-
this.ready$
|
|
295
|
-
.pipe(filter((state) => state), takeUntil(this._destroy$))
|
|
296
|
-
.subscribe(() => {
|
|
297
|
-
this.updateItemsVisiblity();
|
|
298
|
-
this._setKeywordItem();
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
_initSortingItems(p) {
|
|
302
|
-
if (this.sortByItem && this.sortDirectionItem) {
|
|
303
|
-
this.sortByItem.initValues(p[this.sortByItem.name]);
|
|
304
|
-
this.sortDirectionItem.initValues(p[this.sortDirectionItem.name]);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
_createSortingItems() {
|
|
308
|
-
if (this._config.sortValues?.length > 0) {
|
|
309
|
-
const sortByItem = {
|
|
310
|
-
name: SORT_BY_FIELD,
|
|
311
|
-
type: ItemType.Select,
|
|
312
|
-
label: 'Sort by',
|
|
313
|
-
values: this._config.sortValues,
|
|
314
|
-
};
|
|
315
|
-
if (this._config.sort && this._config.sort.value) {
|
|
316
|
-
sortByItem.default = this._config.sort.value;
|
|
317
|
-
}
|
|
318
|
-
this.sortByItem = new SimpleSelectItem(sortByItem, null, this.filter);
|
|
319
|
-
const sortDirectionItem = {
|
|
320
|
-
name: SORT_DIRECTION_FIELD,
|
|
321
|
-
type: ItemType.Select,
|
|
322
|
-
label: 'Sort direction',
|
|
323
|
-
values: [
|
|
324
|
-
{ name: 'Ascending', value: 'asc' },
|
|
325
|
-
{ name: 'Descending', value: 'desc' },
|
|
326
|
-
],
|
|
327
|
-
};
|
|
328
|
-
if (this._config.sort && this._config.sort.direction) {
|
|
329
|
-
sortDirectionItem.default = this._config.sort.direction;
|
|
330
|
-
}
|
|
331
|
-
this.sortDirectionItem = new SimpleSelectItem(sortDirectionItem, null, this.filter);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
_setKeywordItem() {
|
|
335
|
-
this.keywordItem = this
|
|
336
|
-
.items
|
|
337
|
-
.find((item) => item.isTypeKeyword);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
FsFilterItemsStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
341
|
-
FsFilterItemsStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
342
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
343
|
-
type: Injectable
|
|
344
|
-
}], ctorParameters: function () { return []; } });
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, forkJoin, Subject } from 'rxjs';
|
|
3
|
+
import { debounceTime, filter, finalize, takeUntil } from 'rxjs/operators';
|
|
4
|
+
import { pickBy } from 'lodash-es';
|
|
5
|
+
import { ItemType } from '../enums/item-type.enum';
|
|
6
|
+
import { createFilterItem } from '../helpers/create-filter-item';
|
|
7
|
+
import { SORT_BY_FIELD, SORT_DIRECTION_FIELD } from '../models/filter-config';
|
|
8
|
+
import { BaseDateRangeItem } from '../models/items/date-range/base-date-range-item';
|
|
9
|
+
import { RangeItem } from '../models/items/range-item';
|
|
10
|
+
import { MultipleSelectItem } from '../models/items/select/multiple-select-item';
|
|
11
|
+
import { SimpleSelectItem } from '../models/items/select/simple-select-item';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
export class FsFilterItemsStore {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.sortByItem = null;
|
|
16
|
+
this.sortDirectionItem = null;
|
|
17
|
+
this.keywordItem = null;
|
|
18
|
+
this._ready$ = new BehaviorSubject(false);
|
|
19
|
+
this._items = [];
|
|
20
|
+
this._visibleItems$ = new BehaviorSubject([]);
|
|
21
|
+
this._itemsByName = new Map();
|
|
22
|
+
this._itemsValuesLoaded = false;
|
|
23
|
+
this._hasKeyword = false;
|
|
24
|
+
this._itemsChange$ = new Subject();
|
|
25
|
+
this._destroy$ = new Subject();
|
|
26
|
+
this._lazyInit();
|
|
27
|
+
}
|
|
28
|
+
get items() {
|
|
29
|
+
return this._items;
|
|
30
|
+
}
|
|
31
|
+
get itemNames() {
|
|
32
|
+
return this._items.map((item) => item.name);
|
|
33
|
+
}
|
|
34
|
+
get visibleItems() {
|
|
35
|
+
return this._visibleItems$.getValue();
|
|
36
|
+
}
|
|
37
|
+
set visibleItems(items) {
|
|
38
|
+
this._visibleItems$.next(items);
|
|
39
|
+
}
|
|
40
|
+
get visibleItems$() {
|
|
41
|
+
return this._visibleItems$.asObservable();
|
|
42
|
+
}
|
|
43
|
+
get hasKeyword() {
|
|
44
|
+
return this._hasKeyword;
|
|
45
|
+
}
|
|
46
|
+
get itemsChange$() {
|
|
47
|
+
return this._itemsChange$.pipe(debounceTime(30));
|
|
48
|
+
}
|
|
49
|
+
get ready$() {
|
|
50
|
+
return this._ready$.asObservable();
|
|
51
|
+
}
|
|
52
|
+
ngOnDestroy() {
|
|
53
|
+
this.destroyItems();
|
|
54
|
+
this._destroy$.next();
|
|
55
|
+
this._destroy$.complete();
|
|
56
|
+
}
|
|
57
|
+
setConfig(config) {
|
|
58
|
+
this._itemsByName.clear();
|
|
59
|
+
this._config = config;
|
|
60
|
+
this.initItems(config.items);
|
|
61
|
+
}
|
|
62
|
+
getItemByName(name) {
|
|
63
|
+
return this._itemsByName.get(name);
|
|
64
|
+
}
|
|
65
|
+
initItems(items) {
|
|
66
|
+
this._itemsValuesLoaded = false;
|
|
67
|
+
if (Array.isArray(items)) {
|
|
68
|
+
this._createItems(items);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
filtersClear() {
|
|
72
|
+
this.items.forEach((item) => {
|
|
73
|
+
if (item instanceof RangeItem) {
|
|
74
|
+
item.clearRange(null, item.defaultValue);
|
|
75
|
+
}
|
|
76
|
+
else if (item instanceof BaseDateRangeItem) {
|
|
77
|
+
item.clearDateRange(null, item.defaultValue);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
item.clear(item.defaultValue);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
if (this.sortByItem) {
|
|
84
|
+
if (this._config.sort) {
|
|
85
|
+
this.sortByItem.model = this._config.sort.value;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.sortByItem.clear(this.sortByItem.defaultValue);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (this.sortDirectionItem) {
|
|
92
|
+
if (this._config.sort) {
|
|
93
|
+
this.sortDirectionItem.model = this._config.sort.direction;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this.sortDirectionItem.clear(this.sortDirectionItem.defaultValue);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
this.keywordItem?.clear();
|
|
100
|
+
}
|
|
101
|
+
loadAsyncValues() {
|
|
102
|
+
this.items
|
|
103
|
+
.filter((item) => item.hasPendingValues)
|
|
104
|
+
.forEach((item) => item.loadAsyncValues());
|
|
105
|
+
}
|
|
106
|
+
loadAsyncDefaults() {
|
|
107
|
+
// default values can be asynchronous, and we must load them if there is no persisted value instead
|
|
108
|
+
const defaultValuesToBeLoaded = this.items
|
|
109
|
+
.filter((item) => {
|
|
110
|
+
return item.defaultValueFn
|
|
111
|
+
&& (item.persistedValue === null || item.persistedValue === undefined);
|
|
112
|
+
});
|
|
113
|
+
// special hack for isolate multiple select
|
|
114
|
+
// values for this type of select must be preloaded
|
|
115
|
+
// Read more in class MultipleSelectItem._init()
|
|
116
|
+
const valuesToBeLoaded = this.items
|
|
117
|
+
.filter((item) => {
|
|
118
|
+
return (item instanceof MultipleSelectItem) && item.hasPendingValues && item.isolate;
|
|
119
|
+
});
|
|
120
|
+
if (defaultValuesToBeLoaded.length > 0 || valuesToBeLoaded.length > 0) {
|
|
121
|
+
forkJoin([
|
|
122
|
+
...defaultValuesToBeLoaded
|
|
123
|
+
.map((item) => item.loadDefaultValue()),
|
|
124
|
+
...valuesToBeLoaded
|
|
125
|
+
.map((item) => {
|
|
126
|
+
item.loadAsyncValues();
|
|
127
|
+
return item.loading$
|
|
128
|
+
.pipe();
|
|
129
|
+
}),
|
|
130
|
+
])
|
|
131
|
+
.pipe(finalize(() => {
|
|
132
|
+
this._ready$.next(true);
|
|
133
|
+
}), takeUntil(this._destroy$))
|
|
134
|
+
.subscribe();
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this._ready$.next(true);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
getSort() {
|
|
141
|
+
let sortBy = this.getSortByValue();
|
|
142
|
+
sortBy = sortBy === '__all' ? null : sortBy;
|
|
143
|
+
let sortDirection = this.getSortDirectionValue();
|
|
144
|
+
sortDirection = sortDirection === '__all' ? null : sortDirection;
|
|
145
|
+
return {
|
|
146
|
+
value: sortBy,
|
|
147
|
+
direction: sortDirection,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
getSortByValue() {
|
|
151
|
+
return this.sortByItem ? this.sortByItem.model : null;
|
|
152
|
+
}
|
|
153
|
+
getSortDirectionValue() {
|
|
154
|
+
return this.sortDirectionItem ? this.sortDirectionItem.model : null;
|
|
155
|
+
}
|
|
156
|
+
updateSort(sort) {
|
|
157
|
+
if (sort.sortBy) {
|
|
158
|
+
this.sortByItem.model = sort.sortBy;
|
|
159
|
+
}
|
|
160
|
+
if (sort.sortDirection) {
|
|
161
|
+
this.sortDirectionItem.model = sort.sortDirection;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
values(onlyPresented = false) {
|
|
165
|
+
return this.items
|
|
166
|
+
.reduce((acc, item) => {
|
|
167
|
+
const value = item.value;
|
|
168
|
+
if (!onlyPresented || value !== null) {
|
|
169
|
+
acc[item.name] = value;
|
|
170
|
+
}
|
|
171
|
+
return acc;
|
|
172
|
+
}, {});
|
|
173
|
+
}
|
|
174
|
+
valuesAsQuery({ onlyPresented = true, items = null, persisted = false, } = {}) {
|
|
175
|
+
const params = {};
|
|
176
|
+
(items || this.items)
|
|
177
|
+
.forEach((filterItem) => {
|
|
178
|
+
const values = persisted
|
|
179
|
+
? filterItem.persistanceObject
|
|
180
|
+
: filterItem.queryObject;
|
|
181
|
+
Object.assign(params, values);
|
|
182
|
+
});
|
|
183
|
+
if (onlyPresented) {
|
|
184
|
+
return pickBy(params, (val) => {
|
|
185
|
+
return val !== void 0;
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
return params;
|
|
189
|
+
}
|
|
190
|
+
init(p) {
|
|
191
|
+
this.items
|
|
192
|
+
.forEach((item) => {
|
|
193
|
+
item.initValues(p[item.name]);
|
|
194
|
+
});
|
|
195
|
+
this._initSortingItems(p);
|
|
196
|
+
this.loadAsyncDefaults();
|
|
197
|
+
this._subscribeToItemsChanges();
|
|
198
|
+
}
|
|
199
|
+
updateItemsWithValues(values) {
|
|
200
|
+
this.items
|
|
201
|
+
.forEach((item) => {
|
|
202
|
+
if (values[item.name]) {
|
|
203
|
+
item.model = values[item.name];
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
if (item instanceof RangeItem) {
|
|
207
|
+
item.clearRange(null, item.defaultValue);
|
|
208
|
+
}
|
|
209
|
+
else if (item instanceof BaseDateRangeItem) {
|
|
210
|
+
item.clearDateRange(null, item.defaultValue);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
item.clear();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
if (this.sortByItem) {
|
|
218
|
+
this.sortByItem.clear();
|
|
219
|
+
}
|
|
220
|
+
if (this.sortDirectionItem) {
|
|
221
|
+
this.sortDirectionItem.clear();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
updateSortingItemsValues(items) {
|
|
225
|
+
this.sortByItem.values = items;
|
|
226
|
+
}
|
|
227
|
+
destroyItems() {
|
|
228
|
+
this.items
|
|
229
|
+
.forEach((item) => item.destroy());
|
|
230
|
+
this.sortByItem?.destroy();
|
|
231
|
+
this.sortDirectionItem?.destroy();
|
|
232
|
+
this._items = [];
|
|
233
|
+
this.sortByItem = null;
|
|
234
|
+
this.sortDirectionItem = null;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Some items might need to load async values before they will be shown
|
|
238
|
+
*/
|
|
239
|
+
prepareItems() {
|
|
240
|
+
if (!this._itemsValuesLoaded) {
|
|
241
|
+
this._itemsValuesLoaded = true;
|
|
242
|
+
this.loadAsyncValues();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
updateItemsVisiblity() {
|
|
246
|
+
this.visibleItems = this.items
|
|
247
|
+
.filter((item) => !item.isTypeKeyword && !item.hide);
|
|
248
|
+
}
|
|
249
|
+
_createItems(items) {
|
|
250
|
+
this._items = items
|
|
251
|
+
.filter((item) => !item.disable)
|
|
252
|
+
.filter((item) => {
|
|
253
|
+
if (this._itemsByName.has(item.name)) {
|
|
254
|
+
throw Error('Filter init error. Items name must be unique.');
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
this._itemsByName.set(item.name, null);
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
})
|
|
261
|
+
.map((item) => {
|
|
262
|
+
const filterItem = createFilterItem(item, { case: this._config.case }, this.filter);
|
|
263
|
+
if (filterItem.type === ItemType.Keyword) {
|
|
264
|
+
this._hasKeyword = true;
|
|
265
|
+
}
|
|
266
|
+
this._itemsByName.set(item.name, filterItem);
|
|
267
|
+
return filterItem;
|
|
268
|
+
});
|
|
269
|
+
this._createSortingItems();
|
|
270
|
+
}
|
|
271
|
+
_subscribeToItemsChanges() {
|
|
272
|
+
this.items
|
|
273
|
+
.forEach((item) => {
|
|
274
|
+
item.valueChange$
|
|
275
|
+
.pipe(takeUntil(item.destroy$))
|
|
276
|
+
.subscribe(() => {
|
|
277
|
+
this._itemsChange$.next(item);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
if (this._config.sortValues?.length) {
|
|
281
|
+
this.sortByItem.valueChange$
|
|
282
|
+
.pipe(takeUntil(this.sortByItem.destroy$))
|
|
283
|
+
.subscribe(() => {
|
|
284
|
+
this._itemsChange$.next(this.sortByItem);
|
|
285
|
+
});
|
|
286
|
+
this.sortDirectionItem.valueChange$
|
|
287
|
+
.pipe(takeUntil(this.sortDirectionItem.destroy$))
|
|
288
|
+
.subscribe(() => {
|
|
289
|
+
this._itemsChange$.next(this.sortDirectionItem);
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
_lazyInit() {
|
|
294
|
+
this.ready$
|
|
295
|
+
.pipe(filter((state) => state), takeUntil(this._destroy$))
|
|
296
|
+
.subscribe(() => {
|
|
297
|
+
this.updateItemsVisiblity();
|
|
298
|
+
this._setKeywordItem();
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
_initSortingItems(p) {
|
|
302
|
+
if (this.sortByItem && this.sortDirectionItem) {
|
|
303
|
+
this.sortByItem.initValues(p[this.sortByItem.name]);
|
|
304
|
+
this.sortDirectionItem.initValues(p[this.sortDirectionItem.name]);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
_createSortingItems() {
|
|
308
|
+
if (this._config.sortValues?.length > 0) {
|
|
309
|
+
const sortByItem = {
|
|
310
|
+
name: SORT_BY_FIELD,
|
|
311
|
+
type: ItemType.Select,
|
|
312
|
+
label: 'Sort by',
|
|
313
|
+
values: this._config.sortValues,
|
|
314
|
+
};
|
|
315
|
+
if (this._config.sort && this._config.sort.value) {
|
|
316
|
+
sortByItem.default = this._config.sort.value;
|
|
317
|
+
}
|
|
318
|
+
this.sortByItem = new SimpleSelectItem(sortByItem, null, this.filter);
|
|
319
|
+
const sortDirectionItem = {
|
|
320
|
+
name: SORT_DIRECTION_FIELD,
|
|
321
|
+
type: ItemType.Select,
|
|
322
|
+
label: 'Sort direction',
|
|
323
|
+
values: [
|
|
324
|
+
{ name: 'Ascending', value: 'asc' },
|
|
325
|
+
{ name: 'Descending', value: 'desc' },
|
|
326
|
+
],
|
|
327
|
+
};
|
|
328
|
+
if (this._config.sort && this._config.sort.direction) {
|
|
329
|
+
sortDirectionItem.default = this._config.sort.direction;
|
|
330
|
+
}
|
|
331
|
+
this.sortDirectionItem = new SimpleSelectItem(sortDirectionItem, null, this.filter);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
_setKeywordItem() {
|
|
335
|
+
this.keywordItem = this
|
|
336
|
+
.items
|
|
337
|
+
.find((item) => item.isTypeKeyword);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
FsFilterItemsStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FsFilterItemsStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
341
|
+
FsFilterItemsStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FsFilterItemsStore });
|
|
342
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FsFilterItemsStore, decorators: [{
|
|
343
|
+
type: Injectable
|
|
344
|
+
}], ctorParameters: function () { return []; } });
|
|
345
345
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMtc3RvcmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvc2VydmljZXMvaXRlbXMtc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUduQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFTakUsT0FBTyxFQUFrQixhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNwRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7O0FBVzdFLE1BQU0sT0FBTyxrQkFBa0I7SUFtQjdCO1FBakJPLGVBQVUsR0FBZ0MsSUFBSSxDQUFDO1FBQy9DLHNCQUFpQixHQUFnQyxJQUFJLENBQUM7UUFDdEQsZ0JBQVcsR0FBYSxJQUFJLENBQUM7UUFHNUIsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLFdBQU0sR0FBa0MsRUFBRSxDQUFDO1FBQzNDLG1CQUFjLEdBQUcsSUFBSSxlQUFl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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZmluYWxpemUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgcGlja0J5IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHR5cGUgeyBGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vZW51bXMvaXRlbS10eXBlLmVudW0nO1xuaW1wb3J0IHsgY3JlYXRlRmlsdGVySXRlbSB9IGZyb20gJy4uL2hlbHBlcnMvY3JlYXRlLWZpbHRlci1pdGVtJztcbmltcG9ydCB7XG4gIEZpbHRlclNvcnQsXG4gIElGaWx0ZXJDb25maWdJdGVtLFxuICBTb3J0SXRlbSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXh0ZXJuYWwtcGFyYW1zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJU29ydGluZ0NoYW5nZUV2ZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9maWx0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGaWx0ZXJDb25maWdTZWxlY3RJdGVtIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pdGVtcy9zZWxlY3QuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZzRmlsdGVyQ29uZmlnLCBTT1JUX0JZX0ZJRUxELCBTT1JUX0RJUkVDVElPTl9GSUVMRCB9IGZyb20gJy4uL21vZGVscy9maWx0ZXItY29uZmlnJztcbmltcG9ydCB7IEJhc2VJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2l0ZW1zL2Jhc2UtaXRlbSc7XG5pbXBvcnQgeyBCYXNlRGF0ZVJhbmdlSXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9kYXRlLXJhbmdlL2Jhc2UtZGF0ZS1yYW5nZS1pdGVtJztcbmltcG9ydCB7IFJhbmdlSXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9yYW5nZS1pdGVtJztcbmltcG9ydCB7IE11bHRpcGxlU2VsZWN0SXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9zZWxlY3QvbXVsdGlwbGUtc2VsZWN0LWl0ZW0nO1xuaW1wb3J0IHsgU2ltcGxlU2VsZWN0SXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9zZWxlY3Qvc2ltcGxlLXNlbGVjdC1pdGVtJztcbmltcG9ydCB7IFRleHRJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2l0ZW1zL3RleHQtaXRlbSc7XG5cblxuaW50ZXJmYWNlIElWYWx1ZUFzUXVlcnkge1xuICBvbmx5UHJlc2VudGVkPzogYm9vbGVhbjtcbiAgaXRlbXM/OiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXTtcbiAgcGVyc2lzdGVkPzogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZzRmlsdGVySXRlbXNTdG9yZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgcHVibGljIHNvcnRCeUl0ZW06IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPiA9IG51bGw7XG4gIHB1YmxpYyBzb3J0RGlyZWN0aW9uSXRlbTogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+ID0gbnVsbDtcbiAgcHVibGljIGtleXdvcmRJdGVtOiBUZXh0SXRlbSA9IG51bGw7XG4gIHB1YmxpYyBmaWx0ZXI6IEZpbHRlckNvbXBvbmVudDtcblxuICBwcml2YXRlIF9yZWFkeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBfaXRlbXM6IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdID0gW107XG4gIHByaXZhdGUgX3Zpc2libGVJdGVtcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdPihbXSk7XG4gIHByaXZhdGUgX2l0ZW1zQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPj4oKTtcblxuICBwcml2YXRlIF9pdGVtc1ZhbHVlc0xvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9oYXNLZXl3b3JkID0gZmFsc2U7XG4gIHByaXZhdGUgX2NvbmZpZzogRnNGaWx0ZXJDb25maWc7XG5cbiAgcHJpdmF0ZSBfaXRlbXNDaGFuZ2UkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICApIHtcbiAgICB0aGlzLl9sYXp5SW5pdCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpdGVtcygpOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICB9XG5cbiAgcHVibGljIGdldCBpdGVtTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0ubmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpc2libGVJdGVtcygpOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVJdGVtcyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmlzaWJsZUl0ZW1zKGl0ZW1zOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXSkge1xuICAgIHRoaXMuX3Zpc2libGVJdGVtcyQubmV4dChpdGVtcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpc2libGVJdGVtcyQoKTogT2JzZXJ2YWJsZTxCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXT4ge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlSXRlbXMkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNLZXl3b3JkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oYXNLZXl3b3JkO1xuICB9XG5cbiAgcHVibGljIGdldCBpdGVtc0NoYW5nZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zQ2hhbmdlJC5waXBlKGRlYm91bmNlVGltZSgzMCkpO1xuICB9XG5cbiAgcHVibGljIGdldCByZWFkeSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWR5JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3lJdGVtcygpO1xuXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZykge1xuICAgIHRoaXMuX2l0ZW1zQnlOYW1lLmNsZWFyKCk7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuaW5pdEl0ZW1zKGNvbmZpZy5pdGVtcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtc0J5TmFtZS5nZXQobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEl0ZW1zKGl0ZW1zOiBJRmlsdGVyQ29uZmlnSXRlbVtdKSB7XG4gICAgdGhpcy5faXRlbXNWYWx1ZXNMb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZUl0ZW1zKGl0ZW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlsdGVyc0NsZWFyKCkge1xuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSYW5nZUl0ZW0pIHtcbiAgICAgICAgaXRlbS5jbGVhclJhbmdlKG51bGwsIGl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEJhc2VEYXRlUmFuZ2VJdGVtKSB7XG4gICAgICAgIGl0ZW0uY2xlYXJEYXRlUmFuZ2UobnVsbCwgaXRlbS5kZWZhdWx0VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5jbGVhcihpdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5zb3J0QnlJdGVtKSB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLnNvcnQpIHtcbiAgICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gdGhpcy5fY29uZmlnLnNvcnQudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRCeUl0ZW0uY2xlYXIodGhpcy5zb3J0QnlJdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydERpcmVjdGlvbkl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuc29ydCkge1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsID0gdGhpcy5fY29uZmlnLnNvcnQuZGlyZWN0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5jbGVhcih0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5rZXl3b3JkSXRlbT8uY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkQXN5bmNWYWx1ZXMoKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5oYXNQZW5kaW5nVmFsdWVzKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0ubG9hZEFzeW5jVmFsdWVzKCkpO1xuICB9XG5cbiAgcHVibGljIGxvYWRBc3luY0RlZmF1bHRzKCk6IHZvaWQge1xuICAgIC8vIGRlZmF1bHQgdmFsdWVzIGNhbiBiZSBhc3luY2hyb25vdXMsIGFuZCB3ZSBtdXN0IGxvYWQgdGhlbSBpZiB0aGVyZSBpcyBubyBwZXJzaXN0ZWQgdmFsdWUgaW5zdGVhZFxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXNUb0JlTG9hZGVkID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5kZWZhdWx0VmFsdWVGblxuICAgICAgICAgICYmIChpdGVtLnBlcnNpc3RlZFZhbHVlID09PSBudWxsIHx8IGl0ZW0ucGVyc2lzdGVkVmFsdWUgPT09IHVuZGVmaW5lZCk7XG4gICAgICB9KTtcblxuICAgIC8vIHNwZWNpYWwgaGFjayBmb3IgaXNvbGF0ZSBtdWx0aXBsZSBzZWxlY3RcbiAgICAvLyB2YWx1ZXMgZm9yIHRoaXMgdHlwZSBvZiBzZWxlY3QgbXVzdCBiZSBwcmVsb2FkZWRcbiAgICAvLyBSZWFkIG1vcmUgaW4gY2xhc3MgTXVsdGlwbGVTZWxlY3RJdGVtLl9pbml0KClcbiAgICBjb25zdCB2YWx1ZXNUb0JlTG9hZGVkID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gKGl0ZW0gaW5zdGFuY2VvZiBNdWx0aXBsZVNlbGVjdEl0ZW0pICYmIGl0ZW0uaGFzUGVuZGluZ1ZhbHVlcyAmJiBpdGVtLmlzb2xhdGU7XG4gICAgICB9KTtcblxuICAgIGlmIChkZWZhdWx0VmFsdWVzVG9CZUxvYWRlZC5sZW5ndGggPiAwIHx8IHZhbHVlc1RvQmVMb2FkZWQubGVuZ3RoID4gMCkge1xuICAgICAgZm9ya0pvaW4oXG4gICAgICAgIFtcbiAgICAgICAgICAuLi5kZWZhdWx0VmFsdWVzVG9CZUxvYWRlZFxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5sb2FkRGVmYXVsdFZhbHVlKCkpLFxuXG4gICAgICAgICAgLi4udmFsdWVzVG9CZUxvYWRlZFxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICBpdGVtLmxvYWRBc3luY1ZhbHVlcygpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBpdGVtLmxvYWRpbmckXG4gICAgICAgICAgICAgICAgLnBpcGUoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeSQubmV4dCh0cnVlKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVhZHkkLm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFNvcnQoKTogRmlsdGVyU29ydCB7XG4gICAgbGV0IHNvcnRCeSA9IHRoaXMuZ2V0U29ydEJ5VmFsdWUoKTtcbiAgICBzb3J0QnkgPSBzb3J0QnkgPT09ICdfX2FsbCcgPyBudWxsIDogc29ydEJ5O1xuXG4gICAgbGV0IHNvcnREaXJlY3Rpb24gPSB0aGlzLmdldFNvcnREaXJlY3Rpb25WYWx1ZSgpO1xuICAgIHNvcnREaXJlY3Rpb24gPSBzb3J0RGlyZWN0aW9uID09PSAnX19hbGwnID8gbnVsbCA6IHNvcnREaXJlY3Rpb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHNvcnRCeSxcbiAgICAgIGRpcmVjdGlvbjogc29ydERpcmVjdGlvbixcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldFNvcnRCeVZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnNvcnRCeUl0ZW0gPyB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldFNvcnREaXJlY3Rpb25WYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA/IHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnQoc29ydDogSVNvcnRpbmdDaGFuZ2VFdmVudCkge1xuICAgIGlmIChzb3J0LnNvcnRCeSkge1xuICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gc29ydC5zb3J0Qnk7XG4gICAgfVxuXG4gICAgaWYgKHNvcnQuc29ydERpcmVjdGlvbikge1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCA9IHNvcnQuc29ydERpcmVjdGlvbjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdmFsdWVzKG9ubHlQcmVzZW50ZWQgPSBmYWxzZSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1xuICAgICAgLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS52YWx1ZTtcblxuICAgICAgICBpZiAoIW9ubHlQcmVzZW50ZWQgfHwgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBhY2NbaXRlbS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZXNBc1F1ZXJ5KHtcbiAgICBvbmx5UHJlc2VudGVkID0gdHJ1ZSxcbiAgICBpdGVtcyA9IG51bGwsXG4gICAgcGVyc2lzdGVkID0gZmFsc2UsXG4gIH06IElWYWx1ZUFzUXVlcnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBwYXJhbXMgPSB7fTtcblxuICAgIChpdGVtcyB8fCB0aGlzLml0ZW1zKVxuICAgICAgLmZvckVhY2goKGZpbHRlckl0ZW06IEJhc2VJdGVtPGFueT4pID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gcGVyc2lzdGVkXG4gICAgICAgICAgPyBmaWx0ZXJJdGVtLnBlcnNpc3RhbmNlT2JqZWN0XG4gICAgICAgICAgOiBmaWx0ZXJJdGVtLnF1ZXJ5T2JqZWN0O1xuXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB2YWx1ZXMpO1xuICAgICAgfSk7XG5cbiAgICBpZiAob25seVByZXNlbnRlZCkge1xuICAgICAgcmV0dXJuIHBpY2tCeShwYXJhbXMsICh2YWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHZhbCAhPT0gdm9pZCAwO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHB1YmxpYyBpbml0KHA6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcykge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGl0ZW0uaW5pdFZhbHVlcyhwW2l0ZW0ubmFtZV0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9pbml0U29ydGluZ0l0ZW1zKHApO1xuICAgIHRoaXMubG9hZEFzeW5jRGVmYXVsdHMoKTtcbiAgICB0aGlzLl9zdWJzY3JpYmVUb0l0ZW1zQ2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUl0ZW1zV2l0aFZhbHVlcyh2YWx1ZXM6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcykge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZXNbaXRlbS5uYW1lXSkge1xuICAgICAgICAgIGl0ZW0ubW9kZWwgPSB2YWx1ZXNbaXRlbS5uYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFJhbmdlSXRlbSkge1xuICAgICAgICAgICAgaXRlbS5jbGVhclJhbmdlKG51bGwsIGl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBCYXNlRGF0ZVJhbmdlSXRlbSkge1xuICAgICAgICAgICAgaXRlbS5jbGVhckRhdGVSYW5nZShudWxsLCBpdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW0uY2xlYXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc29ydEJ5SXRlbSkge1xuICAgICAgdGhpcy5zb3J0QnlJdGVtLmNsZWFyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNvcnREaXJlY3Rpb25JdGVtKSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnRpbmdJdGVtc1ZhbHVlcyhpdGVtczogU29ydEl0ZW1bXSkge1xuICAgIHRoaXMuc29ydEJ5SXRlbS52YWx1ZXMgPSBpdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95SXRlbXMoKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0uZGVzdHJveSgpKTtcbiAgICB0aGlzLnNvcnRCeUl0ZW0/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtPy5kZXN0cm95KCk7XG5cbiAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICAgIHRoaXMuc29ydEJ5SXRlbSA9IG51bGw7XG4gICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU29tZSBpdGVtcyBtaWdodCBuZWVkIHRvIGxvYWQgYXN5bmMgdmFsdWVzIGJlZm9yZSB0aGV5IHdpbGwgYmUgc2hvd25cbiAgICovXG4gIHB1YmxpYyBwcmVwYXJlSXRlbXMoKSB7XG4gICAgaWYgKCF0aGlzLl9pdGVtc1ZhbHVlc0xvYWRlZCkge1xuICAgICAgdGhpcy5faXRlbXNWYWx1ZXNMb2FkZWQgPSB0cnVlO1xuXG4gICAgICB0aGlzLmxvYWRBc3luY1ZhbHVlcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVJdGVtc1Zpc2libGl0eSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGVJdGVtcyA9IHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzVHlwZUtleXdvcmQgJiYgIWl0ZW0uaGlkZSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVJdGVtcyhpdGVtczogSUZpbHRlckNvbmZpZ0l0ZW1bXSkge1xuICAgIHRoaXMuX2l0ZW1zID0gaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmRpc2FibGUpXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9pdGVtc0J5TmFtZS5oYXMoaXRlbS5uYW1lKSkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdGaWx0ZXIgaW5pdCBlcnJvci4gSXRlbXMgbmFtZSBtdXN0IGJlIHVuaXF1ZS4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9pdGVtc0J5TmFtZS5zZXQoaXRlbS5uYW1lLCBudWxsKTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJJdGVtID0gY3JlYXRlRmlsdGVySXRlbShpdGVtLCB7IGNhc2U6IHRoaXMuX2NvbmZpZy5jYXNlIH0sIHRoaXMuZmlsdGVyKTtcblxuICAgICAgICBpZiAoZmlsdGVySXRlbS50eXBlID09PSBJdGVtVHlwZS5LZXl3b3JkKSB7XG4gICAgICAgICAgdGhpcy5faGFzS2V5d29yZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pdGVtc0J5TmFtZS5zZXQoaXRlbS5uYW1lLCBmaWx0ZXJJdGVtKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVySXRlbTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fY3JlYXRlU29ydGluZ0l0ZW1zKCk7XG4gIH1cblxuICBwcml2YXRlIF9zdWJzY3JpYmVUb0l0ZW1zQ2hhbmdlcygpIHtcbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpdGVtLnZhbHVlQ2hhbmdlJFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKGl0ZW0uZGVzdHJveSQpLFxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1zQ2hhbmdlJC5uZXh0KGl0ZW0pO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnNvcnRWYWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5zb3J0QnlJdGVtLnZhbHVlQ2hhbmdlJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5zb3J0QnlJdGVtLmRlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9pdGVtc0NoYW5nZSQubmV4dCh0aGlzLnNvcnRCeUl0ZW0pO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS52YWx1ZUNoYW5nZSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuc29ydERpcmVjdGlvbkl0ZW0uZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2l0ZW1zQ2hhbmdlJC5uZXh0KHRoaXMuc29ydERpcmVjdGlvbkl0ZW0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9sYXp5SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWR5JFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoc3RhdGUpID0+IHN0YXRlKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1zVmlzaWJsaXR5KCk7XG4gICAgICAgIHRoaXMuX3NldEtleXdvcmRJdGVtKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRTb3J0aW5nSXRlbXMocDogSUZpbHRlckV4dGVybmFsUGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ydEJ5SXRlbSAmJiB0aGlzLnNvcnREaXJlY3Rpb25JdGVtKSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0uaW5pdFZhbHVlcyhwW3RoaXMuc29ydEJ5SXRlbS5uYW1lXSk7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmluaXRWYWx1ZXMocFt0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm5hbWVdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVTb3J0aW5nSXRlbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5zb3J0VmFsdWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzb3J0QnlJdGVtID0ge1xuICAgICAgICBuYW1lOiBTT1JUX0JZX0ZJRUxELFxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgIGxhYmVsOiAnU29ydCBieScsXG4gICAgICAgIHZhbHVlczogdGhpcy5fY29uZmlnLnNvcnRWYWx1ZXMsXG4gICAgICB9IGFzIElGaWx0ZXJDb25maWdTZWxlY3RJdGVtO1xuXG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuc29ydCAmJiB0aGlzLl9jb25maWcuc29ydC52YWx1ZSkge1xuICAgICAgICBzb3J0QnlJdGVtLmRlZmF1bHQgPSB0aGlzLl9jb25maWcuc29ydC52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3J0QnlJdGVtID0gbmV3IFNpbXBsZVNlbGVjdEl0ZW0oXG4gICAgICAgIHNvcnRCeUl0ZW0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuZmlsdGVyLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc29ydERpcmVjdGlvbkl0ZW0gPSB7XG4gICAgICAgIG5hbWU6IFNPUlRfRElSRUNUSU9OX0ZJRUxELFxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgIGxhYmVsOiAnU29ydCBkaXJlY3Rpb24nLFxuICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICB7IG5hbWU6ICdBc2NlbmRpbmcnLCB2YWx1ZTogJ2FzYycgfSxcbiAgICAgICAgICB7IG5hbWU6ICdEZXNjZW5kaW5nJywgdmFsdWU6ICdkZXNjJyB9LFxuICAgICAgICBdLFxuICAgICAgfSBhcyBJRmlsdGVyQ29uZmlnU2VsZWN0SXRlbTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5zb3J0ICYmIHRoaXMuX2NvbmZpZy5zb3J0LmRpcmVjdGlvbikge1xuICAgICAgICBzb3J0RGlyZWN0aW9uSXRlbS5kZWZhdWx0ID0gdGhpcy5fY29uZmlnLnNvcnQuZGlyZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtID0gbmV3IFNpbXBsZVNlbGVjdEl0ZW0oXG4gICAgICAgIHNvcnREaXJlY3Rpb25JdGVtLFxuICAgICAgICBudWxsLFxuICAgICAgICB0aGlzLmZpbHRlcixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0S2V5d29yZEl0ZW0oKSB7XG4gICAgdGhpcy5rZXl3b3JkSXRlbSA9IHRoaXNcbiAgICAgIC5pdGVtc1xuICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaXNUeXBlS2V5d29yZCkgYXMgVGV4dEl0ZW07XG4gIH1cbn1cbiJdfQ==
|