@wizishop/img-manager 0.2.104 → 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/esm2020/lib/animations/easeInOut/ease-in-out.animation.mjs +12 -0
- package/esm2020/lib/animations/insertRemove/insert-remove.animation.mjs +9 -0
- package/esm2020/lib/animations/listAnnimation/list.animation.mjs +16 -0
- package/esm2020/lib/components/canva-btn/canva-btn.component.mjs +67 -0
- package/esm2020/lib/components/images-view/images-actions-handler.mjs +151 -0
- package/esm2020/lib/components/images-view/images-view.component.mjs +474 -0
- package/esm2020/lib/components/images-view/mosaic-view/img-card/img-card.component.mjs +66 -0
- package/esm2020/lib/components/images-view/mosaic-view/mosaic-view.component.mjs +68 -0
- package/esm2020/lib/components/images-view/table-view/table-view.component.mjs +48 -0
- package/esm2020/lib/components/img-editor/cropper/cropper.component.mjs +307 -0
- package/esm2020/lib/components/img-editor/img-editor.component.mjs +109 -0
- package/esm2020/lib/components/img-editor/info-section/info-section.component.mjs +54 -0
- package/esm2020/lib/components/img-selection/img-selection.component.mjs +59 -0
- package/esm2020/lib/components/img-tabs/img-tabs.component.mjs +122 -0
- package/esm2020/lib/components/img-upload/img-upload.component.mjs +118 -0
- package/esm2020/lib/components/loader/loader.component.mjs +21 -0
- package/esm2020/lib/components/pexels-lib/pexels-lib.component.mjs +200 -0
- package/esm2020/lib/components/shared/alert/alert.component.mjs +27 -0
- package/esm2020/lib/components/shared/checkbox/checkbox.component.mjs +52 -0
- package/esm2020/lib/components/shared/dropdown/dropdown.component.mjs +21 -0
- package/esm2020/lib/components/shared/input-search/input-search.component.mjs +54 -0
- package/esm2020/lib/components/shared/pagination/page-selector/page-selector.component.mjs +49 -0
- package/esm2020/lib/components/shared/pagination/pagination.component.mjs +49 -0
- package/esm2020/lib/components/shared/select/call-to-action.model.mjs +2 -0
- package/esm2020/lib/components/shared/select/select-items.dto.mjs +2 -0
- package/esm2020/lib/components/shared/select/select.component.mjs +110 -0
- package/esm2020/lib/components/shared/table/table.component.mjs +116 -0
- package/esm2020/lib/components/upload-list/upload-list.component.mjs +79 -0
- package/esm2020/lib/directives/abstract-debounce/abstract-debounce.directive.mjs +37 -0
- package/esm2020/lib/directives/abstract-debounce/debounce-keyup.directive.mjs +24 -0
- package/esm2020/lib/directives/auto-hide.directive.mjs +48 -0
- package/esm2020/lib/directives/copy-to-clipboard.directive.mjs +37 -0
- package/esm2020/lib/directives/drag-drop.directive.mjs +57 -0
- package/esm2020/lib/directives/loading.directive.mjs +42 -0
- package/esm2020/lib/directives/table/checkBoxRow.directive.mjs +114 -0
- package/esm2020/lib/directives/table/column.directive.mjs +45 -0
- package/esm2020/lib/directives/table/columnHeader.directive.mjs +204 -0
- package/esm2020/lib/directives/table/raw.directive.mjs +31 -0
- package/esm2020/lib/directives/zindex-toggle.directive.mjs +42 -0
- package/esm2020/lib/dto/ImgManagerDisplayConfig.dto.mjs +2 -0
- package/esm2020/lib/dto/canva-create-design.dto.mjs +4 -0
- package/esm2020/lib/dto/canva.dto.mjs +4 -0
- package/esm2020/lib/dto/config/apis/api.dto.mjs +9 -0
- package/esm2020/lib/dto/config/external/external-config.dto.mjs +3 -0
- package/esm2020/lib/dto/config/image-cdn/image-cdn-config.dto.mjs +10 -0
- package/esm2020/lib/dto/export-dtos.api.mjs +11 -0
- package/esm2020/lib/dto/img-editor-config.dto.mjs +2 -0
- package/esm2020/lib/dto/img-manager.dto.mjs +2 -0
- package/esm2020/lib/dto/pexels-img.dto.mjs +2 -0
- package/esm2020/lib/dto/picture-name-update.dto.mjs +2 -0
- package/esm2020/lib/dto/stateDisplayed.dto.mjs +2 -0
- package/esm2020/lib/dto/tabDisplayed.dto.mjs +2 -0
- package/esm2020/lib/dto/wizi-block-media.dto.mjs +3 -0
- package/esm2020/lib/pipes/images/img-src.pipe.mjs +28 -0
- package/esm2020/lib/pipes/number-to-array.pipe.mjs +16 -0
- package/esm2020/lib/pipes/pagination/array-total-pages/array-pages.pipe.mjs +28 -0
- package/esm2020/lib/pipes/pagination/large-number-of-page/large-number-of-page.pipe.mjs +53 -0
- package/esm2020/lib/pipes/pagination/text/custom-text.pipe.mjs +35 -0
- package/esm2020/lib/pipes/pagination/total-pages/is-last-page.pipe.mjs +25 -0
- package/esm2020/lib/pipes/select/select-filters.pipe.mjs +19 -0
- package/esm2020/lib/services/alert.service.mjs +53 -0
- package/esm2020/lib/services/canva.service.mjs +159 -0
- package/esm2020/lib/services/config/external-config.service.mjs +49 -0
- package/esm2020/lib/services/config/img-cdn.service.mjs +28 -0
- package/esm2020/lib/services/dom.service.mjs +36 -0
- package/{esm2015/lib/services/img-event.service.js → esm2020/lib/services/img-event.service.mjs} +11 -12
- package/esm2020/lib/services/img-manager.service.mjs +138 -0
- package/{esm2015/lib/services/img-selection.service.js → esm2020/lib/services/img-selection.service.mjs} +11 -12
- package/esm2020/lib/services/pexels.service.mjs +62 -0
- package/esm2020/lib/services/rename-picture.service.mjs +68 -0
- package/esm2020/lib/services/table/filters-table.service.mjs +63 -0
- package/{esm2015/lib/services/user-settings.service.js → esm2020/lib/services/user-settings.service.mjs} +11 -12
- package/esm2020/lib/wz-img-manager.component.mjs +186 -0
- package/esm2020/lib/wz-img-manager.module.mjs +193 -0
- package/esm2020/public-api.mjs +11 -0
- package/esm2020/wizishop-img-manager.mjs +5 -0
- package/fesm2015/wizishop-img-manager.mjs +4134 -0
- package/fesm2015/wizishop-img-manager.mjs.map +1 -0
- package/fesm2020/wizishop-img-manager.mjs +4140 -0
- package/fesm2020/wizishop-img-manager.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/canva-btn/canva-btn.component.d.ts +9 -6
- package/lib/components/images-view/images-actions-handler.d.ts +3 -0
- package/lib/components/images-view/images-view.component.d.ts +3 -0
- package/lib/components/images-view/mosaic-view/img-card/img-card.component.d.ts +3 -0
- package/lib/components/images-view/mosaic-view/mosaic-view.component.d.ts +3 -0
- package/lib/components/images-view/table-view/table-view.component.d.ts +3 -0
- package/lib/components/img-editor/cropper/cropper.component.d.ts +12 -5
- package/lib/components/img-editor/img-editor.component.d.ts +3 -0
- package/lib/components/img-editor/info-section/info-section.component.d.ts +3 -0
- package/lib/components/img-selection/img-selection.component.d.ts +3 -0
- package/lib/components/img-tabs/img-tabs.component.d.ts +3 -0
- package/lib/components/img-upload/img-upload.component.d.ts +4 -1
- package/lib/components/loader/loader.component.d.ts +3 -0
- package/lib/components/pexels-lib/pexels-lib.component.d.ts +3 -0
- package/lib/components/shared/alert/alert.component.d.ts +3 -0
- package/lib/components/shared/checkbox/checkbox.component.d.ts +3 -0
- package/lib/components/shared/dropdown/dropdown.component.d.ts +3 -0
- package/lib/components/shared/input-search/input-search.component.d.ts +3 -0
- package/lib/components/shared/pagination/page-selector/page-selector.component.d.ts +3 -0
- package/lib/components/shared/pagination/pagination.component.d.ts +3 -0
- package/lib/components/shared/select/select.component.d.ts +3 -0
- package/lib/components/shared/table/table.component.d.ts +3 -0
- package/lib/components/upload-list/upload-list.component.d.ts +3 -0
- package/lib/directives/abstract-debounce/abstract-debounce.directive.d.ts +3 -0
- package/lib/directives/abstract-debounce/debounce-keyup.directive.d.ts +3 -0
- package/lib/directives/auto-hide.directive.d.ts +3 -0
- package/lib/directives/copy-to-clipboard.directive.d.ts +3 -0
- package/lib/directives/drag-drop.directive.d.ts +3 -0
- package/lib/directives/loading.directive.d.ts +3 -0
- package/lib/directives/table/checkBoxRow.directive.d.ts +3 -0
- package/lib/directives/table/column.directive.d.ts +3 -0
- package/lib/directives/table/columnHeader.directive.d.ts +3 -0
- package/lib/directives/table/raw.directive.d.ts +3 -0
- package/lib/directives/zindex-toggle.directive.d.ts +3 -0
- package/lib/dto/pexels-img.dto.d.ts +1 -0
- package/lib/pipes/images/img-src.pipe.d.ts +3 -0
- package/lib/pipes/number-to-array.pipe.d.ts +3 -0
- package/lib/pipes/pagination/array-total-pages/array-pages.pipe.d.ts +3 -0
- package/lib/pipes/pagination/large-number-of-page/large-number-of-page.pipe.d.ts +7 -1
- package/lib/pipes/pagination/text/custom-text.pipe.d.ts +3 -0
- package/lib/pipes/pagination/total-pages/is-last-page.pipe.d.ts +3 -0
- package/lib/pipes/select/select-filters.pipe.d.ts +3 -0
- package/lib/services/alert.service.d.ts +3 -0
- package/lib/services/canva.service.d.ts +3 -0
- package/lib/services/config/external-config.service.d.ts +3 -0
- package/lib/services/config/img-cdn.service.d.ts +3 -0
- package/lib/services/dom.service.d.ts +3 -0
- package/lib/services/img-event.service.d.ts +3 -0
- package/lib/services/img-manager.service.d.ts +5 -2
- package/lib/services/img-selection.service.d.ts +3 -0
- package/lib/services/pexels.service.d.ts +7 -4
- package/lib/services/rename-picture.service.d.ts +3 -0
- package/lib/services/table/filters-table.service.d.ts +3 -0
- package/lib/services/user-settings.service.d.ts +3 -0
- package/lib/wz-img-manager.component.d.ts +3 -0
- package/lib/wz-img-manager.module.d.ts +56 -0
- package/package.json +46 -26
- package/wizishop-img-manager-14.0.0.tgz +0 -0
- package/wz-img-manager.scss +2745 -3141
- package/bundles/wizishop-img-manager.umd.js +0 -5046
- package/bundles/wizishop-img-manager.umd.js.map +0 -1
- package/bundles/wizishop-img-manager.umd.min.js +0 -16
- package/bundles/wizishop-img-manager.umd.min.js.map +0 -1
- package/esm2015/lib/animations/easeInOut/ease-in-out.animation.js +0 -12
- package/esm2015/lib/animations/insertRemove/insert-remove.animation.js +0 -9
- package/esm2015/lib/animations/listAnnimation/list.animation.js +0 -16
- package/esm2015/lib/components/canva-btn/canva-btn.component.js +0 -70
- package/esm2015/lib/components/images-view/images-actions-handler.js +0 -180
- package/esm2015/lib/components/images-view/images-view.component.js +0 -492
- package/esm2015/lib/components/images-view/mosaic-view/img-card/img-card.component.js +0 -84
- package/esm2015/lib/components/images-view/mosaic-view/mosaic-view.component.js +0 -79
- package/esm2015/lib/components/images-view/table-view/table-view.component.js +0 -49
- package/esm2015/lib/components/img-editor/cropper/cropper.component.js +0 -280
- package/esm2015/lib/components/img-editor/img-editor.component.js +0 -112
- package/esm2015/lib/components/img-editor/info-section/info-section.component.js +0 -59
- package/esm2015/lib/components/img-selection/img-selection.component.js +0 -62
- package/esm2015/lib/components/img-tabs/img-tabs.component.js +0 -131
- package/esm2015/lib/components/img-upload/img-upload.component.js +0 -125
- package/esm2015/lib/components/loader/loader.component.js +0 -28
- package/esm2015/lib/components/pexels-lib/pexels-lib.component.js +0 -208
- package/esm2015/lib/components/shared/alert/alert.component.js +0 -37
- package/esm2015/lib/components/shared/checkbox/checkbox.component.js +0 -69
- package/esm2015/lib/components/shared/dropdown/dropdown.component.js +0 -26
- package/esm2015/lib/components/shared/input-search/input-search.component.js +0 -62
- package/esm2015/lib/components/shared/pagination/page-selector/page-selector.component.js +0 -55
- package/esm2015/lib/components/shared/pagination/pagination.component.js +0 -51
- package/esm2015/lib/components/shared/select/call-to-action.model.js +0 -1
- package/esm2015/lib/components/shared/select/select-items.dto.js +0 -1
- package/esm2015/lib/components/shared/select/select.component.js +0 -133
- package/esm2015/lib/components/shared/table/table.component.js +0 -133
- package/esm2015/lib/components/upload-list/upload-list.component.js +0 -87
- package/esm2015/lib/directives/abstract-debounce/abstract-debounce.directive.js +0 -40
- package/esm2015/lib/directives/abstract-debounce/debounce-keyup.directive.js +0 -26
- package/esm2015/lib/directives/auto-hide.directive.js +0 -55
- package/esm2015/lib/directives/copy-to-clipboard.directive.js +0 -40
- package/esm2015/lib/directives/drag-drop.directive.js +0 -68
- package/esm2015/lib/directives/loading.directive.js +0 -44
- package/esm2015/lib/directives/table/checkBoxRow.directive.js +0 -128
- package/esm2015/lib/directives/table/column.directive.js +0 -49
- package/esm2015/lib/directives/table/columnHeader.directive.js +0 -221
- package/esm2015/lib/directives/table/raw.directive.js +0 -33
- package/esm2015/lib/directives/zindex-toggle.directive.js +0 -49
- package/esm2015/lib/dto/ImgManagerDisplayConfig.dto.js +0 -1
- package/esm2015/lib/dto/canva-create-design.dto.js +0 -4
- package/esm2015/lib/dto/canva.dto.js +0 -4
- package/esm2015/lib/dto/config/apis/api.dto.js +0 -9
- package/esm2015/lib/dto/config/external/external-config.dto.js +0 -3
- package/esm2015/lib/dto/config/image-cdn/image-cdn-config.dto.js +0 -10
- package/esm2015/lib/dto/export-dtos.api.js +0 -5
- package/esm2015/lib/dto/img-editor-config.dto.js +0 -1
- package/esm2015/lib/dto/img-manager.dto.js +0 -1
- package/esm2015/lib/dto/pexels-img.dto.js +0 -1
- package/esm2015/lib/dto/picture-name-update.dto.js +0 -1
- package/esm2015/lib/dto/stateDisplayed.dto.js +0 -1
- package/esm2015/lib/dto/tabDisplayed.dto.js +0 -1
- package/esm2015/lib/dto/wizi-block-media.dto.js +0 -3
- package/esm2015/lib/pipes/images/img-src.pipe.js +0 -29
- package/esm2015/lib/pipes/number-to-array.pipe.js +0 -14
- package/esm2015/lib/pipes/pagination/array-total-pages/array-pages.pipe.js +0 -26
- package/esm2015/lib/pipes/pagination/large-number-of-page/large-number-of-page.pipe.js +0 -51
- package/esm2015/lib/pipes/pagination/text/custom-text.pipe.js +0 -36
- package/esm2015/lib/pipes/pagination/total-pages/is-last-page.pipe.js +0 -23
- package/esm2015/lib/pipes/select/select-filters.pipe.js +0 -17
- package/esm2015/lib/services/alert.service.js +0 -59
- package/esm2015/lib/services/canva.service.js +0 -171
- package/esm2015/lib/services/config/external-config.service.js +0 -55
- package/esm2015/lib/services/config/img-cdn.service.js +0 -29
- package/esm2015/lib/services/dom.service.js +0 -36
- package/esm2015/lib/services/img-manager.service.js +0 -142
- package/esm2015/lib/services/pexels.service.js +0 -70
- package/esm2015/lib/services/rename-picture.service.js +0 -74
- package/esm2015/lib/services/table/filters-table.service.js +0 -67
- package/esm2015/lib/wz-img-manager.component.js +0 -212
- package/esm2015/lib/wz-img-manager.module.js +0 -132
- package/esm2015/public-api.js +0 -11
- package/esm2015/wizishop-img-manager.js +0 -57
- package/esm5/lib/animations/easeInOut/ease-in-out.animation.js +0 -12
- package/esm5/lib/animations/insertRemove/insert-remove.animation.js +0 -9
- package/esm5/lib/animations/listAnnimation/list.animation.js +0 -16
- package/esm5/lib/components/canva-btn/canva-btn.component.js +0 -72
- package/esm5/lib/components/images-view/images-actions-handler.js +0 -183
- package/esm5/lib/components/images-view/images-view.component.js +0 -535
- package/esm5/lib/components/images-view/mosaic-view/img-card/img-card.component.js +0 -87
- package/esm5/lib/components/images-view/mosaic-view/mosaic-view.component.js +0 -82
- package/esm5/lib/components/images-view/table-view/table-view.component.js +0 -52
- package/esm5/lib/components/img-editor/cropper/cropper.component.js +0 -285
- package/esm5/lib/components/img-editor/img-editor.component.js +0 -115
- package/esm5/lib/components/img-editor/info-section/info-section.component.js +0 -64
- package/esm5/lib/components/img-selection/img-selection.component.js +0 -64
- package/esm5/lib/components/img-tabs/img-tabs.component.js +0 -133
- package/esm5/lib/components/img-upload/img-upload.component.js +0 -138
- package/esm5/lib/components/loader/loader.component.js +0 -29
- package/esm5/lib/components/pexels-lib/pexels-lib.component.js +0 -216
- package/esm5/lib/components/shared/alert/alert.component.js +0 -38
- package/esm5/lib/components/shared/checkbox/checkbox.component.js +0 -71
- package/esm5/lib/components/shared/dropdown/dropdown.component.js +0 -27
- package/esm5/lib/components/shared/input-search/input-search.component.js +0 -68
- package/esm5/lib/components/shared/pagination/page-selector/page-selector.component.js +0 -64
- package/esm5/lib/components/shared/pagination/pagination.component.js +0 -56
- package/esm5/lib/components/shared/select/call-to-action.model.js +0 -1
- package/esm5/lib/components/shared/select/select-items.dto.js +0 -1
- package/esm5/lib/components/shared/select/select.component.js +0 -136
- package/esm5/lib/components/shared/table/table.component.js +0 -135
- package/esm5/lib/components/upload-list/upload-list.component.js +0 -103
- package/esm5/lib/directives/abstract-debounce/abstract-debounce.directive.js +0 -42
- package/esm5/lib/directives/abstract-debounce/debounce-keyup.directive.js +0 -28
- package/esm5/lib/directives/auto-hide.directive.js +0 -57
- package/esm5/lib/directives/copy-to-clipboard.directive.js +0 -42
- package/esm5/lib/directives/drag-drop.directive.js +0 -69
- package/esm5/lib/directives/loading.directive.js +0 -46
- package/esm5/lib/directives/table/checkBoxRow.directive.js +0 -137
- package/esm5/lib/directives/table/column.directive.js +0 -50
- package/esm5/lib/directives/table/columnHeader.directive.js +0 -229
- package/esm5/lib/directives/table/raw.directive.js +0 -34
- package/esm5/lib/directives/zindex-toggle.directive.js +0 -54
- package/esm5/lib/dto/ImgManagerDisplayConfig.dto.js +0 -1
- package/esm5/lib/dto/canva-create-design.dto.js +0 -8
- package/esm5/lib/dto/canva.dto.js +0 -8
- package/esm5/lib/dto/config/apis/api.dto.js +0 -11
- package/esm5/lib/dto/config/external/external-config.dto.js +0 -7
- package/esm5/lib/dto/config/image-cdn/image-cdn-config.dto.js +0 -12
- package/esm5/lib/dto/export-dtos.api.js +0 -5
- package/esm5/lib/dto/img-editor-config.dto.js +0 -1
- package/esm5/lib/dto/img-manager.dto.js +0 -1
- package/esm5/lib/dto/pexels-img.dto.js +0 -1
- package/esm5/lib/dto/picture-name-update.dto.js +0 -1
- package/esm5/lib/dto/stateDisplayed.dto.js +0 -1
- package/esm5/lib/dto/tabDisplayed.dto.js +0 -1
- package/esm5/lib/dto/wizi-block-media.dto.js +0 -7
- package/esm5/lib/pipes/images/img-src.pipe.js +0 -30
- package/esm5/lib/pipes/number-to-array.pipe.js +0 -17
- package/esm5/lib/pipes/pagination/array-total-pages/array-pages.pipe.js +0 -29
- package/esm5/lib/pipes/pagination/large-number-of-page/large-number-of-page.pipe.js +0 -54
- package/esm5/lib/pipes/pagination/text/custom-text.pipe.js +0 -37
- package/esm5/lib/pipes/pagination/total-pages/is-last-page.pipe.js +0 -26
- package/esm5/lib/pipes/select/select-filters.pipe.js +0 -20
- package/esm5/lib/services/alert.service.js +0 -62
- package/esm5/lib/services/canva.service.js +0 -181
- package/esm5/lib/services/config/external-config.service.js +0 -56
- package/esm5/lib/services/config/img-cdn.service.js +0 -34
- package/esm5/lib/services/dom.service.js +0 -39
- package/esm5/lib/services/img-event.service.js +0 -46
- package/esm5/lib/services/img-manager.service.js +0 -143
- package/esm5/lib/services/img-selection.service.js +0 -143
- package/esm5/lib/services/pexels.service.js +0 -72
- package/esm5/lib/services/rename-picture.service.js +0 -88
- package/esm5/lib/services/table/filters-table.service.js +0 -68
- package/esm5/lib/services/user-settings.service.js +0 -30
- package/esm5/lib/wz-img-manager.component.js +0 -228
- package/esm5/lib/wz-img-manager.module.js +0 -131
- package/esm5/public-api.js +0 -11
- package/esm5/wizishop-img-manager.js +0 -57
- package/fesm2015/wizishop-img-manager.js +0 -4514
- package/fesm2015/wizishop-img-manager.js.map +0 -1
- package/fesm5/wizishop-img-manager.js +0 -4788
- package/fesm5/wizishop-img-manager.js.map +0 -1
- package/wizishop-img-manager-0.2.104.tgz +0 -0
- package/wizishop-img-manager.d.ts +0 -56
- package/wizishop-img-manager.metadata.json +0 -1
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { insertRemove } from '../../../animations/insertRemove/insert-remove.animation';
|
|
4
|
+
import { ImgCDNService } from '../../../services/config/img-cdn.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../../services/config/img-cdn.service";
|
|
7
|
+
import * as i2 from "@angular/common";
|
|
8
|
+
import * as i3 from "@wizishop/ng-wizi-bulma";
|
|
9
|
+
import * as i4 from "ngx-image-cropper";
|
|
10
|
+
import * as i5 from "../../shared/dropdown/dropdown.component";
|
|
11
|
+
import * as i6 from "@ngx-translate/core";
|
|
12
|
+
export class CropperComponent {
|
|
13
|
+
constructor(imgCDNService) {
|
|
14
|
+
this.imgCDNService = imgCDNService;
|
|
15
|
+
this._isImgModified = false;
|
|
16
|
+
this.isImgModifiedChange = new EventEmitter();
|
|
17
|
+
this.editClosed = new EventEmitter();
|
|
18
|
+
this.currentCroppedImageChange = new EventEmitter();
|
|
19
|
+
this.msgFailLoad = 'ImgManager.ImgEditor.msgFailLoad';
|
|
20
|
+
this.isNameModified = false;
|
|
21
|
+
this.isCropperReady = false; // Use to not display the crop validation btn, after the img is loaded or changed
|
|
22
|
+
this.currentCroppedImage = ''; // Img modified return in base64
|
|
23
|
+
this.isCropped = false;
|
|
24
|
+
this.isLoading = false;
|
|
25
|
+
this._isImgCropped = false;
|
|
26
|
+
this.imgCropperChange = new Subject();
|
|
27
|
+
this.skipNextImgCropped = 1;
|
|
28
|
+
this.imageChangedEvent = '';
|
|
29
|
+
this.croppedImage = '';
|
|
30
|
+
this.canvasRotation = 0;
|
|
31
|
+
this.rotation = 0;
|
|
32
|
+
this.scale = 1;
|
|
33
|
+
this.showCropper = false;
|
|
34
|
+
this.containWithinAspectRatio = false;
|
|
35
|
+
this.transform = {};
|
|
36
|
+
// dropdown list
|
|
37
|
+
this.resolutionConfig = [
|
|
38
|
+
{
|
|
39
|
+
label: 'ImgManager.ImgEditor.config.origin',
|
|
40
|
+
config: {
|
|
41
|
+
maintainAspectRatio: true
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
label: 'ImgManager.ImgEditor.config.free',
|
|
46
|
+
config: {
|
|
47
|
+
maintainAspectRatio: false
|
|
48
|
+
},
|
|
49
|
+
active: true
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
label: 'ImgManager.ImgEditor.config.square',
|
|
53
|
+
config: {
|
|
54
|
+
maintainAspectRatio: true,
|
|
55
|
+
aspectRatio: 1 / 1
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
label: 'ImgManager.ImgEditor.config.Portrait',
|
|
60
|
+
config: {
|
|
61
|
+
maintainAspectRatio: true,
|
|
62
|
+
aspectRatio: 3 / 4
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
label: 'ImgManager.ImgEditor.config.landscape',
|
|
67
|
+
config: {
|
|
68
|
+
maintainAspectRatio: true,
|
|
69
|
+
aspectRatio: 5 / 3
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
];
|
|
73
|
+
this.rotationConfig = [
|
|
74
|
+
{
|
|
75
|
+
label: 'ImgManager.ImgEditor.config.schedule',
|
|
76
|
+
icon: "fal fa-redo-alt",
|
|
77
|
+
method: "rotateRight",
|
|
78
|
+
active: true
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
label: 'ImgManager.ImgEditor.config.AntiSchedule',
|
|
82
|
+
icon: "fal fa-undo-alt",
|
|
83
|
+
method: "rotateLeft"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
label: 'ImgManager.ImgEditor.config.flipVert',
|
|
87
|
+
icon: "fal fa-sort-alt",
|
|
88
|
+
method: "flipVertical"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
label: 'ImgManager.ImgEditor.config.flipHoriz',
|
|
92
|
+
icon: "fal fa-exchange-alt",
|
|
93
|
+
method: "flipHorizontal"
|
|
94
|
+
}
|
|
95
|
+
];
|
|
96
|
+
this.zoomConfig = [
|
|
97
|
+
{
|
|
98
|
+
label: 'ImgManager.ImgEditor.config.zoom',
|
|
99
|
+
icon: "fal fa-search-plus",
|
|
100
|
+
method: "zoomIn",
|
|
101
|
+
active: true
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
label: 'ImgManager.ImgEditor.config.dezoom',
|
|
105
|
+
icon: "fal fa-search-minus",
|
|
106
|
+
method: "zoomOut"
|
|
107
|
+
}
|
|
108
|
+
];
|
|
109
|
+
// Img cropper variables
|
|
110
|
+
this.imgCropperConfig = {
|
|
111
|
+
maintainAspectRatio: false,
|
|
112
|
+
aspectRatio: undefined
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
set isImgModified(isImgModified) {
|
|
116
|
+
this._isImgModified = isImgModified;
|
|
117
|
+
if (!isImgModified) {
|
|
118
|
+
this.restartEdit();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
get isImgModified() {
|
|
122
|
+
return this._isImgModified;
|
|
123
|
+
}
|
|
124
|
+
set isImgCropped(isImgCropped) {
|
|
125
|
+
setTimeout(() => {
|
|
126
|
+
this._isImgCropped = isImgCropped;
|
|
127
|
+
}, 0);
|
|
128
|
+
}
|
|
129
|
+
get isImgCropped() {
|
|
130
|
+
return this._isImgCropped;
|
|
131
|
+
}
|
|
132
|
+
ngOnInit() {
|
|
133
|
+
this.init();
|
|
134
|
+
this.detectImgCropperChange();
|
|
135
|
+
}
|
|
136
|
+
init() {
|
|
137
|
+
this.imgRoute = this.getRAWImgRoute();
|
|
138
|
+
this.imgType = this.getImgType();
|
|
139
|
+
this.croppedImage = null;
|
|
140
|
+
this.setDefautAspectRatio();
|
|
141
|
+
}
|
|
142
|
+
getRAWImgRoute() {
|
|
143
|
+
return this.imgCDNService.getUrlImg('raw') + this.imgToEdit.file_name;
|
|
144
|
+
}
|
|
145
|
+
getImgType() {
|
|
146
|
+
return (this.imgToEdit.file_name ? this.imgToEdit.file_name.split('.').pop() : undefined);
|
|
147
|
+
}
|
|
148
|
+
setDefautAspectRatio() {
|
|
149
|
+
const height = parseInt(this.imgToEdit.raw_height);
|
|
150
|
+
const width = parseInt(this.imgToEdit.raw_width);
|
|
151
|
+
this.defaultAspectRatio = height / width;
|
|
152
|
+
this.resolutionConfig[0].config.aspectRatio = this.defaultAspectRatio;
|
|
153
|
+
this.imgCropperConfig.aspectRatio = this.defaultAspectRatio;
|
|
154
|
+
}
|
|
155
|
+
onEditClosed(msgKey) {
|
|
156
|
+
this.editClosed.emit(msgKey);
|
|
157
|
+
}
|
|
158
|
+
onRestart() {
|
|
159
|
+
this.isImgModifiedChange.emit(false);
|
|
160
|
+
}
|
|
161
|
+
restartEdit() {
|
|
162
|
+
this.init();
|
|
163
|
+
this.resetConfCropper();
|
|
164
|
+
}
|
|
165
|
+
onImgModified() {
|
|
166
|
+
this.isImgModified = true;
|
|
167
|
+
this.isImgModifiedChange.emit(true);
|
|
168
|
+
}
|
|
169
|
+
////// Img cropper methods ////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
170
|
+
/* Cropper output events */
|
|
171
|
+
fileChangeEvent(event) {
|
|
172
|
+
this.imageChangedEvent = event;
|
|
173
|
+
}
|
|
174
|
+
imageCropped(event) {
|
|
175
|
+
this.imgCropperChange.next();
|
|
176
|
+
this.currentCroppedImage = event.base64;
|
|
177
|
+
this.currentCroppedImageChange.emit(this.currentCroppedImage);
|
|
178
|
+
}
|
|
179
|
+
imageLoaded() {
|
|
180
|
+
this.showCropper = true;
|
|
181
|
+
}
|
|
182
|
+
cropperReady() {
|
|
183
|
+
this.isCropperReady = true;
|
|
184
|
+
}
|
|
185
|
+
loadImageFailed() {
|
|
186
|
+
this.onEditClosed(this.msgFailLoad);
|
|
187
|
+
}
|
|
188
|
+
/* Resize functions */
|
|
189
|
+
changeResolutionSize(index) {
|
|
190
|
+
this.setActiveItem(this.resolutionConfig, index);
|
|
191
|
+
const config = this.resolutionConfig[index].config;
|
|
192
|
+
this.setCropperProperties(config);
|
|
193
|
+
}
|
|
194
|
+
confirmCrop() {
|
|
195
|
+
setTimeout(() => {
|
|
196
|
+
this.imgRoute = null;
|
|
197
|
+
this.croppedImage = this.currentCroppedImage;
|
|
198
|
+
this.skipNextImgCropped = 2;
|
|
199
|
+
this.isImgCropped = false;
|
|
200
|
+
}, 0);
|
|
201
|
+
this.resetConfCropper();
|
|
202
|
+
this.onImgModified();
|
|
203
|
+
}
|
|
204
|
+
resetConfCropper() {
|
|
205
|
+
this.scale = 1;
|
|
206
|
+
this.rotation = 0;
|
|
207
|
+
this.canvasRotation = 0;
|
|
208
|
+
this.transform = {};
|
|
209
|
+
}
|
|
210
|
+
setActiveItem(array, index) {
|
|
211
|
+
// Set active-item class for the dropdown
|
|
212
|
+
array.forEach((item, indexItem) => {
|
|
213
|
+
item.active = indexItem === index ? true : false;
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
setCropperProperties(config) {
|
|
217
|
+
for (const property in config) {
|
|
218
|
+
this.imgCropperConfig[property] = config[property];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
detectImgCropperChange() {
|
|
222
|
+
this.imgCropperChange
|
|
223
|
+
.subscribe(() => {
|
|
224
|
+
this.skipNextImgCropped--;
|
|
225
|
+
if (this.skipNextImgCropped >= 0) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
this.skipNextImgCropped = 0;
|
|
229
|
+
this.isImgCropped = true;
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/* Rotations functions */
|
|
233
|
+
rotateLeft() {
|
|
234
|
+
this.canvasRotation--;
|
|
235
|
+
this.flipAfterRotate();
|
|
236
|
+
this.onImgModified();
|
|
237
|
+
}
|
|
238
|
+
rotateRight() {
|
|
239
|
+
this.canvasRotation++;
|
|
240
|
+
this.flipAfterRotate();
|
|
241
|
+
this.onImgModified();
|
|
242
|
+
}
|
|
243
|
+
flipHorizontal() {
|
|
244
|
+
this.transform = {
|
|
245
|
+
...this.transform,
|
|
246
|
+
flipH: !this.transform.flipH
|
|
247
|
+
};
|
|
248
|
+
this.onImgModified();
|
|
249
|
+
}
|
|
250
|
+
flipVertical() {
|
|
251
|
+
this.transform = {
|
|
252
|
+
...this.transform,
|
|
253
|
+
flipV: !this.transform.flipV
|
|
254
|
+
};
|
|
255
|
+
this.onImgModified();
|
|
256
|
+
}
|
|
257
|
+
flipAfterRotate() {
|
|
258
|
+
const flippedH = this.transform.flipH;
|
|
259
|
+
const flippedV = this.transform.flipV;
|
|
260
|
+
this.transform = {
|
|
261
|
+
...this.transform,
|
|
262
|
+
flipH: flippedV,
|
|
263
|
+
flipV: flippedH
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
/* Zoom functions */
|
|
267
|
+
zoomOut() {
|
|
268
|
+
this.scale -= this.scale < 0.2 ? 0 : .1;
|
|
269
|
+
this.transform = {
|
|
270
|
+
...this.transform,
|
|
271
|
+
scale: this.scale
|
|
272
|
+
};
|
|
273
|
+
this.onImgModified();
|
|
274
|
+
}
|
|
275
|
+
zoomIn() {
|
|
276
|
+
this.scale += .1;
|
|
277
|
+
this.transform = {
|
|
278
|
+
...this.transform,
|
|
279
|
+
scale: this.scale
|
|
280
|
+
};
|
|
281
|
+
this.onImgModified();
|
|
282
|
+
}
|
|
283
|
+
applyMethod(method) {
|
|
284
|
+
this[method](); // call the method contains in zoomConfig or rotationConfig
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
CropperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: CropperComponent, deps: [{ token: i1.ImgCDNService }], target: i0.ɵɵFactoryTarget.Component });
|
|
288
|
+
CropperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: CropperComponent, selector: "cropper", inputs: { imgToEdit: "imgToEdit", isImgModified: "isImgModified" }, outputs: { isImgModifiedChange: "isImgModifiedChange", editClosed: "editClosed", currentCroppedImageChange: "currentCroppedImageChange" }, ngImport: i0, template: "<div class=\"img-editor__container__toolsContainer\">\n\n <div *ngIf=\"isImgCropped\">\n <div\n class=\"img-editor__container__toolsContainer__tool img-editor__container__toolsContainer__tool--button\"\n (click)=\"confirmCrop()\"\n [nwbToolTip]=\"'ImgManager.ImgEditor.ValidtToolTip' | translate\"\n nwbToolTipPosition=\"left\"\n >\n <i class=\"far fa-check\"></i>\n <p>{{ 'ImgManager.ImgEditor.Valid' | translate }}</p>\n </div>\n </div>\n\n <!-- Resolution -->\n <dropdown dropdownId=\"dropdown-resolution\">\n <ng-container label>\n <div\n class=\"img-editor__container__toolsContainer__tool\"\n >\n <i class=\"far fa-crop\"></i>\n <p>{{ 'ImgManager.ImgEditor.crop' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of resolutionConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"changeResolutionSize(index)\">\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <!-- Zoom -->\n <dropdown dropdownId=\"dropdown-rotation\">\n <ng-container label>\n <div class=\"img-editor__container__toolsContainer__tool\" (click)=\"zoomIn()\">\n <i class=\"far fa-expand-arrows-alt\"></i>\n <p>{{ 'ImgManager.ImgEditor.display' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of zoomConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"applyMethod(item.method)\">\n <i *ngIf=\"item.icon\" [ngClass]=\"item.icon\"></i>\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <!-- Rotation -->\n <dropdown dropdownId=\"dropdown-rotation\" dropDownMenuClass=\"img-editor__container__toolsContainer__RotationDropdown\">\n <ng-container label>\n <div class=\"img-editor__container__toolsContainer__tool\" (click)=\"rotateRight()\">\n <i class=\"far fa-redo\"></i>\n <p>{{ 'ImgManager.ImgEditor.rotation' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of rotationConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"applyMethod(item.method)\">\n <i *ngIf=\"item.icon\" [ngClass]=\"item.icon\"></i>\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <div\n class=\"img-editor__container__toolsContainer__tool\"\n (click)=\"onRestart()\"\n @insertRemoveAnnim\n >\n <i class=\"far fa-retweet-alt\"></i>\n <p>{{ 'ImgManager.ImgEditor.restart' | translate }}</p>\n </div>\n</div>\n\n<div class=\"img-editor__image-cropper\" >\n <image-cropper\n [imageURL]=\"imgRoute\"\n [imageBase64]=\"croppedImage\"\n [maintainAspectRatio]=\"imgCropperConfig.maintainAspectRatio\"\n [containWithinAspectRatio]=\"containWithinAspectRatio\"\n [aspectRatio]=\"imgCropperConfig.aspectRatio\"\n [onlyScaleDown]=\"true\"\n [roundCropper]=\"false\"\n [canvasRotation]=\"canvasRotation\"\n [transform]=\"transform\"\n [alignImage]=\"'center'\"\n [style.display]=\"showCropper ? null : 'none'\"\n [format]=\"imgType\"\n [backgroundColor]=\"'white'\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n (cropperReady)=\"cropperReady()\"\n (loadImageFailed)=\"loadImageFailed()\"\n ></image-cropper>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NwbToolTipDirective, selector: "[nwbToolTip]", inputs: ["nwbToolTip", "nwbToolTipPosition", "nwbToolTipIsMultiline"] }, { kind: "component", type: i4.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "cropper", "alignImage", "disabled"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange"] }, { kind: "component", type: i5.DropdownComponent, selector: "dropdown", inputs: ["dropDownMenuClass", "disable"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }], animations: [
|
|
289
|
+
insertRemove
|
|
290
|
+
] });
|
|
291
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: CropperComponent, decorators: [{
|
|
292
|
+
type: Component,
|
|
293
|
+
args: [{ selector: 'cropper', animations: [
|
|
294
|
+
insertRemove
|
|
295
|
+
], template: "<div class=\"img-editor__container__toolsContainer\">\n\n <div *ngIf=\"isImgCropped\">\n <div\n class=\"img-editor__container__toolsContainer__tool img-editor__container__toolsContainer__tool--button\"\n (click)=\"confirmCrop()\"\n [nwbToolTip]=\"'ImgManager.ImgEditor.ValidtToolTip' | translate\"\n nwbToolTipPosition=\"left\"\n >\n <i class=\"far fa-check\"></i>\n <p>{{ 'ImgManager.ImgEditor.Valid' | translate }}</p>\n </div>\n </div>\n\n <!-- Resolution -->\n <dropdown dropdownId=\"dropdown-resolution\">\n <ng-container label>\n <div\n class=\"img-editor__container__toolsContainer__tool\"\n >\n <i class=\"far fa-crop\"></i>\n <p>{{ 'ImgManager.ImgEditor.crop' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of resolutionConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"changeResolutionSize(index)\">\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <!-- Zoom -->\n <dropdown dropdownId=\"dropdown-rotation\">\n <ng-container label>\n <div class=\"img-editor__container__toolsContainer__tool\" (click)=\"zoomIn()\">\n <i class=\"far fa-expand-arrows-alt\"></i>\n <p>{{ 'ImgManager.ImgEditor.display' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of zoomConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"applyMethod(item.method)\">\n <i *ngIf=\"item.icon\" [ngClass]=\"item.icon\"></i>\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <!-- Rotation -->\n <dropdown dropdownId=\"dropdown-rotation\" dropDownMenuClass=\"img-editor__container__toolsContainer__RotationDropdown\">\n <ng-container label>\n <div class=\"img-editor__container__toolsContainer__tool\" (click)=\"rotateRight()\">\n <i class=\"far fa-redo\"></i>\n <p>{{ 'ImgManager.ImgEditor.rotation' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of rotationConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"applyMethod(item.method)\">\n <i *ngIf=\"item.icon\" [ngClass]=\"item.icon\"></i>\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <div\n class=\"img-editor__container__toolsContainer__tool\"\n (click)=\"onRestart()\"\n @insertRemoveAnnim\n >\n <i class=\"far fa-retweet-alt\"></i>\n <p>{{ 'ImgManager.ImgEditor.restart' | translate }}</p>\n </div>\n</div>\n\n<div class=\"img-editor__image-cropper\" >\n <image-cropper\n [imageURL]=\"imgRoute\"\n [imageBase64]=\"croppedImage\"\n [maintainAspectRatio]=\"imgCropperConfig.maintainAspectRatio\"\n [containWithinAspectRatio]=\"containWithinAspectRatio\"\n [aspectRatio]=\"imgCropperConfig.aspectRatio\"\n [onlyScaleDown]=\"true\"\n [roundCropper]=\"false\"\n [canvasRotation]=\"canvasRotation\"\n [transform]=\"transform\"\n [alignImage]=\"'center'\"\n [style.display]=\"showCropper ? null : 'none'\"\n [format]=\"imgType\"\n [backgroundColor]=\"'white'\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n (cropperReady)=\"cropperReady()\"\n (loadImageFailed)=\"loadImageFailed()\"\n ></image-cropper>\n</div>\n" }]
|
|
296
|
+
}], ctorParameters: function () { return [{ type: i1.ImgCDNService }]; }, propDecorators: { imgToEdit: [{
|
|
297
|
+
type: Input
|
|
298
|
+
}], isImgModified: [{
|
|
299
|
+
type: Input
|
|
300
|
+
}], isImgModifiedChange: [{
|
|
301
|
+
type: Output
|
|
302
|
+
}], editClosed: [{
|
|
303
|
+
type: Output
|
|
304
|
+
}], currentCroppedImageChange: [{
|
|
305
|
+
type: Output
|
|
306
|
+
}] } });
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ei1pbWctbWFuYWdlci9zcmMvbGliL2NvbXBvbmVudHMvaW1nLWVkaXRvci9jcm9wcGVyL2Nyb3BwZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd3otaW1nLW1hbmFnZXIvc3JjL2xpYi9jb21wb25lbnRzL2ltZy1lZGl0b3IvY3JvcHBlci9jcm9wcGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFMUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMERBQTBELENBQUM7QUFHeEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7OztBQVN6RSxNQUFNLE9BQU8sZ0JBQWdCO0lBK0kzQixZQUNVLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBakk5QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUd4Qyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBR2xELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBR2hDLDhCQUF5QixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFdkQsZ0JBQVcsR0FBVyxrQ0FBa0MsQ0FBQztRQUV6RCxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxtQkFBYyxHQUFZLEtBQUssQ0FBQyxDQUFDLGlGQUFpRjtRQUNsSCx3QkFBbUIsR0FBVyxFQUFFLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDbEUsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixjQUFTLEdB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OzJGQUVVLGdCQUFnQjtrQkFQNUIsU0FBUzsrQkFDRSxTQUFTLGNBRVA7d0JBQ1YsWUFBWTtxQkFDYjtvR0FLRCxTQUFTO3NCQURSLEtBQUs7Z0JBSUYsYUFBYTtzQkFEaEIsS0FBSztnQkFhTixtQkFBbUI7c0JBRGxCLE1BQU07Z0JBSVAsVUFBVTtzQkFEVCxNQUFNO2dCQUlQLHlCQUF5QjtzQkFEeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW1hZ2VDcm9wcGVkRXZlbnQsIEltYWdlVHJhbnNmb3JtLCBPdXRwdXRGb3JtYXQgfSBmcm9tICduZ3gtaW1hZ2UtY3JvcHBlcic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpbnNlcnRSZW1vdmUgfSBmcm9tICcuLi8uLi8uLi9hbmltYXRpb25zL2luc2VydFJlbW92ZS9pbnNlcnQtcmVtb3ZlLmFuaW1hdGlvbic7XG5pbXBvcnQgeyBDcm9wcGVyQ29uZmlnRFRPLCBJbWdDcm9wcGVyQ29uZmlnRFRPIH0gZnJvbSAnLi4vLi4vLi4vZHRvL2ltZy1lZGl0b3ItY29uZmlnLmR0byc7XG5pbXBvcnQgeyBJbWdQaWN0dXJlRFRPIH0gZnJvbSAnLi4vLi4vLi4vZHRvL2ltZy1tYW5hZ2VyLmR0byc7XG5pbXBvcnQgeyBJbWdDRE5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29uZmlnL2ltZy1jZG4uc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nyb3BwZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY3JvcHBlci5jb21wb25lbnQuaHRtbCcsXG4gIGFuaW1hdGlvbnM6IFtcbiAgICBpbnNlcnRSZW1vdmVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDcm9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKVxuICBpbWdUb0VkaXQ6IEltZ1BpY3R1cmVEVE87XG5cbiAgQElucHV0KClcbiAgc2V0IGlzSW1nTW9kaWZpZWQoaXNJbWdNb2RpZmllZDogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzSW1nTW9kaWZpZWQgPSBpc0ltZ01vZGlmaWVkO1xuICAgIGlmICghaXNJbWdNb2RpZmllZCkge1xuICAgICAgdGhpcy5yZXN0YXJ0RWRpdCgpO1xuICAgIH1cbiAgfVxuICBnZXQgaXNJbWdNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbWdNb2RpZmllZDtcbiAgfVxuICBwcml2YXRlIF9pc0ltZ01vZGlmaWVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpXG4gIGlzSW1nTW9kaWZpZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGVkaXRDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIGN1cnJlbnRDcm9wcGVkSW1hZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBtc2dGYWlsTG9hZDogc3RyaW5nID0gJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLm1zZ0ZhaWxMb2FkJztcblxuICBpc05hbWVNb2RpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0Nyb3BwZXJSZWFkeTogYm9vbGVhbiA9IGZhbHNlOyAvLyBVc2UgdG8gbm90IGRpc3BsYXkgdGhlIGNyb3AgdmFsaWRhdGlvbiBidG4sIGFmdGVyIHRoZSBpbWcgaXMgbG9hZGVkIG9yIGNoYW5nZWRcbiAgY3VycmVudENyb3BwZWRJbWFnZTogc3RyaW5nID0gJyc7IC8vIEltZyBtb2RpZmllZCByZXR1cm4gaW4gYmFzZTY0XG4gIGlzQ3JvcHBlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBfaXNJbWdDcm9wcGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHNldCBpc0ltZ0Nyb3BwZWQoaXNJbWdDcm9wcGVkOiBib29sZWFuKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9pc0ltZ0Nyb3BwZWQgPSBpc0ltZ0Nyb3BwZWQ7XG4gICAgfSwgMCk7XG4gIH1cblxuICBnZXQgaXNJbWdDcm9wcGVkKCkgOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbWdDcm9wcGVkO1xuICB9XG4gIGltZ0Nyb3BwZXJDaGFuZ2U6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBza2lwTmV4dEltZ0Nyb3BwZWQ6IG51bWJlciA9IDE7XG5cbiAgLy8gSW1hZ2UgQ3JvcHBlciBwcm9wZXJ0aWVzXG4gIGltZ1R5cGU6IE91dHB1dEZvcm1hdDtcbiAgaW1nUm91dGU6IHN0cmluZztcbiAgaW1hZ2VDaGFuZ2VkRXZlbnQ6IGFueSA9ICcnO1xuICBjcm9wcGVkSW1hZ2U6IGFueSA9ICcnO1xuICBjYW52YXNSb3RhdGlvbiA9IDA7XG4gIHJvdGF0aW9uID0gMDtcbiAgc2NhbGUgPSAxO1xuICBzaG93Q3JvcHBlciA9IGZhbHNlO1xuICBjb250YWluV2l0aGluQXNwZWN0UmF0aW8gPSBmYWxzZTtcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHt9O1xuXG4gIGRlZmF1bHRBc3BlY3RSYXRpbzogbnVtYmVyO1xuXG4gIC8vIGRyb3Bkb3duIGxpc3RcbiAgcmVzb2x1dGlvbkNvbmZpZzpJbWdDcm9wcGVyQ29uZmlnRFRPW10gPSBbXG4gICAge1xuICAgICAgbGFiZWw6ICdJbWdNYW5hZ2VyLkltZ0VkaXRvci5jb25maWcub3JpZ2luJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiB0cnVlXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICdJbWdNYW5hZ2VyLkltZ0VkaXRvci5jb25maWcuZnJlZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2VcbiAgICAgIH0sXG4gICAgICBhY3RpdmU6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY29uZmlnLnNxdWFyZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSxcbiAgICAgICAgYXNwZWN0UmF0aW86IDEgLyAxXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLmNvbmZpZy5Qb3J0cmFpdCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSxcbiAgICAgICAgYXNwZWN0UmF0aW86IDMgLyA0XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLmNvbmZpZy5sYW5kc2NhcGUnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG1haW50YWluQXNwZWN0UmF0aW86IHRydWUsXG4gICAgICAgIGFzcGVjdFJhdGlvOiA1IC8gM1xuICAgICAgfVxuICAgIH1cbiAgXTtcblxuICByb3RhdGlvbkNvbmZpZzpJbWdDcm9wcGVyQ29uZmlnRFRPW10gPSBbXG4gICAge1xuICAgICAgbGFiZWw6ICdJbWdNYW5hZ2VyLkltZ0VkaXRvci5jb25maWcuc2NoZWR1bGUnLFxuICAgICAgaWNvbjogXCJmYWwgZmEtcmVkby1hbHRcIixcbiAgICAgIG1ldGhvZDogXCJyb3RhdGVSaWdodFwiLFxuICAgICAgYWN0aXZlOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLmNvbmZpZy5BbnRpU2NoZWR1bGUnLFxuICAgICAgaWNvbjogXCJmYWwgZmEtdW5kby1hbHRcIixcbiAgICAgIG1ldGhvZDogXCJyb3RhdGVMZWZ0XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY29uZmlnLmZsaXBWZXJ0JyxcbiAgICAgIGljb246IFwiZmFsIGZhLXNvcnQtYWx0XCIsXG4gICAgICBtZXRob2Q6IFwiZmxpcFZlcnRpY2FsXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY29uZmlnLmZsaXBIb3JpeicsXG4gICAgICBpY29uOiBcImZhbCBmYS1leGNoYW5nZS1hbHRcIixcbiAgICAgIG1ldGhvZDogXCJmbGlwSG9yaXpvbnRhbFwiXG4gICAgfVxuICBdO1xuXG4gIHpvb21Db25maWc6SW1nQ3JvcHBlckNvbmZpZ0RUT1tdID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY29uZmlnLnpvb20nLFxuICAgICAgaWNvbjogXCJmYWwgZmEtc2VhcmNoLXBsdXNcIixcbiAgICAgIG1ldGhvZDogXCJ6b29tSW5cIixcbiAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICdJbWdNYW5hZ2VyLkltZ0VkaXRvci5jb25maWcuZGV6b29tJyxcbiAgICAgIGljb246IFwiZmFsIGZhLXNlYXJjaC1taW51c1wiLFxuICAgICAgbWV0aG9kOiBcInpvb21PdXRcIlxuICAgIH1cbiAgXTtcblxuICAvLyBJbWcgY3JvcHBlciB2YXJpYWJsZXNcbiAgaW1nQ3JvcHBlckNvbmZpZzpDcm9wcGVyQ29uZmlnRFRPID0ge1xuICAgIG1haW50YWluQXNwZWN0UmF0aW86IGZhbHNlLFxuICAgIGFzcGVjdFJhdGlvOiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW1nQ0ROU2VydmljZTogSW1nQ0ROU2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMuZGV0ZWN0SW1nQ3JvcHBlckNoYW5nZSgpO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLmltZ1JvdXRlID0gdGhpcy5nZXRSQVdJbWdSb3V0ZSgpO1xuICAgIHRoaXMuaW1nVHlwZSA9IHRoaXMuZ2V0SW1nVHlwZSgpO1xuICAgIHRoaXMuY3JvcHBlZEltYWdlID0gbnVsbDtcbiAgICB0aGlzLnNldERlZmF1dEFzcGVjdFJhdGlvKCk7XG4gIH1cblxuICBnZXRSQVdJbWdSb3V0ZSgpe1xuICAgIHJldHVybiB0aGlzLmltZ0NETlNlcnZpY2UuZ2V0VXJsSW1nKCdyYXcnKSArIHRoaXMuaW1nVG9FZGl0LmZpbGVfbmFtZTtcbiAgfVxuXG4gIGdldEltZ1R5cGUoKSB7XG4gICAgcmV0dXJuICh0aGlzLmltZ1RvRWRpdC5maWxlX25hbWUgPyB0aGlzLmltZ1RvRWRpdC5maWxlX25hbWUuc3BsaXQoJy4nKS5wb3AoKSA6IHVuZGVmaW5lZCkgYXMgT3V0cHV0Rm9ybWF0O1xuICB9XG5cbiAgc2V0RGVmYXV0QXNwZWN0UmF0aW8oKSB7XG4gICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VJbnQodGhpcy5pbWdUb0VkaXQucmF3X2hlaWdodCk7XG4gICAgY29uc3Qgd2lkdGggPSBwYXJzZUludCh0aGlzLmltZ1RvRWRpdC5yYXdfd2lkdGgpO1xuICAgIHRoaXMuZGVmYXVsdEFzcGVjdFJhdGlvID0gaGVpZ2h0IC8gd2lkdGg7XG4gICAgdGhpcy5yZXNvbHV0aW9uQ29uZmlnWzBdLmNvbmZpZy5hc3BlY3RSYXRpbyA9IHRoaXMuZGVmYXVsdEFzcGVjdFJhdGlvO1xuICAgIHRoaXMuaW1nQ3JvcHBlckNvbmZpZy5hc3BlY3RSYXRpbyA9IHRoaXMuZGVmYXVsdEFzcGVjdFJhdGlvO1xuICB9XG5cbiAgb25FZGl0Q2xvc2VkKG1zZ0tleT86IHN0cmluZykge1xuICAgIHRoaXMuZWRpdENsb3NlZC5lbWl0KG1zZ0tleSk7XG4gIH1cblxuICBvblJlc3RhcnQoKSB7XG4gICAgdGhpcy5pc0ltZ01vZGlmaWVkQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgcmVzdGFydEVkaXQoKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gICAgdGhpcy5yZXNldENvbmZDcm9wcGVyKCk7XG4gIH1cblxuICBvbkltZ01vZGlmaWVkKCkge1xuICAgIHRoaXMuaXNJbWdNb2RpZmllZCA9IHRydWU7XG4gICAgdGhpcy5pc0ltZ01vZGlmaWVkQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICAvLy8vLy8gSW1nIGNyb3BwZXIgbWV0aG9kcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIC8qIENyb3BwZXIgb3V0cHV0IGV2ZW50cyAqL1xuXG4gIGZpbGVDaGFuZ2VFdmVudChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZUNoYW5nZWRFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgaW1hZ2VDcm9wcGVkKGV2ZW50OiBJbWFnZUNyb3BwZWRFdmVudCkge1xuICAgIHRoaXMuaW1nQ3JvcHBlckNoYW5nZS5uZXh0KCk7XG5cbiAgICB0aGlzLmN1cnJlbnRDcm9wcGVkSW1hZ2UgPSBldmVudC5iYXNlNjQ7XG4gICAgdGhpcy5jdXJyZW50Q3JvcHBlZEltYWdlQ2hhbmdlLmVtaXQodGhpcy5jdXJyZW50Q3JvcHBlZEltYWdlKTtcbiAgfVxuXG4gIGltYWdlTG9hZGVkKCkge1xuICAgIHRoaXMuc2hvd0Nyb3BwZXIgPSB0cnVlO1xuICB9XG5cbiAgY3JvcHBlclJlYWR5KCkge1xuICAgIHRoaXMuaXNDcm9wcGVyUmVhZHkgPSB0cnVlO1xuICB9XG5cbiAgbG9hZEltYWdlRmFpbGVkKCkge1xuICAgIHRoaXMub25FZGl0Q2xvc2VkKHRoaXMubXNnRmFpbExvYWQpO1xuICB9XG5cbiAgLyogUmVzaXplIGZ1bmN0aW9ucyAqL1xuXG4gIGNoYW5nZVJlc29sdXRpb25TaXplKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnNldEFjdGl2ZUl0ZW0odGhpcy5yZXNvbHV0aW9uQ29uZmlnLCBpbmRleCk7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5yZXNvbHV0aW9uQ29uZmlnW2luZGV4XS5jb25maWc7XG4gICAgdGhpcy5zZXRDcm9wcGVyUHJvcGVydGllcyhjb25maWcpO1xuICB9XG5cbiAgY29uZmlybUNyb3AoKSB7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgLy8gQXZvaWQgaW1hZ2UtY3JvcHBlciBlcnJvclxuICAgICAgdGhpcy5pbWdSb3V0ZSA9IG51bGw7XG4gICAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IHRoaXMuY3VycmVudENyb3BwZWRJbWFnZTtcbiAgICAgIHRoaXMuc2tpcE5leHRJbWdDcm9wcGVkID0gMjtcbiAgICAgIHRoaXMuaXNJbWdDcm9wcGVkID0gZmFsc2U7XG4gICAgfSwgMCk7XG5cbiAgICB0aGlzLnJlc2V0Q29uZkNyb3BwZXIoKTtcbiAgICB0aGlzLm9uSW1nTW9kaWZpZWQoKTtcbiAgfVxuXG4gIHJlc2V0Q29uZkNyb3BwZXIoKSB7XG4gICAgdGhpcy5zY2FsZSA9IDE7XG4gICAgdGhpcy5yb3RhdGlvbiA9IDA7XG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbiA9IDA7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7fTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlSXRlbShhcnJheTphbnlbXSwgaW5kZXg6IG51bWJlcikge1xuICAgIC8vIFNldCBhY3RpdmUtaXRlbSBjbGFzcyBmb3IgdGhlIGRyb3Bkb3duXG4gICAgYXJyYXkuZm9yRWFjaCgoaXRlbSwgaW5kZXhJdGVtKSA9PiB7XG4gICAgICBpdGVtLmFjdGl2ZSA9IGluZGV4SXRlbSA9PT0gaW5kZXggPyB0cnVlIDogZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldENyb3BwZXJQcm9wZXJ0aWVzKGNvbmZpZzogYW55KSB7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBjb25maWcpIHtcbiAgICAgIHRoaXMuaW1nQ3JvcHBlckNvbmZpZ1twcm9wZXJ0eV0gPSBjb25maWdbcHJvcGVydHldO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0SW1nQ3JvcHBlckNoYW5nZSgpIHtcbiAgICB0aGlzLmltZ0Nyb3BwZXJDaGFuZ2VcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNraXBOZXh0SW1nQ3JvcHBlZC0tO1xuICAgICAgICBpZiAodGhpcy5za2lwTmV4dEltZ0Nyb3BwZWQgPj0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNraXBOZXh0SW1nQ3JvcHBlZCA9IDA7XG4gICAgICAgIHRoaXMuaXNJbWdDcm9wcGVkID0gdHJ1ZTtcbiAgICB9KVxuXG4gIH1cblxuICAvKiBSb3RhdGlvbnMgZnVuY3Rpb25zICovXG5cbiAgcm90YXRlTGVmdCgpIHtcbiAgICAgIHRoaXMuY2FudmFzUm90YXRpb24tLTtcbiAgICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XG4gICAgICB0aGlzLm9uSW1nTW9kaWZpZWQoKTtcbiAgfVxuXG4gIHJvdGF0ZVJpZ2h0KCkge1xuICAgICAgdGhpcy5jYW52YXNSb3RhdGlvbisrO1xuICAgICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcbiAgICAgIHRoaXMub25JbWdNb2RpZmllZCgpO1xuICB9XG5cbiAgZmxpcEhvcml6b250YWwoKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICBmbGlwSDogIXRoaXMudHJhbnNmb3JtLmZsaXBIXG4gICAgICB9O1xuICAgICAgdGhpcy5vbkltZ01vZGlmaWVkKCk7XG4gIH1cblxuICBmbGlwVmVydGljYWwoKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICBmbGlwVjogIXRoaXMudHJhbnNmb3JtLmZsaXBWXG4gICAgICB9O1xuICAgICAgdGhpcy5vbkltZ01vZGlmaWVkKCk7XG4gIH1cblxuICBwcml2YXRlIGZsaXBBZnRlclJvdGF0ZSgpIHtcbiAgICBjb25zdCBmbGlwcGVkSCA9IHRoaXMudHJhbnNmb3JtLmZsaXBIO1xuICAgIGNvbnN0IGZsaXBwZWRWID0gdGhpcy50cmFuc2Zvcm0uZmxpcFY7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgICBmbGlwSDogZmxpcHBlZFYsXG4gICAgICAgIGZsaXBWOiBmbGlwcGVkSFxuICAgIH07XG4gIH1cblxuICAvKiBab29tIGZ1bmN0aW9ucyAqL1xuXG4gIHpvb21PdXQoKSB7XG4gICAgICB0aGlzLnNjYWxlIC09ICB0aGlzLnNjYWxlIDwgMC4yPyAwIDogLjE7XG4gICAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICBzY2FsZTogdGhpcy5zY2FsZVxuICAgICAgfTtcbiAgICAgIHRoaXMub25JbWdNb2RpZmllZCgpO1xuICB9XG5cbiAgem9vbUluKCkge1xuICAgICAgdGhpcy5zY2FsZSArPSAuMTtcbiAgICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgIHNjYWxlOiB0aGlzLnNjYWxlXG4gICAgICB9O1xuICAgICAgdGhpcy5vbkltZ01vZGlmaWVkKCk7XG4gIH1cblxuICBhcHBseU1ldGhvZChtZXRob2Q6IHN0cmluZykge1xuICAgIHRoaXNbbWV0aG9kXSgpOyAvLyBjYWxsIHRoZSBtZXRob2QgY29udGFpbnMgaW4gem9vbUNvbmZpZyBvciByb3RhdGlvbkNvbmZpZ1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaW1nLWVkaXRvcl9fY29udGFpbmVyX190b29sc0NvbnRhaW5lclwiPlxuXG4gICAgPGRpdiAqbmdJZj1cImlzSW1nQ3JvcHBlZFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbWctZWRpdG9yX19jb250YWluZXJfX3Rvb2xzQ29udGFpbmVyX190b29sIGltZy1lZGl0b3JfX2NvbnRhaW5lcl9fdG9vbHNDb250YWluZXJfX3Rvb2wtLWJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1Dcm9wKClcIlxuICAgICAgICAgIFtud2JUb29sVGlwXT1cIidJbWdNYW5hZ2VyLkltZ0VkaXRvci5WYWxpZHRUb29sVGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgbndiVG9vbFRpcFBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLWNoZWNrXCI+PC9pPlxuICAgICAgICAgICAgPHA+e3sgJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLlZhbGlkJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJlc29sdXRpb24gLS0+XG4gICAgPGRyb3Bkb3duIGRyb3Bkb3duSWQ9XCJkcm9wZG93bi1yZXNvbHV0aW9uXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGFiZWw+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiaW1nLWVkaXRvcl9fY29udGFpbmVyX190b29sc0NvbnRhaW5lcl9fdG9vbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtY3JvcFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8cD57eyAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY3JvcCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgaXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiByZXNvbHV0aW9uQ29uZmlnOyBsZXQgaW5kZXggPSBpbmRleDtcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWl0ZW0nOiBpdGVtLmFjdGl2ZX1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VSZXNvbHV0aW9uU2l6ZShpbmRleClcIj5cbiAgICAgICAgICAgICAgICA8cD57e2l0ZW0ubGFiZWwgfCB0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Ryb3Bkb3duPlxuXG4gICAgPCEtLSBab29tIC0tPlxuICAgIDxkcm9wZG93biBkcm9wZG93bklkPVwiZHJvcGRvd24tcm90YXRpb25cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19jb250YWluZXJfX3Rvb2xzQ29udGFpbmVyX190b29sXCIgKGNsaWNrKT1cInpvb21JbigpXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtZXhwYW5kLWFycm93cy1hbHRcIj48L2k+XG4gICAgICAgICAgICAgICAgPHA+e3sgJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLmRpc3BsYXknIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGl0ZW0gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygem9vbUNvbmZpZzsgbGV0IGluZGV4ID0gaW5kZXg7XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWl0ZW0nOiBpdGVtLmFjdGl2ZX1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlNZXRob2QoaXRlbS5tZXRob2QpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiaXRlbS5pY29uXCIgW25nQ2xhc3NdPVwiaXRlbS5pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8cD57e2l0ZW0ubGFiZWwgfCB0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Ryb3Bkb3duPlxuXG4gICAgPCEtLSBSb3RhdGlvbiAtLT5cbiAgICA8ZHJvcGRvd24gZHJvcGRvd25JZD1cImRyb3Bkb3duLXJvdGF0aW9uXCIgZHJvcERvd25NZW51Q2xhc3M9XCJpbWctZWRpdG9yX19jb250YWluZXJfX3Rvb2xzQ29udGFpbmVyX19Sb3RhdGlvbkRyb3Bkb3duXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLWVkaXRvcl9fY29udGFpbmVyX190b29sc0NvbnRhaW5lcl9fdG9vbFwiIChjbGljayk9XCJyb3RhdGVSaWdodCgpXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtcmVkb1wiPjwvaT5cbiAgICAgICAgICAgICAgICA8cD57eyAnSW1nTWFuYWdlci5JbWdFZGl0b3Iucm90YXRpb24nIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGl0ZW0gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm90YXRpb25Db25maWc7IGxldCBpbmRleCA9IGluZGV4O1wiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZS1pdGVtJzogaXRlbS5hY3RpdmV9XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5TWV0aG9kKGl0ZW0ubWV0aG9kKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW0uaWNvblwiIFtuZ0NsYXNzXT1cIml0ZW0uaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHA+e3tpdGVtLmxhYmVsIHwgdHJhbnNsYXRlfX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kcm9wZG93bj5cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbWctZWRpdG9yX19jb250YWluZXJfX3Rvb2xzQ29udGFpbmVyX190b29sXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uUmVzdGFydCgpXCJcbiAgICAgICAgQGluc2VydFJlbW92ZUFubmltXG4gICAgPlxuICAgICAgICA8aSBjbGFzcz1cImZhciBmYS1yZXR3ZWV0LWFsdFwiPjwvaT5cbiAgICAgICAgPHA+e3sgJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLnJlc3RhcnQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbWFnZS1jcm9wcGVyXCIgPlxuICAgIDxpbWFnZS1jcm9wcGVyXG4gICAgICAgIFtpbWFnZVVSTF09XCJpbWdSb3V0ZVwiXG4gICAgICAgIFtpbWFnZUJhc2U2NF09XCJjcm9wcGVkSW1hZ2VcIlxuICAgICAgICBbbWFpbnRhaW5Bc3BlY3RSYXRpb109XCJpbWdDcm9wcGVyQ29uZmlnLm1haW50YWluQXNwZWN0UmF0aW9cIlxuICAgICAgICBbY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXT1cImNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb1wiXG4gICAgICAgIFthc3BlY3RSYXRpb109XCJpbWdDcm9wcGVyQ29uZmlnLmFzcGVjdFJhdGlvXCJcbiAgICAgICAgW29ubHlTY2FsZURvd25dPVwidHJ1ZVwiXG4gICAgICAgIFtyb3VuZENyb3BwZXJdPVwiZmFsc2VcIlxuICAgICAgICBbY2FudmFzUm90YXRpb25dPVwiY2FudmFzUm90YXRpb25cIlxuICAgICAgICBbdHJhbnNmb3JtXT1cInRyYW5zZm9ybVwiXG4gICAgICAgIFthbGlnbkltYWdlXT1cIidjZW50ZXInXCJcbiAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwic2hvd0Nyb3BwZXIgPyBudWxsIDogJ25vbmUnXCJcbiAgICAgICAgW2Zvcm1hdF09XCJpbWdUeXBlXCJcbiAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCInd2hpdGUnXCJcbiAgICAgICAgKGltYWdlQ3JvcHBlZCk9XCJpbWFnZUNyb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgIChpbWFnZUxvYWRlZCk9XCJpbWFnZUxvYWRlZCgpXCJcbiAgICAgICAgKGNyb3BwZXJSZWFkeSk9XCJjcm9wcGVyUmVhZHkoKVwiXG4gICAgICAgIChsb2FkSW1hZ2VGYWlsZWQpPVwibG9hZEltYWdlRmFpbGVkKClcIlxuICAgID48L2ltYWdlLWNyb3BwZXI+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { ImgManagerService } from '../../services/img-manager.service';
|
|
3
|
+
import { easeInOut } from '../../animations/easeInOut/ease-in-out.animation';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../../services/img-manager.service";
|
|
6
|
+
import * as i2 from "@angular/common";
|
|
7
|
+
import * as i3 from "ngx-perfect-scrollbar";
|
|
8
|
+
import * as i4 from "./info-section/info-section.component";
|
|
9
|
+
import * as i5 from "./cropper/cropper.component";
|
|
10
|
+
import * as i6 from "../../directives/loading.directive";
|
|
11
|
+
import * as i7 from "@ngx-translate/core";
|
|
12
|
+
export class ImgEditorComponent {
|
|
13
|
+
constructor(imgManagerService) {
|
|
14
|
+
this.imgManagerService = imgManagerService;
|
|
15
|
+
this.editClosed = new EventEmitter();
|
|
16
|
+
this.isLoading = false;
|
|
17
|
+
this.isImgModified = false;
|
|
18
|
+
this.isNameModified = false;
|
|
19
|
+
this.currentCroppedImage = ''; // Img modified return in base64 by the cropper
|
|
20
|
+
this.msgFailSave = 'ImgManager.ImgEditor.msgFailSave';
|
|
21
|
+
this.msgFailLoad = 'ImgManager.ImgEditor.msgFailLoad';
|
|
22
|
+
this.msgSuccessEdit = "Les modifications de l'image ont bien été enregistrées.";
|
|
23
|
+
}
|
|
24
|
+
ngOnInit() {
|
|
25
|
+
this.previousName = this.imgToEdit.display_name;
|
|
26
|
+
}
|
|
27
|
+
onSave() {
|
|
28
|
+
if (this.isLoading) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.isLoading = true;
|
|
32
|
+
if (!this.isImgModified && !this.isNameModified) {
|
|
33
|
+
this.isLoading = false;
|
|
34
|
+
this.onEditClosed();
|
|
35
|
+
}
|
|
36
|
+
const obsReplaceImg = this.imgManagerService.replaceImg(this.currentCroppedImage, this.imgToEdit.id_file);
|
|
37
|
+
const obsChangeImgName = this.imgManagerService.changeImgName(this.imgToEdit.display_name, this.imgToEdit.id_file);
|
|
38
|
+
if (this.isImgModified && this.isNameModified) {
|
|
39
|
+
this.ranameAndReplaceImg(obsChangeImgName, obsReplaceImg);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (this.isImgModified) {
|
|
43
|
+
obsReplaceImg.subscribe(data => {
|
|
44
|
+
this.isLoading = false;
|
|
45
|
+
this.onEditClosed(this.msgSuccessEdit);
|
|
46
|
+
}, error => {
|
|
47
|
+
this.isLoading = false;
|
|
48
|
+
this.currentCroppedImage = '';
|
|
49
|
+
this.onEditClosed(this.msgFailSave);
|
|
50
|
+
});
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (this.isNameModified) {
|
|
54
|
+
obsChangeImgName.subscribe(data => {
|
|
55
|
+
this.isLoading = false;
|
|
56
|
+
this.previousName = this.imgToEdit.display_name;
|
|
57
|
+
this.onEditClosed(this.msgSuccessEdit);
|
|
58
|
+
}, error => {
|
|
59
|
+
this.isLoading = false;
|
|
60
|
+
this.imgToEdit.display_name = this.previousName;
|
|
61
|
+
this.onEditClosed(this.msgFailSave);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
this.isNameModified = false;
|
|
65
|
+
}
|
|
66
|
+
onEditClosed(msgKey) {
|
|
67
|
+
this.editClosed.emit(msgKey);
|
|
68
|
+
}
|
|
69
|
+
onRestartEdit() {
|
|
70
|
+
this.isImgModified = false;
|
|
71
|
+
this.isNameModified = false;
|
|
72
|
+
this.imgToEdit.display_name = this.previousName;
|
|
73
|
+
}
|
|
74
|
+
onCancel() {
|
|
75
|
+
this.onEditClosed('');
|
|
76
|
+
}
|
|
77
|
+
onImgCropped(imgBase64) {
|
|
78
|
+
this.currentCroppedImage = imgBase64;
|
|
79
|
+
}
|
|
80
|
+
ranameAndReplaceImg(obsChangeImgName, obsReplaceImg) {
|
|
81
|
+
// Avoid to use forkjoin, because it can create conflict and loos the img
|
|
82
|
+
obsChangeImgName.subscribe(res1 => {
|
|
83
|
+
obsReplaceImg.subscribe(res2 => {
|
|
84
|
+
this.onEditClosed(this.msgSuccessEdit);
|
|
85
|
+
}, error => {
|
|
86
|
+
this.onEditClosed(this.msgFailSave);
|
|
87
|
+
});
|
|
88
|
+
}, error => {
|
|
89
|
+
this.onEditClosed(this.msgFailSave);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
ImgEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: ImgEditorComponent, deps: [{ token: i1.ImgManagerService }], target: i0.ɵɵFactoryTarget.Component });
|
|
94
|
+
ImgEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: ImgEditorComponent, selector: "img-editor", inputs: { stateDisplayed: "stateDisplayed", imgToEdit: "imgToEdit" }, outputs: { editClosed: "editClosed" }, ngImport: i0, template: "<div class=\"img-editor\" [@easeInOut]=\"'in'\">\n\n <!-- Button Action Section -->\n\n <div class=\"img-editor__infoSection__actions\">\n <div>\n <button\n class=\"button img-editor__infoSection__actions__cancel\"\n (click)=\"onCancel()\"\n [disabled]=\"isLoading || (!isImgModified && !isNameModified)\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <div\n class=\"button danger button img-editor__infoSection__actions__save\"\n [ngClass]=\"{'img-editor__infoSection__actions__save--disable': isLoading}\"\n (click)=\"onSave()\"\n >\n {{ 'ImgManager.ImgEditor.saveBtn' | translate }}\n <span btnLoadingAnim *ngIf=\"isLoading\" class=\"btnLoadingAnnimation\"></span>\n </div>\n\n </div>\n </div>\n\n <perfect-scrollbar\n [config]=\"{suppressScrollX: true}\"\n class=\"img-editor__scroll\"\n [ngClass]=\"{\n 'img-editor__scroll--full': stateDisplayed === 'full',\n 'img-editor__scroll--smallDisplay': stateDisplayed === 'small',\n 'img-editor__scroll--window': stateDisplayed === 'window'\n }\"\n >\n <div class=\"columns\">\n <!-- Left section -->\n <div class=\"column is-one-third img-editor__infoSection\">\n\n <info-section\n [imgToEdit]=\"imgToEdit\"\n [(isNameModified)]=\"isNameModified\"\n >\n </info-section>\n </div>\n\n\n <!-- Right section -->\n <div class=\"column img-editor__container\">\n <cropper\n [imgToEdit]=\"imgToEdit\"\n [(isImgModified)]=\"isImgModified\"\n (currentCroppedImageChange)=\"onImgCropped($event)\"\n (editClosed)=\"onEditClosed($event)\">\n </cropper>\n </div>\n </div>\n </perfect-scrollbar>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.PerfectScrollbarComponent, selector: "perfect-scrollbar", inputs: ["disabled", "usePSClass", "autoPropagation", "scrollIndicators", "config"], outputs: ["psScrollY", "psScrollX", "psScrollUp", "psScrollDown", "psScrollLeft", "psScrollRight", "psYReachEnd", "psYReachStart", "psXReachEnd", "psXReachStart"], exportAs: ["ngxPerfectScrollbar"] }, { kind: "component", type: i4.EditorInfoSectionComponent, selector: "info-section", inputs: ["imgToEdit", "isNameModified"], outputs: ["isNameModifiedChange"] }, { kind: "component", type: i5.CropperComponent, selector: "cropper", inputs: ["imgToEdit", "isImgModified"], outputs: ["isImgModifiedChange", "editClosed", "currentCroppedImageChange"] }, { kind: "directive", type: i6.LoadingDirective, selector: "[btnLoadingAnim]" }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], animations: [
|
|
95
|
+
easeInOut
|
|
96
|
+
] });
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: ImgEditorComponent, decorators: [{
|
|
98
|
+
type: Component,
|
|
99
|
+
args: [{ selector: 'img-editor', animations: [
|
|
100
|
+
easeInOut
|
|
101
|
+
], template: "<div class=\"img-editor\" [@easeInOut]=\"'in'\">\n\n <!-- Button Action Section -->\n\n <div class=\"img-editor__infoSection__actions\">\n <div>\n <button\n class=\"button img-editor__infoSection__actions__cancel\"\n (click)=\"onCancel()\"\n [disabled]=\"isLoading || (!isImgModified && !isNameModified)\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <div\n class=\"button danger button img-editor__infoSection__actions__save\"\n [ngClass]=\"{'img-editor__infoSection__actions__save--disable': isLoading}\"\n (click)=\"onSave()\"\n >\n {{ 'ImgManager.ImgEditor.saveBtn' | translate }}\n <span btnLoadingAnim *ngIf=\"isLoading\" class=\"btnLoadingAnnimation\"></span>\n </div>\n\n </div>\n </div>\n\n <perfect-scrollbar\n [config]=\"{suppressScrollX: true}\"\n class=\"img-editor__scroll\"\n [ngClass]=\"{\n 'img-editor__scroll--full': stateDisplayed === 'full',\n 'img-editor__scroll--smallDisplay': stateDisplayed === 'small',\n 'img-editor__scroll--window': stateDisplayed === 'window'\n }\"\n >\n <div class=\"columns\">\n <!-- Left section -->\n <div class=\"column is-one-third img-editor__infoSection\">\n\n <info-section\n [imgToEdit]=\"imgToEdit\"\n [(isNameModified)]=\"isNameModified\"\n >\n </info-section>\n </div>\n\n\n <!-- Right section -->\n <div class=\"column img-editor__container\">\n <cropper\n [imgToEdit]=\"imgToEdit\"\n [(isImgModified)]=\"isImgModified\"\n (currentCroppedImageChange)=\"onImgCropped($event)\"\n (editClosed)=\"onEditClosed($event)\">\n </cropper>\n </div>\n </div>\n </perfect-scrollbar>\n</div>\n" }]
|
|
102
|
+
}], ctorParameters: function () { return [{ type: i1.ImgManagerService }]; }, propDecorators: { stateDisplayed: [{
|
|
103
|
+
type: Input
|
|
104
|
+
}], imgToEdit: [{
|
|
105
|
+
type: Input
|
|
106
|
+
}], editClosed: [{
|
|
107
|
+
type: Output
|
|
108
|
+
}] } });
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1nLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ei1pbWctbWFuYWdlci9zcmMvbGliL2NvbXBvbmVudHMvaW1nLWVkaXRvci9pbWctZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3d6LWltZy1tYW5hZ2VyL3NyYy9saWIvY29tcG9uZW50cy9pbWctZWRpdG9yL2ltZy1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFHOUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7Ozs7QUFTN0UsTUFBTSxPQUFPLGtCQUFrQjtJQW1CN0IsWUFDVSxpQkFBb0M7UUFBcEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQWJwQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUxQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLHdCQUFtQixHQUFXLEVBQUUsQ0FBQyxDQUFDLCtDQUErQztRQUdqRixnQkFBVyxHQUFXLGtDQUFrQyxDQUFDO1FBQ3pELGdCQUFXLEdBQVcsa0NBQWtDLENBQUM7UUFDekQsbUJBQWMsR0FBVyx5REFBeUQsQ0FBQTtJQUk1RSxDQUFDO0lBRVAsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7SUFDbEQsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLElBQUksQ0FB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QVMsQ0FDeEIsSUFBSSxDQUFDLEVBQUU7WUFDTCxhQUFhLENBQUMsU0FBUyxDQUNyQixJQUFJLENBQUMsRUFBRTtnQkFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN6QyxDQUFDLEVBQ0QsS0FBSyxDQUFDLEVBQUU7Z0JBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDLEVBQ0QsS0FBSyxDQUFDLEVBQUU7WUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7OytHQTdHVSxrQkFBa0I7bUdBQWxCLGtCQUFrQiwrSkNiL0IscTZEQTBEQSxpa0NEakRjO1FBQ1YsU0FBUztLQUNWOzJGQUVVLGtCQUFrQjtrQkFQOUIsU0FBUzsrQkFDRSxZQUFZLGNBRVY7d0JBQ1YsU0FBUztxQkFDVjt3R0FLRCxjQUFjO3NCQURiLEtBQUs7Z0JBR04sU0FBUztzQkFEUixLQUFLO2dCQUdJLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbWdQaWN0dXJlRFRPIH0gZnJvbSAnLi4vLi4vZHRvL2ltZy1tYW5hZ2VyLmR0byc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW1nTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbWctbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IGVhc2VJbk91dCB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvZWFzZUluT3V0L2Vhc2UtaW4tb3V0LmFuaW1hdGlvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltZy1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1nLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIGFuaW1hdGlvbnM6IFtcbiAgICBlYXNlSW5PdXRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBJbWdFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpXG4gIHN0YXRlRGlzcGxheWVkO1xuICBASW5wdXQoKVxuICBpbWdUb0VkaXQ6IEltZ1BpY3R1cmVEVE87XG5cbiAgQE91dHB1dCgpIGVkaXRDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGlzSW1nTW9kaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNOYW1lTW9kaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudENyb3BwZWRJbWFnZTogc3RyaW5nID0gJyc7IC8vIEltZyBtb2RpZmllZCByZXR1cm4gaW4gYmFzZTY0IGJ5IHRoZSBjcm9wcGVyXG4gIHByaXZhdGUgcHJldmlvdXNOYW1lOiBzdHJpbmc7XG5cbiAgbXNnRmFpbFNhdmU6IHN0cmluZyA9ICdJbWdNYW5hZ2VyLkltZ0VkaXRvci5tc2dGYWlsU2F2ZSc7XG4gIG1zZ0ZhaWxMb2FkOiBzdHJpbmcgPSAnSW1nTWFuYWdlci5JbWdFZGl0b3IubXNnRmFpbExvYWQnO1xuICBtc2dTdWNjZXNzRWRpdDogc3RyaW5nID0gXCJMZXMgbW9kaWZpY2F0aW9ucyBkZSBsJ2ltYWdlIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpZXMuXCJcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGltZ01hbmFnZXJTZXJ2aWNlOiBJbWdNYW5hZ2VyU2VydmljZSxcbiAgICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucHJldmlvdXNOYW1lID0gdGhpcy5pbWdUb0VkaXQuZGlzcGxheV9uYW1lO1xuICB9XG5cbiAgb25TYXZlKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICBpZiAoIXRoaXMuaXNJbWdNb2RpZmllZCAgJiYgIXRoaXMuaXNOYW1lTW9kaWZpZWQpIHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm9uRWRpdENsb3NlZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG9ic1JlcGxhY2VJbWc6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuaW1nTWFuYWdlclNlcnZpY2UucmVwbGFjZUltZyh0aGlzLmN1cnJlbnRDcm9wcGVkSW1hZ2UsIHRoaXMuaW1nVG9FZGl0LmlkX2ZpbGUpO1xuICAgIGNvbnN0IG9ic0NoYW5nZUltZ05hbWU6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuaW1nTWFuYWdlclNlcnZpY2UuY2hhbmdlSW1nTmFtZSh0aGlzLmltZ1RvRWRpdC5kaXNwbGF5X25hbWUsIHRoaXMuaW1nVG9FZGl0LmlkX2ZpbGUpO1xuXG4gICAgaWYodGhpcy5pc0ltZ01vZGlmaWVkICYmIHRoaXMuaXNOYW1lTW9kaWZpZWQpIHtcbiAgICAgIHRoaXMucmFuYW1lQW5kUmVwbGFjZUltZyhvYnNDaGFuZ2VJbWdOYW1lLCBvYnNSZXBsYWNlSW1nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZih0aGlzLmlzSW1nTW9kaWZpZWQpe1xuICAgICAgb2JzUmVwbGFjZUltZy5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25FZGl0Q2xvc2VkKHRoaXMubXNnU3VjY2Vzc0VkaXQpO1xuICAgICAgfSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q3JvcHBlZEltYWdlID0gJyc7XG4gICAgICAgIHRoaXMub25FZGl0Q2xvc2VkKHRoaXMubXNnRmFpbFNhdmUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOYW1lTW9kaWZpZWQpIHtcbiAgICAgIG9ic0NoYW5nZUltZ05hbWUuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByZXZpb3VzTmFtZSA9IHRoaXMuaW1nVG9FZGl0LmRpc3BsYXlfbmFtZTtcbiAgICAgICAgdGhpcy5vbkVkaXRDbG9zZWQodGhpcy5tc2dTdWNjZXNzRWRpdCk7XG4gICAgICB9LFxuICAgICAgZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmltZ1RvRWRpdC5kaXNwbGF5X25hbWUgPSB0aGlzLnByZXZpb3VzTmFtZTtcbiAgICAgICAgdGhpcy5vbkVkaXRDbG9zZWQodGhpcy5tc2dGYWlsU2F2ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pc05hbWVNb2RpZmllZCA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0Q2xvc2VkKG1zZ0tleT86IHN0cmluZykge1xuICAgIHRoaXMuZWRpdENsb3NlZC5lbWl0KG1zZ0tleSk7XG4gIH1cblxuICBvblJlc3RhcnRFZGl0KCkge1xuICAgIHRoaXMuaXNJbWdNb2RpZmllZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNOYW1lTW9kaWZpZWQgPSBmYWxzZTtcbiAgICB0aGlzLmltZ1RvRWRpdC5kaXNwbGF5X25hbWUgPSB0aGlzLnByZXZpb3VzTmFtZTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCkge1xuICAgIHRoaXMub25FZGl0Q2xvc2VkKCcnKTtcbiAgfVxuXG4gIG9uSW1nQ3JvcHBlZChpbWdCYXNlNjQ6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudENyb3BwZWRJbWFnZSA9IGltZ0Jhc2U2NDtcbiAgfVxuXG4gIHByaXZhdGUgcmFuYW1lQW5kUmVwbGFjZUltZyhvYnNDaGFuZ2VJbWdOYW1lOiBPYnNlcnZhYmxlPGFueT4sIG9ic1JlcGxhY2VJbWc6IE9ic2VydmFibGU8YW55Pikge1xuICAgIC8vIEF2b2lkIHRvIHVzZSBmb3Jram9pbiwgYmVjYXVzZSBpdCBjYW4gY3JlYXRlIGNvbmZsaWN0IGFuZCBsb29zIHRoZSBpbWdcbiAgICBvYnNDaGFuZ2VJbWdOYW1lLnN1YnNjcmliZShcbiAgICAgIHJlczEgPT4ge1xuICAgICAgICBvYnNSZXBsYWNlSW1nLnN1YnNjcmliZShcbiAgICAgICAgICByZXMyID0+IHtcbiAgICAgICAgICAgIHRoaXMub25FZGl0Q2xvc2VkKHRoaXMubXNnU3VjY2Vzc0VkaXQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkVkaXRDbG9zZWQodGhpcy5tc2dGYWlsU2F2ZSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5vbkVkaXRDbG9zZWQodGhpcy5tc2dGYWlsU2F2ZSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImltZy1lZGl0b3JcIiBbQGVhc2VJbk91dF09XCInaW4nXCI+XG5cbiAgICA8IS0tIEJ1dHRvbiBBY3Rpb24gU2VjdGlvbiAtLT5cblxuICAgIDxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fYWN0aW9uc1wiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19hY3Rpb25zX19jYW5jZWxcIlxuICAgICAgICAgIChjbGljayk9XCJvbkNhbmNlbCgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nIHx8ICghaXNJbWdNb2RpZmllZCAgJiYgIWlzTmFtZU1vZGlmaWVkKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyAnSW1nTWFuYWdlci5JbWdMaWIuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGRhbmdlciBidXR0b24gaW1nLWVkaXRvcl9faW5mb1NlY3Rpb25fX2FjdGlvbnNfX3NhdmVcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW1nLWVkaXRvcl9faW5mb1NlY3Rpb25fX2FjdGlvbnNfX3NhdmUtLWRpc2FibGUnOiBpc0xvYWRpbmd9XCJcbiAgICAgICAgICAoY2xpY2spPVwib25TYXZlKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLnNhdmVCdG4nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHNwYW4gYnRuTG9hZGluZ0FuaW0gKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImJ0bkxvYWRpbmdBbm5pbWF0aW9uXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8cGVyZmVjdC1zY3JvbGxiYXJcbiAgICAgICAgW2NvbmZpZ109XCJ7c3VwcHJlc3NTY3JvbGxYOiB0cnVlfVwiXG4gICAgICAgIGNsYXNzPVwiaW1nLWVkaXRvcl9fc2Nyb2xsXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2ltZy1lZGl0b3JfX3Njcm9sbC0tZnVsbCc6IHN0YXRlRGlzcGxheWVkID09PSAnZnVsbCcsXG4gICAgICAgICAgICAnaW1nLWVkaXRvcl9fc2Nyb2xsLS1zbWFsbERpc3BsYXknOiBzdGF0ZURpc3BsYXllZCA9PT0gJ3NtYWxsJyxcbiAgICAgICAgICAgICdpbWctZWRpdG9yX19zY3JvbGwtLXdpbmRvdyc6IHN0YXRlRGlzcGxheWVkID09PSAnd2luZG93J1xuICAgICAgICB9XCJcbiAgICA+XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbnNcIj5cbiAgICAgICAgPCEtLSBMZWZ0IHNlY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtb25lLXRoaXJkIGltZy1lZGl0b3JfX2luZm9TZWN0aW9uXCI+XG5cbiAgICAgICAgICAgIDxpbmZvLXNlY3Rpb25cbiAgICAgICAgICAgICAgW2ltZ1RvRWRpdF09XCJpbWdUb0VkaXRcIlxuICAgICAgICAgICAgICBbKGlzTmFtZU1vZGlmaWVkKV09XCJpc05hbWVNb2RpZmllZFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvaW5mby1zZWN0aW9uPlxuICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgIDwhLS0gUmlnaHQgc2VjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpbWctZWRpdG9yX19jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxjcm9wcGVyXG4gICAgICAgICAgICAgIFtpbWdUb0VkaXRdPVwiaW1nVG9FZGl0XCJcbiAgICAgICAgICAgICAgWyhpc0ltZ01vZGlmaWVkKV09XCJpc0ltZ01vZGlmaWVkXCJcbiAgICAgICAgICAgICAgKGN1cnJlbnRDcm9wcGVkSW1hZ2VDaGFuZ2UpPVwib25JbWdDcm9wcGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAoZWRpdENsb3NlZCk9XCJvbkVkaXRDbG9zZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcm9wcGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPlxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { Output } from '@angular/core';
|
|
3
|
+
import { Component, Input } from '@angular/core';
|
|
4
|
+
import { AlertService } from '../../../services/alert.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../../services/alert.service";
|
|
7
|
+
import * as i2 from "@angular/forms";
|
|
8
|
+
import * as i3 from "@wizishop/ng-wizi-bulma";
|
|
9
|
+
import * as i4 from "../../../directives/copy-to-clipboard.directive";
|
|
10
|
+
import * as i5 from "../../../directives/abstract-debounce/debounce-keyup.directive";
|
|
11
|
+
import * as i6 from "@ngx-translate/core";
|
|
12
|
+
import * as i7 from "../../../pipes/images/img-src.pipe";
|
|
13
|
+
export class EditorInfoSectionComponent {
|
|
14
|
+
constructor(alertService) {
|
|
15
|
+
this.alertService = alertService;
|
|
16
|
+
this._isNameModified = false;
|
|
17
|
+
this.isNameModifiedChange = new EventEmitter();
|
|
18
|
+
this.msgCopyToClipBoard = 'ImgManager.ImgEditor.copytoClipBoard';
|
|
19
|
+
}
|
|
20
|
+
set isNameModified(isNameModified) {
|
|
21
|
+
this._isNameModified = isNameModified;
|
|
22
|
+
}
|
|
23
|
+
get isNameModified() {
|
|
24
|
+
return this._isNameModified;
|
|
25
|
+
}
|
|
26
|
+
ngOnInit() {
|
|
27
|
+
this.init();
|
|
28
|
+
}
|
|
29
|
+
init() {
|
|
30
|
+
this.imgName = this.imgToEdit.display_name;
|
|
31
|
+
}
|
|
32
|
+
getFileSize() {
|
|
33
|
+
return this.imgToEdit ? Math.round(parseInt(this.imgToEdit.size) / 1000) : '-';
|
|
34
|
+
}
|
|
35
|
+
copyToClipBoard(event) {
|
|
36
|
+
this.alertService.openAlert(this.msgCopyToClipBoard);
|
|
37
|
+
}
|
|
38
|
+
onNameChange() {
|
|
39
|
+
this.isNameModifiedChange.emit(true);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
EditorInfoSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: EditorInfoSectionComponent, deps: [{ token: i1.AlertService }], target: i0.ɵɵFactoryTarget.Component });
|
|
43
|
+
EditorInfoSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: EditorInfoSectionComponent, selector: "info-section", inputs: { imgToEdit: "imgToEdit", isNameModified: "isNameModified" }, outputs: { isNameModifiedChange: "isNameModifiedChange" }, ngImport: i0, template: "\n<!-- Img properties -->\n<div class=\"img-editor__infoSection__propertyEditable\">\n <p class=\"mainColor\">\n {{ 'ImgManager.UploadList.properties.imgName' | translate }}\n <span class=\"img-editor__infoSection__propertyEditable__tooltips\" [nwbToolTip]=\"'ImgManager.ImgEditor.NameInfo' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></span>\n </p>\n <input\n type=\"text\"\n class=\"img-editor__infoSection__propertyEditable__input\"\n placeholder=\"{{'ImgManager.ImgEditor.nameEx' | translate}} \"\n [(ngModel)]=\"imgToEdit.display_name\"\n debounceKeyUp\n [debounceTime]=\"500\"\n (onEventChange)=\"onNameChange()\">\n</div>\n<div class=\"img-editor__infoSection__propertyEditable\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgURL' | translate }}</p>\n <button [copy-clipboard]=\"imgToEdit.file_name | imgSrc : 'raw'\" (copied)=\"copyToClipBoard($event)\" ><span class=\"img-editor__infoSection__propertyEditable__span\">{{imgToEdit.file_name}}</span> <i class=\"far fa-copy\"></i></button>\n</div>\n<div class=\"img-editor__infoSection__property\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgSize' | translate }} :</p>\n <p>{{imgToEdit.raw_height}}*{{imgToEdit.raw_width}}px</p>\n</div>\n<div class=\"img-editor__infoSection__property\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgWeight' | translate }} :</p>\n <p >{{getFileSize()}} ko</p>\n</div>\n\n<!-- SEO info -->\n\n<span class=\"img-editor__infoSection__divider\"></span>\n\n<div class=\"img-editor__infoSection__titleSEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.title' | translate }}</p>\n</div>\n\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.rezise' | translate }}</p>\n <p><i class=\"fal fa-check\"></i> 100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.reziseTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.webp' | translate }}</p>\n <p><i class=\"fal fa-check\"></i> 100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.webpTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.cdn' | translate }}</p>\n <p><i class=\"fal fa-check\"></i> 100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.cdnTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.lazyloading' | translate }}</p>\n <p><i class=\"fal fa-check\"></i> 100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.lazyloadingTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n", dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NwbToolTipDirective, selector: "[nwbToolTip]", inputs: ["nwbToolTip", "nwbToolTipPosition", "nwbToolTipIsMultiline"] }, { kind: "directive", type: i4.CopyClipboardDirective, selector: "[copy-clipboard]", inputs: ["copy-clipboard"], outputs: ["copied"] }, { kind: "directive", type: i5.DebounceKeyupDirective, selector: "input[debounceKeyUp]" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: i7.ImageSrcPipe, name: "imgSrc" }] });
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: EditorInfoSectionComponent, decorators: [{
|
|
45
|
+
type: Component,
|
|
46
|
+
args: [{ selector: 'info-section', template: "\n<!-- Img properties -->\n<div class=\"img-editor__infoSection__propertyEditable\">\n <p class=\"mainColor\">\n {{ 'ImgManager.UploadList.properties.imgName' | translate }}\n <span class=\"img-editor__infoSection__propertyEditable__tooltips\" [nwbToolTip]=\"'ImgManager.ImgEditor.NameInfo' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></span>\n </p>\n <input\n type=\"text\"\n class=\"img-editor__infoSection__propertyEditable__input\"\n placeholder=\"{{'ImgManager.ImgEditor.nameEx' | translate}} \"\n [(ngModel)]=\"imgToEdit.display_name\"\n debounceKeyUp\n [debounceTime]=\"500\"\n (onEventChange)=\"onNameChange()\">\n</div>\n<div class=\"img-editor__infoSection__propertyEditable\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgURL' | translate }}</p>\n <button [copy-clipboard]=\"imgToEdit.file_name | imgSrc : 'raw'\" (copied)=\"copyToClipBoard($event)\" ><span class=\"img-editor__infoSection__propertyEditable__span\">{{imgToEdit.file_name}}</span> <i class=\"far fa-copy\"></i></button>\n</div>\n<div class=\"img-editor__infoSection__property\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgSize' | translate }} :</p>\n <p>{{imgToEdit.raw_height}}*{{imgToEdit.raw_width}}px</p>\n</div>\n<div class=\"img-editor__infoSection__property\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgWeight' | translate }} :</p>\n <p >{{getFileSize()}} ko</p>\n</div>\n\n<!-- SEO info -->\n\n<span class=\"img-editor__infoSection__divider\"></span>\n\n<div class=\"img-editor__infoSection__titleSEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.title' | translate }}</p>\n</div>\n\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.rezise' | translate }}</p>\n <p><i class=\"fal fa-check\"></i> 100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.reziseTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.webp' | translate }}</p>\n <p><i class=\"fal fa-check\"></i> 100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.webpTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.cdn' | translate }}</p>\n <p><i class=\"fal fa-check\"></i> 100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.cdnTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.lazyloading' | translate }}</p>\n <p><i class=\"fal fa-check\"></i> 100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.lazyloadingTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n" }]
|
|
47
|
+
}], ctorParameters: function () { return [{ type: i1.AlertService }]; }, propDecorators: { imgToEdit: [{
|
|
48
|
+
type: Input
|
|
49
|
+
}], isNameModified: [{
|
|
50
|
+
type: Input
|
|
51
|
+
}], isNameModifiedChange: [{
|
|
52
|
+
type: Output
|
|
53
|
+
}] } });
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3d6LWltZy1tYW5hZ2VyL3NyYy9saWIvY29tcG9uZW50cy9pbWctZWRpdG9yL2luZm8tc2VjdGlvbi9pbmZvLXNlY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd3otaW1nLW1hbmFnZXIvc3JjL2xpYi9jb21wb25lbnRzL2ltZy1lZGl0b3IvaW5mby1zZWN0aW9uL2luZm8tc2VjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7QUFNL0QsTUFBTSxPQUFPLDBCQUEwQjtJQXNCckMsWUFDVSxZQUEwQjtRQUExQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQVg1QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUd6Qyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBS25ELHVCQUFrQixHQUFXLHNDQUFzQyxDQUFDO0lBSTlELENBQUM7SUFuQlAsSUFDSSxjQUFjLENBQUMsY0FBdUI7UUFDeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7SUFDeEMsQ0FBQztJQUNELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQWVELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7SUFDN0MsQ0FBQztJQUNELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUMvRSxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQUs7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7O3VIQTNDVSwwQkFBMEI7MkdBQTFCLDBCQUEwQixxTENWdkMsNC9HQTBEQTsyRkRoRGEsMEJBQTBCO2tCQUp0QyxTQUFTOytCQUNFLGNBQWM7bUdBTXhCLFNBQVM7c0JBRFIsS0FBSztnQkFJRixjQUFjO3NCQURqQixLQUFLO2dCQVVOLG9CQUFvQjtzQkFEbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEltZ1BpY3R1cmVEVE8gfSBmcm9tICcuLi8uLi8uLi9kdG8vaW1nLW1hbmFnZXIuZHRvJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FsZXJ0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpbmZvLXNlY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5mby1zZWN0aW9uLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBFZGl0b3JJbmZvU2VjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KClcbiAgaW1nVG9FZGl0OiBJbWdQaWN0dXJlRFRPO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBpc05hbWVNb2RpZmllZChpc05hbWVNb2RpZmllZDogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzTmFtZU1vZGlmaWVkID0gaXNOYW1lTW9kaWZpZWQ7XG4gIH1cbiAgZ2V0IGlzTmFtZU1vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc05hbWVNb2RpZmllZDtcbiAgfVxuICBwcml2YXRlIF9pc05hbWVNb2RpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBpc05hbWVNb2RpZmllZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBpbWdOYW1lOiBzdHJpbmc7XG4gIGltZ1JvdXRlOiBzdHJpbmc7XG5cbiAgbXNnQ29weVRvQ2xpcEJvYXJkOiBzdHJpbmcgPSAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY29weXRvQ2xpcEJvYXJkJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuaW1nTmFtZSA9IHRoaXMuaW1nVG9FZGl0LmRpc3BsYXlfbmFtZTtcbiAgfVxuICBnZXRGaWxlU2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbWdUb0VkaXQgPyBNYXRoLnJvdW5kKHBhcnNlSW50KHRoaXMuaW1nVG9FZGl0LnNpemUpLzEwMDApIDogJy0nO1xuICB9XG5cbiAgY29weVRvQ2xpcEJvYXJkKGV2ZW50KSB7XG4gICAgdGhpcy5hbGVydFNlcnZpY2Uub3BlbkFsZXJ0KHRoaXMubXNnQ29weVRvQ2xpcEJvYXJkKTtcbiAgfVxuXG4gIG9uTmFtZUNoYW5nZSgpIHtcbiAgICB0aGlzLmlzTmFtZU1vZGlmaWVkQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gIH1cbn1cbiIsIlxuPCEtLSBJbWcgcHJvcGVydGllcyAtLT5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlFZGl0YWJsZVwiPlxuICAgIDxwIGNsYXNzPVwibWFpbkNvbG9yXCI+XG4gICAgICAgIHt7ICdJbWdNYW5hZ2VyLlVwbG9hZExpc3QucHJvcGVydGllcy5pbWdOYW1lJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8c3BhbiBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19wcm9wZXJ0eUVkaXRhYmxlX190b29sdGlwc1wiIFtud2JUb29sVGlwXT1cIidJbWdNYW5hZ2VyLkltZ0VkaXRvci5OYW1lSW5mbycgfCB0cmFuc2xhdGVcIiBbbndiVG9vbFRpcElzTXVsdGlsaW5lXT1cInRydWVcIiBud2JUb29sVGlwUG9zaXRpb249XCJyaWdodFwiPjxpIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlXCI+PC9pPjwvc3Bhbj5cbiAgICA8L3A+XG4gICAgPGlucHV0XG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19wcm9wZXJ0eUVkaXRhYmxlX19pbnB1dFwiXG4gICAgICBwbGFjZWhvbGRlcj1cInt7J0ltZ01hbmFnZXIuSW1nRWRpdG9yLm5hbWVFeCcgfCB0cmFuc2xhdGV9fSBcIlxuICAgICAgWyhuZ01vZGVsKV09XCJpbWdUb0VkaXQuZGlzcGxheV9uYW1lXCJcbiAgICAgIGRlYm91bmNlS2V5VXBcbiAgICAgIFtkZWJvdW5jZVRpbWVdPVwiNTAwXCJcbiAgICAgIChvbkV2ZW50Q2hhbmdlKT1cIm9uTmFtZUNoYW5nZSgpXCI+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlFZGl0YWJsZVwiPlxuICAgIDxwIGNsYXNzPVwibWFpbkNvbG9yXCI+e3sgJ0ltZ01hbmFnZXIuVXBsb2FkTGlzdC5wcm9wZXJ0aWVzLmltZ1VSTCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgPGJ1dHRvbiBbY29weS1jbGlwYm9hcmRdPVwiaW1nVG9FZGl0LmZpbGVfbmFtZSB8IGltZ1NyYyA6ICdyYXcnXCIgKGNvcGllZCk9XCJjb3B5VG9DbGlwQm9hcmQoJGV2ZW50KVwiID48c3BhbiAgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlFZGl0YWJsZV9fc3BhblwiPnt7aW1nVG9FZGl0LmZpbGVfbmFtZX19PC9zcGFuPiZuYnNwOyZuYnNwOzxpIGNsYXNzPVwiZmFyIGZhLWNvcHlcIj48L2k+PC9idXR0b24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlcIj5cbiAgICA8cCBjbGFzcz1cIm1haW5Db2xvclwiPnt7ICdJbWdNYW5hZ2VyLlVwbG9hZExpc3QucHJvcGVydGllcy5pbWdTaXplJyB8IHRyYW5zbGF0ZSB9fSZuYnNwOzo8L3A+XG4gICAgPHA+e3tpbWdUb0VkaXQucmF3X2hlaWdodH19Knt7aW1nVG9FZGl0LnJhd193aWR0aH19cHg8L3A+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlcIj5cbiAgICA8cCBjbGFzcz1cIm1haW5Db2xvclwiPnt7ICdJbWdNYW5hZ2VyLlVwbG9hZExpc3QucHJvcGVydGllcy5pbWdXZWlnaHQnIHwgdHJhbnNsYXRlIH19Jm5ic3A7OjwvcD5cbiAgICA8cCA+e3tnZXRGaWxlU2l6ZSgpfX0mbmJzcDtrbzwvcD5cbjwvZGl2PlxuXG48IS0tIFNFTyBpbmZvIC0tPlxuXG48c3BhbiBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19kaXZpZGVyXCI+PC9zcGFuPlxuXG48ZGl2IGNsYXNzPVwiaW1nLWVkaXRvcl9faW5mb1NlY3Rpb25fX3RpdGxlU0VPXCI+XG4gICAgPHAgY2xhc3M9XCJtYWluQ29sb3JcIj57eyAnSW1nTWFuYWdlci5VcGxvYWRMaXN0LnNlby50aXRsZScgfCB0cmFuc2xhdGUgfX08L3A+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19wcm9wZXJ0eVNFT1wiPlxuICAgIDxwIGNsYXNzPVwibWFpbkNvbG9yXCI+e3sgJ0ltZ01hbmFnZXIuVXBsb2FkTGlzdC5zZW8ucmV6aXNlJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICA8cD48aSBjbGFzcz1cImZhbCBmYS1jaGVja1wiPjwvaT4mbmJzcDsxMDAlPC9wPlxuICAgIDxwIGNsYXNzPVwiaW1nLWVkaXRvcl9faW5mb1NlY3Rpb25fX3Byb3BlcnR5U0VPX190b29sdGlwc1wiIFtud2JUb29sVGlwXT1cIidJbWdNYW5hZ2VyLlVwbG9hZExpc3Quc2VvLnJlemlzZVRvb2x0aXBzJyB8IHRyYW5zbGF0ZVwiIFtud2JUb29sVGlwSXNNdWx0aWxpbmVdPVwidHJ1ZVwiIG53YlRvb2xUaXBQb3NpdGlvbj1cInJpZ2h0XCI+PGkgY2xhc3M9XCJmYXMgZmEtaW5mby1jaXJjbGVcIj48L2k+PC9wPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiaW1nLWVkaXRvcl9faW5mb1NlY3Rpb25fX3Byb3BlcnR5U0VPXCI+XG4gICAgPHAgY2xhc3M9XCJtYWluQ29sb3JcIj57eyAnSW1nTWFuYWdlci5VcGxvYWRMaXN0LnNlby53ZWJwJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICA8cD48aSBjbGFzcz1cImZhbCBmYS1jaGVja1wiPjwvaT4mbmJzcDsxMDAlPC9wPlxuICA8cCBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19wcm9wZXJ0eVNFT19fdG9vbHRpcHNcIiBbbndiVG9vbFRpcF09XCInSW1nTWFuYWdlci5VcGxvYWRMaXN0LnNlby53ZWJwVG9vbHRpcHMnIHwgdHJhbnNsYXRlXCIgW253YlRvb2xUaXBJc011bHRpbGluZV09XCJ0cnVlXCIgbndiVG9vbFRpcFBvc2l0aW9uPVwicmlnaHRcIj48aSBjbGFzcz1cImZhcyBmYS1pbmZvLWNpcmNsZVwiPjwvaT48L3A+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlTRU9cIj5cbiAgICA8cCBjbGFzcz1cIm1haW5Db2xvclwiPnt7ICdJbWdNYW5hZ2VyLlVwbG9hZExpc3Quc2VvLmNkbicgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgPHA+PGkgY2xhc3M9XCJmYWwgZmEtY2hlY2tcIj48L2k+Jm5ic3A7MTAwJTwvcD5cbiAgPHAgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlTRU9fX3Rvb2x0aXBzXCIgW253YlRvb2xUaXBdPVwiJ0ltZ01hbmFnZXIuVXBsb2FkTGlzdC5zZW8uY2RuVG9vbHRpcHMnIHwgdHJhbnNsYXRlXCIgW253YlRvb2xUaXBJc011bHRpbGluZV09XCJ0cnVlXCIgbndiVG9vbFRpcFBvc2l0aW9uPVwicmlnaHRcIj48aSBjbGFzcz1cImZhcyBmYS1pbmZvLWNpcmNsZVwiPjwvaT48L3A+XG5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19wcm9wZXJ0eVNFT1wiPlxuICAgIDxwIGNsYXNzPVwibWFpbkNvbG9yXCI+e3sgJ0ltZ01hbmFnZXIuVXBsb2FkTGlzdC5zZW8ubGF6eWxvYWRpbmcnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgIDxwPjxpIGNsYXNzPVwiZmFsIGZhLWNoZWNrXCI+PC9pPiZuYnNwOzEwMCU8L3A+XG4gICAgPHAgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlTRU9fX3Rvb2x0aXBzXCIgW253YlRvb2xUaXBdPVwiJ0ltZ01hbmFnZXIuVXBsb2FkTGlzdC5zZW8ubGF6eWxvYWRpbmdUb29sdGlwcycgfCB0cmFuc2xhdGVcIiBbbndiVG9vbFRpcElzTXVsdGlsaW5lXT1cInRydWVcIiBud2JUb29sVGlwUG9zaXRpb249XCJyaWdodFwiPjxpIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlXCI+PC9pPjwvcD5cbjwvZGl2PlxuIl19
|