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

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 (53) 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/ui/ContextMenu/index.js +1 -1
  23. package/dist/components/ui/ContextMenu/index.js.map +1 -1
  24. package/dist/components/ui/CreateEventDialog/index.js +1 -1
  25. package/dist/components/ui/CreateEventDialog/index.js.map +1 -1
  26. package/dist/components/ui/HistogramWidget/index.js +1 -1
  27. package/dist/components/ui/HistogramWidget/index.js.map +1 -1
  28. package/dist/components/ui/PanelSeparator/index.js +50 -2
  29. package/dist/components/ui/PanelSeparator/index.js.map +1 -0
  30. package/dist/pages/CasesDetailPage/index.js +16 -16
  31. package/dist/pages/ColsAdminPage/index.js +77 -77
  32. package/dist/pages/ColsAdminPage/index.js.map +1 -1
  33. package/dist/pages/ConceptsAdminPage/index.js +31 -31
  34. package/dist/pages/DataCollectionVisualizationPage/index.js +1 -1
  35. package/dist/pages/DataCollectionVisualizationPage/index.js.map +1 -1
  36. package/dist/pages/DimsAdminPage/index.js +46 -46
  37. package/dist/pages/EventsDetailPage/index.js +18 -18
  38. package/dist/pages/RefColsAdminPage/index.js +94 -94
  39. package/dist/pages/RegionSetShapesAdminPage/index.js +26 -26
  40. package/dist/pages/RegionsAdminPage/index.js +33 -33
  41. package/dist/pages/UserEffectiveRightsAdminPage/index.js +56 -56
  42. package/dist/pages/UserEffectiveRightsAdminPage/index.js.map +1 -1
  43. package/dist/pages/UserEffectiveRightsTesterAdminPage/index.js +45 -45
  44. package/dist/pages/UserEffectiveRightsTesterAdminPage/index.js.map +1 -1
  45. package/dist/utils/CaseDbStandardConfigUtil/index.js +1 -5
  46. package/dist/utils/CaseDbStandardConfigUtil/index.js.map +1 -1
  47. package/dist/utils/MapUtil/index.js +1 -1
  48. package/dist/utils/MapUtil/index.js.map +1 -1
  49. package/package.json +17 -12
  50. package/dist/_chunks/PanelSeparator.js +0 -1666
  51. package/dist/_chunks/PanelSeparator.js.map +0 -1
  52. package/dist/_chunks/chunk-OB3PAWPO.js +0 -1162
  53. package/dist/_chunks/chunk-OB3PAWPO.js.map +0 -1
