EZQMS-729: Restrict spaces operations (#5500)

This commit is contained in:
Alexey Zinoviev
2024-05-04 20:49:24 +07:00
committed by GitHub
parent ad59463057
commit 4bc1534ee0
57 changed files with 873 additions and 114 deletions
@@ -69,6 +69,8 @@
let defaultAssignee: Ref<Employee> | null | undefined = project?.defaultAssignee ?? null
let members: Ref<Account>[] =
project?.members !== undefined ? hierarchy.clone(project.members) : [getCurrentAccount()._id]
let owners: Ref<Account>[] =
project?.owners !== undefined ? hierarchy.clone(project.owners) : [getCurrentAccount()._id]
let projectsIdentifiers = new Set<string>()
let isSaving = false
let defaultStatus: Ref<IssueStatus> | undefined = project?.defaultIssueStatus
@@ -96,6 +98,7 @@
description,
private: isPrivate,
members,
owners,
archived: false,
identifier: identifier.toUpperCase(),
sequence: 0,
@@ -162,6 +165,16 @@
}
}
}
if (projectData.owners?.length !== project?.owners?.length) {
update.owners = projectData.owners
} else {
for (const owner of projectData.owners || []) {
if (project.owners?.findIndex((p) => p === owner) === -1) {
update.owners = projectData.owners
break
}
}
}
if (Object.keys(update).length > 0) {
isSaving = true
@@ -275,6 +288,13 @@
rolesQuery.unsubscribe()
}
function handleOwnersChanged (newOwners: Ref<Account>[]): void {
owners = newOwners
const newMembersSet = new Set([...members, ...newOwners])
members = Array.from(newMembersSet)
}
function handleMembersChanged (newMembers: Ref<Account>[]): void {
// If a member was removed we need to remove it from any roles assignments as well
const newMembersSet = new Set(newMembers)
@@ -297,16 +317,21 @@
rolesAssignment[roleId] = newMembers
}
$: canSave =
name.trim().length > 0 &&
identifier.trim().length > 0 &&
!projectsIdentifiers.has(identifier.toUpperCase()) &&
!(members.length === 0 && isPrivate) &&
owners.length > 0 &&
(!isPrivate || owners.some((o) => members.includes(o)))
</script>
<Card
label={isNew ? tracker.string.NewProject : tracker.string.EditProject}
okLabel={isNew ? presentation.string.Create : presentation.string.Save}
okAction={handleSave}
canSave={name.trim().length > 0 &&
identifier.trim().length > 0 &&
!projectsIdentifiers.has(identifier.toUpperCase()) &&
!(members.length === 0 && isPrivate)}
{canSave}
accentHeader
width={'medium'}
gap={'gapV-6'}
@@ -409,14 +434,6 @@
/>
</div>
<div class="antiGrid-row">
<div class="antiGrid-row__header withDesciption">
<Label label={presentation.string.MakePrivate} />
<span><Label label={presentation.string.MakePrivateDescription} /></span>
</div>
<Toggle bind:on={isPrivate} disabled={!isPrivate && members.length === 0} />
</div>
<div class="antiGrid-row">
<div class="antiGrid-row__header">
<Label label={tracker.string.DefaultAssignee} />
@@ -448,6 +465,27 @@
{/if}
</div>
<div class="antiGrid-row">
<div class="antiGrid-row__header">
<Label label={core.string.Owners} />
</div>
<AccountArrayEditor
value={owners}
label={core.string.Owners}
onChange={handleOwnersChanged}
kind={'regular'}
size={'large'}
/>
</div>
<div class="antiGrid-row">
<div class="antiGrid-row__header withDesciption">
<Label label={presentation.string.MakePrivate} />
<span><Label label={presentation.string.MakePrivateDescription} /></span>
</div>
<Toggle bind:on={isPrivate} disabled={!isPrivate && members.length === 0} />
</div>
<div class="antiGrid-row">
<div class="antiGrid-row__header">
<Label label={tracker.string.Members} />