Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/ui/accessrights/v2/dist/ |
Upload File : |
/* eslint-disable */ this.BX = this.BX || {}; this.BX.UI = this.BX.UI || {}; this.BX.UI.AccessRights = this.BX.UI.AccessRights || {}; (function (exports,ui_dialogs_messagebox,ui_iconSet_api_vue,ui_buttons,ui_vue3_components_popup,ui_entitySelector,ui_vue3,ui_vue3_directives_hint,ui_vue3_components_switcher,main_popup,ui_ears,ui_hint,ui_vue3_components_richMenu,ui_notification,ui_analytics,ui_vue3_vuex,main_core_events,main_core) { 'use strict'; /** * @abstract */ class Base { /* * @abstract */ getComponentName() { throw new Error('not implemented'); } getEmptyValue(item) { var _item$emptyValue; return (_item$emptyValue = item.emptyValue) != null ? _item$emptyValue : new Set(); } getMinValue(item) { if (!main_core.Type.isNil(item.minValue)) { return item.minValue; } return null; } getMaxValue(item) { if (!main_core.Type.isNil(item.maxValue)) { return item.maxValue; } return null; } isRowValueConfigurable() { return true; } } class DependentVariables extends Base { getComponentName() { return 'DependentVariables'; } } class Multivariables extends Base { getComponentName() { return 'Multivariables'; } } class Toggler extends Base { getComponentName() { return 'Toggler'; } getEmptyValue(item) { const isFalsy = !item.emptyValue || !item.emptyValue[0]; if (isFalsy) { // use explicit '0' for correctly identify modifications return new Set(['0']); } return super.getEmptyValue(item); } getMinValue(item) { const explicit = super.getMinValue(item); if (!main_core.Type.isNull(explicit)) { return explicit; } return new Set(['0']); } getMaxValue(item) { const explicit = super.getMaxValue(item); if (!main_core.Type.isNull(explicit)) { return explicit; } return new Set(['1']); } isRowValueConfigurable() { return false; } } class Variables extends Base { getComponentName() { return 'Variables'; } } var _cache = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("cache"); class ServiceLocator { /** * `BX.UI.Hint.createInstance` takes up to 30% of CPU time when multiple hints are mounted on page * (e.g. on a load, search), probably because of `Manager.initByClassName` call in `new Manager`. * therefore, we share a Manager instance across all hints in the app */ static getHint(appGuid) { return babelHelpers.classPrivateFieldLooseBase(this, _cache)[_cache].remember(`hint-${appGuid}`, () => { return BX.UI.Hint.createInstance({ id: `ui-access-rights-v2-hint-${appGuid}`, popupParameters: { className: 'ui-access-rights-v2-popup-pointer-events ui-hint-popup', autoHide: true, darkMode: true, maxWidth: 280, offsetTop: 0, offsetLeft: 8, angle: true, animation: 'fading-slide' } }); }); } static getValueTypeByRight(right) { return this.getValueType(right.type); } static getValueType(type) { const stringType = String(type); return babelHelpers.classPrivateFieldLooseBase(this, _cache)[_cache].remember(stringType, () => { if (stringType === 'dependent_variables') { return new DependentVariables(); } if (stringType === 'multivariables') { return new Multivariables(); } if (stringType === 'toggler') { return new Toggler(); } if (stringType === 'variables') { return new Variables(); } console.warn('ui.accessrights.v2: Unknown access right type', type); return null; }); } } Object.defineProperty(ServiceLocator, _cache, { writable: true, value: new main_core.Cache.MemoryCache() }); const EntitySelectorContext = Object.freeze({ ROLE: 'ui.accessrights.v2~role-selector', MEMBER: 'ui.accessrights.v2~member-selector', VARIABLE: 'ui.accessrights.v2~variable-selector' }); const EntitySelectorEntities = Object.freeze({ ROLE: 'ui.accessrights.v2~role', VARIABLE: 'ui.accessrights.v2~variable' }); const Selector = { name: 'Selector', emits: ['close'], props: { userGroup: { /** @type UserGroup */ type: Object, required: true }, bindNode: { type: HTMLElement, required: true } }, computed: { selectedItems() { const result = []; for (const accessCode of this.userGroup.members.keys()) { result.push(this.getItemIdByAccessCode(accessCode)); } return result; }, ...ui_vue3_vuex.mapState({ options: state => state.application.options, addUserGroupsProviderTab: state => state.application.options.additionalMembersParams.addUserGroupsProviderTab, addProjectsProviderTab: state => state.application.options.additionalMembersParams.addProjectsProviderTab, addStructureTeamsProviderTab: state => state.application.options.additionalMembersParams.addStructureTeamsProviderTab }) }, mounted() { const entities = this.getEntities(); new ui_entitySelector.Dialog({ enableSearch: true, context: EntitySelectorContext.MEMBER, alwaysShowLabels: true, entities, 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) { 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 (accessCode.at(0) === 'A') { return ['user-groups', accessCode]; } if (/^SG(\d+)_([AEK])$/.test(accessCode)) { return ['project-access-codes', accessCode]; } if (/^SNT(\d+)$/.test(accessCode)) { const match = accessCode.match(/^SNT(\d+)$/) || null; const structureNodeId = match ? match[1] : null; return ['structure-node', `${structureNodeId}:F`]; } if (/^SNTR(\d+)$/.test(accessCode)) { const match = accessCode.match(/^SNTR(\d+)$/) || null; const structureNodeId = match ? match[1] : null; return ['structure-node', structureNodeId]; } return ['unknown', accessCode]; }, onMemberAdd(event) { const member = this.getMemberFromEvent(event); this.$store.dispatch('userGroups/addMember', { userGroupId: this.userGroup.id, accessCode: member.id, member }); }, onMemberRemove(event) { const member = this.getMemberFromEvent(event); this.$store.dispatch('userGroups/removeMember', { userGroupId: this.userGroup.id, accessCode: member.id }); }, getMemberFromEvent(event) { const { item } = event.getData(); return { id: this.getAccessCodeByItem(item), type: this.getMemberTypeByItem(item), name: item.title.text, avatar: main_core.Type.isStringFilled(item.avatar) ? item.avatar : null }; }, // eslint-disable-next-line sonarjs/cognitive-complexity getAccessCodeByItem(item) { const entityId = item.entityId; if (entityId === 'user') { return `U${item.id}`; } if (entityId === 'department') { if (main_core.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 === 'structure-node') { if (main_core.Type.isString(item.id) && item.id.endsWith(':F')) { const match = item.id.match(/^(\d+):F$/); const originalId = match ? match[1] : null; return `SNT${originalId}`; } return `SNTR${item.id}`; } if (entityId === 'site-groups') { return `G${item.id}`; } if (entityId === 'user-groups') { return item.id; } if (entityId === 'project-access-codes') { return item.id; } return ''; }, getMemberTypeByItem(item) { switch (item.entityId) { case 'user': return 'users'; case 'intranet': case 'department': return 'departments'; case 'socnetgroup': case 'project-access-codes': return 'sonetgroups'; case 'group': return 'groups'; case 'structure-node': return 'structureteams'; case 'site-groups': case 'user-groups': return 'usergroups'; default: return ''; } }, getEntities() { const entities = [{ id: 'user', options: { intranetUsersOnly: true, emailUsers: false, inviteEmployeeLink: false, inviteGuestLink: false } }, { id: 'department', options: { selectMode: 'usersAndDepartments', allowSelectRootDepartment: true, allowFlatDepartments: true } }, { id: 'site-groups', dynamicLoad: true, dynamicSearch: true }]; if (this.addStructureTeamsProviderTab) { entities.push({ id: 'structure-node', options: { selectMode: 'usersAndDepartments', allowSelectRootDepartment: true, allowFlatDepartments: true, includedNodeEntityTypes: ['team'], useMultipleTabs: true, visual: { avatarMode: 'node', tagStyle: 'none' } } }); } if (this.addProjectsProviderTab) { entities.push({ id: 'project-access-codes' }); } if (this.addUserGroupsProviderTab) { entities.push({ id: 'user-groups', dynamicLoad: true, options: {} }); } return entities; } }, // just a template stub template: '<div hidden></div>' }; const SingleMember = { name: 'SingleMember', props: { member: { /** @type Member */ type: Object, required: true } }, computed: { avatarBackgroundImage() { return `url(${encodeURI(this.member.avatar)})`; }, noAvatarClass() { if (this.member.type === 'groups') { return 'ui-icon-common-user-group'; } if (this.member.type === 'sonetgroups' || this.member.type === 'departments') { return 'ui-icon-common-company'; } if (this.member.type === 'usergroups') { return 'ui-icon-common-user-group'; } if (this.member.type === 'structureteams') { return 'ui-icon-common-my-plan'; } return 'ui-icon-common-user'; } }, template: ` <div class='ui-access-rights-v2-members-item'> <a v-if="member.avatar" class='ui-access-rights-v2-members-item-avatar' :title="member.name" :style="{ backgroundImage: avatarBackgroundImage, backgroundSize: 'cover', }"></a> <a v-else class='ui-icon ui-access-rights-v2-members-item-icon' :class="noAvatarClass" :title="member.name"> <i></i> </a> </div> ` }; const MAX_SHOWN_MEMBERS = 5; const Members = { name: 'Members', components: { SingleMember, Selector }, props: { userGroup: { /** @type UserGroup */ type: Object, required: true } }, data() { return { isSelectorShown: false, isSelectedMembersPopupShown: false }; }, popup: null, computed: { shownMembers() { if (this.userGroup.members.size <= MAX_SHOWN_MEMBERS) { return this.userGroup.members; } const shownKeyValuePairs = [...this.userGroup.members].slice(0, MAX_SHOWN_MEMBERS); return new Map(shownKeyValuePairs); }, notShownMembersCount() { if (this.userGroup.members.size > MAX_SHOWN_MEMBERS) { return this.userGroup.members.size - MAX_SHOWN_MEMBERS; } return 0; }, bindNode() { return this.$refs.container; } }, template: ` <div ref="container" class="ui-access-rights-v2-members-container" @click="isSelectorShown = true"> <div v-if="userGroup.members.size > 0" class='ui-access-rights-v2-members'> <SingleMember v-for="[accessCode, member] in shownMembers" :key="accessCode" :member="member"/> <span v-if="notShownMembersCount > 0" class="ui-access-rights-v2-members-more"> + {{ notShownMembersCount }} </span> </div> <div class='ui-access-rights-v2-members-item ui-access-rights-v2-members-item-add' :class="{ '--show-always': userGroup.members.size <= 0, '--has-siblings': userGroup.members.size > 0, }" > <div class="ui-icon-set --plus-30"></div> </div> <Selector v-if="isSelectorShown" :user-group="userGroup" :bind-node="bindNode" @close="isSelectorShown = false" /> </div> ` }; const RoleHeading = { name: 'RoleHeading', components: { RichMenuPopup: ui_vue3_components_richMenu.RichMenuPopup, RichMenuItem: ui_vue3_components_richMenu.RichMenuItem }, props: { userGroup: { /** @type UserGroup */ type: Object, required: true } }, data() { return { isEdit: false, isPopupShown: false }; }, computed: { RichMenuItemIcon: () => ui_vue3_components_richMenu.RichMenuItemIcon, ...ui_vue3_vuex.mapState({ isSaving: state => state.application.isSaving, guid: state => state.application.guid, maxVisibleUserGroups: state => state.application.options.maxVisibleUserGroups }), ...ui_vue3_vuex.mapGetters({ isMaxVisibleUserGroupsReached: 'userGroups/isMaxVisibleUserGroupsReached', isMaxValueSetForAny: 'accessRights/isMaxValueSetForAny', isMinValueSetForAny: 'accessRights/isMinValueSetForAny' }), title: { get() { return this.userGroup.title; }, set(title) { this.$store.dispatch('userGroups/setRoleTitle', { userGroupId: this.userGroup.id, title }); } } }, watch: { isEdit(newValue) { if (newValue === true) { this.bindClickedOutsideHandler(); void this.$nextTick(() => { this.$refs.input.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' }); this.$refs.input.focus(); this.$refs.input.select(); }); } else { this.unbindClickedOutsideHandler(); } } }, mounted() { // todo fix hide/show new role if (this.userGroup.isNew) { // start editing a newly created role right away this.isEdit = true; } }, beforeUnmount() { this.unbindClickedOutsideHandler(); }, methods: { bindClickedOutsideHandler() { main_core.Event.bind(window, 'click', this.turnOffEditWhenClickedOutside, { capture: true }); }, unbindClickedOutsideHandler() { main_core.Event.unbind(window, 'click', this.turnOffEditWhenClickedOutside, { capture: true }); }, turnOffEditWhenClickedOutside(event) { if (event.target !== this.$refs.input) { this.isEdit = false; } }, showDeleteConfirmation() { const popup = new main_popup.Popup({ bindElement: this.$refs.container, width: 250, overlay: true, contentPadding: 10, content: this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_POPUP_REMOVE_ROLE'), className: 'ui-access-rights-v2-text-center', animation: 'fading-slide', cacheable: false, buttons: [new ui_buttons.Button({ text: this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_POPUP_REMOVE_ROLE_YES'), size: ui_buttons.ButtonSize.SMALL, color: ui_buttons.ButtonColor.PRIMARY, events: { click: () => { popup.destroy(); this.$store.dispatch('userGroups/removeUserGroup', { userGroupId: this.userGroup.id }); } } }), new ui_buttons.CancelButton({ size: ui_buttons.ButtonSize.SMALL, events: { click: () => { popup.destroy(); } } })] }); popup.show(); }, showActionsMenu() { if (!this.isSaving) { this.isPopupShown = true; } }, onSetMaxValuesClick() { this.isPopupShown = false; this.$store.dispatch('userGroups/setMaxAccessRightValues', { userGroupId: this.userGroup.id }); }, onSetMinValuesClick() { this.isPopupShown = false; this.$store.dispatch('userGroups/setMinAccessRightValues', { userGroupId: this.userGroup.id }); }, onEnableEditClick() { this.isPopupShown = false; this.isEdit = true; }, onCopyRoleClick() { if (this.isMaxVisibleUserGroupsReached) { return; } this.isPopupShown = false; this.$store.dispatch('userGroups/copyUserGroup', { userGroupId: this.userGroup.id }); }, onDeleteRoleClick() { this.isPopupShown = false; this.showDeleteConfirmation(); } }, template: ` <div ref="container" class='ui-access-rights-v2-role'> <div class="ui-access-rights-v2-role-value-container"> <input v-if="isEdit && !isSaving" ref="input" type='text' class='ui-access-rights-v2-role-input' v-model="title" :placeholder="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLE_NAME')" @keydown.enter="isEdit = false" /> <div v-else class='ui-access-rights-v2-role-value' :title="title">{{ title }}</div> </div> <div ref="menu" class="ui-icon-set --more ui-access-rights-v2-icon-more" @click="showActionsMenu" > <RichMenuPopup v-if="isPopupShown" @close="isPopupShown = false" :popup-options="{bindElement: $refs.menu}"> <RichMenuItem v-if="isMaxValueSetForAny" :icon="RichMenuItemIcon.check" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SET_MAX_ACCESS_RIGHTS')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SET_MAX_ACCESS_RIGHTS_SUBTITLE')" @click="onSetMaxValuesClick" /> <RichMenuItem v-if="isMinValueSetForAny" :icon="RichMenuItemIcon['red-lock']" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SET_MIN_ACCESS_RIGHTS')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SET_MIN_ACCESS_RIGHTS_SUBTITLE')" @click="onSetMinValuesClick" /> <RichMenuItem :icon="RichMenuItemIcon.pencil" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_RENAME')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_RENAME_SUBTITLE')" @click="onEnableEditClick" /> <RichMenuItem :icon="RichMenuItemIcon.copy" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_COPY')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_COPY_ROLE_SUBTITLE')" :disabled="isMaxVisibleUserGroupsReached" :hint=" isMaxVisibleUserGroupsReached ? $Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLE_COPYING_DISABLED', { '#COUNT#': maxVisibleUserGroups, }) : null " @click="onCopyRoleClick" /> <RichMenuItem :icon="RichMenuItemIcon['trash-bin']" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_REMOVE')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_REMOVE_SUBTITLE')" @click="onDeleteRoleClick" /> </RichMenuPopup> </div> </div> ` }; class ItemsMapper { static mapUserGroups(userGroups) { const result = []; for (const userGroup of userGroups.values()) { result.push({ id: userGroup.id, entityId: EntitySelectorEntities.ROLE, title: userGroup.title, supertitle: main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLE'), avatar: '/bitrix/js/ui/accessrights/v2/images/role-avatar.svg', tabs: ['recents'] }); } return result; } static mapVariables(variables) { const items = []; for (const variable of variables.values()) { const item = main_core.Runtime.clone(variable); item.entityId = item.entityId || EntitySelectorEntities.VARIABLE; item.tabs = 'recents'; items.push(item); } return items; } } const CellLayout = { template: ` <div class='ui-access-rights-v2-column-item'> <slot/> </div> ` }; const ColumnLayout = { template: ` <div class='ui-access-rights-v2-column'> <slot/> </div> ` }; const RolesControl = { name: 'RolesControl', components: { CellLayout, ColumnLayout, RichMenuPopup: ui_vue3_components_richMenu.RichMenuPopup, RichMenuItem: ui_vue3_components_richMenu.RichMenuItem }, props: { userGroups: { type: Map, required: true } }, viewDialog: null, computed: { RichMenuItemIcon: () => ui_vue3_components_richMenu.RichMenuItemIcon, ...ui_vue3_vuex.mapState({ allUserGroups: state => state.userGroups.collection, maxVisibleUserGroups: state => state.application.options.maxVisibleUserGroups, guid: state => state.application.guid }), ...ui_vue3_vuex.mapGetters({ isMaxVisibleUserGroupsSet: 'application/isMaxVisibleUserGroupsSet', isMaxVisibleUserGroupsReached: 'userGroups/isMaxVisibleUserGroupsReached' }), shownGroupsCounter() { return this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLE_COUNTER', { '#VISIBLE_ROLES#': this.userGroups.size, '#ALL_ROLES#': this.allUserGroups.size, '#GREY_START#': '<span style="opacity: var(--ui-opacity-30)">', '#GREY_FINISH#': '</span>' }); }, copyDialogItems() { return ItemsMapper.mapUserGroups(this.allUserGroups); }, viewDialogItems() { const result = []; for (const copyDialogItem of this.copyDialogItems) { result.push({ ...copyDialogItem, selected: this.userGroups.has(copyDialogItem.id) }); } return result; } }, data() { return { isPopupShown: false }; }, methods: { onCreateNewRoleClick() { if (this.isMaxVisibleUserGroupsReached) { return; } this.isPopupShown = false; this.$store.dispatch('userGroups/addUserGroup'); }, onRoleViewClick() { this.isPopupShown = false; this.showViewDialog(this.$refs.configure); }, onCopyRoleClick() { if (this.isMaxVisibleUserGroupsReached) { return; } this.isPopupShown = false; this.showCopyDialog(); }, showCopyDialog() { const copyDialog = new ui_entitySelector.Dialog({ context: EntitySelectorContext.ROLE, targetNode: this.$refs.configure, multiple: false, dropdownMode: true, enableSearch: true, cacheable: false, items: this.copyDialogItems, events: { 'Item:onSelect': dialogEvent => { const { item } = dialogEvent.getData(); this.$store.dispatch('userGroups/copyUserGroup', { userGroupId: item.getId() }); } } }); copyDialog.show(); }, showViewDialog(target) { this.viewDialog = new ui_entitySelector.Dialog({ context: EntitySelectorContext.ROLE, footer: this.isMaxVisibleUserGroupsSet ? this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLE_SELECTOR_MAX_VISIBLE_WARNING', { '#COUNT#': this.maxVisibleUserGroups }) : null, targetNode: target, multiple: true, dropdownMode: true, enableSearch: true, cacheable: false, items: this.viewDialogItems, events: { 'Item:onBeforeSelect': dialogEvent => { if (this.isMaxVisibleUserGroupsSet && this.viewDialog.getSelectedItems().length >= this.maxVisibleUserGroups) { dialogEvent.preventDefault(); } }, 'Item:onSelect': dialogEvent => { const { item } = dialogEvent.getData(); this.$store.dispatch('userGroups/showUserGroup', { userGroupId: item.getId() }); }, 'Item:onDeselect': dialogEvent => { const { item } = dialogEvent.getData(); this.$store.dispatch('userGroups/hideUserGroup', { userGroupId: item.getId() }); }, onHide: () => { this.viewDialog = null; } } }); this.viewDialog.show(); }, toggleViewDialog(target) { if (this.viewDialog) { this.viewDialog.hide(); } else { this.showViewDialog(target); } } }, template: ` <ColumnLayout> <CellLayout class="ui-access-rights-v2-header-roles-control"> <div class='ui-access-rights-v2-column-item-text ui-access-rights-v2-header-roles-control-header'> <div>{{ $Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLES') }}</div> <div ref="configure" class="ui-icon-set --more ui-access-rights-v2-icon-more" @click="isPopupShown = true" > <RichMenuPopup v-if="isPopupShown" @close="isPopupShown = false" :popup-options="{bindElement: $refs.configure}"> <RichMenuItem :icon="RichMenuItemIcon.role" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_NEW_ROLE')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_NEW_ROLE_SUBTITLE')" :disabled="isMaxVisibleUserGroupsReached" :hint=" isMaxVisibleUserGroupsReached ? $Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLE_ADDING_DISABLED', { '#COUNT#': maxVisibleUserGroups, }) : null " @click="onCreateNewRoleClick" /> <RichMenuItem :icon="RichMenuItemIcon.copy" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_COPY_ROLE')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_COPY_ROLE_SUBTITLE')" :disabled="isMaxVisibleUserGroupsReached" :hint=" isMaxVisibleUserGroupsReached ? $Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLE_COPYING_DISABLED', { '#COUNT#': maxVisibleUserGroups, }) : null " @click="onCopyRoleClick" /> <RichMenuItem :icon="RichMenuItemIcon['opened-eye']" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLE_VIEW')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLE_VIEW_SUBTITLE_MSGVER_1')" @click="onRoleViewClick" /> </RichMenuPopup> </div> </div> <div class="ui-access-rights-v2-header-roles-control-actions"> <div ref="counter" class="ui-access-rights-v2-header-roles-control-counter" @click="toggleViewDialog($refs.counter)" > <div class="ui-icon-set --opened-eye" style="--ui-icon-set__icon-size: 15px;"></div> <span v-html="shownGroupsCounter"></span> <div class="ui-icon-set --chevron-down ui-access-rights-v2-header-roles-control-chevron"></div> </div> <div class="ui-access-rights-v2-header-roles-control-expander"> <div class="ui-icon-set --collapse" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_COLLAPSE_ALL_SECTIONS')" @click="$store.dispatch('accessRights/collapseAllSections')" ></div> <div class="ui-icon-set --expand-1" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_EXPAND_ALL_SECTIONS')" @click="$store.dispatch('accessRights/expandAllSections')" ></div> </div> </div> </CellLayout> </ColumnLayout> ` }; const isMaxListenersSet = new Map(); const lastScrollLeft = new Map(); /** * A div without styling that synchronizes horizontal scroll of all elements wrapped in this component with other * wrapped elements in this Vue application. */ const SyncHorizontalScroll = { name: 'SyncHorizontalScroll', data() { return { componentGuid: main_core.Text.getRandom(16) }; }, computed: { ...ui_vue3_vuex.mapState({ guid: state => state.application.guid }) }, throttledEmitScrollEvent: null, created() { this.throttledEmitScrollEvent = requestAnimationFrameThrottle(this.emitScrollEvent); }, mounted() { if (!isMaxListenersSet.has(this.guid)) { // + 1 for header const sectionsNumber = this.$store.state.accessRights.collection.size + 1; // correctly notify about memory leak this.$Bitrix.eventEmitter.incrementMaxListeners('ui:accessrights:v2:syncScroll', sectionsNumber); isMaxListenersSet.set(this.guid, true); } this.$Bitrix.eventEmitter.subscribe('ui:accessrights:v2:syncScroll', this.handleScrollEvent); void this.$nextTick(() => { if (lastScrollLeft.has(this.guid)) { this.syncScroll(lastScrollLeft.get(this.guid)); } }); }, beforeUnmount() { this.$Bitrix.eventEmitter.unsubscribe('ui:accessrights:v2:syncScroll', this.handleScrollEvent); }, methods: { emitScrollEvent(event) { // this component instance is being scrolled, we need to notify other instances const { scrollLeft } = event.target; lastScrollLeft.set(this.guid, scrollLeft); // emit global application event so other SyncHorizontalScroll instances receive it this.$Bitrix.eventEmitter.emit('ui:accessrights:v2:syncScroll', { scrollLeft, componentGuid: this.componentGuid }); }, handleScrollEvent(event) { const { scrollLeft, componentGuid } = event.getData(); if (this.componentGuid === componentGuid) { // this event was sent by this exact instance return; } this.syncScroll(scrollLeft); }, syncScroll(scrollLeft) { // magic hack - don't update the element if value not changed. // I'm not sure whether this works, but why not if (this.$el.scrollLeft !== scrollLeft) { this.$el.scrollLeft = scrollLeft; } } }, template: ` <div @scroll="throttledEmitScrollEvent"> <slot/> </div> ` }; /** * Same as `Runtime.throttle`, but uses `requestAnimationFrame` instead of setTimeout. * Why? To sync wait time with display refresh rate for smother animations. */ function requestAnimationFrameThrottle(func) { let callbackSet = false; let invoke = false; return function wrapper(...args) { invoke = true; if (!callbackSet) { const q = function q() { if (invoke) { func(...args); invoke = false; requestAnimationFrame(q); callbackSet = true; } else { callbackSet = false; } }; q(); } }; } /** * A special case of Section */ // @vue/component const Header = { name: 'Header', components: { RoleHeading, SyncHorizontalScroll, Members, RolesControl, ColumnLayout, CellLayout }, directives: { hint: ui_vue3_directives_hint.hint }, props: { userGroups: { type: Map, required: true } }, computed: { ...ui_vue3_vuex.mapState({ maxVisibleUserGroups: state => state.application.options.maxVisibleUserGroups }), ...ui_vue3_vuex.mapGetters({ isMaxVisibleUserGroupsReached: 'userGroups/isMaxVisibleUserGroupsReached' }) }, methods: { onCreateNewRoleClick() { if (this.isMaxVisibleUserGroupsReached) { return; } this.$store.dispatch('userGroups/addUserGroup'); } }, // data attributes are needed for e2e automated tests template: ` <div class="ui-access-rights-v2-section ui-access-rights-v2--head-section"> <div class='ui-access-rights-v2-section-container'> <div class='ui-access-rights-v2-section-head'> <RolesControl :user-groups="userGroups"/> </div> <div class='ui-access-rights-v2-section-content'> <SyncHorizontalScroll class='ui-access-rights-v2-section-wrapper'> <ColumnLayout v-for="[groupId, group] in userGroups" :key="groupId" :data-accessrights-user-group-id="groupId" > <CellLayout class="ui-access-rights-v2-header-role-cell"> <RoleHeading :user-group="group"/> <Members :user-group="group"/> </CellLayout> </ColumnLayout> <ColumnLayout> <div class="ui-access-rights-v2-header-role-add"> <button class="ui-btn ui-btn-light-border ui-btn-round ui-btn-disabled" v-if="isMaxVisibleUserGroupsReached" v-hint="$Bitrix.Loc.getMessage( 'JS_UI_ACCESSRIGHTS_V2_ROLE_ADDING_DISABLED', {'#COUNT#': maxVisibleUserGroups,})" > <div class="ui-icon-set --plus-20"/> </button> <button class="ui-btn ui-btn-light-border ui-btn-round" v-else @click="onCreateNewRoleClick" > <div class="ui-icon-set --plus-20"/> </button> </div> </ColumnLayout> </SyncHorizontalScroll> </div> </div> </div> ` }; const SearchBox = { name: 'SearchBox', debouncedSetSearchQuery: null, created() { const setSearchQuery = query => { this.$store.dispatch('accessRights/search', { query }); }; this.debouncedSetSearchQuery = main_core.Runtime.debounce(setSearchQuery, 200); }, computed: { searchQuery: { get() { return this.$store.state.accessRights.searchQuery; }, set(query) { this.debouncedSetSearchQuery(query); } } }, template: ` <div class="ui-ctl ui-ctl-after-icon ui-ctl-w100 ui-access-rights-v2-search"> <input type="text" class="ui-ctl-element ui-ctl-textbox ui-access-rights-v2-search-input" :placeholder="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SEARCH_PLACEHOLDER')" v-model="searchQuery" > <a class="ui-ctl-after ui-ctl-icon-search ui-access-rights-v2-search-icon"></a> </div> ` }; function shouldRowBeRendered(accessRightItem) { if (!accessRightItem.isShown) { return false; } return !accessRightItem.group || accessRightItem.isGroupExpanded; } function getSelectedVariables(variables, selected, isAllSelected) { if (isAllSelected) { return variables; } const selectedVariables = new Map(); for (const [variableId, variable] of variables) { if (selected.has(variableId)) { selectedVariables.set(variableId, variable); } } return selectedVariables; } function getMultipleSelectedVariablesTitle(selectedVariables) { const lastVariable = [...selectedVariables.values()].pop(); if (selectedVariables.size === 1) { return lastVariable.title; } return main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_HAS_SELECTED_ITEMS', { '#FIRST_ITEM_NAME#': cutLongTitle(lastVariable.title), '#COUNT_REST_ITEMS#': selectedVariables.size - 1 }); } function cutLongTitle(title) { const VARIABLE_TITLE_MAX_LENGTH = 15; if (title.length > VARIABLE_TITLE_MAX_LENGTH) { return `${title.slice(0, VARIABLE_TITLE_MAX_LENGTH)}...`; } return title; } function getMultipleSelectedVariablesHintHtml(selectedVariables, hintTitle, allVariables) { if (selectedVariables.size < 2) { return ''; } let listItems = ''; for (const value of makeSortedVariablesArray(selectedVariables, allVariables)) { listItems += `<li>${main_core.Text.encode(value.title)}</li>`; } return ` <p>${main_core.Text.encode(hintTitle)}</p> <ul>${listItems}</ul> `; } function makeSortedVariablesArray(toSort, example) { const orderMap = new Map(); let index = 0; for (const [variableId] of example) { orderMap.set(variableId, index); index++; } return [...toSort.values()].sort((a, b) => { const indexA = orderMap.get(a.id); const indexB = orderMap.get(b.id); if (main_core.Type.isNil(indexA)) { return 1; } if (main_core.Type.isNil(indexB)) { return -1; } return indexA - indexB; }); } const DEFAULT_ALIAS_SEPARATOR = '|'; function parseAliasKey(key, separator = DEFAULT_ALIAS_SEPARATOR) { const parts = key.split(separator); return new Set(parts); } function compileAliasKey(parts, separator = DEFAULT_ALIAS_SEPARATOR) { const sortedParts = [...parts].sort(); return sortedParts.join(separator); } function normalizeAliasKey(key, separator = DEFAULT_ALIAS_SEPARATOR) { const parsed = parseAliasKey(key, separator); return compileAliasKey(parsed, separator); } var _internalizeExternalSection = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("internalizeExternalSection"); var _internalizeExternalIcon = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("internalizeExternalIcon"); var _internalizeExternalSectionAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("internalizeExternalSectionAction"); var _internalizeSelectedVariablesAliases = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("internalizeSelectedVariablesAliases"); var _internalizeValueSet = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("internalizeValueSet"); var _internalizeSetEmptyOnSetMinMaxValueInColumn = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("internalizeSetEmptyOnSetMinMaxValueInColumn"); var _internalizeExternalVariable = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("internalizeExternalVariable"); class AccessRightsInternalizer { constructor() { Object.defineProperty(this, _internalizeExternalVariable, { value: _internalizeExternalVariable2 }); Object.defineProperty(this, _internalizeSetEmptyOnSetMinMaxValueInColumn, { value: _internalizeSetEmptyOnSetMinMaxValueInColumn2 }); Object.defineProperty(this, _internalizeValueSet, { value: _internalizeValueSet2 }); Object.defineProperty(this, _internalizeSelectedVariablesAliases, { value: _internalizeSelectedVariablesAliases2 }); Object.defineProperty(this, _internalizeExternalSectionAction, { value: _internalizeExternalSectionAction2 }); Object.defineProperty(this, _internalizeExternalIcon, { value: _internalizeExternalIcon2 }); Object.defineProperty(this, _internalizeExternalSection, { value: _internalizeExternalSection2 }); } transform(externalSource) { const result = new Map(); for (const external of externalSource) { const internalized = babelHelpers.classPrivateFieldLooseBase(this, _internalizeExternalSection)[_internalizeExternalSection](external); result.set(internalized.sectionCode, internalized); } return result; } internalizeExternalItem(externalItem) { const [aliases, separator] = babelHelpers.classPrivateFieldLooseBase(this, _internalizeSelectedVariablesAliases)[_internalizeSelectedVariablesAliases](externalItem.selectedVariablesAliases); const normalizedItem = { id: String(externalItem.id), type: String(externalItem.type), title: String(externalItem.title), subtitle: main_core.Type.isStringFilled(externalItem.subtitle) ? externalItem.subtitle : null, hint: main_core.Type.isStringFilled(externalItem.hint) ? externalItem.hint : null, group: main_core.Type.isNil(externalItem.group) ? null : String(externalItem.group), groupHead: main_core.Type.isBoolean(externalItem.groupHead) ? externalItem.groupHead : false, isShown: true, minValue: babelHelpers.classPrivateFieldLooseBase(this, _internalizeValueSet)[_internalizeValueSet](externalItem.minValue), maxValue: babelHelpers.classPrivateFieldLooseBase(this, _internalizeValueSet)[_internalizeValueSet](externalItem.maxValue), defaultValue: babelHelpers.classPrivateFieldLooseBase(this, _internalizeValueSet)[_internalizeValueSet](externalItem.defaultValue), emptyValue: babelHelpers.classPrivateFieldLooseBase(this, _internalizeValueSet)[_internalizeValueSet](externalItem.emptyValue), nothingSelectedValue: babelHelpers.classPrivateFieldLooseBase(this, _internalizeValueSet)[_internalizeValueSet](externalItem.nothingSelectedValue), setEmptyOnSetMinMaxValueInColumn: babelHelpers.classPrivateFieldLooseBase(this, _internalizeSetEmptyOnSetMinMaxValueInColumn)[_internalizeSetEmptyOnSetMinMaxValueInColumn](externalItem), variables: main_core.Type.isArray(externalItem.variables) || main_core.Type.isMap(externalItem.variables) ? new Map() : null, allSelectedCode: main_core.Type.isStringFilled(externalItem.allSelectedCode) ? externalItem.allSelectedCode : null, selectedVariablesAliases: aliases, selectedVariablesAliasesSeparator: separator, enableSearch: main_core.Type.isBoolean(externalItem.enableSearch) ? externalItem.enableSearch : null, showAvatars: main_core.Type.isBoolean(externalItem.showAvatars) ? externalItem.showAvatars : null, compactView: main_core.Type.isBoolean(externalItem.compactView) ? externalItem.compactView : null, hintTitle: main_core.Type.isStringFilled(externalItem.hintTitle) ? externalItem.hintTitle : null, dependentVariablesPopupHint: main_core.Type.isStringFilled(externalItem.dependentVariablesPopupHint) ? externalItem.dependentVariablesPopupHint : null, iconClass: main_core.Type.isStringFilled(externalItem.iconClass) ? externalItem.iconClass : null, isClickable: main_core.Type.isBoolean(externalItem.isClickable) ? externalItem.isClickable : false, isDeletable: main_core.Type.isBoolean(externalItem.isDeletable) ? externalItem.isDeletable : false, isNew: main_core.Type.isBoolean(externalItem.isNew) ? externalItem.isNew : false, isModified: main_core.Type.isBoolean(externalItem.isModified) ? externalItem.isModified : false }; if (normalizedItem.groupHead || normalizedItem.group) { normalizedItem.isGroupExpanded = false; } if (main_core.Type.isArray(externalItem.variables)) { for (const variable of externalItem.variables) { const normalizedVariable = babelHelpers.classPrivateFieldLooseBase(this, _internalizeExternalVariable)[_internalizeExternalVariable](variable); normalizedItem.variables.set(normalizedVariable.id, normalizedVariable); } } else if (main_core.Type.isMap(externalItem.variables)) { for (const variable of externalItem.variables.values()) { const normalizedVariable = babelHelpers.classPrivateFieldLooseBase(this, _internalizeExternalVariable)[_internalizeExternalVariable](variable); normalizedItem.variables.set(normalizedVariable.id, normalizedVariable); } } return normalizedItem; } } function _internalizeExternalSection2(externalSection) { const internalizedSection = { sectionCode: main_core.Type.isStringFilled(externalSection.sectionCode) ? externalSection.sectionCode : main_core.Text.getRandom(), sectionTitle: String(externalSection.sectionTitle), sectionSubTitle: main_core.Type.isStringFilled(externalSection.sectionSubTitle) ? externalSection.sectionSubTitle : null, sectionHint: main_core.Type.isStringFilled(externalSection.sectionHint) ? externalSection.sectionHint : null, sectionIcon: babelHelpers.classPrivateFieldLooseBase(this, _internalizeExternalIcon)[_internalizeExternalIcon](externalSection.sectionIcon), rights: new Map(), isExpanded: true, isShown: true, action: babelHelpers.classPrivateFieldLooseBase(this, _internalizeExternalSectionAction)[_internalizeExternalSectionAction](externalSection.action) }; for (const externalItem of externalSection.rights) { const internalizedItem = this.internalizeExternalItem(externalItem); internalizedSection.rights.set(internalizedItem.id, internalizedItem); } return internalizedSection; } function _internalizeExternalIcon2(externalIcon) { if (main_core.Type.isStringFilled(externalIcon == null ? void 0 : externalIcon.type) && main_core.Type.isStringFilled(externalIcon == null ? void 0 : externalIcon.bgColor)) { return { type: externalIcon.type, bgColor: externalIcon.bgColor }; } return null; } function _internalizeExternalSectionAction2(externalSectionAction) { if (main_core.Type.isStringFilled(externalSectionAction == null ? void 0 : externalSectionAction.buttonText)) { return { buttonText: externalSectionAction.buttonText }; } return null; } function _internalizeSelectedVariablesAliases2(externalAliases) { if (!main_core.Type.isPlainObject(externalAliases)) { return [new Map(), DEFAULT_ALIAS_SEPARATOR]; } const separator = main_core.Type.isString(externalAliases.separator) ? externalAliases.separator : DEFAULT_ALIAS_SEPARATOR; const result = new Map(); for (const [key, value] of Object.entries(externalAliases)) { if (key === 'separator') { continue; } result.set(normalizeAliasKey(key, separator), String(value)); } return [result, separator]; } function _internalizeValueSet2(value) { if (main_core.Type.isNil(value)) { return null; } if (main_core.Type.isArray(value)) { return new Set(value.map(item => String(item))); } if (main_core.Type.isSet(value)) { return new Set(Array.from(value, item => String(item))); } return new Set([String(value)]); } function _internalizeSetEmptyOnSetMinMaxValueInColumn2(externalItem) { const boolOrNull = x => main_core.Type.isBoolean(x) ? x : null; if (!main_core.Type.isUndefined(externalItem.setEmptyOnSetMinMaxValueInColumn)) { return boolOrNull(externalItem.setEmptyOnSetMinMaxValueInColumn); } // todo compatibility, can be removed when crm update is out return boolOrNull(externalItem.setEmptyOnGroupActions); } function _internalizeExternalVariable2(externalVariable) { return { id: String(externalVariable.id), title: String(externalVariable.title), entityId: main_core.Type.isStringFilled(externalVariable.entityId) ? externalVariable.entityId : null, supertitle: main_core.Type.isStringFilled(externalVariable.supertitle) ? externalVariable.supertitle : null, avatar: main_core.Type.isStringFilled(externalVariable.avatar) ? externalVariable.avatar : null, avatarOptions: main_core.Type.isPlainObject(externalVariable.avatarOptions) ? externalVariable.avatarOptions : null, conflictsWith: main_core.Type.isArray(externalVariable.conflictsWith) ? new Set(externalVariable.conflictsWith.map(x => String(x))) : null, requires: main_core.Type.isArray(externalVariable.requires) ? new Set(externalVariable.requires.map(x => String(x))) : null, secondary: main_core.Type.isBoolean(externalVariable.secondary) ? externalVariable.secondary : null, hint: main_core.Type.isStringFilled(externalVariable.hint) ? externalVariable.hint : null }; } var _initialRights = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("initialRights"); var _searchAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("searchAction"); class AccessRightsModel extends ui_vue3_vuex.BuilderModel { constructor(...args) { super(...args); Object.defineProperty(this, _searchAction, { value: _searchAction2 }); Object.defineProperty(this, _initialRights, { writable: true, value: new Map() }); } getName() { return 'accessRights'; } setInitialAccessRights(rights) { babelHelpers.classPrivateFieldLooseBase(this, _initialRights)[_initialRights] = rights; return this; } getState() { return { collection: main_core.Runtime.clone(babelHelpers.classPrivateFieldLooseBase(this, _initialRights)[_initialRights]), searchQuery: '', deleted: new Set() }; } getElementState(params = {}) { throw new Error('Cant create AccessRightSection. You are doing something wrong'); } // eslint-disable-next-line max-lines-per-function getGetters() { return { shown: state => { const result = new Map(); for (const [sectionCode, section] of state.collection) { if (section.isShown) { result.set(sectionCode, section); } } return result; }, isMinValueSetForAny: (state, getters) => { for (const section of state.collection.values()) { for (const item of section.rights.values()) { const isSet = getters.isMinValueSet(section.sectionCode, item.id); if (isSet) { return true; } } } return false; }, isMinValueSet: state => (sectionCode, rightId) => { var _state$collection$get; const item = (_state$collection$get = state.collection.get(sectionCode)) == null ? void 0 : _state$collection$get.rights.get(rightId); if (!item) { console.warn('ui.accessrights.v2: attempt to check if min value set for unknown right', { sectionCode, rightId }); return false; } return !main_core.Type.isNil(item.minValue); }, isMaxValueSetForAny: (state, getters) => { for (const section of state.collection.values()) { for (const item of section.rights.values()) { const isSet = getters.isMaxValueSet(section.sectionCode, item.id); if (isSet) { return true; } } } return false; }, isMaxValueSet: state => (sectionCode, rightId) => { var _state$collection$get2; const item = (_state$collection$get2 = state.collection.get(sectionCode)) == null ? void 0 : _state$collection$get2.rights.get(rightId); if (!item) { console.warn('ui.accessrights.v2: attempt to check if max value set for unknown right', { sectionCode, rightId }); return false; } return !main_core.Type.isNil(item.maxValue); }, getEmptyValue: state => (sectionCode, valueId) => { var _state$collection$get3, _ServiceLocator$getVa, _ServiceLocator$getVa2; const item = (_state$collection$get3 = state.collection.get(sectionCode)) == null ? void 0 : _state$collection$get3.rights.get(valueId); if (!item) { return new Set(); } return (_ServiceLocator$getVa = (_ServiceLocator$getVa2 = ServiceLocator.getValueTypeByRight(item)) == null ? void 0 : _ServiceLocator$getVa2.getEmptyValue(item)) != null ? _ServiceLocator$getVa : new Set(); }, getNothingSelectedValue: (state, getters) => (sectionCode, valueId) => { var _state$collection$get4, _item$nothingSelected; const item = (_state$collection$get4 = state.collection.get(sectionCode)) == null ? void 0 : _state$collection$get4.rights.get(valueId); return (_item$nothingSelected = item == null ? void 0 : item.nothingSelectedValue) != null ? _item$nothingSelected : getters.getEmptyValue(sectionCode, valueId); }, getSelectedVariablesAlias: state => (sectionCode, valueId, values) => { var _state$collection$get5; const item = (_state$collection$get5 = state.collection.get(sectionCode)) == null ? void 0 : _state$collection$get5.rights.get(valueId); if (!item) { return null; } const key = compileAliasKey(values, item.selectedVariablesAliasesSeparator); return item.selectedVariablesAliases.get(key); }, isModified: state => { if (state.deleted.size > 0) { return true; } for (const section of state.collection.values()) { for (const rightItem of section.rights.values()) { if (rightItem.isNew || rightItem.isModified) { return true; } } } return false; } }; } getActions() { return { toggleSection: (store, { sectionCode }) => { if (!store.state.collection.has(sectionCode)) { console.warn('ui.accessrights.v2: Attempt to toggle section that dont exists', { sectionCode }); return; } store.commit('toggleSection', { sectionCode }); }, expandAllSections: store => { for (const sectionCode of store.state.collection.keys()) { store.commit('expandSection', { sectionCode }); } }, collapseAllSections: store => { for (const sectionCode of store.state.collection.keys()) { store.commit('collapseSection', { sectionCode }); } }, toggleGroup: (store, { sectionCode, groupId }) => { var _store$state$collecti; const item = (_store$state$collecti = store.state.collection.get(sectionCode)) == null ? void 0 : _store$state$collecti.rights.get(groupId); if (!item) { console.warn('ui.accessrights.v2: Attempt to toggle group that dont exists', { groupId }); return; } if (!item.groupHead) { console.warn('ui.accessrights.v2: Attempt to toggle group that is not group head', { groupId }); return; } store.commit('toggleGroup', { sectionCode, groupId }); }, search: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _searchAction)[_searchAction](store, payload); }, addRight: (store, { sectionCode, right }) => { if (!store.state.collection.has(sectionCode)) { console.warn('ui.accessrights.v2: Adding right to section that doesn`t exists', { sectionCode }); return; } const section = store.state.collection.get(sectionCode); if (section) { const internalRight = new AccessRightsInternalizer().internalizeExternalItem(right); store.commit('expandSection', { sectionCode }); store.commit('addRight', { sectionCode, right: internalRight }); } }, updateRightTitle: (store, { sectionCode, rightId, rightTitle }) => { if (!store.state.collection.has(sectionCode)) { console.warn('ui.accessrights.v2: Updating right in section that doesn`t exists', { sectionCode }); return; } const section = store.state.collection.get(sectionCode); if (!section.rights.has(rightId)) { console.warn('ui.accessrights.v2: Updating right that doesn`t exists', { rightId }); return; } store.commit('expandSection', { sectionCode }); store.commit('setRightTitle', { sectionCode, rightId, title: rightTitle }); }, updateRightSubtitle: (store, { sectionCode, rightId, rightSubtitle }) => { if (!store.state.collection.has(sectionCode)) { console.warn('ui.accessrights.v2: Updating right in section that doesn`t exists', { sectionCode }); return; } const section = store.state.collection.get(sectionCode); if (!section.rights.has(rightId)) { console.warn('ui.accessrights.v2: Updating right that doesn`t exists', { rightId }); return; } store.commit('expandSection', { sectionCode }); store.commit('setRightSubtitle', { sectionCode, rightId, subtitle: rightSubtitle }); }, deleteRight: (store, { sectionCode, rightId }) => { if (!store.state.collection.has(sectionCode)) { console.warn('ui.accessrights.v2: Deleting right in section that doesn`t exists', { sectionCode }); return; } const section = store.state.collection.get(sectionCode); if (!section.rights.has(rightId)) { console.warn('ui.accessrights.v2: Deleting right that doesn`t exists', { rightId }); return; } store.commit('expandSection', { sectionCode }); store.commit('deleteRight', { sectionCode, rightId }); }, markRightAsModified: (store, { sectionCode, rightId, isModified }) => { if (!store.state.collection.has(sectionCode)) { console.warn('ui.accessrights.v2: Updating right in section that doesn`t exists', { sectionCode }); return; } const section = store.state.collection.get(sectionCode); if (!section.rights.has(rightId)) { console.warn('ui.accessrights.v2: Updating right that doesn`t exists', { rightId }); return; } store.commit('expandSection', { sectionCode }); store.commit('markRightAsModified', { sectionCode, rightId, isModified }); } }; } // eslint-disable-next-line max-lines-per-function getMutations() { return { addRight: (state, { sectionCode, right }) => { const section = state.collection.get(sectionCode); section.rights.set(right.id, right); }, setRightTitle: (state, { sectionCode, rightId, title }) => { const section = state.collection.get(sectionCode); section.rights.get(rightId).title = title; }, setRightSubtitle: (state, { sectionCode, rightId, subtitle }) => { const section = state.collection.get(sectionCode); section.rights.get(rightId).subtitle = subtitle; }, deleteRight: (state, { sectionCode, rightId }) => { const section = state.collection.get(sectionCode); section.rights.delete(rightId); state.deleted.add(rightId); }, markRightAsModified: (state, { sectionCode, rightId, isModified }) => { const section = state.collection.get(sectionCode); section.rights.get(rightId).isModified = isModified; }, toggleSection: (state, { sectionCode }) => { const section = state.collection.get(sectionCode); section.isExpanded = !section.isExpanded; }, expandSection: (state, { sectionCode }) => { const section = state.collection.get(sectionCode); section.isExpanded = true; }, collapseSection: (state, { sectionCode }) => { const section = state.collection.get(sectionCode); section.isExpanded = false; }, toggleGroup: (state, { sectionCode, groupId }) => { const section = state.collection.get(sectionCode); for (const item of section.rights.values()) { if (item.id === groupId && item.groupHead || item.group === groupId) { item.isGroupExpanded = !item.isGroupExpanded; } } }, expandGroup: (state, { sectionCode, groupId }) => { const section = state.collection.get(sectionCode); section.isExpanded = true; for (const item of section.rights.values()) { if (item.id === groupId && item.groupHead || item.group === groupId) { item.isGroupExpanded = true; } } }, showItem: (state, { sectionCode, itemId }) => { const section = state.collection.get(sectionCode); section.isShown = true; const item = section.rights.get(itemId); item.isShown = true; if (item.group) { section.rights.get(item.group).isShown = true; } }, showGroup: (state, { sectionCode, groupId }) => { const section = state.collection.get(sectionCode); section.isShown = true; for (const item of section.rights.values()) { if (item.id === groupId && item.groupHead || item.group === groupId) { item.isShown = true; } } }, showSection: (state, { sectionCode }) => { const section = state.collection.get(sectionCode); section.isShown = true; for (const item of section.rights.values()) { item.isShown = true; } }, showAll: state => { for (const section of state.collection.values()) { section.isShown = true; for (const item of section.rights.values()) { item.isShown = true; } } }, hideAll: state => { for (const section of state.collection.values()) { section.isShown = false; for (const item of section.rights.values()) { item.isShown = false; } } }, setSearchQuery: (state, { query }) => { // eslint-disable-next-line no-param-reassign state.searchQuery = String(query); } }; } } function _searchAction2(store, { query }) { if (!main_core.Type.isString(query)) { console.warn('ui.accessrights.v2: attempt to search with non-string search query'); return; } store.commit('setSearchQuery', { query }); if (query === '') { store.commit('showAll'); return; } store.commit('hideAll'); const lowerQuery = query.toLowerCase(); for (const section of store.state.collection.values()) { var _section$sectionSubTi; if (section.sectionTitle.toLowerCase().includes(lowerQuery) || (_section$sectionSubTi = section.sectionSubTitle) != null && _section$sectionSubTi.toLowerCase().includes(lowerQuery)) { store.commit('showSection', { sectionCode: section.sectionCode }); continue; } for (const item of section.rights.values()) { if (!item.title.toLowerCase().includes(lowerQuery)) { continue; } if (item.groupHead) { store.commit('showGroup', { sectionCode: section.sectionCode, groupId: item.id }); } else { store.commit('showItem', { sectionCode: section.sectionCode, itemId: item.id }); if (item.group) { store.commit('expandGroup', { sectionCode: section.sectionCode, groupId: item.group }); } } } } } const MenuCell = { name: 'MenuCell', components: { CellLayout, RichMenuPopup: ui_vue3_components_richMenu.RichMenuPopup, RichMenuItem: ui_vue3_components_richMenu.RichMenuItem }, inject: ['section', 'userGroup'], data() { return { isMenuShown: false }; }, computed: { RichMenuItemIcon: () => ui_vue3_components_richMenu.RichMenuItemIcon, ...ui_vue3_vuex.mapGetters({ isMaxValueSetForAny: 'accessRights/isMaxValueSetForAny', isMinValueSetForAny: 'accessRights/isMinValueSetForAny' }), menuPopupOptions() { const width = 290; return { bindElement: this.$refs.icon, width, // by default popup is positioned so that the left top angle is below the bind element. // we need to position it in the center of the column offsetLeft: -Math.floor(width / 2) + 9 }; }, shownUserGroupsWithoutCurrent() { const shown = this.$store.getters['userGroups/shown']; const shownWithoutCurrent = main_core.Runtime.clone(shown); shownWithoutCurrent.delete(this.userGroup.id); return shownWithoutCurrent; }, applyDialogItems() { return ItemsMapper.mapUserGroups(this.shownUserGroupsWithoutCurrent); } }, methods: { toggleMenu() { this.isMenuShown = !this.isMenuShown; }, showApplyDialog() { this.isMenuShown = false; const applyDialog = new ui_entitySelector.Dialog({ context: EntitySelectorContext.ROLE, targetNode: this.$refs.icon, multiple: false, dropdownMode: true, enableSearch: true, cacheable: false, items: this.applyDialogItems, events: { 'Item:onSelect': dialogEvent => { const { item } = dialogEvent.getData(); this.$store.dispatch('userGroups/copySectionValues', { srcUserGroupId: this.userGroup.id, dstUserGroupId: item.getId(), sectionCode: this.section.sectionCode }); } } }); applyDialog.show(); }, setMaxValuesInSection() { this.isMenuShown = false; this.$store.dispatch('userGroups/setMaxAccessRightValuesInSection', { userGroupId: this.userGroup.id, sectionCode: this.section.sectionCode }); }, setMinValuesInSection() { this.isMenuShown = false; this.$store.dispatch('userGroups/setMinAccessRightValuesInSection', { userGroupId: this.userGroup.id, sectionCode: this.section.sectionCode }); } }, template: ` <CellLayout class="ui-access-rights-v2-menu-cell" style="cursor: pointer" @click="toggleMenu"> <div ref="icon" class="ui-icon-set --more ui-access-rights-v2-icon-more" > <RichMenuPopup v-if="isMenuShown" @close="isMenuShown = false" :popup-options="menuPopupOptions" > <RichMenuItem v-if="isMaxValueSetForAny" :icon="RichMenuItemIcon.check" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SET_MAX_ACCESS_RIGHTS')" :subtitle="$Bitrix.Loc.getMessage( 'JS_UI_ACCESSRIGHTS_V2_SET_MAX_ACCESS_RIGHTS_SUBTITLE_SECTION', { '#SECTION#': section.sectionTitle + (section.sectionSubTitle ? (' ' + section.sectionSubTitle) : ''), } )" @click="setMaxValuesInSection" /> <RichMenuItem v-if="isMinValueSetForAny" :icon="RichMenuItemIcon['red-lock']" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SET_MIN_ACCESS_RIGHTS')" :subtitle="$Bitrix.Loc.getMessage( 'JS_UI_ACCESSRIGHTS_V2_SET_MIN_ACCESS_RIGHTS_SUBTITLE_SECTION', { '#SECTION#': section.sectionTitle + (section.sectionSubTitle ? (' ' + section.sectionSubTitle) : ''), } )" @click="setMinValuesInSection" /> <RichMenuItem :icon="RichMenuItemIcon.copy" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_APPLY_TO_ROLE')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_APPLY_TO_ROLE_SUBTITLE')" @click="showApplyDialog" /> </RichMenuPopup> </div> </CellLayout> ` }; const Icon = { name: 'Icon', inject: ['section'], computed: { iconBgColor() { if (this.section.sectionIcon.bgColor.startsWith('--')) { // css variable return `var(${this.section.sectionIcon.bgColor})`; } // we assume its hex return this.section.sectionIcon.bgColor; } }, template: ` <div v-if="section.sectionIcon" class="ui-access-rights-v2-section-header-icon" :style="{ backgroundColor: iconBgColor, }"> <div class="ui-icon-set" :class="'--' + section.sectionIcon.type"></div> </div> ` }; const Locator = { name: 'Locator', components: { SectionIcon: Icon }, props: { maxWidth: { type: Number, // same as value popup width default: 430 } }, inject: ['section', 'right'], computed: { rightOrGroupTitle() { if (!this.right.group) { return this.right.title; } const groupHead = this.section.rights.get(this.right.group); return groupHead == null ? void 0 : groupHead.title; } }, template: ` <div class="ui-access-rights-v2-cell-popup-header-locator" :style="{ maxWidth: maxWidth + 'px', }"> <SectionIcon/> <span class="ui-access-rights-v2-text-ellipsis" :title="section.sectionTitle" >{{ section.sectionTitle }}</span> <span v-if="section.sectionSubTitle" class="ui-access-rights-v2-text-ellipsis" :title="section.sectionSubTitle" style="margin-left: 5px; color: var(--ui-color-palette-gray-70);" >{{ section.sectionSubTitle }}</span> <div class="ui-icon-set --chevron-right ui-access-rights-v2-cell-popup-header-chevron"></div> <template v-if="rightOrGroupTitle !== right.title"> <span class="ui-access-rights-v2-text-ellipsis" :title="right.title">{{ right.title }}</span> <div class="ui-icon-set --chevron-right ui-access-rights-v2-cell-popup-header-chevron"></div> </template> <span class="ui-access-rights-v2-text-ellipsis" :title="rightOrGroupTitle">{{ rightOrGroupTitle }}</span> </div> ` }; const MasterSwitcher = { name: 'MasterSwitcher', components: { Switcher: ui_vue3_components_switcher.Switcher }, emits: ['check', 'uncheck'], props: { isChecked: { type: Boolean, required: true } }, inject: ['section', 'right'], computed: { switcherOptions() { return { size: 'small', color: 'green' }; } }, template: ` <div class="ui-access-rights-v2-cell-popup-header-master-switcher" :class="{ '--checked': isChecked, }"> <slot/> <div class="ui-access-rights-v2-cell-popup-header-toggle-container"> <span class="ui-access-rights-v2-cell-popup-header-toggle-caption">{{ $Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ACCESS') }}</span> <Switcher :is-checked="isChecked" @check="$emit('check')" @uncheck="$emit('uncheck')" :options="switcherOptions" data-accessrights-min-max /> </div> </div> ` }; const SingleRoleTitle = { name: 'SingleRoleTitle', props: { userGroupTitle: { type: String, required: true } }, template: ` <div class="ui-access-rights-v2-cell-popup-header-role-container"> <div> <div class="ui-access-rights-v2-cell-popup-header-role-caption"> {{ $Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLE') }} </div> <div class="ui-access-rights-v2-cell-popup-header-role-title ui-access-rights-v2-text-ellipsis" :title="userGroupTitle" > {{ userGroupTitle }} </div> </div> </div> ` }; const PopupHeader = { name: 'DependentVariablesPopupHeader', components: { Locator, MasterSwitcher, SingleRoleTitle }, emits: ['setMax', 'setMin'], props: { values: { /** @type Set<string> */ type: Set, required: true } }, inject: ['right'], computed: { isChecked() { if (!this.isMinMaxValuesSet) { return this.values.size > 0; } return this.isSelectedAnythingBesidesMin; }, isMinMaxValuesSet() { return !main_core.Type.isNil(this.right.minValue) && !main_core.Type.isNil(this.right.maxValue); }, isSelectedAnythingBesidesMin() { if (this.values.size <= 0) { return false; } for (const variableId of this.values) { if (!this.right.minValue.has(variableId)) { return true; } } return false; } }, methods: { setMin() { if (this.isMinMaxValuesSet) { this.$emit('setMin'); } }, setMax() { if (this.isMinMaxValuesSet) { this.$emit('setMax'); } } }, template: ` <div> <Locator/> <MasterSwitcher :is-checked="isChecked" @check="setMax" @uncheck="setMin" > <slot/> </MasterSwitcher> </div> ` }; const PopupContent = { name: 'DependentVariablesPopupContent', emits: ['apply'], components: { Switcher: ui_vue3_components_switcher.Switcher, PopupHeader, Icon: ui_iconSet_api_vue.BIcon }, directives: { hint: ui_vue3_directives_hint.hint }, props: { // value for selector is id of a selected variable initialValues: { type: Set, default: new Set() } }, data() { return { // values modified during popup lifetime and not yet dispatched to store notSavedValues: this.getNotSavedValues() }; }, inject: ['section', 'right', 'redefineApply'], computed: { isMinMaxValuesSet() { return !main_core.Type.isNil(this.right.minValue) && !main_core.Type.isNil(this.right.maxValue); }, variablesShownInList() { if (!this.isMinMaxValuesSet) { return this.right.variables; } const variablesWithoutMinAndSecondary = main_core.Runtime.clone(this.right.variables); for (const variableId of this.right.minValue) { variablesWithoutMinAndSecondary.delete(variableId); } for (const [variableId, variable] of variablesWithoutMinAndSecondary) { if (variable.secondary) { variablesWithoutMinAndSecondary.delete(variableId); } } return variablesWithoutMinAndSecondary; }, secondaryVariables() { const result = new Map(); for (const [variableId, variable] of this.right.variables) { if (variable.secondary) { result.set(variableId, variable); } } return result; }, nothingSelectedValues() { return this.$store.getters['accessRights/getNothingSelectedValue'](this.section.sectionCode, this.right.id); }, switcherOptions() { return { size: 'small', color: 'primary' }; }, secondarySwitcherOptions() { return { size: 'extra-small', color: 'green' }; }, iconSet() { return ui_iconSet_api_vue.Set; } }, mounted() { this.redefineApply(() => { this.apply(); }); }, methods: { addValue(variableId) { const variable = this.right.variables.get(variableId); if (!variable) { return; } this.notSavedValues.add(variableId); if (!main_core.Type.isNil(variable.requires)) { for (const requiredId of variable.requires) { this.notSavedValues.add(requiredId); } } if (!main_core.Type.isNil(variable.conflictsWith)) { // remove old variables that conflict with variable we want to add for (const conflictId of variable.conflictsWith) { this.notSavedValues.delete(conflictId); } } for (const otherVariable of this.right.variables.values()) { if (otherVariable.id === variableId) { continue; } // if one of the current variables conflicts with newly added variables, we remove old variable if (this.notSavedValues.has(otherVariable.id) && !main_core.Type.isNil(otherVariable.conflictsWith)) { for (const conflictId of otherVariable.conflictsWith) { if (this.notSavedValues.has(conflictId)) { this.notSavedValues.delete(otherVariable.id); } } } } }, removeValue(variableId) { this.notSavedValues.delete(variableId); for (const otherVariableId of this.notSavedValues) { if (otherVariableId === variableId) { continue; } const otherVariable = this.right.variables.get(otherVariableId); if (!otherVariable) { continue; } if (!main_core.Type.isNil(otherVariable.requires) && otherVariable.requires.has(variableId)) { this.notSavedValues.delete(otherVariableId); } } }, setMaxValue() { for (const variableId of this.right.maxValue) { this.addValue(variableId); } }, setMinValue() { for (const variableId of this.right.minValue) { this.addValue(variableId); } }, apply() { let values = this.notSavedValues; if (values.size <= 0) { values = this.nothingSelectedValues; } this.$emit('apply', { values }); }, getNotSavedValues() { const result = new Set(); this.initialValues.forEach(value => { if (this.right.variables.has(value)) { result.add(value); } }); return result; }, getVariableHintOptions(variable) { return { text: variable.hint, popupOptions: { bindOptions: { position: 'bottom' }, width: 262, angle: { position: 'top', offset: 33 } } }; } }, // data attributes are needed for e2e automated tests template: ` <div> <PopupHeader :values="notSavedValues" @set-max="setMaxValue" @set-min="setMinValue" > <slot name="role-title"/> </PopupHeader> <div class="ui-access-rights-v2-dv-popup--line-container"> <div v-for="[variableId, variable] in variablesShownInList" :key="variableId" class="ui-access-rights-v2-dv-popup--line" > <div class="ui-access-rights-v2-dv-popup--line-title"> <span class="ui-access-rights-v2-text-ellipsis" :title="variable.title">{{ variable.title }}</span> <Icon v-if="variable.hint" :name="iconSet.INFO_1" :color="'var(--ui-color-palette-gray-40)'" :size="20" v-hint="getVariableHintOptions(variable)"></Icon> </div> <Switcher :is-checked="notSavedValues.has(variable.id)" @check="addValue(variable.id)" @uncheck="removeValue(variable.id)" :options="switcherOptions" :data-accessrights-variable-id="variable.id" /> </div> <div v-for="[variableId, variable] in secondaryVariables" :key="variableId" class="ui-access-rights-v2-dv-popup--line --secondary" > <Switcher :is-checked="notSavedValues.has(variable.id)" @check="addValue(variable.id)" @uncheck="removeValue(variable.id)" :options="secondarySwitcherOptions" style="padding-right: 5px;" :data-accessrights-variable-id="variable.id" /> <span class="ui-access-rights-v2-text-ellipsis">{{ variable.title }}</span> </div> </div> <div v-if="right.dependentVariablesPopupHint" class="ui-access-rights-v2-dv-popup--hint" > <Icon :name="iconSet.INFO_1" :color="'var(--ui-color-palette-gray-40)'" :size="20"></Icon> <span>{{ right.dependentVariablesPopupHint }}</span> </div> </div> ` }; const AllRolesTitle = { name: 'AllRolesTitle', template: ` <div class="ui-access-rights-v2-cell-popup-header-all-role-container"> <div class="ui-icon-set --persons-3" style="margin-right: 4px;"></div> <div class="ui-access-rights-v2-cell-popup-header-all-roles-caption">{{ $Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ALL_ROLES') }}</div> </div> ` }; const ValuePopup = { name: 'ValuePopup', components: { Popup: ui_vue3_components_popup.Popup }, emits: ['close', 'apply'], provide() { return { redefineApply: func => { this.onApply = func; } }; }, data() { return { onApply: () => { this.$emit('apply'); } }; }, computed: { popupOptions() { return { autoHide: true, closeEsc: true, cacheable: false, minWidth: 466, padding: 18 }; } }, mounted() { void this.$nextTick(() => { const applyButton = new ui_buttons.ApplyButton({ color: ui_buttons.ButtonColor.PRIMARY, onclick: () => { this.apply(); this.$emit('close'); } }); applyButton.renderTo(this.$refs['button-container']); const cancelButton = new ui_buttons.CancelButton({ onclick: () => { this.$emit('close'); } }); cancelButton.renderTo(this.$refs['button-container']); }); }, methods: { apply() { this.onApply(); } }, template: ` <Popup @close="$emit('close')" :options="popupOptions"> <slot/> <div ref="button-container" class="ui-access-rights-v2-value-popup-buttons"></div> </Popup> ` }; const DependentVariables$1 = { name: 'DependentVariables', components: { PopupContent, AllRolesTitle, ValuePopup }, emits: ['close'], inject: ['section', 'right'], methods: { apply({ values }) { this.$store.dispatch('userGroups/setAccessRightValuesForShown', { sectionCode: this.section.sectionCode, valueId: this.right.id, values }); } }, template: ` <ValuePopup @close="$emit('close')"> <PopupContent @apply="apply"> <template #role-title> <AllRolesTitle/> </template> </PopupContent> </ValuePopup> ` }; let _ = t => t, _t, _t2; var _toggleSelectButtons = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("toggleSelectButtons"); var _selectAll = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("selectAll"); var _deselectAll = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("deselectAll"); var _onItemStatusChange = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("onItemStatusChange"); class Footer extends ui_entitySelector.DefaultFooter { constructor(dialog, options) { super(dialog, options); Object.defineProperty(this, _onItemStatusChange, { value: _onItemStatusChange2 }); Object.defineProperty(this, _deselectAll, { value: _deselectAll2 }); Object.defineProperty(this, _selectAll, { value: _selectAll2 }); Object.defineProperty(this, _toggleSelectButtons, { value: _toggleSelectButtons2 }); this.selectAllButton = main_core.Tag.render(_t || (_t = _`<div class="ui-selector-footer-link">${0}</div>`), main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ALL_SELECT_LABEL')); main_core.Dom.hide(this.selectAllButton); main_core.Event.bind(this.selectAllButton, 'click', babelHelpers.classPrivateFieldLooseBase(this, _selectAll)[_selectAll].bind(this)); this.deselectAllButton = main_core.Tag.render(_t2 || (_t2 = _`<div class="ui-selector-footer-link">${0}</div>`), main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ALL_DESELECT_LABEL')); main_core.Dom.hide(this.deselectAllButton); main_core.Event.bind(this.deselectAllButton, 'click', babelHelpers.classPrivateFieldLooseBase(this, _deselectAll)[_deselectAll].bind(this)); this.getDialog().subscribe('Item:onSelect', babelHelpers.classPrivateFieldLooseBase(this, _onItemStatusChange)[_onItemStatusChange].bind(this)); this.getDialog().subscribe('Item:onDeselect', babelHelpers.classPrivateFieldLooseBase(this, _onItemStatusChange)[_onItemStatusChange].bind(this)); } getContent() { babelHelpers.classPrivateFieldLooseBase(this, _toggleSelectButtons)[_toggleSelectButtons](); return [this.selectAllButton, this.deselectAllButton]; } } function _toggleSelectButtons2() { if (this.getDialog().getSelectedItems().length === this.getDialog().getItems().length) { main_core.Dom.hide(this.selectAllButton); main_core.Dom.show(this.deselectAllButton); } else { main_core.Dom.show(this.selectAllButton); main_core.Dom.hide(this.deselectAllButton); } } function _selectAll2() { this.getDialog().getItems().forEach(item => { item.select(); }); } function _deselectAll2() { this.getDialog().getSelectedItems().forEach(item => { item.deselect(); }); } function _onItemStatusChange2() { babelHelpers.classPrivateFieldLooseBase(this, _toggleSelectButtons)[_toggleSelectButtons](); } let _$1 = t => t, _t$1; var _renderVueApp = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("renderVueApp"); class Header$1 extends ui_entitySelector.BaseHeader { constructor(...args) { super(...args); Object.defineProperty(this, _renderVueApp, { value: _renderVueApp2 }); } render() { return babelHelpers.classPrivateFieldLooseBase(this, _renderVueApp)[_renderVueApp](); } } function _renderVueApp2() { const container = main_core.Tag.render(_t$1 || (_t$1 = _$1`<div style="padding: 20px 20px 0;"></div>`)); const app = ui_vue3.BitrixVue.createApp(Locator, { maxWidth: this.getDialog().getWidth() }); app.provide('section', this.getOption('section')); app.provide('right', this.getOption('right')); app.mount(container); return container; } const Selector$1 = { name: 'Selector', emits: ['apply', 'close'], props: { // value for selector is id of a selected variable initialValues: { type: Set, default: new Set() } }, inject: ['section', 'right'], data() { return { // values modified during popup lifetime and not yet dispatched to store values: this.initialValues }; }, dialog: null, computed: { isAllSelected() { return this.values.has(this.right.allSelectedCode); }, selectedVariables() { return getSelectedVariables(this.right.variables, this.values, this.isAllSelected); }, dialogItems() { return ItemsMapper.mapVariables(this.right.variables); }, selectedDialogItems() { return this.dialogItems.filter(item => this.selectedVariables.has(item.id)); } }, mounted() { this.showSelector(); }, beforeUnmount() { var _this$dialog; (_this$dialog = this.dialog) == null ? void 0 : _this$dialog.hide(); }, methods: { showSelector() { this.dialog = new ui_entitySelector.Dialog({ height: 400, context: EntitySelectorContext.VARIABLE, enableSearch: this.right.enableSearch, multiple: true, autoHide: true, hideByEsc: true, dropdownMode: true, compactView: this.right.compactView, showAvatars: this.right.showAvatars, selectedItems: this.selectedDialogItems, searchOptions: { allowCreateItem: false }, cacheable: false, events: { 'Item:onSelect': this.onItemSelect, 'Item:onDeselect': this.onItemDeselect, onHide: this.apply, onDestroy: () => { this.dialog = null; } }, entities: [{ id: EntitySelectorEntities.VARIABLE }], items: this.dialogItems, header: Header$1, headerOptions: { section: this.section, right: this.right }, footer: Footer }); this.dialog.show(); }, onItemSelect(event) { const addedItem = event.getData().item; this.addValue(String(addedItem.getId())); }, onItemDeselect(event) { const removedItem = event.getData().item; this.removeValue(String(removedItem.getId())); }, addValue(value) { const newValues = main_core.Runtime.clone(this.values); newValues.add(value); if (newValues.size >= this.right.variables.size) { this.setValues(new Set([this.right.allSelectedCode])); } else { this.setValues(newValues); } }, removeValue(value) { if (this.values.has(this.right.allSelectedCode)) { const allVariablesIds = [...this.right.variables.values()].map(variable => variable.id); const allVariablesIdsWithoutRemoved = new Set(allVariablesIds); allVariablesIdsWithoutRemoved.delete(value); this.setValues(allVariablesIdsWithoutRemoved); } else { const newValues = [...this.values].filter(candidate => candidate !== value); this.setValues(new Set(newValues)); } }, setValues(newValues) { this.values = newValues; }, apply() { this.setNothingSelectedValueIfNeeded(); this.$emit('apply', { values: this.values }); this.$emit('close'); }, setNothingSelectedValueIfNeeded() { if (this.values.size <= 0) { const nothingSelected = this.$store.getters['accessRights/getNothingSelectedValue'](this.section.sectionCode, this.right.id); for (const nothing of nothingSelected) { this.addValue(nothing); } } } }, template: ` <div></div> ` }; const Multivariables$1 = { name: 'Multivariables', emits: ['close'], components: { Selector: Selector$1 }, inject: ['section', 'right'], methods: { apply({ values }) { this.$store.dispatch('userGroups/setAccessRightValuesForShown', { sectionCode: this.section.sectionCode, valueId: this.right.id, values }); }, close() { this.$emit('close'); } }, template: ` <Selector @apply="apply" @close="close"/> ` }; const POPUP_ID = 'ui-access-rights-v2-row-value-variables'; const Variables$1 = { name: 'Variables', emits: ['close'], inject: ['section', 'right'], mounted() { this.showSelector(); }, beforeUnmount() { this.closeSelector(); }, methods: { showSelector() { const menuItems = []; for (const variable of this.right.variables.values()) { menuItems.push({ id: variable.id, text: variable.title, onclick: (innerEvent, item) => { var _item$getMenuWindow; (_item$getMenuWindow = item.getMenuWindow()) == null ? void 0 : _item$getMenuWindow.close(); this.setValue(variable.id); } }); } main_popup.MenuManager.show({ id: POPUP_ID, bindElement: this.$el, items: menuItems, autoHide: true, cacheable: false, events: { onClose: () => { this.$emit('close'); } } }); }, setValue(value) { this.$store.dispatch('userGroups/setAccessRightValuesForShown', { sectionCode: this.section.sectionCode, valueId: this.right.id, values: new Set([value]) }); }, closeSelector() { var _MenuManager$getMenuB; (_MenuManager$getMenuB = main_popup.MenuManager.getMenuById(POPUP_ID)) == null ? void 0 : _MenuManager$getMenuB.close(); } }, // invisible div for binding selector to it template: ` <div></div> ` }; /** * A special case of Hint. We don't need interactivity here, but we do need to wrap slot with a hint. * Combine these properties in a single vue hint wrapper is impossible. */ const SelectedHint = { name: 'SelectedHint', props: { html: { type: String, required: true } }, data() { return { isRendered: true }; }, watch: { html() { // force hint directive to re-render this.isRendered = false; void this.$nextTick(() => { this.isRendered = true; }); } }, directives: { hint: ui_vue3_directives_hint.hint }, // offsetTop is needed to fix infinite mouseenter/mouseleave loop in chromium. issue 204272 template: ` <div v-if="isRendered" v-hint="{ html, popupOptions: { offsetTop: 3, }, }" data-hint-init="vue"> <slot/> </div> ` }; const DependentVariables$2 = { name: 'DependentVariables', components: { ValuePopup, PopupContent, SelectedHint, SingleRoleTitle }, props: { // value for selector is id of a selected variable value: { /** @type AccessRightValue */ type: Object, required: true } }, data() { return { isPopupShown: false }; }, inject: ['section', 'userGroup', 'right'], computed: { selectedVariables() { return getSelectedVariables(this.right.variables, this.value.values, false); }, currentAlias() { return this.$store.getters['accessRights/getSelectedVariablesAlias'](this.section.sectionCode, this.value.id, this.value.values); }, title() { if (main_core.Type.isString(this.currentAlias)) { return this.currentAlias; } if (this.selectedVariables.size <= 0) { return this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ADD'); } return getMultipleSelectedVariablesTitle(this.selectedVariables); }, hintHtml() { return getMultipleSelectedVariablesHintHtml(this.selectedVariables, this.hintTitle, this.right.variables); }, hintTitle() { if (main_core.Type.isString(this.right.hintTitle)) { return this.right.hintTitle; } return this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SELECTED_ITEMS_TITLE'); } }, methods: { apply({ values }) { this.$store.dispatch('userGroups/setAccessRightValues', { sectionCode: this.section.sectionCode, userGroupId: this.userGroup.id, valueId: this.value.id, values }); } }, template: ` <div class='ui-access-rights-v2-column-item-text-link' :class="{ 'ui-access-rights-v2-text-ellipsis': !hintHtml }" @click="isPopupShown = true"> <SelectedHint v-if="hintHtml" :html="hintHtml">{{title}}</SelectedHint> <div v-else :title="title">{{title}}</div> <ValuePopup v-if="isPopupShown" @close="isPopupShown = false"> <PopupContent @apply="apply" :initial-values="value.values" > <template #role-title> <SingleRoleTitle :user-group-title="userGroup.title"/> </template> </PopupContent> </ValuePopup> </div> ` }; const Multivariables$2 = { name: 'Multivariables', components: { SelectedHint, Selector: Selector$1 }, props: { // value for selector is id of a selected variable value: { /** @type AccessRightValue */ type: Object, required: true } }, inject: ['section', 'userGroup', 'right'], data() { return { isSelectorShown: false }; }, computed: { isAllSelected() { return this.value.values.has(this.right.allSelectedCode); }, selectedVariables() { return getSelectedVariables(this.right.variables, this.value.values, this.isAllSelected); }, currentAlias() { return this.$store.getters['accessRights/getSelectedVariablesAlias'](this.section.sectionCode, this.value.id, this.value.values); }, title() { if (main_core.Type.isString(this.currentAlias)) { return this.currentAlias; } if (this.isAllSelected) { return this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ALL_ACCEPTED'); } if (this.selectedVariables.size <= 0) { return this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ADD'); } return getMultipleSelectedVariablesTitle(this.selectedVariables); }, hintHtml() { return getMultipleSelectedVariablesHintHtml(this.selectedVariables, this.hintTitle, this.right.variables); }, hintTitle() { if (main_core.Type.isString(this.right.hintTitle)) { return this.right.hintTitle; } return this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SELECTED_ITEMS_TITLE'); } }, methods: { showSelector() { this.isSelectorShown = true; }, setValues({ values }) { this.$store.dispatch('userGroups/setAccessRightValues', { sectionCode: this.section.sectionCode, userGroupId: this.userGroup.id, valueId: this.value.id, values }); } }, template: ` <SelectedHint v-if="hintHtml" :html="hintHtml" class='ui-access-rights-v2-column-item-text-link' @click="showSelector" v-bind="$attrs" > {{ title }} </SelectedHint> <div v-else class='ui-access-rights-v2-column-item-text-link ui-access-rights-v2-text-ellipsis' @click="showSelector" :title="title" v-bind="$attrs" > {{ title }} </div> <Selector v-if="isSelectorShown" :initial-values="value.values" @close="isSelectorShown = false" @apply="setValues" /> ` }; const Toggler$1 = { name: 'Toggler', components: { Switcher: ui_vue3_components_switcher.Switcher }, props: { value: { /** @type AccessRightValue */ type: Object, required: true } }, inject: ['section', 'userGroup'], computed: { isChecked() { return this.value.values.has('1'); } }, methods: { setValue(value) { this.$store.dispatch('userGroups/setAccessRightValues', { userGroupId: this.userGroup.id, sectionCode: this.section.sectionCode, valueId: this.value.id, values: new Set([value]) }); } }, // eslint-disable-next-line quotes template: ` <Switcher :is-checked="isChecked" @check="setValue('1')" @uncheck="setValue('0')" :options="{ size: 'extra-small', color: 'green', }" /> ` }; const POPUP_ID$1 = 'ui-access-rights-v2-column-item-popup-variables'; const Variables$2 = { name: 'Variables', props: { // value for selector is id of a selected variable value: { /** @type AccessRightValue */ type: Object, required: true } }, inject: ['section', 'userGroup', 'right'], computed: { emptyVariableId() { const emptyValue = this.$store.getters['accessRights/getEmptyValue'](this.section.sectionCode, this.value.id); return emptyValue[0]; }, currentVariableId() { if (this.value.values.size <= 0) { return this.emptyVariableId; } const [firstItem] = this.value.values; return firstItem; }, currentAlias() { return this.$store.getters['accessRights/getSelectedVariablesAlias'](this.section.sectionCode, this.value.id, this.value.values); }, currentVariableTitle() { if (main_core.Type.isString(this.currentAlias)) { return this.currentAlias; } const variable = this.right.variables.get(this.currentVariableId); if (!variable) { return this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ADD'); } return variable.title; } }, methods: { showSelector(event) { const menuItems = []; for (const variable of this.right.variables.values()) { menuItems.push({ id: variable.id, text: variable.title, onclick: (innerEvent, item) => { var _item$getMenuWindow; (_item$getMenuWindow = item.getMenuWindow()) == null ? void 0 : _item$getMenuWindow.close(); this.setValue(variable.id); } }); } main_popup.MenuManager.show({ id: POPUP_ID$1, bindElement: event.target, items: menuItems, autoHide: true, cacheable: false }); }, setValue(value) { this.$store.dispatch('userGroups/setAccessRightValues', { sectionCode: this.section.sectionCode, userGroupId: this.userGroup.id, valueId: this.value.id, values: new Set([value]) }); } }, template: ` <div class='ui-access-rights-v2-column-item-text-link ui-access-rights-v2-text-ellipsis' :title="currentVariableTitle" @click="showSelector" > {{ currentVariableTitle }} </div> ` }; const Cells = Object.freeze({ DependentVariables: DependentVariables$2, Multivariables: Multivariables$2, Toggler: Toggler$1, Variables: Variables$2 }); const Rows = Object.freeze({ DependentVariables: DependentVariables$1, Multivariables: Multivariables$1, // no row value for toggler Variables: Variables$1 }); function getValueComponent(accessRightItem) { const type = ServiceLocator.getValueTypeByRight(accessRightItem); if (!type) { // vue will render empty cell return ''; } return type.getComponentName(); } const ValueCell = { name: 'ValueCell', components: { CellLayout, ...Cells }, props: { right: { /** @type AccessRightItem */ type: Object, required: true } }, inject: ['section', 'userGroup'], provide() { return { right: this.right }; }, computed: { value() { const value = this.userGroup.accessRights.get(this.right.id); return value || this.$store.getters['userGroups/getEmptyAccessRightValue'](this.userGroup.id, this.section.sectionCode, this.right.id); }, cellComponent() { return getValueComponent(this.right); } }, // data attributes are needed for e2e automated tests template: ` <CellLayout :class="{ 'ui-access-rights-v2-group-children': right.group, '--modified': value.isModified }" v-memo="[userGroup.id, value.values, value.isModified]" > <Component :is="cellComponent" :value="value" :data-accessrights-right-id="right.id" /> </CellLayout> ` }; const Column = { name: 'Column', components: { ColumnLayout, ValueCell, MenuCell }, props: { userGroup: { /** @type UserGroup */ type: Object, required: true }, rights: { type: Map, required: true } }, provide() { return { userGroup: ui_vue3.computed(() => this.userGroup) }; }, computed: { renderedRights() { const result = new Map(); for (const [rightId, right] of this.rights) { if (shouldRowBeRendered(right)) { result.set(rightId, right); } } return result; } }, template: ` <ColumnLayout ref="column"> <MenuCell/> <ValueCell v-for="[rightId, accessRightItem] in renderedRights" :key="rightId" :right="accessRightItem" /> </ColumnLayout> ` }; const ColumnList = { name: 'ColumnList', components: { Column, SyncHorizontalScroll, ColumnLayout }, props: { userGroups: { type: Map, required: true }, rights: { type: Map, required: true } }, throttledScrollHandler: null, throttledResizeHandler: null, ears: null, isEarsInited: false, data() { return { isLeftShadowShown: false, isRightShadowShown: false }; }, created() { this.throttledScrollHandler = main_core.Runtime.throttle(() => { this.adjustShadowsVisibility(); }, 200); this.throttledResizeHandler = main_core.Runtime.throttle(() => { this.adjustShadowsVisibility(); this.adjustEars(); }, 200); }, mounted() { main_core.Event.bind(window, 'resize', this.throttledResizeHandler); this.adjustShadowsVisibility(); this.initEars(); }, beforeUnmount() { this.destroyEars(); main_core.Event.unbind(window, 'resize', this.throttledResizeHandler); }, watch: { userGroups(newValue, oldValue) { if (newValue.size !== oldValue.size) { this.adjustShadowsVisibility(); this.adjustEars(); } } }, methods: { calculateShadowsVisibility() { if (!this.$refs['column-container']) { // in case it's accidentally called before mount or after unmount return { isLeftShadowShown: false, isRightShadowShown: false }; } const scrollLeft = this.$refs['column-container'].$el.scrollLeft; const isLeftShadowShown = scrollLeft > 0; const offsetWidth = this.$refs['column-container'].$el.offsetWidth; return { isLeftShadowShown, isRightShadowShown: this.$refs['column-container'].$el.scrollWidth > Math.round(scrollLeft + offsetWidth) }; }, adjustShadowsVisibility() { // avoid "forced synchronous layout" requestAnimationFrame(() => { const { isLeftShadowShown, isRightShadowShown } = this.calculateShadowsVisibility(); this.isLeftShadowShown = isLeftShadowShown; this.isRightShadowShown = isRightShadowShown; }); }, adjustEars() { if (!this.isEarsInited) { return; } // avoid "forced synchronous layout" requestAnimationFrame(() => { // force ears to recalculate its visibility this.ears.toggleEars(); }); }, initEars() { if (!this.$refs['column-container']) { return; } if (this.ears) { return; } this.ears = new ui_ears.Ears({ container: this.$refs['column-container'].$el, immediateInit: true, smallSize: true }); // chrome is not happy when we query DOM values (scrollLeft, offsetWidth, ...) just after we've changed them // avoid "forced synchronous layout" requestAnimationFrame(() => { if (!this.ears || !this.$refs['column-container']) { this.ears = null; // sometimes the callback is fired after the component is unmounted return; } const scrollLeft = this.$refs['column-container'].$el.scrollLeft; this.ears.init(); // Ears add wrapper around the container, and it breaks our markup a little. Fix it main_core.Dom.style(this.ears.getWrapper(), 'flex', 1); if (scrollLeft > 0) { // ears.init resets scrollLeft to 0 this.$refs['column-container'].$el.scrollLeft = scrollLeft; } this.isEarsInited = true; }); }, destroyEars() { var _this$ears; (_this$ears = this.ears) == null ? void 0 : _this$ears.destroy(); this.isEarsInited = false; this.ears = null; } }, template: ` <div class='ui-access-rights-v2-section-content' :class="{ 'ui-access-rights-v2-section-shadow-left-shown': isLeftShadowShown, 'ui-access-rights-v2-section-shadow-right-shown': isRightShadowShown, }" > <SyncHorizontalScroll ref="column-container" class='ui-access-rights-v2-section-wrapper' @scroll="throttledScrollHandler" > <Column v-for="[groupId, group] in userGroups" :key="groupId" :user-group="group" :rights="rights" :data-accessrights-user-group-id="groupId" /> <ColumnLayout/> </SyncHorizontalScroll> </div> ` }; let _$2 = t => t, _t$2; /** * A special case of Hint that provides interactivity and reactivity. */ const Hint = { name: 'Hint', props: { html: { type: String, required: true } }, computed: { ...ui_vue3_vuex.mapState({ guid: state => state.application.guid }) }, mounted() { this.renderHint(); }, watch: { html() { // make ui.hint reactive :( main_core.Dom.clean(this.$refs.container); this.renderHint(); } }, methods: { renderHint() { const hintIconWrapper = main_core.Tag.render(_t$2 || (_t$2 = _$2`<span data-hint-html="true" data-hint-interactivity="true"></span>`)); // Tag.render cant set prop value with HTML properly :( hintIconWrapper.setAttribute('data-hint', this.html); main_core.Dom.append(hintIconWrapper, this.$refs.container); this.getHintManager().initNode(hintIconWrapper); }, getHintManager() { return ServiceLocator.getHint(this.guid); } }, template: '<span class="ui-access-rights-v2-hint-container" ref="container"></span>' }; const Header$2 = { name: 'Header', components: { Hint, Icon }, inject: ['section'], methods: { toggleSection() { this.$store.dispatch('accessRights/toggleSection', { sectionCode: this.section.sectionCode }); }, onSectionEventButtonClick() { const eventData = { guid: this.$store.getters['application/guid'], section: this.section }; main_core_events.EventEmitter.emit('BX.UI.AccessRights.V2:onSectionHeaderClick', eventData); } }, template: ` <div @click="toggleSection" class='ui-access-rights-v2-section-header' :class="{ '--expanded': section.isExpanded, }" v-memo="[section.isExpanded]" > <div class="ui-access-rights-v2-section-header-expander"> <div class='ui-icon-set' :class="{ '--chevron-up': section.isExpanded, '--chevron-down': !section.isExpanded, }" ></div> </div> <Icon/> <span class="ui-access-rights-v2-text-ellipsis ui-access-rights-v2-section-title" :title="section.sectionTitle" >{{ section.sectionTitle }}</span> <span v-if="section.sectionSubTitle" class="ui-access-rights-v2-text-ellipsis ui-access-rights-v2-section-subtitle" :title="section.sectionSubTitle" > {{ section.sectionSubTitle }} </span> <Hint v-if="section.sectionHint" :html="section.sectionHint"/> <span v-if="section.action" class="ui-btn ui-btn-light-border ui-btn-xs ui-access-rights-v2-section-action" @click.stop="onSectionEventButtonClick" >{{ section.action.buttonText }}</span> </div> ` }; const MenuCell$1 = { name: 'MenuCell', components: { CellLayout }, template: ` <CellLayout class="ui-access-rights-v2-menu-cell"/> ` }; const RowValue = { name: 'RowValue', components: { ...Rows }, emits: ['close'], inject: ['right'], computed: { component() { return getValueComponent(this.right); } }, template: ` <Component :is="component" @close="$emit('close')" /> ` }; const TitleCell = { name: 'TitleCell', components: { Hint, RowValue, RichMenuItem: ui_vue3_components_richMenu.RichMenuItem, RichMenuPopup: ui_vue3_components_richMenu.RichMenuPopup }, props: { right: { /** @type AccessRightItem */ type: Object, required: true } }, inject: ['section'], provide() { return { right: this.right }; }, data() { return { isMenuShown: false, isRowValueShown: false }; }, computed: { RichMenuItemIcon: () => ui_vue3_components_richMenu.RichMenuItemIcon, isMinValueSet() { return this.$store.getters['accessRights/isMinValueSet'](this.section.sectionCode, this.right.id); }, isMaxValueSet() { return this.$store.getters['accessRights/isMaxValueSet'](this.section.sectionCode, this.right.id); }, isRowValueConfigurable() { var _ServiceLocator$getVa, _ServiceLocator$getVa2; return (_ServiceLocator$getVa = (_ServiceLocator$getVa2 = ServiceLocator.getValueTypeByRight(this.right)) == null ? void 0 : _ServiceLocator$getVa2.isRowValueConfigurable()) != null ? _ServiceLocator$getVa : false; }, isRightDeletable() { return this.right.isDeletable; }, rightCellStyle() { return { 'margin-left': !this.right.groupHead && !this.right.group && !this.right.iconClass ? '23px' : null, 'max-width': this.right.iconClass ? 'calc(100% - 52px)' : 'auto' }; } }, methods: { toggleGroup() { if (!this.right.groupHead) { return; } this.$store.dispatch('accessRights/toggleGroup', { sectionCode: this.section.sectionCode, groupId: this.right.id }); }, toggleMenu() { this.isMenuShown = !this.isMenuShown; }, setMaxValuesForRight() { this.isRowValueShown = false; this.isMenuShown = false; this.$store.dispatch('userGroups/setMaxAccessRightValuesForRight', { sectionCode: this.section.sectionCode, rightId: this.right.id }); }, setMinValuesForRight() { this.isRowValueShown = false; this.isMenuShown = false; this.$store.dispatch('userGroups/setMinAccessRightValuesForRight', { sectionCode: this.section.sectionCode, rightId: this.right.id }); }, openRowValue() { this.isMenuShown = false; this.isRowValueShown = true; }, onRightClick() { const eventData = { guid: this.$store.getters['application/guid'], right: this.right }; main_core_events.EventEmitter.emit('BX.UI.AccessRights.V2:onRightClick', eventData); }, deleteRight() { this.$store.dispatch('userGroups/deleteRight', { rightId: this.right.id }); this.$store.dispatch('accessRights/deleteRight', { sectionCode: this.section.sectionCode, rightId: this.right.id }); main_core_events.EventEmitter.emit('BX.UI.AccessRights.V2:onRightDelete', { guid: this.$store.getters['application/guid'], right: this.right }); } }, // data attributes are needed for e2e automated tests template: ` <div class='ui-access-rights-v2-column-item-text ui-access-rights-v2-column-item-title' @click="toggleGroup" :style="{ cursor: right.groupHead ? 'pointer' : null, }" v-memo="[right.isGroupExpanded, right.title, right.subtitle]" :data-accessrights-right-id="right.id" > <span v-if="right.groupHead" class="ui-icon-set" :class="{ '--minus-in-circle': right.isGroupExpanded, '--plus-in-circle': !right.isGroupExpanded, }" ></span> <div v-if="right.iconClass" :class="right.iconClass" class="ui-access-rights-v2-column-item-title-icon" ><i></i></div> <div class="ui-access-rights-v2-column-item-title-block" :style="rightCellStyle"> <span v-if="right.isClickable" class="ui-access-rights-v2-column-item-title-link ui-access-rights-v2-text-ellipsis" @click="onRightClick" > {{ right.title }} <Hint v-once v-if="right.hint" :html="right.hint"/> </span> <span v-else class="ui-access-rights-v2-text-wrap" > {{ right.title }} <Hint v-once v-if="right.hint" :html="right.hint"/> </span> <span v-if="right.subtitle" class="ui-access-rights-v2-column-item-subtitle ui-access-rights-v2-text-ellipsis" >{{ right.subtitle }}</span> </div> </div> <div ref="icon" class="ui-icon-set --more ui-access-rights-v2-icon-more ui-access-rights-v2-title-column-menu" @click="toggleMenu" > <RichMenuPopup v-if="isMenuShown" @close="isMenuShown = false" :popup-options="{bindElement: $refs.icon, width: 300}" > <RichMenuItem v-if="isMaxValueSet" :icon="RichMenuItemIcon.check" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SET_MAX_ACCESS_RIGHTS_ROW')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SET_MAX_ACCESS_RIGHTS_ROW_SUBTITLE')" @click="setMaxValuesForRight" /> <RichMenuItem v-if="isMinValueSet" :icon="RichMenuItemIcon['red-lock']" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SET_MIN_ACCESS_RIGHTS_ROW')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SET_MIN_ACCESS_RIGHTS_ROW_SUBTITLE')" @click="setMinValuesForRight" /> <RichMenuItem v-if="isRowValueConfigurable" :icon="RichMenuItemIcon.settings" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_OPEN_ROW_VALUE')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_OPEN_ROW_VALUE_SUBTITLE')" @click="openRowValue" /> <RichMenuItem v-if="isRightDeletable" :icon="RichMenuItemIcon['trash-bin']" :title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_DELETE_ROW')" :subtitle="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_DELETE_ROW_SUBTITLE')" @click="deleteRight" /> </RichMenuPopup> <RowValue v-if="isRowValueShown" @close="isRowValueShown = false"/> </div> ` }; const TitleColumn = { name: 'TitleColumn', components: { TitleCell, ColumnLayout, CellLayout, MenuCell: MenuCell$1 }, props: { rights: { type: Map, required: true } }, computed: { renderedRights() { const result = new Map(); for (const [rightId, right] of this.rights) { if (shouldRowBeRendered(right)) { result.set(rightId, right); } } return result; } }, template: ` <ColumnLayout> <MenuCell/> <CellLayout v-for="[rightId, accessRightItem] in renderedRights" :key="rightId" :class="{ 'ui-access-rights-v2-group-children': accessRightItem.group, }" > <TitleCell :right="accessRightItem" /> </CellLayout> </ColumnLayout> ` }; // @vue/component const Section = { name: 'Section', components: { Column, SyncHorizontalScroll, TitleColumn, Header: Header$2, ColumnList }, props: { userGroups: { type: Map, required: true }, rights: { type: Map, required: true }, code: { type: String, required: true }, isExpanded: { type: Boolean, required: true }, title: { type: String, required: true }, subTitle: { type: String }, hint: { type: String }, icon: { /** @type AccessRightSectionIcon */ type: Object }, action: { /** @type AccessRightSectionAction */ type: Object } }, provide() { return { section: ui_vue3.computed(() => { return { sectionCode: this.code, sectionTitle: this.title, sectionSubTitle: this.subTitle, sectionIcon: this.icon, sectionHint: this.hint, isExpanded: this.isExpanded, rights: this.rights, action: this.action }; }) }; }, // data attributes are needed for e2e automated tests template: ` <div class="ui-access-rights-v2-section" :data-accessrights-section-code="code"> <Header/> <div v-if="isExpanded" class='ui-access-rights-v2-section-container'> <div class='ui-access-rights-v2-section-head'> <TitleColumn :rights="rights" /> </div> <ColumnList :rights="rights" :user-groups="userGroups"/> </div> </div> ` }; const Grid = { name: 'Grid', components: { Section, Header, SearchBox }, loader: null, computed: { ...ui_vue3_vuex.mapState({ isSaving: state => state.application.isSaving, guid: state => state.application.guid, searchContainerSelector: state => state.application.options.searchContainerSelector }), ...ui_vue3_vuex.mapGetters({ shownSections: 'accessRights/shown', shownUserGroups: 'userGroups/shown' }) }, mounted() { ServiceLocator.getHint(this.guid).initOwnerDocument(this.$refs.container); main_core_events.EventEmitter.subscribe('BX.UI.AccessRights.V2:addRight', this.addRight); main_core_events.EventEmitter.subscribe('BX.UI.AccessRights.V2:updateRightTitle', this.updateRightTitle); main_core_events.EventEmitter.subscribe('BX.UI.AccessRights.V2:updateRightSubtitle', this.updateRightSubtitle); main_core_events.EventEmitter.subscribe('BX.UI.AccessRights.V2:markRightAsModified', this.markRightAsModified); }, beforeUnmount() { main_core_events.EventEmitter.unsubscribe('BX.UI.AccessRights.V2:addRight', this.addRight); main_core_events.EventEmitter.unsubscribe('BX.UI.AccessRights.V2:updateRightTitle', this.updateRightTitle); main_core_events.EventEmitter.unsubscribe('BX.UI.AccessRights.V2:updateRightSubtitle', this.updateRightSubtitle); main_core_events.EventEmitter.unsubscribe('BX.UI.AccessRights.V2:markRightAsModified', this.markRightAsModified); }, methods: { scrollToSection(sectionCode) { const section = this.$refs.sections.find(item => item.code === sectionCode); if (section) { scrollTo({ top: main_core.Dom.getPosition(section.$el).top - 155, behavior: 'smooth' }); } }, addRight(event) { const { guid, sectionCode, right } = event.data; if (!guid) { console.warn('ui.accessrights.v2: addRight: application guid should be passed in event data'); return; } if (guid === this.$store.getters['application/guid']) { this.$store.dispatch('accessRights/addRight', { sectionCode, right }); } }, updateRightTitle(event) { const { guid, sectionCode, rightId, rightTitle } = event.data; if (!guid) { console.warn('ui.accessrights.v2: updateRightTitle: application guid should be passed in event data'); return; } if (guid === this.$store.getters['application/guid']) { this.$store.dispatch('accessRights/updateRightTitle', { sectionCode, rightId, rightTitle }); } }, updateRightSubtitle(event) { const { guid, sectionCode, rightId, rightSubtitle } = event.data; if (!guid) { console.warn('ui.accessrights.v2: updateRightSubtitle: application guid should be passed in event data'); return; } if (guid === this.$store.getters['application/guid']) { this.$store.dispatch('accessRights/updateRightSubtitle', { sectionCode, rightId, rightSubtitle }); } }, markRightAsModified(event) { const { guid, sectionCode, rightId, isModified } = event.data; if (!guid) { console.warn('ui.accessrights.v2: markRightAsModified: application guid should be passed in event data'); return; } if (guid === this.$store.getters['application/guid']) { this.$store.dispatch('accessRights/markRightAsModified', { sectionCode, rightId, isModified }); } } }, template: ` <Teleport v-if="searchContainerSelector" :to="searchContainerSelector"> <SearchBox/> </Teleport> <div ref="container" class='ui-access-rights-v2' :class="{ 'ui-access-rights-v2-block': isSaving, }"> <Header :user-groups="shownUserGroups"/> <Section v-for="[sectionCode, accessRightSection] in shownSections" :key="sectionCode" :code="accessRightSection.sectionCode" :is-expanded="accessRightSection.isExpanded" :title="accessRightSection.sectionTitle" :sub-title="accessRightSection.sectionSubTitle" :hint="accessRightSection.sectionHint" :icon="accessRightSection.sectionIcon" :rights="accessRightSection.rights" :action="accessRightSection.action" :user-groups="shownUserGroups" ref="sections" /> </div> ` }; var _store = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("store"); var _data = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("data"); var _isEnabled = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isEnabled"); var _isCancelAlreadyRegistered = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isCancelAlreadyRegistered"); var _analyzeRoles = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("analyzeRoles"); var _isUserGroupEdited = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isUserGroupEdited"); var _getSaveErrorStatus = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getSaveErrorStatus"); var _registerRoleCreateEvent = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("registerRoleCreateEvent"); var _registerRoleEditEvent = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("registerRoleEditEvent"); var _registerRoleDeleteEvent = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("registerRoleDeleteEvent"); var _appendRoleCountView = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("appendRoleCountView"); var _appendP = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("appendP"); class AnalyticsManager { constructor(store, analyticsData) { Object.defineProperty(this, _appendP, { value: _appendP2 }); Object.defineProperty(this, _appendRoleCountView, { value: _appendRoleCountView2 }); Object.defineProperty(this, _registerRoleDeleteEvent, { value: _registerRoleDeleteEvent2 }); Object.defineProperty(this, _registerRoleEditEvent, { value: _registerRoleEditEvent2 }); Object.defineProperty(this, _registerRoleCreateEvent, { value: _registerRoleCreateEvent2 }); Object.defineProperty(this, _getSaveErrorStatus, { value: _getSaveErrorStatus2 }); Object.defineProperty(this, _isUserGroupEdited, { value: _isUserGroupEdited2 }); Object.defineProperty(this, _analyzeRoles, { value: _analyzeRoles2 }); Object.defineProperty(this, _store, { writable: true, value: void 0 }); Object.defineProperty(this, _data, { writable: true, value: void 0 }); Object.defineProperty(this, _isEnabled, { writable: true, value: void 0 }); Object.defineProperty(this, _isCancelAlreadyRegistered, { writable: true, value: false }); babelHelpers.classPrivateFieldLooseBase(this, _store)[_store] = store; babelHelpers.classPrivateFieldLooseBase(this, _data)[_data] = analyticsData; // check 2 out of 3 required fields // 'event' field is provided by AnalyticsManager babelHelpers.classPrivateFieldLooseBase(this, _isEnabled)[_isEnabled] = Object.hasOwn(babelHelpers.classPrivateFieldLooseBase(this, _data)[_data], 'tool') && Object.hasOwn(babelHelpers.classPrivateFieldLooseBase(this, _data)[_data], 'category'); } onSaveAttempt() { if (!babelHelpers.classPrivateFieldLooseBase(this, _isEnabled)[_isEnabled]) { return; } const { createdRoles, editedRoles, deletedRoles } = babelHelpers.classPrivateFieldLooseBase(this, _analyzeRoles)[_analyzeRoles](); for (let i = 0; i < createdRoles; i++) { babelHelpers.classPrivateFieldLooseBase(this, _registerRoleCreateEvent)[_registerRoleCreateEvent]('attempt'); } for (let i = 0; i < editedRoles; i++) { babelHelpers.classPrivateFieldLooseBase(this, _registerRoleEditEvent)[_registerRoleEditEvent]('attempt'); } for (let i = 0; i < deletedRoles; i++) { babelHelpers.classPrivateFieldLooseBase(this, _registerRoleDeleteEvent)[_registerRoleDeleteEvent]('attempt'); } } onSaveSuccess() { if (!babelHelpers.classPrivateFieldLooseBase(this, _isEnabled)[_isEnabled]) { return; } const { createdRoles, editedRoles, deletedRoles } = babelHelpers.classPrivateFieldLooseBase(this, _analyzeRoles)[_analyzeRoles](); for (let i = 0; i < createdRoles; i++) { babelHelpers.classPrivateFieldLooseBase(this, _registerRoleCreateEvent)[_registerRoleCreateEvent]('success'); } for (let i = 0; i < editedRoles; i++) { babelHelpers.classPrivateFieldLooseBase(this, _registerRoleEditEvent)[_registerRoleEditEvent]('success'); } for (let i = 0; i < deletedRoles; i++) { babelHelpers.classPrivateFieldLooseBase(this, _registerRoleDeleteEvent)[_registerRoleDeleteEvent]('success'); } } onSaveError(response) { if (!babelHelpers.classPrivateFieldLooseBase(this, _isEnabled)[_isEnabled]) { return; } const status = babelHelpers.classPrivateFieldLooseBase(this, _getSaveErrorStatus)[_getSaveErrorStatus](response); const { createdRoles, editedRoles, deletedRoles } = babelHelpers.classPrivateFieldLooseBase(this, _analyzeRoles)[_analyzeRoles](); for (let i = 0; i < createdRoles; i++) { babelHelpers.classPrivateFieldLooseBase(this, _registerRoleCreateEvent)[_registerRoleCreateEvent](status); } for (let i = 0; i < editedRoles; i++) { babelHelpers.classPrivateFieldLooseBase(this, _registerRoleEditEvent)[_registerRoleEditEvent](status); } for (let i = 0; i < deletedRoles; i++) { babelHelpers.classPrivateFieldLooseBase(this, _registerRoleDeleteEvent)[_registerRoleDeleteEvent](status); } } onCancelChanges() { if (!babelHelpers.classPrivateFieldLooseBase(this, _isEnabled)[_isEnabled]) { return; } if (babelHelpers.classPrivateFieldLooseBase(this, _isCancelAlreadyRegistered)[_isCancelAlreadyRegistered]) { return; } ui_analytics.sendData({ ...babelHelpers.classPrivateFieldLooseBase(this, _data)[_data], event: 'settings_cancel' }); babelHelpers.classPrivateFieldLooseBase(this, _isCancelAlreadyRegistered)[_isCancelAlreadyRegistered] = true; } onCloseWithoutSave() { if (!babelHelpers.classPrivateFieldLooseBase(this, _isEnabled)[_isEnabled]) { return; } ui_analytics.sendData({ ...babelHelpers.classPrivateFieldLooseBase(this, _data)[_data], event: 'settings_pop_cancel' }); } } function _analyzeRoles2() { const result = { createdRoles: 0, editedRoles: 0, deletedRoles: babelHelpers.classPrivateFieldLooseBase(this, _store)[_store].state.userGroups.deleted.size }; for (const userGroup of babelHelpers.classPrivateFieldLooseBase(this, _store)[_store].state.userGroups.collection.values()) { if (userGroup.isNew) { result.createdRoles++; } else if (babelHelpers.classPrivateFieldLooseBase(this, _isUserGroupEdited)[_isUserGroupEdited](userGroup)) { result.editedRoles++; } } return result; } function _isUserGroupEdited2(userGroup) { if (userGroup.isModified) { return true; } for (const value of userGroup.accessRights.values()) { if (value.isModified) { return true; } } return false; } function _getSaveErrorStatus2(response) { if (!main_core.Type.isArrayFilled(response == null ? void 0 : response.errors)) { return 'error'; } for (const error of response.errors) { if (main_core.Type.isStringFilled(error == null ? void 0 : error.code)) { return `error_${main_core.Text.toCamelCase(error.code)}`; } } return 'error'; } function _registerRoleCreateEvent2(status) { const data = { ...babelHelpers.classPrivateFieldLooseBase(this, _data)[_data], event: 'role_create', status }; babelHelpers.classPrivateFieldLooseBase(this, _appendRoleCountView)[_appendRoleCountView](data); ui_analytics.sendData(data); } function _registerRoleEditEvent2(status) { const data = { ...babelHelpers.classPrivateFieldLooseBase(this, _data)[_data], event: 'role_edit', status }; babelHelpers.classPrivateFieldLooseBase(this, _appendRoleCountView)[_appendRoleCountView](data); ui_analytics.sendData(data); } function _registerRoleDeleteEvent2(status) { const data = { ...babelHelpers.classPrivateFieldLooseBase(this, _data)[_data], event: 'role_delete', status }; babelHelpers.classPrivateFieldLooseBase(this, _appendRoleCountView)[_appendRoleCountView](data); ui_analytics.sendData(data); } function _appendRoleCountView2(data) { babelHelpers.classPrivateFieldLooseBase(this, _appendP)[_appendP](data, 'roleCountView', babelHelpers.classPrivateFieldLooseBase(this, _store)[_store].getters['userGroups/shown'].size); } function _appendP2(data, name, value) { for (const pName of ['p1', 'p2', 'p3', 'p4', 'p5']) { if (!Object.hasOwn(data, pName)) { // eslint-disable-next-line no-param-reassign data[pName] = `${name}_${value}`; return; } } } const ACTION_SAVE = 'save'; const MODE = 'ajax'; const BODY_TYPE = 'data'; var _guid = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("guid"); var _options = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("options"); class ApplicationModel extends ui_vue3_vuex.BuilderModel { constructor(...args) { super(...args); Object.defineProperty(this, _guid, { writable: true, value: void 0 }); Object.defineProperty(this, _options, { writable: true, value: void 0 }); } getName() { return 'application'; } setOptions(options) { babelHelpers.classPrivateFieldLooseBase(this, _options)[_options] = options; return this; } setGuid(guid) { babelHelpers.classPrivateFieldLooseBase(this, _guid)[_guid] = guid; return this; } getState() { return { options: babelHelpers.classPrivateFieldLooseBase(this, _options)[_options], guid: babelHelpers.classPrivateFieldLooseBase(this, _guid)[_guid], isSaving: false }; } getGetters() { return { isMaxVisibleUserGroupsSet: state => { return state.options.maxVisibleUserGroups > 0; }, isModified: (state, getters, rootState, rootGetters) => { return rootGetters['userGroups/isModified'] || rootGetters['accessRights/isModified']; }, guid: state => { return state.guid; } }; } getMutations() { return { setSaving: (state, isSaving) => { // eslint-disable-next-line no-param-reassign state.isSaving = Boolean(isSaving); } }; } } const NEW_USER_GROUP_ID_PREFIX = 'new~~~'; var _initialUserGroups = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("initialUserGroups"); var _setAccessRightValuesAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setAccessRightValuesAction"); var _setAccessRightValuesForShownAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setAccessRightValuesForShownAction"); var _setMinAccessRightValuesAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setMinAccessRightValuesAction"); var _setMinAccessRightValuesInSectionAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setMinAccessRightValuesInSectionAction"); var _setMinAccessRightValuesForRight = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setMinAccessRightValuesForRight"); var _getMinValueForColumnAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getMinValueForColumnAction"); var _getMinValue = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getMinValue"); var _setMaxAccessRightValuesAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setMaxAccessRightValuesAction"); var _setMaxAccessRightValuesInSectionAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setMaxAccessRightValuesInSectionAction"); var _setMaxAccessRightValuesForRight = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setMaxAccessRightValuesForRight"); var _getMaxValueForColumnAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getMaxValueForColumnAction"); var _getMaxValue = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getMaxValue"); var _copySectionValuesAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("copySectionValuesAction"); var _setRoleTitleAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setRoleTitleAction"); var _addMemberAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("addMemberAction"); var _removeMemberAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("removeMemberAction"); var _copyUserGroupAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("copyUserGroupAction"); var _addUserGroupAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("addUserGroupAction"); var _removeUserGroupAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("removeUserGroupAction"); var _showUserGroupAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("showUserGroupAction"); var _hideUserGroupAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("hideUserGroupAction"); var _isUserGroupExists = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isUserGroupExists"); var _getUserGroup = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getUserGroup"); var _isValueExistsInStructure = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isValueExistsInStructure"); var _deleteRightAction = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("deleteRightAction"); var _isValueModified = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isValueModified"); var _isSetsEqual = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isSetsEqual"); var _isUserGroupModified = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isUserGroupModified"); class UserGroupsModel extends ui_vue3_vuex.BuilderModel { constructor(...args) { super(...args); Object.defineProperty(this, _isUserGroupModified, { value: _isUserGroupModified2 }); Object.defineProperty(this, _isSetsEqual, { value: _isSetsEqual2 }); Object.defineProperty(this, _isValueModified, { value: _isValueModified2 }); Object.defineProperty(this, _deleteRightAction, { value: _deleteRightAction2 }); Object.defineProperty(this, _isValueExistsInStructure, { value: _isValueExistsInStructure2 }); Object.defineProperty(this, _getUserGroup, { value: _getUserGroup2 }); Object.defineProperty(this, _isUserGroupExists, { value: _isUserGroupExists2 }); Object.defineProperty(this, _hideUserGroupAction, { value: _hideUserGroupAction2 }); Object.defineProperty(this, _showUserGroupAction, { value: _showUserGroupAction2 }); Object.defineProperty(this, _removeUserGroupAction, { value: _removeUserGroupAction2 }); Object.defineProperty(this, _addUserGroupAction, { value: _addUserGroupAction2 }); Object.defineProperty(this, _copyUserGroupAction, { value: _copyUserGroupAction2 }); Object.defineProperty(this, _removeMemberAction, { value: _removeMemberAction2 }); Object.defineProperty(this, _addMemberAction, { value: _addMemberAction2 }); Object.defineProperty(this, _setRoleTitleAction, { value: _setRoleTitleAction2 }); Object.defineProperty(this, _copySectionValuesAction, { value: _copySectionValuesAction2 }); Object.defineProperty(this, _getMaxValue, { value: _getMaxValue2 }); Object.defineProperty(this, _getMaxValueForColumnAction, { value: _getMaxValueForColumnAction2 }); Object.defineProperty(this, _setMaxAccessRightValuesForRight, { value: _setMaxAccessRightValuesForRight2 }); Object.defineProperty(this, _setMaxAccessRightValuesInSectionAction, { value: _setMaxAccessRightValuesInSectionAction2 }); Object.defineProperty(this, _setMaxAccessRightValuesAction, { value: _setMaxAccessRightValuesAction2 }); Object.defineProperty(this, _getMinValue, { value: _getMinValue2 }); Object.defineProperty(this, _getMinValueForColumnAction, { value: _getMinValueForColumnAction2 }); Object.defineProperty(this, _setMinAccessRightValuesForRight, { value: _setMinAccessRightValuesForRight2 }); Object.defineProperty(this, _setMinAccessRightValuesInSectionAction, { value: _setMinAccessRightValuesInSectionAction2 }); Object.defineProperty(this, _setMinAccessRightValuesAction, { value: _setMinAccessRightValuesAction2 }); Object.defineProperty(this, _setAccessRightValuesForShownAction, { value: _setAccessRightValuesForShownAction2 }); Object.defineProperty(this, _setAccessRightValuesAction, { value: _setAccessRightValuesAction2 }); Object.defineProperty(this, _initialUserGroups, { writable: true, value: new Map() }); } getName() { return 'userGroups'; } setInitialUserGroups(groups) { babelHelpers.classPrivateFieldLooseBase(this, _initialUserGroups)[_initialUserGroups] = groups; return this; } getState() { return { collection: main_core.Runtime.clone(babelHelpers.classPrivateFieldLooseBase(this, _initialUserGroups)[_initialUserGroups]), deleted: new Set() }; } getElementState(params = {}) { return { id: `${NEW_USER_GROUP_ID_PREFIX}${main_core.Text.getRandom()}`, isNew: true, isModified: true, isShown: true, title: main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLE_NAME'), accessRights: new Map(), members: new Map() }; } getGetters() { return { shown: state => { const result = new Map(); for (const [userGroupId, userGroup] of state.collection) { if (userGroup.isShown) { result.set(userGroupId, userGroup); } } return result; }, getEmptyAccessRightValue: (state, getters, rootState, rootGetters) => (userGroupId, sectionCode, valueId) => { const values = rootGetters['accessRights/getEmptyValue'](sectionCode, valueId); return { id: valueId, values, isModified: state.collection.get(userGroupId).isNew }; }, defaultAccessRightValues: (state, getters, rootState) => { const result = new Map(); for (const section of rootState.accessRights.collection.values()) { for (const [rightId, right] of section.rights) { if (main_core.Type.isNil(right.defaultValue)) { continue; } result.set(rightId, { id: rightId, values: right.defaultValue, isModified: true }); } } return result; }, isModified: state => { if (state.deleted.size > 0) { return true; } for (const userGroup of state.collection.values()) { if (userGroup.isNew || userGroup.isModified) { return true; } for (const value of userGroup.accessRights.values()) { if (value.isModified) { return true; } } } return false; }, isMaxVisibleUserGroupsReached: (state, getters, rootState, rootGetters) => { if (!rootGetters['application/isMaxVisibleUserGroupsSet']) { return false; } return getters.shown.size >= rootState.application.options.maxVisibleUserGroups; } }; } getActions() { return { setAccessRightValues: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _setAccessRightValuesAction)[_setAccessRightValuesAction](store, payload); }, setAccessRightValuesForShown: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _setAccessRightValuesForShownAction)[_setAccessRightValuesForShownAction](store, payload); }, setMinAccessRightValues: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _setMinAccessRightValuesAction)[_setMinAccessRightValuesAction](store, payload); }, setMaxAccessRightValues: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _setMaxAccessRightValuesAction)[_setMaxAccessRightValuesAction](store, payload); }, setMinAccessRightValuesInSection: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _setMinAccessRightValuesInSectionAction)[_setMinAccessRightValuesInSectionAction](store, payload); }, setMaxAccessRightValuesInSection: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _setMaxAccessRightValuesInSectionAction)[_setMaxAccessRightValuesInSectionAction](store, payload); }, setMinAccessRightValuesForRight: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _setMinAccessRightValuesForRight)[_setMinAccessRightValuesForRight](store, payload); }, setMaxAccessRightValuesForRight: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _setMaxAccessRightValuesForRight)[_setMaxAccessRightValuesForRight](store, payload); }, setRoleTitle: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _setRoleTitleAction)[_setRoleTitleAction](store, payload); }, addMember: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _addMemberAction)[_addMemberAction](store, payload); }, removeMember: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _removeMemberAction)[_removeMemberAction](store, payload); }, copyUserGroup: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _copyUserGroupAction)[_copyUserGroupAction](store, payload); }, copySectionValues: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _copySectionValuesAction)[_copySectionValuesAction](store, payload); }, addUserGroup: store => { babelHelpers.classPrivateFieldLooseBase(this, _addUserGroupAction)[_addUserGroupAction](store); }, removeUserGroup: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _removeUserGroupAction)[_removeUserGroupAction](store, payload); }, showUserGroup: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _showUserGroupAction)[_showUserGroupAction](store, payload); }, hideUserGroup: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _hideUserGroupAction)[_hideUserGroupAction](store, payload); }, deleteRight: (store, payload) => { babelHelpers.classPrivateFieldLooseBase(this, _deleteRightAction)[_deleteRightAction](store, payload); } }; } getMutations() { return { setAccessRightValues: (state, { userGroupId, valueId, values, isModified }) => { const userGroup = babelHelpers.classPrivateFieldLooseBase(this, _getUserGroup)[_getUserGroup](state, userGroupId); const accessRightValue = userGroup.accessRights.get(valueId); if (!accessRightValue) { userGroup.accessRights.set(valueId, { id: valueId, values, isModified }); return; } accessRightValue.values = values; accessRightValue.isModified = isModified; }, setRoleTitle: (state, { userGroupId, title }) => { const userGroup = babelHelpers.classPrivateFieldLooseBase(this, _getUserGroup)[_getUserGroup](state, userGroupId); userGroup.title = title; userGroup.isModified = babelHelpers.classPrivateFieldLooseBase(this, _isUserGroupModified)[_isUserGroupModified](userGroup); }, addMember: (state, { userGroupId, accessCode, member }) => { const userGroup = babelHelpers.classPrivateFieldLooseBase(this, _getUserGroup)[_getUserGroup](state, userGroupId); userGroup.members.set(accessCode, member); userGroup.isModified = babelHelpers.classPrivateFieldLooseBase(this, _isUserGroupModified)[_isUserGroupModified](userGroup); }, removeMember: (state, { userGroupId, accessCode }) => { const userGroup = babelHelpers.classPrivateFieldLooseBase(this, _getUserGroup)[_getUserGroup](state, userGroupId); userGroup.members.delete(accessCode); userGroup.isModified = babelHelpers.classPrivateFieldLooseBase(this, _isUserGroupModified)[_isUserGroupModified](userGroup); }, addUserGroup: (state, { userGroup }) => { state.collection.set(userGroup.id, userGroup); }, removeUserGroup: (state, { userGroupId }) => { state.collection.delete(userGroupId); }, markUserGroupForDeletion: (state, { userGroupId }) => { state.deleted.add(userGroupId); }, showUserGroup: (state, { userGroupId }) => { // eslint-disable-next-line no-param-reassign state.collection.get(userGroupId).isShown = true; }, hideUserGroup: (state, { userGroupId }) => { // eslint-disable-next-line no-param-reassign state.collection.get(userGroupId).isShown = false; }, deleteRight: (state, { rightId }) => { for (const role of state.collection.values()) { if (role.accessRights.get(rightId)) { role.accessRights.delete(rightId); } } } }; } } function _setAccessRightValuesAction2(store, payload) { if (!main_core.Type.isSet(payload.values)) { console.warn('ui.accessrights.v2: Attempt to set not-Set values', payload); return; } if (!babelHelpers.classPrivateFieldLooseBase(this, _isUserGroupExists)[_isUserGroupExists](store, payload.userGroupId)) { console.warn('ui.accessrights.v2: Attempt to set value to a user group that dont exists', payload); return; } if (!babelHelpers.classPrivateFieldLooseBase(this, _isValueExistsInStructure)[_isValueExistsInStructure](store, payload.sectionCode, payload.valueId)) { console.warn('ui.accessrights.v2: Attempt to set value to a right that dont exists in structure', payload); return; } store.commit('setAccessRightValues', { userGroupId: payload.userGroupId, valueId: payload.valueId, values: payload.values, isModified: babelHelpers.classPrivateFieldLooseBase(this, _isValueModified)[_isValueModified](payload.userGroupId, payload.valueId, payload.values, store.rootGetters['accessRights/getEmptyValue'](payload.sectionCode, payload.valueId)) }); } function _setAccessRightValuesForShownAction2(store, payload) { for (const userGroupId of store.getters.shown.keys()) { void store.dispatch('setAccessRightValues', { ...payload, userGroupId }); } } function _setMinAccessRightValuesAction2(store, { userGroupId }) { for (const sectionCode of store.rootState.accessRights.collection.keys()) { void store.dispatch('setMinAccessRightValuesInSection', { userGroupId, sectionCode }); } void store.dispatch('accessRights/expandAllSections', null, { root: true }); } function _setMinAccessRightValuesInSectionAction2(store, { userGroupId, sectionCode }) { const section = store.rootState.accessRights.collection.get(sectionCode); if (!section) { console.warn('ui.accessrights.v2: attempt to set min values in section that dont exists', { sectionCode }); return; } for (const item of section.rights.values()) { const valueToSet = babelHelpers.classPrivateFieldLooseBase(this, _getMinValueForColumnAction)[_getMinValueForColumnAction](item, store.rootGetters['accessRights/getEmptyValue'](section.sectionCode, item.id)); if (main_core.Type.isNil(valueToSet)) { continue; } void store.dispatch('setAccessRightValues', { userGroupId, sectionCode: section.sectionCode, valueId: item.id, values: valueToSet }); } } function _setMinAccessRightValuesForRight2(store, { sectionCode, rightId }) { var _store$rootState$acce; const right = (_store$rootState$acce = store.rootState.accessRights.collection.get(sectionCode)) == null ? void 0 : _store$rootState$acce.rights.get(rightId); if (!right) { console.warn('ui.accessrights.v2: attempt to set min values for right that dont exists', { sectionCode, rightId }); return; } const valueToSet = babelHelpers.classPrivateFieldLooseBase(this, _getMinValue)[_getMinValue](right); if (main_core.Type.isNil(valueToSet)) { console.warn('ui.accessrights.v2: attempt to set min values for right that dont have min value set', { sectionCode, rightId }); return; } void store.dispatch('setAccessRightValuesForShown', { sectionCode, valueId: rightId, values: valueToSet }); } function _getMinValueForColumnAction2(item, emptyValue) { const setEmpty = main_core.Type.isBoolean(item.setEmptyOnSetMinMaxValueInColumn) && item.setEmptyOnSetMinMaxValueInColumn; if (setEmpty) { return emptyValue; } return babelHelpers.classPrivateFieldLooseBase(this, _getMinValue)[_getMinValue](item); } function _getMinValue2(item) { var _ServiceLocator$getVa; return (_ServiceLocator$getVa = ServiceLocator.getValueTypeByRight(item)) == null ? void 0 : _ServiceLocator$getVa.getMinValue(item); } function _setMaxAccessRightValuesAction2(store, { userGroupId }) { for (const sectionCode of store.rootState.accessRights.collection.keys()) { void store.dispatch('setMaxAccessRightValuesInSection', { userGroupId, sectionCode }); } void store.dispatch('accessRights/expandAllSections', null, { root: true }); } function _setMaxAccessRightValuesInSectionAction2(store, { userGroupId, sectionCode }) { const section = store.rootState.accessRights.collection.get(sectionCode); if (!section) { console.warn('ui.accessrights.v2: attempt to set max values in section that dont exists', { sectionCode }); return; } for (const item of section.rights.values()) { const valueToSet = babelHelpers.classPrivateFieldLooseBase(this, _getMaxValueForColumnAction)[_getMaxValueForColumnAction](item, store.rootGetters['accessRights/getEmptyValue'](section.sectionCode, item.id)); if (main_core.Type.isNil(valueToSet)) { continue; } void store.dispatch('setAccessRightValues', { userGroupId, sectionCode: section.sectionCode, valueId: item.id, values: valueToSet }); } } function _setMaxAccessRightValuesForRight2(store, { sectionCode, rightId }) { var _store$rootState$acce2; const right = (_store$rootState$acce2 = store.rootState.accessRights.collection.get(sectionCode)) == null ? void 0 : _store$rootState$acce2.rights.get(rightId); if (!right) { console.warn('ui.accessrights.v2: attempt to set max values for right that dont exists', { sectionCode, rightId }); return; } const valueToSet = babelHelpers.classPrivateFieldLooseBase(this, _getMaxValue)[_getMaxValue](right); if (main_core.Type.isNil(valueToSet)) { console.warn('ui.accessrights.v2: attempt to set max values for right that dont have max value set', { sectionCode, rightId }); return; } void store.dispatch('setAccessRightValuesForShown', { sectionCode, valueId: rightId, values: valueToSet }); } function _getMaxValueForColumnAction2(item, emptyValue) { const setEmpty = main_core.Type.isBoolean(item.setEmptyOnSetMinMaxValueInColumn) && item.setEmptyOnSetMinMaxValueInColumn; if (setEmpty) { return emptyValue; } return babelHelpers.classPrivateFieldLooseBase(this, _getMaxValue)[_getMaxValue](item); } function _getMaxValue2(item) { var _ServiceLocator$getVa2; return (_ServiceLocator$getVa2 = ServiceLocator.getValueTypeByRight(item)) == null ? void 0 : _ServiceLocator$getVa2.getMaxValue(item); } function _copySectionValuesAction2(store, payload) { const src = babelHelpers.classPrivateFieldLooseBase(this, _getUserGroup)[_getUserGroup](store.state, payload.srcUserGroupId); if (!src) { console.warn('ui.accessrights.v2: Attempt to copy values from user group that dont exists', payload); return; } const section = store.rootState.accessRights.collection.get(payload.sectionCode); if (!section) { console.warn('ui.accessrights.v2: Attempt to copy values for section that dont exists', payload); return; } for (const rightId of section.rights.keys()) { const value = src.accessRights.get(rightId); if (value) { void store.dispatch('setAccessRightValues', { userGroupId: payload.dstUserGroupId, sectionCode: section.sectionCode, valueId: value.id, values: value.values }); } else { const emptyValue = store.rootGetters['accessRights/getEmptyValue'](section.sectionCode, rightId); void store.dispatch('setAccessRightValues', { userGroupId: payload.dstUserGroupId, sectionCode: section.sectionCode, valueId: rightId, values: emptyValue }); } } } function _setRoleTitleAction2(store, payload) { if (!main_core.Type.isString(payload.title)) { console.warn('ui.accessrights.v2: Attempt to set role title with something other than string', payload); return; } if (!babelHelpers.classPrivateFieldLooseBase(this, _isUserGroupExists)[_isUserGroupExists](store, payload.userGroupId)) { console.warn('ui.accessrights.v2: Attempt to update user group that dont exists', payload); return; } store.commit('setRoleTitle', payload); } function _addMemberAction2(store, payload) { if (!babelHelpers.classPrivateFieldLooseBase(this, _isUserGroupExists)[_isUserGroupExists](store, payload.userGroupId)) { console.warn('ui.accessrights.v2: Attempt to add member to a user group that dont exists', payload); return; } if (!main_core.Type.isStringFilled(payload.accessCode) || !main_core.Type.isStringFilled(payload.member.id) || !main_core.Type.isStringFilled(payload.member.type) || !main_core.Type.isStringFilled(payload.member.name) || !(main_core.Type.isNil(payload.member.avatar) || main_core.Type.isStringFilled(payload.member.avatar))) { console.warn('ui.accessrights.v2: Attempt to add member with invalid payload', payload); return; } store.commit('addMember', payload); } function _removeMemberAction2(store, payload) { if (!babelHelpers.classPrivateFieldLooseBase(this, _isUserGroupExists)[_isUserGroupExists](store, payload.userGroupId)) { console.warn('ui.accessrights.v2: Attempt to remove member from a user group that dont exists', payload); return; } if (!main_core.Type.isStringFilled(payload.accessCode)) { console.warn('ui.accessrights.v2: Attempt to remove member with invalid payload', payload); return; } store.commit('removeMember', payload); } function _copyUserGroupAction2(store, { userGroupId }) { const sourceGroup = babelHelpers.classPrivateFieldLooseBase(this, _getUserGroup)[_getUserGroup](store.state, userGroupId); if (!sourceGroup) { console.warn('ui.accessrights.v2: Attempt to copy user group that dont exists', { userGroupId }); return; } const emptyGroup = this.getElementState(); const copy = { ...main_core.Runtime.clone(sourceGroup), id: emptyGroup.id, title: main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_COPIED_ROLE_NAME', { '#ORIGINAL#': sourceGroup.title }), isNew: true, isModified: true, isShown: true }; for (const value of copy.accessRights.values()) { // is a new group all values are modified value.isModified = true; } store.commit('addUserGroup', { userGroup: copy }); } function _addUserGroupAction2(store) { const newGroup = this.getElementState(); newGroup.accessRights = main_core.Runtime.clone(store.getters.defaultAccessRightValues); store.commit('addUserGroup', { userGroup: newGroup }); } function _removeUserGroupAction2(store, { userGroupId }) { const userGroup = babelHelpers.classPrivateFieldLooseBase(this, _getUserGroup)[_getUserGroup](store.state, userGroupId); if (!userGroup) { console.warn('ui.accessrights.v2: Attempt to remove user group that dont exists', { userGroupId }); return; } store.commit('removeUserGroup', { userGroupId }); if (!userGroup.isNew) { store.commit('markUserGroupForDeletion', { userGroupId }); } } function _showUserGroupAction2(store, { userGroupId }) { if (!babelHelpers.classPrivateFieldLooseBase(this, _isUserGroupExists)[_isUserGroupExists](store, userGroupId)) { console.warn('ui.accessrights.v2: Attempt to show user group that dont exists', { userGroupId }); return; } store.commit('showUserGroup', { userGroupId }); } function _hideUserGroupAction2(store, { userGroupId }) { if (!babelHelpers.classPrivateFieldLooseBase(this, _isUserGroupExists)[_isUserGroupExists](store, userGroupId)) { console.warn('ui.accessrights.v2: Attempt to shrink user group that dont exists', { userGroupId }); return; } store.commit('hideUserGroup', { userGroupId }); } function _isUserGroupExists2(store, userGroupId) { const group = babelHelpers.classPrivateFieldLooseBase(this, _getUserGroup)[_getUserGroup](store.state, userGroupId); return Boolean(group); } function _getUserGroup2(state, userGroupId) { return state.collection.get(userGroupId); } function _isValueExistsInStructure2(store, sectionCode, valueId) { const section = store.rootState.accessRights.collection.get(sectionCode); return section == null ? void 0 : section.rights.has(valueId); } function _deleteRightAction2(store, { rightId }) { store.commit('deleteRight', { rightId }); } function _isValueModified2(userGroupId, valueId, values, emptyValue) { var _initialGroup$accessR, _initialGroup$accessR2; const initialGroup = babelHelpers.classPrivateFieldLooseBase(this, _initialUserGroups)[_initialUserGroups].get(userGroupId); if (!initialGroup) { // its a newly created group, all values are modified return true; } const initialValues = (_initialGroup$accessR = (_initialGroup$accessR2 = initialGroup.accessRights.get(valueId)) == null ? void 0 : _initialGroup$accessR2.values) != null ? _initialGroup$accessR : emptyValue; // use native Sets instead of Vue-wrapped proxy-sets, they throw an error on `symmetricDifference` return !babelHelpers.classPrivateFieldLooseBase(this, _isSetsEqual)[_isSetsEqual](new Set(initialValues), new Set(values)); } function _isSetsEqual2(a, b) { if (main_core.Type.isFunction(a.symmetricDifference)) { // native way to compare sets for modern browsers return a.symmetricDifference(b).size === 0; } // polyfill if (a.size !== b.size) { return false; } for (const value of a) { if (!b.has(value)) { return false; } } for (const value of b) { if (!a.has(value)) { return false; } } return true; } function _isUserGroupModified2(userGroup) { if (userGroup.isNew) { return true; } const initialGroup = babelHelpers.classPrivateFieldLooseBase(this, _initialUserGroups)[_initialUserGroups].get(userGroup.id); if (!initialGroup) { throw new Error('ui.accessrights.v2: initial user group not found'); } if (userGroup.title !== initialGroup.title) { return true; } const initialAccessCodes = new Set(initialGroup.members.keys()); const currentAccessCodes = new Set(userGroup.members.keys()); return !babelHelpers.classPrivateFieldLooseBase(this, _isSetsEqual)[_isSetsEqual](initialAccessCodes, currentAccessCodes); } function createStore(options, userGroups, accessRights, appGuid) { const userGroupsModel = UserGroupsModel.create().setInitialUserGroups(userGroups); const accessRightsModel = AccessRightsModel.create().setInitialAccessRights(accessRights); const { store } = ui_vue3_vuex.Builder.init().addModel(ApplicationModel.create().setOptions(options).setGuid(appGuid)).addModel(accessRightsModel).addModel(userGroupsModel).syncBuild(); return { store, resetState: () => { userGroupsModel.clearState(); accessRightsModel.clearState(); main_core_events.EventEmitter.emit('BX.UI.AccessRights.V2:onResetState', { guid: appGuid }); }, userGroupsModel, accessRightsModel }; } class AccessRightsExporter { transform(source, appGuid) { const result = []; for (const accessRightSection of source.values()) { for (const accessRight of accessRightSection.rights.values()) { const data = { id: accessRight.id, name: accessRight.title, additionalRightData: {} }; const eventResults = main_core_events.EventEmitter.emit('BX.UI.AccessRights.V2:additionalRightData', { guid: appGuid, right: accessRight }); for (const eventResult of eventResults) { var _eventResult$getData; data.additionalRightData = { ...data.additionalRightData, ...((_eventResult$getData = eventResult.getData()) == null ? void 0 : _eventResult$getData.additionalRightData) }; } result.push(data); } } return result; } } var _transformAccessCodes = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("transformAccessCodes"); var _transformAccessRightValues = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("transformAccessRightValues"); /** * @abstract */ class BaseUserGroupsExporter { constructor() { Object.defineProperty(this, _transformAccessRightValues, { value: _transformAccessRightValues2 }); Object.defineProperty(this, _transformAccessCodes, { value: _transformAccessCodes2 }); } transform(source) { const result = []; for (const userGroup of source.values()) { result.push({ id: userGroup.id.startsWith(NEW_USER_GROUP_ID_PREFIX) ? '0' : userGroup.id, title: userGroup.title, accessCodes: babelHelpers.classPrivateFieldLooseBase(this, _transformAccessCodes)[_transformAccessCodes](userGroup.members), accessRights: babelHelpers.classPrivateFieldLooseBase(this, _transformAccessRightValues)[_transformAccessRightValues](userGroup) }); } return result; } /** * @abstract * @protected */ shouldBeIncludedInExport(userGroup, accessRightValue) { throw new Error('Not implemented'); } } function _transformAccessCodes2(members) { const result = {}; for (const [accessCode, member] of members) { result[accessCode] = member.type; } return result; } function _transformAccessRightValues2(userGroup) { const result = []; for (const accessRightValue of userGroup.accessRights.values()) { if (!this.shouldBeIncludedInExport(userGroup, accessRightValue)) { continue; } for (const singleValue of accessRightValue.values) { result.push({ id: accessRightValue.id, value: singleValue }); } } return result; } class AllUserGroupsExporter extends BaseUserGroupsExporter { shouldBeIncludedInExport(userGroup, accessRightValue) { return true; } } class OnlyChangedUserGroupsExporter extends BaseUserGroupsExporter { shouldBeIncludedInExport(userGroup, accessRightValue) { return userGroup.isNew || accessRightValue.isModified; } } var _deepFreeze = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("deepFreeze"); class ApplicationInternalizer { constructor() { Object.defineProperty(this, _deepFreeze, { value: _deepFreeze2 }); } // noinspection OverlyComplexFunctionJS transform(externalSource) { var _externalSource$addit, _externalSource$addit2, _externalSource$addit3, _externalSource$addit4, _externalSource$addit5, _externalSource$addit6; // freeze tells vue that we don't need reactivity on this state // and prevents accidental modification as well return babelHelpers.classPrivateFieldLooseBase(this, _deepFreeze)[_deepFreeze]({ component: String(externalSource.component), actionSave: main_core.Type.isStringFilled(externalSource.actionSave) ? externalSource.actionSave : ACTION_SAVE, mode: main_core.Type.isStringFilled(externalSource.mode) ? externalSource.mode : MODE, bodyType: main_core.Type.isStringFilled(externalSource.bodyType) ? externalSource.bodyType : BODY_TYPE, additionalSaveParams: main_core.Type.isPlainObject(externalSource.additionalSaveParams) ? externalSource.additionalSaveParams : null, isSaveOnlyChangedRights: main_core.Type.isBoolean(externalSource.isSaveOnlyChangedRights) ? externalSource.isSaveOnlyChangedRights : false, maxVisibleUserGroups: main_core.Type.isInteger(externalSource.maxVisibleUserGroups) ? externalSource.maxVisibleUserGroups : null, searchContainerSelector: main_core.Type.isStringFilled(externalSource.searchContainerSelector) ? externalSource.searchContainerSelector : null, additionalMembersParams: main_core.Type.isPlainObject(externalSource.additionalMembersParams) ? { addUserGroupsProviderTab: Boolean((_externalSource$addit = (_externalSource$addit2 = externalSource.additionalMembersParams) == null ? void 0 : _externalSource$addit2.addUserGroupsProviderTab) != null ? _externalSource$addit : false), addProjectsProviderTab: Boolean((_externalSource$addit3 = (_externalSource$addit4 = externalSource.additionalMembersParams) == null ? void 0 : _externalSource$addit4.addProjectsProviderTab) != null ? _externalSource$addit3 : true), addStructureTeamsProviderTab: Boolean((_externalSource$addit5 = (_externalSource$addit6 = externalSource.additionalMembersParams) == null ? void 0 : _externalSource$addit6.addStructureTeamsProviderTab) != null ? _externalSource$addit5 : false) } : { addUserGroupsProviderTab: false, addProjectsProviderTab: true, addStructureTeamsProviderTab: false }, isSaveAccessRightsList: main_core.Type.isBoolean(externalSource.isSaveAccessRightsList) ? externalSource.isSaveAccessRightsList : false }); } } function _deepFreeze2(target) { if (main_core.Type.isObject(target)) { Object.values(target).forEach(value => { babelHelpers.classPrivateFieldLooseBase(this, _deepFreeze)[_deepFreeze](value); }); return Object.freeze(target); } return target; } var _maxVisibleUserGroups = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("maxVisibleUserGroups"); var _internalizeExternalGroup = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("internalizeExternalGroup"); var _internalizeExternalAccessRightsValue = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("internalizeExternalAccessRightsValue"); var _internalizeExternalAccessCode = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("internalizeExternalAccessCode"); var _internalizeExternalMember = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("internalizeExternalMember"); class UserGroupsInternalizer { constructor(maxVisibleUserGroups) { Object.defineProperty(this, _internalizeExternalMember, { value: _internalizeExternalMember2 }); Object.defineProperty(this, _internalizeExternalAccessCode, { value: _internalizeExternalAccessCode2 }); Object.defineProperty(this, _internalizeExternalAccessRightsValue, { value: _internalizeExternalAccessRightsValue2 }); Object.defineProperty(this, _internalizeExternalGroup, { value: _internalizeExternalGroup2 }); Object.defineProperty(this, _maxVisibleUserGroups, { writable: true, value: null }); if (main_core.Type.isInteger(maxVisibleUserGroups)) { babelHelpers.classPrivateFieldLooseBase(this, _maxVisibleUserGroups)[_maxVisibleUserGroups] = maxVisibleUserGroups; } } transform(externalSource) { const result = new Map(); for (const externalGroup of externalSource) { const internalGroup = babelHelpers.classPrivateFieldLooseBase(this, _internalizeExternalGroup)[_internalizeExternalGroup](externalGroup); if (babelHelpers.classPrivateFieldLooseBase(this, _maxVisibleUserGroups)[_maxVisibleUserGroups] > 0 && result.size >= babelHelpers.classPrivateFieldLooseBase(this, _maxVisibleUserGroups)[_maxVisibleUserGroups]) { internalGroup.isShown = false; } result.set(internalGroup.id, internalGroup); } return result; } } function _internalizeExternalGroup2(externalGroup) { const internalizedGroup = { id: String(externalGroup.id), isNew: false, isModified: false, isShown: true, title: String(externalGroup.title), accessRights: new Map(), members: new Map() }; for (const externalValue of externalGroup.accessRights) { const internalizedValue = babelHelpers.classPrivateFieldLooseBase(this, _internalizeExternalAccessRightsValue)[_internalizeExternalAccessRightsValue](externalValue); if (internalizedGroup.accessRights.has(internalizedValue.id)) { for (const previousValue of internalizedGroup.accessRights.get(internalizedValue.id).values) { internalizedValue.values.add(previousValue); } } internalizedGroup.accessRights.set(internalizedValue.id, internalizedValue); } for (const [accessCode, externalMember] of Object.entries(externalGroup.members)) { const internalizedAccessCode = babelHelpers.classPrivateFieldLooseBase(this, _internalizeExternalAccessCode)[_internalizeExternalAccessCode](accessCode); internalizedGroup.members.set(internalizedAccessCode, babelHelpers.classPrivateFieldLooseBase(this, _internalizeExternalMember)[_internalizeExternalMember](externalMember)); } return internalizedGroup; } function _internalizeExternalAccessRightsValue2(externalAccessRightsValue) { const valueId = String(externalAccessRightsValue.id); const internalized = { id: valueId, isModified: false }; const values = main_core.Type.isArray(externalAccessRightsValue.value) ? externalAccessRightsValue.value : [externalAccessRightsValue.value]; internalized.values = new Set(values.map(x => String(x))); return internalized; } function _internalizeExternalAccessCode2(accessCode) { let stringAccessCode = String(accessCode); if (/^IU(\d+)$/.test(stringAccessCode)) { // `IU` and `U` are basically the same in this extension. differentiation between them is not supported // for data consistency, force `U` stringAccessCode = stringAccessCode.replace('IU', 'U'); } return stringAccessCode; } function _internalizeExternalMember2(externalMember) { return { type: String(externalMember.type), id: String(externalMember.id), name: String(externalMember.name), avatar: main_core.Type.isStringFilled(externalMember.avatar) ? externalMember.avatar : null }; } var _srcUserGroups = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("srcUserGroups"); var _maxVisibleUserGroups$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("maxVisibleUserGroups"); var _ensureThatNoMoreUserGroupsThanMaxIsShown = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("ensureThatNoMoreUserGroupsThanMaxIsShown"); class ShownUserGroupsCopier { constructor(srcUserGroups, maxVisibleUserGroups) { Object.defineProperty(this, _ensureThatNoMoreUserGroupsThanMaxIsShown, { value: _ensureThatNoMoreUserGroupsThanMaxIsShown2 }); Object.defineProperty(this, _srcUserGroups, { writable: true, value: void 0 }); Object.defineProperty(this, _maxVisibleUserGroups$1, { writable: true, value: null }); babelHelpers.classPrivateFieldLooseBase(this, _srcUserGroups)[_srcUserGroups] = srcUserGroups; if (main_core.Type.isInteger(maxVisibleUserGroups)) { babelHelpers.classPrivateFieldLooseBase(this, _maxVisibleUserGroups$1)[_maxVisibleUserGroups$1] = maxVisibleUserGroups; } } /** * WARNING! Mutates `externalSource`. Src is not copied for perf reasons, since we don't need it functionally */ transform(externalSource) { for (const [userGroupId, userGroup] of externalSource) { const srcUserGroup = babelHelpers.classPrivateFieldLooseBase(this, _srcUserGroups)[_srcUserGroups].get(userGroupId); if (srcUserGroup) { userGroup.isShown = srcUserGroup.isShown; } else { // likely it's a just created user group userGroup.isShown = true; } } if (babelHelpers.classPrivateFieldLooseBase(this, _maxVisibleUserGroups$1)[_maxVisibleUserGroups$1] > 0) { babelHelpers.classPrivateFieldLooseBase(this, _ensureThatNoMoreUserGroupsThanMaxIsShown)[_ensureThatNoMoreUserGroupsThanMaxIsShown](externalSource); } return externalSource; } } function _ensureThatNoMoreUserGroupsThanMaxIsShown2(userGroups) { let shownCount = 0; for (const userGroup of userGroups.values()) { if (!userGroup.isShown) { continue; } shownCount++; if (shownCount > babelHelpers.classPrivateFieldLooseBase(this, _maxVisibleUserGroups$1)[_maxVisibleUserGroups$1]) { userGroup.isShown = false; } } } var _options$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("options"); var _renderTo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("renderTo"); var _buttonPanel = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("buttonPanel"); var _guid$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("guid"); var _isUserConfirmedClose = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isUserConfirmedClose"); var _handleSliderClose = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("handleSliderClose"); var _app = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("app"); var _rootComponent = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("rootComponent"); var _store$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("store"); var _resetState = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("resetState"); var _unwatch = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("unwatch"); var _userGroupsModel = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("userGroupsModel"); var _accessRightsModel = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("accessRightsModel"); var _analyticsManager = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("analyticsManager"); var _bindEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("bindEvents"); var _unbindEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("unbindEvents"); var _tryShowFeaturePromoter = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("tryShowFeaturePromoter"); var _showNotification = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("showNotification"); var _runSaveAjaxRequest = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("runSaveAjaxRequest"); var _confirmBeforeClosingModifiedSlider = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("confirmBeforeClosingModifiedSlider"); /** * @memberOf BX.UI.AccessRights.V2 */ class App { constructor(options) { Object.defineProperty(this, _confirmBeforeClosingModifiedSlider, { value: _confirmBeforeClosingModifiedSlider2 }); Object.defineProperty(this, _runSaveAjaxRequest, { value: _runSaveAjaxRequest2 }); Object.defineProperty(this, _showNotification, { value: _showNotification2 }); Object.defineProperty(this, _tryShowFeaturePromoter, { value: _tryShowFeaturePromoter2 }); Object.defineProperty(this, _unbindEvents, { value: _unbindEvents2 }); Object.defineProperty(this, _bindEvents, { value: _bindEvents2 }); Object.defineProperty(this, _options$1, { writable: true, value: {} }); Object.defineProperty(this, _renderTo, { writable: true, value: void 0 }); Object.defineProperty(this, _buttonPanel, { writable: true, value: void 0 }); Object.defineProperty(this, _guid$1, { writable: true, value: void 0 }); Object.defineProperty(this, _isUserConfirmedClose, { writable: true, value: false }); Object.defineProperty(this, _handleSliderClose, { writable: true, value: void 0 }); Object.defineProperty(this, _app, { writable: true, value: void 0 }); Object.defineProperty(this, _rootComponent, { writable: true, value: void 0 }); Object.defineProperty(this, _store$1, { writable: true, value: void 0 }); Object.defineProperty(this, _resetState, { writable: true, value: void 0 }); Object.defineProperty(this, _unwatch, { writable: true, value: void 0 }); Object.defineProperty(this, _userGroupsModel, { writable: true, value: void 0 }); Object.defineProperty(this, _accessRightsModel, { writable: true, value: void 0 }); Object.defineProperty(this, _analyticsManager, { writable: true, value: void 0 }); babelHelpers.classPrivateFieldLooseBase(this, _options$1)[_options$1] = options || {}; babelHelpers.classPrivateFieldLooseBase(this, _renderTo)[_renderTo] = babelHelpers.classPrivateFieldLooseBase(this, _options$1)[_options$1].renderTo; babelHelpers.classPrivateFieldLooseBase(this, _buttonPanel)[_buttonPanel] = BX.UI.ButtonPanel || null; babelHelpers.classPrivateFieldLooseBase(this, _guid$1)[_guid$1] = main_core.Text.getRandom(16); babelHelpers.classPrivateFieldLooseBase(this, _bindEvents)[_bindEvents](); } fireEventReset() { const box = ui_dialogs_messagebox.MessageBox.create({ message: main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_MODIFIED_CANCEL_WARNING'), modal: true, buttons: [new ui_buttons.Button({ color: ui_buttons.ButtonColor.PRIMARY, size: ui_buttons.ButtonSize.SMALL, text: main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_MODIFIED_CANCEL_YES_CANCEL'), onclick: () => { babelHelpers.classPrivateFieldLooseBase(this, _analyticsManager)[_analyticsManager].onCancelChanges(); babelHelpers.classPrivateFieldLooseBase(this, _resetState)[_resetState](); box.close(); } }), new ui_buttons.Button({ color: ui_buttons.ButtonColor.LINK, size: ui_buttons.ButtonSize.SMALL, text: main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_MODIFIED_CANCEL_NO_CANCEL'), onclick: () => { box.close(); } })] }); box.show(); } sendActionRequest() { return new Promise((resolve, reject) => { if (babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.application.isSaving || !babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].getters['application/isModified']) { resolve(); return; } babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].commit('application/setSaving', true); babelHelpers.classPrivateFieldLooseBase(this, _analyticsManager)[_analyticsManager].onSaveAttempt(); babelHelpers.classPrivateFieldLooseBase(this, _runSaveAjaxRequest)[_runSaveAjaxRequest]().then(({ userGroups, accessRights }) => { babelHelpers.classPrivateFieldLooseBase(this, _analyticsManager)[_analyticsManager].onSaveSuccess(); babelHelpers.classPrivateFieldLooseBase(this, _userGroupsModel)[_userGroupsModel].setInitialUserGroups(userGroups); if (accessRights) { babelHelpers.classPrivateFieldLooseBase(this, _accessRightsModel)[_accessRightsModel].setInitialAccessRights(accessRights); } const guid = babelHelpers.classPrivateFieldLooseBase(this, _guid$1)[_guid$1]; main_core_events.EventEmitter.emit('BX.UI.AccessRights.V2:afterSave', { userGroups, accessRights, guid }); // reset modification flags and stuff babelHelpers.classPrivateFieldLooseBase(this, _resetState)[_resetState](); babelHelpers.classPrivateFieldLooseBase(this, _showNotification)[_showNotification](main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_SETTINGS_HAVE_BEEN_SAVED')); }).catch(response => { var _response$errors, _response$errors$; babelHelpers.classPrivateFieldLooseBase(this, _analyticsManager)[_analyticsManager].onSaveError(response); console.warn('ui.accessrights.v2: error during save', response); if (babelHelpers.classPrivateFieldLooseBase(this, _tryShowFeaturePromoter)[_tryShowFeaturePromoter](response)) { reject(response); return; } babelHelpers.classPrivateFieldLooseBase(this, _showNotification)[_showNotification]((response == null ? void 0 : (_response$errors = response.errors) == null ? void 0 : (_response$errors$ = _response$errors[0]) == null ? void 0 : _response$errors$.message) || 'Something went wrong'); main_core_events.EventEmitter.emit('ui:accessRights:v2:onSaveError', { response }); reject(response); }).finally(() => { var _babelHelpers$classPr; const waitContainer = (_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _buttonPanel)[_buttonPanel]) == null ? void 0 : _babelHelpers$classPr.getContainer().querySelector('.ui-btn-wait'); main_core.Dom.removeClass(waitContainer, 'ui-btn-wait'); babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].commit('application/setSaving', false); resolve(); }); }); } draw() { const applicationOptions = new ApplicationInternalizer().transform(babelHelpers.classPrivateFieldLooseBase(this, _options$1)[_options$1]); const { store, resetState, userGroupsModel, accessRightsModel } = createStore(applicationOptions, new UserGroupsInternalizer(applicationOptions.maxVisibleUserGroups).transform(babelHelpers.classPrivateFieldLooseBase(this, _options$1)[_options$1].userGroups), new AccessRightsInternalizer().transform(babelHelpers.classPrivateFieldLooseBase(this, _options$1)[_options$1].accessRights), babelHelpers.classPrivateFieldLooseBase(this, _guid$1)[_guid$1]); babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1] = store; babelHelpers.classPrivateFieldLooseBase(this, _resetState)[_resetState] = resetState; babelHelpers.classPrivateFieldLooseBase(this, _userGroupsModel)[_userGroupsModel] = userGroupsModel; babelHelpers.classPrivateFieldLooseBase(this, _accessRightsModel)[_accessRightsModel] = accessRightsModel; babelHelpers.classPrivateFieldLooseBase(this, _unwatch)[_unwatch] = babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].watch((state, getters) => getters['application/isModified'], newValue => { if (newValue) { var _babelHelpers$classPr2; (_babelHelpers$classPr2 = babelHelpers.classPrivateFieldLooseBase(this, _buttonPanel)[_buttonPanel]) == null ? void 0 : _babelHelpers$classPr2.show(); } else { var _babelHelpers$classPr3; (_babelHelpers$classPr3 = babelHelpers.classPrivateFieldLooseBase(this, _buttonPanel)[_buttonPanel]) == null ? void 0 : _babelHelpers$classPr3.hide(); } }); babelHelpers.classPrivateFieldLooseBase(this, _app)[_app] = ui_vue3.BitrixVue.createApp(Grid); babelHelpers.classPrivateFieldLooseBase(this, _app)[_app].use(babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1]); main_core.Dom.clean(babelHelpers.classPrivateFieldLooseBase(this, _renderTo)[_renderTo]); babelHelpers.classPrivateFieldLooseBase(this, _rootComponent)[_rootComponent] = babelHelpers.classPrivateFieldLooseBase(this, _app)[_app].mount(babelHelpers.classPrivateFieldLooseBase(this, _renderTo)[_renderTo]); babelHelpers.classPrivateFieldLooseBase(this, _analyticsManager)[_analyticsManager] = new AnalyticsManager(babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1], babelHelpers.classPrivateFieldLooseBase(this, _options$1)[_options$1].analytics); } destroy() { babelHelpers.classPrivateFieldLooseBase(this, _analyticsManager)[_analyticsManager] = null; babelHelpers.classPrivateFieldLooseBase(this, _app)[_app].unmount(); babelHelpers.classPrivateFieldLooseBase(this, _app)[_app] = null; babelHelpers.classPrivateFieldLooseBase(this, _unbindEvents)[_unbindEvents](); babelHelpers.classPrivateFieldLooseBase(this, _unwatch)[_unwatch](); babelHelpers.classPrivateFieldLooseBase(this, _unwatch)[_unwatch] = null; babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1] = null; babelHelpers.classPrivateFieldLooseBase(this, _resetState)[_resetState] = null; babelHelpers.classPrivateFieldLooseBase(this, _userGroupsModel)[_userGroupsModel] = null; babelHelpers.classPrivateFieldLooseBase(this, _options$1)[_options$1] = null; babelHelpers.classPrivateFieldLooseBase(this, _buttonPanel)[_buttonPanel] = null; main_core.Dom.clean(babelHelpers.classPrivateFieldLooseBase(this, _renderTo)[_renderTo]); babelHelpers.classPrivateFieldLooseBase(this, _renderTo)[_renderTo] = null; } hasUnsavedChanges() { return !(!babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].getters['application/isModified'] || babelHelpers.classPrivateFieldLooseBase(this, _isUserConfirmedClose)[_isUserConfirmedClose]); } scrollToSection(sectionCode) { babelHelpers.classPrivateFieldLooseBase(this, _rootComponent)[_rootComponent].scrollToSection(sectionCode); } getGuid() { return babelHelpers.classPrivateFieldLooseBase(this, _guid$1)[_guid$1]; } } function _bindEvents2() { babelHelpers.classPrivateFieldLooseBase(this, _handleSliderClose)[_handleSliderClose] = event => { var _BX$SidePanel, _BX$SidePanel$Instanc; const [sliderEvent] = event.getData(); const isSliderBelongsToThisApp = ((_BX$SidePanel = BX.SidePanel) == null ? void 0 : (_BX$SidePanel$Instanc = _BX$SidePanel.Instance) == null ? void 0 : _BX$SidePanel$Instanc.getSliderByWindow(window)) === (sliderEvent == null ? void 0 : sliderEvent.getSlider()); if (!isSliderBelongsToThisApp) { return; } babelHelpers.classPrivateFieldLooseBase(this, _confirmBeforeClosingModifiedSlider)[_confirmBeforeClosingModifiedSlider](sliderEvent); }; main_core_events.EventEmitter.subscribe('SidePanel.Slider:onClose', babelHelpers.classPrivateFieldLooseBase(this, _handleSliderClose)[_handleSliderClose]); } function _unbindEvents2() { main_core_events.EventEmitter.unsubscribe('SidePanel.Slider:onClose', babelHelpers.classPrivateFieldLooseBase(this, _handleSliderClose)[_handleSliderClose]); babelHelpers.classPrivateFieldLooseBase(this, _handleSliderClose)[_handleSliderClose] = null; } function _tryShowFeaturePromoter2(response) { if (!main_core.Type.isArrayFilled(response == null ? void 0 : response.errors)) { return false; } for (const error of response.errors) { var _error$customData; if (main_core.Type.isStringFilled(error == null ? void 0 : (_error$customData = error.customData) == null ? void 0 : _error$customData.sliderCode)) { main_core.Runtime.loadExtension('ui.info-helper').then(({ FeaturePromotersRegistry }) => { /** @see BX.UI.FeaturePromotersRegistry */ FeaturePromotersRegistry.getPromoter({ code: error.customData.sliderCode }).show(); }).catch(loadError => { console.error('ui.accessrights.v2: could not load ui.info-helper', loadError); }); return true; } } return false; } function _showNotification2(title) { BX.UI.Notification.Center.notify({ content: title, position: 'top-right', autoHideDelay: 3000 }); } function _runSaveAjaxRequest2() { const internalUserGroups = babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.userGroups.collection; let userGroups = null; if (babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.application.options.isSaveOnlyChangedRights) { userGroups = new OnlyChangedUserGroupsExporter().transform(internalUserGroups); } else { userGroups = new AllUserGroupsExporter().transform(internalUserGroups); } const bodyType = babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.application.options.bodyType; let accessRights = null; let deletedAccessRights = null; if (babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.application.options.isSaveAccessRightsList) { accessRights = new AccessRightsExporter().transform(babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.accessRights.collection, babelHelpers.classPrivateFieldLooseBase(this, _guid$1)[_guid$1]); deletedAccessRights = [...babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.accessRights.deleted.values()]; } // wrap ajax in native promise return new Promise((resolve, reject) => { main_core.ajax.runComponentAction(babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.application.options.component, babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.application.options.actionSave, { mode: babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.application.options.mode, [bodyType]: { userGroups, deletedUserGroups: [...babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.userGroups.deleted.values()], parameters: babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.application.options.additionalSaveParams, accessRights, deletedAccessRights } }).then(response => { const maxVisibleUserGroups = babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.application.options.maxVisibleUserGroups; const newUserGroups = new UserGroupsInternalizer(maxVisibleUserGroups).transform(response.data.USER_GROUPS); new ShownUserGroupsCopier(internalUserGroups, maxVisibleUserGroups).transform(newUserGroups); let newAccessRights = null; if (response.data.ACCESS_RIGHTS) { newAccessRights = new AccessRightsInternalizer().transform(response.data.ACCESS_RIGHTS); } resolve({ userGroups: newUserGroups, accessRights: newAccessRights }); }).catch(reject); }); } function _confirmBeforeClosingModifiedSlider2(sliderEvent) { if (!babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].getters['application/isModified'] || babelHelpers.classPrivateFieldLooseBase(this, _isUserConfirmedClose)[_isUserConfirmedClose]) { return; } sliderEvent.denyAction(); const box = ui_dialogs_messagebox.MessageBox.create({ mediumButtonSize: false, title: main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_MODIFIED_CLOSE_WARNING_TITLE'), message: main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_MODIFIED_CLOSE_WARNING'), modal: true, buttons: [new ui_buttons.Button({ color: ui_buttons.ButtonColor.PRIMARY, size: ui_buttons.ButtonSize.SMALL, text: main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_MODIFIED_CLOSE_YES_CLOSE'), onclick: () => { babelHelpers.classPrivateFieldLooseBase(this, _analyticsManager)[_analyticsManager].onCloseWithoutSave(); babelHelpers.classPrivateFieldLooseBase(this, _isUserConfirmedClose)[_isUserConfirmedClose] = true; box.close(); setTimeout(() => { sliderEvent.getSlider().close(); }); } }), new ui_buttons.CancelButton({ size: ui_buttons.ButtonSize.SMALL, onclick: () => { box.close(); } })] }); box.show(); } exports.App = App; }((this.BX.UI.AccessRights.V2 = this.BX.UI.AccessRights.V2 || {}),BX.UI.Dialogs,BX.UI.IconSet,BX.UI,BX.UI.Vue3.Components,BX.UI.EntitySelector,BX.Vue3,BX.Vue3.Directives,BX.UI.Vue3.Components,BX.Main,BX.UI,BX,BX.UI.Vue3.Components,BX,BX.UI.Analytics,BX.Vue3.Vuex,BX.Event,BX)); //# sourceMappingURL=v2.bundle.js.map