@ecodev/natural 41.3.0 → 42.2.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/ecodev-natural.d.ts +1 -9
- package/esm2020/ecodev-natural.mjs +5 -0
- package/esm2020/lib/classes/abstract-controller.mjs +30 -0
- package/esm2020/lib/classes/abstract-detail.mjs +152 -0
- package/esm2020/lib/classes/abstract-editable-list.mjs +96 -0
- package/esm2020/lib/classes/abstract-list.mjs +406 -0
- package/esm2020/lib/classes/abstract-navigable-list.mjs +126 -0
- package/{esm2015/lib/classes/apollo-utils.js → esm2020/lib/classes/apollo-utils.mjs} +0 -0
- package/esm2020/lib/classes/data-source.mjs +76 -0
- package/{esm2015/lib/classes/query-variable-manager-utils.js → esm2020/lib/classes/query-variable-manager-utils.mjs} +0 -0
- package/esm2020/lib/classes/query-variable-manager.mjs +172 -0
- package/{esm2015/lib/classes/rxjs.js → esm2020/lib/classes/rxjs.mjs} +0 -0
- package/{esm2015/lib/classes/tld.js → esm2020/lib/classes/tld.mjs} +0 -0
- package/{esm2015/lib/classes/utility.js → esm2020/lib/classes/utility.mjs} +0 -0
- package/esm2020/lib/classes/validators.mjs +179 -0
- package/esm2020/lib/directives/http-prefix.directive.mjs +50 -0
- package/esm2020/lib/modules/alert/alert.module.mjs +20 -0
- package/esm2020/lib/modules/alert/alert.service.mjs +55 -0
- package/esm2020/lib/modules/alert/confirm.component.mjs +20 -0
- package/{esm2015/lib/modules/alert/public-api.js → esm2020/lib/modules/alert/public-api.mjs} +0 -0
- package/esm2020/lib/modules/avatar/avatar.module.mjs +19 -0
- package/esm2020/lib/modules/avatar/component/avatar.component.mjs +190 -0
- package/{esm2015/lib/modules/avatar/public-api.js → esm2020/lib/modules/avatar/public-api.mjs} +0 -0
- package/esm2020/lib/modules/avatar/service/avatar.service.mjs +66 -0
- package/esm2020/lib/modules/avatar/sources/gravatar.mjs +29 -0
- package/{esm2015/lib/modules/avatar/sources/image.js → esm2020/lib/modules/avatar/sources/image.mjs} +0 -0
- package/{esm2015/lib/modules/avatar/sources/initials.js → esm2020/lib/modules/avatar/sources/initials.mjs} +0 -0
- package/{esm2015/lib/modules/avatar/sources/source.js → esm2020/lib/modules/avatar/sources/source.mjs} +1 -1
- package/esm2020/lib/modules/columns-picker/columns-picker-column.directive.mjs +43 -0
- package/esm2020/lib/modules/columns-picker/columns-picker.component.mjs +84 -0
- package/esm2020/lib/modules/columns-picker/columns-picker.module.mjs +47 -0
- package/{esm2015/lib/modules/columns-picker/public-api.js → esm2020/lib/modules/columns-picker/public-api.mjs} +0 -0
- package/esm2020/lib/modules/common/common-module.mjs +50 -0
- package/esm2020/lib/modules/common/directives/linkable-tab.directive.mjs +79 -0
- package/esm2020/lib/modules/common/directives/src-density.directive.mjs +62 -0
- package/esm2020/lib/modules/common/pipes/capitalize.pipe.mjs +18 -0
- package/esm2020/lib/modules/common/pipes/ellipsis.pipe.mjs +14 -0
- package/esm2020/lib/modules/common/pipes/enum.pipe.mjs +25 -0
- package/esm2020/lib/modules/common/pipes/swiss-date.pipe.mjs +20 -0
- package/esm2020/lib/modules/common/public-api.mjs +13 -0
- package/esm2020/lib/modules/common/services/memory-storage.mjs +112 -0
- package/esm2020/lib/modules/common/services/seo.service.mjs +114 -0
- package/esm2020/lib/modules/detail-header/detail-header.component.mjs +76 -0
- package/esm2020/lib/modules/detail-header/detail-header.module.mjs +21 -0
- package/{esm2015/lib/modules/detail-header/public-api.js → esm2020/lib/modules/detail-header/public-api.mjs} +0 -0
- package/esm2020/lib/modules/dialog-trigger/dialog-trigger.component.mjs +69 -0
- package/esm2020/lib/modules/dialog-trigger/dialog-trigger.module.mjs +19 -0
- package/{esm2015/lib/modules/dialog-trigger/public-api.js → esm2020/lib/modules/dialog-trigger/public-api.mjs} +0 -0
- package/esm2020/lib/modules/dropdown-components/abstract-association-select-component.directive.mjs +98 -0
- package/esm2020/lib/modules/dropdown-components/natural-dropdown-components.module.mjs +92 -0
- package/{esm2015/lib/modules/dropdown-components/public-api.js → esm2020/lib/modules/dropdown-components/public-api.mjs} +0 -0
- package/esm2020/lib/modules/dropdown-components/type-date/type-date.component.mjs +133 -0
- package/esm2020/lib/modules/dropdown-components/type-date-range/type-date-range.component.mjs +137 -0
- package/esm2020/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.mjs +69 -0
- package/esm2020/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.mjs +38 -0
- package/esm2020/lib/modules/dropdown-components/type-number/type-number.component.mjs +104 -0
- package/esm2020/lib/modules/dropdown-components/type-select/type-select.component.mjs +169 -0
- package/esm2020/lib/modules/dropdown-components/type-text/type-text.component.mjs +57 -0
- package/{esm2015/lib/modules/dropdown-components/types.js → esm2020/lib/modules/dropdown-components/types.mjs} +0 -0
- package/{esm2015/lib/modules/dropdown-components/utils.js → esm2020/lib/modules/dropdown-components/utils.mjs} +0 -0
- package/esm2020/lib/modules/file/abstract-file.mjs +231 -0
- package/esm2020/lib/modules/file/component/file.component.mjs +143 -0
- package/esm2020/lib/modules/file/file-drop.directive.mjs +110 -0
- package/esm2020/lib/modules/file/file-select.directive.mjs +28 -0
- package/esm2020/lib/modules/file/file.module.mjs +24 -0
- package/esm2020/lib/modules/file/file.service.mjs +48 -0
- package/{esm2015/lib/modules/file/public-api.js → esm2020/lib/modules/file/public-api.mjs} +0 -0
- package/{esm2015/lib/modules/file/types.js → esm2020/lib/modules/file/types.mjs} +0 -0
- package/{esm2015/lib/modules/file/utils.js → esm2020/lib/modules/file/utils.mjs} +3 -4
- package/esm2020/lib/modules/fixed-button/fixed-button.component.mjs +27 -0
- package/esm2020/lib/modules/fixed-button/fixed-button.module.mjs +21 -0
- package/{esm2015/lib/modules/fixed-button/public-api.js → esm2020/lib/modules/fixed-button/public-api.mjs} +0 -0
- package/esm2020/lib/modules/fixed-button-detail/fixed-button-detail.component.mjs +36 -0
- package/esm2020/lib/modules/fixed-button-detail/fixed-button-detail.module.mjs +20 -0
- package/{esm2015/lib/modules/fixed-button-detail/public-api.js → esm2020/lib/modules/fixed-button-detail/public-api.mjs} +0 -0
- package/{esm2015/lib/modules/hierarchic-selector/classes/flat-node.js → esm2020/lib/modules/hierarchic-selector/classes/flat-node.mjs} +1 -1
- package/{esm2015/lib/modules/hierarchic-selector/classes/hierarchic-configuration.js → esm2020/lib/modules/hierarchic-selector/classes/hierarchic-configuration.mjs} +0 -0
- package/{esm2015/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.js → esm2020/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.mjs} +0 -0
- package/{esm2015/lib/modules/hierarchic-selector/classes/model-node.js → esm2020/lib/modules/hierarchic-selector/classes/model-node.mjs} +1 -1
- package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.mjs +364 -0
- package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.mjs +258 -0
- package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.mjs +31 -0
- package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.mjs +23 -0
- package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector.module.mjs +81 -0
- package/{esm2015/lib/modules/hierarchic-selector/public-api.js → esm2020/lib/modules/hierarchic-selector/public-api.mjs} +0 -0
- package/esm2020/lib/modules/icon/icon.component.mjs +92 -0
- package/esm2020/lib/modules/icon/icon.module.mjs +30 -0
- package/{esm2015/lib/modules/icon/public-api.js → esm2020/lib/modules/icon/public-api.mjs} +0 -0
- package/esm2020/lib/modules/matomo/matomo-module.module.mjs +12 -0
- package/esm2020/lib/modules/matomo/matomo.service.mjs +105 -0
- package/{esm2015/lib/modules/matomo/public-api.js → esm2020/lib/modules/matomo/public-api.mjs} +0 -0
- package/esm2020/lib/modules/panels/abstract-panel.mjs +56 -0
- package/{esm2015/lib/modules/panels/fallback-if-no-opened-panels.urlmatcher.js → esm2020/lib/modules/panels/fallback-if-no-opened-panels.urlmatcher.mjs} +0 -0
- package/esm2020/lib/modules/panels/panels.component.mjs +26 -0
- package/esm2020/lib/modules/panels/panels.module.mjs +33 -0
- package/esm2020/lib/modules/panels/panels.service.mjs +325 -0
- package/{esm2015/lib/modules/panels/panels.urlmatcher.js → esm2020/lib/modules/panels/panels.urlmatcher.mjs} +0 -0
- package/{esm2015/lib/modules/panels/public-api.js → esm2020/lib/modules/panels/public-api.mjs} +0 -0
- package/{esm2015/lib/modules/panels/types.js → esm2020/lib/modules/panels/types.mjs} +0 -0
- package/{esm2015/lib/modules/relations/public-api.js → esm2020/lib/modules/relations/public-api.mjs} +0 -0
- package/esm2020/lib/modules/relations/relations.component.mjs +198 -0
- package/esm2020/lib/modules/relations/relations.module.mjs +58 -0
- package/{esm2015/lib/modules/search/classes/graphql-doctrine.js → esm2020/lib/modules/search/classes/graphql-doctrine.mjs} +0 -0
- package/{esm2015/lib/modules/search/classes/graphql-doctrine.types.js → esm2020/lib/modules/search/classes/graphql-doctrine.types.mjs} +0 -0
- package/{esm2015/lib/modules/search/classes/transformers.js → esm2020/lib/modules/search/classes/transformers.mjs} +0 -0
- package/{esm2015/lib/modules/search/classes/url.js → esm2020/lib/modules/search/classes/url.mjs} +0 -0
- package/{esm2015/lib/modules/search/classes/utils.js → esm2020/lib/modules/search/classes/utils.mjs} +0 -0
- package/{esm2015/lib/modules/search/dropdown-container/dropdown-container-animations.js → esm2020/lib/modules/search/dropdown-container/dropdown-container-animations.mjs} +0 -0
- package/esm2020/lib/modules/search/dropdown-container/dropdown-container.component.mjs +88 -0
- package/{esm2015/lib/modules/search/dropdown-container/dropdown-ref.js → esm2020/lib/modules/search/dropdown-container/dropdown-ref.mjs} +1 -1
- package/esm2020/lib/modules/search/dropdown-container/dropdown.service.mjs +93 -0
- package/esm2020/lib/modules/search/facet-selector/facet-selector.component.mjs +50 -0
- package/esm2020/lib/modules/search/group/group.component.mjs +45 -0
- package/esm2020/lib/modules/search/input/input.component.mjs +328 -0
- package/{esm2015/lib/modules/search/public-api.js → esm2020/lib/modules/search/public-api.mjs} +0 -0
- package/esm2020/lib/modules/search/search/search.component.mjs +78 -0
- package/esm2020/lib/modules/search/search.module.mjs +84 -0
- package/{esm2015/lib/modules/search/types/dropdown-component.js → esm2020/lib/modules/search/types/dropdown-component.mjs} +0 -0
- package/{esm2015/lib/modules/search/types/facet.js → esm2020/lib/modules/search/types/facet.mjs} +0 -0
- package/{esm2015/lib/modules/search/types/values.js → esm2020/lib/modules/search/types/values.mjs} +0 -0
- package/esm2020/lib/modules/select/abstract-select.component.mjs +186 -0
- package/{esm2015/lib/modules/select/public-api.js → esm2020/lib/modules/select/public-api.mjs} +0 -0
- package/esm2020/lib/modules/select/select/select.component.mjs +207 -0
- package/esm2020/lib/modules/select/select-enum/select-enum.component.mjs +47 -0
- package/esm2020/lib/modules/select/select-hierarchic/select-hierarchic.component.mjs +127 -0
- package/esm2020/lib/modules/select/select.module.mjs +68 -0
- package/{esm2015/lib/modules/sidenav/public-api.js → esm2020/lib/modules/sidenav/public-api.mjs} +0 -0
- package/esm2020/lib/modules/sidenav/sidenav/sidenav.component.mjs +15 -0
- package/esm2020/lib/modules/sidenav/sidenav-container/sidenav-container.component.mjs +87 -0
- package/esm2020/lib/modules/sidenav/sidenav-content/sidenav-content.component.mjs +12 -0
- package/esm2020/lib/modules/sidenav/sidenav-stack.service.mjs +52 -0
- package/esm2020/lib/modules/sidenav/sidenav.module.mjs +25 -0
- package/esm2020/lib/modules/sidenav/sidenav.service.mjs +195 -0
- package/{esm2015/lib/modules/stamp/public-api.js → esm2020/lib/modules/stamp/public-api.mjs} +0 -0
- package/esm2020/lib/modules/stamp/stamp-module.module.mjs +18 -0
- package/esm2020/lib/modules/stamp/stamp.component.mjs +14 -0
- package/{esm2015/lib/modules/table-button/public-api.js → esm2020/lib/modules/table-button/public-api.mjs} +0 -0
- package/esm2020/lib/modules/table-button/table-button.component.mjs +48 -0
- package/esm2020/lib/modules/table-button/table-button.module.mjs +21 -0
- package/esm2020/lib/services/abstract-model.service.mjs +509 -0
- package/esm2020/lib/services/enum.service.mjs +67 -0
- package/esm2020/lib/services/link-mutation.service.mjs +153 -0
- package/esm2020/lib/services/persistence.service.mjs +113 -0
- package/esm2020/lib/services/swiss-parsing-date-adapter.service.mjs +55 -0
- package/{esm2015/lib/types/types.js → esm2020/lib/types/types.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/{ecodev-natural.js → ecodev-natural.mjs} +2808 -2392
- package/fesm2015/ecodev-natural.mjs.map +1 -0
- package/fesm2020/ecodev-natural.mjs +10495 -0
- package/fesm2020/ecodev-natural.mjs.map +1 -0
- package/lib/classes/abstract-controller.d.ts +3 -0
- package/lib/classes/abstract-detail.d.ts +3 -0
- package/lib/classes/abstract-editable-list.d.ts +3 -0
- package/lib/classes/abstract-list.d.ts +3 -0
- package/lib/classes/abstract-navigable-list.d.ts +3 -0
- package/lib/classes/query-variable-manager.d.ts +19 -8
- package/lib/directives/http-prefix.directive.d.ts +3 -0
- package/lib/modules/alert/alert.module.d.ts +9 -0
- package/lib/modules/alert/alert.service.d.ts +3 -0
- package/lib/modules/alert/confirm.component.d.ts +3 -0
- package/lib/modules/avatar/avatar.module.d.ts +6 -0
- package/lib/modules/avatar/component/avatar.component.d.ts +4 -0
- package/lib/modules/avatar/service/avatar.service.d.ts +3 -0
- package/lib/modules/columns-picker/columns-picker-column.directive.d.ts +3 -0
- package/lib/modules/columns-picker/columns-picker.component.d.ts +3 -0
- package/lib/modules/columns-picker/columns-picker.module.d.ts +13 -0
- package/lib/modules/common/common-module.d.ts +15 -0
- package/lib/modules/common/directives/linkable-tab.directive.d.ts +3 -0
- package/lib/modules/common/directives/src-density.directive.d.ts +3 -0
- package/lib/modules/common/pipes/capitalize.pipe.d.ts +3 -0
- package/lib/modules/common/pipes/ellipsis.pipe.d.ts +3 -0
- package/lib/modules/common/pipes/enum.pipe.d.ts +3 -0
- package/lib/modules/common/pipes/swiss-date.pipe.d.ts +3 -0
- package/lib/modules/common/public-api.d.ts +0 -1
- package/lib/modules/common/services/memory-storage.d.ts +3 -0
- package/lib/modules/common/services/seo.service.d.ts +3 -0
- package/lib/modules/detail-header/detail-header.component.d.ts +3 -0
- package/lib/modules/detail-header/detail-header.module.d.ts +9 -0
- package/lib/modules/dialog-trigger/dialog-trigger.component.d.ts +3 -0
- package/lib/modules/dialog-trigger/dialog-trigger.module.d.ts +7 -0
- package/lib/modules/dropdown-components/abstract-association-select-component.directive.d.ts +3 -0
- package/lib/modules/dropdown-components/natural-dropdown-components.module.d.ts +22 -0
- package/lib/modules/dropdown-components/type-date/type-date.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-date-range/type-date-range.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-number/type-number.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-select/type-select.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-text/type-text.component.d.ts +3 -0
- package/lib/modules/file/abstract-file.d.ts +3 -0
- package/lib/modules/file/component/file.component.d.ts +3 -0
- package/lib/modules/file/file-drop.directive.d.ts +3 -0
- package/lib/modules/file/file-select.directive.d.ts +3 -0
- package/lib/modules/file/file.module.d.ts +11 -0
- package/lib/modules/file/file.service.d.ts +3 -0
- package/lib/modules/fixed-button/fixed-button.component.d.ts +3 -0
- package/lib/modules/fixed-button/fixed-button.module.d.ts +9 -0
- package/lib/modules/fixed-button-detail/fixed-button-detail.component.d.ts +3 -0
- package/lib/modules/fixed-button-detail/fixed-button-detail.module.d.ts +8 -0
- package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.d.ts +3 -0
- package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.d.ts +3 -0
- package/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.d.ts +3 -0
- package/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.d.ts +3 -0
- package/lib/modules/hierarchic-selector/hierarchic-selector.module.d.ts +21 -0
- package/lib/modules/icon/icon.component.d.ts +3 -0
- package/lib/modules/icon/icon.module.d.ts +7 -0
- package/lib/modules/matomo/matomo-module.module.d.ts +4 -0
- package/lib/modules/matomo/matomo.service.d.ts +3 -0
- package/lib/modules/panels/abstract-panel.d.ts +3 -0
- package/lib/modules/panels/panels.component.d.ts +3 -0
- package/lib/modules/panels/panels.module.d.ts +8 -0
- package/lib/modules/panels/panels.service.d.ts +3 -0
- package/lib/modules/relations/relations.component.d.ts +3 -0
- package/lib/modules/relations/relations.module.d.ts +15 -0
- package/lib/modules/search/dropdown-container/dropdown-container.component.d.ts +3 -0
- package/lib/modules/search/dropdown-container/dropdown-ref.d.ts +1 -1
- package/lib/modules/search/dropdown-container/dropdown.service.d.ts +3 -0
- package/lib/modules/search/facet-selector/facet-selector.component.d.ts +3 -0
- package/lib/modules/search/group/group.component.d.ts +3 -0
- package/lib/modules/search/input/input.component.d.ts +3 -0
- package/lib/modules/search/search/search.component.d.ts +3 -0
- package/lib/modules/search/search.module.d.ts +19 -0
- package/lib/modules/select/abstract-select.component.d.ts +4 -1
- package/lib/modules/select/select/select.component.d.ts +3 -0
- package/lib/modules/select/select-enum/select-enum.component.d.ts +9 -2
- package/lib/modules/select/select-hierarchic/select-hierarchic.component.d.ts +3 -0
- package/lib/modules/select/select.module.d.ts +19 -0
- package/lib/modules/sidenav/sidenav/sidenav.component.d.ts +3 -0
- package/lib/modules/sidenav/sidenav-container/sidenav-container.component.d.ts +3 -0
- package/lib/modules/sidenav/sidenav-content/sidenav-content.component.d.ts +3 -0
- package/lib/modules/sidenav/sidenav-stack.service.d.ts +4 -1
- package/lib/modules/sidenav/sidenav.module.d.ts +11 -0
- package/lib/modules/sidenav/sidenav.service.d.ts +3 -0
- package/lib/modules/stamp/stamp-module.module.d.ts +6 -0
- package/lib/modules/stamp/stamp.component.d.ts +3 -0
- package/lib/modules/table-button/table-button.component.d.ts +3 -0
- package/lib/modules/table-button/table-button.module.d.ts +9 -0
- package/lib/services/enum.service.d.ts +3 -0
- package/lib/services/link-mutation.service.d.ts +3 -0
- package/lib/services/persistence.service.d.ts +3 -0
- package/lib/services/swiss-parsing-date-adapter.service.d.ts +4 -1
- package/package.json +25 -12
- package/src/lib/modules/alert/_alert.theme.scss +1 -1
- package/src/lib/modules/file/component/_file.theme.scss +1 -1
- package/src/lib/modules/icon/_icon.theme.scss +1 -1
- package/src/lib/modules/search/dropdown-container/_dropdown-container.theme.scss +1 -1
- package/src/lib/modules/table-button/_table-button.theme.scss +1 -1
- package/src/lib/styles/_table.scss +1 -1
- package/theming/_natural.theme.scss +1 -1
- package/bundles/ecodev-natural.umd.js +0 -11318
- package/bundles/ecodev-natural.umd.js.map +0 -1
- package/ecodev-natural.metadata.json +0 -1
- package/esm2015/ecodev-natural.js +0 -14
- package/esm2015/lib/classes/abstract-controller.js +0 -29
- package/esm2015/lib/classes/abstract-detail.js +0 -157
- package/esm2015/lib/classes/abstract-editable-list.js +0 -97
- package/esm2015/lib/classes/abstract-list.js +0 -409
- package/esm2015/lib/classes/abstract-navigable-list.js +0 -126
- package/esm2015/lib/classes/data-source.js +0 -76
- package/esm2015/lib/classes/query-variable-manager.js +0 -161
- package/esm2015/lib/classes/validators.js +0 -176
- package/esm2015/lib/directives/http-prefix.directive.js +0 -46
- package/esm2015/lib/modules/alert/alert.module.js +0 -15
- package/esm2015/lib/modules/alert/alert.service.js +0 -59
- package/esm2015/lib/modules/alert/confirm.component.js +0 -17
- package/esm2015/lib/modules/avatar/avatar.module.js +0 -14
- package/esm2015/lib/modules/avatar/component/avatar.component.js +0 -158
- package/esm2015/lib/modules/avatar/service/avatar.service.js +0 -65
- package/esm2015/lib/modules/avatar/sources/gravatar.js +0 -29
- package/esm2015/lib/modules/columns-picker/columns-picker-column.directive.js +0 -41
- package/esm2015/lib/modules/columns-picker/columns-picker.component.js +0 -82
- package/esm2015/lib/modules/columns-picker/columns-picker.module.js +0 -28
- package/esm2015/lib/modules/common/common-module.js +0 -35
- package/esm2015/lib/modules/common/directives/linkable-tab.directive.js +0 -82
- package/esm2015/lib/modules/common/directives/reactive-asterisk.directive.js +0 -31
- package/esm2015/lib/modules/common/directives/src-density.directive.js +0 -63
- package/esm2015/lib/modules/common/pipes/capitalize.pipe.js +0 -14
- package/esm2015/lib/modules/common/pipes/ellipsis.pipe.js +0 -10
- package/esm2015/lib/modules/common/pipes/enum.pipe.js +0 -24
- package/esm2015/lib/modules/common/pipes/swiss-date.pipe.js +0 -16
- package/esm2015/lib/modules/common/public-api.js +0 -14
- package/esm2015/lib/modules/common/services/memory-storage.js +0 -110
- package/esm2015/lib/modules/common/services/seo.service.js +0 -120
- package/esm2015/lib/modules/detail-header/detail-header.component.js +0 -63
- package/esm2015/lib/modules/detail-header/detail-header.module.js +0 -16
- package/esm2015/lib/modules/dialog-trigger/dialog-trigger.component.js +0 -68
- package/esm2015/lib/modules/dialog-trigger/dialog-trigger.module.js +0 -14
- package/esm2015/lib/modules/dropdown-components/abstract-association-select-component.directive.js +0 -96
- package/esm2015/lib/modules/dropdown-components/natural-dropdown-components.module.js +0 -51
- package/esm2015/lib/modules/dropdown-components/type-date/type-date.component.js +0 -123
- package/esm2015/lib/modules/dropdown-components/type-date-range/type-date-range.component.js +0 -128
- package/esm2015/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.js +0 -63
- package/esm2015/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.js +0 -31
- package/esm2015/lib/modules/dropdown-components/type-number/type-number.component.js +0 -99
- package/esm2015/lib/modules/dropdown-components/type-select/type-select.component.js +0 -161
- package/esm2015/lib/modules/dropdown-components/type-text/type-text.component.js +0 -53
- package/esm2015/lib/modules/file/abstract-file.js +0 -223
- package/esm2015/lib/modules/file/component/file.component.js +0 -133
- package/esm2015/lib/modules/file/file-drop.directive.js +0 -99
- package/esm2015/lib/modules/file/file-select.directive.js +0 -25
- package/esm2015/lib/modules/file/file.module.js +0 -19
- package/esm2015/lib/modules/file/file.service.js +0 -47
- package/esm2015/lib/modules/fixed-button/fixed-button.component.js +0 -23
- package/esm2015/lib/modules/fixed-button/fixed-button.module.js +0 -16
- package/esm2015/lib/modules/fixed-button-detail/fixed-button-detail.component.js +0 -31
- package/esm2015/lib/modules/fixed-button-detail/fixed-button-detail.module.js +0 -15
- package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.js +0 -351
- package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.js +0 -258
- package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.js +0 -28
- package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.js +0 -23
- package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector.module.js +0 -46
- package/esm2015/lib/modules/icon/icon.component.js +0 -78
- package/esm2015/lib/modules/icon/icon.module.js +0 -25
- package/esm2015/lib/modules/matomo/matomo-module.module.js +0 -7
- package/esm2015/lib/modules/matomo/matomo.service.js +0 -106
- package/esm2015/lib/modules/panels/abstract-panel.js +0 -50
- package/esm2015/lib/modules/panels/panels.component.js +0 -26
- package/esm2015/lib/modules/panels/panels.module.js +0 -28
- package/esm2015/lib/modules/panels/panels.service.js +0 -331
- package/esm2015/lib/modules/relations/relations.component.js +0 -181
- package/esm2015/lib/modules/relations/relations.module.js +0 -33
- package/esm2015/lib/modules/search/dropdown-container/dropdown-container.component.js +0 -87
- package/esm2015/lib/modules/search/dropdown-container/dropdown.service.js +0 -95
- package/esm2015/lib/modules/search/facet-selector/facet-selector.component.js +0 -47
- package/esm2015/lib/modules/search/group/group.component.js +0 -39
- package/esm2015/lib/modules/search/input/input.component.js +0 -316
- package/esm2015/lib/modules/search/search/search.component.js +0 -71
- package/esm2015/lib/modules/search/search.module.js +0 -52
- package/esm2015/lib/modules/select/abstract-select.component.js +0 -176
- package/esm2015/lib/modules/select/select/select.component.js +0 -190
- package/esm2015/lib/modules/select/select-enum/select-enum.component.js +0 -34
- package/esm2015/lib/modules/select/select-hierarchic/select-hierarchic.component.js +0 -120
- package/esm2015/lib/modules/select/select.module.js +0 -39
- package/esm2015/lib/modules/sidenav/sidenav/sidenav.component.js +0 -12
- package/esm2015/lib/modules/sidenav/sidenav-container/sidenav-container.component.js +0 -79
- package/esm2015/lib/modules/sidenav/sidenav-content/sidenav-content.component.js +0 -13
- package/esm2015/lib/modules/sidenav/sidenav-stack.service.js +0 -50
- package/esm2015/lib/modules/sidenav/sidenav.module.js +0 -20
- package/esm2015/lib/modules/sidenav/sidenav.service.js +0 -199
- package/esm2015/lib/modules/stamp/stamp-module.module.js +0 -13
- package/esm2015/lib/modules/stamp/stamp.component.js +0 -13
- package/esm2015/lib/modules/table-button/table-button.component.js +0 -38
- package/esm2015/lib/modules/table-button/table-button.module.js +0 -16
- package/esm2015/lib/services/abstract-model.service.js +0 -509
- package/esm2015/lib/services/enum.service.js +0 -68
- package/esm2015/lib/services/link-mutation.service.js +0 -155
- package/esm2015/lib/services/persistence.service.js +0 -114
- package/esm2015/lib/services/swiss-parsing-date-adapter.service.js +0 -55
- package/fesm2015/ecodev-natural.js.map +0 -1
- package/lib/modules/common/directives/reactive-asterisk.directive.d.ts +0 -10
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { Directive, EventEmitter, HostListener, Inject, Input, Output, } from '@angular/core';
|
|
2
|
+
import { acceptType, createInvisibleFileInputWrap, detectSwipe, eventToFiles, fileListToArray, isFileInput, stopEvent, } from './utils';
|
|
3
|
+
import { NaturalAbstractController } from '../../classes/abstract-controller';
|
|
4
|
+
import { DOCUMENT } from '@angular/common';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "./file.service";
|
|
7
|
+
/**
|
|
8
|
+
* A master base set of logic intended to support file select/drag/drop operations
|
|
9
|
+
*
|
|
10
|
+
* In most cases you probably want click-to-select and drag-to-select, so you should use:
|
|
11
|
+
*
|
|
12
|
+
* <div naturalFileDrop [selectable]="true"></div>
|
|
13
|
+
*
|
|
14
|
+
* @dynamic
|
|
15
|
+
*/
|
|
16
|
+
export class NaturalAbstractFile extends NaturalAbstractController {
|
|
17
|
+
constructor(element, naturalFileService, document) {
|
|
18
|
+
super();
|
|
19
|
+
this.element = element;
|
|
20
|
+
this.naturalFileService = naturalFileService;
|
|
21
|
+
this.document = document;
|
|
22
|
+
this.validators = [
|
|
23
|
+
{ name: 'accept', fn: this.acceptValidator },
|
|
24
|
+
{ name: 'fileSize', fn: this.fileSizeValidator },
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Whether we should accept a single file or multiple files
|
|
28
|
+
*/
|
|
29
|
+
this.multiple = false;
|
|
30
|
+
/**
|
|
31
|
+
* Comma-separated list of unique file type specifiers. Like the native element
|
|
32
|
+
* it can be a mixed of mime-type and file extensions.
|
|
33
|
+
*
|
|
34
|
+
* See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#accept
|
|
35
|
+
*/
|
|
36
|
+
this.accept = '';
|
|
37
|
+
/**
|
|
38
|
+
* Maximum file size in bytes. 0 means no validation at all.
|
|
39
|
+
*/
|
|
40
|
+
this.maxSize = 0;
|
|
41
|
+
/**
|
|
42
|
+
* Disable the file selection entirely
|
|
43
|
+
*/
|
|
44
|
+
this.fileSelectionDisabled = false;
|
|
45
|
+
/**
|
|
46
|
+
* Whether the user can click on the element to select something
|
|
47
|
+
*
|
|
48
|
+
* This has only effect during initialization. Subsequent changes will have
|
|
49
|
+
* no effect.
|
|
50
|
+
*/
|
|
51
|
+
this.selectable = false;
|
|
52
|
+
/**
|
|
53
|
+
* If true, the file selection will be broadcast through `NaturalFileService.filesChanged`.
|
|
54
|
+
*
|
|
55
|
+
* It is useful to set this to false if there is two upload on a page with different purpose
|
|
56
|
+
* and the second upload should not be confused with the first one.
|
|
57
|
+
*/
|
|
58
|
+
this.broadcast = true;
|
|
59
|
+
/**
|
|
60
|
+
* The single valid file that has been selected.
|
|
61
|
+
*
|
|
62
|
+
* It is for convenience of use, and will only emit if there is at least one
|
|
63
|
+
* valid file. See `filesChange` for a more complete output.
|
|
64
|
+
*/
|
|
65
|
+
this.fileChange = new EventEmitter();
|
|
66
|
+
/**
|
|
67
|
+
* The list of files that have been selected.
|
|
68
|
+
*/
|
|
69
|
+
this.filesChange = new EventEmitter();
|
|
70
|
+
}
|
|
71
|
+
ngOnDestroy() {
|
|
72
|
+
super.ngOnDestroy();
|
|
73
|
+
delete this.fileElement; // faster memory release of dom element
|
|
74
|
+
}
|
|
75
|
+
ngOnInit() {
|
|
76
|
+
if (this.selectable) {
|
|
77
|
+
this.enableSelecting();
|
|
78
|
+
}
|
|
79
|
+
this.getFileElement().multiple = this.multiple;
|
|
80
|
+
}
|
|
81
|
+
ngOnChanges(changes) {
|
|
82
|
+
if (changes.accept) {
|
|
83
|
+
this.getFileElement().setAttribute('accept', changes.accept.currentValue || '*');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
getFileElement() {
|
|
87
|
+
if (this.fileElement) {
|
|
88
|
+
return this.fileElement;
|
|
89
|
+
}
|
|
90
|
+
// elm is a file input
|
|
91
|
+
if (isFileInput(this.element.nativeElement)) {
|
|
92
|
+
this.fileElement = this.element.nativeElement;
|
|
93
|
+
return this.fileElement;
|
|
94
|
+
}
|
|
95
|
+
// create foo file input
|
|
96
|
+
const label = createInvisibleFileInputWrap(this.document);
|
|
97
|
+
this.fileElement = label.getElementsByTagName('input')[0];
|
|
98
|
+
this.fileElement.addEventListener('change', this.changeFn.bind(this));
|
|
99
|
+
this.element.nativeElement.appendChild(label);
|
|
100
|
+
return this.fileElement;
|
|
101
|
+
}
|
|
102
|
+
enableSelecting() {
|
|
103
|
+
const elm = this.element.nativeElement;
|
|
104
|
+
if (isFileInput(elm)) {
|
|
105
|
+
const bindedHandler = () => this.beforeSelect();
|
|
106
|
+
elm.addEventListener('click', bindedHandler);
|
|
107
|
+
elm.addEventListener('touchstart', bindedHandler);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
const bindedHandler = (event) => this.clickHandler(event);
|
|
112
|
+
elm.addEventListener('click', bindedHandler);
|
|
113
|
+
elm.addEventListener('touchstart', bindedHandler);
|
|
114
|
+
elm.addEventListener('touchend', bindedHandler);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
handleFiles(files) {
|
|
118
|
+
const selection = {
|
|
119
|
+
valid: [],
|
|
120
|
+
invalid: [],
|
|
121
|
+
};
|
|
122
|
+
for (const file of files) {
|
|
123
|
+
const error = this.validate(file);
|
|
124
|
+
if (error) {
|
|
125
|
+
selection.invalid.push({
|
|
126
|
+
file: file,
|
|
127
|
+
error: error,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
selection.valid.push(file);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (selection.valid.length) {
|
|
135
|
+
this.fileChange.emit(selection.valid[0]);
|
|
136
|
+
}
|
|
137
|
+
if (selection.valid.length || selection.invalid.length) {
|
|
138
|
+
this.filesChange.emit(selection);
|
|
139
|
+
if (this.broadcast) {
|
|
140
|
+
this.naturalFileService.filesChanged.next(selection);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
this.getFileElement().value = '';
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Called when input has files
|
|
147
|
+
*/
|
|
148
|
+
changeFn(event) {
|
|
149
|
+
if (!(event.target instanceof HTMLInputElement)) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const fileList = event.target.files;
|
|
153
|
+
if (!fileList) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
stopEvent(event);
|
|
157
|
+
this.handleFiles(fileListToArray(fileList));
|
|
158
|
+
}
|
|
159
|
+
clickHandler(event) {
|
|
160
|
+
const elm = this.element.nativeElement;
|
|
161
|
+
if (elm.getAttribute('disabled') || this.fileSelectionDisabled) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
// prevent the click if it is a swipe
|
|
165
|
+
if (detectSwipe(event)) {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
const fileElm = this.getFileElement();
|
|
169
|
+
fileElm.click();
|
|
170
|
+
this.beforeSelect();
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
beforeSelect() {
|
|
174
|
+
if (!this.fileElement) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// if no files in array, be sure browser doesnt prevent reselect of same file (see github issue 27)
|
|
178
|
+
this.fileElement.value = '';
|
|
179
|
+
}
|
|
180
|
+
onChange(event) {
|
|
181
|
+
const fileList = this.getFileElement().files;
|
|
182
|
+
const files = fileList ? fileListToArray(fileList) : eventToFiles(event);
|
|
183
|
+
if (!files.length) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
stopEvent(event);
|
|
187
|
+
this.handleFiles(files);
|
|
188
|
+
}
|
|
189
|
+
validate(file) {
|
|
190
|
+
for (const validator of this.validators) {
|
|
191
|
+
if (!validator.fn.call(this, file)) {
|
|
192
|
+
return validator.name;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
acceptValidator(item) {
|
|
198
|
+
return acceptType(this.accept, item.type, item.name);
|
|
199
|
+
}
|
|
200
|
+
fileSizeValidator(item) {
|
|
201
|
+
return !(this.maxSize && item.size > this.maxSize);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
NaturalAbstractFile.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalAbstractFile, deps: [{ token: i0.ElementRef }, { token: i1.NaturalFileService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive });
|
|
205
|
+
NaturalAbstractFile.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: NaturalAbstractFile, inputs: { multiple: "multiple", accept: "accept", maxSize: "maxSize", fileSelectionDisabled: "fileSelectionDisabled", selectable: "selectable", broadcast: "broadcast" }, outputs: { fileChange: "fileChange", filesChange: "filesChange" }, host: { listeners: { "change": "onChange($event)" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
|
|
206
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalAbstractFile, decorators: [{
|
|
207
|
+
type: Directive
|
|
208
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.NaturalFileService }, { type: Document, decorators: [{
|
|
209
|
+
type: Inject,
|
|
210
|
+
args: [DOCUMENT]
|
|
211
|
+
}] }]; }, propDecorators: { multiple: [{
|
|
212
|
+
type: Input
|
|
213
|
+
}], accept: [{
|
|
214
|
+
type: Input
|
|
215
|
+
}], maxSize: [{
|
|
216
|
+
type: Input
|
|
217
|
+
}], fileSelectionDisabled: [{
|
|
218
|
+
type: Input
|
|
219
|
+
}], selectable: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}], broadcast: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], fileChange: [{
|
|
224
|
+
type: Output
|
|
225
|
+
}], filesChange: [{
|
|
226
|
+
type: Output
|
|
227
|
+
}], onChange: [{
|
|
228
|
+
type: HostListener,
|
|
229
|
+
args: ['change', ['$event']]
|
|
230
|
+
}] } });
|
|
231
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL2ZpbGUvYWJzdHJhY3QtZmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFJTCxNQUFNLEdBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILFVBQVUsRUFDViw0QkFBNEIsRUFDNUIsV0FBVyxFQUNYLFlBQVksRUFDWixlQUFlLEVBQ2YsV0FBVyxFQUNYLFNBQVMsR0FDWixNQUFNLFNBQVMsQ0FBQztBQUVqQixPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUM1RSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7OztBQW1CekM7Ozs7Ozs7O0dBUUc7QUFFSCxNQUFNLE9BQWdCLG1CQUFvQixTQUFRLHlCQUF5QjtJQTJEdkUsWUFDcUIsT0FBZ0MsRUFDOUIsa0JBQXNDLEVBQ3RCLFFBQWtCO1FBRXJELEtBQUssRUFBRSxDQUFDO1FBSlMsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFDOUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBNUR4QyxlQUFVLEdBQUc7WUFDMUIsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFDO1lBQzFDLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFDO1NBQ2pELENBQUM7UUFFRjs7V0FFRztRQUNhLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakM7Ozs7O1dBS0c7UUFDYSxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBRTVCOztXQUVHO1FBQ2EsWUFB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e1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgYWNjZXB0VHlwZSxcbiAgICBjcmVhdGVJbnZpc2libGVGaWxlSW5wdXRXcmFwLFxuICAgIGRldGVjdFN3aXBlLFxuICAgIGV2ZW50VG9GaWxlcyxcbiAgICBmaWxlTGlzdFRvQXJyYXksXG4gICAgaXNGaWxlSW5wdXQsXG4gICAgc3RvcEV2ZW50LFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7TmF0dXJhbEZpbGVTZXJ2aWNlfSBmcm9tICcuL2ZpbGUuc2VydmljZSc7XG5pbXBvcnQge05hdHVyYWxBYnN0cmFjdENvbnRyb2xsZXJ9IGZyb20gJy4uLy4uL2NsYXNzZXMvYWJzdHJhY3QtY29udHJvbGxlcic7XG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEludmFsaWRGaWxlIHtcbiAgICBmaWxlOiBGaWxlO1xuICAgIGVycm9yOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlbGVjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQuXG4gICAgICovXG4gICAgdmFsaWQ6IEZpbGVbXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkIGJ1dCBhcmUgaW52YWxpZCBhY2NvcmRpbmcgdG8gdmFsaWRhdG9ycy5cbiAgICAgKi9cbiAgICBpbnZhbGlkOiBJbnZhbGlkRmlsZVtdO1xufVxuXG4vKipcbiAqIEEgbWFzdGVyIGJhc2Ugc2V0IG9mIGxvZ2ljIGludGVuZGVkIHRvIHN1cHBvcnQgZmlsZSBzZWxlY3QvZHJhZy9kcm9wIG9wZXJhdGlvbnNcbiAqXG4gKiBJbiBtb3N0IGNhc2VzIHlvdSBwcm9iYWJseSB3YW50IGNsaWNrLXRvLXNlbGVjdCBhbmQgZHJhZy10by1zZWxlY3QsIHNvIHlvdSBzaG91bGQgdXNlOlxuICpcbiAqICAgICA8ZGl2IG5hdHVyYWxGaWxlRHJvcCBbc2VsZWN0YWJsZV09XCJ0cnVlXCI+PC9kaXY+XG4gKlxuICogQGR5bmFtaWNcbiAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmF0dXJhbEFic3RyYWN0RmlsZSBleHRlbmRzIE5hdHVyYWxBYnN0cmFjdENvbnRyb2xsZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgICBwcml2YXRlIGZpbGVFbGVtZW50PzogSFRNTElucHV0RWxlbWVudDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcnMgPSBbXG4gICAgICAgIHtuYW1lOiAnYWNjZXB0JywgZm46IHRoaXMuYWNjZXB0VmFsaWRhdG9yfSxcbiAgICAgICAge25hbWU6ICdmaWxlU2l6ZScsIGZuOiB0aGlzLmZpbGVTaXplVmFsaWRhdG9yfSxcbiAgICBdO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB3ZSBzaG91bGQgYWNjZXB0IGEgc2luZ2xlIGZpbGUgb3IgbXVsdGlwbGUgZmlsZXNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbXVsdGlwbGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHVuaXF1ZSBmaWxlIHR5cGUgc3BlY2lmaWVycy4gTGlrZSB0aGUgbmF0aXZlIGVsZW1lbnRcbiAgICAgKiBpdCBjYW4gYmUgYSBtaXhlZCBvZiBtaW1lLXR5cGUgYW5kIGZpbGUgZXh0ZW5zaW9ucy5cbiAgICAgKlxuICAgICAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQvZmlsZSNhY2NlcHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgYWNjZXB0ID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIGZpbGUgc2l6ZSBpbiBieXRlcy4gMCBtZWFucyBubyB2YWxpZGF0aW9uIGF0IGFsbC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4U2l6ZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIHRoZSBmaWxlIHNlbGVjdGlvbiBlbnRpcmVseVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmaWxlU2VsZWN0aW9uRGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgY2FuIGNsaWNrIG9uIHRoZSBlbGVtZW50IHRvIHNlbGVjdCBzb21ldGhpbmdcbiAgICAgKlxuICAgICAqIFRoaXMgaGFzIG9ubHkgZWZmZWN0IGR1cmluZyBpbml0aWFsaXphdGlvbi4gU3Vic2VxdWVudCBjaGFuZ2VzIHdpbGwgaGF2ZVxuICAgICAqIG5vIGVmZmVjdC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0YWJsZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSwgdGhlIGZpbGUgc2VsZWN0aW9uIHdpbGwgYmUgYnJvYWRjYXN0IHRocm91Z2ggYE5hdHVyYWxGaWxlU2VydmljZS5maWxlc0NoYW5nZWRgLlxuICAgICAqXG4gICAgICogSXQgaXMgdXNlZnVsIHRvIHNldCB0aGlzIHRvIGZhbHNlIGlmIHRoZXJlIGlzIHR3byB1cGxvYWQgb24gYSBwYWdlIHdpdGggZGlmZmVyZW50IHB1cnBvc2VcbiAgICAgKiBhbmQgdGhlIHNlY29uZCB1cGxvYWQgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIHRoZSBmaXJzdCBvbmUuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGJyb2FkY2FzdCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2luZ2xlIHZhbGlkIGZpbGUgdGhhdCBoYXMgYmVlbiBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEl0IGlzIGZvciBjb252ZW5pZW5jZSBvZiB1c2UsIGFuZCB3aWxsIG9ubHkgZW1pdCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmVcbiAgICAgKiB2YWxpZCBmaWxlLiBTZWUgYGZpbGVzQ2hhbmdlYCBmb3IgYSBtb3JlIGNvbXBsZXRlIG91dHB1dC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGZpbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGZpbGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlU2VsZWN0aW9uPigpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmF0dXJhbEZpbGVTZXJ2aWNlOiBOYXR1cmFsRmlsZVNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZmlsZUVsZW1lbnQ7IC8vIGZhc3RlciBtZW1vcnkgcmVsZWFzZSBvZiBkb20gZWxlbWVudFxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVTZWxlY3RpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2V0RmlsZUVsZW1lbnQoKS5tdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuYWNjZXB0KSB7XG4gICAgICAgICAgICB0aGlzLmdldEZpbGVFbGVtZW50KCkuc2V0QXR0cmlidXRlKCdhY2NlcHQnLCBjaGFuZ2VzLmFjY2VwdC5jdXJyZW50VmFsdWUgfHwgJyonKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmlsZUVsZW1lbnQoKTogSFRNTElucHV0RWxlbWVudCB7XG4gICAgICAgIGlmICh0aGlzLmZpbGVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVsbSBpcyBhIGZpbGUgaW5wdXRcbiAgICAgICAgaWYgKGlzRmlsZUlucHV0KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5maWxlRWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNyZWF0ZSBmb28gZmlsZSBpbnB1dFxuICAgICAgICBjb25zdCBsYWJlbCA9IGNyZWF0ZUludmlzaWJsZUZpbGVJbnB1dFdyYXAodGhpcy5kb2N1bWVudCk7XG4gICAgICAgIHRoaXMuZmlsZUVsZW1lbnQgPSBsYWJlbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXTtcbiAgICAgICAgdGhpcy5maWxlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLmNoYW5nZUZuLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChsYWJlbCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVTZWxlY3RpbmcoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsbSA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmIChpc0ZpbGVJbnB1dChlbG0pKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZWRIYW5kbGVyID0gKCk6IHZvaWQgPT4gdGhpcy5iZWZvcmVTZWxlY3QoKTtcbiAgICAgICAgICAgIGVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJpbmRlZEhhbmRsZXIpO1xuICAgICAgICAgICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBiaW5kZWRIYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlZEhhbmRsZXIgPSAoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiA9PiB0aGlzLmNsaWNrSGFuZGxlcihldmVudCk7XG4gICAgICAgICAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBiaW5kZWRIYW5kbGVyKTtcbiAgICAgICAgICAgIGVsbS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgYmluZGVkSGFuZGxlcik7XG4gICAgICAgICAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBiaW5kZWRIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVGaWxlcyhmaWxlczogRmlsZVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbjogRmlsZVNlbGVjdGlvbiA9IHtcbiAgICAgICAgICAgIHZhbGlkOiBbXSxcbiAgICAgICAgICAgIGludmFsaWQ6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLnZhbGlkYXRlKGZpbGUpO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLmludmFsaWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnZhbGlkLnB1c2goZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0aW9uLnZhbGlkLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5maWxlQ2hhbmdlLmVtaXQoc2VsZWN0aW9uLnZhbGlkWzBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3Rpb24udmFsaWQubGVuZ3RoIHx8IHNlbGVjdGlvbi5pbnZhbGlkLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5maWxlc0NoYW5nZS5lbWl0KHNlbGVjdGlvbik7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmJyb2FkY2FzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0dXJhbEZpbGVTZXJ2aWNlLmZpbGVzQ2hhbmdlZC5uZXh0KHNlbGVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldEZpbGVFbGVtZW50KCkudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBpbnB1dCBoYXMgZmlsZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGNoYW5nZUZuKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZUxpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XG5cbiAgICAgICAgaWYgKCFmaWxlTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgdGhpcy5oYW5kbGVGaWxlcyhmaWxlTGlzdFRvQXJyYXkoZmlsZUxpc3QpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsaWNrSGFuZGxlcihldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZWxtID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChlbG0uZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8IHRoaXMuZmlsZVNlbGVjdGlvbkRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwcmV2ZW50IHRoZSBjbGljayBpZiBpdCBpcyBhIHN3aXBlXG4gICAgICAgIGlmIChkZXRlY3RTd2lwZShldmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZUVsbSA9IHRoaXMuZ2V0RmlsZUVsZW1lbnQoKTtcbiAgICAgICAgZmlsZUVsbS5jbGljaygpO1xuICAgICAgICB0aGlzLmJlZm9yZVNlbGVjdCgpO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJlZm9yZVNlbGVjdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbGVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBubyBmaWxlcyBpbiBhcnJheSwgYmUgc3VyZSBicm93c2VyIGRvZXNudCBwcmV2ZW50IHJlc2VsZWN0IG9mIHNhbWUgZmlsZSAoc2VlIGdpdGh1YiBpc3N1ZSAyNylcbiAgICAgICAgdGhpcy5maWxlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWxlTGlzdCA9IHRoaXMuZ2V0RmlsZUVsZW1lbnQoKS5maWxlcztcbiAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVbXSA9IGZpbGVMaXN0ID8gZmlsZUxpc3RUb0FycmF5KGZpbGVMaXN0KSA6IGV2ZW50VG9GaWxlcyhldmVudCk7XG5cbiAgICAgICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgIHRoaXMuaGFuZGxlRmlsZXMoZmlsZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGUoZmlsZTogRmlsZSk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiB0aGlzLnZhbGlkYXRvcnMpIHtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdG9yLmZuLmNhbGwodGhpcywgZmlsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdG9yLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFjY2VwdFZhbGlkYXRvcihpdGVtOiBGaWxlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhY2NlcHRUeXBlKHRoaXMuYWNjZXB0LCBpdGVtLnR5cGUsIGl0ZW0ubmFtZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWxlU2l6ZVZhbGlkYXRvcihpdGVtOiBGaWxlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhKHRoaXMubWF4U2l6ZSAmJiBpdGVtLnNpemUgPiB0aGlzLm1heFNpemUpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { Component, EventEmitter, HostBinding, Inject, Input, Output, } from '@angular/core';
|
|
2
|
+
import { of, Subject } from 'rxjs';
|
|
3
|
+
import { DOCUMENT } from '@angular/common';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../file.service";
|
|
6
|
+
import * as i2 from "@angular/platform-browser";
|
|
7
|
+
import * as i3 from "../../icon/icon.component";
|
|
8
|
+
import * as i4 from "../file-drop.directive";
|
|
9
|
+
import * as i5 from "@angular/material/core";
|
|
10
|
+
import * as i6 from "@angular/common";
|
|
11
|
+
import * as i7 from "../../common/pipes/capitalize.pipe";
|
|
12
|
+
// @dynamic
|
|
13
|
+
export class FileComponent {
|
|
14
|
+
constructor(naturalFileService, sanitizer, document) {
|
|
15
|
+
this.naturalFileService = naturalFileService;
|
|
16
|
+
this.sanitizer = sanitizer;
|
|
17
|
+
this.document = document;
|
|
18
|
+
this.height = 250;
|
|
19
|
+
this.action = null;
|
|
20
|
+
this.backgroundSize = 'contain';
|
|
21
|
+
/**
|
|
22
|
+
* Comma separated list of accepted mimetypes
|
|
23
|
+
*/
|
|
24
|
+
this.accept = 'image/bmp,image/gif,image/jpeg,image/pjpeg,image/png,image/svg+xml,image/svg,image/webp';
|
|
25
|
+
this.model = null;
|
|
26
|
+
/**
|
|
27
|
+
* If provided, get updated on change
|
|
28
|
+
* Is not used for reading -> use [model]
|
|
29
|
+
*/
|
|
30
|
+
this.formCtrl = null;
|
|
31
|
+
this.modelChange = new EventEmitter();
|
|
32
|
+
this.imagePreview = null;
|
|
33
|
+
this.filePreview = null;
|
|
34
|
+
}
|
|
35
|
+
ngOnInit() {
|
|
36
|
+
this.updateImage();
|
|
37
|
+
}
|
|
38
|
+
ngOnChanges(changes) {
|
|
39
|
+
if (changes.model && changes.model.previousValue !== changes.model.currentValue) {
|
|
40
|
+
this.updateImage();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
upload(file) {
|
|
44
|
+
this.model = { file: file };
|
|
45
|
+
this.updateImage();
|
|
46
|
+
if (this.formCtrl) {
|
|
47
|
+
this.formCtrl.setValue(this.model);
|
|
48
|
+
}
|
|
49
|
+
if (this.service) {
|
|
50
|
+
this.service.create(this.model).subscribe(result => {
|
|
51
|
+
this.model = result;
|
|
52
|
+
this.modelChange.emit(result);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.modelChange.emit(this.model);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
getDownloadLink() {
|
|
60
|
+
if (this.action !== 'download') {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return this.naturalFileService.getDownloadLink(this.model);
|
|
64
|
+
}
|
|
65
|
+
updateImage() {
|
|
66
|
+
this.imagePreview = null;
|
|
67
|
+
this.filePreview = null;
|
|
68
|
+
if (!this.model) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (this.model.file?.type.includes('image/')) {
|
|
72
|
+
// Model from upload (before saving)
|
|
73
|
+
this.getBase64(this.model.file).subscribe(result => {
|
|
74
|
+
const content = 'url(data:' + this.model?.file?.type + ';base64,' + result + ')';
|
|
75
|
+
this.imagePreview = this.sanitizer.bypassSecurityTrustStyle(content);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else if (this.model.file) {
|
|
79
|
+
this.filePreview = this.model.file.type.split('/')[1];
|
|
80
|
+
}
|
|
81
|
+
else if (this.model.__typename === 'Image' && this.model.id) {
|
|
82
|
+
// Model image with id, use specific API to render image by size
|
|
83
|
+
const window = this.document.defaultView;
|
|
84
|
+
if (!window) {
|
|
85
|
+
throw new Error('Could not show image preview because `window` is undefined');
|
|
86
|
+
}
|
|
87
|
+
const loc = window.location;
|
|
88
|
+
const height = this.height ? '/' + this.height : '';
|
|
89
|
+
// create image url without port to stay compatible with dev mode
|
|
90
|
+
const image = loc.protocol + '//' + loc.hostname + '/api/image/' + this.model.id + height;
|
|
91
|
+
this.imagePreview = this.sanitizer.bypassSecurityTrustStyle('url(' + image + ')');
|
|
92
|
+
}
|
|
93
|
+
else if (this.model?.mime && ['File', 'AccountingDocument'].includes(this.model.__typename || '')) {
|
|
94
|
+
this.filePreview = this.model.mime.split('/')[1];
|
|
95
|
+
}
|
|
96
|
+
else if (this.model.src) {
|
|
97
|
+
// external url
|
|
98
|
+
this.imagePreview = this.sanitizer.bypassSecurityTrustStyle('url(' + this.model.src + ')');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
getBase64(file) {
|
|
102
|
+
if (!file) {
|
|
103
|
+
return of('');
|
|
104
|
+
}
|
|
105
|
+
const subject = new Subject();
|
|
106
|
+
const reader = new FileReader();
|
|
107
|
+
reader.addEventListener('load', (ev) => {
|
|
108
|
+
subject.next(btoa(ev.target.result));
|
|
109
|
+
subject.complete();
|
|
110
|
+
});
|
|
111
|
+
reader.readAsBinaryString(file);
|
|
112
|
+
return subject.asObservable();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
FileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: FileComponent, deps: [{ token: i1.NaturalFileService }, { token: i2.DomSanitizer }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
|
|
116
|
+
FileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: FileComponent, selector: "natural-file", inputs: { height: "height", action: "action", backgroundSize: "backgroundSize", accept: "accept", service: "service", model: "model", formCtrl: "formCtrl" }, outputs: { modelChange: "modelChange" }, host: { properties: { "style.height.px": "this.height" } }, usesOnChanges: true, ngImport: i0, template: "<a\n (fileChange)=\"upload($event)\"\n naturalFileDrop\n [selectable]=\"true\"\n [accept]=\"accept\"\n [attr.href]=\"getDownloadLink()\"\n [class.has-action]=\"!!action\"\n [class.suggest-upload]=\"!model && action === 'upload'\"\n [fileSelectionDisabled]=\"action !== 'upload'\"\n [matRippleDisabled]=\"!action\"\n [style.backgroundImage]=\"imagePreview\"\n [style.backgroundSize]=\"backgroundSize\"\n matRipple\n target=\"_blank\"\n>\n <div *ngIf=\"filePreview\" class=\"file-preview\">\n <natural-icon [size]=\"height * 0.33\" name=\"attachment\"></natural-icon>\n {{ filePreview | uppercase }}\n </div>\n\n <div class=\"action-overlay\">\n <natural-icon *ngIf=\"action === 'upload'\" [size]=\"height * 0.66\" name=\"cloud_upload\"></natural-icon>\n <natural-icon *ngIf=\"action === 'download'\" [size]=\"height * 0.66\" name=\"get_app\"></natural-icon>\n {{ action | capitalize }}\n </div>\n</a>\n", styles: [":host{display:flex;flex-direction:row;overflow:hidden;position:relative}:host>a{position:relative;flex:1;background-position:center;background-repeat:no-repeat}:host>a.has-action{cursor:pointer}:host>a.has-action.suggest-upload .action-overlay{opacity:.66}:host>a.has-action:hover .action-overlay,:host>a.has-action.natural-file-over .action-overlay{opacity:1}:host .action-overlay,:host .file-preview{display:flex;flex-direction:column;position:absolute;top:0;left:0;right:0;bottom:0;justify-content:center;align-items:center;font-size:36px;line-height:1.3em;text-align:center}:host .action-overlay{opacity:0}:host .action-overlay>div{opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;display:flex;justify-content:center;align-items:center}\n"], components: [{ type: i3.NaturalIconComponent, selector: "natural-icon", inputs: ["label", "labelColor", "labelPosition", "name", "size"] }], directives: [{ type: i4.NaturalFileDropDirective, selector: ":not([naturalFileSelect])[naturalFileDrop]", outputs: ["fileOver"] }, { type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "uppercase": i6.UpperCasePipe, "capitalize": i7.NaturalCapitalizePipe } });
|
|
117
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: FileComponent, decorators: [{
|
|
118
|
+
type: Component,
|
|
119
|
+
args: [{ selector: 'natural-file', template: "<a\n (fileChange)=\"upload($event)\"\n naturalFileDrop\n [selectable]=\"true\"\n [accept]=\"accept\"\n [attr.href]=\"getDownloadLink()\"\n [class.has-action]=\"!!action\"\n [class.suggest-upload]=\"!model && action === 'upload'\"\n [fileSelectionDisabled]=\"action !== 'upload'\"\n [matRippleDisabled]=\"!action\"\n [style.backgroundImage]=\"imagePreview\"\n [style.backgroundSize]=\"backgroundSize\"\n matRipple\n target=\"_blank\"\n>\n <div *ngIf=\"filePreview\" class=\"file-preview\">\n <natural-icon [size]=\"height * 0.33\" name=\"attachment\"></natural-icon>\n {{ filePreview | uppercase }}\n </div>\n\n <div class=\"action-overlay\">\n <natural-icon *ngIf=\"action === 'upload'\" [size]=\"height * 0.66\" name=\"cloud_upload\"></natural-icon>\n <natural-icon *ngIf=\"action === 'download'\" [size]=\"height * 0.66\" name=\"get_app\"></natural-icon>\n {{ action | capitalize }}\n </div>\n</a>\n", styles: [":host{display:flex;flex-direction:row;overflow:hidden;position:relative}:host>a{position:relative;flex:1;background-position:center;background-repeat:no-repeat}:host>a.has-action{cursor:pointer}:host>a.has-action.suggest-upload .action-overlay{opacity:.66}:host>a.has-action:hover .action-overlay,:host>a.has-action.natural-file-over .action-overlay{opacity:1}:host .action-overlay,:host .file-preview{display:flex;flex-direction:column;position:absolute;top:0;left:0;right:0;bottom:0;justify-content:center;align-items:center;font-size:36px;line-height:1.3em;text-align:center}:host .action-overlay{opacity:0}:host .action-overlay>div{opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;display:flex;justify-content:center;align-items:center}\n"] }]
|
|
120
|
+
}], ctorParameters: function () { return [{ type: i1.NaturalFileService }, { type: i2.DomSanitizer }, { type: Document, decorators: [{
|
|
121
|
+
type: Inject,
|
|
122
|
+
args: [DOCUMENT]
|
|
123
|
+
}] }]; }, propDecorators: { height: [{
|
|
124
|
+
type: HostBinding,
|
|
125
|
+
args: ['style.height.px']
|
|
126
|
+
}, {
|
|
127
|
+
type: Input
|
|
128
|
+
}], action: [{
|
|
129
|
+
type: Input
|
|
130
|
+
}], backgroundSize: [{
|
|
131
|
+
type: Input
|
|
132
|
+
}], accept: [{
|
|
133
|
+
type: Input
|
|
134
|
+
}], service: [{
|
|
135
|
+
type: Input
|
|
136
|
+
}], model: [{
|
|
137
|
+
type: Input
|
|
138
|
+
}], formCtrl: [{
|
|
139
|
+
type: Input
|
|
140
|
+
}], modelChange: [{
|
|
141
|
+
type: Output
|
|
142
|
+
}] } });
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9maWxlL2NvbXBvbmVudC9maWxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL2ZpbGUvY29tcG9uZW50L2ZpbGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRzdDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0FBR3pDLFdBQVc7QUFNWCxNQUFNLE9BQU8sYUFBYTtJQThCdEIsWUFDcUIsa0JBQXNDLEVBQ3RDLFNBQXVCLEVBQ0wsUUFBa0I7UUFGcEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ0wsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQTdCVCxXQUFNLEdBQUcsR0FBRyxDQUFDO1FBRTdDLFdBQU0sR0FBaUMsSUFBSSxDQUFDO1FBRTVDLG1CQUFjLEdBQUcsU0FBUyxDQUFDO1FBRTNDOztXQUVHO1FBQ2EsV0FBTSxHQUFHLHlGQUF5RixDQUFDO1FBSW5HLFVBQUssR0FBcUIsSUFBSSxDQUFDO1FBRS9DOzs7V0FHRztRQUNhLGFBQVEsR0FBdUMsSUFBSSxDQUFDO1FBRTFDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUUvRCxpQkFBWSxHQUFxQixJQUFJLENBQUM7UUFDdEMsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO0lB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QUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFPLEVBQUUsRUFBRTtZQUN4QyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDckMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhDLE9BQU8sT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2xDLENBQUM7OzBHQTNIUSxhQUFhLGdGQWlDVixRQUFROzhGQWpDWCxhQUFhLDRVQ3pCMUIsNjlCQTBCQTsyRkREYSxhQUFhO2tCQUx6QixTQUFTOytCQUNJLGNBQWM7c0hBcUN5QixRQUFROzBCQUFwRCxNQUFNOzJCQUFDLFFBQVE7NENBN0I0QixNQUFNO3NCQUFyRCxXQUFXO3VCQUFDLGlCQUFpQjs7c0JBQUcsS0FBSztnQkFFdEIsTUFBTTtzQkFBckIsS0FBSztnQkFFVSxjQUFjO3NCQUE3QixLQUFLO2dCQUtVLE1BQU07c0JBQXJCLEtBQUs7Z0JBRVUsT0FBTztzQkFBdEIsS0FBSztnQkFFVSxLQUFLO3NCQUFwQixLQUFLO2dCQU1VLFFBQVE7c0JBQXZCLEtBQUs7Z0JBRW9CLFdBQVc7c0JBQXBDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7RG9tU2FuaXRpemVyLCBTYWZlU3R5bGV9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZiwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge05hdHVyYWxGaWxlU2VydmljZX0gZnJvbSAnLi4vZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7TmF0dXJhbEFic3RyYWN0TW9kZWxTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hYnN0cmFjdC1tb2RlbC5zZXJ2aWNlJztcbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0ZpbGVNb2RlbH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyBAZHluYW1pY1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYXR1cmFsLWZpbGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9maWxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVDb21wb25lbnQ8XG4gICAgVFNlcnZpY2UgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2U8YW55LCBhbnksIGFueSwgYW55LCBGaWxlTW9kZWwsIGFueSwgYW55LCBhbnksIGFueSwgYW55Pixcbj4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlc1xue1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0LnB4JykgQElucHV0KCkgcHVibGljIGhlaWdodCA9IDI1MDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBhY3Rpb246ICd1cGxvYWQnIHwgJ2Rvd25sb2FkJyB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIGJhY2tncm91bmRTaXplID0gJ2NvbnRhaW4nO1xuXG4gICAgLyoqXG4gICAgICogQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgYWNjZXB0ZWQgbWltZXR5cGVzXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGFjY2VwdCA9ICdpbWFnZS9ibXAsaW1hZ2UvZ2lmLGltYWdlL2pwZWcsaW1hZ2UvcGpwZWcsaW1hZ2UvcG5nLGltYWdlL3N2Zyt4bWwsaW1hZ2Uvc3ZnLGltYWdlL3dlYnAnO1xuXG4gICAgQElucHV0KCkgcHVibGljIHNlcnZpY2U/OiBUU2VydmljZTtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBtb2RlbDogRmlsZU1vZGVsIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgZ2V0IHVwZGF0ZWQgb24gY2hhbmdlXG4gICAgICogSXMgbm90IHVzZWQgZm9yIHJlYWRpbmcgLT4gdXNlIFttb2RlbF1cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgZm9ybUN0cmw6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBtb2RlbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZU1vZGVsPigpO1xuXG4gICAgcHVibGljIGltYWdlUHJldmlldzogU2FmZVN0eWxlIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGZpbGVQcmV2aWV3OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBuYXR1cmFsRmlsZVNlcnZpY2U6IE5hdHVyYWxGaWxlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZUltYWdlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMubW9kZWwgJiYgY2hhbmdlcy5tb2RlbC5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VzLm1vZGVsLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbWFnZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHVwbG9hZChmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9kZWwgPSB7ZmlsZTogZmlsZX07XG4gICAgICAgIHRoaXMudXBkYXRlSW1hZ2UoKTtcblxuICAgICAgICBpZiAodGhpcy5mb3JtQ3RybCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtQ3RybC5zZXRWYWx1ZSh0aGlzLm1vZGVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5jcmVhdGUodGhpcy5tb2RlbCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQocmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tb2RlbENoYW5nZS5lbWl0KHRoaXMubW9kZWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldERvd25sb2FkTGluaygpOiBudWxsIHwgc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uICE9PSAnZG93bmxvYWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm5hdHVyYWxGaWxlU2VydmljZS5nZXREb3dubG9hZExpbmsodGhpcy5tb2RlbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVJbWFnZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbWFnZVByZXZpZXcgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbGVQcmV2aWV3ID0gbnVsbDtcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tb2RlbC5maWxlPy50eXBlLmluY2x1ZGVzKCdpbWFnZS8nKSkge1xuICAgICAgICAgICAgLy8gTW9kZWwgZnJvbSB1cGxvYWQgKGJlZm9yZSBzYXZpbmcpXG4gICAgICAgICAgICB0aGlzLmdldEJhc2U2NCh0aGlzLm1vZGVsLmZpbGUpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSAndXJsKGRhdGE6JyArIHRoaXMubW9kZWw/LmZpbGU/LnR5cGUgKyAnO2Jhc2U2NCwnICsgcmVzdWx0ICsgJyknO1xuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VQcmV2aWV3ID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKGNvbnRlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlbC5maWxlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVQcmV2aWV3ID0gdGhpcy5tb2RlbC5maWxlLnR5cGUuc3BsaXQoJy8nKVsxXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGVsLl9fdHlwZW5hbWUgPT09ICdJbWFnZScgJiYgdGhpcy5tb2RlbC5pZCkge1xuICAgICAgICAgICAgLy8gTW9kZWwgaW1hZ2Ugd2l0aCBpZCwgdXNlIHNwZWNpZmljIEFQSSB0byByZW5kZXIgaW1hZ2UgYnkgc2l6ZVxuICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgICAgIGlmICghd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3Qgc2hvdyBpbWFnZSBwcmV2aWV3IGJlY2F1c2UgYHdpbmRvd2AgaXMgdW5kZWZpbmVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvYyA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0ID8gJy8nICsgdGhpcy5oZWlnaHQgOiAnJztcblxuICAgICAgICAgICAgLy8gY3JlYXRlIGltYWdlIHVybCB3aXRob3V0IHBvcnQgdG8gc3RheSBjb21wYXRpYmxlIHdpdGggZGV2IG1vZGVcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbG9jLnByb3RvY29sICsgJy8vJyArIGxvYy5ob3N0bmFtZSArICcvYXBpL2ltYWdlLycgKyB0aGlzLm1vZGVsLmlkICsgaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5pbWFnZVByZXZpZXcgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoJ3VybCgnICsgaW1hZ2UgKyAnKScpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWw/Lm1pbWUgJiYgWydGaWxlJywgJ0FjY291bnRpbmdEb2N1bWVudCddLmluY2x1ZGVzKHRoaXMubW9kZWwuX190eXBlbmFtZSB8fCAnJykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZVByZXZpZXcgPSB0aGlzLm1vZGVsLm1pbWUuc3BsaXQoJy8nKVsxXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGVsLnNyYykge1xuICAgICAgICAgICAgLy8gZXh0ZXJuYWwgdXJsXG4gICAgICAgICAgICB0aGlzLmltYWdlUHJldmlldyA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZSgndXJsKCcgKyB0aGlzLm1vZGVsLnNyYyArICcpJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJhc2U2NChmaWxlOiBGaWxlIHwgbnVsbCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgICAgc3ViamVjdC5uZXh0KGJ0b2EoZXYudGFyZ2V0LnJlc3VsdCkpO1xuICAgICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhmaWxlKTtcblxuICAgICAgICByZXR1cm4gc3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG59XG4iLCI8YVxuICAgIChmaWxlQ2hhbmdlKT1cInVwbG9hZCgkZXZlbnQpXCJcbiAgICBuYXR1cmFsRmlsZURyb3BcbiAgICBbc2VsZWN0YWJsZV09XCJ0cnVlXCJcbiAgICBbYWNjZXB0XT1cImFjY2VwdFwiXG4gICAgW2F0dHIuaHJlZl09XCJnZXREb3dubG9hZExpbmsoKVwiXG4gICAgW2NsYXNzLmhhcy1hY3Rpb25dPVwiISFhY3Rpb25cIlxuICAgIFtjbGFzcy5zdWdnZXN0LXVwbG9hZF09XCIhbW9kZWwgJiYgYWN0aW9uID09PSAndXBsb2FkJ1wiXG4gICAgW2ZpbGVTZWxlY3Rpb25EaXNhYmxlZF09XCJhY3Rpb24gIT09ICd1cGxvYWQnXCJcbiAgICBbbWF0UmlwcGxlRGlzYWJsZWRdPVwiIWFjdGlvblwiXG4gICAgW3N0eWxlLmJhY2tncm91bmRJbWFnZV09XCJpbWFnZVByZXZpZXdcIlxuICAgIFtzdHlsZS5iYWNrZ3JvdW5kU2l6ZV09XCJiYWNrZ3JvdW5kU2l6ZVwiXG4gICAgbWF0UmlwcGxlXG4gICAgdGFyZ2V0PVwiX2JsYW5rXCJcbj5cbiAgICA8ZGl2ICpuZ0lmPVwiZmlsZVByZXZpZXdcIiBjbGFzcz1cImZpbGUtcHJldmlld1wiPlxuICAgICAgICA8bmF0dXJhbC1pY29uIFtzaXplXT1cImhlaWdodCAqIDAuMzNcIiBuYW1lPVwiYXR0YWNobWVudFwiPjwvbmF0dXJhbC1pY29uPlxuICAgICAgICB7eyBmaWxlUHJldmlldyB8IHVwcGVyY2FzZSB9fVxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbi1vdmVybGF5XCI+XG4gICAgICAgIDxuYXR1cmFsLWljb24gKm5nSWY9XCJhY3Rpb24gPT09ICd1cGxvYWQnXCIgW3NpemVdPVwiaGVpZ2h0ICogMC42NlwiIG5hbWU9XCJjbG91ZF91cGxvYWRcIj48L25hdHVyYWwtaWNvbj5cbiAgICAgICAgPG5hdHVyYWwtaWNvbiAqbmdJZj1cImFjdGlvbiA9PT0gJ2Rvd25sb2FkJ1wiIFtzaXplXT1cImhlaWdodCAqIDAuNjZcIiBuYW1lPVwiZ2V0X2FwcFwiPjwvbmF0dXJhbC1pY29uPlxuICAgICAgICB7eyBhY3Rpb24gfCBjYXBpdGFsaXplIH19XG4gICAgPC9kaXY+XG48L2E+XG4iXX0=
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Directive, EventEmitter, HostBinding, HostListener, Output } from '@angular/core';
|
|
2
|
+
import { NaturalAbstractFile } from './abstract-file';
|
|
3
|
+
import { eventToFiles, stopEvent } from './utils';
|
|
4
|
+
import { asyncScheduler, Subject } from 'rxjs';
|
|
5
|
+
import { takeUntil, throttleTime } from 'rxjs/operators';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* This directive has all options to select files, and adds support for drag'n'drop.
|
|
9
|
+
*
|
|
10
|
+
* It will add the CSS class `natural-file-over` on the component when a file is
|
|
11
|
+
* dragged over. It is up to the component to have some specific styling by using
|
|
12
|
+
* this class.
|
|
13
|
+
*
|
|
14
|
+
* In most cases you probably also want click-to-select, so you should use:
|
|
15
|
+
*
|
|
16
|
+
* <div naturalFileDrop [selectable]="true"></div>
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
export class NaturalFileDropDirective extends NaturalAbstractFile {
|
|
20
|
+
constructor() {
|
|
21
|
+
super(...arguments);
|
|
22
|
+
this.fileOverClass = false;
|
|
23
|
+
/**
|
|
24
|
+
* Emits whenever files are being dragged over
|
|
25
|
+
*/
|
|
26
|
+
this.fileOver = new EventEmitter();
|
|
27
|
+
this.rawFileOver = new Subject();
|
|
28
|
+
}
|
|
29
|
+
ngOnInit() {
|
|
30
|
+
super.ngOnInit();
|
|
31
|
+
// Automatically change the class, but not too often to avoid visual
|
|
32
|
+
// flickering in Chrome when hovering across child HTML element of our host.
|
|
33
|
+
// It's not absolutely perfect and if dragging slowly and precisely we can
|
|
34
|
+
// still see flicker, but it should be better for most normal usages.
|
|
35
|
+
this.rawFileOver
|
|
36
|
+
.pipe(takeUntil(this.ngUnsubscribe), throttleTime(200, asyncScheduler, {
|
|
37
|
+
leading: true,
|
|
38
|
+
trailing: true,
|
|
39
|
+
}))
|
|
40
|
+
.subscribe(fileOver => {
|
|
41
|
+
this.fileOver.emit(fileOver);
|
|
42
|
+
this.fileOverClass = fileOver;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
onDrop(event) {
|
|
46
|
+
if (this.fileSelectionDisabled) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this.closeDrags();
|
|
50
|
+
const files = eventToFiles(event);
|
|
51
|
+
if (!files.length) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
stopEvent(event);
|
|
55
|
+
this.handleFiles(files);
|
|
56
|
+
}
|
|
57
|
+
onDragOver(event) {
|
|
58
|
+
if (!this.hasObservers()) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (this.fileSelectionDisabled) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
stopEvent(event);
|
|
65
|
+
// Change cursor
|
|
66
|
+
const transfer = event.dataTransfer;
|
|
67
|
+
if (transfer) {
|
|
68
|
+
transfer.dropEffect = 'copy';
|
|
69
|
+
}
|
|
70
|
+
this.rawFileOver.next(true);
|
|
71
|
+
}
|
|
72
|
+
closeDrags() {
|
|
73
|
+
this.rawFileOver.next(false);
|
|
74
|
+
}
|
|
75
|
+
onDragLeave(event) {
|
|
76
|
+
if (this.fileSelectionDisabled) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
stopEvent(event);
|
|
80
|
+
this.closeDrags();
|
|
81
|
+
}
|
|
82
|
+
hasObservers() {
|
|
83
|
+
return (this.fileChange.observed ||
|
|
84
|
+
this.filesChange.observed ||
|
|
85
|
+
(this.broadcast && this.naturalFileService.filesChanged.observed));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
NaturalFileDropDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalFileDropDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
89
|
+
NaturalFileDropDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: NaturalFileDropDirective, selector: ":not([naturalFileSelect])[naturalFileDrop]", outputs: { fileOver: "fileOver" }, host: { listeners: { "drop": "onDrop($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)" }, properties: { "class.natural-file-over": "this.fileOverClass" } }, usesInheritance: true, ngImport: i0 });
|
|
90
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalFileDropDirective, decorators: [{
|
|
91
|
+
type: Directive,
|
|
92
|
+
args: [{
|
|
93
|
+
selector: ':not([naturalFileSelect])[naturalFileDrop]',
|
|
94
|
+
}]
|
|
95
|
+
}], propDecorators: { fileOverClass: [{
|
|
96
|
+
type: HostBinding,
|
|
97
|
+
args: ['class.natural-file-over']
|
|
98
|
+
}], fileOver: [{
|
|
99
|
+
type: Output
|
|
100
|
+
}], onDrop: [{
|
|
101
|
+
type: HostListener,
|
|
102
|
+
args: ['drop', ['$event']]
|
|
103
|
+
}], onDragOver: [{
|
|
104
|
+
type: HostListener,
|
|
105
|
+
args: ['dragover', ['$event']]
|
|
106
|
+
}], onDragLeave: [{
|
|
107
|
+
type: HostListener,
|
|
108
|
+
args: ['dragleave', ['$event']]
|
|
109
|
+
}] } });
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1kcm9wLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL2ZpbGUvZmlsZS1kcm9wLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFVLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsWUFBWSxFQUFFLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNoRCxPQUFPLEVBQUMsY0FBYyxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDOztBQUV2RDs7Ozs7Ozs7Ozs7R0FXRztBQUlILE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxtQkFBbUI7SUFIakU7O1FBSW1ELGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRXJFOztXQUVHO1FBQ3VCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRWhELGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztLQWtGekQ7SUFoRlUsUUFBUTtRQUNYLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVqQixvRUFBb0U7UUFDcEUsNEVBQTRFO1FBQzVFLDBFQUEwRTtRQUMxRSxxRUFBcUU7UUFDckUsSUFBSSxDQUFDLFdBQVc7YUFDWCxJQUFJLENBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFDN0IsWUFBWSxDQUFDLEdBQUcsRUFBRSxjQUFjLEVBQUU7WUFDOUIsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQ0w7YUFDQSxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBR00sTUFBTSxDQUFDLEtBQWdCO1FBQzFCLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzVCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDZixPQUFPO1NBQ1Y7UUFFRCxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBR00sVUFBVSxDQUFDLEtBQWdCO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDdEIsT0FBTztTQUNWO1FBRUQsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDNUIsT0FBTztTQUNWO1FBRUQsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpCLGdCQUFnQjtRQUNoQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3BDLElBQUksUUFBUSxFQUFFO1lBQ1YsUUFBUSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7U0FDaEM7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sVUFBVTtRQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFHTSxXQUFXLENBQUMsS0FBZ0I7UUFDL0IsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDNUIsT0FBTztTQUNWO1FBRUQsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU8sWUFBWTtRQUNoQixPQUFPLENBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO1lBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUTtZQUN6QixDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FDcEUsQ0FBQztJQUNOLENBQUM7O3FIQXpGUSx3QkFBd0I7eUdBQXhCLHdCQUF3QjsyRkFBeEIsd0JBQXdCO2tCQUhwQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSw0Q0FBNEM7aUJBQ3pEOzhCQUVrRCxhQUFhO3NCQUEzRCxXQUFXO3VCQUFDLHlCQUF5QjtnQkFLWixRQUFRO3NCQUFqQyxNQUFNO2dCQTBCQSxNQUFNO3NCQURaLFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWtCekIsVUFBVTtzQkFEaEIsWUFBWTt1QkFBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMEI3QixXQUFXO3NCQURqQixZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIE9uSW5pdCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TmF0dXJhbEFic3RyYWN0RmlsZX0gZnJvbSAnLi9hYnN0cmFjdC1maWxlJztcbmltcG9ydCB7ZXZlbnRUb0ZpbGVzLCBzdG9wRXZlbnR9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHthc3luY1NjaGVkdWxlciwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rha2VVbnRpbCwgdGhyb3R0bGVUaW1lfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKlxuICogVGhpcyBkaXJlY3RpdmUgaGFzIGFsbCBvcHRpb25zIHRvIHNlbGVjdCBmaWxlcywgYW5kIGFkZHMgc3VwcG9ydCBmb3IgZHJhZyduJ2Ryb3AuXG4gKlxuICogSXQgd2lsbCBhZGQgdGhlIENTUyBjbGFzcyBgbmF0dXJhbC1maWxlLW92ZXJgIG9uIHRoZSBjb21wb25lbnQgd2hlbiBhIGZpbGUgaXNcbiAqIGRyYWdnZWQgb3Zlci4gSXQgaXMgdXAgdG8gdGhlIGNvbXBvbmVudCB0byBoYXZlIHNvbWUgc3BlY2lmaWMgc3R5bGluZyBieSB1c2luZ1xuICogdGhpcyBjbGFzcy5cbiAqXG4gKiBJbiBtb3N0IGNhc2VzIHlvdSBwcm9iYWJseSBhbHNvIHdhbnQgY2xpY2stdG8tc2VsZWN0LCBzbyB5b3Ugc2hvdWxkIHVzZTpcbiAqXG4gKiAgICAgPGRpdiBuYXR1cmFsRmlsZURyb3AgW3NlbGVjdGFibGVdPVwidHJ1ZVwiPjwvZGl2PlxuICpcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICc6bm90KFtuYXR1cmFsRmlsZVNlbGVjdF0pW25hdHVyYWxGaWxlRHJvcF0nLFxufSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsRmlsZURyb3BEaXJlY3RpdmUgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3RGaWxlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm5hdHVyYWwtZmlsZS1vdmVyJykgcHVibGljIGZpbGVPdmVyQ2xhc3MgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHdoZW5ldmVyIGZpbGVzIGFyZSBiZWluZyBkcmFnZ2VkIG92ZXJcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGZpbGVPdmVyID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSByYXdGaWxlT3ZlciA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAgICAgLy8gQXV0b21hdGljYWxseSBjaGFuZ2UgdGhlIGNsYXNzLCBidXQgbm90IHRvbyBvZnRlbiB0byBhdm9pZCB2aXN1YWxcbiAgICAgICAgLy8gZmxpY2tlcmluZyBpbiBDaHJvbWUgd2hlbiBob3ZlcmluZyBhY3Jvc3MgY2hpbGQgSFRNTCBlbGVtZW50IG9mIG91ciBob3N0LlxuICAgICAgICAvLyBJdCdzIG5vdCBhYnNvbHV0ZWx5IHBlcmZlY3QgYW5kIGlmIGRyYWdnaW5nIHNsb3dseSBhbmQgcHJlY2lzZWx5IHdlIGNhblxuICAgICAgICAvLyBzdGlsbCBzZWUgZmxpY2tlciwgYnV0IGl0IHNob3VsZCBiZSBiZXR0ZXIgZm9yIG1vc3Qgbm9ybWFsIHVzYWdlcy5cbiAgICAgICAgdGhpcy5yYXdGaWxlT3ZlclxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lKDIwMCwgYXN5bmNTY2hlZHVsZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhZGluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGZpbGVPdmVyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVPdmVyLmVtaXQoZmlsZU92ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZU92ZXJDbGFzcyA9IGZpbGVPdmVyO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uRHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZpbGVTZWxlY3Rpb25EaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbG9zZURyYWdzKCk7XG5cbiAgICAgICAgY29uc3QgZmlsZXMgPSBldmVudFRvRmlsZXMoZXZlbnQpO1xuICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgdGhpcy5oYW5kbGVGaWxlcyhmaWxlcyk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZHJhZ292ZXInLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc09ic2VydmVycygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5maWxlU2VsZWN0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0b3BFdmVudChldmVudCk7XG5cbiAgICAgICAgLy8gQ2hhbmdlIGN1cnNvclxuICAgICAgICBjb25zdCB0cmFuc2ZlciA9IGV2ZW50LmRhdGFUcmFuc2ZlcjtcbiAgICAgICAgaWYgKHRyYW5zZmVyKSB7XG4gICAgICAgICAgICB0cmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yYXdGaWxlT3Zlci5uZXh0KHRydWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xvc2VEcmFncygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yYXdGaWxlT3Zlci5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkcmFnbGVhdmUnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZpbGVTZWxlY3Rpb25EaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgdGhpcy5jbG9zZURyYWdzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNPYnNlcnZlcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmZpbGVDaGFuZ2Uub2JzZXJ2ZWQgfHxcbiAgICAgICAgICAgIHRoaXMuZmlsZXNDaGFuZ2Uub2JzZXJ2ZWQgfHxcbiAgICAgICAgICAgICh0aGlzLmJyb2FkY2FzdCAmJiB0aGlzLm5hdHVyYWxGaWxlU2VydmljZS5maWxlc0NoYW5nZWQub2JzZXJ2ZWQpXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Directive, Input } from '@angular/core';
|
|
2
|
+
import { NaturalAbstractFile } from './abstract-file';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* This directive has all options to select files, except drag'n'drop.
|
|
6
|
+
*/
|
|
7
|
+
export class NaturalFileSelectDirective extends NaturalAbstractFile {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
/**
|
|
11
|
+
* Whether the user can click on the element to select something
|
|
12
|
+
*
|
|
13
|
+
* Override parent to enable it by default
|
|
14
|
+
*/
|
|
15
|
+
this.selectable = true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
NaturalFileSelectDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalFileSelectDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
19
|
+
NaturalFileSelectDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: NaturalFileSelectDirective, selector: ":not([naturalFileDrop])[naturalFileSelect]", inputs: { selectable: "selectable" }, usesInheritance: true, ngImport: i0 });
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalFileSelectDirective, decorators: [{
|
|
21
|
+
type: Directive,
|
|
22
|
+
args: [{
|
|
23
|
+
selector: ':not([naturalFileDrop])[naturalFileSelect]',
|
|
24
|
+
}]
|
|
25
|
+
}], propDecorators: { selectable: [{
|
|
26
|
+
type: Input
|
|
27
|
+
}] } });
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zZWxlY3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC9zcmMvbGliL21vZHVsZXMvZmlsZS9maWxlLXNlbGVjdC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0saUJBQWlCLENBQUM7O0FBRXBEOztHQUVHO0FBSUgsTUFBTSxPQUFPLDBCQUEyQixTQUFRLG1CQUFtQjtJQUhuRTs7UUFJSTs7OztXQUlHO1FBQ2EsZUFBVSxHQUFHLElBQUksQ0FBQztLQUNyQzs7dUhBUFksMEJBQTBCOzJHQUExQiwwQkFBMEI7MkZBQTFCLDBCQUEwQjtrQkFIdEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsNENBQTRDO2lCQUN6RDs4QkFPbUIsVUFBVTtzQkFBekIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlLCBJbnB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05hdHVyYWxBYnN0cmFjdEZpbGV9IGZyb20gJy4vYWJzdHJhY3QtZmlsZSc7XG5cbi8qKlxuICogVGhpcyBkaXJlY3RpdmUgaGFzIGFsbCBvcHRpb25zIHRvIHNlbGVjdCBmaWxlcywgZXhjZXB0IGRyYWcnbidkcm9wLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJzpub3QoW25hdHVyYWxGaWxlRHJvcF0pW25hdHVyYWxGaWxlU2VsZWN0XScsXG59KVxuZXhwb3J0IGNsYXNzIE5hdHVyYWxGaWxlU2VsZWN0RGlyZWN0aXZlIGV4dGVuZHMgTmF0dXJhbEFic3RyYWN0RmlsZSB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgdXNlciBjYW4gY2xpY2sgb24gdGhlIGVsZW1lbnQgdG8gc2VsZWN0IHNvbWV0aGluZ1xuICAgICAqXG4gICAgICogT3ZlcnJpZGUgcGFyZW50IHRvIGVuYWJsZSBpdCBieSBkZWZhdWx0XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHNlbGVjdGFibGUgPSB0cnVlO1xufVxuIl19
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { NaturalFileDropDirective } from './file-drop.directive';
|
|
4
|
+
import { NaturalFileSelectDirective } from './file-select.directive';
|
|
5
|
+
import { FileComponent } from './component/file.component';
|
|
6
|
+
import { NaturalIconModule } from '../icon/icon.module';
|
|
7
|
+
import { MatRippleModule } from '@angular/material/core';
|
|
8
|
+
import { NaturalCommonModule } from '../common/common-module';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
const declarations = [NaturalFileDropDirective, NaturalFileSelectDirective, FileComponent];
|
|
11
|
+
export class NaturalFileModule {
|
|
12
|
+
}
|
|
13
|
+
NaturalFileModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalFileModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
14
|
+
NaturalFileModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalFileModule, declarations: [NaturalFileDropDirective, NaturalFileSelectDirective, FileComponent], imports: [CommonModule, NaturalIconModule, MatRippleModule, NaturalCommonModule], exports: [NaturalFileDropDirective, NaturalFileSelectDirective, FileComponent] });
|
|
15
|
+
NaturalFileModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalFileModule, imports: [[CommonModule, NaturalIconModule, MatRippleModule, NaturalCommonModule]] });
|
|
16
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalFileModule, decorators: [{
|
|
17
|
+
type: NgModule,
|
|
18
|
+
args: [{
|
|
19
|
+
imports: [CommonModule, NaturalIconModule, MatRippleModule, NaturalCommonModule],
|
|
20
|
+
declarations: declarations,
|
|
21
|
+
exports: declarations,
|
|
22
|
+
}]
|
|
23
|
+
}] });
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9maWxlL2ZpbGUubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQy9ELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7O0FBRTVELE1BQU0sWUFBWSxHQUFHLENBQUMsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFPM0YsTUFBTSxPQUFPLGlCQUFpQjs7OEdBQWpCLGlCQUFpQjsrR0FBakIsaUJBQWlCLGlCQVBSLHdCQUF3QixFQUFFLDBCQUEwQixFQUFFLGFBQWEsYUFHM0UsWUFBWSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxtQkFBbUIsYUFIN0Qsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUsYUFBYTsrR0FPNUUsaUJBQWlCLFlBSmpCLENBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQzsyRkFJdkUsaUJBQWlCO2tCQUw3QixRQUFRO21CQUFDO29CQUNOLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLENBQUM7b0JBQ2hGLFlBQVksRUFBRSxZQUFZO29CQUMxQixPQUFPLEVBQUUsWUFBWTtpQkFDeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge05hdHVyYWxGaWxlRHJvcERpcmVjdGl2ZX0gZnJvbSAnLi9maWxlLWRyb3AuZGlyZWN0aXZlJztcbmltcG9ydCB7TmF0dXJhbEZpbGVTZWxlY3REaXJlY3RpdmV9IGZyb20gJy4vZmlsZS1zZWxlY3QuZGlyZWN0aXZlJztcbmltcG9ydCB7RmlsZUNvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnQvZmlsZS5jb21wb25lbnQnO1xuaW1wb3J0IHtOYXR1cmFsSWNvbk1vZHVsZX0gZnJvbSAnLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5pbXBvcnQge01hdFJpcHBsZU1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQge05hdHVyYWxDb21tb25Nb2R1bGV9IGZyb20gJy4uL2NvbW1vbi9jb21tb24tbW9kdWxlJztcblxuY29uc3QgZGVjbGFyYXRpb25zID0gW05hdHVyYWxGaWxlRHJvcERpcmVjdGl2ZSwgTmF0dXJhbEZpbGVTZWxlY3REaXJlY3RpdmUsIEZpbGVDb21wb25lbnRdO1xuXG5ATmdNb2R1bGUoe1xuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE5hdHVyYWxJY29uTW9kdWxlLCBNYXRSaXBwbGVNb2R1bGUsIE5hdHVyYWxDb21tb25Nb2R1bGVdLFxuICAgIGRlY2xhcmF0aW9uczogZGVjbGFyYXRpb25zLFxuICAgIGV4cG9ydHM6IGRlY2xhcmF0aW9ucyxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbEZpbGVNb2R1bGUge31cbiJdfQ==
|