primekit 1.0.11 → 1.0.13
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 +25 -25
- package/esm2022/lib/lib/atomix-alert/atomix-alert.component.mjs +76 -0
- package/esm2022/lib/lib/atomix-autocomplete/atomix-autocomplete.component.mjs +108 -0
- package/esm2022/lib/lib/atomix-button/atomix-button.component.mjs +49 -0
- package/esm2022/lib/lib/atomix-button/atomix-button.models.mjs +2 -0
- package/esm2022/lib/lib/atomix-calendar/atomix-calendar.component.mjs +90 -0
- package/esm2022/lib/lib/atomix-card/atomix-card.component.mjs +24 -0
- package/esm2022/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.mjs +28 -0
- package/esm2022/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.mjs +717 -0
- package/esm2022/lib/lib/atomix-divider/atomix-divider.component.mjs +27 -0
- package/esm2022/lib/lib/atomix-dropdown/atomix-dropdown.component.mjs +105 -0
- package/esm2022/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.mjs +38 -0
- package/esm2022/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.mjs +2 -0
- package/esm2022/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.mjs +67 -0
- package/esm2022/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.mjs +59 -0
- package/esm2022/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.mjs +48 -0
- package/esm2022/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.mjs +54 -0
- package/esm2022/lib/lib/atomix-form/atomix-form-chips/form.chips.models.mjs +2 -0
- package/esm2022/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.mjs +70 -0
- package/esm2022/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.mjs +80 -0
- package/esm2022/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.mjs +48 -0
- package/esm2022/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.mjs +48 -0
- package/esm2022/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.mjs +46 -0
- package/esm2022/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.mjs +46 -0
- package/esm2022/lib/lib/atomix-input/atomix-input.component.mjs +94 -0
- package/esm2022/lib/lib/atomix-input-switch/atomix-input-switch.component.mjs +85 -0
- package/esm2022/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.mjs +44 -0
- package/esm2022/lib/lib/atomix-messages/messages.component.mjs +33 -0
- package/esm2022/lib/lib/atomix-pagination/atomix-pagination.component.mjs +48 -0
- package/esm2022/lib/lib/atomix-radio-button/atomix-radio-button.component.mjs +50 -0
- package/esm2022/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.mjs +149 -0
- package/esm2022/lib/lib/atomix-select-button/atomix-select-button-models.mjs +2 -0
- package/esm2022/lib/lib/atomix-select-button/atomix-select-button.component.mjs +25 -0
- package/esm2022/lib/lib/atomix-snackbar/atomix-snackbar.component.mjs +29 -0
- package/esm2022/lib/lib/atomix-spinner/atomix-spinner.component.mjs +24 -0
- package/esm2022/lib/lib/atomix-steps/atomix-steps.component.mjs +41 -0
- package/esm2022/lib/lib/atomix-tabMenu/atomix-tabMenu.component.mjs +51 -0
- package/esm2022/lib/lib/atomix-table/atomix-table.component.mjs +454 -0
- package/esm2022/lib/lib/atomix-table/atomix-table.models.mjs +2 -0
- package/esm2022/lib/lib/atomix-tag/atomix-tag.component.mjs +24 -0
- package/esm2022/lib/lib/utils/prime-icons.util.mjs +10 -0
- package/esm2022/lib/primekit.component.mjs +11 -0
- package/esm2022/lib/primekit.module.mjs +322 -0
- package/esm2022/lib/primekit.service.mjs +14 -0
- package/esm2022/primekit.mjs +5 -0
- package/esm2022/public-api.mjs +44 -0
- package/fesm2022/primekit.mjs +3158 -0
- package/fesm2022/primekit.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/lib/atomix-alert/atomix-alert.component.d.ts +22 -0
- package/lib/lib/atomix-autocomplete/atomix-autocomplete.component.d.ts +34 -0
- package/lib/lib/atomix-button/atomix-button.component.d.ts +19 -0
- package/{src/lib/lib/atomix-button/atomix-button.models.ts → lib/lib/atomix-button/atomix-button.models.d.ts} +2 -2
- package/lib/lib/atomix-calendar/atomix-calendar.component.d.ts +27 -0
- package/lib/lib/atomix-card/atomix-card.component.d.ts +9 -0
- package/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.d.ts +12 -0
- package/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.d.ts +79 -0
- package/lib/lib/atomix-divider/atomix-divider.component.d.ts +12 -0
- package/lib/lib/atomix-dropdown/atomix-dropdown.component.d.ts +50 -0
- package/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.d.ts +15 -0
- package/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.d.ts +11 -0
- package/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.d.ts +25 -0
- package/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.d.ts +23 -0
- package/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.d.ts +18 -0
- package/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.d.ts +19 -0
- package/lib/lib/atomix-form/atomix-form-chips/form.chips.models.d.ts +5 -0
- package/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.d.ts +25 -0
- package/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.d.ts +28 -0
- package/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.d.ts +17 -0
- package/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.d.ts +17 -0
- package/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.d.ts +19 -0
- package/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.d.ts +17 -0
- package/lib/lib/atomix-input/atomix-input.component.d.ts +29 -0
- package/lib/lib/atomix-input-switch/atomix-input-switch.component.d.ts +30 -0
- package/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.d.ts +16 -0
- package/lib/lib/atomix-messages/messages.component.d.ts +13 -0
- package/lib/lib/atomix-pagination/atomix-pagination.component.d.ts +19 -0
- package/lib/lib/atomix-radio-button/atomix-radio-button.component.d.ts +15 -0
- package/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.d.ts +60 -0
- package/{src/lib/lib/atomix-select-button/atomix-select-button-models.ts → lib/lib/atomix-select-button/atomix-select-button-models.d.ts} +4 -4
- package/lib/lib/atomix-select-button/atomix-select-button.component.d.ts +12 -0
- package/lib/lib/atomix-snackbar/atomix-snackbar.component.d.ts +12 -0
- package/lib/lib/atomix-spinner/atomix-spinner.component.d.ts +9 -0
- package/lib/lib/atomix-steps/atomix-steps.component.d.ts +19 -0
- package/lib/lib/atomix-tabMenu/atomix-tabMenu.component.d.ts +19 -0
- package/lib/lib/atomix-table/atomix-table.component.d.ts +119 -0
- package/lib/lib/atomix-table/atomix-table.models.d.ts +43 -0
- package/lib/lib/atomix-tag/atomix-tag.component.d.ts +9 -0
- package/lib/lib/utils/prime-icons.util.d.ts +3 -0
- package/lib/primekit.component.d.ts +5 -0
- package/lib/primekit.module.d.ts +72 -0
- package/lib/primekit.service.d.ts +6 -0
- package/package.json +28 -15
- package/{src/public-api.ts → public-api.d.ts} +38 -47
- package/src/assets/images/empty-table.svg +25 -25
- package/ng-package.json +0 -8
- package/src/lib/lib/atomix-alert/atomix-alert.component.css +0 -67
- package/src/lib/lib/atomix-alert/atomix-alert.component.html +0 -7
- package/src/lib/lib/atomix-alert/atomix-alert.component.spec.ts +0 -154
- package/src/lib/lib/atomix-alert/atomix-alert.component.ts +0 -75
- package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.html +0 -35
- package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.scss +0 -72
- package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.spec.ts +0 -210
- package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.ts +0 -70
- package/src/lib/lib/atomix-button/atomix-button.component.css +0 -70
- package/src/lib/lib/atomix-button/atomix-button.component.html +0 -20
- package/src/lib/lib/atomix-button/atomix-button.component.spec.ts +0 -135
- package/src/lib/lib/atomix-button/atomix-button.component.ts +0 -28
- package/src/lib/lib/atomix-calendar/atomix-calendar.component.css +0 -5
- package/src/lib/lib/atomix-calendar/atomix-calendar.component.html +0 -20
- package/src/lib/lib/atomix-calendar/atomix-calendar.component.spec.ts +0 -145
- package/src/lib/lib/atomix-calendar/atomix-calendar.component.ts +0 -71
- package/src/lib/lib/atomix-card/atomix-card.component.css +0 -4
- package/src/lib/lib/atomix-card/atomix-card.component.html +0 -3
- package/src/lib/lib/atomix-card/atomix-card.component.spec.ts +0 -63
- package/src/lib/lib/atomix-card/atomix-card.component.ts +0 -13
- package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.css +0 -12
- package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.html +0 -9
- package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.spec.ts +0 -63
- package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.ts +0 -22
- package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.html +0 -233
- package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.scss +0 -266
- package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.spec.ts +0 -1465
- package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.ts +0 -717
- package/src/lib/lib/atomix-divider/atomix-divider.component.css +0 -0
- package/src/lib/lib/atomix-divider/atomix-divider.component.html +0 -7
- package/src/lib/lib/atomix-divider/atomix-divider.component.spec.ts +0 -91
- package/src/lib/lib/atomix-divider/atomix-divider.component.ts +0 -17
- package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.css +0 -25
- package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.html +0 -37
- package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.spec.ts +0 -178
- package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.ts +0 -89
- package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.css +0 -0
- package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.html +0 -0
- package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.spec.ts +0 -128
- package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.ts +0 -42
- package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.ts +0 -12
- package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.html +0 -20
- package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.scss +0 -7
- package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.spec.ts +0 -169
- package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.ts +0 -41
- package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.html +0 -21
- package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.scss +0 -7
- package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.spec.ts +0 -142
- package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.ts +0 -32
- package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.html +0 -13
- package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.scss +0 -14
- package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.spec.ts +0 -112
- package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.ts +0 -28
- package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.html +0 -20
- package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.scss +0 -3
- package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.spec.ts +0 -153
- package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.ts +0 -28
- package/src/lib/lib/atomix-form/atomix-form-chips/form.chips.models.ts +0 -5
- package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.html +0 -24
- package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.scss +0 -15
- package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.spec.ts +0 -156
- package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.ts +0 -36
- package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.html +0 -33
- package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.scss +0 -32
- package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.spec.ts +0 -156
- package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.ts +0 -42
- package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.html +0 -14
- package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.scss +0 -0
- package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.spec.ts +0 -104
- package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.ts +0 -24
- package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.html +0 -16
- package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.scss +0 -0
- package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.spec.ts +0 -92
- package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.ts +0 -24
- package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.html +0 -23
- package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.scss +0 -3
- package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.spec.ts +0 -126
- package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.ts +0 -26
- package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.html +0 -17
- package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.scss +0 -6
- package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.spec.ts +0 -120
- package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.ts +0 -24
- package/src/lib/lib/atomix-input/atomix-input.component.css +0 -52
- package/src/lib/lib/atomix-input/atomix-input.component.html +0 -45
- package/src/lib/lib/atomix-input/atomix-input.component.spec.ts +0 -229
- package/src/lib/lib/atomix-input/atomix-input.component.ts +0 -64
- package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.css +0 -12
- package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.html +0 -17
- package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.spec.ts +0 -173
- package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.ts +0 -62
- package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.html +0 -47
- package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.scss +0 -14
- package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.spec.ts +0 -21
- package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.ts +0 -25
- package/src/lib/lib/atomix-messages/messages.component.css +0 -0
- package/src/lib/lib/atomix-messages/messages.component.html +0 -9
- package/src/lib/lib/atomix-messages/messages.component.spec.ts +0 -115
- package/src/lib/lib/atomix-messages/messages.component.ts +0 -17
- package/src/lib/lib/atomix-pagination/atomix-pagination.component.css +0 -19
- package/src/lib/lib/atomix-pagination/atomix-pagination.component.html +0 -24
- package/src/lib/lib/atomix-pagination/atomix-pagination.component.spec.ts +0 -98
- package/src/lib/lib/atomix-pagination/atomix-pagination.component.ts +0 -36
- package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.css +0 -0
- package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.html +0 -7
- package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.spec.ts +0 -116
- package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.ts +0 -37
- package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.css +0 -49
- package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.html +0 -68
- package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.spec.ts +0 -282
- package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.ts +0 -119
- package/src/lib/lib/atomix-select-button/atomix-select-button.component.css +0 -5
- package/src/lib/lib/atomix-select-button/atomix-select-button.component.html +0 -7
- package/src/lib/lib/atomix-select-button/atomix-select-button.component.spec.ts +0 -73
- package/src/lib/lib/atomix-select-button/atomix-select-button.component.ts +0 -19
- package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.css +0 -30
- package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.html +0 -4
- package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.spec.ts +0 -60
- package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.ts +0 -27
- package/src/lib/lib/atomix-spinner/atomix-spinner.component.css +0 -0
- package/src/lib/lib/atomix-spinner/atomix-spinner.component.html +0 -7
- package/src/lib/lib/atomix-spinner/atomix-spinner.component.spec.ts +0 -70
- package/src/lib/lib/atomix-spinner/atomix-spinner.component.ts +0 -13
- package/src/lib/lib/atomix-steps/atomix-steps.component.html +0 -9
- package/src/lib/lib/atomix-steps/atomix-steps.component.scss +0 -0
- package/src/lib/lib/atomix-steps/atomix-steps.component.spec.ts +0 -120
- package/src/lib/lib/atomix-steps/atomix-steps.component.ts +0 -32
- package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.css +0 -0
- package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.html +0 -26
- package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.spec.ts +0 -106
- package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.ts +0 -36
- package/src/lib/lib/atomix-table/atomix-table.component.css +0 -152
- package/src/lib/lib/atomix-table/atomix-table.component.html +0 -647
- package/src/lib/lib/atomix-table/atomix-table.component.spec.ts +0 -1648
- package/src/lib/lib/atomix-table/atomix-table.component.ts +0 -422
- package/src/lib/lib/atomix-table/atomix-table.models.ts +0 -39
- package/src/lib/lib/atomix-tag/atomix-tag.component.css +0 -0
- package/src/lib/lib/atomix-tag/atomix-tag.component.html +0 -6
- package/src/lib/lib/atomix-tag/atomix-tag.component.spec.ts +0 -47
- package/src/lib/lib/atomix-tag/atomix-tag.component.ts +0 -13
- package/src/lib/lib/utils/prime-icons.util.spec.ts +0 -21
- package/src/lib/lib/utils/prime-icons.util.ts +0 -11
- package/src/lib/primekit.component.spec.ts +0 -19
- package/src/lib/primekit.component.ts +0 -10
- package/src/lib/primekit.module.spec.ts +0 -155
- package/src/lib/primekit.module.ts +0 -183
- package/src/lib/primekit.service.spec.ts +0 -17
- package/src/lib/primekit.service.ts +0 -8
- package/tsconfig.lib.json +0 -13
- package/tsconfig.lib.prod.json +0 -11
- package/tsconfig.spec.json +0 -10
|
@@ -1,717 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Component,
|
|
3
|
-
EventEmitter,
|
|
4
|
-
Input,
|
|
5
|
-
Output,
|
|
6
|
-
ViewChild,
|
|
7
|
-
OnChanges,
|
|
8
|
-
SimpleChanges,
|
|
9
|
-
OnInit,
|
|
10
|
-
OnDestroy,
|
|
11
|
-
Renderer2,
|
|
12
|
-
} from '@angular/core';
|
|
13
|
-
import { OverlayPanel } from 'primeng/overlaypanel';
|
|
14
|
-
import { DatePipe } from '@angular/common';
|
|
15
|
-
|
|
16
|
-
@Component({
|
|
17
|
-
selector: 'atomix-daterange-calendar',
|
|
18
|
-
templateUrl: './atomix-daterange-calendar.component.html',
|
|
19
|
-
styleUrls: ['./atomix-daterange-calendar.component.scss'],
|
|
20
|
-
})
|
|
21
|
-
export class AtomixDaterangeCalendarComponent
|
|
22
|
-
implements OnChanges, OnInit, OnDestroy
|
|
23
|
-
{
|
|
24
|
-
@Input() placeholder: string = '';
|
|
25
|
-
@Input() styleClass: string = '';
|
|
26
|
-
@Input() selectionMode: 'range' = 'range';
|
|
27
|
-
@Input() inputStyleClass: string = '';
|
|
28
|
-
@Input() inline: boolean = false;
|
|
29
|
-
@Input() disabled: boolean = false;
|
|
30
|
-
@Input() selectedDate: any = null;
|
|
31
|
-
@Input() maxDate!: Date;
|
|
32
|
-
@Input() minDate!: Date;
|
|
33
|
-
@Input() defaultPreset:
|
|
34
|
-
| 'today'
|
|
35
|
-
| 'yesterday'
|
|
36
|
-
| 'last7days'
|
|
37
|
-
| 'last30days'
|
|
38
|
-
| 'last3months'
|
|
39
|
-
| 'last6months'
|
|
40
|
-
| 'last1year'
|
|
41
|
-
| null = null;
|
|
42
|
-
@Input() preservePreset: boolean = false;
|
|
43
|
-
|
|
44
|
-
customRangeMode: boolean = false;
|
|
45
|
-
selectedPreset: string | null = null; // 'today' | 'yesterday' | 'last7days' | 'last30days' | 'last3months' | 'last6months' | 'last1year' | 'custom' | null
|
|
46
|
-
@ViewChild('overlayPanel') overlayPanel?: OverlayPanel;
|
|
47
|
-
@Output() dateRangeChange = new EventEmitter<any>();
|
|
48
|
-
|
|
49
|
-
// internal model bound to p-calendar to avoid changing external selection during first-click selection
|
|
50
|
-
modelDate: Date[] | null = null;
|
|
51
|
-
|
|
52
|
-
enLocale = {
|
|
53
|
-
firstDayOfWeek: 0,
|
|
54
|
-
dayNames: [
|
|
55
|
-
'Sunday',
|
|
56
|
-
'Monday',
|
|
57
|
-
'Tuesday',
|
|
58
|
-
'Wednesday',
|
|
59
|
-
'Thursday',
|
|
60
|
-
'Friday',
|
|
61
|
-
'Saturday',
|
|
62
|
-
],
|
|
63
|
-
dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
|
64
|
-
dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
|
|
65
|
-
monthNames: [
|
|
66
|
-
'January',
|
|
67
|
-
'February',
|
|
68
|
-
'March',
|
|
69
|
-
'April',
|
|
70
|
-
'May',
|
|
71
|
-
'June',
|
|
72
|
-
'July',
|
|
73
|
-
'August',
|
|
74
|
-
'September',
|
|
75
|
-
'October',
|
|
76
|
-
'November',
|
|
77
|
-
'December',
|
|
78
|
-
],
|
|
79
|
-
monthNamesShort: [
|
|
80
|
-
'Jan',
|
|
81
|
-
'Feb',
|
|
82
|
-
'Mar',
|
|
83
|
-
'Apr',
|
|
84
|
-
'May',
|
|
85
|
-
'Jun',
|
|
86
|
-
'Jul',
|
|
87
|
-
'Aug',
|
|
88
|
-
'Sep',
|
|
89
|
-
'Oct',
|
|
90
|
-
'Nov',
|
|
91
|
-
'Dec',
|
|
92
|
-
],
|
|
93
|
-
today: 'Today',
|
|
94
|
-
clear: 'Clear',
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
// temporary storage for overlay session
|
|
98
|
-
private _overlayInitialDate: Date[] | null = null;
|
|
99
|
-
private _overlayInitialPreset: string | null = null;
|
|
100
|
-
private _calendarObservers: MutationObserver[] = [];
|
|
101
|
-
private _observedElements: Element[] = [];
|
|
102
|
-
private _parentObservers: MutationObserver[] = [];
|
|
103
|
-
private _observedParentElements: Element[] = [];
|
|
104
|
-
private _updateRafId: number | null = null; // requestAnimationFrame id
|
|
105
|
-
|
|
106
|
-
constructor(
|
|
107
|
-
private datePipe: DatePipe,
|
|
108
|
-
private renderer: Renderer2
|
|
109
|
-
) {}
|
|
110
|
-
|
|
111
|
-
ngOnInit(): void {
|
|
112
|
-
if (!this.selectedDate && this.defaultPreset) {
|
|
113
|
-
this.applyPreset(this.defaultPreset);
|
|
114
|
-
}
|
|
115
|
-
// initialize internal model
|
|
116
|
-
this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
|
|
117
|
-
// initial class update if there is a pre-selected range
|
|
118
|
-
this._scheduleUpdate();
|
|
119
|
-
// start observers if inline calendar is used
|
|
120
|
-
if (this.inline) {
|
|
121
|
-
this._startCalendarObservers();
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
ngOnChanges(changes: SimpleChanges): void {
|
|
126
|
-
if (changes['selectedDate']) {
|
|
127
|
-
const sel = changes['selectedDate'].currentValue as Date[] | null;
|
|
128
|
-
if (sel && Array.isArray(sel) && sel.length === 2 && sel[0] && sel[1]) {
|
|
129
|
-
const preset = this.detectPreset(sel[0], sel[1]);
|
|
130
|
-
this.selectedPreset = preset ?? 'custom';
|
|
131
|
-
// sync internal model when external value changes
|
|
132
|
-
this.modelDate = [...sel];
|
|
133
|
-
} else if (sel == null) {
|
|
134
|
-
this.selectedPreset = null;
|
|
135
|
-
this.modelDate = null;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
onInputKeyDown(event: KeyboardEvent) {
|
|
141
|
-
if (event.key === 'Enter' || event.key === ' ') {
|
|
142
|
-
try {
|
|
143
|
-
this.overlayPanel?.toggle(event as any);
|
|
144
|
-
} catch (e) {}
|
|
145
|
-
event.preventDefault();
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
onOverlayShow(): void {
|
|
150
|
-
// store a deep copy of current selection/preset when overlay opens
|
|
151
|
-
if (this.selectedDate && Array.isArray(this.selectedDate)) {
|
|
152
|
-
this._overlayInitialDate = (this.selectedDate as Date[]).map((d) =>
|
|
153
|
-
d ? new Date(d.getFullYear(), d.getMonth(), d.getDate()) : d
|
|
154
|
-
);
|
|
155
|
-
} else {
|
|
156
|
-
this._overlayInitialDate = null;
|
|
157
|
-
}
|
|
158
|
-
this._overlayInitialPreset = this.selectedPreset;
|
|
159
|
-
// ensure calendar model shows the currently committed selection when opening
|
|
160
|
-
this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
|
|
161
|
-
// ensure preset buttons reflect current selection when overlay opens
|
|
162
|
-
if (
|
|
163
|
-
this.selectedDate &&
|
|
164
|
-
Array.isArray(this.selectedDate) &&
|
|
165
|
-
this.selectedDate.length === 2
|
|
166
|
-
) {
|
|
167
|
-
const preset = this.detectPreset(
|
|
168
|
-
this.selectedDate[0],
|
|
169
|
-
this.selectedDate[1]
|
|
170
|
-
);
|
|
171
|
-
this.selectedPreset = preset ?? 'custom';
|
|
172
|
-
} else if (!this.selectedDate) {
|
|
173
|
-
this.selectedPreset = null;
|
|
174
|
-
}
|
|
175
|
-
// add start/end classes to range cells for styling
|
|
176
|
-
this._scheduleUpdate();
|
|
177
|
-
// observe DOM changes (PrimeNG may re-render inside overlay)
|
|
178
|
-
this._startCalendarObservers();
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
onOverlayHide(): void {
|
|
182
|
-
// if internal calendar model has an incomplete selection (partial range) revert to initial
|
|
183
|
-
const model = this.modelDate;
|
|
184
|
-
const isPartialModel = Boolean(
|
|
185
|
-
model && Array.isArray(model) && model.length > 0 && model[0] && !model[1]
|
|
186
|
-
);
|
|
187
|
-
if (isPartialModel) {
|
|
188
|
-
this.selectedDate = this._overlayInitialDate;
|
|
189
|
-
this.selectedPreset = this._overlayInitialPreset;
|
|
190
|
-
// reset internal model to synced value
|
|
191
|
-
this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
|
|
192
|
-
}
|
|
193
|
-
this._overlayInitialDate = null;
|
|
194
|
-
this._overlayInitialPreset = null;
|
|
195
|
-
this.customRangeMode = false;
|
|
196
|
-
// cleanup any start/end classes to avoid stale classes
|
|
197
|
-
this._scheduleUpdate();
|
|
198
|
-
// stop observing
|
|
199
|
-
this._stopCalendarObservers();
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
onModelChange(dateRange: Date[] | null) {
|
|
203
|
-
// When user clicks a first date, PrimeNG may emit an array with 1 value. We don't want to
|
|
204
|
-
// update the external selectedDate until the range is completed (two dates) so that
|
|
205
|
-
// the calendar does not jump back to a previously selected end date's month.
|
|
206
|
-
this.modelDate = dateRange ? [...dateRange] : null;
|
|
207
|
-
if (
|
|
208
|
-
dateRange &&
|
|
209
|
-
Array.isArray(dateRange) &&
|
|
210
|
-
dateRange.length === 2 &&
|
|
211
|
-
dateRange[0] &&
|
|
212
|
-
dateRange[1]
|
|
213
|
-
) {
|
|
214
|
-
this.selectedPreset = this.detectPreset(dateRange[0], dateRange[1]);
|
|
215
|
-
this.customRangeMode = false;
|
|
216
|
-
this.selectedDate = [...dateRange];
|
|
217
|
-
this.dateRangeChange.emit(this.selectedDate);
|
|
218
|
-
// close overlay like when applying a preset
|
|
219
|
-
try {
|
|
220
|
-
this.overlayPanel?.hide();
|
|
221
|
-
} catch (e) {}
|
|
222
|
-
} else if (!dateRange) {
|
|
223
|
-
// cleared selection
|
|
224
|
-
this.selectedPreset = null;
|
|
225
|
-
this.customRangeMode = false;
|
|
226
|
-
this.selectedDate = null;
|
|
227
|
-
this.dateRangeChange.emit(null);
|
|
228
|
-
} else {
|
|
229
|
-
// single date selecting (partial range) - do not emit change yet; just keep internal model
|
|
230
|
-
// so the calendar's view remains where the user navigated to.
|
|
231
|
-
this.selectedPreset = null;
|
|
232
|
-
this.customRangeMode = false;
|
|
233
|
-
}
|
|
234
|
-
// update start/end classes while user is selecting or when range completes
|
|
235
|
-
this._scheduleUpdate();
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// Called when the calendar's visible month/year changes
|
|
239
|
-
onCalendarViewChanged(event?: any): void {
|
|
240
|
-
// Reapply classes after PrimeNG re-render
|
|
241
|
-
this._scheduleUpdate();
|
|
242
|
-
// Reattach observers after a small delay since PrimeNG will likely replace DOM nodes
|
|
243
|
-
setTimeout(() => {
|
|
244
|
-
try {
|
|
245
|
-
this._stopCalendarObservers();
|
|
246
|
-
this._startCalendarObservers();
|
|
247
|
-
} catch (e) {}
|
|
248
|
-
}, 40);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
get hasSelection(): boolean {
|
|
252
|
-
return Boolean(
|
|
253
|
-
this.selectedDate &&
|
|
254
|
-
Array.isArray(this.selectedDate) &&
|
|
255
|
-
(this.selectedDate as Date[]).length === 2 &&
|
|
256
|
-
!!(this.selectedDate as Date[])[0] &&
|
|
257
|
-
!!(this.selectedDate as Date[])[1]
|
|
258
|
-
);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
private normalizeDate(d: Date): Date {
|
|
262
|
-
return new Date(d.getFullYear(), d.getMonth(), d.getDate());
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
private isSameDate(a: Date, b: Date): boolean {
|
|
266
|
-
return (
|
|
267
|
-
a.getFullYear() === b.getFullYear() &&
|
|
268
|
-
a.getMonth() === b.getMonth() &&
|
|
269
|
-
a.getDate() === b.getDate()
|
|
270
|
-
);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
private detectPreset(startRaw: Date, endRaw: Date): string | null {
|
|
274
|
-
const start = this.normalizeDate(startRaw);
|
|
275
|
-
const end = this.normalizeDate(endRaw);
|
|
276
|
-
const today = this.normalizeDate(new Date());
|
|
277
|
-
// today
|
|
278
|
-
if (this.isSameDate(start, today) && this.isSameDate(end, today))
|
|
279
|
-
return 'today';
|
|
280
|
-
// yesterday
|
|
281
|
-
const y = new Date(today);
|
|
282
|
-
y.setDate(y.getDate() - 1);
|
|
283
|
-
if (this.isSameDate(start, y) && this.isSameDate(end, y))
|
|
284
|
-
return 'yesterday';
|
|
285
|
-
// last7days (last 7 days including today: start = today - 6, end = today)
|
|
286
|
-
const l7End = new Date(today);
|
|
287
|
-
const l7Start = new Date(today);
|
|
288
|
-
l7Start.setDate(today.getDate() - 6);
|
|
289
|
-
if (this.isSameDate(start, l7Start) && this.isSameDate(end, l7End))
|
|
290
|
-
return 'last7days';
|
|
291
|
-
// last30days (last 30 days including today: start = today - 29, end = today)
|
|
292
|
-
const l30End = new Date(today);
|
|
293
|
-
const l30Start = new Date(today);
|
|
294
|
-
l30Start.setDate(today.getDate() - 29);
|
|
295
|
-
if (this.isSameDate(start, l30Start) && this.isSameDate(end, l30End))
|
|
296
|
-
return 'last30days';
|
|
297
|
-
// last3months (last 3 months including today: start = today - 3 months, end = today)
|
|
298
|
-
const l3mEnd = new Date(today);
|
|
299
|
-
const l3mStart = new Date(today);
|
|
300
|
-
l3mStart.setMonth(today.getMonth() - 3);
|
|
301
|
-
if (this.isSameDate(start, l3mStart) && this.isSameDate(end, l3mEnd))
|
|
302
|
-
return 'last3months';
|
|
303
|
-
// last6months (last 6 months including today: start = today - 6 months, end = today)
|
|
304
|
-
const l6mEnd = new Date(today);
|
|
305
|
-
const l6mStart = new Date(today);
|
|
306
|
-
l6mStart.setMonth(today.getMonth() - 6);
|
|
307
|
-
if (this.isSameDate(start, l6mStart) && this.isSameDate(end, l6mEnd))
|
|
308
|
-
return 'last6months';
|
|
309
|
-
// last1year (last 1 year including today: start = today - 1 year, end = today)
|
|
310
|
-
const l1yEnd = new Date(today);
|
|
311
|
-
const l1yStart = new Date(today);
|
|
312
|
-
l1yStart.setFullYear(today.getFullYear() - 1);
|
|
313
|
-
if (this.isSameDate(start, l1yStart) && this.isSameDate(end, l1yEnd))
|
|
314
|
-
return 'last1year';
|
|
315
|
-
return null;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
clearDateRange() {
|
|
319
|
-
this.selectedDate = null;
|
|
320
|
-
this.dateRangeChange.emit(this.selectedDate);
|
|
321
|
-
this.selectedPreset = null;
|
|
322
|
-
this.customRangeMode = false;
|
|
323
|
-
this.modelDate = null;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
resetAndClose() {
|
|
327
|
-
this.clearDateRange();
|
|
328
|
-
if (this.overlayPanel) {
|
|
329
|
-
try {
|
|
330
|
-
this.overlayPanel.hide();
|
|
331
|
-
} catch (e) {}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
clearAndStop(event: Event) {
|
|
336
|
-
this.clearDateRange();
|
|
337
|
-
try {
|
|
338
|
-
this.overlayPanel?.hide();
|
|
339
|
-
} catch (e) {}
|
|
340
|
-
event.stopPropagation();
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
toggleCustomRange() {
|
|
344
|
-
this.customRangeMode = !this.customRangeMode;
|
|
345
|
-
if (this.customRangeMode) this.selectedPreset = 'custom';
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
applyCustomRange() {
|
|
349
|
-
// ensure external selectedDate is in sync with internal model
|
|
350
|
-
this.selectedDate = this.modelDate ? [...this.modelDate] : null;
|
|
351
|
-
this.dateRangeChange.emit(this.selectedDate);
|
|
352
|
-
if (this.overlayPanel) {
|
|
353
|
-
try {
|
|
354
|
-
this.overlayPanel.hide();
|
|
355
|
-
} catch (e) {}
|
|
356
|
-
}
|
|
357
|
-
this.customRangeMode = false;
|
|
358
|
-
this.selectedPreset = 'custom';
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
getDateRangeLabel() {
|
|
362
|
-
// Check the internal model first to show real-time updates while selecting
|
|
363
|
-
const dateArray = this.modelDate || this.selectedDate;
|
|
364
|
-
if (!dateArray || !Array.isArray(dateArray)) return '';
|
|
365
|
-
|
|
366
|
-
const [start, end] = dateArray as (Date | null)[];
|
|
367
|
-
const arrow = '\u2794';
|
|
368
|
-
|
|
369
|
-
// Show just the first date with an arrow if only first date is selected
|
|
370
|
-
if (start && !end) {
|
|
371
|
-
const startStr = this.datePipe.transform(start, 'MM/dd/yyyy');
|
|
372
|
-
return `${startStr} ${arrow} `;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// Show the complete range if both dates are selected
|
|
376
|
-
if (start && end) {
|
|
377
|
-
const startStr = this.datePipe.transform(start, 'MM/dd/yyyy');
|
|
378
|
-
const endStr = this.datePipe.transform(end, 'MM/dd/yyyy');
|
|
379
|
-
return `${startStr} ${arrow} ${endStr}`;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
return '';
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
applyPreset(
|
|
386
|
-
preset:
|
|
387
|
-
| 'today'
|
|
388
|
-
| 'yesterday'
|
|
389
|
-
| 'last7days'
|
|
390
|
-
| 'last30days'
|
|
391
|
-
| 'last3months'
|
|
392
|
-
| 'last6months'
|
|
393
|
-
| 'last1year'
|
|
394
|
-
) {
|
|
395
|
-
const today = new Date();
|
|
396
|
-
let start: Date | null = null;
|
|
397
|
-
let end: Date | null = null;
|
|
398
|
-
switch (preset) {
|
|
399
|
-
case 'today':
|
|
400
|
-
start = end = new Date(
|
|
401
|
-
today.getFullYear(),
|
|
402
|
-
today.getMonth(),
|
|
403
|
-
today.getDate()
|
|
404
|
-
);
|
|
405
|
-
break;
|
|
406
|
-
case 'yesterday':
|
|
407
|
-
const y = new Date(today);
|
|
408
|
-
y.setDate(y.getDate() - 1);
|
|
409
|
-
start = end = new Date(y.getFullYear(), y.getMonth(), y.getDate());
|
|
410
|
-
break;
|
|
411
|
-
case 'last7days': {
|
|
412
|
-
end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
|
413
|
-
start = new Date(end);
|
|
414
|
-
start.setDate(end.getDate() - 6);
|
|
415
|
-
break;
|
|
416
|
-
}
|
|
417
|
-
case 'last30days': {
|
|
418
|
-
end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
|
419
|
-
start = new Date(end);
|
|
420
|
-
start.setDate(end.getDate() - 29);
|
|
421
|
-
break;
|
|
422
|
-
}
|
|
423
|
-
case 'last3months': {
|
|
424
|
-
end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
|
425
|
-
start = new Date(end);
|
|
426
|
-
start.setMonth(end.getMonth() - 3);
|
|
427
|
-
break;
|
|
428
|
-
}
|
|
429
|
-
case 'last6months': {
|
|
430
|
-
end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
|
431
|
-
start = new Date(end);
|
|
432
|
-
start.setMonth(end.getMonth() - 6);
|
|
433
|
-
break;
|
|
434
|
-
}
|
|
435
|
-
case 'last1year': {
|
|
436
|
-
end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
|
437
|
-
start = new Date(end);
|
|
438
|
-
start.setFullYear(end.getFullYear() - 1);
|
|
439
|
-
break;
|
|
440
|
-
}
|
|
441
|
-
default:
|
|
442
|
-
break;
|
|
443
|
-
}
|
|
444
|
-
if (start && end) {
|
|
445
|
-
this.selectedDate = [start, end];
|
|
446
|
-
this.modelDate = [start, end];
|
|
447
|
-
if (this.preservePreset) {
|
|
448
|
-
this.selectedDate = [start, end, { presets: preset }];
|
|
449
|
-
}
|
|
450
|
-
this.dateRangeChange.emit(this.selectedDate);
|
|
451
|
-
this.selectedPreset = preset;
|
|
452
|
-
this.customRangeMode = false;
|
|
453
|
-
}
|
|
454
|
-
try {
|
|
455
|
-
this.overlayPanel?.hide();
|
|
456
|
-
} catch (e) {}
|
|
457
|
-
// ensure we update start/end classes after applying a preset
|
|
458
|
-
this._scheduleUpdate();
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
onDateRangeChange(dateRange: Date[] | null): void {
|
|
462
|
-
this.dateRangeChange.emit(dateRange);
|
|
463
|
-
if (dateRange && Array.isArray(dateRange)) {
|
|
464
|
-
this.selectedPreset = this.detectPreset(dateRange[0], dateRange[1]);
|
|
465
|
-
this.customRangeMode = false;
|
|
466
|
-
} else if (!dateRange) {
|
|
467
|
-
this.selectedPreset = null;
|
|
468
|
-
this.customRangeMode = false;
|
|
469
|
-
}
|
|
470
|
-
this._scheduleUpdate();
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
ngOnDestroy(): void {
|
|
474
|
-
this._stopCalendarObservers();
|
|
475
|
-
this._cancelScheduledUpdate();
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
// Walk the rendered calendar DOM(s) (overlay + inline) and add start-range/end-range classes
|
|
479
|
-
private _updateStartEndRangeClasses(): void {
|
|
480
|
-
try {
|
|
481
|
-
const calendarElements = this._getCalendarElements();
|
|
482
|
-
|
|
483
|
-
calendarElements.forEach((calEl: Element) => {
|
|
484
|
-
// Remove existing classes from spans first
|
|
485
|
-
const allSpans = calEl.querySelectorAll('td > span');
|
|
486
|
-
allSpans.forEach((span) => {
|
|
487
|
-
this.renderer.removeClass(span, 'start-range');
|
|
488
|
-
this.renderer.removeClass(span, 'end-range');
|
|
489
|
-
this.renderer.removeClass(span, 'between-range');
|
|
490
|
-
});
|
|
491
|
-
|
|
492
|
-
// Collect span/date pairs, prefer data-date attribute
|
|
493
|
-
// Cache header month/year for this calendar to avoid querying per-span
|
|
494
|
-
const panelNode = calEl.closest('.p-datepicker') || calEl;
|
|
495
|
-
const headerMonthNode = (panelNode as Element).querySelector(
|
|
496
|
-
'.p-datepicker-header .p-datepicker-title .p-datepicker-month'
|
|
497
|
-
);
|
|
498
|
-
const headerYearNode = (panelNode as Element).querySelector(
|
|
499
|
-
'.p-datepicker-header .p-datepicker-title .p-datepicker-year'
|
|
500
|
-
);
|
|
501
|
-
const headerMonthIdx =
|
|
502
|
-
headerMonthNode && headerMonthNode.textContent
|
|
503
|
-
? (this.enLocale.monthNames || []).indexOf(
|
|
504
|
-
headerMonthNode.textContent.trim()
|
|
505
|
-
)
|
|
506
|
-
: NaN;
|
|
507
|
-
const headerYearVal =
|
|
508
|
-
headerYearNode && headerYearNode.textContent
|
|
509
|
-
? parseInt(headerYearNode.textContent.trim(), 10)
|
|
510
|
-
: NaN;
|
|
511
|
-
const items: { dt: Date; span: Element; td?: HTMLElement | null }[] =
|
|
512
|
-
[];
|
|
513
|
-
const spans = calEl.querySelectorAll('td > span.p-highlight');
|
|
514
|
-
spans.forEach((span) => {
|
|
515
|
-
const td = span.closest('td') as HTMLElement | null;
|
|
516
|
-
// Try to read data-date attribute, which some PrimeNG versions render on span/td
|
|
517
|
-
let dataDate = span.getAttribute('data-date');
|
|
518
|
-
if (!dataDate && td) dataDate = td.getAttribute('data-date');
|
|
519
|
-
if (dataDate) {
|
|
520
|
-
const parts = dataDate.split('-').map((p) => parseInt(p, 10));
|
|
521
|
-
if (parts.length >= 3 && parts.every((n) => !isNaN(n))) {
|
|
522
|
-
const [y, m, d] = parts;
|
|
523
|
-
const dt = new Date(y, m - 1, d);
|
|
524
|
-
items.push({ dt, td, span });
|
|
525
|
-
return;
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
// Fallback: parse day number and infer month/year from nearby header in the same .p-datepicker
|
|
529
|
-
const dayText = (span.textContent || '').trim();
|
|
530
|
-
const day = parseInt(dayText, 10);
|
|
531
|
-
if (!isNaN(day) && td) {
|
|
532
|
-
// Use cached header month/year when available
|
|
533
|
-
if (!isNaN(headerMonthIdx) && !isNaN(headerYearVal)) {
|
|
534
|
-
const dt = new Date(headerYearVal, headerMonthIdx, day);
|
|
535
|
-
items.push({ dt, td, span });
|
|
536
|
-
return;
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
// last resort: ignore span if date cannot be determined
|
|
540
|
-
});
|
|
541
|
-
|
|
542
|
-
if (items.length === 0) return;
|
|
543
|
-
|
|
544
|
-
// Sort items to find min/max (start & end)
|
|
545
|
-
items.sort((a, b) => a.dt.getTime() - b.dt.getTime());
|
|
546
|
-
const detectedStart = items[0].dt;
|
|
547
|
-
const detectedEnd = items[items.length - 1].dt;
|
|
548
|
-
|
|
549
|
-
// Preferred range is modelDate/selectedDate if present
|
|
550
|
-
const range =
|
|
551
|
-
this.selectedDate && this.selectedDate.length === 2
|
|
552
|
-
? this.selectedDate
|
|
553
|
-
: this.modelDate && this.modelDate.length === 2
|
|
554
|
-
? this.modelDate
|
|
555
|
-
: [detectedStart, detectedEnd];
|
|
556
|
-
const startDate =
|
|
557
|
-
range && range[0]
|
|
558
|
-
? this.normalizeDate(range[0] as Date)
|
|
559
|
-
: detectedStart;
|
|
560
|
-
const endDate =
|
|
561
|
-
range && range[1]
|
|
562
|
-
? this.normalizeDate(range[1] as Date)
|
|
563
|
-
: detectedEnd;
|
|
564
|
-
|
|
565
|
-
// For each item, add start-range,end-range, or between-range based on date
|
|
566
|
-
const sTime = startDate.getTime();
|
|
567
|
-
const eTime = endDate.getTime();
|
|
568
|
-
for (const it of items) {
|
|
569
|
-
const t = it.dt.getTime();
|
|
570
|
-
if (sTime === eTime && t === sTime) {
|
|
571
|
-
// single-day range, mark both start & end
|
|
572
|
-
this.renderer.addClass(it.span, 'start-range');
|
|
573
|
-
this.renderer.addClass(it.span, 'end-range');
|
|
574
|
-
} else if (t === sTime) {
|
|
575
|
-
this.renderer.addClass(it.span, 'start-range');
|
|
576
|
-
} else if (t === eTime) {
|
|
577
|
-
this.renderer.addClass(it.span, 'end-range');
|
|
578
|
-
} else if (t > sTime && t < eTime) {
|
|
579
|
-
this.renderer.addClass(it.span, 'between-range');
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
});
|
|
583
|
-
} catch (e) {
|
|
584
|
-
// ignore DOM errors (e.g., server-side rendering / missing elements)
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
private isoDate(d: Date): string {
|
|
589
|
-
const y = d.getFullYear();
|
|
590
|
-
const m = String(d.getMonth() + 1).padStart(2, '0');
|
|
591
|
-
const day = String(d.getDate()).padStart(2, '0');
|
|
592
|
-
return `${y}-${m}-${day}`;
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
private _findElementByDate(date?: Date): HTMLElement | undefined {
|
|
596
|
-
if (!date) return undefined;
|
|
597
|
-
const y = date.getFullYear();
|
|
598
|
-
const m = date.getMonth() + 1; // 1..12
|
|
599
|
-
const d = date.getDate();
|
|
600
|
-
const isoUnpadded = `${y}-${m}-${d}`; // e.g. 2025-11-1
|
|
601
|
-
const isoPadded = `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`; // 2025-11-01
|
|
602
|
-
const selectors = [
|
|
603
|
-
`[data-date="${isoUnpadded}"]`,
|
|
604
|
-
`[data-date="${isoPadded}"]`,
|
|
605
|
-
];
|
|
606
|
-
for (const sel of selectors) {
|
|
607
|
-
const foundInOverlay = document.querySelector(
|
|
608
|
-
`.atomix-overlay-calendar ${sel}`
|
|
609
|
-
) as HTMLElement | null;
|
|
610
|
-
if (foundInOverlay)
|
|
611
|
-
return (
|
|
612
|
-
(foundInOverlay.closest('td') as HTMLElement | null) || foundInOverlay
|
|
613
|
-
);
|
|
614
|
-
}
|
|
615
|
-
for (const sel of selectors) {
|
|
616
|
-
const found = document.querySelector(sel) as HTMLElement | null;
|
|
617
|
-
if (found) return (found.closest('td') as HTMLElement | null) || found;
|
|
618
|
-
}
|
|
619
|
-
return undefined;
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
private _startCalendarObservers(): void {
|
|
623
|
-
// stop first to avoid duplicates
|
|
624
|
-
this._stopCalendarObservers();
|
|
625
|
-
try {
|
|
626
|
-
const calEls = this._getCalendarElements();
|
|
627
|
-
try {
|
|
628
|
-
const panel = this.overlayPanel as any;
|
|
629
|
-
if (panel && panel.el && panel.el.nativeElement) {
|
|
630
|
-
const el = panel.el.nativeElement.querySelector('.p-datepicker');
|
|
631
|
-
if (el) calEls.push(el as Element);
|
|
632
|
-
}
|
|
633
|
-
} catch (e) {}
|
|
634
|
-
|
|
635
|
-
calEls.forEach((el) => {
|
|
636
|
-
const obs = new MutationObserver(() => {
|
|
637
|
-
// Reapply classes after DOM changes (debounced)
|
|
638
|
-
this._scheduleUpdate();
|
|
639
|
-
});
|
|
640
|
-
// Watch childList, subtree and class attribute changes (span class toggles are common)
|
|
641
|
-
obs.observe(el, {
|
|
642
|
-
childList: true,
|
|
643
|
-
subtree: true,
|
|
644
|
-
attributes: true,
|
|
645
|
-
attributeFilter: ['class'],
|
|
646
|
-
});
|
|
647
|
-
this._calendarObservers.push(obs);
|
|
648
|
-
this._observedElements.push(el);
|
|
649
|
-
// Also observe parent - if PrimeNG replaces the .p-datepicker element, parent childList changes will fire
|
|
650
|
-
const parent = el.parentElement;
|
|
651
|
-
if (parent && this._observedParentElements.indexOf(parent) === -1) {
|
|
652
|
-
const parentObs = new MutationObserver(() => {
|
|
653
|
-
// reattach observers since the calEl may have been replaced
|
|
654
|
-
this._scheduleUpdate();
|
|
655
|
-
// detach and re-attach observers after DOM settles
|
|
656
|
-
setTimeout(() => {
|
|
657
|
-
try {
|
|
658
|
-
this._stopCalendarObservers();
|
|
659
|
-
this._startCalendarObservers();
|
|
660
|
-
} catch (e) {}
|
|
661
|
-
}, 100); // slightly larger delay to let PrimeNG finish the month rendering
|
|
662
|
-
});
|
|
663
|
-
parentObs.observe(parent, { childList: true, subtree: false });
|
|
664
|
-
this._parentObservers.push(parentObs);
|
|
665
|
-
this._observedParentElements.push(parent);
|
|
666
|
-
}
|
|
667
|
-
});
|
|
668
|
-
} catch (e) {
|
|
669
|
-
// ignore
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
private _stopCalendarObservers(): void {
|
|
674
|
-
try {
|
|
675
|
-
this._calendarObservers.forEach((obs) => obs.disconnect());
|
|
676
|
-
this._parentObservers.forEach((obs) => obs.disconnect());
|
|
677
|
-
} catch (e) {}
|
|
678
|
-
this._calendarObservers = [];
|
|
679
|
-
this._observedElements = [];
|
|
680
|
-
this._parentObservers = [];
|
|
681
|
-
this._observedParentElements = [];
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
private _scheduleUpdate(): void {
|
|
685
|
-
if (this._updateRafId != null) return; // already scheduled
|
|
686
|
-
this._updateRafId = window.requestAnimationFrame(() => {
|
|
687
|
-
this._updateRafId = null;
|
|
688
|
-
this._updateStartEndRangeClasses();
|
|
689
|
-
});
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
private _cancelScheduledUpdate(): void {
|
|
693
|
-
if (this._updateRafId != null) {
|
|
694
|
-
window.cancelAnimationFrame(this._updateRafId);
|
|
695
|
-
this._updateRafId = null;
|
|
696
|
-
}
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
private _getCalendarElements(): Element[] {
|
|
700
|
-
const calEls: Element[] = [];
|
|
701
|
-
const overlayCal = document.querySelector(
|
|
702
|
-
'.atomix-overlay-calendar .p-datepicker'
|
|
703
|
-
);
|
|
704
|
-
const inlineCal = document.querySelector('.inline-calendar .p-datepicker');
|
|
705
|
-
if (overlayCal) calEls.push(overlayCal);
|
|
706
|
-
if (inlineCal) calEls.push(inlineCal);
|
|
707
|
-
try {
|
|
708
|
-
const panel = this.overlayPanel as any;
|
|
709
|
-
if (panel && panel.el && panel.el.nativeElement) {
|
|
710
|
-
const el = panel.el.nativeElement.querySelector('.p-datepicker');
|
|
711
|
-
if (el) calEls.push(el as Element);
|
|
712
|
-
}
|
|
713
|
-
} catch (e) {}
|
|
714
|
-
// remove duplicates
|
|
715
|
-
return Array.from(new Set(calEls));
|
|
716
|
-
}
|
|
717
|
-
}
|