From c0c231b6361065ce48f92d0723c579976f0b912b Mon Sep 17 00:00:00 2001 From: Felix Evers Date: Tue, 24 Mar 2026 07:40:34 +0100 Subject: [PATCH 1/4] fix assignee selection --- web/api/mutations/tasks/updateTask.plan.ts | 53 +++++++++++++++++- web/components/tasks/TaskDataEditor.tsx | 8 +-- web/components/views/SaveViewDialog.tsx | 15 +++++- web/i18n/translations.ts | 14 +++++ web/locales/de-DE.arb | 2 + web/locales/en-US.arb | 2 + web/locales/es-ES.arb | 2 + web/locales/fr-FR.arb | 2 + web/locales/nl-NL.arb | 2 + web/locales/pt-BR.arb | 2 + web/pages/settings/views.tsx | 56 ++++++++++++++++--- web/pages/view/[uid].tsx | 63 +++++++++++++++++++--- 12 files changed, 201 insertions(+), 20 deletions(-) diff --git a/web/api/mutations/tasks/updateTask.plan.ts b/web/api/mutations/tasks/updateTask.plan.ts index 43c687f..7160d96 100644 --- a/web/api/mutations/tasks/updateTask.plan.ts +++ b/web/api/mutations/tasks/updateTask.plan.ts @@ -2,6 +2,7 @@ import type { ApolloCache } from '@apollo/client/cache' import type { Reference } from '@apollo/client/utilities' import { GetTaskDocument, + LocationType, type GetTaskQuery, type UpdateTaskInput } from '@/api/gql/generated' @@ -15,6 +16,44 @@ type UpdateTaskVariables = { clientMutationId?: string, } +type TaskEntity = NonNullable + +function optimisticAssignees( + assigneeIds: string[] | null | undefined, + previous: TaskEntity['assignees'] | undefined +): TaskEntity['assignees'] | undefined { + if (assigneeIds === undefined) return undefined + const prev = previous ?? [] + const ids = assigneeIds ?? [] + return ids.map((userId) => { + const found = prev.find((u) => u.id === userId) + if (found) return found + return { + __typename: 'UserType' as const, + id: userId, + name: '', + avatarUrl: null, + lastOnline: null, + isOnline: false, + } + }) +} + +function optimisticAssigneeTeam( + assigneeTeamId: string | null | undefined, + previous: TaskEntity['assigneeTeam'] | undefined +): TaskEntity['assigneeTeam'] | null | undefined { + if (assigneeTeamId === undefined) return undefined + if (assigneeTeamId === null) return null + if (previous?.id === assigneeTeamId) return previous + return { + __typename: 'LocationNodeType' as const, + id: assigneeTeamId, + title: '', + kind: LocationType.Team, + } +} + export const updateTaskOptimisticPlanKey = 'UpdateTask' export const updateTaskOptimisticPlan: OptimisticPlan = { @@ -35,7 +74,8 @@ export const updateTaskOptimisticPlan: OptimisticPlan = { snapshotRef.current = existing ?? null const id = cache.identify({ __typename: 'TaskType', id: taskId }) - const existingProps = existing?.task?.properties ?? [] + const existingTask = existing?.task + const existingProps = existingTask?.properties ?? [] const mergeProperties = (_prev: Reference | readonly unknown[]) => { if (!data.properties) return existingProps return data.properties.map((inp) => { @@ -87,6 +127,17 @@ export const updateTaskOptimisticPlan: OptimisticPlan = { estimatedTime: (prev: number | null) => data.estimatedTime !== undefined ? data.estimatedTime : prev, properties: mergeProperties, + assignees: (prev) => { + const next = optimisticAssignees(data.assigneeIds, existingTask?.assignees) + return next !== undefined ? next : prev + }, + assigneeTeam: (prev) => { + const next = optimisticAssigneeTeam( + data.assigneeTeamId, + existingTask?.assigneeTeam + ) + return next !== undefined ? next : prev + }, }, }) cache.modify({ diff --git a/web/components/tasks/TaskDataEditor.tsx b/web/components/tasks/TaskDataEditor.tsx index 3395653..dbfd0e0 100644 --- a/web/components/tasks/TaskDataEditor.tsx +++ b/web/components/tasks/TaskDataEditor.tsx @@ -314,7 +314,7 @@ export const TaskDataEditor = ({ return prev } return { ...prev, assigneeIds: [...currentAssigneeIds, value], assigneeTeamId: null } - }) + }, isEditMode) }} multiUserSelect={true} onMultiUserIdsSelected={(ids) => { @@ -323,7 +323,7 @@ export const TaskDataEditor = ({ ...prev, assigneeIds: [...new Set([...(prev.assigneeIds ?? []), ...ids])], assigneeTeamId: null, - })) + }), isEditMode) }} allowTeams={true} allowUnassigned={true} @@ -340,7 +340,7 @@ export const TaskDataEditor = ({ updateForm(prev => ({ ...prev, assigneeIds: (prev.assigneeIds ?? []).filter((assigneeId) => assigneeId !== assignee.id), - })) + }), isEditMode) }} > {assignee.name} @@ -351,7 +351,7 @@ export const TaskDataEditor = ({ color="neutral" coloringStyle="outline" onClick={() => { - updateForm(prev => ({ ...prev, assigneeTeamId: null })) + updateForm(prev => ({ ...prev, assigneeTeamId: null }), isEditMode) }} > Team diff --git a/web/components/views/SaveViewDialog.tsx b/web/components/views/SaveViewDialog.tsx index 6499f93..da9d495 100644 --- a/web/components/views/SaveViewDialog.tsx +++ b/web/components/views/SaveViewDialog.tsx @@ -2,7 +2,7 @@ import { useCallback, useState } from 'react' import { useMutation } from '@apollo/client/react' -import { Button, Dialog, Input } from '@helpwave/hightide' +import { Button, Checkbox, Dialog, Input } from '@helpwave/hightide' import type { SavedViewEntityType } from '@/api/gql/generated' import { @@ -41,10 +41,12 @@ export function SaveViewDialog({ }: SaveViewDialogProps) { const translation = useTasksTranslation() const [name, setName] = useState('') + const [linkShared, setLinkShared] = useState(false) const handleClose = useCallback(() => { onClose() setName('') + setLinkShared(false) }, [onClose]) const [createSavedView, { loading }] = useMutation< @@ -80,6 +82,13 @@ export function SaveViewDialog({ onChange={(e) => setName(e.target.value)} /> +
+ {view.isOwner && ( + + )} From cd191e9aeed69eabb2ca68be2bb239686f54bdcd Mon Sep 17 00:00:00 2001 From: Felix Evers Date: Tue, 24 Mar 2026 07:57:03 +0100 Subject: [PATCH 2/4] update user selection --- web/api/gql/generated.ts | 4 +- web/api/graphql/GetOverviewData.graphql | 5 + .../tables/LocationFilterActiveLabel.tsx | 65 +++++++++++++ .../tables/LocationSubtreeFilterPopUp.tsx | 1 + web/components/tables/RecentPatientsTable.tsx | 21 +---- web/components/tables/RecentTasksTable.tsx | 93 ++++++++++++++---- web/components/tables/TaskList.tsx | 42 ++++++--- web/components/tasks/TaskDataEditor.tsx | 94 ++++++++++++++----- .../views/PatientViewTasksPanel.tsx | 2 + web/i18n/translations.ts | 19 ++++ web/locales/de-DE.arb | 8 ++ web/locales/en-US.arb | 8 ++ web/locales/es-ES.arb | 2 + web/locales/fr-FR.arb | 2 + web/locales/nl-NL.arb | 2 + web/locales/pt-BR.arb | 2 + web/pages/location/[id].tsx | 4 + web/pages/tasks/index.tsx | 7 +- web/pages/view/[uid].tsx | 7 +- web/utils/queryableFilterList.tsx | 11 ++- 20 files changed, 319 insertions(+), 80 deletions(-) create mode 100644 web/components/tables/LocationFilterActiveLabel.tsx diff --git a/web/api/gql/generated.ts b/web/api/gql/generated.ts index 6f95fb8..7e36469 100644 --- a/web/api/gql/generated.ts +++ b/web/api/gql/generated.ts @@ -882,7 +882,7 @@ export type GetOverviewDataQueryVariables = Exact<{ }>; -export type GetOverviewDataQuery = { __typename?: 'Query', recentPatientsTotal: number, recentTasksTotal: number, recentPatients: Array<{ __typename?: 'PatientType', id: string, name: string, sex: Sex, birthdate: any, position?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string } | null } | null, tasks: Array<{ __typename?: 'TaskType', updateDate?: any | null }>, properties: Array<{ __typename?: 'PropertyValueType', id: string, textValue?: string | null, numberValue?: number | null, booleanValue?: boolean | null, dateValue?: any | null, dateTimeValue?: any | null, selectValue?: string | null, multiSelectValues?: Array | null, userValue?: string | null, definition: { __typename?: 'PropertyDefinitionType', id: string, name: string, description?: string | null, fieldType: FieldType, isActive: boolean, allowedEntities: Array, options: Array }, user?: { __typename?: 'UserType', id: string, name: string, avatarUrl?: string | null, lastOnline?: any | null, isOnline: boolean } | null, team?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType } | null }> }>, recentTasks: Array<{ __typename?: 'TaskType', id: string, title: string, description?: string | null, done: boolean, dueDate?: any | null, updateDate?: any | null, priority?: string | null, assignees: Array<{ __typename?: 'UserType', id: string, name: string, avatarUrl?: string | null, lastOnline?: any | null, isOnline: boolean }>, patient?: { __typename?: 'PatientType', id: string, name: string, position?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string } | null } | null } | null, properties: Array<{ __typename?: 'PropertyValueType', id: string, textValue?: string | null, numberValue?: number | null, booleanValue?: boolean | null, dateValue?: any | null, dateTimeValue?: any | null, selectValue?: string | null, multiSelectValues?: Array | null, userValue?: string | null, definition: { __typename?: 'PropertyDefinitionType', id: string, name: string, description?: string | null, fieldType: FieldType, isActive: boolean, allowedEntities: Array, options: Array }, user?: { __typename?: 'UserType', id: string, name: string, avatarUrl?: string | null, lastOnline?: any | null, isOnline: boolean } | null, team?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType } | null }> }> }; +export type GetOverviewDataQuery = { __typename?: 'Query', recentPatientsTotal: number, recentTasksTotal: number, recentPatients: Array<{ __typename?: 'PatientType', id: string, name: string, sex: Sex, birthdate: any, position?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string } | null } | null, tasks: Array<{ __typename?: 'TaskType', updateDate?: any | null }>, properties: Array<{ __typename?: 'PropertyValueType', id: string, textValue?: string | null, numberValue?: number | null, booleanValue?: boolean | null, dateValue?: any | null, dateTimeValue?: any | null, selectValue?: string | null, multiSelectValues?: Array | null, userValue?: string | null, definition: { __typename?: 'PropertyDefinitionType', id: string, name: string, description?: string | null, fieldType: FieldType, isActive: boolean, allowedEntities: Array, options: Array }, user?: { __typename?: 'UserType', id: string, name: string, avatarUrl?: string | null, lastOnline?: any | null, isOnline: boolean } | null, team?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType } | null }> }>, recentTasks: Array<{ __typename?: 'TaskType', id: string, title: string, description?: string | null, done: boolean, dueDate?: any | null, updateDate?: any | null, priority?: string | null, assignees: Array<{ __typename?: 'UserType', id: string, name: string, avatarUrl?: string | null, lastOnline?: any | null, isOnline: boolean }>, assigneeTeam?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType } | null, patient?: { __typename?: 'PatientType', id: string, name: string, position?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string } | null } | null } | null, properties: Array<{ __typename?: 'PropertyValueType', id: string, textValue?: string | null, numberValue?: number | null, booleanValue?: boolean | null, dateValue?: any | null, dateTimeValue?: any | null, selectValue?: string | null, multiSelectValues?: Array | null, userValue?: string | null, definition: { __typename?: 'PropertyDefinitionType', id: string, name: string, description?: string | null, fieldType: FieldType, isActive: boolean, allowedEntities: Array, options: Array }, user?: { __typename?: 'UserType', id: string, name: string, avatarUrl?: string | null, lastOnline?: any | null, isOnline: boolean } | null, team?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType } | null }> }> }; export type GetPatientQueryVariables = Exact<{ id: Scalars['ID']['input']; @@ -1218,7 +1218,7 @@ export const GetAuditLogsDocument = {"kind":"Document","definitions":[{"kind":"O export const GetLocationNodeDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetLocationNode"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"locationNode"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parentId"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parentId"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parentId"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parentId"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parentId"}}]}}]}}]}}]}}]}}]}}]} as unknown as DocumentNode; export const GetLocationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetLocations"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"locationNodes"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parentId"}}]}}]}}]} as unknown as DocumentNode; export const GetMyTasksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetMyTasks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"me"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"tasks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"done"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"estimatedTime"}},{"kind":"Field","name":{"kind":"Name","value":"creationDate"}},{"kind":"Field","name":{"kind":"Name","value":"updateDate"}},{"kind":"Field","name":{"kind":"Name","value":"patient"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"assignedLocation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"assignedLocations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"assignees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}}]}}]}}]}}]} as unknown as DocumentNode; -export const GetOverviewDataDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetOverviewData"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsFilters"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"QueryFilterClauseInput"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSorts"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"QuerySortClauseInput"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsPagination"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"PaginationInput"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSearch"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"QuerySearchInput"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksFilters"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"QueryFilterClauseInput"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSorts"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"QuerySortClauseInput"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksPagination"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"PaginationInput"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSearch"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"QuerySearchInput"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"recentPatients"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsFilters"}}},{"kind":"Argument","name":{"kind":"Name","value":"sorts"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSorts"}}},{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsPagination"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSearch"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"sex"}},{"kind":"Field","name":{"kind":"Name","value":"birthdate"}},{"kind":"Field","name":{"kind":"Name","value":"position"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"tasks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateDate"}}]}},{"kind":"Field","name":{"kind":"Name","value":"properties"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"definition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"fieldType"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"allowedEntities"}},{"kind":"Field","name":{"kind":"Name","value":"options"}}]}},{"kind":"Field","name":{"kind":"Name","value":"textValue"}},{"kind":"Field","name":{"kind":"Name","value":"numberValue"}},{"kind":"Field","name":{"kind":"Name","value":"booleanValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateTimeValue"}},{"kind":"Field","name":{"kind":"Name","value":"selectValue"}},{"kind":"Field","name":{"kind":"Name","value":"multiSelectValues"}},{"kind":"Field","name":{"kind":"Name","value":"userValue"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"team"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"recentPatientsTotal"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsFilters"}}},{"kind":"Argument","name":{"kind":"Name","value":"sorts"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSorts"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSearch"}}}]},{"kind":"Field","name":{"kind":"Name","value":"recentTasks"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksFilters"}}},{"kind":"Argument","name":{"kind":"Name","value":"sorts"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSorts"}}},{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksPagination"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSearch"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"done"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"updateDate"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"assignees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"patient"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"position"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"properties"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"definition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"fieldType"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"allowedEntities"}},{"kind":"Field","name":{"kind":"Name","value":"options"}}]}},{"kind":"Field","name":{"kind":"Name","value":"textValue"}},{"kind":"Field","name":{"kind":"Name","value":"numberValue"}},{"kind":"Field","name":{"kind":"Name","value":"booleanValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateTimeValue"}},{"kind":"Field","name":{"kind":"Name","value":"selectValue"}},{"kind":"Field","name":{"kind":"Name","value":"multiSelectValues"}},{"kind":"Field","name":{"kind":"Name","value":"userValue"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"team"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"recentTasksTotal"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksFilters"}}},{"kind":"Argument","name":{"kind":"Name","value":"sorts"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSorts"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSearch"}}}]}]}}]} as unknown as DocumentNode; +export const GetOverviewDataDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetOverviewData"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsFilters"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"QueryFilterClauseInput"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSorts"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"QuerySortClauseInput"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsPagination"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"PaginationInput"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSearch"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"QuerySearchInput"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksFilters"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"QueryFilterClauseInput"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSorts"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"QuerySortClauseInput"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksPagination"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"PaginationInput"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSearch"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"QuerySearchInput"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"recentPatients"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsFilters"}}},{"kind":"Argument","name":{"kind":"Name","value":"sorts"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSorts"}}},{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsPagination"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSearch"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"sex"}},{"kind":"Field","name":{"kind":"Name","value":"birthdate"}},{"kind":"Field","name":{"kind":"Name","value":"position"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"tasks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateDate"}}]}},{"kind":"Field","name":{"kind":"Name","value":"properties"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"definition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"fieldType"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"allowedEntities"}},{"kind":"Field","name":{"kind":"Name","value":"options"}}]}},{"kind":"Field","name":{"kind":"Name","value":"textValue"}},{"kind":"Field","name":{"kind":"Name","value":"numberValue"}},{"kind":"Field","name":{"kind":"Name","value":"booleanValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateTimeValue"}},{"kind":"Field","name":{"kind":"Name","value":"selectValue"}},{"kind":"Field","name":{"kind":"Name","value":"multiSelectValues"}},{"kind":"Field","name":{"kind":"Name","value":"userValue"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"team"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"recentPatientsTotal"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsFilters"}}},{"kind":"Argument","name":{"kind":"Name","value":"sorts"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSorts"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentPatientsSearch"}}}]},{"kind":"Field","name":{"kind":"Name","value":"recentTasks"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksFilters"}}},{"kind":"Argument","name":{"kind":"Name","value":"sorts"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSorts"}}},{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksPagination"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSearch"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"done"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"updateDate"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"assignees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assigneeTeam"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}},{"kind":"Field","name":{"kind":"Name","value":"patient"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"position"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"properties"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"definition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"fieldType"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"allowedEntities"}},{"kind":"Field","name":{"kind":"Name","value":"options"}}]}},{"kind":"Field","name":{"kind":"Name","value":"textValue"}},{"kind":"Field","name":{"kind":"Name","value":"numberValue"}},{"kind":"Field","name":{"kind":"Name","value":"booleanValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateTimeValue"}},{"kind":"Field","name":{"kind":"Name","value":"selectValue"}},{"kind":"Field","name":{"kind":"Name","value":"multiSelectValues"}},{"kind":"Field","name":{"kind":"Name","value":"userValue"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"team"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"recentTasksTotal"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksFilters"}}},{"kind":"Argument","name":{"kind":"Name","value":"sorts"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSorts"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"recentTasksSearch"}}}]}]}}]} as unknown as DocumentNode; export const GetPatientDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetPatient"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"patient"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"firstname"}},{"kind":"Field","name":{"kind":"Name","value":"lastname"}},{"kind":"Field","name":{"kind":"Name","value":"birthdate"}},{"kind":"Field","name":{"kind":"Name","value":"sex"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"checksum"}},{"kind":"Field","name":{"kind":"Name","value":"assignedLocation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assignedLocations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"clinic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"position"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"teams"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"tasks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"done"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"estimatedTime"}},{"kind":"Field","name":{"kind":"Name","value":"updateDate"}},{"kind":"Field","name":{"kind":"Name","value":"assignees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assigneeTeam"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"properties"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"definition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"fieldType"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"allowedEntities"}},{"kind":"Field","name":{"kind":"Name","value":"options"}}]}},{"kind":"Field","name":{"kind":"Name","value":"textValue"}},{"kind":"Field","name":{"kind":"Name","value":"numberValue"}},{"kind":"Field","name":{"kind":"Name","value":"booleanValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateTimeValue"}},{"kind":"Field","name":{"kind":"Name","value":"selectValue"}},{"kind":"Field","name":{"kind":"Name","value":"multiSelectValues"}},{"kind":"Field","name":{"kind":"Name","value":"userValue"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"team"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}}]}}]}}]}}]} as unknown as DocumentNode; export const GetPatientsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetPatients"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"locationId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"states"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"PatientState"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filters"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"QueryFilterClauseInput"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"sorts"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"QuerySortClauseInput"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"pagination"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"PaginationInput"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"search"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"QuerySearchInput"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"patients"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"locationNodeId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locationId"}}},{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"states"},"value":{"kind":"Variable","name":{"kind":"Name","value":"states"}}},{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filters"}}},{"kind":"Argument","name":{"kind":"Name","value":"sorts"},"value":{"kind":"Variable","name":{"kind":"Name","value":"sorts"}}},{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"Variable","name":{"kind":"Name","value":"pagination"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"search"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"firstname"}},{"kind":"Field","name":{"kind":"Name","value":"lastname"}},{"kind":"Field","name":{"kind":"Name","value":"birthdate"}},{"kind":"Field","name":{"kind":"Name","value":"sex"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"assignedLocation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"assignedLocations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"clinic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"position"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"teams"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"tasks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"done"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"estimatedTime"}},{"kind":"Field","name":{"kind":"Name","value":"creationDate"}},{"kind":"Field","name":{"kind":"Name","value":"updateDate"}},{"kind":"Field","name":{"kind":"Name","value":"assignees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assigneeTeam"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"properties"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"definition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"fieldType"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"allowedEntities"}},{"kind":"Field","name":{"kind":"Name","value":"options"}}]}},{"kind":"Field","name":{"kind":"Name","value":"textValue"}},{"kind":"Field","name":{"kind":"Name","value":"numberValue"}},{"kind":"Field","name":{"kind":"Name","value":"booleanValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateTimeValue"}},{"kind":"Field","name":{"kind":"Name","value":"selectValue"}},{"kind":"Field","name":{"kind":"Name","value":"multiSelectValues"}},{"kind":"Field","name":{"kind":"Name","value":"userValue"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"team"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"patientsTotal"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"locationNodeId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locationId"}}},{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"states"},"value":{"kind":"Variable","name":{"kind":"Name","value":"states"}}},{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filters"}}},{"kind":"Argument","name":{"kind":"Name","value":"sorts"},"value":{"kind":"Variable","name":{"kind":"Name","value":"sorts"}}},{"kind":"Argument","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"search"}}}]}]}}]} as unknown as DocumentNode; export const GetTaskDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetTask"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"task"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"done"}},{"kind":"Field","name":{"kind":"Name","value":"dueDate"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"estimatedTime"}},{"kind":"Field","name":{"kind":"Name","value":"checksum"}},{"kind":"Field","name":{"kind":"Name","value":"updateDate"}},{"kind":"Field","name":{"kind":"Name","value":"patient"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assignees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assigneeTeam"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}},{"kind":"Field","name":{"kind":"Name","value":"properties"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"definition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"fieldType"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"allowedEntities"}},{"kind":"Field","name":{"kind":"Name","value":"options"}}]}},{"kind":"Field","name":{"kind":"Name","value":"textValue"}},{"kind":"Field","name":{"kind":"Name","value":"numberValue"}},{"kind":"Field","name":{"kind":"Name","value":"booleanValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateValue"}},{"kind":"Field","name":{"kind":"Name","value":"dateTimeValue"}},{"kind":"Field","name":{"kind":"Name","value":"selectValue"}},{"kind":"Field","name":{"kind":"Name","value":"multiSelectValues"}},{"kind":"Field","name":{"kind":"Name","value":"userValue"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}}]}},{"kind":"Field","name":{"kind":"Name","value":"team"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}}]}}]}}]}}]}}]} as unknown as DocumentNode; diff --git a/web/api/graphql/GetOverviewData.graphql b/web/api/graphql/GetOverviewData.graphql index 41566ff..fb48f79 100644 --- a/web/api/graphql/GetOverviewData.graphql +++ b/web/api/graphql/GetOverviewData.graphql @@ -65,6 +65,11 @@ query GetOverviewData($rootLocationIds: [ID!], $recentPatientsFilters: [QueryFil lastOnline isOnline } + assigneeTeam { + id + title + kind + } patient { id name diff --git a/web/components/tables/LocationFilterActiveLabel.tsx b/web/components/tables/LocationFilterActiveLabel.tsx new file mode 100644 index 0000000..32cb002 --- /dev/null +++ b/web/components/tables/LocationFilterActiveLabel.tsx @@ -0,0 +1,65 @@ +import type { FilterValue } from '@helpwave/hightide' +import { Chip } from '@helpwave/hightide' +import { MapPin } from 'lucide-react' +import { useMemo } from 'react' +import { useLocations } from '@/data' +import { useTasksTranslation } from '@/i18n/useTasksTranslation' + +export function LocationFilterActiveLabel({ value }: { value: FilterValue }) { + const translation = useTasksTranslation() + const { data } = useLocations() + const nodes = data?.locationNodes + + const content = useMemo(() => { + const param = value?.parameter ?? {} + const op = value?.operator ?? 'equals' + if (op === 'contains') { + const ids = (param.uuidValues as string[] | undefined) ?? [] + if (ids.length === 0) { + return {translation('selectLocation')} + } + if (ids.length <= 2) { + return ( + + {ids.map(id => { + const node = nodes?.find(n => n.id === id) + const title = node?.title ?? id + return ( + + + + {title} + + + ) + })} + + ) + } + return ( + + + + {ids.length} {translation('location')} + + + ) + } + const uid = param.uuidValue != null ? String(param.uuidValue) : '' + if (!uid) { + return {translation('selectLocation')} + } + const node = nodes?.find(n => n.id === uid) + const title = node?.title ?? uid + return ( + + + + {title} + + + ) + }, [nodes, translation, value]) + + return content +} diff --git a/web/components/tables/LocationSubtreeFilterPopUp.tsx b/web/components/tables/LocationSubtreeFilterPopUp.tsx index 6ea99d8..73405af 100644 --- a/web/components/tables/LocationSubtreeFilterPopUp.tsx +++ b/web/components/tables/LocationSubtreeFilterPopUp.tsx @@ -72,6 +72,7 @@ export const LocationSubtreeFilterPopUp = ({ value, onValueChange, onRemove, nam { const baseParam = value?.parameter ?? {} const next = newOperator === 'contains' ? 'contains' : 'equals' diff --git a/web/components/tables/RecentPatientsTable.tsx b/web/components/tables/RecentPatientsTable.tsx index d55ba24..ffbdde1 100644 --- a/web/components/tables/RecentPatientsTable.tsx +++ b/web/components/tables/RecentPatientsTable.tsx @@ -6,10 +6,6 @@ import type { TableProps } from '@helpwave/hightide' import { FillerCell, TableDisplay, TableProvider, Tooltip } from '@helpwave/hightide' import { DateDisplay } from '@/components/Date/DateDisplay' import { LocationChipsBySetting } from '@/components/patients/LocationChipsBySetting' -import { PropertyEntity } from '@/api/gql/generated' -import { usePropertyDefinitions } from '@/data' -import { getPropertyColumnsForEntity } from '@/utils/propertyColumn' -import { useColumnVisibilityWithPropertyDefaults } from '@/hooks/usePropertyColumnVisibility' type PatientViewModel = GetOverviewDataQuery['recentPatients'][0] @@ -24,23 +20,11 @@ export const RecentPatientsTable = ({ ...props }: RecentPatientsTableProps) => { const translation = useTasksTranslation() - const { data: propertyDefinitionsData } = usePropertyDefinitions() const [pagination, setPagination] = useState({ pageSize: 10, pageIndex: 0 }) const [sorting, setSorting] = useState([]) const [filters, setFilters] = useState([]) - const [columnVisibility, setColumnVisibilityRaw] = useState({}) - - const setColumnVisibility = useColumnVisibilityWithPropertyDefaults( - propertyDefinitionsData, - PropertyEntity.Patient, - setColumnVisibilityRaw - ) - - const patientPropertyColumns = useMemo[]>( - () => getPropertyColumnsForEntity(propertyDefinitionsData, PropertyEntity.Patient), - [propertyDefinitionsData] - ) + const [columnVisibility, setColumnVisibility] = useState({}) const patientColumns = useMemo[]>(() => [ { @@ -97,8 +81,7 @@ export const RecentPatientsTable = ({ maxSize: 200, filterFn: 'date', }, - ...patientPropertyColumns, - ], [translation, patientPropertyColumns]) + ], [translation]) const fillerRowCell = useCallback(() => , []) const onRowClick = useCallback((row: Row) => onSelectPatient(row.original.id), [onSelectPatient]) diff --git a/web/components/tables/RecentTasksTable.tsx b/web/components/tables/RecentTasksTable.tsx index 2a11043..4e905a2 100644 --- a/web/components/tables/RecentTasksTable.tsx +++ b/web/components/tables/RecentTasksTable.tsx @@ -6,12 +6,11 @@ import clsx from 'clsx' import type { TableProps } from '@helpwave/hightide' import { Button, Checkbox, FillerCell, TableDisplay, TableProvider, Tooltip } from '@helpwave/hightide' import { DateDisplay } from '@/components/Date/DateDisplay' +import { AvatarStatusComponent } from '@/components/AvatarStatusComponent' +import { UserInfoPopup } from '@/components/UserInfoPopup' import { DueDateUtils } from '@/utils/dueDate' import { PriorityUtils } from '@/utils/priority' -import { PropertyEntity } from '@/api/gql/generated' -import { usePropertyDefinitions } from '@/data' -import { getPropertyColumnsForEntity } from '@/utils/propertyColumn' -import { useColumnVisibilityWithPropertyDefaults } from '@/hooks/usePropertyColumnVisibility' +import { Users } from 'lucide-react' type TaskViewModel = GetOverviewDataQuery['recentTasks'][0] @@ -33,23 +32,12 @@ export const RecentTasksTable = ({ ...props }: RecentTasksTableProps) => { const translation = useTasksTranslation() - const { data: propertyDefinitionsData } = usePropertyDefinitions() + const [selectedUserId, setSelectedUserId] = useState(null) const [pagination, setPagination] = useState({ pageSize: 10, pageIndex: 0 }) const [sorting, setSorting] = useState([]) const [filters, setFilters] = useState([]) - const [columnVisibility, setColumnVisibilityRaw] = useState({}) - - const setColumnVisibility = useColumnVisibilityWithPropertyDefaults( - propertyDefinitionsData, - PropertyEntity.Task, - setColumnVisibilityRaw - ) - - const taskPropertyColumns = useMemo[]>( - () => getPropertyColumnsForEntity(propertyDefinitionsData, PropertyEntity.Task), - [propertyDefinitionsData] - ) + const [columnVisibility, setColumnVisibility] = useState({}) const taskColumns = useMemo[]>(() => [ { @@ -152,6 +140,69 @@ export const RecentTasksTable = ({ enableResizing: false, filterFn: 'date', }, + { + id: 'assignee', + header: translation('assignedTo'), + accessorFn: (row) => { + if (row.assigneeTeam) return row.assigneeTeam.title + return row.assignees[0]?.name ?? '' + }, + cell: ({ row }) => { + const team = row.original.assigneeTeam + if (team) { + return ( +
e.stopPropagation()} + role="presentation" + > + + {team.title} +
+ ) + } + const assignees = row.original.assignees ?? [] + const first = assignees[0] + if (!first) { + return {translation('notAssigned')} + } + const extra = assignees.length > 1 ? assignees.length - 1 : 0 + return ( +
e.stopPropagation()} + role="presentation" + > + + {extra > 0 && ( + + {translation('additionalAssigneesCount', { count: extra })} + + )} +
+ ) + }, + minSize: 180, + size: 220, + maxSize: 320, + filterFn: 'text', + }, { id: 'date', header: translation('updated'), @@ -169,8 +220,7 @@ export const RecentTasksTable = ({ enableResizing: false, filterFn: 'date', }, - ...taskPropertyColumns, - ], [translation, completeTask, reopenTask, onSelectPatient, taskPropertyColumns]) + ], [translation, completeTask, reopenTask, onSelectPatient]) const fillerRowCell = useCallback(() => , []) const onRowClick = useCallback((row: Row) => onSelectTask(row.original.id), [onSelectTask]) @@ -217,6 +267,11 @@ export const RecentTasksTable = ({
+ setSelectedUserId(null)} + /> ) } diff --git a/web/components/tables/TaskList.tsx b/web/components/tables/TaskList.tsx index a128468..2c15032 100644 --- a/web/components/tables/TaskList.tsx +++ b/web/components/tables/TaskList.tsx @@ -46,6 +46,8 @@ export type TaskViewModel = { }, assignee?: { id: string, name: string, avatarURL?: string | null, isOnline?: boolean | null }, assigneeTeam?: { id: string, title: string }, + /** Additional user assignees beyond the first (omit when team assignment). */ + additionalAssigneeCount?: number, done: boolean, properties?: GetTasksQuery['tasks'][0]['properties'], } @@ -516,22 +518,34 @@ export const TaskList = forwardRef(({ tasks: initial } if (assignee) { + const extra = row.original.additionalAssigneeCount ?? 0 return ( <> - {assignee.name} - + + {assignee.name} + {extra > 0 ? ` ${translation('additionalAssigneesCount', { count: extra })}` : ''} + +
+ + {extra > 0 && ( + + {translation('additionalAssigneesCount', { count: extra })} + + )} +
) } diff --git a/web/components/tasks/TaskDataEditor.tsx b/web/components/tasks/TaskDataEditor.tsx index dbfd0e0..b5a8979 100644 --- a/web/components/tasks/TaskDataEditor.tsx +++ b/web/components/tasks/TaskDataEditor.tsx @@ -2,7 +2,7 @@ import { useEffect, useState, useMemo } from 'react' import { useTasksTranslation } from '@/i18n/useTasksTranslation' import type { CreateTaskInput, UpdateTaskInput, TaskPriority } from '@/api/gql/generated' import { PatientState } from '@/api/gql/generated' -import { useCreateTask, useDeleteTask, usePatients, useTask, useUpdateTask, useUsers, useRefreshingEntityIds } from '@/data' +import { useCreateTask, useDeleteTask, useLocations, usePatients, useTask, useUpdateTask, useUsers, useRefreshingEntityIds } from '@/data' import type { FormFieldDataHandling } from '@helpwave/hightide' import { Button, @@ -19,13 +19,16 @@ import { useFormObserverKey, Visibility, FormObserver, - FlexibleDateTimeInput + FlexibleDateTimeInput, + IconButton } from '@helpwave/hightide' import { CenteredLoadingLogo } from '@/components/CenteredLoadingLogo' import { useTasksContext } from '@/hooks/useTasksContext' -import { User, Flag } from 'lucide-react' +import { User, Flag, Info, Users, XIcon } from 'lucide-react' import { DateDisplay } from '@/components/Date/DateDisplay' import { AssigneeSelect } from './AssigneeSelect' +import { AvatarStatusComponent } from '@/components/AvatarStatusComponent' +import { UserInfoPopup } from '@/components/UserInfoPopup' import { localToUTCWithSameTime, PatientDetailView } from '@/components/patients/PatientDetailView' import { ErrorDialog } from '@/components/ErrorDialog' import clsx from 'clsx' @@ -54,6 +57,7 @@ export const TaskDataEditor = ({ const { selectedRootLocationIds } = useTasksContext() const [errorDialog, setErrorDialog] = useState<{ isOpen: boolean, message?: string }>({ isOpen: false }) const [isShowingPatientDialog, setIsShowingPatientDialog] = useState(false) + const [assigneeUserPopupId, setAssigneeUserPopupId] = useState(null) const isEditMode = id !== null const taskId = id @@ -75,6 +79,7 @@ export const TaskDataEditor = ({ const [createTask, { loading: isCreating }] = useCreateTask() const [updateTaskMutate] = useUpdateTask() const { data: usersData } = useUsers() + const { data: locationsData } = useLocations() const updateTask = (vars: { id: string, data: UpdateTaskInput }) => { updateTaskMutate({ variables: vars, @@ -197,6 +202,14 @@ export const TaskDataEditor = ({ () => usersData?.users?.filter((user) => (assigneeIds ?? []).includes(user.id)) ?? [], [usersData, assigneeIds] ) + const teams = useMemo( + () => locationsData?.locationNodes?.filter((loc) => loc.kind === 'TEAM') ?? [], + [locationsData] + ) + const selectedTeamTitle = useMemo( + () => (assigneeTeamId ? teams.find((t) => t.id === assigneeTeamId)?.title : undefined), + [assigneeTeamId, teams] + ) const expectedFinishDate = useMemo(() => { if (!dueDate || !estimatedTime) return null const finishDate = new Date(dueDate) @@ -332,30 +345,60 @@ export const TaskDataEditor = ({ {(selectedAssignees.length > 0 || assigneeTeamId) && (
{selectedAssignees.map((assignee) => ( - +
+ + {assignee.name} +
+ setAssigneeUserPopupId(assignee.id)} + > + + + { + updateForm(prev => ({ + ...prev, + assigneeIds: (prev.assigneeIds ?? []).filter((id) => id !== assignee.id), + }), isEditMode) + }} + > + + +
))} {assigneeTeamId && ( - +
+
+ + {selectedTeamTitle ?? translation('locationType', { type: 'TEAM' })} +
+ { + updateForm(prev => ({ ...prev, assigneeTeamId: null }), isEditMode) + }} + > + + +
)} )} @@ -504,6 +547,11 @@ export const TaskDataEditor = ({ onSuccess={() => { }} /> + setAssigneeUserPopupId(null)} + /> ) diff --git a/web/components/views/PatientViewTasksPanel.tsx b/web/components/views/PatientViewTasksPanel.tsx index 28cd7d4..f1a4cd3 100644 --- a/web/components/views/PatientViewTasksPanel.tsx +++ b/web/components/views/PatientViewTasksPanel.tsx @@ -101,6 +101,8 @@ export function PatientViewTasksPanel({ assigneeTeam: task.assigneeTeam ? { id: task.assigneeTeam.id, title: task.assigneeTeam.title } : undefined, + additionalAssigneeCount: + !task.assigneeTeam && task.assignees.length > 1 ? task.assignees.length - 1 : 0, })) }) }, [patientsData]) diff --git a/web/i18n/translations.ts b/web/i18n/translations.ts index 7d837a5..4555905 100644 --- a/web/i18n/translations.ts +++ b/web/i18n/translations.ts @@ -15,6 +15,7 @@ export type TasksTranslationEntries = { 'add': string, 'addFastAccess': string, 'addFastAccessDescription': string, + 'additionalAssigneesCount': (values: { count: number }) => string, 'addPatient': string, 'addProperty': string, 'addTask': string, @@ -254,6 +255,9 @@ export const tasksTranslation: Translation { + return `+${count}` + }, 'addPatient': `Patient hinzufügen`, 'addProperty': `Eigenschaften hinzufügen`, 'addTask': `Aufgabe hinzufügen`, @@ -599,6 +603,9 @@ export const tasksTranslation: Translation { + return `+${count}` + }, 'addPatient': `Add Patient`, 'addProperty': `Add Property`, 'addTask': `Add Task`, @@ -944,6 +951,9 @@ export const tasksTranslation: Translation { + return `+${count}` + }, 'addPatient': `Añadir paciente`, 'addProperty': `Añadir propiedad`, 'addTask': `Añadir tarea`, @@ -1288,6 +1298,9 @@ export const tasksTranslation: Translation { + return `+${count}` + }, 'addPatient': `Ajouter un patient`, 'addProperty': `Ajouter une propriété`, 'addTask': `Ajouter une tâche`, @@ -1632,6 +1645,9 @@ export const tasksTranslation: Translation { + return `+${count}` + }, 'addPatient': `Patiënt toevoegen`, 'addProperty': `Eigenschap toevoegen`, 'addTask': `Taak toevoegen`, @@ -1979,6 +1995,9 @@ export const tasksTranslation: Translation { + return `+${count}` + }, 'addPatient': `Adicionar paciente`, 'addProperty': `Adicionar propriedade`, 'addTask': `Adicionar tarefa`, diff --git a/web/locales/de-DE.arb b/web/locales/de-DE.arb index 584a62d..3a7f155 100644 --- a/web/locales/de-DE.arb +++ b/web/locales/de-DE.arb @@ -11,6 +11,14 @@ "archivedPropertyDescription": "Archivierte Eigenschaften können nicht mehr neu Objekten hinzugeügt werden.", "archiveProperty": "Eigenschaft Archivieren", "assignedTo": "Zugewiesen an", + "additionalAssigneesCount": "+{count}", + "@additionalAssigneesCount": { + "placeholders": { + "count": { + "type": "number" + } + } + }, "authenticationFailed": "Authentifizierung fehlgeschlagen", "birthdate": "Geburtsdatum", "cancel": "Abbrechen", diff --git a/web/locales/en-US.arb b/web/locales/en-US.arb index d39e7c6..e0b1db9 100644 --- a/web/locales/en-US.arb +++ b/web/locales/en-US.arb @@ -11,6 +11,14 @@ "archivedPropertyDescription": "Archived Properties can no longer be assigned to objects.", "archiveProperty": "Archive Property", "assignedTo": "Assigned to", + "additionalAssigneesCount": "+{count}", + "@additionalAssigneesCount": { + "placeholders": { + "count": { + "type": "number" + } + } + }, "authenticationFailed": "Authentication Failed", "birthdate": "Birthdate", "cancel": "Cancel", diff --git a/web/locales/es-ES.arb b/web/locales/es-ES.arb index f7334ff..113290e 100644 --- a/web/locales/es-ES.arb +++ b/web/locales/es-ES.arb @@ -11,6 +11,8 @@ "archivedPropertyDescription": "Las propiedades archivadas ya no pueden asignarse a objetos.", "archiveProperty": "Archivar propiedad", "assignedTo": "Asignado a", + "additionalAssigneesCount": "+{count}", + "@additionalAssigneesCount": { "placeholders": { "count": { "type": "number" } } }, "authenticationFailed": "Error de autenticación", "birthdate": "Fecha de nacimiento", "cancel": "Cancelar", diff --git a/web/locales/fr-FR.arb b/web/locales/fr-FR.arb index 8758cf0..7450a4c 100644 --- a/web/locales/fr-FR.arb +++ b/web/locales/fr-FR.arb @@ -11,6 +11,8 @@ "archivedPropertyDescription": "Les propriétés archivées ne peuvent plus être assignées aux objets.", "archiveProperty": "Archiver la propriété", "assignedTo": "Assigné à", + "additionalAssigneesCount": "+{count}", + "@additionalAssigneesCount": { "placeholders": { "count": { "type": "number" } } }, "authenticationFailed": "Échec de l''authentification", "birthdate": "Date de naissance", "cancel": "Annuler", diff --git a/web/locales/nl-NL.arb b/web/locales/nl-NL.arb index 830fa69..49116fb 100644 --- a/web/locales/nl-NL.arb +++ b/web/locales/nl-NL.arb @@ -11,6 +11,8 @@ "archivedPropertyDescription": "Gearchiveerde eigenschappen kunnen niet meer aan objecten worden toegewezen.", "archiveProperty": "Eigenschap archiveren", "assignedTo": "Toegewezen aan", + "additionalAssigneesCount": "+{count}", + "@additionalAssigneesCount": { "placeholders": { "count": { "type": "number" } } }, "authenticationFailed": "Authenticatie mislukt", "birthdate": "Geboortedatum", "cancel": "Annuleren", diff --git a/web/locales/pt-BR.arb b/web/locales/pt-BR.arb index 24280c7..84f5c72 100644 --- a/web/locales/pt-BR.arb +++ b/web/locales/pt-BR.arb @@ -11,6 +11,8 @@ "archivedPropertyDescription": "Propriedades arquivadas não podem mais ser atribuídas a objetos.", "archiveProperty": "Arquivar propriedade", "assignedTo": "Atribuído a", + "additionalAssigneesCount": "+{count}", + "@additionalAssigneesCount": { "placeholders": { "count": { "type": "number" } } }, "authenticationFailed": "Falha na autenticação", "birthdate": "Data de nascimento", "cancel": "Cancelar", diff --git a/web/pages/location/[id].tsx b/web/pages/location/[id].tsx index 7964312..f82a580 100644 --- a/web/pages/location/[id].tsx +++ b/web/pages/location/[id].tsx @@ -94,6 +94,8 @@ const LocationPage: NextPage = () => { assigneeTeam: task.assigneeTeam ? { id: task.assigneeTeam.id, title: task.assigneeTeam.title } : undefined, + additionalAssigneeCount: + !task.assigneeTeam && task.assignees.length > 1 ? task.assignees.length - 1 : 0, })) } @@ -129,6 +131,8 @@ const LocationPage: NextPage = () => { assigneeTeam: task.assigneeTeam ? { id: task.assigneeTeam.id, title: task.assigneeTeam.title } : undefined, + additionalAssigneeCount: + !task.assigneeTeam && task.assignees.length > 1 ? task.assignees.length - 1 : 0, })) }) }, [patientsData, tasksData, isTeamLocation]) diff --git a/web/pages/tasks/index.tsx b/web/pages/tasks/index.tsx index c23a693..70a7915 100644 --- a/web/pages/tasks/index.tsx +++ b/web/pages/tasks/index.tsx @@ -125,6 +125,11 @@ const TasksPage: NextPage = () => { assignee: task.assignees[0] ? { id: task.assignees[0].id, name: task.assignees[0].name, avatarURL: task.assignees[0].avatarUrl, isOnline: task.assignees[0].isOnline ?? null } : undefined, + assigneeTeam: task.assigneeTeam + ? { id: task.assigneeTeam.id, title: task.assigneeTeam.title } + : undefined, + additionalAssigneeCount: + !task.assigneeTeam && task.assignees.length > 1 ? task.assignees.length - 1 : 0, properties: task.properties ?? [], })) }, [tasksData]) @@ -153,7 +158,7 @@ const TasksPage: NextPage = () => { router.replace('/tasks', undefined, { shallow: true })} totalCount={totalCount} diff --git a/web/pages/view/[uid].tsx b/web/pages/view/[uid].tsx index 81a3e1b..18d1aeb 100644 --- a/web/pages/view/[uid].tsx +++ b/web/pages/view/[uid].tsx @@ -287,6 +287,11 @@ function SavedTaskViewTab({ assignee: task.assignees[0] ? { id: task.assignees[0].id, name: task.assignees[0].name, avatarURL: task.assignees[0].avatarUrl, isOnline: task.assignees[0].isOnline ?? null } : undefined, + assigneeTeam: task.assigneeTeam + ? { id: task.assigneeTeam.id, title: task.assigneeTeam.title } + : undefined, + additionalAssigneeCount: + !task.assigneeTeam && task.assignees.length > 1 ? task.assignees.length - 1 : 0, properties: task.properties ?? [], })) }, [tasksData]) @@ -311,7 +316,7 @@ function SavedTaskViewTab({ void refetch()} - showAssignee={false} + showAssignee={true} totalCount={totalCount} loading={tasksLoading} searchQuery={searchQuery} diff --git a/web/utils/queryableFilterList.tsx b/web/utils/queryableFilterList.tsx index f86dac8..ef2a966 100644 --- a/web/utils/queryableFilterList.tsx +++ b/web/utils/queryableFilterList.tsx @@ -1,8 +1,9 @@ import type { ReactNode } from 'react' -import type { FilterListItem, FilterListPopUpBuilderProps } from '@helpwave/hightide' +import type { FilterListItem, FilterListPopUpBuilderProps, FilterValue } from '@helpwave/hightide' import type { DataType } from '@helpwave/hightide' import type { QueryableField } from '@/api/gql/generated' import { FieldType, QueryableFieldKind, QueryableValueType } from '@/api/gql/generated' +import { LocationFilterActiveLabel } from '@/components/tables/LocationFilterActiveLabel' import { LocationSubtreeFilterPopUp } from '@/components/tables/LocationSubtreeFilterPopUp' import { UserSelectFilterPopUp } from '@/components/tables/UserSelectFilterPopUp' @@ -48,6 +49,14 @@ export function queryableFieldsToFilterListItems( label: field.label, dataType, tags, + activeLabelBuilder: field.key === 'position' + ? (v: FilterValue): ReactNode => ( + <> + {field.label} + + + ) + : undefined, popUpBuilder: ft === FieldType.FieldTypeUser ? (props: FilterListPopUpBuilderProps): ReactNode => () : field.key === 'position' From cc70ebba3e681b1a0efe0346508a87c7b2325c38 Mon Sep 17 00:00:00 2001 From: Felix Evers Date: Tue, 24 Mar 2026 08:12:05 +0100 Subject: [PATCH 3/4] fix readonly views --- backend/api/inputs.py | 2 +- .../tables/AssigneeFilterActiveLabel.tsx | 85 ++++++++ web/components/tables/FilterPreviewMedia.tsx | 48 +++++ .../tables/LocationFilterActiveLabel.tsx | 27 ++- .../tables/LocationSubtreeFilterPopUp.tsx | 80 +++++-- .../tables/UserSelectFilterPopUp.tsx | 204 +++++++++++++++--- web/components/tasks/AssigneeSelectDialog.tsx | 6 +- web/components/views/SaveViewDialog.tsx | 15 +- web/pages/settings/views.tsx | 56 +---- web/pages/view/[uid].tsx | 87 +++----- web/utils/queryableFilterList.tsx | 16 +- 11 files changed, 444 insertions(+), 182 deletions(-) create mode 100644 web/components/tables/AssigneeFilterActiveLabel.tsx create mode 100644 web/components/tables/FilterPreviewMedia.tsx diff --git a/backend/api/inputs.py b/backend/api/inputs.py index 4350165..6ba84fc 100644 --- a/backend/api/inputs.py +++ b/backend/api/inputs.py @@ -206,7 +206,7 @@ class CreateSavedViewInput: filter_definition: str sort_definition: str parameters: str - visibility: SavedViewVisibility = SavedViewVisibility.PRIVATE + visibility: SavedViewVisibility = SavedViewVisibility.LINK_SHARED @strawberry.input diff --git a/web/components/tables/AssigneeFilterActiveLabel.tsx b/web/components/tables/AssigneeFilterActiveLabel.tsx new file mode 100644 index 0000000..df47775 --- /dev/null +++ b/web/components/tables/AssigneeFilterActiveLabel.tsx @@ -0,0 +1,85 @@ +import type { FilterValue } from '@helpwave/hightide' +import { Chip } from '@helpwave/hightide' +import { User } from 'lucide-react' +import { useMemo } from 'react' +import { useUsers } from '@/data' +import { useTasksTranslation } from '@/i18n/useTasksTranslation' +import { FilterPreviewAvatar } from '@/components/tables/FilterPreviewMedia' + +export function AssigneeFilterActiveLabel({ value }: { value: FilterValue }) { + const translation = useTasksTranslation() + const { data } = useUsers() + const users = data?.users + + const content = useMemo(() => { + const param = value?.parameter ?? {} + const op = value?.operator ?? 'equals' + if (op === 'contains') { + const ids = (param.uuidValues as string[] | undefined) ?? [] + if (ids.length === 0) { + return {translation('selectAssignee')} + } + if (ids.length <= 2) { + return ( + + {ids.map(id => { + const user = users?.find(u => u.id === id) + const title = user?.name ?? id + return ( + + + {user ? ( + + ) : ( + + )} + {title} + + + ) + })} + + ) + } + return ( + + + + {ids.slice(0, 3).map(id => { + const user = users?.find(u => u.id === id) + return user ? ( + + ) : ( + + ) + })} + + + {ids.length} {translation('users')} + + + + ) + } + const uid = param.uuidValue != null ? String(param.uuidValue) : '' + if (!uid) { + return {translation('selectAssignee')} + } + const user = users?.find(u => u.id === uid) + const title = user?.name ?? uid + return ( + + + {user ? ( + + ) : ( + + )} + {title} + + + ) + }, [users, translation, value]) + + return content +} diff --git a/web/components/tables/FilterPreviewMedia.tsx b/web/components/tables/FilterPreviewMedia.tsx new file mode 100644 index 0000000..4d983f7 --- /dev/null +++ b/web/components/tables/FilterPreviewMedia.tsx @@ -0,0 +1,48 @@ +import type { LocationType } from '@/api/gql/generated' +import { LocationChips } from '@/components/locations/LocationChips' +import { Avatar } from '@helpwave/hightide' +import clsx from 'clsx' + +export type FilterPreviewLocationItem = { + id: string, + title: string, + kind?: LocationType, +} + +export function FilterPreviewAvatar({ + name, + avatarUrl, + className, +}: { + name: string, + avatarUrl?: string | null, + className?: string, +}) { + return ( + + + + ) +} + +export function FilterPreviewLocationChips({ + locations, + className, +}: { + locations: FilterPreviewLocationItem[], + className?: string, +}) { + return ( + + + + ) +} diff --git a/web/components/tables/LocationFilterActiveLabel.tsx b/web/components/tables/LocationFilterActiveLabel.tsx index 32cb002..418b8d1 100644 --- a/web/components/tables/LocationFilterActiveLabel.tsx +++ b/web/components/tables/LocationFilterActiveLabel.tsx @@ -4,6 +4,12 @@ import { MapPin } from 'lucide-react' import { useMemo } from 'react' import { useLocations } from '@/data' import { useTasksTranslation } from '@/i18n/useTasksTranslation' +import { FilterPreviewLocationChips } from '@/components/tables/FilterPreviewMedia' +import type { LocationType } from '@/api/gql/generated' + +function nodeToPreviewLocation(node: { id: string, title: string, kind: LocationType }) { + return { id: node.id, title: node.title, kind: node.kind } +} export function LocationFilterActiveLabel({ value }: { value: FilterValue }) { const translation = useTasksTranslation() @@ -24,11 +30,17 @@ export function LocationFilterActiveLabel({ value }: { value: FilterValue }) { {ids.map(id => { const node = nodes?.find(n => n.id === id) const title = node?.title ?? id - return ( + return node ? ( + + ) : ( - - {title} + + {title} ) @@ -51,11 +63,16 @@ export function LocationFilterActiveLabel({ value }: { value: FilterValue }) { } const node = nodes?.find(n => n.id === uid) const title = node?.title ?? uid - return ( + return node ? ( + + ) : ( - {title} + {title} ) diff --git a/web/components/tables/LocationSubtreeFilterPopUp.tsx b/web/components/tables/LocationSubtreeFilterPopUp.tsx index 73405af..a9347d3 100644 --- a/web/components/tables/LocationSubtreeFilterPopUp.tsx +++ b/web/components/tables/LocationSubtreeFilterPopUp.tsx @@ -1,10 +1,15 @@ import { useTasksTranslation } from '@/i18n/useTasksTranslation' import { Button, FilterBasePopUp, type FilterListPopUpBuilderProps } from '@helpwave/hightide' -import { useId, useMemo, useState } from 'react' +import { useId, useMemo, useState, type ReactNode } from 'react' import { MapPin } from 'lucide-react' -import type { LocationNodeType } from '@/api/gql/generated' +import type { LocationNodeType, LocationType } from '@/api/gql/generated' import { LocationSelectionDialog } from '@/components/locations/LocationSelectionDialog' import { useLocations } from '@/data' +import { FilterPreviewLocationChips } from '@/components/tables/FilterPreviewMedia' + +function nodeToPreviewLocation(node: { id: string, title: string, kind: LocationType }) { + return { id: node.id, title: node.title, kind: node.kind } +} export const LocationSubtreeFilterPopUp = ({ value, onValueChange, onRemove, name }: FilterListPopUpBuilderProps) => { const translation = useTasksTranslation() @@ -51,20 +56,72 @@ export const LocationSubtreeFilterPopUp = ({ value, onValueChange, onRemove, nam setDialogOpen(false) } - const summary = useMemo(() => { - const nodes = locationsData?.locationNodes + const summaryContent = useMemo((): ReactNode => { + const locationNodes = locationsData?.locationNodes if (isMulti) { - const n = (uuidValues as string[] | undefined)?.length ?? 0 - return n === 0 ? translation('selectLocation') : `${n} ${translation('location')}` + const ids = (uuidValues as string[] | undefined) ?? [] + const n = ids.length + if (n === 0) { + return ( + <> + + {translation('selectLocation')} + + ) + } + if (n > 2) { + return ( + <> + + + {n} {translation('location')} + + + ) + } + return ( + + {ids.map(locId => { + const node = locationNodes?.find(x => x.id === locId) + return node ? ( + + ) : ( + + {locId} + + ) + })} + + ) } const uid = uuidValue != null && String(uuidValue) !== '' ? String(uuidValue) : undefined if (!uid) { - return translation('selectLocation') + return ( + <> + + {translation('selectLocation')} + + ) } - const node = nodes?.find(n => n.id === uid) - return node?.title ?? translation('selectLocation') + const node = locationNodes?.find(n => n.id === uid) + const label = node?.title ?? translation('selectLocation') + return node ? ( + + ) : ( + <> + + {label} + + ) }, [isMulti, locationsData?.locationNodes, uuidValue, uuidValues, translation]) return ( @@ -109,11 +166,10 @@ export const LocationSubtreeFilterPopUp = ({ value, onValueChange, onRemove, nam type="button" color="neutral" coloringStyle="outline" - className="inline-flex items-center gap-2" + className="inline-flex items-center gap-2 min-w-0 max-w-full h-auto py-1.5" onClick={() => setDialogOpen(true)} > - - {summary} + {summaryContent} diff --git a/web/components/tables/UserSelectFilterPopUp.tsx b/web/components/tables/UserSelectFilterPopUp.tsx index c033491..bbcd6db 100644 --- a/web/components/tables/UserSelectFilterPopUp.tsx +++ b/web/components/tables/UserSelectFilterPopUp.tsx @@ -1,48 +1,184 @@ import { useTasksTranslation } from '@/i18n/useTasksTranslation' -import { FilterBasePopUp, FilterOperatorUtils, Visibility, type FilterListPopUpBuilderProps } from '@helpwave/hightide' -import { useId, useMemo } from 'react' -import { AssigneeSelect } from '../tasks/AssigneeSelect' - +import { Button, FilterBasePopUp, type FilterListPopUpBuilderProps } from '@helpwave/hightide' +import { useId, useMemo, useState, type ReactNode } from 'react' +import { User } from 'lucide-react' +import { AssigneeSelectDialog } from '@/components/tasks/AssigneeSelectDialog' +import { UserInfoPopup } from '@/components/UserInfoPopup' +import { useUsers } from '@/data' +import { FilterPreviewAvatar } from '@/components/tables/FilterPreviewMedia' export const UserSelectFilterPopUp = ({ value, onValueChange, onRemove, name }: FilterListPopUpBuilderProps) => { const translation = useTasksTranslation() + const { data: usersData } = useUsers() const id = useId() - const ids = { - select: `user-select-filter-${id}`, - } + const [dialogOpen, setDialogOpen] = useState(false) + const [userInfoId, setUserInfoId] = useState(null) const operator = useMemo(() => { - const suggestion = value?.operator ?? 'contains' - if (!FilterOperatorUtils.typeCheck.tagsSingle(suggestion)) { - return 'contains' + const suggestion = value?.operator ?? 'equals' + return suggestion === 'contains' ? 'contains' : 'equals' + }, [value?.operator]) + + const uuidValue = value?.parameter?.uuidValue + const uuidValues = value?.parameter?.uuidValues + const isMulti = operator === 'contains' + + const initialMultiUserIds = useMemo(() => { + if (!isMulti) return [] + const v = uuidValues + return Array.isArray(v) ? v.map(String) : [] + }, [isMulti, uuidValues]) + + const singleValueForDialog = useMemo(() => { + if (isMulti) return '' + const u = uuidValue + return u != null && String(u) !== '' ? String(u) : '' + }, [isMulti, uuidValue]) + + const summaryContent = useMemo((): ReactNode => { + const users = usersData?.users + if (isMulti) { + const ids = (uuidValues as string[] | undefined) ?? [] + const n = ids.length + if (n === 0) { + return ( + <> + + {translation('selectAssignee')} + + ) + } + return ( + <> + + {ids.slice(0, 3).map(uid => { + const user = users?.find(u => u.id === uid) + return user ? ( + + ) : ( + + ) + })} + + + {n} {translation('users')} + + + ) + } + const uid = uuidValue != null && String(uuidValue) !== '' ? String(uuidValue) : undefined + if (!uid) { + return ( + <> + + {translation('selectAssignee')} + + ) } - return suggestion - }, [value]) + const user = users?.find(u => u.id === uid) + const label = user?.name ?? translation('selectAssignee') + return ( + <> + {user ? ( + + ) : ( + + )} + {label} + + ) + }, [isMulti, usersData?.users, uuidValue, uuidValues, translation]) - const parameter = value?.parameter ?? {} + const handleSingleSelected = (selectedValue: string) => { + const baseParam = value?.parameter ?? {} + onValueChange({ + ...value, + dataType: 'singleTag', + operator: 'equals', + parameter: { ...baseParam, uuidValue: selectedValue, uuidValues: undefined }, + }) + setDialogOpen(false) + } - const needsParameterInput = operator !== 'isUndefined' && operator !== 'isNotUndefined' + const handleMultiUserIdsSelected = (ids: string[]) => { + const baseParam = value?.parameter ?? {} + onValueChange({ + ...value, + dataType: 'singleTag', + operator: 'contains', + parameter: { ...baseParam, uuidValue: undefined, uuidValues: ids }, + }) + setDialogOpen(false) + } return ( - onValueChange({ dataType: 'singleTag', parameter, operator: newOperator })} - onRemove={onRemove} - allowedOperators={FilterOperatorUtils.operatorsByCategory.singleTag} - noParameterRequired={!needsParameterInput} - > - -
- - onValueChange({ ...value, parameter: { ...parameter, uuidValue: newUserValue } })} - onDialogClose={(newUserValue) => onValueChange({ ...value, parameter: { ...parameter, uuidValue: newUserValue } })} - onValueClear={() => onValueChange({ ...value, parameter: { ...parameter, uuidValue: undefined } })} - /> + <> + { + const baseParam = value?.parameter ?? {} + const next = newOperator === 'contains' ? 'contains' : 'equals' + if (next === 'equals') { + const u = baseParam.uuidValues + const first = Array.isArray(u) && u.length > 0 ? String(u[0]) : undefined + onValueChange({ + dataType: 'singleTag', + parameter: { ...baseParam, uuidValue: first, uuidValues: undefined }, + operator: 'equals', + }) + } else { + const u = baseParam.uuidValue + onValueChange({ + dataType: 'singleTag', + parameter: { + ...baseParam, + uuidValue: undefined, + uuidValues: u != null && String(u) !== '' ? [String(u)] : [], + }, + operator: 'contains', + }) + } + }} + onRemove={onRemove} + allowedOperators={['equals', 'contains']} + noParameterRequired={false} + > +
+ +
+ +
- -
+ + setDialogOpen(false)} + value={singleValueForDialog} + onValueChanged={handleSingleSelected} + multiUserSelect={isMulti} + onMultiUserIdsSelected={handleMultiUserIdsSelected} + initialMultiUserIds={initialMultiUserIds} + allowTeams={false} + allowUnassigned={false} + dialogTitle={translation('selectAssignee')} + onUserInfoClick={(userId) => setUserInfoId(userId)} + /> + setUserInfoId(null)} + /> + ) -} \ No newline at end of file +} diff --git a/web/components/tasks/AssigneeSelectDialog.tsx b/web/components/tasks/AssigneeSelectDialog.tsx index 251f73d..4d8066f 100644 --- a/web/components/tasks/AssigneeSelectDialog.tsx +++ b/web/components/tasks/AssigneeSelectDialog.tsx @@ -18,6 +18,7 @@ interface AssigneeSelectDialogProps { onUserInfoClick?: (userId: string) => void, multiUserSelect?: boolean, onMultiUserIdsSelected?: (userIds: string[]) => void, + initialMultiUserIds?: string[], } export const AssigneeSelectDialog = ({ @@ -32,6 +33,7 @@ export const AssigneeSelectDialog = ({ onUserInfoClick, multiUserSelect = false, onMultiUserIdsSelected, + initialMultiUserIds = [], }: AssigneeSelectDialogProps) => { const translation = useTasksTranslation() const [searchQuery, setSearchQuery] = useState('') @@ -94,9 +96,9 @@ export const AssigneeSelectDialog = ({ setSearchQuery('') } if (isOpen && multiUserSelect) { - setPendingUserIds(new Set()) + setPendingUserIds(new Set(initialMultiUserIds)) } - }, [isOpen, multiUserSelect]) + }, [isOpen, multiUserSelect, initialMultiUserIds]) const handleSelect = (selectedValue: string) => { onValueChanged(selectedValue) diff --git a/web/components/views/SaveViewDialog.tsx b/web/components/views/SaveViewDialog.tsx index da9d495..5f6ed6a 100644 --- a/web/components/views/SaveViewDialog.tsx +++ b/web/components/views/SaveViewDialog.tsx @@ -2,7 +2,7 @@ import { useCallback, useState } from 'react' import { useMutation } from '@apollo/client/react' -import { Button, Checkbox, Dialog, Input } from '@helpwave/hightide' +import { Button, Dialog, Input } from '@helpwave/hightide' import type { SavedViewEntityType } from '@/api/gql/generated' import { @@ -41,12 +41,10 @@ export function SaveViewDialog({ }: SaveViewDialogProps) { const translation = useTasksTranslation() const [name, setName] = useState('') - const [linkShared, setLinkShared] = useState(false) const handleClose = useCallback(() => { onClose() setName('') - setLinkShared(false) }, [onClose]) const [createSavedView, { loading }] = useMutation< @@ -82,13 +80,6 @@ export function SaveViewDialog({ onChange={(e) => setName(e.target.value)} />
-
-
- {view.isOwner && ( - - )} +
{!view.isOwner && ( - + setDuplicateOpen(true)} + > + + )}
diff --git a/web/utils/queryableFilterList.tsx b/web/utils/queryableFilterList.tsx index ef2a966..5d42317 100644 --- a/web/utils/queryableFilterList.tsx +++ b/web/utils/queryableFilterList.tsx @@ -3,6 +3,7 @@ import type { FilterListItem, FilterListPopUpBuilderProps, FilterValue } from '@ import type { DataType } from '@helpwave/hightide' import type { QueryableField } from '@/api/gql/generated' import { FieldType, QueryableFieldKind, QueryableValueType } from '@/api/gql/generated' +import { AssigneeFilterActiveLabel } from '@/components/tables/AssigneeFilterActiveLabel' import { LocationFilterActiveLabel } from '@/components/tables/LocationFilterActiveLabel' import { LocationSubtreeFilterPopUp } from '@/components/tables/LocationSubtreeFilterPopUp' import { UserSelectFilterPopUp } from '@/components/tables/UserSelectFilterPopUp' @@ -21,7 +22,7 @@ function valueKindToDataType(field: QueryableField): DataType { } function filterFieldDataType(field: QueryableField): DataType { - if (field.key === 'position') return 'singleTag' + if (field.key === 'position' || field.key === 'assignee') return 'singleTag' return valueKindToDataType(field) } @@ -44,6 +45,8 @@ export function queryableFieldsToFilterListItems( ? propertyFieldTypeByDefId.get(field.propertyDefinitionId) : undefined + const isUserFilterUi = ft === FieldType.FieldTypeUser || field.key === 'assignee' + return { id: field.key, label: field.label, @@ -56,8 +59,15 @@ export function queryableFieldsToFilterListItems( ) - : undefined, - popUpBuilder: ft === FieldType.FieldTypeUser + : isUserFilterUi + ? (v: FilterValue): ReactNode => ( + <> + {field.label} + + + ) + : undefined, + popUpBuilder: isUserFilterUi ? (props: FilterListPopUpBuilderProps): ReactNode => () : field.key === 'position' ? (props: FilterListPopUpBuilderProps): ReactNode => () From e0ac2f82a239a25677b0e851cdd84f232ecbe0ab Mon Sep 17 00:00:00 2001 From: Felix Evers Date: Tue, 24 Mar 2026 08:17:38 +0100 Subject: [PATCH 4/4] fix iOS compatibility issues --- web/components/layout/Page.tsx | 14 ++++---- .../properties/PropertyDetailView.tsx | 14 ++++---- web/components/tables/PatientList.tsx | 34 +++++++++++-------- web/components/tables/TaskList.tsx | 14 +++++--- web/globals.css | 12 ++++++- web/hooks/useAuth.tsx | 2 +- web/package-lock.json | 13 ++++++- web/package.json | 10 +++++- web/pages/auth/callback.tsx | 2 +- web/postcss.config.mjs | 7 ++-- web/utils/propertyColumn.tsx | 1 + 11 files changed, 84 insertions(+), 39 deletions(-) diff --git a/web/components/layout/Page.tsx b/web/components/layout/Page.tsx index 4b0362b..44c2d71 100644 --- a/web/components/layout/Page.tsx +++ b/web/components/layout/Page.tsx @@ -416,7 +416,7 @@ export const Header = ({ onMenuClick, isMenuOpen, ...props }: HeaderProps) => { color="neutral" coloringStyle="text" onClick={onMenuClick} - className="lg:hidden" + className="min-h-11 min-w-11 lg:hidden" > {isMenuOpen ? : } @@ -505,8 +505,9 @@ export const Sidebar = ({ isOpen, onClose, ...props }: SidebarProps) => { <> {isOpen && (
)}