@gen-epix/ui-client-casedb 4.3.0 → 4.3.2

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.
Files changed (170) hide show
  1. package/dist/_chunks/Dashboard.js +613 -666
  2. package/dist/_chunks/Dashboard.js.map +1 -1
  3. package/dist/_chunks/LegendaItem.js.map +1 -1
  4. package/dist/_chunks/UploadUtil.js +4 -6
  5. package/dist/_chunks/UploadUtil.js.map +1 -1
  6. package/dist/_chunks/_baseClone.js +1 -1
  7. package/dist/_chunks/_baseClone.js.map +1 -1
  8. package/dist/_chunks/cloneDeep.js +1 -1
  9. package/dist/_chunks/cloneDeep.js.map +1 -1
  10. package/dist/_chunks/esm.js +93 -101
  11. package/dist/_chunks/esm.js.map +1 -1
  12. package/dist/_chunks/react.js +1 -1
  13. package/dist/_chunks/react.js.map +1 -1
  14. package/dist/_chunks/shallow.js +2 -2
  15. package/dist/_chunks/shallow.js.map +1 -1
  16. package/dist/_chunks/sync.js +4 -4
  17. package/dist/_chunks/sync.js.map +1 -1
  18. package/dist/_chunks/vanilla.js +1 -1
  19. package/dist/_chunks/vanilla.js.map +1 -1
  20. package/dist/_chunks/yup.js +2 -2
  21. package/dist/_chunks/yup.js.map +1 -1
  22. package/dist/components/app/CaseDbApp/CaseDbApp.d.ts +1 -1
  23. package/dist/components/ui/AddCasesToEventDialog/AddCasesToEventDialogSuccessNotificationMessage.d.ts +1 -1
  24. package/dist/components/ui/CaseContentForm/CaseContentForm.d.ts +1 -1
  25. package/dist/components/ui/CaseInfoDialog/CaseCaseSetInfo.d.ts +1 -1
  26. package/dist/components/ui/CaseInfoDialog/CaseContent.d.ts +1 -1
  27. package/dist/components/ui/CaseInfoDialog/CaseInfoForm.d.ts +1 -1
  28. package/dist/components/ui/CaseInfoDialog/CaseSharingForm.d.ts +1 -1
  29. package/dist/components/ui/CaseInfoDialog/CaseSharingInfo.d.ts +1 -1
  30. package/dist/components/ui/CaseInfoDialog/ReadOnlyCaseContent.d.ts +1 -1
  31. package/dist/components/ui/CaseSetInfoDialog/CaseSetContent.d.ts +1 -1
  32. package/dist/components/ui/CaseSetInfoDialog/CaseSetDescription.d.ts +1 -1
  33. package/dist/components/ui/CaseSetInfoDialog/CaseSetForm.d.ts +1 -1
  34. package/dist/components/ui/CaseSetInfoDialog/CaseSetSharingForm.d.ts +1 -1
  35. package/dist/components/ui/CaseSetInfoDialog/CaseSetSharingInfo.d.ts +1 -1
  36. package/dist/components/ui/CaseSummary/CaseSummary.d.ts +1 -1
  37. package/dist/components/ui/CaseTypeInfoDialog/CaseTypeInfoAccessRights.d.ts +1 -1
  38. package/dist/components/ui/CaseTypeInfoDialog/CaseTypeInfoColAccessRights.d.ts +1 -1
  39. package/dist/components/ui/CaseTypeInfoDialog/CaseTypeInfoData.d.ts +1 -1
  40. package/dist/components/ui/CaseTypeInfoDialog/CaseTypeInfoDialogContent.d.ts +1 -1
  41. package/dist/components/ui/CaseTypeInfoDialog/CaseTypeInfoRegions.d.ts +1 -1
  42. package/dist/components/ui/CaseTypeInfoDialog/CaseTypeInfoTrees.d.ts +1 -1
  43. package/dist/components/ui/CaseTypeInfoDialog/CaseTypeInfoValues.d.ts +1 -1
  44. package/dist/components/ui/CaseTypeInfoDialog/CaseTypeInfoVariableDetails.d.ts +1 -1
  45. package/dist/components/ui/CasesAlreadyInCaseSetWarning/CasesAlreadyInCaseSetWarning.d.ts +1 -1
  46. package/dist/components/ui/CasesAlreadyInCaseSetWarning/CasesAlreadyInCaseSetWarningCaseSetLink.d.ts +1 -1
  47. package/dist/components/ui/CompletCaseTypeLoader/CompletCaseTypeLoader.d.ts +1 -1
  48. package/dist/components/ui/ContextMenu/ContextMenu.d.ts +1 -1
  49. package/dist/components/ui/ContextMenu/index.js +1 -1
  50. package/dist/components/ui/ContextMenu/index.js.map +1 -1
  51. package/dist/components/ui/CreateEventDialog/CreateEventDialogSuccessNotificationMessage.d.ts +1 -1
  52. package/dist/components/ui/CreateEventDialog/index.js +1 -1
  53. package/dist/components/ui/CreateEventDialog/index.js.map +1 -1
  54. package/dist/components/ui/CustomTabPanel/CustomTabPanel.d.ts +1 -1
  55. package/dist/components/ui/Dashboard/DashboardContent.d.ts +1 -1
  56. package/dist/components/ui/Dashboard/DashboardDownloadSidebarItem.d.ts +1 -1
  57. package/dist/components/ui/Dashboard/DashboardGeneralSettingsForm.d.ts +1 -1
  58. package/dist/components/ui/Dashboard/DashboardLayoutRenderer.d.ts +1 -1
  59. package/dist/components/ui/Dashboard/DashboardLayoutSettingsForm.d.ts +1 -1
  60. package/dist/components/ui/Dashboard/DashboardSearch.d.ts +1 -1
  61. package/dist/components/ui/Dashboard/DashboardSearchSettings.d.ts +1 -1
  62. package/dist/components/ui/Dashboard/DashboardSettingsSidebarItem.d.ts +1 -1
  63. package/dist/components/ui/Dashboard/DashboardWidget.d.ts +1 -1
  64. package/dist/components/ui/Dashboard/DashboardWidgetPlaceHolder.d.ts +1 -1
  65. package/dist/components/ui/Dashboard/DashboardWidgetSettingsForm.d.ts +1 -1
  66. package/dist/components/ui/Dashboard/context/DashboardContextProvider.d.ts +1 -1
  67. package/dist/components/ui/DashboardEditCases/DashboardEditCases.d.ts +1 -1
  68. package/dist/components/ui/DashboardStoreLoader/DashboardStoreLoader.d.ts +1 -1
  69. package/dist/components/ui/DashboardStoreLoader/DashboardStoreLoaderContent.d.ts +1 -1
  70. package/dist/components/ui/DataCollectionAccessInfo/DataCollectionAccessInfo.d.ts +1 -1
  71. package/dist/components/ui/EpiCurveWidget/EpiCurveBarChart.d.ts +1 -1
  72. package/dist/components/ui/EpiCurveWidget/EpiCurveStackedAreaChart.d.ts +1 -1
  73. package/dist/components/ui/EpiCurveWidget/EpiCurveWidget.d.ts +1 -1
  74. package/dist/components/ui/Grouping/Grouping.d.ts +1 -1
  75. package/dist/components/ui/HistogramWidget/HistogramWidget.d.ts +1 -1
  76. package/dist/components/ui/HistogramWidget/index.js +1 -1
  77. package/dist/components/ui/HistogramWidget/index.js.map +1 -1
  78. package/dist/components/ui/HomePageTrends/HomePageTrendCard.d.ts +1 -1
  79. package/dist/components/ui/HomePageTrends/HomePageTrends.d.ts +1 -1
  80. package/dist/components/ui/LegendaItem/LegendaItem.d.ts +1 -1
  81. package/dist/components/ui/LineListWidget/LineListWidget.d.ts +1 -1
  82. package/dist/components/ui/LineListWidget/LineListWidgetIsInEventCell.d.ts +1 -1
  83. package/dist/components/ui/LineListWidget/LineListWidgetIsOwnCaseCell.d.ts +1 -1
  84. package/dist/components/ui/LineListWidget/LineListWidgetPrimaryMenu.d.ts +1 -1
  85. package/dist/components/ui/LineListWidget/LineListWidgetSecondaryMenu.d.ts +1 -1
  86. package/dist/components/ui/LineListWidget/LineListWidgetTitle.d.ts +1 -1
  87. package/dist/components/ui/MapWidget/MapWidget.d.ts +1 -1
  88. package/dist/components/ui/PanelSeparator/PanelSeparatorHorizontal.d.ts +1 -1
  89. package/dist/components/ui/PanelSeparator/PanelSeparatorVertical.d.ts +1 -1
  90. package/dist/components/ui/PanelSeparator/index.js +50 -2
  91. package/dist/components/ui/PanelSeparator/index.js.map +1 -0
  92. package/dist/components/ui/TreeDescription/TreeDescription.d.ts +1 -1
  93. package/dist/components/ui/TreeWidget/TreeWidget.d.ts +1 -1
  94. package/dist/components/ui/Upload/Upload.d.ts +1 -1
  95. package/dist/components/ui/Upload/UploadCaseResultTable.d.ts +1 -1
  96. package/dist/components/ui/Upload/UploadCreateCases.d.ts +1 -1
  97. package/dist/components/ui/Upload/UploadMapColumns.d.ts +1 -1
  98. package/dist/components/ui/Upload/UploadMapSequences.d.ts +1 -1
  99. package/dist/components/ui/Upload/UploadNavigation.d.ts +1 -1
  100. package/dist/components/ui/Upload/UploadPreviewNavigation.d.ts +1 -1
  101. package/dist/components/ui/Upload/UploadSelectFile.d.ts +1 -1
  102. package/dist/components/ui/Upload/UploadSelectSequenceFiles.d.ts +1 -1
  103. package/dist/components/ui/UserRightsDialog/UserRightsDialogCaseAccessPolicy.d.ts +1 -1
  104. package/dist/components/ui/Warning/Warning.d.ts +1 -1
  105. package/dist/components/ui/WidgetHeaderIconButton/WidgetHeaderIconButton.d.ts +1 -1
  106. package/dist/components/ui/WidgetMenu/WidgetMenu.d.ts +1 -1
  107. package/dist/components/ui/WidgetUnavailable/WidgetUnavailable.d.ts +1 -1
  108. package/dist/context/caseAbac/CaseAbacContextProvider.d.ts +1 -1
  109. package/dist/context/caseTypeAbac/CaseTypeAbacContextProvider.d.ts +1 -1
  110. package/dist/pages/CaseDbUsersAdminPage/CaseDbUsersAdminPage.d.ts +1 -1
  111. package/dist/pages/CaseSetCategoryAdminPage/CaseSetCategoryAdminPage.d.ts +1 -1
  112. package/dist/pages/CaseSetStatusAdminPage/CaseSetStatusAdminPage.d.ts +1 -1
  113. package/dist/pages/CaseTypeSetCategoriesAdminPage/CaseTypeSetCategoriesAdminPage.d.ts +1 -1
  114. package/dist/pages/CaseTypeSetsAdminPage/CaseTypeSetsAdminPage.d.ts +1 -1
  115. package/dist/pages/CaseTypesAdminPage/CaseTypesAdminPage.d.ts +1 -1
  116. package/dist/pages/CasesDetailPage/CasesDetailPage.d.ts +1 -1
  117. package/dist/pages/CasesDetailPage/index.js +16 -16
  118. package/dist/pages/CasesPage/CasesPage.d.ts +1 -1
  119. package/dist/pages/ColSetsAdminPage/ColSetsAdminPage.d.ts +1 -1
  120. package/dist/pages/ColsAdminPage/ColsAdminPage.d.ts +1 -1
  121. package/dist/pages/ColsAdminPage/index.js +77 -77
  122. package/dist/pages/ColsAdminPage/index.js.map +1 -1
  123. package/dist/pages/ConceptRelationsAdminPage/ConceptRelationsAdminPage.d.ts +1 -1
  124. package/dist/pages/ConceptSetsAdminPage/ConceptSetsAdminPage.d.ts +1 -1
  125. package/dist/pages/ConceptsAdminPage/ConceptsAdminPage.d.ts +1 -1
  126. package/dist/pages/ConceptsAdminPage/index.js +31 -31
  127. package/dist/pages/DataCollectionSetsAdminPage/DataCollectionSetsAdminPage.d.ts +1 -1
  128. package/dist/pages/DataCollectionVisualizationPage/DataCollectionVisualizationPage.d.ts +1 -1
  129. package/dist/pages/DataCollectionVisualizationPage/index.js +1 -1
  130. package/dist/pages/DataCollectionVisualizationPage/index.js.map +1 -1
  131. package/dist/pages/DataCollectionsAdminPage/DataCollectionsAdminPage.d.ts +1 -1
  132. package/dist/pages/DimsAdminPage/DimsAdminPage.d.ts +1 -1
  133. package/dist/pages/DimsAdminPage/index.js +46 -46
  134. package/dist/pages/DiseasesAdminPage/DiseasesAdminPage.d.ts +1 -1
  135. package/dist/pages/EtiologicalAgentsAdminPage/EtiologicalAgentsAdminPage.d.ts +1 -1
  136. package/dist/pages/EtiologiesAdminPage/EtiologiesAdminPage.d.ts +1 -1
  137. package/dist/pages/EventsDetailPage/EventsDetailPage.d.ts +1 -1
  138. package/dist/pages/EventsDetailPage/index.js +18 -18
  139. package/dist/pages/EventsPage/EventsPage.d.ts +1 -1
  140. package/dist/pages/HomePage/HomePage.d.ts +1 -1
  141. package/dist/pages/OrganizationAccessCasePoliciesAdminPage/OrganizationAccessCasePoliciesAdminPage.d.ts +1 -1
  142. package/dist/pages/OrganizationShareCasePoliciesAdminPage/OrganizationShareCasePoliciesAdminPage.d.ts +1 -1
  143. package/dist/pages/RefColsAdminPage/RefColsAdminPage.d.ts +1 -1
  144. package/dist/pages/RefColsAdminPage/index.js +94 -94
  145. package/dist/pages/RefDimsAdminPage/RefDimsAdminPage.d.ts +1 -1
  146. package/dist/pages/RegionRelationsAdminPage/RegionRelationsAdminPage.d.ts +1 -1
  147. package/dist/pages/RegionSetShapesAdminPage/RegionSetShapesAdminPage.d.ts +1 -1
  148. package/dist/pages/RegionSetShapesAdminPage/index.js +26 -26
  149. package/dist/pages/RegionSetsAdminPage/RegionSetsAdminPage.d.ts +1 -1
  150. package/dist/pages/RegionsAdminPage/RegionsAdminPage.d.ts +1 -1
  151. package/dist/pages/RegionsAdminPage/index.js +33 -33
  152. package/dist/pages/TrendsPage/TrendsPage.d.ts +1 -1
  153. package/dist/pages/UploadPage/UploadPage.d.ts +1 -1
  154. package/dist/pages/UserAccessCasePoliciesAdminPage/UserAccessCasePoliciesAdminPage.d.ts +1 -1
  155. package/dist/pages/UserEffectiveRightsAdminPage/UserEffectiveRightsAdminPage.d.ts +1 -1
  156. package/dist/pages/UserEffectiveRightsAdminPage/index.js +56 -56
  157. package/dist/pages/UserEffectiveRightsAdminPage/index.js.map +1 -1
  158. package/dist/pages/UserEffectiveRightsTesterAdminPage/UserEffectiveRightsTesterAdminPage.d.ts +1 -1
  159. package/dist/pages/UserEffectiveRightsTesterAdminPage/index.js +45 -45
  160. package/dist/pages/UserEffectiveRightsTesterAdminPage/index.js.map +1 -1
  161. package/dist/pages/UserShareCasePoliciesAdminPage/UserShareCasePoliciesAdminPage.d.ts +1 -1
  162. package/dist/utils/CaseDbStandardConfigUtil/index.js +1 -5
  163. package/dist/utils/CaseDbStandardConfigUtil/index.js.map +1 -1
  164. package/dist/utils/MapUtil/index.js +1 -1
  165. package/dist/utils/MapUtil/index.js.map +1 -1
  166. package/package.json +33 -28
  167. package/dist/_chunks/PanelSeparator.js +0 -1666
  168. package/dist/_chunks/PanelSeparator.js.map +0 -1
  169. package/dist/_chunks/chunk-OB3PAWPO.js +0 -1162
  170. package/dist/_chunks/chunk-OB3PAWPO.js.map +0 -1
