diff --git a/backend/api/inputs.py b/backend/api/inputs.py index 6ba84fc..566c9d2 100644 --- a/backend/api/inputs.py +++ b/backend/api/inputs.py @@ -206,6 +206,9 @@ class CreateSavedViewInput: filter_definition: str sort_definition: str parameters: str + related_filter_definition: str = "{}" + related_sort_definition: str = "{}" + related_parameters: str = "{}" visibility: SavedViewVisibility = SavedViewVisibility.LINK_SHARED @@ -215,4 +218,7 @@ class UpdateSavedViewInput: filter_definition: str | None = None sort_definition: str | None = None parameters: str | None = None + related_filter_definition: str | None = None + related_sort_definition: str | None = None + related_parameters: str | None = None visibility: SavedViewVisibility | None = None diff --git a/backend/api/resolvers/saved_view.py b/backend/api/resolvers/saved_view.py index 31d0349..e29b96a 100644 --- a/backend/api/resolvers/saved_view.py +++ b/backend/api/resolvers/saved_view.py @@ -64,6 +64,9 @@ async def create_saved_view( (data.filter_definition, "filter_definition"), (data.sort_definition, "sort_definition"), (data.parameters, "parameters"), + (data.related_filter_definition, "related_filter_definition"), + (data.related_sort_definition, "related_sort_definition"), + (data.related_parameters, "related_parameters"), ): try: json.loads(blob) @@ -76,6 +79,9 @@ async def create_saved_view( filter_definition=data.filter_definition, sort_definition=data.sort_definition, parameters=data.parameters, + related_filter_definition=data.related_filter_definition, + related_sort_definition=data.related_sort_definition, + related_parameters=data.related_parameters, owner_user_id=user.id, visibility=data.visibility.value, ) @@ -122,6 +128,24 @@ async def update_saved_view( except json.JSONDecodeError as e: raise GraphQLError("Invalid JSON in parameters") from e row.parameters = data.parameters + if data.related_filter_definition is not None: + try: + json.loads(data.related_filter_definition) + except json.JSONDecodeError as e: + raise GraphQLError("Invalid JSON in related_filter_definition") from e + row.related_filter_definition = data.related_filter_definition + if data.related_sort_definition is not None: + try: + json.loads(data.related_sort_definition) + except json.JSONDecodeError as e: + raise GraphQLError("Invalid JSON in related_sort_definition") from e + row.related_sort_definition = data.related_sort_definition + if data.related_parameters is not None: + try: + json.loads(data.related_parameters) + except json.JSONDecodeError as e: + raise GraphQLError("Invalid JSON in related_parameters") from e + row.related_parameters = data.related_parameters if data.visibility is not None: row.visibility = data.visibility.value @@ -169,6 +193,9 @@ async def duplicate_saved_view( filter_definition=src.filter_definition, sort_definition=src.sort_definition, parameters=src.parameters, + related_filter_definition=src.related_filter_definition, + related_sort_definition=src.related_sort_definition, + related_parameters=src.related_parameters, owner_user_id=user.id, visibility=SavedViewVisibility.PRIVATE.value, ) diff --git a/backend/api/types/saved_view.py b/backend/api/types/saved_view.py index b9eca42..a2cc779 100644 --- a/backend/api/types/saved_view.py +++ b/backend/api/types/saved_view.py @@ -14,6 +14,9 @@ class SavedViewType: filter_definition: str sort_definition: str parameters: str + related_filter_definition: str + related_sort_definition: str + related_parameters: str owner_user_id: strawberry.ID visibility: SavedViewVisibility created_at: str @@ -33,6 +36,9 @@ def from_model( filter_definition=row.filter_definition, sort_definition=row.sort_definition, parameters=row.parameters, + related_filter_definition=row.related_filter_definition, + related_sort_definition=row.related_sort_definition, + related_parameters=row.related_parameters, owner_user_id=strawberry.ID(row.owner_user_id), visibility=SavedViewVisibility(row.visibility), created_at=row.created_at.isoformat() if row.created_at else "", diff --git a/backend/database/migrations/versions/add_saved_view_related_columns.py b/backend/database/migrations/versions/add_saved_view_related_columns.py new file mode 100644 index 0000000..04b1fc6 --- /dev/null +++ b/backend/database/migrations/versions/add_saved_view_related_columns.py @@ -0,0 +1,55 @@ +"""Add related_* columns for opposite-tab table state on saved_views. + +Revision ID: add_saved_view_related_columns +Revises: merge_saved_views_task_assignees +Create Date: 2026-04-05 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +revision: str = "add_saved_view_related_columns" +down_revision: Union[str, Sequence[str], None] = "merge_saved_views_task_assignees" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.add_column( + "saved_views", + sa.Column( + "related_filter_definition", + sa.Text(), + nullable=False, + server_default="{}", + ), + ) + op.add_column( + "saved_views", + sa.Column( + "related_sort_definition", + sa.Text(), + nullable=False, + server_default="{}", + ), + ) + op.add_column( + "saved_views", + sa.Column( + "related_parameters", + sa.Text(), + nullable=False, + server_default="{}", + ), + ) + op.alter_column("saved_views", "related_filter_definition", server_default=None) + op.alter_column("saved_views", "related_sort_definition", server_default=None) + op.alter_column("saved_views", "related_parameters", server_default=None) + + +def downgrade() -> None: + op.drop_column("saved_views", "related_parameters") + op.drop_column("saved_views", "related_sort_definition") + op.drop_column("saved_views", "related_filter_definition") diff --git a/backend/database/models/saved_view.py b/backend/database/models/saved_view.py index e885d18..858f5c7 100644 --- a/backend/database/models/saved_view.py +++ b/backend/database/models/saved_view.py @@ -32,6 +32,9 @@ class SavedView(Base): filter_definition: Mapped[str] = mapped_column(Text, nullable=False, default="{}") sort_definition: Mapped[str] = mapped_column(Text, nullable=False, default="{}") parameters: Mapped[str] = mapped_column(Text, nullable=False, default="{}") + related_filter_definition: Mapped[str] = mapped_column(Text, nullable=False, default="{}") + related_sort_definition: Mapped[str] = mapped_column(Text, nullable=False, default="{}") + related_parameters: Mapped[str] = mapped_column(Text, nullable=False, default="{}") owner_user_id: Mapped[str] = mapped_column( String, ForeignKey("users.id"), nullable=False ) diff --git a/web/api/gql/generated.ts b/web/api/gql/generated.ts index ca1f138..bbac914 100644 --- a/web/api/gql/generated.ts +++ b/web/api/gql/generated.ts @@ -63,6 +63,9 @@ export type CreateSavedViewInput = { filterDefinition: Scalars['String']['input']; name: Scalars['String']['input']; parameters: Scalars['String']['input']; + relatedFilterDefinition?: InputMaybe; + relatedParameters?: InputMaybe; + relatedSortDefinition?: InputMaybe; sortDefinition: Scalars['String']['input']; visibility?: SavedViewVisibility; }; @@ -652,6 +655,9 @@ export type SavedView = { name: Scalars['String']['output']; ownerUserId: Scalars['ID']['output']; parameters: Scalars['String']['output']; + relatedFilterDefinition: Scalars['String']['output']; + relatedParameters: Scalars['String']['output']; + relatedSortDefinition: Scalars['String']['output']; sortDefinition: Scalars['String']['output']; updatedAt: Scalars['String']['output']; visibility: SavedViewVisibility; @@ -799,6 +805,9 @@ export type UpdateSavedViewInput = { filterDefinition?: InputMaybe; name?: InputMaybe; parameters?: InputMaybe; + relatedFilterDefinition?: InputMaybe; + relatedParameters?: InputMaybe; + relatedSortDefinition?: InputMaybe; sortDefinition?: InputMaybe; visibility?: InputMaybe; }; @@ -922,7 +931,7 @@ export type GetTasksQueryVariables = Exact<{ }>; -export type GetTasksQuery = { __typename?: 'Query', tasksTotal: number, tasks: Array<{ __typename?: 'TaskType', id: string, title: string, description?: string | null, done: boolean, dueDate?: any | null, priority?: string | null, estimatedTime?: number | null, creationDate: any, updateDate?: any | null, patient?: { __typename?: 'PatientType', id: string, name: string, assignedLocation?: { __typename?: 'LocationNodeType', id: string, title: string, parent?: { __typename?: 'LocationNodeType', id: string, title: string } | null } | null, assignedLocations: Array<{ __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType } | null } | null } | null }> } | 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, 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 GetTasksQuery = { __typename?: 'Query', tasksTotal: number, tasks: Array<{ __typename?: 'TaskType', id: string, title: string, description?: string | null, done: boolean, dueDate?: any | null, priority?: string | null, estimatedTime?: number | null, creationDate: any, updateDate?: any | null, patient?: { __typename?: 'PatientType', id: string, name: string, firstname: string, lastname: string, birthdate: any, sex: Sex, state: PatientState, assignedLocation?: { __typename?: 'LocationNodeType', id: string, title: string, parent?: { __typename?: 'LocationNodeType', id: string, title: string } | null } | null, assignedLocations: Array<{ __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string, parent?: { __typename?: 'LocationNodeType', id: string, title: string, parent?: { __typename?: 'LocationNodeType', id: string, title: string } | null } | null } | null }>, clinic: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string, parent?: { __typename?: 'LocationNodeType', id: string, title: string, parent?: { __typename?: 'LocationNodeType', id: string, title: string, parent?: { __typename?: 'LocationNodeType', id: string, title: string } | null } | null } | null } | null }, position?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType } | null } | null } | null } | null, teams: Array<{ __typename?: 'LocationNodeType', id: string, title: string, kind: LocationType, parent?: { __typename?: 'LocationNodeType', id: string, title: string, parent?: { __typename?: 'LocationNodeType', id: string, title: string, parent?: { __typename?: 'LocationNodeType', id: string, title: string, parent?: { __typename?: 'LocationNodeType', id: string, title: string } | null } | 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 }> } | 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, 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 GetUserQueryVariables = Exact<{ id: Scalars['ID']['input']; @@ -1038,21 +1047,21 @@ export type QueryableFieldsQuery = { __typename?: 'Query', queryableFields: Arra export type MySavedViewsQueryVariables = Exact<{ [key: string]: never; }>; -export type MySavedViewsQuery = { __typename?: 'Query', mySavedViews: Array<{ __typename?: 'SavedView', id: string, name: string, baseEntityType: SavedViewEntityType, filterDefinition: string, sortDefinition: string, parameters: string, ownerUserId: string, visibility: SavedViewVisibility, createdAt: string, updatedAt: string, isOwner: boolean }> }; +export type MySavedViewsQuery = { __typename?: 'Query', mySavedViews: Array<{ __typename?: 'SavedView', id: string, name: string, baseEntityType: SavedViewEntityType, filterDefinition: string, sortDefinition: string, parameters: string, relatedFilterDefinition: string, relatedSortDefinition: string, relatedParameters: string, ownerUserId: string, visibility: SavedViewVisibility, createdAt: string, updatedAt: string, isOwner: boolean }> }; export type SavedViewQueryVariables = Exact<{ id: Scalars['ID']['input']; }>; -export type SavedViewQuery = { __typename?: 'Query', savedView?: { __typename?: 'SavedView', id: string, name: string, baseEntityType: SavedViewEntityType, filterDefinition: string, sortDefinition: string, parameters: string, ownerUserId: string, visibility: SavedViewVisibility, createdAt: string, updatedAt: string, isOwner: boolean } | null }; +export type SavedViewQuery = { __typename?: 'Query', savedView?: { __typename?: 'SavedView', id: string, name: string, baseEntityType: SavedViewEntityType, filterDefinition: string, sortDefinition: string, parameters: string, relatedFilterDefinition: string, relatedSortDefinition: string, relatedParameters: string, ownerUserId: string, visibility: SavedViewVisibility, createdAt: string, updatedAt: string, isOwner: boolean } | null }; export type CreateSavedViewMutationVariables = Exact<{ data: CreateSavedViewInput; }>; -export type CreateSavedViewMutation = { __typename?: 'Mutation', createSavedView: { __typename?: 'SavedView', id: string, name: string, baseEntityType: SavedViewEntityType, filterDefinition: string, sortDefinition: string, parameters: string, ownerUserId: string, visibility: SavedViewVisibility, createdAt: string, updatedAt: string, isOwner: boolean } }; +export type CreateSavedViewMutation = { __typename?: 'Mutation', createSavedView: { __typename?: 'SavedView', id: string, name: string, baseEntityType: SavedViewEntityType, filterDefinition: string, sortDefinition: string, parameters: string, relatedFilterDefinition: string, relatedSortDefinition: string, relatedParameters: string, ownerUserId: string, visibility: SavedViewVisibility, createdAt: string, updatedAt: string, isOwner: boolean } }; export type UpdateSavedViewMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -1060,7 +1069,7 @@ export type UpdateSavedViewMutationVariables = Exact<{ }>; -export type UpdateSavedViewMutation = { __typename?: 'Mutation', updateSavedView: { __typename?: 'SavedView', id: string, name: string, baseEntityType: SavedViewEntityType, filterDefinition: string, sortDefinition: string, parameters: string, ownerUserId: string, visibility: SavedViewVisibility, createdAt: string, updatedAt: string, isOwner: boolean } }; +export type UpdateSavedViewMutation = { __typename?: 'Mutation', updateSavedView: { __typename?: 'SavedView', id: string, name: string, baseEntityType: SavedViewEntityType, filterDefinition: string, sortDefinition: string, parameters: string, relatedFilterDefinition: string, relatedSortDefinition: string, relatedParameters: string, ownerUserId: string, visibility: SavedViewVisibility, createdAt: string, updatedAt: string, isOwner: boolean } }; export type DeleteSavedViewMutationVariables = Exact<{ id: Scalars['ID']['input']; @@ -1075,7 +1084,7 @@ export type DuplicateSavedViewMutationVariables = Exact<{ }>; -export type DuplicateSavedViewMutation = { __typename?: 'Mutation', duplicateSavedView: { __typename?: 'SavedView', id: string, name: string, baseEntityType: SavedViewEntityType, filterDefinition: string, sortDefinition: string, parameters: string, ownerUserId: string, visibility: SavedViewVisibility, createdAt: string, updatedAt: string, isOwner: boolean } }; +export type DuplicateSavedViewMutation = { __typename?: 'Mutation', duplicateSavedView: { __typename?: 'SavedView', id: string, name: string, baseEntityType: SavedViewEntityType, filterDefinition: string, sortDefinition: string, parameters: string, relatedFilterDefinition: string, relatedSortDefinition: string, relatedParameters: string, ownerUserId: string, visibility: SavedViewVisibility, createdAt: string, updatedAt: string, isOwner: boolean } }; export type PatientCreatedSubscriptionVariables = Exact<{ rootLocationIds?: InputMaybe | Scalars['ID']['input']>; @@ -1222,7 +1231,7 @@ export const GetOverviewDataDocument = {"kind":"Document","definitions":[{"kind" 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; -export const GetTasksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetTasks"},"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":"assigneeId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"assigneeTeamId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"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":"tasks"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"assigneeId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assigneeId"}}},{"kind":"Argument","name":{"kind":"Name","value":"assigneeTeamId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assigneeTeamId"}}},{"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":"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":"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":"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":"tasksTotal"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"assigneeId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assigneeId"}}},{"kind":"Argument","name":{"kind":"Name","value":"assigneeTeamId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assigneeTeamId"}}},{"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 GetTasksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetTasks"},"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":"assigneeId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"assigneeTeamId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"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":"tasks"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"assigneeId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assigneeId"}}},{"kind":"Argument","name":{"kind":"Name","value":"assigneeTeamId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assigneeTeamId"}}},{"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":"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":"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":"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":"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":"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":"tasksTotal"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}},{"kind":"Argument","name":{"kind":"Name","value":"assigneeId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assigneeId"}}},{"kind":"Argument","name":{"kind":"Name","value":"assigneeTeamId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assigneeTeamId"}}},{"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 GetUserDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetUser"},"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":"user"},"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":"username"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"email"}},{"kind":"Field","name":{"kind":"Name","value":"firstname"}},{"kind":"Field","name":{"kind":"Name","value":"lastname"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"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 GetUsersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetUsers"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"users"},"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 GetGlobalDataDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetGlobalData"},"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"}}}}}],"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":"username"}},{"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":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"lastOnline"}},{"kind":"Field","name":{"kind":"Name","value":"isOnline"}},{"kind":"Field","name":{"kind":"Name","value":"organizations"}},{"kind":"Field","name":{"kind":"Name","value":"rootLocations"},"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":"tasks"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"done"}}]}}]}},{"kind":"Field","alias":{"kind":"Name","value":"wards"},"name":{"kind":"Name","value":"locationNodes"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"kind"},"value":{"kind":"EnumValue","value":"WARD"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"parentId"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"teams"},"name":{"kind":"Name","value":"locationNodes"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"kind"},"value":{"kind":"EnumValue","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":"parentId"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"clinics"},"name":{"kind":"Name","value":"locationNodes"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"kind"},"value":{"kind":"EnumValue","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":"parentId"}}]}},{"kind":"Field","name":{"kind":"Name","value":"patients"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"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","alias":{"kind":"Name","value":"waitingPatients"},"name":{"kind":"Name","value":"patients"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"states"},"value":{"kind":"ListValue","values":[{"kind":"EnumValue","value":"WAIT"}]}},{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"state"}}]}}]}}]} as unknown as DocumentNode; @@ -1239,12 +1248,12 @@ export const DeletePropertyDefinitionDocument = {"kind":"Document","definitions" export const GetPropertyDefinitionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetPropertyDefinitions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"propertyDefinitions"},"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"}}]}}]}}]} as unknown as DocumentNode; export const GetPropertiesForSubjectDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetPropertiesForSubject"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"subjectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"subjectType"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"PropertyEntity"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"propertyDefinitions"},"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"}}]}}]}}]} as unknown as DocumentNode; export const QueryableFieldsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"QueryableFields"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"entity"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"queryableFields"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"entity"},"value":{"kind":"Variable","name":{"kind":"Name","value":"entity"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"kind"}},{"kind":"Field","name":{"kind":"Name","value":"valueType"}},{"kind":"Field","name":{"kind":"Name","value":"allowedOperators"}},{"kind":"Field","name":{"kind":"Name","value":"sortable"}},{"kind":"Field","name":{"kind":"Name","value":"sortDirections"}},{"kind":"Field","name":{"kind":"Name","value":"searchable"}},{"kind":"Field","name":{"kind":"Name","value":"filterable"}},{"kind":"Field","name":{"kind":"Name","value":"propertyDefinitionId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"targetEntity"}},{"kind":"Field","name":{"kind":"Name","value":"idFieldKey"}},{"kind":"Field","name":{"kind":"Name","value":"labelFieldKey"}},{"kind":"Field","name":{"kind":"Name","value":"allowedFilterModes"}}]}},{"kind":"Field","name":{"kind":"Name","value":"choice"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"optionKeys"}},{"kind":"Field","name":{"kind":"Name","value":"optionLabels"}}]}}]}}]}}]} as unknown as DocumentNode; -export const MySavedViewsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MySavedViews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"mySavedViews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"baseEntityType"}},{"kind":"Field","name":{"kind":"Name","value":"filterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"sortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"parameters"}},{"kind":"Field","name":{"kind":"Name","value":"ownerUserId"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isOwner"}}]}}]}}]} as unknown as DocumentNode; -export const SavedViewDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SavedView"},"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":"savedView"},"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":"name"}},{"kind":"Field","name":{"kind":"Name","value":"baseEntityType"}},{"kind":"Field","name":{"kind":"Name","value":"filterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"sortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"parameters"}},{"kind":"Field","name":{"kind":"Name","value":"ownerUserId"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isOwner"}}]}}]}}]} as unknown as DocumentNode; -export const CreateSavedViewDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateSavedView"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateSavedViewInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createSavedView"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"baseEntityType"}},{"kind":"Field","name":{"kind":"Name","value":"filterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"sortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"parameters"}},{"kind":"Field","name":{"kind":"Name","value":"ownerUserId"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isOwner"}}]}}]}}]} as unknown as DocumentNode; -export const UpdateSavedViewDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateSavedView"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateSavedViewInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateSavedView"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}},{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"baseEntityType"}},{"kind":"Field","name":{"kind":"Name","value":"filterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"sortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"parameters"}},{"kind":"Field","name":{"kind":"Name","value":"ownerUserId"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isOwner"}}]}}]}}]} as unknown as DocumentNode; +export const MySavedViewsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MySavedViews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"mySavedViews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"baseEntityType"}},{"kind":"Field","name":{"kind":"Name","value":"filterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"sortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"parameters"}},{"kind":"Field","name":{"kind":"Name","value":"relatedFilterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"relatedSortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"relatedParameters"}},{"kind":"Field","name":{"kind":"Name","value":"ownerUserId"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isOwner"}}]}}]}}]} as unknown as DocumentNode; +export const SavedViewDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SavedView"},"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":"savedView"},"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":"name"}},{"kind":"Field","name":{"kind":"Name","value":"baseEntityType"}},{"kind":"Field","name":{"kind":"Name","value":"filterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"sortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"parameters"}},{"kind":"Field","name":{"kind":"Name","value":"relatedFilterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"relatedSortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"relatedParameters"}},{"kind":"Field","name":{"kind":"Name","value":"ownerUserId"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isOwner"}}]}}]}}]} as unknown as DocumentNode; +export const CreateSavedViewDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateSavedView"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateSavedViewInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createSavedView"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"baseEntityType"}},{"kind":"Field","name":{"kind":"Name","value":"filterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"sortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"parameters"}},{"kind":"Field","name":{"kind":"Name","value":"relatedFilterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"relatedSortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"relatedParameters"}},{"kind":"Field","name":{"kind":"Name","value":"ownerUserId"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isOwner"}}]}}]}}]} as unknown as DocumentNode; +export const UpdateSavedViewDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateSavedView"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateSavedViewInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateSavedView"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}},{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"baseEntityType"}},{"kind":"Field","name":{"kind":"Name","value":"filterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"sortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"parameters"}},{"kind":"Field","name":{"kind":"Name","value":"relatedFilterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"relatedSortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"relatedParameters"}},{"kind":"Field","name":{"kind":"Name","value":"ownerUserId"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isOwner"}}]}}]}}]} as unknown as DocumentNode; export const DeleteSavedViewDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteSavedView"},"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":"deleteSavedView"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}]}}]} as unknown as DocumentNode; -export const DuplicateSavedViewDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DuplicateSavedView"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"duplicateSavedView"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}},{"kind":"Argument","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"baseEntityType"}},{"kind":"Field","name":{"kind":"Name","value":"filterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"sortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"parameters"}},{"kind":"Field","name":{"kind":"Name","value":"ownerUserId"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isOwner"}}]}}]}}]} as unknown as DocumentNode; +export const DuplicateSavedViewDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DuplicateSavedView"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"duplicateSavedView"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}},{"kind":"Argument","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"baseEntityType"}},{"kind":"Field","name":{"kind":"Name","value":"filterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"sortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"parameters"}},{"kind":"Field","name":{"kind":"Name","value":"relatedFilterDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"relatedSortDefinition"}},{"kind":"Field","name":{"kind":"Name","value":"relatedParameters"}},{"kind":"Field","name":{"kind":"Name","value":"ownerUserId"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"isOwner"}}]}}]}}]} as unknown as DocumentNode; export const PatientCreatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"PatientCreated"},"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"}}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"patientCreated"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}}]}]}}]} as unknown as DocumentNode; export const PatientUpdatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"PatientUpdated"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"patientId"}},"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"}}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"patientUpdated"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"patientId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"patientId"}}},{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}}]}]}}]} as unknown as DocumentNode; export const PatientStateChangedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"PatientStateChanged"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"patientId"}},"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"}}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"patientStateChanged"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"patientId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"patientId"}}},{"kind":"Argument","name":{"kind":"Name","value":"rootLocationIds"},"value":{"kind":"Variable","name":{"kind":"Name","value":"rootLocationIds"}}}]}]}}]} as unknown as DocumentNode; diff --git a/web/api/graphql/GetTasks.graphql b/web/api/graphql/GetTasks.graphql index 6014b38..3235b72 100644 --- a/web/api/graphql/GetTasks.graphql +++ b/web/api/graphql/GetTasks.graphql @@ -12,6 +12,11 @@ query GetTasks($rootLocationIds: [ID!], $assigneeId: ID, $assigneeTeamId: ID, $f patient { id name + firstname + lastname + birthdate + sex + state assignedLocation { id title @@ -21,6 +26,44 @@ query GetTasks($rootLocationIds: [ID!], $assigneeId: ID, $assigneeTeamId: ID, $f } } assignedLocations { + id + title + kind + parent { + id + title + parent { + id + title + parent { + id + title + } + } + } + } + clinic { + id + title + kind + parent { + id + title + parent { + id + title + parent { + id + title + parent { + id + title + } + } + } + } + } + position { id title kind @@ -40,6 +83,59 @@ query GetTasks($rootLocationIds: [ID!], $assigneeId: ID, $assigneeTeamId: ID, $f } } } + teams { + id + title + kind + parent { + id + title + parent { + id + title + parent { + id + title + parent { + id + title + } + } + } + } + } + properties { + id + definition { + id + name + description + fieldType + isActive + allowedEntities + options + } + textValue + numberValue + booleanValue + dateValue + dateTimeValue + selectValue + multiSelectValues + userValue + user { + id + name + avatarUrl + lastOnline + isOnline + } + team { + id + title + kind + } + } } assignees { id diff --git a/web/api/graphql/SavedView.graphql b/web/api/graphql/SavedView.graphql index dea0394..1964b2b 100644 --- a/web/api/graphql/SavedView.graphql +++ b/web/api/graphql/SavedView.graphql @@ -6,6 +6,9 @@ query MySavedViews { filterDefinition sortDefinition parameters + relatedFilterDefinition + relatedSortDefinition + relatedParameters ownerUserId visibility createdAt @@ -22,6 +25,9 @@ query SavedView($id: ID!) { filterDefinition sortDefinition parameters + relatedFilterDefinition + relatedSortDefinition + relatedParameters ownerUserId visibility createdAt @@ -38,6 +44,9 @@ mutation CreateSavedView($data: CreateSavedViewInput!) { filterDefinition sortDefinition parameters + relatedFilterDefinition + relatedSortDefinition + relatedParameters ownerUserId visibility createdAt @@ -54,6 +63,9 @@ mutation UpdateSavedView($id: ID!, $data: UpdateSavedViewInput!) { filterDefinition sortDefinition parameters + relatedFilterDefinition + relatedSortDefinition + relatedParameters ownerUserId visibility createdAt @@ -74,6 +86,9 @@ mutation DuplicateSavedView($id: ID!, $name: String!) { filterDefinition sortDefinition parameters + relatedFilterDefinition + relatedSortDefinition + relatedParameters ownerUserId visibility createdAt diff --git a/web/components/properties/PropertyEntry.tsx b/web/components/properties/PropertyEntry.tsx index a34e17f..f64546f 100644 --- a/web/components/properties/PropertyEntry.tsx +++ b/web/components/properties/PropertyEntry.tsx @@ -147,7 +147,6 @@ export const PropertyEntry = ({ onDialogClose={userValue => { onEditComplete({ ...value, userValue: userValue || undefined }) }} - onValueClear={onValueClear} allowTeams={true} /> )} diff --git a/web/components/tables/PatientList.tsx b/web/components/tables/PatientList.tsx index a8f28b7..062a435 100644 --- a/web/components/tables/PatientList.tsx +++ b/web/components/tables/PatientList.tsx @@ -50,6 +50,7 @@ import { stringifyViewParameters, tableViewStateMatchesBaseline } from '@/utils/viewDefinition' +import { applyVirtualDerivedPatients } from '@/utils/virtualDerivedTableState' import type { ViewParameters } from '@/utils/viewDefinition' export type PatientViewModel = { @@ -110,9 +111,13 @@ type PatientListProps = { embedded?: boolean, embeddedPatients?: PatientViewModel[], embeddedOnRefetch?: () => void, + /** When set with embeddedPatients: client-side filter/sort/search on derived rows; show full toolbar. */ + derivedVirtualMode?: boolean, + /** Persist overwrite targets base view triple or related triple (opposite tab). */ + savedViewScope?: 'base' | 'related', } -export const PatientList = forwardRef(({ initialPatientId, onInitialPatientOpened, acceptedStates: _acceptedStates, rootLocationIds, locationId, viewDefaultFilters, viewDefaultSorting, viewDefaultSearchQuery, viewDefaultColumnVisibility, viewDefaultColumnOrder, readOnly: _readOnly, hideSaveView, savedViewId, onSavedViewCreated, onPatientUpdated, embedded = false, embeddedPatients, embeddedOnRefetch }, ref) => { +export const PatientList = forwardRef(({ initialPatientId, onInitialPatientOpened, acceptedStates: _acceptedStates, rootLocationIds, locationId, viewDefaultFilters, viewDefaultSorting, viewDefaultSearchQuery, viewDefaultColumnVisibility, viewDefaultColumnOrder, readOnly: _readOnly, hideSaveView, savedViewId, onSavedViewCreated, onPatientUpdated, embedded = false, embeddedPatients, embeddedOnRefetch, derivedVirtualMode = false, savedViewScope = 'base' }, ref) => { const translation = useTasksTranslation() const { locale } = useLocale() const { selectedRootLocationIds } = useTasksContext() @@ -149,10 +154,13 @@ export const PatientList = forwardRef(({ initi )) useEffect(() => { - if (embedded) { + if (embedded && !derivedVirtualMode) { setListLayout('table') } - }, [embedded]) + }, [embedded, derivedVirtualMode]) + + const showFullToolbar = !embedded || derivedVirtualMode + const useEmbeddedNoop = embedded && !derivedVirtualMode const [sorting, setSorting] = useState(() => viewDefaultSorting ?? []) const [filters, setFilters] = useState(() => viewDefaultFilters ?? []) const [columnVisibility, setColumnVisibilityRaw] = useState(() => viewDefaultColumnVisibility ?? {}) @@ -249,6 +257,23 @@ export const PatientList = forwardRef(({ initi const handleOverwriteSavedView = useCallback(async () => { if (!savedViewId) return + if (savedViewScope === 'related') { + await updateSavedView({ + variables: { + id: savedViewId, + data: { + relatedFilterDefinition: serializeColumnFiltersForView(filters as ColumnFiltersState), + relatedSortDefinition: serializeSortingForView(sorting), + relatedParameters: stringifyViewParameters({ + searchQuery: searchQuery || undefined, + columnVisibility, + columnOrder, + } satisfies ViewParameters), + }, + }, + }) + return + } await updateSavedView({ variables: { id: savedViewId, @@ -267,6 +292,7 @@ export const PatientList = forwardRef(({ initi }) }, [ savedViewId, + savedViewScope, updateSavedView, filters, sorting, @@ -338,7 +364,7 @@ export const PatientList = forwardRef(({ initi sorts: apiSorting.length > 0 ? apiSorting : undefined, filters: apiFilters.length > 0 ? apiFilters : undefined, search: searchInput, - skip: embedded && embeddedPatients !== undefined, + skip: derivedVirtualMode || (embedded && embeddedPatients !== undefined), } ) if (totalCount != null) lastTotalCountRef.current = totalCount @@ -371,13 +397,32 @@ export const PatientList = forwardRef(({ initi } }, []) - const patients: PatientViewModel[] = useMemo(() => { + const patientsFromSource = useMemo((): PatientViewModel[] => { if (embedded && embeddedPatients !== undefined) return embeddedPatients if (!accumulatedPatientsRaw || accumulatedPatientsRaw.length === 0) return [] return accumulatedPatientsRaw.map(mapPatientRow) }, [embedded, embeddedPatients, accumulatedPatientsRaw, mapPatientRow]) - const showBlockingLoadingOverlay = patientsLoading && patients.length === 0 + const patients: PatientViewModel[] = useMemo(() => { + if (derivedVirtualMode && embeddedPatients !== undefined) { + return applyVirtualDerivedPatients( + embeddedPatients, + filters as ColumnFiltersState, + sorting, + searchQuery + ) + } + return patientsFromSource + }, [ + derivedVirtualMode, + embeddedPatients, + patientsFromSource, + filters, + sorting, + searchQuery, + ]) + + const showBlockingLoadingOverlay = patientsLoading && patients.length === 0 && !derivedVirtualMode const tablePagination = useMemo( (): PaginationState => ({ @@ -787,16 +832,16 @@ export const PatientList = forwardRef(({ initi ) const embeddedDashboardColumnVisibility = useMemo((): VisibilityState | null => { - if (!embedded) return null + if (!embedded || derivedVirtualMode) return null const visible = new Set(['name', 'position', 'updateDate']) const vis: VisibilityState = {} for (const id of knownColumnIdsOrdered) { vis[id] = visible.has(id) } return vis - }, [embedded, knownColumnIdsOrdered]) + }, [embedded, derivedVirtualMode, knownColumnIdsOrdered]) - const tableColumnVisibility = embedded && embeddedDashboardColumnVisibility != null + const tableColumnVisibility = embedded && !derivedVirtualMode && embeddedDashboardColumnVisibility != null ? embeddedDashboardColumnVisibility : columnVisibility @@ -864,11 +909,11 @@ export const PatientList = forwardRef(({ initi columnOrder: sanitizedColumnOrder, pagination: tablePagination, } as Partial as TableState} - onColumnVisibilityChange={embedded ? embeddedTableStateNoop : setColumnVisibility} - onColumnOrderChange={embedded ? embeddedTableStateNoop : deferSetColumnOrder} + onColumnVisibilityChange={useEmbeddedNoop ? embeddedTableStateNoop : setColumnVisibility} + onColumnOrderChange={useEmbeddedNoop ? embeddedTableStateNoop : deferSetColumnOrder} onPaginationChange={() => {}} - onSortingChange={embedded ? embeddedTableStateNoop : setSorting} - onColumnFiltersChange={embedded ? embeddedTableStateNoop : setFilters} + onSortingChange={useEmbeddedNoop ? embeddedTableStateNoop : setSorting} + onColumnFiltersChange={useEmbeddedNoop ? embeddedTableStateNoop : setFilters} enableMultiSort={true} enablePinning={false} pageCount={1} @@ -882,7 +927,7 @@ export const PatientList = forwardRef(({ initi enableColumnPinning={false} >
- {!embedded && ( + {showFullToolbar && (
@@ -922,6 +967,7 @@ export const PatientList = forwardRef(({ initi onOverwrite={handleOverwriteSavedView} onOpenSaveAsNew={() => setIsSaveViewDialogOpen(true)} onDiscard={handleDiscardViewChanges} + hideSaveAsNew={savedViewScope === 'related' && derivedVirtualMode} />
@@ -942,17 +988,19 @@ export const PatientList = forwardRef(({ initi > - { - setSelectedPatient(undefined) - setIsPanelOpen(true) - }} - color="primary" - > - - + {!derivedVirtualMode && ( + { + setSelectedPatient(undefined) + setIsPanelOpen(true) + }} + color="primary" + > + + + )}
{isShowFilters && ( @@ -992,7 +1040,7 @@ export const PatientList = forwardRef(({ initi ))}
)} - {stableTotalCount != null && hasMore && !embedded && ( + {stableTotalCount != null && hasMore && !embedded && !derivedVirtualMode && ( @@ -1015,22 +1063,24 @@ export const PatientList = forwardRef(({ initi }} /> - setIsSaveViewDialogOpen(false)} - baseEntityType={SavedViewEntityType.Patient} - filterDefinition={serializeColumnFiltersForView(filters as ColumnFiltersState)} - sortDefinition={serializeSortingForView(sorting)} - parameters={stringifyViewParameters({ - rootLocationIds: effectiveRootLocationIds ?? undefined, - locationId: hasLocationFilter ? undefined : (locationId ?? undefined), - searchQuery: searchQuery || undefined, - columnVisibility, - columnOrder, - } satisfies ViewParameters)} - presentation={savedViewId ? 'default' : 'fromSystemList'} - onCreated={onSavedViewCreated} - /> + {savedViewScope === 'base' && ( + setIsSaveViewDialogOpen(false)} + baseEntityType={SavedViewEntityType.Patient} + filterDefinition={serializeColumnFiltersForView(filters as ColumnFiltersState)} + sortDefinition={serializeSortingForView(sorting)} + parameters={stringifyViewParameters({ + rootLocationIds: effectiveRootLocationIds ?? undefined, + locationId: hasLocationFilter ? undefined : (locationId ?? undefined), + searchQuery: searchQuery || undefined, + columnVisibility, + columnOrder, + } satisfies ViewParameters)} + presentation={savedViewId ? 'default' : 'fromSystemList'} + onCreated={onSavedViewCreated} + /> + )} ) diff --git a/web/components/tables/TaskList.tsx b/web/components/tables/TaskList.tsx index d9d6cee..a2ab5fa 100644 --- a/web/components/tables/TaskList.tsx +++ b/web/components/tables/TaskList.tsx @@ -149,9 +149,11 @@ type TaskListProps = { loadMore?: () => void, hasMore?: boolean, embedded?: boolean, + /** Row order and search already applied in parent (e.g. saved view derived task list). */ + virtualDerivedOrder?: boolean, } -export const TaskList = forwardRef(({ tasks: initialTasks, onRefetch, showAssignee = false, initialTaskId, onInitialTaskOpened, headerActions, saveViewSlot, totalCount, loading = false, tableState: controlledTableState, searchQuery: searchQueryProp, onSearchQueryChange, loadMore: loadMoreProp, hasMore: hasMoreProp, embedded = false }, ref) => { +export const TaskList = forwardRef(({ tasks: initialTasks, onRefetch, showAssignee = false, initialTaskId, onInitialTaskOpened, headerActions, saveViewSlot, totalCount, loading = false, tableState: controlledTableState, searchQuery: searchQueryProp, onSearchQueryChange, loadMore: loadMoreProp, hasMore: hasMoreProp, embedded = false, virtualDerivedOrder = false }, ref) => { const translation = useTasksTranslation() const { data: propertyDefinitionsData } = usePropertyDefinitions() const { data: queryableFieldsData } = useQueryableFields('Task') @@ -302,6 +304,10 @@ export const TaskList = forwardRef(({ tasks: initial return task }) + if (virtualDerivedOrder) { + return data + } + if (!isServerDriven && searchQuery) { const lowerQuery = searchQuery.toLowerCase() data = data.filter(t => @@ -323,12 +329,12 @@ export const TaskList = forwardRef(({ tasks: initial }) } return data - }, [initialTasks, optimisticUpdates, searchQuery, isServerDriven]) + }, [initialTasks, optimisticUpdates, searchQuery, isServerDriven, virtualDerivedOrder]) useEffect(() => { if (isServerDriven) return setClientVisibleCount(LIST_PAGE_SIZE) - }, [initialTasksSyncKey, searchQuery, isServerDriven]) + }, [initialTasksSyncKey, searchQuery, isServerDriven, virtualDerivedOrder]) const displayedTasks = useMemo(() => { if (isServerDriven) return tasks @@ -947,7 +953,7 @@ export const TaskList = forwardRef(({ tasks: initial {isShowFilters && ( -
+
(({ tasks: initial
)} {isShowSorting && ( -
+
void, onDialogClose?: (value: string) => void, - onValueClear?: () => void, allowTeams?: boolean, allowUnassigned?: boolean, excludeUserIds?: string[], @@ -27,7 +26,6 @@ export const AssigneeSelect = ({ value, onValueChanged, onDialogClose, - onValueClear, allowTeams = true, allowUnassigned: _allowUnassigned = false, excludeUserIds = [], @@ -137,20 +135,6 @@ export const AssigneeSelect = ({ )} - {onValueClear && ( - - )}
diff --git a/web/components/tasks/TaskCardView.tsx b/web/components/tasks/TaskCardView.tsx index 8cdd01f..a3c1aaa 100644 --- a/web/components/tasks/TaskCardView.tsx +++ b/web/components/tasks/TaskCardView.tsx @@ -190,69 +190,71 @@ export const TaskCardView = ({ task, onToggleDone: _onToggleDone, onClick, showA }} >
-
-
e.stopPropagation()}> - -
-
-
-
- {(task as FlexibleTask).priority && ( +
+
+
e.stopPropagation()}> + +
+
+
+
+ {(task as FlexibleTask).priority && ( +
+ )}
- )} -
- {taskName} + > + {taskName} +
+ {task.assigneeTeam && ( +
+ + {task.assigneeTeam.title} +
+ )} + {!task.assigneeTeam && task.assignee && ( + + )}
- {task.assigneeTeam && ( -
- - {task.assigneeTeam.title} -
- )} - {!task.assigneeTeam && task.assignee && ( - + {descriptionPreview && ( + + {descriptionPreview} + )}
- {descriptionPreview && ( - - {descriptionPreview} - - )}
-
-
+
+
{(task as FlexibleTask).estimatedTime && ( -
+
- + {(task as FlexibleTask).estimatedTime! < 60 ? `${(task as FlexibleTask).estimatedTime}m` : `${Math.floor((task as FlexibleTask).estimatedTime! / 60)}h ${(task as FlexibleTask).estimatedTime! % 60}m`} @@ -260,14 +262,14 @@ export const TaskCardView = ({ task, onToggleDone: _onToggleDone, onClick, showA
)} {dueDate && ( -
+
)}
{expectedFinishDate && ( -
+
diff --git a/web/components/views/PatientViewTasksPanel.tsx b/web/components/views/PatientViewTasksPanel.tsx index feac806..433179b 100644 --- a/web/components/views/PatientViewTasksPanel.tsx +++ b/web/components/views/PatientViewTasksPanel.tsx @@ -1,18 +1,41 @@ 'use client' -import { useEffect, useMemo } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' +import { useMutation } from '@apollo/client/react' +import { Visibility } from '@helpwave/hightide' +import type { ColumnFiltersState } from '@tanstack/react-table' import { usePatients } from '@/data' import { PatientState } from '@/api/gql/generated' import type { QuerySearchInput } from '@/api/gql/generated' +import { + PropertyEntity, + UpdateSavedViewDocument, + MySavedViewsDocument, + SavedViewDocument, + type UpdateSavedViewMutation, + type UpdateSavedViewMutationVariables +} from '@/api/gql/generated' import { columnFiltersToQueryFilterClauses, sortingStateToQuerySortClauses } from '@/utils/tableStateToApi' import { deserializeColumnFiltersFromView, deserializeSortingFromView, - hasActiveLocationFilter + hasActiveLocationFilter, + parseViewParameters, + serializeColumnFiltersForView, + serializeSortingForView, + stringifyViewParameters, + tableViewStateMatchesBaseline } from '@/utils/viewDefinition' import type { ViewParameters } from '@/utils/viewDefinition' import { TaskList } from '@/components/tables/TaskList' import type { TaskViewModel } from '@/components/tables/TaskList' +import { applyVirtualDerivedTasks } from '@/utils/virtualDerivedTableState' +import { useTableState } from '@/hooks/useTableState' +import { usePropertyDefinitions } from '@/data' +import { getPropertyColumnIds, useColumnVisibilityWithPropertyDefaults } from '@/hooks/usePropertyColumnVisibility' +import { SaveViewActionsMenu } from '@/components/views/SaveViewActionsMenu' +import { getParsedDocument } from '@/data/hooks/queryHelpers' +import { replaceSavedViewInMySavedViewsCache } from '@/utils/savedViewsCache' const ADMITTED_OR_WAITING: PatientState[] = [PatientState.Admitted, PatientState.Wait] @@ -20,6 +43,11 @@ type PatientViewTasksPanelProps = { filterDefinitionJson: string, sortDefinitionJson: string, parameters: ViewParameters, + relatedFilterDefinitionJson: string, + relatedSortDefinitionJson: string, + relatedParametersJson: string, + savedViewId?: string, + isOwner: boolean, refreshVersion?: number, } @@ -27,6 +55,11 @@ export function PatientViewTasksPanel({ filterDefinitionJson, sortDefinitionJson, parameters, + relatedFilterDefinitionJson, + relatedSortDefinitionJson, + relatedParametersJson, + savedViewId, + isOwner, refreshVersion, }: PatientViewTasksPanelProps) { const filters = deserializeColumnFiltersFromView(filterDefinitionJson) @@ -74,7 +107,7 @@ export function PatientViewTasksPanel({ search: searchInput, }) - const tasks: TaskViewModel[] = useMemo(() => { + const rawTasks: TaskViewModel[] = useMemo(() => { if (!patientsData?.patients) return [] return patientsData.patients.flatMap(patient => { if (!ADMITTED_OR_WAITING.includes(patient.state) || !patient.tasks) return [] @@ -109,6 +142,198 @@ export function PatientViewTasksPanel({ }) }, [patientsData]) + const relatedParams = useMemo(() => parseViewParameters(relatedParametersJson), [relatedParametersJson]) + const defaultRelatedFilters = useMemo( + () => deserializeColumnFiltersFromView(relatedFilterDefinitionJson), + [relatedFilterDefinitionJson] + ) + const defaultRelatedSortingRaw = useMemo( + () => deserializeSortingFromView(relatedSortDefinitionJson), + [relatedSortDefinitionJson] + ) + const baselineSort = useMemo(() => [ + { id: 'done', desc: false }, + { id: 'dueDate', desc: false }, + ], []) + const relatedSortBaseline = useMemo( + () => (defaultRelatedSortingRaw.length > 0 ? defaultRelatedSortingRaw : baselineSort), + [defaultRelatedSortingRaw, baselineSort] + ) + const baselineSearch = relatedParams.searchQuery ?? '' + const baselineColumnVisibility = useMemo( + () => relatedParams.columnVisibility ?? {}, + [relatedParams.columnVisibility] + ) + const baselineColumnOrder = useMemo( + () => relatedParams.columnOrder ?? [], + [relatedParams.columnOrder] + ) + + const persistedRelatedContentKey = useMemo( + () => + `${relatedFilterDefinitionJson}\0${relatedSortDefinitionJson}\0${stringifyViewParameters({ + searchQuery: relatedParams.searchQuery, + columnVisibility: relatedParams.columnVisibility, + columnOrder: relatedParams.columnOrder, + })}`, + [ + relatedFilterDefinitionJson, + relatedSortDefinitionJson, + relatedParams.searchQuery, + relatedParams.columnVisibility, + relatedParams.columnOrder, + ] + ) + + const { data: propertyDefinitionsData } = usePropertyDefinitions() + const propertyColumnIds = useMemo( + () => getPropertyColumnIds(propertyDefinitionsData, PropertyEntity.Task), + [propertyDefinitionsData] + ) + + const { + sorting: relatedSorting, + setSorting: setRelatedSorting, + filters: relatedFilters, + setFilters: setRelatedFilters, + columnVisibility: relatedColumnVisibility, + setColumnVisibility: setRelatedColumnVisibilityRaw, + columnOrder: relatedColumnOrder, + setColumnOrder: setRelatedColumnOrder, + } = useTableState({ + defaultFilters: defaultRelatedFilters, + defaultSorting: relatedSortBaseline, + defaultColumnVisibility: baselineColumnVisibility, + defaultColumnOrder: baselineColumnOrder, + }) + + const setRelatedColumnVisibility = useColumnVisibilityWithPropertyDefaults( + propertyDefinitionsData, + PropertyEntity.Task, + setRelatedColumnVisibilityRaw + ) + + const [searchQuery, setSearchQuery] = useState(baselineSearch) + + useEffect(() => { + setRelatedFilters(deserializeColumnFiltersFromView(relatedFilterDefinitionJson)) + const nextSort = deserializeSortingFromView(relatedSortDefinitionJson) + setRelatedSorting(nextSort.length > 0 ? nextSort : baselineSort) + setSearchQuery(relatedParams.searchQuery ?? '') + setRelatedColumnVisibility(relatedParams.columnVisibility ?? {}) + setRelatedColumnOrder(relatedParams.columnOrder ?? []) + }, [ + persistedRelatedContentKey, + relatedFilterDefinitionJson, + relatedSortDefinitionJson, + relatedParams.searchQuery, + relatedParams.columnVisibility, + relatedParams.columnOrder, + baselineSort, + setRelatedFilters, + setRelatedSorting, + setRelatedColumnVisibility, + setRelatedColumnOrder, + ]) + + const viewMatchesRelatedBaseline = useMemo( + () => tableViewStateMatchesBaseline({ + filters: relatedFilters as ColumnFiltersState, + baselineFilters: defaultRelatedFilters, + sorting: relatedSorting, + baselineSorting: relatedSortBaseline, + searchQuery, + baselineSearch, + columnVisibility: relatedColumnVisibility, + baselineColumnVisibility, + columnOrder: relatedColumnOrder, + baselineColumnOrder, + propertyColumnIds, + }), + [ + relatedFilters, + defaultRelatedFilters, + relatedSorting, + relatedSortBaseline, + searchQuery, + baselineSearch, + relatedColumnVisibility, + baselineColumnVisibility, + relatedColumnOrder, + baselineColumnOrder, + propertyColumnIds, + ] + ) + const hasUnsavedRelatedChanges = !viewMatchesRelatedBaseline + + const [updateSavedView, { loading: overwriteLoading }] = useMutation< + UpdateSavedViewMutation, + UpdateSavedViewMutationVariables + >(getParsedDocument(UpdateSavedViewDocument), { + awaitRefetchQueries: true, + refetchQueries: savedViewId + ? [ + { query: getParsedDocument(SavedViewDocument), variables: { id: savedViewId } }, + { query: getParsedDocument(MySavedViewsDocument) }, + ] + : [{ query: getParsedDocument(MySavedViewsDocument) }], + update(cache, { data }) { + const view = data?.updateSavedView + if (view) { + replaceSavedViewInMySavedViewsCache(cache, view) + } + }, + }) + + const handleDiscardRelated = useCallback(() => { + setRelatedFilters(defaultRelatedFilters) + setRelatedSorting(relatedSortBaseline) + setSearchQuery(baselineSearch) + setRelatedColumnVisibility(baselineColumnVisibility) + setRelatedColumnOrder(baselineColumnOrder) + }, [ + baselineSearch, + baselineColumnOrder, + baselineColumnVisibility, + defaultRelatedFilters, + setRelatedColumnOrder, + setRelatedColumnVisibility, + setRelatedFilters, + setRelatedSorting, + relatedSortBaseline, + ]) + + const handleOverwriteRelated = useCallback(async () => { + if (!savedViewId) return + await updateSavedView({ + variables: { + id: savedViewId, + data: { + relatedFilterDefinition: serializeColumnFiltersForView(relatedFilters as ColumnFiltersState), + relatedSortDefinition: serializeSortingForView(relatedSorting), + relatedParameters: stringifyViewParameters({ + searchQuery: searchQuery || undefined, + columnVisibility: relatedColumnVisibility, + columnOrder: relatedColumnOrder, + }), + }, + }, + }) + }, [ + savedViewId, + updateSavedView, + relatedFilters, + relatedSorting, + searchQuery, + relatedColumnVisibility, + relatedColumnOrder, + ]) + + const displayedTasks = useMemo( + () => applyVirtualDerivedTasks(rawTasks, relatedFilters, relatedSorting, searchQuery), + [rawTasks, relatedFilters, relatedSorting, searchQuery] + ) + useEffect(() => { if (refreshVersion === undefined || refreshVersion <= 0) return refetch() @@ -116,10 +341,35 @@ export function PatientViewTasksPanel({ return ( + null} + onDiscard={handleDiscardRelated} + hideSaveAsNew={true} + /> + + ) : undefined} + tableState={{ + sorting: relatedSorting, + setSorting: setRelatedSorting, + filters: relatedFilters, + setFilters: setRelatedFilters, + columnVisibility: relatedColumnVisibility, + setColumnVisibility: setRelatedColumnVisibility, + columnOrder: relatedColumnOrder, + setColumnOrder: setRelatedColumnOrder, + }} /> ) } diff --git a/web/components/views/SaveViewActionsMenu.tsx b/web/components/views/SaveViewActionsMenu.tsx index 124c70a..51c995a 100644 --- a/web/components/views/SaveViewActionsMenu.tsx +++ b/web/components/views/SaveViewActionsMenu.tsx @@ -10,6 +10,7 @@ export type SaveViewActionsMenuProps = { onOverwrite: () => void | Promise, onOpenSaveAsNew: () => void, onDiscard: () => void, + hideSaveAsNew?: boolean, } export function SaveViewActionsMenu({ @@ -18,6 +19,7 @@ export function SaveViewActionsMenu({ onOverwrite, onOpenSaveAsNew, onDiscard, + hideSaveAsNew = false, }: SaveViewActionsMenuProps) { const translation = useTasksTranslation() @@ -51,15 +53,17 @@ export function SaveViewActionsMenu({ > {translation('saveViewOverwriteCurrent')} - { - onOpenSaveAsNew() - close() - }} - className="rounded-md cursor-pointer" - > - {translation('saveViewAsNew')} - + {!hideSaveAsNew && ( + { + onOpenSaveAsNew() + close() + }} + className="rounded-md cursor-pointer" + > + {translation('saveViewAsNew')} + + )} )} diff --git a/web/components/views/TaskViewPatientsPanel.tsx b/web/components/views/TaskViewPatientsPanel.tsx index 43da33f..7053850 100644 --- a/web/components/views/TaskViewPatientsPanel.tsx +++ b/web/components/views/TaskViewPatientsPanel.tsx @@ -1,36 +1,76 @@ 'use client' import { useMemo } from 'react' -import Link from 'next/link' import { useTasks } from '@/data' +import { PatientState, type GetTasksQuery } from '@/api/gql/generated' import { columnFiltersToQueryFilterClauses, sortingStateToQuerySortClauses } from '@/utils/tableStateToApi' -import { deserializeColumnFiltersFromView, deserializeSortingFromView } from '@/utils/viewDefinition' +import { + deserializeColumnFiltersFromView, + deserializeSortingFromView, + parseViewParameters +} from '@/utils/viewDefinition' import type { ViewParameters } from '@/utils/viewDefinition' -import { LocationChips } from '@/components/locations/LocationChips' import { LoadingContainer } from '@helpwave/hightide' -import { useTasksTranslation } from '@/i18n/useTasksTranslation' +import { PatientList } from '@/components/tables/PatientList' +import type { PatientViewModel } from '@/components/tables/PatientList' + +const ADMITTED_OR_WAITING: PatientState[] = [PatientState.Admitted, PatientState.Wait] + +type TaskPatient = NonNullable + +function buildEmbeddedPatientsFromTasks(tasks: GetTasksQuery['tasks']): PatientViewModel[] { + const agg = new Map() + for (const t of tasks) { + if (!t.patient) continue + const id = t.patient.id + let row = agg.get(id) + if (!row) { + row = { patient: t.patient, open: 0, closed: 0 } + agg.set(id, row) + } + if (t.done) row.closed += 1 + else row.open += 1 + } + return [...agg.values()].map(({ patient, open, closed }) => { + const countForAggregate = ADMITTED_OR_WAITING.includes(patient.state) + return { + id: patient.id, + name: patient.name, + firstname: patient.firstname, + lastname: patient.lastname, + birthdate: new Date(patient.birthdate), + sex: patient.sex, + state: patient.state, + position: patient.position, + openTasksCount: countForAggregate ? open : 0, + closedTasksCount: countForAggregate ? closed : 0, + tasks: [], + properties: patient.properties ?? [], + } + }) +} type TaskViewPatientsPanelProps = { filterDefinitionJson: string, sortDefinitionJson: string, parameters: ViewParameters, + relatedFilterDefinitionJson: string, + relatedSortDefinitionJson: string, + relatedParametersJson: string, + savedViewId?: string, + isOwner: boolean, } -type DistinctPatientRow = { - id: string, - name: string, - locations: Array<{ id: string, title: string }>, -} - -/** - * Distinct patients from the same task query as the task tab (no duplicate task-fetch hack). - */ export function TaskViewPatientsPanel({ filterDefinitionJson, sortDefinitionJson, parameters, + relatedFilterDefinitionJson, + relatedSortDefinitionJson, + relatedParametersJson, + savedViewId, + isOwner, }: TaskViewPatientsPanelProps) { - const translation = useTasksTranslation() const filters = deserializeColumnFiltersFromView(filterDefinitionJson) const sorting = deserializeSortingFromView(sortDefinitionJson) const apiFilters = useMemo(() => columnFiltersToQueryFilterClauses(filters), [filters]) @@ -48,44 +88,47 @@ export function TaskViewPatientsPanel({ } ) - const rows = useMemo((): DistinctPatientRow[] => { - const map = new Map() - for (const t of data?.tasks ?? []) { - if (!t.patient) continue - if (!map.has(t.patient.id)) { - map.set(t.patient.id, { - id: t.patient.id, - name: t.patient.name, - locations: (t.patient.assignedLocations ?? []).map(l => ({ id: l.id, title: l.title })), - }) - } - } - return [...map.values()].sort((a, b) => a.name.localeCompare(b.name)) - }, [data]) + const embeddedPatients = useMemo( + () => buildEmbeddedPatientsFromTasks(data?.tasks ?? []), + [data?.tasks] + ) + + const defaultRelatedFilters = useMemo( + () => deserializeColumnFiltersFromView(relatedFilterDefinitionJson), + [relatedFilterDefinitionJson] + ) + const defaultRelatedSorting = useMemo( + () => deserializeSortingFromView(relatedSortDefinitionJson), + [relatedSortDefinitionJson] + ) + const relatedParams = useMemo( + () => parseViewParameters(relatedParametersJson), + [relatedParametersJson] + ) - if (loading) { - return + if (loading && embeddedPatients.length === 0) { + return ( +
+ +
+ ) } return ( -
-

{translation('viewDerivedPatientsHint')}

-
    - {rows.map((p) => ( -
  • - - {p.name} - - -
  • - ))} -
- {rows.length === 0 && ( - {translation('noPatientsInTaskView')} - )} -
+ ) } diff --git a/web/pages/view/[uid].tsx b/web/pages/view/[uid].tsx index f2e5db0..8eaaf95 100644 --- a/web/pages/view/[uid].tsx +++ b/web/pages/view/[uid].tsx @@ -536,6 +536,11 @@ const ViewPage: NextPage = () => { filterDefinitionJson={view.filterDefinition} sortDefinitionJson={view.sortDefinition} parameters={params} + relatedFilterDefinitionJson={view.relatedFilterDefinition} + relatedSortDefinitionJson={view.relatedSortDefinition} + relatedParametersJson={view.relatedParameters} + savedViewId={view.isOwner ? view.id : undefined} + isOwner={view.isOwner} refreshVersion={patientViewRefreshVersion} /> @@ -560,6 +565,11 @@ const ViewPage: NextPage = () => { filterDefinitionJson={view.filterDefinition} sortDefinitionJson={view.sortDefinition} parameters={params} + relatedFilterDefinitionJson={view.relatedFilterDefinition} + relatedSortDefinitionJson={view.relatedSortDefinition} + relatedParametersJson={view.relatedParameters} + savedViewId={view.isOwner ? view.id : undefined} + isOwner={view.isOwner} /> diff --git a/web/schema.graphql b/web/schema.graphql index b065f40..53d7602 100644 --- a/web/schema.graphql +++ b/web/schema.graphql @@ -42,6 +42,9 @@ input CreateSavedViewInput { filterDefinition: String! sortDefinition: String! parameters: String! + relatedFilterDefinition: String = "{}" + relatedSortDefinition: String = "{}" + relatedParameters: String = "{}" visibility: SavedViewVisibility! = PRIVATE } @@ -341,6 +344,9 @@ type SavedView { filterDefinition: String! sortDefinition: String! parameters: String! + relatedFilterDefinition: String! + relatedSortDefinition: String! + relatedParameters: String! ownerUserId: ID! visibility: SavedViewVisibility! createdAt: String! @@ -446,6 +452,9 @@ input UpdateSavedViewInput { filterDefinition: String = null sortDefinition: String = null parameters: String = null + relatedFilterDefinition: String = null + relatedSortDefinition: String = null + relatedParameters: String = null visibility: SavedViewVisibility = null } diff --git a/web/utils/virtualDerivedTableState.ts b/web/utils/virtualDerivedTableState.ts new file mode 100644 index 0000000..fc524f7 --- /dev/null +++ b/web/utils/virtualDerivedTableState.ts @@ -0,0 +1,464 @@ +import type { ColumnFilter, ColumnFiltersState } from '@tanstack/react-table' +import type { SortingState } from '@tanstack/table-core' +import type { FilterOperator, FilterValue } from '@helpwave/hightide' +import type { TaskViewModel } from '@/components/tables/TaskList' +import type { PatientViewModel } from '@/components/tables/PatientList' + +function normalizeLower(s: string | undefined | null): string { + return (s ?? '').toLowerCase() +} + +function calendarDateParts(d: Date): { y: number, m: number, day: number } { + return { y: d.getFullYear(), m: d.getMonth(), day: d.getDate() } +} + +function compareCalendarDate(a: Date, b: Date): number { + const ca = calendarDateParts(a) + const cb = calendarDateParts(b) + if (ca.y !== cb.y) return ca.y - cb.y + if (ca.m !== cb.m) return ca.m - cb.m + return ca.day - cb.day +} + +function taskPropertyText(task: TaskViewModel, definitionId: string): string { + const prop = task.properties?.find((p) => p.definition.id === definitionId) + return prop?.textValue ?? '' +} + +function patientPropertyText(patient: PatientViewModel, definitionId: string): string { + const prop = patient.properties?.find((p) => p.definition.id === definitionId) + return prop?.textValue ?? '' +} + +function matchesTextOperator( + haystack: string, + operator: FilterOperator, + needle: string +): boolean { + const h = normalizeLower(haystack) + const n = normalizeLower(needle) + switch (operator) { + case 'contains': + return h.includes(n) + case 'notContains': + return !h.includes(n) + case 'equals': + return h === n + case 'notEquals': + return h !== n + case 'startsWith': + return h.startsWith(n) + case 'endsWith': + return h.endsWith(n) + case 'isUndefined': + return haystack === '' + case 'isNotUndefined': + return haystack !== '' + default: + return true + } +} + +function matchesNumberOperator( + value: number | undefined, + operator: FilterOperator, + p: FilterValue['parameter'] +): boolean { + const v = value + const eq = p.numberValue + const min = p.numberMin + const max = p.numberMax + switch (operator) { + case 'equals': + return v != null && eq != null && v === eq + case 'notEquals': + return v == null || eq == null || v !== eq + case 'greaterThan': + return v != null && eq != null && v > eq + case 'greaterThanOrEqual': + return v != null && eq != null && v >= eq + case 'lessThan': + return v != null && eq != null && v < eq + case 'lessThanOrEqual': + return v != null && eq != null && v <= eq + case 'between': + return v != null && min != null && max != null && v >= min && v <= max + case 'notBetween': + return v == null || min == null || max == null || v < min || v > max + case 'isUndefined': + return v == null + case 'isNotUndefined': + return v != null + default: + return true + } +} + +function matchesDateOperator( + value: Date | undefined, + operator: FilterOperator, + fv: FilterValue +): boolean { + const p = fv.parameter + if (operator === 'isUndefined') return value == null + if (operator === 'isNotUndefined') return value != null + if (value == null) return false + const cmp = p.dateValue + const dmin = p.dateMin + const dmax = p.dateMax + if (fv.dataType === 'dateTime') { + const t = value.getTime() + switch (operator) { + case 'equals': + return cmp != null && Math.abs(t - cmp.getTime()) < 60000 + case 'notEquals': + return cmp == null || Math.abs(t - cmp.getTime()) >= 60000 + case 'greaterThan': + return cmp != null && t > cmp.getTime() + case 'greaterThanOrEqual': + return cmp != null && t >= cmp.getTime() + case 'lessThan': + return cmp != null && t < cmp.getTime() + case 'lessThanOrEqual': + return cmp != null && t <= cmp.getTime() + case 'between': + return dmin != null && dmax != null && t >= dmin.getTime() && t <= dmax.getTime() + case 'notBetween': + return dmin == null || dmax == null || t < dmin.getTime() || t > dmax.getTime() + default: + return true + } + } + switch (operator) { + case 'equals': + return cmp != null && compareCalendarDate(value, cmp) === 0 + case 'notEquals': + return cmp == null || compareCalendarDate(value, cmp) !== 0 + case 'greaterThan': + return cmp != null && compareCalendarDate(value, cmp) > 0 + case 'greaterThanOrEqual': + return cmp != null && compareCalendarDate(value, cmp) >= 0 + case 'lessThan': + return cmp != null && compareCalendarDate(value, cmp) < 0 + case 'lessThanOrEqual': + return cmp != null && compareCalendarDate(value, cmp) <= 0 + case 'between': + return dmin != null && dmax != null + && compareCalendarDate(value, dmin) >= 0 && compareCalendarDate(value, dmax) <= 0 + case 'notBetween': + return dmin == null || dmax == null + || compareCalendarDate(value, dmin) < 0 || compareCalendarDate(value, dmax) > 0 + default: + return true + } +} + +function matchesBooleanOperator(done: boolean, operator: FilterOperator): boolean { + if (operator === 'isTrue') return done === true + if (operator === 'isFalse') return done === false + return true +} + +function matchesSingleTagOperator( + value: string | undefined, + operator: FilterOperator, + fv: FilterValue +): boolean { + const p = fv.parameter + const tags = (p as { uuidValues?: unknown[], stringValue?: string }).uuidValues as string[] | undefined + const single = p.stringValue ?? (tags?.length === 1 ? tags[0] : undefined) + const v = value ?? '' + switch (operator) { + case 'equals': + return v === single + case 'notEquals': + return v !== single + case 'contains': + return tags != null && tags.includes(v) + case 'notContains': + return tags == null || !tags.includes(v) + case 'isUndefined': + return v === '' + case 'isNotUndefined': + return v !== '' + default: + return true + } +} + +function taskMatchesColumnFilter(task: TaskViewModel, filter: ColumnFilter): boolean { + const value = filter.value as FilterValue | undefined + if (!value?.operator || !value.parameter || !value.dataType) return true + const id = filter.id + const op = value.operator + const fv = value + + if (id === 'done') { + return matchesBooleanOperator(task.done, op) + } + if (id === 'title' || id === 'name') { + return matchesTextOperator(task.name, op, fv.parameter.stringValue ?? '') + } + if (id === 'description') { + return matchesTextOperator(task.description ?? '', op, fv.parameter.stringValue ?? '') + } + if (id === 'dueDate') { + return matchesDateOperator(task.dueDate, op, fv) + } + if (id === 'priority') { + return matchesSingleTagOperator(task.priority ?? undefined, op, fv) + } + if (id === 'patient') { + return matchesTextOperator(task.patient?.name ?? '', op, fv.parameter.stringValue ?? '') + } + if (id === 'assignee') { + const label = task.assignee?.name ?? task.assigneeTeam?.title ?? '' + return matchesTextOperator(label, op, fv.parameter.stringValue ?? '') + } + if (id === 'assigneeTeam') { + return matchesTextOperator(task.assigneeTeam?.title ?? '', op, fv.parameter.stringValue ?? '') + } + if (id === 'updated' || id === 'updateDate') { + return matchesDateOperator(task.updateDate, op, fv) + } + if (id === 'creationDate') { + return matchesDateOperator(task.updateDate, op, fv) + } + if (id === 'estimatedTime') { + return matchesNumberOperator(task.estimatedTime ?? undefined, op, fv.parameter) + } + if (id.startsWith('property_')) { + const defId = id.replace(/^property_/, '') + return matchesTextOperator(taskPropertyText(task, defId), op, fv.parameter.stringValue ?? '') + } + return true +} + +function patientMatchesColumnFilter(patient: PatientViewModel, filter: ColumnFilter): boolean { + const value = filter.value as FilterValue | undefined + if (!value?.operator || !value.parameter || !value.dataType) return true + const id = filter.id === 'locationSubtree' ? 'position' : filter.id + const op = value.operator + const fv = value + + if (id === 'name') { + return matchesTextOperator(patient.name, op, fv.parameter.stringValue ?? '') + } + if (id === 'state') { + const p = fv.parameter + const raw = p.uuidValues?.length ? p.uuidValues : p.stringValue ? [p.stringValue] : [] + const tags = raw.map(String) + if (tags.length === 0) return true + return tags.includes(patient.state) + } + if (id === 'sex') { + return matchesSingleTagOperator(patient.sex, op, fv) + } + if (id === 'birthdate') { + return matchesDateOperator(patient.birthdate, op, fv) + } + if (id === 'position' || id === 'locationSubtree') { + const want = fv.parameter.uuidValue != null && String(fv.parameter.uuidValue) !== '' + ? String(fv.parameter.uuidValue) + : null + const multi = fv.parameter.uuidValues as string[] | undefined + if (multi && multi.length > 0) { + const posId = patient.position?.id + return posId != null && multi.includes(posId) + } + if (want && patient.position?.id) { + return patient.position.id === want + } + return matchesTextOperator(patient.position?.title ?? '', op, fv.parameter.stringValue ?? '') + } + if (id === 'tasks') { + const open = patient.openTasksCount + const closed = patient.closedTasksCount + const total = open + closed + return matchesNumberOperator(total, op, fv.parameter) + } + if (id.startsWith('property_')) { + const defId = id.replace(/^property_/, '') + return matchesTextOperator(patientPropertyText(patient, defId), op, fv.parameter.stringValue ?? '') + } + return true +} + +function taskMatchesSearch(task: TaskViewModel, q: string): boolean { + const lower = q.trim().toLowerCase() + if (!lower) return true + if (task.name.toLowerCase().includes(lower)) return true + if ((task.description ?? '').toLowerCase().includes(lower)) return true + if ((task.patient?.name ?? '').toLowerCase().includes(lower)) return true + return false +} + +function patientMatchesSearch(patient: PatientViewModel, q: string): boolean { + const lower = q.trim().toLowerCase() + if (!lower) return true + if (patient.name.toLowerCase().includes(lower)) return true + if (patient.firstname.toLowerCase().includes(lower)) return true + if (patient.lastname.toLowerCase().includes(lower)) return true + return false +} + +function compareTaskBySortId( + a: TaskViewModel, + b: TaskViewModel, + sortId: string, + desc: boolean +): number { + const dir = desc ? -1 : 1 + const cmp = (x: number) => x * dir + + if (sortId === 'done') { + if (a.done === b.done) return 0 + return cmp(a.done ? 1 : -1) + } + if (sortId === 'title' || sortId === 'name') { + return cmp(a.name.localeCompare(b.name)) + } + if (sortId === 'description') { + return cmp((a.description ?? '').localeCompare(b.description ?? '')) + } + if (sortId === 'dueDate') { + const ta = a.dueDate?.getTime() ?? Number.POSITIVE_INFINITY + const tb = b.dueDate?.getTime() ?? Number.POSITIVE_INFINITY + if (ta === tb) return 0 + return cmp(ta < tb ? -1 : 1) + } + if (sortId === 'priority') { + return cmp((a.priority ?? '').localeCompare(b.priority ?? '')) + } + if (sortId === 'patient') { + return cmp((a.patient?.name ?? '').localeCompare(b.patient?.name ?? '')) + } + if (sortId === 'assignee') { + const la = a.assignee?.name ?? a.assigneeTeam?.title ?? '' + const lb = b.assignee?.name ?? b.assigneeTeam?.title ?? '' + return cmp(la.localeCompare(lb)) + } + if (sortId === 'assigneeTeam') { + return cmp((a.assigneeTeam?.title ?? '').localeCompare(b.assigneeTeam?.title ?? '')) + } + if (sortId === 'updated' || sortId === 'updateDate') { + const ta = a.updateDate.getTime() + const tb = b.updateDate.getTime() + if (ta === tb) return 0 + return cmp(ta < tb ? -1 : 1) + } + if (sortId === 'creationDate') { + const ta = a.updateDate.getTime() + const tb = b.updateDate.getTime() + if (ta === tb) return 0 + return cmp(ta < tb ? -1 : 1) + } + if (sortId === 'estimatedTime') { + const ea = a.estimatedTime ?? -1 + const eb = b.estimatedTime ?? -1 + if (ea === eb) return 0 + return cmp(ea < eb ? -1 : 1) + } + if (sortId.startsWith('property_')) { + const defId = sortId.replace(/^property_/, '') + return cmp(taskPropertyText(a, defId).localeCompare(taskPropertyText(b, defId))) + } + return 0 +} + +function sortTasksWithState(tasks: TaskViewModel[], sorting: SortingState): TaskViewModel[] { + const rules = sorting.length > 0 + ? sorting + : [ + { id: 'done', desc: false }, + { id: 'dueDate', desc: false }, + ] + return [...tasks].sort((a, b) => { + for (const s of rules) { + const c = compareTaskBySortId(a, b, s.id, s.desc) + if (c !== 0) return c + } + return a.id.localeCompare(b.id) + }) +} + +function comparePatientBySortId( + a: PatientViewModel, + b: PatientViewModel, + sortId: string, + desc: boolean +): number { + const dir = desc ? -1 : 1 + const cmp = (x: number) => x * dir + + if (sortId === 'name') { + return cmp(a.name.localeCompare(b.name)) + } + if (sortId === 'state') { + return cmp(a.state.localeCompare(b.state)) + } + if (sortId === 'sex') { + return cmp(a.sex.localeCompare(b.sex)) + } + if (sortId === 'birthdate') { + const ta = a.birthdate.getTime() + const tb = b.birthdate.getTime() + if (ta === tb) return 0 + return cmp(ta < tb ? -1 : 1) + } + if (sortId === 'position') { + return cmp((a.position?.title ?? '').localeCompare(b.position?.title ?? '')) + } + if (sortId === 'tasks') { + const ta = a.openTasksCount + a.closedTasksCount + const tb = b.openTasksCount + b.closedTasksCount + if (ta === tb) return 0 + return cmp(ta < tb ? -1 : 1) + } + if (sortId === 'updateDate') { + return cmp(a.name.localeCompare(b.name)) + } + if (sortId.startsWith('property_')) { + const defId = sortId.replace(/^property_/, '') + return cmp(patientPropertyText(a, defId).localeCompare(patientPropertyText(b, defId))) + } + return 0 +} + +function sortPatientsWithState(patients: PatientViewModel[], sorting: SortingState): PatientViewModel[] { + const rules = sorting.length > 0 ? sorting : [{ id: 'name', desc: false }] + return [...patients].sort((a, b) => { + for (const s of rules) { + const c = comparePatientBySortId(a, b, s.id, s.desc) + if (c !== 0) return c + } + return a.id.localeCompare(b.id) + }) +} + +export function applyVirtualDerivedTasks( + tasks: TaskViewModel[], + filters: ColumnFiltersState, + sorting: SortingState, + searchQuery: string +): TaskViewModel[] { + let out = tasks.filter((t) => taskMatchesSearch(t, searchQuery)) + for (const f of filters) { + out = out.filter((t) => taskMatchesColumnFilter(t, f)) + } + return sortTasksWithState(out, sorting) +} + +export function applyVirtualDerivedPatients( + patients: PatientViewModel[], + filters: ColumnFiltersState, + sorting: SortingState, + searchQuery: string +): PatientViewModel[] { + let out = patients.filter((p) => patientMatchesSearch(p, searchQuery)) + for (const f of filters) { + out = out.filter((p) => patientMatchesColumnFilter(p, f)) + } + return sortPatientsWithState(out, sorting) +} +