@acorex/modules 20.0.22 → 20.0.25

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.
Files changed (35) hide show
  1. package/document-management/index.d.ts +3 -0
  2. package/fesm2022/{acorex-modules-document-management-acorex-modules-document-management-CJYBHKUf.mjs → acorex-modules-document-management-acorex-modules-document-management-Bte3VGKC.mjs} +243 -51
  3. package/fesm2022/acorex-modules-document-management-acorex-modules-document-management-Bte3VGKC.mjs.map +1 -0
  4. package/fesm2022/{acorex-modules-document-management-attachment-widget.component-Cc-hsCCX.mjs → acorex-modules-document-management-attachment-widget.component-Cc0anIMV.mjs} +2 -2
  5. package/fesm2022/{acorex-modules-document-management-attachment-widget.component-Cc-hsCCX.mjs.map → acorex-modules-document-management-attachment-widget.component-Cc0anIMV.mjs.map} +1 -1
  6. package/fesm2022/{acorex-modules-document-management-create-folder-dialog.component-CMhwz1-0.mjs → acorex-modules-document-management-create-folder-dialog.component-BNcu8bzT.mjs} +2 -2
  7. package/fesm2022/{acorex-modules-document-management-create-folder-dialog.component-CMhwz1-0.mjs.map → acorex-modules-document-management-create-folder-dialog.component-BNcu8bzT.mjs.map} +1 -1
  8. package/fesm2022/{acorex-modules-document-management-details-view.component-CqK0rCnR.mjs → acorex-modules-document-management-details-view.component-BeN0NPcy.mjs} +2 -2
  9. package/fesm2022/{acorex-modules-document-management-details-view.component-CqK0rCnR.mjs.map → acorex-modules-document-management-details-view.component-BeN0NPcy.mjs.map} +1 -1
  10. package/fesm2022/{acorex-modules-document-management-drive-choose.component-r8KKbY1d.mjs → acorex-modules-document-management-drive-choose.component-B66wODCQ.mjs} +2 -2
  11. package/fesm2022/{acorex-modules-document-management-drive-choose.component-r8KKbY1d.mjs.map → acorex-modules-document-management-drive-choose.component-B66wODCQ.mjs.map} +1 -1
  12. package/fesm2022/{acorex-modules-document-management-drive.component-0wxNHSJr.mjs → acorex-modules-document-management-drive.component-CUej0GjY.mjs} +2 -2
  13. package/fesm2022/{acorex-modules-document-management-drive.component-0wxNHSJr.mjs.map → acorex-modules-document-management-drive.component-CUej0GjY.mjs.map} +1 -1
  14. package/fesm2022/{acorex-modules-document-management-large-icons-view.component-z-EQb_uG.mjs → acorex-modules-document-management-large-icons-view.component-BuwrkLhe.mjs} +2 -2
  15. package/fesm2022/{acorex-modules-document-management-large-icons-view.component-z-EQb_uG.mjs.map → acorex-modules-document-management-large-icons-view.component-BuwrkLhe.mjs.map} +1 -1
  16. package/fesm2022/{acorex-modules-document-management-large-tiles-view.component-Ce9h5m2O.mjs → acorex-modules-document-management-large-tiles-view.component-Cs-mjiQX.mjs} +2 -2
  17. package/fesm2022/{acorex-modules-document-management-large-tiles-view.component-Ce9h5m2O.mjs.map → acorex-modules-document-management-large-tiles-view.component-Cs-mjiQX.mjs.map} +1 -1
  18. package/fesm2022/{acorex-modules-document-management-list-view.component-DZKdXqAA.mjs → acorex-modules-document-management-list-view.component-1M2rIOGv.mjs} +2 -2
  19. package/fesm2022/{acorex-modules-document-management-list-view.component-DZKdXqAA.mjs.map → acorex-modules-document-management-list-view.component-1M2rIOGv.mjs.map} +1 -1
  20. package/fesm2022/{acorex-modules-document-management-permission-definition.provider-C31fYGZT.mjs → acorex-modules-document-management-permission-definition.provider-BEq3ySY3.mjs} +2 -2
  21. package/fesm2022/{acorex-modules-document-management-permission-definition.provider-C31fYGZT.mjs.map → acorex-modules-document-management-permission-definition.provider-BEq3ySY3.mjs.map} +1 -1
  22. package/fesm2022/{acorex-modules-document-management-rename-node-dialog.component-CMmT_vVe.mjs → acorex-modules-document-management-rename-node-dialog.component-DWzD41AV.mjs} +2 -2
  23. package/fesm2022/{acorex-modules-document-management-rename-node-dialog.component-CMmT_vVe.mjs.map → acorex-modules-document-management-rename-node-dialog.component-DWzD41AV.mjs.map} +1 -1
  24. package/fesm2022/{acorex-modules-document-management-small-icons-view.component-DI7c4jHZ.mjs → acorex-modules-document-management-small-icons-view.component-Dh5Di_2Y.mjs} +2 -2
  25. package/fesm2022/{acorex-modules-document-management-small-icons-view.component-DI7c4jHZ.mjs.map → acorex-modules-document-management-small-icons-view.component-Dh5Di_2Y.mjs.map} +1 -1
  26. package/fesm2022/{acorex-modules-document-management-small-tiles-view.component-BYJfNu6O.mjs → acorex-modules-document-management-small-tiles-view.component-mOjQbw-f.mjs} +2 -2
  27. package/fesm2022/{acorex-modules-document-management-small-tiles-view.component-BYJfNu6O.mjs.map → acorex-modules-document-management-small-tiles-view.component-mOjQbw-f.mjs.map} +1 -1
  28. package/fesm2022/acorex-modules-document-management.mjs +1 -1
  29. package/fesm2022/{acorex-modules-workflow-management-task-board.page-Dp7SJ3NA.mjs → acorex-modules-workflow-management-task-board.page-zaSchG-u.mjs} +207 -86
  30. package/fesm2022/acorex-modules-workflow-management-task-board.page-zaSchG-u.mjs.map +1 -0
  31. package/fesm2022/acorex-modules-workflow-management.mjs +2 -2
  32. package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
  33. package/package.json +1 -1
  34. package/fesm2022/acorex-modules-document-management-acorex-modules-document-management-CJYBHKUf.mjs.map +0 -1
  35. package/fesm2022/acorex-modules-workflow-management-task-board.page-Dp7SJ3NA.mjs.map +0 -1
