@acorex/modules 20.0.21 → 20.0.23
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/document-management/index.d.ts +3 -0
- package/fesm2022/{acorex-modules-document-management-acorex-modules-document-management-CJYBHKUf.mjs → acorex-modules-document-management-acorex-modules-document-management-Bte3VGKC.mjs} +243 -51
- package/fesm2022/acorex-modules-document-management-acorex-modules-document-management-Bte3VGKC.mjs.map +1 -0
- package/fesm2022/{acorex-modules-document-management-attachment-widget.component-Cc-hsCCX.mjs → acorex-modules-document-management-attachment-widget.component-Cc0anIMV.mjs} +2 -2
- 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
- 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
- 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
- package/fesm2022/{acorex-modules-document-management-details-view.component-CqK0rCnR.mjs → acorex-modules-document-management-details-view.component-BeN0NPcy.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-details-view.component-CqK0rCnR.mjs.map → acorex-modules-document-management-details-view.component-BeN0NPcy.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-drive-choose.component-r8KKbY1d.mjs → acorex-modules-document-management-drive-choose.component-B66wODCQ.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-drive-choose.component-r8KKbY1d.mjs.map → acorex-modules-document-management-drive-choose.component-B66wODCQ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-drive.component-0wxNHSJr.mjs → acorex-modules-document-management-drive.component-CUej0GjY.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-drive.component-0wxNHSJr.mjs.map → acorex-modules-document-management-drive.component-CUej0GjY.mjs.map} +1 -1
- 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
- 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
- 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
- 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
- package/fesm2022/{acorex-modules-document-management-list-view.component-DZKdXqAA.mjs → acorex-modules-document-management-list-view.component-1M2rIOGv.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-list-view.component-DZKdXqAA.mjs.map → acorex-modules-document-management-list-view.component-1M2rIOGv.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-permission-definition.provider-C31fYGZT.mjs → acorex-modules-document-management-permission-definition.provider-BEq3ySY3.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-permission-definition.provider-C31fYGZT.mjs.map → acorex-modules-document-management-permission-definition.provider-BEq3ySY3.mjs.map} +1 -1
- 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
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/acorex-modules-document-management.mjs +1 -1
- package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-C3UP9Jsi.mjs +478 -0
- package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-C3UP9Jsi.mjs.map +1 -0
- package/fesm2022/acorex-modules-report-management.mjs +71 -125
- package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-workflow-management-task-board.page-Dp7SJ3NA.mjs → acorex-modules-workflow-management-task-board.page-zaSchG-u.mjs} +207 -86
- package/fesm2022/acorex-modules-workflow-management-task-board.page-zaSchG-u.mjs.map +1 -0
- package/fesm2022/acorex-modules-workflow-management.mjs +2 -2
- package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
- package/package.json +1 -1
- package/report-management/index.d.ts +74 -36
- package/fesm2022/acorex-modules-document-management-acorex-modules-document-management-CJYBHKUf.mjs.map +0 -1
- package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-S8qyvs79.mjs +0 -634
- package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-S8qyvs79.mjs.map +0 -1
- package/fesm2022/acorex-modules-report-management-run.command-DHPmdkSZ.mjs +0 -20
- package/fesm2022/acorex-modules-report-management-run.command-DHPmdkSZ.mjs.map +0 -1
- 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["
|
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
|
-
|
68
|
+
detailPanel: false,
|
69
|
+
selectedTask: null,
|
70
|
+
rangeStartDate: null,
|
65
71
|
currentDate: new Date(),
|
72
|
+
currentViewMode: 'month',
|
66
73
|
selectedTaskTypeName: null,
|
67
|
-
|
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,
|
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.
|
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
|
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
|
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',
|
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',
|
571
|
-
{ key: 'grid', text: 'grid', icon: 'fa-light fa-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',
|
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
|
608
|
-
|
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 '
|
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.
|
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
|
-
|
661
|
-
const
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
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
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
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.
|
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.
|
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 (
|
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 (
|
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-
|
997
|
+
//# sourceMappingURL=acorex-modules-workflow-management-task-board.page-zaSchG-u.mjs.map
|