This commit is contained in:
root
2025-11-13 19:52:28 +03:00
parent 8aeeb05b7d
commit 807dec3b6c
4646 changed files with 163445 additions and 626017 deletions

View File

@@ -1,6 +1,11 @@
.ui-access-rights-v2 {
}
.ui-access-rights-v2-section:last-child .ui-access-rights-v2-section-container {
border-bottom-left-radius: var(--ui-border-radius-xl);
border-bottom-right-radius: var(--ui-border-radius-xl);
}
.ui-access-rights-v2-block {
position: relative;
pointer-events: none;
@@ -30,6 +35,14 @@
font-size: var(--ui-font-size-lg);
}
.ui-access-rights-v2--head-section::before {
content: "";
position: absolute;
inset: 0;
background: var(--ui-color-gray-05) ;
z-index: -1;
}
.ui-access-rights-v2--head-section .ui-access-rights-v2-column-item-text {
font-size: var(--ui-font-size-lg);
}
@@ -45,8 +58,8 @@
.ui-access-rights-v2--head-section .ui-access-rights-v2-section-container {
height: 82px;
border-top-right-radius: var(--ui-border-radius-xs);
border-top-left-radius: var(--ui-border-radius-xs);
border-top-right-radius: var(--ui-border-radius-xl);
border-top-left-radius: var(--ui-border-radius-xl);
}
.ui-access-rights-v2-section-head {
@@ -174,7 +187,7 @@
text-overflow: ellipsis;
white-space: nowrap;
font-size: var(--ui-font-size-sm);
color: var(--ui-color-palette-black-base);
color: var(--ui-color-base-90);
line-height: var(--ui-font-line-height-2xs);
cursor: default;
}
@@ -188,6 +201,8 @@
.ui-access-rights-v2-column-item-title-block {
display: flex;
flex-direction: column;
flex: 1;
min-width: 0;
}
.ui-access-rights-v2-column-item-title-icon {
@@ -206,8 +221,8 @@
color: var(--ui-color-palette-gray-90);
}
.ui-access-rights-v2-column-item-title .--plus-in-circle, .ui-access-rights-v2-column-item-title .--minus-in-circle {
--ui-icon-set__icon-color: var(--ui-color-palette-gray-50);
.ui-access-rights-v2-column-item-title .--o-circle-plus, .ui-access-rights-v2-column-item-title .--o-circle-minus {
--ui-icon-set__icon-color: var(--ui-color-palette-gray-30);
--ui-icon-set__icon-size: 18px;
margin-right: 5px;
}
@@ -217,14 +232,25 @@
}
.ui-access-rights-v2-column-item-title .ui-access-rights-v2-hint-container {
display: inline;
vertical-align: middle;
position: relative;
top: 2px;
top: 1px;
white-space: nowrap;
}
.ui-access-rights-v2-hint-container::before {
content: "\00a0";
}
.ui-access-rights-v2-column-item-title .ui-hint {
line-height: normal;
width: 13px;
height: 13px;
width: 16px;
height: 16px;
}
.ui-access-rights-v2-hint-container .ui-icon-set {
--ui-icon-set__icon-size: 16px;
}
.ui-access-rights-v2-column-item-title .ui-hint-icon {
@@ -249,7 +275,7 @@
}
.ui-access-rights-v2-header-role-cell {
padding: 10px;
padding: 16px 10px 10px 10px;
height: calc(100% - 20px);
display: flex;
flex-direction: column;
@@ -269,13 +295,15 @@
display: flex;
justify-content: center;
align-items: center;
margin-right: -16px; /* because of menu */
}
.ui-access-rights-v2-role-input,
.ui-access-rights-v2-role-value {
font-size: var(--ui-font-size-lg);
line-height: var(--ui-font-line-height-3xs);
color: var(--ui-color-gray-90);
font-weight: var(--ui-font-weight-normal);
line-height: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -306,11 +334,14 @@
.ui-access-rights-v2-members {
display: flex;
align-items: center;
border: var(--ui-border-width-thin) solid #525C6929;
border-radius: var(--ui-border-radius-pill);
padding: 4px;
}
.ui-access-rights-v2-members-air-template {
border: none;
}
.ui-access-rights-v2-members-item {
display: inline-block;
margin-left: -9px;
@@ -328,15 +359,18 @@
.ui-access-rights-v2-members-item-add {
height: 24px;
width: 24px;
border: none;
background: #fff;
box-shadow: 0 2px 4px 0 rgba(0,0,0,.14);
border-radius: 100%;
cursor: pointer;
border: 1px solid var(--ui-color-base-7)
}
.ui-access-rights-v2-members-item-add:hover {
background-color: var(--ui-color-base-7);
}
.ui-access-rights-v2-members-item-add .ui-icon-set {
--ui-icon-set__icon-color: var(--ui-color-palette-blue-50);
--ui-icon-set__icon-color: var(--ui-color-accent-main-primary);
}
.ui-access-rights-v2-members-item-add:hover .ui-icon-set {
@@ -438,6 +472,12 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
overflow: visible;
text-overflow: clip;
word-break: break-word;
width: 100%;
justify-content: space-between;
font-weight: 400;
font-size: var(--ui-font-size-sm);
}
.ui-access-rights-v2-text-center {
@@ -456,13 +496,23 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
.ui-access-rights-v2-icon-more {
--ui-icon-set__icon-size: 16px;
--ui-icon-set__icon-color: var(--ui-color-base-5);
opacity: var(--ui-opacity-40);
cursor: pointer;
}
.ui-access-rights-v2-search {
max-width: 290px;
--ui-field-size: 34px
}
.ui-access-rights-v2-search-input {
background-color: #F6F7F9;
border: none;
border-radius: var(--ui-border-radius-sm);
border: 1px solid var(--ui-color-bg-content-primary);
}
.ui-access-rights-v2-search .ui-ctl-element:hover, .ui-access-rights-v2-search .ui-ctl-element:focus {
border-color: var(--ui-color-bg-content-primary);
}
.ui-access-rights-v2-search-input:focus {
@@ -486,8 +536,7 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
}
.ui-access-rights-v2-header-role-add .ui-btn:hover:not(.ui-btn-disabled) {
border-color: var(--ui-color-palette-blue-30);
background: unset;
background-color: var(--ui-color-base-7);
}
.ui-access-rights-v2-header-role-add .ui-btn.ui-btn-disabled {
@@ -497,6 +546,19 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
.ui-access-rights-v2-header-role-add .ui-icon-set {
--ui-icon-set__icon-color: var(--ui-color-base-50);
}
.ui-access-rights-v2-search-icon {
position: absolute;
z-index: 10;
display: block;
width: 22px;
height: calc(var(--ui-field-size) - 2px);
right: 12px;
cursor: pointer;
--ui-icon-set__icon-size: 20px;
--ui-icon-set__icon-color: var(--ui-color-base-5);
}
.ui-access-rights-v2-column-item.ui-access-rights-v2-header-roles-control {
display: flex;
flex-direction: column;
@@ -523,10 +585,18 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
align-items: center;
cursor: pointer;
font-size: var(--ui-font-size-sm);
border: 1px solid var(--design-outline-default-design-outline-stroke, var(--ui-color-base-7));
border-radius: var(--ui-border-radius-pill);
box-shadow: var(--ui-shadow-bottom-s);
padding: 5px 10px 5px 10px;
border: var(--ui-border-width-thin) solid rgba(var(--ui-color-palette-black-solid-rgb), 0.07)
}
.ui-access-rights-v2-header-roles-control-counter:hover {
background-color: var(--ui-color-base-7);
}
.ui-access-rights-v2-header-roles-control-counter .ui-icon-set {
--ui-icon-set__icon-color: var(--ui-color-accent-main-primary);
margin-right: 2px;
}
.ui-access-rights-v2-header-roles-control-chevron {
@@ -546,6 +616,27 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
cursor: pointer;
}
.ui-access-rights-v2-header-roles-control-expander-button {
height: 24px;
width: 24px;
border: 1px solid var(--design-outline-default-design-outline-stroke, var(--ui-color-base-7));
border-radius: var(--ui-border-radius-xs);
display: flex;
justify-content: center;
align-items: center;
margin-left: 4px;
}
.ui-access-rights-v2-header-roles-control-expander-button:hover {
background-color: var(--ui-color-base-7);
}
.ui-access-rights-v2-header-roles-control-expander-button .ui-icon-set {
--ui-icon-set__icon-size: 18px;
}
.ui-access-rights-v2-section-header {
display: flex;
align-items: center;
@@ -570,23 +661,22 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
.ui-access-rights-v2-section-header-expander {
width: 18px;
height: 18px;
background-color: var(--ui-color-palette-white-base);
border: 1px solid var(--ui-color-base-7);
border-radius: var(--ui-border-radius-circle);
box-shadow: var(--ui-shadow-bottom-s);
display: flex;
align-items: center;
justify-content: center;
margin-right: 9px;
background-color: var(--ui-color-bg-content-primary);
}
.ui-access-rights-v2-section-header-expander:hover {
background-color: var(--ui-color-base-7);
}
.ui-access-rights-v2-section-header-expander .ui-icon-set {
--ui-icon-set__icon-size: 12px;
--ui-icon-set__icon-color: var(--ui-color-palette-gray-40);
}
.ui-access-rights-v2-section-header.--expanded .ui-access-rights-v2-section-header-expander .ui-icon-set {
--ui-icon-set__icon-size: 12px;
--ui-icon-set__icon-color: var(--ui-color-palette-black-base);
--ui-icon-set__icon-color: var(--ui-color-accent-main-primary);
}
.ui-access-rights-v2-section-header-icon {
@@ -603,16 +693,16 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
}
.ui-access-rights-v2-section-title {
color: var(--ui-color-palette-gray-80);
color: var(--ui-color-palette-gray-90);
max-width: 70%;
}
.ui-access-rights-v2-section-header.--expanded .ui-access-rights-v2-section-title {
color: var(--ui-color-palette-black-base);
color: var(--ui-color-palette-gray-90);
}
.ui-access-rights-v2-section-subtitle {
color: var(--ui-color-palette-gray-70);
color: var(--ui-color-palette-gray-90);
margin-left: 3px;
max-width: 200px;
}

View File

@@ -96,6 +96,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
return babelHelpers.classPrivateFieldLooseBase(this, _cache)[_cache].remember(`hint-${appGuid}`, () => {
return BX.UI.Hint.createInstance({
id: `ui-access-rights-v2-hint-${appGuid}`,
classNameIcon: 'ui-icon-set --o-question',
popupParameters: {
className: 'ui-access-rights-v2-popup-pointer-events ui-hint-popup',
autoHide: true,
@@ -173,7 +174,8 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
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
addStructureTeamsProviderTab: state => state.application.options.additionalMembersParams.addStructureTeamsProviderTab,
addStructureRolesProviderTab: state => state.application.options.additionalMembersParams.addStructureRolesProviderTab
})
},
mounted() {
@@ -218,6 +220,9 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
const groupId = match ? match[1] : null;
return ['site-groups', groupId];
}
if (/^(?:ATD|ATE|ATT|AD|AE|AT)[1-9]\d*$/.test(accessCode)) {
return ['structure-role', accessCode];
}
if (accessCode.at(0) === 'A') {
return ['user-groups', accessCode];
}
@@ -294,6 +299,9 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
if (entityId === 'user-groups') {
return item.id;
}
if (entityId === 'structure-role') {
return item.id;
}
if (entityId === 'project-access-codes') {
return item.id;
}
@@ -315,6 +323,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
return 'structureteams';
case 'site-groups':
case 'user-groups':
case 'structure-role':
return 'usergroups';
default:
return '';
@@ -341,14 +350,24 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
dynamicLoad: true,
dynamicSearch: true
}];
if (this.addStructureRolesProviderTab) {
entities.push({
id: 'structure-role',
options: {
includedNodeEntityTypes: ['team', 'department']
},
dynamicLoad: true,
dynamicSearch: true
});
}
if (this.addStructureTeamsProviderTab) {
entities.push({
id: 'structure-node',
options: {
selectMode: 'usersAndDepartments',
includedNodeEntityTypes: ['team'],
allowSelectRootDepartment: true,
allowFlatDepartments: true,
includedNodeEntityTypes: ['team'],
useMultipleTabs: true,
visual: {
avatarMode: 'node',
@@ -472,7 +491,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
'--has-siblings': userGroup.members.size > 0,
}"
>
<div class="ui-icon-set --plus-30"></div>
<div class="ui-icon-set --plus-m"></div>
</div>
<Selector
v-if="isSelectorShown"
@@ -506,7 +525,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
computed: {
RichMenuItemIcon: () => ui_vue3_components_richMenu.RichMenuItemIcon,
...ui_vue3_vuex.mapState({
isSaving: state => state.application.isSaving,
isProgress: state => state.application.isProgress,
guid: state => state.application.guid,
maxVisibleUserGroups: state => state.application.options.maxVisibleUserGroups
}),
@@ -594,6 +613,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
}
}
}), new ui_buttons.CancelButton({
text: this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_CANCEL'),
size: ui_buttons.ButtonSize.SMALL,
events: {
click: () => {
@@ -605,7 +625,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
popup.show();
},
showActionsMenu() {
if (!this.isSaving) {
if (!this.isProgress) {
this.isPopupShown = true;
}
},
@@ -643,7 +663,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
<div ref="container" class='ui-access-rights-v2-role'>
<div class="ui-access-rights-v2-role-value-container">
<input
v-if="isEdit && !isSaving"
v-if="isEdit && !isProgress"
ref="input"
type='text'
class='ui-access-rights-v2-role-input'
@@ -655,7 +675,8 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
</div>
<div
ref="menu"
class="ui-icon-set --more ui-access-rights-v2-icon-more"
class="ui-icon-set --more-l ui-access-rights-v2-icon-more"
style="position: absolute; right: 11px; top: 5px;"
@click="showActionsMenu"
>
<RichMenuPopup v-if="isPopupShown" @close="isPopupShown = false" :popup-options="{bindElement: $refs.menu}">
@@ -898,7 +919,8 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
<div>{{ $Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLES') }}</div>
<div
ref="configure"
class="ui-icon-set --more ui-access-rights-v2-icon-more"
class="ui-icon-set --more-l ui-access-rights-v2-icon-more"
style="position: absolute; right: 11px; top: 5px;"
@click="isPopupShown = true"
>
<RichMenuPopup v-if="isPopupShown" @close="isPopupShown = false" :popup-options="{bindElement: $refs.configure}">
@@ -945,21 +967,25 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
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>
<div class="ui-icon-set --o-observer" style="--ui-icon-set__icon-size: 18px;"></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 class="ui-access-rights-v2-header-roles-control-expander-button">
<div
class="ui-icon-set --collapse"
:title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_COLLAPSE_ALL_SECTIONS')"
@click="$store.dispatch('accessRights/collapseAllSections')"
></div>
</div>
<div class="ui-access-rights-v2-header-roles-control-expander-button">
<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>
</div>
</CellLayout>
@@ -1179,14 +1205,19 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
}
},
template: `
<div class="ui-ctl ui-ctl-after-icon ui-ctl-w100 ui-access-rights-v2-search">
<div
class="ui-ctl ui-ctl-after-icon 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"
ref="searchInput"
>
<a class="ui-ctl-after ui-ctl-icon-search ui-access-rights-v2-search-icon"></a>
<a
class="ui-icon-set --o-search ui-access-rights-v2-search-icon"
@click="this.$refs.searchInput.focus()"
></a>
</div>
`
};
@@ -2033,7 +2064,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
<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"
class="ui-icon-set --more-l ui-access-rights-v2-icon-more"
>
<RichMenuPopup
v-if="isMenuShown"
@@ -2554,7 +2585,8 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
const cancelButton = new ui_buttons.CancelButton({
onclick: () => {
this.$emit('close');
}
},
text: this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_CANCEL')
});
cancelButton.renderTo(this.$refs['button-container']);
});
@@ -3757,8 +3789,8 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
v-if="right.groupHead"
class="ui-icon-set"
:class="{
'--minus-in-circle': right.isGroupExpanded,
'--plus-in-circle': !right.isGroupExpanded,
'--o-circle-minus': right.isGroupExpanded,
'--o-circle-plus': !right.isGroupExpanded,
}"
></span>
<div
@@ -3772,15 +3804,13 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
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"/>
{{ 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"/>
{{ right.title }}<Hint v-once v-if="right.hint" :html="right.hint"/>
</span>
<span
v-if="right.subtitle"
@@ -3790,7 +3820,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
</div>
<div
ref="icon"
class="ui-icon-set --more ui-access-rights-v2-icon-more ui-access-rights-v2-title-column-menu"
class="ui-icon-set --more-l ui-access-rights-v2-icon-more ui-access-rights-v2-title-column-menu"
@click="toggleMenu"
>
<RichMenuPopup
@@ -3959,7 +3989,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
loader: null,
computed: {
...ui_vue3_vuex.mapState({
isSaving: state => state.application.isSaving,
isProgress: state => state.application.isProgress,
guid: state => state.application.guid,
searchContainerSelector: state => state.application.options.searchContainerSelector
}),
@@ -4071,7 +4101,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
<SearchBox/>
</Teleport>
<div ref="container" class='ui-access-rights-v2' :class="{
'ui-access-rights-v2-block': isSaving,
'ui-access-rights-v2-block': isProgress,
}">
<Header :user-groups="shownUserGroups"/>
<Section
@@ -4153,25 +4183,6 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
// '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;
@@ -4343,7 +4354,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
return {
options: babelHelpers.classPrivateFieldLooseBase(this, _options)[_options],
guid: babelHelpers.classPrivateFieldLooseBase(this, _guid)[_guid],
isSaving: false
isProgress: false
};
}
getGetters() {
@@ -4361,9 +4372,9 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
}
getMutations() {
return {
setSaving: (state, isSaving) => {
setProgress: (state, isProgress) => {
// eslint-disable-next-line no-param-reassign
state.isSaving = Boolean(isSaving);
state.isProgress = Boolean(isProgress);
}
};
}
@@ -5236,7 +5247,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
}
// noinspection OverlyComplexFunctionJS
transform(externalSource) {
var _externalSource$addit, _externalSource$addit2, _externalSource$addit3, _externalSource$addit4, _externalSource$addit5, _externalSource$addit6;
var _externalSource$addit, _externalSource$addit2, _externalSource$addit3, _externalSource$addit4, _externalSource$addit5, _externalSource$addit6, _externalSource$addit7, _externalSource$addit8;
// freeze tells vue that we don't need reactivity on this state
// and prevents accidental modification as well
return babelHelpers.classPrivateFieldLooseBase(this, _deepFreeze)[_deepFreeze]({
@@ -5251,11 +5262,13 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
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)
addStructureTeamsProviderTab: Boolean((_externalSource$addit5 = (_externalSource$addit6 = externalSource.additionalMembersParams) == null ? void 0 : _externalSource$addit6.addStructureTeamsProviderTab) != null ? _externalSource$addit5 : false),
addStructureRolesProviderTab: Boolean((_externalSource$addit7 = (_externalSource$addit8 = externalSource.additionalMembersParams) == null ? void 0 : _externalSource$addit8.addStructureRolesProviderTab) != null ? _externalSource$addit7 : false)
} : {
addUserGroupsProviderTab: false,
addProjectsProviderTab: true,
addStructureTeamsProviderTab: false
addStructureTeamsProviderTab: false,
addStructureRolesProviderTab: false
},
isSaveAccessRightsList: main_core.Type.isBoolean(externalSource.isSaveAccessRightsList) ? externalSource.isSaveAccessRightsList : false
});
@@ -5431,6 +5444,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
var _userGroupsModel = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("userGroupsModel");
var _accessRightsModel = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("accessRightsModel");
var _analyticsManager = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("analyticsManager");
var _confirmationPopup = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("confirmationPopup");
var _bindEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("bindEvents");
var _unbindEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("unbindEvents");
var _tryShowFeaturePromoter = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("tryShowFeaturePromoter");
@@ -5516,6 +5530,10 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
writable: true,
value: void 0
});
Object.defineProperty(this, _confirmationPopup, {
writable: true,
value: null
});
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;
@@ -5548,12 +5566,11 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
}
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']) {
if (babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].state.application.isProgress || !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, _store$1)[_store$1].commit('application/setProgress', true);
babelHelpers.classPrivateFieldLooseBase(this, _runSaveAjaxRequest)[_runSaveAjaxRequest]().then(({
userGroups,
accessRights
@@ -5590,7 +5607,7 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
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);
babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].commit('application/setProgress', false);
resolve();
});
});
@@ -5636,6 +5653,11 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
babelHelpers.classPrivateFieldLooseBase(this, _buttonPanel)[_buttonPanel] = null;
main_core.Dom.clean(babelHelpers.classPrivateFieldLooseBase(this, _renderTo)[_renderTo]);
babelHelpers.classPrivateFieldLooseBase(this, _renderTo)[_renderTo] = null;
if (babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup]) {
babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup].close();
babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup].getPopupWindow().destroy();
babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup] = null;
}
}
hasUnsavedChanges() {
return !(!babelHelpers.classPrivateFieldLooseBase(this, _store$1)[_store$1].getters['application/isModified'] || babelHelpers.classPrivateFieldLooseBase(this, _isUserConfirmedClose)[_isUserConfirmedClose]);
@@ -5739,7 +5761,10 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
return;
}
sliderEvent.denyAction();
const box = ui_dialogs_messagebox.MessageBox.create({
if (babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup] && babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup].getPopupWindow().isShown()) {
return;
}
babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup] = 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'),
@@ -5751,19 +5776,25 @@ this.BX.UI.AccessRights = this.BX.UI.AccessRights || {};
onclick: () => {
babelHelpers.classPrivateFieldLooseBase(this, _analyticsManager)[_analyticsManager].onCloseWithoutSave();
babelHelpers.classPrivateFieldLooseBase(this, _isUserConfirmedClose)[_isUserConfirmedClose] = true;
box.close();
babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup].close();
babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup] = null;
setTimeout(() => {
sliderEvent.getSlider().close();
});
}
}), new ui_buttons.CancelButton({
size: ui_buttons.ButtonSize.SMALL,
text: main_core.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_CANCEL'),
onclick: () => {
box.close();
babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup].close();
babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup] = null;
}
})]
})],
popupOptions: {
fixed: true
}
});
box.show();
babelHelpers.classPrivateFieldLooseBase(this, _confirmationPopup)[_confirmationPopup].show();
}
exports.App = App;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -7,6 +7,7 @@ $MESS["JS_UI_ACCESSRIGHTS_V2_ALL_ROLES"] = "Alle Rollen";
$MESS["JS_UI_ACCESSRIGHTS_V2_ALL_SELECT_LABEL"] = "alle auswählen";
$MESS["JS_UI_ACCESSRIGHTS_V2_APPLY_TO_ROLE"] = "In eine andere Rolle kopieren";
$MESS["JS_UI_ACCESSRIGHTS_V2_APPLY_TO_ROLE_SUBTITLE"] = "Kopiert Zugriffsrechte von dieser Rolle in eine andere.";
$MESS["JS_UI_ACCESSRIGHTS_V2_CANCEL"] = "Abbrechen";
$MESS["JS_UI_ACCESSRIGHTS_V2_COLLAPSE_ALL_SECTIONS"] = "Alle Bereiche minimieren";
$MESS["JS_UI_ACCESSRIGHTS_V2_COPIED_ROLE_NAME"] = "Kopie von #ORIGINAL#";
$MESS["JS_UI_ACCESSRIGHTS_V2_COPY"] = "Kopieren";

