@acorex/modules 19.2.4 → 19.2.5
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/fesm2022/{acorex-modules-application-management-module-designer.component-uLfQYtpy.mjs → acorex-modules-application-management-module-designer.component-kMtkkid-.mjs} +2 -2
- package/fesm2022/{acorex-modules-application-management-module-designer.component-uLfQYtpy.mjs.map → acorex-modules-application-management-module-designer.component-kMtkkid-.mjs.map} +1 -1
- package/fesm2022/acorex-modules-application-management.mjs +2 -2
- package/fesm2022/acorex-modules-application-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-auth-acorex-modules-auth-C-qPiQhk.mjs → acorex-modules-auth-acorex-modules-auth-CcRRSTGN.mjs} +11 -11
- package/fesm2022/{acorex-modules-auth-acorex-modules-auth-C-qPiQhk.mjs.map → acorex-modules-auth-acorex-modules-auth-CcRRSTGN.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-app-chooser.component-j3JgxtBC.mjs → acorex-modules-auth-app-chooser.component-DuRnQda8.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-app-chooser.component-j3JgxtBC.mjs.map → acorex-modules-auth-app-chooser.component-DuRnQda8.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-login.module-nqFBpUaE.mjs → acorex-modules-auth-login.module-ua9uEgUG.mjs} +4 -4
- package/fesm2022/{acorex-modules-auth-login.module-nqFBpUaE.mjs.map → acorex-modules-auth-login.module-ua9uEgUG.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-master.layout-C9eKuJgU.mjs → acorex-modules-auth-master.layout-KNzdjwP6.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-master.layout-C9eKuJgU.mjs.map → acorex-modules-auth-master.layout-KNzdjwP6.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-DZ6TiNI-.mjs → acorex-modules-auth-password.component-BVoPZUG9.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-password.component-DZ6TiNI-.mjs.map → acorex-modules-auth-password.component-BVoPZUG9.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-3t_WqB4c.mjs → acorex-modules-auth-password.component-CIwOjQRh.mjs} +3 -3
- package/fesm2022/{acorex-modules-auth-password.component-3t_WqB4c.mjs.map → acorex-modules-auth-password.component-CIwOjQRh.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-routes-nnrAlvkD.mjs → acorex-modules-auth-routes-hR3jePok.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-routes-nnrAlvkD.mjs.map → acorex-modules-auth-routes-hR3jePok.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-two-factor.module-DWtEYnHW.mjs → acorex-modules-auth-two-factor.module-CKe_H_-u.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-two-factor.module-DWtEYnHW.mjs.map → acorex-modules-auth-two-factor.module-CKe_H_-u.mjs.map} +1 -1
- package/fesm2022/acorex-modules-auth.mjs +1 -1
- package/fesm2022/acorex-modules-conversation.mjs +7 -7
- package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
- package/fesm2022/{acorex-modules-form-template-management-template-picker.component-DW0iMqAA.mjs → acorex-modules-form-template-management-template-picker.component-CG-_1tWi.mjs} +2 -2
- package/fesm2022/{acorex-modules-form-template-management-template-picker.component-DW0iMqAA.mjs.map → acorex-modules-form-template-management-template-picker.component-CG-_1tWi.mjs.map} +1 -1
- package/fesm2022/acorex-modules-form-template-management.mjs +1 -1
- package/fesm2022/acorex-modules-notification-management.mjs +144 -2
- package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-organization-managment-employee.entity-oo5Tyyp2.mjs → acorex-modules-organization-managment-employee.entity-D4BSxGAW.mjs} +40 -2
- package/fesm2022/acorex-modules-organization-managment-employee.entity-D4BSxGAW.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-managment-org-chart-configuration.page-Dc6c7GmB.mjs +310 -0
- package/fesm2022/acorex-modules-organization-managment-org-chart-configuration.page-Dc6c7GmB.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-managment-org-chart.page-CTHNSn2n.mjs +505 -0
- package/fesm2022/acorex-modules-organization-managment-org-chart.page-CTHNSn2n.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-managment-setting.keys-CF6Giykz.mjs +22 -0
- package/fesm2022/acorex-modules-organization-managment-setting.keys-CF6Giykz.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-managment-setting.provider-BtkaTjLS.mjs → acorex-modules-organization-managment-setting.provider-nKs53GcA.mjs} +2 -20
- package/fesm2022/acorex-modules-organization-managment-setting.provider-nKs53GcA.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-managment.mjs +44 -27
- package/fesm2022/acorex-modules-organization-managment.mjs.map +1 -1
- package/fesm2022/acorex-modules-platform-management.mjs +392 -145
- package/fesm2022/acorex-modules-platform-management.mjs.map +1 -1
- package/organization-managment/lib/const.d.ts +12 -0
- package/organization-managment/lib/features/organization-chart/org-chart-configuration.page.d.ts +141 -0
- package/organization-managment/lib/features/organization-chart/org-chart-print.service.d.ts +22 -0
- package/organization-managment/lib/features/organization-chart/org-chart.page.d.ts +162 -0
- package/organization-managment/lib/features/organization-chart/org-chart.service.d.ts +35 -0
- package/organization-managment/lib/features/organization-chart/org-chart.type.d.ts +25 -0
- package/organization-managment/lib/setting.keys.d.ts +2 -1
- package/package.json +5 -5
- package/platform-management/index.d.ts +1 -0
- package/platform-management/lib/const.d.ts +2 -0
- package/platform-management/lib/entities/app-term/app-term.types.d.ts +12 -2
- package/platform-management/lib/entities/app-term/components/notify-app/notify-app.component.d.ts +16 -0
- package/platform-management/lib/entities/app-term/index.d.ts +2 -0
- package/platform-management/lib/entities/app-term/pages/index.d.ts +1 -0
- package/platform-management/lib/entities/app-term/pages/list/list-terms.component.d.ts +20 -0
- package/platform-management/lib/entities/app-term/workflows/index.d.ts +1 -0
- package/platform-management/lib/entities/app-term/workflows/notify-new-term.workflow.d.ts +15 -0
- package/platform-management/lib/entities/app-version/app-version.types.d.ts +7 -0
- package/platform-management/lib/entities/app-version/components/index.d.ts +2 -0
- package/platform-management/lib/entities/app-version/components/list-versions/list-version.component.d.ts +13 -0
- package/platform-management/lib/entities/app-version/{workflow/test/test.component.d.ts → components/notify-app/notify-app.component.d.ts} +3 -3
- package/platform-management/lib/entities/app-version/components/slots/app-version-slot.component.d.ts +12 -0
- package/platform-management/lib/entities/app-version/index.d.ts +2 -1
- package/platform-management/lib/entities/app-version/{workflow → workflows}/index.d.ts +0 -1
- package/platform-management/lib/entities/check-version.d.ts +12 -0
- package/platform-management/lib/entities/index.d.ts +1 -0
- package/platform-management/lib/platform-management.module.d.ts +2 -2
- package/fesm2022/acorex-modules-organization-managment-employee.entity-oo5Tyyp2.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-managment-org-chart.page-fOxjGb8i.mjs +0 -297
- package/fesm2022/acorex-modules-organization-managment-org-chart.page-fOxjGb8i.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-managment-setting.provider-BtkaTjLS.mjs.map +0 -1
- package/organization-managment/lib/pages/org-chart/org-chart.page.d.ts +0 -28
- package/organization-managment/lib/pages/org-chart/org-chart.type.d.ts +0 -9
- package/platform-management/lib/entities/app-version/check-version.d.ts +0 -11
- /package/platform-management/lib/entities/app-version/{workflow → workflows}/change-log.workflow.d.ts +0 -0
@@ -14,7 +14,7 @@ async function factory(injector) {
|
|
14
14
|
individual: `t("employee", { scope: "${i18n}" })`,
|
15
15
|
plural: `t("employees", { scope: "${i18n}" })`,
|
16
16
|
searchResult: {
|
17
|
-
title: '{{
|
17
|
+
title: '{{ firstname }} {{ lastname }}',
|
18
18
|
description: RootConfig.module.title,
|
19
19
|
},
|
20
20
|
},
|
@@ -249,6 +249,44 @@ async function factory(injector) {
|
|
249
249
|
},
|
250
250
|
],
|
251
251
|
},
|
252
|
+
single: {
|
253
|
+
title: '{{firstname}} {{lastname}}',
|
254
|
+
sections: [
|
255
|
+
{
|
256
|
+
id: 'personal',
|
257
|
+
layout: {
|
258
|
+
positions: {
|
259
|
+
lg: {
|
260
|
+
colSpan: 12,
|
261
|
+
},
|
262
|
+
},
|
263
|
+
},
|
264
|
+
},
|
265
|
+
],
|
266
|
+
properties: [
|
267
|
+
{
|
268
|
+
name: 'firstname',
|
269
|
+
layout: {
|
270
|
+
positions: {
|
271
|
+
lg: {
|
272
|
+
colSpan: 12,
|
273
|
+
},
|
274
|
+
},
|
275
|
+
},
|
276
|
+
},
|
277
|
+
{
|
278
|
+
name: 'lastname',
|
279
|
+
layout: {
|
280
|
+
positions: {
|
281
|
+
lg: {
|
282
|
+
colSpan: 12,
|
283
|
+
},
|
284
|
+
},
|
285
|
+
},
|
286
|
+
},
|
287
|
+
],
|
288
|
+
actions: [],
|
289
|
+
},
|
252
290
|
list: {
|
253
291
|
actions: [
|
254
292
|
{
|
@@ -298,4 +336,4 @@ async function factory(injector) {
|
|
298
336
|
}
|
299
337
|
|
300
338
|
export { factory };
|
301
|
-
//# sourceMappingURL=acorex-modules-organization-managment-employee.entity-
|
339
|
+
//# sourceMappingURL=acorex-modules-organization-managment-employee.entity-D4BSxGAW.mjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"acorex-modules-organization-managment-employee.entity-D4BSxGAW.mjs","sources":["../../../../libs/modules/organization-managment/src/lib/entities/employee/employee.entity.ts"],"sourcesContent":["import { AXPEntity, AXPEntityCommandScope, AXPEntityQueryType } from '@acorex/platform/common';\nimport { AXPWidgetsCatalog } from '@acorex/platform/layout/builder';\nimport { Injector } from '@angular/core';\nimport { RootConfig } from '../../const';\nimport { AXMOrganizationManagementEmployeeEntityService } from './employee.service';\n\nexport async function factory(injector: Injector): Promise<AXPEntity | null> {\n const dataService = injector.get(AXMOrganizationManagementEmployeeEntityService);\n const i18n = RootConfig.config.i18n;\n\n const entityDef: AXPEntity = {\n module: RootConfig.module.name,\n name: RootConfig.entities.employee.name,\n source: 'employees',\n title: `t(\"employee\", { scope: \"${i18n}\" })`,\n formats: {\n individual: `t(\"employee\", { scope: \"${i18n}\" })`,\n plural: `t(\"employees\", { scope: \"${i18n}\" })`,\n searchResult: {\n title: '{{ firstname }} {{ lastname }}',\n description: RootConfig.module.title,\n },\n },\n relatedEntities: [],\n groups: [\n {\n id: 'personal',\n title: `t(\"personalInformation\", { scope: \"${i18n}\" })`,\n },\n {\n id: 'job',\n title: `t(\"jobInformation\", { scope: \"${i18n}\" })`,\n },\n ],\n properties: [\n {\n name: 'firstname',\n title: `t(\"firstname\", { scope: \"common\" })`,\n groupId: 'personal',\n schema: {\n dataType: 'string',\n interface: {\n type: AXPWidgetsCatalog.text,\n },\n },\n validations: [\n {\n rule: 'required',\n },\n ],\n },\n {\n name: 'lastname',\n title: `t(\"lastname\", { scope: \"common\" })`,\n groupId: 'personal',\n schema: {\n dataType: 'string',\n interface: {\n type: AXPWidgetsCatalog.text,\n },\n },\n validations: [\n {\n rule: 'required',\n },\n ],\n },\n {\n name: 'email',\n title: `t(\"email\", { scope: \"common\" })`,\n groupId: 'personal',\n schema: {\n dataType: 'string',\n interface: {\n type: AXPWidgetsCatalog.contact,\n options: {\n type: 'email',\n multiple: false,\n hasLabel: false,\n }\n },\n },\n validations: [\n {\n rule: 'required',\n },\n {\n rule: 'email',\n },\n ],\n },\n {\n name: 'position',\n title: `t(\"position\", { scope: \"common\" })`,\n groupId: 'job',\n schema: {\n dataType: 'string',\n interface: {\n type: AXPWidgetsCatalog.select,\n options: {\n dataSource: 'positions',\n displayField: 'name',\n valueField: 'id',\n },\n },\n },\n validations: [\n {\n rule: 'required',\n },\n ],\n },\n {\n name: 'department',\n title: `t(\"department\", { scope: \"common\" })`,\n groupId: 'job',\n schema: {\n dataType: 'string',\n interface: {\n type: AXPWidgetsCatalog.select,\n options: {\n dataSource: 'departments',\n displayField: 'name',\n valueField: 'id',\n },\n },\n },\n },\n ],\n columns: [\n { name: 'firstname' },\n { name: 'lastname' },\n { name: 'email' },\n { name: 'position' },\n { name: 'department' },\n ],\n commands: {\n create: {\n execute: async (data: any) => {\n const res = await dataService.insertOne(data);\n return { id: res };\n },\n },\n delete: {\n execute: async (id: any) => {\n return await dataService.deleteOne(id);\n },\n },\n update: {\n execute: async (data: any) => {\n return await dataService.updateOne(data.id, data);\n },\n },\n },\n queries: {\n byKey: {\n execute: async (id: string) => {\n return await dataService.getOne(id);\n },\n type: AXPEntityQueryType.Single,\n },\n list: {\n execute: async (e: any) => {\n return await dataService.query({ skip: e.skip, take: e.take, filter: e.filter, sort: e.sort });\n },\n type: AXPEntityQueryType.List,\n },\n },\n interfaces: {\n master: {\n create: {\n sections: [\n {\n id: 'personal',\n },\n {\n id: 'job',\n },\n ],\n properties: [\n {\n name: 'firstname',\n layout: {\n positions: {\n lg: {\n colSpan: 12,\n },\n },\n },\n },\n {\n name: 'lastname',\n layout: {\n positions: {\n lg: {\n colSpan: 12,\n },\n },\n },\n },\n {\n name: 'email',\n layout: {\n positions: {\n lg: {\n colSpan: 12,\n },\n },\n },\n },\n ],\n },\n update: {\n sections: [\n {\n id: 'personal',\n },\n {\n id: 'job',\n },\n ],\n properties: [\n {\n name: 'firstname',\n layout: {\n positions: {\n lg: {\n colSpan: 12,\n },\n },\n },\n },\n {\n name: 'lastname',\n layout: {\n positions: {\n lg: {\n colSpan: 12,\n },\n },\n },\n },\n {\n name: 'email',\n layout: {\n positions: {\n lg: {\n colSpan: 12,\n },\n },\n },\n },\n ],\n },\n single: {\n title: '{{firstname}} {{lastname}}',\n sections: [\n {\n id: 'personal',\n layout: {\n positions: {\n lg: {\n colSpan: 12,\n },\n },\n },\n },\n ],\n properties: [\n {\n name: 'firstname',\n layout: {\n positions: {\n lg: {\n colSpan: 12,\n },\n },\n },\n },\n {\n name: 'lastname',\n layout: {\n positions: {\n lg: {\n colSpan: 12,\n },\n },\n },\n },\n ],\n actions: [],\n },\n list: {\n actions: [\n {\n title: `t(\"create\", { scope: \"common\" })`,\n command: 'create-entity',\n priority: 'primary',\n type: 'create',\n scope: AXPEntityCommandScope.TypeLevel,\n },\n {\n title: 't(\"deleteItems\", { scope: \"common\" })',\n command: 'delete-entity',\n priority: 'primary',\n type: 'delete',\n scope: AXPEntityCommandScope.Selected,\n },\n {\n title: 't(\"detail\", { scope: \"common\" })',\n command: 'open-entity',\n priority: 'secondary',\n type: 'view',\n scope: AXPEntityCommandScope.Individual,\n },\n {\n title: 't(\"delete\", { scope: \"common\" })',\n command: 'delete-entity',\n priority: 'secondary',\n type: 'delete',\n scope: AXPEntityCommandScope.Individual,\n },\n ],\n views: [\n {\n name: 'all',\n title: 't(\"allItem\", { scope: \"common\" })',\n fixed: true,\n columns: ['firstname', 'lastname', 'email', 'position', 'department'],\n conditions: [],\n sorts: [],\n },\n ],\n },\n },\n },\n };\n\n return entityDef;\n}\n"],"names":[],"mappings":"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"}
|
package/fesm2022/acorex-modules-organization-managment-org-chart-configuration.page-Dc6c7GmB.mjs
ADDED
@@ -0,0 +1,310 @@
|
|
1
|
+
import * as i3 from '@acorex/components/button';
|
2
|
+
import { AXButtonModule } from '@acorex/components/button';
|
3
|
+
import * as i5 from '@acorex/components/decorators';
|
4
|
+
import { AXDecoratorModule } from '@acorex/components/decorators';
|
5
|
+
import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
|
6
|
+
import * as i5$1 from '@acorex/components/loading';
|
7
|
+
import { AXLoadingModule } from '@acorex/components/loading';
|
8
|
+
import { AXMenuModule } from '@acorex/components/menu';
|
9
|
+
import * as i4 from '@acorex/core/translation';
|
10
|
+
import { AXTranslationModule } from '@acorex/core/translation';
|
11
|
+
import { AXPSimplePageLayout } from '@acorex/platform/themes/default';
|
12
|
+
import { AXPLayoutThemeService, AXPThemeLayoutBlockComponent, AXPThemeLayoutHeaderTemplateComponent, AXPThemeLayoutActionsComponent, AXPThemeLayoutPageSecondaryActionsComponent, AXPThemeLayoutPagePrimaryActionsComponent } from '@acorex/platform/themes/shared';
|
13
|
+
import * as i1 from '@angular/common';
|
14
|
+
import { CommonModule } from '@angular/common';
|
15
|
+
import * as i0 from '@angular/core';
|
16
|
+
import { inject, signal, Injectable, Component, ChangeDetectionStrategy } from '@angular/core';
|
17
|
+
import { RouterModule } from '@angular/router';
|
18
|
+
import { AXMOrganizationManagementCompanyEntityService, AXMOrganizationManagementDepartmentEntityService, AXMOrganizationManagementEmployeeEntityService, AXMOrganizationManagementPositionEntityService, AXMOrganizationManagementChartEntityService, RootConfig } from './acorex-modules-organization-managment.mjs';
|
19
|
+
import { AXCheckBoxModule } from '@acorex/components/check-box';
|
20
|
+
import { FormsModule } from '@angular/forms';
|
21
|
+
import * as i6 from '@acorex/components/breadcrumbs';
|
22
|
+
import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
|
23
|
+
import * as i7 from '@acorex/components/alert';
|
24
|
+
import { AXAlertModule } from '@acorex/components/alert';
|
25
|
+
import { AXPSettingService, AXPDataGenerator, AXPSettingScope } from '@acorex/platform/common';
|
26
|
+
import { AXPSessionService } from '@acorex/platform/auth';
|
27
|
+
import { A as AXPOrganizationSetting } from './acorex-modules-organization-managment-setting.keys-CF6Giykz.mjs';
|
28
|
+
|
29
|
+
class AXMOrgChartService {
|
30
|
+
constructor() {
|
31
|
+
this.companyService = inject(AXMOrganizationManagementCompanyEntityService);
|
32
|
+
this.departmentService = inject(AXMOrganizationManagementDepartmentEntityService);
|
33
|
+
this.employmentService = inject(AXMOrganizationManagementEmployeeEntityService);
|
34
|
+
this.positionService = inject(AXMOrganizationManagementPositionEntityService);
|
35
|
+
this.chartService = inject(AXMOrganizationManagementChartEntityService);
|
36
|
+
this.settingService = inject(AXPSettingService);
|
37
|
+
//
|
38
|
+
this.sessionService = inject(AXPSessionService);
|
39
|
+
this._types = ['Company', 'Location', 'BusinessUnit', 'Role', 'Employee'];
|
40
|
+
this._defaultPermissioEncoded = '0111001110001100001100001';
|
41
|
+
this.permissions = signal(this.defaultPermissions());
|
42
|
+
}
|
43
|
+
get types() {
|
44
|
+
return this._types;
|
45
|
+
}
|
46
|
+
//#region Load And Save
|
47
|
+
async load(id) {
|
48
|
+
if (id) {
|
49
|
+
const item = await this.chartService.getOne(id);
|
50
|
+
return item;
|
51
|
+
}
|
52
|
+
else {
|
53
|
+
return await this.createNew();
|
54
|
+
}
|
55
|
+
}
|
56
|
+
async createNew() {
|
57
|
+
const tenant = this.sessionService.tenant;
|
58
|
+
return {
|
59
|
+
//createAt: new Date(),
|
60
|
+
//updateAt: new Date(),
|
61
|
+
version: '0.0.0',
|
62
|
+
nodes: [{
|
63
|
+
id: AXPDataGenerator.uuid(),
|
64
|
+
title: tenant.name,
|
65
|
+
entity: {
|
66
|
+
id: tenant.id,
|
67
|
+
source: 'tenant',
|
68
|
+
},
|
69
|
+
}],
|
70
|
+
};
|
71
|
+
}
|
72
|
+
async save(chart) {
|
73
|
+
if (chart.id) {
|
74
|
+
await this.chartService.updateOne(chart.id, { version: chart.version, nodes: chart.nodes, updateAt: new Date() });
|
75
|
+
}
|
76
|
+
else {
|
77
|
+
await this.chartService.insertOne(chart);
|
78
|
+
}
|
79
|
+
} //save Chart Data
|
80
|
+
async listItemType(type, event) {
|
81
|
+
switch (type.text.toLowerCase()) {
|
82
|
+
case 'company':
|
83
|
+
return await this.companyService.query({
|
84
|
+
skip: event.skip,
|
85
|
+
take: event.take,
|
86
|
+
filter: event.filter,
|
87
|
+
sort: event.sort,
|
88
|
+
});
|
89
|
+
case 'country':
|
90
|
+
break;
|
91
|
+
case 'city':
|
92
|
+
break;
|
93
|
+
case 'department':
|
94
|
+
return (await this.departmentService.query({
|
95
|
+
skip: event.skip,
|
96
|
+
take: event.take,
|
97
|
+
filter: event.filter,
|
98
|
+
sort: event.sort,
|
99
|
+
}));
|
100
|
+
case 'position':
|
101
|
+
return (await this.positionService.query({
|
102
|
+
skip: event.skip,
|
103
|
+
take: event.take,
|
104
|
+
filter: event.filter,
|
105
|
+
sort: event.sort,
|
106
|
+
}));
|
107
|
+
case 'employment':
|
108
|
+
return (await this.employmentService.query({
|
109
|
+
skip: event.skip,
|
110
|
+
take: event.take,
|
111
|
+
filter: event.filter,
|
112
|
+
sort: event.sort,
|
113
|
+
}));
|
114
|
+
}
|
115
|
+
}
|
116
|
+
//#endregion
|
117
|
+
//#region Configuration Methods
|
118
|
+
defaultPermissions() {
|
119
|
+
return this.decodePermissionsString(this._defaultPermissioEncoded);
|
120
|
+
}
|
121
|
+
encodePermissionsString(permissions) {
|
122
|
+
let str = '';
|
123
|
+
for (const parent of this.types) {
|
124
|
+
for (const child of this.types) {
|
125
|
+
str += (permissions[parent]?.[child] ?? 0).toString();
|
126
|
+
}
|
127
|
+
}
|
128
|
+
return str;
|
129
|
+
}
|
130
|
+
decodePermissionsString(encoded) {
|
131
|
+
const result = {};
|
132
|
+
const expectedLength = this.types.length * this.types.length;
|
133
|
+
if (encoded.length !== expectedLength) {
|
134
|
+
throw new Error(`Invalid permissions string length. Expected ${expectedLength} but got ${encoded.length}`);
|
135
|
+
}
|
136
|
+
let index = 0;
|
137
|
+
for (const parent of this.types) {
|
138
|
+
result[parent] = {};
|
139
|
+
for (const child of this.types) {
|
140
|
+
const char = encoded.charAt(index);
|
141
|
+
result[parent][child] = parseInt(char, 10);
|
142
|
+
index++;
|
143
|
+
}
|
144
|
+
}
|
145
|
+
return result;
|
146
|
+
}
|
147
|
+
decodePermissionsMatrix(matrix) {
|
148
|
+
const newPermissions = {};
|
149
|
+
this.types.forEach((parent, rowIndex) => {
|
150
|
+
newPermissions[parent] = {};
|
151
|
+
this.types.forEach((child, colIndex) => {
|
152
|
+
newPermissions[parent][child] = matrix[rowIndex][colIndex];
|
153
|
+
});
|
154
|
+
});
|
155
|
+
return newPermissions;
|
156
|
+
}
|
157
|
+
validateStoredPermissions(storedValue) {
|
158
|
+
try {
|
159
|
+
if (typeof storedValue === 'string') {
|
160
|
+
const expectedLength = this.types.length * this.types.length;
|
161
|
+
// Check that the string is the correct length and only contains 0s and 1s.
|
162
|
+
if (storedValue.length === expectedLength && /^[01]+$/.test(storedValue)) {
|
163
|
+
return this.decodePermissionsString(storedValue);
|
164
|
+
}
|
165
|
+
}
|
166
|
+
else if (Array.isArray(storedValue)) {
|
167
|
+
// Validate the 2D array dimensions and values.
|
168
|
+
if (storedValue.length === this.types.length &&
|
169
|
+
storedValue.every(row => Array.isArray(row) &&
|
170
|
+
row.length === this.types.length &&
|
171
|
+
row.every(val => val === 0 || val === 1))) {
|
172
|
+
return this.decodePermissionsMatrix(storedValue);
|
173
|
+
}
|
174
|
+
}
|
175
|
+
else if (typeof storedValue === 'object' && storedValue !== null) {
|
176
|
+
// Validate that the object has all the required keys and that their values are 0 or 1.
|
177
|
+
let valid = true;
|
178
|
+
for (const parent of this.types) {
|
179
|
+
if (!(parent in storedValue)) {
|
180
|
+
valid = false;
|
181
|
+
break;
|
182
|
+
}
|
183
|
+
const childPermissions = storedValue[parent];
|
184
|
+
for (const child of this.types) {
|
185
|
+
if (!(child in childPermissions) || (childPermissions[child] !== 0 && childPermissions[child] !== 1)) {
|
186
|
+
valid = false;
|
187
|
+
break;
|
188
|
+
}
|
189
|
+
}
|
190
|
+
if (!valid)
|
191
|
+
break;
|
192
|
+
}
|
193
|
+
if (valid) {
|
194
|
+
return storedValue;
|
195
|
+
}
|
196
|
+
}
|
197
|
+
}
|
198
|
+
catch (error) {
|
199
|
+
// In case of any errors during validation, fall back to default permissions.
|
200
|
+
}
|
201
|
+
// Return the default permissions if validation fails.
|
202
|
+
return this.defaultPermissions();
|
203
|
+
}
|
204
|
+
isAllowed(parent, child) {
|
205
|
+
return (this.permissions()[parent]?.[child] ?? 0) === 1;
|
206
|
+
}
|
207
|
+
setPermission(parent, child, value) {
|
208
|
+
this.permissions.update((p) => {
|
209
|
+
if (!p[parent]) {
|
210
|
+
p[parent] = {};
|
211
|
+
}
|
212
|
+
p[parent][child] = value ? 1 : 0;
|
213
|
+
return p;
|
214
|
+
});
|
215
|
+
}
|
216
|
+
getPermission(parent, child) {
|
217
|
+
return this.permissions()[parent]?.[child] === 1;
|
218
|
+
}
|
219
|
+
async loadSettings() {
|
220
|
+
const storedValue = await this.settingService
|
221
|
+
.scope(AXPSettingScope.Tenant)
|
222
|
+
.get(AXPOrganizationSetting.Relations);
|
223
|
+
// Use the validation method to ensure the stored value is correct.
|
224
|
+
if (storedValue) {
|
225
|
+
const validatedPermissions = this.validateStoredPermissions(storedValue);
|
226
|
+
this.permissions.set(validatedPermissions);
|
227
|
+
}
|
228
|
+
else {
|
229
|
+
this.permissions.set(this.defaultPermissions());
|
230
|
+
}
|
231
|
+
}
|
232
|
+
async updateSettings() {
|
233
|
+
const matrix = this.encodePermissionsString(this.permissions());
|
234
|
+
await this.settingService
|
235
|
+
.scope(AXPSettingScope.Tenant)
|
236
|
+
.set(AXPOrganizationSetting.Relations, matrix);
|
237
|
+
}
|
238
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
239
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartService }); }
|
240
|
+
}
|
241
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartService, decorators: [{
|
242
|
+
type: Injectable
|
243
|
+
}] });
|
244
|
+
|
245
|
+
class AXMOrgChartConfigurationPage {
|
246
|
+
constructor() {
|
247
|
+
this.layout = inject(AXPLayoutThemeService);
|
248
|
+
this.chartService = inject(AXMOrgChartService);
|
249
|
+
this.loadingStates = signal({});
|
250
|
+
this.rootConfig = RootConfig;
|
251
|
+
}
|
252
|
+
async ngOnInit() {
|
253
|
+
await this.chartService.loadSettings();
|
254
|
+
}
|
255
|
+
async togglePermission(parent, child) {
|
256
|
+
//TODO: Check the async and loading
|
257
|
+
// Set the loading state for this cell to true.
|
258
|
+
this.loadingStates.update((states) => {
|
259
|
+
if (!states[parent]) {
|
260
|
+
states[parent] = {};
|
261
|
+
}
|
262
|
+
states[parent][child] = true;
|
263
|
+
return states;
|
264
|
+
});
|
265
|
+
this.chartService.setPermission(parent, child, !this.chartService.getPermission(parent, child));
|
266
|
+
await this.chartService.updateSettings();
|
267
|
+
// Turn off the loading state.
|
268
|
+
this.loadingStates.update((states) => {
|
269
|
+
if (!states[parent]) {
|
270
|
+
states[parent] = {};
|
271
|
+
}
|
272
|
+
states[parent][child] = false;
|
273
|
+
return states;
|
274
|
+
});
|
275
|
+
}
|
276
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartConfigurationPage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
277
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.3", type: AXMOrgChartConfigurationPage, isStandalone: true, selector: "ng-component", providers: [AXMOrgChartService], ngImport: i0, template: "<axp-layout-simple-page *translate=\"let t\">\n <axp-layout-header>\n <axp-layout-title> {{t(rootConfig.entities.structure.title) | async}} </axp-layout-title>\n\n <axp-layout-description>Customize your organization's hierarchical relationships</axp-layout-description>\n\n <axp-layout-actions>\n <axp-layout-actions-primary> </axp-layout-actions-primary>\n <axp-layout-actions-secondary>\n <ax-button-item [text]=\"(t('reset') | async)!\">\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\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>\n Home\n </ax-breadcrumbs-item>\n <ax-breadcrumbs-item>\n Organization\n </ax-breadcrumbs-item>\n </ax-breadcrumbs>\n </axp-layout-breadcrumbs>\n </axp-layout-header>\n\n <axp-layout-content>\n <div class=\"ax-flex ax-flex-col ax-gap-6 ax-w-full 2xl:ax-w-3/4 3xl:ax-w-1/2\">\n <div>\n <h3 class=\"ax-font-semibold ax-text-xl\">Relations Permissions</h3>\n <p class=\"ax-text-sm ax-opacity-85\">\n This matrix sets the relationships between nodes in your organization chart. Click a cell to toggle the\n relation between <span class=\"ax-text-danger-500\">Allowed</span> and <span\n class=\"ax-text-success-500\">Denied</span>.\n </p>\n </div>\n <div class=\"ax-rounded-md ax-overflow-hidden ax-w-full\">\n <table class=\" ax-table-auto ax-border-collapse ax-w-full ax-border-primary-900 ax-rounded-md\">\n <thead>\n <tr class=\"ax-bg-primary-400 ax-text-on-primary\">\n <!-- Top-left empty cell -->\n <th class=\"ax-border ax-border-primary-900 ax-p-4 ax-min-w-44 ax-font-semibold ax-text-start\">Parent\n \\\n Child</th>\n <!-- Horizontal headers -->\n @for ( type of chartService.types; track $index) {\n <th class=\"ax-border ax-border-primary-900 ax-p-4 ax-min-w-44 ax-text-center ax-font-semibold\">\n {{ type }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n <!-- For each parent type, render a row with alternating backgrounds -->\n @for ( parent of chartService.types; track $index) {\n <tr>\n <!-- Vertical header cell with custom header colors -->\n <td\n class=\"ax-border ax-border-primary-900 ax-p-4 ax-font-semibold ax-bg-primary-400 ax-text-on-primary ax-text-start\">\n {{ parent }}\n </td>\n <!-- Render a cell for each potential child type -->\n @for ( child of chartService.types; track $index) {\n <td class=\"ax-border ax-border-primary-900 ax-p-2 \">\n <div class=\"ax-flex ax-justify-center ax-cursor-pointer ax-sm\">\n @let isLoading = loadingStates()[parent]?.[child];\n <ax-button look=\"twotone\" [color]=\"chartService.isAllowed(parent, child) ? 'success' : 'danger'\"\n [text]=\"chartService.isAllowed(parent, child) ? 'Allowed' : 'Denied'\" [disabled]=\"isLoading\"\n (onClick)=\"togglePermission(parent, child)\">\n @if(isLoading)\n {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n <div>\n <ax-alert [color]=\"'warning'\">\n <ax-icon></ax-icon>\n <ax-title>Attention</ax-title>\n <ax-content>\n Changes made here will not update your current organization chart. They will only affect future charts or\n updates.\n </ax-content>\n </ax-alert>\n </div>\n </div>\n\n </axp-layout-content>\n</axp-layout-simple-page>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type:
|
278
|
+
//
|
279
|
+
AXPSimplePageLayout, selector: "axp-layout-simple-page" }, { kind: "component", type: AXPThemeLayoutBlockComponent, selector: " axp-layout-content, axp-layout-header-container, axp-layout-footer-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: "ngmodule", type:
|
280
|
+
//
|
281
|
+
AXMenuModule }, { 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: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i5$1.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { 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: AXAlertModule }, { kind: "component", type: i7.AXAlertComponent, selector: "ax-alert", inputs: ["color", "timeOut"], outputs: ["colorChange", "onClosed", "timeOutChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
282
|
+
}
|
283
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartConfigurationPage, decorators: [{
|
284
|
+
type: Component,
|
285
|
+
args: [{ imports: [
|
286
|
+
CommonModule,
|
287
|
+
RouterModule,
|
288
|
+
FormsModule,
|
289
|
+
//
|
290
|
+
AXPSimplePageLayout,
|
291
|
+
AXPThemeLayoutBlockComponent,
|
292
|
+
AXPThemeLayoutHeaderTemplateComponent,
|
293
|
+
AXPThemeLayoutActionsComponent,
|
294
|
+
AXPThemeLayoutPageSecondaryActionsComponent,
|
295
|
+
AXPThemeLayoutPagePrimaryActionsComponent,
|
296
|
+
//
|
297
|
+
AXMenuModule,
|
298
|
+
AXButtonModule,
|
299
|
+
AXDropdownButtonModule,
|
300
|
+
AXTranslationModule,
|
301
|
+
AXDecoratorModule,
|
302
|
+
AXLoadingModule,
|
303
|
+
AXCheckBoxModule,
|
304
|
+
AXBreadcrumbsModule,
|
305
|
+
AXAlertModule
|
306
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, providers: [AXMOrgChartService], template: "<axp-layout-simple-page *translate=\"let t\">\n <axp-layout-header>\n <axp-layout-title> {{t(rootConfig.entities.structure.title) | async}} </axp-layout-title>\n\n <axp-layout-description>Customize your organization's hierarchical relationships</axp-layout-description>\n\n <axp-layout-actions>\n <axp-layout-actions-primary> </axp-layout-actions-primary>\n <axp-layout-actions-secondary>\n <ax-button-item [text]=\"(t('reset') | async)!\">\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\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>\n Home\n </ax-breadcrumbs-item>\n <ax-breadcrumbs-item>\n Organization\n </ax-breadcrumbs-item>\n </ax-breadcrumbs>\n </axp-layout-breadcrumbs>\n </axp-layout-header>\n\n <axp-layout-content>\n <div class=\"ax-flex ax-flex-col ax-gap-6 ax-w-full 2xl:ax-w-3/4 3xl:ax-w-1/2\">\n <div>\n <h3 class=\"ax-font-semibold ax-text-xl\">Relations Permissions</h3>\n <p class=\"ax-text-sm ax-opacity-85\">\n This matrix sets the relationships between nodes in your organization chart. Click a cell to toggle the\n relation between <span class=\"ax-text-danger-500\">Allowed</span> and <span\n class=\"ax-text-success-500\">Denied</span>.\n </p>\n </div>\n <div class=\"ax-rounded-md ax-overflow-hidden ax-w-full\">\n <table class=\" ax-table-auto ax-border-collapse ax-w-full ax-border-primary-900 ax-rounded-md\">\n <thead>\n <tr class=\"ax-bg-primary-400 ax-text-on-primary\">\n <!-- Top-left empty cell -->\n <th class=\"ax-border ax-border-primary-900 ax-p-4 ax-min-w-44 ax-font-semibold ax-text-start\">Parent\n \\\n Child</th>\n <!-- Horizontal headers -->\n @for ( type of chartService.types; track $index) {\n <th class=\"ax-border ax-border-primary-900 ax-p-4 ax-min-w-44 ax-text-center ax-font-semibold\">\n {{ type }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n <!-- For each parent type, render a row with alternating backgrounds -->\n @for ( parent of chartService.types; track $index) {\n <tr>\n <!-- Vertical header cell with custom header colors -->\n <td\n class=\"ax-border ax-border-primary-900 ax-p-4 ax-font-semibold ax-bg-primary-400 ax-text-on-primary ax-text-start\">\n {{ parent }}\n </td>\n <!-- Render a cell for each potential child type -->\n @for ( child of chartService.types; track $index) {\n <td class=\"ax-border ax-border-primary-900 ax-p-2 \">\n <div class=\"ax-flex ax-justify-center ax-cursor-pointer ax-sm\">\n @let isLoading = loadingStates()[parent]?.[child];\n <ax-button look=\"twotone\" [color]=\"chartService.isAllowed(parent, child) ? 'success' : 'danger'\"\n [text]=\"chartService.isAllowed(parent, child) ? 'Allowed' : 'Denied'\" [disabled]=\"isLoading\"\n (onClick)=\"togglePermission(parent, child)\">\n @if(isLoading)\n {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n <div>\n <ax-alert [color]=\"'warning'\">\n <ax-icon></ax-icon>\n <ax-title>Attention</ax-title>\n <ax-content>\n Changes made here will not update your current organization chart. They will only affect future charts or\n updates.\n </ax-content>\n </ax-alert>\n </div>\n </div>\n\n </axp-layout-content>\n</axp-layout-simple-page>" }]
|
307
|
+
}] });
|
308
|
+
|
309
|
+
export { AXMOrgChartConfigurationPage };
|
310
|
+
//# sourceMappingURL=acorex-modules-organization-managment-org-chart-configuration.page-Dc6c7GmB.mjs.map
|
package/fesm2022/acorex-modules-organization-managment-org-chart-configuration.page-Dc6c7GmB.mjs.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"acorex-modules-organization-managment-org-chart-configuration.page-Dc6c7GmB.mjs","sources":["../../../../libs/modules/organization-managment/src/lib/features/organization-chart/org-chart.service.ts","../../../../libs/modules/organization-managment/src/lib/features/organization-chart/org-chart-configuration.page.ts","../../../../libs/modules/organization-managment/src/lib/features/organization-chart/org-chart-configuration.page.html"],"sourcesContent":["import { inject, Injectable, signal } from '@angular/core';\nimport { AXMOrganizationManagementChartEntityService } from '../../entities/chart/chart.service';\nimport { AXMOrganizationManagementChartEntityModel } from '../../entities/chart/chart.types';\nimport { AXMOrganizationManagementCompanyEntityService } from '../../entities/company/company.service';\nimport { AXMOrganizationManagementDepartmentEntityService } from '../../entities/department/department.service';\nimport { AXMOrganizationManagementEmployeeEntityService } from '../../entities/employee/employee.service';\nimport { AXMOrganizationManagementPositionEntityService } from '../../entities/position/position.service';\nimport { AXPDataGenerator, AXPSettingScope, AXPSettingService } from '@acorex/platform/common';\nimport { AXPSessionService } from '@acorex/platform/auth';\nimport { AXPOrganizationSetting } from '../../setting.keys';\n\n\n@Injectable()\nexport class AXMOrgChartService {\n\n private companyService = inject(AXMOrganizationManagementCompanyEntityService);\n private departmentService = inject(AXMOrganizationManagementDepartmentEntityService);\n private employmentService = inject(AXMOrganizationManagementEmployeeEntityService);\n private positionService = inject(AXMOrganizationManagementPositionEntityService);\n private chartService = inject(AXMOrganizationManagementChartEntityService);\n\n private readonly settingService = inject(AXPSettingService);\n //\n private sessionService = inject(AXPSessionService);\n\n\n protected _types = ['Company', 'Location', 'BusinessUnit', 'Role', 'Employee'];\n\n public get types(): string[] {\n return this._types;\n }\n\n private _defaultPermissioEncoded = '0111001110001100001100001';\n\n protected permissions = signal<{ [parent: string]: { [child: string]: number } }>(this.defaultPermissions());\n\n\n\n\n\n //#region Load And Save\n\n public async load(id?: string): Promise<AXMOrganizationManagementChartEntityModel> {\n if (id) {\n const item = await this.chartService.getOne(id);\n return item;\n } else {\n return await this.createNew();\n }\n }\n\n private async createNew(): Promise<AXMOrganizationManagementChartEntityModel> {\n const tenant = this.sessionService.tenant!;\n return {\n //createAt: new Date(),\n //updateAt: new Date(),\n version: '0.0.0',\n nodes: [{\n id: AXPDataGenerator.uuid(),\n title: tenant.name,\n entity: {\n id: tenant.id,\n source: 'tenant',\n },\n }],\n };\n }\n\n public async save(chart: AXMOrganizationManagementChartEntityModel): Promise<void> {\n if (chart.id) {\n await this.chartService.updateOne(chart.id, { version: chart.version, nodes: chart.nodes, updateAt: new Date() });\n } else {\n await this.chartService.insertOne(chart);\n }\n } //save Chart Data\n\n public async listItemType(type: any, event: any): Promise<any> {\n switch (type.text.toLowerCase()) {\n case 'company':\n return await this.companyService.query({\n skip: event.skip,\n take: event.take,\n filter: event.filter,\n sort: event.sort,\n });\n case 'country':\n break;\n case 'city':\n break;\n case 'department':\n return (await this.departmentService.query({\n skip: event.skip,\n take: event.take,\n filter: event.filter,\n sort: event.sort,\n })) as any;\n case 'position':\n return (await this.positionService.query({\n skip: event.skip,\n take: event.take,\n filter: event.filter,\n sort: event.sort,\n })) as any;\n case 'employment':\n return (await this.employmentService.query({\n skip: event.skip,\n take: event.take,\n filter: event.filter,\n sort: event.sort,\n })) as any;\n }\n }\n\n //#endregion\n\n\n\n //#region Configuration Methods\n\n\n private defaultPermissions() {\n return this.decodePermissionsString(this._defaultPermissioEncoded);\n }\n\n\n private encodePermissionsString(\n permissions: { [parent: string]: { [child: string]: number } }\n ): string {\n let str = '';\n for (const parent of this.types) {\n for (const child of this.types) {\n str += (permissions[parent]?.[child] ?? 0).toString();\n }\n }\n return str;\n }\n\n\n private decodePermissionsString(encoded: string): { [parent: string]: { [child: string]: number } } {\n const result: { [parent: string]: { [child: string]: number } } = {};\n const expectedLength = this.types.length * this.types.length;\n if (encoded.length !== expectedLength) {\n throw new Error(`Invalid permissions string length. Expected ${expectedLength} but got ${encoded.length}`);\n }\n let index = 0;\n for (const parent of this.types) {\n result[parent] = {};\n for (const child of this.types) {\n const char = encoded.charAt(index);\n result[parent][child] = parseInt(char, 10);\n index++;\n }\n }\n return result;\n }\n\n\n private decodePermissionsMatrix(matrix: number[][]): { [parent: string]: { [child: string]: number } } {\n const newPermissions: { [parent: string]: { [child: string]: number } } = {};\n this.types.forEach((parent, rowIndex) => {\n newPermissions[parent] = {};\n this.types.forEach((child, colIndex) => {\n newPermissions[parent][child] = matrix[rowIndex][colIndex];\n });\n });\n return newPermissions;\n }\n\n private validateStoredPermissions(storedValue: unknown): { [parent: string]: { [child: string]: number } } {\n try {\n if (typeof storedValue === 'string') {\n const expectedLength = this.types.length * this.types.length;\n // Check that the string is the correct length and only contains 0s and 1s.\n if (storedValue.length === expectedLength && /^[01]+$/.test(storedValue)) {\n return this.decodePermissionsString(storedValue);\n }\n } else if (Array.isArray(storedValue)) {\n // Validate the 2D array dimensions and values.\n if (\n storedValue.length === this.types.length &&\n storedValue.every(\n row =>\n Array.isArray(row) &&\n row.length === this.types.length &&\n row.every(val => val === 0 || val === 1)\n )\n ) {\n return this.decodePermissionsMatrix(storedValue);\n }\n } else if (typeof storedValue === 'object' && storedValue !== null) {\n // Validate that the object has all the required keys and that their values are 0 or 1.\n let valid = true;\n for (const parent of this.types) {\n if (!(parent in storedValue)) {\n valid = false;\n break;\n }\n const childPermissions = (storedValue as any)[parent];\n for (const child of this.types) {\n if (!(child in childPermissions) || (childPermissions[child] !== 0 && childPermissions[child] !== 1)) {\n valid = false;\n break;\n }\n }\n if (!valid) break;\n }\n if (valid) {\n return storedValue as { [parent: string]: { [child: string]: number } };\n }\n }\n } catch (error) {\n // In case of any errors during validation, fall back to default permissions.\n }\n // Return the default permissions if validation fails.\n return this.defaultPermissions();\n }\n\n\n public isAllowed(parent: string, child: string): boolean {\n return (this.permissions()[parent]?.[child] ?? 0) === 1;\n }\n\n\n public setPermission(parent: string, child: string, value: boolean) {\n this.permissions.update((p) => {\n if (!p[parent]) {\n p[parent] = {};\n }\n p[parent][child] = value ? 1 : 0;\n return p;\n });\n }\n\n public getPermission(parent: string, child: string): boolean {\n return this.permissions()[parent]?.[child] === 1;\n }\n\n\n public async loadSettings() {\n const storedValue = await this.settingService\n .scope(AXPSettingScope.Tenant)\n .get(AXPOrganizationSetting.Relations);\n\n // Use the validation method to ensure the stored value is correct.\n if (storedValue) {\n const validatedPermissions = this.validateStoredPermissions(storedValue);\n this.permissions.set(validatedPermissions);\n } else {\n this.permissions.set(this.defaultPermissions());\n }\n }\n\n public async updateSettings() {\n const matrix = this.encodePermissionsString(this.permissions());\n await this.settingService\n .scope(AXPSettingScope.Tenant)\n .set(AXPOrganizationSetting.Relations, matrix);\n }\n\n //#endregion\n}\n","import { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownButtonModule } from '@acorex/components/dropdown-button';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXMenuModule } from '@acorex/components/menu';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPSimplePageLayout } from '@acorex/platform/themes/default';\nimport {\n AXPLayoutThemeService,\n AXPThemeLayoutActionsComponent,\n AXPThemeLayoutBlockComponent,\n AXPThemeLayoutHeaderTemplateComponent,\n AXPThemeLayoutPagePrimaryActionsComponent,\n AXPThemeLayoutPageSecondaryActionsComponent,\n} from '@acorex/platform/themes/shared';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n signal,\n} from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { RootConfig } from '../../const';\nimport { AXCheckBoxModule } from '@acorex/components/check-box';\nimport { FormsModule } from '@angular/forms';\nimport { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';\nimport { AXAlertModule } from '@acorex/components/alert';\nimport { AXMOrgChartService } from './org-chart.service';\n\n@Component({\n templateUrl: './org-chart-configuration.page.html',\n styleUrls: ['./org-chart-configuration.page.scss'],\n imports: [\n CommonModule,\n RouterModule,\n FormsModule,\n //\n AXPSimplePageLayout,\n AXPThemeLayoutBlockComponent,\n AXPThemeLayoutHeaderTemplateComponent,\n AXPThemeLayoutActionsComponent,\n AXPThemeLayoutPageSecondaryActionsComponent,\n AXPThemeLayoutPagePrimaryActionsComponent,\n //\n AXMenuModule,\n AXButtonModule,\n AXDropdownButtonModule,\n AXTranslationModule,\n AXDecoratorModule,\n AXLoadingModule,\n AXCheckBoxModule,\n AXBreadcrumbsModule,\n AXAlertModule\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [AXMOrgChartService],\n})\nexport class AXMOrgChartConfigurationPage {\n\n protected readonly layout = inject(AXPLayoutThemeService);\n protected readonly chartService = inject(AXMOrgChartService);\n\n protected loadingStates = signal<{ [parent: string]: { [child: string]: boolean } | undefined }>({});\n\n protected readonly rootConfig = RootConfig;\n\n\n async ngOnInit() {\n await this.chartService.loadSettings();\n }\n\n\n protected async togglePermission(parent: string, child: string) {\n //TODO: Check the async and loading\n\n // Set the loading state for this cell to true.\n this.loadingStates.update((states) => {\n if (!states[parent]) {\n states[parent] = {};\n }\n states[parent][child] = true;\n return states;\n });\n\n\n\n this.chartService.setPermission(parent, child, !this.chartService.getPermission(parent, child));\n\n await this.chartService.updateSettings();\n\n // Turn off the loading state.\n this.loadingStates.update((states) => {\n if (!states[parent]) {\n states[parent] = {};\n }\n states[parent][child] = false;\n return states;\n });\n }\n\n\n}\n","<axp-layout-simple-page *translate=\"let t\">\n <axp-layout-header>\n <axp-layout-title> {{t(rootConfig.entities.structure.title) | async}} </axp-layout-title>\n\n <axp-layout-description>Customize your organization's hierarchical relationships</axp-layout-description>\n\n <axp-layout-actions>\n <axp-layout-actions-primary> </axp-layout-actions-primary>\n <axp-layout-actions-secondary>\n <ax-button-item [text]=\"(t('reset') | async)!\">\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\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>\n Home\n </ax-breadcrumbs-item>\n <ax-breadcrumbs-item>\n Organization\n </ax-breadcrumbs-item>\n </ax-breadcrumbs>\n </axp-layout-breadcrumbs>\n </axp-layout-header>\n\n <axp-layout-content>\n <div class=\"ax-flex ax-flex-col ax-gap-6 ax-w-full 2xl:ax-w-3/4 3xl:ax-w-1/2\">\n <div>\n <h3 class=\"ax-font-semibold ax-text-xl\">Relations Permissions</h3>\n <p class=\"ax-text-sm ax-opacity-85\">\n This matrix sets the relationships between nodes in your organization chart. Click a cell to toggle the\n relation between <span class=\"ax-text-danger-500\">Allowed</span> and <span\n class=\"ax-text-success-500\">Denied</span>.\n </p>\n </div>\n <div class=\"ax-rounded-md ax-overflow-hidden ax-w-full\">\n <table class=\" ax-table-auto ax-border-collapse ax-w-full ax-border-primary-900 ax-rounded-md\">\n <thead>\n <tr class=\"ax-bg-primary-400 ax-text-on-primary\">\n <!-- Top-left empty cell -->\n <th class=\"ax-border ax-border-primary-900 ax-p-4 ax-min-w-44 ax-font-semibold ax-text-start\">Parent\n \\\n Child</th>\n <!-- Horizontal headers -->\n @for ( type of chartService.types; track $index) {\n <th class=\"ax-border ax-border-primary-900 ax-p-4 ax-min-w-44 ax-text-center ax-font-semibold\">\n {{ type }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n <!-- For each parent type, render a row with alternating backgrounds -->\n @for ( parent of chartService.types; track $index) {\n <tr>\n <!-- Vertical header cell with custom header colors -->\n <td\n class=\"ax-border ax-border-primary-900 ax-p-4 ax-font-semibold ax-bg-primary-400 ax-text-on-primary ax-text-start\">\n {{ parent }}\n </td>\n <!-- Render a cell for each potential child type -->\n @for ( child of chartService.types; track $index) {\n <td class=\"ax-border ax-border-primary-900 ax-p-2 \">\n <div class=\"ax-flex ax-justify-center ax-cursor-pointer ax-sm\">\n @let isLoading = loadingStates()[parent]?.[child];\n <ax-button look=\"twotone\" [color]=\"chartService.isAllowed(parent, child) ? 'success' : 'danger'\"\n [text]=\"chartService.isAllowed(parent, child) ? 'Allowed' : 'Denied'\" [disabled]=\"isLoading\"\n (onClick)=\"togglePermission(parent, child)\">\n @if(isLoading)\n {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n <div>\n <ax-alert [color]=\"'warning'\">\n <ax-icon></ax-icon>\n <ax-title>Attention</ax-title>\n <ax-content>\n Changes made here will not update your current organization chart. They will only affect future charts or\n updates.\n </ax-content>\n </ax-alert>\n </div>\n </div>\n\n </axp-layout-content>\n</axp-layout-simple-page>"],"names":["i2","i3","i4","i5"],"mappings":"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"}
|