@acorex/modules 21.0.0-next.5 → 21.0.0-next.7
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/application-management/index.d.ts +1 -0
- package/calendar-management/index.d.ts +6 -7
- package/document-management/index.d.ts +1545 -174
- package/fesm2022/acorex-modules-application-management.mjs +1 -0
- package/fesm2022/acorex-modules-application-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-C4_2RPxG.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-7S277fXg.mjs} +23 -23
- package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-7S277fXg.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-column.component-D2YRh7ro.mjs → acorex-modules-assessment-management-answers-viewer-widget-column.component-FnpwLbkS.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-column.component-D2YRh7ro.mjs.map → acorex-modules-assessment-management-answers-viewer-widget-column.component-FnpwLbkS.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-edit.component-B-S78gfQ.mjs → acorex-modules-assessment-management-answers-viewer-widget-edit.component-By0ETDZf.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-edit.component-B-S78gfQ.mjs.map → acorex-modules-assessment-management-answers-viewer-widget-edit.component-By0ETDZf.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-view.component-C1BTgRTR.mjs → acorex-modules-assessment-management-answers-viewer-widget-view.component-DxmjBgIo.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-view.component-C1BTgRTR.mjs.map → acorex-modules-assessment-management-answers-viewer-widget-view.component-DxmjBgIo.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-DwTlClTz.mjs → acorex-modules-assessment-management-assessment-case.entity-CBjAGtV3.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-DwTlClTz.mjs.map → acorex-modules-assessment-management-assessment-case.entity-CBjAGtV3.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-BmvacBUU.mjs → acorex-modules-assessment-management-assessment-session.entity-CMnJ44gj.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-BmvacBUU.mjs.map → acorex-modules-assessment-management-assessment-session.entity-CMnJ44gj.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-D7ZNQBo8.mjs → acorex-modules-assessment-management-fill-assessment-session.command-8OhZEoAp.mjs} +3 -3
- package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-D7ZNQBo8.mjs.map → acorex-modules-assessment-management-fill-assessment-session.command-8OhZEoAp.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BQxlJax7.mjs → acorex-modules-assessment-management-preview-questionnaire.command-CUybKZFY.mjs} +4 -4
- package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BQxlJax7.mjs.map → acorex-modules-assessment-management-preview-questionnaire.command-CUybKZFY.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-CIjS5M1b.mjs → acorex-modules-assessment-management-question-bank-item.entity-C9gxvSqN.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-CIjS5M1b.mjs.map → acorex-modules-assessment-management-question-bank-item.entity-C9gxvSqN.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-builder-edit.component-DAYiqBeA.mjs → acorex-modules-assessment-management-questionnaire-builder-edit.component-CUCT7Tcg.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-builder-edit.component-DAYiqBeA.mjs.map → acorex-modules-assessment-management-questionnaire-builder-edit.component-CUCT7Tcg.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-builder-view.component-BTXwZu9a.mjs → acorex-modules-assessment-management-questionnaire-builder-view.component-QhZAjnIv.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-builder-view.component-BTXwZu9a.mjs.map → acorex-modules-assessment-management-questionnaire-builder-view.component-QhZAjnIv.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-builder.component-BAR6Uee-.mjs → acorex-modules-assessment-management-questionnaire-builder.component-CvdVE1TW.mjs} +3 -3
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-builder.component-BAR6Uee-.mjs.map → acorex-modules-assessment-management-questionnaire-builder.component-CvdVE1TW.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-DZ4TltLI.mjs → acorex-modules-assessment-management-questionnaire-viewer-popup.component-iDPvZ1Iu.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-DZ4TltLI.mjs.map → acorex-modules-assessment-management-questionnaire-viewer-popup.component-iDPvZ1Iu.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer.service-B2GV_e0o.mjs → acorex-modules-assessment-management-questionnaire-viewer.service-C2bz2R0N.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer.service-B2GV_e0o.mjs.map → acorex-modules-assessment-management-questionnaire-viewer.service-C2bz2R0N.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-mOtlUkUO.mjs → acorex-modules-assessment-management-questionnaire.entity-kvgtbI_h.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-mOtlUkUO.mjs.map → acorex-modules-assessment-management-questionnaire.entity-kvgtbI_h.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-BQ-3r9YQ.mjs → acorex-modules-assessment-management-view-session-answers.command-Dfl4QTDD.mjs} +3 -3
- package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-BQ-3r9YQ.mjs.map → acorex-modules-assessment-management-view-session-answers.command-Dfl4QTDD.mjs.map} +1 -1
- package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
- package/fesm2022/acorex-modules-calendar-management.mjs +46 -74
- package/fesm2022/acorex-modules-calendar-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-common.mjs +6 -3
- package/fesm2022/acorex-modules-common.mjs.map +1 -1
- package/fesm2022/{acorex-modules-document-management-attachment-widget.component-Bnp1l18X.mjs → acorex-modules-document-management-attachment-widget.component-zsWIFXD7.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-attachment-widget.component-Bnp1l18X.mjs.map → acorex-modules-document-management-attachment-widget.component-zsWIFXD7.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-details-view.component-TfRh2Jom.mjs → acorex-modules-document-management-details-view.component-DD7P_Xz7.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-details-view.component-TfRh2Jom.mjs.map → acorex-modules-document-management-details-view.component-DD7P_Xz7.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-document-signature-popup.component-nKUvSQuz.mjs → acorex-modules-document-management-document-signature-popup.component-DsCP-XfJ.mjs} +5 -5
- package/fesm2022/{acorex-modules-document-management-document-signature-popup.component-nKUvSQuz.mjs.map → acorex-modules-document-management-document-signature-popup.component-DsCP-XfJ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-drive-choose.component-CPQC_Qxe.mjs → acorex-modules-document-management-drive-choose.component-FUlvIsJu.mjs} +7 -7
- package/fesm2022/{acorex-modules-document-management-drive-choose.component-CPQC_Qxe.mjs.map → acorex-modules-document-management-drive-choose.component-FUlvIsJu.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-large-icons-view.component-BP_4qwha.mjs → acorex-modules-document-management-large-icons-view.component-Dzc3SOKz.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-large-icons-view.component-BP_4qwha.mjs.map → acorex-modules-document-management-large-icons-view.component-Dzc3SOKz.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-large-tiles-view.component-CP9Ra0z9.mjs → acorex-modules-document-management-large-tiles-view.component-DrRbFkP4.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-large-tiles-view.component-CP9Ra0z9.mjs.map → acorex-modules-document-management-large-tiles-view.component-DrRbFkP4.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-link-dialog.component-nJmv07CR.mjs → acorex-modules-document-management-link-dialog.component-DKGpdhH1.mjs} +3 -3
- package/fesm2022/{acorex-modules-document-management-link-dialog.component-nJmv07CR.mjs.map → acorex-modules-document-management-link-dialog.component-DKGpdhH1.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-list-view.component-LhSA_duB.mjs → acorex-modules-document-management-list-view.component-C7cR3m4S.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-list-view.component-LhSA_duB.mjs.map → acorex-modules-document-management-list-view.component-C7cR3m4S.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-share-dialog.component-DJABAVOV.mjs → acorex-modules-document-management-share-dialog.component-MK4UO_uy.mjs} +3 -3
- package/fesm2022/{acorex-modules-document-management-share-dialog.component-DJABAVOV.mjs.map → acorex-modules-document-management-share-dialog.component-MK4UO_uy.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-share-email-dialog.component-Bh_FI1nk.mjs → acorex-modules-document-management-share-email-dialog.component-D5f4T_2K.mjs} +3 -3
- package/fesm2022/{acorex-modules-document-management-share-email-dialog.component-Bh_FI1nk.mjs.map → acorex-modules-document-management-share-email-dialog.component-D5f4T_2K.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-small-icons-view.component-BOtJGiPU.mjs → acorex-modules-document-management-small-icons-view.component-BPWvSH3i.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-small-icons-view.component-BOtJGiPU.mjs.map → acorex-modules-document-management-small-icons-view.component-BPWvSH3i.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-small-tiles-view.component-BiKZ-FyZ.mjs → acorex-modules-document-management-small-tiles-view.component-fIQ4RY_F.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-small-tiles-view.component-BiKZ-FyZ.mjs.map → acorex-modules-document-management-small-tiles-view.component-fIQ4RY_F.mjs.map} +1 -1
- package/fesm2022/acorex-modules-document-management.mjs +9326 -1
- package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-human-capital-management-leave-request-task-popover.component-CR4xmtkI.mjs +381 -0
- package/fesm2022/acorex-modules-human-capital-management-leave-request-task-popover.component-CR4xmtkI.mjs.map +1 -0
- package/fesm2022/acorex-modules-human-capital-management.mjs +5 -2
- package/fesm2022/acorex-modules-human-capital-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-platform-management-acorex-modules-platform-management-BIq_sJye.mjs → acorex-modules-platform-management-acorex-modules-platform-management-BOo-XED8.mjs} +2 -2
- package/fesm2022/{acorex-modules-platform-management-acorex-modules-platform-management-BIq_sJye.mjs.map → acorex-modules-platform-management-acorex-modules-platform-management-BOo-XED8.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-platform-management-menu-list.component-CL-zuLJ1.mjs → acorex-modules-platform-management-menu-list.component-BtQ0O4sx.mjs} +3 -3
- package/fesm2022/acorex-modules-platform-management-menu-list.component-BtQ0O4sx.mjs.map +1 -0
- package/fesm2022/acorex-modules-platform-management.mjs +1 -1
- package/fesm2022/acorex-modules-project-management.mjs +2 -0
- package/fesm2022/acorex-modules-project-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-report-management.mjs +1 -1
- package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-security-management.mjs +3 -1
- package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-gQ5Sk1Sj.mjs → acorex-modules-settings-management-acorex-modules-settings-management-R6m7cpPE.mjs} +18 -18
- package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-gQ5Sk1Sj.mjs.map → acorex-modules-settings-management-acorex-modules-settings-management-R6m7cpPE.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-BEDGpTc8.mjs → acorex-modules-settings-management-permission-definition.provider-BNzuJQfL.mjs} +2 -2
- package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-BEDGpTc8.mjs.map → acorex-modules-settings-management-permission-definition.provider-BNzuJQfL.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-settings-management-setting-page.component-BsA1TfMG.mjs → acorex-modules-settings-management-setting-page.component-B1SnxHdd.mjs} +2 -2
- package/fesm2022/{acorex-modules-settings-management-setting-page.component-BsA1TfMG.mjs.map → acorex-modules-settings-management-setting-page.component-B1SnxHdd.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-settings-management-setting-view.component-C282orx7.mjs → acorex-modules-settings-management-setting-view.component-BsuZ-NQK.mjs} +2 -2
- package/fesm2022/{acorex-modules-settings-management-setting-view.component-C282orx7.mjs.map → acorex-modules-settings-management-setting-view.component-BsuZ-NQK.mjs.map} +1 -1
- package/fesm2022/acorex-modules-settings-management.mjs +1 -1
- package/fesm2022/{acorex-modules-task-management-task-board.page-CKgZoOGI.mjs → acorex-modules-task-management-task-board.page-Cm8wJD-y.mjs} +529 -73
- package/fesm2022/acorex-modules-task-management-task-board.page-Cm8wJD-y.mjs.map +1 -0
- package/fesm2022/acorex-modules-task-management.mjs +13 -6
- package/fesm2022/acorex-modules-task-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-workflow-management.mjs +394 -12
- package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
- package/human-capital-management/index.d.ts +3 -1
- package/package.json +2 -2
- package/task-management/index.d.ts +31 -4
- package/workflow-management/index.d.ts +93 -6
- package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-C4_2RPxG.mjs.map +0 -1
- package/fesm2022/acorex-modules-document-management-acorex-modules-document-management-Dk4Z-JSv.mjs +0 -8995
- package/fesm2022/acorex-modules-document-management-acorex-modules-document-management-Dk4Z-JSv.mjs.map +0 -1
- package/fesm2022/acorex-modules-document-management-drive.component-BzpH_FSJ.mjs +0 -388
- package/fesm2022/acorex-modules-document-management-drive.component-BzpH_FSJ.mjs.map +0 -1
- package/fesm2022/acorex-modules-platform-management-menu-list.component-CL-zuLJ1.mjs.map +0 -1
- package/fesm2022/acorex-modules-task-management-task-board.page-CKgZoOGI.mjs.map +0 -1
|
@@ -1,25 +1,35 @@
|
|
|
1
|
+
import * as i9 from '@acorex/cdk/accordion';
|
|
2
|
+
import { AXAccordionCdkModule } from '@acorex/cdk/accordion';
|
|
3
|
+
import { AXAccordionModule } from '@acorex/components/accordion';
|
|
4
|
+
import * as i8 from '@acorex/components/badge';
|
|
1
5
|
import { AXBadgeModule } from '@acorex/components/badge';
|
|
2
6
|
import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
|
|
3
7
|
import * as i3 from '@acorex/components/button';
|
|
4
8
|
import { AXButtonComponent, AXButtonModule } from '@acorex/components/button';
|
|
5
9
|
import { AXCalendarComponent } from '@acorex/components/calendar';
|
|
10
|
+
import { AXCheckBoxModule } from '@acorex/components/check-box';
|
|
6
11
|
import * as i5 from '@acorex/components/decorators';
|
|
7
12
|
import { AXDecoratorIconComponent, AXDecoratorModule } from '@acorex/components/decorators';
|
|
8
|
-
import
|
|
13
|
+
import * as i4 from '@acorex/components/dropdown';
|
|
14
|
+
import { AXDropdownModule, AXDropdownPanelComponent } from '@acorex/components/dropdown';
|
|
9
15
|
import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
|
|
10
|
-
import
|
|
16
|
+
import { AXFormFieldComponent, AXFormComponent, AXFormModule } from '@acorex/components/form';
|
|
17
|
+
import { AXLabelComponent, AXLabelModule } from '@acorex/components/label';
|
|
18
|
+
import * as i7 from '@acorex/components/loading';
|
|
11
19
|
import { AXLoadingModule } from '@acorex/components/loading';
|
|
12
|
-
import * as
|
|
20
|
+
import * as i3$1 from '@acorex/components/menu';
|
|
13
21
|
import { AXMenuModule } from '@acorex/components/menu';
|
|
14
|
-
import * as
|
|
22
|
+
import * as i2 from '@acorex/components/popover';
|
|
15
23
|
import { AXPopoverModule } from '@acorex/components/popover';
|
|
24
|
+
import * as i10 from '@acorex/components/selection-list';
|
|
25
|
+
import { AXSelectionListModule } from '@acorex/components/selection-list';
|
|
16
26
|
import { AXCalendarService } from '@acorex/core/date-time';
|
|
17
27
|
import { AXLocaleService } from '@acorex/core/locale';
|
|
18
|
-
import * as
|
|
28
|
+
import * as i5$1 from '@acorex/core/translation';
|
|
19
29
|
import { AXTranslatorPipe, AXTranslationModule } from '@acorex/core/translation';
|
|
20
30
|
import { AXUnsubscriber } from '@acorex/core/utils';
|
|
21
31
|
import { AXPPlatformScope, AXPDeviceService } from '@acorex/platform/core';
|
|
22
|
-
import { AXPStateMessageComponent, AXPThemeLayoutBlockComponent } from '@acorex/platform/layout/components';
|
|
32
|
+
import { AXPStateMessageComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutHeaderComponent } from '@acorex/platform/layout/components';
|
|
23
33
|
import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPageLayoutBase } from '@acorex/platform/layout/views';
|
|
24
34
|
import * as i1$1 from '@angular/common';
|
|
25
35
|
import { AsyncPipe, CommonModule } from '@angular/common';
|
|
@@ -35,10 +45,9 @@ import * as i1 from '@acorex/platform/layout/widget-core';
|
|
|
35
45
|
import { AXPWidgetCoreModule, AXPWidgetsCatalog } from '@acorex/platform/layout/widget-core';
|
|
36
46
|
import { AXPSettingsService } from '@acorex/platform/common';
|
|
37
47
|
import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
|
|
38
|
-
import { AXFormFieldComponent, AXFormComponent } from '@acorex/components/form';
|
|
39
|
-
import { AXLabelComponent } from '@acorex/components/label';
|
|
40
48
|
import { isEqual, sortBy } from 'lodash-es';
|
|
41
49
|
import { AXSchedulerComponent } from '@acorex/components/scheduler';
|
|
50
|
+
import { AXPCommandService } from '@acorex/platform/runtime';
|
|
42
51
|
import { AXDataSource } from '@acorex/cdk/common';
|
|
43
52
|
import * as i1$2 from '@acorex/components/data-table';
|
|
44
53
|
import { AXDataTableModule } from '@acorex/components/data-table';
|
|
@@ -46,14 +55,15 @@ import { AXKanbanComponent } from '@acorex/components/kanban';
|
|
|
46
55
|
|
|
47
56
|
var AXMTaskBoardSettings;
|
|
48
57
|
(function (AXMTaskBoardSettings) {
|
|
49
|
-
AXMTaskBoardSettings["ViewMode"] = "
|
|
50
|
-
AXMTaskBoardSettings["DetailPanel"] = "
|
|
51
|
-
AXMTaskBoardSettings["DaysCount"] = "
|
|
52
|
-
AXMTaskBoardSettings["CurrentDate"] = "
|
|
53
|
-
AXMTaskBoardSettings["SelectedPriorities"] = "
|
|
54
|
-
AXMTaskBoardSettings["SelectedAssigneeIds"] = "
|
|
55
|
-
AXMTaskBoardSettings["SelectedReporterIds"] = "
|
|
56
|
-
AXMTaskBoardSettings["SelectedTaskTypeNames"] = "
|
|
58
|
+
AXMTaskBoardSettings["ViewMode"] = "taskboard.viewMode";
|
|
59
|
+
AXMTaskBoardSettings["DetailPanel"] = "taskboard.DetailPanel";
|
|
60
|
+
AXMTaskBoardSettings["DaysCount"] = "taskboard.calendar.daysCount";
|
|
61
|
+
AXMTaskBoardSettings["CurrentDate"] = "taskboard.calendar.currentDate";
|
|
62
|
+
AXMTaskBoardSettings["SelectedPriorities"] = "taskboard.filter.selectedPriorities";
|
|
63
|
+
AXMTaskBoardSettings["SelectedAssigneeIds"] = "taskboard.filter.selectedAssigneeIds";
|
|
64
|
+
AXMTaskBoardSettings["SelectedReporterIds"] = "taskboard.filter.selectedReporterIds";
|
|
65
|
+
AXMTaskBoardSettings["SelectedTaskTypeNames"] = "taskboard.filter.selectedTaskTypeNames";
|
|
66
|
+
AXMTaskBoardSettings["SelectedCalendarEventTypeIds"] = "taskboard.filter.selectedCalendarEventTypeIds";
|
|
57
67
|
})(AXMTaskBoardSettings || (AXMTaskBoardSettings = {}));
|
|
58
68
|
|
|
59
69
|
const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() => ({
|
|
@@ -69,6 +79,7 @@ const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() =
|
|
|
69
79
|
selectedAssigneeIds: [],
|
|
70
80
|
selectedPriorities: [],
|
|
71
81
|
selectedReporterIds: [],
|
|
82
|
+
selectedCalendarEventTypeIds: [],
|
|
72
83
|
})), withComputed((store) => ({
|
|
73
84
|
selectedTaskTypes: computed(() => {
|
|
74
85
|
const names = store.selectedTaskTypeNames();
|
|
@@ -110,7 +121,7 @@ const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() =
|
|
|
110
121
|
try {
|
|
111
122
|
const taskTypes = await taskBoardService.getTaskTypes();
|
|
112
123
|
patchState(store, { taskTypes });
|
|
113
|
-
const [savedDaysCount, savedDateString, savedDetailPanel, savedViewMode, savedTaskTypeNames, savedAssigneeIds, savedReporterIds, savedPriorities,] = await Promise.all([
|
|
124
|
+
const [savedDaysCount, savedDateString, savedDetailPanel, savedViewMode, savedTaskTypeNames, savedAssigneeIds, savedReporterIds, savedPriorities, savedCalendarEventTypeIds,] = await Promise.all([
|
|
114
125
|
userScopedSettings().get(AXMTaskBoardSettings.DaysCount),
|
|
115
126
|
userScopedSettings().get(AXMTaskBoardSettings.CurrentDate),
|
|
116
127
|
userScopedSettings().get(AXMTaskBoardSettings.DetailPanel),
|
|
@@ -119,16 +130,27 @@ const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() =
|
|
|
119
130
|
userScopedSettings().get(AXMTaskBoardSettings.SelectedAssigneeIds),
|
|
120
131
|
userScopedSettings().get(AXMTaskBoardSettings.SelectedReporterIds),
|
|
121
132
|
userScopedSettings().get(AXMTaskBoardSettings.SelectedPriorities),
|
|
133
|
+
userScopedSettings().get(AXMTaskBoardSettings.SelectedCalendarEventTypeIds),
|
|
122
134
|
]);
|
|
135
|
+
// Ensure currentDate is always a valid Date
|
|
136
|
+
let currentDate;
|
|
137
|
+
if (savedDateString) {
|
|
138
|
+
const parsedDate = new Date(savedDateString);
|
|
139
|
+
currentDate = isNaN(parsedDate.getTime()) ? new Date() : parsedDate;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
currentDate = new Date();
|
|
143
|
+
}
|
|
123
144
|
patchState(store, {
|
|
124
145
|
daysCount: savedDaysCount || 7,
|
|
125
146
|
detailPanel: savedDetailPanel || false,
|
|
126
147
|
currentViewMode: savedViewMode || 'month',
|
|
127
|
-
currentDate
|
|
148
|
+
currentDate,
|
|
128
149
|
selectedTaskTypeNames: savedTaskTypeNames || [],
|
|
129
150
|
selectedAssigneeIds: savedAssigneeIds || [],
|
|
130
151
|
selectedReporterIds: savedReporterIds || [],
|
|
131
152
|
selectedPriorities: savedPriorities || [],
|
|
153
|
+
selectedCalendarEventTypeIds: savedCalendarEventTypeIds || [],
|
|
132
154
|
isLoading: false,
|
|
133
155
|
});
|
|
134
156
|
}
|
|
@@ -142,6 +164,7 @@ const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() =
|
|
|
142
164
|
selectedAssigneeIds: [],
|
|
143
165
|
selectedPriorities: [],
|
|
144
166
|
selectedReporterIds: [],
|
|
167
|
+
selectedCalendarEventTypeIds: [],
|
|
145
168
|
taskTypes: store.taskTypes(),
|
|
146
169
|
isLoading: false,
|
|
147
170
|
});
|
|
@@ -200,6 +223,14 @@ const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() =
|
|
|
200
223
|
.set(AXMTaskBoardSettings.SelectedPriorities, priorities)
|
|
201
224
|
.catch((error) => console.error('Error saving selected priority filter:', error));
|
|
202
225
|
},
|
|
226
|
+
setSelectedCalendarEventTypeIds(eventTypeIds, isQueryParam = false) {
|
|
227
|
+
patchState(store, { selectedCalendarEventTypeIds: eventTypeIds });
|
|
228
|
+
if (isQueryParam)
|
|
229
|
+
return;
|
|
230
|
+
userScopedSettings()
|
|
231
|
+
.set(AXMTaskBoardSettings.SelectedCalendarEventTypeIds, eventTypeIds)
|
|
232
|
+
.catch((error) => console.error('Error saving selected calendar event type filter:', error));
|
|
233
|
+
},
|
|
203
234
|
/**
|
|
204
235
|
* Sets the currently selected task. Pass `null` to clear the selection.
|
|
205
236
|
* @param task The task to select, or null.
|
|
@@ -308,6 +339,7 @@ class AXMTaskBoardFiltersComponent {
|
|
|
308
339
|
this.rootConfig = RootConfig;
|
|
309
340
|
this.vm = inject(AXMTaskBoardViewModel);
|
|
310
341
|
this.isQueryParam = input(false, ...(ngDevMode ? [{ debugName: "isQueryParam" }] : []));
|
|
342
|
+
this.excludeTaskType = input(false, ...(ngDevMode ? [{ debugName: "excludeTaskType" }] : []));
|
|
311
343
|
this.applyClicked = output();
|
|
312
344
|
this.context = signal({}, ...(ngDevMode ? [{ debugName: "context" }] : []));
|
|
313
345
|
this.isInitialized = false;
|
|
@@ -330,24 +362,27 @@ class AXMTaskBoardFiltersComponent {
|
|
|
330
362
|
const viewMode = this.vm.currentViewMode();
|
|
331
363
|
return viewMode !== 'kanban' && viewMode !== 'status-grouped-grid';
|
|
332
364
|
}, ...(ngDevMode ? [{ debugName: "isMultiSelectEnabled" }] : []));
|
|
333
|
-
this.nodes = computed(() =>
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
365
|
+
this.nodes = computed(() => {
|
|
366
|
+
const allNodes = [];
|
|
367
|
+
if (!this.excludeTaskType()) {
|
|
368
|
+
allNodes.push({
|
|
369
|
+
name: 'taskType',
|
|
370
|
+
path: 'options.taskType',
|
|
371
|
+
type: AXPWidgetsCatalog.select,
|
|
372
|
+
options: {
|
|
373
|
+
valueField: 'name',
|
|
374
|
+
textField: 'title',
|
|
375
|
+
dataSource: 'task-types',
|
|
376
|
+
placeholder: 'Select Task Type',
|
|
377
|
+
multiple: this.isMultiSelectEnabled(),
|
|
378
|
+
allowClear: this.isMultiSelectEnabled(),
|
|
379
|
+
},
|
|
380
|
+
meta: {
|
|
381
|
+
title: 'task-board.filter.task-type',
|
|
382
|
+
},
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
allNodes.push({
|
|
351
386
|
name: 'assignee',
|
|
352
387
|
path: 'options.assignee',
|
|
353
388
|
type: AXPWidgetsCatalog.select,
|
|
@@ -362,8 +397,7 @@ class AXMTaskBoardFiltersComponent {
|
|
|
362
397
|
meta: {
|
|
363
398
|
title: 'task-board.filter.assignee',
|
|
364
399
|
},
|
|
365
|
-
},
|
|
366
|
-
{
|
|
400
|
+
}, {
|
|
367
401
|
name: 'reporter',
|
|
368
402
|
path: 'options.reporter',
|
|
369
403
|
type: AXPWidgetsCatalog.select,
|
|
@@ -378,8 +412,7 @@ class AXMTaskBoardFiltersComponent {
|
|
|
378
412
|
meta: {
|
|
379
413
|
title: 'task-board.filter.reporter',
|
|
380
414
|
},
|
|
381
|
-
},
|
|
382
|
-
{
|
|
415
|
+
}, {
|
|
383
416
|
name: 'priority',
|
|
384
417
|
path: 'options.priority',
|
|
385
418
|
type: AXPWidgetsCatalog.select,
|
|
@@ -394,8 +427,9 @@ class AXMTaskBoardFiltersComponent {
|
|
|
394
427
|
meta: {
|
|
395
428
|
title: 'task-board.filter.priority',
|
|
396
429
|
},
|
|
397
|
-
}
|
|
398
|
-
|
|
430
|
+
});
|
|
431
|
+
return allNodes;
|
|
432
|
+
}, ...(ngDevMode ? [{ debugName: "nodes" }] : []));
|
|
399
433
|
}
|
|
400
434
|
#init;
|
|
401
435
|
resetContextToViewModel() {
|
|
@@ -409,20 +443,25 @@ class AXMTaskBoardFiltersComponent {
|
|
|
409
443
|
: vmTaskTypeNames.length > 0
|
|
410
444
|
? vmTaskTypeNames[0]
|
|
411
445
|
: null;
|
|
446
|
+
const contextOptions = {
|
|
447
|
+
priority: vmPriorities,
|
|
448
|
+
assignee: vmAssigneeIds,
|
|
449
|
+
reporter: vmReporterIds,
|
|
450
|
+
};
|
|
451
|
+
if (!this.excludeTaskType()) {
|
|
452
|
+
contextOptions.taskType = taskTypeContextValue;
|
|
453
|
+
}
|
|
412
454
|
this.context.set({
|
|
413
|
-
options:
|
|
414
|
-
priority: vmPriorities,
|
|
415
|
-
assignee: vmAssigneeIds,
|
|
416
|
-
reporter: vmReporterIds,
|
|
417
|
-
taskType: taskTypeContextValue,
|
|
418
|
-
},
|
|
455
|
+
options: contextOptions,
|
|
419
456
|
});
|
|
420
457
|
}
|
|
421
458
|
handleContextChanged(e) {
|
|
422
459
|
this.context.set(e.data);
|
|
423
460
|
}
|
|
424
461
|
handleApply() {
|
|
425
|
-
|
|
462
|
+
if (!this.excludeTaskType()) {
|
|
463
|
+
this.syncTaskTypesToViewModel(this.context()?.options?.taskType);
|
|
464
|
+
}
|
|
426
465
|
this.syncAssigneesToViewModel(this.context()?.options?.assignee);
|
|
427
466
|
this.syncReportersToViewModel(this.context()?.options?.reporter);
|
|
428
467
|
this.syncPrioritiesToViewModel(this.context()?.options?.priority);
|
|
@@ -480,17 +519,19 @@ class AXMTaskBoardFiltersComponent {
|
|
|
480
519
|
handleReset() {
|
|
481
520
|
if (this.vm.currentViewMode() === 'kanban' || this.vm.currentViewMode() === 'status-grouped-grid') {
|
|
482
521
|
const currentOptions = this.context();
|
|
522
|
+
const contextOptions = {};
|
|
523
|
+
if (!this.excludeTaskType()) {
|
|
524
|
+
contextOptions.taskType = currentOptions?.options?.taskType;
|
|
525
|
+
}
|
|
483
526
|
this.context.set({
|
|
484
|
-
options:
|
|
485
|
-
taskType: currentOptions?.options?.taskType,
|
|
486
|
-
},
|
|
527
|
+
options: contextOptions,
|
|
487
528
|
});
|
|
488
529
|
return;
|
|
489
530
|
}
|
|
490
531
|
this.context.set({});
|
|
491
532
|
}
|
|
492
533
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXMTaskBoardFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
493
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXMTaskBoardFiltersComponent, isStandalone: true, selector: "axm-task-board-filters", inputs: { isQueryParam: { classPropertyName: "isQueryParam", publicName: "isQueryParam", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { applyClicked: "applyClicked" }, ngImport: i0, template: "<div class=\"ax-px-4 ax-py-3 ax-flex ax-flex-col ax-gap-2 ax-sm ax-w-[20rem]\">\n <axp-widgets-container [context]=\"context()\" (onContextChanged)=\"handleContextChanged($event)\">\n <ax-form>\n <div class=\"ax-flex ax-flex-col ax-gap-4\">\n @for (node of nodes(); track $index) {\n <ax-form-field>\n @if (node.meta?.['title']) {\n <ax-label>\n {{ node.meta?.['title'] | translate: { scope: rootConfig.config.i18n } | async }}\n </ax-label>\n }\n <ng-container axp-widget-renderer [node]=\"node\" [mode]=\"'edit'\"></ng-container>\n </ax-form-field>\n }\n </div>\n <div class=\"ax-flex ax-gap-2 ax-mt-6 ax-mb-1\">\n <ax-button\n (onClick)=\"handleReset()\"\n class=\"ax-w-full\"\n [text]=\"'@general:actions.clear.title' | translate | async\"\n ></ax-button>\n <ax-button\n color=\"primary\"\n [type]=\"'submit'\"\n (onClick)=\"handleApply()\"\n class=\"ax-w-full\"\n [text]=\"'@general:actions.apply.title' | translate | async\"\n ></ax-button>\n </div>\n </ax-form>\n </axp-widgets-container>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "component", type: AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn"], outputs: ["onValidate", "updateOnChange"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
534
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXMTaskBoardFiltersComponent, isStandalone: true, selector: "axm-task-board-filters", inputs: { isQueryParam: { classPropertyName: "isQueryParam", publicName: "isQueryParam", isSignal: true, isRequired: false, transformFunction: null }, excludeTaskType: { classPropertyName: "excludeTaskType", publicName: "excludeTaskType", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { applyClicked: "applyClicked" }, ngImport: i0, template: "<div class=\"ax-px-4 ax-py-3 ax-flex ax-flex-col ax-gap-2 ax-sm ax-w-[20rem]\">\n <axp-widgets-container [context]=\"context()\" (onContextChanged)=\"handleContextChanged($event)\">\n <ax-form>\n <div class=\"ax-flex ax-flex-col ax-gap-4\">\n @for (node of nodes(); track $index) {\n <ax-form-field>\n @if (node.meta?.['title']) {\n <ax-label>\n {{ node.meta?.['title'] | translate: { scope: rootConfig.config.i18n } | async }}\n </ax-label>\n }\n <ng-container axp-widget-renderer [node]=\"node\" [mode]=\"'edit'\"></ng-container>\n </ax-form-field>\n }\n </div>\n <div class=\"ax-flex ax-gap-2 ax-mt-6 ax-mb-1\">\n <ax-button\n (onClick)=\"handleReset()\"\n class=\"ax-w-full\"\n [text]=\"'@general:actions.clear.title' | translate | async\"\n ></ax-button>\n <ax-button\n color=\"primary\"\n [type]=\"'submit'\"\n (onClick)=\"handleApply()\"\n class=\"ax-w-full\"\n [text]=\"'@general:actions.apply.title' | translate | async\"\n ></ax-button>\n </div>\n </ax-form>\n </axp-widgets-container>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "component", type: AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn"], outputs: ["onValidate", "updateOnChange"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
494
535
|
}
|
|
495
536
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXMTaskBoardFiltersComponent, decorators: [{
|
|
496
537
|
type: Component,
|
|
@@ -504,15 +545,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
|
|
|
504
545
|
AXTranslatorPipe,
|
|
505
546
|
AsyncPipe,
|
|
506
547
|
], template: "<div class=\"ax-px-4 ax-py-3 ax-flex ax-flex-col ax-gap-2 ax-sm ax-w-[20rem]\">\n <axp-widgets-container [context]=\"context()\" (onContextChanged)=\"handleContextChanged($event)\">\n <ax-form>\n <div class=\"ax-flex ax-flex-col ax-gap-4\">\n @for (node of nodes(); track $index) {\n <ax-form-field>\n @if (node.meta?.['title']) {\n <ax-label>\n {{ node.meta?.['title'] | translate: { scope: rootConfig.config.i18n } | async }}\n </ax-label>\n }\n <ng-container axp-widget-renderer [node]=\"node\" [mode]=\"'edit'\"></ng-container>\n </ax-form-field>\n }\n </div>\n <div class=\"ax-flex ax-gap-2 ax-mt-6 ax-mb-1\">\n <ax-button\n (onClick)=\"handleReset()\"\n class=\"ax-w-full\"\n [text]=\"'@general:actions.clear.title' | translate | async\"\n ></ax-button>\n <ax-button\n color=\"primary\"\n [type]=\"'submit'\"\n (onClick)=\"handleApply()\"\n class=\"ax-w-full\"\n [text]=\"'@general:actions.apply.title' | translate | async\"\n ></ax-button>\n </div>\n </ax-form>\n </axp-widgets-container>\n</div>\n" }]
|
|
507
|
-
}], propDecorators: { isQueryParam: [{ type: i0.Input, args: [{ isSignal: true, alias: "isQueryParam", required: false }] }], applyClicked: [{ type: i0.Output, args: ["applyClicked"] }] } });
|
|
548
|
+
}], propDecorators: { isQueryParam: [{ type: i0.Input, args: [{ isSignal: true, alias: "isQueryParam", required: false }] }], excludeTaskType: [{ type: i0.Input, args: [{ isSignal: true, alias: "excludeTaskType", required: false }] }], applyClicked: [{ type: i0.Output, args: ["applyClicked"] }] } });
|
|
508
549
|
|
|
509
550
|
class AXMTaskBoardCalendarViewComponent {
|
|
510
551
|
constructor() {
|
|
511
552
|
this.vm = inject(AXMTaskBoardViewModel);
|
|
512
553
|
this.calendarService = inject(AXCalendarService);
|
|
513
554
|
this.taskBoardService = inject(AXPTaskBoardService);
|
|
514
|
-
this.
|
|
555
|
+
this.settingService = inject(AXPSettingsService);
|
|
556
|
+
this.commandService = inject(AXPCommandService);
|
|
515
557
|
this.schedulerComponent = viewChild(AXSchedulerComponent, ...(ngDevMode ? [{ debugName: "schedulerComponent" }] : []));
|
|
558
|
+
this.taskPopover = viewChild('taskPopover', ...(ngDevMode ? [{ debugName: "taskPopover" }] : []));
|
|
559
|
+
this.selectedTask = signal(null, ...(ngDevMode ? [{ debugName: "selectedTask" }] : []));
|
|
560
|
+
this.popoverTarget = signal(null, ...(ngDevMode ? [{ debugName: "popoverTarget" }] : []));
|
|
561
|
+
this.taskActions = signal([], ...(ngDevMode ? [{ debugName: "taskActions" }] : []));
|
|
562
|
+
this.customComponentType = signal(null, ...(ngDevMode ? [{ debugName: "customComponentType" }] : []));
|
|
563
|
+
// Separate primary and secondary actions
|
|
564
|
+
this.primaryActions = computed(() => {
|
|
565
|
+
return this.taskActions().filter((action) => (action.priority ?? 'secondary') === 'primary');
|
|
566
|
+
}, ...(ngDevMode ? [{ debugName: "primaryActions" }] : []));
|
|
567
|
+
this.secondaryActions = computed(() => {
|
|
568
|
+
return this.taskActions().filter((action) => (action.priority ?? 'secondary') === 'secondary');
|
|
569
|
+
}, ...(ngDevMode ? [{ debugName: "secondaryActions" }] : []));
|
|
570
|
+
this.customComponentInputs = computed(() => {
|
|
571
|
+
const task = this.selectedTask();
|
|
572
|
+
if (!task)
|
|
573
|
+
return null;
|
|
574
|
+
return { task };
|
|
575
|
+
}, ...(ngDevMode ? [{ debugName: "customComponentInputs" }] : []));
|
|
516
576
|
this.resources = input([], ...(ngDevMode ? [{ debugName: "resources" }] : []));
|
|
517
577
|
this.startingDate = input(new Date(), ...(ngDevMode ? [{ debugName: "startingDate" }] : []));
|
|
518
578
|
this.selectedView = input('month', ...(ngDevMode ? [{ debugName: "selectedView" }] : []));
|
|
@@ -520,7 +580,9 @@ class AXMTaskBoardCalendarViewComponent {
|
|
|
520
580
|
this.firstDayOfWeek = signal('monday', ...(ngDevMode ? [{ debugName: "firstDayOfWeek" }] : []));
|
|
521
581
|
this.weekendDays = signal([0, 6], ...(ngDevMode ? [{ debugName: "weekendDays" }] : []));
|
|
522
582
|
this.holidays = (range) => {
|
|
523
|
-
|
|
583
|
+
const selectedEventTypeIds = this.vm.selectedCalendarEventTypeIds();
|
|
584
|
+
// Pass selected calendar IDs (can be empty array to show no events)
|
|
585
|
+
return this.taskBoardService.getEvents(range, selectedEventTypeIds);
|
|
524
586
|
};
|
|
525
587
|
this.currentSchedulerView = computed(() => this.selectedView() === 'kanban' || this.selectedView() === 'grid'
|
|
526
588
|
? 'month'
|
|
@@ -591,16 +653,256 @@ class AXMTaskBoardCalendarViewComponent {
|
|
|
591
653
|
handleActionClick(event) {
|
|
592
654
|
this.onActionClick.emit({ nativeEvent: event.nativeEvent, task: event.appointment });
|
|
593
655
|
}
|
|
594
|
-
onTaskClickHandler(event) {
|
|
595
|
-
|
|
656
|
+
async onTaskClickHandler(event) {
|
|
657
|
+
const task = event.appointment;
|
|
658
|
+
// Find the appointment container element
|
|
659
|
+
let targetElement = event.nativeEvent.currentTarget || event.nativeEvent.target;
|
|
660
|
+
// Traverse up to find the appointment container
|
|
661
|
+
let element = targetElement;
|
|
662
|
+
const maxDepth = 10;
|
|
663
|
+
let depth = 0;
|
|
664
|
+
while (element && element !== document.body && depth < maxDepth) {
|
|
665
|
+
depth++;
|
|
666
|
+
const isAppointment = element.classList?.contains('dx-scheduler-appointment') ||
|
|
667
|
+
element.classList?.contains('ax-scheduler-appointment') ||
|
|
668
|
+
element.hasAttribute('data-appointment-id');
|
|
669
|
+
if (isAppointment) {
|
|
670
|
+
targetElement = element;
|
|
671
|
+
break;
|
|
672
|
+
}
|
|
673
|
+
const parent = element.parentElement;
|
|
674
|
+
if (parent) {
|
|
675
|
+
const isParentAppointment = parent.classList?.contains('dx-scheduler-appointment') ||
|
|
676
|
+
parent.classList?.contains('ax-scheduler-appointment');
|
|
677
|
+
if (isParentAppointment) {
|
|
678
|
+
targetElement = parent;
|
|
679
|
+
break;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
element = element.parentElement;
|
|
683
|
+
}
|
|
684
|
+
// Set the selected task and target element
|
|
685
|
+
this.selectedTask.set(task);
|
|
686
|
+
this.popoverTarget.set(targetElement);
|
|
687
|
+
// Check if provider has a custom component
|
|
688
|
+
await this.loadCustomComponent(task);
|
|
689
|
+
// Load actions for the task
|
|
690
|
+
await this.loadTaskActions(task);
|
|
691
|
+
// Open the popover
|
|
692
|
+
setTimeout(() => {
|
|
693
|
+
if (this.taskPopover() && targetElement) {
|
|
694
|
+
this.taskPopover().target = targetElement;
|
|
695
|
+
this.taskPopover().open();
|
|
696
|
+
}
|
|
697
|
+
}, 0);
|
|
698
|
+
// Still emit the event for backward compatibility
|
|
699
|
+
this.onTaskClick.emit(task);
|
|
700
|
+
}
|
|
701
|
+
async loadTaskActions(task) {
|
|
702
|
+
try {
|
|
703
|
+
const providerName = task.provider;
|
|
704
|
+
if (!providerName) {
|
|
705
|
+
this.taskActions.set([]);
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
const provider = this.taskBoardService.getProvider(providerName);
|
|
709
|
+
if (!provider) {
|
|
710
|
+
this.taskActions.set([]);
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
const actions = await provider.getActions(task);
|
|
714
|
+
// Ensure all actions have a priority (default to 'secondary' if not specified)
|
|
715
|
+
const actionsWithPriority = (actions || []).map((action) => ({
|
|
716
|
+
...action,
|
|
717
|
+
priority: action.priority ?? 'secondary',
|
|
718
|
+
}));
|
|
719
|
+
this.taskActions.set(actionsWithPriority);
|
|
720
|
+
}
|
|
721
|
+
catch (error) {
|
|
722
|
+
console.error('Failed to load task actions:', error);
|
|
723
|
+
this.taskActions.set([]);
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
getActionColor(action) {
|
|
727
|
+
return action.color;
|
|
728
|
+
}
|
|
729
|
+
async executeAction(action) {
|
|
730
|
+
const task = this.selectedTask();
|
|
731
|
+
if (!task || !action.command)
|
|
732
|
+
return;
|
|
733
|
+
try {
|
|
734
|
+
const providerName = task.provider;
|
|
735
|
+
if (!providerName)
|
|
736
|
+
return;
|
|
737
|
+
await this.taskBoardService.executeCommand(action.command, providerName);
|
|
738
|
+
this.closePopover();
|
|
739
|
+
}
|
|
740
|
+
catch (error) {
|
|
741
|
+
console.error('Failed to execute action:', error);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
async openTaskDetails() {
|
|
745
|
+
const task = this.selectedTask();
|
|
746
|
+
if (!task)
|
|
747
|
+
return;
|
|
748
|
+
try {
|
|
749
|
+
await this.commandService.execute('Entity:OpenDetails', {
|
|
750
|
+
entity: `${RootConfig.module.name}.${RootConfig.entities.task.name}`,
|
|
751
|
+
data: { id: task.id },
|
|
752
|
+
});
|
|
753
|
+
this.closePopover();
|
|
754
|
+
}
|
|
755
|
+
catch (error) {
|
|
756
|
+
console.error('Failed to open task details:', error);
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
async loadCustomComponent(task) {
|
|
760
|
+
if (!task.provider) {
|
|
761
|
+
console.log('[TaskPopover] No provider on task:', task);
|
|
762
|
+
this.customComponentType.set(null);
|
|
763
|
+
return;
|
|
764
|
+
}
|
|
765
|
+
const provider = this.taskBoardService.getProvider(task.provider);
|
|
766
|
+
if (!provider) {
|
|
767
|
+
console.log('[TaskPopover] Provider not found:', task.provider);
|
|
768
|
+
this.customComponentType.set(null);
|
|
769
|
+
return;
|
|
770
|
+
}
|
|
771
|
+
const componentGetter = provider.getComponent?.();
|
|
772
|
+
if (!componentGetter) {
|
|
773
|
+
console.log('[TaskPopover] No component getter on provider:', task.provider);
|
|
774
|
+
this.customComponentType.set(null);
|
|
775
|
+
return;
|
|
776
|
+
}
|
|
777
|
+
console.log('[TaskPopover] Component getter found:', componentGetter, 'Type:', typeof componentGetter);
|
|
778
|
+
try {
|
|
779
|
+
let componentType;
|
|
780
|
+
// Check if it's a lazy loading function or direct component type
|
|
781
|
+
// A lazy loader is a function that returns a Promise
|
|
782
|
+
// A component type is a class constructor (also a function, but used differently)
|
|
783
|
+
if (typeof componentGetter === 'function') {
|
|
784
|
+
// Try calling it to see if it returns a Promise (lazy loader)
|
|
785
|
+
const testCall = componentGetter;
|
|
786
|
+
let result;
|
|
787
|
+
try {
|
|
788
|
+
result = testCall();
|
|
789
|
+
}
|
|
790
|
+
catch (e) {
|
|
791
|
+
// If calling throws (e.g., class constructor without 'new'), use it directly
|
|
792
|
+
console.log('[TaskPopover] Component getter is a class constructor, using directly');
|
|
793
|
+
componentType = componentGetter;
|
|
794
|
+
this.customComponentType.set(componentType);
|
|
795
|
+
return;
|
|
796
|
+
}
|
|
797
|
+
if (result instanceof Promise) {
|
|
798
|
+
// It's a lazy loading function
|
|
799
|
+
console.log('[TaskPopover] Component getter is a lazy loader');
|
|
800
|
+
componentType = await result;
|
|
801
|
+
}
|
|
802
|
+
else if (result) {
|
|
803
|
+
// It returned a component type directly
|
|
804
|
+
console.log('[TaskPopover] Component getter returned component type directly');
|
|
805
|
+
componentType = result;
|
|
806
|
+
}
|
|
807
|
+
else {
|
|
808
|
+
// Result is undefined, use the original as component type
|
|
809
|
+
console.log('[TaskPopover] Component getter returned undefined, using original as component type');
|
|
810
|
+
componentType = componentGetter;
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
else {
|
|
814
|
+
console.log('[TaskPopover] Component getter is not a function');
|
|
815
|
+
this.customComponentType.set(null);
|
|
816
|
+
return;
|
|
817
|
+
}
|
|
818
|
+
console.log('[TaskPopover] Component type loaded successfully:', componentType?.name);
|
|
819
|
+
this.customComponentType.set(componentType);
|
|
820
|
+
}
|
|
821
|
+
catch (error) {
|
|
822
|
+
console.error('[TaskPopover] Failed to load custom task popover component:', error);
|
|
823
|
+
this.customComponentType.set(null);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
closePopover() {
|
|
827
|
+
this.taskPopover()?.close();
|
|
828
|
+
this.customComponentType.set(null);
|
|
829
|
+
this.selectedTask.set(null);
|
|
830
|
+
this.popoverTarget.set(null);
|
|
831
|
+
this.taskActions.set([]);
|
|
832
|
+
}
|
|
833
|
+
formatTime(date) {
|
|
834
|
+
return this.calendarService.create(date).format('HH:mm');
|
|
835
|
+
}
|
|
836
|
+
formatDate(date) {
|
|
837
|
+
return this.calendarService.create(date).format('MMM DD, YYYY');
|
|
838
|
+
}
|
|
839
|
+
formatDateTime(date) {
|
|
840
|
+
return this.calendarService.create(date).format('MMM DD, YYYY HH:mm');
|
|
841
|
+
}
|
|
842
|
+
isMultiDay(task) {
|
|
843
|
+
if (task.allDay) {
|
|
844
|
+
const start = this.calendarService.create(task.startDate);
|
|
845
|
+
const end = this.calendarService.create(task.endDate);
|
|
846
|
+
return start.date.getTime() !== end.date.getTime();
|
|
847
|
+
}
|
|
848
|
+
// Check if start and end are on different days
|
|
849
|
+
const start = this.calendarService.create(task.startDate);
|
|
850
|
+
const end = this.calendarService.create(task.endDate);
|
|
851
|
+
const startDay = start.date.getDate();
|
|
852
|
+
const endDay = end.date.getDate();
|
|
853
|
+
const startMonth = start.date.getMonth();
|
|
854
|
+
const endMonth = end.date.getMonth();
|
|
855
|
+
const startYear = start.date.getFullYear();
|
|
856
|
+
const endYear = end.date.getFullYear();
|
|
857
|
+
return startDay !== endDay || startMonth !== endMonth || startYear !== endYear;
|
|
858
|
+
}
|
|
859
|
+
formatDateRange(task) {
|
|
860
|
+
if (task.allDay) {
|
|
861
|
+
const start = this.calendarService.create(task.startDate);
|
|
862
|
+
const end = this.calendarService.create(task.endDate);
|
|
863
|
+
// Same day
|
|
864
|
+
if (start.date.getTime() === end.date.getTime()) {
|
|
865
|
+
return this.formatDate(task.startDate);
|
|
866
|
+
}
|
|
867
|
+
// Different days - show range
|
|
868
|
+
const startFormatted = this.formatDate(task.startDate);
|
|
869
|
+
const endFormatted = this.formatDate(task.endDate);
|
|
870
|
+
// Same month and year
|
|
871
|
+
if (start.date.getMonth() === end.date.getMonth() && start.date.getFullYear() === end.date.getFullYear()) {
|
|
872
|
+
const startDay = start.date.getDate();
|
|
873
|
+
const endDay = end.date.getDate();
|
|
874
|
+
const monthYear = start.format('MMM YYYY');
|
|
875
|
+
return `${startDay} - ${endDay}, ${monthYear}`;
|
|
876
|
+
}
|
|
877
|
+
// Different months or years
|
|
878
|
+
return `${startFormatted} - ${endFormatted}`;
|
|
879
|
+
}
|
|
880
|
+
// Not all-day
|
|
881
|
+
if (this.isMultiDay(task)) {
|
|
882
|
+
const startFormatted = this.formatDateTime(task.startDate);
|
|
883
|
+
const endFormatted = this.formatDateTime(task.endDate);
|
|
884
|
+
return `${startFormatted} - ${endFormatted}`;
|
|
885
|
+
}
|
|
886
|
+
// Same day, show date with time range
|
|
887
|
+
const dateFormatted = this.formatDate(task.startDate);
|
|
888
|
+
const timeRange = `${this.formatTime(task.startDate)} - ${this.formatTime(task.endDate)}`;
|
|
889
|
+
return `${dateFormatted} ${timeRange}`;
|
|
596
890
|
}
|
|
597
891
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXMTaskBoardCalendarViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
598
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.12", type: AXMTaskBoardCalendarViewComponent, isStandalone: true, selector: "axm-task-board-calendar-view", inputs: { resources: { classPropertyName: "resources", publicName: "resources", isSignal: true, isRequired: false, transformFunction: null }, startingDate: { classPropertyName: "startingDate", publicName: "startingDate", isSignal: true, isRequired: false, transformFunction: null }, selectedView: { classPropertyName: "selectedView", publicName: "selectedView", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onTaskClick: "onTaskClick", onTaskChanged: "onTaskChanged", onMonthSlotDblClicked: "onMonthSlotDblClicked", onActionClick: "onActionClick", component: "component", onTaskRightClick: "onTaskRightClick", onRangeChanged: "onRangeChanged" }, viewQueries: [{ propertyName: "schedulerComponent", first: true, predicate: AXSchedulerComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<ax-scheduler\n [hasHeader]=\"false\"\n [hasActions]=\"true\"\n [holidays]=\"holidays\"\n [resources]=\"resources()\"\n [dataSource]=\"dataSource()\"\n [startingDate]=\"startingDate()\"\n [selectedView]=\"currentSchedulerView()\"\n [multiDayViewDaysCount]=\"vm.daysCount()\"\n (onAppointmentDrop)=\"onTaskDrop($event)\"\n (onActionClick)=\"handleActionClick($event)\"\n (onRangeChanged)=\"handleRangeChanged($event)\"\n (onSlotDblClicked)=\"onSlotDblClicked($event)\"\n (onAppointmentClicked)=\"onTaskClickHandler($event)\"\n (onAppointmentRightClick)=\"onTaskRightClickHandler($event)\"\n [weekend]=\"weekendDays()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n></ax-scheduler>\n", styles: ["ax-scheduler{line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}\n"], dependencies: [{ kind: "component", type: AXSchedulerComponent, selector: "ax-scheduler", inputs: ["calendar", "startingDate", "endDayHour", "startDayHour", "hasHeader", "readonly", "draggable", "hasActions", "dragStartDelay", "weekend", "allowFullScreen", "multiDayViewDaysCount", "showResourceHeaders", "showCurrentTimeIndicator", "showUnassignedAppointments", "resources", "resourceTemplate", "firstDayOfWeek", "tooltipTemplate", "dataSource", "holidays", "views", "selectedView"], outputs: ["selectedViewChange", "onDataLoaded", "onRangeChanged", "onSlotClicked", "onSlotDblClicked", "onSlotRightClick", "onAppointmentDrop", "onActionClick", "onAppointmentClicked", "onAppointmentDblClicked", "onAppointmentRightClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
892
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXMTaskBoardCalendarViewComponent, isStandalone: true, selector: "axm-task-board-calendar-view", inputs: { resources: { classPropertyName: "resources", publicName: "resources", isSignal: true, isRequired: false, transformFunction: null }, startingDate: { classPropertyName: "startingDate", publicName: "startingDate", isSignal: true, isRequired: false, transformFunction: null }, selectedView: { classPropertyName: "selectedView", publicName: "selectedView", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onTaskClick: "onTaskClick", onTaskChanged: "onTaskChanged", onMonthSlotDblClicked: "onMonthSlotDblClicked", onActionClick: "onActionClick", component: "component", onTaskRightClick: "onTaskRightClick", onRangeChanged: "onRangeChanged" }, viewQueries: [{ propertyName: "schedulerComponent", first: true, predicate: AXSchedulerComponent, descendants: true, isSignal: true }, { propertyName: "taskPopover", first: true, predicate: ["taskPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "<ax-scheduler\n [hasHeader]=\"false\"\n [holidays]=\"holidays\"\n [resources]=\"resources()\"\n [dataSource]=\"dataSource()\"\n [startingDate]=\"startingDate()\"\n [selectedView]=\"currentSchedulerView()\"\n [multiDayViewDaysCount]=\"vm.daysCount()\"\n (onAppointmentDrop)=\"onTaskDrop($event)\"\n (onActionClick)=\"handleActionClick($event)\"\n (onRangeChanged)=\"handleRangeChanged($event)\"\n (onSlotDblClicked)=\"onSlotDblClicked($event)\"\n (onAppointmentClicked)=\"onTaskClickHandler($event)\"\n [weekend]=\"weekendDays()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n></ax-scheduler>\n\n<!-- Task Detail Popover (Modern Google Calendar Style) -->\n<ax-popover\n #taskPopover\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [offsetY]=\"12\"\n [offsetX]=\"12\"\n [adaptivityEnabled]=\"true\"\n>\n @if (selectedTask()) {\n <div class=\"task-popover ax-shadow-md ax-border\">\n <!-- Header Section -->\n <div class=\"task-popover__header\">\n <div class=\"task-popover__title-section\">\n <div class=\"task-popover__title-row\">\n <h3 class=\"task-popover__title\" [title]=\"selectedTask()!.title\">{{ selectedTask()!.title }}</h3>\n <button type=\"button\" class=\"task-popover__close-btn\" (click)=\"closePopover()\" aria-label=\"Close\">\n <ax-icon class=\"ax-icon ax-icon-close\"></ax-icon>\n </button>\n </div>\n @if (selectedTask()!.description && !customComponentType()) {\n <p class=\"task-popover__description\">{{ selectedTask()!.description }}</p>\n }\n </div>\n </div>\n\n <!-- Custom Component or Default Content -->\n @if (customComponentType()) {\n <!-- Custom Component from Provider -->\n <div class=\"task-popover__custom-content\">\n <ng-container *ngComponentOutlet=\"customComponentType()!; inputs: customComponentInputs()!\"></ng-container>\n </div>\n } @else {\n <!-- Default Content Section -->\n <div class=\"task-popover__content\">\n <!-- Time -->\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-clock\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ formatDateRange(selectedTask()!) }}</span>\n </div>\n </div>\n\n <!-- Status -->\n @if (selectedTask()!.status) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-flag\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ selectedTask()!.status.title }}</span>\n </div>\n </div>\n }\n\n <!-- Assignee -->\n @if (selectedTask()!.assignee) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-user\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{\n selectedTask()!.assignee?.fullName || selectedTask()!.assignee?.username || 'Unassigned'\n }}</span>\n </div>\n </div>\n }\n\n <!-- Priority -->\n @if (selectedTask()!.priority) {\n <div class=\"task-popover__info-item\">\n <div\n class=\"task-popover__icon task-popover__icon--priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n <i class=\"fa-light fa-exclamation-circle\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span\n class=\"task-popover__info-text task-popover__priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n {{ selectedTask()!.priority }}\n </span>\n </div>\n </div>\n }\n </div>\n\n <!-- Actions Section -->\n <div class=\"task-popover__actions\">\n <!-- Task Actions from Provider -->\n @if (taskActions().length > 0) {\n <div class=\"task-popover__actions-group\">\n <!-- Primary Actions: Icon-only buttons -->\n @if (primaryActions().length > 0) {\n @for (action of primaryActions(); track action.name || action.title) {\n <ax-button\n [look]=\"'solid'\"\n [color]=\"getActionColor(action)\"\n (onClick)=\"executeAction(action)\"\n [disabled]=\"action.disabled === true\"\n [text]=\"action.title\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n }\n\n <!-- Secondary Actions: Dropdown with \"...\" button -->\n @if (secondaryActions().length > 0) {\n <ax-button [look]=\"'blank'\">\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-ellipsis-vertical\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of secondaryActions(); track action.name || action.title) {\n <ax-button-item\n [text]=\"action.title\"\n [disabled]=\"action.disabled === true\"\n (onClick)=\"executeAction(action)\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n</ax-popover>\n", styles: ["ax-scheduler{line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}.task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.task-popover__header{padding:20px 20px 16px;border-bottom:1px solid var(--ax-sys-color-border);background:linear-gradient(to bottom,var(--ax-sys-color-lightest-surface),var(--ax-sys-color-lighter-surface))}.task-popover__title-section{display:flex;flex-direction:column;gap:8px}.task-popover__title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.task-popover__title{font-size:18px;font-weight:600;line-height:1.4;color:var(--ax-sys-color-text-primary);margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-popover__close-btn{flex-shrink:0;background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ax-sys-color-text-neutral-600);transition:color .2s ease;border-radius:4px}.task-popover__close-btn:hover{color:var(--ax-sys-color-text-primary);background:var(--ax-sys-color-lighter-surface)}.task-popover__close-btn:active{background:var(--ax-sys-color-light-surface)}.task-popover__close-btn ax-icon{display:block;width:16px;height:16px}.task-popover__description{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-secondary);margin:0;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.task-popover__content{padding:16px 20px;display:flex;flex-direction:column;gap:12px;flex:1}.task-popover__info-item{display:flex;align-items:flex-start;gap:12px;min-height:24px}.task-popover__icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;color:var(--ax-sys-color-text-neutral-600);font-size:14px}.task-popover__icon i{display:block}.task-popover__icon--priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__time{font-weight:500;color:var(--ax-sys-color-text-primary);margin-left:4px}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}.task-popover__actions-group--default{margin-top:4px;padding-top:8px;border-top:1px solid var(--ax-sys-color-border)}.task-popover__action-divider{width:100%;height:1px;background:var(--ax-sys-color-border);margin:4px 0}.task-popover__action-btn{min-width:100px;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXSchedulerComponent, selector: "ax-scheduler", inputs: ["calendar", "startingDate", "endDayHour", "startDayHour", "hasHeader", "readonly", "draggable", "hasActions", "dragStartDelay", "weekend", "allowFullScreen", "multiDayViewDaysCount", "showResourceHeaders", "showCurrentTimeIndicator", "showUnassignedAppointments", "resources", "resourceTemplate", "firstDayOfWeek", "tooltipTemplate", "dataSource", "holidays", "views", "selectedView"], outputs: ["selectedViewChange", "onDataLoaded", "onRangeChanged", "onSlotClicked", "onSlotDblClicked", "onSlotRightClick", "onAppointmentDrop", "onActionClick", "onAppointmentClicked", "onAppointmentDblClicked", "onAppointmentRightClick"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i3.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i3.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i4.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i5.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i5.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
599
893
|
}
|
|
600
894
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXMTaskBoardCalendarViewComponent, decorators: [{
|
|
601
895
|
type: Component,
|
|
602
|
-
args: [{ selector: 'axm-task-board-calendar-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
|
|
603
|
-
|
|
896
|
+
args: [{ selector: 'axm-task-board-calendar-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
|
|
897
|
+
CommonModule,
|
|
898
|
+
AXSchedulerComponent,
|
|
899
|
+
AXPopoverModule,
|
|
900
|
+
AXButtonModule,
|
|
901
|
+
AXDropdownModule,
|
|
902
|
+
AXDecoratorModule,
|
|
903
|
+
AXTranslationModule,
|
|
904
|
+
], template: "<ax-scheduler\n [hasHeader]=\"false\"\n [holidays]=\"holidays\"\n [resources]=\"resources()\"\n [dataSource]=\"dataSource()\"\n [startingDate]=\"startingDate()\"\n [selectedView]=\"currentSchedulerView()\"\n [multiDayViewDaysCount]=\"vm.daysCount()\"\n (onAppointmentDrop)=\"onTaskDrop($event)\"\n (onActionClick)=\"handleActionClick($event)\"\n (onRangeChanged)=\"handleRangeChanged($event)\"\n (onSlotDblClicked)=\"onSlotDblClicked($event)\"\n (onAppointmentClicked)=\"onTaskClickHandler($event)\"\n [weekend]=\"weekendDays()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n></ax-scheduler>\n\n<!-- Task Detail Popover (Modern Google Calendar Style) -->\n<ax-popover\n #taskPopover\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [offsetY]=\"12\"\n [offsetX]=\"12\"\n [adaptivityEnabled]=\"true\"\n>\n @if (selectedTask()) {\n <div class=\"task-popover ax-shadow-md ax-border\">\n <!-- Header Section -->\n <div class=\"task-popover__header\">\n <div class=\"task-popover__title-section\">\n <div class=\"task-popover__title-row\">\n <h3 class=\"task-popover__title\" [title]=\"selectedTask()!.title\">{{ selectedTask()!.title }}</h3>\n <button type=\"button\" class=\"task-popover__close-btn\" (click)=\"closePopover()\" aria-label=\"Close\">\n <ax-icon class=\"ax-icon ax-icon-close\"></ax-icon>\n </button>\n </div>\n @if (selectedTask()!.description && !customComponentType()) {\n <p class=\"task-popover__description\">{{ selectedTask()!.description }}</p>\n }\n </div>\n </div>\n\n <!-- Custom Component or Default Content -->\n @if (customComponentType()) {\n <!-- Custom Component from Provider -->\n <div class=\"task-popover__custom-content\">\n <ng-container *ngComponentOutlet=\"customComponentType()!; inputs: customComponentInputs()!\"></ng-container>\n </div>\n } @else {\n <!-- Default Content Section -->\n <div class=\"task-popover__content\">\n <!-- Time -->\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-clock\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ formatDateRange(selectedTask()!) }}</span>\n </div>\n </div>\n\n <!-- Status -->\n @if (selectedTask()!.status) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-flag\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ selectedTask()!.status.title }}</span>\n </div>\n </div>\n }\n\n <!-- Assignee -->\n @if (selectedTask()!.assignee) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-user\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{\n selectedTask()!.assignee?.fullName || selectedTask()!.assignee?.username || 'Unassigned'\n }}</span>\n </div>\n </div>\n }\n\n <!-- Priority -->\n @if (selectedTask()!.priority) {\n <div class=\"task-popover__info-item\">\n <div\n class=\"task-popover__icon task-popover__icon--priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n <i class=\"fa-light fa-exclamation-circle\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span\n class=\"task-popover__info-text task-popover__priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n {{ selectedTask()!.priority }}\n </span>\n </div>\n </div>\n }\n </div>\n\n <!-- Actions Section -->\n <div class=\"task-popover__actions\">\n <!-- Task Actions from Provider -->\n @if (taskActions().length > 0) {\n <div class=\"task-popover__actions-group\">\n <!-- Primary Actions: Icon-only buttons -->\n @if (primaryActions().length > 0) {\n @for (action of primaryActions(); track action.name || action.title) {\n <ax-button\n [look]=\"'solid'\"\n [color]=\"getActionColor(action)\"\n (onClick)=\"executeAction(action)\"\n [disabled]=\"action.disabled === true\"\n [text]=\"action.title\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n }\n\n <!-- Secondary Actions: Dropdown with \"...\" button -->\n @if (secondaryActions().length > 0) {\n <ax-button [look]=\"'blank'\">\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-ellipsis-vertical\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of secondaryActions(); track action.name || action.title) {\n <ax-button-item\n [text]=\"action.title\"\n [disabled]=\"action.disabled === true\"\n (onClick)=\"executeAction(action)\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n</ax-popover>\n", styles: ["ax-scheduler{line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}.task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.task-popover__header{padding:20px 20px 16px;border-bottom:1px solid var(--ax-sys-color-border);background:linear-gradient(to bottom,var(--ax-sys-color-lightest-surface),var(--ax-sys-color-lighter-surface))}.task-popover__title-section{display:flex;flex-direction:column;gap:8px}.task-popover__title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.task-popover__title{font-size:18px;font-weight:600;line-height:1.4;color:var(--ax-sys-color-text-primary);margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-popover__close-btn{flex-shrink:0;background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ax-sys-color-text-neutral-600);transition:color .2s ease;border-radius:4px}.task-popover__close-btn:hover{color:var(--ax-sys-color-text-primary);background:var(--ax-sys-color-lighter-surface)}.task-popover__close-btn:active{background:var(--ax-sys-color-light-surface)}.task-popover__close-btn ax-icon{display:block;width:16px;height:16px}.task-popover__description{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-secondary);margin:0;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.task-popover__content{padding:16px 20px;display:flex;flex-direction:column;gap:12px;flex:1}.task-popover__info-item{display:flex;align-items:flex-start;gap:12px;min-height:24px}.task-popover__icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;color:var(--ax-sys-color-text-neutral-600);font-size:14px}.task-popover__icon i{display:block}.task-popover__icon--priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__time{font-weight:500;color:var(--ax-sys-color-text-primary);margin-left:4px}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}.task-popover__actions-group--default{margin-top:4px;padding-top:8px;border-top:1px solid var(--ax-sys-color-border)}.task-popover__action-divider{width:100%;height:1px;background:var(--ax-sys-color-border);margin:4px 0}.task-popover__action-btn{min-width:100px;white-space:nowrap}\n"] }]
|
|
905
|
+
}], propDecorators: { schedulerComponent: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXSchedulerComponent), { isSignal: true }] }], taskPopover: [{ type: i0.ViewChild, args: ['taskPopover', { isSignal: true }] }], resources: [{ type: i0.Input, args: [{ isSignal: true, alias: "resources", required: false }] }], startingDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "startingDate", required: false }] }], selectedView: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedView", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], onTaskClick: [{ type: i0.Output, args: ["onTaskClick"] }], onTaskChanged: [{ type: i0.Output, args: ["onTaskChanged"] }], onMonthSlotDblClicked: [{ type: i0.Output, args: ["onMonthSlotDblClicked"] }], onActionClick: [{ type: i0.Output, args: ["onActionClick"] }], component: [{ type: i0.Output, args: ["component"] }], onTaskRightClick: [{ type: i0.Output, args: ["onTaskRightClick"] }], onRangeChanged: [{ type: i0.Output, args: ["onRangeChanged"] }] } });
|
|
604
906
|
|
|
605
907
|
class AXMTaskBoardGridViewComponent {
|
|
606
908
|
constructor() {
|
|
@@ -870,12 +1172,20 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
870
1172
|
this.taskBoardService = inject(AXPTaskBoardService);
|
|
871
1173
|
this.popover = viewChild('popover', ...(ngDevMode ? [{ debugName: "popover" }] : []));
|
|
872
1174
|
this.calendar = viewChild('calendar', ...(ngDevMode ? [{ debugName: "calendar" }] : []));
|
|
1175
|
+
this.sidebarCalendar = viewChild('sidebarCalendar', ...(ngDevMode ? [{ debugName: "sidebarCalendar" }] : []));
|
|
873
1176
|
this.isReady = signal(false, ...(ngDevMode ? [{ debugName: "isReady" }] : []));
|
|
1177
|
+
this.taskTypes = signal([], ...(ngDevMode ? [{ debugName: "taskTypes" }] : []));
|
|
1178
|
+
this.calendarEventTypes = signal([], ...(ngDevMode ? [{ debugName: "calendarEventTypes" }] : []));
|
|
874
1179
|
this.resources = signal([], ...(ngDevMode ? [{ debugName: "resources" }] : []));
|
|
875
1180
|
this.isQueryParam = signal(false, ...(ngDevMode ? [{ debugName: "isQueryParam" }] : []));
|
|
1181
|
+
this.taskTypeAccordionCollapsed = signal(false, ...(ngDevMode ? [{ debugName: "taskTypeAccordionCollapsed" }] : []));
|
|
1182
|
+
this.calendarEventTypeAccordionCollapsed = signal(false, ...(ngDevMode ? [{ debugName: "calendarEventTypeAccordionCollapsed" }] : []));
|
|
876
1183
|
this.currentTask = signal(null, ...(ngDevMode ? [{ debugName: "currentTask" }] : []));
|
|
877
1184
|
this.currentViewMode = signal('calendar', ...(ngDevMode ? [{ debugName: "currentViewMode" }] : []));
|
|
878
1185
|
this.schedulerComponent = signal(null, ...(ngDevMode ? [{ debugName: "schedulerComponent" }] : []));
|
|
1186
|
+
this.dayCellTemplateRef = viewChild('dayCellTemplate', ...(ngDevMode ? [{ debugName: "dayCellTemplateRef" }] : []));
|
|
1187
|
+
this.dayCellTemplate = computed(() => this.dayCellTemplateRef(), ...(ngDevMode ? [{ debugName: "dayCellTemplate" }] : []));
|
|
1188
|
+
this.dayDataCache = signal(new Map(), ...(ngDevMode ? [{ debugName: "dayDataCache" }] : []));
|
|
879
1189
|
this.menuItems = signal([
|
|
880
1190
|
{
|
|
881
1191
|
key: 'calendar',
|
|
@@ -934,13 +1244,17 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
934
1244
|
if (this.vm.currentViewMode() === 'grid' ||
|
|
935
1245
|
this.vm.currentViewMode() === 'kanban' ||
|
|
936
1246
|
this.vm.currentViewMode() === 'status-grouped-grid') {
|
|
937
|
-
const
|
|
1247
|
+
const currentDate = this.vm.currentDate();
|
|
1248
|
+
if (!currentDate) {
|
|
1249
|
+
return '';
|
|
1250
|
+
}
|
|
1251
|
+
const start = this.calendarService.create(currentDate, this.localeService.activeProfile().calendar.system);
|
|
938
1252
|
const end = start.add('day', this.vm.daysCount() - 1);
|
|
939
1253
|
const startText = start.format('DD MMMM yyyy', { locale: this.localeService.activeProfile().calendar.system });
|
|
940
1254
|
const endText = end.format('DD MMMM yyyy', { locale: this.localeService.activeProfile().calendar.system });
|
|
941
1255
|
return `${startText} - ${endText}`;
|
|
942
1256
|
}
|
|
943
|
-
return this.schedulerComponent()?.currentDateText();
|
|
1257
|
+
return this.schedulerComponent()?.currentDateText() || '';
|
|
944
1258
|
}, ...(ngDevMode ? [{ debugName: "timeText" }] : []));
|
|
945
1259
|
this.calendarDepth = computed(() => {
|
|
946
1260
|
if (this.vm.currentViewMode() === 'grid' ||
|
|
@@ -948,8 +1262,12 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
948
1262
|
this.vm.currentViewMode() === 'status-grouped-grid') {
|
|
949
1263
|
return 'day';
|
|
950
1264
|
}
|
|
951
|
-
return this.schedulerComponent()?.calendarDepth();
|
|
1265
|
+
return this.schedulerComponent()?.calendarDepth() || 'day';
|
|
952
1266
|
}, ...(ngDevMode ? [{ debugName: "calendarDepth" }] : []));
|
|
1267
|
+
this.currentDateForCalendar = computed(() => {
|
|
1268
|
+
const date = this.vm.currentDate();
|
|
1269
|
+
return date || new Date();
|
|
1270
|
+
}, ...(ngDevMode ? [{ debugName: "currentDateForCalendar" }] : []));
|
|
953
1271
|
this.selectedViewMode = computed(() => {
|
|
954
1272
|
const currentMode = this.vm.currentViewMode();
|
|
955
1273
|
for (const category of this.menuItems()) {
|
|
@@ -970,11 +1288,16 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
970
1288
|
}, ...(ngDevMode ? [{ debugName: "selectedViewMode" }] : []));
|
|
971
1289
|
this.filter = computed(() => {
|
|
972
1290
|
const taskTypeNames = this.vm.selectedTaskTypeNames();
|
|
973
|
-
|
|
1291
|
+
// When nothing is selected (empty array), we want to show NO types
|
|
1292
|
+
// The service treats empty/undefined types as "show all providers"
|
|
1293
|
+
// To show none when nothing is selected, we pass a non-existent type name
|
|
1294
|
+
// This ensures filteredProviders.length === 0, resulting in empty results
|
|
1295
|
+
const types = taskTypeNames.length > 0 ? taskTypeNames : ['__NONE__'];
|
|
974
1296
|
const assigneeIds = this.vm.selectedAssigneeIds();
|
|
975
1297
|
const reporterIds = this.vm.selectedReporterIds();
|
|
976
1298
|
const priorities = this.vm.selectedPriorities();
|
|
977
|
-
|
|
1299
|
+
const currentDate = this.vm.currentDate() || new Date();
|
|
1300
|
+
let from = this.calendarService.create(currentDate, this.localeService.activeProfile().calendar.system);
|
|
978
1301
|
let end;
|
|
979
1302
|
const currentView = this.vm.currentViewMode();
|
|
980
1303
|
if (currentView === 'grid' ||
|
|
@@ -992,7 +1315,8 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
992
1315
|
end = from.endOf('day');
|
|
993
1316
|
}
|
|
994
1317
|
return {
|
|
995
|
-
|
|
1318
|
+
// Always include types - empty array means show no types, non-empty means show only selected types
|
|
1319
|
+
types,
|
|
996
1320
|
...(assigneeIds.length > 0 && { assigneeIds }),
|
|
997
1321
|
...(reporterIds.length > 0 && { reporterIds }),
|
|
998
1322
|
...(priorities.length > 0 && { priorities }),
|
|
@@ -1027,6 +1351,18 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
1027
1351
|
this.getResources();
|
|
1028
1352
|
this.schedulerComponent()?.refresh();
|
|
1029
1353
|
}, ...(ngDevMode ? [{ debugName: "refreshEffect" }] : []));
|
|
1354
|
+
this.calendarEventTypeRefreshEffect = effect(() => {
|
|
1355
|
+
this.vm.selectedCalendarEventTypeIds();
|
|
1356
|
+
// Refresh calendar view to update holidays when event types change
|
|
1357
|
+
this.schedulerComponent()?.refresh();
|
|
1358
|
+
}, ...(ngDevMode ? [{ debugName: "calendarEventTypeRefreshEffect" }] : []));
|
|
1359
|
+
this.dayDataCacheEffect = effect(async () => {
|
|
1360
|
+
// Update cache when filters or date change
|
|
1361
|
+
this.vm.currentDate();
|
|
1362
|
+
this.vm.selectedTaskTypeNames();
|
|
1363
|
+
this.vm.selectedCalendarEventTypeIds();
|
|
1364
|
+
await this.updateDayDataCache();
|
|
1365
|
+
}, ...(ngDevMode ? [{ debugName: "dayDataCacheEffect" }] : []));
|
|
1030
1366
|
this.rangeBasedViews = [
|
|
1031
1367
|
'grid',
|
|
1032
1368
|
'kanban',
|
|
@@ -1073,10 +1409,42 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
1073
1409
|
}
|
|
1074
1410
|
return null;
|
|
1075
1411
|
};
|
|
1412
|
+
this.taskTypeItems = computed(() => {
|
|
1413
|
+
return this.taskTypes().map((taskType) => ({
|
|
1414
|
+
id: taskType.name,
|
|
1415
|
+
text: taskType.title,
|
|
1416
|
+
icon: taskType.icon,
|
|
1417
|
+
}));
|
|
1418
|
+
}, ...(ngDevMode ? [{ debugName: "taskTypeItems" }] : []));
|
|
1419
|
+
this.selectedTaskTypeValues = computed(() => {
|
|
1420
|
+
return this.vm.selectedTaskTypeNames();
|
|
1421
|
+
}, ...(ngDevMode ? [{ debugName: "selectedTaskTypeValues" }] : []));
|
|
1422
|
+
this.calendarEventTypeItems = computed(() => {
|
|
1423
|
+
return this.calendarEventTypes().map((eventType) => ({
|
|
1424
|
+
id: eventType.id,
|
|
1425
|
+
text: eventType.title,
|
|
1426
|
+
icon: eventType.icon,
|
|
1427
|
+
color: eventType.color,
|
|
1428
|
+
}));
|
|
1429
|
+
}, ...(ngDevMode ? [{ debugName: "calendarEventTypeItems" }] : []));
|
|
1430
|
+
this.selectedCalendarEventTypeValues = computed(() => {
|
|
1431
|
+
return this.vm.selectedCalendarEventTypeIds();
|
|
1432
|
+
}, ...(ngDevMode ? [{ debugName: "selectedCalendarEventTypeValues" }] : []));
|
|
1076
1433
|
}
|
|
1077
1434
|
async ngOnInit() {
|
|
1078
1435
|
await super.ngOnInit();
|
|
1079
1436
|
await this.vm.initialize();
|
|
1437
|
+
// Load task types for checkbox filter
|
|
1438
|
+
const types = await this.taskBoardService.getTaskTypes();
|
|
1439
|
+
this.taskTypes.set(types);
|
|
1440
|
+
// Load calendar event types for checkbox filter
|
|
1441
|
+
const eventTypes = await this.taskBoardService.getCalendarEventTypes();
|
|
1442
|
+
this.calendarEventTypes.set(eventTypes.map((et) => ({
|
|
1443
|
+
id: et.id,
|
|
1444
|
+
title: et.title,
|
|
1445
|
+
})));
|
|
1446
|
+
// Initialize day data cache
|
|
1447
|
+
await this.updateDayDataCache();
|
|
1080
1448
|
this.router.events
|
|
1081
1449
|
.pipe(this.unsubscribe.takeUntilDestroy, filter((event) => event instanceof NavigationEnd), startWith(null))
|
|
1082
1450
|
.subscribe(async () => {
|
|
@@ -1148,6 +1516,64 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
1148
1516
|
this.popover()?.close();
|
|
1149
1517
|
dropdownPanel.close();
|
|
1150
1518
|
}
|
|
1519
|
+
async updateDayDataCache() {
|
|
1520
|
+
const currentDate = this.vm.currentDate();
|
|
1521
|
+
const monthStart = this.calendarService.create(currentDate).startOf('month').date;
|
|
1522
|
+
const monthEnd = this.calendarService.create(currentDate).endOf('month').date;
|
|
1523
|
+
// Get tasks for the month
|
|
1524
|
+
const tasks = await this.taskBoardService.getTasks({
|
|
1525
|
+
...this.filter(),
|
|
1526
|
+
range: { from: monthStart, end: monthEnd },
|
|
1527
|
+
});
|
|
1528
|
+
// Get events for the month
|
|
1529
|
+
const selectedEventTypeIds = this.vm.selectedCalendarEventTypeIds();
|
|
1530
|
+
// Pass selected calendar IDs (can be empty array to show no events)
|
|
1531
|
+
const events = await this.taskBoardService.getEvents({ from: monthStart, end: monthEnd }, selectedEventTypeIds);
|
|
1532
|
+
// Create a map of day -> count
|
|
1533
|
+
const dayCountMap = new Map();
|
|
1534
|
+
// Count tasks per day
|
|
1535
|
+
tasks.items.forEach((task) => {
|
|
1536
|
+
const taskStart = new Date(task.startDate);
|
|
1537
|
+
const taskEnd = new Date(task.endDate);
|
|
1538
|
+
const startDay = this.calendarService.create(taskStart).startOf('day');
|
|
1539
|
+
const endDay = this.calendarService.create(taskEnd).startOf('day');
|
|
1540
|
+
let currentDay = startDay;
|
|
1541
|
+
while (currentDay.compare(endDay, 'day') <= 0) {
|
|
1542
|
+
const dayKey = currentDay.format('YYYY-MM-DD');
|
|
1543
|
+
dayCountMap.set(dayKey, (dayCountMap.get(dayKey) || 0) + 1);
|
|
1544
|
+
currentDay = currentDay.add('day', 1);
|
|
1545
|
+
}
|
|
1546
|
+
});
|
|
1547
|
+
// Count events per day
|
|
1548
|
+
events.forEach((event) => {
|
|
1549
|
+
const eventDate = new Date(event.date);
|
|
1550
|
+
const dayKey = this.calendarService.create(eventDate).format('YYYY-MM-DD');
|
|
1551
|
+
dayCountMap.set(dayKey, (dayCountMap.get(dayKey) || 0) + 1);
|
|
1552
|
+
});
|
|
1553
|
+
this.dayDataCache.set(dayCountMap);
|
|
1554
|
+
this.sidebarCalendar()?.render();
|
|
1555
|
+
}
|
|
1556
|
+
getDayDataCount(date) {
|
|
1557
|
+
if (!date) {
|
|
1558
|
+
return 0;
|
|
1559
|
+
}
|
|
1560
|
+
try {
|
|
1561
|
+
// Get the native Date object from AXDateTime
|
|
1562
|
+
const dateObj = date.date || date._date;
|
|
1563
|
+
if (!dateObj) {
|
|
1564
|
+
return 0;
|
|
1565
|
+
}
|
|
1566
|
+
// Create a new AXDateTime from the date object for consistent formatting
|
|
1567
|
+
const nativeDate = dateObj instanceof Date ? dateObj : new Date(dateObj);
|
|
1568
|
+
const axDate = this.calendarService.create(nativeDate);
|
|
1569
|
+
const dayKey = axDate.format('YYYY-MM-DD');
|
|
1570
|
+
return this.dayDataCache().get(dayKey) || 0;
|
|
1571
|
+
}
|
|
1572
|
+
catch (error) {
|
|
1573
|
+
console.warn('Error getting day data count:', error);
|
|
1574
|
+
return 0;
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1151
1577
|
handleContextMenuItemClick(event) {
|
|
1152
1578
|
this.taskBoardService.executeCommand(event.item.data?.command, this.currentTask()?.provider ?? '');
|
|
1153
1579
|
}
|
|
@@ -1178,6 +1604,7 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
1178
1604
|
}
|
|
1179
1605
|
this.popover()?.close();
|
|
1180
1606
|
this.calendar()?.render();
|
|
1607
|
+
this.sidebarCalendar()?.render();
|
|
1181
1608
|
}
|
|
1182
1609
|
handleCalendarSlotClick(event) {
|
|
1183
1610
|
if (event.component.activeView !== event.component.depth)
|
|
@@ -1189,6 +1616,7 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
1189
1616
|
if (!selectionStartDate) {
|
|
1190
1617
|
this.vm.setRangeStartDate(clickedDate);
|
|
1191
1618
|
this.calendar()?.render();
|
|
1619
|
+
this.sidebarCalendar()?.render();
|
|
1192
1620
|
return;
|
|
1193
1621
|
}
|
|
1194
1622
|
const date1 = selectionStartDate.getTime();
|
|
@@ -1200,6 +1628,7 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
1200
1628
|
this.vm.setDaysCount(differenceInDays);
|
|
1201
1629
|
this.vm.setRangeStartDate(null);
|
|
1202
1630
|
this.calendar()?.render();
|
|
1631
|
+
this.sidebarCalendar()?.render();
|
|
1203
1632
|
this.popover()?.close();
|
|
1204
1633
|
return;
|
|
1205
1634
|
}
|
|
@@ -1216,6 +1645,7 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
1216
1645
|
this.vm.setCurrentDate(dateToSet);
|
|
1217
1646
|
this.popover()?.close();
|
|
1218
1647
|
this.calendar()?.render();
|
|
1648
|
+
this.sidebarCalendar()?.render();
|
|
1219
1649
|
}
|
|
1220
1650
|
/**
|
|
1221
1651
|
* Helper function to calculate the difference in whole days between two dates.
|
|
@@ -1245,6 +1675,17 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
1245
1675
|
this.vm.setCurrentDate(currentDate);
|
|
1246
1676
|
this.popover()?.close();
|
|
1247
1677
|
this.calendar()?.render();
|
|
1678
|
+
this.sidebarCalendar()?.render();
|
|
1679
|
+
}
|
|
1680
|
+
handleTaskTypeSelectionChange(selectedValues) {
|
|
1681
|
+
// If nothing is selected, pass empty array to show no types
|
|
1682
|
+
this.vm.setSelectedTaskTypeNames(selectedValues || [], this.isQueryParam());
|
|
1683
|
+
}
|
|
1684
|
+
handleCalendarEventTypeSelectionChange(selectedValues) {
|
|
1685
|
+
// If nothing is selected, pass empty array to show no types
|
|
1686
|
+
this.vm.setSelectedCalendarEventTypeIds(selectedValues || [], this.isQueryParam());
|
|
1687
|
+
// Refresh calendar view to update holidays
|
|
1688
|
+
this.schedulerComponent()?.refresh();
|
|
1248
1689
|
}
|
|
1249
1690
|
async loadFromRoute() {
|
|
1250
1691
|
const snapshot = this.activatedRoute.snapshot.queryParamMap;
|
|
@@ -1313,17 +1754,24 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
|
|
|
1313
1754
|
const resources = await this.taskBoardService.getResources(this.vm.selectedTaskTypeNames()[0] ?? '');
|
|
1314
1755
|
this.resources.set(resources);
|
|
1315
1756
|
}
|
|
1757
|
+
log(message) {
|
|
1758
|
+
console.log(message);
|
|
1759
|
+
}
|
|
1760
|
+
// protected layout = viewChild(AXPPageLayoutComponent);
|
|
1761
|
+
toggleStartSide() {
|
|
1762
|
+
this.layout()?.toggleStartSide();
|
|
1763
|
+
}
|
|
1316
1764
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXMTaskBoardPage, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
1317
1765
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXMTaskBoardPage, isStandalone: true, selector: "ng-component", providers: [
|
|
1318
1766
|
{
|
|
1319
1767
|
provide: AXPPageLayoutBase,
|
|
1320
1768
|
useExisting: AXMTaskBoardPage,
|
|
1321
1769
|
},
|
|
1322
|
-
], viewQueries: [{ propertyName: "popover", first: true, predicate: ["popover"], descendants: true, isSignal: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true, isSignal: true }, { propertyName: "contextMenu", first: true, predicate: ["rootContextMenu"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <axp-page-toolbar>\n <axp-layout-prefix class=\"sm:ax-flex-row ax-flex-col ax-items-start\">\n <ax-button [text]=\"(t('task-board.view.' + selectedViewMode().text, { scope: rootConfig.config.i18n}) | async)!\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #dropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ (t('task-board.' + category.text, { scope: rootConfig.config.i18n}) | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key,dropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text\n >{{ (t('task-board.view.' + child.text, { scope: rootConfig.config.i18n}) | async)! }}</ax-text\n >\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key,dropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ (t('task-board.' + category.text, { scope: rootConfig.config.i18n}) | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n\n <div class=\"ax-scheduler-header ax-w-max ax-sm sm:ax-md\">\n <ax-button look=\"blank\" (onClick)=\"changeDate(false)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-left arrow-icon\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"timeText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"changeDate(true)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-right arrow-icon\"></ax-icon>\n </ax-button>\n <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n #calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"vm.currentDate()\"\n class=\"ax-single-range-calendar\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n <ax-footer>\n <ax-button\n look=\"link\"\n color=\"primary\"\n [text]=\"todayButtonText()\"\n (onClick)=\"handleTodayClick()\"\n ></ax-button>\n </ax-footer>\n </ax-calendar>\n </div>\n </ax-popover>\n </div>\n </axp-layout-prefix>\n\n <axp-layout-suffix>\n <ax-button [text]=\"t('task-board.filter.title', { scope: rootConfig.config.i18n }) | async\">\n <ax-prefix><ax-icon icon=\"fa-{{vm.activeFilterCount()?'solid':'light'}} fa-filter\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #filterDropdownPanel (onOpened)=\"filtersComponent.resetContextToViewModel()\">\n <axm-task-board-filters\n #filtersComponent\n [isQueryParam]=\"isQueryParam()\"\n (applyClicked)=\"filterDropdownPanel.close()\"\n ></axm-task-board-filters>\n </ax-dropdown-panel>\n </ax-button>\n\n @if(deviceService.isLarge()) {\n <ax-button (onClick)=\"vm.toggleDetailPanel()\">\n <ax-icon icon=\"{{ vm.isDetailPanelOpen() ? 'fa-solid fa-square-info' : 'fa-light fa-square-info' }}\"></ax-icon>\n </ax-button>\n }\n </axp-layout-suffix>\n </axp-page-toolbar>\n <axp-page-content class=\"ax-flex ax-flex-row ax-gap-2\">\n @if (isReady()) { @switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\"\n [tasks]=\"resolvedTasks()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-kanban-view>\n } @case('grid') {\n <axm-task-board-grid-view\n class=\"ax-h-full ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-grid-view>\n } @case('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-status-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\"\n [startingDate]=\"vm.currentDate()\"\n [dataSource]=\"schedulerDataSource\"\n (onTaskClick)=\"vm.selectTask($event)\"\n [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\"\n (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"\n ></axm-task-board-calendar-view>\n } }\n <ax-context-menu\n #rootContextMenu\n [closeOn]=\"'leave'\"\n [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n } } @else {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-w-full ax-h-full\">\n <ax-loading></ax-loading>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n", styles: ["html[dir=rtl] axp-page-layout axp-page-toolbar axp-layout-prefix .ax-scheduler-header .arrow-icon:before{-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scaleX(-1)}.ax-single-range-calendar .ax-range-start,.ax-single-range-calendar .ax-range-end{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.85)!important}.ax-single-range-calendar .ax-range-start:hover,.ax-single-range-calendar .ax-range-end:hover{background-color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-single-range-calendar .ax-range-start.ax-state-holiday,.ax-single-range-calendar .ax-range-end.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.85)!important}.ax-single-range-calendar .ax-range-between{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.65)}.ax-single-range-calendar .ax-range-between.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.65)}.ax-single-range-calendar ax-footer{display:flex;justify-content:center;border-color:rgba(var(--ax-comp-calendar-view-header-border-color));border-top-width:var(--ax-comp-calendar-view-header-border-width, 1px)}axp-page-content:not(:has(axm-task-board-status-grouped-grid-view,axm-task-board-time-grouped-grid-view)){overflow-y:hidden}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
|
|
1770
|
+
], viewQueries: [{ propertyName: "popover", first: true, predicate: ["popover"], descendants: true, isSignal: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true, isSignal: true }, { propertyName: "sidebarCalendar", first: true, predicate: ["sidebarCalendar"], descendants: true, isSignal: true }, { propertyName: "dayCellTemplateRef", first: true, predicate: ["dayCellTemplate"], descendants: true, isSignal: true }, { propertyName: "contextMenu", first: true, predicate: ["rootContextMenu"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <axp-layout-start-side class=\"ax-border-e ax-lightest-surface ax-h-full\">\n <axp-layout-header class=\"ax-p-4 ax-border-b\">\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'sidebar' }\"></ng-container>\n </axp-layout-header>\n\n <axp-layout-content class=\"ax-flex ax-flex-col ax-min-h-0 ax-overflow-y-auto\">\n <div class=\"ax-p-4 ax-flex ax-flex-col ax-gap-6\">\n <div class=\"ax-flex ax-flex-col ax-gap-3\">\n <!-- <h3 class=\"ax-text-sm ax-font-semibold ax-text-neutral-800 ax-uppercase ax-tracking-wide\">\n {{ (t('task-board.terms.calendar', { scope: rootConfig.config.i18n}) | async) }}\n </h3> -->\n <ax-calendar #sidebarCalendar [type]=\"calendarType()\" [depth]=\"calendarDepth()\" [cellClass]=\"getCellClass\"\n [ngModel]=\"currentDateForCalendar()\" [dayCellTemplate]=\"dayCellTemplate\"\n class=\"ax-single-range-calendar ax-border ax-rounded-lg\" (onSlotClick)=\"handleCalendarSlotClick($event)\">\n </ax-calendar>\n </div>\n\n <div axAccordionGroup [accordion]=\"false\">\n <div class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\" axAccordionItem\n #taskTypeAccordion=\"axAccordionItem\">\n <div class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader>\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ (t('task-board.filter.task-type', { scope: rootConfig.config.i18n}) | async)! }}\n </h3>\n <ax-icon [icon]=\"taskTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"></ax-icon>\n </div>\n <div axAccordionItemContent>\n <div class=\"ax-pt-2\">\n <ax-selection-list [items]=\"taskTypeItems()\" [ngModel]=\"selectedTaskTypeValues()\"\n (onValueChanged)=\"handleTaskTypeSelectionChange($event.value)\" direction=\"vertical\" [multiple]=\"true\"\n [showControl]=\"true\" valueField=\"id\" textField=\"text\">\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n </div>\n </div>\n\n <div class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\" axAccordionItem\n #calendarEventTypeAccordion=\"axAccordionItem\">\n <div class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader>\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.calendars' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarEventTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"></ax-icon>\n </div>\n <div axAccordionItemContent>\n <div class=\"ax-pt-2\">\n <ax-selection-list [items]=\"calendarEventTypeItems()\" [ngModel]=\"selectedCalendarEventTypeValues()\"\n (onValueChanged)=\"handleCalendarEventTypeSelectionChange($event.value)\" direction=\"vertical\"\n [multiple]=\"true\" [showControl]=\"true\" valueField=\"id\" textField=\"text\">\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n </div>\n </div>\n </div>\n </div>\n </axp-layout-content>\n </axp-layout-start-side>\n <axp-page-toolbar>\n <axp-layout-prefix class=\"sm:ax-flex-row ax-flex-col ax-items-start\">\n <div class=\"ax-scheduler-header ax-w-max ax-sm sm:ax-md\">\n <ax-button look=\"blank\" (onClick)=\"changeDate(false)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-left arrow-icon\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"timeText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"changeDate(true)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-right arrow-icon\"></ax-icon>\n </ax-button>\n <!-- <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n #calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"vm.currentDate()\"\n class=\"ax-single-range-calendar\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n <ax-footer>\n <ax-button\n look=\"link\"\n color=\"primary\"\n [text]=\"todayButtonText()\"\n (onClick)=\"handleTodayClick()\"\n ></ax-button>\n </ax-footer>\n </ax-calendar>\n </div>\n </ax-popover> -->\n </div>\n </axp-layout-prefix>\n\n <axp-layout-suffix>\n @if (deviceService.isSmall()) {\n <ax-button id=\"axp-toolbar-btn-filters\" (onClick)=\"toggleStartSide()\" [iconOnly]=\"true\" [color]=\"'default'\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button>\n }\n <!-- @if (!deviceService.isSmall()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'toolbar' }\"></ng-container>\n } -->\n <ax-button [text]=\"t('task-board.filter.title', { scope: rootConfig.config.i18n }) | async\">\n <ax-prefix><ax-icon icon=\"fa-{{vm.activeFilterCount()?'solid':'light'}} fa-filter\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #filterDropdownPanel (onOpened)=\"filtersComponent.resetContextToViewModel()\">\n <axm-task-board-filters #filtersComponent [isQueryParam]=\"isQueryParam()\" [excludeTaskType]=\"true\"\n (applyClicked)=\"filterDropdownPanel.close()\"></axm-task-board-filters>\n </ax-dropdown-panel>\n </ax-button>\n\n <!-- @if(deviceService.isLarge()) {\n <ax-button (onClick)=\"vm.toggleDetailPanel()\">\n <ax-icon icon=\"{{ vm.isDetailPanelOpen() ? 'fa-solid fa-square-info' : 'fa-light fa-square-info' }}\"></ax-icon>\n </ax-button>\n } -->\n </axp-layout-suffix>\n </axp-page-toolbar>\n <axp-page-content class=\"ax-flex ax-flex-row ax-gap-2\">\n @if (isReady()) { @switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\" [tasks]=\"resolvedTasks()\"\n (onTaskClick)=\"vm.selectTask($event)\" (onActionClick)=\"handleContextMenu($event)\"></axm-task-board-kanban-view>\n } @case('grid') {\n <axm-task-board-grid-view class=\"ax-h-full ax-w-full ax-min-w-0\" [dataSource]=\"gridDataSource\"\n (onTaskClick)=\"vm.selectTask($event)\" (onActionClick)=\"handleContextMenu($event)\"></axm-task-board-grid-view>\n } @case('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n (onActionClick)=\"handleContextMenu($event)\"></axm-task-board-status-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\" [startingDate]=\"vm.currentDate()\" [dataSource]=\"schedulerDataSource\"\n (onTaskClick)=\"vm.selectTask($event)\" [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\" (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"></axm-task-board-calendar-view>\n } }\n <ax-context-menu #rootContextMenu [closeOn]=\"'leave'\" [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\" (onItemClick)=\"handleContextMenuItemClick($event)\">\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n } } @else {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-w-full ax-h-full\">\n <ax-loading></ax-loading>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #viewSelectorTemplate let-location=\"location\">\n @if (location === 'sidebar') {\n <ax-button [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\"\n class=\"ax-w-full\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #sidebarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n } @else {\n <ax-button [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #toolbarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n }\n</ng-template>\n\n<ng-template #dayCellTemplate let-slot>\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\">\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? slot.slot.date?.day ?? '' }}</span>\n @if (slot.slot.date && getDayDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>", styles: ["html[dir=rtl] axp-page-layout axp-page-toolbar axp-layout-prefix .ax-scheduler-header .arrow-icon:before{-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scaleX(-1)}.ax-single-range-calendar .ax-range-start,.ax-single-range-calendar .ax-range-end{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.85)!important}.ax-single-range-calendar .ax-range-start:hover,.ax-single-range-calendar .ax-range-end:hover{background-color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-single-range-calendar .ax-range-start.ax-state-holiday,.ax-single-range-calendar .ax-range-end.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.85)!important}.ax-single-range-calendar .ax-range-between{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.65)}.ax-single-range-calendar .ax-range-between.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.65)}.ax-single-range-calendar ax-footer{display:flex;justify-content:center;border-color:rgba(var(--ax-comp-calendar-view-header-border-color));border-top-width:var(--ax-comp-calendar-view-header-border-width, 1px)}axp-page-content:not(:has(axm-task-board-status-grouped-grid-view,axm-task-board-time-grouped-grid-view)){overflow-y:hidden}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
|
|
1323
1771
|
//
|
|
1324
|
-
AXMenuModule }, { kind: "component", type:
|
|
1772
|
+
AXMenuModule }, { kind: "component", type: i3$1.AXMenuItemComponent, selector: "ax-menu-item", inputs: ["name", "data", "disabled", "color"], outputs: ["onClick"] }, { kind: "component", type: i3$1.AXMenuComponent, selector: "ax-menu", inputs: ["orientation", "openOn", "closeOn", "items", "hasArrow"], outputs: ["onItemClick"] }, { kind: "component", type: i3$1.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5$1.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i5.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i5.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i7.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i8.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXAccordionModule }, { kind: "ngmodule", type: AXAccordionCdkModule }, { kind: "directive", type: i9.AXAccordionGroupDirective, selector: "[axAccordionGroup]", inputs: ["accordion", "activeIndex", "collapsedOnItemClick"], exportAs: ["axAccordionGroup"] }, { kind: "directive", type: i9.AXAccordionItemContentDirective, selector: "[axAccordionItemContent]", inputs: ["transition"], exportAs: ["axAccordionItemContent"] }, { kind: "directive", type: i9.AXAccordionItemHeaderDirective, selector: "[axAccordionItemHeader]", exportAs: ["axAccordionItemHeader"] }, { kind: "directive", type: i9.AXAccordionItemDirective, selector: "[axAccordionItem]", inputs: ["isCollapsed"], outputs: ["isCollapsedChange", "onClick"], exportAs: ["axAccordionItem"] }, { kind: "component", type:
|
|
1325
1773
|
//
|
|
1326
|
-
AXPThemeLayoutBlockComponent, selector: " axp-page-content, axp-page-footer-container, axp-page-footer, axp-page-header, axp-page-header-container, axp-page-toolbar, axp-layout-content, axp-layout-page-content, axp-layout-sections, axp-layout-body, axp-layout-page-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title-bar, axp-layout-title, axp-layout-title-actions, axp-layout-nav-button, axp-layout-description, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXMTaskBoardCalendarViewComponent, selector: "axm-task-board-calendar-view", inputs: ["resources", "startingDate", "selectedView", "dataSource"], outputs: ["onTaskClick", "onTaskChanged", "onMonthSlotDblClicked", "onActionClick", "component", "onTaskRightClick", "onRangeChanged"] }, { kind: "component", type: AXMTaskBoardKanbanViewComponent, selector: "axm-task-board-kanban-view", inputs: ["tasks"], outputs: ["tasksChange", "onTaskClick", "onTaskChanged", "component", "onActionClick"] }, { kind: "component", type: AXMTaskBoardGridViewComponent, selector: "axm-task-board-grid-view", inputs: ["dataSource"], outputs: ["onTaskClick", "onActionClick"] }, { kind: "component", type: AXMTaskBoardStatusGroupedGridViewComponent, selector: "axm-task-board-status-grouped-grid-view", inputs: ["provider", "dataSource"], outputs: ["onActionClick"] }, { kind: "component", type: AXMTaskBoardDetailPanel, selector: "axm-task-board-detail-panel" }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type:
|
|
1774
|
+
AXPThemeLayoutBlockComponent, selector: " axp-page-content, axp-page-footer-container, axp-page-footer, axp-page-header, axp-page-header-container, axp-page-toolbar, axp-layout-content, axp-layout-page-content, axp-layout-sections, axp-layout-body, axp-layout-page-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title-bar, axp-layout-title, axp-layout-title-actions, axp-layout-nav-button, axp-layout-description, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXMTaskBoardCalendarViewComponent, selector: "axm-task-board-calendar-view", inputs: ["resources", "startingDate", "selectedView", "dataSource"], outputs: ["onTaskClick", "onTaskChanged", "onMonthSlotDblClicked", "onActionClick", "component", "onTaskRightClick", "onRangeChanged"] }, { kind: "component", type: AXMTaskBoardKanbanViewComponent, selector: "axm-task-board-kanban-view", inputs: ["tasks"], outputs: ["tasksChange", "onTaskClick", "onTaskChanged", "component", "onActionClick"] }, { kind: "component", type: AXMTaskBoardGridViewComponent, selector: "axm-task-board-grid-view", inputs: ["dataSource"], outputs: ["onTaskClick", "onActionClick"] }, { kind: "component", type: AXMTaskBoardStatusGroupedGridViewComponent, selector: "axm-task-board-status-grouped-grid-view", inputs: ["provider", "dataSource"], outputs: ["onActionClick"] }, { kind: "component", type: AXMTaskBoardDetailPanel, selector: "axm-task-board-detail-panel" }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: AXCalendarComponent, selector: "ax-calendar", inputs: ["rtl", "readonly", "value", "name", "disabled", "depth", "activeView", "minValue", "maxValue", "disabledDates", "holidayDates", "type", "dayCellTemplate", "monthCellTemplate", "yearCellTemplate", "cellClass", "showNavigation", "count", "id", "weekend", "weekdays"], outputs: ["onOptionChanged", "valueChange", "onValueChanged", "minValueChange", "maxValueChange", "onBlur", "onFocus", "depthChange", "typeChange", "activeViewChange", "disabledDatesChange", "holidayDatesChange", "onNavigate", "onSlotClick", "countChange"] }, { kind: "component", type: AXMTaskBoardFiltersComponent, selector: "axm-task-board-filters", inputs: ["isQueryParam", "excludeTaskType"], outputs: ["applyClicked"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i10.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "size", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }, { kind: "component", type: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "component", type: AXPThemeLayoutHeaderComponent, selector: "axp-layout-header" }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
1327
1775
|
}
|
|
1328
1776
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXMTaskBoardPage, decorators: [{
|
|
1329
1777
|
type: Component,
|
|
@@ -1340,6 +1788,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
|
|
|
1340
1788
|
AXLoadingModule,
|
|
1341
1789
|
AXBreadcrumbsModule,
|
|
1342
1790
|
AXBadgeModule,
|
|
1791
|
+
AXAccordionModule,
|
|
1792
|
+
AXAccordionCdkModule,
|
|
1343
1793
|
//
|
|
1344
1794
|
AXPThemeLayoutBlockComponent,
|
|
1345
1795
|
AXPPageLayoutComponent,
|
|
@@ -1352,13 +1802,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
|
|
|
1352
1802
|
AXPopoverModule,
|
|
1353
1803
|
AXCalendarComponent,
|
|
1354
1804
|
AXMTaskBoardFiltersComponent,
|
|
1805
|
+
AXCheckBoxModule,
|
|
1806
|
+
AXFormModule,
|
|
1807
|
+
AXLabelModule,
|
|
1808
|
+
AXSelectionListModule,
|
|
1809
|
+
AXPThemeLayoutStartSideComponent,
|
|
1810
|
+
AXPThemeLayoutHeaderComponent,
|
|
1355
1811
|
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
|
|
1356
1812
|
{
|
|
1357
1813
|
provide: AXPPageLayoutBase,
|
|
1358
1814
|
useExisting: AXMTaskBoardPage,
|
|
1359
1815
|
},
|
|
1360
|
-
], template: "<axp-page-layout *translate=\"let t\">\n <axp-page-toolbar>\n <axp-layout-prefix class=\"sm:ax-flex-row ax-flex-col ax-items-start\">\n <ax-button [text]=\"(t('task-board.view.' + selectedViewMode().text, { scope: rootConfig.config.i18n}) | async)!\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #dropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ (t('task-board.' + category.text, { scope: rootConfig.config.i18n}) | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key,dropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text\n >{{ (t('task-board.view.' + child.text, { scope: rootConfig.config.i18n}) | async)! }}</ax-text\n >\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key,dropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ (t('task-board.' + category.text, { scope: rootConfig.config.i18n}) | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n\n <div class=\"ax-scheduler-header ax-w-max ax-sm sm:ax-md\">\n <ax-button look=\"blank\" (onClick)=\"changeDate(false)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-left arrow-icon\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"timeText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"changeDate(true)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-right arrow-icon\"></ax-icon>\n </ax-button>\n <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n #calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"vm.currentDate()\"\n class=\"ax-single-range-calendar\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n <ax-footer>\n <ax-button\n look=\"link\"\n color=\"primary\"\n [text]=\"todayButtonText()\"\n (onClick)=\"handleTodayClick()\"\n ></ax-button>\n </ax-footer>\n </ax-calendar>\n </div>\n </ax-popover>\n </div>\n </axp-layout-prefix>\n\n <axp-layout-suffix>\n <ax-button [text]=\"t('task-board.filter.title', { scope: rootConfig.config.i18n }) | async\">\n <ax-prefix><ax-icon icon=\"fa-{{vm.activeFilterCount()?'solid':'light'}} fa-filter\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #filterDropdownPanel (onOpened)=\"filtersComponent.resetContextToViewModel()\">\n <axm-task-board-filters\n #filtersComponent\n [isQueryParam]=\"isQueryParam()\"\n (applyClicked)=\"filterDropdownPanel.close()\"\n ></axm-task-board-filters>\n </ax-dropdown-panel>\n </ax-button>\n\n @if(deviceService.isLarge()) {\n <ax-button (onClick)=\"vm.toggleDetailPanel()\">\n <ax-icon icon=\"{{ vm.isDetailPanelOpen() ? 'fa-solid fa-square-info' : 'fa-light fa-square-info' }}\"></ax-icon>\n </ax-button>\n }\n </axp-layout-suffix>\n </axp-page-toolbar>\n <axp-page-content class=\"ax-flex ax-flex-row ax-gap-2\">\n @if (isReady()) { @switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\"\n [tasks]=\"resolvedTasks()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-kanban-view>\n } @case('grid') {\n <axm-task-board-grid-view\n class=\"ax-h-full ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-grid-view>\n } @case('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-status-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\"\n [startingDate]=\"vm.currentDate()\"\n [dataSource]=\"schedulerDataSource\"\n (onTaskClick)=\"vm.selectTask($event)\"\n [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\"\n (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"\n ></axm-task-board-calendar-view>\n } }\n <ax-context-menu\n #rootContextMenu\n [closeOn]=\"'leave'\"\n [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n } } @else {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-w-full ax-h-full\">\n <ax-loading></ax-loading>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n", styles: ["html[dir=rtl] axp-page-layout axp-page-toolbar axp-layout-prefix .ax-scheduler-header .arrow-icon:before{-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scaleX(-1)}.ax-single-range-calendar .ax-range-start,.ax-single-range-calendar .ax-range-end{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.85)!important}.ax-single-range-calendar .ax-range-start:hover,.ax-single-range-calendar .ax-range-end:hover{background-color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-single-range-calendar .ax-range-start.ax-state-holiday,.ax-single-range-calendar .ax-range-end.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.85)!important}.ax-single-range-calendar .ax-range-between{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.65)}.ax-single-range-calendar .ax-range-between.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.65)}.ax-single-range-calendar ax-footer{display:flex;justify-content:center;border-color:rgba(var(--ax-comp-calendar-view-header-border-color));border-top-width:var(--ax-comp-calendar-view-header-border-width, 1px)}axp-page-content:not(:has(axm-task-board-status-grouped-grid-view,axm-task-board-time-grouped-grid-view)){overflow-y:hidden}\n"] }]
|
|
1361
|
-
}], propDecorators: { popover: [{ type: i0.ViewChild, args: ['popover', { isSignal: true }] }], calendar: [{ type: i0.ViewChild, args: ['calendar', { isSignal: true }] }], contextMenu: [{ type: i0.ViewChild, args: ['rootContextMenu', { isSignal: true }] }] } });
|
|
1816
|
+
], template: "<axp-page-layout *translate=\"let t\">\n <axp-layout-start-side class=\"ax-border-e ax-lightest-surface ax-h-full\">\n <axp-layout-header class=\"ax-p-4 ax-border-b\">\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'sidebar' }\"></ng-container>\n </axp-layout-header>\n\n <axp-layout-content class=\"ax-flex ax-flex-col ax-min-h-0 ax-overflow-y-auto\">\n <div class=\"ax-p-4 ax-flex ax-flex-col ax-gap-6\">\n <div class=\"ax-flex ax-flex-col ax-gap-3\">\n <!-- <h3 class=\"ax-text-sm ax-font-semibold ax-text-neutral-800 ax-uppercase ax-tracking-wide\">\n {{ (t('task-board.terms.calendar', { scope: rootConfig.config.i18n}) | async) }}\n </h3> -->\n <ax-calendar #sidebarCalendar [type]=\"calendarType()\" [depth]=\"calendarDepth()\" [cellClass]=\"getCellClass\"\n [ngModel]=\"currentDateForCalendar()\" [dayCellTemplate]=\"dayCellTemplate\"\n class=\"ax-single-range-calendar ax-border ax-rounded-lg\" (onSlotClick)=\"handleCalendarSlotClick($event)\">\n </ax-calendar>\n </div>\n\n <div axAccordionGroup [accordion]=\"false\">\n <div class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\" axAccordionItem\n #taskTypeAccordion=\"axAccordionItem\">\n <div class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader>\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ (t('task-board.filter.task-type', { scope: rootConfig.config.i18n}) | async)! }}\n </h3>\n <ax-icon [icon]=\"taskTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"></ax-icon>\n </div>\n <div axAccordionItemContent>\n <div class=\"ax-pt-2\">\n <ax-selection-list [items]=\"taskTypeItems()\" [ngModel]=\"selectedTaskTypeValues()\"\n (onValueChanged)=\"handleTaskTypeSelectionChange($event.value)\" direction=\"vertical\" [multiple]=\"true\"\n [showControl]=\"true\" valueField=\"id\" textField=\"text\">\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n </div>\n </div>\n\n <div class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\" axAccordionItem\n #calendarEventTypeAccordion=\"axAccordionItem\">\n <div class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader>\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.calendars' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarEventTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"></ax-icon>\n </div>\n <div axAccordionItemContent>\n <div class=\"ax-pt-2\">\n <ax-selection-list [items]=\"calendarEventTypeItems()\" [ngModel]=\"selectedCalendarEventTypeValues()\"\n (onValueChanged)=\"handleCalendarEventTypeSelectionChange($event.value)\" direction=\"vertical\"\n [multiple]=\"true\" [showControl]=\"true\" valueField=\"id\" textField=\"text\">\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n </div>\n </div>\n </div>\n </div>\n </axp-layout-content>\n </axp-layout-start-side>\n <axp-page-toolbar>\n <axp-layout-prefix class=\"sm:ax-flex-row ax-flex-col ax-items-start\">\n <div class=\"ax-scheduler-header ax-w-max ax-sm sm:ax-md\">\n <ax-button look=\"blank\" (onClick)=\"changeDate(false)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-left arrow-icon\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"timeText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"changeDate(true)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-right arrow-icon\"></ax-icon>\n </ax-button>\n <!-- <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n #calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"vm.currentDate()\"\n class=\"ax-single-range-calendar\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n <ax-footer>\n <ax-button\n look=\"link\"\n color=\"primary\"\n [text]=\"todayButtonText()\"\n (onClick)=\"handleTodayClick()\"\n ></ax-button>\n </ax-footer>\n </ax-calendar>\n </div>\n </ax-popover> -->\n </div>\n </axp-layout-prefix>\n\n <axp-layout-suffix>\n @if (deviceService.isSmall()) {\n <ax-button id=\"axp-toolbar-btn-filters\" (onClick)=\"toggleStartSide()\" [iconOnly]=\"true\" [color]=\"'default'\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button>\n }\n <!-- @if (!deviceService.isSmall()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'toolbar' }\"></ng-container>\n } -->\n <ax-button [text]=\"t('task-board.filter.title', { scope: rootConfig.config.i18n }) | async\">\n <ax-prefix><ax-icon icon=\"fa-{{vm.activeFilterCount()?'solid':'light'}} fa-filter\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #filterDropdownPanel (onOpened)=\"filtersComponent.resetContextToViewModel()\">\n <axm-task-board-filters #filtersComponent [isQueryParam]=\"isQueryParam()\" [excludeTaskType]=\"true\"\n (applyClicked)=\"filterDropdownPanel.close()\"></axm-task-board-filters>\n </ax-dropdown-panel>\n </ax-button>\n\n <!-- @if(deviceService.isLarge()) {\n <ax-button (onClick)=\"vm.toggleDetailPanel()\">\n <ax-icon icon=\"{{ vm.isDetailPanelOpen() ? 'fa-solid fa-square-info' : 'fa-light fa-square-info' }}\"></ax-icon>\n </ax-button>\n } -->\n </axp-layout-suffix>\n </axp-page-toolbar>\n <axp-page-content class=\"ax-flex ax-flex-row ax-gap-2\">\n @if (isReady()) { @switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\" [tasks]=\"resolvedTasks()\"\n (onTaskClick)=\"vm.selectTask($event)\" (onActionClick)=\"handleContextMenu($event)\"></axm-task-board-kanban-view>\n } @case('grid') {\n <axm-task-board-grid-view class=\"ax-h-full ax-w-full ax-min-w-0\" [dataSource]=\"gridDataSource\"\n (onTaskClick)=\"vm.selectTask($event)\" (onActionClick)=\"handleContextMenu($event)\"></axm-task-board-grid-view>\n } @case('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n (onActionClick)=\"handleContextMenu($event)\"></axm-task-board-status-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\" [startingDate]=\"vm.currentDate()\" [dataSource]=\"schedulerDataSource\"\n (onTaskClick)=\"vm.selectTask($event)\" [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\" (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"></axm-task-board-calendar-view>\n } }\n <ax-context-menu #rootContextMenu [closeOn]=\"'leave'\" [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\" (onItemClick)=\"handleContextMenuItemClick($event)\">\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n } } @else {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-w-full ax-h-full\">\n <ax-loading></ax-loading>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #viewSelectorTemplate let-location=\"location\">\n @if (location === 'sidebar') {\n <ax-button [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\"\n class=\"ax-w-full\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #sidebarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n } @else {\n <ax-button [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #toolbarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n }\n</ng-template>\n\n<ng-template #dayCellTemplate let-slot>\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\">\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? slot.slot.date?.day ?? '' }}</span>\n @if (slot.slot.date && getDayDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>", styles: ["html[dir=rtl] axp-page-layout axp-page-toolbar axp-layout-prefix .ax-scheduler-header .arrow-icon:before{-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scaleX(-1)}.ax-single-range-calendar .ax-range-start,.ax-single-range-calendar .ax-range-end{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.85)!important}.ax-single-range-calendar .ax-range-start:hover,.ax-single-range-calendar .ax-range-end:hover{background-color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-single-range-calendar .ax-range-start.ax-state-holiday,.ax-single-range-calendar .ax-range-end.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.85)!important}.ax-single-range-calendar .ax-range-between{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.65)}.ax-single-range-calendar .ax-range-between.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.65)}.ax-single-range-calendar ax-footer{display:flex;justify-content:center;border-color:rgba(var(--ax-comp-calendar-view-header-border-color));border-top-width:var(--ax-comp-calendar-view-header-border-width, 1px)}axp-page-content:not(:has(axm-task-board-status-grouped-grid-view,axm-task-board-time-grouped-grid-view)){overflow-y:hidden}\n"] }]
|
|
1817
|
+
}], propDecorators: { popover: [{ type: i0.ViewChild, args: ['popover', { isSignal: true }] }], calendar: [{ type: i0.ViewChild, args: ['calendar', { isSignal: true }] }], sidebarCalendar: [{ type: i0.ViewChild, args: ['sidebarCalendar', { isSignal: true }] }], dayCellTemplateRef: [{ type: i0.ViewChild, args: ['dayCellTemplate', { isSignal: true }] }], contextMenu: [{ type: i0.ViewChild, args: ['rootContextMenu', { isSignal: true }] }] } });
|
|
1362
1818
|
|
|
1363
1819
|
export { AXMTaskBoardPage };
|
|
1364
|
-
//# sourceMappingURL=acorex-modules-task-management-task-board.page-
|
|
1820
|
+
//# sourceMappingURL=acorex-modules-task-management-task-board.page-Cm8wJD-y.mjs.map
|