@@ -54,19 +54,24 @@ const RootConfig = {
54
54
 
55
55
  var AXMTaskBoardSettings;
56
56
  (function (AXMTaskBoardSettings) {
57
- AXMTaskBoardSettings["CalendarViewMode"] = "taskboard.calendar.viewMode";
57
+ AXMTaskBoardSettings["ViewMode"] = "taskboard.viewMode";
58
+ AXMTaskBoardSettings["ViewCategory"] = "taskboard.viewCategory";
59
+ AXMTaskBoardSettings["DaysCount"] = "taskboard.calendar.daysCount";
58
60
  AXMTaskBoardSettings["CurrentDate"] = "taskboard.calendar.currentDate";
59
61
  AXMTaskBoardSettings["SelectedTaskTypeFilter"] = "taskboard.filter.selectedTaskType";
60
62
  })(AXMTaskBoardSettings || (AXMTaskBoardSettings = {}));
61
63
 
62
64
  const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() => ({
65
+ daysCount: 7,
66
+ taskTypes: [],
63
67
  isLoading: true,
64
- currentViewMode: 'month',
68
+ detailPanel: false,
69
+ selectedTask: null,
70
+ rangeStartDate: null,
65
71
  currentDate: new Date(),
72
+ currentViewMode: 'month',
66
73
  selectedTaskTypeName: null,
67
- taskTypes: [],
68
- selectedTask: null,
69
- detailPanel: false,
74
+ currentViewCategory: 'calendar',
70
75
  })), withComputed((store) => ({
71
76
  selectedTaskType: computed(() => {
72
77
  const name = store.selectedTaskTypeName();
@@ -78,6 +83,11 @@ const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() =
78
83
  // (Optional but recommended) Add a computed signal to easily check if a task is selected
79
84
  isTaskSelected: computed(() => store.selectedTask() !== null),
80
85
  isDetailPanelOpen: computed(() => store.detailPanel()),
86
+ endDate: computed(() => {
87
+ const currentDate = store.currentDate();
88
+ const daysCount = store.daysCount();
89
+ return new Date(currentDate.getTime() + daysCount * 24 * 60 * 60 * 1000);
90
+ }),
81
91
  })), withMethods((store, settingService = inject(AXPSettingService), taskBoardService = inject(AXPTaskBoardService)) => {
82
92
  // Create a private method for getting the user-scoped settings to avoid repetition
83
93
  const userScopedSettings = () => settingService.scope(AXPPlatformScope.User);
@@ -89,13 +99,15 @@ const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() =
89
99
  const taskTypes = await taskBoardService.getTaskTypes();
90
100
  patchState(store, { taskTypes });
91
101
  // 2. Load Persisted Settings individually
92
- const [savedViewMode, savedDateString, savedTaskTypeName] = await Promise.all([
93
- userScopedSettings().get(AXMTaskBoardSettings.CalendarViewMode),
102
+ const [savedDateString, savedViewMode, savedViewCategory, savedTaskTypeName] = await Promise.all([
94
103
  userScopedSettings().get(AXMTaskBoardSettings.CurrentDate),
104
+ userScopedSettings().get(AXMTaskBoardSettings.ViewMode),
105
+ userScopedSettings().get(AXMTaskBoardSettings.ViewCategory),
95
106
  userScopedSettings().get(AXMTaskBoardSettings.SelectedTaskTypeFilter),
96
107
  ]);
97
108
  patchState(store, {
98
109
  currentViewMode: savedViewMode || 'month',
110
+ currentViewCategory: savedViewCategory || 'calendar',
99
111
  currentDate: savedDateString ? new Date(savedDateString) : new Date(),
100
112
  selectedTaskTypeName: savedTaskTypeName || null,
101
113
  isLoading: false,
@@ -112,6 +124,26 @@ const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() =
112
124
  });
113
125
  }
114
126
  },
127
+ setViewCategory(mode) {
128
+ switch (mode) {
129
+ case 'calendar':
130
+ this.setViewMode('month');
131
+ break;
132
+ case 'table':
133
+ this.setViewMode('grid');
134
+ break;
135
+ case 'kanban':
136
+ this.setViewMode('kanban');
137
+ break;
138
+ }
139
+ this.setCategory(mode);
140
+ },
141
+ setCategory(mode) {
142
+ patchState(store, { currentViewCategory: mode });
143
+ userScopedSettings()
144
+ .set(AXMTaskBoardSettings.ViewCategory, mode)
145
+ .catch((error) => console.error('Error saving calendar view category:', error));
146
+ },
115
147
  setViewMode(mode) {
116
148
  if ((mode === 'kanban' || mode === 'grid' || mode === 'status-grouped-grid' || mode === 'time-grouped-grid') &&
117
149
  store.selectedTaskTypeName() === null) {
@@ -125,7 +157,7 @@ const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() =
125
157
  }
126
158
  patchState(store, { currentViewMode: mode });
127
159
  userScopedSettings()
128
- .set(AXMTaskBoardSettings.CalendarViewMode, mode)
160
+ .set(AXMTaskBoardSettings.ViewMode, mode)
129
161
  .catch((error) => console.error('Error saving calendar view mode:', error));
130
162
  },
131
163
  setCurrentDate(date) {
@@ -166,6 +198,21 @@ const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() =
166
198
  getStatusName(key, provider) {
167
199
  return taskBoardService.getStatusName(key, provider);
168
200
  },
201
+ /**
202
+ * Sets the start date for a new range selection.
203
+ * Pass `null` to clear the selection.
204
+ * @param date The start date of the range.
205
+ */
206
+ setRangeStartDate(date) {
207
+ patchState(store, { rangeStartDate: date });
208
+ },
209
+ setDaysCount(days) {
210
+ const count = Math.max(1, days);
211
+ patchState(store, { daysCount: count });
212
+ userScopedSettings()
213
+ .set(AXMTaskBoardSettings.DaysCount, count)
214
+ .catch((error) => console.error('Error saving days count:', error));
215
+ },
169
216
  };
170
217
  }));
171
218
 
@@ -184,15 +231,16 @@ class AXMTaskBoardDetailPanel {
184
231
  return this.vm.getStatusName(key, provider);
185
232
  }
186
233
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMTaskBoardDetailPanel, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
187
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.7", type: AXMTaskBoardDetailPanel, isStandalone: true, selector: "axm-task-board-detail-panel", ngImport: i0, template: "@if (vm.isTaskSelected()) {\n @let nodeInfo = vm.selectedTask();\n <div class=\"__header\">\n <div class=\"__title\">\n <span>{{ nodeInfo?.title }}</span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n\n <div class=\"__content\">\n <div class=\"__section\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.title' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">\n @if (nodeInfo?.description) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{\n 'task-board.detail-panel.description' | translate: { scope: rootConfig.config.i18n } | async\n }}</span>\n </div>\n <div class=\"__content\">{{ nodeInfo?.description }}</div>\n </div>\n }\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{\n 'task-board.detail-panel.start-date' | translate: { scope: rootConfig.config.i18n } | async\n }}</span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.startDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.end-date' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.endDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n @let statusName = getStatusName(nodeInfo?.statusKey, nodeInfo?.data?.provider);\n @if (statusName) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.status' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">{{ statusName }}</div>\n </div>\n }\n @if (nodeInfo?.priority) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{\n 'task-board.detail-panel.priority' | translate: { scope: rootConfig.config.i18n } | async\n }}</span>\n </div>\n <div class=\"__content\">{{ capitalizeFirstLetter(nodeInfo?.priority ?? '') }}</div>\n </div>\n }\n </div>\n </div>\n </div>\n} @else {\n <div class=\"__header\">\n <div class=\"__title\">\n <span>{{\n 'task-board.detail-panel.no-task-selected' | translate: { scope: rootConfig.config.i18n } | async\n }}</span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n}\n", styles: ["axm-task-board-detail-panel{display:flex;flex-direction:column;border-radius:.5rem;border-width:1px;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}@media (min-width: 1024px){axm-task-board-detail-panel{min-width:20rem}}axm-task-board-detail-panel>.__header{display:flex;flex-direction:row;align-items:center;justify-content:space-between;border-bottom-width:1px;padding:1rem}axm-task-board-detail-panel>.__header>.__title{display:flex;width:90%;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__header>.__title span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;font-weight:600;line-height:1.625}axm-task-board-detail-panel>.__content{display:flex;flex-direction:column}axm-task-board-detail-panel>.__content>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}axm-task-board-detail-panel>.__content>.__section{display:flex;flex-direction:column;padding:1rem}axm-task-board-detail-panel>.__content>.__section>.__title{margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;font-weight:700}axm-task-board-detail-panel>.__content>.__section>.__content{display:flex;flex-direction:column;gap:1rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row{display:flex;flex-direction:column;gap:.25rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__title{display:flex;font-size:.875rem;line-height:1.25rem;font-weight:600;opacity:.9}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content{display:flex;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content span{opacity:.7}\n"], dependencies: [{ 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: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "pipe", type: AXFormatPipe, name: "format" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
234
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.7", type: AXMTaskBoardDetailPanel, isStandalone: true, selector: "axm-task-board-detail-panel", ngImport: i0, template: "@if (vm.isTaskSelected()) {\n @let nodeInfo = vm.selectedTask();\n <div class=\"__header\">\n <div class=\"__title\">\n <span>{{ nodeInfo?.title }}</span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n\n <div class=\"__content\">\n <div class=\"__section\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.title' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">\n @if (nodeInfo?.description) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ 'task-board.detail-panel.description' | translate: { scope: rootConfig.config.i18n } | async }}\n </span>\n </div>\n <div class=\"__content\">{{ nodeInfo?.description }}</div>\n </div>\n }\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ 'task-board.detail-panel.start-date' | translate: { scope: rootConfig.config.i18n } | async }}\n </span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.startDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.end-date' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.endDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n @let statusName = getStatusName(nodeInfo?.statusKey, nodeInfo?.data?.provider);\n @if (statusName) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.status' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">{{ statusName }}</div>\n </div>\n }\n @if (nodeInfo?.priority) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ 'task-board.detail-panel.priority' | translate: { scope: rootConfig.config.i18n } | async }}\n </span>\n </div>\n <div class=\"__content\">{{ capitalizeFirstLetter(nodeInfo?.priority ?? '') }}</div>\n </div>\n }\n </div>\n </div>\n </div>\n} @else {\n <div class=\"__header\">\n <div class=\"__title\">\n <span>\n {{ 'task-board.detail-panel.no-task-selected' | translate: { scope: rootConfig.config.i18n } | async }}\n </span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n}\n", styles: ["axm-task-board-detail-panel{display:flex;flex-direction:column;border-radius:.5rem;border-width:1px;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}@media (min-width: 1024px){axm-task-board-detail-panel{width:24rem}}axm-task-board-detail-panel>.__header{display:flex;flex-direction:row;align-items:center;justify-content:space-between;border-bottom-width:1px;padding:1rem}@media (min-width: 1024px){axm-task-board-detail-panel>.__header{width:20rem}}axm-task-board-detail-panel>.__header>.__title{display:flex;width:90%;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__header>.__title span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;font-weight:600;line-height:1.625}axm-task-board-detail-panel>.__content{display:flex;flex-direction:column}axm-task-board-detail-panel>.__content>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}axm-task-board-detail-panel>.__content>.__section{display:flex;flex-direction:column;padding:1rem}axm-task-board-detail-panel>.__content>.__section>.__title{margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;font-weight:700}axm-task-board-detail-panel>.__content>.__section>.__content{display:flex;flex-direction:column;gap:1rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row{display:flex;flex-direction:column;gap:.25rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__title{display:flex;font-size:.875rem;line-height:1.25rem;font-weight:600;opacity:.9}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content{display:flex;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content span{opacity:.7}\n"], dependencies: [{ 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: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "pipe", type: AXFormatPipe, name: "format" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
188
235
  }
189
236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMTaskBoardDetailPanel, decorators: [{
190
237
  type: Component,
191
- args: [{ selector: 'axm-task-board-detail-panel', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXButtonComponent, AXDecoratorIconComponent, AXFormatPipe, AsyncPipe, AXTranslatorPipe], template: "@if (vm.isTaskSelected()) {\n @let nodeInfo = vm.selectedTask();\n <div class=\"__header\">\n <div class=\"__title\">\n <span>{{ nodeInfo?.title }}</span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n\n <div class=\"__content\">\n <div class=\"__section\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.title' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">\n @if (nodeInfo?.description) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{\n 'task-board.detail-panel.description' | translate: { scope: rootConfig.config.i18n } | async\n }}</span>\n </div>\n <div class=\"__content\">{{ nodeInfo?.description }}</div>\n </div>\n }\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{\n 'task-board.detail-panel.start-date' | translate: { scope: rootConfig.config.i18n } | async\n }}</span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.startDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.end-date' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.endDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n @let statusName = getStatusName(nodeInfo?.statusKey, nodeInfo?.data?.provider);\n @if (statusName) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.status' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">{{ statusName }}</div>\n </div>\n }\n @if (nodeInfo?.priority) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{\n 'task-board.detail-panel.priority' | translate: { scope: rootConfig.config.i18n } | async\n }}</span>\n </div>\n <div class=\"__content\">{{ capitalizeFirstLetter(nodeInfo?.priority ?? '') }}</div>\n </div>\n }\n </div>\n </div>\n </div>\n} @else {\n <div class=\"__header\">\n <div class=\"__title\">\n <span>{{\n 'task-board.detail-panel.no-task-selected' | translate: { scope: rootConfig.config.i18n } | async\n }}</span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n}\n", styles: ["axm-task-board-detail-panel{display:flex;flex-direction:column;border-radius:.5rem;border-width:1px;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}@media (min-width: 1024px){axm-task-board-detail-panel{min-width:20rem}}axm-task-board-detail-panel>.__header{display:flex;flex-direction:row;align-items:center;justify-content:space-between;border-bottom-width:1px;padding:1rem}axm-task-board-detail-panel>.__header>.__title{display:flex;width:90%;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__header>.__title span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;font-weight:600;line-height:1.625}axm-task-board-detail-panel>.__content{display:flex;flex-direction:column}axm-task-board-detail-panel>.__content>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}axm-task-board-detail-panel>.__content>.__section{display:flex;flex-direction:column;padding:1rem}axm-task-board-detail-panel>.__content>.__section>.__title{margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;font-weight:700}axm-task-board-detail-panel>.__content>.__section>.__content{display:flex;flex-direction:column;gap:1rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row{display:flex;flex-direction:column;gap:.25rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__title{display:flex;font-size:.875rem;line-height:1.25rem;font-weight:600;opacity:.9}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content{display:flex;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content span{opacity:.7}\n"] }]
238
+ args: [{ selector: 'axm-task-board-detail-panel', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXButtonComponent, AXDecoratorIconComponent, AXFormatPipe, AsyncPipe, AXTranslatorPipe], template: "@if (vm.isTaskSelected()) {\n @let nodeInfo = vm.selectedTask();\n <div class=\"__header\">\n <div class=\"__title\">\n <span>{{ nodeInfo?.title }}</span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n\n <div class=\"__content\">\n <div class=\"__section\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.title' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">\n @if (nodeInfo?.description) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ 'task-board.detail-panel.description' | translate: { scope: rootConfig.config.i18n } | async }}\n </span>\n </div>\n <div class=\"__content\">{{ nodeInfo?.description }}</div>\n </div>\n }\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ 'task-board.detail-panel.start-date' | translate: { scope: rootConfig.config.i18n } | async }}\n </span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.startDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.end-date' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.endDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n @let statusName = getStatusName(nodeInfo?.statusKey, nodeInfo?.data?.provider);\n @if (statusName) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ 'task-board.detail-panel.status' | translate: { scope: rootConfig.config.i18n } | async }}</span>\n </div>\n <div class=\"__content\">{{ statusName }}</div>\n </div>\n }\n @if (nodeInfo?.priority) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ 'task-board.detail-panel.priority' | translate: { scope: rootConfig.config.i18n } | async }}\n </span>\n </div>\n <div class=\"__content\">{{ capitalizeFirstLetter(nodeInfo?.priority ?? '') }}</div>\n </div>\n }\n </div>\n </div>\n </div>\n} @else {\n <div class=\"__header\">\n <div class=\"__title\">\n <span>\n {{ 'task-board.detail-panel.no-task-selected' | translate: { scope: rootConfig.config.i18n } | async }}\n </span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n}\n", styles: ["axm-task-board-detail-panel{display:flex;flex-direction:column;border-radius:.5rem;border-width:1px;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}@media (min-width: 1024px){axm-task-board-detail-panel{width:24rem}}axm-task-board-detail-panel>.__header{display:flex;flex-direction:row;align-items:center;justify-content:space-between;border-bottom-width:1px;padding:1rem}@media (min-width: 1024px){axm-task-board-detail-panel>.__header{width:20rem}}axm-task-board-detail-panel>.__header>.__title{display:flex;width:90%;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__header>.__title span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;font-weight:600;line-height:1.625}axm-task-board-detail-panel>.__content{display:flex;flex-direction:column}axm-task-board-detail-panel>.__content>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}axm-task-board-detail-panel>.__content>.__section{display:flex;flex-direction:column;padding:1rem}axm-task-board-detail-panel>.__content>.__section>.__title{margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;font-weight:700}axm-task-board-detail-panel>.__content>.__section>.__content{display:flex;flex-direction:column;gap:1rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row{display:flex;flex-direction:column;gap:.25rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__title{display:flex;font-size:.875rem;line-height:1.25rem;font-weight:600;opacity:.9}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content{display:flex;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content span{opacity:.7}\n"] }]
192
239
  }] });
