@acorex/modules 19.2.8 → 19.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/application-management/lib/layouts/module-entity-detail-view/module-entity-detail-view.component.d.ts +3 -0
- package/conversation/lib/entities/chat/chat.module.d.ts +2 -3
- package/fesm2022/acorex-modules-application-management.mjs +15 -2
- package/fesm2022/acorex-modules-application-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-auth-acorex-modules-auth-HwJJs-3A.mjs → acorex-modules-auth-acorex-modules-auth-D1qxdECo.mjs} +8 -8
- package/fesm2022/{acorex-modules-auth-acorex-modules-auth-HwJJs-3A.mjs.map → acorex-modules-auth-acorex-modules-auth-D1qxdECo.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-app-chooser.component-BvxMkXPp.mjs → acorex-modules-auth-app-chooser.component-8GCTwtb2.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-app-chooser.component-BvxMkXPp.mjs.map → acorex-modules-auth-app-chooser.component-8GCTwtb2.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-login.module-CDvLUxls.mjs → acorex-modules-auth-login.module-DR3QLEM-.mjs} +4 -4
- package/fesm2022/{acorex-modules-auth-login.module-CDvLUxls.mjs.map → acorex-modules-auth-login.module-DR3QLEM-.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-master.layout-CnKBnl8W.mjs → acorex-modules-auth-master.layout-BMJ5mW63.mjs} +4 -4
- package/fesm2022/{acorex-modules-auth-master.layout-CnKBnl8W.mjs.map → acorex-modules-auth-master.layout-BMJ5mW63.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-C16jeHuJ.mjs → acorex-modules-auth-password.component-EXWlXGez.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-password.component-C16jeHuJ.mjs.map → acorex-modules-auth-password.component-EXWlXGez.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-1FnIjiZ8.mjs → acorex-modules-auth-password.component-avrMwyr8.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-password.component-1FnIjiZ8.mjs.map → acorex-modules-auth-password.component-avrMwyr8.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-routes-ZDDUhAWd.mjs → acorex-modules-auth-routes-BPYBFOxg.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-routes-ZDDUhAWd.mjs.map → acorex-modules-auth-routes-BPYBFOxg.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-two-factor.module-C32MVGby.mjs → acorex-modules-auth-two-factor.module-B_V_nQN_.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-two-factor.module-C32MVGby.mjs.map → acorex-modules-auth-two-factor.module-B_V_nQN_.mjs.map} +1 -1
- package/fesm2022/acorex-modules-auth.mjs +1 -1
- package/fesm2022/acorex-modules-conversation.mjs +3 -8
- package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
- package/fesm2022/{acorex-modules-form-template-management-acorex-modules-form-template-management-CUQ-GAN5.mjs → acorex-modules-form-template-management-acorex-modules-form-template-management-gE7jDpjq.mjs} +75 -7
- package/fesm2022/acorex-modules-form-template-management-acorex-modules-form-template-management-gE7jDpjq.mjs.map +1 -0
- package/fesm2022/{acorex-modules-form-template-management-category.entity-WtgUidaW.mjs → acorex-modules-form-template-management-category.entity-BaX5yaK9.mjs} +2 -2
- package/fesm2022/{acorex-modules-form-template-management-category.entity-WtgUidaW.mjs.map → acorex-modules-form-template-management-category.entity-BaX5yaK9.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-form-template-management-setting.provider-u7Jv1myU.mjs → acorex-modules-form-template-management-setting.provider-h3v_4sR9.mjs} +2 -2
- package/fesm2022/{acorex-modules-form-template-management-setting.provider-u7Jv1myU.mjs.map → acorex-modules-form-template-management-setting.provider-h3v_4sR9.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-form-template-management-template-widget-edit.component-DPdPjZGi.mjs → acorex-modules-form-template-management-template-widget-edit.component-GxCDqH9d.mjs} +2 -2
- package/fesm2022/{acorex-modules-form-template-management-template-widget-edit.component-DPdPjZGi.mjs.map → acorex-modules-form-template-management-template-widget-edit.component-GxCDqH9d.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-form-template-management-template.entity-BnctQkm6.mjs → acorex-modules-form-template-management-template.entity-CzmbpLj_.mjs} +33 -2
- package/fesm2022/acorex-modules-form-template-management-template.entity-CzmbpLj_.mjs.map +1 -0
- package/fesm2022/acorex-modules-form-template-management-viewer-popup.component-CJKcMi8Q.mjs +93 -0
- package/fesm2022/acorex-modules-form-template-management-viewer-popup.component-CJKcMi8Q.mjs.map +1 -0
- package/fesm2022/acorex-modules-form-template-management.mjs +1 -1
- package/fesm2022/{acorex-modules-organization-management-add-item.component-DsWqdz8M.mjs → acorex-modules-organization-management-add-item.component-PhQRBTtI.mjs} +13 -10
- package/fesm2022/acorex-modules-organization-management-add-item.component-PhQRBTtI.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-org-chart-configuration.page-DBc6gISy.mjs → acorex-modules-organization-management-org-chart-configuration.page-DjzqBdaS.mjs} +3 -3
- package/fesm2022/acorex-modules-organization-management-org-chart-configuration.page-DjzqBdaS.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-org-chart.page-e-N7Ql80.mjs → acorex-modules-organization-management-org-chart.page-BSh18amn.mjs} +167 -118
- package/fesm2022/acorex-modules-organization-management-org-chart.page-BSh18amn.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management.mjs +2 -2
- package/fesm2022/acorex-modules-platform-management.mjs +301 -100
- package/fesm2022/acorex-modules-platform-management.mjs.map +1 -1
- package/form-template-management/lib/features/viewer/viewer-connector.service.d.ts +12 -0
- package/form-template-management/lib/features/viewer/viewer-popup.component.d.ts +23 -0
- package/form-template-management/lib/features/viewer/workflows/open-template.workflow.d.ts +9 -0
- package/organization-management/lib/features/organization-chart/add-item/add-item.component.d.ts +2 -1
- package/organization-management/lib/features/organization-chart/org-chart-configuration.page.d.ts +3 -0
- package/organization-management/lib/features/organization-chart/org-chart.page.d.ts +3 -0
- package/organization-management/lib/features/organization-chart/org-chart.service.d.ts +15 -13
- package/package.json +5 -5
- package/platform-management/lib/common/regional/index.d.ts +0 -2
- package/platform-management/lib/common/regional/language-slot/language-slot.component.d.ts +1 -1
- package/platform-management/lib/entities/check-version.d.ts +1 -0
- package/platform-management/lib/entities/data-source/data-source.types.d.ts +2 -1
- package/platform-management/lib/entities/data-source/datasource-provider.dynamic.d.ts +2 -0
- package/fesm2022/acorex-modules-form-template-management-acorex-modules-form-template-management-CUQ-GAN5.mjs.map +0 -1
- package/fesm2022/acorex-modules-form-template-management-template.entity-BnctQkm6.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-add-item.component-DsWqdz8M.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-org-chart-configuration.page-DBc6gISy.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-org-chart.page-e-N7Ql80.mjs.map +0 -1
- package/fesm2022/acorex-modules-platform-management-countries-0S6HdpYF.mjs +0 -500
- package/fesm2022/acorex-modules-platform-management-countries-0S6HdpYF.mjs.map +0 -1
- package/fesm2022/acorex-modules-platform-management-currencies-vgPg4Hj3.mjs +0 -13
- package/fesm2022/acorex-modules-platform-management-currencies-vgPg4Hj3.mjs.map +0 -1
- package/fesm2022/acorex-modules-platform-management-regional-formats-BaHofjWg.mjs +0 -14
- package/fesm2022/acorex-modules-platform-management-regional-formats-BaHofjWg.mjs.map +0 -1
- package/fesm2022/acorex-modules-platform-management-timezones-BoScbn0h.mjs +0 -15
- package/fesm2022/acorex-modules-platform-management-timezones-BoScbn0h.mjs.map +0 -1
- package/platform-management/lib/common/regional/data/countries.d.ts +0 -2
- package/platform-management/lib/common/regional/data/currencies.d.ts +0 -2
- package/platform-management/lib/common/regional/data/regional-formats.d.ts +0 -2
- package/platform-management/lib/common/regional/data/timezones.d.ts +0 -2
- package/platform-management/lib/common/regional/regional-util.service.d.ts +0 -12
- package/platform-management/lib/common/regional/regional.types.d.ts +0 -52
@@ -23,12 +23,12 @@ import get from 'lodash-es/get';
|
|
23
23
|
import { AXMOrganizationManagementDepartmentEntityService, AXMOrganizationManagementDivisionEntityService, AXMOrganizationManagementBranchEntityService, AXMOrganizationManagementEmployeeEntityService, AXMOrganizationManagementPositionEntityService, AXMOrganizationManagementChartEntityService, AXMOrganizationNodeType, AXM_ORG_CHART_NODE_TYPE_ENTITY_MAPPINGS, RootConfig, AXMOrganizationNodeTypeCategory } from './acorex-modules-organization-management.mjs';
|
24
24
|
import { A as AXMOrgChartConfigService } from './acorex-modules-organization-management-org-chart-configuration.service-QLdDEdqL.mjs';
|
25
25
|
import { AXLoadingDialogService } from '@acorex/components/loading-dialog';
|
26
|
-
import { AXPExportService, AXPDataGenerator } from '@acorex/platform/common';
|
27
|
-
import {
|
28
|
-
import { cloneDeep } from 'lodash-es';
|
26
|
+
import { AXPExportService, AXPRegionalService, AXPDataGenerator } from '@acorex/platform/common';
|
27
|
+
import { AXDialogService } from '@acorex/components/dialog';
|
29
28
|
import { AXPopupService } from '@acorex/components/popup';
|
30
|
-
import {
|
29
|
+
import { AXPSessionService } from '@acorex/platform/auth';
|
31
30
|
import { applyFilterArray } from '@acorex/platform/core';
|
31
|
+
import { cloneDeep } from 'lodash-es';
|
32
32
|
import set from 'lodash-es/set';
|
33
33
|
|
34
34
|
/**
|
@@ -172,7 +172,9 @@ class AXMOrgChartService {
|
|
172
172
|
this.popupService = inject(AXPopupService);
|
173
173
|
this.layoutService = inject(AXPLayoutThemeService);
|
174
174
|
this.regionalService = inject(AXPRegionalService);
|
175
|
-
this.
|
175
|
+
this.dialogService = inject(AXDialogService);
|
176
|
+
this.translateService = inject(AXTranslationService);
|
177
|
+
this._rootNode = signal({ id: AXPDataGenerator.uuid(), title: 'Company' });
|
176
178
|
this.rootNode = this._rootNode.asReadonly();
|
177
179
|
// The clipboard holds the node being cut or copied.
|
178
180
|
this.clipboard = signal(null);
|
@@ -182,9 +184,7 @@ class AXMOrgChartService {
|
|
182
184
|
const first = (await this.chartService.query({
|
183
185
|
skip: 0,
|
184
186
|
take: 1,
|
185
|
-
sort: [
|
186
|
-
{ field: 'version', dir: 'desc' }
|
187
|
-
]
|
187
|
+
sort: [{ field: 'version', dir: 'desc' }],
|
188
188
|
})).items[0];
|
189
189
|
//
|
190
190
|
if (first) {
|
@@ -211,14 +211,18 @@ class AXMOrgChartService {
|
|
211
211
|
id: tenant.id,
|
212
212
|
source: 'tenant',
|
213
213
|
},
|
214
|
-
children: []
|
214
|
+
children: [],
|
215
215
|
},
|
216
216
|
};
|
217
217
|
await this.chartService.insertOne({ data: record.data, version: record.version });
|
218
218
|
}
|
219
219
|
async save() {
|
220
220
|
const first = (await this.chartService.query()).items[0];
|
221
|
-
await this.chartService.updateOne(first.id, {
|
221
|
+
await this.chartService.updateOne(first.id, {
|
222
|
+
version: first.version,
|
223
|
+
data: this._rootNode(),
|
224
|
+
updateAt: new Date(),
|
225
|
+
});
|
222
226
|
}
|
223
227
|
//#endregion
|
224
228
|
//#region Context Menu
|
@@ -231,7 +235,7 @@ class AXMOrgChartService {
|
|
231
235
|
Location: [],
|
232
236
|
BusinessUnit: [],
|
233
237
|
Role: [],
|
234
|
-
Employee: []
|
238
|
+
Employee: [],
|
235
239
|
};
|
236
240
|
Object.entries(AXM_ORG_CHART_NODE_TYPE_ENTITY_MAPPINGS).forEach(([entitySource, config]) => {
|
237
241
|
if (allowedTypes.includes(config.type)) {
|
@@ -242,12 +246,12 @@ class AXMOrgChartService {
|
|
242
246
|
data: {
|
243
247
|
node,
|
244
248
|
config,
|
245
|
-
source: entitySource
|
249
|
+
source: entitySource,
|
246
250
|
},
|
247
251
|
});
|
248
252
|
}
|
249
253
|
});
|
250
|
-
Object.values(groupedMenuItems).forEach(group => {
|
254
|
+
Object.values(groupedMenuItems).forEach((group) => {
|
251
255
|
if (group.length > 0) {
|
252
256
|
allowedMenuItems.push(...group);
|
253
257
|
group[group.length - 1].break = true;
|
@@ -259,7 +263,7 @@ class AXMOrgChartService {
|
|
259
263
|
return allowedMenuItems;
|
260
264
|
}
|
261
265
|
//#endregion
|
262
|
-
//#region Check Permission
|
266
|
+
//#region Check Permission
|
263
267
|
async getAllowedChildCategoriesForParent(parent) {
|
264
268
|
await this.configService.load();
|
265
269
|
const types = this.configService.types;
|
@@ -275,11 +279,16 @@ class AXMOrgChartService {
|
|
275
279
|
});
|
276
280
|
return Array.from(allowedTypes);
|
277
281
|
}
|
278
|
-
//#endregion
|
282
|
+
//#endregion
|
279
283
|
//#region Remove/Cut/Copy/Past
|
280
284
|
async removeNode(id) {
|
281
|
-
this.
|
282
|
-
await this.
|
285
|
+
const title = await this.translateService.translateAsync('dialogs.delete.title');
|
286
|
+
const message = await this.translateService.translateAsync('dialogs.delete.message');
|
287
|
+
const dialogResult = await this.dialogService.confirm(title, message, 'danger', 'horizontal');
|
288
|
+
if (dialogResult.result) {
|
289
|
+
this._rootNode.update((node) => this.removeNodeRecursively(node, id));
|
290
|
+
await this.save();
|
291
|
+
}
|
283
292
|
}
|
284
293
|
removeNodeRecursively(node, id) {
|
285
294
|
// If the node itself is the one to be deleted, return null
|
@@ -288,8 +297,9 @@ class AXMOrgChartService {
|
|
288
297
|
}
|
289
298
|
// Otherwise, recursively check children
|
290
299
|
if (node.children) {
|
291
|
-
node.children = node.children
|
292
|
-
.
|
300
|
+
node.children = node.children
|
301
|
+
.filter((child) => child.id !== id)
|
302
|
+
.map((child) => {
|
293
303
|
return { ...child, children: this.removeNodeRecursively(child, id)?.children };
|
294
304
|
});
|
295
305
|
}
|
@@ -307,18 +317,18 @@ class AXMOrgChartService {
|
|
307
317
|
return allowedTypes.includes(this.clipboard()?.node.type);
|
308
318
|
}
|
309
319
|
/**
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
320
|
+
* Cuts the node with the given id.
|
321
|
+
* The node is removed from the tree and stored in the clipboard.
|
322
|
+
* Cutting the root node is not allowed.
|
323
|
+
*/
|
314
324
|
async cutNode(id) {
|
315
325
|
const tree = this._rootNode();
|
316
326
|
if (tree.id === id) {
|
317
|
-
throw new Error(
|
327
|
+
throw new Error('Cannot cut the root node.');
|
318
328
|
}
|
319
329
|
const result = this.findNodeAndParent(tree, id);
|
320
330
|
if (!result) {
|
321
|
-
throw new Error(
|
331
|
+
throw new Error('Node not found.');
|
322
332
|
}
|
323
333
|
// Set the clipboard signal with mode 'cut'
|
324
334
|
this.clipboard.set({ mode: 'cut', node: result.node });
|
@@ -328,32 +338,32 @@ class AXMOrgChartService {
|
|
328
338
|
await this.save();
|
329
339
|
}
|
330
340
|
/**
|
331
|
-
|
332
|
-
|
333
|
-
|
341
|
+
* Copies the node with the given id.
|
342
|
+
* A deep clone of the node is stored in the clipboard.
|
343
|
+
*/
|
334
344
|
copyNode(id) {
|
335
345
|
const tree = this._rootNode();
|
336
346
|
const result = this.findNodeAndParent(tree, id);
|
337
347
|
if (!result) {
|
338
|
-
throw new Error(
|
348
|
+
throw new Error('Node not found.');
|
339
349
|
}
|
340
350
|
// Use lodash's cloneDeep to create a deep clone.
|
341
351
|
const copiedNode = cloneDeep(result.node);
|
342
352
|
this.clipboard.set({ mode: 'copy', node: copiedNode });
|
343
353
|
}
|
344
354
|
/**
|
345
|
-
|
346
|
-
|
347
|
-
|
355
|
+
* Pastes the node in the clipboard as a child of the node with the given parentId.
|
356
|
+
* For a cut, the node is moved; for a copy, new IDs are generated so the pasted node is unique.
|
357
|
+
*/
|
348
358
|
async pasteNode(parentId) {
|
349
359
|
const clipboardValue = this.clipboard();
|
350
360
|
if (!clipboardValue) {
|
351
|
-
throw new Error(
|
361
|
+
throw new Error('Clipboard is empty.');
|
352
362
|
}
|
353
363
|
const tree = this._rootNode();
|
354
364
|
const parentResult = this.findNodeAndParent(tree, parentId);
|
355
365
|
if (!parentResult) {
|
356
|
-
throw new Error(
|
366
|
+
throw new Error('Parent node not found.');
|
357
367
|
}
|
358
368
|
let nodeToPaste;
|
359
369
|
if (clipboardValue.mode === 'cut') {
|
@@ -369,9 +379,9 @@ class AXMOrgChartService {
|
|
369
379
|
await this.save();
|
370
380
|
}
|
371
381
|
/**
|
372
|
-
|
373
|
-
|
374
|
-
|
382
|
+
* Recursively searches the tree for the node with the given id,
|
383
|
+
* returning both the node and its parent.
|
384
|
+
*/
|
375
385
|
findNodeAndParent(node, id, parent = null) {
|
376
386
|
if (node.id === id) {
|
377
387
|
return { node, parent };
|
@@ -402,7 +412,7 @@ class AXMOrgChartService {
|
|
402
412
|
assignNewIds(node) {
|
403
413
|
node.id = AXPDataGenerator.uuid();
|
404
414
|
if (node.children) {
|
405
|
-
node.children.forEach(child => this.assignNewIds(child));
|
415
|
+
node.children.forEach((child) => this.assignNewIds(child));
|
406
416
|
}
|
407
417
|
}
|
408
418
|
/**
|
@@ -416,7 +426,7 @@ class AXMOrgChartService {
|
|
416
426
|
if (node.children) {
|
417
427
|
return {
|
418
428
|
...node,
|
419
|
-
children: node.children.map(child => this.insertNodeRecursively(child, parentId, newNode))
|
429
|
+
children: node.children.map((child) => this.insertNodeRecursively(child, parentId, newNode)),
|
420
430
|
};
|
421
431
|
}
|
422
432
|
return node;
|
@@ -425,84 +435,123 @@ class AXMOrgChartService {
|
|
425
435
|
//#region Add Node
|
426
436
|
async addNode(data) {
|
427
437
|
this.layoutService.setNavigationLoading(true);
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
items,
|
445
|
-
total: items.length
|
438
|
+
try {
|
439
|
+
const component = (await import('./acorex-modules-organization-management-add-item.component-PhQRBTtI.mjs')).AddItemComponent;
|
440
|
+
const node = get(data, 'node');
|
441
|
+
const type = get(data, 'config.type');
|
442
|
+
const icon = get(data, 'config.icon');
|
443
|
+
const source = get(data, 'source');
|
444
|
+
let query;
|
445
|
+
const countrySource = async (request) => {
|
446
|
+
let list = await this.regionalService.getCountries();
|
447
|
+
if (request.filter) {
|
448
|
+
list = applyFilterArray(list, [request.filter]);
|
449
|
+
}
|
450
|
+
const items = list.map((c) => ({
|
451
|
+
id: c.code,
|
452
|
+
title: c.title,
|
453
|
+
}));
|
454
|
+
return { items, total: items.length };
|
446
455
|
};
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
let descriptionField = 'description';
|
452
|
-
switch (type) {
|
453
|
-
case AXMOrganizationNodeType.Country:
|
454
|
-
query = countrySource;
|
455
|
-
break;
|
456
|
-
case AXMOrganizationNodeType.Department:
|
457
|
-
query = this.departmentService.query.bind(this.departmentService);
|
458
|
-
break;
|
459
|
-
case AXMOrganizationNodeType.Division:
|
460
|
-
query = this.divisionService.query.bind(this.divisionService);
|
461
|
-
break;
|
462
|
-
case AXMOrganizationNodeType.Branch:
|
463
|
-
query = this.branchService.query.bind(this.branchService);
|
464
|
-
break;
|
465
|
-
case AXMOrganizationNodeType.Position:
|
466
|
-
query = this.positionService.query.bind(this.positionService);
|
467
|
-
break;
|
468
|
-
case AXMOrganizationNodeType.Employee:
|
469
|
-
query = this.employmentService.query.bind(this.employmentService);
|
470
|
-
break;
|
471
|
-
default:
|
472
|
-
break;
|
473
|
-
}
|
474
|
-
const result = await this.popupService.open(comp, {
|
475
|
-
title: `Add ${get(data, 'config.title')}`,
|
476
|
-
size: 'md',
|
477
|
-
data: {
|
478
|
-
config: {
|
479
|
-
valueField,
|
480
|
-
titleField,
|
481
|
-
subtitleField,
|
482
|
-
descriptionField,
|
483
|
-
query: query
|
456
|
+
const provinceSource = async (request) => {
|
457
|
+
let list = await this.regionalService.getProvinces(node.type === AXMOrganizationNodeType.Country ? node.entity?.id : undefined);
|
458
|
+
if (request.filter) {
|
459
|
+
list = applyFilterArray(list, [request.filter]);
|
484
460
|
}
|
461
|
+
const items = list.map((c) => ({
|
462
|
+
id: c.code,
|
463
|
+
title: c.title,
|
464
|
+
}));
|
465
|
+
return { items, total: items.length };
|
466
|
+
};
|
467
|
+
const citySource = async (request) => {
|
468
|
+
let filter = {};
|
469
|
+
if (node.type === AXMOrganizationNodeType.Country) {
|
470
|
+
filter.countryId = node.entity?.id;
|
471
|
+
}
|
472
|
+
else if (node.type === AXMOrganizationNodeType.State) {
|
473
|
+
filter.provinceId = node.entity?.id;
|
474
|
+
}
|
475
|
+
let list = await this.regionalService.getCities(filter);
|
476
|
+
if (request.filter) {
|
477
|
+
list = applyFilterArray(list, [request.filter]);
|
478
|
+
}
|
479
|
+
const items = list.map((c) => ({
|
480
|
+
id: c.code,
|
481
|
+
title: c.title,
|
482
|
+
}));
|
483
|
+
return { items, total: items.length };
|
484
|
+
};
|
485
|
+
const valueField = 'id';
|
486
|
+
const titleField = 'title';
|
487
|
+
const subtitleField = null;
|
488
|
+
const descriptionField = 'description';
|
489
|
+
switch (type) {
|
490
|
+
case AXMOrganizationNodeType.Country:
|
491
|
+
query = countrySource;
|
492
|
+
break;
|
493
|
+
case AXMOrganizationNodeType.State:
|
494
|
+
query = provinceSource;
|
495
|
+
break;
|
496
|
+
case AXMOrganizationNodeType.City:
|
497
|
+
query = citySource;
|
498
|
+
break;
|
499
|
+
case AXMOrganizationNodeType.Department:
|
500
|
+
query = this.departmentService.query.bind(this.departmentService);
|
501
|
+
break;
|
502
|
+
case AXMOrganizationNodeType.Division:
|
503
|
+
query = this.divisionService.query.bind(this.divisionService);
|
504
|
+
break;
|
505
|
+
case AXMOrganizationNodeType.Branch:
|
506
|
+
query = this.branchService.query.bind(this.branchService);
|
507
|
+
break;
|
508
|
+
case AXMOrganizationNodeType.Position:
|
509
|
+
query = this.positionService.query.bind(this.positionService);
|
510
|
+
break;
|
511
|
+
case AXMOrganizationNodeType.Employee:
|
512
|
+
query = this.employmentService.query.bind(this.employmentService);
|
513
|
+
break;
|
514
|
+
default:
|
515
|
+
throw new Error(`Unsupported node type: ${type}`);
|
485
516
|
}
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
517
|
+
const result = await this.popupService.open(component, {
|
518
|
+
title: `Add ${get(data, 'config.title')}`,
|
519
|
+
size: 'md',
|
520
|
+
data: {
|
521
|
+
config: {
|
522
|
+
valueField,
|
523
|
+
titleField,
|
524
|
+
subtitleField,
|
525
|
+
descriptionField,
|
526
|
+
query: query,
|
527
|
+
},
|
528
|
+
},
|
529
|
+
});
|
530
|
+
if (!result.data) {
|
531
|
+
return false;
|
498
532
|
}
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
533
|
+
const newNode = {
|
534
|
+
id: AXPDataGenerator.uuid(),
|
535
|
+
title: result.data.title,
|
536
|
+
description: result.data.description,
|
537
|
+
subtitle: result.data.subtitle,
|
538
|
+
type: type,
|
539
|
+
parentId: node.id,
|
540
|
+
icon,
|
541
|
+
entity: {
|
542
|
+
id: result.data.id,
|
543
|
+
source: source,
|
544
|
+
},
|
545
|
+
};
|
546
|
+
const tree = this._rootNode();
|
547
|
+
const newTree = this.insertNodeRecursively(tree, node.id, newNode);
|
548
|
+
this._rootNode.set(newTree);
|
549
|
+
await this.save();
|
550
|
+
return true;
|
551
|
+
}
|
552
|
+
finally {
|
553
|
+
this.layoutService.setNavigationLoading(false);
|
554
|
+
}
|
506
555
|
}
|
507
556
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
508
557
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartService }); }
|
@@ -552,13 +601,13 @@ class AXMOrgChartPage {
|
|
552
601
|
* Zooms in the chart.
|
553
602
|
*/
|
554
603
|
zoomIn() {
|
555
|
-
this.
|
604
|
+
this.panView()?.zoomIn();
|
556
605
|
}
|
557
606
|
/**
|
558
607
|
* Zooms out the chart.
|
559
608
|
*/
|
560
609
|
zoomOut() {
|
561
|
-
this.
|
610
|
+
this.panView()?.zoomOut();
|
562
611
|
}
|
563
612
|
/**
|
564
613
|
* Resets the zoom level and pan position of the chart.
|
@@ -860,7 +909,7 @@ class AXMOrgChartPage {
|
|
860
909
|
this.clearChart(this.treeContainer().nativeElement);
|
861
910
|
}
|
862
911
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartPage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
863
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.3", type: AXMOrgChartPage, isStandalone: true, selector: "ng-component", providers: [AXMOrgChartConfigService, AXMOrgChartService, AXMOrgChartPrintService], viewQueries: [{ propertyName: "nodeTemplate", first: true, predicate: ["nodeTemplate"], descendants: true, isSignal: true }, { propertyName: "treeContainer", first: true, predicate: ["chart"], descendants: true, isSignal: true }, { propertyName: "parent", first: true, predicate: ["parent"], descendants: true, isSignal: true }, { propertyName: "contextMenu", first: true, predicate: AXContextMenuComponent, descendants: true, isSignal: true }, { propertyName: "panView", first: true, predicate: AXPanViewDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<axp-layout-simple-page *translate=\"let t\">\n <axp-layout-header>\n <axp-layout-title> {{t(rootConfig.entities.chart.title) | async}} </axp-layout-title>\n\n <axp-layout-description> Clear and dynamic view of your organization's structure </axp-layout-description>\n\n <axp-layout-actions>\n <axp-layout-actions-primary> </axp-layout-actions-primary>\n\n <axp-layout-actions-secondary>\n <ax-button-item [text]=\"(t('print') | async)!\" (onClick)=\"printChart()\">\n <ax-prefix>\n <ax-icon [icon]=\"'fa-solid fa-print'\"> </ax-icon>\n </ax-prefix>\n </ax-button-item>\n </axp-layout-actions-secondary>\n </axp-layout-actions>\n\n <axp-layout-breadcrumbs>\n <ax-breadcrumbs [class.ax-hidden]=\"layout.isSmall()\">\n <ng-template #divider>\n <i class=\"fa-regular fa-slash-forward\"></i>\n </ng-template>\n <ax-breadcrumbs-item> {{(t('home') | async)}} </ax-breadcrumbs-item>\n <ax-breadcrumbs-item> Organization </ax-breadcrumbs-item>\n </ax-breadcrumbs>\n </axp-layout-breadcrumbs>\n </axp-layout-header>\n\n <axp-layout-content class=\"ax-overflow-hidden\">\n <div class=\"ax-h-[calc(100vh-290px)]\" #parent id=\"parent\">\n <div #chart axPanView [(panX)]=\"panX\" [(panY)]=\"panY\" [(zoom)]=\"panZoomLevel\" [fitContent]=\"true\"\n wrapperClasses=\"h\" class=\"ax-light\"></div>\n <ax-context-menu [target]=\"'.axp-chart-node'\" [orientation]=\"'vertical'\" [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\" (onOpening)=\"handleContextMenuOnOpening($event)\">\n </ax-context-menu>\n </div>\n </axp-layout-content>\n <axp-layout-footer>\n <axp-layout-prefix>\n <div class=\"ax-flex ax-gap-1 ax-light ax-flex-wrap ax-justify-center\">\n @let v = {cat:'Company'};\n @for (item of nodeTypes; track $index) {\n <div class=\"axp-node-hint\" [style]=\"getNodeColors(item.color)\" [class.ax-ms-4]=\"v.cat!=item.category\">\n <div class=\"--badge\">\n </div>\n {{item.title}}\n </div>\n {{updateVar(v,item.category)}}\n }\n </div>\n </axp-layout-prefix>\n <axp-layout-suffix>\n <div class=\"ax-flex ax-gap-2 \">\n <ax-button (onClick)=\"zoomOut()\">\n <ax-icon class=\"fa-solid fa-minus\"> </ax-icon>\n </ax-button>\n <ax-button [text]=\"panZoomLevel()\" (onClick)=\"zoomReset()\"></ax-button>\n <ax-button (onClick)=\"zoomIn()\">\n <ax-icon class=\"fa-solid fa-add\"> </ax-icon>\n </ax-button>\n <ax-button (onClick)=\"toggleFullscreen()\">\n <ax-icon>\n <i class=\"fa-solid\" [class]=\"isFullscreen()? 'fa-compress' : 'fa-expand'\"></i>\n </ax-icon>\n </ax-button>\n </div>\n </axp-layout-suffix>\n </axp-layout-footer>\n</axp-layout-simple-page>\n\n<ng-template #nodeTemplate let-data>\n <div>\n @switch (data.category) {\n <!-- Company -->\n @case (NodeTypes.Company) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'primary' }\"></ng-container>\n }\n <!-- Location -->\n @case (NodeTypes.Location) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n }\n <!-- BusinessUnit -->\n @case (NodeTypes.BusinessUnit) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n }\n <!-- Role -->\n @case (NodeTypes.Role) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent3' }\"></ng-container>\n }\n <!-- Employee -->\n @case (NodeTypes.Employee) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'surface' }\"></ng-container>\n }\n }\n </div>\n</ng-template>\n\n<!----------------------------------- General Node Template ----------------------------------->\n<ng-template #generalTemplate let-data=\"data\" let-color=\"color\">\n <div #node class=\"--node-container\" [style]=\"getNodeColors(color)\">\n <div class=\"--container\">\n <div class=\"--heading-container\">\n <div class=\"--content\">\n <div class=\"--icon\">\n <i class=\"fa-light fa-xl fa-fw\" [class]=\"data.icon\"></i>\n </div>\n <div class=\"--titles\">\n <span class=\"--title\">{{data.title}}</span>\n @if(data.subtitle)\n {\n <span class=\"--sub-title\">{{data.subtitle}}</span>\n }\n </div>\n @if(data?.children?.length){\n <div class=\"--badge\">\n <span>{{data?.children?.length ?? 0}}</span>\n </div>\n }\n </div>\n </div>\n @if(data.description)\n {\n <div class=\"--body-container\">\n <div class=\"--description\" [class.ax-pb-3]=\"data.children && data.children.length > 0\">\n {{data.description}}\n </div>\n </div>\n }\n @if(data.children && data.children.length > 0){\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"toggleNode(data,node)\">\n <ax-icon icon=\"fa-solid\" [class]=\"data.isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n</ng-template>", styles: [".axp-node-hint{display:flex;align-items:center;justify-content:center;gap:.25rem;font-size:.75rem;line-height:1rem}.axp-node-hint>div.--badge{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));display:flex;width:.75rem;height:.75rem;align-items:center;justify-content:center;border-radius:.125rem}.axp-chart-node{display:flex;align-items:center;justify-content:center}.axp-chart-node .--node-container{position:relative;cursor:pointer;--node-bg-color: var(--ax-sys-color-primary-surface);--node-text-color: var(--ax-sys-color-on-primary-surface);--node-border-color: var(--ax-sys-color-border-primary-surface)}.axp-chart-node .--node-container .--container{display:flex;max-height:100%;width:100%;flex-direction:column;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);border-color:rgba(var(--node-border-color))}.axp-chart-node .--node-container .--container .--heading-container{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));width:100%;padding:.5rem .75rem}.axp-chart-node .--node-container .--container .--heading-container .--content{display:flex;width:100%;align-items:center;justify-content:center;gap:.5rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--icon{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:2.75rem;height:2.75rem;flex:none;align-items:center;justify-content:center;border-radius:.5rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:1.5rem;height:1.5rem;flex:none;align-items:center;justify-content:center;border-radius:.375rem;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge>span{font-size:.75rem;line-height:1rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles{display:flex;width:100%;flex:1 1 0%;flex-direction:column;gap:.25rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1.125rem;line-height:1.75rem;font-weight:600;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--sub-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--body-container{width:100%;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lightest-surface),var(--tw-bg-opacity, 1));padding:.5rem .75rem;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1))}.axp-chart-node .--node-container .--container .--body-container .--description{text-align:center;font-size:.875rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--toggle{position:absolute;left:0;right:0;bottom:-.75rem;display:flex;width:100%;-webkit-user-select:none;-moz-user-select:-moz-none;user-select:none;align-items:center;justify-content:center}#parent:fullscreen{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "component", type: AXPSimplePageLayout, selector: "axp-layout-simple-page" }, { kind: "component", type: AXPThemeLayoutBlockComponent, selector: " axp-layout-content, axp-layout-header-container, axp-layout-side-container, axp-layout-sections, axp-layout-section-container, axp-layout-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title, axp-layout-nav-button, axp-layout-description, axp-layout-toolbar, axp-layout-title-bar, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPThemeLayoutHeaderTemplateComponent, selector: "axp-layout-header" }, { kind: "component", type: AXPThemeLayoutActionsComponent, selector: "axp-layout-actions" }, { kind: "component", type: AXPThemeLayoutPageSecondaryActionsComponent, selector: "axp-layout-actions-secondary" }, { kind: "component", type: AXPThemeLayoutPagePrimaryActionsComponent, selector: "axp-layout-actions-primary" }, { kind: "component", type: AXPThemeLayoutFooterComponent, selector: "axp-layout-footer" }, { kind: "ngmodule", type: AXMenuModule }, { kind: "component", type: i2.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i3.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i4.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i5.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i5.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "directive", type: AXPanViewDirective, selector: "[axPanView]", inputs: ["minZoom", "maxZoom", "zoomStep", "fitContent", "disablePan", "disableZoom", "wrapperClasses", "panX", "panY", "zoom"], outputs: ["panXChange", "panYChange", "zoomChange", "positionChange"], exportAs: ["axPanView"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "component", type: i6.AXBreadCrumbsComponent, selector: "ax-breadcrumbs" }, { kind: "component", type: i6.AXBreadCrumbsItemComponent, selector: "ax-breadcrumbs-item", inputs: ["disabled", "active"] }, { kind: "ngmodule", type: AXBadgeModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
912
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.3", type: AXMOrgChartPage, isStandalone: true, selector: "ng-component", providers: [AXMOrgChartConfigService, AXMOrgChartService, AXMOrgChartPrintService], viewQueries: [{ propertyName: "nodeTemplate", first: true, predicate: ["nodeTemplate"], descendants: true, isSignal: true }, { propertyName: "treeContainer", first: true, predicate: ["chart"], descendants: true, isSignal: true }, { propertyName: "parent", first: true, predicate: ["parent"], descendants: true, isSignal: true }, { propertyName: "contextMenu", first: true, predicate: AXContextMenuComponent, descendants: true, isSignal: true }, { propertyName: "panView", first: true, predicate: AXPanViewDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<axp-layout-simple-page *translate=\"let t\">\n <axp-layout-header>\n <axp-layout-title> {{t(rootConfig.entities.chart.title) | async}} </axp-layout-title>\n\n <axp-layout-description> Clear and dynamic view of your organization's structure </axp-layout-description>\n\n <axp-layout-actions>\n <axp-layout-actions-primary> </axp-layout-actions-primary>\n\n <axp-layout-actions-secondary>\n <ax-button-item [text]=\"(t('print') | async)!\" (onClick)=\"printChart()\">\n <ax-prefix>\n <ax-icon [icon]=\"'fa-solid fa-print'\"> </ax-icon>\n </ax-prefix>\n </ax-button-item>\n </axp-layout-actions-secondary>\n </axp-layout-actions>\n\n <axp-layout-breadcrumbs>\n <ax-breadcrumbs [class.ax-hidden]=\"layout.isSmall()\">\n <ng-template #divider>\n <i class=\"fa-regular fa-slash-forward\"></i>\n </ng-template>\n <ax-breadcrumbs-item> {{(t('home') | async)}} </ax-breadcrumbs-item>\n <ax-breadcrumbs-item> Organization </ax-breadcrumbs-item>\n </ax-breadcrumbs>\n </axp-layout-breadcrumbs>\n </axp-layout-header>\n\n <axp-layout-content class=\"ax-overflow-hidden\">\n <div class=\"ax-h-[calc(100vh-290px)]\" #parent id=\"parent\">\n <div #chart axPanView [(panX)]=\"panX\" [(panY)]=\"panY\" [freeMode]=\"true\" [(zoom)]=\"panZoomLevel\"\n [fitContent]=\"true\" wrapperClasses=\"h\" class=\"ax-light\"></div>\n <ax-context-menu [target]=\"'.axp-chart-node'\" [orientation]=\"'vertical'\" [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\" (onOpening)=\"handleContextMenuOnOpening($event)\">\n </ax-context-menu>\n </div>\n </axp-layout-content>\n <axp-layout-footer>\n <axp-layout-prefix>\n <div class=\"ax-flex ax-gap-1 ax-light ax-flex-wrap ax-justify-center\">\n @let v = {cat:'Company'};\n @for (item of nodeTypes; track $index) {\n <div class=\"axp-node-hint\" [style]=\"getNodeColors(item.color)\" [class.ax-ms-4]=\"v.cat!=item.category\">\n <div class=\"--badge\">\n </div>\n {{item.title}}\n </div>\n {{updateVar(v,item.category)}}\n }\n </div>\n </axp-layout-prefix>\n <axp-layout-suffix>\n <div class=\"ax-flex ax-gap-2 \">\n <ax-button (onClick)=\"zoomOut()\">\n <ax-icon class=\"fa-solid fa-minus\"> </ax-icon>\n </ax-button>\n <ax-button [text]=\"panZoomLevel()\" (onClick)=\"zoomReset()\"></ax-button>\n <ax-button (onClick)=\"zoomIn()\">\n <ax-icon class=\"fa-solid fa-add\"> </ax-icon>\n </ax-button>\n <ax-button (onClick)=\"toggleFullscreen()\">\n <ax-icon>\n <i class=\"fa-solid\" [class]=\"isFullscreen()? 'fa-compress' : 'fa-expand'\"></i>\n </ax-icon>\n </ax-button>\n </div>\n </axp-layout-suffix>\n </axp-layout-footer>\n</axp-layout-simple-page>\n\n<ng-template #nodeTemplate let-data>\n <div>\n @switch (data.category) {\n <!-- Company -->\n @case (NodeTypes.Company) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'primary' }\"></ng-container>\n }\n <!-- Location -->\n @case (NodeTypes.Location) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n }\n <!-- BusinessUnit -->\n @case (NodeTypes.BusinessUnit) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n }\n <!-- Role -->\n @case (NodeTypes.Role) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent3' }\"></ng-container>\n }\n <!-- Employee -->\n @case (NodeTypes.Employee) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'surface' }\"></ng-container>\n }\n }\n </div>\n</ng-template>\n\n<!----------------------------------- General Node Template ----------------------------------->\n<ng-template #generalTemplate let-data=\"data\" let-color=\"color\">\n <div #node class=\"--node-container\" [style]=\"getNodeColors(color)\">\n <div class=\"--container\">\n <div class=\"--heading-container\">\n <div class=\"--content\">\n <div class=\"--icon\">\n <i class=\"fa-light fa-xl fa-fw\" [class]=\"data.icon\"></i>\n </div>\n <div class=\"--titles\">\n <span class=\"--title\">{{data.title}}</span>\n @if(data.subtitle)\n {\n <span class=\"--sub-title\">{{data.subtitle}}</span>\n }\n </div>\n @if(data?.children?.length){\n <div class=\"--badge\">\n <span>{{data?.children?.length ?? 0}}</span>\n </div>\n }\n </div>\n </div>\n @if(data.description)\n {\n <div class=\"--body-container\">\n <div class=\"--description\" [class.ax-pb-3]=\"data.children && data.children.length > 0\">\n {{data.description}}\n </div>\n </div>\n }\n @if(data.children && data.children.length > 0){\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"toggleNode(data,node)\">\n <ax-icon icon=\"fa-solid\" [class]=\"data.isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n</ng-template>", styles: [".axp-node-hint{display:flex;align-items:center;justify-content:center;gap:.25rem;font-size:.75rem;line-height:1rem}.axp-node-hint>div.--badge{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));display:flex;width:.75rem;height:.75rem;align-items:center;justify-content:center;border-radius:.125rem}.axp-chart-node{display:flex;align-items:center;justify-content:center}.axp-chart-node .--node-container{position:relative;cursor:pointer;--node-bg-color: var(--ax-sys-color-primary-surface);--node-text-color: var(--ax-sys-color-on-primary-surface);--node-border-color: var(--ax-sys-color-border-primary-surface)}.axp-chart-node .--node-container .--container{display:flex;max-height:100%;width:100%;flex-direction:column;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);border-color:rgba(var(--node-border-color))}.axp-chart-node .--node-container .--container .--heading-container{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));width:100%;padding:.5rem .75rem}.axp-chart-node .--node-container .--container .--heading-container .--content{display:flex;width:100%;align-items:center;justify-content:center;gap:.5rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--icon{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:2.75rem;height:2.75rem;flex:none;align-items:center;justify-content:center;border-radius:.5rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:1.5rem;height:1.5rem;flex:none;align-items:center;justify-content:center;border-radius:.375rem;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge>span{font-size:.75rem;line-height:1rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles{display:flex;width:100%;flex:1 1 0%;flex-direction:column;gap:.25rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1.125rem;line-height:1.75rem;font-weight:600;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--sub-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--body-container{width:100%;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lightest-surface),var(--tw-bg-opacity, 1));padding:.5rem .75rem;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1))}.axp-chart-node .--node-container .--container .--body-container .--description{text-align:center;font-size:.875rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--toggle{position:absolute;left:0;right:0;bottom:-.75rem;display:flex;width:100%;-webkit-user-select:none;-moz-user-select:-moz-none;user-select:none;align-items:center;justify-content:center}#parent:fullscreen{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "component", type: AXPSimplePageLayout, selector: "axp-layout-simple-page" }, { kind: "component", type: AXPThemeLayoutBlockComponent, selector: " axp-layout-content, axp-layout-header-container, axp-layout-side-container, axp-layout-sections, axp-layout-section-container, axp-layout-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title, axp-layout-nav-button, axp-layout-description, axp-layout-toolbar, axp-layout-title-bar, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPThemeLayoutHeaderTemplateComponent, selector: "axp-layout-header" }, { kind: "component", type: AXPThemeLayoutActionsComponent, selector: "axp-layout-actions" }, { kind: "component", type: AXPThemeLayoutPageSecondaryActionsComponent, selector: "axp-layout-actions-secondary" }, { kind: "component", type: AXPThemeLayoutPagePrimaryActionsComponent, selector: "axp-layout-actions-primary" }, { kind: "component", type: AXPThemeLayoutFooterComponent, selector: "axp-layout-footer" }, { kind: "ngmodule", type: AXMenuModule }, { kind: "component", type: i2.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i3.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i4.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i5.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i5.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "directive", type: AXPanViewDirective, selector: "[axPanView]", inputs: ["zoomStep", "minZoom", "maxZoom", "freeMode", "fitContent", "disablePan", "disableZoom", "wrapperClasses", "panX", "panY", "zoom"], outputs: ["panXChange", "panYChange", "zoomChange", "positionChange"], exportAs: ["axPanView"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "component", type: i6.AXBreadCrumbsComponent, selector: "ax-breadcrumbs" }, { kind: "component", type: i6.AXBreadCrumbsItemComponent, selector: "ax-breadcrumbs-item", inputs: ["disabled", "active"] }, { kind: "ngmodule", type: AXBadgeModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
864
913
|
}
|
865
914
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartPage, decorators: [{
|
866
915
|
type: Component,
|
@@ -883,8 +932,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImpor
|
|
883
932
|
AXLoadingModule,
|
884
933
|
AXBreadcrumbsModule,
|
885
934
|
AXBadgeModule,
|
886
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [AXMOrgChartConfigService, AXMOrgChartService, AXMOrgChartPrintService], template: "<axp-layout-simple-page *translate=\"let t\">\n <axp-layout-header>\n <axp-layout-title> {{t(rootConfig.entities.chart.title) | async}} </axp-layout-title>\n\n <axp-layout-description> Clear and dynamic view of your organization's structure </axp-layout-description>\n\n <axp-layout-actions>\n <axp-layout-actions-primary> </axp-layout-actions-primary>\n\n <axp-layout-actions-secondary>\n <ax-button-item [text]=\"(t('print') | async)!\" (onClick)=\"printChart()\">\n <ax-prefix>\n <ax-icon [icon]=\"'fa-solid fa-print'\"> </ax-icon>\n </ax-prefix>\n </ax-button-item>\n </axp-layout-actions-secondary>\n </axp-layout-actions>\n\n <axp-layout-breadcrumbs>\n <ax-breadcrumbs [class.ax-hidden]=\"layout.isSmall()\">\n <ng-template #divider>\n <i class=\"fa-regular fa-slash-forward\"></i>\n </ng-template>\n <ax-breadcrumbs-item> {{(t('home') | async)}} </ax-breadcrumbs-item>\n <ax-breadcrumbs-item> Organization </ax-breadcrumbs-item>\n </ax-breadcrumbs>\n </axp-layout-breadcrumbs>\n </axp-layout-header>\n\n <axp-layout-content class=\"ax-overflow-hidden\">\n <div class=\"ax-h-[calc(100vh-290px)]\" #parent id=\"parent\">\n <div #chart axPanView [(panX)]=\"panX\" [(panY)]=\"panY\" [(zoom)]=\"panZoomLevel\"
|
935
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [AXMOrgChartConfigService, AXMOrgChartService, AXMOrgChartPrintService], template: "<axp-layout-simple-page *translate=\"let t\">\n <axp-layout-header>\n <axp-layout-title> {{t(rootConfig.entities.chart.title) | async}} </axp-layout-title>\n\n <axp-layout-description> Clear and dynamic view of your organization's structure </axp-layout-description>\n\n <axp-layout-actions>\n <axp-layout-actions-primary> </axp-layout-actions-primary>\n\n <axp-layout-actions-secondary>\n <ax-button-item [text]=\"(t('print') | async)!\" (onClick)=\"printChart()\">\n <ax-prefix>\n <ax-icon [icon]=\"'fa-solid fa-print'\"> </ax-icon>\n </ax-prefix>\n </ax-button-item>\n </axp-layout-actions-secondary>\n </axp-layout-actions>\n\n <axp-layout-breadcrumbs>\n <ax-breadcrumbs [class.ax-hidden]=\"layout.isSmall()\">\n <ng-template #divider>\n <i class=\"fa-regular fa-slash-forward\"></i>\n </ng-template>\n <ax-breadcrumbs-item> {{(t('home') | async)}} </ax-breadcrumbs-item>\n <ax-breadcrumbs-item> Organization </ax-breadcrumbs-item>\n </ax-breadcrumbs>\n </axp-layout-breadcrumbs>\n </axp-layout-header>\n\n <axp-layout-content class=\"ax-overflow-hidden\">\n <div class=\"ax-h-[calc(100vh-290px)]\" #parent id=\"parent\">\n <div #chart axPanView [(panX)]=\"panX\" [(panY)]=\"panY\" [freeMode]=\"true\" [(zoom)]=\"panZoomLevel\"\n [fitContent]=\"true\" wrapperClasses=\"h\" class=\"ax-light\"></div>\n <ax-context-menu [target]=\"'.axp-chart-node'\" [orientation]=\"'vertical'\" [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\" (onOpening)=\"handleContextMenuOnOpening($event)\">\n </ax-context-menu>\n </div>\n </axp-layout-content>\n <axp-layout-footer>\n <axp-layout-prefix>\n <div class=\"ax-flex ax-gap-1 ax-light ax-flex-wrap ax-justify-center\">\n @let v = {cat:'Company'};\n @for (item of nodeTypes; track $index) {\n <div class=\"axp-node-hint\" [style]=\"getNodeColors(item.color)\" [class.ax-ms-4]=\"v.cat!=item.category\">\n <div class=\"--badge\">\n </div>\n {{item.title}}\n </div>\n {{updateVar(v,item.category)}}\n }\n </div>\n </axp-layout-prefix>\n <axp-layout-suffix>\n <div class=\"ax-flex ax-gap-2 \">\n <ax-button (onClick)=\"zoomOut()\">\n <ax-icon class=\"fa-solid fa-minus\"> </ax-icon>\n </ax-button>\n <ax-button [text]=\"panZoomLevel()\" (onClick)=\"zoomReset()\"></ax-button>\n <ax-button (onClick)=\"zoomIn()\">\n <ax-icon class=\"fa-solid fa-add\"> </ax-icon>\n </ax-button>\n <ax-button (onClick)=\"toggleFullscreen()\">\n <ax-icon>\n <i class=\"fa-solid\" [class]=\"isFullscreen()? 'fa-compress' : 'fa-expand'\"></i>\n </ax-icon>\n </ax-button>\n </div>\n </axp-layout-suffix>\n </axp-layout-footer>\n</axp-layout-simple-page>\n\n<ng-template #nodeTemplate let-data>\n <div>\n @switch (data.category) {\n <!-- Company -->\n @case (NodeTypes.Company) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'primary' }\"></ng-container>\n }\n <!-- Location -->\n @case (NodeTypes.Location) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n }\n <!-- BusinessUnit -->\n @case (NodeTypes.BusinessUnit) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n }\n <!-- Role -->\n @case (NodeTypes.Role) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent3' }\"></ng-container>\n }\n <!-- Employee -->\n @case (NodeTypes.Employee) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'surface' }\"></ng-container>\n }\n }\n </div>\n</ng-template>\n\n<!----------------------------------- General Node Template ----------------------------------->\n<ng-template #generalTemplate let-data=\"data\" let-color=\"color\">\n <div #node class=\"--node-container\" [style]=\"getNodeColors(color)\">\n <div class=\"--container\">\n <div class=\"--heading-container\">\n <div class=\"--content\">\n <div class=\"--icon\">\n <i class=\"fa-light fa-xl fa-fw\" [class]=\"data.icon\"></i>\n </div>\n <div class=\"--titles\">\n <span class=\"--title\">{{data.title}}</span>\n @if(data.subtitle)\n {\n <span class=\"--sub-title\">{{data.subtitle}}</span>\n }\n </div>\n @if(data?.children?.length){\n <div class=\"--badge\">\n <span>{{data?.children?.length ?? 0}}</span>\n </div>\n }\n </div>\n </div>\n @if(data.description)\n {\n <div class=\"--body-container\">\n <div class=\"--description\" [class.ax-pb-3]=\"data.children && data.children.length > 0\">\n {{data.description}}\n </div>\n </div>\n }\n @if(data.children && data.children.length > 0){\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"toggleNode(data,node)\">\n <ax-icon icon=\"fa-solid\" [class]=\"data.isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n</ng-template>", styles: [".axp-node-hint{display:flex;align-items:center;justify-content:center;gap:.25rem;font-size:.75rem;line-height:1rem}.axp-node-hint>div.--badge{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));display:flex;width:.75rem;height:.75rem;align-items:center;justify-content:center;border-radius:.125rem}.axp-chart-node{display:flex;align-items:center;justify-content:center}.axp-chart-node .--node-container{position:relative;cursor:pointer;--node-bg-color: var(--ax-sys-color-primary-surface);--node-text-color: var(--ax-sys-color-on-primary-surface);--node-border-color: var(--ax-sys-color-border-primary-surface)}.axp-chart-node .--node-container .--container{display:flex;max-height:100%;width:100%;flex-direction:column;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);border-color:rgba(var(--node-border-color))}.axp-chart-node .--node-container .--container .--heading-container{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));width:100%;padding:.5rem .75rem}.axp-chart-node .--node-container .--container .--heading-container .--content{display:flex;width:100%;align-items:center;justify-content:center;gap:.5rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--icon{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:2.75rem;height:2.75rem;flex:none;align-items:center;justify-content:center;border-radius:.5rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:1.5rem;height:1.5rem;flex:none;align-items:center;justify-content:center;border-radius:.375rem;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge>span{font-size:.75rem;line-height:1rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles{display:flex;width:100%;flex:1 1 0%;flex-direction:column;gap:.25rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1.125rem;line-height:1.75rem;font-weight:600;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--sub-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--body-container{width:100%;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lightest-surface),var(--tw-bg-opacity, 1));padding:.5rem .75rem;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1))}.axp-chart-node .--node-container .--container .--body-container .--description{text-align:center;font-size:.875rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--toggle{position:absolute;left:0;right:0;bottom:-.75rem;display:flex;width:100%;-webkit-user-select:none;-moz-user-select:-moz-none;user-select:none;align-items:center;justify-content:center}#parent:fullscreen{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}\n"] }]
|
887
936
|
}] });
|
888
937
|
|
889
938
|
export { AXMOrgChartPage };
|
890
|
-
//# sourceMappingURL=acorex-modules-organization-management-org-chart.page-
|
939
|
+
//# sourceMappingURL=acorex-modules-organization-management-org-chart.page-BSh18amn.mjs.map
|