View File

@@ -7,6 +7,7 @@ $MESS["JS_UI_ACCESSRIGHTS_V2_ALL_ROLES"] = "All roles";
$MESS["JS_UI_ACCESSRIGHTS_V2_ALL_SELECT_LABEL"] = "select all";
$MESS["JS_UI_ACCESSRIGHTS_V2_APPLY_TO_ROLE"] = "Copy to existing role";
$MESS["JS_UI_ACCESSRIGHTS_V2_APPLY_TO_ROLE_SUBTITLE"] = "Copies access permissions from this role to another one.";
$MESS["JS_UI_ACCESSRIGHTS_V2_CANCEL"] = "Cancel";
$MESS["JS_UI_ACCESSRIGHTS_V2_COLLAPSE_ALL_SECTIONS"] = "Collapse all sections";
$MESS["JS_UI_ACCESSRIGHTS_V2_COPIED_ROLE_NAME"] = "Copy of #ORIGINAL#";
$MESS["JS_UI_ACCESSRIGHTS_V2_COPY"] = "Clone";

View File

@@ -7,6 +7,7 @@ $MESS["JS_UI_ACCESSRIGHTS_V2_ALL_ROLES"] = "Барлық рөлдер";
$MESS["JS_UI_ACCESSRIGHTS_V2_ALL_SELECT_LABEL"] = "барлығын таңдаңыз";
$MESS["JS_UI_ACCESSRIGHTS_V2_APPLY_TO_ROLE"] = "Басқа рөлге көшіру";
$MESS["JS_UI_ACCESSRIGHTS_V2_APPLY_TO_ROLE_SUBTITLE"] = "Орнатылған қолжетімділік құқықтары басқа рөлге көшіріледі.";
$MESS["JS_UI_ACCESSRIGHTS_V2_CANCEL"] = "Болдырмау";
$MESS["JS_UI_ACCESSRIGHTS_V2_COLLAPSE_ALL_SECTIONS"] = "Барлық бөлімдерді орау";
$MESS["JS_UI_ACCESSRIGHTS_V2_COPIED_ROLE_NAME"] = "#ORIGINAL# көшірмесі";
$MESS["JS_UI_ACCESSRIGHTS_V2_COPY"] = "Көшіру";
@@ -40,10 +41,8 @@ $MESS["JS_UI_ACCESSRIGHTS_V2_ROLE_COUNTER"] = " #ALL_ROLES##GREY_FINISH# -дан
$MESS["JS_UI_ACCESSRIGHTS_V2_ROLE_NAME"] = "Рөл атауы";
$MESS["JS_UI_ACCESSRIGHTS_V2_ROLE_SELECTOR_MAX_VISIBLE_WARNING"] = "Кіру құқығында бір уақытта #COUNT# рөл көрсетілуі мүмкін";
$MESS["JS_UI_ACCESSRIGHTS_V2_ROLE_VIEW"] = "Рөлдерді көрсету";
$MESS["JS_UI_ACCESSRIGHTS_V2_ROLE_VIEW_SUBTITLE"] = "Маңызды емес рөлдер жасырылады";
$MESS["JS_UI_ACCESSRIGHTS_V2_ROLE_VIEW_SUBTITLE_MSGVER_1"] = "Қандай рөлдерді көрсету немесе жасыру керектігін таңдаңыз.";
$MESS["JS_UI_ACCESSRIGHTS_V2_SEARCH_PLACEHOLDER"] = "Іздеу";
$MESS["JS_UI_ACCESSRIGHTS_V2_SEARCH_PLACEHOLDER_1"] = "элемент немесе ереже атауы бойынша іздеу";
$MESS["JS_UI_ACCESSRIGHTS_V2_SELECTED_ITEMS_TITLE"] = "Таңдалған:";
$MESS["JS_UI_ACCESSRIGHTS_V2_SETTINGS_HAVE_BEEN_SAVED"] = "Баптаулар сақталды";
$MESS["JS_UI_ACCESSRIGHTS_V2_SET_MAX_ACCESS_RIGHTS"] = "Барлығына қолжетімділікті ашыңыз";

