ldap-rest 0.0.1
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/LICENSE +661 -0
- package/README.md +48 -0
- package/bin/cleanup-external-users.mjs +219 -0
- package/bin/index.mjs +54 -0
- package/bin/sync-james.mjs +190 -0
- package/dist/abstract/ldapFlat.js +1 -0
- package/dist/abstract/plugin.js +1 -0
- package/dist/abstract/twakePlugin.js +1 -0
- package/dist/bin/index.js +1 -0
- package/dist/config/args.js +1 -0
- package/dist/lib/auth/base.js +1 -0
- package/dist/lib/authz/base.js +1 -0
- package/dist/lib/expressFormatedResponses.js +1 -0
- package/dist/lib/ldapActions.js +1 -0
- package/dist/lib/parseConfig.js +1 -0
- package/dist/lib/utils.js +1 -0
- package/dist/logger/winston.js +1 -0
- package/dist/plugins/auth/authzLinid1.js +1 -0
- package/dist/plugins/auth/authzPerBranch.js +1 -0
- package/dist/plugins/auth/crowdsec.js +1 -0
- package/dist/plugins/auth/llng.js +1 -0
- package/dist/plugins/auth/openidconnect.js +1 -0
- package/dist/plugins/auth/rateLimit.js +1 -0
- package/dist/plugins/auth/token.js +1 -0
- package/dist/plugins/configApi.js +1 -0
- package/dist/plugins/demo/helloworld.js +1 -0
- package/dist/plugins/ldap/bulkImport.js +1 -0
- package/dist/plugins/ldap/departmentSync.js +1 -0
- package/dist/plugins/ldap/externalUsersInGroups.js +1 -0
- package/dist/plugins/ldap/flatGeneric.js +1 -0
- package/dist/plugins/ldap/groups.js +1 -0
- package/dist/plugins/ldap/onChange.js +1 -0
- package/dist/plugins/ldap/organization.js +1 -0
- package/dist/plugins/ldap/trash.js +1 -0
- package/dist/plugins/priority.json.js +1 -0
- package/dist/plugins/static.js +1 -0
- package/dist/plugins/twake/calendarResources.js +1 -0
- package/dist/plugins/twake/james.js +1 -0
- package/dist/plugins/weblogs.js +1 -0
- package/dist/src/abstract/ldapFlat.d.ts +94 -0
- package/dist/src/abstract/plugin.d.ts +43 -0
- package/dist/src/abstract/twakePlugin.d.ts +90 -0
- package/dist/src/bin/index.d.ts +43 -0
- package/dist/src/browser/ldap-group-editor/LdapGroupEditor.d.ts +31 -0
- package/dist/src/browser/ldap-group-editor/api/GroupApiClient.d.ts +23 -0
- package/dist/src/browser/ldap-group-editor/components/CreateGroupModal.d.ts +19 -0
- package/dist/src/browser/ldap-group-editor/components/GroupPropertyEditor.d.ts +30 -0
- package/dist/src/browser/ldap-group-editor/components/GroupTree.d.ts +17 -0
- package/dist/src/browser/ldap-group-editor/components/MoveGroupModal.d.ts +20 -0
- package/dist/src/browser/ldap-group-editor/index.d.ts +6 -0
- package/dist/src/browser/ldap-group-editor/types.d.ts +58 -0
- package/dist/src/browser/ldap-resource-editor/api/ResourceApiClient.d.ts +53 -0
- package/dist/src/browser/ldap-resource-editor/cache/CacheManager.d.ts +65 -0
- package/dist/src/browser/ldap-resource-editor/index.d.ts +6 -0
- package/dist/src/browser/ldap-resource-editor/types.d.ts +78 -0
- package/dist/src/browser/ldap-tree-viewer/LdapTreeViewer.d.ts +26 -0
- package/dist/src/browser/ldap-tree-viewer/api/LdapApiClient.d.ts +30 -0
- package/dist/src/browser/ldap-tree-viewer/components/TreeNode.d.ts +17 -0
- package/dist/src/browser/ldap-tree-viewer/components/TreeRoot.d.ts +14 -0
- package/dist/src/browser/ldap-tree-viewer/index.d.ts +7 -0
- package/dist/src/browser/ldap-tree-viewer/store/Store.d.ts +18 -0
- package/dist/src/browser/ldap-tree-viewer/store/actions.d.ts +28 -0
- package/dist/src/browser/ldap-tree-viewer/store/reducers.d.ts +7 -0
- package/dist/src/browser/ldap-tree-viewer/types.d.ts +34 -0
- package/dist/src/browser/ldap-unit-editor/LdapUnitEditor.d.ts +27 -0
- package/dist/src/browser/ldap-unit-editor/api/UnitApiClient.d.ts +24 -0
- package/dist/src/browser/ldap-unit-editor/components/MoveUnitModal.d.ts +28 -0
- package/dist/src/browser/ldap-unit-editor/components/UnitPropertyEditor.d.ts +28 -0
- package/dist/src/browser/ldap-unit-editor/components/UnitTree.d.ts +18 -0
- package/dist/src/browser/ldap-unit-editor/index.d.ts +6 -0
- package/dist/src/browser/ldap-unit-editor/types.d.ts +55 -0
- package/dist/src/browser/ldap-user-editor/LdapUserEditor.d.ts +32 -0
- package/dist/src/browser/ldap-user-editor/api/UserApiClient.d.ts +55 -0
- package/dist/src/browser/ldap-user-editor/cache/CacheManager.d.ts +65 -0
- package/dist/src/browser/ldap-user-editor/components/MoveUserModal.d.ts +28 -0
- package/dist/src/browser/ldap-user-editor/components/PointerField.d.ts +22 -0
- package/dist/src/browser/ldap-user-editor/components/UserEditor.d.ts +46 -0
- package/dist/src/browser/ldap-user-editor/components/UserList.d.ts +24 -0
- package/dist/src/browser/ldap-user-editor/components/UserTree.d.ts +24 -0
- package/dist/src/browser/ldap-user-editor/index.d.ts +7 -0
- package/dist/src/browser/ldap-user-editor/types.d.ts +67 -0
- package/dist/src/browser/shared/components/Modal.d.ts +38 -0
- package/dist/src/browser/shared/components/StatusMessage.d.ts +48 -0
- package/dist/src/browser/shared/index.d.ts +10 -0
- package/dist/src/browser/shared/types/index.d.ts +65 -0
- package/dist/src/browser/shared/utils/dom.d.ts +33 -0
- package/dist/src/browser/shared/utils/form.d.ts +28 -0
- package/dist/src/browser/shared/utils/schema.d.ts +29 -0
- package/dist/src/config/args.d.ts +128 -0
- package/dist/src/config/schema.d.ts +18 -0
- package/dist/src/hooks.d.ts +76 -0
- package/dist/src/lib/auth/base.d.ts +9 -0
- package/dist/src/lib/authz/base.d.ts +63 -0
- package/dist/src/lib/expressFormatedResponses.d.ts +26 -0
- package/dist/src/lib/ldapActions.d.ts +91 -0
- package/dist/src/lib/parseConfig.d.ts +23 -0
- package/dist/src/lib/utils.d.ts +73 -0
- package/dist/src/logger/winston.d.ts +3 -0
- package/dist/src/plugins/auth/authzLinid1.d.ts +46 -0
- package/dist/src/plugins/auth/authzPerBranch.d.ts +59 -0
- package/dist/src/plugins/auth/crowdsec.d.ts +29 -0
- package/dist/src/plugins/auth/llng.d.ts +8 -0
- package/dist/src/plugins/auth/openidconnect.d.ts +11 -0
- package/dist/src/plugins/auth/rateLimit.d.ts +24 -0
- package/dist/src/plugins/auth/token.d.ts +17 -0
- package/dist/src/plugins/configApi.d.ts +24 -0
- package/dist/src/plugins/demo/helloworld.d.ts +12 -0
- package/dist/src/plugins/ldap/bulkImport.d.ts +48 -0
- package/dist/src/plugins/ldap/departmentSync.d.ts +35 -0
- package/dist/src/plugins/ldap/externalUsersInGroups.d.ts +21 -0
- package/dist/src/plugins/ldap/flatGeneric.d.ts +31 -0
- package/dist/src/plugins/ldap/groups.d.ts +95 -0
- package/dist/src/plugins/ldap/onChange.d.ts +32 -0
- package/dist/src/plugins/ldap/organization.d.ts +65 -0
- package/dist/src/plugins/ldap/trash.d.ts +52 -0
- package/dist/src/plugins/static.d.ts +7 -0
- package/dist/src/plugins/twake/calendarResources.d.ts +31 -0
- package/dist/src/plugins/twake/james.d.ts +83 -0
- package/dist/src/plugins/weblogs.d.ts +8 -0
- package/docs/DEVELOPER_GUIDE.md +298 -0
- package/docs/OPENAPI.md +440 -0
- package/docs/PLUGIN_DEPENDENCIES.md +612 -0
- package/docs/README.md +466 -0
- package/docs/api/REFERENCE.md +983 -0
- package/docs/api/REST_API.md +1237 -0
- package/docs/authentication.md +469 -0
- package/docs/authzLinid1.md +521 -0
- package/docs/authzPerBranch.md +596 -0
- package/docs/browser/LIBRARIES.md +1196 -0
- package/docs/examples/EXAMPLES.md +1659 -0
- package/docs/examples/twake-mailbox-type-nomenclature.ldif +37 -0
- package/docs/examples/twake-mailbox-type-schema-amendment.ldif +30 -0
- package/docs/jamesTeamMailboxes.md +343 -0
- package/docs/ldapBulkImport.md +722 -0
- package/docs/ldapExternalUsersInGroups.md +325 -0
- package/docs/ldapFlatGeneric.md +444 -0
- package/docs/ldapGroups.md +589 -0
- package/docs/ldapOrganizations.md +659 -0
- package/docs/ldapTrash.md +260 -0
- package/docs/linagora.png +0 -0
- package/docs/onChange.md +318 -0
- package/docs/plugins/DEVELOPMENT.md +1219 -0
- package/docs/presenterm-fr.md +721 -0
- package/docs/presenterm.md +721 -0
- package/docs/schemas/SCHEMAS.md +1212 -0
- package/docs/static.md +410 -0
- package/docs/twakeCalendarResources.md +148 -0
- package/docs/twakeJames.md +661 -0
- package/docs/weblogs.md +399 -0
- package/examples/web/ldap-group-editor.html +113 -0
- package/examples/web/ldap-tree-viewer.html +368 -0
- package/examples/web/ldap-unit-editor.html +108 -0
- package/examples/web/ldap-user-editor.html +412 -0
- package/package.json +458 -0
- package/static/browser/common-demo.css +450 -0
- package/static/browser/ldap-group-editor/LdapGroupEditor.js +207 -0
- package/static/browser/ldap-group-editor/LdapGroupEditor.js.map +1 -0
- package/static/browser/ldap-group-editor/api/GroupApiClient.js +112 -0
- package/static/browser/ldap-group-editor/api/GroupApiClient.js.map +1 -0
- package/static/browser/ldap-group-editor/components/CreateGroupModal.js +212 -0
- package/static/browser/ldap-group-editor/components/CreateGroupModal.js.map +1 -0
- package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js +497 -0
- package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js.map +1 -0
- package/static/browser/ldap-group-editor/components/GroupTree.js +153 -0
- package/static/browser/ldap-group-editor/components/GroupTree.js.map +1 -0
- package/static/browser/ldap-group-editor/components/MoveGroupModal.js +235 -0
- package/static/browser/ldap-group-editor/components/MoveGroupModal.js.map +1 -0
- package/static/browser/ldap-group-editor/index.js +2 -0
- package/static/browser/ldap-group-editor/index.js.map +1 -0
- package/static/browser/ldap-group-editor/types.js +2 -0
- package/static/browser/ldap-group-editor/types.js.map +1 -0
- package/static/browser/ldap-group-editor.esm.js +1399 -0
- package/static/browser/ldap-group-editor.esm.js.map +1 -0
- package/static/browser/ldap-group-editor.js +1407 -0
- package/static/browser/ldap-group-editor.js.map +1 -0
- package/static/browser/ldap-group-editor.min.js +2 -0
- package/static/browser/ldap-group-editor.min.js.map +1 -0
- package/static/browser/ldap-resource-editor/api/ResourceApiClient.js +226 -0
- package/static/browser/ldap-resource-editor/api/ResourceApiClient.js.map +1 -0
- package/static/browser/ldap-resource-editor/cache/CacheManager.js +123 -0
- package/static/browser/ldap-resource-editor/cache/CacheManager.js.map +1 -0
- package/static/browser/ldap-resource-editor/index.js +2 -0
- package/static/browser/ldap-resource-editor/index.js.map +1 -0
- package/static/browser/ldap-resource-editor/types.js +2 -0
- package/static/browser/ldap-resource-editor/types.js.map +1 -0
- package/static/browser/ldap-tree-viewer/LdapTreeViewer.js +187 -0
- package/static/browser/ldap-tree-viewer/LdapTreeViewer.js.map +1 -0
- package/static/browser/ldap-tree-viewer/api/LdapApiClient.js +50 -0
- package/static/browser/ldap-tree-viewer/api/LdapApiClient.js.map +1 -0
- package/static/browser/ldap-tree-viewer/components/TreeNode.js +140 -0
- package/static/browser/ldap-tree-viewer/components/TreeNode.js.map +1 -0
- package/static/browser/ldap-tree-viewer/components/TreeRoot.js +98 -0
- package/static/browser/ldap-tree-viewer/components/TreeRoot.js.map +1 -0
- package/static/browser/ldap-tree-viewer/index.js +2 -0
- package/static/browser/ldap-tree-viewer/index.js.map +1 -0
- package/static/browser/ldap-tree-viewer/store/Store.js +29 -0
- package/static/browser/ldap-tree-viewer/store/Store.js.map +1 -0
- package/static/browser/ldap-tree-viewer/store/actions.js +53 -0
- package/static/browser/ldap-tree-viewer/store/actions.js.map +1 -0
- package/static/browser/ldap-tree-viewer/store/reducers.js +79 -0
- package/static/browser/ldap-tree-viewer/store/reducers.js.map +1 -0
- package/static/browser/ldap-tree-viewer/types.js +2 -0
- package/static/browser/ldap-tree-viewer/types.js.map +1 -0
- package/static/browser/ldap-tree-viewer.css +2 -0
- package/static/browser/ldap-tree-viewer.css.map +1 -0
- package/static/browser/ldap-tree-viewer.esm.js +606 -0
- package/static/browser/ldap-tree-viewer.esm.js.map +1 -0
- package/static/browser/ldap-tree-viewer.js +614 -0
- package/static/browser/ldap-tree-viewer.js.map +1 -0
- package/static/browser/ldap-tree-viewer.min.js +2 -0
- package/static/browser/ldap-tree-viewer.min.js.map +1 -0
- package/static/browser/ldap-unit-editor/LdapUnitEditor.js +119 -0
- package/static/browser/ldap-unit-editor/LdapUnitEditor.js.map +1 -0
- package/static/browser/ldap-unit-editor/api/UnitApiClient.js +95 -0
- package/static/browser/ldap-unit-editor/api/UnitApiClient.js.map +1 -0
- package/static/browser/ldap-unit-editor/components/MoveUnitModal.js +295 -0
- package/static/browser/ldap-unit-editor/components/MoveUnitModal.js.map +1 -0
- package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js +321 -0
- package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js.map +1 -0
- package/static/browser/ldap-unit-editor/components/UnitTree.js +197 -0
- package/static/browser/ldap-unit-editor/components/UnitTree.js.map +1 -0
- package/static/browser/ldap-unit-editor/index.js +2 -0
- package/static/browser/ldap-unit-editor/index.js.map +1 -0
- package/static/browser/ldap-unit-editor/types.js +2 -0
- package/static/browser/ldap-unit-editor/types.js.map +1 -0
- package/static/browser/ldap-unit-editor.esm.js +1013 -0
- package/static/browser/ldap-unit-editor.esm.js.map +1 -0
- package/static/browser/ldap-unit-editor.js +1021 -0
- package/static/browser/ldap-unit-editor.js.map +1 -0
- package/static/browser/ldap-unit-editor.min.js +2 -0
- package/static/browser/ldap-unit-editor.min.js.map +1 -0
- package/static/browser/ldap-user-editor/LdapUserEditor.js +184 -0
- package/static/browser/ldap-user-editor/LdapUserEditor.js.map +1 -0
- package/static/browser/ldap-user-editor/api/UserApiClient.js +209 -0
- package/static/browser/ldap-user-editor/api/UserApiClient.js.map +1 -0
- package/static/browser/ldap-user-editor/cache/CacheManager.js +123 -0
- package/static/browser/ldap-user-editor/cache/CacheManager.js.map +1 -0
- package/static/browser/ldap-user-editor/components/MoveUserModal.js +302 -0
- package/static/browser/ldap-user-editor/components/MoveUserModal.js.map +1 -0
- package/static/browser/ldap-user-editor/components/PointerField.js +152 -0
- package/static/browser/ldap-user-editor/components/PointerField.js.map +1 -0
- package/static/browser/ldap-user-editor/components/UserEditor.js +608 -0
- package/static/browser/ldap-user-editor/components/UserEditor.js.map +1 -0
- package/static/browser/ldap-user-editor/components/UserList.js +181 -0
- package/static/browser/ldap-user-editor/components/UserList.js.map +1 -0
- package/static/browser/ldap-user-editor/components/UserTree.js +164 -0
- package/static/browser/ldap-user-editor/components/UserTree.js.map +1 -0
- package/static/browser/ldap-user-editor/index.js +2 -0
- package/static/browser/ldap-user-editor/index.js.map +1 -0
- package/static/browser/ldap-user-editor/types.js +2 -0
- package/static/browser/ldap-user-editor/types.js.map +1 -0
- package/static/browser/ldap-user-editor.css +2 -0
- package/static/browser/ldap-user-editor.css.map +1 -0
- package/static/browser/ldap-user-editor.esm.js +1897 -0
- package/static/browser/ldap-user-editor.esm.js.map +1 -0
- package/static/browser/ldap-user-editor.js +1905 -0
- package/static/browser/ldap-user-editor.js.map +1 -0
- package/static/browser/ldap-user-editor.min.js +2 -0
- package/static/browser/ldap-user-editor.min.js.map +1 -0
- package/static/browser/shared/components/Modal.js +121 -0
- package/static/browser/shared/components/Modal.js.map +1 -0
- package/static/browser/shared/components/StatusMessage.js +119 -0
- package/static/browser/shared/components/StatusMessage.js.map +1 -0
- package/static/browser/shared/index.js +7 -0
- package/static/browser/shared/index.js.map +1 -0
- package/static/browser/shared/types/index.js +37 -0
- package/static/browser/shared/types/index.js.map +1 -0
- package/static/browser/shared/utils/dom.js +78 -0
- package/static/browser/shared/utils/dom.js.map +1 -0
- package/static/browser/shared/utils/form.js +234 -0
- package/static/browser/shared/utils/form.js.map +1 -0
- package/static/browser/shared/utils/schema.js +121 -0
- package/static/browser/shared/utils/schema.js.map +1 -0
- package/static/browser/shared.esm.js +694 -0
- package/static/browser/shared.esm.js.map +1 -0
- package/static/browser/shared.js +723 -0
- package/static/browser/shared.js.map +1 -0
- package/static/browser/shared.min.js +2 -0
- package/static/browser/shared.min.js.map +1 -0
- package/static/schemas/ad/computers.json +92 -0
- package/static/schemas/ad/groups.json +55 -0
- package/static/schemas/ad/organizations.json +66 -0
- package/static/schemas/ad/users.json +116 -0
- package/static/schemas/standard/devices.json +72 -0
- package/static/schemas/standard/groups.json +54 -0
- package/static/schemas/standard/organizations.json +49 -0
- package/static/schemas/standard/users.json +86 -0
- package/static/schemas/twake/groups.json +75 -0
- package/static/schemas/twake/nomenclature/twakeAccountStatus.json +31 -0
- package/static/schemas/twake/nomenclature/twakeDeliveryMode.json +31 -0
- package/static/schemas/twake/nomenclature/twakeListType.json +31 -0
- package/static/schemas/twake/nomenclature/twakeMailboxType.json +31 -0
- package/static/schemas/twake/nomenclature/twakeTitle.json +31 -0
- package/static/schemas/twake/organizations.json +52 -0
- package/static/schemas/twake/positions.json +32 -0
- package/static/schemas/twake/users.json +112 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Move Group Modal Component - Modal for selecting target organization when moving a group
|
|
3
|
+
*/
|
|
4
|
+
import type { GroupApiClient } from '../api/GroupApiClient';
|
|
5
|
+
export declare class MoveGroupModal {
|
|
6
|
+
private api;
|
|
7
|
+
private currentOrgDn;
|
|
8
|
+
private onMove;
|
|
9
|
+
private modal;
|
|
10
|
+
private expandedNodes;
|
|
11
|
+
private selectedOrgDn;
|
|
12
|
+
constructor(api: GroupApiClient, currentOrgDn: string, onMove: (targetOrgDn: string) => Promise<void>);
|
|
13
|
+
show(): Promise<void>;
|
|
14
|
+
private loadOrgTree;
|
|
15
|
+
private renderNode;
|
|
16
|
+
private attachTreeEventListeners;
|
|
17
|
+
private handleConfirm;
|
|
18
|
+
private close;
|
|
19
|
+
private escapeHtml;
|
|
20
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript types for LDAP Group Editor
|
|
3
|
+
*/
|
|
4
|
+
export interface GroupEditorOptions {
|
|
5
|
+
containerId: string;
|
|
6
|
+
apiBaseUrl?: string;
|
|
7
|
+
onGroupSaved?: (groupDn: string) => void;
|
|
8
|
+
onError?: (error: Error) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface Config {
|
|
11
|
+
ldapBase: string;
|
|
12
|
+
features?: {
|
|
13
|
+
flatResources?: ResourceConfig[];
|
|
14
|
+
ldapFlatGeneric?: {
|
|
15
|
+
flatResources?: ResourceConfig[];
|
|
16
|
+
};
|
|
17
|
+
ldapGroups?: {
|
|
18
|
+
schemaUrl?: string;
|
|
19
|
+
schema?: SchemaDefinition;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface ResourceConfig {
|
|
25
|
+
name: string;
|
|
26
|
+
pluralName?: string;
|
|
27
|
+
schemaUrl?: string;
|
|
28
|
+
schema?: SchemaDefinition;
|
|
29
|
+
base?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface SchemaDefinition {
|
|
32
|
+
entity: {
|
|
33
|
+
objectClass?: string[];
|
|
34
|
+
base?: string;
|
|
35
|
+
};
|
|
36
|
+
attributes: Record<string, SchemaAttribute>;
|
|
37
|
+
}
|
|
38
|
+
export interface SchemaAttribute {
|
|
39
|
+
type: 'string' | 'number' | 'integer' | 'array' | 'pointer';
|
|
40
|
+
required?: boolean;
|
|
41
|
+
fixed?: boolean;
|
|
42
|
+
default?: unknown;
|
|
43
|
+
branch?: string[];
|
|
44
|
+
items?: {
|
|
45
|
+
type: string;
|
|
46
|
+
branch?: string[];
|
|
47
|
+
};
|
|
48
|
+
group?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface LdapGroup {
|
|
51
|
+
dn: string;
|
|
52
|
+
cn: string;
|
|
53
|
+
description?: string;
|
|
54
|
+
member?: string[];
|
|
55
|
+
owner?: string[];
|
|
56
|
+
mail?: string;
|
|
57
|
+
[key: string]: unknown;
|
|
58
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LDAP Resource Editor - Generic API Client
|
|
3
|
+
*/
|
|
4
|
+
import type { Config, LdapResource, PointerOption, Schema, ResourceType } from '../types';
|
|
5
|
+
import { CacheManager } from '../cache/CacheManager';
|
|
6
|
+
export declare class ResourceApiClient {
|
|
7
|
+
private baseUrl;
|
|
8
|
+
private cache;
|
|
9
|
+
private resourceType;
|
|
10
|
+
constructor(resourceType: ResourceType, baseUrl?: string, cacheOptions?: {
|
|
11
|
+
ttl?: number;
|
|
12
|
+
maxEntries?: number;
|
|
13
|
+
});
|
|
14
|
+
private getApiBase;
|
|
15
|
+
private getResourceEndpoint;
|
|
16
|
+
private getFirstValue;
|
|
17
|
+
/**
|
|
18
|
+
* Fetch with cache support for GET requests
|
|
19
|
+
*/
|
|
20
|
+
private cachedFetch;
|
|
21
|
+
getConfig(): Promise<Config>;
|
|
22
|
+
getSchema(schemaUrl: string): Promise<Schema>;
|
|
23
|
+
getResources(search?: string): Promise<LdapResource[]>;
|
|
24
|
+
getResource(dn: string): Promise<LdapResource>;
|
|
25
|
+
updateResource(dn: string, data: Partial<LdapResource>): Promise<LdapResource>;
|
|
26
|
+
createResource(data: Partial<LdapResource>): Promise<LdapResource>;
|
|
27
|
+
deleteResource(dn: string): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Create a generic entry (for organizations tree navigation)
|
|
30
|
+
*/
|
|
31
|
+
createEntry(dn: string, data: Partial<LdapResource>): Promise<LdapResource>;
|
|
32
|
+
/**
|
|
33
|
+
* Delete a generic entry (for organizations)
|
|
34
|
+
*/
|
|
35
|
+
deleteEntry(dn: string): Promise<void>;
|
|
36
|
+
getPointerOptions(branch: string): Promise<PointerOption[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Get main attribute for this resource type
|
|
39
|
+
*/
|
|
40
|
+
private getMainAttribute;
|
|
41
|
+
/**
|
|
42
|
+
* Cache management methods
|
|
43
|
+
*/
|
|
44
|
+
clearCache(): void;
|
|
45
|
+
invalidateCache(pattern: string): void;
|
|
46
|
+
getCacheStats(): {
|
|
47
|
+
size: number;
|
|
48
|
+
maxSize: number;
|
|
49
|
+
ttl: number;
|
|
50
|
+
keys: string[];
|
|
51
|
+
};
|
|
52
|
+
getCache(): CacheManager;
|
|
53
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple in-memory cache manager with LRU eviction
|
|
3
|
+
* Prevents excessive API calls when navigating the organization tree
|
|
4
|
+
*/
|
|
5
|
+
export interface CacheOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Time to live in milliseconds (default: 5 minutes)
|
|
8
|
+
*/
|
|
9
|
+
ttl?: number;
|
|
10
|
+
/**
|
|
11
|
+
* Maximum number of entries (default: 200)
|
|
12
|
+
*/
|
|
13
|
+
maxEntries?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class CacheManager {
|
|
16
|
+
private cache;
|
|
17
|
+
private ttl;
|
|
18
|
+
private maxEntries;
|
|
19
|
+
constructor(options?: CacheOptions);
|
|
20
|
+
/**
|
|
21
|
+
* Get an item from cache
|
|
22
|
+
* Returns null if not found or expired
|
|
23
|
+
*/
|
|
24
|
+
get<T>(key: string): T | null;
|
|
25
|
+
/**
|
|
26
|
+
* Set an item in cache
|
|
27
|
+
* Evicts least recently used items if cache is full
|
|
28
|
+
*/
|
|
29
|
+
set<T>(key: string, data: T): void;
|
|
30
|
+
/**
|
|
31
|
+
* Check if key exists and is not expired
|
|
32
|
+
*/
|
|
33
|
+
has(key: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Invalidate a specific key
|
|
36
|
+
*/
|
|
37
|
+
invalidate(key: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Invalidate all keys matching a pattern
|
|
40
|
+
* Pattern can contain wildcards (*)
|
|
41
|
+
*/
|
|
42
|
+
invalidatePattern(pattern: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Clear all cache
|
|
45
|
+
*/
|
|
46
|
+
clear(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Get cache statistics
|
|
49
|
+
*/
|
|
50
|
+
getStats(): {
|
|
51
|
+
size: number;
|
|
52
|
+
maxSize: number;
|
|
53
|
+
ttl: number;
|
|
54
|
+
keys: string[];
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Evict least recently used entry
|
|
58
|
+
*/
|
|
59
|
+
private evictLRU;
|
|
60
|
+
/**
|
|
61
|
+
* Clean expired entries
|
|
62
|
+
* Should be called periodically
|
|
63
|
+
*/
|
|
64
|
+
cleanExpired(): number;
|
|
65
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LDAP Resource Editor - Generic browser library
|
|
3
|
+
* @author Xavier Guimard
|
|
4
|
+
*/
|
|
5
|
+
export { ResourceApiClient } from './api/ResourceApiClient';
|
|
6
|
+
export type { EditorOptions, LdapResource, Schema, SchemaAttribute, PointerOption, Config, ResourceType, NavigationType, ResourceTypeConfig, } from './types';
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LDAP Resource Editor - Generic Type Definitions
|
|
3
|
+
*/
|
|
4
|
+
export type ResourceType = 'users' | 'groups' | 'organizations';
|
|
5
|
+
export type NavigationType = 'flat' | 'tree';
|
|
6
|
+
export interface EditorOptions {
|
|
7
|
+
containerId: string;
|
|
8
|
+
resourceType: ResourceType;
|
|
9
|
+
apiBaseUrl?: string;
|
|
10
|
+
navigationType?: NavigationType;
|
|
11
|
+
onResourceSaved?: (resourceDn: string) => void;
|
|
12
|
+
onError?: (error: Error) => void;
|
|
13
|
+
}
|
|
14
|
+
export interface LdapResource {
|
|
15
|
+
dn: string;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
export interface SchemaAttribute {
|
|
19
|
+
type: string;
|
|
20
|
+
required?: boolean;
|
|
21
|
+
fixed?: boolean;
|
|
22
|
+
role?: string;
|
|
23
|
+
test?: string;
|
|
24
|
+
branch?: string[];
|
|
25
|
+
items?: SchemaAttribute;
|
|
26
|
+
default?: unknown;
|
|
27
|
+
ui?: 'select' | 'search';
|
|
28
|
+
group?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface Schema {
|
|
31
|
+
entity: {
|
|
32
|
+
name: string;
|
|
33
|
+
mainAttribute: string;
|
|
34
|
+
objectClass: string[];
|
|
35
|
+
singularName: string;
|
|
36
|
+
pluralName: string;
|
|
37
|
+
base: string;
|
|
38
|
+
};
|
|
39
|
+
strict: boolean;
|
|
40
|
+
attributes: Record<string, SchemaAttribute>;
|
|
41
|
+
}
|
|
42
|
+
export interface PointerOption {
|
|
43
|
+
dn: string;
|
|
44
|
+
label: string;
|
|
45
|
+
}
|
|
46
|
+
export interface FlatResourceConfig {
|
|
47
|
+
name: string;
|
|
48
|
+
singularName: string;
|
|
49
|
+
pluralName: string;
|
|
50
|
+
mainAttribute: string;
|
|
51
|
+
objectClass: string[];
|
|
52
|
+
base: string;
|
|
53
|
+
schema?: Schema;
|
|
54
|
+
schemaUrl?: string;
|
|
55
|
+
endpoints: {
|
|
56
|
+
list: string;
|
|
57
|
+
get: string;
|
|
58
|
+
create: string;
|
|
59
|
+
update: string;
|
|
60
|
+
delete: string;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export interface Config {
|
|
64
|
+
apiPrefix: string;
|
|
65
|
+
ldapBase: string;
|
|
66
|
+
features?: {
|
|
67
|
+
flatResources?: FlatResourceConfig[];
|
|
68
|
+
ldapFlatGeneric?: {
|
|
69
|
+
flatResources?: FlatResourceConfig[];
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export interface ResourceTypeConfig {
|
|
74
|
+
singularName: string;
|
|
75
|
+
pluralName: string;
|
|
76
|
+
icon: string;
|
|
77
|
+
emptyStateMessage: string;
|
|
78
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main LdapTreeViewer class
|
|
3
|
+
*/
|
|
4
|
+
import type { ViewerOptions, TreeState } from './types';
|
|
5
|
+
export declare class LdapTreeViewer {
|
|
6
|
+
private options;
|
|
7
|
+
private store;
|
|
8
|
+
private api;
|
|
9
|
+
private container;
|
|
10
|
+
private rootComponent;
|
|
11
|
+
private unsubscribe?;
|
|
12
|
+
constructor(options: ViewerOptions);
|
|
13
|
+
init(): Promise<void>;
|
|
14
|
+
private render;
|
|
15
|
+
private handleNodeToggle;
|
|
16
|
+
private loadChildren;
|
|
17
|
+
private handleNodeClick;
|
|
18
|
+
private transformToTreeNode;
|
|
19
|
+
private detectNodeType;
|
|
20
|
+
expandNode(dn: string): Promise<void>;
|
|
21
|
+
collapseNode(dn: string): Promise<void>;
|
|
22
|
+
refresh(): Promise<void>;
|
|
23
|
+
selectNode(dn: string | null): void;
|
|
24
|
+
getState(): TreeState;
|
|
25
|
+
destroy(): void;
|
|
26
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LDAP API Client for browser
|
|
3
|
+
*/
|
|
4
|
+
interface LdapOrganization {
|
|
5
|
+
dn: string;
|
|
6
|
+
ou?: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
interface LdapSubnode {
|
|
10
|
+
dn: string;
|
|
11
|
+
type: string;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
interface LdapListResponse {
|
|
15
|
+
entries: unknown[];
|
|
16
|
+
total?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class LdapApiClient {
|
|
19
|
+
private baseUrl;
|
|
20
|
+
private authToken?;
|
|
21
|
+
constructor(baseUrl: string, authToken?: string | undefined);
|
|
22
|
+
private fetch;
|
|
23
|
+
getTopOrganization(): Promise<LdapOrganization>;
|
|
24
|
+
getOrganization(dn: string): Promise<LdapOrganization>;
|
|
25
|
+
getOrganizationSubnodes(dn: string): Promise<LdapSubnode[]>;
|
|
26
|
+
searchOrganizationSubnodes(dn: string, query: string): Promise<LdapSubnode[]>;
|
|
27
|
+
getUsers(filter?: string): Promise<LdapListResponse>;
|
|
28
|
+
getGroups(filter?: string): Promise<LdapListResponse>;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TreeNode component - renders individual tree nodes
|
|
3
|
+
*/
|
|
4
|
+
import type { TreeState } from '../types';
|
|
5
|
+
import type { Store } from '../store/Store';
|
|
6
|
+
export declare class TreeNodeComponent {
|
|
7
|
+
private dn;
|
|
8
|
+
private store;
|
|
9
|
+
private onToggle;
|
|
10
|
+
private onClick;
|
|
11
|
+
constructor(dn: string, store: Store<TreeState>, onToggle: (dn: string) => void, onClick: (dn: string) => void);
|
|
12
|
+
render(): HTMLElement;
|
|
13
|
+
private createContent;
|
|
14
|
+
private createSpinner;
|
|
15
|
+
private getClassNames;
|
|
16
|
+
private getIcon;
|
|
17
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TreeRoot component - renders the root container and tree
|
|
3
|
+
*/
|
|
4
|
+
import type { TreeState } from '../types';
|
|
5
|
+
import type { Store } from '../store/Store';
|
|
6
|
+
export declare class TreeRoot {
|
|
7
|
+
private store;
|
|
8
|
+
private onClick;
|
|
9
|
+
private onToggle;
|
|
10
|
+
constructor(store: Store<TreeState>, onClick: (dn: string) => void, onToggle: (dn: string) => void);
|
|
11
|
+
render(): HTMLElement;
|
|
12
|
+
private createError;
|
|
13
|
+
private createLoading;
|
|
14
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mini Store implementation (Redux-like pattern without dependencies)
|
|
3
|
+
*/
|
|
4
|
+
export type Listener = () => void;
|
|
5
|
+
export type Reducer<S> = (state: S, action: Action) => S;
|
|
6
|
+
export interface Action {
|
|
7
|
+
type: string;
|
|
8
|
+
payload?: unknown;
|
|
9
|
+
}
|
|
10
|
+
export declare class Store<S> {
|
|
11
|
+
private state;
|
|
12
|
+
private reducer;
|
|
13
|
+
private listeners;
|
|
14
|
+
constructor(reducer: Reducer<S>, initialState: S);
|
|
15
|
+
getState(): S;
|
|
16
|
+
dispatch(action: Action): void;
|
|
17
|
+
subscribe(listener: Listener): () => void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action types and action creators
|
|
3
|
+
*/
|
|
4
|
+
import type { TreeNode } from '../types';
|
|
5
|
+
import type { Action } from './Store';
|
|
6
|
+
export declare const Actions: {
|
|
7
|
+
readonly SET_ROOT: "SET_ROOT";
|
|
8
|
+
readonly ADD_NODE: "ADD_NODE";
|
|
9
|
+
readonly UPDATE_NODE: "UPDATE_NODE";
|
|
10
|
+
readonly TOGGLE_EXPANDED: "TOGGLE_EXPANDED";
|
|
11
|
+
readonly SET_LOADING: "SET_LOADING";
|
|
12
|
+
readonly SET_ERROR: "SET_ERROR";
|
|
13
|
+
readonly SELECT_NODE: "SELECT_NODE";
|
|
14
|
+
readonly SET_SEARCH: "SET_SEARCH";
|
|
15
|
+
readonly SET_FILTER: "SET_FILTER";
|
|
16
|
+
};
|
|
17
|
+
export declare const setRoot: (node: TreeNode) => Action;
|
|
18
|
+
export declare const addNode: (node: TreeNode) => Action;
|
|
19
|
+
export declare const updateNode: (node: TreeNode) => Action;
|
|
20
|
+
export declare const toggleExpanded: (dn: string) => Action;
|
|
21
|
+
export declare const setLoading: (payload: {
|
|
22
|
+
dn: string;
|
|
23
|
+
loading: boolean;
|
|
24
|
+
}) => Action;
|
|
25
|
+
export declare const setError: (error: string | null) => Action;
|
|
26
|
+
export declare const selectNode: (dn: string | null) => Action;
|
|
27
|
+
export declare const setSearch: (query: string) => Action;
|
|
28
|
+
export declare const setFilter: (filter: "all" | "organizations" | "users" | "groups") => Action;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript interfaces and types for LDAP Tree Viewer
|
|
3
|
+
*/
|
|
4
|
+
export interface TreeState {
|
|
5
|
+
nodes: Map<string, TreeNode>;
|
|
6
|
+
rootDn: string | null;
|
|
7
|
+
expandedNodes: Set<string>;
|
|
8
|
+
loadingNodes: Set<string>;
|
|
9
|
+
selectedNode: string | null;
|
|
10
|
+
error: string | null;
|
|
11
|
+
searchQuery: string;
|
|
12
|
+
filter: 'all' | 'organizations' | 'users' | 'groups';
|
|
13
|
+
}
|
|
14
|
+
export interface TreeNode {
|
|
15
|
+
dn: string;
|
|
16
|
+
displayName: string;
|
|
17
|
+
type: 'organization' | 'user' | 'group' | 'more';
|
|
18
|
+
parentDn: string | null;
|
|
19
|
+
childrenDns: string[];
|
|
20
|
+
hasLoadedChildren: boolean;
|
|
21
|
+
hasChildren: boolean;
|
|
22
|
+
attributes?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export interface ViewerOptions {
|
|
25
|
+
containerId: string;
|
|
26
|
+
apiBaseUrl: string;
|
|
27
|
+
authToken?: string;
|
|
28
|
+
rootDn?: string;
|
|
29
|
+
theme?: 'light' | 'dark';
|
|
30
|
+
onNodeClick?: (node: TreeNode) => void;
|
|
31
|
+
onNodeExpand?: (node: TreeNode) => void;
|
|
32
|
+
}
|
|
33
|
+
export type NodeType = 'organization' | 'user' | 'group' | 'more';
|
|
34
|
+
export type FilterType = 'all' | 'organizations' | 'users' | 'groups';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LDAP Unit Editor - Main component for editing organizational units
|
|
3
|
+
*/
|
|
4
|
+
import { UnitApiClient } from './api/UnitApiClient.js';
|
|
5
|
+
import type { UnitEditorOptions, Config } from './types';
|
|
6
|
+
export declare class LdapUnitEditor {
|
|
7
|
+
private container;
|
|
8
|
+
private options;
|
|
9
|
+
private api;
|
|
10
|
+
private unitTree;
|
|
11
|
+
private unitEditor;
|
|
12
|
+
private currentUnitDn;
|
|
13
|
+
private config;
|
|
14
|
+
constructor(options: UnitEditorOptions);
|
|
15
|
+
init(): Promise<void>;
|
|
16
|
+
private render;
|
|
17
|
+
private initializeComponents;
|
|
18
|
+
private onUnitSelected;
|
|
19
|
+
getCurrentUnitDn(): string | null;
|
|
20
|
+
refresh(): Promise<void>;
|
|
21
|
+
getApi(): UnitApiClient;
|
|
22
|
+
getConfig(): Config | null;
|
|
23
|
+
getCurrentOrgDn(): string | null;
|
|
24
|
+
getCurrentUserDn(): string | null;
|
|
25
|
+
createUser(data: Record<string, unknown>): Promise<void>;
|
|
26
|
+
deleteUser(dn: string): Promise<void>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Client for LDAP Unit operations
|
|
3
|
+
*/
|
|
4
|
+
import type { Config, LdapUnit } from '../types';
|
|
5
|
+
export declare class UnitApiClient {
|
|
6
|
+
private baseUrl;
|
|
7
|
+
constructor(baseUrl: string);
|
|
8
|
+
getConfig(): Promise<Config>;
|
|
9
|
+
getOrganizations(): Promise<{
|
|
10
|
+
dn: string;
|
|
11
|
+
}>;
|
|
12
|
+
getUnit(dn: string): Promise<LdapUnit>;
|
|
13
|
+
updateUnit(dn: string, data: Partial<LdapUnit>): Promise<void>;
|
|
14
|
+
createEntry(dn: string, data: Record<string, unknown>): Promise<void>;
|
|
15
|
+
deleteEntry(dn: string): Promise<void>;
|
|
16
|
+
getPointerOptions(branch: string): Promise<Array<{
|
|
17
|
+
dn: string;
|
|
18
|
+
label: string;
|
|
19
|
+
}>>;
|
|
20
|
+
moveUnit(dn: string, targetOrgDn: string): Promise<{
|
|
21
|
+
success: boolean;
|
|
22
|
+
newDn?: string;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LDAP Unit Editor - Move Unit Modal Component
|
|
3
|
+
* Modal dialog for selecting target organization when moving a unit
|
|
4
|
+
*/
|
|
5
|
+
import type { UnitApiClient } from '../api/UnitApiClient';
|
|
6
|
+
export declare class MoveUnitModal {
|
|
7
|
+
private modal;
|
|
8
|
+
private api;
|
|
9
|
+
private currentOrgDn;
|
|
10
|
+
private selectedOrgDn;
|
|
11
|
+
private onMove;
|
|
12
|
+
private expandedNodes;
|
|
13
|
+
private rootDn;
|
|
14
|
+
constructor(api: UnitApiClient, currentOrgDn: string, onMove: (targetOrgDn: string) => void);
|
|
15
|
+
/**
|
|
16
|
+
* Escape HTML special characters to prevent XSS attacks
|
|
17
|
+
*/
|
|
18
|
+
private static escapeHtml;
|
|
19
|
+
show(): Promise<void>;
|
|
20
|
+
private attachHandlers;
|
|
21
|
+
private loadOrganizationTree;
|
|
22
|
+
private renderTree;
|
|
23
|
+
private renderNode;
|
|
24
|
+
private attachTreeHandlers;
|
|
25
|
+
private selectOrganization;
|
|
26
|
+
private handleMove;
|
|
27
|
+
close(): void;
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit Property Editor Component - Edits properties of a selected organizational unit
|
|
3
|
+
*/
|
|
4
|
+
import type { UnitApiClient } from '../api/UnitApiClient';
|
|
5
|
+
export declare class UnitPropertyEditor {
|
|
6
|
+
private container;
|
|
7
|
+
private api;
|
|
8
|
+
private unitDn;
|
|
9
|
+
private unit;
|
|
10
|
+
private schema;
|
|
11
|
+
private saveCallback;
|
|
12
|
+
private hasSubnodes;
|
|
13
|
+
constructor(container: HTMLElement, api: UnitApiClient, unitDn: string);
|
|
14
|
+
init(): Promise<void>;
|
|
15
|
+
private loadUnit;
|
|
16
|
+
private checkSubnodes;
|
|
17
|
+
private loadSchema;
|
|
18
|
+
onSave(callback: () => void): void;
|
|
19
|
+
private render;
|
|
20
|
+
private renderFields;
|
|
21
|
+
private renderField;
|
|
22
|
+
private getFieldLabel;
|
|
23
|
+
private attachEventListeners;
|
|
24
|
+
private handleSubmit;
|
|
25
|
+
private handleMove;
|
|
26
|
+
private handleDelete;
|
|
27
|
+
private escapeHtml;
|
|
28
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit Tree Component - Shows organizations tree (same as UserTree)
|
|
3
|
+
*/
|
|
4
|
+
export declare class UnitTree {
|
|
5
|
+
private container;
|
|
6
|
+
private apiBaseUrl;
|
|
7
|
+
private onOrgSelect;
|
|
8
|
+
private expandedNodes;
|
|
9
|
+
private selectedDn;
|
|
10
|
+
private rootDn;
|
|
11
|
+
constructor(container: HTMLElement, apiBaseUrl: string, onOrgSelect: (orgDn: string) => void);
|
|
12
|
+
init(): Promise<void>;
|
|
13
|
+
private handleCreateUnit;
|
|
14
|
+
private renderTree;
|
|
15
|
+
private renderNode;
|
|
16
|
+
private attachEventListeners;
|
|
17
|
+
private escapeHtml;
|
|
18
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript types for LDAP Unit Editor
|
|
3
|
+
*/
|
|
4
|
+
export interface UnitEditorOptions {
|
|
5
|
+
containerId: string;
|
|
6
|
+
apiBaseUrl?: string;
|
|
7
|
+
onUnitSaved?: (unitDn: string) => void;
|
|
8
|
+
onError?: (error: Error) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface Config {
|
|
11
|
+
ldapBase: string;
|
|
12
|
+
features?: {
|
|
13
|
+
flatResources?: ResourceConfig[];
|
|
14
|
+
ldapFlatGeneric?: {
|
|
15
|
+
flatResources?: ResourceConfig[];
|
|
16
|
+
};
|
|
17
|
+
ldapOrganizations?: {
|
|
18
|
+
schemaUrl?: string;
|
|
19
|
+
schema?: SchemaDefinition;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface ResourceConfig {
|
|
25
|
+
name: string;
|
|
26
|
+
pluralName?: string;
|
|
27
|
+
schemaUrl?: string;
|
|
28
|
+
schema?: SchemaDefinition;
|
|
29
|
+
base?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface SchemaDefinition {
|
|
32
|
+
entity: {
|
|
33
|
+
objectClass?: string[];
|
|
34
|
+
base?: string;
|
|
35
|
+
};
|
|
36
|
+
attributes: Record<string, SchemaAttribute>;
|
|
37
|
+
}
|
|
38
|
+
export interface SchemaAttribute {
|
|
39
|
+
type: 'string' | 'number' | 'integer' | 'array' | 'pointer';
|
|
40
|
+
required?: boolean;
|
|
41
|
+
fixed?: boolean;
|
|
42
|
+
default?: unknown;
|
|
43
|
+
branch?: string[];
|
|
44
|
+
items?: {
|
|
45
|
+
type: string;
|
|
46
|
+
branch?: string[];
|
|
47
|
+
};
|
|
48
|
+
group?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface LdapUnit {
|
|
51
|
+
dn: string;
|
|
52
|
+
ou: string;
|
|
53
|
+
description?: string;
|
|
54
|
+
[key: string]: unknown;
|
|
55
|
+
}
|