@@ -1,4 +1,4 @@
1
- //#region ../../node_modules/.pnpm/zustand@5.0.15_@types+react@19.3.0_immer@11.1.18_react@19.3.0_use-sync-external-store@1.6.0_react@19.3.0_/node_modules/zustand/esm/vanilla.mjs
1
+ //#region ../../node_modules/.pnpm/zustand@5.0.15_@types+react@19.3.0_immer@11.1.18_react@19.3.0_use-sync-external-store@1.7.0_react@19.3.0_/node_modules/zustand/esm/vanilla.mjs
2
2
  var e = (e) => {
3
3
  let t, n = /* @__PURE__ */ new Set(), r = (e, r) => {
4
4
  let i = typeof e == "function" ? e(t) : e;
@@ -1 +1 @@
1
- {"version":3,"file":"vanilla.js","names":[],"sources":["../../../../node_modules/.pnpm/zustand@5.0.15_@types+react@19.3.0_immer@11.1.18_react@19.3.0_use-sync-external-store@1.6.0_react@19.3.0_/node_modules/zustand/esm/vanilla.mjs"],"sourcesContent":["const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n"],"x_google_ignoreList":[0],"mappings":";AAAA,IAAM,KAAmB,MAAgB;CACvC,IAAI,GACE,oBAA4B,IAAI,IAAI,GACpC,KAAY,GAAS,MAAY;EACrC,IAAM,IAAY,OAAO,KAAY,aAAa,EAAQ,CAAK,IAAI;EACnE,IAAI,CAAC,OAAO,GAAG,GAAW,CAAK,GAAG;GAChC,IAAM,IAAgB;GAEtB,AADA,IAAS,MAA4B,OAAO,KAAc,aAAY,KAAsB,IAAY,OAAO,OAAO,CAAC,GAAG,GAAO,CAAS,GAC1I,EAAU,SAAS,MAAa,EAAS,GAAO,CAAa,CAAC;EAChE;CACF,GACM,UAAiB,GAMjB,IAAM;EAAE;EAAU;EAAU,uBALJ;EAKqB,YAJhC,OACjB,EAAU,IAAI,CAAQ,SACT,EAAU,OAAO,CAAQ;CAEqB,GACvD,IAAe,IAAQ,EAAY,GAAU,GAAU,CAAG;CAChE,OAAO;AACT,GACM,MAAgB,MAAgB,IAAc,EAAgB,CAAW,IAAI"}
1
+ {"version":3,"file":"vanilla.js","names":[],"sources":["../../../../node_modules/.pnpm/zustand@5.0.15_@types+react@19.3.0_immer@11.1.18_react@19.3.0_use-sync-external-store@1.7.0_react@19.3.0_/node_modules/zustand/esm/vanilla.mjs"],"sourcesContent":["const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n"],"x_google_ignoreList":[0],"mappings":";AAAA,IAAM,KAAmB,MAAgB;CACvC,IAAI,GACE,oBAA4B,IAAI,IAAI,GACpC,KAAY,GAAS,MAAY;EACrC,IAAM,IAAY,OAAO,KAAY,aAAa,EAAQ,CAAK,IAAI;EACnE,IAAI,CAAC,OAAO,GAAG,GAAW,CAAK,GAAG;GAChC,IAAM,IAAgB;GAEtB,AADA,IAAS,MAA4B,OAAO,KAAc,aAAY,KAAsB,IAAY,OAAO,OAAO,CAAC,GAAG,GAAO,CAAS,GAC1I,EAAU,SAAS,MAAa,EAAS,GAAO,CAAa,CAAC;EAChE;CACF,GACM,UAAiB,GAMjB,IAAM;EAAE;EAAU;EAAU,uBALJ;EAKqB,YAJhC,OACjB,EAAU,IAAI,CAAQ,SACT,EAAU,OAAO,CAAQ;CAEqB,GACvD,IAAe,IAAQ,EAAY,GAAU,GAAU,CAAG;CAChE,OAAO;AACT,GACM,MAAgB,MAAgB,IAAc,EAAgB,CAAW,IAAI"}
@@ -1,5 +1,5 @@
1
1
  import { appendErrors as e, get as t, set as n } from "react-hook-form";
2
- //#region ../../node_modules/.pnpm/@hookform+resolvers@5.9.1_@sinclair+typebox@0.34.49_@standard-schema+spec@1.1.0_ajv@8.2_26d561451bcf52899bfb24d45cfb94ee/node_modules/@hookform/resolvers/dist/resolvers.mjs
2
+ //#region ../../node_modules/.pnpm/@hookform+resolvers@5.9.1_ajv@8.20.0_react-hook-form@7.88.0_react@19.3.0__yup@1.7.1_zod@4.6.5/node_modules/@hookform/resolvers/dist/resolvers.mjs
3
3
  var r = (e, n, r) => {
4
4
  if (e && "reportValidity" in e) {
5
5
  let i = t(r, n);
@@ -29,7 +29,7 @@ function s(e) {
29
29
  return e.replace(/\[(\d+)]/g, ".$1").replace(/[[\]]/g, "");
30
30
  }
31
31
  //#endregion
32
- //#region ../../node_modules/.pnpm/@hookform+resolvers@5.9.1_@sinclair+typebox@0.34.49_@standard-schema+spec@1.1.0_ajv@8.2_26d561451bcf52899bfb24d45cfb94ee/node_modules/@hookform/resolvers/yup/dist/yup.mjs
32
+ //#region ../../node_modules/.pnpm/@hookform+resolvers@5.9.1_ajv@8.20.0_react-hook-form@7.88.0_react@19.3.0__yup@1.7.1_zod@4.6.5/node_modules/@hookform/resolvers/yup/dist/yup.mjs
33
33
  function c(t, n, r) {
34
34
  return r === void 0 && (r = {}), function(o, s, c) {
35
35
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"yup.js","names":["e","o","r","s","e","t","r"],"sources":["../../../../node_modules/.pnpm/@hookform+resolvers@5.9.1_@sinclair+typebox@0.34.49_@standard-schema+spec@1.1.0_ajv@8.2_26d561451bcf52899bfb24d45cfb94ee/node_modules/@hookform/resolvers/dist/resolvers.mjs","../../../../node_modules/.pnpm/@hookform+resolvers@5.9.1_@sinclair+typebox@0.34.49_@standard-schema+spec@1.1.0_ajv@8.2_26d561451bcf52899bfb24d45cfb94ee/node_modules/@hookform/resolvers/yup/dist/yup.mjs"],"sourcesContent":["import{get as e,set as r}from\"react-hook-form\";const t=(r,t,s)=>{if(r&&\"reportValidity\"in r){const o=e(s,t);r.setCustomValidity(o&&o.message||\"\"),r.reportValidity()}},s=(e,r)=>{for(const s in r.fields){const o=r.fields[s];o&&o.ref&&\"reportValidity\"in o.ref?t(o.ref,s,e):o&&o.refs&&o.refs.forEach(r=>t(r,s,e))}},o=(t,o)=>{o.shouldUseNativeValidation&&s(t,o);const n={};for(const s in t){const f=e(o.fields,s),c=Object.assign(t[s]||{},{ref:f&&f.refs?f.refs[0]:f&&f.ref});if(i(o.names||Object.keys(t),s)){const t=Object.assign({},e(n,s));r(t,\"root\",c),r(n,s,t)}else r(n,s,c)}return n},i=(e,r)=>{const t=n(r).replace(/[.*+?^${}()|\\\\]/g,\"\\\\$&\");return e.some(e=>n(e).match(`^${t}\\\\.\\\\d+`))};function n(e){return e.replace(/\\[(\\d+)]/g,\".$1\").replace(/[[\\]]/g,\"\")}export{o as toNestErrors,s as validateFieldsNatively};\n//# sourceMappingURL=resolvers.mjs.map\n","import{validateFieldsNatively as e,toNestErrors as t}from\"@hookform/resolvers\";import{appendErrors as r}from\"react-hook-form\";function o(o,n,a){return void 0===a&&(a={}),function(s,i,c){try{return Promise.resolve(function(t,r){try{var u=(null!=n&&n.context&&\"development\"===process.env.NODE_ENV&&console.warn(\"You should not used the yup options context. Please, use the 'useForm' context object instead\"),Promise.resolve(o[\"sync\"===a.mode?\"validateSync\":\"validate\"](s,Object.assign({abortEarly:!1},n,{context:i}))).then(function(t){return c.shouldUseNativeValidation&&e({},c),{values:a.raw?Object.assign({},s):t,errors:{}}}))}catch(e){return r(e)}return u&&u.then?u.then(void 0,r):u}(0,function(e){if(!e.inner)throw e;return{values:{},errors:t((o=e,n=!c.shouldUseNativeValidation&&\"all\"===c.criteriaMode,(o.inner||[]).reduce(function(e,t){if(e[t.path]||(e[t.path]={message:t.message,type:t.type}),n){var o=e[t.path].types,a=o&&o[t.type];e[t.path]=r(t.path,n,e,t.type,a?[].concat(a,t.message):t.message)}return e},Object.create(null))),c)};var o,n}))}catch(e){return Promise.reject(e)}}}export{o as yupResolver};\n//# sourceMappingURL=yup.module.js.map\n"],"x_google_ignoreList":[0,1],"mappings":";;AAA+C,IAAM,KAAG,GAAE,GAAE,MAAI;CAAC,IAAG,KAAG,oBAAmB,GAAE;EAAC,IAAM,IAAEA,EAAE,GAAE,CAAC;EAAE,EAAE,kBAAkB,KAAG,EAAE,WAAS,EAAE,GAAE,EAAE,eAAe;CAAC;AAAC,GAAE,KAAG,GAAE,MAAI;CAAC,KAAI,IAAM,KAAK,EAAE,QAAO;EAAC,IAAM,IAAE,EAAE,OAAO;EAAG,KAAG,EAAE,OAAK,oBAAmB,EAAE,MAAI,EAAE,EAAE,KAAI,GAAE,CAAC,IAAE,KAAG,EAAE,QAAM,EAAE,KAAK,SAAQ,MAAG,EAAE,GAAE,GAAE,CAAC,CAAC;CAAC;AAAC,GAAEC,KAAG,GAAE,MAAI;CAAC,EAAE,6BAA2B,EAAE,GAAE,CAAC;CAAE,IAAM,IAAE,CAAC;CAAE,KAAI,IAAM,KAAK,GAAE;EAAC,IAAM,IAAED,EAAE,EAAE,QAAO,CAAC,GAAE,IAAE,OAAO,OAAO,EAAE,MAAI,CAAC,GAAE,EAAC,KAAI,KAAG,EAAE,OAAK,EAAE,KAAK,KAAG,KAAG,EAAE,IAAG,CAAC;EAAE,IAAG,EAAE,EAAE,SAAO,OAAO,KAAK,CAAC,GAAE,CAAC,GAAE;GAAC,IAAM,IAAE,OAAO,OAAO,CAAC,GAAEA,EAAE,GAAE,CAAC,CAAC;GAAE,EAAE,GAAE,QAAO,CAAC,GAAEE,EAAE,GAAE,GAAE,CAAC;EAAC,OAAM,EAAE,GAAE,GAAE,CAAC;CAAC;CAAC,OAAO;AAAC,GAAE,KAAG,GAAE,MAAI;CAAC,IAAM,IAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,oBAAmB,MAAM;CAAE,OAAO,EAAE,MAAK,MAAG,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,QAAQ,CAAC;AAAC;AAAE,SAAS,EAAE,GAAE;CAAC,OAAO,EAAE,QAAQ,aAAY,KAAK,CAAC,CAAC,QAAQ,UAAS,EAAE;AAAC;;;ACAtnB,SAAS,EAAE,GAAE,GAAE,GAAE;CAAC,OAAgB,MAAT,KAAK,MAAQ,IAAE,CAAC,IAAG,SAAS,GAAE,GAAE,GAAE;EAAC,IAAG;GAAC,OAAO,QAAQ,QAAQ,SAAS,GAAE,GAAE;IAAC,IAAG;KAAC,IAAI,KAAS,KAAN,QAAS,EAAE,WAAS,QAAA,IAAA,aAAA,iBAAsC,QAAQ,KAAK,+FAA+F,GAAE,QAAQ,QAAQ,EAAW,EAAE,SAAX,SAAgB,iBAAe,WAAW,CAACC,GAAE,OAAO,OAAO,EAAC,YAAW,CAAC,EAAC,GAAE,GAAE,EAAC,SAAQ,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,GAAE;MAAC,OAAO,EAAE,6BAA2BC,EAAE,CAAC,GAAE,CAAC,GAAE;OAAC,QAAO,EAAE,MAAI,OAAO,OAAO,CAAC,GAAED,CAAC,IAAE;OAAE,QAAO,CAAC;MAAC;KAAC,CAAC;IAAE,SAAO,GAAE;KAAC,OAAO,EAAE,CAAC;IAAC;IAAC,OAAO,KAAG,EAAE,OAAK,EAAE,KAAK,KAAK,GAAE,CAAC,IAAE;GAAC,EAAE,GAAE,SAAS,GAAE;IAAC,IAAG,CAAC,EAAE,OAAM,MAAM;IAAE,OAAM;KAAC,QAAO,CAAC;KAAE,QAAOE,GAAG,IAAE,GAAE,IAAE,CAAC,EAAE,6BAAmC,EAAE,iBAAV,QAAwB,EAAE,SAAO,CAAC,EAAA,CAAG,OAAO,SAAS,GAAE,GAAE;MAAC,IAAG,EAAE,EAAE,UAAQ,EAAE,EAAE,QAAM;OAAC,SAAQ,EAAE;OAAQ,MAAK,EAAE;MAAI,IAAG,GAAE;OAAC,IAAI,IAAE,EAAE,EAAE,KAAK,CAAC,OAAM,IAAE,KAAG,EAAE,EAAE;OAAM,EAAE,EAAE,QAAMC,EAAE,EAAE,MAAK,GAAE,GAAE,EAAE,MAAK,IAAE,CAAC,CAAC,CAAC,OAAO,GAAE,EAAE,OAAO,IAAE,EAAE,OAAO;MAAC;MAAC,OAAO;KAAC,GAAE,OAAO,OAAO,IAAI,CAAC,IAAG,CAAC;IAAC;QAAM,GAAE;GAAC,CAAC,CAAC;EAAC,SAAO,GAAE;GAAC,OAAO,QAAQ,OAAO,CAAC;EAAC;CAAC;AAAC"}
1
+ {"version":3,"file":"yup.js","names":["e","o","r","s","e","t","r"],"sources":["../../../../node_modules/.pnpm/@hookform+resolvers@5.9.1_ajv@8.20.0_react-hook-form@7.88.0_react@19.3.0__yup@1.7.1_zod@4.6.5/node_modules/@hookform/resolvers/dist/resolvers.mjs","../../../../node_modules/.pnpm/@hookform+resolvers@5.9.1_ajv@8.20.0_react-hook-form@7.88.0_react@19.3.0__yup@1.7.1_zod@4.6.5/node_modules/@hookform/resolvers/yup/dist/yup.mjs"],"sourcesContent":["import{get as e,set as r}from\"react-hook-form\";const t=(r,t,s)=>{if(r&&\"reportValidity\"in r){const o=e(s,t);r.setCustomValidity(o&&o.message||\"\"),r.reportValidity()}},s=(e,r)=>{for(const s in r.fields){const o=r.fields[s];o&&o.ref&&\"reportValidity\"in o.ref?t(o.ref,s,e):o&&o.refs&&o.refs.forEach(r=>t(r,s,e))}},o=(t,o)=>{o.shouldUseNativeValidation&&s(t,o);const n={};for(const s in t){const f=e(o.fields,s),c=Object.assign(t[s]||{},{ref:f&&f.refs?f.refs[0]:f&&f.ref});if(i(o.names||Object.keys(t),s)){const t=Object.assign({},e(n,s));r(t,\"root\",c),r(n,s,t)}else r(n,s,c)}return n},i=(e,r)=>{const t=n(r).replace(/[.*+?^${}()|\\\\]/g,\"\\\\$&\");return e.some(e=>n(e).match(`^${t}\\\\.\\\\d+`))};function n(e){return e.replace(/\\[(\\d+)]/g,\".$1\").replace(/[[\\]]/g,\"\")}export{o as toNestErrors,s as validateFieldsNatively};\n//# sourceMappingURL=resolvers.mjs.map\n","import{validateFieldsNatively as e,toNestErrors as t}from\"@hookform/resolvers\";import{appendErrors as r}from\"react-hook-form\";function o(o,n,a){return void 0===a&&(a={}),function(s,i,c){try{return Promise.resolve(function(t,r){try{var u=(null!=n&&n.context&&\"development\"===process.env.NODE_ENV&&console.warn(\"You should not used the yup options context. Please, use the 'useForm' context object instead\"),Promise.resolve(o[\"sync\"===a.mode?\"validateSync\":\"validate\"](s,Object.assign({abortEarly:!1},n,{context:i}))).then(function(t){return c.shouldUseNativeValidation&&e({},c),{values:a.raw?Object.assign({},s):t,errors:{}}}))}catch(e){return r(e)}return u&&u.then?u.then(void 0,r):u}(0,function(e){if(!e.inner)throw e;return{values:{},errors:t((o=e,n=!c.shouldUseNativeValidation&&\"all\"===c.criteriaMode,(o.inner||[]).reduce(function(e,t){if(e[t.path]||(e[t.path]={message:t.message,type:t.type}),n){var o=e[t.path].types,a=o&&o[t.type];e[t.path]=r(t.path,n,e,t.type,a?[].concat(a,t.message):t.message)}return e},Object.create(null))),c)};var o,n}))}catch(e){return Promise.reject(e)}}}export{o as yupResolver};\n//# sourceMappingURL=yup.module.js.map\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -14,7 +14,7 @@ var v = ({ config: v, getExtraItems: y, onMenuClose: b }) => {
14
14
  let { t: x } = d(), S = s(n), C = t(S, (e) => e.selectedIds), w = t(S, (e) => e.setSelectedIds), T = u(() => v?.parseIdsFromAnchorElement ? v.parseIdsFromAnchorElement(v.anchorElement) : v?.caseIds ? v.caseIds : [], [v]);
15
15
  l(() => {
16
16
  let t = v?.mouseEvent;
17
- if (!(!t || !t.metaKey && !t.ctrlKey)) {
17
+ if (t && (t.metaKey || t.ctrlKey)) {
18
18
  if (e.canAddToSelection(T, C)) {
19
19
  w(e.addComponentCaseIdsToSelection(T, C)), b();
20
20
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/ContextMenu/ContextMenu.tsx"],"sourcesContent":["import type { PopoverPosition } from '@mui/material';\nimport {\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n} from '@mui/material';\nimport PlaylistAddCheckIcon from '@mui/icons-material/PlaylistAddCheck';\nimport PlaylistAddIcon from '@mui/icons-material/PlaylistAdd';\nimport PlaylistRemoveIcon from '@mui/icons-material/PlaylistRemove';\nimport PlaylistPlayIcon from '@mui/icons-material/PlaylistPlay';\nimport type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useMemo,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\n\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CaseSelectionUtil } from '../../../utils/CaseSelectionUtil';\n\nexport type ContextMenuConfigWithAnchor = {\n anchorElement?: Element;\n mouseEvent?: MouseEvent;\n parseIdsFromAnchorElement?: (element: Element) => string[];\n};\n\nexport type ContextMenuConfigWithPosition = {\n caseIds?: string[];\n mouseEvent?: MouseEvent;\n position?: PopoverPosition;\n};\n\nexport type ContextMenuProps = {\n readonly config: ContextMenuConfig;\n readonly getExtraItems?: (onMenuClose?: () => void) => ReactElement;\n readonly onMenuClose: () => void;\n};\n\ntype ContextMenuConfig = ContextMenuConfigWithAnchor & ContextMenuConfigWithPosition;\n\nexport const ContextMenu = ({ config, getExtraItems, onMenuClose }: ContextMenuProps) => {\n const { t } = useTranslation();\n const dashboardStore = use(DashboardStoreContext);\n const selectedIds = useStore(dashboardStore, (state) => state.selectedIds);\n const setSelectedIds = useStore(dashboardStore, (state) => state.setSelectedIds);\n\n const componentCaseIds = useMemo(() => {\n if (config?.parseIdsFromAnchorElement) {\n return config.parseIdsFromAnchorElement(config.anchorElement);\n }\n if (config?.caseIds) {\n return config.caseIds;\n }\n return [];\n }, [config]);\n\n useEffect(() => {\n const mouseEvent = config?.mouseEvent;\n if (!mouseEvent || (!mouseEvent.metaKey && !mouseEvent.ctrlKey)) {\n return;\n }\n if (CaseSelectionUtil.canAddToSelection(componentCaseIds, selectedIds)) {\n setSelectedIds(CaseSelectionUtil.addComponentCaseIdsToSelection(componentCaseIds, selectedIds));\n onMenuClose();\n return;\n }\n if (CaseSelectionUtil.canRemoveFromSelection(componentCaseIds, selectedIds)) {\n setSelectedIds(CaseSelectionUtil.removeComponentCaseIdsFromSelection(componentCaseIds, selectedIds));\n onMenuClose();\n return;\n }\n }, [componentCaseIds, config?.mouseEvent, selectedIds, setSelectedIds, onMenuClose]);\n\n\n const onMenuSelectClick = useCallback(() => {\n setSelectedIds(componentCaseIds);\n onMenuClose();\n }, [componentCaseIds, onMenuClose, setSelectedIds]);\n\n const onAddToSelectionMenuItemClick = useCallback(() => {\n setSelectedIds(CaseSelectionUtil.addComponentCaseIdsToSelection(componentCaseIds, selectedIds));\n onMenuClose();\n }, [componentCaseIds, onMenuClose, setSelectedIds, selectedIds]);\n\n const onRemoveFromSelectionMenuItemClick = useCallback(() => {\n setSelectedIds(CaseSelectionUtil.removeComponentCaseIdsFromSelection(componentCaseIds, selectedIds));\n onMenuClose();\n }, [componentCaseIds, onMenuClose, setSelectedIds, selectedIds]);\n\n const onRefineSelectionMenuItemClick = useCallback(() => {\n setSelectedIds(CaseSelectionUtil.refineSelectionWithComponentCaseIds(componentCaseIds, selectedIds));\n onMenuClose();\n }, [componentCaseIds, onMenuClose, setSelectedIds, selectedIds]);\n\n const extraItems = getExtraItems ? getExtraItems(onMenuClose) : null;\n\n return (\n <Menu\n anchorEl={config?.anchorElement}\n anchorPosition={config?.position}\n anchorReference={config?.anchorElement ? 'anchorEl' : 'anchorPosition'}\n onClose={onMenuClose}\n open={!!config}\n >\n {extraItems}\n <MenuItem\n disabled={componentCaseIds.length === 0}\n onClick={onMenuSelectClick}\n >\n <ListItemIcon>\n <PlaylistAddCheckIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Select rows`}\n </ListItemText>\n </MenuItem>\n <MenuItem\n disabled={!CaseSelectionUtil.canAddToSelection(componentCaseIds, selectedIds)}\n onClick={onAddToSelectionMenuItemClick}\n >\n <ListItemIcon>\n <PlaylistAddIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Add to selected rows`}\n </ListItemText>\n </MenuItem>\n <MenuItem\n disabled={!CaseSelectionUtil.canRemoveFromSelection(componentCaseIds, selectedIds)}\n onClick={onRemoveFromSelectionMenuItemClick}\n >\n <ListItemIcon>\n <PlaylistRemoveIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Remove from selected rows`}\n </ListItemText>\n </MenuItem>\n <MenuItem\n disabled={!CaseSelectionUtil.canRefineSelection(componentCaseIds, selectedIds)}\n onClick={onRefineSelectionMenuItemClick}\n >\n <ListItemIcon>\n <PlaylistPlayIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Refine selected rows (intersect)`}\n </ListItemText>\n </MenuItem>\n </Menu>\n );\n};\n"],"mappings":";;;;;;;;;;;;AA4CA,IAAa,KAAe,EAAE,WAAQ,kBAAe,qBAAoC;CACvF,IAAM,EAAE,SAAM,EAAe,GACvB,IAAiB,EAAI,CAAqB,GAC1C,IAAc,EAAS,IAAiB,MAAU,EAAM,WAAW,GACnE,IAAiB,EAAS,IAAiB,MAAU,EAAM,cAAc,GAEzE,IAAmB,QACnB,GAAQ,4BACH,EAAO,0BAA0B,EAAO,aAAa,IAE1D,GAAQ,UACH,EAAO,UAET,CAAC,GACP,CAAC,CAAM,CAAC;CAEX,QAAgB;EACd,IAAM,IAAa,GAAQ;EACvB,OAAC,KAAe,CAAC,EAAW,WAAW,CAAC,EAAW,UAGvD;OAAI,EAAkB,kBAAkB,GAAkB,CAAW,GAAG;IAEtE,AADA,EAAe,EAAkB,+BAA+B,GAAkB,CAAW,CAAC,GAC9F,EAAY;IACZ;GACF;GACA,IAAI,EAAkB,uBAAuB,GAAkB,CAAW,GAAG;IAE3E,AADA,EAAe,EAAkB,oCAAoC,GAAkB,CAAW,CAAC,GACnG,EAAY;IACZ;GACF;EALA;CAMF,GAAG;EAAC;EAAkB,GAAQ;EAAY;EAAa;EAAgB;CAAW,CAAC;CAGnF,IAAM,IAAoB,QAAkB;EAE1C,AADA,EAAe,CAAgB,GAC/B,EAAY;CACd,GAAG;EAAC;EAAkB;EAAa;CAAc,CAAC,GAE5C,IAAgC,QAAkB;EAEtD,AADA,EAAe,EAAkB,+BAA+B,GAAkB,CAAW,CAAC,GAC9F,EAAY;CACd,GAAG;EAAC;EAAkB;EAAa;EAAgB;CAAW,CAAC,GAEzD,IAAqC,QAAkB;EAE3D,AADA,EAAe,EAAkB,oCAAoC,GAAkB,CAAW,CAAC,GACnG,EAAY;CACd,GAAG;EAAC;EAAkB;EAAa;EAAgB;CAAW,CAAC,GAEzD,IAAiC,QAAkB;EAEvD,AADA,EAAe,EAAkB,oCAAoC,GAAkB,CAAW,CAAC,GACnG,EAAY;CACd,GAAG;EAAC;EAAkB;EAAa;EAAgB;CAAW,CAAC,GAEzD,IAAa,IAAgB,EAAc,CAAW,IAAI;CAEhE,OACE,kBAAC,GAAD;EACE,UAAU,GAAQ;EAClB,gBAAgB,GAAQ;EACxB,iBAAiB,GAAQ,gBAAgB,aAAa;EACtD,SAAS;EACT,MAAM,CAAC,CAAC;EALV,UAAA;GAOG;GACD,kBAAC,GAAD;IACE,UAAU,EAAiB,WAAW;IACtC,SAAS;IAFX,UAAA,CAIE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAsB,UAAU,QAAU,CAAA,EAC9B,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,cACU,CAAA,CACN;;GACV,kBAAC,GAAD;IACE,UAAU,CAAC,EAAkB,kBAAkB,GAAkB,CAAW;IAC5E,SAAS;IAFX,UAAA,CAIE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAiB,UAAU,QAAU,CAAA,EACzB,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,uBACU,CAAA,CACN;;GACV,kBAAC,GAAD;IACE,UAAU,CAAC,EAAkB,uBAAuB,GAAkB,CAAW;IACjF,SAAS;IAFX,UAAA,CAIE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAoB,UAAU,QAAU,CAAA,EAC5B,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,4BACU,CAAA,CACN;;GACV,kBAAC,GAAD;IACE,UAAU,CAAC,EAAkB,mBAAmB,GAAkB,CAAW;IAC7E,SAAS;IAFX,UAAA,CAIE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAkB,UAAU,QAAU,CAAA,EAC1B,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,mCACU,CAAA,CACN;;EACN;;AAEV"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/ContextMenu/ContextMenu.tsx"],"sourcesContent":["import type { PopoverPosition } from '@mui/material';\nimport {\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n} from '@mui/material';\nimport PlaylistAddCheckIcon from '@mui/icons-material/PlaylistAddCheck';\nimport PlaylistAddIcon from '@mui/icons-material/PlaylistAdd';\nimport PlaylistRemoveIcon from '@mui/icons-material/PlaylistRemove';\nimport PlaylistPlayIcon from '@mui/icons-material/PlaylistPlay';\nimport type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useMemo,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\n\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CaseSelectionUtil } from '../../../utils/CaseSelectionUtil';\n\nexport type ContextMenuConfigWithAnchor = {\n anchorElement?: Element;\n mouseEvent?: MouseEvent;\n parseIdsFromAnchorElement?: (element: Element) => string[];\n};\n\nexport type ContextMenuConfigWithPosition = {\n caseIds?: string[];\n mouseEvent?: MouseEvent;\n position?: PopoverPosition;\n};\n\nexport type ContextMenuProps = {\n readonly config: ContextMenuConfig;\n readonly getExtraItems?: (onMenuClose?: () => void) => ReactElement;\n readonly onMenuClose: () => void;\n};\n\ntype ContextMenuConfig = ContextMenuConfigWithAnchor & ContextMenuConfigWithPosition;\n\nexport const ContextMenu = ({ config, getExtraItems, onMenuClose }: ContextMenuProps) => {\n const { t } = useTranslation();\n const dashboardStore = use(DashboardStoreContext);\n const selectedIds = useStore(dashboardStore, (state) => state.selectedIds);\n const setSelectedIds = useStore(dashboardStore, (state) => state.setSelectedIds);\n\n const componentCaseIds = useMemo(() => {\n if (config?.parseIdsFromAnchorElement) {\n return config.parseIdsFromAnchorElement(config.anchorElement);\n }\n if (config?.caseIds) {\n return config.caseIds;\n }\n return [];\n }, [config]);\n\n useEffect(() => {\n const mouseEvent = config?.mouseEvent;\n if (!mouseEvent || (!mouseEvent.metaKey && !mouseEvent.ctrlKey)) {\n return;\n }\n if (CaseSelectionUtil.canAddToSelection(componentCaseIds, selectedIds)) {\n setSelectedIds(CaseSelectionUtil.addComponentCaseIdsToSelection(componentCaseIds, selectedIds));\n onMenuClose();\n return;\n }\n if (CaseSelectionUtil.canRemoveFromSelection(componentCaseIds, selectedIds)) {\n setSelectedIds(CaseSelectionUtil.removeComponentCaseIdsFromSelection(componentCaseIds, selectedIds));\n onMenuClose();\n return;\n }\n }, [componentCaseIds, config?.mouseEvent, selectedIds, setSelectedIds, onMenuClose]);\n\n\n const onMenuSelectClick = useCallback(() => {\n setSelectedIds(componentCaseIds);\n onMenuClose();\n }, [componentCaseIds, onMenuClose, setSelectedIds]);\n\n const onAddToSelectionMenuItemClick = useCallback(() => {\n setSelectedIds(CaseSelectionUtil.addComponentCaseIdsToSelection(componentCaseIds, selectedIds));\n onMenuClose();\n }, [componentCaseIds, onMenuClose, setSelectedIds, selectedIds]);\n\n const onRemoveFromSelectionMenuItemClick = useCallback(() => {\n setSelectedIds(CaseSelectionUtil.removeComponentCaseIdsFromSelection(componentCaseIds, selectedIds));\n onMenuClose();\n }, [componentCaseIds, onMenuClose, setSelectedIds, selectedIds]);\n\n const onRefineSelectionMenuItemClick = useCallback(() => {\n setSelectedIds(CaseSelectionUtil.refineSelectionWithComponentCaseIds(componentCaseIds, selectedIds));\n onMenuClose();\n }, [componentCaseIds, onMenuClose, setSelectedIds, selectedIds]);\n\n const extraItems = getExtraItems ? getExtraItems(onMenuClose) : null;\n\n return (\n <Menu\n anchorEl={config?.anchorElement}\n anchorPosition={config?.position}\n anchorReference={config?.anchorElement ? 'anchorEl' : 'anchorPosition'}\n onClose={onMenuClose}\n open={!!config}\n >\n {extraItems}\n <MenuItem\n disabled={componentCaseIds.length === 0}\n onClick={onMenuSelectClick}\n >\n <ListItemIcon>\n <PlaylistAddCheckIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Select rows`}\n </ListItemText>\n </MenuItem>\n <MenuItem\n disabled={!CaseSelectionUtil.canAddToSelection(componentCaseIds, selectedIds)}\n onClick={onAddToSelectionMenuItemClick}\n >\n <ListItemIcon>\n <PlaylistAddIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Add to selected rows`}\n </ListItemText>\n </MenuItem>\n <MenuItem\n disabled={!CaseSelectionUtil.canRemoveFromSelection(componentCaseIds, selectedIds)}\n onClick={onRemoveFromSelectionMenuItemClick}\n >\n <ListItemIcon>\n <PlaylistRemoveIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Remove from selected rows`}\n </ListItemText>\n </MenuItem>\n <MenuItem\n disabled={!CaseSelectionUtil.canRefineSelection(componentCaseIds, selectedIds)}\n onClick={onRefineSelectionMenuItemClick}\n >\n <ListItemIcon>\n <PlaylistPlayIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Refine selected rows (intersect)`}\n </ListItemText>\n </MenuItem>\n </Menu>\n );\n};\n"],"mappings":";;;;;;;;;;;;AA4CA,IAAa,KAAe,EAAE,WAAQ,kBAAe,qBAAoC;CACvF,IAAM,EAAE,SAAM,EAAe,GACvB,IAAiB,EAAI,CAAqB,GAC1C,IAAc,EAAS,IAAiB,MAAU,EAAM,WAAW,GACnE,IAAiB,EAAS,IAAiB,MAAU,EAAM,cAAc,GAEzE,IAAmB,QACnB,GAAQ,4BACH,EAAO,0BAA0B,EAAO,aAAa,IAE1D,GAAQ,UACH,EAAO,UAET,CAAC,GACP,CAAC,CAAM,CAAC;CAEX,QAAgB;EACd,IAAM,IAAa,GAAQ;EACvB,IAAC,MAAgB,EAAW,WAAY,EAAW,UAGvD;OAAI,EAAkB,kBAAkB,GAAkB,CAAW,GAAG;IAEtE,AADA,EAAe,EAAkB,+BAA+B,GAAkB,CAAW,CAAC,GAC9F,EAAY;IACZ;GACF;GACA,IAAI,EAAkB,uBAAuB,GAAkB,CAAW,GAAG;IAE3E,AADA,EAAe,EAAkB,oCAAoC,GAAkB,CAAW,CAAC,GACnG,EAAY;IACZ;GACF;EALA;CAMF,GAAG;EAAC;EAAkB,GAAQ;EAAY;EAAa;EAAgB;CAAW,CAAC;CAGnF,IAAM,IAAoB,QAAkB;EAE1C,AADA,EAAe,CAAgB,GAC/B,EAAY;CACd,GAAG;EAAC;EAAkB;EAAa;CAAc,CAAC,GAE5C,IAAgC,QAAkB;EAEtD,AADA,EAAe,EAAkB,+BAA+B,GAAkB,CAAW,CAAC,GAC9F,EAAY;CACd,GAAG;EAAC;EAAkB;EAAa;EAAgB;CAAW,CAAC,GAEzD,IAAqC,QAAkB;EAE3D,AADA,EAAe,EAAkB,oCAAoC,GAAkB,CAAW,CAAC,GACnG,EAAY;CACd,GAAG;EAAC;EAAkB;EAAa;EAAgB;CAAW,CAAC,GAEzD,IAAiC,QAAkB;EAEvD,AADA,EAAe,EAAkB,oCAAoC,GAAkB,CAAW,CAAC,GACnG,EAAY;CACd,GAAG;EAAC;EAAkB;EAAa;EAAgB;CAAW,CAAC,GAEzD,IAAa,IAAgB,EAAc,CAAW,IAAI;CAEhE,OACE,kBAAC,GAAD;EACE,UAAU,GAAQ;EAClB,gBAAgB,GAAQ;EACxB,iBAAiB,GAAQ,gBAAgB,aAAa;EACtD,SAAS;EACT,MAAM,CAAC,CAAC;EALV,UAAA;GAOG;GACD,kBAAC,GAAD;IACE,UAAU,EAAiB,WAAW;IACtC,SAAS;IAFX,UAAA,CAIE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAsB,UAAU,QAAU,CAAA,EAC9B,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,cACU,CAAA,CACN;;GACV,kBAAC,GAAD;IACE,UAAU,CAAC,EAAkB,kBAAkB,GAAkB,CAAW;IAC5E,SAAS;IAFX,UAAA,CAIE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAiB,UAAU,QAAU,CAAA,EACzB,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,uBACU,CAAA,CACN;;GACV,kBAAC,GAAD;IACE,UAAU,CAAC,EAAkB,uBAAuB,GAAkB,CAAW;IACjF,SAAS;IAFX,UAAA,CAIE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAoB,UAAU,QAAU,CAAA,EAC5B,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,4BACU,CAAA,CACN;;GACV,kBAAC,GAAD;IACE,UAAU,CAAC,EAAkB,mBAAmB,GAAkB,CAAW;IAC7E,SAAS;IAFX,UAAA,CAIE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAkB,UAAU,QAAU,CAAA,EAC1B,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,mCACU,CAAA,CACN;;EACN;;AAEV"}
@@ -83,7 +83,7 @@ var D = S(({ onActionsChange: S, onClose: D, onTitleChange: O, openProps: k }) =
83
83
  k.completeCaseType,
84
84
  B
85
85
  ]), _(() => {
86
- N.isLoading || !q?.length || q?.length === 1 && B("create_in_data_collection_id", q[0].value);
86
+ !N.isLoading && q?.length && q?.length === 1 && B("create_in_data_collection_id", q[0].value);
87
87
  }, [
88
88
  q,
89
89
  N.isLoading,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/CreateEventDialog/CreateEventDialog.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useId,\n useMemo,\n} from 'react';\nimport type { ReactElement } from 'react';\nimport SaveIcon from '@mui/icons-material/Save';\nimport { useTranslation } from 'react-i18next';\nimport {\n array,\n boolean,\n object,\n string,\n} from 'yup';\nimport {\n useForm,\n useWatch,\n} from 'react-hook-form';\nimport type { Resolver } from 'react-hook-form';\nimport { yupResolver } from '@hookform/resolvers/yup';\nimport {\n Alert,\n Box,\n} from '@mui/material';\nimport type {\n CaseDbCase,\n CaseDbCaseSet,\n CaseDbCompleteCaseType,\n} from '@gen-epix/api-casedb';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport type { DialogAction } from '@gen-epix/ui-core-components/components/Dialog';\nimport type {\n WithDialogRefMethods,\n WithDialogRenderProps,\n} from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { LoadableUtil } from '@gen-epix/ui-client-common/utils/LoadableUtil';\nimport { QueryClientService } from '@gen-epix/ui-client-common/classes/services/QueryClientService';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useCreateMutation } from '@gen-epix/ui-client-common/hooks/useCreateMutation';\nimport { useItemQuery } from '@gen-epix/ui-client-common/hooks/useItemQuery';\nimport { withDialog } from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\nimport { GenericForm } from '@gen-epix/ui-core-form/components/helpers/GenericForm';\nimport type {\n AutoCompleteOption,\n FormFieldDefinition,\n} from '@gen-epix/ui-core-form/models/form';\nimport { FORM_FIELD_DEFINITION_TYPE } from '@gen-epix/ui-core-form/models/form';\nimport { SchemaUtil } from '@gen-epix/ui-core-form/utils/SchemaUtil';\n\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { useCaseSetCategoryOptionsQuery } from '../../../dataHooks/useCaseSetCategoriesQuery';\nimport { useCaseSetStatusOptionsQuery } from '../../../dataHooks/useCaseSetStatusesQuery';\nimport { useCaseTypeOptionsQuery } from '../../../dataHooks/useCaseTypesQuery';\nimport { useDataCollectionOptionsQuery } from '../../../dataHooks/useDataCollectionsQuery';\nimport { CaseUtil } from '../../../utils/CaseUtil';\nimport { CasesAlreadyInCaseSetWarning } from '../CasesAlreadyInCaseSetWarning';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\n\nimport { CreateEventDialogSuccessNotificationMessage } from './CreateEventDialogSuccessNotificationMessage';\n\nexport interface CreateEventDialogOpenProps {\n readonly completeCaseType?: CaseDbCompleteCaseType;\n readonly rows?: CaseDbCase[];\n}\n\nexport interface CreateEventDialogProps extends WithDialogRenderProps<CreateEventDialogOpenProps> {\n}\n\nexport type CreateEventDialogRefMethods = WithDialogRefMethods<CreateEventDialogProps, CreateEventDialogOpenProps>;\n\ntype FormFields = {\n case_set_category_id: string;\n case_set_status_id: string;\n case_type_id: string;\n code: string;\n create_in_data_collection_id: string;\n description: string;\n name: string;\n share_in_data_collection_ids: string[];\n shouldApplySharingToCases: boolean;\n};\n\nexport const CreateEventDialog = withDialog<CreateEventDialogProps, CreateEventDialogOpenProps>((\n {\n onActionsChange,\n onClose,\n onTitleChange,\n openProps,\n }: CreateEventDialogProps,\n): ReactElement => {\n const caseTypeOptionsQuery = useCaseTypeOptionsQuery();\n const caseSetCategoryOptionsQuery = useCaseSetCategoryOptionsQuery();\n const caseSetStatusOptionsQuery = useCaseSetStatusOptionsQuery();\n const dataCollectionOptionsQuery = useDataCollectionOptionsQuery();\n const { t } = useTranslation();\n const formId = useId();\n\n const schema = useMemo(() => object<FormFields>().shape({\n case_set_category_id: string().uuid4().required(),\n case_set_status_id: string().uuid4().required(),\n case_type_id: string().uuid4().required(),\n code: SchemaUtil.code,\n create_in_data_collection_id: string().uuid4().required(),\n description: SchemaUtil.description.required(),\n name: SchemaUtil.name,\n share_in_data_collection_ids: array().of(string().uuid4()),\n shouldApplySharingToCases: boolean().required(),\n }), []);\n\n const formMethods = useForm<FormFields>({\n resolver: yupResolver(schema) as Resolver<FormFields>,\n values: {\n case_set_category_id: null,\n case_set_status_id: null,\n case_type_id: openProps.completeCaseType?.id ?? null,\n code: '',\n create_in_data_collection_id: null,\n description: '',\n name: openProps.completeCaseType ? t('New {{eventName}} event', { eventName: openProps.completeCaseType.name }) : '',\n share_in_data_collection_ids: [],\n shouldApplySharingToCases: true,\n },\n });\n const { control, handleSubmit, setValue } = formMethods;\n\n const { case_type_id: userSelectedCaseTypeId, create_in_data_collection_id: createdInDataCollectionId, share_in_data_collection_ids: sharedInDataCollectionIds } = useWatch({ control });\n\n const sanitizedCompleteCaseTypeId = openProps.completeCaseType?.id ?? userSelectedCaseTypeId;\n\n const { data: loadedCompleteCaseType, error: completeCaseTypeError, isLoading: isCompleteCaseTypeLoading } = useItemQuery({\n baseQueryKey: CASEDB_QUERY_KEY.COMPLETE_CASE_TYPES,\n itemId: sanitizedCompleteCaseTypeId,\n useQueryOptions: {\n enabled: !openProps.completeCaseType && !!sanitizedCompleteCaseTypeId,\n queryFn: async ({ signal }) => {\n return (await CaseDbCaseApi.getInstance().completeCaseTypesGetOne(sanitizedCompleteCaseTypeId, { signal })).data;\n },\n },\n });\n\n const completeCaseType = openProps.completeCaseType ?? loadedCompleteCaseType;\n\n const createInDataCollectionOptions = useMemo<AutoCompleteOption[]>(() => {\n if (!completeCaseType || !dataCollectionOptionsQuery.options?.length) {\n return [];\n }\n return dataCollectionOptionsQuery.options.filter(option => {\n const dataCollectionId = option.value;\n return completeCaseType.case_type_access_abacs[dataCollectionId]?.is_private && completeCaseType.case_type_access_abacs[dataCollectionId]?.add_case_set;\n });\n }, [completeCaseType, dataCollectionOptionsQuery.options]);\n\n const shareInDataCollectionOptions = useMemo<AutoCompleteOption[]>(() => {\n if (!completeCaseType) {\n return [];\n }\n return dataCollectionOptionsQuery.options.filter(option => {\n const dataCollectionId = option.value;\n return createdInDataCollectionId !== dataCollectionId && completeCaseType.case_type_access_abacs[dataCollectionId]?.add_case_set;\n });\n }, [completeCaseType, createdInDataCollectionId, dataCollectionOptionsQuery.options]);\n\n useEffect(() => {\n // Validate if the createdInDataCollectionId is in the shareInDataCollectionIds\n // If it is, remove it from the shareInDataCollectionIds\n if (sharedInDataCollectionIds?.length && sharedInDataCollectionIds.includes(createdInDataCollectionId)) {\n setValue('share_in_data_collection_ids', sharedInDataCollectionIds.filter(id => id !== createdInDataCollectionId));\n }\n }, [createdInDataCollectionId, setValue, sharedInDataCollectionIds]);\n\n useEffect(() => {\n if (openProps.completeCaseType) {\n return;\n }\n setValue('create_in_data_collection_id', null);\n setValue('share_in_data_collection_ids', []);\n }, [completeCaseType, openProps.completeCaseType, setValue]);\n\n useEffect(() => {\n if (dataCollectionOptionsQuery.isLoading || !createInDataCollectionOptions?.length) {\n return;\n }\n\n if (createInDataCollectionOptions?.length === 1) {\n setValue('create_in_data_collection_id', createInDataCollectionOptions[0].value as string);\n }\n }, [createInDataCollectionOptions, dataCollectionOptionsQuery.isLoading, setValue]);\n\n\n const formFieldDefinitions = useMemo<FormFieldDefinition<FormFields>[]>(() => {\n return [\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n disabled: !!openProps.completeCaseType,\n label: t`Case type`,\n loading: caseTypeOptionsQuery.isLoading,\n name: 'case_type_id',\n options: caseTypeOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n label: t`Create in data collection`,\n loading: dataCollectionOptionsQuery.isLoading || isCompleteCaseTypeLoading,\n name: 'create_in_data_collection_id',\n options: createInDataCollectionOptions,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n label: t`Share in data collections`,\n loading: dataCollectionOptionsQuery.isLoading || isCompleteCaseTypeLoading,\n multiple: true,\n name: 'share_in_data_collection_ids',\n options: shareInDataCollectionOptions,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.BOOLEAN,\n disabled: sharedInDataCollectionIds.length === 0 || !openProps.rows?.length,\n label: t`Should the same sharing be applied to the cases in the event?`,\n loading: dataCollectionOptionsQuery.isLoading || isCompleteCaseTypeLoading,\n name: 'shouldApplySharingToCases',\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.TEXTFIELD,\n label: t`Event name`,\n name: 'name',\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.TEXTFIELD,\n label: t`Event code`,\n name: 'code',\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.RICH_TEXT,\n label: t`Description`,\n name: 'description',\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n label: t`Category`,\n loading: caseSetCategoryOptionsQuery.isLoading,\n name: 'case_set_category_id',\n options: caseSetCategoryOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n label: t`Status`,\n loading: caseSetStatusOptionsQuery.isLoading,\n name: 'case_set_status_id',\n options: caseSetStatusOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n ] as const;\n }, [caseSetCategoryOptionsQuery.isLoading, caseSetCategoryOptionsQuery.options, caseSetStatusOptionsQuery.isLoading, caseSetStatusOptionsQuery.options, caseTypeOptionsQuery.isLoading, caseTypeOptionsQuery.options, createInDataCollectionOptions, dataCollectionOptionsQuery.isLoading, isCompleteCaseTypeLoading, openProps.completeCaseType, openProps.rows?.length, shareInDataCollectionOptions, sharedInDataCollectionIds.length, t]);\n\n const loadables = useArray([\n caseTypeOptionsQuery,\n caseSetCategoryOptionsQuery,\n caseSetStatusOptionsQuery,\n dataCollectionOptionsQuery,\n ]);\n\n\n const isLoading = LoadableUtil.isSomeLoading(loadables);\n\n const onSuccess = useCallback(async (item: CaseDbCaseSet, variables: FormFields) => {\n if (variables.shouldApplySharingToCases) {\n await CaseUtil.applyDataCollectionLinks({\n caseIds: openProps.rows ? openProps.rows.map(row => row.id) : undefined,\n caseSetDataCollectionIds: variables.share_in_data_collection_ids,\n caseSetId: item.id,\n caseTypeId: completeCaseType.id,\n });\n }\n EventBusService.getInstance().emit('onEventCreated');\n onClose();\n }, [completeCaseType?.id, onClose, openProps.rows]);\n\n const onError = useCallback(() => {\n EventBusService.getInstance().emit('onEventCreated');\n onClose();\n }, [onClose]);\n\n const { isMutating: isCreating, mutate: mutateCreate } = useCreateMutation<CaseDbCaseSet, FormFields>({\n associationQueryKeys: [\n ...QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.CASE_SETS]),\n ...QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.CASE_SET_MEMBERS], true),\n ...QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.DATA_COLLECTION_SET_MEMBERS], true),\n ],\n getErrorNotificationMessage: (item, _error) => t('Failed to create event: {{name}}', { name: item.name }),\n getProgressNotificationMessage: (variables) => t('Creating event: {{name}}...', { name: variables.name }),\n getSuccessNotificationMessage: (item) => (\n <CreateEventDialogSuccessNotificationMessage\n caseSet={item}\n isCreating\n />\n ),\n onError,\n onSuccess,\n queryFn: async (formData: FormFields): Promise<CaseDbCaseSet> => {\n const caseSetResult = (await CaseDbCaseApi.getInstance().createCaseSet({\n case_ids: openProps.rows?.map(row => row.id) ?? [],\n case_set: {\n case_set_category_id: formData.case_set_category_id,\n case_set_status_id: formData.case_set_status_id,\n case_type_id: formData.case_type_id,\n code: formData.code,\n created_in_data_collection_id: formData.create_in_data_collection_id,\n description: formData.description,\n name: formData.name,\n },\n data_collection_ids: formData.share_in_data_collection_ids,\n })).data;\n\n return caseSetResult;\n },\n resourceQueryKey: QueryClientService.getInstance().getGenericKey(CASEDB_QUERY_KEY.CASE_SETS),\n });\n\n const isFormDisabled = useMemo(() => {\n return isLoading || caseTypeOptionsQuery.options?.length === 0 || dataCollectionOptionsQuery.options?.length === 0;\n }, [isLoading, caseTypeOptionsQuery.options?.length, dataCollectionOptionsQuery.options?.length]);\n\n useEffect(() => {\n const actions: DialogAction[] = [];\n if (isLoading || !isFormDisabled) {\n actions.push({\n ...TestIdUtil.createAttributes('CreateEventDialog-saveButton'),\n autoFocus: true,\n color: 'secondary',\n disabled: isLoading || isCreating,\n form: formId,\n label: t`Save`,\n loading: isLoading,\n startIcon: <SaveIcon />,\n type: 'submit',\n variant: 'contained',\n });\n }\n onActionsChange(actions);\n }, [formId, isCreating, isLoading, onActionsChange, t, caseTypeOptionsQuery.options?.length, isFormDisabled]);\n\n const onFormSubmit = useCallback((formData: FormFields) => {\n mutateCreate(formData);\n }, [mutateCreate]);\n\n useEffect(() => {\n if (openProps.completeCaseType) {\n if (openProps.rows?.length) {\n onTitleChange(t('Create new event from {{numCases}} selected {{caseTypeName}} cases', { caseTypeName: openProps.completeCaseType.name, numCases: openProps.rows.length }));\n } else {\n onTitleChange(t('Create event'));\n }\n } else {\n onTitleChange(t('Create event'));\n }\n }, [onTitleChange, openProps, t]);\n\n return (\n <ResponseHandler\n error={completeCaseTypeError}\n inlineSpinner\n isLoading={isCreating}\n loadables={loadables}\n >\n {isFormDisabled ? (\n <Box>\n <Alert severity={'error'}>\n {t`You do not have the required permissions to create an event. Contact your organization administrator for assistance.`}\n </Alert>\n </Box>\n ) : (\n <GenericForm<FormFields>\n disableAll={isFormDisabled}\n formFieldDefinitions={formFieldDefinitions}\n formId={formId}\n formMethods={formMethods}\n onSubmit={handleSubmit(onFormSubmit)}\n schema={schema}\n />\n )}\n {openProps.rows?.length > 0 && (\n <CasesAlreadyInCaseSetWarning\n cases={openProps.rows}\n />\n )}\n </ResponseHandler>\n );\n}, {\n fullWidth: true,\n maxWidth: 'lg',\n testId: 'CreateEventDialog',\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/CreateEventDialog/CreateEventDialog.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useId,\n useMemo,\n} from 'react';\nimport type { ReactElement } from 'react';\nimport SaveIcon from '@mui/icons-material/Save';\nimport { useTranslation } from 'react-i18next';\nimport {\n array,\n boolean,\n object,\n string,\n} from 'yup';\nimport {\n useForm,\n useWatch,\n} from 'react-hook-form';\nimport type { Resolver } from 'react-hook-form';\nimport { yupResolver } from '@hookform/resolvers/yup';\nimport {\n Alert,\n Box,\n} from '@mui/material';\nimport type {\n CaseDbCase,\n CaseDbCaseSet,\n CaseDbCompleteCaseType,\n} from '@gen-epix/api-casedb';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport type { DialogAction } from '@gen-epix/ui-core-components/components/Dialog';\nimport type {\n WithDialogRefMethods,\n WithDialogRenderProps,\n} from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { LoadableUtil } from '@gen-epix/ui-client-common/utils/LoadableUtil';\nimport { QueryClientService } from '@gen-epix/ui-client-common/classes/services/QueryClientService';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useCreateMutation } from '@gen-epix/ui-client-common/hooks/useCreateMutation';\nimport { useItemQuery } from '@gen-epix/ui-client-common/hooks/useItemQuery';\nimport { withDialog } from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\nimport { GenericForm } from '@gen-epix/ui-core-form/components/helpers/GenericForm';\nimport type {\n AutoCompleteOption,\n FormFieldDefinition,\n} from '@gen-epix/ui-core-form/models/form';\nimport { FORM_FIELD_DEFINITION_TYPE } from '@gen-epix/ui-core-form/models/form';\nimport { SchemaUtil } from '@gen-epix/ui-core-form/utils/SchemaUtil';\n\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { useCaseSetCategoryOptionsQuery } from '../../../dataHooks/useCaseSetCategoriesQuery';\nimport { useCaseSetStatusOptionsQuery } from '../../../dataHooks/useCaseSetStatusesQuery';\nimport { useCaseTypeOptionsQuery } from '../../../dataHooks/useCaseTypesQuery';\nimport { useDataCollectionOptionsQuery } from '../../../dataHooks/useDataCollectionsQuery';\nimport { CaseUtil } from '../../../utils/CaseUtil';\nimport { CasesAlreadyInCaseSetWarning } from '../CasesAlreadyInCaseSetWarning';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\n\nimport { CreateEventDialogSuccessNotificationMessage } from './CreateEventDialogSuccessNotificationMessage';\n\nexport interface CreateEventDialogOpenProps {\n readonly completeCaseType?: CaseDbCompleteCaseType;\n readonly rows?: CaseDbCase[];\n}\n\nexport interface CreateEventDialogProps extends WithDialogRenderProps<CreateEventDialogOpenProps> {\n}\n\nexport type CreateEventDialogRefMethods = WithDialogRefMethods<CreateEventDialogProps, CreateEventDialogOpenProps>;\n\ntype FormFields = {\n case_set_category_id: string;\n case_set_status_id: string;\n case_type_id: string;\n code: string;\n create_in_data_collection_id: string;\n description: string;\n name: string;\n share_in_data_collection_ids: string[];\n shouldApplySharingToCases: boolean;\n};\n\nexport const CreateEventDialog = withDialog<CreateEventDialogProps, CreateEventDialogOpenProps>((\n {\n onActionsChange,\n onClose,\n onTitleChange,\n openProps,\n }: CreateEventDialogProps,\n): ReactElement => {\n const caseTypeOptionsQuery = useCaseTypeOptionsQuery();\n const caseSetCategoryOptionsQuery = useCaseSetCategoryOptionsQuery();\n const caseSetStatusOptionsQuery = useCaseSetStatusOptionsQuery();\n const dataCollectionOptionsQuery = useDataCollectionOptionsQuery();\n const { t } = useTranslation();\n const formId = useId();\n\n const schema = useMemo(() => object<FormFields>().shape({\n case_set_category_id: string().uuid4().required(),\n case_set_status_id: string().uuid4().required(),\n case_type_id: string().uuid4().required(),\n code: SchemaUtil.code,\n create_in_data_collection_id: string().uuid4().required(),\n description: SchemaUtil.description.required(),\n name: SchemaUtil.name,\n share_in_data_collection_ids: array().of(string().uuid4()),\n shouldApplySharingToCases: boolean().required(),\n }), []);\n\n const formMethods = useForm<FormFields>({\n resolver: yupResolver(schema) as Resolver<FormFields>,\n values: {\n case_set_category_id: null,\n case_set_status_id: null,\n case_type_id: openProps.completeCaseType?.id ?? null,\n code: '',\n create_in_data_collection_id: null,\n description: '',\n name: openProps.completeCaseType ? t('New {{eventName}} event', { eventName: openProps.completeCaseType.name }) : '',\n share_in_data_collection_ids: [],\n shouldApplySharingToCases: true,\n },\n });\n const { control, handleSubmit, setValue } = formMethods;\n\n const { case_type_id: userSelectedCaseTypeId, create_in_data_collection_id: createdInDataCollectionId, share_in_data_collection_ids: sharedInDataCollectionIds } = useWatch({ control });\n\n const sanitizedCompleteCaseTypeId = openProps.completeCaseType?.id ?? userSelectedCaseTypeId;\n\n const { data: loadedCompleteCaseType, error: completeCaseTypeError, isLoading: isCompleteCaseTypeLoading } = useItemQuery({\n baseQueryKey: CASEDB_QUERY_KEY.COMPLETE_CASE_TYPES,\n itemId: sanitizedCompleteCaseTypeId,\n useQueryOptions: {\n enabled: !openProps.completeCaseType && !!sanitizedCompleteCaseTypeId,\n queryFn: async ({ signal }) => {\n return (await CaseDbCaseApi.getInstance().completeCaseTypesGetOne(sanitizedCompleteCaseTypeId, { signal })).data;\n },\n },\n });\n\n const completeCaseType = openProps.completeCaseType ?? loadedCompleteCaseType;\n\n const createInDataCollectionOptions = useMemo<AutoCompleteOption[]>(() => {\n if (!completeCaseType || !dataCollectionOptionsQuery.options?.length) {\n return [];\n }\n return dataCollectionOptionsQuery.options.filter(option => {\n const dataCollectionId = option.value;\n return completeCaseType.case_type_access_abacs[dataCollectionId]?.is_private && completeCaseType.case_type_access_abacs[dataCollectionId]?.add_case_set;\n });\n }, [completeCaseType, dataCollectionOptionsQuery.options]);\n\n const shareInDataCollectionOptions = useMemo<AutoCompleteOption[]>(() => {\n if (!completeCaseType) {\n return [];\n }\n return dataCollectionOptionsQuery.options.filter(option => {\n const dataCollectionId = option.value;\n return createdInDataCollectionId !== dataCollectionId && completeCaseType.case_type_access_abacs[dataCollectionId]?.add_case_set;\n });\n }, [completeCaseType, createdInDataCollectionId, dataCollectionOptionsQuery.options]);\n\n useEffect(() => {\n // Validate if the createdInDataCollectionId is in the shareInDataCollectionIds\n // If it is, remove it from the shareInDataCollectionIds\n if (sharedInDataCollectionIds?.length && sharedInDataCollectionIds.includes(createdInDataCollectionId)) {\n setValue('share_in_data_collection_ids', sharedInDataCollectionIds.filter(id => id !== createdInDataCollectionId));\n }\n }, [createdInDataCollectionId, setValue, sharedInDataCollectionIds]);\n\n useEffect(() => {\n if (openProps.completeCaseType) {\n return;\n }\n setValue('create_in_data_collection_id', null);\n setValue('share_in_data_collection_ids', []);\n }, [completeCaseType, openProps.completeCaseType, setValue]);\n\n useEffect(() => {\n if (dataCollectionOptionsQuery.isLoading || !createInDataCollectionOptions?.length) {\n return;\n }\n\n if (createInDataCollectionOptions?.length === 1) {\n setValue('create_in_data_collection_id', createInDataCollectionOptions[0].value as string);\n }\n }, [createInDataCollectionOptions, dataCollectionOptionsQuery.isLoading, setValue]);\n\n\n const formFieldDefinitions = useMemo<FormFieldDefinition<FormFields>[]>(() => {\n return [\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n disabled: !!openProps.completeCaseType,\n label: t`Case type`,\n loading: caseTypeOptionsQuery.isLoading,\n name: 'case_type_id',\n options: caseTypeOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n label: t`Create in data collection`,\n loading: dataCollectionOptionsQuery.isLoading || isCompleteCaseTypeLoading,\n name: 'create_in_data_collection_id',\n options: createInDataCollectionOptions,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n label: t`Share in data collections`,\n loading: dataCollectionOptionsQuery.isLoading || isCompleteCaseTypeLoading,\n multiple: true,\n name: 'share_in_data_collection_ids',\n options: shareInDataCollectionOptions,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.BOOLEAN,\n disabled: sharedInDataCollectionIds.length === 0 || !openProps.rows?.length,\n label: t`Should the same sharing be applied to the cases in the event?`,\n loading: dataCollectionOptionsQuery.isLoading || isCompleteCaseTypeLoading,\n name: 'shouldApplySharingToCases',\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.TEXTFIELD,\n label: t`Event name`,\n name: 'name',\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.TEXTFIELD,\n label: t`Event code`,\n name: 'code',\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.RICH_TEXT,\n label: t`Description`,\n name: 'description',\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n label: t`Category`,\n loading: caseSetCategoryOptionsQuery.isLoading,\n name: 'case_set_category_id',\n options: caseSetCategoryOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n label: t`Status`,\n loading: caseSetStatusOptionsQuery.isLoading,\n name: 'case_set_status_id',\n options: caseSetStatusOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n ] as const;\n }, [caseSetCategoryOptionsQuery.isLoading, caseSetCategoryOptionsQuery.options, caseSetStatusOptionsQuery.isLoading, caseSetStatusOptionsQuery.options, caseTypeOptionsQuery.isLoading, caseTypeOptionsQuery.options, createInDataCollectionOptions, dataCollectionOptionsQuery.isLoading, isCompleteCaseTypeLoading, openProps.completeCaseType, openProps.rows?.length, shareInDataCollectionOptions, sharedInDataCollectionIds.length, t]);\n\n const loadables = useArray([\n caseTypeOptionsQuery,\n caseSetCategoryOptionsQuery,\n caseSetStatusOptionsQuery,\n dataCollectionOptionsQuery,\n ]);\n\n\n const isLoading = LoadableUtil.isSomeLoading(loadables);\n\n const onSuccess = useCallback(async (item: CaseDbCaseSet, variables: FormFields) => {\n if (variables.shouldApplySharingToCases) {\n await CaseUtil.applyDataCollectionLinks({\n caseIds: openProps.rows ? openProps.rows.map(row => row.id) : undefined,\n caseSetDataCollectionIds: variables.share_in_data_collection_ids,\n caseSetId: item.id,\n caseTypeId: completeCaseType.id,\n });\n }\n EventBusService.getInstance().emit('onEventCreated');\n onClose();\n }, [completeCaseType?.id, onClose, openProps.rows]);\n\n const onError = useCallback(() => {\n EventBusService.getInstance().emit('onEventCreated');\n onClose();\n }, [onClose]);\n\n const { isMutating: isCreating, mutate: mutateCreate } = useCreateMutation<CaseDbCaseSet, FormFields>({\n associationQueryKeys: [\n ...QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.CASE_SETS]),\n ...QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.CASE_SET_MEMBERS], true),\n ...QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.DATA_COLLECTION_SET_MEMBERS], true),\n ],\n getErrorNotificationMessage: (item, _error) => t('Failed to create event: {{name}}', { name: item.name }),\n getProgressNotificationMessage: (variables) => t('Creating event: {{name}}...', { name: variables.name }),\n getSuccessNotificationMessage: (item) => (\n <CreateEventDialogSuccessNotificationMessage\n caseSet={item}\n isCreating\n />\n ),\n onError,\n onSuccess,\n queryFn: async (formData: FormFields): Promise<CaseDbCaseSet> => {\n const caseSetResult = (await CaseDbCaseApi.getInstance().createCaseSet({\n case_ids: openProps.rows?.map(row => row.id) ?? [],\n case_set: {\n case_set_category_id: formData.case_set_category_id,\n case_set_status_id: formData.case_set_status_id,\n case_type_id: formData.case_type_id,\n code: formData.code,\n created_in_data_collection_id: formData.create_in_data_collection_id,\n description: formData.description,\n name: formData.name,\n },\n data_collection_ids: formData.share_in_data_collection_ids,\n })).data;\n\n return caseSetResult;\n },\n resourceQueryKey: QueryClientService.getInstance().getGenericKey(CASEDB_QUERY_KEY.CASE_SETS),\n });\n\n const isFormDisabled = useMemo(() => {\n return isLoading || caseTypeOptionsQuery.options?.length === 0 || dataCollectionOptionsQuery.options?.length === 0;\n }, [isLoading, caseTypeOptionsQuery.options?.length, dataCollectionOptionsQuery.options?.length]);\n\n useEffect(() => {\n const actions: DialogAction[] = [];\n if (isLoading || !isFormDisabled) {\n actions.push({\n ...TestIdUtil.createAttributes('CreateEventDialog-saveButton'),\n autoFocus: true,\n color: 'secondary',\n disabled: isLoading || isCreating,\n form: formId,\n label: t`Save`,\n loading: isLoading,\n startIcon: <SaveIcon />,\n type: 'submit',\n variant: 'contained',\n });\n }\n onActionsChange(actions);\n }, [formId, isCreating, isLoading, onActionsChange, t, caseTypeOptionsQuery.options?.length, isFormDisabled]);\n\n const onFormSubmit = useCallback((formData: FormFields) => {\n mutateCreate(formData);\n }, [mutateCreate]);\n\n useEffect(() => {\n if (openProps.completeCaseType) {\n if (openProps.rows?.length) {\n onTitleChange(t('Create new event from {{numCases}} selected {{caseTypeName}} cases', { caseTypeName: openProps.completeCaseType.name, numCases: openProps.rows.length }));\n } else {\n onTitleChange(t('Create event'));\n }\n } else {\n onTitleChange(t('Create event'));\n }\n }, [onTitleChange, openProps, t]);\n\n return (\n <ResponseHandler\n error={completeCaseTypeError}\n inlineSpinner\n isLoading={isCreating}\n loadables={loadables}\n >\n {isFormDisabled ? (\n <Box>\n <Alert severity={'error'}>\n {t`You do not have the required permissions to create an event. Contact your organization administrator for assistance.`}\n </Alert>\n </Box>\n ) : (\n <GenericForm<FormFields>\n disableAll={isFormDisabled}\n formFieldDefinitions={formFieldDefinitions}\n formId={formId}\n formMethods={formMethods}\n onSubmit={handleSubmit(onFormSubmit)}\n schema={schema}\n />\n )}\n {openProps.rows?.length > 0 && (\n <CasesAlreadyInCaseSetWarning\n cases={openProps.rows}\n />\n )}\n </ResponseHandler>\n );\n}, {\n fullWidth: true,\n maxWidth: 'lg',\n testId: 'CreateEventDialog',\n});\n"],"mappings":"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"}
@@ -223,7 +223,7 @@ var pe = {
223
223
  Q,
224
224
  f
225
225
  ]), $ = x(async (e) => {
226
- !j || !F || !L || (await p({
226
+ j && F && L && (await p({
227
227
  [F.id]: [j.a],
228
228
  [L.id]: [j.b]
229
229
  }), e());
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/HistogramWidget/HistogramWidget.tsx"],"sourcesContent":["import {\n Box,\n ListItemIcon,\n ListItemText,\n MenuItem,\n useTheme,\n} from '@mui/material';\nimport type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { EChartsType } from 'echarts';\nimport {\n LegendComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport {\n dispose,\n getInstanceByDom,\n init,\n use as registerECharts,\n} from 'echarts/core';\nimport type { EChartsReactProps } from 'echarts-for-react';\nimport FilterAltIcon from '@mui/icons-material/FilterAlt';\nimport EChartsReact from 'echarts-for-react';\nimport type {\n CaseDbCol,\n CaseDbColType,\n} from '@gen-epix/api-casedb';\nimport type { MenuItemData } from '@gen-epix/ui-core-components/models/nestedMenu';\nimport { ConfigService } from '@gen-epix/ui-client-common/classes/services/ConfigService';\nimport { useStore } from 'zustand';\nimport { BarChart } from 'echarts/charts';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { useTranslation } from 'react-i18next';\nimport round from 'lodash/round';\nimport intersection from 'lodash/intersection';\n\nimport { DASHBOARD_COMPONENT_NAME } from '../../../constants/dashboard';\nimport type { ContextMenuConfigWithPosition } from '../ContextMenu';\nimport { ContextMenu } from '../ContextMenu';\nimport { DashboardWidget } from '../Dashboard';\nimport { WidgetUnavailable } from '../WidgetUnavailable';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { DashboardUtil } from '../../../utils/DashboardUtil';\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { CaseDbDownloadUtil } from '../../../utils/CaseDbDownloadUtil';\nimport type { HistogramWidgetData } from '../../../models/dashboard';\nimport {\n HISTOGRAM_ALLOWED_COL_TYPES,\n HistogramUtil,\n} from '../../../utils/HistogramUtil';\nimport { DashboardContext } from '../Dashboard/context/DashboardContext';\nimport { CaseUtil } from '../../../utils/CaseUtil';\n\nregisterECharts([TooltipComponent, BarChart, LegendComponent, CanvasRenderer]);\n\nconst echartsCore = {\n dispose,\n getInstanceByDom,\n init,\n};\n\nexport const HistogramWidget = () => {\n const { t } = useTranslation();\n const theme = useTheme();\n const chartRef = useRef<EChartsReact>(null);\n const chartInstanceRef = useRef<EChartsType | null>(null);\n const echartsOpts = useMemo(() => ({\n nonce: ConfigService.getInstance().config.nonce,\n }), []);\n const dashboardStore = use(DashboardStoreContext);\n const dashboardContext = use(DashboardContext);\n const completeCaseType = useStore(dashboardStore, (state) => state.completeCaseType);\n const sortedData = useStore(dashboardStore, (state) => state.sortedData);\n const setFilterValues = useStore(dashboardStore, (state) => state.setFilterValues);\n const updateWidgetData = useStore(dashboardStore, (state) => state.updateWidgetData);\n const histogramWidgetData = useStore(dashboardStore, (state) => state.getWidgetData<HistogramWidgetData>(DASHBOARD_COMPONENT_NAME.HISTOGRAM));\n const [focussedColValues, setFocussedColValues] = useState<{ a: string; b: string }>(null);\n\n const allowedColTypes = useMemo<CaseDbColType[]>(() => {\n return HISTOGRAM_ALLOWED_COL_TYPES;\n }, []);\n\n const allowedCols = useMemo(() => {\n return HistogramUtil.getAllowedCols(completeCaseType, allowedColTypes);\n }, [allowedColTypes, completeCaseType]);\n\n const [aCol, setACol] = useState<CaseDbCol | null>(histogramWidgetData.colAId ? completeCaseType?.cols[histogramWidgetData.colAId] ?? null : null);\n const [bCol, setBCol] = useState<CaseDbCol | null>(histogramWidgetData.colBId ? completeCaseType?.cols[histogramWidgetData.colBId] ?? null : null);\n\n const [contextMenuConfig, setContextMenuConfig] = useState<ContextMenuConfigWithPosition | null>(null);\n\n const onEpiContextMenuClose = useCallback(() => {\n setContextMenuConfig(null);\n setFocussedColValues(null);\n }, []);\n\n const lineListCaseCount = useMemo(() => {\n return DashboardUtil.getCaseCount(sortedData);\n }, [sortedData]);\n\n const defaultCols = useMemo(() => {\n return HistogramUtil.getDefaultCols(allowedCols, completeCaseType);\n }, [allowedCols, completeCaseType]);\n\n\n const canShowWidget = allowedCols.length > 1 && defaultCols?.newColA && defaultCols?.newColB;\n const shouldShowGraph = canShowWidget && aCol && bCol && lineListCaseCount > 0;\n\n const onMenuItemClick = useCallback((x: CaseDbCol, y: CaseDbCol) => {\n setACol(x);\n setBCol(y);\n updateWidgetData(DASHBOARD_COMPONENT_NAME.HISTOGRAM, {\n colAId: x.id,\n colBId: y.id,\n });\n }, [updateWidgetData]);\n\n\n useEffect(() => {\n if (aCol && bCol) {\n return;\n }\n if (!defaultCols) {\n return;\n }\n const { newColA, newColB } = defaultCols;\n\n setACol(newColA);\n setBCol(newColB);\n\n updateWidgetData(DASHBOARD_COMPONENT_NAME.HISTOGRAM, {\n colAId: newColA.id,\n colBId: newColB.id,\n });\n }, [aCol, allowedCols, bCol, completeCaseType, defaultCols, updateWidgetData]);\n\n const [conceptsA, conceptsB] = useMemo(() => {\n return HistogramUtil.getConcepts(aCol, bCol, completeCaseType);\n }, [aCol, bCol, completeCaseType]);\n\n const series = useMemo(() => {\n return HistogramUtil.getSeries(aCol, bCol, completeCaseType, sortedData, conceptsA, conceptsB);\n }, [aCol, bCol, completeCaseType, sortedData, conceptsA, conceptsB]);\n\n const histogramCaseCount = useMemo(() => {\n return HistogramUtil.getCaseCount(series);\n }, [series]);\n\n const missingCasesCount = lineListCaseCount - histogramCaseCount;\n const missingCasesPercentage = missingCasesCount > 0 ? round(missingCasesCount / lineListCaseCount * 100, 1) : 0;\n\n const widgetUnavailableReason = useMemo<ReactElement | string>(() => {\n if (shouldShowGraph) {\n return;\n }\n if (!defaultCols || allowedCols.length < 2) {\n return t`No two compatible columns found to display a histogram.`;\n }\n if (!lineListCaseCount) {\n return t`No cases found.`;\n }\n if (!histogramCaseCount) {\n return t`No cases found with valid values for the selected columns to display a histogram.`;\n }\n return null;\n }, [allowedCols.length, defaultCols, histogramCaseCount, lineListCaseCount, shouldShowGraph, t]);\n\n const colors = useMemo(() => {\n return HistogramUtil.getColors(aCol, completeCaseType, sortedData);\n }, [completeCaseType, aCol, sortedData]);\n\n const getOptions = useCallback(() => {\n if (!shouldShowGraph) {\n return null;\n }\n\n return HistogramUtil.getChartOptions({\n aCol,\n bCol,\n colors,\n conceptsA,\n conceptsB,\n series,\n t,\n theme,\n });\n }, [shouldShowGraph, colors, theme, conceptsB, series, conceptsA, aCol, bCol, t]);\n\n const titleMenu = useMemo<MenuItemData | string>(() => {\n let label: string;\n if (aCol && bCol) {\n label = t('Histogram: {{aColLabel}} and {{bColLabel}}', { aColLabel: aCol.label, bColLabel: bCol.label });\n } else {\n label = t`Histogram`;\n }\n\n if (!defaultCols?.newColA || !defaultCols?.newColB) {\n return label;\n }\n\n const mainMenu: MenuItemData = {\n disabled: !canShowWidget || allowedCols.length < 2,\n items: [],\n label,\n };\n\n\n allowedCols.forEach(x => {\n const subMenu: MenuItemData = {\n active: aCol?.id === x.id || undefined,\n items: [],\n label: t('Grouping: {{label}}', { label: x.label }),\n };\n allowedCols.forEach(y => {\n if (x.id === y.id) {\n return;\n }\n subMenu.items.push({\n active: (aCol?.id === x.id || undefined) && (bCol?.id === y.id || undefined),\n callback: () => {\n onMenuItemClick(x, y);\n },\n label: t('X-Axis: {{label}}', { label: y.label }),\n });\n });\n mainMenu.items.push(subMenu);\n });\n\n\n return mainMenu;\n }, [aCol, bCol, canShowWidget, allowedCols, defaultCols?.newColA, defaultCols?.newColB, t, onMenuItemClick]);\n\n const onChartReady = useCallback((chart: EChartsType) => {\n chartInstanceRef.current = chart;\n if (!aCol || !bCol) {\n return;\n }\n const dom = chart.getDom();\n dom?.setAttribute('aria-label', t('Histogram showing the number of cases for {{aColLabel}} and {{bColLabel}}', { aColLabel: aCol?.label, bColLabel: bCol?.label }));\n dom?.setAttribute('role', 'img');\n }, [aCol, bCol, t]);\n\n\n useEffect(() => {\n const emitDownloadOptions = () => {\n EventBusService.getInstance().emit('onDownloadOptionsChanged', {\n disabled: !canShowWidget,\n items: [\n {\n callback: () => CaseDbDownloadUtil.downloadEchartsImage(t`Histogram`, chartRef.current.getEchartsInstance(), 'png', completeCaseType, t),\n disabled: !shouldShowGraph,\n label: t`Save as PNG`,\n },\n {\n callback: () => CaseDbDownloadUtil.downloadEchartsImage(t`Histogram`, chartRef.current.getEchartsInstance(), 'jpeg', completeCaseType, t),\n disabled: !shouldShowGraph,\n label: t`Save as JPEG`,\n },\n ],\n zone: DASHBOARD_COMPONENT_NAME.HISTOGRAM,\n zoneLabel: t`Histogram`,\n });\n };\n emitDownloadOptions();\n const eventBusManager = EventBusService.getInstance();\n eventBusManager.addEventListener('onDownloadOptionsRequested', emitDownloadOptions);\n return () => {\n eventBusManager.emit('onDownloadOptionsChanged', {\n items: null,\n zone: DASHBOARD_COMPONENT_NAME.HISTOGRAM,\n zoneLabel: t`Histogram`,\n });\n eventBusManager.removeEventListener('onDownloadOptionsRequested', emitDownloadOptions);\n };\n }, [completeCaseType, shouldShowGraph, canShowWidget, t]);\n\n const highlight = useCallback((caseIds: string[]) => {\n dashboardContext.highlight({\n caseIds,\n origin: DASHBOARD_COMPONENT_NAME.HISTOGRAM,\n });\n }, [dashboardContext]);\n\n const onEvents = useMemo<EChartsReactProps['onEvents']>(() => {\n\n const getCaseIdsFromPayload = (payload: unknown): string[] => {\n const colValues = HistogramUtil.getColValuesFromPayload(payload, conceptsA, conceptsB);\n if (!colValues) {\n return [];\n }\n const caseIds = sortedData.filter(caseDbCase => {\n const aValue = CaseUtil.getRowValue(caseDbCase.content, aCol, completeCaseType);\n const bValue = CaseUtil.getRowValue(caseDbCase.content, bCol, completeCaseType);\n return colValues.a === aValue.raw && colValues.b === bValue.raw;\n }).map(caseDbCase => caseDbCase.id);\n return caseIds;\n };\n\n return {\n globalout: () => {\n highlight([]);\n },\n mouseout: () => {\n highlight([]);\n },\n mouseover: (payload: unknown) => {\n highlight(getCaseIdsFromPayload(payload));\n },\n mouseup: (payload: unknown) => {\n const { event } = payload as { event: { event: MouseEvent } };\n setFocussedColValues(HistogramUtil.getColValuesFromPayload(payload, conceptsA, conceptsB));\n setContextMenuConfig({\n caseIds: getCaseIdsFromPayload(payload),\n mouseEvent: event.event,\n position: {\n left: (event.event).clientX,\n top: (event.event).clientY,\n },\n });\n },\n };\n }, [aCol, bCol, completeCaseType, conceptsA, conceptsB, highlight, sortedData]);\n\n const onShowOnlyFocussedColValuesMenuItemClick = useCallback(async (onMenuClose: () => void) => {\n if (!focussedColValues || !aCol || !bCol) {\n return;\n }\n await setFilterValues({\n [aCol.id]: [focussedColValues.a],\n [bCol.id]: [focussedColValues.b],\n });\n\n onMenuClose();\n }, [aCol, bCol, focussedColValues, setFilterValues]);\n\n const getEpiContextMenuExtraItems = useCallback((onMenuClose: () => void): ReactElement => {\n const conceptALabel = conceptsA.find(concept => concept.id === focussedColValues?.a)?.name;\n const conceptBLabel = conceptsB.find(concept => concept.id === focussedColValues?.b)?.name;\n if (!conceptALabel || !conceptBLabel) {\n return null;\n }\n if (!focussedColValues) {\n return null;\n }\n return (\n <MenuItem\n divider\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={async () => await onShowOnlyFocussedColValuesMenuItemClick(onMenuClose)}\n >\n <ListItemIcon>\n <FilterAltIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t('Filter (show only {{conceptALabel}} and {{conceptBLabel}})', { conceptALabel, conceptBLabel })}\n </ListItemText>\n </MenuItem>\n );\n }, [conceptsA, conceptsB, focussedColValues, onShowOnlyFocussedColValuesMenuItemClick, t]);\n\n useEffect(() => {\n const unsubscribe = dashboardContext.highlightSubject.subscribe((highlighting) => {\n if (highlighting.origin === DASHBOARD_COMPONENT_NAME.HISTOGRAM) {\n return;\n }\n const instance = chartInstanceRef.current;\n if (!instance) {\n return;\n }\n\n if (!highlighting?.caseIds?.length) {\n instance.dispatchAction({\n type: 'downplay',\n });\n return;\n }\n\n const highlightTargetsByDataIndex = new Map<number, Set<number>>();\n series?.forEach((serie, serieIndex) => {\n const castedSerie = serie as { data: unknown[]; xCaseIds: string[][] };\n castedSerie.xCaseIds?.forEach((caseIds: string[], dataIndex: number) => {\n if (intersection(caseIds, highlighting.caseIds).length) {\n const seriesIndices = highlightTargetsByDataIndex.get(dataIndex) ?? new Set<number>();\n seriesIndices.add(serieIndex);\n highlightTargetsByDataIndex.set(dataIndex, seriesIndices);\n }\n });\n });\n\n instance.dispatchAction({\n type: 'downplay',\n });\n\n const highlightBatch: Array<{ dataIndex: number; notBlur?: boolean; seriesIndex?: number }> = [];\n highlightTargetsByDataIndex.forEach((seriesIndices, dataIndex) => {\n if (seriesIndices.size === series?.length) {\n highlightBatch.push({\n dataIndex,\n });\n return;\n }\n\n seriesIndices.forEach((seriesIndex) => {\n highlightBatch.push({\n dataIndex,\n seriesIndex,\n });\n });\n });\n\n highlightBatch.forEach((target, index) => {\n if (index > 0) {\n target.notBlur = true;\n }\n });\n\n instance.dispatchAction({\n batch: highlightBatch,\n type: 'highlight',\n });\n });\n\n return () => {\n unsubscribe();\n };\n }, [dashboardContext, series]);\n\n return (\n <DashboardWidget\n expandDisabled={!canShowWidget}\n title={titleMenu}\n warningMessage={canShowWidget && histogramCaseCount > 0 && missingCasesCount > 0 ? t('Missing cases: {{missingCasesCount}} ({{missingCasesPercentage}}%)', { missingCasesCount, missingCasesPercentage }) : undefined}\n widgetName={DASHBOARD_COMPONENT_NAME.HISTOGRAM}\n >\n {!canShowWidget && (\n <WidgetUnavailable\n reason={widgetUnavailableReason}\n widgetLabel={t`histogram`}\n />\n )}\n {canShowWidget && (\n <Box\n sx={{\n height: '100%',\n position: 'relative',\n }}\n >\n {shouldShowGraph && (\n <EChartsReact\n echarts={echartsCore}\n notMerge\n onChartReady={onChartReady}\n onEvents={onEvents}\n option={getOptions()}\n opts={echartsOpts as unknown}\n ref={chartRef}\n style={{\n height: '100%',\n position: 'absolute',\n width: '100%',\n }}\n />\n )}\n <ContextMenu\n config={contextMenuConfig}\n getExtraItems={getEpiContextMenuExtraItems}\n onMenuClose={onEpiContextMenuClose}\n />\n </Box>\n )}\n </DashboardWidget>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/HistogramWidget/HistogramWidget.tsx"],"sourcesContent":["import {\n Box,\n ListItemIcon,\n ListItemText,\n MenuItem,\n useTheme,\n} from '@mui/material';\nimport type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { EChartsType } from 'echarts';\nimport {\n LegendComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport {\n dispose,\n getInstanceByDom,\n init,\n use as registerECharts,\n} from 'echarts/core';\nimport type { EChartsReactProps } from 'echarts-for-react';\nimport FilterAltIcon from '@mui/icons-material/FilterAlt';\nimport EChartsReact from 'echarts-for-react';\nimport type {\n CaseDbCol,\n CaseDbColType,\n} from '@gen-epix/api-casedb';\nimport type { MenuItemData } from '@gen-epix/ui-core-components/models/nestedMenu';\nimport { ConfigService } from '@gen-epix/ui-client-common/classes/services/ConfigService';\nimport { useStore } from 'zustand';\nimport { BarChart } from 'echarts/charts';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { useTranslation } from 'react-i18next';\nimport round from 'lodash/round';\nimport intersection from 'lodash/intersection';\n\nimport { DASHBOARD_COMPONENT_NAME } from '../../../constants/dashboard';\nimport type { ContextMenuConfigWithPosition } from '../ContextMenu';\nimport { ContextMenu } from '../ContextMenu';\nimport { DashboardWidget } from '../Dashboard';\nimport { WidgetUnavailable } from '../WidgetUnavailable';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { DashboardUtil } from '../../../utils/DashboardUtil';\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport { CaseDbDownloadUtil } from '../../../utils/CaseDbDownloadUtil';\nimport type { HistogramWidgetData } from '../../../models/dashboard';\nimport {\n HISTOGRAM_ALLOWED_COL_TYPES,\n HistogramUtil,\n} from '../../../utils/HistogramUtil';\nimport { DashboardContext } from '../Dashboard/context/DashboardContext';\nimport { CaseUtil } from '../../../utils/CaseUtil';\n\nregisterECharts([TooltipComponent, BarChart, LegendComponent, CanvasRenderer]);\n\nconst echartsCore = {\n dispose,\n getInstanceByDom,\n init,\n};\n\nexport const HistogramWidget = () => {\n const { t } = useTranslation();\n const theme = useTheme();\n const chartRef = useRef<EChartsReact>(null);\n const chartInstanceRef = useRef<EChartsType | null>(null);\n const echartsOpts = useMemo(() => ({\n nonce: ConfigService.getInstance().config.nonce,\n }), []);\n const dashboardStore = use(DashboardStoreContext);\n const dashboardContext = use(DashboardContext);\n const completeCaseType = useStore(dashboardStore, (state) => state.completeCaseType);\n const sortedData = useStore(dashboardStore, (state) => state.sortedData);\n const setFilterValues = useStore(dashboardStore, (state) => state.setFilterValues);\n const updateWidgetData = useStore(dashboardStore, (state) => state.updateWidgetData);\n const histogramWidgetData = useStore(dashboardStore, (state) => state.getWidgetData<HistogramWidgetData>(DASHBOARD_COMPONENT_NAME.HISTOGRAM));\n const [focussedColValues, setFocussedColValues] = useState<{ a: string; b: string }>(null);\n\n const allowedColTypes = useMemo<CaseDbColType[]>(() => {\n return HISTOGRAM_ALLOWED_COL_TYPES;\n }, []);\n\n const allowedCols = useMemo(() => {\n return HistogramUtil.getAllowedCols(completeCaseType, allowedColTypes);\n }, [allowedColTypes, completeCaseType]);\n\n const [aCol, setACol] = useState<CaseDbCol | null>(histogramWidgetData.colAId ? completeCaseType?.cols[histogramWidgetData.colAId] ?? null : null);\n const [bCol, setBCol] = useState<CaseDbCol | null>(histogramWidgetData.colBId ? completeCaseType?.cols[histogramWidgetData.colBId] ?? null : null);\n\n const [contextMenuConfig, setContextMenuConfig] = useState<ContextMenuConfigWithPosition | null>(null);\n\n const onEpiContextMenuClose = useCallback(() => {\n setContextMenuConfig(null);\n setFocussedColValues(null);\n }, []);\n\n const lineListCaseCount = useMemo(() => {\n return DashboardUtil.getCaseCount(sortedData);\n }, [sortedData]);\n\n const defaultCols = useMemo(() => {\n return HistogramUtil.getDefaultCols(allowedCols, completeCaseType);\n }, [allowedCols, completeCaseType]);\n\n\n const canShowWidget = allowedCols.length > 1 && defaultCols?.newColA && defaultCols?.newColB;\n const shouldShowGraph = canShowWidget && aCol && bCol && lineListCaseCount > 0;\n\n const onMenuItemClick = useCallback((x: CaseDbCol, y: CaseDbCol) => {\n setACol(x);\n setBCol(y);\n updateWidgetData(DASHBOARD_COMPONENT_NAME.HISTOGRAM, {\n colAId: x.id,\n colBId: y.id,\n });\n }, [updateWidgetData]);\n\n\n useEffect(() => {\n if (aCol && bCol) {\n return;\n }\n if (!defaultCols) {\n return;\n }\n const { newColA, newColB } = defaultCols;\n\n setACol(newColA);\n setBCol(newColB);\n\n updateWidgetData(DASHBOARD_COMPONENT_NAME.HISTOGRAM, {\n colAId: newColA.id,\n colBId: newColB.id,\n });\n }, [aCol, allowedCols, bCol, completeCaseType, defaultCols, updateWidgetData]);\n\n const [conceptsA, conceptsB] = useMemo(() => {\n return HistogramUtil.getConcepts(aCol, bCol, completeCaseType);\n }, [aCol, bCol, completeCaseType]);\n\n const series = useMemo(() => {\n return HistogramUtil.getSeries(aCol, bCol, completeCaseType, sortedData, conceptsA, conceptsB);\n }, [aCol, bCol, completeCaseType, sortedData, conceptsA, conceptsB]);\n\n const histogramCaseCount = useMemo(() => {\n return HistogramUtil.getCaseCount(series);\n }, [series]);\n\n const missingCasesCount = lineListCaseCount - histogramCaseCount;\n const missingCasesPercentage = missingCasesCount > 0 ? round(missingCasesCount / lineListCaseCount * 100, 1) : 0;\n\n const widgetUnavailableReason = useMemo<ReactElement | string>(() => {\n if (shouldShowGraph) {\n return;\n }\n if (!defaultCols || allowedCols.length < 2) {\n return t`No two compatible columns found to display a histogram.`;\n }\n if (!lineListCaseCount) {\n return t`No cases found.`;\n }\n if (!histogramCaseCount) {\n return t`No cases found with valid values for the selected columns to display a histogram.`;\n }\n return null;\n }, [allowedCols.length, defaultCols, histogramCaseCount, lineListCaseCount, shouldShowGraph, t]);\n\n const colors = useMemo(() => {\n return HistogramUtil.getColors(aCol, completeCaseType, sortedData);\n }, [completeCaseType, aCol, sortedData]);\n\n const getOptions = useCallback(() => {\n if (!shouldShowGraph) {\n return null;\n }\n\n return HistogramUtil.getChartOptions({\n aCol,\n bCol,\n colors,\n conceptsA,\n conceptsB,\n series,\n t,\n theme,\n });\n }, [shouldShowGraph, colors, theme, conceptsB, series, conceptsA, aCol, bCol, t]);\n\n const titleMenu = useMemo<MenuItemData | string>(() => {\n let label: string;\n if (aCol && bCol) {\n label = t('Histogram: {{aColLabel}} and {{bColLabel}}', { aColLabel: aCol.label, bColLabel: bCol.label });\n } else {\n label = t`Histogram`;\n }\n\n if (!defaultCols?.newColA || !defaultCols?.newColB) {\n return label;\n }\n\n const mainMenu: MenuItemData = {\n disabled: !canShowWidget || allowedCols.length < 2,\n items: [],\n label,\n };\n\n\n allowedCols.forEach(x => {\n const subMenu: MenuItemData = {\n active: aCol?.id === x.id || undefined,\n items: [],\n label: t('Grouping: {{label}}', { label: x.label }),\n };\n allowedCols.forEach(y => {\n if (x.id === y.id) {\n return;\n }\n subMenu.items.push({\n active: (aCol?.id === x.id || undefined) && (bCol?.id === y.id || undefined),\n callback: () => {\n onMenuItemClick(x, y);\n },\n label: t('X-Axis: {{label}}', { label: y.label }),\n });\n });\n mainMenu.items.push(subMenu);\n });\n\n\n return mainMenu;\n }, [aCol, bCol, canShowWidget, allowedCols, defaultCols?.newColA, defaultCols?.newColB, t, onMenuItemClick]);\n\n const onChartReady = useCallback((chart: EChartsType) => {\n chartInstanceRef.current = chart;\n if (!aCol || !bCol) {\n return;\n }\n const dom = chart.getDom();\n dom?.setAttribute('aria-label', t('Histogram showing the number of cases for {{aColLabel}} and {{bColLabel}}', { aColLabel: aCol?.label, bColLabel: bCol?.label }));\n dom?.setAttribute('role', 'img');\n }, [aCol, bCol, t]);\n\n\n useEffect(() => {\n const emitDownloadOptions = () => {\n EventBusService.getInstance().emit('onDownloadOptionsChanged', {\n disabled: !canShowWidget,\n items: [\n {\n callback: () => CaseDbDownloadUtil.downloadEchartsImage(t`Histogram`, chartRef.current.getEchartsInstance(), 'png', completeCaseType, t),\n disabled: !shouldShowGraph,\n label: t`Save as PNG`,\n },\n {\n callback: () => CaseDbDownloadUtil.downloadEchartsImage(t`Histogram`, chartRef.current.getEchartsInstance(), 'jpeg', completeCaseType, t),\n disabled: !shouldShowGraph,\n label: t`Save as JPEG`,\n },\n ],\n zone: DASHBOARD_COMPONENT_NAME.HISTOGRAM,\n zoneLabel: t`Histogram`,\n });\n };\n emitDownloadOptions();\n const eventBusManager = EventBusService.getInstance();\n eventBusManager.addEventListener('onDownloadOptionsRequested', emitDownloadOptions);\n return () => {\n eventBusManager.emit('onDownloadOptionsChanged', {\n items: null,\n zone: DASHBOARD_COMPONENT_NAME.HISTOGRAM,\n zoneLabel: t`Histogram`,\n });\n eventBusManager.removeEventListener('onDownloadOptionsRequested', emitDownloadOptions);\n };\n }, [completeCaseType, shouldShowGraph, canShowWidget, t]);\n\n const highlight = useCallback((caseIds: string[]) => {\n dashboardContext.highlight({\n caseIds,\n origin: DASHBOARD_COMPONENT_NAME.HISTOGRAM,\n });\n }, [dashboardContext]);\n\n const onEvents = useMemo<EChartsReactProps['onEvents']>(() => {\n\n const getCaseIdsFromPayload = (payload: unknown): string[] => {\n const colValues = HistogramUtil.getColValuesFromPayload(payload, conceptsA, conceptsB);\n if (!colValues) {\n return [];\n }\n const caseIds = sortedData.filter(caseDbCase => {\n const aValue = CaseUtil.getRowValue(caseDbCase.content, aCol, completeCaseType);\n const bValue = CaseUtil.getRowValue(caseDbCase.content, bCol, completeCaseType);\n return colValues.a === aValue.raw && colValues.b === bValue.raw;\n }).map(caseDbCase => caseDbCase.id);\n return caseIds;\n };\n\n return {\n globalout: () => {\n highlight([]);\n },\n mouseout: () => {\n highlight([]);\n },\n mouseover: (payload: unknown) => {\n highlight(getCaseIdsFromPayload(payload));\n },\n mouseup: (payload: unknown) => {\n const { event } = payload as { event: { event: MouseEvent } };\n setFocussedColValues(HistogramUtil.getColValuesFromPayload(payload, conceptsA, conceptsB));\n setContextMenuConfig({\n caseIds: getCaseIdsFromPayload(payload),\n mouseEvent: event.event,\n position: {\n left: (event.event).clientX,\n top: (event.event).clientY,\n },\n });\n },\n };\n }, [aCol, bCol, completeCaseType, conceptsA, conceptsB, highlight, sortedData]);\n\n const onShowOnlyFocussedColValuesMenuItemClick = useCallback(async (onMenuClose: () => void) => {\n if (!focussedColValues || !aCol || !bCol) {\n return;\n }\n await setFilterValues({\n [aCol.id]: [focussedColValues.a],\n [bCol.id]: [focussedColValues.b],\n });\n\n onMenuClose();\n }, [aCol, bCol, focussedColValues, setFilterValues]);\n\n const getEpiContextMenuExtraItems = useCallback((onMenuClose: () => void): ReactElement => {\n const conceptALabel = conceptsA.find(concept => concept.id === focussedColValues?.a)?.name;\n const conceptBLabel = conceptsB.find(concept => concept.id === focussedColValues?.b)?.name;\n if (!conceptALabel || !conceptBLabel) {\n return null;\n }\n if (!focussedColValues) {\n return null;\n }\n return (\n <MenuItem\n divider\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={async () => await onShowOnlyFocussedColValuesMenuItemClick(onMenuClose)}\n >\n <ListItemIcon>\n <FilterAltIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t('Filter (show only {{conceptALabel}} and {{conceptBLabel}})', { conceptALabel, conceptBLabel })}\n </ListItemText>\n </MenuItem>\n );\n }, [conceptsA, conceptsB, focussedColValues, onShowOnlyFocussedColValuesMenuItemClick, t]);\n\n useEffect(() => {\n const unsubscribe = dashboardContext.highlightSubject.subscribe((highlighting) => {\n if (highlighting.origin === DASHBOARD_COMPONENT_NAME.HISTOGRAM) {\n return;\n }\n const instance = chartInstanceRef.current;\n if (!instance) {\n return;\n }\n\n if (!highlighting?.caseIds?.length) {\n instance.dispatchAction({\n type: 'downplay',\n });\n return;\n }\n\n const highlightTargetsByDataIndex = new Map<number, Set<number>>();\n series?.forEach((serie, serieIndex) => {\n const castedSerie = serie as { data: unknown[]; xCaseIds: string[][] };\n castedSerie.xCaseIds?.forEach((caseIds: string[], dataIndex: number) => {\n if (intersection(caseIds, highlighting.caseIds).length) {\n const seriesIndices = highlightTargetsByDataIndex.get(dataIndex) ?? new Set<number>();\n seriesIndices.add(serieIndex);\n highlightTargetsByDataIndex.set(dataIndex, seriesIndices);\n }\n });\n });\n\n instance.dispatchAction({\n type: 'downplay',\n });\n\n const highlightBatch: Array<{ dataIndex: number; notBlur?: boolean; seriesIndex?: number }> = [];\n highlightTargetsByDataIndex.forEach((seriesIndices, dataIndex) => {\n if (seriesIndices.size === series?.length) {\n highlightBatch.push({\n dataIndex,\n });\n return;\n }\n\n seriesIndices.forEach((seriesIndex) => {\n highlightBatch.push({\n dataIndex,\n seriesIndex,\n });\n });\n });\n\n highlightBatch.forEach((target, index) => {\n if (index > 0) {\n target.notBlur = true;\n }\n });\n\n instance.dispatchAction({\n batch: highlightBatch,\n type: 'highlight',\n });\n });\n\n return () => {\n unsubscribe();\n };\n }, [dashboardContext, series]);\n\n return (\n <DashboardWidget\n expandDisabled={!canShowWidget}\n title={titleMenu}\n warningMessage={canShowWidget && histogramCaseCount > 0 && missingCasesCount > 0 ? t('Missing cases: {{missingCasesCount}} ({{missingCasesPercentage}}%)', { missingCasesCount, missingCasesPercentage }) : undefined}\n widgetName={DASHBOARD_COMPONENT_NAME.HISTOGRAM}\n >\n {!canShowWidget && (\n <WidgetUnavailable\n reason={widgetUnavailableReason}\n widgetLabel={t`histogram`}\n />\n )}\n {canShowWidget && (\n <Box\n sx={{\n height: '100%',\n position: 'relative',\n }}\n >\n {shouldShowGraph && (\n <EChartsReact\n echarts={echartsCore}\n notMerge\n onChartReady={onChartReady}\n onEvents={onEvents}\n option={getOptions()}\n opts={echartsOpts as unknown}\n ref={chartRef}\n style={{\n height: '100%',\n position: 'absolute',\n width: '100%',\n }}\n />\n )}\n <ContextMenu\n config={contextMenuConfig}\n getExtraItems={getEpiContextMenuExtraItems}\n onMenuClose={onEpiContextMenuClose}\n />\n </Box>\n )}\n </DashboardWidget>\n );\n};\n"],"mappings":"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"}
@@ -1,2 +1,50 @@
1
- import { n as e, t } from "../../../_chunks/PanelSeparator.js";
2
- export { e as PanelSeparatorHorizontal, t as PanelSeparatorVertical };
1
+ import { Box as e, styled as t, useTheme as n } from "@mui/material";
2
+ import { useTranslation as r } from "react-i18next";
3
+ import { jsx as i } from "react/jsx-runtime";
4
+ import { Separator as a } from "react-resizable-panels";
5
+ //#region src/components/ui/PanelSeparator/PanelSeparatorHorizontal.tsx
6
+ var o = t(a)(() => ({})), s = (t) => {
7
+ let a = n(), { t: s } = r();
8
+ return /* @__PURE__ */ i(o, {
9
+ ...t,
10
+ "aria-label": s("Horizontal separator"),
11
+ sx: {
12
+ "&:hover > div": {
13
+ background: a.palette.primary.main,
14
+ height: "3px",
15
+ margin: "4px 0"
16
+ },
17
+ height: "11px"
18
+ },
19
+ children: /* @__PURE__ */ i(e, { sx: {
20
+ background: a.palette.divider,
21
+ height: "1px",
22
+ margin: "5px 0",
23
+ width: "100%"
24
+ } })
25
+ });
26
+ }, c = t(a)(() => ({})), l = (t) => {
27
+ let a = n(), { t: o } = r();
28
+ return /* @__PURE__ */ i(c, {
29
+ ...t,
30
+ "aria-label": o("Vertical separator"),
31
+ sx: {
32
+ "&:hover > div": {
33
+ background: a.palette.primary.main,
34
+ margin: "0 4px ",
35
+ width: "3px"
36
+ },
37
+ width: "11px"
38
+ },
39
+ children: /* @__PURE__ */ i(e, { sx: {
40
+ background: a.palette.divider,
41
+ height: "100%",
42
+ margin: "0 5px",
43
+ width: "1px"
44
+ } })
45
+ });
46
+ };
47
+ //#endregion
48
+ export { s as PanelSeparatorHorizontal, l as PanelSeparatorVertical };
49
+
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/PanelSeparator/PanelSeparatorHorizontal.tsx","../../../../src/components/ui/PanelSeparator/PanelSeparatorVertical.tsx"],"sourcesContent":["import {\n Box,\n styled,\n useTheme,\n} from '@mui/material';\nimport { useTranslation } from 'react-i18next';\nimport type { SeparatorProps } from 'react-resizable-panels';\nimport { Separator } from 'react-resizable-panels';\n\nconst StyledSeparator = styled(Separator)(() => ({}));\n\nexport const PanelSeparatorHorizontal = (props: SeparatorProps) => {\n const theme = useTheme();\n const { t } = useTranslation();\n return (\n <StyledSeparator\n {...props}\n aria-label={t('Horizontal separator')}\n sx={{\n '&:hover > div': {\n background: theme.palette.primary.main,\n height: '3px',\n margin: '4px 0',\n },\n height: '11px',\n }}\n >\n <Box\n sx={{\n background: theme.palette.divider,\n height: '1px',\n margin: '5px 0',\n width: '100%',\n }}\n />\n </StyledSeparator>\n );\n};\n","import {\n Box,\n styled,\n useTheme,\n} from '@mui/material';\nimport { useTranslation } from 'react-i18next';\nimport type { SeparatorProps } from 'react-resizable-panels';\nimport { Separator } from 'react-resizable-panels';\n\nconst StyledSeparator = styled(Separator)(() => ({}));\n\nexport const PanelSeparatorVertical = (props: SeparatorProps) => {\n const theme = useTheme();\n const { t } = useTranslation();\n\n return (\n <StyledSeparator\n {...props}\n aria-label={t('Vertical separator')}\n sx={{\n '&:hover > div': {\n background: theme.palette.primary.main,\n margin: '0 4px ',\n width: '3px',\n },\n width: '11px',\n }}\n >\n <Box\n sx={{\n background: theme.palette.divider,\n height: '100%',\n margin: '0 5px',\n width: '1px',\n }}\n />\n </StyledSeparator>\n );\n};\n"],"mappings":";;;;;AASA,IAAM,IAAkB,EAAO,CAAS,CAAC,QAAQ,CAAC,EAAE,GAEvC,KAA4B,MAA0B;CACjE,IAAM,IAAQ,EAAS,GACjB,EAAE,SAAM,EAAe;CAC7B,OACE,kBAAC,GAAD;EACE,GAAI;EACJ,cAAY,EAAE,sBAAsB;EACpC,IAAI;GACF,iBAAiB;IACf,YAAY,EAAM,QAAQ,QAAQ;IAClC,QAAQ;IACR,QAAQ;GACV;GACA,QAAQ;EACV;EAEA,UAAA,kBAAC,GAAD,EACE,IAAI;GACF,YAAY,EAAM,QAAQ;GAC1B,QAAQ;GACR,QAAQ;GACR,OAAO;EACT,EACD,CAAA;CACc,CAAA;AAErB,GC5BM,IAAkB,EAAO,CAAS,CAAC,QAAQ,CAAC,EAAE,GAEvC,KAA0B,MAA0B;CAC/D,IAAM,IAAQ,EAAS,GACjB,EAAE,SAAM,EAAe;CAE7B,OACE,kBAAC,GAAD;EACE,GAAI;EACJ,cAAY,EAAE,oBAAoB;EAClC,IAAI;GACF,iBAAiB;IACf,YAAY,EAAM,QAAQ,QAAQ;IAClC,QAAQ;IACR,OAAO;GACT;GACA,OAAO;EACT;EAEA,UAAA,kBAAC,GAAD,EACE,IAAI;GACF,YAAY,EAAM,QAAQ;GAC1B,QAAQ;GACR,QAAQ;GACR,OAAO;EACT,EACD,CAAA;CACc,CAAA;AAErB"}
@@ -1,37 +1,37 @@
1
1
  import { CASEDB_QUERY_KEY as e } from "../../constants/query.js";
2
2
  import { n as t } from "../../_chunks/Dashboard.js";
3
- import { t as n } from "../../_chunks/chunk-OB3PAWPO.js";
4
- import { CaseDbCaseApi as r } from "@gen-epix/api-casedb";
5
- import { useEffect as i, useMemo as a } from "react";
6
- import { useTranslation as o } from "react-i18next";
7
- import { jsx as s } from "react/jsx-runtime";
8
- import { ResponseHandler as c } from "@gen-epix/ui-client-common/components/ui/ResponseHandler";
9
- import { useItemQuery as l } from "@gen-epix/ui-client-common/hooks/useItemQuery";
10
- import { TestIdUtil as u } from "@gen-epix/ui-core/utils/TestIdUtil";
3
+ import { CaseDbCaseApi as n } from "@gen-epix/api-casedb";
4
+ import { useEffect as r, useMemo as i } from "react";
5
+ import { useTranslation as a } from "react-i18next";
6
+ import { jsx as o } from "react/jsx-runtime";
7
+ import { ResponseHandler as s } from "@gen-epix/ui-client-common/components/ui/ResponseHandler";
8
+ import { useItemQuery as c } from "@gen-epix/ui-client-common/hooks/useItemQuery";
9
+ import { TestIdUtil as l } from "@gen-epix/ui-core/utils/TestIdUtil";
10
+ import { useParams as u } from "react-router-dom";
11
11
  import { PageContainer as d } from "@gen-epix/ui-client-common/components/ui/PageContainer";
12
12
  import { useUpdateBreadcrumb as f } from "@gen-epix/ui-client-common/hooks/useUpdateBreadcrumb";
13
13
  //#region src/pages/CasesDetailPage/CasesDetailPage.tsx
14
14
  var p = () => {
15
- let { t: p } = o(), { caseTypeId: m, slug: h } = n(), g = f("Case type"), { data: _, error: v, isLoading: y } = l({
15
+ let { t: p } = a(), { caseTypeId: m, slug: h } = u(), g = f("Case type"), { data: _, error: v, isLoading: y } = c({
16
16
  baseQueryKey: e.CASE_TYPES,
17
17
  itemId: m,
18
- useQueryOptions: { queryFn: async ({ signal: e }) => (await r.getInstance().caseTypesGetOne(m, { signal: e })).data }
19
- }), b = a(() => _?.name ? _?.name : p`Case`, [_, p]);
20
- return i(() => {
18
+ useQueryOptions: { queryFn: async ({ signal: e }) => (await n.getInstance().caseTypesGetOne(m, { signal: e })).data }
19
+ }), b = i(() => _?.name ? _?.name : p`Case`, [_, p]);
20
+ return r(() => {
21
21
  g(b);
22
- }, [b, g]), /* @__PURE__ */ s(d, {
22
+ }, [b, g]), /* @__PURE__ */ o(d, {
23
23
  fullHeight: !0,
24
24
  fullWidth: !0,
25
25
  showBreadcrumbs: !0,
26
- testIdAttributes: u.createAttributes("CasesDetailPage", {
26
+ testIdAttributes: l.createAttributes("CasesDetailPage", {
27
27
  "case-type-id": m,
28
28
  slug: h
29
29
  }),
30
30
  title: b,
31
- children: /* @__PURE__ */ s(c, {
31
+ children: /* @__PURE__ */ o(s, {
32
32
  error: v,
33
33
  isLoading: y,
34
- children: /* @__PURE__ */ s(t, { caseTypeId: m })
34
+ children: /* @__PURE__ */ o(t, { caseTypeId: m })
35
35
  })
36
36
  });
37
37
  };