mirror of
https://github.com/hcengineering/platform.git
synced 2025-04-13 11:50:56 +00:00
Team members (#2712)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
This commit is contained in:
parent
b480552d3f
commit
ca002b4a41
@ -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,
|
||||
|
@ -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) {
|
||||
|
@ -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'
|
||||
]
|
||||
|
||||
|
@ -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}
|
||||
/>
|
||||
|
@ -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}
|
||||
|
@ -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 }}
|
||||
|
Loading…
Reference in New Issue
Block a user