View File

@@ -56,3 +56,4 @@ $MESS["JS_UI_ACCESSRIGHTS_V2_SET_MIN_ACCESS_RIGHTS_ROW_SUBTITLE"] = "Досту
$MESS["JS_UI_ACCESSRIGHTS_V2_ACTIONS"] = "Действия";
$MESS['JS_UI_ACCESSRIGHTS_V2_EXPAND_ALL_SECTIONS'] = 'Развернуть все разделы';
$MESS['JS_UI_ACCESSRIGHTS_V2_COLLAPSE_ALL_SECTIONS'] = 'Свернуть все разделы';
$MESS["JS_UI_ACCESSRIGHTS_V2_CANCEL"] = "Отмена";

View File

@@ -8,6 +8,7 @@ import { Grid } from './components/grid';
import 'ui.notification';
import { AnalyticsManager } from './integration/analytics-manager';
import { createStore } from './store/index';
import type { AccessRightsModel } from './store/model/access-rights-model';
import type { Options } from './store/model/application-model';
import { AccessRightsExporter } from './store/model/transformation/backend-exporter/access-rights-exporter';
import { AllUserGroupsExporter } from './store/model/transformation/backend-exporter/user-groups/all-user-groups-exporter';
@@ -19,7 +20,6 @@ import type { ExternalUserGroup } from './store/model/transformation/internalize
import { UserGroupsInternalizer } from './store/model/transformation/internalizer/user-groups-internalizer';
import { ShownUserGroupsCopier } from './store/model/transformation/shown-user-groups-copier';
import type { UserGroupsCollection, UserGroupsModel } from './store/model/user-groups-model';
import type { AccessRightsModel } from './store/model/access-rights-model';
export type AppConstructOptions = Options & {
renderTo: HTMLElement;
@@ -51,6 +51,7 @@ export class App
#userGroupsModel: UserGroupsModel;
#accessRightsModel: AccessRightsModel;
#analyticsManager: AnalyticsManager;
#confirmationPopup: MessageBox | null = null;
constructor(options: AppConstructOptions)
{
@@ -155,16 +156,14 @@ export class App
sendActionRequest(): Promise
{
return new Promise((resolve, reject) => {
if (this.#store.state.application.isSaving || !this.#store.getters['application/isModified'])
if (this.#store.state.application.isProgress || !this.#store.getters['application/isModified'])
{
resolve();
return;
}
this.#store.commit('application/setSaving', true);
this.#analyticsManager.onSaveAttempt();
this.#store.commit('application/setProgress', true);
this.#runSaveAjaxRequest()
.then(({ userGroups, accessRights }) => {
@@ -203,7 +202,7 @@ export class App
.finally(() => {
const waitContainer = this.#buttonPanel?.getContainer().querySelector('.ui-btn-wait');
Dom.removeClass(waitContainer, 'ui-btn-wait');
this.#store.commit('application/setSaving', false);
this.#store.commit('application/setProgress', false);
resolve();
});
@@ -287,7 +286,12 @@ export class App
sliderEvent.denyAction();
const box = MessageBox.create({
if (this.#confirmationPopup && this.#confirmationPopup.getPopupWindow().isShown())
{
return;
}
this.#confirmationPopup = MessageBox.create({
mediumButtonSize: false,
title: Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_MODIFIED_CLOSE_WARNING_TITLE'),
message: Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_MODIFIED_CLOSE_WARNING'),
@@ -300,7 +304,8 @@ export class App
onclick: () => {
this.#analyticsManager.onCloseWithoutSave();
this.#isUserConfirmedClose = true;
box.close();
this.#confirmationPopup.close();
this.#confirmationPopup = null;
setTimeout(() => {
sliderEvent.getSlider().close();
@@ -309,14 +314,19 @@ export class App
}),
new CancelButton({
size: ButtonSize.SMALL,
text: Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_CANCEL'),
onclick: () => {
box.close();
this.#confirmationPopup.close();
this.#confirmationPopup = null;
},
}),
],
popupOptions: {
fixed: true,
},
});
box.show();
this.#confirmationPopup.show();
}
draw(): void
@@ -377,6 +387,13 @@ export class App
Dom.clean(this.#renderTo);
this.#renderTo = null;
if (this.#confirmationPopup)
{
this.#confirmationPopup.close();
this.#confirmationPopup.getPopupWindow().destroy();
this.#confirmationPopup = null;
}
}
hasUnsavedChanges(): boolean

View File

@@ -12,7 +12,7 @@ export const Grid = {
loader: null,
computed: {
...mapState({
isSaving: (state) => state.application.isSaving,
isProgress: (state) => state.application.isProgress,
guid: (state) => state.application.guid,
searchContainerSelector: (state) => state.application.options.searchContainerSelector,
}),
@@ -109,7 +109,7 @@ export const Grid = {
<SearchBox/>
</Teleport>
<div ref="container" class='ui-access-rights-v2' :class="{
'ui-access-rights-v2-block': isSaving,
'ui-access-rights-v2-block': isProgress,
}">
<Header :user-groups="shownUserGroups"/>
<Section

View File

@@ -1,3 +1,4 @@
import { Extension } from 'main.core';
import type { MemberCollection } from '../../store/model/user-groups-model';
import { Selector } from './members/selector';
import { SingleMember } from './members/single-member';
@@ -62,7 +63,7 @@ export const Members = {
'--has-siblings': userGroup.members.size > 0,
}"
>
<div class="ui-icon-set --plus-30"></div>
<div class="ui-icon-set --plus-m"></div>
</div>
<Selector
v-if="isSelectorShown"

View File

@@ -32,6 +32,7 @@ export const Selector = {
addUserGroupsProviderTab: (state) => state.application.options.additionalMembersParams.addUserGroupsProviderTab,
addProjectsProviderTab: (state) => state.application.options.additionalMembersParams.addProjectsProviderTab,
addStructureTeamsProviderTab: (state) => state.application.options.additionalMembersParams.addStructureTeamsProviderTab,
addStructureRolesProviderTab: (state) => state.application.options.additionalMembersParams.addStructureRolesProviderTab,
}),
},
mounted()
@@ -90,6 +91,11 @@ export const Selector = {
return ['site-groups', groupId];
}
if (/^(?:ATD|ATE|ATT|AD|AE|AT)[1-9]\d*$/.test(accessCode))
{
return ['structure-role', accessCode];
}
if (accessCode.at(0) === 'A')
{
return ['user-groups', accessCode];
@@ -192,6 +198,11 @@ export const Selector = {
return item.id;
}
if (entityId === 'structure-role')
{
return item.id;
}
if (entityId === 'project-access-codes')
{
return item.id;
@@ -216,6 +227,7 @@ export const Selector = {
return 'structureteams';
case 'site-groups':
case 'user-groups':
case 'structure-role':
return 'usergroups';
default:
return '';
@@ -247,15 +259,27 @@ export const Selector = {
},
];
if (this.addStructureRolesProviderTab)
{
entities.push({
id: 'structure-role',
options: {
includedNodeEntityTypes: ['team', 'department'],
},
dynamicLoad: true,
dynamicSearch: true,
});
}
if (this.addStructureTeamsProviderTab)
{
entities.push({
id: 'structure-node',
options: {
selectMode: 'usersAndDepartments',
includedNodeEntityTypes: ['team'],
allowSelectRootDepartment: true,
allowFlatDepartments: true,
includedNodeEntityTypes: ['team'],
useMultipleTabs: true,
visual: {
avatarMode: 'node',

View File

@@ -23,7 +23,7 @@ export const RoleHeading = {
computed: {
RichMenuItemIcon: () => RichMenuItemIcon,
...mapState({
isSaving: (state) => state.application.isSaving,
isProgress: (state) => state.application.isProgress,
guid: (state) => state.application.guid,
maxVisibleUserGroups: (state) => state.application.options.maxVisibleUserGroups,
}),
@@ -122,6 +122,7 @@ export const RoleHeading = {
},
}),
new CancelButton({
text: this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_CANCEL'),
size: ButtonSize.SMALL,
events: {
click: () => {
@@ -135,7 +136,7 @@ export const RoleHeading = {
popup.show();
},
showActionsMenu(): void {
if (!this.isSaving)
if (!this.isProgress)
{
this.isPopupShown = true;
}
@@ -179,7 +180,7 @@ export const RoleHeading = {
<div ref="container" class='ui-access-rights-v2-role'>
<div class="ui-access-rights-v2-role-value-container">
<input
v-if="isEdit && !isSaving"
v-if="isEdit && !isProgress"
ref="input"
type='text'
class='ui-access-rights-v2-role-input'
@@ -191,7 +192,8 @@ export const RoleHeading = {
</div>
<div
ref="menu"
class="ui-icon-set --more ui-access-rights-v2-icon-more"
class="ui-icon-set --more-l ui-access-rights-v2-icon-more"
style="position: absolute; right: 11px; top: 5px;"
@click="showActionsMenu"
>
<RichMenuPopup v-if="isPopupShown" @close="isPopupShown = false" :popup-options="{bindElement: $refs.menu}">

View File

@@ -169,7 +169,8 @@ export const RolesControl = {
<div>{{ $Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_ROLES') }}</div>
<div
ref="configure"
class="ui-icon-set --more ui-access-rights-v2-icon-more"
class="ui-icon-set --more-l ui-access-rights-v2-icon-more"
style="position: absolute; right: 11px; top: 5px;"
@click="isPopupShown = true"
>
<RichMenuPopup v-if="isPopupShown" @close="isPopupShown = false" :popup-options="{bindElement: $refs.configure}">
@@ -216,21 +217,25 @@ export const RolesControl = {
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>
<div class="ui-icon-set --o-observer" style="--ui-icon-set__icon-size: 18px;"></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 class="ui-access-rights-v2-header-roles-control-expander-button">
<div
class="ui-icon-set --collapse"
:title="$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_COLLAPSE_ALL_SECTIONS')"
@click="$store.dispatch('accessRights/collapseAllSections')"
></div>
</div>
<div class="ui-access-rights-v2-header-roles-control-expander-button">
<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>
</div>
</CellLayout>

View File

@@ -22,14 +22,19 @@ export const SearchBox = {
},
},
template: `
<div class="ui-ctl ui-ctl-after-icon ui-ctl-w100 ui-access-rights-v2-search">
<div
class="ui-ctl ui-ctl-after-icon 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"
ref="searchInput"
>
<a class="ui-ctl-after ui-ctl-icon-search ui-access-rights-v2-search-icon"></a>
<a
class="ui-icon-set --o-search ui-access-rights-v2-search-icon"
@click="this.$refs.searchInput.focus()"
></a>
</div>
`,
};

View File

@@ -106,7 +106,7 @@ export const MenuCell = {
<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"
class="ui-icon-set --more-l ui-access-rights-v2-icon-more"
>
<RichMenuPopup
v-if="isMenuShown"

View File

@@ -129,8 +129,8 @@ export const TitleCell = {
v-if="right.groupHead"
class="ui-icon-set"
:class="{
'--minus-in-circle': right.isGroupExpanded,
'--plus-in-circle': !right.isGroupExpanded,
'--o-circle-minus': right.isGroupExpanded,
'--o-circle-plus': !right.isGroupExpanded,
}"
></span>
<div
@@ -144,15 +144,13 @@ export const TitleCell = {
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"/>
{{ 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"/>
{{ right.title }}<Hint v-once v-if="right.hint" :html="right.hint"/>
</span>
<span
v-if="right.subtitle"
@@ -162,7 +160,7 @@ export const TitleCell = {
</div>
<div
ref="icon"
class="ui-icon-set --more ui-access-rights-v2-icon-more ui-access-rights-v2-title-column-menu"
class="ui-icon-set --more-l ui-access-rights-v2-icon-more ui-access-rights-v2-title-column-menu"
@click="toggleMenu"
>
<RichMenuPopup

View File

@@ -47,6 +47,7 @@ export const ValuePopup = {
onclick: () => {
this.$emit('close');
},
text: this.$Bitrix.Loc.getMessage('JS_UI_ACCESSRIGHTS_V2_CANCEL'),
});
cancelButton.renderTo(this.$refs['button-container']);
});

View File

@@ -24,10 +24,18 @@
align-items: center;
cursor: pointer;
font-size: var(--ui-font-size-sm);
border: 1px solid var(--design-outline-default-design-outline-stroke, var(--ui-color-base-7));
border-radius: var(--ui-border-radius-pill);
box-shadow: var(--ui-shadow-bottom-s);
padding: 5px 10px 5px 10px;
border: var(--ui-border-width-thin) solid rgba(var(--ui-color-palette-black-solid-rgb), 0.07)
}
.ui-access-rights-v2-header-roles-control-counter:hover {
background-color: var(--ui-color-base-7);
}
.ui-access-rights-v2-header-roles-control-counter .ui-icon-set {
--ui-icon-set__icon-color: var(--ui-color-accent-main-primary);
margin-right: 2px;
}
.ui-access-rights-v2-header-roles-control-chevron {
@@ -46,3 +54,24 @@
opacity: var(--ui-opacity-60);
cursor: pointer;
}
.ui-access-rights-v2-header-roles-control-expander-button {
height: 24px;
width: 24px;
border: 1px solid var(--design-outline-default-design-outline-stroke, var(--ui-color-base-7));
border-radius: var(--ui-border-radius-xs);
display: flex;
justify-content: center;
align-items: center;
margin-left: 4px;
}
.ui-access-rights-v2-header-roles-control-expander-button:hover {
background-color: var(--ui-color-base-7);
}
.ui-access-rights-v2-header-roles-control-expander-button .ui-icon-set {
--ui-icon-set__icon-size: 18px;
}

View File

@@ -22,23 +22,22 @@
.ui-access-rights-v2-section-header-expander {
width: 18px;
height: 18px;
background-color: var(--ui-color-palette-white-base);
border: 1px solid var(--ui-color-base-7);
border-radius: var(--ui-border-radius-circle);
box-shadow: var(--ui-shadow-bottom-s);
display: flex;
align-items: center;
justify-content: center;
margin-right: 9px;
background-color: var(--ui-color-bg-content-primary);
}
.ui-access-rights-v2-section-header-expander:hover {
background-color: var(--ui-color-base-7);
}
.ui-access-rights-v2-section-header-expander .ui-icon-set {
--ui-icon-set__icon-size: 12px;
--ui-icon-set__icon-color: var(--ui-color-palette-gray-40);
}
.ui-access-rights-v2-section-header.--expanded .ui-access-rights-v2-section-header-expander .ui-icon-set {
--ui-icon-set__icon-size: 12px;
--ui-icon-set__icon-color: var(--ui-color-palette-black-base);
--ui-icon-set__icon-color: var(--ui-color-accent-main-primary);
}
.ui-access-rights-v2-section-header-icon {
@@ -55,16 +54,16 @@
}
.ui-access-rights-v2-section-title {
color: var(--ui-color-palette-gray-80);
color: var(--ui-color-palette-gray-90);
max-width: 70%;
}
.ui-access-rights-v2-section-header.--expanded .ui-access-rights-v2-section-title {
color: var(--ui-color-palette-black-base);
color: var(--ui-color-palette-gray-90);
}
.ui-access-rights-v2-section-subtitle {
color: var(--ui-color-palette-gray-70);
color: var(--ui-color-palette-gray-90);
margin-left: 3px;
max-width: 200px;
}

View File

@@ -1,6 +1,11 @@
.ui-access-rights-v2 {
}
.ui-access-rights-v2-section:last-child .ui-access-rights-v2-section-container {
border-bottom-left-radius: var(--ui-border-radius-xl);
border-bottom-right-radius: var(--ui-border-radius-xl);
}
.ui-access-rights-v2-block {
position: relative;
pointer-events: none;
@@ -29,6 +34,14 @@
font-size: var(--ui-font-size-lg);
}
.ui-access-rights-v2--head-section::before {
content: "";
position: absolute;
inset: 0;
background: var(--ui-color-gray-05) ;
z-index: -1;
}
.ui-access-rights-v2--head-section .ui-access-rights-v2-column-item-text {
font-size: var(--ui-font-size-lg);
}
@@ -44,8 +57,8 @@
.ui-access-rights-v2--head-section .ui-access-rights-v2-section-container {
height: 82px;
border-top-right-radius: var(--ui-border-radius-xs);
border-top-left-radius: var(--ui-border-radius-xs);
border-top-right-radius: var(--ui-border-radius-xl);
border-top-left-radius: var(--ui-border-radius-xl);
}
.ui-access-rights-v2-section-head {
@@ -173,7 +186,7 @@
text-overflow: ellipsis;
white-space: nowrap;
font-size: var(--ui-font-size-sm);
color: var(--ui-color-palette-black-base);
color: var(--ui-color-base-90);
line-height: var(--ui-font-line-height-2xs);
cursor: default;
}
@@ -187,6 +200,8 @@
.ui-access-rights-v2-column-item-title-block {
display: flex;
flex-direction: column;
flex: 1;
min-width: 0;
}
.ui-access-rights-v2-column-item-title-icon {
@@ -205,8 +220,8 @@
color: var(--ui-color-palette-gray-90);
}
.ui-access-rights-v2-column-item-title .--plus-in-circle, .ui-access-rights-v2-column-item-title .--minus-in-circle {
--ui-icon-set__icon-color: var(--ui-color-palette-gray-50);
.ui-access-rights-v2-column-item-title .--o-circle-plus, .ui-access-rights-v2-column-item-title .--o-circle-minus {
--ui-icon-set__icon-color: var(--ui-color-palette-gray-30);
--ui-icon-set__icon-size: 18px;
margin-right: 5px;
}
@@ -216,14 +231,25 @@
}
.ui-access-rights-v2-column-item-title .ui-access-rights-v2-hint-container {
display: inline;
vertical-align: middle;
position: relative;
top: 2px;
top: 1px;
white-space: nowrap;
}
.ui-access-rights-v2-hint-container::before {
content: "\00a0";
}
.ui-access-rights-v2-column-item-title .ui-hint {
line-height: normal;
width: 13px;
height: 13px;
width: 16px;
height: 16px;
}
.ui-access-rights-v2-hint-container .ui-icon-set {
--ui-icon-set__icon-size: 16px;
}
.ui-access-rights-v2-column-item-title .ui-hint-icon {
@@ -248,7 +274,7 @@
}
.ui-access-rights-v2-header-role-cell {
padding: 10px;
padding: 16px 10px 10px 10px;
height: calc(100% - 20px);
display: flex;
flex-direction: column;
@@ -268,13 +294,15 @@
display: flex;
justify-content: center;
align-items: center;
margin-right: -16px; /* because of menu */
}
.ui-access-rights-v2-role-input,
.ui-access-rights-v2-role-value {
font-size: var(--ui-font-size-lg);
line-height: var(--ui-font-line-height-3xs);
color: var(--ui-color-gray-90);
font-weight: var(--ui-font-weight-normal);
line-height: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -305,11 +333,14 @@
.ui-access-rights-v2-members {
display: flex;
align-items: center;
border: var(--ui-border-width-thin) solid #525C6929;
border-radius: var(--ui-border-radius-pill);
padding: 4px;
}
.ui-access-rights-v2-members-air-template {
border: none;
}
.ui-access-rights-v2-members-item {
display: inline-block;
margin-left: -9px;
@@ -327,15 +358,18 @@
.ui-access-rights-v2-members-item-add {
height: 24px;
width: 24px;
border: none;
background: #fff;
box-shadow: 0 2px 4px 0 rgba(0,0,0,.14);
border-radius: 100%;
cursor: pointer;
border: 1px solid var(--ui-color-base-7)
}
.ui-access-rights-v2-members-item-add:hover {
background-color: var(--ui-color-base-7);
}
.ui-access-rights-v2-members-item-add .ui-icon-set {
--ui-icon-set__icon-color: var(--ui-color-palette-blue-50);
--ui-icon-set__icon-color: var(--ui-color-accent-main-primary);
}
.ui-access-rights-v2-members-item-add:hover .ui-icon-set {
@@ -437,6 +471,12 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
overflow: visible;
text-overflow: clip;
word-break: break-word;
width: 100%;
justify-content: space-between;
font-weight: 400;
font-size: var(--ui-font-size-sm);
}
.ui-access-rights-v2-text-center {
@@ -455,13 +495,23 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
.ui-access-rights-v2-icon-more {
--ui-icon-set__icon-size: 16px;
--ui-icon-set__icon-color: var(--ui-color-base-5);
opacity: var(--ui-opacity-40);
cursor: pointer;
}
.ui-access-rights-v2-search {
max-width: 290px;
--ui-field-size: 34px
}
.ui-access-rights-v2-search-input {
background-color: #F6F7F9;
border: none;
border-radius: var(--ui-border-radius-sm);
border: 1px solid var(--ui-color-bg-content-primary);
}
.ui-access-rights-v2-search .ui-ctl-element:hover, .ui-access-rights-v2-search .ui-ctl-element:focus {
border-color: var(--ui-color-bg-content-primary);
}
.ui-access-rights-v2-search-input:focus {
@@ -485,8 +535,7 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
}
.ui-access-rights-v2-header-role-add .ui-btn:hover:not(.ui-btn-disabled) {
border-color: var(--ui-color-palette-blue-30);
background: unset;
background-color: var(--ui-color-base-7);
}
.ui-access-rights-v2-header-role-add .ui-btn.ui-btn-disabled {
@@ -495,4 +544,17 @@ div.ui-access-rights-v2-members-item-new:last-of-type {
.ui-access-rights-v2-header-role-add .ui-icon-set {
--ui-icon-set__icon-color: var(--ui-color-base-50);
}
.ui-access-rights-v2-search-icon {
position: absolute;
z-index: 10;
display: block;
width: 22px;
height: calc(var(--ui-field-size) - 2px);
right: 12px;
cursor: pointer;
--ui-icon-set__icon-size: 20px;
--ui-icon-set__icon-color: var(--ui-color-base-5);
}

View File

@@ -21,31 +21,6 @@ export class AnalyticsManager
this.#isEnabled = Object.hasOwn(this.#data, 'tool') && Object.hasOwn(this.#data, 'category');
}
onSaveAttempt(): void
{
if (!this.#isEnabled)
{
return;
}
const { createdRoles, editedRoles, deletedRoles } = this.#analyzeRoles();
for (let i = 0; i < createdRoles; i++)
{
this.#registerRoleCreateEvent('attempt');
}
for (let i = 0; i < editedRoles; i++)
{
this.#registerRoleEditEvent('attempt');
}
for (let i = 0; i < deletedRoles; i++)
{
this.#registerRoleDeleteEvent('attempt');
}
}
onSaveSuccess(): void
{
if (!this.#isEnabled)

View File

@@ -20,6 +20,7 @@ export class ServiceLocator
return this.#cache.remember(`hint-${appGuid}`, () => {
return BX.UI.Hint.createInstance({
id: `ui-access-rights-v2-hint-${appGuid}`,
classNameIcon: 'ui-icon-set --o-question',
popupParameters: {
className: 'ui-access-rights-v2-popup-pointer-events ui-hint-popup',
autoHide: true,

View File

@@ -3,7 +3,7 @@ import { BuilderModel, type GetterTree, type MutationTree } from 'ui.vue3.vuex';
export type ApplicationState = {
options: Readonly<Options>,
guid: string,
isSaving: boolean,
isProgress: boolean,
}
export type Options = {
@@ -58,7 +58,7 @@ export class ApplicationModel extends BuilderModel
return {
options: this.#options,
guid: this.#guid,
isSaving: false,
isProgress: false,
};
}
@@ -80,9 +80,9 @@ export class ApplicationModel extends BuilderModel
getMutations(): MutationTree<ApplicationState>
{
return {
setSaving: (state, isSaving: boolean): void => {
setProgress: (state, isProgress: boolean): void => {
// eslint-disable-next-line no-param-reassign
state.isSaving = Boolean(isSaving);
state.isProgress = Boolean(isProgress);
},
};
}

View File

@@ -31,11 +31,13 @@ export class ApplicationInternalizer implements Transformer<Options, Readonly<Op
addUserGroupsProviderTab: Boolean(externalSource.additionalMembersParams?.addUserGroupsProviderTab ?? false),
addProjectsProviderTab: Boolean(externalSource.additionalMembersParams?.addProjectsProviderTab ?? true),
addStructureTeamsProviderTab: Boolean(externalSource.additionalMembersParams?.addStructureTeamsProviderTab ?? false),
addStructureRolesProviderTab: Boolean(externalSource.additionalMembersParams?.addStructureRolesProviderTab ?? false),
}
: {
addUserGroupsProviderTab: false,
addProjectsProviderTab: true,
addStructureTeamsProviderTab: false,
addStructureRolesProviderTab: false,
},
isSaveAccessRightsList: Type.isBoolean(externalSource.isSaveAccessRightsList)
? externalSource.isSaveAccessRightsList