Team members (#2712)

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
This commit is contained in:
Denis Bykhov 2023-03-06 21:44:07 +06:00 committed by GitHub
parent b480552d3f
commit ca002b4a41
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 50 additions and 8 deletions

View File

@ -48,6 +48,7 @@
export let prevAssigned: Ref<Employee>[] | undefined = []
export let projectLead: Ref<Employee> | undefined = undefined
export let projectMembers: Ref<Employee>[] | undefined = []
export let members: Ref<Employee>[] | undefined = []
export let allowDeselect = true
export let titleDeselect: IntlString | undefined = undefined
export let readonly = false
@ -92,6 +93,7 @@
prevAssigned,
projectLead,
projectMembers,
members,
ignoreUsers: excluded ?? [],
icon,
selected: value,

View File

@ -44,6 +44,7 @@
export let prevAssigned: Ref<Employee>[] | undefined = []
export let projectLead: Ref<Employee> | undefined = undefined
export let projectMembers: Ref<Employee>[] | undefined = []
export let members: Ref<Employee>[] | undefined = []
export let allowDeselect = true
export let titleDeselect: IntlString | undefined
export let placeholder: IntlString = presentation.string.Search
@ -84,19 +85,21 @@
{ ...(options ?? {}), limit: 200, sort: { name: 1 } }
)
$: updateCategories(objects, currentEmployee, prevAssigned, projectLead, projectMembers)
$: updateCategories(objects, currentEmployee, prevAssigned, projectLead, members, projectMembers)
function updateCategories (
objects: Contact[],
currentEmployee: Ref<Person>,
prevAssigned: Ref<Person>[] | undefined,
projectLead: Ref<Person> | undefined,
members: Ref<Person>[] | undefined,
projectMembers: Ref<Person>[] | undefined
) {
const persons = new Map<Ref<Person>, AssigneeCategory>(objects.map((t) => [t._id, 'Other']))
if (projectLead) {
persons.set(projectLead, 'ProjectLead')
}
members?.forEach((p) => persons.set(p, 'Members'))
projectMembers?.forEach((p) => persons.set(p, 'ProjectMembers'))
prevAssigned?.forEach((p) => persons.set(p, 'PreviouslyAssigned'))
if (selected) {

View File

@ -286,6 +286,7 @@ export type AssigneeCategory =
| 'PreviouslyAssigned'
| 'ProjectLead'
| 'ProjectMembers'
| 'Members'
| 'Other'
const assigneeCategoryTitleMap: Record<AssigneeCategory, IntlString> = Object.freeze({
@ -294,6 +295,7 @@ const assigneeCategoryTitleMap: Record<AssigneeCategory, IntlString> = Object.fr
PreviouslyAssigned: presentation.string.CategoryPreviousAssigned,
ProjectLead: presentation.string.CategoryProjectLead,
ProjectMembers: presentation.string.CategoryProjectMembers,
Members: presentation.string.Members,
Other: presentation.string.CategoryOther
})
@ -306,6 +308,7 @@ export const assigneeCategoryOrder: AssigneeCategory[] = [
'PreviouslyAssigned',
'ProjectLead',
'ProjectMembers',
'Members',
'Other'
]

View File

@ -24,6 +24,7 @@
export let onChange: (refs: Ref<Account>[]) => void
export let readonly = false
export let kind: ButtonKind = 'link'
export let width: string | undefined = undefined
export let excludeItems: Ref<Account>[] | undefined = undefined
let timer: any
@ -79,5 +80,6 @@
on:update={onUpdate}
size={'medium'}
justify={'left'}
width={'100%'}
width={width ?? 'min-content'}
{kind}
/>

View File

@ -13,7 +13,7 @@
// limitations under the License.
-->
<script lang="ts">
import { Employee } from '@hcengineering/contact'
import contact, { Employee, EmployeeAccount } from '@hcengineering/contact'
import { AttachedData, Ref } from '@hcengineering/core'
import { AssigneeBox, getClient } from '@hcengineering/presentation'
import { Issue, IssueTemplateData } from '@hcengineering/tracker'
@ -34,11 +34,16 @@
let prevAssigned: Ref<Employee>[] = []
let projectLead: Ref<Employee> | undefined = undefined
let projectMembers: Ref<Employee>[] = []
let members: Ref<Employee>[] = []
$: getPreviousAssignees(value).then((res) => {
prevAssigned = res
})
function hasSpace (issue: Issue | AttachedData<Issue> | IssueTemplateData): issue is Issue {
return (issue as Issue).space !== undefined
}
async function updateProjectMembers (issue: Issue | AttachedData<Issue> | IssueTemplateData) {
if (issue.project) {
const project = await client.findOne(tracker.class.Project, { _id: issue.project })
@ -48,6 +53,17 @@
projectLead = undefined
projectMembers = []
}
if (hasSpace(issue)) {
const team = await client.findOne(tracker.class.Team, { _id: issue.space })
if (team !== undefined) {
const accounts = await client.findAll(contact.class.EmployeeAccount, {
_id: { $in: team.members as Ref<EmployeeAccount>[] }
})
members = accounts.map((p) => p.employee)
} else {
members = []
}
}
}
$: updateProjectMembers(value)
@ -73,6 +89,7 @@
{prevAssigned}
{projectLead}
{projectMembers}
{members}
titleDeselect={tracker.string.Unassigned}
{size}
{kind}

View File

@ -13,7 +13,9 @@
// limitations under the License.
-->
<script lang="ts">
import core, { generateId, getCurrentAccount, Ref, SortingOrder } from '@hcengineering/core'
import { Employee } from '@hcengineering/contact'
import { AccountArrayEditor } from '@hcengineering/contact-resources'
import core, { Account, generateId, getCurrentAccount, Ref, SortingOrder } from '@hcengineering/core'
import { Asset } from '@hcengineering/platform'
import presentation, { AssigneeBox, Card, getClient } from '@hcengineering/presentation'
import { StyledTextBox } from '@hcengineering/text-editor'
@ -32,7 +34,6 @@
import tracker from '../../plugin'
import TimeReportDayDropdown from '../issues/timereport/TimeReportDayDropdown.svelte'
import TeamIconChooser from './TeamIconChooser.svelte'
import { Employee } from '@hcengineering/contact'
export let team: Team | undefined = undefined
@ -44,6 +45,7 @@
team?.defaultTimeReportDay ?? TimeReportDayType.PreviousWorkDay
let selectedWorkDayLength: WorkDayLength | undefined = team?.workDayLength ?? WorkDayLength.EIGHT_HOURS
let defaultAssignee: Ref<Employee> | null | undefined = null
let members: Ref<Account>[] = team?.members ?? [getCurrentAccount()._id]
const dispatch = createEventDispatcher()
const client = getClient()
@ -73,7 +75,7 @@
name,
description,
private: isPrivate,
members: [getCurrentAccount()._id],
members,
archived: false,
createdBy: getCurrentAccount()._id,
identifier,
@ -88,7 +90,7 @@
}
async function updateTeam () {
const { sequence, issueStatuses, defaultIssueStatus, members, identifier, ...teamData } = getTeamData()
const { sequence, issueStatuses, defaultIssueStatus, identifier, ...teamData } = getTeamData()
// update team doc
await client.update(team!, teamData)
}
@ -137,7 +139,7 @@
<Card
label={isNew ? tracker.string.NewTeam : tracker.string.EditTeam}
okLabel={isNew ? presentation.string.Create : presentation.string.Edit}
okLabel={isNew ? presentation.string.Create : presentation.string.Save}
okAction={handleSave}
canSave={name.length > 0 && !!selectedWorkDayType && !!selectedWorkDayLength}
on:close={() => {
@ -199,6 +201,18 @@
/>
</div>
<div class="flex-between">
<div class="caption">
<Label label={tracker.string.Members} />
</div>
<AccountArrayEditor
value={members}
label={tracker.string.Members}
onChange={(refs) => (members = refs)}
kind="link-bordered"
/>
</div>
<div class="flex-between">
<div class="caption">
<Label label={tracker.string.DefaultAssignee} />
@ -206,6 +220,7 @@
<AssigneeBox
label={tracker.string.Assignee}
placeholder={tracker.string.Assignee}
kind="link-bordered"
bind:value={defaultAssignee}
titleDeselect={tracker.string.Unassigned}
showTooltip={{ label: tracker.string.DefaultAssignee }}