Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/js/ui/accessrights/v2/src/components/header/members/
Upload File :
Current File : /var/www/homesaver/www/bitrix/js/ui/accessrights/v2/src/components/header/members/selector.js

import { Type } from 'main.core';
import { Dialog, type Item, type ItemId } from 'ui.entity-selector';
import { EntitySelectorContext } from '../../../integration/entity-selector/dictionary';

export const Selector = {
	name: 'Selector',
	emits: ['close'],
	props: {
		userGroup: {
			/** @type UserGroup */
			type: Object,
			required: true,
		},
		bindNode: {
			type: HTMLElement,
			required: true,
		},
	},
	computed: {
		selectedItems(): ItemId[] {
			const result = [];
			for (const accessCode of this.userGroup.members.keys())
			{
				result.push(this.getItemIdByAccessCode(accessCode));
			}

			return result;
		},
	},
	mounted()
	{
		(new Dialog({
			enableSearch: true,
			context: EntitySelectorContext.MEMBER,
			alwaysShowLabels: true,
			entities: [
				{
					id: 'user',
					options: {
						intranetUsersOnly: true,
						emailUsers: false,
						inviteEmployeeLink: false,
						inviteGuestLink: false,
					},
				},
				{
					id: 'department',
					options: {
						selectMode: 'usersAndDepartments',
						allowSelectRootDepartment: true,
						allowFlatDepartments: true,
					},
				},
				{
					id: 'project',
					dynamicLoad: true,
					options: {
						addProjectMetaUsers: true,
					},
					itemOptions: {
						default: {
							link: '',
							linkTitle: '',
						},
					},
				},
				{
					id: 'site-groups',
					dynamicLoad: true,
					dynamicSearch: true,
				},
			],
			targetNode: this.bindNode,
			preselectedItems: this.selectedItems,
			cacheable: false,
			events: {
				'Item:onSelect': this.onMemberAdd,
				'Item:onDeselect': this.onMemberRemove,
				onHide: () => {
					this.$emit('close');
				},
			},
		})).show();
	},
	methods: {
		// eslint-disable-next-line sonarjs/cognitive-complexity
		getItemIdByAccessCode(accessCode: string): ItemId {
			if (/^I?U(\d+)$/.test(accessCode))
			{
				const match = accessCode.match(/^I?U(\d+)$/) || null;
				const userId = match ? match[1] : null;

				return ['user', userId];
			}

			if (/^DR(\d+)$/.test(accessCode))
			{
				const match = accessCode.match(/^DR(\d+)$/) || null;
				const departmentId = match ? match[1] : null;

				return ['department', departmentId];
			}

			if (/^D(\d+)$/.test(accessCode))
			{
				const match = accessCode.match(/^D(\d+)$/) || null;
				const departmentId = match ? match[1] : null;

				return ['department', `${departmentId}:F`];
			}

			if (/^G(\d+)$/.test(accessCode))
			{
				const match = accessCode.match(/^G(\d+)$/) || null;
				const groupId = match ? match[1] : null;

				return ['site-groups', groupId];
			}

			if (/^SG(\d+)_([AEK])$/.test(accessCode))
			{
				const match = accessCode.match(/^SG(\d+)_([AEK])$/) || null;

				const projectId = match ? match[1] : null;
				const postfix = match ? match[2] : null;

				return ['project', `${projectId}:${postfix}`];
			}

			return ['unknown', accessCode];
		},
		onMemberAdd(event: BaseEvent): void {
			const member = this.getMemberFromEvent(event);

			this.$store.dispatch('userGroups/addMember', {
				userGroupId: this.userGroup.id,
				accessCode: member.id,
				member,
			});
		},
		onMemberRemove(event: BaseEvent): void {
			const member = this.getMemberFromEvent(event);

			this.$store.dispatch('userGroups/removeMember', {
				userGroupId: this.userGroup.id,
				accessCode: member.id,
			});
		},
		getMemberFromEvent(event: BaseEvent): ?Member {
			const { item } = event.getData();

			return {
				id: this.getAccessCodeByItem(item),
				type: this.getMemberTypeByItem(item),
				name: item.title.text,
				avatar: Type.isStringFilled(item.avatar) ? item.avatar : null,
			};
		},
		// eslint-disable-next-line sonarjs/cognitive-complexity
		getAccessCodeByItem(item: Item): string {
			const entityId = item.entityId;

			if (entityId === 'user')
			{
				return `U${item.id}`;
			}

			if (entityId === 'department')
			{
				if (Type.isString(item.id) && item.id.endsWith(':F'))
				{
					const match = item.id.match(/^(\d+):F$/);
					const originalId = match ? match[1] : null;

					// only members of the department itself
					return `D${originalId}`;
				}

				// whole department recursively
				return `DR${item.id}`;
			}

			if (entityId === 'site-groups')
			{
				return `G${item.id}`;
			}

			if (entityId === 'project')
			{
				const subType = item.customData.get('metauser');
				const originalId = item.customData.get('projectId');
				if (subType === 'owner')
				{
					return `SG${originalId}_A`;
				}

				if (subType === 'moderator')
				{
					return `SG${originalId}_E`;
				}

				if (subType === 'all')
				{
					return `SG${originalId}_K`;
				}
			}

			return '';
		},
		getMemberTypeByItem(item: Item): string {
			switch (item.entityId)
			{
				case 'user':
					return 'users';
				case 'intranet':
				case 'department':
					return 'departments';
				case 'socnetgroup':
				case 'project':
					return 'sonetgroups';
				case 'group':
					return 'groups';
				case 'site-groups':
					return 'usergroups';
				default:
					return '';
			}
		},
	},
	// just a template stub
	template: '<div hidden></div>',
};