@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.
- 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-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/fesm2022/acorex-modules-document-management-acorex-modules-document-management-CJYBHKUf.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
|