@ohioepa/oepa-ui-lib 1.1.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/README.md +24 -0
- package/esm2022/lib/account-search-input/account-search-input.component.mjs +147 -0
- package/esm2022/lib/account-search-modal/account-search-modal.component.mjs +151 -0
- package/esm2022/lib/action-btn/action-btn.component.mjs +70 -0
- package/esm2022/lib/action-btn/oepa-action-event.mjs +2 -0
- package/esm2022/lib/action-btn/oepa-action.mjs +2 -0
- package/esm2022/lib/action-btn-modal/action-btn-modal.component.mjs +21 -0
- package/esm2022/lib/address/address.component.mjs +174 -0
- package/esm2022/lib/address/oepa-address.service.mjs +64 -0
- package/esm2022/lib/address/oepa-form-address.mjs +2 -0
- package/esm2022/lib/blank/blank.component.mjs +14 -0
- package/esm2022/lib/checkbox/checkbox.component.mjs +33 -0
- package/esm2022/lib/checkbox-input/checkbox-input.component.mjs +41 -0
- package/esm2022/lib/comment-modal/comment-modal.component.mjs +56 -0
- package/esm2022/lib/common-forms.module.mjs +291 -0
- package/esm2022/lib/confirmation-modal/confirmation-modal.component.mjs +120 -0
- package/esm2022/lib/contact/contact.component.mjs +102 -0
- package/esm2022/lib/contact/oepa-form-contact.mjs +2 -0
- package/esm2022/lib/date-input/date-input.component.mjs +52 -0
- package/esm2022/lib/date-input-modal/date-input-modal.component.mjs +68 -0
- package/esm2022/lib/datepicker/datepicker.component.mjs +131 -0
- package/esm2022/lib/daterangepicker/daterangepicker.component.mjs +70 -0
- package/esm2022/lib/document/document-editor/document-editor.component.mjs +225 -0
- package/esm2022/lib/document/document-event-entity-type.mjs +7 -0
- package/esm2022/lib/document/document-event-type.mjs +7 -0
- package/esm2022/lib/document/document-event.mjs +2 -0
- package/esm2022/lib/document/document-group/document-group.component.mjs +210 -0
- package/esm2022/lib/document/document-part/document-part.component.mjs +19 -0
- package/esm2022/lib/document/document-part-editor/document-part-editor.component.mjs +296 -0
- package/esm2022/lib/document/document-placeholder-modal/document-placeholder-modal.component.mjs +49 -0
- package/esm2022/lib/document/document-section/document-section.component.mjs +226 -0
- package/esm2022/lib/document/document.service.mjs +325 -0
- package/esm2022/lib/document/group-modal/group-modal.component.mjs +46 -0
- package/esm2022/lib/document/part-modal/part-modal.component.mjs +48 -0
- package/esm2022/lib/document/portal-document-class.mjs +2 -0
- package/esm2022/lib/document/portal-document-group.mjs +2 -0
- package/esm2022/lib/document/portal-document-part.mjs +2 -0
- package/esm2022/lib/document/portal-document-placeholder.mjs +2 -0
- package/esm2022/lib/document/portal-document-section.mjs +2 -0
- package/esm2022/lib/document/portal-document-text.mjs +2 -0
- package/esm2022/lib/document/portal-document-type.mjs +2 -0
- package/esm2022/lib/document/portal-document.mjs +2 -0
- package/esm2022/lib/document/portal-email-attachment-type.mjs +2 -0
- package/esm2022/lib/document/portal-email-attachment.mjs +2 -0
- package/esm2022/lib/document/portal-email-filter.mjs +2 -0
- package/esm2022/lib/document/portal-email.mjs +2 -0
- package/esm2022/lib/document/section-modal/section-modal.component.mjs +46 -0
- package/esm2022/lib/dual-list-box/array.pipes.mjs +71 -0
- package/esm2022/lib/dual-list-box/dual-list-box.component.mjs +339 -0
- package/esm2022/lib/dual-list-box/items-moved-event.mjs +2 -0
- package/esm2022/lib/dual-list-box/list-box-item.mjs +2 -0
- package/esm2022/lib/ebiz-address/ebiz-address.component.mjs +62 -0
- package/esm2022/lib/edoc-attachment/edoc-attachment.component.mjs +216 -0
- package/esm2022/lib/edoc-attachment/edoc-attachment.service.mjs +38 -0
- package/esm2022/lib/edoc-attachment/edocument-attachment-metadata.mjs +2 -0
- package/esm2022/lib/edoc-attachment/edocument-attachment.mjs +2 -0
- package/esm2022/lib/edoc-attachment/edocument-reference.mjs +2 -0
- package/esm2022/lib/entity/entity.service.mjs +104 -0
- package/esm2022/lib/entity/organization-create-modal/organization-create-modal.component.mjs +307 -0
- package/esm2022/lib/entity/organization-search-input/organization-search-input.component.mjs +127 -0
- package/esm2022/lib/entity/organization-search-modal/organization-search-modal.component.mjs +304 -0
- package/esm2022/lib/entity/person-create-modal/person-create-modal.component.mjs +316 -0
- package/esm2022/lib/entity/person-search-input/person-search-input.component.mjs +129 -0
- package/esm2022/lib/entity/person-search-modal/person-search-modal.component.mjs +311 -0
- package/esm2022/lib/entity/place-create-modal/place-create-modal.component.mjs +14 -0
- package/esm2022/lib/entity/place-search-input/place-search-input.component.mjs +126 -0
- package/esm2022/lib/entity/place-search-modal/place-search-modal.component.mjs +216 -0
- package/esm2022/lib/esri-map/esri-map.component.mjs +416 -0
- package/esm2022/lib/file-upload/file-upload.component.mjs +148 -0
- package/esm2022/lib/lynx-image-upload/lynx-image-upload.component.mjs +143 -0
- package/esm2022/lib/lynx-image-upload/lynx.service.mjs +47 -0
- package/esm2022/lib/masks/oepa-create-integer-mask.mjs +39 -0
- package/esm2022/lib/masks/oepa-integer-mask-args.mjs +2 -0
- package/esm2022/lib/message/message.component.mjs +19 -0
- package/esm2022/lib/message/oepa-message-type.mjs +7 -0
- package/esm2022/lib/message/oepa-message.mjs +31 -0
- package/esm2022/lib/message-list/message-list.component.mjs +24 -0
- package/esm2022/lib/multi-file-upload/multi-file-upload.component.mjs +137 -0
- package/esm2022/lib/notes-modal/notes-modal.component.mjs +177 -0
- package/esm2022/lib/notes-modal/oepa-note-result.mjs +2 -0
- package/esm2022/lib/notes-modal/oepa-note.mjs +2 -0
- package/esm2022/lib/numeric-input/numeric-input.component.mjs +50 -0
- package/esm2022/lib/numeric-input.directive.mjs +76 -0
- package/esm2022/lib/oepa-error-message/oepa-error-message.component.mjs +39 -0
- package/esm2022/lib/oepa-forms.service.mjs +199 -0
- package/esm2022/lib/oepa-images.mjs +59 -0
- package/esm2022/lib/oepa-wait-message/oepa-wait-message.component.mjs +29 -0
- package/esm2022/lib/ohio-lat-long/ohio-lat-long.component.mjs +176 -0
- package/esm2022/lib/parameter/parameter.mjs +2 -0
- package/esm2022/lib/parameter/parameter.service.mjs +47 -0
- package/esm2022/lib/params-help-button/params-help-button.component.mjs +42 -0
- package/esm2022/lib/phone-number/phone-number.component.mjs +44 -0
- package/esm2022/lib/pin-modal/oepa-attestation.mjs +2 -0
- package/esm2022/lib/pin-modal/oepa-pin.mjs +2 -0
- package/esm2022/lib/pin-modal/oepa-pin.service.mjs +54 -0
- package/esm2022/lib/pin-modal/oepa-security-question.mjs +2 -0
- package/esm2022/lib/pin-modal/pin-modal.component.mjs +186 -0
- package/esm2022/lib/progress-indicator/progress-info.mjs +2 -0
- package/esm2022/lib/select-input/select-input.component.mjs +96 -0
- package/esm2022/lib/server-timeout-modal/server-timeout-modal.component.mjs +63 -0
- package/esm2022/lib/shopping-cart/shopping-cart-summary/shopping-cart-summary.component.mjs +54 -0
- package/esm2022/lib/shopping-cart/shopping-cart-view/shopping-cart-view-parameters.mjs +2 -0
- package/esm2022/lib/shopping-cart/shopping-cart-view/shopping-cart-view.component.mjs +190 -0
- package/esm2022/lib/shopping-cart/shopping-cart.service.mjs +89 -0
- package/esm2022/lib/start-end-timepicker/start-end-timepicker.component.mjs +126 -0
- package/esm2022/lib/table/oepa-p-column.mjs +2 -0
- package/esm2022/lib/table/oepa-table-cell-classname.pipe.mjs +22 -0
- package/esm2022/lib/table/oepa-table-cell-click-event.mjs +2 -0
- package/esm2022/lib/table/oepa-table-cell-colspan.pipe.mjs +22 -0
- package/esm2022/lib/table/oepa-table-cell-hidden.pipe.mjs +22 -0
- package/esm2022/lib/table/oepa-table-cell-icon-classname.pipe.mjs +22 -0
- package/esm2022/lib/table/oepa-table-cell-img-src.pipe.mjs +22 -0
- package/esm2022/lib/table/oepa-table-cell-inner-html.pipe.mjs +22 -0
- package/esm2022/lib/table/oepa-table-cell-input-component.pipe.mjs +22 -0
- package/esm2022/lib/table/oepa-table-cell-not-selectable.pipe.mjs +22 -0
- package/esm2022/lib/table/oepa-table-cell-value.pipe.mjs +22 -0
- package/esm2022/lib/table/oepa-table-cell.mjs +2 -0
- package/esm2022/lib/table/oepa-table-column.mjs +2 -0
- package/esm2022/lib/table/oepa-table-config.mjs +2 -0
- package/esm2022/lib/table/oepa-table-filter.mjs +2 -0
- package/esm2022/lib/table/oepa-table-filtering.directive.mjs +57 -0
- package/esm2022/lib/table/oepa-table-header.mjs +2 -0
- package/esm2022/lib/table/oepa-table-page-info.mjs +2 -0
- package/esm2022/lib/table/oepa-table-popover.mjs +2 -0
- package/esm2022/lib/table/oepa-table-row.mjs +2 -0
- package/esm2022/lib/table/oepa-table-sort-criterion.mjs +2 -0
- package/esm2022/lib/table/oepa-table-sorting.directive.mjs +57 -0
- package/esm2022/lib/table/oepa-table.mjs +2 -0
- package/esm2022/lib/table/p-table/p-table.component.mjs +826 -0
- package/esm2022/lib/table/table-data-cell/table-data-cell-click-event.mjs +2 -0
- package/esm2022/lib/table/table-data-cell/table-data-cell.component.mjs +60 -0
- package/esm2022/lib/table/table-export.service.mjs +57 -0
- package/esm2022/lib/table/table-header-cell/table-header-cell.component.mjs +61 -0
- package/esm2022/lib/table/table.component.mjs +793 -0
- package/esm2022/lib/table/table.service.mjs +112 -0
- package/esm2022/lib/template-confirmation-modal/template-confirmation-modal.component.mjs +46 -0
- package/esm2022/lib/text-area-input/text-area-input.component.mjs +48 -0
- package/esm2022/lib/text-input/text-input.component.mjs +48 -0
- package/esm2022/lib/timeout-modal/timeout-modal.component.mjs +31 -0
- package/esm2022/lib/timepicker/timepicker.component.mjs +48 -0
- package/esm2022/lib/validation/form-validator.mjs +2 -0
- package/esm2022/lib/validation/validation.service.mjs +134 -0
- package/esm2022/lib/yes-no/yes-no.component.mjs +44 -0
- package/esm2022/lib/yes-no-boolean/yes-no.component.mjs +44 -0
- package/esm2022/lib/yes-no-other-input/yes-no-other-input.component.mjs +41 -0
- package/esm2022/lib/zip-code/zip-code.component.mjs +42 -0
- package/esm2022/ohioepa-oepa-ui-lib.mjs +5 -0
- package/esm2022/public-api.mjs +142 -0
- package/fesm2022/ohioepa-oepa-ui-lib.mjs +10720 -0
- package/fesm2022/ohioepa-oepa-ui-lib.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/account-search-input/account-search-input.component.d.ts +36 -0
- package/lib/account-search-modal/account-search-modal.component.d.ts +40 -0
- package/lib/action-btn/action-btn.component.d.ts +34 -0
- package/lib/action-btn/oepa-action-event.d.ts +19 -0
- package/lib/action-btn/oepa-action.d.ts +13 -0
- package/lib/action-btn-modal/action-btn-modal.component.d.ts +12 -0
- package/lib/address/address.component.d.ts +43 -0
- package/lib/address/oepa-address.service.d.ts +28 -0
- package/lib/address/oepa-form-address.d.ts +19 -0
- package/lib/blank/blank.component.d.ts +8 -0
- package/lib/checkbox/checkbox.component.d.ts +15 -0
- package/lib/checkbox-input/checkbox-input.component.d.ts +17 -0
- package/lib/comment-modal/comment-modal.component.d.ts +22 -0
- package/lib/common-forms.module.d.ts +104 -0
- package/lib/confirmation-modal/confirmation-modal.component.d.ts +49 -0
- package/lib/contact/contact.component.d.ts +33 -0
- package/lib/contact/oepa-form-contact.d.ts +58 -0
- package/lib/date-input/date-input.component.d.ts +18 -0
- package/lib/date-input-modal/date-input-modal.component.d.ts +25 -0
- package/lib/datepicker/datepicker.component.d.ts +28 -0
- package/lib/daterangepicker/daterangepicker.component.d.ts +22 -0
- package/lib/document/document-editor/document-editor.component.d.ts +34 -0
- package/lib/document/document-event-entity-type.d.ts +5 -0
- package/lib/document/document-event-type.d.ts +5 -0
- package/lib/document/document-event.d.ts +9 -0
- package/lib/document/document-group/document-group.component.d.ts +38 -0
- package/lib/document/document-part/document-part.component.d.ts +10 -0
- package/lib/document/document-part-editor/document-part-editor.component.d.ts +46 -0
- package/lib/document/document-placeholder-modal/document-placeholder-modal.component.d.ts +19 -0
- package/lib/document/document-section/document-section.component.d.ts +37 -0
- package/lib/document/document.service.d.ts +90 -0
- package/lib/document/group-modal/group-modal.component.d.ts +20 -0
- package/lib/document/part-modal/part-modal.component.d.ts +20 -0
- package/lib/document/portal-document-class.d.ts +10 -0
- package/lib/document/portal-document-group.d.ts +15 -0
- package/lib/document/portal-document-part.d.ts +22 -0
- package/lib/document/portal-document-placeholder.d.ts +12 -0
- package/lib/document/portal-document-section.d.ts +13 -0
- package/lib/document/portal-document-text.d.ts +7 -0
- package/lib/document/portal-document-type.d.ts +15 -0
- package/lib/document/portal-document.d.ts +27 -0
- package/lib/document/portal-email-attachment-type.d.ts +6 -0
- package/lib/document/portal-email-attachment.d.ts +12 -0
- package/lib/document/portal-email-filter.d.ts +12 -0
- package/lib/document/portal-email.d.ts +18 -0
- package/lib/document/section-modal/section-modal.component.d.ts +20 -0
- package/lib/dual-list-box/array.pipes.d.ts +36 -0
- package/lib/dual-list-box/dual-list-box.component.d.ts +91 -0
- package/lib/dual-list-box/items-moved-event.d.ts +11 -0
- package/lib/dual-list-box/list-box-item.d.ts +7 -0
- package/lib/ebiz-address/ebiz-address.component.d.ts +23 -0
- package/lib/edoc-attachment/edoc-attachment.component.d.ts +44 -0
- package/lib/edoc-attachment/edoc-attachment.service.d.ts +16 -0
- package/lib/edoc-attachment/edocument-attachment-metadata.d.ts +16 -0
- package/lib/edoc-attachment/edocument-attachment.d.ts +12 -0
- package/lib/edoc-attachment/edocument-reference.d.ts +5 -0
- package/lib/entity/entity.service.d.ts +31 -0
- package/lib/entity/organization-create-modal/organization-create-modal.component.d.ts +53 -0
- package/lib/entity/organization-search-input/organization-search-input.component.d.ts +34 -0
- package/lib/entity/organization-search-modal/organization-search-modal.component.d.ts +56 -0
- package/lib/entity/person-create-modal/person-create-modal.component.d.ts +53 -0
- package/lib/entity/person-search-input/person-search-input.component.d.ts +34 -0
- package/lib/entity/person-search-modal/person-search-modal.component.d.ts +56 -0
- package/lib/entity/place-create-modal/place-create-modal.component.d.ts +8 -0
- package/lib/entity/place-search-input/place-search-input.component.d.ts +34 -0
- package/lib/entity/place-search-modal/place-search-modal.component.d.ts +41 -0
- package/lib/esri-map/esri-map.component.d.ts +41 -0
- package/lib/file-upload/file-upload.component.d.ts +37 -0
- package/lib/lynx-image-upload/lynx-image-upload.component.d.ts +36 -0
- package/lib/lynx-image-upload/lynx.service.d.ts +16 -0
- package/lib/masks/oepa-create-integer-mask.d.ts +8 -0
- package/lib/masks/oepa-integer-mask-args.d.ts +5 -0
- package/lib/message/message.component.d.ts +10 -0
- package/lib/message/oepa-message-type.d.ts +5 -0
- package/lib/message/oepa-message.d.ts +7 -0
- package/lib/message-list/message-list.component.d.ts +11 -0
- package/lib/multi-file-upload/multi-file-upload.component.d.ts +36 -0
- package/lib/notes-modal/notes-modal.component.d.ts +50 -0
- package/lib/notes-modal/oepa-note-result.d.ts +10 -0
- package/lib/notes-modal/oepa-note.d.ts +13 -0
- package/lib/numeric-input/numeric-input.component.d.ts +20 -0
- package/lib/numeric-input.directive.d.ts +19 -0
- package/lib/oepa-error-message/oepa-error-message.component.d.ts +9 -0
- package/lib/oepa-forms.service.d.ts +28 -0
- package/lib/oepa-images.d.ts +53 -0
- package/lib/oepa-wait-message/oepa-wait-message.component.d.ts +9 -0
- package/lib/ohio-lat-long/ohio-lat-long.component.d.ts +63 -0
- package/lib/parameter/parameter.d.ts +7 -0
- package/lib/parameter/parameter.service.d.ts +18 -0
- package/lib/params-help-button/params-help-button.component.d.ts +15 -0
- package/lib/phone-number/phone-number.component.d.ts +19 -0
- package/lib/pin-modal/oepa-attestation.d.ts +10 -0
- package/lib/pin-modal/oepa-pin.d.ts +26 -0
- package/lib/pin-modal/oepa-pin.service.d.ts +38 -0
- package/lib/pin-modal/oepa-security-question.d.ts +8 -0
- package/lib/pin-modal/pin-modal.component.d.ts +46 -0
- package/lib/progress-indicator/progress-info.d.ts +4 -0
- package/lib/select-input/select-input.component.d.ts +27 -0
- package/lib/server-timeout-modal/server-timeout-modal.component.d.ts +23 -0
- package/lib/shopping-cart/shopping-cart-summary/shopping-cart-summary.component.d.ts +18 -0
- package/lib/shopping-cart/shopping-cart-view/shopping-cart-view-parameters.d.ts +10 -0
- package/lib/shopping-cart/shopping-cart-view/shopping-cart-view.component.d.ts +51 -0
- package/lib/shopping-cart/shopping-cart.service.d.ts +44 -0
- package/lib/start-end-timepicker/start-end-timepicker.component.d.ts +29 -0
- package/lib/table/oepa-p-column.d.ts +4 -0
- package/lib/table/oepa-table-cell-classname.pipe.d.ts +9 -0
- package/lib/table/oepa-table-cell-click-event.d.ts +15 -0
- package/lib/table/oepa-table-cell-colspan.pipe.d.ts +9 -0
- package/lib/table/oepa-table-cell-hidden.pipe.d.ts +9 -0
- package/lib/table/oepa-table-cell-icon-classname.pipe.d.ts +9 -0
- package/lib/table/oepa-table-cell-img-src.pipe.d.ts +9 -0
- package/lib/table/oepa-table-cell-inner-html.pipe.d.ts +9 -0
- package/lib/table/oepa-table-cell-input-component.pipe.d.ts +9 -0
- package/lib/table/oepa-table-cell-not-selectable.pipe.d.ts +9 -0
- package/lib/table/oepa-table-cell-value.pipe.d.ts +9 -0
- package/lib/table/oepa-table-cell.d.ts +66 -0
- package/lib/table/oepa-table-column.d.ts +71 -0
- package/lib/table/oepa-table-config.d.ts +72 -0
- package/lib/table/oepa-table-filter.d.ts +10 -0
- package/lib/table/oepa-table-filtering.directive.d.ts +17 -0
- package/lib/table/oepa-table-header.d.ts +9 -0
- package/lib/table/oepa-table-page-info.d.ts +22 -0
- package/lib/table/oepa-table-popover.d.ts +28 -0
- package/lib/table/oepa-table-row.d.ts +84 -0
- package/lib/table/oepa-table-sort-criterion.d.ts +4 -0
- package/lib/table/oepa-table-sorting.directive.d.ts +16 -0
- package/lib/table/oepa-table.d.ts +42 -0
- package/lib/table/p-table/p-table.component.d.ts +155 -0
- package/lib/table/table-data-cell/table-data-cell-click-event.d.ts +5 -0
- package/lib/table/table-data-cell/table-data-cell.component.d.ts +23 -0
- package/lib/table/table-export.service.d.ts +33 -0
- package/lib/table/table-header-cell/table-header-cell.component.d.ts +24 -0
- package/lib/table/table.component.d.ts +144 -0
- package/lib/table/table.service.d.ts +28 -0
- package/lib/template-confirmation-modal/template-confirmation-modal.component.d.ts +19 -0
- package/lib/text-area-input/text-area-input.component.d.ts +19 -0
- package/lib/text-input/text-input.component.d.ts +19 -0
- package/lib/timeout-modal/timeout-modal.component.d.ts +13 -0
- package/lib/timepicker/timepicker.component.d.ts +17 -0
- package/lib/validation/form-validator.d.ts +10 -0
- package/lib/validation/validation.service.d.ts +16 -0
- package/lib/yes-no/yes-no.component.d.ts +19 -0
- package/lib/yes-no-boolean/yes-no.component.d.ts +19 -0
- package/lib/yes-no-other-input/yes-no-other-input.component.d.ts +18 -0
- package/lib/zip-code/zip-code.component.d.ts +19 -0
- package/ohioepa-oepa-ui-lib-1.1.0.tgz +0 -0
- package/package.json +25 -0
- package/public-api.d.ts +138 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
|
|
2
|
+
import { ConfirmationModalComponent } from '../confirmation-modal/confirmation-modal.component';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@ohioepa/oepa-common-lib";
|
|
5
|
+
import * as i2 from "ngx-bootstrap/modal";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
import * as i4 from "@angular/forms";
|
|
8
|
+
export class MultiFileUploadComponent {
|
|
9
|
+
idService;
|
|
10
|
+
fileUtilService;
|
|
11
|
+
modalService;
|
|
12
|
+
group;
|
|
13
|
+
field = '';
|
|
14
|
+
label = '';
|
|
15
|
+
errorLabel = '';
|
|
16
|
+
blankForm;
|
|
17
|
+
blankFormUrl = '';
|
|
18
|
+
showValidation = false;
|
|
19
|
+
domain = 'application';
|
|
20
|
+
attachments = [];
|
|
21
|
+
removeAllowed = true;
|
|
22
|
+
fileUploaded = new EventEmitter();
|
|
23
|
+
fileRemoved = new EventEmitter();
|
|
24
|
+
download = new EventEmitter();
|
|
25
|
+
myFileInput;
|
|
26
|
+
componentId = 'OepaMultiFileUploadComponent';
|
|
27
|
+
uploadError = '';
|
|
28
|
+
parserReport;
|
|
29
|
+
constructor(idService, fileUtilService, modalService) {
|
|
30
|
+
this.idService = idService;
|
|
31
|
+
this.fileUtilService = fileUtilService;
|
|
32
|
+
this.modalService = modalService;
|
|
33
|
+
}
|
|
34
|
+
ngOnInit() {
|
|
35
|
+
if (this.group) {
|
|
36
|
+
this.componentId = this.idService.getComponentId(this.group);
|
|
37
|
+
this.componentId += (this.componentId.length > 0 ? '_' : '') + this.field;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.log('OOPS No group yet');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
ngOnChanges(changes) {
|
|
44
|
+
if (changes['attachments'] && changes['attachments'].currentValue) {
|
|
45
|
+
if (changes['attachments'].currentValue.length > 0) {
|
|
46
|
+
// console.log('file changed to: ' + changes['attachments'] .currentValue[0].userFilename);
|
|
47
|
+
this.group.controls[this.field].setValue(changes['attachments'].currentValue[0].userFilename);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.group.controls[this.field].setValue('');
|
|
51
|
+
// console.log('file changed and is now empty');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
fileChange(event) {
|
|
56
|
+
const fileList = event.target.files;
|
|
57
|
+
if (fileList.length > 0) {
|
|
58
|
+
const file = fileList[0];
|
|
59
|
+
this.fileUtilService.uploadFile(file).subscribe((attachment) => {
|
|
60
|
+
this.fileUploaded.emit(attachment);
|
|
61
|
+
this.myFileInput.nativeElement.value = '';
|
|
62
|
+
}, err => {
|
|
63
|
+
this.uploadError = 'Error uploading file ' + err;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
removeFile(attachment) {
|
|
68
|
+
const modal = this.modalService.show(ConfirmationModalComponent, { ignoreBackdropClick: true });
|
|
69
|
+
modal.content.headerText = 'Remove Attachment';
|
|
70
|
+
modal.content.bodyText = 'Do you want to remove the attachment: ' + attachment.userFilename + '?';
|
|
71
|
+
modal.content.confirmBtnLabel = 'Yes';
|
|
72
|
+
modal.content.cancelBtnLabel = 'No';
|
|
73
|
+
modal.content.confirmClicked.subscribe(() => {
|
|
74
|
+
this.fileRemoved.emit(attachment);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
downloadFile(attachment) {
|
|
78
|
+
if (!attachment.systemFilename || attachment.systemFilename.length === 0) {
|
|
79
|
+
this.download.emit(attachment);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
this.fileUtilService.downloadAttachment(attachment).subscribe(data => {
|
|
83
|
+
// console.log('File download success');
|
|
84
|
+
const mimeType = this.fileUtilService.mimeTypeForFile(attachment.systemFilename || '');
|
|
85
|
+
if (mimeType) {
|
|
86
|
+
this.fileUtilService.downloadFile(data, mimeType);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this.uploadError = 'Unable to download file: ' + attachment.userFilename + '. Cannot determine mime type';
|
|
90
|
+
}
|
|
91
|
+
}, err => {
|
|
92
|
+
this.uploadError = 'Error downloading file: ' + attachment.userFilename + '. ' + err;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
downloadBlankForm() {
|
|
97
|
+
if (this.blankForm) {
|
|
98
|
+
this.downloadFile(this.blankForm);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiFileUploadComponent, deps: [{ token: i1.OepaComponentIdService }, { token: i1.OepaFileUtilService }, { token: i2.BsModalService }], target: i0.ɵɵFactoryTarget.Component });
|
|
102
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiFileUploadComponent, selector: "oepa-multi-file-upload", inputs: { group: "group", field: "field", label: "label", errorLabel: "errorLabel", blankForm: "blankForm", blankFormUrl: "blankFormUrl", showValidation: "showValidation", domain: "domain", attachments: "attachments", removeAllowed: "removeAllowed" }, outputs: { fileUploaded: "fileUploaded", fileRemoved: "fileRemoved", download: "download" }, viewQueries: [{ propertyName: "myFileInput", first: true, predicate: ["myFileInput"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"group\">\n <div class=\"form-group\">\n <div>\n <label *ngIf=\"label\">{{label}}</label>\n <span *ngIf=\"blankFormUrl\"> <a href=\"{{blankFormUrl}}\" target=\"_blank\">Blank Form</a></span>\n <span *ngIf=\"blankForm\"> <a href=\"\" (click)=\"downloadBlankForm()\">Blank Form</a></span>\n <div class=\"form-group\">\n <div class=\"input-group\">\n <span class=\"input-group-btn\">\n <label class=\"btn btn-primary btn-file\">\n Browse… \n <input #myFileInput type=\"file\" style=\"display: none;\" (change)=\"fileChange($event)\" \n [id]=\"componentId+'_BrowseBtn'\" [name]=\"componentId+'_BrowseBtn'\" class=\"form-control\"\n [disabled]=\"group.controls[field].status === 'DISABLED'\">\n </label>\n </span>\n <input [ngClass]=\"{'is-invalid':showValidation && group.controls[field].status === 'INVALID'}\"\n type=\"text\" class=\"form-control\" \n [placeholder]=\"(!attachments || attachments.length === 0) ? 'No files uploaded' : (attachments.length + ' file(s) uploaded')\"\n [id]=\"componentId+'_Input'\" [name]=\"componentId+'_Input'\" readonly>\n <small class=\"invalid-feedback\" *ngIf=\"showValidation && group.controls[field].status === 'INVALID'\">{{errorLabel || label}} is required</small>\n </div>\n <!-- dummy input field for validation purposes -->\n <input type=\"text\" [hidden]=\"true\" [formControlName]=\"field\"/>\n </div>\n </div>\n <div *ngIf=\"uploadError\" class=\"alert alert-danger\" role=\"alert\">{{uploadError}}</div>\n <div *ngIf=\"parserReport\">\n <div *ngIf=\"!attachments[0] && parserReport.successful\" class=\"alert alert-info\" role=\"alert\">Spreadsheet was successfully parsed.</div>\n <div [hidden]=\"parserReport.successful\" class=\"alert alert-danger\" role=\"alert\">\n There are errors in the uploaded spreadsheet:\n <ul>\n <li *ngFor=\"let error of parserReport.errors\">{{error.message}}</li>\n </ul>\n </div>\n </div>\n </div>\n <div *ngIf=\"attachments && attachments[0]\">\n <div *ngFor=\"let attachment of attachments; let i=index;\">\n <div class=\"form-group\">\n <div class=\"input-group\">\n <a (click)=\"downloadFile(attachment)\" [id]=\"componentId+'_DownloadFileLink_'+i\" [name]=\"componentId+'_DownloadFileLink_'+i\"\n class=\"form-control\">{{attachment.userFilename}}</a>\n <span *ngIf=\"removeAllowed\" class=\"input-group-btn\">\n <button type=\"button\" class=\"btn btn-primary\" [id]=\"componentId+'_RemoveFileBtn_'+i\" [name]=\"componentId+'_RemoveFileBtn_'+i\"\n (click)=\"removeFile(attachment)\" [disabled]=\"group.controls[field].status === 'DISABLED'\">Remove Attachment</button>\n </span>\n </div>\n </div>\n </div>\n </div>\n</form>", styles: ["a:hover{cursor:pointer}a{color:#3399f3!important}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
|
|
103
|
+
}
|
|
104
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiFileUploadComponent, decorators: [{
|
|
105
|
+
type: Component,
|
|
106
|
+
args: [{ selector: 'oepa-multi-file-upload', template: "<form [formGroup]=\"group\">\n <div class=\"form-group\">\n <div>\n <label *ngIf=\"label\">{{label}}</label>\n <span *ngIf=\"blankFormUrl\"> <a href=\"{{blankFormUrl}}\" target=\"_blank\">Blank Form</a></span>\n <span *ngIf=\"blankForm\"> <a href=\"\" (click)=\"downloadBlankForm()\">Blank Form</a></span>\n <div class=\"form-group\">\n <div class=\"input-group\">\n <span class=\"input-group-btn\">\n <label class=\"btn btn-primary btn-file\">\n Browse… \n <input #myFileInput type=\"file\" style=\"display: none;\" (change)=\"fileChange($event)\" \n [id]=\"componentId+'_BrowseBtn'\" [name]=\"componentId+'_BrowseBtn'\" class=\"form-control\"\n [disabled]=\"group.controls[field].status === 'DISABLED'\">\n </label>\n </span>\n <input [ngClass]=\"{'is-invalid':showValidation && group.controls[field].status === 'INVALID'}\"\n type=\"text\" class=\"form-control\" \n [placeholder]=\"(!attachments || attachments.length === 0) ? 'No files uploaded' : (attachments.length + ' file(s) uploaded')\"\n [id]=\"componentId+'_Input'\" [name]=\"componentId+'_Input'\" readonly>\n <small class=\"invalid-feedback\" *ngIf=\"showValidation && group.controls[field].status === 'INVALID'\">{{errorLabel || label}} is required</small>\n </div>\n <!-- dummy input field for validation purposes -->\n <input type=\"text\" [hidden]=\"true\" [formControlName]=\"field\"/>\n </div>\n </div>\n <div *ngIf=\"uploadError\" class=\"alert alert-danger\" role=\"alert\">{{uploadError}}</div>\n <div *ngIf=\"parserReport\">\n <div *ngIf=\"!attachments[0] && parserReport.successful\" class=\"alert alert-info\" role=\"alert\">Spreadsheet was successfully parsed.</div>\n <div [hidden]=\"parserReport.successful\" class=\"alert alert-danger\" role=\"alert\">\n There are errors in the uploaded spreadsheet:\n <ul>\n <li *ngFor=\"let error of parserReport.errors\">{{error.message}}</li>\n </ul>\n </div>\n </div>\n </div>\n <div *ngIf=\"attachments && attachments[0]\">\n <div *ngFor=\"let attachment of attachments; let i=index;\">\n <div class=\"form-group\">\n <div class=\"input-group\">\n <a (click)=\"downloadFile(attachment)\" [id]=\"componentId+'_DownloadFileLink_'+i\" [name]=\"componentId+'_DownloadFileLink_'+i\"\n class=\"form-control\">{{attachment.userFilename}}</a>\n <span *ngIf=\"removeAllowed\" class=\"input-group-btn\">\n <button type=\"button\" class=\"btn btn-primary\" [id]=\"componentId+'_RemoveFileBtn_'+i\" [name]=\"componentId+'_RemoveFileBtn_'+i\"\n (click)=\"removeFile(attachment)\" [disabled]=\"group.controls[field].status === 'DISABLED'\">Remove Attachment</button>\n </span>\n </div>\n </div>\n </div>\n </div>\n</form>", styles: ["a:hover{cursor:pointer}a{color:#3399f3!important}\n"] }]
|
|
107
|
+
}], ctorParameters: () => [{ type: i1.OepaComponentIdService }, { type: i1.OepaFileUtilService }, { type: i2.BsModalService }], propDecorators: { group: [{
|
|
108
|
+
type: Input
|
|
109
|
+
}], field: [{
|
|
110
|
+
type: Input
|
|
111
|
+
}], label: [{
|
|
112
|
+
type: Input
|
|
113
|
+
}], errorLabel: [{
|
|
114
|
+
type: Input
|
|
115
|
+
}], blankForm: [{
|
|
116
|
+
type: Input
|
|
117
|
+
}], blankFormUrl: [{
|
|
118
|
+
type: Input
|
|
119
|
+
}], showValidation: [{
|
|
120
|
+
type: Input
|
|
121
|
+
}], domain: [{
|
|
122
|
+
type: Input
|
|
123
|
+
}], attachments: [{
|
|
124
|
+
type: Input
|
|
125
|
+
}], removeAllowed: [{
|
|
126
|
+
type: Input
|
|
127
|
+
}], fileUploaded: [{
|
|
128
|
+
type: Output
|
|
129
|
+
}], fileRemoved: [{
|
|
130
|
+
type: Output
|
|
131
|
+
}], download: [{
|
|
132
|
+
type: Output
|
|
133
|
+
}], myFileInput: [{
|
|
134
|
+
type: ViewChild,
|
|
135
|
+
args: ['myFileInput', { static: true }]
|
|
136
|
+
}] } });
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9tdWx0aS1maWxlLXVwbG9hZC9tdWx0aS1maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL211bHRpLWZpbGUtdXBsb2FkL211bHRpLWZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQW9DLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU9wSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7O0FBU2hHLE1BQU0sT0FBTyx3QkFBd0I7SUFzQmY7SUFBMkM7SUFDckQ7SUF0QkQsS0FBSyxDQUFhO0lBQ2xCLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUNuQixVQUFVLEdBQVcsRUFBRSxDQUFDO0lBQ3hCLFNBQVMsQ0FBNkI7SUFDdEMsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sR0FBRyxhQUFhLENBQUM7SUFDdkIsV0FBVyxHQUEwQixFQUFFLENBQUM7SUFDeEMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUVwQixZQUFZLEdBQWlDLElBQUksWUFBWSxFQUFFLENBQUM7SUFDaEUsV0FBVyxHQUFpQyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQy9ELFFBQVEsR0FBaUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUUzQixXQUFXLENBQU07SUFFNUQsV0FBVyxHQUFHLDhCQUE4QixDQUFDO0lBQzdDLFdBQVcsR0FBVyxFQUFFLENBQUM7SUFDekIsWUFB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QUM7UUFDcEMsQ0FBQztJQUNILENBQUM7d0dBOUZVLHdCQUF3Qjs0RkFBeEIsd0JBQXdCLHNpQkNoQnJDLHU1RkFtRE87OzRGRG5DTSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0Usd0JBQXdCOzBKQUt6QixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRW9DLFdBQVc7c0JBQXJELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5cbmltcG9ydCB7IE9lcGFBdHRhY2htZW50LCBPZXBhUGFyc2VyUmVwb3J0LCBPZXBhRmlsZVV0aWxTZXJ2aWNlLCBPZXBhQ29tcG9uZW50SWRTZXJ2aWNlIH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1jb21tb24tbGliJztcbmltcG9ydCB7IENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLW1vZGFsL2NvbmZpcm1hdGlvbi1tb2RhbC5jb21wb25lbnQnO1xuXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1tdWx0aS1maWxlLXVwbG9hZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL211bHRpLWZpbGUtdXBsb2FkLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aUZpbGVVcGxvYWRDb21wb25lbnQgIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBncm91cCE6IEZvcm1Hcm91cDtcbiAgQElucHV0KCkgZmllbGQ6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVycm9yTGFiZWw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBibGFua0Zvcm06IE9lcGFBdHRhY2htZW50IHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBibGFua0Zvcm1Vcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzaG93VmFsaWRhdGlvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkb21haW4gPSAnYXBwbGljYXRpb24nO1xuICBASW5wdXQoKSBhdHRhY2htZW50czogQXJyYXk8T2VwYUF0dGFjaG1lbnQ+ID0gW107XG4gIEBJbnB1dCgpIHJlbW92ZUFsbG93ZWQgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBmaWxlVXBsb2FkZWQ6IEV2ZW50RW1pdHRlcjxPZXBhQXR0YWNobWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBmaWxlUmVtb3ZlZDogRXZlbnRFbWl0dGVyPE9lcGFBdHRhY2htZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGRvd25sb2FkOiBFdmVudEVtaXR0ZXI8T2VwYUF0dGFjaG1lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ215RmlsZUlucHV0JywgeyBzdGF0aWM6IHRydWV9KSBteUZpbGVJbnB1dDogYW55O1xuXG4gIGNvbXBvbmVudElkID0gJ09lcGFNdWx0aUZpbGVVcGxvYWRDb21wb25lbnQnO1xuICB1cGxvYWRFcnJvcjogc3RyaW5nID0gJyc7XG4gIHBhcnNlclJlcG9ydCE6IE9lcGFQYXJzZXJSZXBvcnQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpZFNlcnZpY2U6IE9lcGFDb21wb25lbnRJZFNlcnZpY2UsIHByaXZhdGUgZmlsZVV0aWxTZXJ2aWNlOiBPZXBhRmlsZVV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcbiAgICAgIHRoaXMuY29tcG9uZW50SWQgPSB0aGlzLmlkU2VydmljZS5nZXRDb21wb25lbnRJZCh0aGlzLmdyb3VwKTtcbiAgICAgIHRoaXMuY29tcG9uZW50SWQgKz0gKHRoaXMuY29tcG9uZW50SWQubGVuZ3RoID4gMCA/ICdfJyA6ICcnKSArIHRoaXMuZmllbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdPT1BTIE5vIGdyb3VwIHlldCcpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snYXR0YWNobWVudHMnXSAmJiBjaGFuZ2VzWydhdHRhY2htZW50cyddIC5jdXJyZW50VmFsdWUpIHtcbiAgICAgIGlmIChjaGFuZ2VzWydhdHRhY2htZW50cyddIC5jdXJyZW50VmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnZmlsZSBjaGFuZ2VkIHRvOiAnICsgY2hhbmdlc1snYXR0YWNobWVudHMnXSAuY3VycmVudFZhbHVlWzBdLnVzZXJGaWxlbmFtZSk7XG4gICAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZF0uc2V0VmFsdWUoY2hhbmdlc1snYXR0YWNobWVudHMnXSAuY3VycmVudFZhbHVlWzBdLnVzZXJGaWxlbmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMuZmllbGRdLnNldFZhbHVlKCcnKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2ZpbGUgY2hhbmdlZCBhbmQgaXMgbm93IGVtcHR5Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpbGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGVMaXN0OiBGaWxlTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlcztcbiAgICBpZiAoZmlsZUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsZTogRmlsZSA9IGZpbGVMaXN0WzBdO1xuICAgICAgdGhpcy5maWxlVXRpbFNlcnZpY2UudXBsb2FkRmlsZShmaWxlKS5zdWJzY3JpYmUoKGF0dGFjaG1lbnQ6IE9lcGFBdHRhY2htZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGVkLmVtaXQoYXR0YWNobWVudCk7XG4gICAgICAgIHRoaXMubXlGaWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgdGhpcy51cGxvYWRFcnJvciA9ICdFcnJvciB1cGxvYWRpbmcgZmlsZSAnICsgZXJyO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZUZpbGUoYXR0YWNobWVudDogT2VwYUF0dGFjaG1lbnQpIHtcbiAgICBjb25zdCBtb2RhbDogQnNNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coQ29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQsIHsgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZSB9KTtcbiAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmhlYWRlclRleHQgPSAnUmVtb3ZlIEF0dGFjaG1lbnQnO1xuICAgICg8Q29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQ+bW9kYWwuY29udGVudCkuYm9keVRleHQgPSAnRG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBhdHRhY2htZW50OiAnICsgYXR0YWNobWVudC51c2VyRmlsZW5hbWUgKyAnPyc7XG4gICAgKDxDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudD5tb2RhbC5jb250ZW50KS5jb25maXJtQnRuTGFiZWwgPSAnWWVzJztcbiAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmNhbmNlbEJ0bkxhYmVsID0gJ05vJztcbiAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmNvbmZpcm1DbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmZpbGVSZW1vdmVkLmVtaXQoYXR0YWNobWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRGaWxlKGF0dGFjaG1lbnQ6IE9lcGFBdHRhY2htZW50KSB7XG4gICAgaWYgKCFhdHRhY2htZW50LnN5c3RlbUZpbGVuYW1lIHx8IGF0dGFjaG1lbnQuc3lzdGVtRmlsZW5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRvd25sb2FkLmVtaXQoYXR0YWNobWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsZVV0aWxTZXJ2aWNlLmRvd25sb2FkQXR0YWNobWVudChhdHRhY2htZW50KS5zdWJzY3JpYmUoXG4gICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdGaWxlIGRvd25sb2FkIHN1Y2Nlc3MnKTtcbiAgICAgICAgICBjb25zdCBtaW1lVHlwZTogc3RyaW5nID0gdGhpcy5maWxlVXRpbFNlcnZpY2UubWltZVR5cGVGb3JGaWxlKGF0dGFjaG1lbnQuc3lzdGVtRmlsZW5hbWUgfHwgJycpO1xuICAgICAgICAgIGlmIChtaW1lVHlwZSkge1xuICAgICAgICAgICAgdGhpcy5maWxlVXRpbFNlcnZpY2UuZG93bmxvYWRGaWxlKGRhdGEsIG1pbWVUeXBlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRFcnJvciA9ICdVbmFibGUgdG8gZG93bmxvYWQgZmlsZTogJyArIGF0dGFjaG1lbnQudXNlckZpbGVuYW1lICsgJy4gQ2Fubm90IGRldGVybWluZSBtaW1lIHR5cGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICB0aGlzLnVwbG9hZEVycm9yID0gJ0Vycm9yIGRvd25sb2FkaW5nIGZpbGU6ICcgKyBhdHRhY2htZW50LnVzZXJGaWxlbmFtZSArICcuICcgKyBlcnI7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRvd25sb2FkQmxhbmtGb3JtKCkge1xuICAgIGlmICh0aGlzLmJsYW5rRm9ybSkge1xuICAgICAgdGhpcy5kb3dubG9hZEZpbGUodGhpcy5ibGFua0Zvcm0pO1xuICAgIH1cbiAgfVxuXG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgPGRpdj5cbiAgICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsXCI+e3tsYWJlbH19PC9sYWJlbD5cbiAgICAgIDxzcGFuICpuZ0lmPVwiYmxhbmtGb3JtVXJsXCI+Jm5ic3A7PGEgaHJlZj1cInt7YmxhbmtGb3JtVXJsfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5CbGFuayBGb3JtPC9hPjwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiYmxhbmtGb3JtXCI+Jm5ic3A7PGEgaHJlZj1cIlwiIChjbGljayk9XCJkb3dubG9hZEJsYW5rRm9ybSgpXCI+QmxhbmsgRm9ybTwvYT48L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1maWxlXCI+XG4gICAgICAgICAgICBCcm93c2UmaGVsbGlwOyBcbiAgICAgICAgICAgIDxpbnB1dCAjbXlGaWxlSW5wdXQgdHlwZT1cImZpbGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlKCRldmVudClcIiBcbiAgICAgICAgICAgICAgW2lkXT1cImNvbXBvbmVudElkKydfQnJvd3NlQnRuJ1wiIFtuYW1lXT1cImNvbXBvbmVudElkKydfQnJvd3NlQnRuJ1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdyb3VwLmNvbnRyb2xzW2ZpZWxkXS5zdGF0dXMgPT09ICdESVNBQkxFRCdcIj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxpbnB1dCAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJzpzaG93VmFsaWRhdGlvbiAmJiBncm91cC5jb250cm9sc1tmaWVsZF0uc3RhdHVzID09PSAnSU5WQUxJRCd9XCJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIighYXR0YWNobWVudHMgfHwgYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSA/ICdObyBmaWxlcyB1cGxvYWRlZCcgOiAoYXR0YWNobWVudHMubGVuZ3RoICsgJyBmaWxlKHMpIHVwbG9hZGVkJylcIlxuICAgICAgICAgIFtpZF09XCJjb21wb25lbnRJZCsnX0lucHV0J1wiIFtuYW1lXT1cImNvbXBvbmVudElkKydfSW5wdXQnXCIgcmVhZG9ubHk+XG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICpuZ0lmPVwic2hvd1ZhbGlkYXRpb24gJiYgZ3JvdXAuY29udHJvbHNbZmllbGRdLnN0YXR1cyA9PT0gJ0lOVkFMSUQnXCI+e3tlcnJvckxhYmVsIHx8IGxhYmVsfX0gaXMgcmVxdWlyZWQ8L3NtYWxsPlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIGR1bW15IGlucHV0IGZpZWxkIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzIC0tPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW2hpZGRlbl09XCJ0cnVlXCIgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZFwiLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cInVwbG9hZEVycm9yXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiByb2xlPVwiYWxlcnRcIj57e3VwbG9hZEVycm9yfX08L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwicGFyc2VyUmVwb3J0XCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWF0dGFjaG1lbnRzWzBdICYmIHBhcnNlclJlcG9ydC5zdWNjZXNzZnVsXCIgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCIgcm9sZT1cImFsZXJ0XCI+U3ByZWFkc2hlZXQgd2FzIHN1Y2Nlc3NmdWxseSBwYXJzZWQuPC9kaXY+XG4gICAgICA8ZGl2IFtoaWRkZW5dPVwicGFyc2VyUmVwb3J0LnN1Y2Nlc3NmdWxcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICBUaGVyZSBhcmUgZXJyb3JzIGluIHRoZSB1cGxvYWRlZCBzcHJlYWRzaGVldDpcbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgcGFyc2VyUmVwb3J0LmVycm9yc1wiPnt7ZXJyb3IubWVzc2FnZX19PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImF0dGFjaG1lbnRzICYmIGF0dGFjaG1lbnRzWzBdXCI+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgYXR0YWNobWVudCBvZiBhdHRhY2htZW50czsgbGV0IGk9aW5kZXg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICA8YSAoY2xpY2spPVwiZG93bmxvYWRGaWxlKGF0dGFjaG1lbnQpXCIgW2lkXT1cImNvbXBvbmVudElkKydfRG93bmxvYWRGaWxlTGlua18nK2lcIiBbbmFtZV09XCJjb21wb25lbnRJZCsnX0Rvd25sb2FkRmlsZUxpbmtfJytpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+e3thdHRhY2htZW50LnVzZXJGaWxlbmFtZX19PC9hPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwicmVtb3ZlQWxsb3dlZFwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIFtpZF09XCJjb21wb25lbnRJZCsnX1JlbW92ZUZpbGVCdG5fJytpXCIgW25hbWVdPVwiY29tcG9uZW50SWQrJ19SZW1vdmVGaWxlQnRuXycraVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWxlKGF0dGFjaG1lbnQpXCIgW2Rpc2FibGVkXT1cImdyb3VwLmNvbnRyb2xzW2ZpZWxkXS5zdGF0dXMgPT09ICdESVNBQkxFRCdcIj5SZW1vdmUgQXR0YWNobWVudDwvYnV0dG9uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Zvcm0+Il19
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import { ConfirmationModalComponent } from '../confirmation-modal/confirmation-modal.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/forms";
|
|
6
|
+
import * as i2 from "ngx-bootstrap/modal";
|
|
7
|
+
import * as i3 from "@ohioepa/oepa-common-lib";
|
|
8
|
+
import * as i4 from "@angular/common";
|
|
9
|
+
import * as i5 from "../table/table.component";
|
|
10
|
+
export class NotesModalComponent {
|
|
11
|
+
fb;
|
|
12
|
+
bsModalRef;
|
|
13
|
+
modalService;
|
|
14
|
+
mappingService;
|
|
15
|
+
newNoteForm;
|
|
16
|
+
newNoteType;
|
|
17
|
+
newNoteText = '';
|
|
18
|
+
isCreating = false;
|
|
19
|
+
_defaultNoteType;
|
|
20
|
+
_notes = [];
|
|
21
|
+
loginName = '';
|
|
22
|
+
deleteAnyNoteAllowed = false;
|
|
23
|
+
deleteOwnNoteAllowed = false;
|
|
24
|
+
createNoteAllowed = false;
|
|
25
|
+
external = false;
|
|
26
|
+
errorMessage = '';
|
|
27
|
+
set notes(notes) {
|
|
28
|
+
this.isCreating = false;
|
|
29
|
+
this._notes = notes;
|
|
30
|
+
this.loadData(notes);
|
|
31
|
+
}
|
|
32
|
+
get notes() {
|
|
33
|
+
return this._notes;
|
|
34
|
+
}
|
|
35
|
+
set defaultNoteType(type) {
|
|
36
|
+
this._defaultNoteType = type;
|
|
37
|
+
this.newNoteType = type;
|
|
38
|
+
}
|
|
39
|
+
get defaultNoteType() {
|
|
40
|
+
return this._defaultNoteType;
|
|
41
|
+
}
|
|
42
|
+
onAddNote = new EventEmitter();
|
|
43
|
+
onDeleteNote = new EventEmitter();
|
|
44
|
+
// Table elements
|
|
45
|
+
data = [];
|
|
46
|
+
tblConfig = {};
|
|
47
|
+
header = {
|
|
48
|
+
columns: this.getColumns()
|
|
49
|
+
};
|
|
50
|
+
constructor(fb, bsModalRef, modalService, mappingService) {
|
|
51
|
+
this.fb = fb;
|
|
52
|
+
this.bsModalRef = bsModalRef;
|
|
53
|
+
this.modalService = modalService;
|
|
54
|
+
this.mappingService = mappingService;
|
|
55
|
+
}
|
|
56
|
+
ngOnInit() {
|
|
57
|
+
this.initializeTable();
|
|
58
|
+
this.createForm();
|
|
59
|
+
}
|
|
60
|
+
initializeTable() {
|
|
61
|
+
this.header = {
|
|
62
|
+
columns: this.getColumns()
|
|
63
|
+
};
|
|
64
|
+
this.loadData(this.notes);
|
|
65
|
+
}
|
|
66
|
+
getColumns() {
|
|
67
|
+
const columns = [
|
|
68
|
+
{ title: 'Note', id: 'note' },
|
|
69
|
+
];
|
|
70
|
+
if (!this.external) {
|
|
71
|
+
columns.push({ title: 'Type', id: 'type' });
|
|
72
|
+
columns.push({ title: 'Account', id: 'account' });
|
|
73
|
+
}
|
|
74
|
+
columns.push({ title: 'Date', id: 'date' });
|
|
75
|
+
if (this.deleteAnyNoteAllowed || this.deleteOwnNoteAllowed) {
|
|
76
|
+
columns.push({ title: 'Actions', id: 'actions', actionColumn: true, className: 'action-btn-col' });
|
|
77
|
+
}
|
|
78
|
+
return columns;
|
|
79
|
+
}
|
|
80
|
+
loadData(notes) {
|
|
81
|
+
this.data = [];
|
|
82
|
+
if (notes && notes.length) {
|
|
83
|
+
notes.forEach((note) => {
|
|
84
|
+
this.data.push(this.convertNoteToTableRow(note));
|
|
85
|
+
});
|
|
86
|
+
this.data = this.data.splice(0);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
convertNoteToTableRow(note) {
|
|
90
|
+
const row = {
|
|
91
|
+
cells: [
|
|
92
|
+
{ id: 'note', value: note.comment },
|
|
93
|
+
{ id: 'type', value: note.type ? note.type.name : '' },
|
|
94
|
+
{ id: 'account', value: note.user },
|
|
95
|
+
{ id: 'date', value: note.noteDate ? this.mappingService.mapDateToDateTimeString(new Date(note.noteDate)) : null,
|
|
96
|
+
sortValue: note.noteDate }
|
|
97
|
+
],
|
|
98
|
+
dataSource: note
|
|
99
|
+
};
|
|
100
|
+
// only display delete action if note can be deleted
|
|
101
|
+
if ((this.deleteAnyNoteAllowed || (this.deleteOwnNoteAllowed && this.loginName === note.user)) && note.type?.code !== 'System') {
|
|
102
|
+
row.actions = [
|
|
103
|
+
{ title: 'Delete', className: 'fa fa-remove' }
|
|
104
|
+
];
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
row.actions = [
|
|
108
|
+
{ title: 'NA', className: undefined }
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
return row;
|
|
112
|
+
}
|
|
113
|
+
createForm() {
|
|
114
|
+
if (this.newNoteForm === undefined) {
|
|
115
|
+
this.newNoteForm = this.fb.group({
|
|
116
|
+
newNoteText: ['', [Validators.required]]
|
|
117
|
+
});
|
|
118
|
+
this.newNoteForm.controls['newNoteText'].valueChanges.subscribe(newNoteText => this.newNoteText = newNoteText);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
this.newNoteForm.reset();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
createNote() {
|
|
125
|
+
this.isCreating = true;
|
|
126
|
+
this.errorMessage = '';
|
|
127
|
+
const note = {
|
|
128
|
+
type: this.newNoteType,
|
|
129
|
+
noteDate: new Date(),
|
|
130
|
+
comment: this.newNoteText,
|
|
131
|
+
user: this.loginName
|
|
132
|
+
};
|
|
133
|
+
this.onAddNote.emit(note);
|
|
134
|
+
}
|
|
135
|
+
noteActionClicked(event) {
|
|
136
|
+
if (event.action.title === 'Delete') {
|
|
137
|
+
const modal = this.modalService.show(ConfirmationModalComponent, { ignoreBackdropClick: true });
|
|
138
|
+
modal.content.headerText = 'Confirm delete';
|
|
139
|
+
modal.content.bodyText = 'Once a note is deleted it cannot be undone! Do you really want to do this?';
|
|
140
|
+
modal.content.confirmBtnLabel = 'Yes';
|
|
141
|
+
modal.content.cancelBtnLabel = 'No';
|
|
142
|
+
modal.content.confirmClicked.subscribe(() => {
|
|
143
|
+
this.onDeleteNote.emit(event.data);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
done() {
|
|
148
|
+
this.bsModalRef.hide();
|
|
149
|
+
}
|
|
150
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotesModalComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BsModalRef }, { token: i2.BsModalService }, { token: i3.OepaMappingService }], target: i0.ɵɵFactoryTarget.Component });
|
|
151
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NotesModalComponent, selector: "oepa-notes-modal", inputs: { loginName: "loginName", deleteAnyNoteAllowed: "deleteAnyNoteAllowed", deleteOwnNoteAllowed: "deleteOwnNoteAllowed", createNoteAllowed: "createNoteAllowed", external: "external", errorMessage: "errorMessage", notes: "notes", defaultNoteType: "defaultNoteType" }, outputs: { onAddNote: "onAddNote", onDeleteNote: "onDeleteNote" }, ngImport: i0, template: "<div class=\"modal-header\">\n\t<h3 class=\"modal-title\">Notes</h3>\n</div>\n\n<div class=\"modal-body\">\n\t\n <div *ngIf=\"errorMessage\">\n\t\t<div class=\"alert alert-danger\" role=\"alert\">{{ errorMessage }}</div>\n </div>\n\n <div *ngIf=\"data.length === 0\" class=\"alert alert-info text-center\"><em>There are no notes defined.</em></div>\n\n <oepa-table [config]=\"tblConfig\" [data]=\"data\" [header]=\"header\" (actionClicked)=\"noteActionClicked($event)\"></oepa-table>\n\n \t\n\t<form *ngIf=\"createNoteAllowed\" class=\"form-horizontal\">\n \n <hr>\n\t\n <div [formGroup]=\"newNoteForm\" class=\"form-group\">\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\">Type:</label>\n <div class=\"col-sm-10\">\n <span class=\"form-control\" id=\"NoteTypeText\">{{newNoteType.name}}</span>\n </div>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-12 control-label\"></label> \n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\">Note:</label>\n <div class=\"col-sm-10\">\n <input class=\"form-control\" type=\"input\" formControlName=\"newNoteText\" id=\"NoteInput\" maxlength=\"2000\"/>\n </div>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-12 control-label\"></label> \n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\"></label>\n <div class=\"col-sm-10\">\n <span *ngIf=\"isCreating\"><span class=\"spinner-border text-primary\" role=\"status\"></span></span>\n <button *ngIf=\"!isCreating\" class=\"btn btn-primary mr-1\" id=\"AddNoteBtn\" (click)=\"createNote()\" [disabled]=\"newNoteForm.invalid\">\n <span>Add Note</span>\n </button>\n </div>\n </div>\n\n\n </div> \n </form> <!-- form -->\n \n</div>\n\t\n<div class=\"modal-footer\">\n\t<button class=\"btn btn-primary mr-1\" id=\"DoneBtn\" (click)=\"done()\">Done</button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.TableComponent, selector: "oepa-table", inputs: ["tableId", "config", "complexHeader", "header", "customBtnLabel", "customBtnVisible", "customBtnEnabled", "data", "totalRow"], outputs: ["cellClicked", "actionClicked", "rowSelected", "customBtnClicked"] }] });
|
|
152
|
+
}
|
|
153
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotesModalComponent, decorators: [{
|
|
154
|
+
type: Component,
|
|
155
|
+
args: [{ selector: 'oepa-notes-modal', template: "<div class=\"modal-header\">\n\t<h3 class=\"modal-title\">Notes</h3>\n</div>\n\n<div class=\"modal-body\">\n\t\n <div *ngIf=\"errorMessage\">\n\t\t<div class=\"alert alert-danger\" role=\"alert\">{{ errorMessage }}</div>\n </div>\n\n <div *ngIf=\"data.length === 0\" class=\"alert alert-info text-center\"><em>There are no notes defined.</em></div>\n\n <oepa-table [config]=\"tblConfig\" [data]=\"data\" [header]=\"header\" (actionClicked)=\"noteActionClicked($event)\"></oepa-table>\n\n \t\n\t<form *ngIf=\"createNoteAllowed\" class=\"form-horizontal\">\n \n <hr>\n\t\n <div [formGroup]=\"newNoteForm\" class=\"form-group\">\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\">Type:</label>\n <div class=\"col-sm-10\">\n <span class=\"form-control\" id=\"NoteTypeText\">{{newNoteType.name}}</span>\n </div>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-12 control-label\"></label> \n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\">Note:</label>\n <div class=\"col-sm-10\">\n <input class=\"form-control\" type=\"input\" formControlName=\"newNoteText\" id=\"NoteInput\" maxlength=\"2000\"/>\n </div>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-12 control-label\"></label> \n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\"></label>\n <div class=\"col-sm-10\">\n <span *ngIf=\"isCreating\"><span class=\"spinner-border text-primary\" role=\"status\"></span></span>\n <button *ngIf=\"!isCreating\" class=\"btn btn-primary mr-1\" id=\"AddNoteBtn\" (click)=\"createNote()\" [disabled]=\"newNoteForm.invalid\">\n <span>Add Note</span>\n </button>\n </div>\n </div>\n\n\n </div> \n </form> <!-- form -->\n \n</div>\n\t\n<div class=\"modal-footer\">\n\t<button class=\"btn btn-primary mr-1\" id=\"DoneBtn\" (click)=\"done()\">Done</button>\n</div>\n" }]
|
|
156
|
+
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.BsModalRef }, { type: i2.BsModalService }, { type: i3.OepaMappingService }], propDecorators: { loginName: [{
|
|
157
|
+
type: Input
|
|
158
|
+
}], deleteAnyNoteAllowed: [{
|
|
159
|
+
type: Input
|
|
160
|
+
}], deleteOwnNoteAllowed: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}], createNoteAllowed: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], external: [{
|
|
165
|
+
type: Input
|
|
166
|
+
}], errorMessage: [{
|
|
167
|
+
type: Input
|
|
168
|
+
}], notes: [{
|
|
169
|
+
type: Input
|
|
170
|
+
}], defaultNoteType: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], onAddNote: [{
|
|
173
|
+
type: Output
|
|
174
|
+
}], onDeleteNote: [{
|
|
175
|
+
type: Output
|
|
176
|
+
}] } });
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZXMtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9ub3Rlcy1tb2RhbC9ub3Rlcy1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL25vdGVzLW1vZGFsL25vdGVzLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVdwRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7OztBQVNoRyxNQUFNLE9BQU8sbUJBQW1CO0lBb0RWO0lBQXdCO0lBQWdDO0lBQ3hEO0lBcERiLFdBQVcsQ0FBYTtJQUN4QixXQUFXLENBQWlCO0lBQzVCLFdBQVcsR0FBVyxFQUFFLENBQUM7SUFDekIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUVsQixnQkFBZ0IsQ0FBaUI7SUFDakMsTUFBTSxHQUFXLEVBQUUsQ0FBQztJQUVuQixTQUFTLEdBQVcsRUFBRSxDQUFDO0lBQ3ZCLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUM3QixvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFDN0IsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQzFCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUduQyxJQUNXLEtBQUssQ0FBQyxLQUFhO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBR0QsSUFDVyxlQUFlLENBQUMsSUFBbUI7UUFDNUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFUyxTQUFTLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7SUFDekQsWUFBWSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO0lBRXBFLGlCQUFpQjtJQUNWLElBQUksR0FBd0IsRUFBRSxDQUFDO0lBRS9CLFNBQVMsR0FBb0IsRUFDbkMsQ0FBQztJQUVLLE1BQU0sR0FBb0I7UUFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7S0FDM0IsQ0FBQztJQUVKLFlBQW9CLEVBQWUsRUFBUyxVQUFzQixFQUFVLFlBQTRCLEVBQ3BGLGNBQWtDO1FBRGxDLE9BQUUsR0FBRixFQUFFLENBQWE7UUFBUyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQWdCO1FBQ3BGLG1CQUFjLEdBQWQsY0FBYyxDQUFvQjtJQUN0RCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1NBQzNCLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRU8sVUFBVTtRQUNoQixNQUFNLE9BQU8sR0FBMkI7WUFDdEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUU7U0FDOUIsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDNUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRTVDLElBQUksSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzNELE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sUUFBUSxDQUFDLEtBQWtCO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsSUFBVTtRQUN0QyxNQUFNLEdBQUcsR0FBaUI7WUFDeEIsS0FBSyxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDbkMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUN0RCxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ25DLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsSUFBSTtvQkFDdkcsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7YUFDbkM7WUFDRCxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDO1FBQ0Ysb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvSCxHQUFHLENBQUMsT0FBTyxHQUFHO2dCQUNaLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO2FBQy9DLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxPQUFPLEdBQUc7Z0JBQ1osRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7YUFDdEMsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUMvQixXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDekMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFDakgsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFTO1lBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVztZQUN0QixRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDcEIsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQ3pCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUztTQUNyQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQXNCO1FBQ3RDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEMsTUFBTSxLQUFLLEdBQWUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLEtBQUssQ0FBQyxPQUFRLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDO1lBQzdDLEtBQUssQ0FBQyxPQUFRLENBQUMsUUFBUSxHQUFHLDRFQUE0RSxDQUFDO1lBQ3ZHLEtBQUssQ0FBQyxPQUFRLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUN2QyxLQUFLLENBQUMsT0FBUSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDckMsS0FBSyxDQUFDLE9BQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDeEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO3dHQWhLVSxtQkFBbUI7NEZBQW5CLG1CQUFtQiwyWUNyQmhDLHlqRUE4REE7OzRGRHpDYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0Usa0JBQWtCO3VLQWFuQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFJSyxLQUFLO3NCQURmLEtBQUs7Z0JBYUssZUFBZTtzQkFEekIsS0FBSztnQkFVSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuXG5pbXBvcnQgeyBPZXBhTWFwcGluZ1NlcnZpY2UsIE9FUEFSZWZlcmVuY2UgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWNvbW1vbi1saWInO1xuaW1wb3J0IHsgT2VwYVRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vdGFibGUvb2VwYS10YWJsZS1jb2x1bW4nO1xuaW1wb3J0IHsgT2VwYVRhYmxlUm93IH0gZnJvbSAnLi4vdGFibGUvb2VwYS10YWJsZS1yb3cnO1xuaW1wb3J0IHsgT2VwYVRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vdGFibGUvb2VwYS10YWJsZS1jb25maWcnO1xuaW1wb3J0IHsgT2VwYVRhYmxlSGVhZGVyIH0gZnJvbSAnLi4vdGFibGUvb2VwYS10YWJsZS1oZWFkZXInO1xuaW1wb3J0IHsgT2VwYUFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vYWN0aW9uLWJ0bi9vZXBhLWFjdGlvbi1ldmVudCc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL2NvbmZpcm1hdGlvbi1tb2RhbC9jb25maXJtYXRpb24tbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IE5vdGUgfSBmcm9tICcuL29lcGEtbm90ZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1ub3Rlcy1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub3Rlcy1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vdGVzLW1vZGFsLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOb3Rlc01vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHVibGljIG5ld05vdGVGb3JtITogRm9ybUdyb3VwO1xuICBwdWJsaWMgbmV3Tm90ZVR5cGUhOiBPRVBBUmVmZXJlbmNlO1xuICBwdWJsaWMgbmV3Tm90ZVRleHQ6IHN0cmluZyA9ICcnO1xuICBwdWJsaWMgaXNDcmVhdGluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2RlZmF1bHROb3RlVHlwZSE6IE9FUEFSZWZlcmVuY2U7XG4gIHByaXZhdGUgX25vdGVzOiBOb3RlW10gPSBbXTtcblxuICBASW5wdXQoKSBsb2dpbk5hbWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZWxldGVBbnlOb3RlQWxsb3dlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBkZWxldGVPd25Ob3RlQWxsb3dlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBjcmVhdGVOb3RlQWxsb3dlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBleHRlcm5hbCA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZyA9ICcnO1xuXG4gIFxuICBASW5wdXQoKSBcbiAgcHVibGljIHNldCBub3Rlcyhub3RlczogTm90ZVtdKSB7XG4gICAgdGhpcy5pc0NyZWF0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5fbm90ZXMgPSBub3RlcztcbiAgICB0aGlzLmxvYWREYXRhKG5vdGVzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbm90ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vdGVzO1xuICB9XG5cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRlZmF1bHROb3RlVHlwZSh0eXBlOiBPRVBBUmVmZXJlbmNlKSB7XG4gICAgdGhpcy5fZGVmYXVsdE5vdGVUeXBlID0gdHlwZTtcbiAgICB0aGlzLm5ld05vdGVUeXBlID0gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVmYXVsdE5vdGVUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0Tm90ZVR5cGU7XG4gIH1cblxuICBAT3V0cHV0KCkgb25BZGROb3RlOiBFdmVudEVtaXR0ZXI8Tm90ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPE5vdGU+KCk7XG4gIEBPdXRwdXQoKSBvbkRlbGV0ZU5vdGU6IEV2ZW50RW1pdHRlcjxOb3RlPiA9IG5ldyBFdmVudEVtaXR0ZXI8Tm90ZT4oKTtcblxuICAgIC8vIFRhYmxlIGVsZW1lbnRzXG4gICAgcHVibGljIGRhdGE6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcblxuICAgIHB1YmxpYyB0YmxDb25maWc6IE9lcGFUYWJsZUNvbmZpZyA9IHtcbiAgICB9O1xuICBcbiAgICBwdWJsaWMgaGVhZGVyOiBPZXBhVGFibGVIZWFkZXIgPSB7XG4gICAgICBjb2x1bW5zOiB0aGlzLmdldENvbHVtbnMoKVxuICAgIH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHB1YmxpYyBic01vZGFsUmVmOiBCc01vZGFsUmVmLCBwcml2YXRlIG1vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgbWFwcGluZ1NlcnZpY2U6IE9lcGFNYXBwaW5nU2VydmljZSkgeyBcbiAgfVxuXG4gIG5nT25Jbml0KCkgeyAgICBcbiAgICB0aGlzLmluaXRpYWxpemVUYWJsZSgpO1xuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGFibGUoKSB7XG4gICAgdGhpcy5oZWFkZXIgPSB7XG4gICAgICBjb2x1bW5zOiB0aGlzLmdldENvbHVtbnMoKVxuICAgIH07XG4gICAgdGhpcy5sb2FkRGF0YSh0aGlzLm5vdGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1ucygpOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+IHtcbiAgICBjb25zdCBjb2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW1xuICAgICAgeyB0aXRsZTogJ05vdGUnLCBpZDogJ25vdGUnIH0sXG4gICAgXTtcblxuICAgIGlmICghdGhpcy5leHRlcm5hbCkge1xuICAgICAgY29sdW1ucy5wdXNoKHsgdGl0bGU6ICdUeXBlJywgaWQ6ICd0eXBlJyB9KTtcbiAgICAgIGNvbHVtbnMucHVzaCh7IHRpdGxlOiAnQWNjb3VudCcsIGlkOiAnYWNjb3VudCcgfSk7XG4gICAgfVxuXG4gICAgY29sdW1ucy5wdXNoKHsgdGl0bGU6ICdEYXRlJywgaWQ6ICdkYXRlJyB9KTtcblxuICAgIGlmICh0aGlzLmRlbGV0ZUFueU5vdGVBbGxvd2VkIHx8IHRoaXMuZGVsZXRlT3duTm90ZUFsbG93ZWQpIHtcbiAgICAgIGNvbHVtbnMucHVzaCh7IHRpdGxlOiAnQWN0aW9ucycsIGlkOiAnYWN0aW9ucycsIGFjdGlvbkNvbHVtbjogdHJ1ZSwgY2xhc3NOYW1lOiAnYWN0aW9uLWJ0bi1jb2wnIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGF0YShub3RlczogQXJyYXk8Tm90ZT4pIHtcbiAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICBpZiAobm90ZXMgJiYgbm90ZXMubGVuZ3RoKSB7XG4gICAgICBub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKHRoaXMuY29udmVydE5vdGVUb1RhYmxlUm93KG5vdGUpKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLnNwbGljZSgwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnROb3RlVG9UYWJsZVJvdyhub3RlOiBOb3RlKTogT2VwYVRhYmxlUm93IHtcbiAgICBjb25zdCByb3c6IE9lcGFUYWJsZVJvdyA9IHtcbiAgICAgIGNlbGxzOiBbXG4gICAgICAgIHsgaWQ6ICdub3RlJywgdmFsdWU6IG5vdGUuY29tbWVudCB9LFxuICAgICAgICB7IGlkOiAndHlwZScsIHZhbHVlOiBub3RlLnR5cGUgPyBub3RlLnR5cGUubmFtZSA6ICcnIH0sXG4gICAgICAgIHsgaWQ6ICdhY2NvdW50JywgdmFsdWU6IG5vdGUudXNlciB9LFxuICAgICAgICB7IGlkOiAnZGF0ZScsIHZhbHVlOiBub3RlLm5vdGVEYXRlID8gdGhpcy5tYXBwaW5nU2VydmljZS5tYXBEYXRlVG9EYXRlVGltZVN0cmluZyhuZXcgRGF0ZShub3RlLm5vdGVEYXRlKSk6IG51bGwsIFxuICAgICAgICAgICAgICAgIHNvcnRWYWx1ZTogbm90ZS5ub3RlRGF0ZSB9XG4gICAgICBdLFxuICAgICAgZGF0YVNvdXJjZTogbm90ZVxuICAgIH07XG4gICAgLy8gb25seSBkaXNwbGF5IGRlbGV0ZSBhY3Rpb24gaWYgbm90ZSBjYW4gYmUgZGVsZXRlZFxuICAgIGlmICgodGhpcy5kZWxldGVBbnlOb3RlQWxsb3dlZCB8fCAodGhpcy5kZWxldGVPd25Ob3RlQWxsb3dlZCAmJiB0aGlzLmxvZ2luTmFtZSA9PT0gbm90ZS51c2VyKSkgJiYgbm90ZS50eXBlPy5jb2RlICE9PSAnU3lzdGVtJykge1xuICAgICAgcm93LmFjdGlvbnMgPSBbXG4gICAgICAgIHsgdGl0bGU6ICdEZWxldGUnLCBjbGFzc05hbWU6ICdmYSBmYS1yZW1vdmUnIH1cbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvdy5hY3Rpb25zID0gW1xuICAgICAgICB7IHRpdGxlOiAnTkEnLCBjbGFzc05hbWU6IHVuZGVmaW5lZCB9XG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gcm93O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIGlmICh0aGlzLm5ld05vdGVGb3JtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubmV3Tm90ZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmV3Tm90ZVRleHQ6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubmV3Tm90ZUZvcm0uY29udHJvbHNbJ25ld05vdGVUZXh0J10udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShuZXdOb3RlVGV4dCA9PiB0aGlzLm5ld05vdGVUZXh0ID0gbmV3Tm90ZVRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5ld05vdGVGb3JtLnJlc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlTm90ZSgpIHtcbiAgICB0aGlzLmlzQ3JlYXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgY29uc3Qgbm90ZTogTm90ZSA9IHtcbiAgICAgIHR5cGU6IHRoaXMubmV3Tm90ZVR5cGUsXG4gICAgICBub3RlRGF0ZTogbmV3IERhdGUoKSxcbiAgICAgIGNvbW1lbnQ6IHRoaXMubmV3Tm90ZVRleHQsXG4gICAgICB1c2VyOiB0aGlzLmxvZ2luTmFtZVxuICAgIH07XG4gICAgdGhpcy5vbkFkZE5vdGUuZW1pdChub3RlKTtcbiAgfVxuXG4gIG5vdGVBY3Rpb25DbGlja2VkKGV2ZW50OiBPZXBhQWN0aW9uRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYWN0aW9uLnRpdGxlID09PSAnRGVsZXRlJykge1xuICAgICAgY29uc3QgbW9kYWw6IEJzTW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50LCB7IGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWUgfSk7XG4gICAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmhlYWRlclRleHQgPSAnQ29uZmlybSBkZWxldGUnO1xuICAgICAgKDxDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudD5tb2RhbC5jb250ZW50KS5ib2R5VGV4dCA9ICdPbmNlIGEgbm90ZSBpcyBkZWxldGVkIGl0IGNhbm5vdCBiZSB1bmRvbmUhIERvIHlvdSByZWFsbHkgd2FudCB0byBkbyB0aGlzPyc7XG4gICAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmNvbmZpcm1CdG5MYWJlbCA9ICdZZXMnO1xuICAgICAgKDxDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudD5tb2RhbC5jb250ZW50KS5jYW5jZWxCdG5MYWJlbCA9ICdObyc7XG4gICAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmNvbmZpcm1DbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMub25EZWxldGVOb3RlLmVtaXQoZXZlbnQuZGF0YSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBkb25lKCkge1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuXHQ8aDMgY2xhc3M9XCJtb2RhbC10aXRsZVwiPk5vdGVzPC9oMz5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuXHRcbiAgPGRpdiAqbmdJZj1cImVycm9yTWVzc2FnZVwiPlxuXHRcdDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiByb2xlPVwiYWxlcnRcIj57eyBlcnJvck1lc3NhZ2UgfX08L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImRhdGEubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHRleHQtY2VudGVyXCI+PGVtPlRoZXJlIGFyZSBubyBub3RlcyBkZWZpbmVkLjwvZW0+PC9kaXY+XG5cbiAgPG9lcGEtdGFibGUgW2NvbmZpZ109XCJ0YmxDb25maWdcIiBbZGF0YV09XCJkYXRhXCIgW2hlYWRlcl09XCJoZWFkZXJcIiAoYWN0aW9uQ2xpY2tlZCk9XCJub3RlQWN0aW9uQ2xpY2tlZCgkZXZlbnQpXCI+PC9vZXBhLXRhYmxlPlxuXG4gICBcdFxuXHQ8Zm9ybSAqbmdJZj1cImNyZWF0ZU5vdGVBbGxvd2VkXCIgY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIj5cbiAgICBcbiAgICA8aHI+XG5cdFxuICAgIDxkaXYgW2Zvcm1Hcm91cF09XCJuZXdOb3RlRm9ybVwiIGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29udHJvbC1sYWJlbFwiPlR5cGU6PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiTm90ZVR5cGVUZXh0XCI+e3tuZXdOb3RlVHlwZS5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTEyIGNvbnRyb2wtbGFiZWxcIj48L2xhYmVsPiAgICBcbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29udHJvbC1sYWJlbFwiPk5vdGU6PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwiaW5wdXRcIiBmb3JtQ29udHJvbE5hbWU9XCJuZXdOb3RlVGV4dFwiIGlkPVwiTm90ZUlucHV0XCIgbWF4bGVuZ3RoPVwiMjAwMFwiLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMTIgY29udHJvbC1sYWJlbFwiPjwvbGFiZWw+ICAgIFxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+PC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNDcmVhdGluZ1wiPjxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1wcmltYXJ5XCIgcm9sZT1cInN0YXR1c1wiPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhaXNDcmVhdGluZ1wiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1yLTFcIiBpZD1cIkFkZE5vdGVCdG5cIiAoY2xpY2spPVwiY3JlYXRlTm90ZSgpXCIgW2Rpc2FibGVkXT1cIm5ld05vdGVGb3JtLmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5BZGQgTm90ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG5cbiAgICA8L2Rpdj4gIFxuICA8L2Zvcm0+IDwhLS0gZm9ybSAtLT5cbiAgICBcbjwvZGl2PlxuXHRcbjxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cblx0PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtci0xXCIgaWQ9XCJEb25lQnRuXCIgKGNsaWNrKT1cImRvbmUoKVwiPkRvbmU8L2J1dHRvbj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2VwYS1ub3RlLXJlc3VsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29lcGEtdWktbGliL3NyYy9saWIvbm90ZXMtbW9kYWwvb2VwYS1ub3RlLXJlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm90ZSB9IGZyb20gXCIuL29lcGEtbm90ZVwiO1xuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gdXMub2guc3RhdGUuZXBhLnBvcnRhbC5hc2Jlc3Rvcy5vcHNjZXJ0Lk5vdGVSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RlUmVzdWx0IHtcbiAgICBzdWNjZXNzPzogYm9vbGVhbjtcbiAgICBsb2c/OiBzdHJpbmdbXTtcbiAgICBub3RlPzogTm90ZTtcbiAgICBub3RlTGlzdD86IE5vdGVbXTtcbn0iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2VwYS1ub3RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9ub3Rlcy1tb2RhbC9vZXBhLW5vdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9FUEFSZWZlcmVuY2UgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWNvbW1vbi1saWInO1xuaW1wb3J0IHsgRG9tYWluT2JqZWN0IH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1lYml6LWxpYic7XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byB1cy5vaC5zdGF0ZS5lcGEucG9ydGFsLmFzYmVzdG9zLm9wc2NlcnQuTm90ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGUgZXh0ZW5kcyBEb21haW5PYmplY3Qge1xuICAgIHRhcmdldElEPzogICAgICBzdHJpbmc7XG4gICAgdGFyZ2V0VHlwZT86ICAgIE9FUEFSZWZlcmVuY2U7XG4gICAgdHlwZT86ICAgICAgICAgIE9FUEFSZWZlcmVuY2U7XG4gICAgbm90ZURhdGU/OiAgICAgIERhdGU7XG4gICAgY29tbWVudD86ICAgICAgIHN0cmluZztcbiAgICB1c2VyPzogICAgICAgICAgc3RyaW5nO1xufSJdfQ==
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@ohioepa/oepa-common-lib";
|
|
4
|
+
import * as i2 from "@angular/common";
|
|
5
|
+
import * as i3 from "@angular/forms";
|
|
6
|
+
export class NumericInputComponent {
|
|
7
|
+
idService;
|
|
8
|
+
smallService;
|
|
9
|
+
elRef;
|
|
10
|
+
componentId = 'NumericInputComponent';
|
|
11
|
+
group;
|
|
12
|
+
field = '';
|
|
13
|
+
tableIdx;
|
|
14
|
+
title = 'Input';
|
|
15
|
+
small = false;
|
|
16
|
+
onValueChange = new EventEmitter();
|
|
17
|
+
constructor(idService, smallService, elRef) {
|
|
18
|
+
this.idService = idService;
|
|
19
|
+
this.smallService = smallService;
|
|
20
|
+
this.elRef = elRef;
|
|
21
|
+
}
|
|
22
|
+
ngOnInit() {
|
|
23
|
+
this.small = this.smallService.isSmall(this.elRef.nativeElement);
|
|
24
|
+
if (this.group) {
|
|
25
|
+
this.componentId = this.idService.getComponentId(this.group) + (this.field || '') + (this.tableIdx || '');
|
|
26
|
+
this.group.get(this.field)?.valueChanges.subscribe(value => {
|
|
27
|
+
this.onValueChange.emit(value);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumericInputComponent, deps: [{ token: i1.OepaComponentIdService }, { token: i1.OepaSmallService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
32
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NumericInputComponent, selector: "oepa-numeric-input", inputs: { group: "group", field: "field", tableIdx: "tableIdx", title: "title", small: "small" }, outputs: { onValueChange: "onValueChange" }, ngImport: i0, template: "<div [formGroup]=\"group\">\n <input class=\"form-control\" [ngClass]=\"{'is-invalid':group.controls[field].invalid, 'form-control-sm': small}\" type=\"number\"\n [formControlName]=\"field\" [id]=\"componentId\">\n <small class=\"invalid-feedback\" *ngIf=\"group.controls[field].invalid\">{{title}} is required</small>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.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: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
|
|
33
|
+
}
|
|
34
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumericInputComponent, decorators: [{
|
|
35
|
+
type: Component,
|
|
36
|
+
args: [{ selector: 'oepa-numeric-input', template: "<div [formGroup]=\"group\">\n <input class=\"form-control\" [ngClass]=\"{'is-invalid':group.controls[field].invalid, 'form-control-sm': small}\" type=\"number\"\n [formControlName]=\"field\" [id]=\"componentId\">\n <small class=\"invalid-feedback\" *ngIf=\"group.controls[field].invalid\">{{title}} is required</small>\n</div>" }]
|
|
37
|
+
}], ctorParameters: () => [{ type: i1.OepaComponentIdService }, { type: i1.OepaSmallService }, { type: i0.ElementRef }], propDecorators: { group: [{
|
|
38
|
+
type: Input
|
|
39
|
+
}], field: [{
|
|
40
|
+
type: Input
|
|
41
|
+
}], tableIdx: [{
|
|
42
|
+
type: Input
|
|
43
|
+
}], title: [{
|
|
44
|
+
type: Input
|
|
45
|
+
}], small: [{
|
|
46
|
+
type: Input
|
|
47
|
+
}], onValueChange: [{
|
|
48
|
+
type: Output
|
|
49
|
+
}] } });
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL251bWVyaWMtaW5wdXQvbnVtZXJpYy1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL251bWVyaWMtaW5wdXQvbnVtZXJpYy1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDOzs7OztBQVMzRixNQUFNLE9BQU8scUJBQXFCO0lBVVo7SUFDVjtJQUNBO0lBWEgsV0FBVyxHQUFHLHVCQUF1QixDQUFDO0lBQ3BDLEtBQUssQ0FBYTtJQUNsQixLQUFLLEdBQVcsRUFBRSxDQUFDO0lBQ25CLFFBQVEsQ0FBcUI7SUFDN0IsS0FBSyxHQUFHLE9BQU8sQ0FBQztJQUNoQixLQUFLLEdBQUcsS0FBSyxDQUFDO0lBRWIsYUFBYSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO0lBRTNFLFlBQW9CLFNBQWlDLEVBQzNDLFlBQThCLEVBQzlCLEtBQWlCO1FBRlAsY0FBUyxHQUFULFNBQVMsQ0FBd0I7UUFDM0MsaUJBQVksR0FBWixZQUFZLENBQWtCO1FBQzlCLFVBQUssR0FBTCxLQUFLLENBQVk7SUFDM0IsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO3dHQXZCVSxxQkFBcUI7NEZBQXJCLHFCQUFxQix5TUNUbEMscVZBSU07OzRGREtPLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxvQkFBb0I7bUpBTXJCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPZXBhQ29tcG9uZW50SWRTZXJ2aWNlLCBPZXBhU21hbGxTZXJ2aWNlIH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1jb21tb24tbGliJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1udW1lcmljLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL251bWVyaWMtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9udW1lcmljLWlucHV0LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOdW1lcmljSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgY29tcG9uZW50SWQgPSAnTnVtZXJpY0lucHV0Q29tcG9uZW50JztcbiAgQElucHV0KCkgZ3JvdXAhOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGZpZWxkOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdGFibGVJZHg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgdGl0bGUgPSAnSW5wdXQnO1xuICBASW5wdXQoKSBzbWFsbCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBvblZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaWRTZXJ2aWNlOiBPZXBhQ29tcG9uZW50SWRTZXJ2aWNlLCBcbiAgICBwcml2YXRlIHNtYWxsU2VydmljZTogT2VwYVNtYWxsU2VydmljZSxcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmKSB7IFxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zbWFsbCA9IHRoaXMuc21hbGxTZXJ2aWNlLmlzU21hbGwodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICBpZiAodGhpcy5ncm91cCkge1xuICAgICAgdGhpcy5jb21wb25lbnRJZCA9IHRoaXMuaWRTZXJ2aWNlLmdldENvbXBvbmVudElkKHRoaXMuZ3JvdXApICsgKHRoaXMuZmllbGQgfHwgJycpICsgKHRoaXMudGFibGVJZHggfHwgJycpO1xuICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5maWVsZCk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XG4gICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJzpncm91cC5jb250cm9sc1tmaWVsZF0uaW52YWxpZCwgJ2Zvcm0tY29udHJvbC1zbSc6IHNtYWxsfVwiIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkXCIgW2lkXT1cImNvbXBvbmVudElkXCI+XG4gICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICpuZ0lmPVwiZ3JvdXAuY29udHJvbHNbZmllbGRdLmludmFsaWRcIj57e3RpdGxlfX0gaXMgcmVxdWlyZWQ8L3NtYWxsPlxuPC9kaXY+Il19
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Directive, HostListener, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/forms";
|
|
4
|
+
export class NumericInputDirective {
|
|
5
|
+
_el;
|
|
6
|
+
ngControl;
|
|
7
|
+
allowNegative = false;
|
|
8
|
+
digits = 6;
|
|
9
|
+
decimalDigits = 0;
|
|
10
|
+
isPercentage = false;
|
|
11
|
+
lastValue = '';
|
|
12
|
+
constructor(_el, ngControl) {
|
|
13
|
+
this._el = _el;
|
|
14
|
+
this.ngControl = ngControl;
|
|
15
|
+
}
|
|
16
|
+
ngModelChange = new EventEmitter();
|
|
17
|
+
ngAfterViewInit() {
|
|
18
|
+
this.lastValue = this._el.nativeElement.value || '';
|
|
19
|
+
}
|
|
20
|
+
onInputChange(event) {
|
|
21
|
+
const initalValue = this._el.nativeElement.value;
|
|
22
|
+
if (initalValue != "") {
|
|
23
|
+
const regexp = this.buildRegexp();
|
|
24
|
+
const match = initalValue.match(regexp);
|
|
25
|
+
if (match === null || (this.isPercentage && parseFloat(initalValue) > 100)) {
|
|
26
|
+
this._el.nativeElement.value = this.lastValue;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this._el.nativeElement.value = match[0];
|
|
30
|
+
this.lastValue = this._el.nativeElement.value;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this._el.nativeElement.value = "";
|
|
35
|
+
this.lastValue = "";
|
|
36
|
+
}
|
|
37
|
+
this.ngControl.control?.patchValue(this._el.nativeElement.value);
|
|
38
|
+
this.ngModelChange.emit(this._el.nativeElement.value);
|
|
39
|
+
}
|
|
40
|
+
buildRegexp() {
|
|
41
|
+
let pattern = "^";
|
|
42
|
+
if (this.allowNegative) {
|
|
43
|
+
pattern += "(-)?";
|
|
44
|
+
}
|
|
45
|
+
if (this.digits > 0) {
|
|
46
|
+
pattern += "([0-9]{0," + this.digits + "})";
|
|
47
|
+
}
|
|
48
|
+
if (this.decimalDigits > 0) {
|
|
49
|
+
pattern += "(\\.[0-9]{0," + this.decimalDigits + "})?";
|
|
50
|
+
}
|
|
51
|
+
pattern += "$";
|
|
52
|
+
return new RegExp(pattern);
|
|
53
|
+
}
|
|
54
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumericInputDirective, deps: [{ token: i0.ElementRef }, { token: i1.NgControl }], target: i0.ɵɵFactoryTarget.Directive });
|
|
55
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: NumericInputDirective, selector: "[oepaNumericInput]", inputs: { allowNegative: "allowNegative", digits: "digits", decimalDigits: "decimalDigits", isPercentage: "isPercentage" }, outputs: { ngModelChange: "ngModelChange" }, host: { listeners: { "input": "onInputChange($event)" } }, ngImport: i0 });
|
|
56
|
+
}
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumericInputDirective, decorators: [{
|
|
58
|
+
type: Directive,
|
|
59
|
+
args: [{
|
|
60
|
+
selector: '[oepaNumericInput]'
|
|
61
|
+
}]
|
|
62
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.NgControl }], propDecorators: { allowNegative: [{
|
|
63
|
+
type: Input
|
|
64
|
+
}], digits: [{
|
|
65
|
+
type: Input
|
|
66
|
+
}], decimalDigits: [{
|
|
67
|
+
type: Input
|
|
68
|
+
}], isPercentage: [{
|
|
69
|
+
type: Input
|
|
70
|
+
}], ngModelChange: [{
|
|
71
|
+
type: Output
|
|
72
|
+
}], onInputChange: [{
|
|
73
|
+
type: HostListener,
|
|
74
|
+
args: ['input', ['$event']]
|
|
75
|
+
}] } });
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL251bWVyaWMtaW5wdXQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBaUIsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBTWhILE1BQU0sT0FBTyxxQkFBcUI7SUFRWjtJQUF5QjtJQU5wQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLE1BQU0sR0FBVyxDQUFDLENBQUM7SUFDbkIsYUFBYSxHQUFXLENBQUMsQ0FBQztJQUMxQixZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFFdkIsWUFBb0IsR0FBZSxFQUFVLFNBQW9CO1FBQTdDLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFXO0lBQ2pFLENBQUM7SUFFUyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUU3QyxlQUFlO1FBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFa0MsYUFBYSxDQUFDLEtBQVU7UUFDekQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ2pELElBQUksV0FBVyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2hELENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxNQUFNLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixPQUFPLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQzlDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxJQUFJLEdBQUcsQ0FBQztRQUNmLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUIsQ0FBQzt3R0FqRFUscUJBQXFCOzRGQUFyQixxQkFBcUI7OzRGQUFyQixxQkFBcUI7a0JBSGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtpQkFDL0I7dUdBR1UsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQU1JLGFBQWE7c0JBQXRCLE1BQU07Z0JBTTRCLGFBQWE7c0JBQS9DLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBBZnRlclZpZXdJbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbb2VwYU51bWVyaWNJbnB1dF0nXG59KVxuZXhwb3J0IGNsYXNzIE51bWVyaWNJbnB1dERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG4gIEBJbnB1dCgpIGFsbG93TmVnYXRpdmUgPSBmYWxzZTtcbiAgQElucHV0KCkgZGlnaXRzOiBudW1iZXIgPSA2O1xuICBASW5wdXQoKSBkZWNpbWFsRGlnaXRzOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBpc1BlcmNlbnRhZ2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBsYXN0VmFsdWUgPSAnJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbDogRWxlbWVudFJlZiwgcHJpdmF0ZSBuZ0NvbnRyb2w6IE5nQ29udHJvbCkgeyBcbiAgfVxuXG4gIEBPdXRwdXQoKSBuZ01vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQudmFsdWUgfHwgJyc7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pIG9uSW5wdXRDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGluaXRhbFZhbHVlID0gdGhpcy5fZWwubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgICBpZiAoaW5pdGFsVmFsdWUgIT0gXCJcIikge1xuICAgICAgY29uc3QgcmVnZXhwID0gdGhpcy5idWlsZFJlZ2V4cCgpO1xuICAgICAgY29uc3QgbWF0Y2ggPSBpbml0YWxWYWx1ZS5tYXRjaChyZWdleHApO1xuICAgICAgaWYgKG1hdGNoID09PSBudWxsIHx8ICh0aGlzLmlzUGVyY2VudGFnZSAmJiBwYXJzZUZsb2F0KGluaXRhbFZhbHVlKSA+IDEwMCkpIHtcbiAgICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMubGFzdFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IG1hdGNoWzBdO1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xuICAgICAgdGhpcy5sYXN0VmFsdWUgPSBcIlwiO1xuICAgIH1cbiAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlZ2V4cCgpIDogUmVnRXhwIHtcbiAgICBsZXQgcGF0dGVybiA9IFwiXlwiO1xuICAgIGlmICh0aGlzLmFsbG93TmVnYXRpdmUpIHtcbiAgICAgIHBhdHRlcm4gKz0gXCIoLSk/XCI7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpZ2l0cyA+IDApIHtcbiAgICAgIHBhdHRlcm4gKz0gXCIoWzAtOV17MCxcIiArIHRoaXMuZGlnaXRzICsgXCJ9KVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWNpbWFsRGlnaXRzID4gMCkge1xuICAgICAgcGF0dGVybiArPSBcIihcXFxcLlswLTldezAsXCIgKyB0aGlzLmRlY2ltYWxEaWdpdHMgKyBcIn0pP1wiO1xuICAgIH1cbiAgICBwYXR0ZXJuICs9IFwiJFwiO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4pXG4gIH1cblxufVxuIl19
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class OEPAErrorMessageComponent {
|
|
4
|
+
errorMessage;
|
|
5
|
+
constructor() { }
|
|
6
|
+
ngOnInit() {
|
|
7
|
+
}
|
|
8
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OEPAErrorMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
9
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: OEPAErrorMessageComponent, selector: "oepa-error-message", inputs: { errorMessage: "errorMessage" }, ngImport: i0, template: `
|
|
10
|
+
<div class="card error-message">
|
|
11
|
+
<div class="card-header">
|
|
12
|
+
<div><i class="fa fa-exclamation-circle "></i> <strong>ERROR</strong></div>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="card-body">
|
|
15
|
+
<div class="card-text">
|
|
16
|
+
{{ errorMessage }}
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
`, isInline: true, styles: [".error-message{background-color:#f2dede;color:#a94442}.error-icon{font-size:36px}\n"] });
|
|
21
|
+
}
|
|
22
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OEPAErrorMessageComponent, decorators: [{
|
|
23
|
+
type: Component,
|
|
24
|
+
args: [{ selector: 'oepa-error-message', template: `
|
|
25
|
+
<div class="card error-message">
|
|
26
|
+
<div class="card-header">
|
|
27
|
+
<div><i class="fa fa-exclamation-circle "></i> <strong>ERROR</strong></div>
|
|
28
|
+
</div>
|
|
29
|
+
<div class="card-body">
|
|
30
|
+
<div class="card-text">
|
|
31
|
+
{{ errorMessage }}
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
`, styles: [".error-message{background-color:#f2dede;color:#a94442}.error-icon{font-size:36px}\n"] }]
|
|
36
|
+
}], ctorParameters: () => [], propDecorators: { errorMessage: [{
|
|
37
|
+
type: Input
|
|
38
|
+
}] } });
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2VwYS1lcnJvci1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29lcGEtdWktbGliL3NyYy9saWIvb2VwYS1lcnJvci1tZXNzYWdlL29lcGEtZXJyb3ItbWVzc2FnZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBa0J6RCxNQUFNLE9BQU8seUJBQXlCO0lBR3BDLFlBQVksQ0FBVTtJQUV0QixnQkFBZ0IsQ0FBQztJQUVqQixRQUFRO0lBQ1IsQ0FBQzt3R0FSVSx5QkFBeUI7NEZBQXpCLHlCQUF5QixvR0FkMUI7Ozs7Ozs7Ozs7O0tBV1A7OzRGQUdRLHlCQUF5QjtrQkFoQnJDLFNBQVM7K0JBQ0Usb0JBQW9CLFlBQ3BCOzs7Ozs7Ozs7OztLQVdQO3dEQU1ILFlBQVk7c0JBRFgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZXBhLWVycm9yLW1lc3NhZ2UnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIGVycm9yLW1lc3NhZ2VcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxuICAgICAgICA8ZGl2PjxpIGNsYXNzPVwiZmEgZmEtZXhjbGFtYXRpb24tY2lyY2xlIFwiPjwvaT4mbmJzcDsgPHN0cm9uZz5FUlJPUjwvc3Ryb25nPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRleHRcIj5cbiAgICAgICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBgLFxuICBzdHlsZVVybHM6IFsnLi9vZXBhLWVycm9yLW1lc3NhZ2UuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE9FUEFFcnJvck1lc3NhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpXG4gIGVycm9yTWVzc2FnZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICB9XG5cbn0iXX0=
|