@gen-epix/ui-client-casedb 4.0.1 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/AddCasesToEventDialog.js.map +1 -1
- package/dist/_chunks/CaseDbDownloadUtil.js +1 -1
- package/dist/_chunks/CaseDbDownloadUtil.js.map +1 -1
- package/dist/_chunks/CaseInfoDialog.js +4 -4
- package/dist/_chunks/CaseInfoDialog.js.map +1 -1
- package/dist/_chunks/CaseSetInfoDialog.js +4 -4
- package/dist/_chunks/CaseSetInfoDialog.js.map +1 -1
- package/dist/_chunks/CasesAlreadyInCaseSetWarning.js.map +1 -1
- package/dist/_chunks/Dashboard.js +3 -2
- package/dist/_chunks/Dashboard.js.map +1 -1
- package/dist/_chunks/FindSimilarCasesDialog.js +6 -6
- package/dist/_chunks/FindSimilarCasesDialog.js.map +1 -1
- package/dist/_chunks/HomePageTrends.js.map +1 -1
- package/dist/_chunks/LineListWidget.js +46 -45
- package/dist/_chunks/LineListWidget.js.map +1 -1
- package/dist/_chunks/Upload.js +308 -304
- package/dist/_chunks/Upload.js.map +1 -1
- package/dist/_chunks/UploadUtil.js +44 -40
- package/dist/_chunks/UploadUtil.js.map +1 -1
- package/dist/_chunks/dashboardStore.js.map +1 -1
- package/dist/classes/services/EventBusService/EventBusService.d.ts +9 -2
- package/dist/classes/services/EventBusService/index.js.map +1 -1
- package/dist/components/ui/MapWidget/index.js.map +1 -1
- package/dist/components/ui/RemoveCasesFromEventDialog/index.js.map +1 -1
- package/dist/components/ui/SequenceDownloadDialog/index.js +53 -40
- package/dist/components/ui/SequenceDownloadDialog/index.js.map +1 -1
- package/dist/components/ui/TreeWidget/index.js +8 -2
- package/dist/components/ui/TreeWidget/index.js.map +1 -1
- package/dist/locale/en.json +0 -11
- package/dist/locale/nl.json +0 -11
- package/dist/models/config.d.ts +2 -0
- package/dist/utils/UploadUtil/UploadUtil.d.ts +1 -0
- package/package.json +23 -23
- package/dist/components/ui/FileSelector/FileSelector.d.ts +0 -7
- package/dist/components/ui/FileSelector/index.d.ts +0 -1
- package/dist/components/ui/FileSelector/index.js +0 -206
- package/dist/components/ui/FileSelector/index.js.map +0 -1
- package/dist/utils/FileUtil/FileUtil.d.ts +0 -5
- package/dist/utils/FileUtil/index.d.ts +0 -1
- package/dist/utils/FileUtil/index.js +0 -15
- package/dist/utils/FileUtil/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineListWidget.js","names":[],"sources":["../../src/components/ui/LineListWidget/LineListWidgetIsInEventCell.tsx","../../src/components/ui/LineListWidget/LineListWidgetIsOwnCaseCell.tsx","../../src/components/ui/LineListWidget/LineListWidgetTitle.tsx","../../src/components/ui/LineListWidget/LineListWidgetPrimaryMenu.tsx","../../src/components/ui/LineListWidget/LineListWidgetSecondaryMenu.tsx","../../src/components/ui/LineListWidget/useEpiLineListWidgetEmitDownloadOptions.tsx","../../src/components/ui/LineListWidget/LineListWidget.tsx"],"sourcesContent":["import {\n Box,\n CircularProgress,\n useTheme,\n} from '@mui/material';\nimport type { CaseDbCase } from '@gen-epix/api-casedb';\nimport {\n memo,\n useEffect,\n useState,\n} from 'react';\n\nimport CollectionIcon from '../../../assets/icons/CollectionIcon.svg?react';\nimport { LineListCaseSetMembersService } from '../../../classes/services/LineListService/LineListCaseSetMembersService';\n\ntype LineListWidgetIsInEventCellProps = {\n readonly row: CaseDbCase;\n};\n\nexport const LineListWidgetIsInEventCell = memo(({ row }: LineListWidgetIsInEventCellProps) => {\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [isTrue, setIsTrue] = useState(false);\n const theme = useTheme();\n\n useEffect(() => {\n const perform = async () => {\n try {\n setIsTrue(await LineListCaseSetMembersService.getInstance().query(row.id));\n } catch (_error) {\n setHasError(true);\n } finally {\n setIsLoading(false);\n }\n };\n\n void perform();\n }, [row.id]);\n\n return (\n <Box>\n {isLoading && (\n <CircularProgress\n size={16}\n sx={{\n marginTop: '4px',\n position: 'absolute',\n }}\n />\n )}\n {!isLoading && hasError && (\n <Box sx={{ color: `${theme.palette.error.main}` }}>\n {'?'}\n </Box>\n )}\n {!isLoading && !hasError && isTrue && (\n <CollectionIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n )}\n\n </Box>\n );\n});\n","import {\n Box,\n CircularProgress,\n useTheme,\n} from '@mui/material';\nimport type { CaseDbCase } from '@gen-epix/api-casedb';\nimport {\n memo,\n useEffect,\n useState,\n} from 'react';\nimport CorporateFareIcon from '@mui/icons-material/CorporateFare';\n\nimport { LineListIsOwnCaseService } from '../../../classes/services/LineListService/LineListIsOwnCaseService';\n\ntype LineListWidgetIsOwnCaseCellProps = {\n readonly row: CaseDbCase;\n};\n\nexport const LineListWidgetIsOwnCaseCell = memo(({ row }: LineListWidgetIsOwnCaseCellProps) => {\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [isTrue, setIsTrue] = useState(false);\n const theme = useTheme();\n\n useEffect(() => {\n const perform = async () => {\n try {\n setIsTrue(await LineListIsOwnCaseService.getInstance().query(row.id));\n } catch (_error) {\n setHasError(true);\n } finally {\n setIsLoading(false);\n }\n };\n\n void perform();\n }, [row.id]);\n\n return (\n <Box>\n {isLoading && (\n <CircularProgress\n size={16}\n sx={{\n marginTop: '4px',\n position: 'absolute',\n }}\n />\n )}\n {!isLoading && hasError && (\n <Box sx={{ color: `${theme.palette.error.main}` }}>\n {'?'}\n </Box>\n )}\n {!isLoading && !hasError && isTrue && (\n <CorporateFareIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n )}\n\n </Box>\n );\n});\n","import { use } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\nimport { Typography } from '@mui/material';\n\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\n\nexport const LineListWidgetTitle = () => {\n const dashboardStore = use(DashboardStoreContext);\n const { t } = useTranslation();\n const sortedData = useStore(dashboardStore, useShallow((state) => state.sortedData));\n const selectedIds = useStore(dashboardStore, useShallow((state) => state.selectedIds));\n\n return (\n <Typography\n aria-live={'polite'}\n component={'div'}\n role={'status'}\n sx={{\n fontWeight: 600,\n lineHeight: theme => theme.spacing(3),\n }}\n >\n {t('Line list: {{shownCount}} cases, {{selectedCount}} selected', { selectedCount: selectedIds.length ?? 0, shownCount: sortedData.length ?? 0 })}\n </Typography>\n );\n};\n","import {\n use,\n useCallback,\n useMemo,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\nimport type {\n CaseDbApiPermission,\n CaseDbCase,\n CaseDbCaseSet,\n CaseDbCompleteCaseType,\n} from '@gen-epix/api-casedb';\nimport {\n CaseDbCommandName,\n CaseDbPermissionType,\n} from '@gen-epix/api-casedb';\nimport type { MenuItemData } from '@gen-epix/ui-core-components/models/nestedMenu';\nimport type { TableColumn } from '@gen-epix/ui-client-common/models/table';\nimport { AuthorizationService } from '@gen-epix/ui-client-common/classes/services/AuthorizationService';\nimport { useColumnsMenu } from '@gen-epix/ui-client-common/hooks/useColumnsMenu';\nimport last from 'lodash/last';\n\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CaseUtil } from '../../../utils/CaseUtil';\nimport { WidgetMenu } from '../WidgetMenu';\nimport { SelectionFilter } from '../../../classes/filters/SelectionFilter';\n\n\nexport type LineListWidgetPrimaryMenuProps = {\n readonly caseSet?: CaseDbCaseSet;\n};\n\n\nexport const LineListWidgetPrimaryMenu = ({\n caseSet,\n}: LineListWidgetPrimaryMenuProps) => {\n const dashboardStore = use(DashboardStoreContext);\n const { t } = useTranslation();\n const selectedIds = useStore(dashboardStore, useShallow((state) => state.selectedIds));\n const sortedData = useStore(dashboardStore, useShallow((state) => state.sortedData));\n const completeCaseType = useStore(dashboardStore, useShallow((state) => state.completeCaseType));\n const setFilterValue = useStore(dashboardStore, useShallow((state) => state.setFilterValue));\n const filters = useStore(dashboardStore, useShallow((state) => state.filters));\n const setSelectedIds = useStore(dashboardStore, useShallow((state) => state.setSelectedIds));\n const findSimilarCasesResults = useStore(dashboardStore, useShallow((state) => state.findSimilarCasesResults));\n\n const hasCellData = useCallback((row: CaseDbCase, tableColumn: TableColumn<CaseDbCase, CaseDbCompleteCaseType>, rowIndex: number) => {\n if (tableColumn.valueGetter) {\n return !!tableColumn.valueGetter({\n column: tableColumn,\n dataContext: completeCaseType,\n id: tableColumn.id,\n row,\n rowIndex,\n });\n }\n return !CaseUtil.getRowValue(row.content, completeCaseType.cols[tableColumn.id], completeCaseType).isMissing;\n }, [completeCaseType]);\n\n const createFilterFromSelectedRowCaseIds = useCallback(async () => {\n await setFilterValue('selected', selectedIds);\n setSelectedIds([]);\n }, [setFilterValue, selectedIds, setSelectedIds]);\n\n const hasSelectionFilter = filters.some((filter) => filter instanceof SelectionFilter && filter.filterValue.length > 0);\n const columnsMenuItem = useColumnsMenu({ hasCellData });\n\n const similarCaseIds = useMemo(() => findSimilarCasesResults?.flatMap((result) => result.similarCaseIds) || [], [findSimilarCasesResults]);\n\n const rowsWithoutSimilarCases = useMemo(() => {\n if (!findSimilarCasesResults?.length) {\n return sortedData;\n }\n return sortedData.filter((row) => !similarCaseIds.includes(row.id));\n }, [findSimilarCasesResults, sortedData, similarCaseIds]);\n\n const selectedRowsWithoutSimilarCases = useMemo(() => {\n return rowsWithoutSimilarCases.filter((row) => selectedIds?.includes(row.id));\n }, [rowsWithoutSimilarCases, selectedIds]);\n\n const selectedRows = useMemo(() => {\n return sortedData.filter((row) => selectedIds?.includes(row.id));\n }, [sortedData, selectedIds]);\n\n const menu = useMemo<MenuItemData[]>(() => {\n const shouldShowCreateEventMenuItem = AuthorizationService.getInstance().doesUserHavePermission<CaseDbApiPermission>([{ command_name: CaseDbCommandName.CreateCaseSetCommand, permission_type: CaseDbPermissionType.EXECUTE }]);\n const shouldShowAddToEventMenuItem = AuthorizationService.getInstance().doesUserHavePermission<CaseDbApiPermission>([{ command_name: CaseDbCommandName.CaseSetMemberCrudCommand, permission_type: CaseDbPermissionType.CREATE }]);\n const shouldShowRemoveFromEventMenuItem = !!caseSet && AuthorizationService.getInstance().doesUserHavePermission<CaseDbApiPermission>([{ command_name: CaseDbCommandName.CaseSetMemberCrudCommand, permission_type: CaseDbPermissionType.DELETE }]);\n const shouldShowBulkEditCaseMenuItem = true;\n\n const actionsColumnMenuItem: MenuItemData = {\n items: [\n {\n callback: createFilterFromSelectedRowCaseIds,\n disabled: !selectedIds?.length || similarCaseIds.length > 0,\n divider: true,\n label: t`Create filter from selected cases`,\n },\n {\n callback: () => EventBusService.getInstance().emit('openFindSimilarCasesDialog', {\n allRows: sortedData,\n completeCaseType,\n selectedRows: sortedData,\n }),\n disabled: hasSelectionFilter,\n label: t`Find similar cases`,\n },\n {\n callback: () => EventBusService.getInstance().emit('openFindSimilarCasesDialog', {\n allRows: sortedData,\n completeCaseType,\n selectedRows,\n }),\n disabled: !selectedIds?.length || hasSelectionFilter,\n label: t`Find similar cases (based on selected cases)`,\n },\n {\n callback: () => EventBusService.getInstance().emit('openRemoveFindSimilarCasesResultDialog', {\n completeCaseType,\n }),\n disabled: !findSimilarCasesResults?.length,\n label: t`Remove similar cases from results`,\n },\n ],\n label: t`Actions`,\n };\n\n if (shouldShowCreateEventMenuItem) {\n actionsColumnMenuItem.items.push(\n {\n callback: () => EventBusService.getInstance().emit('openCreateEventDialog', {\n completeCaseType,\n rows: selectedRows,\n }),\n disabled: !selectedIds?.length,\n label: t`Create new event with selected cases`,\n },\n );\n }\n\n if (shouldShowAddToEventMenuItem) {\n actionsColumnMenuItem.items.push(\n {\n callback: () => EventBusService.getInstance().emit('openAddCasesToEventDialog', {\n currentCaseSet: caseSet,\n rows: selectedRows,\n }),\n disabled: !selectedIds?.length,\n label: t`Add selected cases to an existing event`,\n },\n );\n }\n\n if (shouldShowRemoveFromEventMenuItem) {\n actionsColumnMenuItem.items.push(\n {\n callback: () => EventBusService.getInstance().emit('openRemoveCasesFromEventDialog', {\n caseSet,\n rows: selectedRowsWithoutSimilarCases,\n }),\n disabled: !selectedRowsWithoutSimilarCases.length,\n label: t`Remove selected cases from this event`,\n },\n );\n }\n if (actionsColumnMenuItem.items.length > 3) {\n actionsColumnMenuItem.items[3].divider = true;\n }\n\n last(actionsColumnMenuItem.items).divider = true;\n if (shouldShowBulkEditCaseMenuItem) {\n actionsColumnMenuItem.items.push(\n {\n callback: () => EventBusService.getInstance().emit('openEditCases', selectedRows),\n disabled: !selectedIds?.length,\n label: t`Edit selected cases`,\n },\n );\n }\n\n const menus: MenuItemData[] = [\n columnsMenuItem,\n actionsColumnMenuItem,\n ];\n\n return menus;\n }, [caseSet, t, selectedIds?.length, hasSelectionFilter, similarCaseIds.length, createFilterFromSelectedRowCaseIds, findSimilarCasesResults?.length, columnsMenuItem, sortedData, completeCaseType, selectedRows, selectedRowsWithoutSimilarCases]);\n\n\n return <WidgetMenu menu={menu} />;\n};\n","import {\n use,\n useCallback,\n useMemo,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport LinkIcon from '@mui/icons-material/Link';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\nimport { useTheme } from '@mui/material';\nimport type { MenuItemData } from '@gen-epix/ui-core-components/models/nestedMenu';\n\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { WidgetMenu } from '../WidgetMenu';\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { DASHBOARD_COMPONENT_NAME } from '../../../constants/dashboard';\nimport type { TreeWidgetData } from '../../../models/dashboard';\n\nexport const LineListWidgetSecondaryMenu = () => {\n const theme = useTheme();\n const dashboardStore = use(DashboardStoreContext);\n const { t } = useTranslation();\n const isTreeLinked = useStore(dashboardStore, useShallow((state) => state.getWidgetData<TreeWidgetData>(DASHBOARD_COMPONENT_NAME.TREE).zoomLevel === 1));\n const setSorting = useStore(dashboardStore, useShallow((state) => state.setSorting));\n\n const onLinkButtonClick = useCallback(() => {\n const perform = async () => {\n await setSorting(null, null);\n EventBusService.getInstance().emit('onLinkLineListAndTree');\n };\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n }, [setSorting]);\n\n const menu = useMemo<MenuItemData[]>(() => {\n return [\n {\n callback: onLinkButtonClick,\n disabled: isTreeLinked,\n label: t`Link and snap the Tree to the Line list (resets tree zoom level and Line List sorting)`,\n leftIcon: (\n <LinkIcon\n sx={{\n color: isTreeLinked ? undefined : theme.palette.error.main,\n }}\n />\n ),\n },\n ];\n }, [isTreeLinked, onLinkButtonClick, t, theme.palette.error.main]);\n\n return <WidgetMenu menu={menu} />;\n};\n","import {\n use,\n useCallback,\n useEffect,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\n\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CaseDbDownloadUtil } from '../../../utils/CaseDbDownloadUtil';\nimport { DashboardUtil } from '../../../utils/DashboardUtil';\nimport { DASHBOARD_COMPONENT_NAME } from '../../../constants/dashboard';\n\nexport const useEpiLineListWidgetEmitDownloadOptions = () => {\n const { t } = useTranslation();\n const dashboardStore = use(DashboardStoreContext);\n const sortedData = useStore(dashboardStore, useShallow((state) => state.sortedData));\n const completeCaseType = useStore(dashboardStore, useShallow((state) => state.completeCaseType));\n\n const getVisibleColumnIds = useCallback(() => {\n return dashboardStore.getState().getCurrentColumnVisualSettings().filter(x => x.isVisible).map(x => x.id);\n }, [dashboardStore]);\n\n useEffect(() => {\n const emitDownloadOptions = (selectedIds: string[]) => {\n EventBusService.getInstance().emit('onDownloadOptionsChanged', {\n items: [\n {\n disabled: !sortedData?.length,\n items: [\n {\n callback: async () => CaseDbDownloadUtil.downloadAsExcel(sortedData, getVisibleColumnIds(), completeCaseType, t),\n label: t`Download as Excel`,\n },\n {\n callback: () => CaseDbDownloadUtil.downloadAsCsv(sortedData, getVisibleColumnIds(), completeCaseType, t),\n label: t`Download as CSV`,\n },\n {\n callback: () => EventBusService.getInstance().emit('openSequenceDownloadDialog', { cases: sortedData }),\n label: t`Download sequences`,\n },\n {\n callback: () => null,\n disabled: true,\n label: t`Download allele profiles`,\n },\n ],\n label: t`All rows`,\n },\n {\n disabled: selectedIds.length === 0,\n items: [\n {\n callback: async () => CaseDbDownloadUtil.downloadAsExcel(DashboardUtil.getSelectedRows(sortedData, selectedIds), getVisibleColumnIds(), completeCaseType, t),\n label: t`Download as Excel`,\n },\n {\n callback: () => CaseDbDownloadUtil.downloadAsCsv(DashboardUtil.getSelectedRows(sortedData, selectedIds), getVisibleColumnIds(), completeCaseType, t),\n label: t`Download as CSV`,\n },\n {\n callback: () => EventBusService.getInstance().emit('openSequenceDownloadDialog', { cases: sortedData.filter(c => selectedIds.includes(c.id)) }),\n label: t`Download sequences`,\n },\n {\n callback: () => null,\n disabled: true,\n label: t`Download allele profiles`,\n },\n ],\n label: t`Selected rows`,\n },\n ],\n zone: DASHBOARD_COMPONENT_NAME.LINE_LIST,\n zoneLabel: t`Line list`,\n });\n };\n emitDownloadOptions(dashboardStore.getState().selectedIds);\n const unsubscribe = dashboardStore.subscribe((state, prevState) => {\n if (JSON.stringify(state.selectedIds) !== JSON.stringify(prevState.selectedIds)) {\n emitDownloadOptions(state.selectedIds);\n }\n });\n\n const onDownloadOptionsRequested = () => {\n emitDownloadOptions(dashboardStore.getState().selectedIds);\n };\n const eventBusService = EventBusService.getInstance();\n eventBusService.addEventListener('onDownloadOptionsRequested', onDownloadOptionsRequested);\n return () => {\n eventBusService.emit('onDownloadOptionsChanged', {\n items: null,\n zone: DASHBOARD_COMPONENT_NAME.LINE_LIST,\n zoneLabel: t`Line list`,\n });\n eventBusService.removeEventListener('onDownloadOptionsRequested', onDownloadOptionsRequested);\n unsubscribe();\n };\n }, [completeCaseType, dashboardStore, getVisibleColumnIds, sortedData, t]);\n};\n","import {\n Box,\n Link,\n ListItemIcon,\n ListItemText,\n MenuItem,\n Tooltip,\n useTheme,\n} from '@mui/material';\nimport type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useDebouncedCallback } from 'use-debounce';\nimport type { ListRange } from 'react-virtuoso';\nimport TroubleshootIcon from '@mui/icons-material/Troubleshoot';\nimport CorporateFareIcon from '@mui/icons-material/CorporateFare';\nimport ArrowCircleRightIcon from '@mui/icons-material/ArrowCircleRight';\nimport type {\n CaseDbCase,\n CaseDbCol,\n CaseDbCompleteCaseType,\n} from '@gen-epix/api-casedb';\nimport { CaseDbColType } from '@gen-epix/api-casedb';\nimport type {\n GetTableCellRowComparatorProps,\n TableColumn,\n TableColumnText,\n TableRowAndColumnParams,\n TableRowParams,\n} from '@gen-epix/ui-client-common/models/table';\nimport type { TableRef } from '@gen-epix/ui-client-common/components/ui/Table';\nimport { ConfigService } from '@gen-epix/ui-client-common/classes/services/ConfigService';\nimport { Table } from '@gen-epix/ui-client-common/components/ui/Table';\nimport { TABLE_COLUMN_FROZEN } from '@gen-epix/ui-client-common/models/table';\nimport { TableUtil } from '@gen-epix/ui-client-common/utils/TableUtil';\nimport EditIcon from '@mui/icons-material/Edit';\nimport ShareIcon from '@mui/icons-material/Share';\nimport { Subject } from '@gen-epix/ui-core/classes/Subject';\nimport { StringUtil } from '@gen-epix/ui-core/utils/StringUtil';\n\nimport CollectionIcon from '../../../assets/icons/CollectionIcon.svg?react';\nimport { LegendaItem } from '../LegendaItem';\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { LineListCaseSetMembersService } from '../../../classes/services/LineListService/LineListCaseSetMembersService';\nimport type { LineListWidgetData } from '../../../models/dashboard';\nimport type {\n Stratification,\n StratificationLegendaItem,\n} from '../../../models/stratification';\nimport { STRATIFICATION_MODE } from '../../../models/stratification';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CaseTypeUtil } from '../../../utils/CaseTypeUtil';\nimport { CaseUtil } from '../../../utils/CaseUtil';\nimport type { CaseDbConfig } from '../../../models/config';\nimport { CaseDbTableUtil } from '../../../utils/CaseDbTableUtil';\nimport { CASE_INFO_DIALOG_TAB_NAME } from '../CaseInfoDialog';\nimport { StratificationUtil } from '../../../utils/StratificationUtil';\nimport { DashboardWidget } from '../Dashboard';\nimport { DASHBOARD_COMPONENT_NAME } from '../../../constants/dashboard';\nimport { DashboardContext } from '../Dashboard/context/DashboardContext';\nimport { LineListIsOwnCaseService } from '../../../classes/services/LineListService/LineListIsOwnCaseService';\n\nimport { LineListWidgetIsInEventCell } from './LineListWidgetIsInEventCell';\nimport { LineListWidgetIsOwnCaseCell } from './LineListWidgetIsOwnCaseCell';\nimport { LineListWidgetTitle } from './LineListWidgetTitle';\nimport { LineListWidgetPrimaryMenu } from './LineListWidgetPrimaryMenu';\nimport { LineListWidgetSecondaryMenu } from './LineListWidgetSecondaryMenu';\nimport { useEpiLineListWidgetEmitDownloadOptions } from './useEpiLineListWidgetEmitDownloadOptions';\n\nexport const LineListWidget = () => {\n const { caseSet } = use(DashboardContext);\n const dashboardContext = use(DashboardContext);\n const containerRef = useRef<HTMLDivElement>(null);\n const { t } = useTranslation();\n const theme = useTheme();\n const rowHighlightingSubject = useMemo(() => new Subject<string[]>([]), []);\n const tableRef = useRef<TableRef>(null);\n\n const dashboardStore = use(DashboardStoreContext);\n const completeCaseType = useStore(dashboardStore, (state) => state.completeCaseType);\n const sortedData = useStore(dashboardStore, (state) => state.sortedData);\n const isCondensed = useStore(dashboardStore, (state) => state.isCondensed);\n const stratification = useStore(dashboardStore, (state) => state.stratification?.mode === STRATIFICATION_MODE.FIELD ? state.stratification : null);\n const updateWidgetData = useStore(dashboardStore, (state) => state.updateWidgetData);\n const treeAddresses = useStore(dashboardStore, (state) => state.treeAddresses);\n const setTableColumns = useStore(dashboardStore, (state) => state.setColumns);\n const isDataLoading = useStore(dashboardStore, (state) => state.isDataLoading);\n\n useEffect(() => {\n return () => {\n dashboardContext.lineListRangeSubject.next(undefined);\n };\n }, [dashboardContext]);\n\n const openCaseInfoDialog = useCallback((caseId: string, tabName: CASE_INFO_DIALOG_TAB_NAME) => {\n EventBusService.getInstance().emit('openCaseInfoDialog', {\n caseId,\n caseTypeId: completeCaseType.id,\n initialTab: tabName,\n });\n }, [completeCaseType.id]);\n\n const onAddToEventClick = useCallback((row: CaseDbCase) => {\n EventBusService.getInstance().emit('openAddCasesToEventDialog', {\n currentCaseSet: caseSet,\n rows: [row],\n });\n }, [caseSet]);\n\n\n const onIndexCellClick = useCallback((row: CaseDbCase) => {\n openCaseInfoDialog(row.id, CASE_INFO_DIALOG_TAB_NAME.INFO);\n }, [openCaseInfoDialog]);\n\n const getColumnWidth = useCallback((col: CaseDbCol, label: string) => {\n let maxTextLength = label?.length * 0.8;\n sortedData.forEach(row => {\n const value = CaseUtil.getRowValue(row.content, col, completeCaseType).short;\n if (value?.length > maxTextLength) {\n maxTextLength = value.length;\n }\n });\n\n let maxWidth = +theme.spacing(5).replace('px', '') + maxTextLength * 7;\n if (stratification?.col?.id === col.id) {\n maxWidth = maxWidth + +theme.spacing(3).replace('px', '');\n }\n\n const { MAX_COLUMN_WIDTH, REQUIRED_EXTRA_CELL_PADDING_TO_FIT_CONTENT } = ConfigService.getInstance<CaseDbConfig>().config.lineList;\n return Math.min(MAX_COLUMN_WIDTH, maxWidth) + REQUIRED_EXTRA_CELL_PADDING_TO_FIT_CONTENT;\n }, [completeCaseType, sortedData, stratification?.col?.id, theme]);\n\n const onOrganizationCellClick = useCallback((organizationId: string, organizationName: string) => {\n EventBusService.getInstance().emit('openContactDetailsDialog', {\n organizationId,\n organizationName,\n });\n }, []);\n\n const renderOrganizationCell = useCallback(({ id, row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n const rowValue = CaseUtil.getRowValue(row.content, completeCaseType.cols[id], completeCaseType);\n if (rowValue.isMissing) {\n return rowValue.short;\n }\n const legendaItem: StratificationLegendaItem = {\n caseIds: [row.id],\n color: stratification?.caseIdColors[row.id],\n columnType: completeCaseType.ref_cols[completeCaseType.cols[id].ref_col_id].col_type,\n rowValue,\n };\n\n const link = (\n <Link\n color={'primary'}\n component={'button'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => {\n onOrganizationCellClick(row.content[id], rowValue.long);\n }}\n sx={{\n cursor: 'pointer',\n }}\n >\n {rowValue.short}\n </Link>\n );\n if (id === stratification?.col?.id) {\n return (\n <LegendaItem\n item={legendaItem}\n >\n {link}\n </LegendaItem>\n );\n }\n return link;\n }, [completeCaseType, onOrganizationCellClick, stratification?.caseIdColors, stratification?.col?.id]);\n\n const onGeneticSequenceCellClick = useCallback((id: string, row: CaseDbCase) => {\n EventBusService.getInstance().emit('openSequenceDownloadDialog', {\n cases: [row],\n geneticSequenceColId: id,\n });\n }, []);\n\n const renderGeneticSequenceCell = useCallback(({ id, row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n return (\n <Link\n color={'primary'}\n component={'button'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => {\n onGeneticSequenceCellClick(id, row);\n }}\n sx={{\n cursor: 'pointer',\n }}\n >\n {row.content[id]}\n </Link>\n );\n }, [onGeneticSequenceCellClick]);\n\n const renderIsInEventHeader = useCallback(() => {\n return (\n <Tooltip\n aria-hidden={false}\n arrow\n title={t`Indicates if the case is in an event.`}\n >\n <CollectionIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n </Tooltip>\n );\n }, [t, theme]);\n\n const renderIsInEventCell = useCallback(({ row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n return <LineListWidgetIsInEventCell row={row} />;\n }, []);\n\n const renderIsOwnCaseHeader = useCallback(() => {\n return (\n <Tooltip\n aria-hidden={false}\n arrow\n title={t`Indicates if the case is owned by the current user (the case is in a private data collection that is owned by the user's organization).`}\n >\n <CorporateFareIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n </Tooltip>\n );\n }, [t, theme]);\n\n const renderIsOwnCaseCell = useCallback(({ row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n return <LineListWidgetIsOwnCaseCell row={row} />;\n }, []);\n\n const renderSimilarCell = useCallback(({ row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n const similarCaseIds = dashboardStore.getState().findSimilarCasesResults.reduce<string[]>((acc, result) => [...acc, ...result.similarCaseIds], []);\n if (similarCaseIds.includes(row.id)) {\n return (\n <TroubleshootIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n );\n }\n return null;\n }, [dashboardStore, theme]);\n\n\n const renderSimilarHeader = useCallback(() => {\n return (\n <Tooltip\n aria-hidden={false}\n arrow\n title={t`Indicates if the case has been identified as a similar case, based on the find similar cases result.`}\n >\n <TroubleshootIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n </Tooltip>\n );\n }, [t, theme]);\n\n\n const renderCell = useCallback(({ id, row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n const rowValue = CaseUtil.getRowValue(row.content, completeCaseType.cols[id], completeCaseType);\n const legendaItem: StratificationLegendaItem = {\n caseIds: [row.id],\n color: stratification?.caseIdColors[row.id],\n columnType: completeCaseType.ref_cols[completeCaseType.cols[id].ref_col_id].col_type,\n rowValue,\n };\n if (id === stratification?.col?.id) {\n return (\n <LegendaItem\n item={legendaItem}\n />\n );\n }\n\n return (\n <>\n {rowValue.short}\n </>\n );\n }, [completeCaseType, stratification?.caseIdColors, stratification?.col?.id]);\n\n const frozenTableColumnsLeft = useMemo<TableColumn<CaseDbCase, CaseDbCompleteCaseType>[]>(() => {\n return [\n TableUtil.createReadableIndexColumn({\n getAriaLabel: (params: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => t('Show case information for {{index}}', { index: params.rowIndex + 1 }),\n }),\n TableUtil.createSelectableColumn(),\n {\n frozen: TABLE_COLUMN_FROZEN.LEFT,\n id: 'isInEvent',\n isInitiallyVisible: true,\n renderCell: renderIsInEventCell,\n renderHeader: renderIsInEventHeader,\n resizable: false,\n type: 'text',\n widthPx: 24,\n } satisfies TableColumn<CaseDbCase, CaseDbCompleteCaseType>,\n {\n frozen: TABLE_COLUMN_FROZEN.LEFT,\n id: 'isOwnCase',\n isInitiallyVisible: true,\n renderCell: renderIsOwnCaseCell,\n renderHeader: renderIsOwnCaseHeader,\n resizable: false,\n type: 'text',\n widthPx: 24,\n } satisfies TableColumn<CaseDbCase, CaseDbCompleteCaseType>,\n {\n frozen: TABLE_COLUMN_FROZEN.LEFT,\n headerTooltipContent: t`Is similar case?`,\n id: 'similar',\n isInitiallyVisible: true,\n renderCell: renderSimilarCell,\n renderHeader: renderSimilarHeader,\n resizable: false,\n type: 'text',\n widthPx: 24,\n } satisfies TableColumn<CaseDbCase, CaseDbCompleteCaseType>,\n ];\n }, [renderIsInEventCell, renderIsInEventHeader, renderIsOwnCaseCell, renderIsOwnCaseHeader, t, renderSimilarCell, renderSimilarHeader]);\n\n const frozenTableColumnsRight = useMemo<TableColumn<CaseDbCase, CaseDbCompleteCaseType>[]>(() => {\n return [\n TableUtil.createActionsColumn({\n columnContext: null,\n getActions: (params: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n const actions: ReactElement[] = [\n (\n <MenuItem\n key={'showInformation'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => openCaseInfoDialog(params.row.id, CASE_INFO_DIALOG_TAB_NAME.INFO)}\n >\n <ListItemIcon>\n <ArrowCircleRightIcon />\n </ListItemIcon>\n <ListItemText>\n {t`Show information`}\n </ListItemText>\n </MenuItem>\n ),\n (\n <MenuItem\n key={'editInformation'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => openCaseInfoDialog(params.row.id, CASE_INFO_DIALOG_TAB_NAME.EDIT)}\n >\n <ListItemIcon>\n <EditIcon />\n </ListItemIcon>\n <ListItemText>\n {t`Edit information`}\n </ListItemText>\n </MenuItem>\n ),\n (\n <MenuItem\n key={'share'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => openCaseInfoDialog(params.row.id, CASE_INFO_DIALOG_TAB_NAME.SHARING)}\n >\n <ListItemIcon>\n <ShareIcon />\n </ListItemIcon>\n <ListItemText>\n {t`Share`}\n </ListItemText>\n </MenuItem>\n ),\n (\n <MenuItem\n key={'addToEvent'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onAddToEventClick(params.row)}\n >\n <ListItemIcon>\n <CollectionIcon />\n </ListItemIcon>\n <ListItemText>\n {t`Add to event`}\n </ListItemText>\n </MenuItem>\n ),\n ];\n return actions;\n },\n t,\n }),\n ];\n }, [onAddToEventClick, openCaseInfoDialog, t]);\n\n\n const columnStratificationCache = useMemo(() => {\n const cache: Record<string, Stratification> = {};\n if (!isCondensed) {\n return cache;\n }\n completeCaseType.ordered_col_ids.forEach((colId) => {\n const col = completeCaseType.cols[colId];\n cache[colId] = StratificationUtil.getStratification({\n col,\n completeCaseType,\n mode: STRATIFICATION_MODE.FIELD,\n sortedData,\n useExtraGradients: true,\n });\n });\n\n return cache;\n }, [completeCaseType, isCondensed, sortedData]);\n\n const cellColorGetter = useCallback((params: TableRowAndColumnParams<CaseDbCase, CaseDbCompleteCaseType>): string | undefined => {\n const columnStratification = columnStratificationCache[params.column.id];\n return columnStratification?.caseIdColors[params.row.id];\n }, [columnStratificationCache]);\n\n const cellTitleGetter = useCallback((params: TableRowAndColumnParams<CaseDbCase, CaseDbCompleteCaseType>): string | undefined => {\n const rowValue = CaseUtil.getRowValue(params.row.content, completeCaseType.cols[params.column.id], completeCaseType);\n return rowValue.isMissing ? undefined : rowValue.long;\n }, [completeCaseType]);\n\n const tableColumns = useMemo<TableColumn<CaseDbCase, CaseDbCompleteCaseType>[]>(() => {\n const { DATA_MISSING_CHARACTER } = ConfigService.getInstance<CaseDbConfig>().config.epi;\n\n const initialVisibleColumnIds = CaseTypeUtil.getInitialVisibleColIds(completeCaseType);\n const caseTypeTableColumns: TableColumn<CaseDbCase, CaseDbCompleteCaseType>[] = [];\n\n\n completeCaseType.ordered_dim_ids.map(x => completeCaseType.dims[x]).forEach((dim) => {\n completeCaseType.ordered_col_ids_by_dim[dim.id].map(id => completeCaseType.cols[id]).forEach(col => {\n const refCol = completeCaseType.ref_cols[col.ref_col_id];\n const baseCaseTypeTableColumn: Partial<TableColumn<CaseDbCase, CaseDbCompleteCaseType, CaseDbCol>> = {\n cellColorGetter,\n cellTitleGetter,\n columnContext: col,\n headerName: col.label,\n headerTooltipContent: refCol.description,\n id: col.id,\n isInitiallyVisible: initialVisibleColumnIds.includes(col.id),\n };\n if (refCol.col_type === CaseDbColType.GENETIC_DISTANCE) {\n caseTypeTableColumns.push({\n ...baseCaseTypeTableColumn,\n cellTitleGetter: (params) => {\n const value = treeAddresses[col.id]?.addresses[params.row.id] ? `${treeAddresses[col.id].algorithmCode} ${treeAddresses[col.id].addresses[params.row.id]}` : undefined;\n return value ?? undefined;\n },\n comparatorFactory: ({ direction }: GetTableCellRowComparatorProps<TableColumnText<CaseDbCase, CaseDbCompleteCaseType>, CaseDbCompleteCaseType>) => (a: CaseDbCase, b: CaseDbCase) => {\n const sortValue = StringUtil.advancedSortComperator(treeAddresses[col.id]?.addresses?.[a.id], treeAddresses[col.id]?.addresses?.[b.id]);\n return direction === 'asc' ? sortValue : -sortValue;\n },\n type: 'text',\n valueGetter: (params) => {\n const value = treeAddresses[col.id]?.addresses[params.row.id] ? `${treeAddresses[col.id].algorithmCode} ${treeAddresses[col.id].addresses[params.row.id]}` : undefined;\n return value ?? DATA_MISSING_CHARACTER;\n },\n widthPx: 200,\n } as TableColumn<CaseDbCase, CaseDbCompleteCaseType>);\n } else {\n let cellRenderer: (params: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => ReactElement | string;\n if (refCol.col_type === CaseDbColType.ORGANIZATION) {\n cellRenderer = renderOrganizationCell;\n } else if (refCol.col_type === CaseDbColType.GENETIC_SEQUENCE) {\n cellRenderer = renderGeneticSequenceCell;\n } else {\n cellRenderer = renderCell;\n }\n\n caseTypeTableColumns.push({\n ...baseCaseTypeTableColumn,\n comparatorFactory: CaseDbTableUtil.createCaseTypeCellRowComperator,\n renderCell: cellRenderer,\n textAlign: ([CaseDbColType.DECIMAL_0, CaseDbColType.DECIMAL_1, CaseDbColType.DECIMAL_2, CaseDbColType.DECIMAL_3, CaseDbColType.DECIMAL_4, CaseDbColType.DECIMAL_4, CaseDbColType.DECIMAL_5, CaseDbColType.DECIMAL_6] as CaseDbColType[]).includes(refCol.col_type) ? 'right' : 'left',\n type: 'text',\n widthPx: getColumnWidth(col, col.label),\n } as TableColumn<CaseDbCase, CaseDbCompleteCaseType>);\n }\n });\n });\n\n return [\n ...frozenTableColumnsLeft,\n ...caseTypeTableColumns,\n ...frozenTableColumnsRight,\n ];\n }, [completeCaseType, frozenTableColumnsLeft, frozenTableColumnsRight, cellColorGetter, cellTitleGetter, treeAddresses, getColumnWidth, renderOrganizationCell, renderGeneticSequenceCell, renderCell]);\n\n const onRowMouseEnter = useCallback((row: CaseDbCase) => {\n dashboardContext.highlight({\n caseIds: [row.id],\n origin: DASHBOARD_COMPONENT_NAME.LINE_LIST,\n });\n }, [dashboardContext]);\n\n\n const onRowMouseLeave = useCallback(() => {\n dashboardContext.highlight({\n caseIds: [],\n origin: DASHBOARD_COMPONENT_NAME.LINE_LIST,\n });\n }, [dashboardContext]);\n\n useEffect(() => {\n setTableColumns(tableColumns);\n }, [setTableColumns, tableColumns]);\n\n useEffect(() => {\n const unsubscribe = dashboardContext.highlightSubject.subscribe((highlighting) => {\n if (highlighting?.origin === DASHBOARD_COMPONENT_NAME.LINE_LIST) {\n return;\n }\n if (highlighting.scrollIntoView) {\n const firstHighlightedCaseId = highlighting.caseIds[0];\n const index = sortedData.findIndex(row => row.id === firstHighlightedCaseId);\n if (index !== -1) {\n tableRef.current?.scrollToIndex(index, () => {\n rowHighlightingSubject.next(highlighting.caseIds);\n });\n }\n } else {\n rowHighlightingSubject.next(highlighting.caseIds);\n }\n });\n return () => {\n unsubscribe();\n };\n }, [dashboardContext, rowHighlightingSubject, sortedData]);\n\n useEpiLineListWidgetEmitDownloadOptions();\n\n const updateVisibleIndexDebounced = useDebouncedCallback((index: number) => {\n updateWidgetData<LineListWidgetData>(DASHBOARD_COMPONENT_NAME.LINE_LIST, {\n visibleItemItemIndex: index,\n });\n }, 500);\n\n const onTableVisibleItemIndexChange = useCallback((index: number) => {\n updateVisibleIndexDebounced(index);\n }, [updateVisibleIndexDebounced]);\n\n const onRangeChangedDebounced = useDebouncedCallback(async (range: ListRange) => {\n await LineListCaseSetMembersService.getInstance().loadRange(sortedData.slice(range.startIndex, Math.min(range.endIndex + 1, sortedData.length)).map(row => row.id));\n await LineListIsOwnCaseService.getInstance().loadRange(sortedData.slice(range.startIndex, Math.min(range.endIndex + 1, sortedData.length)).map(row => row.id), completeCaseType.id);\n }, ConfigService.getInstance<CaseDbConfig>().config.lineList.CASE_SET_MEMBERS_FETCH_DEBOUNCE_DELAY_MS, {\n leading: false,\n trailing: true,\n });\n\n const onRangeChanged = useCallback((range: ListRange) => {\n dashboardContext.lineListRangeSubject.next(range);\n void onRangeChangedDebounced(range);\n }, [dashboardContext, onRangeChangedDebounced]);\n\n useEffect(() => {\n return () => {\n LineListCaseSetMembersService.getInstance().cleanStaleQueue();\n LineListIsOwnCaseService.getInstance().cleanStaleQueue();\n };\n }, []);\n\n const onVerticalScrollPositionChange = useCallback((position: number) => {\n if (isNaN(position)) {\n return;\n }\n dashboardContext.linkedScrollSubject.next({\n origin: containerRef.current,\n position,\n });\n }, [dashboardContext]);\n\n useEffect(() => {\n const unsubscribe = dashboardContext.linkedScrollSubject.subscribe((data) => {\n if (data.origin === containerRef.current) {\n return;\n }\n tableRef.current.setVerticalScrollPosition(data.position);\n });\n\n return () => {\n unsubscribe();\n };\n }, [dashboardContext]);\n\n const getRowName = useCallback((row: CaseDbCase): string => {\n return row.id;\n }, []);\n\n return (\n <DashboardWidget\n isLoading={isDataLoading}\n primaryMenu={<LineListWidgetPrimaryMenu caseSet={caseSet} />}\n secondaryMenu={<LineListWidgetSecondaryMenu />}\n title={<LineListWidgetTitle />}\n widgetName={DASHBOARD_COMPONENT_NAME.LINE_LIST}\n >\n <Box\n ref={containerRef}\n sx={{\n height: '100%',\n width: '100%',\n }}\n >\n <Table\n font={theme['gen-epix-ui-client-casedb'].lineList.font}\n forceHorizontalOverflow\n getRowName={getRowName}\n initialVisibleItemIndex={dashboardStore.getState().getWidgetData<LineListWidgetData>(DASHBOARD_COMPONENT_NAME.LINE_LIST)?.visibleItemItemIndex}\n onRangeChanged={onRangeChanged}\n onReadableIndexClick={onIndexCellClick}\n onRowMouseEnter={onRowMouseEnter}\n onRowMouseLeave={onRowMouseLeave}\n onVerticalScrollPositionChange={onVerticalScrollPositionChange}\n onVisibleItemIndexChange={onTableVisibleItemIndexChange}\n ref={tableRef}\n rowHeight={3}\n rowHighlightingSubject={rowHighlightingSubject}\n />\n </Box>\n </DashboardWidget>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LineListWidget.js","names":[],"sources":["../../src/components/ui/LineListWidget/LineListWidgetIsInEventCell.tsx","../../src/components/ui/LineListWidget/LineListWidgetIsOwnCaseCell.tsx","../../src/components/ui/LineListWidget/LineListWidgetTitle.tsx","../../src/components/ui/LineListWidget/LineListWidgetPrimaryMenu.tsx","../../src/components/ui/LineListWidget/LineListWidgetSecondaryMenu.tsx","../../src/components/ui/LineListWidget/useEpiLineListWidgetEmitDownloadOptions.tsx","../../src/components/ui/LineListWidget/LineListWidget.tsx"],"sourcesContent":["import {\n Box,\n CircularProgress,\n useTheme,\n} from '@mui/material';\nimport type { CaseDbCase } from '@gen-epix/api-casedb';\nimport {\n memo,\n useEffect,\n useState,\n} from 'react';\n\nimport CollectionIcon from '../../../assets/icons/CollectionIcon.svg?react';\nimport { LineListCaseSetMembersService } from '../../../classes/services/LineListService/LineListCaseSetMembersService';\n\ntype LineListWidgetIsInEventCellProps = {\n readonly row: CaseDbCase;\n};\n\nexport const LineListWidgetIsInEventCell = memo(({ row }: LineListWidgetIsInEventCellProps) => {\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [isTrue, setIsTrue] = useState(false);\n const theme = useTheme();\n\n useEffect(() => {\n const perform = async () => {\n try {\n setIsTrue(await LineListCaseSetMembersService.getInstance().query(row.id));\n } catch (_error) {\n setHasError(true);\n } finally {\n setIsLoading(false);\n }\n };\n\n void perform();\n }, [row.id]);\n\n return (\n <Box>\n {isLoading && (\n <CircularProgress\n size={16}\n sx={{\n marginTop: '4px',\n position: 'absolute',\n }}\n />\n )}\n {!isLoading && hasError && (\n <Box sx={{ color: `${theme.palette.error.main}` }}>\n {'?'}\n </Box>\n )}\n {!isLoading && !hasError && isTrue && (\n <CollectionIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n )}\n\n </Box>\n );\n});\n","import {\n Box,\n CircularProgress,\n useTheme,\n} from '@mui/material';\nimport type { CaseDbCase } from '@gen-epix/api-casedb';\nimport {\n memo,\n useEffect,\n useState,\n} from 'react';\nimport CorporateFareIcon from '@mui/icons-material/CorporateFare';\n\nimport { LineListIsOwnCaseService } from '../../../classes/services/LineListService/LineListIsOwnCaseService';\n\ntype LineListWidgetIsOwnCaseCellProps = {\n readonly row: CaseDbCase;\n};\n\nexport const LineListWidgetIsOwnCaseCell = memo(({ row }: LineListWidgetIsOwnCaseCellProps) => {\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [isTrue, setIsTrue] = useState(false);\n const theme = useTheme();\n\n useEffect(() => {\n const perform = async () => {\n try {\n setIsTrue(await LineListIsOwnCaseService.getInstance().query(row.id));\n } catch (_error) {\n setHasError(true);\n } finally {\n setIsLoading(false);\n }\n };\n\n void perform();\n }, [row.id]);\n\n return (\n <Box>\n {isLoading && (\n <CircularProgress\n size={16}\n sx={{\n marginTop: '4px',\n position: 'absolute',\n }}\n />\n )}\n {!isLoading && hasError && (\n <Box sx={{ color: `${theme.palette.error.main}` }}>\n {'?'}\n </Box>\n )}\n {!isLoading && !hasError && isTrue && (\n <CorporateFareIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n )}\n\n </Box>\n );\n});\n","import { use } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\nimport { Typography } from '@mui/material';\n\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\n\nexport const LineListWidgetTitle = () => {\n const dashboardStore = use(DashboardStoreContext);\n const { t } = useTranslation();\n const sortedData = useStore(dashboardStore, useShallow((state) => state.sortedData));\n const selectedIds = useStore(dashboardStore, useShallow((state) => state.selectedIds));\n\n return (\n <Typography\n aria-live={'polite'}\n component={'div'}\n role={'status'}\n sx={{\n fontWeight: 600,\n lineHeight: theme => theme.spacing(3),\n }}\n >\n {t('Line list: {{shownCount}} cases, {{selectedCount}} selected', { selectedCount: selectedIds.length ?? 0, shownCount: sortedData.length ?? 0 })}\n </Typography>\n );\n};\n","import {\n use,\n useCallback,\n useMemo,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\nimport type {\n CaseDbApiPermission,\n CaseDbCase,\n CaseDbCaseSet,\n CaseDbCompleteCaseType,\n} from '@gen-epix/api-casedb';\nimport {\n CaseDbCommandName,\n CaseDbPermissionType,\n} from '@gen-epix/api-casedb';\nimport type { MenuItemData } from '@gen-epix/ui-core-components/models/nestedMenu';\nimport type { TableColumn } from '@gen-epix/ui-client-common/models/table';\nimport { AuthorizationService } from '@gen-epix/ui-client-common/classes/services/AuthorizationService';\nimport { useColumnsMenu } from '@gen-epix/ui-client-common/hooks/useColumnsMenu';\nimport last from 'lodash/last';\n\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CaseUtil } from '../../../utils/CaseUtil';\nimport { WidgetMenu } from '../WidgetMenu';\nimport { SelectionFilter } from '../../../classes/filters/SelectionFilter';\n\n\nexport type LineListWidgetPrimaryMenuProps = {\n readonly caseSet?: CaseDbCaseSet;\n};\n\n\nexport const LineListWidgetPrimaryMenu = ({\n caseSet,\n}: LineListWidgetPrimaryMenuProps) => {\n const dashboardStore = use(DashboardStoreContext);\n const { t } = useTranslation();\n const selectedIds = useStore(dashboardStore, useShallow((state) => state.selectedIds));\n const sortedData = useStore(dashboardStore, useShallow((state) => state.sortedData));\n const completeCaseType = useStore(dashboardStore, useShallow((state) => state.completeCaseType));\n const setFilterValue = useStore(dashboardStore, useShallow((state) => state.setFilterValue));\n const filters = useStore(dashboardStore, useShallow((state) => state.filters));\n const setSelectedIds = useStore(dashboardStore, useShallow((state) => state.setSelectedIds));\n const findSimilarCasesResults = useStore(dashboardStore, useShallow((state) => state.findSimilarCasesResults));\n\n const hasCellData = useCallback((row: CaseDbCase, tableColumn: TableColumn<CaseDbCase, CaseDbCompleteCaseType>, rowIndex: number) => {\n if (tableColumn.valueGetter) {\n return !!tableColumn.valueGetter({\n column: tableColumn,\n dataContext: completeCaseType,\n id: tableColumn.id,\n row,\n rowIndex,\n });\n }\n return !CaseUtil.getRowValue(row.content, completeCaseType.cols[tableColumn.id], completeCaseType).isMissing;\n }, [completeCaseType]);\n\n const createFilterFromSelectedRowCaseIds = useCallback(async () => {\n await setFilterValue('selected', selectedIds);\n setSelectedIds([]);\n }, [setFilterValue, selectedIds, setSelectedIds]);\n\n const hasSelectionFilter = filters.some((filter) => filter instanceof SelectionFilter && filter.filterValue.length > 0);\n const columnsMenuItem = useColumnsMenu({ hasCellData });\n\n const similarCaseIds = useMemo(() => findSimilarCasesResults?.flatMap((result) => result.similarCaseIds) || [], [findSimilarCasesResults]);\n\n const rowsWithoutSimilarCases = useMemo(() => {\n if (!findSimilarCasesResults?.length) {\n return sortedData;\n }\n return sortedData.filter((row) => !similarCaseIds.includes(row.id));\n }, [findSimilarCasesResults, sortedData, similarCaseIds]);\n\n const selectedRowsWithoutSimilarCases = useMemo(() => {\n return rowsWithoutSimilarCases.filter((row) => selectedIds?.includes(row.id));\n }, [rowsWithoutSimilarCases, selectedIds]);\n\n const selectedRows = useMemo(() => {\n return sortedData.filter((row) => selectedIds?.includes(row.id));\n }, [sortedData, selectedIds]);\n\n const menu = useMemo<MenuItemData[]>(() => {\n const shouldShowCreateEventMenuItem = AuthorizationService.getInstance().doesUserHavePermission<CaseDbApiPermission>([{ command_name: CaseDbCommandName.CreateCaseSetCommand, permission_type: CaseDbPermissionType.EXECUTE }]);\n const shouldShowAddToEventMenuItem = AuthorizationService.getInstance().doesUserHavePermission<CaseDbApiPermission>([{ command_name: CaseDbCommandName.CaseSetMemberCrudCommand, permission_type: CaseDbPermissionType.CREATE }]);\n const shouldShowRemoveFromEventMenuItem = !!caseSet && AuthorizationService.getInstance().doesUserHavePermission<CaseDbApiPermission>([{ command_name: CaseDbCommandName.CaseSetMemberCrudCommand, permission_type: CaseDbPermissionType.DELETE }]);\n const shouldShowBulkEditCaseMenuItem = true;\n\n const actionsColumnMenuItem: MenuItemData = {\n items: [\n {\n callback: createFilterFromSelectedRowCaseIds,\n disabled: !selectedIds?.length || similarCaseIds.length > 0,\n divider: true,\n label: t`Create filter from selected cases`,\n },\n {\n callback: () => EventBusService.getInstance().emit('openFindSimilarCasesDialog', {\n allRows: sortedData,\n completeCaseType,\n selectedRows: sortedData,\n }),\n disabled: hasSelectionFilter,\n label: t`Find similar cases`,\n },\n {\n callback: () => EventBusService.getInstance().emit('openFindSimilarCasesDialog', {\n allRows: sortedData,\n completeCaseType,\n selectedRows,\n }),\n disabled: !selectedIds?.length || hasSelectionFilter,\n label: t`Find similar cases (based on selected cases)`,\n },\n {\n callback: () => EventBusService.getInstance().emit('openRemoveFindSimilarCasesResultDialog', {\n completeCaseType,\n }),\n disabled: !findSimilarCasesResults?.length,\n label: t`Remove similar cases from results`,\n },\n ],\n label: t`Actions`,\n };\n\n if (shouldShowCreateEventMenuItem) {\n actionsColumnMenuItem.items.push(\n {\n callback: () => EventBusService.getInstance().emit('openCreateEventDialog', {\n completeCaseType,\n rows: selectedRows,\n }),\n disabled: !selectedIds?.length,\n label: t`Create new event with selected cases`,\n },\n );\n }\n\n if (shouldShowAddToEventMenuItem) {\n actionsColumnMenuItem.items.push(\n {\n callback: () => EventBusService.getInstance().emit('openAddCasesToEventDialog', {\n currentCaseSet: caseSet,\n rows: selectedRows,\n }),\n disabled: !selectedIds?.length,\n label: t`Add selected cases to an existing event`,\n },\n );\n }\n\n if (shouldShowRemoveFromEventMenuItem) {\n actionsColumnMenuItem.items.push(\n {\n callback: () => EventBusService.getInstance().emit('openRemoveCasesFromEventDialog', {\n caseSet,\n rows: selectedRowsWithoutSimilarCases,\n }),\n disabled: !selectedRowsWithoutSimilarCases.length,\n label: t`Remove selected cases from this event`,\n },\n );\n }\n if (actionsColumnMenuItem.items.length > 3) {\n actionsColumnMenuItem.items[3].divider = true;\n }\n\n last(actionsColumnMenuItem.items).divider = true;\n if (shouldShowBulkEditCaseMenuItem) {\n actionsColumnMenuItem.items.push(\n {\n callback: () => EventBusService.getInstance().emit('openEditCases', selectedRows),\n disabled: !selectedIds?.length,\n label: t`Edit selected cases`,\n },\n );\n }\n\n const menus: MenuItemData[] = [\n columnsMenuItem,\n actionsColumnMenuItem,\n ];\n\n return menus;\n }, [caseSet, t, selectedIds?.length, hasSelectionFilter, similarCaseIds.length, createFilterFromSelectedRowCaseIds, findSimilarCasesResults?.length, columnsMenuItem, sortedData, completeCaseType, selectedRows, selectedRowsWithoutSimilarCases]);\n\n\n return <WidgetMenu menu={menu} />;\n};\n","import {\n use,\n useCallback,\n useMemo,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport LinkIcon from '@mui/icons-material/Link';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\nimport { useTheme } from '@mui/material';\nimport type { MenuItemData } from '@gen-epix/ui-core-components/models/nestedMenu';\n\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { WidgetMenu } from '../WidgetMenu';\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { DASHBOARD_COMPONENT_NAME } from '../../../constants/dashboard';\nimport type { TreeWidgetData } from '../../../models/dashboard';\n\nexport const LineListWidgetSecondaryMenu = () => {\n const theme = useTheme();\n const dashboardStore = use(DashboardStoreContext);\n const { t } = useTranslation();\n const isTreeLinked = useStore(dashboardStore, useShallow((state) => state.getWidgetData<TreeWidgetData>(DASHBOARD_COMPONENT_NAME.TREE).zoomLevel === 1));\n const setSorting = useStore(dashboardStore, useShallow((state) => state.setSorting));\n\n const onLinkButtonClick = useCallback(() => {\n const perform = async () => {\n await setSorting(null, null);\n EventBusService.getInstance().emit('onLinkLineListAndTree');\n };\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n }, [setSorting]);\n\n const menu = useMemo<MenuItemData[]>(() => {\n return [\n {\n callback: onLinkButtonClick,\n disabled: isTreeLinked,\n label: t`Link and snap the Tree to the Line list (resets tree zoom level and Line List sorting)`,\n leftIcon: (\n <LinkIcon\n sx={{\n color: isTreeLinked ? undefined : theme.palette.error.main,\n }}\n />\n ),\n },\n ];\n }, [isTreeLinked, onLinkButtonClick, t, theme.palette.error.main]);\n\n return <WidgetMenu menu={menu} />;\n};\n","import {\n use,\n useCallback,\n useEffect,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\n\nimport type { DownloadConfig } from '../../../classes/services/EventBusService';\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CaseDbDownloadUtil } from '../../../utils/CaseDbDownloadUtil';\nimport { DashboardUtil } from '../../../utils/DashboardUtil';\nimport { DASHBOARD_COMPONENT_NAME } from '../../../constants/dashboard';\n\nexport const useEpiLineListWidgetEmitDownloadOptions = () => {\n const { t } = useTranslation();\n const dashboardStore = use(DashboardStoreContext);\n const sortedData = useStore(dashboardStore, useShallow((state) => state.sortedData));\n const completeCaseType = useStore(dashboardStore, useShallow((state) => state.completeCaseType));\n\n const getVisibleColumnIds = useCallback(() => {\n return dashboardStore.getState().getCurrentColumnVisualSettings().filter(x => x.isVisible).map(x => x.id);\n }, [dashboardStore]);\n\n useEffect(() => {\n const emitDownloadOptions = (selectedIds: string[]) => {\n const items: DownloadConfig['items'] = [\n {\n disabled: !sortedData?.length,\n items: [\n {\n callback: async () => CaseDbDownloadUtil.downloadAsExcel(sortedData, getVisibleColumnIds(), completeCaseType, t),\n label: t`Download as Excel`,\n },\n {\n callback: () => CaseDbDownloadUtil.downloadAsCsv(sortedData, getVisibleColumnIds(), completeCaseType, t),\n label: t`Download as CSV`,\n },\n {\n callback: () => EventBusService.getInstance().emit('openSequenceDownloadDialog', { cases: sortedData }),\n label: t`Download sequences`,\n },\n {\n callback: () => null,\n disabled: true,\n label: t`Download allele profiles`,\n },\n ],\n label: t`All rows`,\n },\n {\n disabled: selectedIds.length === 0,\n items: [\n {\n callback: async () => CaseDbDownloadUtil.downloadAsExcel(DashboardUtil.getSelectedRows(sortedData, selectedIds), getVisibleColumnIds(), completeCaseType, t),\n label: t`Download as Excel`,\n },\n {\n callback: () => CaseDbDownloadUtil.downloadAsCsv(DashboardUtil.getSelectedRows(sortedData, selectedIds), getVisibleColumnIds(), completeCaseType, t),\n label: t`Download as CSV`,\n },\n {\n callback: () => EventBusService.getInstance().emit('openSequenceDownloadDialog', { cases: sortedData.filter(c => selectedIds.includes(c.id)) }),\n label: t`Download sequences`,\n },\n {\n callback: () => null,\n disabled: true,\n label: t`Download allele profiles`,\n },\n ],\n label: t`Selected rows`,\n },\n ];\n\n EventBusService.getInstance().emit('onDownloadOptionsChanged', {\n items,\n zone: DASHBOARD_COMPONENT_NAME.LINE_LIST,\n zoneLabel: t`Line list`,\n });\n };\n emitDownloadOptions(dashboardStore.getState().selectedIds);\n const unsubscribe = dashboardStore.subscribe((state, prevState) => {\n if (JSON.stringify(state.selectedIds) !== JSON.stringify(prevState.selectedIds)) {\n emitDownloadOptions(state.selectedIds);\n }\n });\n\n const onDownloadOptionsRequested = () => {\n emitDownloadOptions(dashboardStore.getState().selectedIds);\n };\n const eventBusService = EventBusService.getInstance();\n eventBusService.addEventListener('onDownloadOptionsRequested', onDownloadOptionsRequested);\n return () => {\n eventBusService.emit('onDownloadOptionsChanged', {\n items: null,\n zone: DASHBOARD_COMPONENT_NAME.LINE_LIST,\n zoneLabel: t`Line list`,\n });\n eventBusService.removeEventListener('onDownloadOptionsRequested', onDownloadOptionsRequested);\n unsubscribe();\n };\n }, [completeCaseType, dashboardStore, getVisibleColumnIds, sortedData, t]);\n};\n","import {\n Box,\n Link,\n ListItemIcon,\n ListItemText,\n MenuItem,\n Tooltip,\n useTheme,\n} from '@mui/material';\nimport type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useDebouncedCallback } from 'use-debounce';\nimport type { ListRange } from 'react-virtuoso';\nimport TroubleshootIcon from '@mui/icons-material/Troubleshoot';\nimport CorporateFareIcon from '@mui/icons-material/CorporateFare';\nimport ArrowCircleRightIcon from '@mui/icons-material/ArrowCircleRight';\nimport type {\n CaseDbCase,\n CaseDbCol,\n CaseDbCompleteCaseType,\n} from '@gen-epix/api-casedb';\nimport { CaseDbColType } from '@gen-epix/api-casedb';\nimport type {\n GetTableCellRowComparatorProps,\n TableColumn,\n TableColumnText,\n TableRowAndColumnParams,\n TableRowParams,\n} from '@gen-epix/ui-client-common/models/table';\nimport type { TableRef } from '@gen-epix/ui-client-common/components/ui/Table';\nimport { ConfigService } from '@gen-epix/ui-client-common/classes/services/ConfigService';\nimport { Table } from '@gen-epix/ui-client-common/components/ui/Table';\nimport { TABLE_COLUMN_FROZEN } from '@gen-epix/ui-client-common/models/table';\nimport { TableUtil } from '@gen-epix/ui-client-common/utils/TableUtil';\nimport EditIcon from '@mui/icons-material/Edit';\nimport ShareIcon from '@mui/icons-material/Share';\nimport { Subject } from '@gen-epix/ui-core/classes/Subject';\nimport { StringUtil } from '@gen-epix/ui-core/utils/StringUtil';\n\nimport CollectionIcon from '../../../assets/icons/CollectionIcon.svg?react';\nimport { LegendaItem } from '../LegendaItem';\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { LineListCaseSetMembersService } from '../../../classes/services/LineListService/LineListCaseSetMembersService';\nimport type { LineListWidgetData } from '../../../models/dashboard';\nimport type {\n Stratification,\n StratificationLegendaItem,\n} from '../../../models/stratification';\nimport { STRATIFICATION_MODE } from '../../../models/stratification';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CaseTypeUtil } from '../../../utils/CaseTypeUtil';\nimport { CaseUtil } from '../../../utils/CaseUtil';\nimport type { CaseDbConfig } from '../../../models/config';\nimport { CaseDbTableUtil } from '../../../utils/CaseDbTableUtil';\nimport { CASE_INFO_DIALOG_TAB_NAME } from '../CaseInfoDialog';\nimport { StratificationUtil } from '../../../utils/StratificationUtil';\nimport { DashboardWidget } from '../Dashboard';\nimport { DASHBOARD_COMPONENT_NAME } from '../../../constants/dashboard';\nimport { DashboardContext } from '../Dashboard/context/DashboardContext';\nimport { LineListIsOwnCaseService } from '../../../classes/services/LineListService/LineListIsOwnCaseService';\n\nimport { LineListWidgetIsInEventCell } from './LineListWidgetIsInEventCell';\nimport { LineListWidgetIsOwnCaseCell } from './LineListWidgetIsOwnCaseCell';\nimport { LineListWidgetTitle } from './LineListWidgetTitle';\nimport { LineListWidgetPrimaryMenu } from './LineListWidgetPrimaryMenu';\nimport { LineListWidgetSecondaryMenu } from './LineListWidgetSecondaryMenu';\nimport { useEpiLineListWidgetEmitDownloadOptions } from './useEpiLineListWidgetEmitDownloadOptions';\n\nexport const LineListWidget = () => {\n const { caseSet } = use(DashboardContext);\n const dashboardContext = use(DashboardContext);\n const containerRef = useRef<HTMLDivElement>(null);\n const { t } = useTranslation();\n const theme = useTheme();\n const rowHighlightingSubject = useMemo(() => new Subject<string[]>([]), []);\n const tableRef = useRef<TableRef>(null);\n\n const dashboardStore = use(DashboardStoreContext);\n const completeCaseType = useStore(dashboardStore, (state) => state.completeCaseType);\n const sortedData = useStore(dashboardStore, (state) => state.sortedData);\n const isCondensed = useStore(dashboardStore, (state) => state.isCondensed);\n const stratification = useStore(dashboardStore, (state) => state.stratification?.mode === STRATIFICATION_MODE.FIELD ? state.stratification : null);\n const updateWidgetData = useStore(dashboardStore, (state) => state.updateWidgetData);\n const treeAddresses = useStore(dashboardStore, (state) => state.treeAddresses);\n const setTableColumns = useStore(dashboardStore, (state) => state.setColumns);\n const isDataLoading = useStore(dashboardStore, (state) => state.isDataLoading);\n\n useEffect(() => {\n return () => {\n dashboardContext.lineListRangeSubject.next(undefined);\n };\n }, [dashboardContext]);\n\n const openCaseInfoDialog = useCallback((caseId: string, tabName: CASE_INFO_DIALOG_TAB_NAME) => {\n EventBusService.getInstance().emit('openCaseInfoDialog', {\n caseId,\n caseTypeId: completeCaseType.id,\n initialTab: tabName,\n });\n }, [completeCaseType.id]);\n\n const onAddToEventClick = useCallback((row: CaseDbCase) => {\n EventBusService.getInstance().emit('openAddCasesToEventDialog', {\n currentCaseSet: caseSet,\n rows: [row],\n });\n }, [caseSet]);\n\n\n const onIndexCellClick = useCallback((row: CaseDbCase) => {\n openCaseInfoDialog(row.id, CASE_INFO_DIALOG_TAB_NAME.INFO);\n }, [openCaseInfoDialog]);\n\n const getColumnWidth = useCallback((col: CaseDbCol, label: string) => {\n let maxTextLength = label?.length * 0.8;\n sortedData.forEach(row => {\n const value = CaseUtil.getRowValue(row.content, col, completeCaseType).short;\n if (value?.length > maxTextLength) {\n maxTextLength = value.length;\n }\n });\n\n let maxWidth = +theme.spacing(5).replace('px', '') + maxTextLength * 7;\n if (stratification?.col?.id === col.id) {\n maxWidth = maxWidth + +theme.spacing(3).replace('px', '');\n }\n\n const { MAX_COLUMN_WIDTH, REQUIRED_EXTRA_CELL_PADDING_TO_FIT_CONTENT } = ConfigService.getInstance<CaseDbConfig>().config.lineList;\n return Math.min(MAX_COLUMN_WIDTH, maxWidth) + REQUIRED_EXTRA_CELL_PADDING_TO_FIT_CONTENT;\n }, [completeCaseType, sortedData, stratification?.col?.id, theme]);\n\n const onOrganizationCellClick = useCallback((organizationId: string, organizationName: string) => {\n EventBusService.getInstance().emit('openContactDetailsDialog', {\n organizationId,\n organizationName,\n });\n }, []);\n\n const renderOrganizationCell = useCallback(({ id, row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n const rowValue = CaseUtil.getRowValue(row.content, completeCaseType.cols[id], completeCaseType);\n if (rowValue.isMissing) {\n return rowValue.short;\n }\n const legendaItem: StratificationLegendaItem = {\n caseIds: [row.id],\n color: stratification?.caseIdColors[row.id],\n columnType: completeCaseType.ref_cols[completeCaseType.cols[id].ref_col_id].col_type,\n rowValue,\n };\n\n const link = (\n <Link\n color={'primary'}\n component={'button'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => {\n onOrganizationCellClick(row.content[id], rowValue.long);\n }}\n sx={{\n cursor: 'pointer',\n }}\n >\n {rowValue.short}\n </Link>\n );\n if (id === stratification?.col?.id) {\n return (\n <LegendaItem\n item={legendaItem}\n >\n {link}\n </LegendaItem>\n );\n }\n return link;\n }, [completeCaseType, onOrganizationCellClick, stratification?.caseIdColors, stratification?.col?.id]);\n\n const onGeneticSequenceCellClick = useCallback((id: string, row: CaseDbCase) => {\n EventBusService.getInstance().emit('openSequenceDownloadDialog', {\n cases: [row],\n geneticSequenceColId: id,\n });\n }, []);\n\n const renderGeneticSequenceCell = useCallback(({ id, row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n return (\n <Link\n color={'primary'}\n component={'button'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => {\n onGeneticSequenceCellClick(id, row);\n }}\n sx={{\n cursor: 'pointer',\n }}\n >\n {row.content[id]}\n </Link>\n );\n }, [onGeneticSequenceCellClick]);\n\n const renderIsInEventHeader = useCallback(() => {\n return (\n <Tooltip\n aria-hidden={false}\n arrow\n title={t`Indicates if the case is in an event.`}\n >\n <CollectionIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n </Tooltip>\n );\n }, [t, theme]);\n\n const renderIsInEventCell = useCallback(({ row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n return <LineListWidgetIsInEventCell row={row} />;\n }, []);\n\n const renderIsOwnCaseHeader = useCallback(() => {\n return (\n <Tooltip\n aria-hidden={false}\n arrow\n title={t`Indicates if the case is owned by the current user (the case is in a private data collection that is owned by the user's organization).`}\n >\n <CorporateFareIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n </Tooltip>\n );\n }, [t, theme]);\n\n const renderIsOwnCaseCell = useCallback(({ row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n return <LineListWidgetIsOwnCaseCell row={row} />;\n }, []);\n\n const renderSimilarCell = useCallback(({ row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n const similarCaseIds = dashboardStore.getState().findSimilarCasesResults.reduce<string[]>((acc, result) => [...acc, ...result.similarCaseIds], []);\n if (similarCaseIds.includes(row.id)) {\n return (\n <TroubleshootIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n );\n }\n return null;\n }, [dashboardStore, theme]);\n\n\n const renderSimilarHeader = useCallback(() => {\n return (\n <Tooltip\n aria-hidden={false}\n arrow\n title={t`Indicates if the case has been identified as a similar case, based on the find similar cases result.`}\n >\n <TroubleshootIcon\n fontSize={'small'}\n style={{\n color: theme.palette.primary.main,\n height: 20,\n marginLeft: theme.spacing(-0.5),\n position: 'absolute',\n width: 20,\n }}\n />\n </Tooltip>\n );\n }, [t, theme]);\n\n\n const renderCell = useCallback(({ id, row }: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n const rowValue = CaseUtil.getRowValue(row.content, completeCaseType.cols[id], completeCaseType);\n const legendaItem: StratificationLegendaItem = {\n caseIds: [row.id],\n color: stratification?.caseIdColors[row.id],\n columnType: completeCaseType.ref_cols[completeCaseType.cols[id].ref_col_id].col_type,\n rowValue,\n };\n if (id === stratification?.col?.id) {\n return (\n <LegendaItem\n item={legendaItem}\n />\n );\n }\n\n return (\n <>\n {rowValue.short}\n </>\n );\n }, [completeCaseType, stratification?.caseIdColors, stratification?.col?.id]);\n\n const frozenTableColumnsLeft = useMemo<TableColumn<CaseDbCase, CaseDbCompleteCaseType>[]>(() => {\n return [\n TableUtil.createReadableIndexColumn({\n getAriaLabel: (params: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => t('Show case information for {{index}}', { index: params.rowIndex + 1 }),\n }),\n TableUtil.createSelectableColumn(),\n {\n frozen: TABLE_COLUMN_FROZEN.LEFT,\n id: 'isInEvent',\n isInitiallyVisible: true,\n renderCell: renderIsInEventCell,\n renderHeader: renderIsInEventHeader,\n resizable: false,\n type: 'text',\n widthPx: 24,\n } satisfies TableColumn<CaseDbCase, CaseDbCompleteCaseType>,\n {\n frozen: TABLE_COLUMN_FROZEN.LEFT,\n id: 'isOwnCase',\n isInitiallyVisible: true,\n renderCell: renderIsOwnCaseCell,\n renderHeader: renderIsOwnCaseHeader,\n resizable: false,\n type: 'text',\n widthPx: 24,\n } satisfies TableColumn<CaseDbCase, CaseDbCompleteCaseType>,\n {\n frozen: TABLE_COLUMN_FROZEN.LEFT,\n headerTooltipContent: t`Is similar case?`,\n id: 'similar',\n isInitiallyVisible: true,\n renderCell: renderSimilarCell,\n renderHeader: renderSimilarHeader,\n resizable: false,\n type: 'text',\n widthPx: 24,\n } satisfies TableColumn<CaseDbCase, CaseDbCompleteCaseType>,\n ];\n }, [renderIsInEventCell, renderIsInEventHeader, renderIsOwnCaseCell, renderIsOwnCaseHeader, t, renderSimilarCell, renderSimilarHeader]);\n\n const frozenTableColumnsRight = useMemo<TableColumn<CaseDbCase, CaseDbCompleteCaseType>[]>(() => {\n return [\n TableUtil.createActionsColumn({\n columnContext: null,\n getActions: (params: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => {\n const actions: ReactElement[] = [\n (\n <MenuItem\n key={'showInformation'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => openCaseInfoDialog(params.row.id, CASE_INFO_DIALOG_TAB_NAME.INFO)}\n >\n <ListItemIcon>\n <ArrowCircleRightIcon />\n </ListItemIcon>\n <ListItemText>\n {t`Show information`}\n </ListItemText>\n </MenuItem>\n ),\n (\n <MenuItem\n key={'editInformation'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => openCaseInfoDialog(params.row.id, CASE_INFO_DIALOG_TAB_NAME.EDIT)}\n >\n <ListItemIcon>\n <EditIcon />\n </ListItemIcon>\n <ListItemText>\n {t`Edit information`}\n </ListItemText>\n </MenuItem>\n ),\n (\n <MenuItem\n key={'share'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => openCaseInfoDialog(params.row.id, CASE_INFO_DIALOG_TAB_NAME.SHARING)}\n >\n <ListItemIcon>\n <ShareIcon />\n </ListItemIcon>\n <ListItemText>\n {t`Share`}\n </ListItemText>\n </MenuItem>\n ),\n (\n <MenuItem\n key={'addToEvent'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onAddToEventClick(params.row)}\n >\n <ListItemIcon>\n <CollectionIcon />\n </ListItemIcon>\n <ListItemText>\n {t`Add to event`}\n </ListItemText>\n </MenuItem>\n ),\n ];\n return actions;\n },\n t,\n }),\n ];\n }, [onAddToEventClick, openCaseInfoDialog, t]);\n\n\n const columnStratificationCache = useMemo(() => {\n const cache: Record<string, Stratification> = {};\n if (!isCondensed) {\n return cache;\n }\n completeCaseType.ordered_col_ids.forEach((colId) => {\n const col = completeCaseType.cols[colId];\n cache[colId] = StratificationUtil.getStratification({\n col,\n completeCaseType,\n mode: STRATIFICATION_MODE.FIELD,\n sortedData,\n useExtraGradients: true,\n });\n });\n\n return cache;\n }, [completeCaseType, isCondensed, sortedData]);\n\n const cellColorGetter = useCallback((params: TableRowAndColumnParams<CaseDbCase, CaseDbCompleteCaseType>): string | undefined => {\n const columnStratification = columnStratificationCache[params.column.id];\n return columnStratification?.caseIdColors[params.row.id];\n }, [columnStratificationCache]);\n\n const cellTitleGetter = useCallback((params: TableRowAndColumnParams<CaseDbCase, CaseDbCompleteCaseType>): string | undefined => {\n const rowValue = CaseUtil.getRowValue(params.row.content, completeCaseType.cols[params.column.id], completeCaseType);\n return rowValue.isMissing ? undefined : rowValue.long;\n }, [completeCaseType]);\n\n const tableColumns = useMemo<TableColumn<CaseDbCase, CaseDbCompleteCaseType>[]>(() => {\n const { DATA_MISSING_CHARACTER } = ConfigService.getInstance<CaseDbConfig>().config.epi;\n\n const initialVisibleColumnIds = CaseTypeUtil.getInitialVisibleColIds(completeCaseType);\n const caseTypeTableColumns: TableColumn<CaseDbCase, CaseDbCompleteCaseType>[] = [];\n\n\n completeCaseType.ordered_dim_ids.map(x => completeCaseType.dims[x]).forEach((dim) => {\n completeCaseType.ordered_col_ids_by_dim[dim.id].map(id => completeCaseType.cols[id]).forEach(col => {\n const refCol = completeCaseType.ref_cols[col.ref_col_id];\n const baseCaseTypeTableColumn: Partial<TableColumn<CaseDbCase, CaseDbCompleteCaseType, CaseDbCol>> = {\n cellColorGetter,\n cellTitleGetter,\n columnContext: col,\n headerName: col.label,\n headerTooltipContent: refCol.description,\n id: col.id,\n isInitiallyVisible: initialVisibleColumnIds.includes(col.id),\n };\n if (refCol.col_type === CaseDbColType.GENETIC_DISTANCE) {\n caseTypeTableColumns.push({\n ...baseCaseTypeTableColumn,\n cellTitleGetter: (params) => {\n const value = treeAddresses[col.id]?.addresses[params.row.id] ? `${treeAddresses[col.id].algorithmCode} ${treeAddresses[col.id].addresses[params.row.id]}` : undefined;\n return value ?? undefined;\n },\n comparatorFactory: ({ direction }: GetTableCellRowComparatorProps<TableColumnText<CaseDbCase, CaseDbCompleteCaseType>, CaseDbCompleteCaseType>) => (a: CaseDbCase, b: CaseDbCase) => {\n const sortValue = StringUtil.advancedSortComperator(treeAddresses[col.id]?.addresses?.[a.id], treeAddresses[col.id]?.addresses?.[b.id]);\n return direction === 'asc' ? sortValue : -sortValue;\n },\n type: 'text',\n valueGetter: (params) => {\n const value = treeAddresses[col.id]?.addresses[params.row.id] ? `${treeAddresses[col.id].algorithmCode} ${treeAddresses[col.id].addresses[params.row.id]}` : undefined;\n return value ?? DATA_MISSING_CHARACTER;\n },\n widthPx: 200,\n } as TableColumn<CaseDbCase, CaseDbCompleteCaseType>);\n } else {\n let cellRenderer: (params: TableRowParams<CaseDbCase, CaseDbCompleteCaseType>) => ReactElement | string;\n if (refCol.col_type === CaseDbColType.ORGANIZATION) {\n cellRenderer = renderOrganizationCell;\n } else if (refCol.col_type === CaseDbColType.GENETIC_SEQUENCE) {\n cellRenderer = renderGeneticSequenceCell;\n } else {\n cellRenderer = renderCell;\n }\n\n caseTypeTableColumns.push({\n ...baseCaseTypeTableColumn,\n comparatorFactory: CaseDbTableUtil.createCaseTypeCellRowComperator,\n renderCell: cellRenderer,\n textAlign: ([CaseDbColType.DECIMAL_0, CaseDbColType.DECIMAL_1, CaseDbColType.DECIMAL_2, CaseDbColType.DECIMAL_3, CaseDbColType.DECIMAL_4, CaseDbColType.DECIMAL_4, CaseDbColType.DECIMAL_5, CaseDbColType.DECIMAL_6] as CaseDbColType[]).includes(refCol.col_type) ? 'right' : 'left',\n type: 'text',\n widthPx: getColumnWidth(col, col.label),\n } as TableColumn<CaseDbCase, CaseDbCompleteCaseType>);\n }\n });\n });\n\n return [\n ...frozenTableColumnsLeft,\n ...caseTypeTableColumns,\n ...frozenTableColumnsRight,\n ];\n }, [completeCaseType, frozenTableColumnsLeft, frozenTableColumnsRight, cellColorGetter, cellTitleGetter, treeAddresses, getColumnWidth, renderOrganizationCell, renderGeneticSequenceCell, renderCell]);\n\n const onRowMouseEnter = useCallback((row: CaseDbCase) => {\n dashboardContext.highlight({\n caseIds: [row.id],\n origin: DASHBOARD_COMPONENT_NAME.LINE_LIST,\n });\n }, [dashboardContext]);\n\n\n const onRowMouseLeave = useCallback(() => {\n dashboardContext.highlight({\n caseIds: [],\n origin: DASHBOARD_COMPONENT_NAME.LINE_LIST,\n });\n }, [dashboardContext]);\n\n useEffect(() => {\n setTableColumns(tableColumns);\n }, [setTableColumns, tableColumns]);\n\n useEffect(() => {\n const unsubscribe = dashboardContext.highlightSubject.subscribe((highlighting) => {\n if (highlighting?.origin === DASHBOARD_COMPONENT_NAME.LINE_LIST) {\n return;\n }\n if (highlighting.scrollIntoView) {\n const firstHighlightedCaseId = highlighting.caseIds[0];\n const index = sortedData.findIndex(row => row.id === firstHighlightedCaseId);\n if (index !== -1) {\n tableRef.current?.scrollToIndex(index, () => {\n rowHighlightingSubject.next(highlighting.caseIds);\n });\n }\n } else {\n rowHighlightingSubject.next(highlighting.caseIds);\n }\n });\n return () => {\n unsubscribe();\n };\n }, [dashboardContext, rowHighlightingSubject, sortedData]);\n\n useEpiLineListWidgetEmitDownloadOptions();\n\n const updateVisibleIndexDebounced = useDebouncedCallback((index: number) => {\n updateWidgetData<LineListWidgetData>(DASHBOARD_COMPONENT_NAME.LINE_LIST, {\n visibleItemItemIndex: index,\n });\n }, 500);\n\n const onTableVisibleItemIndexChange = useCallback((index: number) => {\n updateVisibleIndexDebounced(index);\n }, [updateVisibleIndexDebounced]);\n\n const onRangeChangedDebounced = useDebouncedCallback(async (range: ListRange) => {\n await LineListCaseSetMembersService.getInstance().loadRange(sortedData.slice(range.startIndex, Math.min(range.endIndex + 1, sortedData.length)).map(row => row.id));\n await LineListIsOwnCaseService.getInstance().loadRange(sortedData.slice(range.startIndex, Math.min(range.endIndex + 1, sortedData.length)).map(row => row.id), completeCaseType.id);\n }, ConfigService.getInstance<CaseDbConfig>().config.lineList.CASE_SET_MEMBERS_FETCH_DEBOUNCE_DELAY_MS, {\n leading: false,\n trailing: true,\n });\n\n const onRangeChanged = useCallback((range: ListRange) => {\n dashboardContext.lineListRangeSubject.next(range);\n void onRangeChangedDebounced(range);\n }, [dashboardContext, onRangeChangedDebounced]);\n\n useEffect(() => {\n return () => {\n LineListCaseSetMembersService.getInstance().cleanStaleQueue();\n LineListIsOwnCaseService.getInstance().cleanStaleQueue();\n };\n }, []);\n\n const onVerticalScrollPositionChange = useCallback((position: number) => {\n if (isNaN(position)) {\n return;\n }\n dashboardContext.linkedScrollSubject.next({\n origin: containerRef.current,\n position,\n });\n }, [dashboardContext]);\n\n useEffect(() => {\n const unsubscribe = dashboardContext.linkedScrollSubject.subscribe((data) => {\n if (data.origin === containerRef.current) {\n return;\n }\n tableRef.current.setVerticalScrollPosition(data.position);\n });\n\n return () => {\n unsubscribe();\n };\n }, [dashboardContext]);\n\n const getRowName = useCallback((row: CaseDbCase): string => {\n return row.id;\n }, []);\n\n return (\n <DashboardWidget\n isLoading={isDataLoading}\n primaryMenu={<LineListWidgetPrimaryMenu caseSet={caseSet} />}\n secondaryMenu={<LineListWidgetSecondaryMenu />}\n title={<LineListWidgetTitle />}\n widgetName={DASHBOARD_COMPONENT_NAME.LINE_LIST}\n >\n <Box\n ref={containerRef}\n sx={{\n height: '100%',\n width: '100%',\n }}\n >\n <Table\n font={theme['gen-epix-ui-client-casedb'].lineList.font}\n forceHorizontalOverflow\n getRowName={getRowName}\n initialVisibleItemIndex={dashboardStore.getState().getWidgetData<LineListWidgetData>(DASHBOARD_COMPONENT_NAME.LINE_LIST)?.visibleItemItemIndex}\n onRangeChanged={onRangeChanged}\n onReadableIndexClick={onIndexCellClick}\n onRowMouseEnter={onRowMouseEnter}\n onRowMouseLeave={onRowMouseLeave}\n onVerticalScrollPositionChange={onVerticalScrollPositionChange}\n onVisibleItemIndexChange={onTableVisibleItemIndexChange}\n ref={tableRef}\n rowHeight={3}\n rowHighlightingSubject={rowHighlightingSubject}\n />\n </Box>\n </DashboardWidget>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,IAAa,KAA8B,GAAM,EAAE,aAA4C;CAC7F,IAAM,CAAC,GAAW,KAAgB,EAAS,EAAI,GACzC,CAAC,GAAU,KAAe,EAAS,EAAK,GACxC,CAAC,GAAQ,KAAa,EAAS,EAAK,GACpC,IAAQ,EAAS;CAgBvB,OAdA,QAAgB;EAWd,aAV4B;GAC1B,IAAI;IACF,EAAU,MAAM,EAA8B,YAAY,CAAC,CAAC,MAAM,EAAI,EAAE,CAAC;GAC3E,QAAiB;IACf,EAAY,EAAI;GAClB,UAAU;IACR,EAAa,EAAK;GACpB;EACF,EAEK,CAAQ;CACf,GAAG,CAAC,EAAI,EAAE,CAAC,GAGT,kBAAC,GAAD,EAAA,UAAA;EACG,KACC,kBAAC,GAAD;GACE,MAAM;GACN,IAAI;IACF,WAAW;IACX,UAAU;GACZ;EACD,CAAA;EAEF,CAAC,KAAa,KACb,kBAAC,GAAD;GAAK,IAAI,EAAE,OAAO,GAAG,EAAM,QAAQ,MAAM,OAAO;GAC7C,UAAA;EACE,CAAA;EAEN,CAAC,KAAa,CAAC,KAAY,KAC1B,kBAAC,GAAD;GACE,UAAU;GACV,OAAO;IACL,OAAO,EAAM,QAAQ,QAAQ;IAC7B,QAAQ;IACR,YAAY,EAAM,QAAQ,GAAI;IAC9B,UAAU;IACV,OAAO;GACT;EACD,CAAA;CAGA,EAAA,CAAA;AAET,CAAC,GCnDY,KAA8B,GAAM,EAAE,aAA4C;CAC7F,IAAM,CAAC,GAAW,KAAgB,EAAS,EAAI,GACzC,CAAC,GAAU,KAAe,EAAS,EAAK,GACxC,CAAC,GAAQ,KAAa,EAAS,EAAK,GACpC,IAAQ,EAAS;CAgBvB,OAdA,QAAgB;EAWd,aAV4B;GAC1B,IAAI;IACF,EAAU,MAAM,EAAyB,YAAY,CAAC,CAAC,MAAM,EAAI,EAAE,CAAC;GACtE,QAAiB;IACf,EAAY,EAAI;GAClB,UAAU;IACR,EAAa,EAAK;GACpB;EACF,EAEK,CAAQ;CACf,GAAG,CAAC,EAAI,EAAE,CAAC,GAGT,kBAAC,GAAD,EAAA,UAAA;EACG,KACC,kBAAC,GAAD;GACE,MAAM;GACN,IAAI;IACF,WAAW;IACX,UAAU;GACZ;EACD,CAAA;EAEF,CAAC,KAAa,KACb,kBAAC,GAAD;GAAK,IAAI,EAAE,OAAO,GAAG,EAAM,QAAQ,MAAM,OAAO;GAC7C,UAAA;EACE,CAAA;EAEN,CAAC,KAAa,CAAC,KAAY,KAC1B,kBAAC,IAAD;GACE,UAAU;GACV,OAAO;IACL,OAAO,EAAM,QAAQ,QAAQ;IAC7B,QAAQ;IACR,YAAY,EAAM,QAAQ,GAAI;IAC9B,UAAU;IACV,OAAO;GACT;EACD,CAAA;CAGA,EAAA,CAAA;AAET,CAAC,GC9DY,WAA4B;CACvC,IAAM,IAAiB,EAAI,CAAqB,GAC1C,EAAE,MAAM,EAAe,GACvB,IAAa,EAAS,GAAgB,GAAY,MAAU,EAAM,UAAU,CAAC,GAC7E,IAAc,EAAS,GAAgB,GAAY,MAAU,EAAM,WAAW,CAAC;CAErF,OACE,kBAAC,GAAD;EACE,aAAW;EACX,WAAW;EACX,MAAM;EACN,IAAI;GACF,YAAY;GACZ,aAAY,MAAS,EAAM,QAAQ,CAAC;EACtC;EAEC,UAAA,EAAE,+DAA+D;GAAE,eAAe,EAAY,UAAU;GAAG,YAAY,EAAW,UAAU;EAAE,CAAC;CACtI,CAAA;AAEhB,kCCSa,MAA6B,EACxC,iBACoC;CACpC,IAAM,IAAiB,EAAI,CAAqB,GAC1C,EAAE,SAAM,EAAe,GACvB,IAAc,EAAS,GAAgB,GAAY,MAAU,EAAM,WAAW,CAAC,GAC/E,IAAa,EAAS,GAAgB,GAAY,MAAU,EAAM,UAAU,CAAC,GAC7E,IAAmB,EAAS,GAAgB,GAAY,MAAU,EAAM,gBAAgB,CAAC,GACzF,IAAiB,EAAS,GAAgB,GAAY,MAAU,EAAM,cAAc,CAAC,GACrF,IAAU,EAAS,GAAgB,GAAY,MAAU,EAAM,OAAO,CAAC,GACvE,IAAiB,EAAS,GAAgB,GAAY,MAAU,EAAM,cAAc,CAAC,GACrF,IAA0B,EAAS,GAAgB,GAAY,MAAU,EAAM,uBAAuB,CAAC,GAEvG,IAAc,GAAa,GAAiB,GAA8D,MAC1G,EAAY,cACP,CAAC,CAAC,EAAY,YAAY;EAC/B,QAAQ;EACR,aAAa;EACb,IAAI,EAAY;EAChB;EACA;CACF,CAAC,IAEI,CAAC,EAAS,YAAY,EAAI,SAAS,EAAiB,KAAK,EAAY,KAAK,CAAgB,CAAC,CAAC,WAClG,CAAC,CAAgB,CAAC,GAEf,IAAqC,EAAY,YAAY;EAEjE,AADA,MAAM,EAAe,YAAY,CAAW,GAC5C,EAAe,CAAC,CAAC;CACnB,GAAG;EAAC;EAAgB;EAAa;CAAc,CAAC,GAE1C,IAAqB,EAAQ,MAAM,MAAW,aAAkB,KAAmB,EAAO,YAAY,SAAS,CAAC,GAChH,IAAkB,EAAe,EAAE,eAAY,CAAC,GAEhD,IAAiB,QAAc,GAAyB,SAAS,MAAW,EAAO,cAAc,KAAK,CAAC,GAAG,CAAC,CAAuB,CAAC,GAEnI,IAA0B,QACzB,GAAyB,SAGvB,EAAW,QAAQ,MAAQ,CAAC,EAAe,SAAS,EAAI,EAAE,CAAC,IAFzD,GAGR;EAAC;EAAyB;EAAY;CAAc,CAAC,GAElD,IAAkC,QAC/B,EAAwB,QAAQ,MAAQ,GAAa,SAAS,EAAI,EAAE,CAAC,GAC3E,CAAC,GAAyB,CAAW,CAAC,GAEnC,IAAe,QACZ,EAAW,QAAQ,MAAQ,GAAa,SAAS,EAAI,EAAE,CAAC,GAC9D,CAAC,GAAY,CAAW,CAAC,GAEtB,KAAO,QAA8B;EACzC,IAAM,IAAgC,EAAqB,YAAY,CAAC,CAAC,uBAA4C,CAAC;GAAE,cAAc,EAAkB;GAAsB,iBAAiB,EAAqB;EAAQ,CAAC,CAAC,GACxN,IAA+B,EAAqB,YAAY,CAAC,CAAC,uBAA4C,CAAC;GAAE,cAAc,EAAkB;GAA0B,iBAAiB,EAAqB;EAAO,CAAC,CAAC,GAC1N,IAAoC,CAAC,CAAC,KAAW,EAAqB,YAAY,CAAC,CAAC,uBAA4C,CAAC;GAAE,cAAc,EAAkB;GAA0B,iBAAiB,EAAqB;EAAO,CAAC,CAAC,GAG5O,IAAsC;GAC1C,OAAO;IACL;KACE,UAAU;KACV,UAAU,CAAC,GAAa,UAAU,EAAe,SAAS;KAC1D,SAAS;KACT,OAAO,CAAC;IACV;IACA;KACE,gBAAgB,EAAgB,YAAY,CAAC,CAAC,KAAK,8BAA8B;MAC/E,SAAS;MACT;MACA,cAAc;KAChB,CAAC;KACD,UAAU;KACV,OAAO,CAAC;IACV;IACA;KACE,gBAAgB,EAAgB,YAAY,CAAC,CAAC,KAAK,8BAA8B;MAC/E,SAAS;MACT;MACA;KACF,CAAC;KACD,UAAU,CAAC,GAAa,UAAU;KAClC,OAAO,CAAC;IACV;IACA;KACE,gBAAgB,EAAgB,YAAY,CAAC,CAAC,KAAK,0CAA0C,EAC3F,oBACF,CAAC;KACD,UAAU,CAAC,GAAyB;KACpC,OAAO,CAAC;IACV;GACF;GACA,OAAO,CAAC;EACV;EA4DA,OA1DI,KACF,EAAsB,MAAM,KAC1B;GACE,gBAAgB,EAAgB,YAAY,CAAC,CAAC,KAAK,yBAAyB;IAC1E;IACA,MAAM;GACR,CAAC;GACD,UAAU,CAAC,GAAa;GACxB,OAAO,CAAC;EACV,CACF,GAGE,KACF,EAAsB,MAAM,KAC1B;GACE,gBAAgB,EAAgB,YAAY,CAAC,CAAC,KAAK,6BAA6B;IAC9E,gBAAgB;IAChB,MAAM;GACR,CAAC;GACD,UAAU,CAAC,GAAa;GACxB,OAAO,CAAC;EACV,CACF,GAGE,KACF,EAAsB,MAAM,KAC1B;GACE,gBAAgB,EAAgB,YAAY,CAAC,CAAC,KAAK,kCAAkC;IACnF;IACA,MAAM;GACR,CAAC;GACD,UAAU,CAAC,EAAgC;GAC3C,OAAO,CAAC;EACV,CACF,GAEE,EAAsB,MAAM,SAAS,MACvC,EAAsB,MAAM,EAAE,CAAC,UAAU,KAG3C,CAAA,GAAA,EAAA,QAAA,CAAK,EAAsB,KAAK,CAAC,CAAC,UAAU,IAE1C,EAAsB,MAAM,KAC1B;GACE,gBAAgB,EAAgB,YAAY,CAAC,CAAC,KAAK,iBAAiB,CAAY;GAChF,UAAU,CAAC,GAAa;GACxB,OAAO,CAAC;EACV,CACF,GAQK,CAJL,GACA,CAGK;CACT,GAAG;EAAC;EAAS;EAAG,GAAa;EAAQ;EAAoB,EAAe;EAAQ;EAAoC,GAAyB;EAAQ;EAAiB;EAAY;EAAkB;EAAc;CAA+B,CAAC;CAGlP,OAAO,kBAAC,GAAD,EAAkB,SAAO,CAAA;AAClC,GC/Ka,WAAoC;CAC/C,IAAM,IAAQ,EAAS,GACjB,IAAiB,EAAI,CAAqB,GAC1C,EAAE,SAAM,EAAe,GACvB,IAAe,EAAS,GAAgB,GAAY,MAAU,EAAM,cAA8B,EAAyB,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC,GACjJ,IAAa,EAAS,GAAgB,GAAY,MAAU,EAAM,UAAU,CAAC,GAE7E,IAAoB,QAAkB;EAM1C,aAL4B;GAE1B,AADA,MAAM,EAAW,MAAM,IAAI,GAC3B,EAAgB,YAAY,CAAC,CAAC,KAAK,uBAAuB;EAC5D,EAEA,CAAQ;CACV,GAAG,CAAC,CAAU,CAAC,GAET,IAAO,QACJ,CACL;EACE,UAAU;EACV,UAAU;EACV,OAAO,CAAC;EACR,UACE,kBAAC,IAAD,EACE,IAAI,EACF,OAAO,IAAe,KAAA,IAAY,EAAM,QAAQ,MAAM,KACxD,EACD,CAAA;CAEL,CACF,GACC;EAAC;EAAc;EAAmB;EAAG,EAAM,QAAQ,MAAM;CAAI,CAAC;CAEjE,OAAO,kBAAC,GAAD,EAAkB,QAAO,CAAA;AAClC,GCpCa,WAAgD;CAC3D,IAAM,EAAE,SAAM,EAAe,GACvB,IAAiB,EAAI,CAAqB,GAC1C,IAAa,EAAS,GAAgB,GAAY,MAAU,EAAM,UAAU,CAAC,GAC7E,IAAmB,EAAS,GAAgB,GAAY,MAAU,EAAM,gBAAgB,CAAC,GAEzF,IAAsB,QACnB,EAAe,SAAS,CAAC,CAAC,+BAA+B,CAAC,CAAC,QAAO,MAAK,EAAE,SAAS,CAAC,CAAC,KAAI,MAAK,EAAE,EAAE,GACvG,CAAC,CAAc,CAAC;CAEnB,QAAgB;EACd,IAAM,KAAuB,MAA0B;GACrD,IAAM,IAAiC,CACrC;IACE,UAAU,CAAC,GAAY;IACvB,OAAO;KACL;MACE,UAAU,YAAY,EAAmB,gBAAgB,GAAY,EAAoB,GAAG,GAAkB,CAAC;MAC/G,OAAO,CAAC;KACV;KACA;MACE,gBAAgB,EAAmB,cAAc,GAAY,EAAoB,GAAG,GAAkB,CAAC;MACvG,OAAO,CAAC;KACV;KACA;MACE,gBAAgB,EAAgB,YAAY,CAAC,CAAC,KAAK,8BAA8B,EAAE,OAAO,EAAW,CAAC;MACtG,OAAO,CAAC;KACV;KACA;MACE,gBAAgB;MAChB,UAAU;MACV,OAAO,CAAC;KACV;IACF;IACA,OAAO,CAAC;GACV,GACA;IACE,UAAU,EAAY,WAAW;IACjC,OAAO;KACL;MACE,UAAU,YAAY,EAAmB,gBAAgB,EAAc,gBAAgB,GAAY,CAAW,GAAG,EAAoB,GAAG,GAAkB,CAAC;MAC3J,OAAO,CAAC;KACV;KACA;MACE,gBAAgB,EAAmB,cAAc,EAAc,gBAAgB,GAAY,CAAW,GAAG,EAAoB,GAAG,GAAkB,CAAC;MACnJ,OAAO,CAAC;KACV;KACA;MACE,gBAAgB,EAAgB,YAAY,CAAC,CAAC,KAAK,8BAA8B,EAAE,OAAO,EAAW,QAAO,MAAK,EAAY,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;MAC9I,OAAO,CAAC;KACV;KACA;MACE,gBAAgB;MAChB,UAAU;MACV,OAAO,CAAC;KACV;IACF;IACA,OAAO,CAAC;GACV,CACF;GAEA,EAAgB,YAAY,CAAC,CAAC,KAAK,4BAA4B;IAC7D;IACA,MAAM,EAAyB;IAC/B,WAAW,CAAC;GACd,CAAC;EACH;EACA,EAAoB,EAAe,SAAS,CAAC,CAAC,WAAW;EACzD,IAAM,IAAc,EAAe,WAAW,GAAO,MAAc;GACjE,AAAI,KAAK,UAAU,EAAM,WAAW,MAAM,KAAK,UAAU,EAAU,WAAW,KAC5E,EAAoB,EAAM,WAAW;EAEzC,CAAC,GAEK,UAAmC;GACvC,EAAoB,EAAe,SAAS,CAAC,CAAC,WAAW;EAC3D,GACM,IAAkB,EAAgB,YAAY;EAEpD,OADA,EAAgB,iBAAiB,8BAA8B,CAA0B,SAC5E;GAOX,AANA,EAAgB,KAAK,4BAA4B;IAC/C,OAAO;IACP,MAAM,EAAyB;IAC/B,WAAW,CAAC;GACd,CAAC,GACD,EAAgB,oBAAoB,8BAA8B,CAA0B,GAC5F,EAAY;EACd;CACF,GAAG;EAAC;EAAkB;EAAgB;EAAqB;EAAY;CAAC,CAAC;AAC3E,GC7Ba,UAAuB;CAClC,IAAM,EAAE,eAAY,EAAI,CAAgB,GAClC,IAAmB,EAAI,CAAgB,GACvC,IAAe,GAAuB,IAAI,GAC1C,EAAE,SAAM,EAAe,GACvB,IAAQ,EAAS,GACjB,IAAyB,QAAc,IAAI,GAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,GACpE,IAAW,GAAiB,IAAI,GAEhC,IAAiB,EAAI,CAAqB,GAC1C,IAAmB,EAAS,IAAiB,MAAU,EAAM,gBAAgB,GAC7E,IAAa,EAAS,IAAiB,MAAU,EAAM,UAAU,GACjE,IAAc,EAAS,IAAiB,MAAU,EAAM,WAAW,GACnE,IAAiB,EAAS,IAAiB,MAAU,EAAM,gBAAgB,SAAS,EAAoB,QAAQ,EAAM,iBAAiB,IAAI,GAC3I,IAAmB,EAAS,IAAiB,MAAU,EAAM,gBAAgB,GAC7E,IAAgB,EAAS,IAAiB,MAAU,EAAM,aAAa,GACvE,IAAkB,EAAS,IAAiB,MAAU,EAAM,UAAU,GACtE,KAAgB,EAAS,IAAiB,MAAU,EAAM,aAAa;CAE7E,cACe;EACX,EAAiB,qBAAqB,KAAK,KAAA,CAAS;CACtD,GACC,CAAC,CAAgB,CAAC;CAErB,IAAM,IAAqB,GAAa,GAAgB,MAAuC;EAC7F,EAAgB,YAAY,CAAC,CAAC,KAAK,sBAAsB;GACvD;GACA,YAAY,EAAiB;GAC7B,YAAY;EACd,CAAC;CACH,GAAG,CAAC,EAAiB,EAAE,CAAC,GAElB,IAAoB,GAAa,MAAoB;EACzD,EAAgB,YAAY,CAAC,CAAC,KAAK,6BAA6B;GAC9D,gBAAgB;GAChB,MAAM,CAAC,CAAG;EACZ,CAAC;CACH,GAAG,CAAC,CAAO,CAAC,GAGN,KAAmB,GAAa,MAAoB;EACxD,EAAmB,EAAI,IAAI,EAA0B,IAAI;CAC3D,GAAG,CAAC,CAAkB,CAAC,GAEjB,KAAiB,GAAa,GAAgB,MAAkB;EACpE,IAAI,IAAgB,GAAO,SAAS;EACpC,EAAW,SAAQ,MAAO;GACxB,IAAM,IAAQ,EAAS,YAAY,EAAI,SAAS,GAAK,CAAgB,CAAC,CAAC;GACvE,AAAI,GAAO,SAAS,MAClB,IAAgB,EAAM;EAE1B,CAAC;EAED,IAAI,IAAW,CAAC,EAAM,QAAQ,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,IAAI,IAAgB;EACrE,AAAI,GAAgB,KAAK,OAAO,EAAI,OAClC,KAAsB,CAAC,EAAM,QAAQ,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE;EAG1D,IAAM,EAAE,qBAAkB,kDAA+C,EAAc,YAA0B,CAAC,CAAC,OAAO;EAC1H,OAAO,KAAK,IAAI,GAAkB,CAAQ,IAAI;CAChD,GAAG;EAAC;EAAkB;EAAY,GAAgB,KAAK;EAAI;CAAK,CAAC,GAE3D,KAA0B,GAAa,GAAwB,MAA6B;EAChG,EAAgB,YAAY,CAAC,CAAC,KAAK,4BAA4B;GAC7D;GACA;EACF,CAAC;CACH,GAAG,CAAC,CAAC,GAEC,KAAyB,GAAa,EAAE,OAAI,aAA8D;EAC9G,IAAM,IAAW,EAAS,YAAY,EAAI,SAAS,EAAiB,KAAK,IAAK,CAAgB;EAC9F,IAAI,EAAS,WACX,OAAO,EAAS;EAElB,IAAM,IAAyC;GAC7C,SAAS,CAAC,EAAI,EAAE;GAChB,OAAO,GAAgB,aAAa,EAAI;GACxC,YAAY,EAAiB,SAAS,EAAiB,KAAK,EAAG,CAAC,WAAW,CAAC;GAC5E;EACF,GAEM,IACJ,kBAAC,IAAD;GACE,OAAO;GACP,WAAW;GAEX,eAAe;IACb,GAAwB,EAAI,QAAQ,IAAK,EAAS,IAAI;GACxD;GACA,IAAI,EACF,QAAQ,UACV;GAEC,UAAA,EAAS;EACN,CAAA;EAWR,OATI,MAAO,GAAgB,KAAK,KAE5B,kBAAC,GAAD;GACE,MAAM;GAEL,UAAA;EACU,CAAA,IAGV;CACT,GAAG;EAAC;EAAkB;EAAyB,GAAgB;EAAc,GAAgB,KAAK;CAAE,CAAC,GAE/F,KAA6B,GAAa,GAAY,MAAoB;EAC9E,EAAgB,YAAY,CAAC,CAAC,KAAK,8BAA8B;GAC/D,OAAO,CAAC,CAAG;GACX,sBAAsB;EACxB,CAAC;CACH,GAAG,CAAC,CAAC,GAEC,KAA4B,GAAa,EAAE,OAAI,aAEjD,kBAAC,IAAD;EACE,OAAO;EACP,WAAW;EAEX,eAAe;GACb,GAA2B,GAAI,CAAG;EACpC;EACA,IAAI,EACF,QAAQ,UACV;EAEC,UAAA,EAAI,QAAQ;CACT,CAAA,GAEP,CAAC,EAA0B,CAAC,GAEzB,KAAwB,QAE1B,kBAAC,GAAD;EACE,eAAa;EACb,OAAA;EACA,OAAO,CAAC;EAER,UAAA,kBAAC,GAAD;GACE,UAAU;GACV,OAAO;IACL,OAAO,EAAM,QAAQ,QAAQ;IAC7B,QAAQ;IACR,YAAY,EAAM,QAAQ,GAAI;IAC9B,UAAU;IACV,OAAO;GACT;EACD,CAAA;CACM,CAAA,GAEV,CAAC,GAAG,CAAK,CAAC,GAEP,KAAsB,GAAa,EAAE,aAClC,kBAAC,IAAD,EAAkC,OAAM,CAAA,GAC9C,CAAC,CAAC,GAEC,KAAwB,QAE1B,kBAAC,GAAD;EACE,eAAa;EACb,OAAA;EACA,OAAO,CAAC;EAER,UAAA,kBAAC,IAAD;GACE,UAAU;GACV,OAAO;IACL,OAAO,EAAM,QAAQ,QAAQ;IAC7B,QAAQ;IACR,YAAY,EAAM,QAAQ,GAAI;IAC9B,UAAU;IACV,OAAO;GACT;EACD,CAAA;CACM,CAAA,GAEV,CAAC,GAAG,CAAK,CAAC,GAEP,KAAsB,GAAa,EAAE,aAClC,kBAAC,IAAD,EAAkC,OAAM,CAAA,GAC9C,CAAC,CAAC,GAEC,KAAoB,GAAa,EAAE,aAChB,EAAe,SAAS,CAAC,CAAC,wBAAwB,QAAkB,GAAK,MAAW,CAAC,GAAG,GAAK,GAAG,EAAO,cAAc,GAAG,CAAC,CAC5I,CAAA,CAAe,SAAS,EAAI,EAAE,IAE9B,kBAAC,GAAD;EACE,UAAU;EACV,OAAO;GACL,OAAO,EAAM,QAAQ,QAAQ;GAC7B,QAAQ;GACR,YAAY,EAAM,QAAQ,GAAI;GAC9B,UAAU;GACV,OAAO;EACT;CACD,CAAA,IAGE,MACN,CAAC,GAAgB,CAAK,CAAC,GAGpB,KAAsB,QAExB,kBAAC,GAAD;EACE,eAAa;EACb,OAAA;EACA,OAAO,CAAC;EAER,UAAA,kBAAC,GAAD;GACE,UAAU;GACV,OAAO;IACL,OAAO,EAAM,QAAQ,QAAQ;IAC7B,QAAQ;IACR,YAAY,EAAM,QAAQ,GAAI;IAC9B,UAAU;IACV,OAAO;GACT;EACD,CAAA;CACM,CAAA,GAEV,CAAC,GAAG,CAAK,CAAC,GAGP,KAAa,GAAa,EAAE,OAAI,aAA8D;EAClG,IAAM,IAAW,EAAS,YAAY,EAAI,SAAS,EAAiB,KAAK,IAAK,CAAgB,GACxF,IAAyC;GAC7C,SAAS,CAAC,EAAI,EAAE;GAChB,OAAO,GAAgB,aAAa,EAAI;GACxC,YAAY,EAAiB,SAAS,EAAiB,KAAK,EAAG,CAAC,WAAW,CAAC;GAC5E;EACF;EASA,OARI,MAAO,GAAgB,KAAK,KAE5B,kBAAC,GAAD,EACE,MAAM,EACP,CAAA,IAKH,kBAAA,IAAA,EAAA,UACG,EAAS,MACV,CAAA;CAEN,GAAG;EAAC;EAAkB,GAAgB;EAAc,GAAgB,KAAK;CAAE,CAAC,GAEtE,KAAyB,QACtB;EACL,EAAU,0BAA0B,EAClC,eAAe,MAA+D,EAAE,uCAAuC,EAAE,OAAO,EAAO,WAAW,EAAE,CAAC,EACvJ,CAAC;EACD,EAAU,uBAAuB;EACjC;GACE,QAAQ,EAAoB;GAC5B,IAAI;GACJ,oBAAoB;GACpB,YAAY;GACZ,cAAc;GACd,WAAW;GACX,MAAM;GACN,SAAS;EACX;EACA;GACE,QAAQ,EAAoB;GAC5B,IAAI;GACJ,oBAAoB;GACpB,YAAY;GACZ,cAAc;GACd,WAAW;GACX,MAAM;GACN,SAAS;EACX;EACA;GACE,QAAQ,EAAoB;GAC5B,sBAAsB,CAAC;GACvB,IAAI;GACJ,oBAAoB;GACpB,YAAY;GACZ,cAAc;GACd,WAAW;GACX,MAAM;GACN,SAAS;EACX;CACF,GACC;EAAC;EAAqB;EAAuB;EAAqB;EAAuB;EAAG;EAAmB;CAAmB,CAAC,GAEhI,KAA0B,QACvB,CACL,EAAU,oBAAoB;EAC5B,eAAe;EACf,aAAa,MA2DJ;GAxDH,kBAAC,GAAD;IAGE,eAAe,EAAmB,EAAO,IAAI,IAAI,EAA0B,IAAI;IAHjF,UAAA,CAKE,kBAAC,GAAD,EAAA,UACE,kBAAC,IAAD,CAAuB,CAAA,EACX,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,mBACU,CAAA,CACN;GAVH,GAAA,iBAUG;GAGV,kBAAC,GAAD;IAGE,eAAe,EAAmB,EAAO,IAAI,IAAI,EAA0B,IAAI;IAHjF,UAAA,CAKE,kBAAC,GAAD,EAAA,UACE,kBAAC,IAAD,CAAW,CAAA,EACC,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,mBACU,CAAA,CACN;GAVH,GAAA,iBAUG;GAGV,kBAAC,GAAD;IAGE,eAAe,EAAmB,EAAO,IAAI,IAAI,EAA0B,OAAO;IAHpF,UAAA,CAKE,kBAAC,GAAD,EAAA,UACE,kBAAC,IAAD,CAAY,CAAA,EACA,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,QACU,CAAA,CACN;GAVH,GAAA,OAUG;GAGV,kBAAC,GAAD;IAGE,eAAe,EAAkB,EAAO,GAAG;IAH7C,UAAA,CAKE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,CAAiB,CAAA,EACL,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,eACU,CAAA,CACN;GAVH,GAAA,YAUG;EAGP;EAET;CACF,CAAC,CACH,GACC;EAAC;EAAmB;EAAoB;CAAC,CAAC,GAGvC,KAA4B,QAAc;EAC9C,IAAM,IAAwC,CAAC;EAe/C,OAdK,KAGL,EAAiB,gBAAgB,SAAS,MAAU;GAClD,IAAM,IAAM,EAAiB,KAAK;GAClC,EAAM,KAAS,EAAmB,kBAAkB;IAClD;IACA;IACA,MAAM,EAAoB;IAC1B;IACA,mBAAmB;GACrB,CAAC;EACH,CAAC,GAXQ;CAcX,GAAG;EAAC;EAAkB;EAAa;CAAU,CAAC,GAExC,KAAkB,GAAa,MACN,GAA0B,EAAO,OAAO,GAC9D,EAAsB,aAAa,EAAO,IAAI,KACpD,CAAC,EAAyB,CAAC,GAExB,IAAkB,GAAa,MAA4F;EAC/H,IAAM,IAAW,EAAS,YAAY,EAAO,IAAI,SAAS,EAAiB,KAAK,EAAO,OAAO,KAAK,CAAgB;EACnH,OAAO,EAAS,YAAY,KAAA,IAAY,EAAS;CACnD,GAAG,CAAC,CAAgB,CAAC,GAEf,KAAe,QAAiE;EACpF,IAAM,EAAE,8BAA2B,EAAc,YAA0B,CAAC,CAAC,OAAO,KAE9E,IAA0B,EAAa,wBAAwB,CAAgB,GAC/E,IAA0E,CAAC;EAuDjF,OApDA,EAAiB,gBAAgB,KAAI,MAAK,EAAiB,KAAK,EAAE,CAAC,CAAC,SAAS,MAAQ;GACnF,EAAiB,uBAAuB,EAAI,GAAG,CAAC,KAAI,MAAM,EAAiB,KAAK,EAAG,CAAC,CAAC,SAAQ,MAAO;IAClG,IAAM,IAAS,EAAiB,SAAS,EAAI,aACvC,IAA+F;KACnG;KACA;KACA,eAAe;KACf,YAAY,EAAI;KAChB,sBAAsB,EAAO;KAC7B,IAAI,EAAI;KACR,oBAAoB,EAAwB,SAAS,EAAI,EAAE;IAC7D;IACA,IAAI,EAAO,aAAa,EAAc,kBACpC,EAAqB,KAAK;KACxB,GAAG;KACH,kBAAkB,OACF,EAAc,EAAI,GAAG,EAAE,UAAU,EAAO,IAAI,MAAM,GAAG,EAAc,EAAI,GAAG,CAAC,cAAc,GAAG,EAAc,EAAI,GAAG,CAAC,UAAU,EAAO,IAAI,QAAQ,KAAA,MAC7I,KAAA;KAElB,oBAAoB,EAAE,oBAA8H,GAAe,MAAkB;MACnL,IAAM,IAAY,GAAW,uBAAuB,EAAc,EAAI,GAAG,EAAE,YAAY,EAAE,KAAK,EAAc,EAAI,GAAG,EAAE,YAAY,EAAE,GAAG;MACtI,OAAO,MAAc,QAAQ,IAAY,CAAC;KAC5C;KACA,MAAM;KACN,cAAc,OACE,EAAc,EAAI,GAAG,EAAE,UAAU,EAAO,IAAI,MAAM,GAAG,EAAc,EAAI,GAAG,CAAC,cAAc,GAAG,EAAc,EAAI,GAAG,CAAC,UAAU,EAAO,IAAI,QAAQ,KAAA,MAC7I;KAElB,SAAS;IACX,CAAoD;SAC/C;KACL,IAAI;KASJ,AARA,AAKE,IALE,EAAO,aAAa,EAAc,eACrB,KACN,EAAO,aAAa,EAAc,mBAC5B,KAEA,IAGjB,EAAqB,KAAK;MACxB,GAAG;MACH,mBAAmB,EAAgB;MACnC,YAAY;MACZ,WAAY;OAAC,EAAc;OAAW,EAAc;OAAW,EAAc;OAAW,EAAc;OAAW,EAAc;OAAW,EAAc;OAAW,EAAc;OAAW,EAAc;MAAS,CAAC,CAAqB,SAAS,EAAO,QAAQ,IAAI,UAAU;MAC/Q,MAAM;MACN,SAAS,GAAe,GAAK,EAAI,KAAK;KACxC,CAAoD;IACtD;GACF,CAAC;EACH,CAAC,GAEM;GACL,GAAG;GACH,GAAG;GACH,GAAG;EACL;CACF,GAAG;EAAC;EAAkB;EAAwB;EAAyB;EAAiB;EAAiB;EAAe;EAAgB;EAAwB;EAA2B;CAAU,CAAC,GAEhM,KAAkB,GAAa,MAAoB;EACvD,EAAiB,UAAU;GACzB,SAAS,CAAC,EAAI,EAAE;GAChB,QAAQ,EAAyB;EACnC,CAAC;CACH,GAAG,CAAC,CAAgB,CAAC,GAGf,KAAkB,QAAkB;EACxC,EAAiB,UAAU;GACzB,SAAS,CAAC;GACV,QAAQ,EAAyB;EACnC,CAAC;CACH,GAAG,CAAC,CAAgB,CAAC;CA4BrB,AA1BA,QAAgB;EACd,EAAgB,EAAY;CAC9B,GAAG,CAAC,GAAiB,EAAY,CAAC,GAElC,QAAgB;EACd,IAAM,IAAc,EAAiB,iBAAiB,WAAW,MAAiB;GAC5E,OAAc,WAAW,EAAyB,WAGtD;QAAI,EAAa,gBAAgB;KAC/B,IAAM,IAAyB,EAAa,QAAQ,IAC9C,IAAQ,EAAW,WAAU,MAAO,EAAI,OAAO,CAAsB;KAC3E,AAAI,MAAU,MACZ,EAAS,SAAS,cAAc,SAAa;MAC3C,EAAuB,KAAK,EAAa,OAAO;KAClD,CAAC;IAEL,OACE,EAAuB,KAAK,EAAa,OAAO;GAAA;EAEpD,CAAC;EACD,aAAa;GACX,EAAY;EACd;CACF,GAAG;EAAC;EAAkB;EAAwB;CAAU,CAAC,GAEzD,GAAwC;CAExC,IAAM,KAA8B,GAAsB,MAAkB;EAC1E,EAAqC,EAAyB,WAAW,EACvE,sBAAsB,EACxB,CAAC;CACH,GAAG,GAAG,GAEA,KAAgC,GAAa,MAAkB;EACnE,GAA4B,CAAK;CACnC,GAAG,CAAC,EAA2B,CAAC,GAE1B,IAA0B,EAAqB,OAAO,MAAqB;EAE/E,AADA,MAAM,EAA8B,YAAY,CAAC,CAAC,UAAU,EAAW,MAAM,EAAM,YAAY,KAAK,IAAI,EAAM,WAAW,GAAG,EAAW,MAAM,CAAC,CAAC,CAAC,KAAI,MAAO,EAAI,EAAE,CAAC,GAClK,MAAM,EAAyB,YAAY,CAAC,CAAC,UAAU,EAAW,MAAM,EAAM,YAAY,KAAK,IAAI,EAAM,WAAW,GAAG,EAAW,MAAM,CAAC,CAAC,CAAC,KAAI,MAAO,EAAI,EAAE,GAAG,EAAiB,EAAE;CACpL,GAAG,EAAc,YAA0B,CAAC,CAAC,OAAO,SAAS,0CAA0C;EACrG,SAAS;EACT,UAAU;CACZ,CAAC,GAEK,KAAiB,GAAa,MAAqB;EAEvD,AADA,EAAiB,qBAAqB,KAAK,CAAK,GAChD,EAA6B,CAAK;CACpC,GAAG,CAAC,GAAkB,CAAuB,CAAC;CAE9C,cACe;EAEX,AADA,EAA8B,YAAY,CAAC,CAAC,gBAAgB,GAC5D,EAAyB,YAAY,CAAC,CAAC,gBAAgB;CACzD,GACC,CAAC,CAAC;CAEL,IAAM,KAAiC,GAAa,MAAqB;EACnE,MAAM,CAAQ,KAGlB,EAAiB,oBAAoB,KAAK;GACxC,QAAQ,EAAa;GACrB;EACF,CAAC;CACH,GAAG,CAAC,CAAgB,CAAC;CAErB,QAAgB;EACd,IAAM,IAAc,EAAiB,oBAAoB,WAAW,MAAS;GACvE,EAAK,WAAW,EAAa,WAGjC,EAAS,QAAQ,0BAA0B,EAAK,QAAQ;EAC1D,CAAC;EAED,aAAa;GACX,EAAY;EACd;CACF,GAAG,CAAC,CAAgB,CAAC;CAErB,IAAM,KAAa,GAAa,MACvB,EAAI,IACV,CAAC,CAAC;CAEL,OACE,kBAAC,GAAD;EACE,WAAW;EACX,aAAa,kBAAC,IAAD,EAAoC,WAAU,CAAA;EAC3D,eAAe,kBAAC,IAAD,CAA8B,CAAA;EAC7C,OAAO,kBAAC,IAAD,CAAsB,CAAA;EAC7B,YAAY,EAAyB;EAErC,UAAA,kBAAC,GAAD;GACE,KAAK;GACL,IAAI;IACF,QAAQ;IACR,OAAO;GACT;GAEA,UAAA,kBAAC,IAAD;IACE,MAAM,EAAM,4BAA4B,CAAC,SAAS;IAClD,yBAAA;IACY;IACZ,yBAAyB,EAAe,SAAS,CAAC,CAAC,cAAkC,EAAyB,SAAS,CAAC,EAAE;IAC1G;IAChB,sBAAsB;IACL;IACA;IACe;IAChC,0BAA0B;IAC1B,KAAK;IACL,WAAW;IACa;GACzB,CAAA;EACE,CAAA;CACU,CAAA;AAErB"}
|