193
240
 
194
241
  class AXMTaskBoardCalendarViewComponent {
195
242
  constructor() {
243
+ this.vm = inject(AXMTaskBoardViewModel);
196
244
  this.calendarService = inject(AXCalendarService);
197
245
  this.taskBoardService = inject(AXPTaskBoardService);
198
246
  this.schedulerComponent = viewChild(AXSchedulerComponent);
@@ -266,11 +314,11 @@ class AXMTaskBoardCalendarViewComponent {
266
314
  this.onTaskClick.emit(event.appointment);
267
315
  }
268
316
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMTaskBoardCalendarViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
269
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.0.7", type: AXMTaskBoardCalendarViewComponent, isStandalone: true, selector: "axm-task-board-calendar-view", inputs: { 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 [dataSource]=\"dataSource()\"\n [startingDate]=\"startingDate()\"\n [selectedView]=\"currentSchedulerView()\"\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></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", "allowFullScreen", "multiDayViewDaysCount", "tooltipTemplate", "dataSource", "firstDayOfWeek", "views", "selectedView"], outputs: ["selectedViewChange", "onDataLoaded", "onRangeChanged", "onSlotClicked", "onSlotDblClicked", "onSlotRightClick", "onAppointmentDrop", "onActionClick", "onAppointmentClicked", "onAppointmentDblClicked", "onAppointmentRightClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
317
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.0.7", type: AXMTaskBoardCalendarViewComponent, isStandalone: true, selector: "axm-task-board-calendar-view", inputs: { 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 [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></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", "allowFullScreen", "multiDayViewDaysCount", "tooltipTemplate", "dataSource", "firstDayOfWeek", "views", "selectedView"], outputs: ["selectedViewChange", "onDataLoaded", "onRangeChanged", "onSlotClicked", "onSlotDblClicked", "onSlotRightClick", "onAppointmentDrop", "onActionClick", "onAppointmentClicked", "onAppointmentDblClicked", "onAppointmentRightClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
270
318
  }
271
319
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMTaskBoardCalendarViewComponent, decorators: [{
272
320
  type: Component,
273
- args: [{ selector: 'axm-task-board-calendar-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXSchedulerComponent], template: "<ax-scheduler\n [hasHeader]=\"false\"\n [hasActions]=\"true\"\n [dataSource]=\"dataSource()\"\n [startingDate]=\"startingDate()\"\n [selectedView]=\"currentSchedulerView()\"\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></ax-scheduler>\n", styles: ["ax-scheduler{line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}\n"] }]
321
+ args: [{ selector: 'axm-task-board-calendar-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXSchedulerComponent], template: "<ax-scheduler\n [hasHeader]=\"false\"\n [hasActions]=\"true\"\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></ax-scheduler>\n", styles: ["ax-scheduler{line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}\n"] }]
274
322
  }] });
275
323
 
276
324
  class AXMTaskBoardGridViewComponent {
@@ -549,7 +597,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImpor
549
597
  class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
550
598
  constructor() {
551
599
  super(...arguments);
552
- this.MULTI_DAYS_COUNT = 7;
553
600
  this.router = inject(Router);
554
601
  this.rootConfig = RootConfig;
555
602
  this.vm = inject(AXMTaskBoardViewModel);
@@ -564,70 +611,70 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
564
611
  this.currentViewMode = signal('calendar');
565
612
  this.schedulerComponent = signal(null);
566
613
  this.viewsItems = signal([
567
- { key: 'day', text: 'daily', icon: 'fa-light fa-calendar-day', title: 'calendar' },
568
- { key: 'week', text: 'weekly', icon: 'fa-light fa-calendar-week' },
569
- { key: 'month', text: 'monthly', icon: 'fa-light fa-calendar-alt' },
570
- { key: 'agenda', text: 'agenda', icon: 'fa-light fa-calendar-range', break: true },
571
- { key: 'grid', text: 'grid', icon: 'fa-light fa-table', title: 'table' },
572
- // { key: 'time-grouped-grid', text: 'time-grouped-grid', icon: 'fa-light fa-table' },
573
- { key: 'status-grouped-grid', text: 'status-grouped-grid', icon: 'fa-light fa-table', break: true },
614
+ { key: 'day', text: 'daily', icon: 'fa-light fa-calendar-day', category: 'calendar' },
615
+ { key: 'week', text: 'weekly', icon: 'fa-light fa-calendar-week', category: 'calendar' },
616
+ { key: 'month', text: 'monthly', icon: 'fa-light fa-calendar-alt', category: 'calendar' },
617
+ { key: 'agenda', text: 'agenda', icon: 'fa-light fa-calendar-range', category: 'calendar' },
618
+ { key: 'grid', text: 'grid', icon: 'fa-light fa-table', category: 'table' },
619
+ // { key: 'time-grouped-grid', text: 'time-grouped-grid', icon: 'fa-light fa-table' ,category: 'table'},
620
+ { key: 'status-grouped-grid', text: 'status-grouped-grid', icon: 'fa-light fa-table', category: 'table' },
621
+ ]);
622
+ this.categoryItems = signal([
623
+ { key: 'calendar', text: 'calendar', icon: 'fa-light fa-calendar-day' },
624
+ { key: 'table', text: 'table', icon: 'fa-light fa-table' },
574
625
  { key: 'kanban', text: 'kanban', icon: 'fa-light fa-chart-kanban' },
575
626
  ]);
576
627
  this.calendarType = computed(() => this.localeService.activeProfile().calendar.system);
577
628
  this.todayButtonText = computed(() => {
578
629
  switch (this.vm.currentViewMode()) {
579
630
  case 'day':
631
+ case 'grid':
580
632
  case 'agenda':
581
633
  case 'kanban':
582
634
  case 'timeline-day':
635
+ case 'time-grouped-grid':
583
636
  case 'timeline-multi-day':
637
+ case 'status-grouped-grid':
584
638
  return 'Today';
585
639
  case 'week':
586
640
  return 'Current week';
587
- case 'grid':
588
641
  case 'month':
589
642
  case 'timeline-month':
590
- case 'time-grouped-grid':
591
- case 'status-grouped-grid':
592
643
  return 'Current month';
593
644
  }
594
645
  });
595
646
  this.timeText = computed(() => {
596
- if (this.vm.currentViewMode() === 'kanban') {
597
- const start = this.calendarService.create(this.vm.currentDate(), this.localeService.activeProfile().calendar.system);
598
- const end = start.add('day', this.MULTI_DAYS_COUNT - 1);
599
- const startText = start.format('DD MMMM yyyy', { locale: this.localeService.activeProfile().calendar.system });
600
- const endText = end.format('DD MMMM yyyy', { locale: this.localeService.activeProfile().calendar.system });
601
- return `${startText} - ${endText}`;
602
- }
603
647
  if (this.vm.currentViewMode() === 'grid' ||
648
+ this.vm.currentViewMode() === 'kanban' ||
604
649
  this.vm.currentViewMode() === 'time-grouped-grid' ||
605
650
  this.vm.currentViewMode() === 'status-grouped-grid') {
606
651
  const start = this.calendarService.create(this.vm.currentDate(), this.localeService.activeProfile().calendar.system);
607
- const startText = start.format('MMMM yyyy', { locale: this.localeService.activeProfile().calendar.system });
608
- return startText;
652
+ const end = start.add('day', this.vm.daysCount() - 1);
653
+ const startText = start.format('DD MMMM yyyy', { locale: this.localeService.activeProfile().calendar.system });
654
+ const endText = end.format('DD MMMM yyyy', { locale: this.localeService.activeProfile().calendar.system });
655
+ return `${startText} - ${endText}`;
609
656
  }
610
657
  return this.schedulerComponent()?.currentDateText();
611
658
  });
612
659
  this.calendarDepth = computed(() => {
613
- if (this.vm.currentViewMode() === 'kanban') {
614
- return 'day';
615
- }
616
660
  if (this.vm.currentViewMode() === 'grid' ||
661
+ this.vm.currentViewMode() === 'kanban' ||
617
662
  this.vm.currentViewMode() === 'time-grouped-grid' ||
618
663
  this.vm.currentViewMode() === 'status-grouped-grid') {
619
- return 'month';
664
+ return 'day';
620
665
  }
621
666
  return this.schedulerComponent()?.calendarDepth();
622
667
  });
623
668
  this.selectedViewMode = computed(() => this.viewsItems().find((item) => item.key === this.vm.currentViewMode()) || this.viewsItems()[0]);
669
+ this.selectedViewCategory = computed(() => this.categoryItems().find((item) => item.key === this.vm.currentViewCategory()) || this.categoryItems()[0]);
670
+ this.currentViewModes = computed(() => this.viewsItems().filter((item) => item.category === this.vm.currentViewCategory()));
624
671
  this.filter = computed(() => {
625
672
  const taskTypeProvider = this.vm.selectedTaskType();
626
673
  const types = taskTypeProvider ? [taskTypeProvider.name] : undefined;
627
674
  let from = this.calendarService.create(this.vm.currentDate(), this.localeService.activeProfile().calendar.system);
628
675
  let end;
629
676
  if (this.vm.currentViewMode() === 'kanban') {
630
- end = from.add('day', this.MULTI_DAYS_COUNT - 1);
677
+ end = from.add('day', this.vm.daysCount() - 1);
631
678
  }
632
679
  else if (this.vm.currentViewMode() === 'grid' ||
633
680
  this.vm.currentViewMode() === 'time-grouped-grid' ||
@@ -656,30 +703,50 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
656
703
  this.statuses = computed(() => {
657
704
  return this.vm.selectedTaskType()?.statuses || [];
658
705
  });
706
+ this.rangeBasedViews = [
707
+ 'kanban',
708
+ 'agenda',
709
+ 'grid',
710
+ 'time-grouped-grid',
711
+ 'status-grouped-grid',
712
+ 'timeline-multi-day',
713
+ ];
659
714
  this.getCellClass = (date) => {
660
- // check from value
661
- const rangedDates = [
662
- 'week',
663
- 'grid',
664
- 'kanban',
665
- 'agenda',
666
- 'time-grouped-grid',
667
- 'status-grouped-grid',
668
- 'timeline-multi-day',
669
- ];
670
- if (!rangedDates.includes(this.vm.currentViewMode())) {
715
+ const currentView = this.vm.currentViewMode();
716
+ const selectionStartDate = this.vm.rangeStartDate();
717
+ if (this.rangeBasedViews.includes(currentView)) {
718
+ if (selectionStartDate) {
719
+ const axSelectionStartDate = this.calendarService.create(selectionStartDate);
720
+ if (date.equal(axSelectionStartDate, 'day')) {
721
+ return 'ax-range-start ax-range-end';
722
+ }
723
+ return null;
724
+ }
725
+ const fromRange = this.calendarService.create(this.vm.currentDate());
726
+ const endRange = fromRange.add('day', this.vm.daysCount() - 1);
727
+ const isStart = date.equal(fromRange, 'day');
728
+ const isEnd = date.equal(endRange, 'day');
729
+ if (isStart && isEnd)
730
+ return 'ax-range-start ax-range-end';
731
+ if (isStart)
732
+ return 'ax-range-start';
733
+ if (isEnd)
734
+ return 'ax-range-end';
735
+ if (date.compare(fromRange, 'day') > 0 && date.compare(endRange, 'day') < 0) {
736
+ return 'ax-range-between';
737
+ }
671
738
  return null;
672
739
  }
673
- const from = this.calendarService.create(this.vm.currentDate(), this.localeService.activeProfile().calendar.system);
674
- const end = from.add('day', this.MULTI_DAYS_COUNT - 1);
675
- if (from && date.equal(from, 'day')) {
676
- return 'ax-range-start';
677
- }
678
- if (end && date.equal(end, 'day')) {
679
- return 'ax-range-end';
680
- }
681
- if (from && end && date.compare(from, 'day') > 0 && date.compare(end, 'day') < 0) {
682
- return 'ax-range-between';
740
+ if (currentView === 'week') {
741
+ const from = this.calendarService.create(this.vm.currentDate());
742
+ const end = from.add('day', 6);
743
+ if (date.equal(from, 'day'))
744
+ return 'ax-range-start';
745
+ if (date.equal(end, 'day'))
746
+ return 'ax-range-end';
747
+ if (date.compare(from, 'day') > 0 && date.compare(end, 'day') < 0) {
748
+ return 'ax-range-between';
749
+ }
683
750
  }
684
751
  return null;
685
752
  };
@@ -740,33 +807,26 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
740
807
  });
741
808
  }
742
809
  }
810
+ handleViewCategoryChange(category) {
811
+ let view;
812
+ switch (category) {
813
+ case 'calendar':
814
+ view = 'month';
815
+ break;
816
+ case 'table':
817
+ view = 'grid';
818
+ break;
819
+ case 'kanban':
820
+ view = 'kanban';
821
+ break;
822
+ }
823
+ this.vm.setViewCategory(category);
824
+ this.router.navigate([], { queryParams: { view } });
825
+ }
743
826
  handleSelectedTaskTypeChange(taskType) {
744
827
  this.vm.setSelectedTaskTypeProvider(taskType);
745
828
  this.schedulerComponent()?.refresh();
746
829
  }
747
- handleSchedulerDateChanged(event) {
748
- if (this.vm.isLoading()) {
749
- return;
750
- }
751
- const newDate = event.value;
752
- const currentDateInVm = this.vm.currentDate();
753
- let dateToSet = newDate || new Date();
754
- if (!currentDateInVm || currentDateInVm.getTime() !== dateToSet.getTime()) {
755
- if (this.vm.currentViewMode() === 'week') {
756
- const day = dateToSet.getDay();
757
- const weekStart = this.localeService.activeProfile().calendar.week.startsOn;
758
- let daysToSubtract = day - weekStart;
759
- if (daysToSubtract < 0) {
760
- daysToSubtract += 7;
761
- }
762
- dateToSet = new Date(dateToSet);
763
- dateToSet.setDate(dateToSet.getDate() - daysToSubtract);
764
- }
765
- this.vm.setCurrentDate(dateToSet);
766
- this.popover()?.close();
767
- this.calendar()?.render();
768
- }
769
- }
770
830
  handleContextMenuItemClick(event) {
771
831
  this.taskBoardService.executeCommand(event.item.data?.command, this.currentTask()?.data?.provider ?? '');
772
832
  }
@@ -783,7 +843,7 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
783
843
  case 'agenda':
784
844
  case 'kanban':
785
845
  case 'timeline-multi-day':
786
- this.vm.setCurrentDate(date.add('day', forward ? this.MULTI_DAYS_COUNT - 1 : 1 - this.MULTI_DAYS_COUNT).date);
846
+ this.vm.setCurrentDate(date.add('day', forward ? this.vm.daysCount() - 1 : 1 - this.vm.daysCount()).date);
787
847
  break;
788
848
  case 'grid':
789
849
  case 'month':
@@ -796,8 +856,61 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
796
856
  this.popover()?.close();
797
857
  this.calendar()?.render();
798
858
  }
859
+ handleCalendarSlotClick(event) {
860
+ const clickedDate = event.item;
861
+ const currentView = this.vm.currentViewMode();
862
+ if (this.rangeBasedViews.includes(currentView)) {
863
+ const selectionStartDate = this.vm.rangeStartDate();
864
+ if (!selectionStartDate) {
865
+ this.vm.setRangeStartDate(clickedDate);
866
+ this.calendar()?.render();
867
+ return;
868
+ }
869
+ const date1 = selectionStartDate.getTime();
870
+ const date2 = clickedDate.getTime();
871
+ const newStartDate = new Date(Math.min(date1, date2));
872
+ const newEndDate = new Date(Math.max(date1, date2));
873
+ const differenceInDays = this.calculateDifferenceInDays(newStartDate, newEndDate);
874
+ this.vm.setCurrentDate(newStartDate);
875
+ this.vm.setDaysCount(differenceInDays);
876
+ this.vm.setRangeStartDate(null);
877
+ this.calendar()?.render();
878
+ this.popover()?.close();
879
+ return;
880
+ }
881
+ let dateToSet = new Date(clickedDate);
882
+ if (currentView === 'week') {
883
+ const day = dateToSet.getDay();
884
+ const weekStart = this.localeService.activeProfile().calendar.week.startsOn;
885
+ let daysToSubtract = day - weekStart;
886
+ if (daysToSubtract < 0) {
887
+ daysToSubtract += 7;
888
+ }
889
+ dateToSet.setDate(dateToSet.getDate() - daysToSubtract);
890
+ }
891
+ this.vm.setCurrentDate(dateToSet);
892
+ this.popover()?.close();
893
+ this.calendar()?.render();
894
+ }
895
+ /**
896
+ * Helper function to calculate the difference in whole days between two dates.
897
+ * The result is inclusive (e.g., May 5 to May 6 is a 2-day range).
898
+ */
899
+ calculateDifferenceInDays(start, end) {
900
+ if (!start || !end) {
901
+ return 1;
902
+ }
903
+ const startDate = new Date(start.getFullYear(), start.getMonth(), start.getDate());
904
+ const endDate = new Date(end.getFullYear(), end.getMonth(), end.getDate());
905
+ const timeDifference = endDate.getTime() - startDate.getTime();
906
+ const daysDifference = Math.round(timeDifference / (1000 * 3600 * 24));
907
+ return daysDifference + 1;
908
+ }
799
909
  handleTodayClick() {
800
- this.handleSchedulerDateChanged({ value: new Date(), component: this.schedulerComponent() });
910
+ this.vm.setRangeStartDate(null);
911
+ this.vm.setCurrentDate(new Date());
912
+ this.popover()?.close();
913
+ this.calendar()?.render();
801
914
  }
802
915
  async loadFromRoute() {
803
916
  const snapshot = this.activatedRoute.snapshot;
@@ -817,6 +930,14 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
817
930
  const view = snapshot.queryParamMap.get('view') ?? null;
818
931
  if (view && views.includes(view)) {
819
932
  this.vm.setViewMode(view);
933
+ if (view === 'kanban') {
934
+ this.vm.setCategory('kanban');
935
+ return;
936
+ }
937
+ const category = this.viewsItems().find((item) => item.key === view)?.category;
938
+ if (category) {
939
+ this.vm.setCategory(category);
940
+ }
820
941
  }
821
942
  else if (!this.vm.currentViewMode()) {
822
943
  this.vm.setViewMode('day');
@@ -831,7 +952,7 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
831
952
  provide: AXPPageLayoutBase,
832
953
  useExisting: AXMTaskBoardPage,
833
954
  },
834
- ], 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\n [text]=\"t(vm.selectedTaskType()?.title || 'task-board.all', { scope: rootConfig.config.i18n }) | async\"\n >\n <ax-prefix><ax-icon icon=\"fa-light {{vm.selectedTaskType()?.icon || 'fa-tasks'}}\"></ax-icon></ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list class=\"ax-p-2\">\n @if(vm.currentViewMode()!=='kanban' && vm.currentViewMode()!=='grid' &&\n vm.currentViewMode()!=='status-grouped-grid' && vm.currentViewMode()!=='time-grouped-grid') {\n <ax-button-item\n (onClick)=\"handleSelectedTaskTypeChange(null)\"\n [text]=\"(t('task-board.all', { scope: rootConfig.config.i18n }) | async)!\"\n >\n <ax-prefix><ax-icon icon=\"fa-light fa-tasks\"></ax-icon></ax-prefix>\n </ax-button-item>\n } @for(item of vm.taskTypes(); track item.name) {\n <ax-button-item\n (onClick)=\"handleSelectedTaskTypeChange(item)\"\n [text]=\"(t(item.title, { scope: rootConfig.config.i18n }) | async)!\"\n >\n <ax-prefix><ax-icon icon=\"fa-light {{ item.icon }}\"></ax-icon></ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\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>\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 (onValueChanged)=\"handleSchedulerDateChanged($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 <axp-layout-suffix>\n <ax-button>\n <ax-icon icon=\"fa-light {{ selectedViewMode().icon }}\"></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for(item of viewsItems(); track item.key) { @if(item.title) {\n <ax-title>{{(t('task-board.'+item.title, { scope: rootConfig.config.i18n }) | async)}}</ax-title>\n }\n <ax-button-item\n [text]=\"(t('task-board.view.' + item.text, { scope: 'workflow-management' }) | async)!\"\n [selected]=\"vm.currentViewMode() === item.key\"\n (onClick)=\"handleCalendarViewChange(item.key)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light {{ item.icon }}\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n @if(item.break) {\n <ax-divider></ax-divider>\n } }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n\n @if(layoutService.isLarge()) {\n <!-- Detail Panel Toggle -->\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 >@switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onTaskClick)=\"setActiveTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"axp-kanban-container ax-h-full ax-w-full\"\n ></axm-task-board-kanban-view>\n }@case('grid') {\n <axm-task-board-grid-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n class=\"ax-h-full ax-w-full\"\n (onTaskClick)=\"setActiveTask($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 [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\"\n ></axm-task-board-status-grouped-grid-view>\n }@case('time-grouped-grid') {\n <axm-task-board-time-grouped-grid-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\"\n ></axm-task-board-time-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full\"\n [dataSource]=\"dataSource\"\n [startingDate]=\"vm.currentDate()\"\n (onTaskClick)=\"setActiveTask($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() && layoutService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
955
+ ], 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\n [text]=\"t(vm.selectedTaskType()?.title || 'task-board.all', { scope: rootConfig.config.i18n }) | async\"\n >\n <ax-prefix><ax-icon icon=\"fa-light {{vm.selectedTaskType()?.icon || 'fa-tasks'}}\"></ax-icon></ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list class=\"ax-p-2\">\n @if(vm.currentViewMode()!=='kanban' && vm.currentViewMode()!=='grid' &&\n vm.currentViewMode()!=='status-grouped-grid' && vm.currentViewMode()!=='time-grouped-grid') {\n <ax-button-item\n (onClick)=\"handleSelectedTaskTypeChange(null)\"\n [text]=\"(t('task-board.all', { scope: rootConfig.config.i18n }) | async)!\"\n >\n <ax-prefix><ax-icon icon=\"fa-light fa-tasks\"></ax-icon></ax-prefix>\n </ax-button-item>\n } @for(item of vm.taskTypes(); track item.name) {\n <ax-button-item\n (onClick)=\"handleSelectedTaskTypeChange(item)\"\n [text]=\"(t(item.title, { scope: rootConfig.config.i18n }) | async)!\"\n >\n <ax-prefix><ax-icon icon=\"fa-light {{ item.icon }}\"></ax-icon></ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\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 <axp-layout-suffix>\n <ax-button [text]=\"(t('task-board.' + selectedViewCategory().text, { scope: 'workflow-management' }) | async)!\">\n <ax-prefix><ax-icon icon=\"fa-light {{ selectedViewCategory().icon }}\"></ax-icon></ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for(item of categoryItems(); track item.key) {\n <ax-button-item\n [text]=\"(t('task-board.' + item.text, { scope: 'workflow-management' }) | async)!\"\n [selected]=\"vm.currentViewCategory() === item.key\"\n (onClick)=\"handleViewCategoryChange(item.key)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light {{ item.icon }}\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n @if(item.break) {\n <ax-divider></ax-divider>\n } }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n @if(currentViewModes().length){\n <ax-button [text]=\"(t('task-board.view.' + selectedViewMode().text, { scope: 'workflow-management' }) | async)!\">\n <ax-prefix><ax-icon icon=\"fa-light {{ selectedViewMode().icon }}\"></ax-icon></ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for(item of currentViewModes(); track item.key) {\n <ax-button-item\n [text]=\"(t('task-board.view.' + item.text, { scope: 'workflow-management' }) | async)!\"\n [selected]=\"vm.currentViewMode() === item.key\"\n (onClick)=\"handleCalendarViewChange(item.key)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light {{ item.icon }}\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n } @if(layoutService.isLarge()) {\n <!-- Detail Panel Toggle -->\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 >@switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onTaskClick)=\"setActiveTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"axp-kanban-container ax-h-full ax-w-full\"\n ></axm-task-board-kanban-view>\n }@case('grid') {\n <axm-task-board-grid-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n class=\"ax-h-full ax-w-full\"\n (onTaskClick)=\"setActiveTask($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 [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\"\n ></axm-task-board-status-grouped-grid-view>\n }@case('time-grouped-grid') {\n <axm-task-board-time-grouped-grid-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\"\n ></axm-task-board-time-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full\"\n [dataSource]=\"dataSource\"\n [startingDate]=\"vm.currentDate()\"\n (onTaskClick)=\"setActiveTask($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() && layoutService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
835
956
  //
836
957
  AXMenuModule }, { kind: "component", type: i3.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i4.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: i4.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i4.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i6.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i6.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: "ngmodule", type: AXBreadcrumbsModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type:
837
958
  //
@@ -869,8 +990,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImpor
869
990
  provide: AXPPageLayoutBase,
870
991
  useExisting: AXMTaskBoardPage,
871
992
  },
872
- ], 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\n [text]=\"t(vm.selectedTaskType()?.title || 'task-board.all', { scope: rootConfig.config.i18n }) | async\"\n >\n <ax-prefix><ax-icon icon=\"fa-light {{vm.selectedTaskType()?.icon || 'fa-tasks'}}\"></ax-icon></ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list class=\"ax-p-2\">\n @if(vm.currentViewMode()!=='kanban' && vm.currentViewMode()!=='grid' &&\n vm.currentViewMode()!=='status-grouped-grid' && vm.currentViewMode()!=='time-grouped-grid') {\n <ax-button-item\n (onClick)=\"handleSelectedTaskTypeChange(null)\"\n [text]=\"(t('task-board.all', { scope: rootConfig.config.i18n }) | async)!\"\n >\n <ax-prefix><ax-icon icon=\"fa-light fa-tasks\"></ax-icon></ax-prefix>\n </ax-button-item>\n } @for(item of vm.taskTypes(); track item.name) {\n <ax-button-item\n (onClick)=\"handleSelectedTaskTypeChange(item)\"\n [text]=\"(t(item.title, { scope: rootConfig.config.i18n }) | async)!\"\n >\n <ax-prefix><ax-icon icon=\"fa-light {{ item.icon }}\"></ax-icon></ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\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>\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 (onValueChanged)=\"handleSchedulerDateChanged($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 <axp-layout-suffix>\n <ax-button>\n <ax-icon icon=\"fa-light {{ selectedViewMode().icon }}\"></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for(item of viewsItems(); track item.key) { @if(item.title) {\n <ax-title>{{(t('task-board.'+item.title, { scope: rootConfig.config.i18n }) | async)}}</ax-title>\n }\n <ax-button-item\n [text]=\"(t('task-board.view.' + item.text, { scope: 'workflow-management' }) | async)!\"\n [selected]=\"vm.currentViewMode() === item.key\"\n (onClick)=\"handleCalendarViewChange(item.key)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light {{ item.icon }}\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n @if(item.break) {\n <ax-divider></ax-divider>\n } }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n\n @if(layoutService.isLarge()) {\n <!-- Detail Panel Toggle -->\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 >@switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onTaskClick)=\"setActiveTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"axp-kanban-container ax-h-full ax-w-full\"\n ></axm-task-board-kanban-view>\n }@case('grid') {\n <axm-task-board-grid-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n class=\"ax-h-full ax-w-full\"\n (onTaskClick)=\"setActiveTask($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 [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\"\n ></axm-task-board-status-grouped-grid-view>\n }@case('time-grouped-grid') {\n <axm-task-board-time-grouped-grid-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\"\n ></axm-task-board-time-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full\"\n [dataSource]=\"dataSource\"\n [startingDate]=\"vm.currentDate()\"\n (onTaskClick)=\"setActiveTask($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() && layoutService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\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"] }]
993
+ ], 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\n [text]=\"t(vm.selectedTaskType()?.title || 'task-board.all', { scope: rootConfig.config.i18n }) | async\"\n >\n <ax-prefix><ax-icon icon=\"fa-light {{vm.selectedTaskType()?.icon || 'fa-tasks'}}\"></ax-icon></ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list class=\"ax-p-2\">\n @if(vm.currentViewMode()!=='kanban' && vm.currentViewMode()!=='grid' &&\n vm.currentViewMode()!=='status-grouped-grid' && vm.currentViewMode()!=='time-grouped-grid') {\n <ax-button-item\n (onClick)=\"handleSelectedTaskTypeChange(null)\"\n [text]=\"(t('task-board.all', { scope: rootConfig.config.i18n }) | async)!\"\n >\n <ax-prefix><ax-icon icon=\"fa-light fa-tasks\"></ax-icon></ax-prefix>\n </ax-button-item>\n } @for(item of vm.taskTypes(); track item.name) {\n <ax-button-item\n (onClick)=\"handleSelectedTaskTypeChange(item)\"\n [text]=\"(t(item.title, { scope: rootConfig.config.i18n }) | async)!\"\n >\n <ax-prefix><ax-icon icon=\"fa-light {{ item.icon }}\"></ax-icon></ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\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 <axp-layout-suffix>\n <ax-button [text]=\"(t('task-board.' + selectedViewCategory().text, { scope: 'workflow-management' }) | async)!\">\n <ax-prefix><ax-icon icon=\"fa-light {{ selectedViewCategory().icon }}\"></ax-icon></ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for(item of categoryItems(); track item.key) {\n <ax-button-item\n [text]=\"(t('task-board.' + item.text, { scope: 'workflow-management' }) | async)!\"\n [selected]=\"vm.currentViewCategory() === item.key\"\n (onClick)=\"handleViewCategoryChange(item.key)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light {{ item.icon }}\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n @if(item.break) {\n <ax-divider></ax-divider>\n } }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n @if(currentViewModes().length){\n <ax-button [text]=\"(t('task-board.view.' + selectedViewMode().text, { scope: 'workflow-management' }) | async)!\">\n <ax-prefix><ax-icon icon=\"fa-light {{ selectedViewMode().icon }}\"></ax-icon></ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for(item of currentViewModes(); track item.key) {\n <ax-button-item\n [text]=\"(t('task-board.view.' + item.text, { scope: 'workflow-management' }) | async)!\"\n [selected]=\"vm.currentViewMode() === item.key\"\n (onClick)=\"handleCalendarViewChange(item.key)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light {{ item.icon }}\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n } @if(layoutService.isLarge()) {\n <!-- Detail Panel Toggle -->\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 >@switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onTaskClick)=\"setActiveTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"axp-kanban-container ax-h-full ax-w-full\"\n ></axm-task-board-kanban-view>\n }@case('grid') {\n <axm-task-board-grid-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n class=\"ax-h-full ax-w-full\"\n (onTaskClick)=\"setActiveTask($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 [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\"\n ></axm-task-board-status-grouped-grid-view>\n }@case('time-grouped-grid') {\n <axm-task-board-time-grouped-grid-view\n [statuses]=\"statuses()\"\n [tasks]=\"resolvedTasks()\"\n (onActionClick)=\"handleContextMenu($event)\"\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\"\n ></axm-task-board-time-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full\"\n [dataSource]=\"dataSource\"\n [startingDate]=\"vm.currentDate()\"\n (onTaskClick)=\"setActiveTask($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() && layoutService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\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"] }]
873
994
  }] });
874
995
 
875
996
  export { AXMTaskBoardPage };
876
- //# sourceMappingURL=acorex-modules-workflow-management-task-board.page-Dp7SJ3NA.mjs.map
997
+ //# sourceMappingURL=acorex-modules-workflow-management-task-board.page-zaSchG-u.mjs.map