@@ -150,7 +150,7 @@ var s = /* @__PURE__ */ t(((e, t) => {
150
150
  ];
151
151
  }
152
152
  static expandBoundsFromCoordinates(t, n) {
153
- if (!(!Array.isArray(n) || !n.length)) {
153
+ if (Array.isArray(n) && n.length) {
154
154
  if (typeof n[0] == "number" && typeof n[1] == "number") {
155
155
  let [e, r] = n;
156
156
  if (!Number.isFinite(e) || !Number.isFinite(r)) return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/_baseExtremum.js","../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/_baseGt.js","../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/max.js","../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/_baseLt.js","../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/min.js","../../../src/utils/MapUtil/MapUtil.ts"],"sourcesContent":["var isSymbol = require('./isSymbol');\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseExtremum;\n","/**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\nmodule.exports = baseGt;\n","var baseExtremum = require('./_baseExtremum'),\n baseGt = require('./_baseGt'),\n identity = require('./identity');\n\n/**\n * Computes the maximum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\nfunction max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n}\n\nmodule.exports = max;\n","/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nmodule.exports = baseLt;\n","var baseExtremum = require('./_baseExtremum'),\n baseLt = require('./_baseLt'),\n identity = require('./identity');\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nmodule.exports = min;\n","import max from 'lodash/max';\nimport min from 'lodash/min';\nimport round from 'lodash/round';\nimport type { PieSeriesOption } from 'echarts';\nimport type {\n CaseDbCase,\n CaseDbCol,\n CaseDbRegion,\n} from '@gen-epix/api-casedb';\nimport { ConfigService } from '@gen-epix/ui-client-common/classes/services/ConfigService';\nimport type { UnwrapArray } from '@gen-epix/ui-core/models/generic';\n\nimport type { CaseDbConfig } from '../../models/config';\nimport type { Stratification } from '../../models/stratification';\nimport { DashboardUtil } from '../DashboardUtil';\n\n\nexport type GenEpixPieSeriesOptionEventData = {\n genEpixData?: {\n caseIds: string[];\n regionId: string;\n };\n};\n\nexport type RegionStatistics = {\n maxNumCases: number;\n minNumCases: number;\n numCases: number;\n statisticsPerRegion: Record<string, { numCases: number; region: CaseDbRegion; rows: CaseDbCase[] }>;\n};\n\ntype GenEpixPieSeriesOptionData = Array<GenEpixPieSeriesOptionEventData & UnwrapArray<PieSeriesOption['data']>>;\n\ntype GeoJsonBounds = [number, number, number, number];\ntype GeoJsonFeature = {\n bbox?: number[];\n geometry?: GeoJsonGeometry | null;\n};\ntype GeoJsonGeometry = {\n bbox?: number[];\n coordinates?: unknown;\n geometries?: GeoJsonGeometry[];\n};\ntype GeoJsonObject = {\n bbox?: number[];\n coordinates?: unknown;\n features?: GeoJsonFeature[];\n geometries?: GeoJsonGeometry[];\n geometry?: GeoJsonGeometry | null;\n};\n\nexport class MapUtil {\n public static getGeoJsonAspectScale(geoJson: string) {\n const bounds = MapUtil.getGeoJsonBounds(geoJson);\n if (!bounds) {\n return 1;\n }\n\n const centerLatitude = (bounds[1] + bounds[3]) / 2;\n if (!Number.isFinite(centerLatitude) || Math.abs(centerLatitude) > 90) {\n return 1;\n }\n\n const aspectScale = Math.cos(centerLatitude * Math.PI / 180);\n return Number.isFinite(aspectScale) && aspectScale > 0 ? aspectScale : 1;\n }\n\n public static getMapSeries(\n col: CaseDbCol | null,\n regions: CaseDbRegion[],\n sortedData: CaseDbCase[],\n stratification: null | Stratification,\n getPieChartRadius: (numCases: number) => number,\n ): { mapCaseCount: number; series: PieSeriesOption[] } {\n if (!col || !regions) {\n return {\n mapCaseCount: undefined,\n series: [],\n };\n }\n\n const pieSeriesOptions: PieSeriesOption[] = [];\n\n const { numCases: totalNumCases, statisticsPerRegion } = MapUtil.getRegionStatistics(sortedData, col.id, regions);\n\n const pieChartOptionsBase: Partial<PieSeriesOption> = {\n animation: false,\n coordinateSystem: 'geo',\n label: {\n show: false,\n silent: true,\n },\n labelLine: {\n show: true,\n smooth: true,\n },\n type: 'pie',\n };\n\n Object.entries(statisticsPerRegion).forEach(([regionId, regionData]) => {\n const data: GenEpixPieSeriesOptionData = [];\n\n if (!stratification) {\n const caseIds = regionData.rows.map(row => row.id);\n if (caseIds.length === 0) {\n return;\n }\n data.push({\n emphasis: {\n focus: 'self',\n },\n genEpixData: {\n caseIds,\n regionId,\n },\n label: {\n formatter: () => regionData.region.name,\n },\n name: 'num-cases',\n value: regionData.numCases,\n });\n } else {\n stratification.legendaItems.forEach(legendaItem => {\n const rows = regionData.rows.filter(row => legendaItem.caseIds.includes(row.id));\n const caseIds = rows.map(row => row.id);\n const numCases = DashboardUtil.getCaseCount(rows);\n data.push({\n emphasis: {\n focus: 'self',\n },\n genEpixData: {\n caseIds,\n regionId,\n },\n label: {\n formatter: () => regionData.region.name,\n },\n name: legendaItem.rowValue.full,\n value: numCases,\n });\n });\n }\n\n pieSeriesOptions.push({\n ...pieChartOptionsBase,\n center: [regionData.region.center_lon, regionData.region.center_lat],\n data,\n radius: getPieChartRadius(regionData.numCases),\n tooltip: {\n formatter: (callbackParams) => {\n const d = (callbackParams as { data: { name: string; value: number } }).data;\n if (stratification) {\n return `${regionData.region.name} - ${d.name} (n=${d.value}, ${Math.round(d.value / regionData.numCases * 100)}%)`;\n }\n return `${regionData.region.name} (n=${regionData.numCases}, ${Math.round(regionData.numCases / totalNumCases * 100)}%)`;\n },\n },\n });\n });\n\n return {\n mapCaseCount: totalNumCases,\n series: pieSeriesOptions,\n };\n }\n\n public static getMaxPieChartArea(width: number, height: number, numZones: number): number {\n if (!width || !height || !numZones) {\n return 0;\n }\n const smallestDimension = Math.min(width, height);\n const mapArea = smallestDimension ** 2;\n const zoneArea = mapArea / numZones;\n const zoneDimension = Math.sqrt(zoneArea);\n const normalizedZoneDimension = zoneDimension / 4;\n const zonePieArea = ((normalizedZoneDimension / 2) ** 2) * Math.PI;\n return zonePieArea;\n }\n\n public static getPieChartRadius(numCases: number, maxPieChartArea: number, statistics: RegionStatistics) {\n const { maxNumCases, minNumCases } = statistics;\n const { MIN_PIE_CHART_RADIUS } = ConfigService.getInstance<CaseDbConfig>().config.map;\n const MIN_PIE_CHART_AREA = MIN_PIE_CHART_RADIUS ** 2 * Math.PI;\n\n let area: number;\n\n if (maxNumCases > minNumCases) {\n const slope = Math.max(MIN_PIE_CHART_AREA, (maxPieChartArea - MIN_PIE_CHART_AREA)) / (maxNumCases - minNumCases);\n area = (slope * (numCases - minNumCases)) + MIN_PIE_CHART_AREA;\n } else {\n area = maxPieChartArea;\n }\n const radius = round(Math.sqrt(area / Math.PI), 2);\n return Math.max(MIN_PIE_CHART_RADIUS, radius);\n }\n\n public static getRegionStatistics(cases: CaseDbCase[], columnId: string, regions: CaseDbRegion[]): RegionStatistics {\n if (!cases.length || !columnId || !regions?.length) {\n return {\n maxNumCases: 0,\n minNumCases: 0,\n numCases: 0,\n statisticsPerRegion: {},\n };\n }\n\n let numCases = 0;\n const statisticsPerRegion: Record<string, {\n numCases: number;\n region: CaseDbRegion;\n rows: CaseDbCase[];\n }> = {};\n cases.forEach(row => {\n const regionId = row.content[columnId];\n if (!regionId) {\n return;\n }\n if (!statisticsPerRegion[regionId]) {\n statisticsPerRegion[regionId] = {\n numCases: 0,\n region: regions.find(region => region.id === regionId),\n rows: [],\n };\n }\n statisticsPerRegion[regionId].rows.push(row);\n // when count is null, 1 should be assumed\n statisticsPerRegion[regionId].numCases += (row.count ?? 1);\n // when count is null, 1 should be assumed\n numCases += (row.count ?? 1);\n });\n const maxNumCases = max(Object.values(statisticsPerRegion).map(region => region.numCases));\n const minNumCases = min(Object.values(statisticsPerRegion).map(region => region.numCases));\n\n return {\n maxNumCases,\n minNumCases,\n numCases,\n statisticsPerRegion,\n };\n }\n\n private static createEmptyBounds(): GeoJsonBounds {\n return [Infinity, Infinity, -Infinity, -Infinity];\n }\n\n private static expandBoundsFromCoordinates(bounds: GeoJsonBounds, coordinates: unknown) {\n if (!Array.isArray(coordinates) || !coordinates.length) {\n return;\n }\n\n if (typeof coordinates[0] === 'number' && typeof coordinates[1] === 'number') {\n const [longitude, latitude] = coordinates as [number, number];\n\n if (!Number.isFinite(longitude) || !Number.isFinite(latitude)) {\n return;\n }\n\n bounds[0] = Math.min(bounds[0], longitude);\n bounds[1] = Math.min(bounds[1], latitude);\n bounds[2] = Math.max(bounds[2], longitude);\n bounds[3] = Math.max(bounds[3], latitude);\n return;\n }\n\n coordinates.forEach(childCoordinates => MapUtil.expandBoundsFromCoordinates(bounds, childCoordinates));\n }\n\n private static expandBoundsFromFeature(bounds: GeoJsonBounds, feature?: GeoJsonFeature | null) {\n if (!feature) {\n return;\n }\n\n const bboxBounds = MapUtil.normalizeBounds(feature.bbox);\n if (bboxBounds) {\n MapUtil.mergeBounds(bounds, bboxBounds);\n return;\n }\n\n MapUtil.expandBoundsFromGeometry(bounds, feature.geometry);\n }\n\n private static expandBoundsFromGeometry(bounds: GeoJsonBounds, geometry?: GeoJsonGeometry | null) {\n if (!geometry) {\n return;\n }\n\n const bboxBounds = MapUtil.normalizeBounds(geometry.bbox);\n if (bboxBounds) {\n MapUtil.mergeBounds(bounds, bboxBounds);\n return;\n }\n\n MapUtil.expandBoundsFromCoordinates(bounds, geometry.coordinates);\n geometry.geometries?.forEach(childGeometry => MapUtil.expandBoundsFromGeometry(bounds, childGeometry));\n }\n\n private static getGeoJsonBounds(geoJson: string): GeoJsonBounds | null {\n try {\n const parsedGeoJson = JSON.parse(geoJson) as GeoJsonObject;\n return MapUtil.getGeoJsonObjectBounds(parsedGeoJson);\n } catch {\n return null;\n }\n }\n\n private static getGeoJsonObjectBounds(geoJson: GeoJsonObject): GeoJsonBounds | null {\n const bboxBounds = MapUtil.normalizeBounds(geoJson.bbox);\n if (bboxBounds) {\n return bboxBounds;\n }\n\n const bounds = MapUtil.createEmptyBounds();\n MapUtil.expandBoundsFromCoordinates(bounds, geoJson.coordinates);\n geoJson.features?.forEach(feature => MapUtil.expandBoundsFromFeature(bounds, feature));\n geoJson.geometries?.forEach(geometry => MapUtil.expandBoundsFromGeometry(bounds, geometry));\n MapUtil.expandBoundsFromGeometry(bounds, geoJson.geometry);\n\n return MapUtil.hasBounds(bounds) ? bounds : null;\n }\n\n private static hasBounds(bounds: GeoJsonBounds) {\n return bounds.every(Number.isFinite);\n }\n\n private static mergeBounds(bounds: GeoJsonBounds, otherBounds: GeoJsonBounds) {\n bounds[0] = Math.min(bounds[0], otherBounds[0]);\n bounds[1] = Math.min(bounds[1], otherBounds[1]);\n bounds[2] = Math.max(bounds[2], otherBounds[2]);\n bounds[3] = Math.max(bounds[3], otherBounds[3]);\n }\n\n private static normalizeBounds(bounds?: number[]): GeoJsonBounds | null {\n if (!bounds || bounds.length < 4) {\n return null;\n }\n\n const normalizedBounds = bounds.slice(0, 4) as GeoJsonBounds;\n return normalizedBounds.every(Number.isFinite) ? normalizedBounds : null;\n }\n}\n"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/_baseExtremum.js","../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/_baseGt.js","../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/max.js","../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/_baseLt.js","../../../../../node_modules/.pnpm/lodash@4.18.1/node_modules/lodash/min.js","../../../src/utils/MapUtil/MapUtil.ts"],"sourcesContent":["var isSymbol = require('./isSymbol');\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseExtremum;\n","/**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\nmodule.exports = baseGt;\n","var baseExtremum = require('./_baseExtremum'),\n baseGt = require('./_baseGt'),\n identity = require('./identity');\n\n/**\n * Computes the maximum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\nfunction max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n}\n\nmodule.exports = max;\n","/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nmodule.exports = baseLt;\n","var baseExtremum = require('./_baseExtremum'),\n baseLt = require('./_baseLt'),\n identity = require('./identity');\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nmodule.exports = min;\n","import max from 'lodash/max';\nimport min from 'lodash/min';\nimport round from 'lodash/round';\nimport type { PieSeriesOption } from 'echarts';\nimport type {\n CaseDbCase,\n CaseDbCol,\n CaseDbRegion,\n} from '@gen-epix/api-casedb';\nimport { ConfigService } from '@gen-epix/ui-client-common/classes/services/ConfigService';\nimport type { UnwrapArray } from '@gen-epix/ui-core/models/generic';\n\nimport type { CaseDbConfig } from '../../models/config';\nimport type { Stratification } from '../../models/stratification';\nimport { DashboardUtil } from '../DashboardUtil';\n\n\nexport type GenEpixPieSeriesOptionEventData = {\n genEpixData?: {\n caseIds: string[];\n regionId: string;\n };\n};\n\nexport type RegionStatistics = {\n maxNumCases: number;\n minNumCases: number;\n numCases: number;\n statisticsPerRegion: Record<string, { numCases: number; region: CaseDbRegion; rows: CaseDbCase[] }>;\n};\n\ntype GenEpixPieSeriesOptionData = Array<GenEpixPieSeriesOptionEventData & UnwrapArray<PieSeriesOption['data']>>;\n\ntype GeoJsonBounds = [number, number, number, number];\ntype GeoJsonFeature = {\n bbox?: number[];\n geometry?: GeoJsonGeometry | null;\n};\ntype GeoJsonGeometry = {\n bbox?: number[];\n coordinates?: unknown;\n geometries?: GeoJsonGeometry[];\n};\ntype GeoJsonObject = {\n bbox?: number[];\n coordinates?: unknown;\n features?: GeoJsonFeature[];\n geometries?: GeoJsonGeometry[];\n geometry?: GeoJsonGeometry | null;\n};\n\nexport class MapUtil {\n public static getGeoJsonAspectScale(geoJson: string) {\n const bounds = MapUtil.getGeoJsonBounds(geoJson);\n if (!bounds) {\n return 1;\n }\n\n const centerLatitude = (bounds[1] + bounds[3]) / 2;\n if (!Number.isFinite(centerLatitude) || Math.abs(centerLatitude) > 90) {\n return 1;\n }\n\n const aspectScale = Math.cos(centerLatitude * Math.PI / 180);\n return Number.isFinite(aspectScale) && aspectScale > 0 ? aspectScale : 1;\n }\n\n public static getMapSeries(\n col: CaseDbCol | null,\n regions: CaseDbRegion[],\n sortedData: CaseDbCase[],\n stratification: null | Stratification,\n getPieChartRadius: (numCases: number) => number,\n ): { mapCaseCount: number; series: PieSeriesOption[] } {\n if (!col || !regions) {\n return {\n mapCaseCount: undefined,\n series: [],\n };\n }\n\n const pieSeriesOptions: PieSeriesOption[] = [];\n\n const { numCases: totalNumCases, statisticsPerRegion } = MapUtil.getRegionStatistics(sortedData, col.id, regions);\n\n const pieChartOptionsBase: Partial<PieSeriesOption> = {\n animation: false,\n coordinateSystem: 'geo',\n label: {\n show: false,\n silent: true,\n },\n labelLine: {\n show: true,\n smooth: true,\n },\n type: 'pie',\n };\n\n Object.entries(statisticsPerRegion).forEach(([regionId, regionData]) => {\n const data: GenEpixPieSeriesOptionData = [];\n\n if (!stratification) {\n const caseIds = regionData.rows.map(row => row.id);\n if (caseIds.length === 0) {\n return;\n }\n data.push({\n emphasis: {\n focus: 'self',\n },\n genEpixData: {\n caseIds,\n regionId,\n },\n label: {\n formatter: () => regionData.region.name,\n },\n name: 'num-cases',\n value: regionData.numCases,\n });\n } else {\n stratification.legendaItems.forEach(legendaItem => {\n const rows = regionData.rows.filter(row => legendaItem.caseIds.includes(row.id));\n const caseIds = rows.map(row => row.id);\n const numCases = DashboardUtil.getCaseCount(rows);\n data.push({\n emphasis: {\n focus: 'self',\n },\n genEpixData: {\n caseIds,\n regionId,\n },\n label: {\n formatter: () => regionData.region.name,\n },\n name: legendaItem.rowValue.full,\n value: numCases,\n });\n });\n }\n\n pieSeriesOptions.push({\n ...pieChartOptionsBase,\n center: [regionData.region.center_lon, regionData.region.center_lat],\n data,\n radius: getPieChartRadius(regionData.numCases),\n tooltip: {\n formatter: (callbackParams) => {\n const d = (callbackParams as { data: { name: string; value: number } }).data;\n if (stratification) {\n return `${regionData.region.name} - ${d.name} (n=${d.value}, ${Math.round(d.value / regionData.numCases * 100)}%)`;\n }\n return `${regionData.region.name} (n=${regionData.numCases}, ${Math.round(regionData.numCases / totalNumCases * 100)}%)`;\n },\n },\n });\n });\n\n return {\n mapCaseCount: totalNumCases,\n series: pieSeriesOptions,\n };\n }\n\n public static getMaxPieChartArea(width: number, height: number, numZones: number): number {\n if (!width || !height || !numZones) {\n return 0;\n }\n const smallestDimension = Math.min(width, height);\n const mapArea = smallestDimension ** 2;\n const zoneArea = mapArea / numZones;\n const zoneDimension = Math.sqrt(zoneArea);\n const normalizedZoneDimension = zoneDimension / 4;\n const zonePieArea = ((normalizedZoneDimension / 2) ** 2) * Math.PI;\n return zonePieArea;\n }\n\n public static getPieChartRadius(numCases: number, maxPieChartArea: number, statistics: RegionStatistics) {\n const { maxNumCases, minNumCases } = statistics;\n const { MIN_PIE_CHART_RADIUS } = ConfigService.getInstance<CaseDbConfig>().config.map;\n const MIN_PIE_CHART_AREA = MIN_PIE_CHART_RADIUS ** 2 * Math.PI;\n\n let area: number;\n\n if (maxNumCases > minNumCases) {\n const slope = Math.max(MIN_PIE_CHART_AREA, (maxPieChartArea - MIN_PIE_CHART_AREA)) / (maxNumCases - minNumCases);\n area = (slope * (numCases - minNumCases)) + MIN_PIE_CHART_AREA;\n } else {\n area = maxPieChartArea;\n }\n const radius = round(Math.sqrt(area / Math.PI), 2);\n return Math.max(MIN_PIE_CHART_RADIUS, radius);\n }\n\n public static getRegionStatistics(cases: CaseDbCase[], columnId: string, regions: CaseDbRegion[]): RegionStatistics {\n if (!cases.length || !columnId || !regions?.length) {\n return {\n maxNumCases: 0,\n minNumCases: 0,\n numCases: 0,\n statisticsPerRegion: {},\n };\n }\n\n let numCases = 0;\n const statisticsPerRegion: Record<string, {\n numCases: number;\n region: CaseDbRegion;\n rows: CaseDbCase[];\n }> = {};\n cases.forEach(row => {\n const regionId = row.content[columnId];\n if (!regionId) {\n return;\n }\n if (!statisticsPerRegion[regionId]) {\n statisticsPerRegion[regionId] = {\n numCases: 0,\n region: regions.find(region => region.id === regionId),\n rows: [],\n };\n }\n statisticsPerRegion[regionId].rows.push(row);\n // when count is null, 1 should be assumed\n statisticsPerRegion[regionId].numCases += (row.count ?? 1);\n // when count is null, 1 should be assumed\n numCases += (row.count ?? 1);\n });\n const maxNumCases = max(Object.values(statisticsPerRegion).map(region => region.numCases));\n const minNumCases = min(Object.values(statisticsPerRegion).map(region => region.numCases));\n\n return {\n maxNumCases,\n minNumCases,\n numCases,\n statisticsPerRegion,\n };\n }\n\n private static createEmptyBounds(): GeoJsonBounds {\n return [Infinity, Infinity, -Infinity, -Infinity];\n }\n\n private static expandBoundsFromCoordinates(bounds: GeoJsonBounds, coordinates: unknown) {\n if (!Array.isArray(coordinates) || !coordinates.length) {\n return;\n }\n\n if (typeof coordinates[0] === 'number' && typeof coordinates[1] === 'number') {\n const [longitude, latitude] = coordinates as [number, number];\n\n if (!Number.isFinite(longitude) || !Number.isFinite(latitude)) {\n return;\n }\n\n bounds[0] = Math.min(bounds[0], longitude);\n bounds[1] = Math.min(bounds[1], latitude);\n bounds[2] = Math.max(bounds[2], longitude);\n bounds[3] = Math.max(bounds[3], latitude);\n return;\n }\n\n coordinates.forEach(childCoordinates => MapUtil.expandBoundsFromCoordinates(bounds, childCoordinates));\n }\n\n private static expandBoundsFromFeature(bounds: GeoJsonBounds, feature?: GeoJsonFeature | null) {\n if (!feature) {\n return;\n }\n\n const bboxBounds = MapUtil.normalizeBounds(feature.bbox);\n if (bboxBounds) {\n MapUtil.mergeBounds(bounds, bboxBounds);\n return;\n }\n\n MapUtil.expandBoundsFromGeometry(bounds, feature.geometry);\n }\n\n private static expandBoundsFromGeometry(bounds: GeoJsonBounds, geometry?: GeoJsonGeometry | null) {\n if (!geometry) {\n return;\n }\n\n const bboxBounds = MapUtil.normalizeBounds(geometry.bbox);\n if (bboxBounds) {\n MapUtil.mergeBounds(bounds, bboxBounds);\n return;\n }\n\n MapUtil.expandBoundsFromCoordinates(bounds, geometry.coordinates);\n geometry.geometries?.forEach(childGeometry => MapUtil.expandBoundsFromGeometry(bounds, childGeometry));\n }\n\n private static getGeoJsonBounds(geoJson: string): GeoJsonBounds | null {\n try {\n const parsedGeoJson = JSON.parse(geoJson) as GeoJsonObject;\n return MapUtil.getGeoJsonObjectBounds(parsedGeoJson);\n } catch {\n return null;\n }\n }\n\n private static getGeoJsonObjectBounds(geoJson: GeoJsonObject): GeoJsonBounds | null {\n const bboxBounds = MapUtil.normalizeBounds(geoJson.bbox);\n if (bboxBounds) {\n return bboxBounds;\n }\n\n const bounds = MapUtil.createEmptyBounds();\n MapUtil.expandBoundsFromCoordinates(bounds, geoJson.coordinates);\n geoJson.features?.forEach(feature => MapUtil.expandBoundsFromFeature(bounds, feature));\n geoJson.geometries?.forEach(geometry => MapUtil.expandBoundsFromGeometry(bounds, geometry));\n MapUtil.expandBoundsFromGeometry(bounds, geoJson.geometry);\n\n return MapUtil.hasBounds(bounds) ? bounds : null;\n }\n\n private static hasBounds(bounds: GeoJsonBounds) {\n return bounds.every(Number.isFinite);\n }\n\n private static mergeBounds(bounds: GeoJsonBounds, otherBounds: GeoJsonBounds) {\n bounds[0] = Math.min(bounds[0], otherBounds[0]);\n bounds[1] = Math.min(bounds[1], otherBounds[1]);\n bounds[2] = Math.max(bounds[2], otherBounds[2]);\n bounds[3] = Math.max(bounds[3], otherBounds[3]);\n }\n\n private static normalizeBounds(bounds?: number[]): GeoJsonBounds | null {\n if (!bounds || bounds.length < 4) {\n return null;\n }\n\n const normalizedBounds = bounds.slice(0, 4) as GeoJsonBounds;\n return normalizedBounds.every(Number.isFinite) ? normalizedBounds : null;\n }\n}\n"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gen-epix/ui-client-casedb",
3
- "version": "4.3.0",
3
+ "version": "4.3.2",
4
4
  "homepage": "https://github.com/RIVM-bioinformatics/gen-epix",
5
5
  "repository": {
6
6
  "type": "git",
@@ -675,7 +675,7 @@
675
675
  ],
676
676
  "dependencies": {
677
677
  "@hookform/resolvers": "5.9.1",
678
- "@tanstack/react-query": "5.103.1",
678
+ "@tanstack/react-query": "5.103.2",
679
679
  "colorjs.io": "0.7.1",
680
680
  "csv": "6.6.3",
681
681
  "date-fns": "4.4.0",
@@ -685,11 +685,6 @@
685
685
  "fuse.js": "7.5.0",
686
686
  "immer": "11.1.18",
687
687
  "lodash": "4.18.1",
688
- "react-error-boundary": "6.1.5",
689
- "react-resizable-panels": "4.12.4",
690
- "react-router": "8.4.0",
691
- "react-router-dom": "7.18.4",
692
- "react-virtuoso": "4.18.13",
693
688
  "read-excel-file": "9.3.10",
694
689
  "use-debounce": "10.1.1",
695
690
  "write-excel-file": "4.1.1",
@@ -699,15 +694,15 @@
699
694
  "@emotion/cache": "11.14.0",
700
695
  "@emotion/react": "11.14.0",
701
696
  "@emotion/styled": "11.14.1",
702
- "@gen-epix/api-casedb": "^4.3.0",
703
- "@gen-epix/api-commondb": "^4.3.0",
704
- "@gen-epix/eslint-config": "0.5.0",
705
- "@gen-epix/translation-util": "0.2.0",
706
- "@gen-epix/ui-client-common": "^4.3.0",
707
- "@gen-epix/ui-core": "^3.3.0",
708
- "@gen-epix/ui-core-components": "^4.3.0",
709
- "@gen-epix/ui-core-form": "^4.3.0",
710
- "@gen-epix/ui-phylogenetic-tree": "^3.4.0",
697
+ "@gen-epix/api-casedb": "^4.3.1",
698
+ "@gen-epix/api-commondb": "^4.3.1",
699
+ "@gen-epix/eslint-config": "0.7.0",
700
+ "@gen-epix/translation-util": "0.4.0",
701
+ "@gen-epix/ui-client-common": "^4.3.2",
702
+ "@gen-epix/ui-core": "^3.3.1",
703
+ "@gen-epix/ui-core-components": "^4.3.1",
704
+ "@gen-epix/ui-core-form": "^4.3.1",
705
+ "@gen-epix/ui-phylogenetic-tree": "^3.4.2",
711
706
  "@hookform/resolvers": "5.9.1",
712
707
  "@microsoft/api-extractor": "7.59.1",
713
708
  "@mui/icons-material": "9.4.0",
@@ -717,23 +712,28 @@
717
712
  "@mui/utils": "9.4.0",
718
713
  "@mui/x-date-pickers": "9.14.0",
719
714
  "@types/lodash": "4.17.25",
720
- "@types/node": "26.4.1",
715
+ "@types/node": "26.6.2",
721
716
  "@types/react": "19.3.0",
722
717
  "@vitejs/plugin-react": "6.1.1",
723
718
  "@vitest/browser-playwright": "5.0.1",
724
719
  "@vitest/coverage-v8": "5.0.1",
725
720
  "axios": "1.20.0",
726
- "eslint": "10.10.0",
721
+ "eslint": "10.11.0",
727
722
  "i18next": "26.4.2",
728
723
  "jsdom": "30.1.0",
729
724
  "playwright": "1.63.0",
730
- "react": "19.3.0",
731
725
  "react-dom": "19.3.0",
726
+ "react-error-boundary": "6.1.6",
732
727
  "react-hook-form": "7.88.0",
733
728
  "react-i18next": "17.0.14",
729
+ "react-resizable-panels": "4.13.1",
730
+ "react-router-dom": "7.18.4",
731
+ "react-router": "8.4.0",
732
+ "react-virtuoso": "4.18.14",
733
+ "react": "19.3.0",
734
734
  "typescript": "6.0.3",
735
735
  "vite": "8.3.0",
736
- "vite-plugin-dts": "5.1.0",
736
+ "vite-plugin-dts": "5.1.1",
737
737
  "vite-plugin-lib-inject-css": "2.2.2",
738
738
  "vite-plugin-static-copy": "4.1.1",
739
739
  "vite-plugin-svgr": "5.2.0",
@@ -745,13 +745,13 @@
745
745
  "@emotion/cache": "*",
746
746
  "@emotion/react": "*",
747
747
  "@emotion/styled": "*",
748
- "@gen-epix/api-casedb": "^4.3.0",
749
- "@gen-epix/api-commondb": "^4.3.0",
750
- "@gen-epix/ui-client-common": "^4.3.0",
751
- "@gen-epix/ui-core": "^3.3.0",
752
- "@gen-epix/ui-core-components": "^4.3.0",
753
- "@gen-epix/ui-core-form": "^4.3.0",
754
- "@gen-epix/ui-phylogenetic-tree": "^3.4.0",
748
+ "@gen-epix/api-casedb": "^4.3.1",
749
+ "@gen-epix/api-commondb": "^4.3.1",
750
+ "@gen-epix/ui-client-common": "^4.3.2",
751
+ "@gen-epix/ui-core": "^3.3.1",
752
+ "@gen-epix/ui-core-components": "^4.3.1",
753
+ "@gen-epix/ui-core-form": "^4.3.1",
754
+ "@gen-epix/ui-phylogenetic-tree": "^3.4.2",
755
755
  "@mui/icons-material": "*",
756
756
  "@mui/material": "*",
757
757
  "@mui/styled-engine": "*",
@@ -760,10 +760,15 @@
760
760
  "@mui/x-date-pickers": "*",
761
761
  "axios": "*",
762
762
  "i18next": "*",
763
- "react": "*",
764
763
  "react-dom": "*",
764
+ "react-error-boundary": "*",
765
765
  "react-hook-form": "*",
766
766
  "react-i18next": "*",
767
+ "react-resizable-panels": "*",
768
+ "react-router-dom": "*",
769
+ "react-router": "*",
770
+ "react-virtuoso": "*",
771
+ "react": "*",
767
772
  "yup": "*"
768
773
  },
769
774
  "publishConfig": {