quantum-component-library 1.4.46-qa → 1.4.47-dev.10

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 (39) hide show
  1. package/README.md +115 -115
  2. package/dist/components/activity-list/index.d.ts +28 -2
  3. package/dist/components/activity-list/index.stories.d.ts +6 -0
  4. package/dist/components/parameter-edit-list/index.d.ts +2 -1
  5. package/dist/components/test-filter-panel/index.d.ts +5 -3
  6. package/dist/components/upsert-activity-form/index.d.ts +3 -1
  7. package/dist/components.cjs +1 -1
  8. package/dist/components.js +1338 -1281
  9. package/dist/generated/gql.d.ts +2 -2
  10. package/dist/generated/graphql.d.ts +38 -1
  11. package/dist/generated-graphql.cjs +1 -0
  12. package/dist/generated-graphql.js +68 -0
  13. package/dist/generated.cjs +1 -0
  14. package/dist/generated.js +73 -0
  15. package/dist/{graphql-KvyVlavd.cjs → graphql-C6M9oyU0.cjs} +16 -9
  16. package/dist/{graphql-CZIf58Fd.js → graphql-CvUc6Vdv.js} +30 -22
  17. package/dist/{graphql-vendor-CL0XsjHb.cjs → graphql-vendor-B-QTAQSb.cjs} +9 -9
  18. package/dist/{graphql-vendor-BWnD0b-j.js → graphql-vendor-B0NjgbDB.js} +2 -3
  19. package/dist/hooks.cjs +1 -1
  20. package/dist/hooks.js +1 -1
  21. package/dist/index.cjs +1 -1
  22. package/dist/index.js +118 -115
  23. package/dist/lib/services/action.d.ts +4 -0
  24. package/dist/lib/services/index.d.ts +1 -0
  25. package/dist/lib/services/rom.json.d.ts +223 -223
  26. package/dist/providers.cjs +1 -1
  27. package/dist/providers.js +3 -3
  28. package/dist/quantum-component-library.css +1 -1
  29. package/dist/{react-select-vendor-C_DuqfB7.js → react-select-vendor-BlY9Il4Q.js} +4 -5
  30. package/dist/{react-select-vendor-BPaBUHFp.cjs → react-select-vendor-D_Q2fL5j.cjs} +1 -1
  31. package/dist/services.cjs +1 -1
  32. package/dist/services.js +249 -212
  33. package/dist/types.cjs +1 -1
  34. package/dist/types.js +1 -1
  35. package/dist/utils.cjs +1 -1
  36. package/dist/utils.js +1 -1
  37. package/package.json +133 -123
  38. package/dist/generated-B5QGMyhw.cjs +0 -1
  39. package/dist/generated-esGwfMXj.js +0 -66
package/README.md CHANGED
@@ -1,115 +1,115 @@
1
- # Quantum Component Library
2
-
3
- A modular React component library built with TypeScript and Vite, featuring code splitting for optimal bundle sizes.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install quantum-component-library
9
- ```
10
-
11
- ## Usage
12
-
13
- ### Full Library Import (Default)
14
-
15
- ```typescript
16
- // Import everything (not recommended for production)
17
- import * from 'quantum-component-library';
18
- ```
19
-
20
- ### Modular Imports (Recommended)
21
-
22
- The library is split into several modules for optimal tree-shaking and bundle sizes:
23
-
24
- #### Components
25
- ```typescript
26
- // Import only UI components
27
- import { UpsertActivityForm, ParameterEditList } from 'quantum-component-library/components';
28
- ```
29
-
30
- #### Hooks
31
- ```typescript
32
- // Import only custom hooks
33
- import { useGraphqlClient, useJointsForLimbIds } from 'quantum-component-library/hooks';
34
- ```
35
-
36
- #### Types
37
- ```typescript
38
- // Import only type definitions
39
- import type { Activity, Analysis, Human } from 'quantum-component-library/types';
40
- ```
41
-
42
- #### Authentication
43
- ```typescript
44
- // Import only auth utilities
45
- import { useAuthContext, useIsAuthenticated } from 'quantum-component-library/auth';
46
- ```
47
-
48
- #### GraphQL
49
- ```typescript
50
- // Import only GraphQL fragments and operations
51
- import { ActivityFragment, SessionQueries } from 'quantum-component-library/graphql';
52
- ```
53
-
54
- #### Generated GraphQL Code
55
- ```typescript
56
- // Import only generated GraphQL types and utilities
57
- import { FragmentMasking, gql } from 'quantum-component-library/generated';
58
- ```
59
-
60
- #### Utilities
61
- ```typescript
62
- // Import only utility functions
63
- import { convertUnits, memoizeWithExpiry } from 'quantum-component-library/utils';
64
- ```
65
-
66
- #### Services
67
- ```typescript
68
- // Import only service functions
69
- import { humanService } from 'quantum-component-library/services';
70
- ```
71
-
72
- ## Code Splitting Benefits
73
-
74
- - **Reduced Bundle Size**: Import only what you need
75
- - **Better Tree Shaking**: Webpack and other bundlers can eliminate unused code more effectively
76
- - **Faster Loading**: Smaller initial bundles load faster
77
- - **Better Caching**: Changes to one module don't invalidate others
78
-
79
- ## Build Configuration
80
-
81
- This library uses Vite with multiple entry points and manual chunk splitting:
82
-
83
- - **Multiple Entry Points**: Each module has its own entry point for granular imports
84
- - **Manual Chunk Splitting**: Vendor dependencies are split into logical chunks (UI, GraphQL, React, etc.)
85
- - **Automatic Type Generation**: TypeScript definitions are generated for all entry points
86
-
87
- ### Available Modules
88
-
89
- | Module | Entry Point | Description |
90
- |--------|-------------|-------------|
91
- | `components` | `src/components/index.ts` | UI components |
92
- | `hooks` | `src/lib/hooks/index.ts` | Custom React hooks |
93
- | `types` | `src/lib/types/index.ts` | TypeScript type definitions |
94
- | `auth` | `src/lib/auth/index.ts` | Authentication utilities |
95
- | `graphql` | `src/graphql/index.ts` | GraphQL fragments and operations |
96
- | `generated` | `src/generated/index.ts` | Generated GraphQL code |
97
- | `utils` | `src/lib/utils/index.ts` | Utility functions |
98
- | `services` | `src/lib/services/index.ts` | Service functions |
99
-
100
- ## Development
101
-
102
- ```bash
103
- # Install dependencies
104
- npm install
105
-
106
- # Start development server
107
- npm run dev
108
-
109
- # Build the library
110
- npm run build
111
-
112
- # Build for specific environments
113
- npm run build:admin-prod
114
- npm run build:client-qa
115
- ```
1
+ # Quantum Component Library
2
+
3
+ A modular React component library built with TypeScript and Vite, featuring code splitting for optimal bundle sizes.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install quantum-component-library
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Full Library Import (Default)
14
+
15
+ ```typescript
16
+ // Import everything (not recommended for production)
17
+ import * from 'quantum-component-library';
18
+ ```
19
+
20
+ ### Modular Imports (Recommended)
21
+
22
+ The library is split into several modules for optimal tree-shaking and bundle sizes:
23
+
24
+ #### Components
25
+ ```typescript
26
+ // Import only UI components
27
+ import { UpsertActivityForm, ParameterEditList } from 'quantum-component-library/components';
28
+ ```
29
+
30
+ #### Hooks
31
+ ```typescript
32
+ // Import only custom hooks
33
+ import { useGraphqlClient, useJointsForLimbIds } from 'quantum-component-library/hooks';
34
+ ```
35
+
36
+ #### Types
37
+ ```typescript
38
+ // Import only type definitions
39
+ import type { Activity, Analysis, Human } from 'quantum-component-library/types';
40
+ ```
41
+
42
+ #### Authentication
43
+ ```typescript
44
+ // Import only auth utilities
45
+ import { useAuthContext, useIsAuthenticated } from 'quantum-component-library/auth';
46
+ ```
47
+
48
+ #### GraphQL
49
+ ```typescript
50
+ // Import only GraphQL fragments and operations
51
+ import { ActivityFragment, SessionQueries } from 'quantum-component-library/graphql';
52
+ ```
53
+
54
+ #### Generated GraphQL Code
55
+ ```typescript
56
+ // Import only generated GraphQL types and utilities
57
+ import { FragmentMasking, gql } from 'quantum-component-library/generated';
58
+ ```
59
+
60
+ #### Utilities
61
+ ```typescript
62
+ // Import only utility functions
63
+ import { convertUnits, memoizeWithExpiry } from 'quantum-component-library/utils';
64
+ ```
65
+
66
+ #### Services
67
+ ```typescript
68
+ // Import only service functions
69
+ import { humanService } from 'quantum-component-library/services';
70
+ ```
71
+
72
+ ## Code Splitting Benefits
73
+
74
+ - **Reduced Bundle Size**: Import only what you need
75
+ - **Better Tree Shaking**: Webpack and other bundlers can eliminate unused code more effectively
76
+ - **Faster Loading**: Smaller initial bundles load faster
77
+ - **Better Caching**: Changes to one module don't invalidate others
78
+
79
+ ## Build Configuration
80
+
81
+ This library uses Vite with multiple entry points and manual chunk splitting:
82
+
83
+ - **Multiple Entry Points**: Each module has its own entry point for granular imports
84
+ - **Manual Chunk Splitting**: Vendor dependencies are split into logical chunks (UI, GraphQL, React, etc.)
85
+ - **Automatic Type Generation**: TypeScript definitions are generated for all entry points
86
+
87
+ ### Available Modules
88
+
89
+ | Module | Entry Point | Description |
90
+ |--------|-------------|-------------|
91
+ | `components` | `src/components/index.ts` | UI components |
92
+ | `hooks` | `src/lib/hooks/index.ts` | Custom React hooks |
93
+ | `types` | `src/lib/types/index.ts` | TypeScript type definitions |
94
+ | `auth` | `src/lib/auth/index.ts` | Authentication utilities |
95
+ | `graphql` | `src/graphql/index.ts` | GraphQL fragments and operations |
96
+ | `generated` | `src/generated/index.ts` | Generated GraphQL code |
97
+ | `utils` | `src/lib/utils/index.ts` | Utility functions |
98
+ | `services` | `src/lib/services/index.ts` | Service functions |
99
+
100
+ ## Development
101
+
102
+ ```bash
103
+ # Install dependencies
104
+ npm install
105
+
106
+ # Start development server
107
+ npm run dev
108
+
109
+ # Build the library
110
+ npm run build
111
+
112
+ # Build for specific environments
113
+ npm run build:admin-prod
114
+ npm run build:client-qa
115
+ ```
@@ -1,19 +1,45 @@
1
1
  import { AssessmentActionFragment } from '../../generated/graphql';
2
2
  import { BoxProps, TableContainerProps } from '@chakra-ui/react';
3
+ /**
4
+ * Props for the ActivityList component
5
+ */
3
6
  export type ActivityListProps = {
7
+ /** Array of actions to display with optional selection state */
4
8
  actions: Array<AssessmentActionFragment & {
5
9
  selected?: boolean;
6
10
  }>;
11
+ /** Total number of actions (for display purposes) */
7
12
  totalActions?: number;
13
+ /** Callback fired when create button is clicked */
8
14
  onCreate?: () => void;
15
+ /** Callback fired when edit button is clicked for an action */
9
16
  onEdit?: (id: string) => void;
17
+ /** Callback fired when view button is clicked for an action */
18
+ onView?: (id: string) => void;
19
+ /**
20
+ * Callback fired when delete is requested for action IDs.
21
+ * Note: Quantum-owned actions are automatically filtered out before this callback.
22
+ */
10
23
  onDelete?: (ids: string[]) => void;
24
+ /** Callback fired when an action's selection state changes */
11
25
  onSelected?: (action: AssessmentActionFragment, selected: boolean) => void;
26
+ /** Callback fired when duplicate is requested for action IDs */
12
27
  onDuplicate?: (ids: string[]) => void;
28
+ /** Whether to disable multi-selection checkboxes */
13
29
  disableMultiSelect?: boolean;
30
+ /** Whether to disable delete operations (in addition to quantum ownership checks) */
14
31
  disableDelete?: boolean;
32
+ /** Whether to disable edit operations (in addition to quantum ownership checks) */
15
33
  disableEdit?: boolean;
34
+ /** Whether to disable create operations */
16
35
  disableCreate?: boolean;
36
+ /** Whether to hide the use case column and filter. Defaults to true (hide use case) */
37
+ hideUseCase?: boolean;
38
+ /** Additional props to pass to the table container */
17
39
  tableProps?: TableContainerProps;
18
- } & BoxProps;
19
- export declare const ActivityList: ({ actions, totalActions, onCreate, onDelete, onEdit, onSelected, onDuplicate, disableMultiSelect, disableDelete, disableEdit, disableCreate, tableProps, ...containerProps }: ActivityListProps) => import("react/jsx-runtime").JSX.Element;
40
+ /** Additional props to pass to the container */
41
+ containerProps?: BoxProps;
42
+ /** Source for the quantum icon default is /favicon.ico*/
43
+ quantumIconSrc?: string;
44
+ };
45
+ export declare const ActivityList: ({ actions, totalActions, onCreate, onDelete, onEdit, onView, onSelected, onDuplicate, disableMultiSelect, disableDelete, disableEdit, disableCreate, hideUseCase, tableProps, containerProps, quantumIconSrc, }: ActivityListProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { ActivityList } from './index';
3
+ declare const meta: Meta<typeof ActivityList>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof meta>;
6
+ export declare const Default: Story;
@@ -6,8 +6,9 @@ type Props = Omit<BoxProps, "value" | "onChange"> & {
6
6
  forceKind?: ThresholdKind;
7
7
  disableKind?: boolean;
8
8
  disableRemove?: boolean;
9
+ isDisabled?: boolean;
9
10
  lockRanges?: boolean;
10
11
  onChange: (v: PartParameter[]) => void;
11
12
  };
12
- export declare const ParameterEditList: ({ value, onChange, forceKind, disableRemove, disableKind, lockRanges, ...container }: Props) => import("react/jsx-runtime").JSX.Element;
13
+ export declare const ParameterEditList: ({ value, onChange, forceKind, disableRemove, disableKind, isDisabled, lockRanges, ...container }: Props) => import("react/jsx-runtime").JSX.Element;
13
14
  export {};
@@ -1,7 +1,9 @@
1
- import { Action } from '../../generated/graphql';
1
+ import { AssessmentActionFragment } from '../../generated/graphql';
2
2
  export interface ITestFilterPanelProps {
3
3
  setSearch: (e: string) => void;
4
- actions: Action[] | undefined;
4
+ actions: AssessmentActionFragment[] | undefined;
5
5
  updateUseCases: (ids: string[]) => void;
6
+ /** Whether to hide the use case filter. Defaults to false (show filter) */
7
+ hideUseCaseFilter?: boolean;
6
8
  }
7
- export declare const TestFilterPanel: ({ setSearch, actions, updateUseCases, }: ITestFilterPanelProps) => import("react/jsx-runtime").JSX.Element;
9
+ export declare const TestFilterPanel: ({ setSearch, actions, updateUseCases, hideUseCaseFilter, }: ITestFilterPanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -5,6 +5,8 @@ interface UpsertActivityFormProps {
5
5
  onSave: () => void;
6
6
  hideButtons?: boolean;
7
7
  quantumOwned?: boolean;
8
+ /** If true, the form renders in read-only mode and hides action buttons */
9
+ isView?: boolean;
8
10
  setButtonOnClick?: ({ cancelButton, saveButton, }: {
9
11
  cancelButton: () => void;
10
12
  saveButton: () => void;
@@ -14,5 +16,5 @@ interface UpsertActivityFormProps {
14
16
  saveButton: boolean;
15
17
  }) => void;
16
18
  }
17
- export declare const UpsertActivityForm: ({ id, onError, onCancel, onSave, hideButtons, setButtonOnClick, setButtonDisabled, quantumOwned, }: UpsertActivityFormProps) => import("react/jsx-runtime").JSX.Element;
19
+ export declare const UpsertActivityForm: ({ id, onError, onCancel, onSave, hideButtons, setButtonOnClick, setButtonDisabled, quantumOwned, isView, }: UpsertActivityFormProps) => import("react/jsx-runtime").JSX.Element;
18
20
  export {};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./react-jsx-runtime-vendor-Dszzpdy0.cjs"),t=require("@chakra-ui/react"),o=require("react"),Ee=require("./ufuzzy-vendor-7qHa_k39.cjs"),K=require("./react-select-vendor-BPaBUHFp.cjs"),de=require("./react-icons-vendor-D2s8zw9h.cjs"),z=require("./graphql-vendor-CL0XsjHb.cjs"),j=require("./generated-B5QGMyhw.cjs"),A=require("./graphql-KvyVlavd.cjs"),ce=require("./react-dnd-vendor-BPzSDojS.cjs"),Z=require("./services.cjs"),te=require("./types.cjs"),ne=require("./utils.cjs"),Re=require("./hooks.cjs"),fe=({setSearch:r,actions:n,updateUseCases:a})=>{const d=o.useMemo(()=>n?.flatMap(l=>l.useCases).filter((l,c,m)=>m.findIndex(E=>E.id===l.id)===c).map(l=>({label:l.name,value:l.id}))||[],[n]);return e.jsxRuntimeExports.jsxs(t.Flex,{width:"100%",alignContent:"space-evenly",gap:4,children:[e.jsxRuntimeExports.jsxs(t.InputGroup,{size:"md",children:[e.jsxRuntimeExports.jsx(t.InputLeftElement,{children:e.jsxRuntimeExports.jsx(t.Icon,{as:de.FaSearch,color:"gray.300"})}),e.jsxRuntimeExports.jsx(t.Input,{placeholder:"Search by name...",maxW:"30rem",onChange:l=>r(l.target.value)})]}),e.jsxRuntimeExports.jsx(t.InputGroup,{size:"md",children:e.jsxRuntimeExports.jsx(K.st,{size:"md",chakraStyles:{container:l=>({...l,width:"100%"})},menuPortalTarget:document.body,placeholder:"Filter use case",isMulti:!0,options:d,onChange:l=>a(l.map(c=>c.value))})})]})},V=({children:r})=>e.jsxRuntimeExports.jsx(t.FormLabel,{fontWeight:"bold",fontFamily:"sans-serif",fontSize:"large",children:r}),Ce=({value:r,onChange:n})=>{const a=o.useState(()=>Math.random().toString(36).substring(2,15))[0],d=o.useCallback((l,c)=>{n(m=>{const E=[...m],[u]=E.splice(l,1);return E.splice(c,0,u),E})},[n]);return e.jsxRuntimeExports.jsx(t.Box,{children:e.jsxRuntimeExports.jsx(ce.DndProvider,{backend:ce.HTML5Backend,children:e.jsxRuntimeExports.jsx(t.TableContainer,{children:e.jsxRuntimeExports.jsxs(t.Table,{variant:"simple",size:"md",children:[e.jsxRuntimeExports.jsx(t.Thead,{children:e.jsxRuntimeExports.jsxs(t.Tr,{children:[e.jsxRuntimeExports.jsx(t.Th,{children:"Order"}),e.jsxRuntimeExports.jsx(t.Th,{children:"Name"})]})}),e.jsxRuntimeExports.jsx(t.Tbody,{children:r.map((l,c)=>e.jsxRuntimeExports.jsx(ve,{listKey:a,index:c,id:l.id,name:l.name,move:d},l.id))})]})})})})},ve=({listKey:r,index:n,id:a,name:d,move:l})=>{const c=o.useRef(null),[{handlerId:m},E]=ce.useDrop({accept:r,collect:R=>({handlerId:R.getHandlerId()?.toString()??""}),hover:(R,w)=>{if(!c.current)return;const i=R.index,x=n;if(i===x)return;const C=c.current?.getBoundingClientRect(),h=(C.bottom-C.top)/2,S=w.getClientOffset().y-C.top;i<x&&S<h||i>x&&S>h||(l(i,x),R.index=x)}}),[{isDragging:u},M]=ce.useDrag({type:r,item:()=>({id:a,index:n}),collect:R=>({isDragging:R.isDragging()})}),O=u?.6:1,g=u?"grabbing":"grab";return M(E(c)),e.jsxRuntimeExports.jsxs(t.Tr,{ref:c,style:{opacity:O,cursor:g},"data-handler-id":m,children:[e.jsxRuntimeExports.jsx(t.Td,{children:n+1}),e.jsxRuntimeExports.jsx(t.Td,{children:d})]})},xe=({items:r,onChange:n,selectedItem:a,isDisabled:d,selectedProps:l,buttonProps:c})=>{const m=u=>u===a||u.value===a,E=u=>m(u)?{...c,...l}:c;return e.jsxRuntimeExports.jsx(t.ButtonGroup,{isAttached:!0,isDisabled:d,children:r.map((u,M)=>e.jsxRuntimeExports.jsx(t.Tooltip,{label:u.tooltip,openDelay:50,closeDelay:200,placement:"top",visibility:u.tooltip?"visible":"hidden",hasArrow:!0,children:e.jsxRuntimeExports.jsx(t.Button,{onClick:()=>m(u)?null:n(u,M),isDisabled:u.disabled,...E(u),children:u.label})},M))})},ae=(r,n)=>n<0?-1*Math.abs(r):Math.abs(r),be=({isReversed:r,min:n,max:a,value:d,onChange:l,inputProps:c,size:m,zeroMarker:E,formatValue:u,valueLabel:M,positiveNegativeLabels:O,isDisabled:g,...R})=>{const[w,i]=o.useState([void 0,void 0]),x=w[0],C=w[1],h=E&&n<-5&&a>5,y=Number(d?.[0]??C??n)>0?1:-1,S=Number(d?.[1]??C??a)<0?-1:1,T=O?.[0]===O?.[1],v=d?.[0],F=d?.[1];o.useEffect(()=>{v!==void 0&&F!==void 0&&i([v.toFixed(0),F.toFixed(0)])},[v,F,i]);const N=o.useCallback(([b,k])=>{b<k&&i([b.toFixed(0),k.toFixed(0)])},[i]),D=o.useCallback(([b,k])=>{b<k&&l([b,k])},[l]),B=o.useCallback(()=>{i(([b,k])=>{const q=isNaN(Number(b))?n:Number(b),s=isNaN(Number(k))?a:Number(k),p=ae(Number(q),y),f=ae(Number(s),S),L=y<0?Math.max(p,n):Math.min(p,a),U=S<0?Math.max(f,n):Math.min(f,a);return L>U?(l([U,L]),[U.toFixed(0),L.toFixed(0)]):(l([L,U]),[L.toFixed(0),U.toFixed(0)])})},[l,i,y,S,n,a]),H=o.useCallback(b=>{const k=b===""||isNaN(Number(b))?b:ae(Number(b),y);i(([q,s])=>[k.toString(),s])},[i,y]),G=o.useCallback(b=>{const k=b===""||isNaN(Number(b))?b:ae(Number(b),S);i(([q,s])=>[q,k.toString()])},[i,S]),_=o.useMemo(()=>m==="xs"?"0.75rem":void 0,[m]),W=o.useCallback((b,k)=>{const q=Number(k.target.value);if(!x||!C||![-1,1].includes(q))return;const s=L=>q<0?-1*Math.abs(L):Math.abs(L),p=b?s(Number(x)):Number(x),f=b?Number(C):s(Number(C));p>f?l([f,p]):l([p,f])},[x,C,l]);return e.jsxRuntimeExports.jsxs(t.Flex,{direction:"column",...R,children:[e.jsxRuntimeExports.jsx(t.Box,{pt:"1em",mb:"-0.5em",children:e.jsxRuntimeExports.jsxs(t.RangeSlider,{"aria-label":["min","max"],isReversed:r,value:[Number(x??n),Number(C??a)],max:a,min:n,minStepsBetweenThumbs:3,step:1,onChange:N,onChangeEnd:D,isDisabled:g,children:[e.jsxRuntimeExports.jsx(t.RangeSliderMark,{value:n,top:"-1em",children:e.jsxRuntimeExports.jsx(t.Text,{fontSize:m??"sm",fontWeight:"semibold",whiteSpace:"nowrap",children:u?u?.(n):n})}),e.jsxRuntimeExports.jsx(t.RangeSliderMark,{value:a,top:"-1em",children:e.jsxRuntimeExports.jsx(t.Text,{fontSize:m??"sm",fontWeight:"semibold",style:{transform:"translateX(-100%)"},whiteSpace:"nowrap",children:u?u(a):a})}),h&&e.jsxRuntimeExports.jsxs(t.RangeSliderMark,{value:0,top:"-1em",pos:"relative",children:[e.jsxRuntimeExports.jsx(t.Text,{fontSize:m,fontWeight:"semibold",children:u?.(0)??"0"}),e.jsxRuntimeExports.jsx(t.Box,{position:"absolute",width:"2px",height:"1em",top:"90%",left:"20%",backgroundColor:"var(--chakra-colors-gray-300)"})]}),e.jsxRuntimeExports.jsx(t.RangeSliderTrack,{children:e.jsxRuntimeExports.jsx(t.RangeSliderFilledTrack,{})}),e.jsxRuntimeExports.jsx(t.RangeSliderThumb,{index:0,w:_,h:_}),e.jsxRuntimeExports.jsx(t.RangeSliderThumb,{index:1,w:_,h:_})]})}),M&&e.jsxRuntimeExports.jsxs(t.Flex,{direction:r?"row-reverse":"row",justifyContent:"space-between",children:[e.jsxRuntimeExports.jsx(t.Text,{fontSize:m??"sm",fontWeight:"semibold",whiteSpace:"nowrap",children:M(n)}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:m??"sm",fontWeight:"semibold",whiteSpace:"nowrap",children:M(a)})]}),e.jsxRuntimeExports.jsxs(t.Flex,{direction:r?"row-reverse":"row",justifyContent:"center",alignItems:"center",gap:"0.125em",children:[O&&e.jsxRuntimeExports.jsxs(t.Select,{width:"auto",size:m,fontWeight:"bold",value:y,onChange:b=>W(!0,b),isDisabled:T||g,children:[e.jsxRuntimeExports.jsx("option",{value:-1,children:O[0]}),e.jsxRuntimeExports.jsx("option",{value:1,children:O[1]})]}),e.jsxRuntimeExports.jsx(t.NumberInput,{precision:0,size:m??"sm",min:0,max:y<0?Math.abs(n):F??a,value:x===""?"":Math.abs(Number(x??n)),onChange:H,onBlur:B,borderWidth:1,borderRadius:3,borderColor:"#ccc",isDisabled:g,...c,children:e.jsxRuntimeExports.jsx(t.NumberInputField,{backgroundColor:"#fff",paddingRight:0,width:"4em"})}),e.jsxRuntimeExports.jsx(t.NumberInput,{size:m??"sm",min:0,max:S<0?Math.abs(v??n):a,precision:0,value:C===""?"":Math.abs(Number(C??a)),onChange:G,onBlur:B,borderWidth:1,borderRadius:3,borderColor:"#ccc",isDisabled:g,...c,children:e.jsxRuntimeExports.jsx(t.NumberInputField,{backgroundColor:"#fff",paddingRight:0,width:"4em"})}),O&&e.jsxRuntimeExports.jsxs(t.Select,{width:"auto",size:m,fontWeight:"bold",value:S,onChange:b=>W(!1,b),isDisabled:T||g,children:[e.jsxRuntimeExports.jsx("option",{value:-1,children:O[0]}),e.jsxRuntimeExports.jsx("option",{value:1,children:O[1]})]})]})]})},ye=({tags:r,containerProps:n,...a})=>e.jsxRuntimeExports.jsx(t.HStack,{...n,children:r.map((d,l)=>e.jsxRuntimeExports.jsx(t.Tag,{...a,children:d},l))}),Se=new Ee.uFuzzy({}),Te=(r,n)=>{if(!n||!n.trim().length)return r;const a=r.map(l=>l.name??"");return Se.filter(a,n)?.map(l=>r[l])??[]},Me=(r,n)=>!n||n.length==0?r:r.filter(a=>a.useCases.some(d=>n.includes(d.id))),me=({actions:r,totalActions:n,onCreate:a,onDelete:d,onEdit:l,onSelected:c,onDuplicate:m,disableMultiSelect:E,disableDelete:u,disableEdit:M,disableCreate:O,tableProps:g,...R})=>{const[w,i]=o.useState(""),[x,C]=o.useState(),h=o.useMemo(()=>{if(!r)return;const T=Te(r,w);return Me(T,x).sort((F,N)=>F.name.localeCompare(N.name))},[r,w,x]),y=o.useCallback(()=>{if(!d)return;const T=r.filter(v=>v.selected).map(v=>v.id);d(T)},[r,d]),S=o.useCallback(()=>{if(!m)return;const T=r.filter(v=>v.selected);m(T.map(v=>v.id)),c&&T.forEach(v=>c(v,!1))},[r,m,c]);return e.jsxRuntimeExports.jsxs(t.Box,{...R,children:[e.jsxRuntimeExports.jsxs(t.Flex,{alignContent:"space-between",gap:4,children:[(a||d||m)&&e.jsxRuntimeExports.jsxs(t.ButtonGroup,{mb:"1rem",gap:4,children:[a&&e.jsxRuntimeExports.jsx(t.Button,{isDisabled:!a||O,colorScheme:"blackAlpha",backgroundColor:"gray.700",onClick:a,children:"Create New Activity"}),d&&!E&&e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"gray",isDisabled:r.length<=0||!d||u,onClick:y,children:"Delete Selected"}),m&&!E&&e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"gray",isDisabled:r.length<=0,onClick:S,children:"Duplicate Selected"})]}),e.jsxRuntimeExports.jsx(fe,{setSearch:i,actions:r,updateUseCases:C})]}),e.jsxRuntimeExports.jsx(t.TableContainer,{mr:"2rem",overflowX:"hidden",...g,children:e.jsxRuntimeExports.jsxs(t.Table,{size:"md",variant:"simple",children:[e.jsxRuntimeExports.jsx(t.Thead,{position:"sticky",top:0,bg:"white",zIndex:1,children:e.jsxRuntimeExports.jsxs(t.Tr,{children:[e.jsxRuntimeExports.jsxs(t.Th,{fontWeight:"normal",children:["(showing ",h?.length??0," of"," ",n??r.length,")"]}),e.jsxRuntimeExports.jsx(t.Th,{children:"Name"}),e.jsxRuntimeExports.jsx(t.Th,{children:"Sensor Count"}),e.jsxRuntimeExports.jsx(t.Th,{children:"Use Case"}),e.jsxRuntimeExports.jsx(t.Th,{})]})}),e.jsxRuntimeExports.jsx(t.Tbody,{children:h?.map(T=>e.jsxRuntimeExports.jsxs(t.Tr,{title:E&&T.selected?"This activity is selected. Click it again to deselect.":void 0,bg:E&&T.selected?"gray.200":void 0,_hover:{bg:E&&!T.selected?"#f7f7f7":void 0},cursor:E?"pointer":"default",onClick:()=>E?c?.(T,!T.selected):void 0,children:[e.jsxRuntimeExports.jsx(t.Td,{children:e.jsxRuntimeExports.jsxs(t.Flex,{children:[c&&!E&&e.jsxRuntimeExports.jsx(t.Checkbox,{isChecked:T.selected,onChange:v=>c(T,v.target.checked)}),l&&e.jsxRuntimeExports.jsx(t.Button,{disabled:M,ml:"1em",size:"sm",variant:"link",colorScheme:"blue",onClick:()=>l(T.id),children:"edit"})]})}),e.jsxRuntimeExports.jsx(t.Td,{whiteSpace:"break-spaces",children:T.name}),e.jsxRuntimeExports.jsx(t.Td,{maxW:"20rem",children:T.sensorLocations.length}),e.jsxRuntimeExports.jsx(t.Td,{maxW:"20rem",children:e.jsxRuntimeExports.jsx(ye,{containerProps:{flexWrap:"wrap"},tags:T.useCases?.map(v=>v.name)??[]})})]},T.id))})]})})]})},Ae=({onSave:r,onCancel:n,onError:a,hideButtons:d=!1,setButtonDisabled:l,setButtonOnClick:c,quantumOwned:m})=>{const E=t.useToast(),[u,M]=o.useState("copy"),[O,g]=o.useState(""),[R,w]=o.useState([]),[i,x]=o.useState(!1),[C]=z.useQuery({query:A.GET_GROUPS}),[h]=z.useQuery({query:A.GET_ACTIONS_BY_GROUP,variables:{groupId:O},pause:!O}),[,y]=z.useMutation(A.CREATE_ACTION),[,S]=z.useMutation(A.CONVERT_ACTION_TO_QUANTUM_OWNED),T=o.useMemo(()=>C.data?.groups?C.data.groups.map(s=>j.getFragmentData(A.GROUP_FRAGMENT,s)):[],[C.data]),v=o.useMemo(()=>h.data?h.data.actions.map(p=>j.getFragmentData(A.ACTION_FRAGMENT,p)):[],[h.data]),F=o.useMemo(()=>v.filter(s=>R.includes(s.id)),[v,R]),N=o.useCallback(s=>{const p=s?.value||"";g(p),w([])},[]),D=o.useCallback(s=>{const p=s.map(f=>f.value);w(p)},[]),B=o.useCallback(async s=>{const p={...s,name:`${s.name} (Copy)`,description:s.description||void 0,instructionsPointOfInterest:s.instructionsPointOfInterest||void 0,instructionsMovementReport:s.instructionsMovementReport||void 0,laterality:s.laterality,activityKind:s.activityKind,sensorLocations:s.sensorLocations,thresholds:s.thresholds.map(L=>({...L,id:void 0})),quantumOwned:m,id:void 0},f=await y({fields:p});if(f.error)throw new Error(f.error.message);if(f.data?.createAction)return j.getFragmentData(A.ACTION_FRAGMENT,f.data.createAction);throw new Error("No action data returned")},[y,m]),H=o.useCallback(async s=>{const p=await S({id:s.id});if(p.error)throw new Error(p.error.message);if(p.data?.convertActionToQuantumOwned)return j.getFragmentData(A.ACTION_FRAGMENT,p.data.convertActionToQuantumOwned);throw new Error("No action data returned")},[S]),G=o.useCallback(async()=>{if(x(!0),!F.length){const s=new Error(`No activities selected for ${u==="copy"?"copying":"converting"}`);a?.(s),x(!1);return}try{const s=[];let p=0;const f=u==="copy"?B:H,L=u==="copy"?"copy":"convert";for(const U of F)try{const P=await f(U);s.push(P)}catch(P){console.error(`Failed to ${L} activity "${U.name}":`,P),p++}if(s.length>0){const U=s.length,P=F.length,Q=u==="copy"?"copied":"converted",$=u==="copy"?"copy":"convert";E({title:p>0?`Partial ${$} completed`:`Activities ${Q} successfully`,description:p>0?`${U} of ${P} activities ${Q} successfully`:`${U} activit${U>1?"ies":"y"} ${Q} successfully`,status:p>0?"warning":"success",duration:3e3,isClosable:!0}),r?.(),g(""),w([])}else throw new Error(`Failed to ${L} any activities`)}catch(s){const p=u==="copy"?"copy":"convert",f=s instanceof Error?s.message:`Failed to ${p} activities`;E({title:`${u==="copy"?"Copy":"Convert"} failed`,description:f,status:"error",duration:5e3,isClosable:!0}),a?.(s instanceof Error?s:new Error(f))}finally{x(!1)}},[F,u,B,H,E,r,a]),_=o.useCallback(()=>{g(""),w([]),M("copy"),n?.()},[n]);o.useEffect(()=>{l&&l({cancelButton:!1,saveButton:F.length===0||i})},[F.length,i,l]),o.useEffect(()=>{c&&c({cancelButton:_,saveButton:G})},[c,_,G]);const W=o.useMemo(()=>T.map(s=>({value:s.id,label:s.name})),[T]),b=o.useMemo(()=>v.filter(s=>u==="copy"?!0:!s.quantumOwned).map(s=>({value:s.id,label:s.name,isQuantumOwned:s.quantumOwned})),[v,u]),k=C.fetching,q=h.fetching;return e.jsxRuntimeExports.jsx(t.Box,{children:e.jsxRuntimeExports.jsxs(t.VStack,{spacing:6,align:"stretch",children:[m&&e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(V,{children:"Operation Mode"}),e.jsxRuntimeExports.jsx(t.RadioGroup,{value:u,onChange:s=>{M(s),w([])},children:e.jsxRuntimeExports.jsxs(t.HStack,{spacing:6,children:[e.jsxRuntimeExports.jsx(t.Radio,{value:"copy",colorScheme:"blue",children:e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"medium",children:"Copy Activities"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Create new activities based on selected ones"})]})}),e.jsxRuntimeExports.jsx(t.Radio,{value:"convert",colorScheme:"green",children:e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"medium",children:"Convert to Quantum Owned"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Convert existing activities to quantum-owned"})]})})]})})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(V,{children:"Select Source Group"}),e.jsxRuntimeExports.jsx(K.st,{placeholder:"Choose a group...",options:W,value:W.find(s=>s.value===O)||null,onChange:N,isLoading:k,isDisabled:k,isClearable:!0}),C.error&&e.jsxRuntimeExports.jsxs(t.Alert,{status:"error",mt:2,children:[e.jsxRuntimeExports.jsx(t.AlertIcon,{}),e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",children:["Failed to load groups: ",C.error.message]})]})]}),O&&e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsxs(V,{children:["Select Activities to"," ",u==="copy"?"Copy":"Convert"]}),q?e.jsxRuntimeExports.jsxs(t.HStack,{children:[e.jsxRuntimeExports.jsx(t.Spinner,{size:"sm"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Loading activities..."})]}):e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[e.jsxRuntimeExports.jsx(K.st,{placeholder:`Choose activities to ${u}...`,options:b,value:b.filter(s=>R.includes(s.value)),onChange:D,isDisabled:b.length===0,isClearable:!0,isMulti:!0,closeMenuOnSelect:!1,formatOptionLabel:(s,{context:p})=>e.jsxRuntimeExports.jsxs(t.HStack,{justify:"space-between",w:"100%",children:[e.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxRuntimeExports.jsx(t.Text,{children:s.label}),p==="value"&&s.isQuantumOwned&&e.jsxRuntimeExports.jsx(t.Text,{color:"blue",fontSize:"xs",children:"(Quantum Owned)"})]}),s.isQuantumOwned&&p==="menu"&&e.jsxRuntimeExports.jsx(t.Tag,{size:"sm",colorScheme:"blue",variant:"solid",children:"Quantum Owned"})]})}),b.length===0&&e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.500",mt:2,children:"No activities found"})]}),h.error&&e.jsxRuntimeExports.jsxs(t.Alert,{status:"error",mt:2,children:[e.jsxRuntimeExports.jsx(t.AlertIcon,{}),e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",children:["Failed to load activities: ",h.error.message]})]})]}),F.length>0&&e.jsxRuntimeExports.jsxs(t.Box,{p:4,bg:"gray.50",borderRadius:"md",children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"semibold",mb:3,children:F.length===1?`Activity to ${u==="copy"?"Copy":"Convert"}:`:`${F.length} Activities to ${u==="copy"?"Copy":"Convert"}:`}),e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:3,children:[F.map((s,p)=>e.jsxRuntimeExports.jsxs(t.Box,{w:"100%",p:3,bg:"white",borderRadius:"md",border:"1px solid",borderColor:"gray.200",children:[e.jsxRuntimeExports.jsxs(t.HStack,{justify:"space-between",align:"start",mb:2,children:[e.jsxRuntimeExports.jsxs(t.Text,{fontWeight:"medium",fontSize:"sm",children:[p+1,". ",s.name]}),s.quantumOwned&&e.jsxRuntimeExports.jsx(t.Tag,{size:"sm",colorScheme:"blue",variant:"solid",children:"Quantum Owned"})]}),e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,fontSize:"sm",color:"gray.600",children:[s.description&&e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Description:"})," ",s.description]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Type:"})," ",s.activityKind]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Laterality:"})," ",s.laterality]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Sensor Locations:"})," ",s.sensorLocations.length]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Thresholds:"})," ",s.thresholds.length]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Use Cases:"})," ",s.useCases.map(f=>f.name).join(", ")||"None"]})]})]},s.id)),F.length>1&&e.jsxRuntimeExports.jsx(t.Box,{w:"100%",p:2,bg:"blue.50",borderRadius:"md",border:"1px solid",borderColor:"blue.200",children:e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",fontWeight:"medium",color:"blue.800",children:["Total: ",F.length," activities will be"," ",u==="copy"?"copied":"converted"]})})]})]}),!d&&e.jsxRuntimeExports.jsxs(t.ButtonGroup,{spacing:4,justifyContent:"flex-end",children:[e.jsxRuntimeExports.jsx(t.Button,{variant:"outline",onClick:_,isDisabled:i,children:"Cancel"}),e.jsxRuntimeExports.jsxs(t.Button,{colorScheme:u==="copy"?"blue":"green",onClick:G,isDisabled:F.length===0||i,isLoading:i,loadingText:`${u==="copy"?"Copying":"Converting"}...`,children:[u==="copy"?"Copy":"Convert"," ",F.length===1?"Activity":`${F.length} Activities`]})]})]})})},we=({onSave:r,onCancel:n,onError:a,hideButtons:d=!1,setButtonDisabled:l,setButtonOnClick:c,quantumOwned:m})=>{const E=t.useToast(),[u,M]=o.useState(""),[O,g]=o.useState([]),[R,w]=o.useState(!1),[i,x]=o.useState("copy"),[C]=z.useQuery({query:A.GET_GROUPS}),[h]=z.useQuery({query:A.GET_MODULES_BY_GROUP,variables:{groupId:u},pause:!u}),[,y]=z.useMutation(A.CREATE_MODULE),[,S]=z.useMutation(A.UPDATE_MODULE),[,T]=z.useMutation(A.CREATE_ACTION),[,v]=z.useMutation(A.CONVERT_ACTION_TO_QUANTUM_OWNED),F=o.useMemo(()=>C.data?.groups?C.data.groups.map(s=>j.getFragmentData(A.GROUP_FRAGMENT,s)):[],[C.data]),N=o.useMemo(()=>h.data?.modules?j.getFragmentData(A.ACTION_MODULE_FRAGMENT,h.data?.modules).map(p=>{const f=j.getFragmentData(A.MODULE_ACTION_FRAGMENT,p.moduleActions);return{...p,moduleActions:f.map(L=>({...L,action:j.getFragmentData(A.ACTION_FRAGMENT,L.action)})),categories:j.getFragmentData(A.MODULE_CATEGORY_FRAGMENT,p.categories)}}):[],[h.data]),D=o.useMemo(()=>N.filter(s=>O.includes(s.id)),[N,O]),B=o.useCallback(s=>{const p=s?.value||"";M(p),g([])},[]),H=o.useCallback(s=>{const p=s.map(f=>f.value);g(p)},[]),G=o.useCallback(async()=>{if(w(!0),!D.length){w(!1);const s=new Error(`No modules selected for ${i==="convert"?"converting":"copying"}`);a?.(s);return}try{const s=[];let p=0;for(const f of D)try{let L=f.moduleActions.map(U=>U.actionId);if(m){const U=f.moduleActions.map($=>$.action),P=async $=>{if(i==="copy"){if($.quantumOwned)return $;const oe={...$,quantumOwned:!0,thresholds:$.thresholds.map(se=>({...se,id:void 0})),id:void 0},J=await T({fields:oe});return J.error||!J.data?.createAction?null:j.getFragmentData(A.ACTION_FRAGMENT,J.data.createAction)}if($.quantumOwned)return $;const ee=await v({id:$.id});return ee.error||!ee.data?.convertActionToQuantumOwned?null:j.getFragmentData(A.ACTION_FRAGMENT,ee.data.convertActionToQuantumOwned)};L=(await Promise.all(U.map(P))).filter($=>!!$).map($=>$.id)}if(i==="convert"){const U={name:f.name,description:f.description||void 0,actions:L,categories:f.categories.map(Q=>Q.id),quantumOwned:!0},P=await S({id:f.id,input:U});if(P.error)throw new Error(P.error.message);if(P.data?.updateModule){const Q=j.getFragmentData(A.ACTION_MODULE_FRAGMENT,P.data.updateModule);s.push(Q)}}else{const U={name:`${f.name} (Copy)`,description:f.description||void 0,actions:L,categories:f.categories.map(Q=>Q.id),quantumOwned:m},P=await y({input:U});if(P.error)throw new Error(P.error.message);if(P.data?.createModule){const Q=j.getFragmentData(A.ACTION_MODULE_FRAGMENT,P.data.createModule);s.push(Q)}}}catch(L){console.error(`Failed to ${i==="convert"?"convert":"copy"} module "${f.name}":`,L),p++}if(s.length>0){const f=s.length,L=D.length;E({title:p>0?`Partial ${i==="convert"?"convert":"copy"} completed`:`Modules ${i==="convert"?"converted":"copied"} successfully`,description:p>0?`${f} of ${L} modules ${i==="convert"?"converted":"copied"} successfully`:`${f} module${f>1?"s":""} ${i==="convert"?"converted":"copied"} successfully`,status:p>0?"warning":"success",duration:3e3,isClosable:!0}),s.length>0&&r?.(),M(""),g([])}else throw new Error(`Failed to ${i==="convert"?"convert":"copy"} any modules`)}catch(s){const p=s instanceof Error?s.message:`Failed to ${i==="convert"?"convert":"copy"} modules`;E({title:i==="convert"?"Convert failed":"Copy failed",description:p,status:"error",duration:5e3,isClosable:!0}),a?.(s instanceof Error?s:new Error(p))}finally{w(!1)}},[D,y,S,E,r,a,m,T,v,i]),_=o.useCallback(()=>{M(""),g([]),x("copy"),n?.()},[n]);o.useEffect(()=>{l&&l({cancelButton:!1,saveButton:D.length===0||R})},[D.length,R,l]),o.useEffect(()=>{c&&c({cancelButton:_,saveButton:G})},[c,_,G]);const W=o.useMemo(()=>F.map(s=>({value:s.id,label:s.name})),[F]),b=o.useMemo(()=>N.filter(s=>i==="copy"?!0:!s.quantumOwned).map(s=>({value:s.id,label:s.name,isQuantumOwned:s.quantumOwned})),[N,i]),k=C.fetching,q=h.fetching;return e.jsxRuntimeExports.jsx(t.Box,{children:e.jsxRuntimeExports.jsxs(t.VStack,{spacing:6,align:"stretch",children:[m&&e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(V,{children:"Operation Mode"}),e.jsxRuntimeExports.jsx(t.RadioGroup,{value:i,onChange:s=>{x(s),g([])},children:e.jsxRuntimeExports.jsxs(t.HStack,{spacing:6,children:[e.jsxRuntimeExports.jsx(t.Radio,{value:"copy",colorScheme:"blue",children:e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"medium",children:"Copy Modules"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Create new modules based on selected ones"})]})}),e.jsxRuntimeExports.jsx(t.Radio,{value:"convert",colorScheme:"green",children:e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"medium",children:"Convert to Quantum Owned"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Convert existing modules to quantum-owned"})]})})]})})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(V,{children:"Select Source Group"}),e.jsxRuntimeExports.jsx(K.st,{placeholder:"Choose a group...",options:W,value:W.find(s=>s.value===u)||null,onChange:B,isLoading:k,isDisabled:k,isClearable:!0}),C.error&&e.jsxRuntimeExports.jsxs(t.Alert,{status:"error",mt:2,children:[e.jsxRuntimeExports.jsx(t.AlertIcon,{}),e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",children:["Failed to load groups: ",C.error.message]})]})]}),u&&e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(V,{children:i==="convert"?"Select Module to Convert":"Select Module to Copy"}),q?e.jsxRuntimeExports.jsxs(t.HStack,{children:[e.jsxRuntimeExports.jsx(t.Spinner,{size:"sm"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Loading modules..."})]}):e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[e.jsxRuntimeExports.jsx(K.st,{placeholder:i==="convert"?"Choose modules to convert...":"Choose modules to copy...",options:b,value:b.filter(s=>O.includes(s.value)),onChange:H,isDisabled:b.length===0,isClearable:!0,isMulti:!0,closeMenuOnSelect:!1,formatOptionLabel:(s,{context:p})=>e.jsxRuntimeExports.jsxs(t.HStack,{justify:"space-between",w:"100%",children:[e.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxRuntimeExports.jsx(t.Text,{children:s.label}),p==="value"&&s.isQuantumOwned&&e.jsxRuntimeExports.jsx(t.Text,{color:"blue",fontSize:"xs",children:"(Quantum Owned)"})]}),s.isQuantumOwned&&p==="menu"&&e.jsxRuntimeExports.jsx(t.Tag,{size:"sm",colorScheme:"blue",variant:"solid",children:"Quantum Owned"})]})}),b.length===0&&e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.500",mt:2,children:"No modules found in this group"})]}),h.error&&e.jsxRuntimeExports.jsxs(t.Alert,{status:"error",mt:2,children:[e.jsxRuntimeExports.jsx(t.AlertIcon,{}),e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",children:["Failed to load modules: ",h.error.message]})]})]}),D.length>0&&e.jsxRuntimeExports.jsxs(t.Box,{p:4,bg:"gray.50",borderRadius:"md",children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"semibold",mb:3,children:D.length===1?`Module to ${i==="copy"?"Copy":"Convert"}`:`${D.length} Modules to ${i==="copy"?"Copy":"Convert"}`}),e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:3,children:[D.map((s,p)=>e.jsxRuntimeExports.jsxs(t.Box,{w:"100%",p:3,bg:"white",borderRadius:"md",border:"1px solid",borderColor:"gray.200",children:[e.jsxRuntimeExports.jsxs(t.HStack,{justify:"space-between",align:"start",mb:2,children:[e.jsxRuntimeExports.jsxs(t.Text,{fontWeight:"medium",fontSize:"sm",children:[p+1,". ",s.name]}),s.quantumOwned&&e.jsxRuntimeExports.jsx(t.Tag,{size:"sm",colorScheme:"blue",variant:"solid",children:"Quantum Owned"})]}),e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,fontSize:"sm",color:"gray.600",children:[s.description&&e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Description:"})," ",s.description]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Actions:"})," ",s.moduleActions.length]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Categories:"})," ",s.categories.map(f=>f.name).join(", ")||"None"]})]})]},s.id)),D.length>1&&e.jsxRuntimeExports.jsx(t.Box,{w:"100%",p:2,bg:"blue.50",borderRadius:"md",border:"1px solid",borderColor:"blue.200",children:e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",fontWeight:"medium",color:"blue.800",children:["Total: ",D.length," modules will be"," ",i==="copy"?"copied":"converted"]})}),m&&D.filter(s=>s.moduleActions.some(p=>!p.action.quantumOwned)).length>0&&e.jsxRuntimeExports.jsx(t.Box,{p:2,bg:"yellow.50",borderRadius:"md",border:"1px solid",borderColor:"yellow.200",children:e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",fontWeight:"medium",color:"yellow.800",children:i==="convert"?"Converting Modules will convert non QM-Owned Actions to QM-Owned":"Copying Modules with Non QM-Owned Actions will create corresponding QM-Owned Actions"})})]})]}),!d&&e.jsxRuntimeExports.jsxs(t.ButtonGroup,{spacing:4,justifyContent:"flex-end",children:[e.jsxRuntimeExports.jsx(t.Button,{variant:"outline",onClick:_,isDisabled:R,children:"Cancel"}),e.jsxRuntimeExports.jsxs(t.Button,{colorScheme:i==="copy"?"blue":"green",onClick:G,isDisabled:D.length===0||R,isLoading:R,loadingText:`${i==="copy"?"Copying":"Converting"}...`,children:[i==="copy"?"Copy":"Convert"," ",D.length===1?"Module":`${D.length} Modules`]})]})]})})},pe=({name:r,setName:n,actions:a,selectedActionIds:d,setSelectedActionIds:l,availableCategories:c,selectedCategoryIds:m,setSelectedCategoryIds:E,description:u,setDescription:M,...O})=>{const g=t.useDisclosure(),R=o.useMemo(()=>a.map(y=>({...y,selected:d.includes(y.id)})),[a,d]),w=o.useMemo(()=>a.reduce((y,S)=>(y[S.id]=S,y),{}),[a]),i=o.useMemo(()=>d.map(y=>w[y]),[R,d]),x=o.useCallback((y,S)=>{l(S?[...d,y.id]:d.filter(T=>T!==y.id))},[d,l]),C=o.useCallback(y=>{n(y.target.value)},[n]),h=o.useCallback(y=>{M?.(y.target.value)},[M]);return e.jsxRuntimeExports.jsxs(t.Box,{...O,children:[e.jsxRuntimeExports.jsxs(t.HStack,{gap:"2rem",children:[e.jsxRuntimeExports.jsx(Fe,{name:r??"",onInputChange:C}),e.jsxRuntimeExports.jsx(Oe,{availableCategories:c,value:m,onChange:E})]}),e.jsxRuntimeExports.jsx(Ne,{description:u??"",onInputChange:h}),e.jsxRuntimeExports.jsx(Ie,{value:i,onChange:l,onAdjustActivities:()=>g.onOpen()}),e.jsxRuntimeExports.jsxs(t.Modal,{isOpen:g.isOpen,onClose:g.onClose,size:"6xl",children:[e.jsxRuntimeExports.jsx(t.ModalOverlay,{}),e.jsxRuntimeExports.jsxs(t.ModalContent,{children:[e.jsxRuntimeExports.jsx(t.ModalHeader,{children:"Select Activities"}),e.jsxRuntimeExports.jsx(t.ModalCloseButton,{}),e.jsxRuntimeExports.jsx(t.ModalBody,{children:e.jsxRuntimeExports.jsx(me,{actions:R,onSelected:x,disableCreate:!0,disableDelete:!0,tableProps:{height:"28rem",overflowY:"auto"}})}),e.jsxRuntimeExports.jsx(t.ModalFooter,{children:e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"blue",onClick:g.onClose,isDisabled:d.length===0,children:"Done"})})]})]})]})},Fe=o.memo(({name:r,onInputChange:n})=>e.jsxRuntimeExports.jsxs(t.FormControl,{mb:4,children:[e.jsxRuntimeExports.jsx(V,{children:"Module Name"}),e.jsxRuntimeExports.jsx(t.Input,{placeholder:"i.e. ACL RTP Test Battery",value:r,onChange:n,isRequired:!0})]})),Oe=o.memo(({availableCategories:r,value:n,onChange:a})=>{const d=o.useMemo(()=>[...r,{id:"other",name:"Other"}],[r]),l=o.useMemo(()=>d.map(c=>({value:c.id,label:c.name})),[d]);return e.jsxRuntimeExports.jsxs(t.FormControl,{mb:4,children:[e.jsxRuntimeExports.jsx(V,{children:"Module Category"}),e.jsxRuntimeExports.jsx(K.st,{isDisabled:r.length===0,isClearable:!0,options:l,value:d.filter(c=>n.includes(c.id)).map(c=>({value:c.id,label:c.name})),onChange:c=>a(c?[c.value]:[]),placeholder:"Select category"})]})}),Ne=o.memo(({description:r,onInputChange:n})=>e.jsxRuntimeExports.jsxs(t.FormControl,{mb:4,children:[e.jsxRuntimeExports.jsx(V,{children:e.jsxRuntimeExports.jsxs("span",{children:["Description",e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.500",children:"Briefly describe the objective of this module. Max 40 words."})]})}),e.jsxRuntimeExports.jsx(t.Input,{placeholder:"i.e. Assess readiness to return to play post-ACL reconstruction",value:r,onChange:n})]})),Ie=o.memo(({value:r,onChange:n,onAdjustActivities:a})=>{const d=o.useMemo(()=>r.map(l=>({id:l.id,name:l.name})),[r]);return e.jsxRuntimeExports.jsxs(t.FormControl,{mb:4,children:[e.jsxRuntimeExports.jsxs(t.HStack,{justifyContent:"space-between",children:[e.jsxRuntimeExports.jsx(V,{children:e.jsxRuntimeExports.jsxs("span",{children:["Activities",e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.500",children:"Drag and drop to reorder the activities in this module."})]})}),e.jsxRuntimeExports.jsx(t.Button,{size:"sm",variant:"solid",colorScheme:"blue",onClick:a,children:"Add / Remove Activities"})]}),d.length===0?e.jsxRuntimeExports.jsx(t.VStack,{children:e.jsxRuntimeExports.jsxs(t.Text,{color:"gray.500",fontSize:"lg",mb:"4rem",mt:"4rem",children:["No activities selected for this module.",e.jsxRuntimeExports.jsx(t.Button,{ml:"0.5em",size:"sm",variant:"link",colorScheme:"blue",onClick:a,children:"Add activities."})]})}):e.jsxRuntimeExports.jsx(Ce,{value:d,onChange:l=>{const c=l(d);n(c.map(m=>m.id))}})]})}),he=({value:r,onChange:n,forceKind:a,disableRemove:d,disableKind:l,lockRanges:c,...m})=>{const E=o.useMemo(()=>[...r].sort((g,R)=>{const w=te.availablePlanes.indexOf(g.plane),i=te.availablePlanes.indexOf(R.plane);return w-i}),[r]),u=o.useCallback(g=>"segment"in g.id?Z.getSegmentNameWithPlane(g.id.segment,g.plane,!0)??"Unknown":Z.getJointNameWithPlane(g.id.joint,g.plane,!0)??"Unknown",[]),M=o.useCallback((g,R)=>{const w=E.findIndex(x=>x.id===R.id&&x.plane===R.plane);let i=[...E];a&&(R={...R,kind:a}),i[w]=R,c&&(i=i.map(x=>({...x,min:R.min,max:R.max}))),n(i)},[n,E,a,c]),O=o.useCallback(g=>{const R=E.filter(w=>w.id!==g.id||w.plane!==g.plane);n(R)},[n,E]);return e.jsxRuntimeExports.jsx(t.VStack,{alignItems:"flex-start",overflowY:"auto",...m,children:E.map((g,R)=>e.jsxRuntimeExports.jsx(ke,{label:u(g),parameter:g,onChange:w=>M(R,w),onRemove:d?void 0:()=>O(g),forceKind:a,disableKind:l},`${JSON.stringify(g.id)}-${g.plane}`))})},ke=({label:r,parameter:n,onChange:a,onRemove:d,forceKind:l,disableKind:c})=>{const m=o.useCallback(M=>"joint"in n.id?Z.getJointAngleDirectionName(n.id.joint,n.plane,M<0?-1:1):Z.getSegmentAngleDirectionName(n.id.segment,n.plane,M<0?-1:1),[n]),{min:E,max:u}="joint"in n.id?Z.getNormativeJointRange(n.id.joint,n.plane):{min:-180,max:180};return e.jsxRuntimeExports.jsxs(t.VStack,{borderRadius:"md",p:2,px:4,bg:"gray.100",w:"100%",overflow:"hidden",flexShrink:"0",children:[e.jsxRuntimeExports.jsxs(t.HStack,{w:"100%",children:[e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",flex:1,textTransform:"capitalize",fontWeight:"semibold",children:r}),d&&e.jsxRuntimeExports.jsx(t.IconButton,{size:"xs",variant:"ghost","aria-label":"delete",icon:e.jsxRuntimeExports.jsx(t.Icon,{as:de.FaTrash}),onClick:d}),!l&&e.jsxRuntimeExports.jsx(xe,{selectedItem:n?.kind??j.ThresholdKind.Limit,onChange:({value:M})=>a({...n,kind:M}),isDisabled:c,buttonProps:{size:"sm",variant:"outline",colorScheme:"gray"},selectedProps:{variant:"solid",colorScheme:"teal"},items:[{value:j.ThresholdKind.Limit,label:"limit"},{value:j.ThresholdKind.Target,label:"target"}]})]}),e.jsxRuntimeExports.jsx(be,{w:"100%",size:"xs",min:E,max:u,zeroMarker:!0,value:[n.min,n.max],onChange:M=>a({...n,min:M[0],max:M[1]}),formatValue:M=>`${Math.abs(M)}°`,valueLabel:M=>m(M)??"",positiveNegativeLabels:m(0)?[m(-1)??"",m(1)??""]:void 0})]})},le=(r,n)=>"segment"in r&&"segment"in n&&r.segment===n.segment||"joint"in r&&"joint"in n&&r.joint===n.joint,je=({options:r,value:n,onChange:a,forceKind:d,singleValue:l,singleValueSideless:c,editOnly:m,disableKind:E,maxParameters:u,...M})=>{const O=c?2:u,g=o.useMemo(()=>r.map(x=>({label:"segment"in x.id?Z.getSegmentNameWithPlane(x.id.segment,x.plane,!0)??"Unknown":Z.getJointNameWithPlane(x.id.joint,x.plane,!0)??"Unknown",value:x.id,plane:x.plane})),[r]),R=o.useMemo(()=>{if(!c||n.length===0)return g;const x=n[0];return g.filter(C=>te.getAnalysisPartIdNoSide(C.value)===te.getAnalysisPartIdNoSide(x.id)&&C.plane===x.plane)},[g,n,c]),w=o.useMemo(()=>g.filter(x=>n.some(C=>le(C.id,x.value)&&C.plane===x.plane)),[g,n]),i=o.useCallback(x=>{const C=x.map(h=>{const y=n.find(N=>le(N.id,h.value)&&N.plane===h.plane),S=r.find(N=>le(N.id,h.value)&&N.plane===h.plane),T=c?n.find(N=>te.getAnalysisPartIdNoSide(N.id)===te.getAnalysisPartIdNoSide(h.value)&&N.plane===h.plane):void 0,v=T&&!y?T.min:S&&S.min?S.min:0,F=T&&!y?T.max:S&&S.max?S.max:0;return y??{id:h.value,plane:h.plane,min:v,max:F,kind:d??j.ThresholdKind.Limit}});a(C)},[a,n,r,d,c]);return o.useEffect(()=>{const x=n.filter(C=>r.some(h=>le(h.id,C.id)&&h.plane===C.plane));x.length!==n.length&&a(x)},[r,a]),e.jsxRuntimeExports.jsxs(t.Box,{...M,children:[e.jsxRuntimeExports.jsx(K.st,{isMulti:!l,placeholder:n.length?`${n.length} selected`:"Search...",value:w,isDisabled:m||w.length>=(O??1/0),onChange:x=>Array.isArray(x)?i([...x]):i(x!==null?[x]:[]),options:R,controlShouldRenderValue:!1}),e.jsxRuntimeExports.jsx(he,{marginTop:2,maxH:"28rem",value:n,onChange:a,forceKind:d,disableKind:E,lockRanges:c})]})},ge=r=>{switch(r){case j.SensorLocation.Thorax:return"Thorax";case j.SensorLocation.CenterBack:return"Center Back";case j.SensorLocation.Pelvis:return"Pelvis";case j.SensorLocation.LeftThigh:return"Left Thigh";case j.SensorLocation.RightThigh:return"Right Thigh";case j.SensorLocation.LeftShank:return"Left Shank";case j.SensorLocation.RightShank:return"Right Shank";case j.SensorLocation.LeftFoot:return"Left Foot";case j.SensorLocation.RightFoot:return"Right Foot";case j.SensorLocation.LeftUpperArm:return"Left Upper Arm";case j.SensorLocation.RightUpperArm:return"Right Upper Arm";case j.SensorLocation.LeftForearm:return"Left Forearm";case j.SensorLocation.RightForearm:return"Right Forearm";case j.SensorLocation.Head:return"Head"}return console.warn(`Unknown sensor location: ${r}`),"Unknown"},Le=6,De=[j.SensorLocation.LeftFoot,j.SensorLocation.LeftShank,j.SensorLocation.LeftThigh,j.SensorLocation.Pelvis,j.SensorLocation.RightFoot,j.SensorLocation.RightShank,j.SensorLocation.RightThigh,j.SensorLocation.Thorax,j.SensorLocation.CenterBack,j.SensorLocation.Head],_e=De.map(r=>({label:ge(r),value:r})),ue=r=>r.map(n=>n.__isNew__?{name:n.label}:{id:n.value,name:n.label}),Be=({id:r,onError:n,onCancel:a,onSave:d,hideButtons:l,setButtonOnClick:c,setButtonDisabled:m,quantumOwned:E})=>{const u=z.useClient(),[{fetching:M},O]=z.useMutation(A.CREATE_ACTION),[{fetching:g},R]=z.useMutation(A.UPDATE_ACTION),[{data:w}]=z.useQuery({query:A.GET_ACTION_BY_ID,variables:{id:r??""},pause:!r}),i=j.getFragmentData(A.ACTION_FRAGMENT,w?.getActionById),x=M||g,C=!!i&&!!r,[h,y]=o.useState(""),[S,T]=o.useState(""),[v,F]=o.useState(""),[N,D]=o.useState(""),[B,H]=o.useState(j.ActionLaterality.Either),[G,_]=o.useState(j.ActionActivityKind.Action),[W,b]=o.useState([]),[k,q]=o.useState([]),s=o.useMemo(()=>W.map(I=>I.value),[W]),p=Re.usePartOptionsForSensorLocations(s),[f,L]=o.useState([]),[U,P]=o.useState(!1),Q=h.length&&B;o.useEffect(()=>{i&&(y(i.name),_(i.activityKind),T(i.description||""),H(i.laterality),q(i.useCases.map(I=>({id:I.id,value:I.id,label:I.name,__isNew__:!1}))),F(i.instructionsPointOfInterest||""),D(i.instructionsMovementReport||""),b(i.sensorLocations.map(I=>({label:ge(I),value:I}))),L(ne.thresholdsToParameters(i.thresholds)))},[i]);const $=o.useCallback(async I=>(await u.query(E?A.SEARCH_QUANTUM_OWNED_USE_CASES:A.SEARCH_USE_CASES,{query:I,limit:10}).then(X=>{const ie=X.data;return ie?ie?.quantumOwnedUseCases?ie.quantumOwnedUseCases:ie.useCases:[]})??[]).map(X=>({label:X.name,value:X.id})),[u,E]),[ee,oe]=o.useState({});o.useEffect(()=>{oe({name:h,laterality:B,description:S,instructionsPointOfInterest:v,instructionsMovementReport:N,sensorLocations:s,thresholds:ne.parametersToThresholds(f),useCases:ue(k),activityKind:G})},[oe,i]);const J=o.useMemo(()=>JSON.stringify(ee)!==JSON.stringify({name:h,laterality:B,description:S,instructionsPointOfInterest:v,instructionsMovementReport:N,sensorLocations:s,thresholds:ne.parametersToThresholds(f),useCases:ue(k),activityKind:G}),[ee,h,B,s,S,N,v,f,k,G]),se=o.useCallback(()=>{const I={name:h,laterality:B,description:S,instructionsPointOfInterest:v,instructionsMovementReport:N,sensorLocations:s,thresholds:ne.parametersToThresholds(f),useCases:ue(k),activityKind:G,quantumOwned:E};let re;C&&r?re=R({id:r,fields:I}):re=O({fields:I}),re.then(({error:X})=>{X?n(X):d()})},[E,O,R,r,h,B,s,d,S,N,v,C,f,k,G,n]);return o.useEffect(()=>{m&&m({cancelButton:x,saveButton:x||!Q||!J})},[x,m,Q,J]),o.useEffect(()=>{c&&c({cancelButton:a,saveButton:se})},[c,a,se]),e.jsxRuntimeExports.jsxs("div",{className:"grid grid-cols-2 gap-4 w-full",children:[e.jsxRuntimeExports.jsxs("div",{className:"col-span-2 lg:col-span-1 flex flex-col gap-8",children:[e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Y,{children:"Name"}),e.jsxRuntimeExports.jsx(t.Input,{value:h,onChange:I=>y(I.target.value),type:"text",placeholder:"i.e. Lunge & Return"})]}),e.jsxRuntimeExports.jsxs(t.HStack,{m:"0",p:"0",w:"100%",justifyItems:"space-between",children:[e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Y,{children:"Activity Type"}),e.jsxRuntimeExports.jsx(xe,{selectedItem:G,onChange:I=>_(I.value),buttonProps:{size:"sm",variant:"outline",colorScheme:"gray"},selectedProps:{variant:"solid",colorScheme:"teal"},items:[{value:j.ActionActivityKind.Action,label:"Action"},{value:j.ActionActivityKind.Movement,label:"Movement"}]})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Y,{children:"Laterality"}),e.jsxRuntimeExports.jsx(xe,{selectedItem:B,onChange:I=>H(I.value),buttonProps:{size:"sm",variant:"outline",colorScheme:"gray"},selectedProps:{variant:"solid",colorScheme:"teal"},items:[{value:j.ActionLaterality.Unilateral,label:"unilateral"},{value:j.ActionLaterality.Bilateral,label:"bilateral"},{value:j.ActionLaterality.Either,label:"either / or"}]})]})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Y,{children:"Use Cases"}),e.jsxRuntimeExports.jsx(t.Tooltip,{isOpen:U,label:"Type to search for existing use cases",placement:"top-end",children:e.jsxRuntimeExports.jsx(t.Box,{children:e.jsxRuntimeExports.jsx(K.yt,{value:k,onChange:I=>q([...I]),isMulti:!0,cacheOptions:!0,defaultOptions:!0,onFocus:()=>P(!0),onBlur:()=>P(!1),loadOptions:$,placeholder:"(optional) Search for & select use cases…"})})})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Y,{children:"Description"}),e.jsxRuntimeExports.jsx(t.Textarea,{value:S,onChange:I=>T(I.target.value),rows:2,placeholder:"(optional) Describe how to perform the test or exercise"})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Y,{children:"Instructions for General Movement Report"}),e.jsxRuntimeExports.jsx(t.Textarea,{value:N,onChange:I=>D(I.target.value),rows:2,placeholder:"(optional) Describe how to setup or generate the movement report"})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Y,{children:"Instructions for Point of Interest Report"}),e.jsxRuntimeExports.jsx(t.Textarea,{value:v,onChange:I=>F(I.target.value),rows:2,placeholder:"(optional) Describe how to setup or generate the point of interest report"})]})]}),e.jsxRuntimeExports.jsxs("div",{className:"col-span-2 lg:col-span-1 flex flex-col gap-8",children:[e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Y,{children:"Sensor Locations"}),e.jsxRuntimeExports.jsx(K.st,{isMulti:!0,value:W,onChange:I=>b([...I]),options:_e,isOptionDisabled:()=>W.length>=Le})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Y,{children:"Default Parameters"}),e.jsxRuntimeExports.jsx(je,{options:p,value:f,onChange:L})]})]}),e.jsxRuntimeExports.jsx("div",{className:ne.cn("col-span-2 flex justify-end",l&&"hidden"),children:e.jsxRuntimeExports.jsxs(t.ButtonGroup,{mt:16,gap:4,children:[e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"gray",isDisabled:x,onClick:a,children:"Cancel"}),e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"blue",isDisabled:x||!Q||!J,isLoading:x,onClick:se,children:"Save changes"})]})})]})},Y=({children:r})=>e.jsxRuntimeExports.jsx(t.FormLabel,{fontWeight:"bold",fontFamily:"sans-serif",fontSize:"large",children:r}),Ue=({id:r,onCancel:n,onSave:a,onError:d,hideButtons:l,quantumOwned:c,setButtonOnClick:m,setButtonDisabled:E})=>{const[{data:u}]=z.useQuery({query:c?A.GET_QUANTUM_OWNED_ACTIONS:A.GET_ACTIONS}),[{data:M}]=z.useQuery({query:A.GET_MODULE_BY_ID,variables:{id:r},pause:!r}),[{data:O}]=z.useQuery({query:A.GET_ALL_MODULE_CATEGORIES}),g=j.getFragmentData(A.MODULE_CATEGORY_FRAGMENT,O?.moduleCategories),[{fetching:R},w]=z.useMutation(A.UPDATE_MODULE),[{fetching:i},x]=z.useMutation(A.CREATE_MODULE),C=j.getFragmentData(A.ACTION_FRAGMENT,c?u?.quantumOwnedActions:u?.actions)??[],h=j.getFragmentData(A.ACTION_MODULE_FRAGMENT,M?.module),y=j.getFragmentData(A.MODULE_ACTION_FRAGMENT,h?.moduleActions)??[],[S,T]=o.useState([...y.map(_=>_.actionId)??[]]),[v,F]=o.useState(h?.name??""),[N,D]=o.useState([]),[B,H]=o.useState(h?.description??"");o.useEffect(()=>{h&&(T(y.map(_=>_.actionId)),F(h.name),H(h.description??""),D(h.categories.map(_=>j.getFragmentData(A.MODULE_CATEGORY_FRAGMENT,_).id)??[]))},[h,y]);const G=o.useCallback(()=>{let _;const W={actions:S,name:v,categories:N.filter(b=>b!=="other"),description:B,quantumOwned:c};h?_=w({id:h.id,input:W}):_=x({input:W}),_.then(({error:b})=>{b?d(b):a()})},[x,w,S,v,B,N,h,a,d]);return o.useEffect(()=>{E&&E({cancelButton:R||i,saveButton:R||i||!v||B.trim().split(/\s+/).filter(Boolean).length>40})},[E,R,i,S,v,B]),o.useEffect(()=>{m&&m({cancelButton:n,saveButton:G})},[m,n,G]),e.jsxRuntimeExports.jsxs(t.Box,{width:"100%",children:[e.jsxRuntimeExports.jsx(pe,{name:v,setName:F,actions:C,selectedActionIds:S,setSelectedActionIds:T,availableCategories:g??[],selectedCategoryIds:N,setSelectedCategoryIds:D,description:B,setDescription:H}),!l&&e.jsxRuntimeExports.jsx(t.HStack,{justifyContent:"flex-start",children:e.jsxRuntimeExports.jsxs(t.ButtonGroup,{mt:16,gap:4,children:[e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"gray",isDisabled:R||i,onClick:n,children:"Cancel"}),e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"blue",isDisabled:R||i||!v||B.trim().split(/\s+/).filter(Boolean).length>40,isLoading:R||i,onClick:G,children:"Save"})]})})]})};exports.ActivityList=me;exports.CopyActivityForm=Ae;exports.CopyModuleForm=we;exports.ModuleForm=pe;exports.ParameterEditList=he;exports.ParameterEditSelect=je;exports.UpsertActivityForm=Be;exports.UpsertModuleForm=Ue;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./react-jsx-runtime-vendor-Dszzpdy0.cjs"),t=require("@chakra-ui/react"),r=require("react"),ge=require("./ufuzzy-vendor-7qHa_k39.cjs"),X=require("./react-select-vendor-D_Q2fL5j.cjs"),de=require("./react-icons-vendor-D2s8zw9h.cjs"),Q=require("./graphql-vendor-B-QTAQSb.cjs"),$=require("./generated.cjs"),y=require("./graphql-C6M9oyU0.cjs"),le=require("./react-dnd-vendor-BPzSDojS.cjs"),F=require("./generated-graphql.cjs"),K=require("./services.cjs"),oe=require("./types.cjs"),re=require("./utils.cjs"),Ee=require("./hooks.cjs"),Re=({setSearch:o,actions:n,updateUseCases:l,hideUseCaseFilter:d=!1})=>{const m=r.useMemo(()=>n?.flatMap(c=>c.useCases).filter((c,x,f)=>f.findIndex(i=>i.id===c.id)===x).map(c=>({label:c.name,value:c.id}))||[],[n]);return e.jsxRuntimeExports.jsxs(t.Flex,{width:"100%",alignContent:"space-evenly",gap:4,children:[e.jsxRuntimeExports.jsxs(t.InputGroup,{size:"md",flex:1,children:[e.jsxRuntimeExports.jsx(t.InputLeftElement,{children:e.jsxRuntimeExports.jsx(t.Icon,{as:de.FaSearch,color:"gray.300"})}),e.jsxRuntimeExports.jsx(t.Input,{placeholder:"Search by name...",width:"100%",maxW:d?void 0:"30rem",onChange:c=>o(c.target.value)})]}),!d&&e.jsxRuntimeExports.jsx(t.InputGroup,{size:"md",children:e.jsxRuntimeExports.jsx(X.st,{size:"md",chakraStyles:{container:c=>({...c,width:"100%"})},menuPortalTarget:document.body,placeholder:"Filter use case",isMulti:!0,options:m,onChange:c=>l(c.map(x=>x.value))})})]})},Z=({children:o})=>e.jsxRuntimeExports.jsx(t.FormLabel,{fontWeight:"bold",fontFamily:"sans-serif",fontSize:"large",children:o}),fe=({value:o,onChange:n})=>{const l=r.useState(()=>Math.random().toString(36).substring(2,15))[0],d=r.useCallback((m,c)=>{n(x=>{const f=[...x],[i]=f.splice(m,1);return f.splice(c,0,i),f})},[n]);return e.jsxRuntimeExports.jsx(t.Box,{children:e.jsxRuntimeExports.jsx(le.DndProvider,{backend:le.HTML5Backend,children:e.jsxRuntimeExports.jsx(t.TableContainer,{children:e.jsxRuntimeExports.jsxs(t.Table,{variant:"simple",size:"md",children:[e.jsxRuntimeExports.jsx(t.Thead,{children:e.jsxRuntimeExports.jsxs(t.Tr,{children:[e.jsxRuntimeExports.jsx(t.Th,{children:"Order"}),e.jsxRuntimeExports.jsx(t.Th,{children:"Name"})]})}),e.jsxRuntimeExports.jsx(t.Tbody,{children:o.map((m,c)=>e.jsxRuntimeExports.jsx(be,{listKey:l,index:c,id:m.id,name:m.name,move:d},m.id))})]})})})})},be=({listKey:o,index:n,id:l,name:d,move:m})=>{const c=r.useRef(null),[{handlerId:x},f]=le.useDrop({accept:o,collect:p=>({handlerId:p.getHandlerId()?.toString()??""}),hover:(p,S)=>{if(!c.current)return;const a=p.index,u=n;if(a===u)return;const j=c.current?.getBoundingClientRect(),g=(j.bottom-j.top)/2,C=S.getClientOffset().y-j.top;a<u&&C<g||a>u&&C>g||(m(a,u),p.index=u)}}),[{isDragging:i},N]=le.useDrag({type:o,item:()=>({id:l,index:n}),collect:p=>({isDragging:p.isDragging()})}),E=i?.6:1,M=i?"grabbing":"grab";return N(f(c)),e.jsxRuntimeExports.jsxs(t.Tr,{ref:c,style:{opacity:E,cursor:M},"data-handler-id":x,children:[e.jsxRuntimeExports.jsx(t.Td,{children:n+1}),e.jsxRuntimeExports.jsx(t.Td,{children:d})]})},ve=({items:o,onChange:n,selectedItem:l,isDisabled:d,selectedProps:m,buttonProps:c})=>{const x=i=>i===l||i.value===l,f=i=>x(i)?{...c,...m}:c;return e.jsxRuntimeExports.jsx(t.ButtonGroup,{isAttached:!0,isDisabled:d,children:o.map((i,N)=>e.jsxRuntimeExports.jsx(t.Tooltip,{label:i.tooltip,openDelay:50,closeDelay:200,placement:"top",visibility:i.tooltip?"visible":"hidden",hasArrow:!0,children:e.jsxRuntimeExports.jsx(t.Button,{onClick:()=>x(i)?null:n(i,N),isDisabled:i.disabled,...f(i),children:i.label})},N))})},ie=(o,n)=>n<0?-1*Math.abs(o):Math.abs(o),ye=({isReversed:o,min:n,max:l,value:d,onChange:m,inputProps:c,size:x,zeroMarker:f,formatValue:i,valueLabel:N,positiveNegativeLabels:E,isDisabled:M,...p})=>{const[S,a]=r.useState([void 0,void 0]),u=S[0],j=S[1],g=f&&n<-5&&l>5,b=Number(d?.[0]??j??n)>0?1:-1,C=Number(d?.[1]??j??l)<0?-1:1,z=E?.[0]===E?.[1],D=d?.[0],A=d?.[1];r.useEffect(()=>{D!==void 0&&A!==void 0&&a([D.toFixed(0),A.toFixed(0)])},[D,A,a]);const L=r.useCallback(([v,G])=>{v<G&&a([v.toFixed(0),G.toFixed(0)])},[a]),_=r.useCallback(([v,G])=>{v<G&&m([v,G])},[m]),P=r.useCallback(()=>{a(([v,G])=>{const J=isNaN(Number(v))?n:Number(v),s=isNaN(Number(G))?l:Number(G),h=ie(Number(J),b),T=ie(Number(s),C),I=b<0?Math.max(h,n):Math.min(h,l),B=C<0?Math.max(T,n):Math.min(T,l);return I>B?(m([B,I]),[B.toFixed(0),I.toFixed(0)]):(m([I,B]),[I.toFixed(0),B.toFixed(0)])})},[m,a,b,C,n,l]),R=r.useCallback(v=>{const G=v===""||isNaN(Number(v))?v:ie(Number(v),b);a(([J,s])=>[G.toString(),s])},[a,b]),w=r.useCallback(v=>{const G=v===""||isNaN(Number(v))?v:ie(Number(v),C);a(([J,s])=>[J,G.toString()])},[a,C]),k=r.useMemo(()=>x==="xs"?"0.75rem":void 0,[x]),H=r.useCallback((v,G)=>{const J=Number(G.target.value);if(!u||!j||![-1,1].includes(J))return;const s=I=>J<0?-1*Math.abs(I):Math.abs(I),h=v?s(Number(u)):Number(u),T=v?Number(j):s(Number(j));h>T?m([T,h]):m([h,T])},[u,j,m]);return e.jsxRuntimeExports.jsxs(t.Flex,{direction:"column",...p,children:[e.jsxRuntimeExports.jsx(t.Box,{pt:"1em",mb:"-0.5em",children:e.jsxRuntimeExports.jsxs(t.RangeSlider,{"aria-label":["min","max"],isReversed:o,value:[Number(u??n),Number(j??l)],max:l,min:n,minStepsBetweenThumbs:3,step:1,onChange:L,onChangeEnd:_,isDisabled:M,children:[e.jsxRuntimeExports.jsx(t.RangeSliderMark,{value:n,top:"-1em",children:e.jsxRuntimeExports.jsx(t.Text,{fontSize:x??"sm",fontWeight:"semibold",whiteSpace:"nowrap",children:i?i?.(n):n})}),e.jsxRuntimeExports.jsx(t.RangeSliderMark,{value:l,top:"-1em",children:e.jsxRuntimeExports.jsx(t.Text,{fontSize:x??"sm",fontWeight:"semibold",style:{transform:"translateX(-100%)"},whiteSpace:"nowrap",children:i?i(l):l})}),g&&e.jsxRuntimeExports.jsxs(t.RangeSliderMark,{value:0,top:"-1em",pos:"relative",children:[e.jsxRuntimeExports.jsx(t.Text,{fontSize:x,fontWeight:"semibold",children:i?.(0)??"0"}),e.jsxRuntimeExports.jsx(t.Box,{position:"absolute",width:"2px",height:"1em",top:"90%",left:"20%",backgroundColor:"var(--chakra-colors-gray-300)"})]}),e.jsxRuntimeExports.jsx(t.RangeSliderTrack,{children:e.jsxRuntimeExports.jsx(t.RangeSliderFilledTrack,{})}),e.jsxRuntimeExports.jsx(t.RangeSliderThumb,{index:0,w:k,h:k}),e.jsxRuntimeExports.jsx(t.RangeSliderThumb,{index:1,w:k,h:k})]})}),N&&e.jsxRuntimeExports.jsxs(t.Flex,{direction:o?"row-reverse":"row",justifyContent:"space-between",children:[e.jsxRuntimeExports.jsx(t.Text,{fontSize:x??"sm",fontWeight:"semibold",whiteSpace:"nowrap",children:N(n)}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:x??"sm",fontWeight:"semibold",whiteSpace:"nowrap",children:N(l)})]}),e.jsxRuntimeExports.jsxs(t.Flex,{direction:o?"row-reverse":"row",justifyContent:"center",alignItems:"center",gap:"0.125em",children:[E&&e.jsxRuntimeExports.jsxs(t.Select,{width:"auto",size:x,fontWeight:"bold",value:b,onChange:v=>H(!0,v),isDisabled:z||M,children:[e.jsxRuntimeExports.jsx("option",{value:-1,children:E[0]}),e.jsxRuntimeExports.jsx("option",{value:1,children:E[1]})]}),e.jsxRuntimeExports.jsx(t.NumberInput,{precision:0,size:x??"sm",min:0,max:b<0?Math.abs(n):A??l,value:u===""?"":Math.abs(Number(u??n)),onChange:R,onBlur:P,borderWidth:1,borderRadius:3,borderColor:"#ccc",isDisabled:M,...c,children:e.jsxRuntimeExports.jsx(t.NumberInputField,{backgroundColor:"#fff",paddingRight:0,width:"4em"})}),e.jsxRuntimeExports.jsx(t.NumberInput,{size:x??"sm",min:0,max:C<0?Math.abs(D??n):l,precision:0,value:j===""?"":Math.abs(Number(j??l)),onChange:w,onBlur:P,borderWidth:1,borderRadius:3,borderColor:"#ccc",isDisabled:M,...c,children:e.jsxRuntimeExports.jsx(t.NumberInputField,{backgroundColor:"#fff",paddingRight:0,width:"4em"})}),E&&e.jsxRuntimeExports.jsxs(t.Select,{width:"auto",size:x,fontWeight:"bold",value:C,onChange:v=>H(!1,v),isDisabled:z||M,children:[e.jsxRuntimeExports.jsx("option",{value:-1,children:E[0]}),e.jsxRuntimeExports.jsx("option",{value:1,children:E[1]})]})]})]})},Ce=({tags:o,containerProps:n,...l})=>e.jsxRuntimeExports.jsx(t.HStack,{...n,children:o.map((d,m)=>e.jsxRuntimeExports.jsx(t.Tag,{...l,children:d},m))}),Te=new ge.uFuzzy({}),Se=({action:o,quantumIconSrc:n})=>o.quantumOwned?e.jsxRuntimeExports.jsx(t.Tooltip,{label:"This activity is owned by Quantum","aria-label":"Quantum owned",children:e.jsxRuntimeExports.jsx(t.Box,{boxSize:"1.5em",borderRadius:"full",bg:"black",display:"flex",alignItems:"center",justifyContent:"center",children:e.jsxRuntimeExports.jsx(t.Image,{src:n,boxSize:"1em",alt:"Quantum-owned activity"})})}):null,Me=(o,n)=>{if(!n||!n.trim().length)return o;const l=o.map(m=>m.name??"");return Te.filter(l,n)?.map(m=>o[m])??[]},Ae=o=>!o||o.length===0?"None":o.map(n=>n.replace(/([A-Z])/g," $1").trim()).join(", "),we=(o,n)=>!n||n.length==0?o:o.filter(l=>l.useCases?.some(d=>n.includes(d.id))??!1),xe=({actions:o,totalActions:n,onCreate:l,onDelete:d,onEdit:m,onView:c,onSelected:x,onDuplicate:f,disableMultiSelect:i,disableDelete:N,disableEdit:E,disableCreate:M,hideUseCase:p=!0,tableProps:S,containerProps:a,quantumIconSrc:u="/favicon.ico"})=>{const[j,g]=r.useState(""),[b,C]=r.useState(),z=r.useMemo(()=>{if(!o)return;const R=Me(o,j);return p?R:we(R,b)},[o,j,b,p]),D=r.useCallback(()=>{if(!d)return;const w=o.filter(k=>k.selected&&!k.quantumOwned).map(k=>k.id);d(w)},[o,d]),A=r.useCallback(()=>{if(!f)return;const R=o.filter(w=>w.selected);f(R.map(w=>w.id)),x&&R.forEach(w=>x(w,!1))},[o,f,x]),L=r.useMemo(()=>o.some(R=>R.selected&&!R.quantumOwned),[o]),_=r.useMemo(()=>o.some(R=>R.selected),[o]),P=r.useMemo(()=>o.some(R=>R.selected&&R.quantumOwned),[o]);return e.jsxRuntimeExports.jsxs(t.Box,{...a,children:[e.jsxRuntimeExports.jsxs(t.Flex,{alignContent:"space-between",gap:4,children:[(l||d||f)&&e.jsxRuntimeExports.jsxs(t.ButtonGroup,{mb:"1rem",gap:4,children:[l&&e.jsxRuntimeExports.jsx(t.Button,{isDisabled:!l||M,colorScheme:"blackAlpha",backgroundColor:"gray.700",onClick:l,children:"Create New Activity"}),d&&!i&&e.jsxRuntimeExports.jsx(t.Tooltip,{label:P?L?"Quantum-owned activities are selected and will be skipped":"Selected activities are quantum-owned and cannot be deleted":void 0,shouldWrapChildren:!0,children:e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"gray",isDisabled:!L||!d||N,onClick:D,children:"Delete Selected"})}),f&&!i&&e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"gray",isDisabled:!_,onClick:A,children:"Duplicate Selected"})]}),e.jsxRuntimeExports.jsx(Re,{setSearch:g,actions:o,updateUseCases:C,hideUseCaseFilter:p})]}),e.jsxRuntimeExports.jsx(t.TableContainer,{mr:"2rem",overflowX:"hidden",...S,children:e.jsxRuntimeExports.jsxs(t.Table,{size:"md",variant:"simple",children:[e.jsxRuntimeExports.jsx(t.Thead,{position:"sticky",top:0,bg:"white",zIndex:1,children:e.jsxRuntimeExports.jsxs(t.Tr,{children:[e.jsxRuntimeExports.jsxs(t.Th,{fontWeight:"normal",children:["(showing ",z?.length??0," of"," ",n??o.length,")"]}),e.jsxRuntimeExports.jsx(t.Th,{children:"Name"}),e.jsxRuntimeExports.jsx(t.Th,{children:"Sensor Locations"}),!p&&e.jsxRuntimeExports.jsx(t.Th,{children:"Use Case"}),e.jsxRuntimeExports.jsx(t.Th,{})]})}),e.jsxRuntimeExports.jsx(t.Tbody,{children:z?.map(R=>e.jsxRuntimeExports.jsxs(t.Tr,{title:i&&R.selected?"This activity is selected. Click it again to deselect.":void 0,bg:i&&R.selected?"gray.200":void 0,_hover:{bg:i&&!R.selected?"#f7f7f7":void 0},cursor:i?"pointer":"default",onClick:()=>i?x?.(R,!R.selected):void 0,children:[e.jsxRuntimeExports.jsx(t.Td,{children:e.jsxRuntimeExports.jsxs(t.Flex,{children:[x&&!i&&e.jsxRuntimeExports.jsx(t.Checkbox,{isChecked:R.selected,"aria-label":"Select activity",onChange:w=>x(R,w.target.checked)}),(R.quantumOwned||!m)&&c&&e.jsxRuntimeExports.jsx(t.Button,{ml:"1em",size:"sm",variant:"link",colorScheme:"blue",onClick:()=>c(R.id),children:"View"}),!R.quantumOwned&&m&&e.jsxRuntimeExports.jsx(t.Button,{isDisabled:E,ml:"1em",size:"sm",variant:"link",colorScheme:"blue",onClick:()=>m(R.id),children:"Edit"})]})}),e.jsxRuntimeExports.jsx(t.Td,{whiteSpace:"break-spaces",children:e.jsxRuntimeExports.jsxs(t.Flex,{align:"center",gap:2,children:[e.jsxRuntimeExports.jsx(Se,{action:R,quantumIconSrc:u}),R.name]})}),e.jsxRuntimeExports.jsx(t.Td,{maxW:"20rem",whiteSpace:"break-spaces",children:Ae(R.sensorLocations)}),!p&&e.jsxRuntimeExports.jsx(t.Td,{maxW:"20rem",children:e.jsxRuntimeExports.jsx(Ce,{containerProps:{flexWrap:"wrap"},tags:R.useCases?.map(w=>w.name)??[]})})]},R.id))})]})})]})},Oe=({onSave:o,onCancel:n,onError:l,hideButtons:d=!1,setButtonDisabled:m,setButtonOnClick:c,quantumOwned:x})=>{const f=t.useToast(),[i,N]=r.useState("copy"),[E,M]=r.useState(""),[p,S]=r.useState([]),[a,u]=r.useState(!1),[j]=Q.useQuery({query:y.GET_GROUPS}),[g]=Q.useQuery({query:y.GET_ACTIONS_BY_GROUP,variables:{groupId:E},pause:!E}),[,b]=Q.useMutation(y.CREATE_ACTION),[,C]=Q.useMutation(y.CONVERT_ACTION_TO_QUANTUM_OWNED),z=r.useMemo(()=>j.data?.groups?j.data.groups.map(s=>$.getFragmentData(y.GROUP_FRAGMENT,s)):[],[j.data]),D=r.useMemo(()=>g.data?g.data.actions.map(h=>$.getFragmentData(y.ACTION_FRAGMENT,h)):[],[g.data]),A=r.useMemo(()=>D.filter(s=>p.includes(s.id)),[D,p]),L=r.useCallback(s=>{const h=s?.value||"";M(h),S([])},[]),_=r.useCallback(s=>{const h=s.map(T=>T.value);S(h)},[]),P=r.useCallback(async s=>{const h=$.getFragmentData(y.MODULE_CATEGORY_FRAGMENT,s.categories),T={...s,name:`${s.name} (Copy)`,description:s.description||void 0,instructionsPointOfInterest:s.instructionsPointOfInterest||void 0,instructionsMovementReport:s.instructionsMovementReport||void 0,laterality:s.laterality,activityKind:s.activityKind,sensorLocations:s.sensorLocations,thresholds:s.thresholds.map(B=>({...B,id:void 0})),categories:h?.map(B=>B.id),quantumOwned:x,id:void 0},I=await b({fields:T});if(I.error)throw new Error(I.error.message);if(I.data?.createAction)return $.getFragmentData(y.ACTION_FRAGMENT,I.data.createAction);throw new Error("No action data returned")},[b,x]),R=r.useCallback(async s=>{const h=await C({id:s.id});if(h.error)throw new Error(h.error.message);if(h.data?.convertActionToQuantumOwned)return $.getFragmentData(y.ACTION_FRAGMENT,h.data.convertActionToQuantumOwned);throw new Error("No action data returned")},[C]),w=r.useCallback(async()=>{if(u(!0),!A.length){const s=new Error(`No activities selected for ${i==="copy"?"copying":"converting"}`);l?.(s),u(!1);return}try{const s=[];let h=0;const T=i==="copy"?P:R,I=i==="copy"?"copy":"convert";for(const B of A)try{const U=await T(B);s.push(U)}catch(U){console.error(`Failed to ${I} activity "${B.name}":`,U),h++}if(s.length>0){const B=s.length,U=A.length,Y=i==="copy"?"copied":"converted",q=i==="copy"?"copy":"convert";f({title:h>0?`Partial ${q} completed`:`Activities ${Y} successfully`,description:h>0?`${B} of ${U} activities ${Y} successfully`:`${B} activit${B>1?"ies":"y"} ${Y} successfully`,status:h>0?"warning":"success",duration:3e3,isClosable:!0}),o?.(),M(""),S([])}else throw new Error(`Failed to ${I} any activities`)}catch(s){const h=i==="copy"?"copy":"convert",T=s instanceof Error?s.message:`Failed to ${h} activities`;f({title:`${i==="copy"?"Copy":"Convert"} failed`,description:T,status:"error",duration:5e3,isClosable:!0}),l?.(s instanceof Error?s:new Error(T))}finally{u(!1)}},[A,i,P,R,f,o,l]),k=r.useCallback(()=>{M(""),S([]),N("copy"),n?.()},[n]);r.useEffect(()=>{m&&m({cancelButton:!1,saveButton:A.length===0||a})},[A.length,a,m]),r.useEffect(()=>{c&&c({cancelButton:k,saveButton:w})},[c,k,w]);const H=r.useMemo(()=>z.map(s=>({value:s.id,label:s.name})),[z]),v=r.useMemo(()=>D.filter(s=>i==="copy"?!0:!s.quantumOwned).map(s=>({value:s.id,label:s.name,isQuantumOwned:s.quantumOwned})),[D,i]),G=j.fetching,J=g.fetching;return e.jsxRuntimeExports.jsx(t.Box,{children:e.jsxRuntimeExports.jsxs(t.VStack,{spacing:6,align:"stretch",children:[x&&e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Z,{children:"Operation Mode"}),e.jsxRuntimeExports.jsx(t.RadioGroup,{value:i,onChange:s=>{N(s),S([])},children:e.jsxRuntimeExports.jsxs(t.HStack,{spacing:6,children:[e.jsxRuntimeExports.jsx(t.Radio,{value:"copy",colorScheme:"blue",children:e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"medium",children:"Copy Activities"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Create new activities based on selected ones"})]})}),e.jsxRuntimeExports.jsx(t.Radio,{value:"convert",colorScheme:"green",children:e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"medium",children:"Convert to Quantum Owned"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Convert existing activities to quantum-owned"})]})})]})})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Z,{children:"Select Source Group"}),e.jsxRuntimeExports.jsx(X.st,{placeholder:"Choose a group...",options:H,value:H.find(s=>s.value===E)||null,onChange:L,isLoading:G,isDisabled:G,isClearable:!0}),j.error&&e.jsxRuntimeExports.jsxs(t.Alert,{status:"error",mt:2,children:[e.jsxRuntimeExports.jsx(t.AlertIcon,{}),e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",children:["Failed to load groups: ",j.error.message]})]})]}),E&&e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsxs(Z,{children:["Select Activities to"," ",i==="copy"?"Copy":"Convert"]}),J?e.jsxRuntimeExports.jsxs(t.HStack,{children:[e.jsxRuntimeExports.jsx(t.Spinner,{size:"sm"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Loading activities..."})]}):e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[e.jsxRuntimeExports.jsx(X.st,{placeholder:`Choose activities to ${i}...`,options:v,value:v.filter(s=>p.includes(s.value)),onChange:_,isDisabled:v.length===0,isClearable:!0,isMulti:!0,closeMenuOnSelect:!1,formatOptionLabel:(s,{context:h})=>e.jsxRuntimeExports.jsxs(t.HStack,{justify:"space-between",w:"100%",children:[e.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxRuntimeExports.jsx(t.Text,{children:s.label}),h==="value"&&s.isQuantumOwned&&e.jsxRuntimeExports.jsx(t.Text,{color:"blue",fontSize:"xs",children:"(Quantum Owned)"})]}),s.isQuantumOwned&&h==="menu"&&e.jsxRuntimeExports.jsx(t.Tag,{size:"sm",colorScheme:"blue",variant:"solid",children:"Quantum Owned"})]})}),v.length===0&&e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.500",mt:2,children:"No activities found"})]}),g.error&&e.jsxRuntimeExports.jsxs(t.Alert,{status:"error",mt:2,children:[e.jsxRuntimeExports.jsx(t.AlertIcon,{}),e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",children:["Failed to load activities: ",g.error.message]})]})]}),A.length>0&&e.jsxRuntimeExports.jsxs(t.Box,{p:4,bg:"gray.50",borderRadius:"md",children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"semibold",mb:3,children:A.length===1?`Activity to ${i==="copy"?"Copy":"Convert"}:`:`${A.length} Activities to ${i==="copy"?"Copy":"Convert"}:`}),e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:3,children:[A.map((s,h)=>e.jsxRuntimeExports.jsxs(t.Box,{w:"100%",p:3,bg:"white",borderRadius:"md",border:"1px solid",borderColor:"gray.200",children:[e.jsxRuntimeExports.jsxs(t.HStack,{justify:"space-between",align:"start",mb:2,children:[e.jsxRuntimeExports.jsxs(t.Text,{fontWeight:"medium",fontSize:"sm",children:[h+1,". ",s.name]}),s.quantumOwned&&e.jsxRuntimeExports.jsx(t.Tag,{size:"sm",colorScheme:"blue",variant:"solid",children:"Quantum Owned"})]}),e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,fontSize:"sm",color:"gray.600",children:[s.description&&e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Description:"})," ",s.description]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Type:"})," ",s.activityKind]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Laterality:"})," ",s.laterality]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Sensor Locations:"})," ",s.sensorLocations.length]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Thresholds:"})," ",s.thresholds.length]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Use Cases:"})," ",s.useCases.map(T=>T.name).join(", ")||"None"]})]})]},s.id)),A.length>1&&e.jsxRuntimeExports.jsx(t.Box,{w:"100%",p:2,bg:"blue.50",borderRadius:"md",border:"1px solid",borderColor:"blue.200",children:e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",fontWeight:"medium",color:"blue.800",children:["Total: ",A.length," activities will be"," ",i==="copy"?"copied":"converted"]})})]})]}),!d&&e.jsxRuntimeExports.jsxs(t.ButtonGroup,{spacing:4,justifyContent:"flex-end",children:[e.jsxRuntimeExports.jsx(t.Button,{variant:"outline",onClick:k,isDisabled:a,children:"Cancel"}),e.jsxRuntimeExports.jsxs(t.Button,{colorScheme:i==="copy"?"blue":"green",onClick:w,isDisabled:A.length===0||a,isLoading:a,loadingText:`${i==="copy"?"Copying":"Converting"}...`,children:[i==="copy"?"Copy":"Convert"," ",A.length===1?"Activity":`${A.length} Activities`]})]})]})})},Fe=({onSave:o,onCancel:n,onError:l,hideButtons:d=!1,setButtonDisabled:m,setButtonOnClick:c,quantumOwned:x})=>{const f=t.useToast(),[i,N]=r.useState(""),[E,M]=r.useState([]),[p,S]=r.useState(!1),[a,u]=r.useState("copy"),[j]=Q.useQuery({query:y.GET_GROUPS}),[g]=Q.useQuery({query:y.GET_MODULES_BY_GROUP,variables:{groupId:i},pause:!i}),[,b]=Q.useMutation(y.CREATE_MODULE),[,C]=Q.useMutation(y.UPDATE_MODULE),[,z]=Q.useMutation(y.CREATE_ACTION),[,D]=Q.useMutation(y.CONVERT_ACTION_TO_QUANTUM_OWNED),A=r.useMemo(()=>j.data?.groups?j.data.groups.map(s=>$.getFragmentData(y.GROUP_FRAGMENT,s)):[],[j.data]),L=r.useMemo(()=>g.data?.modules?$.getFragmentData(y.ACTION_MODULE_FRAGMENT,g.data?.modules).map(h=>{const T=$.getFragmentData(y.MODULE_ACTION_FRAGMENT,h.moduleActions);return{...h,moduleActions:T.map(I=>({...I,action:$.getFragmentData(y.ACTION_FRAGMENT,I.action)})),categories:$.getFragmentData(y.MODULE_CATEGORY_FRAGMENT,h.categories)}}):[],[g.data]),_=r.useMemo(()=>L.filter(s=>E.includes(s.id)),[L,E]),P=r.useCallback(s=>{const h=s?.value||"";N(h),M([])},[]),R=r.useCallback(s=>{const h=s.map(T=>T.value);M(h)},[]),w=r.useCallback(async()=>{if(S(!0),!_.length){S(!1);const s=new Error(`No modules selected for ${a==="convert"?"converting":"copying"}`);l?.(s);return}try{const s=[];let h=0;for(const T of _)try{let I=T.moduleActions.map(B=>B.actionId);if(x){const B=T.moduleActions.map(q=>q.action),U=async q=>{if(a==="copy"){if(q.quantumOwned)return q;const ce=$.getFragmentData(y.MODULE_CATEGORY_FRAGMENT,q.categories),ne={...q,quantumOwned:!0,thresholds:q.thresholds.map(O=>({...O,id:void 0})),categories:ce?.map(O=>O.id),id:void 0},se=await z({fields:ne});return se.error||!se.data?.createAction?null:$.getFragmentData(y.ACTION_FRAGMENT,se.data.createAction)}if(q.quantumOwned)return q;const te=await D({id:q.id});return te.error||!te.data?.convertActionToQuantumOwned?null:$.getFragmentData(y.ACTION_FRAGMENT,te.data.convertActionToQuantumOwned)};I=(await Promise.all(B.map(U))).filter(q=>!!q).map(q=>q.id)}if(a==="convert"){const B={name:T.name,description:T.description||void 0,actions:I,categories:T.categories.map(Y=>Y.id),quantumOwned:!0},U=await C({id:T.id,input:B});if(U.error)throw new Error(U.error.message);if(U.data?.updateModule){const Y=$.getFragmentData(y.ACTION_MODULE_FRAGMENT,U.data.updateModule);s.push(Y)}}else{const B={name:`${T.name} (Copy)`,description:T.description||void 0,actions:I,categories:T.categories.map(Y=>Y.id),quantumOwned:x},U=await b({input:B});if(U.error)throw new Error(U.error.message);if(U.data?.createModule){const Y=$.getFragmentData(y.ACTION_MODULE_FRAGMENT,U.data.createModule);s.push(Y)}}}catch(I){console.error(`Failed to ${a==="convert"?"convert":"copy"} module "${T.name}":`,I),h++}if(s.length>0){const T=s.length,I=_.length;f({title:h>0?`Partial ${a==="convert"?"convert":"copy"} completed`:`Modules ${a==="convert"?"converted":"copied"} successfully`,description:h>0?`${T} of ${I} modules ${a==="convert"?"converted":"copied"} successfully`:`${T} module${T>1?"s":""} ${a==="convert"?"converted":"copied"} successfully`,status:h>0?"warning":"success",duration:3e3,isClosable:!0}),s.length>0&&o?.(),N(""),M([])}else throw new Error(`Failed to ${a==="convert"?"convert":"copy"} any modules`)}catch(s){const h=s instanceof Error?s.message:`Failed to ${a==="convert"?"convert":"copy"} modules`;f({title:a==="convert"?"Convert failed":"Copy failed",description:h,status:"error",duration:5e3,isClosable:!0}),l?.(s instanceof Error?s:new Error(h))}finally{S(!1)}},[_,b,C,f,o,l,x,z,D,a]),k=r.useCallback(()=>{N(""),M([]),u("copy"),n?.()},[n]);r.useEffect(()=>{m&&m({cancelButton:!1,saveButton:_.length===0||p})},[_.length,p,m]),r.useEffect(()=>{c&&c({cancelButton:k,saveButton:w})},[c,k,w]);const H=r.useMemo(()=>A.map(s=>({value:s.id,label:s.name})),[A]),v=r.useMemo(()=>L.filter(s=>a==="copy"?!0:!s.quantumOwned).map(s=>({value:s.id,label:s.name,isQuantumOwned:s.quantumOwned})),[L,a]),G=j.fetching,J=g.fetching;return e.jsxRuntimeExports.jsx(t.Box,{children:e.jsxRuntimeExports.jsxs(t.VStack,{spacing:6,align:"stretch",children:[x&&e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Z,{children:"Operation Mode"}),e.jsxRuntimeExports.jsx(t.RadioGroup,{value:a,onChange:s=>{u(s),M([])},children:e.jsxRuntimeExports.jsxs(t.HStack,{spacing:6,children:[e.jsxRuntimeExports.jsx(t.Radio,{value:"copy",colorScheme:"blue",children:e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"medium",children:"Copy Modules"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Create new modules based on selected ones"})]})}),e.jsxRuntimeExports.jsx(t.Radio,{value:"convert",colorScheme:"green",children:e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"medium",children:"Convert to Quantum Owned"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Convert existing modules to quantum-owned"})]})})]})})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Z,{children:"Select Source Group"}),e.jsxRuntimeExports.jsx(X.st,{placeholder:"Choose a group...",options:H,value:H.find(s=>s.value===i)||null,onChange:P,isLoading:G,isDisabled:G,isClearable:!0}),j.error&&e.jsxRuntimeExports.jsxs(t.Alert,{status:"error",mt:2,children:[e.jsxRuntimeExports.jsx(t.AlertIcon,{}),e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",children:["Failed to load groups: ",j.error.message]})]})]}),i&&e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Z,{children:a==="convert"?"Select Module to Convert":"Select Module to Copy"}),J?e.jsxRuntimeExports.jsxs(t.HStack,{children:[e.jsxRuntimeExports.jsx(t.Spinner,{size:"sm"}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.600",children:"Loading modules..."})]}):e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[e.jsxRuntimeExports.jsx(X.st,{placeholder:a==="convert"?"Choose modules to convert...":"Choose modules to copy...",options:v,value:v.filter(s=>E.includes(s.value)),onChange:R,isDisabled:v.length===0,isClearable:!0,isMulti:!0,closeMenuOnSelect:!1,formatOptionLabel:(s,{context:h})=>e.jsxRuntimeExports.jsxs(t.HStack,{justify:"space-between",w:"100%",children:[e.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxRuntimeExports.jsx(t.Text,{children:s.label}),h==="value"&&s.isQuantumOwned&&e.jsxRuntimeExports.jsx(t.Text,{color:"blue",fontSize:"xs",children:"(Quantum Owned)"})]}),s.isQuantumOwned&&h==="menu"&&e.jsxRuntimeExports.jsx(t.Tag,{size:"sm",colorScheme:"blue",variant:"solid",children:"Quantum Owned"})]})}),v.length===0&&e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.500",mt:2,children:"No modules found in this group"})]}),g.error&&e.jsxRuntimeExports.jsxs(t.Alert,{status:"error",mt:2,children:[e.jsxRuntimeExports.jsx(t.AlertIcon,{}),e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",children:["Failed to load modules: ",g.error.message]})]})]}),_.length>0&&e.jsxRuntimeExports.jsxs(t.Box,{p:4,bg:"gray.50",borderRadius:"md",children:[e.jsxRuntimeExports.jsx(t.Text,{fontWeight:"semibold",mb:3,children:_.length===1?`Module to ${a==="copy"?"Copy":"Convert"}`:`${_.length} Modules to ${a==="copy"?"Copy":"Convert"}`}),e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:3,children:[_.map((s,h)=>e.jsxRuntimeExports.jsxs(t.Box,{w:"100%",p:3,bg:"white",borderRadius:"md",border:"1px solid",borderColor:"gray.200",children:[e.jsxRuntimeExports.jsxs(t.HStack,{justify:"space-between",align:"start",mb:2,children:[e.jsxRuntimeExports.jsxs(t.Text,{fontWeight:"medium",fontSize:"sm",children:[h+1,". ",s.name]}),s.quantumOwned&&e.jsxRuntimeExports.jsx(t.Tag,{size:"sm",colorScheme:"blue",variant:"solid",children:"Quantum Owned"})]}),e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:1,fontSize:"sm",color:"gray.600",children:[s.description&&e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Description:"})," ",s.description]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Actions:"})," ",s.moduleActions.length]}),e.jsxRuntimeExports.jsxs(t.Text,{children:[e.jsxRuntimeExports.jsx("strong",{children:"Categories:"})," ",s.categories.map(T=>T.name).join(", ")||"None"]})]})]},s.id)),_.length>1&&e.jsxRuntimeExports.jsx(t.Box,{w:"100%",p:2,bg:"blue.50",borderRadius:"md",border:"1px solid",borderColor:"blue.200",children:e.jsxRuntimeExports.jsxs(t.Text,{fontSize:"sm",fontWeight:"medium",color:"blue.800",children:["Total: ",_.length," modules will be"," ",a==="copy"?"copied":"converted"]})}),x&&_.filter(s=>s.moduleActions.some(h=>!h.action.quantumOwned)).length>0&&e.jsxRuntimeExports.jsx(t.Box,{p:2,bg:"yellow.50",borderRadius:"md",border:"1px solid",borderColor:"yellow.200",children:e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",fontWeight:"medium",color:"yellow.800",children:a==="convert"?"Converting Modules will convert non QM-Owned Actions to QM-Owned":"Copying Modules with Non QM-Owned Actions will create corresponding QM-Owned Actions"})})]})]}),!d&&e.jsxRuntimeExports.jsxs(t.ButtonGroup,{spacing:4,justifyContent:"flex-end",children:[e.jsxRuntimeExports.jsx(t.Button,{variant:"outline",onClick:k,isDisabled:p,children:"Cancel"}),e.jsxRuntimeExports.jsxs(t.Button,{colorScheme:a==="copy"?"blue":"green",onClick:w,isDisabled:_.length===0||p,isLoading:p,loadingText:`${a==="copy"?"Copying":"Converting"}...`,children:[a==="copy"?"Copy":"Convert"," ",_.length===1?"Module":`${_.length} Modules`]})]})]})})},me=({name:o,setName:n,actions:l,selectedActionIds:d,setSelectedActionIds:m,availableCategories:c,selectedCategoryIds:x,setSelectedCategoryIds:f,description:i,setDescription:N,...E})=>{const M=t.useDisclosure(),p=r.useMemo(()=>l.map(b=>({...b,selected:d.includes(b.id)})),[l,d]),S=r.useMemo(()=>l.reduce((b,C)=>(b[C.id]=C,b),{}),[l]),a=r.useMemo(()=>d.map(b=>S[b]),[p,d]),u=r.useCallback((b,C)=>{m(C?[...d,b.id]:d.filter(z=>z!==b.id))},[d,m]),j=r.useCallback(b=>{n(b.target.value)},[n]),g=r.useCallback(b=>{N?.(b.target.value)},[N]);return e.jsxRuntimeExports.jsxs(t.Box,{...E,children:[e.jsxRuntimeExports.jsxs(t.HStack,{gap:"2rem",children:[e.jsxRuntimeExports.jsx(Ne,{name:o??"",onInputChange:j}),e.jsxRuntimeExports.jsx(Le,{availableCategories:c,value:x,onChange:f})]}),e.jsxRuntimeExports.jsx(ke,{description:i??"",onInputChange:g}),e.jsxRuntimeExports.jsx(Ie,{value:a,onChange:m,onAdjustActivities:()=>M.onOpen()}),e.jsxRuntimeExports.jsxs(t.Modal,{isOpen:M.isOpen,onClose:M.onClose,size:"6xl",children:[e.jsxRuntimeExports.jsx(t.ModalOverlay,{}),e.jsxRuntimeExports.jsxs(t.ModalContent,{children:[e.jsxRuntimeExports.jsx(t.ModalHeader,{children:"Select Activities"}),e.jsxRuntimeExports.jsx(t.ModalCloseButton,{}),e.jsxRuntimeExports.jsx(t.ModalBody,{children:e.jsxRuntimeExports.jsx(xe,{actions:p,onSelected:u,disableCreate:!0,disableDelete:!0,tableProps:{height:"28rem",overflowY:"auto"}})}),e.jsxRuntimeExports.jsx(t.ModalFooter,{children:e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"blue",onClick:M.onClose,isDisabled:d.length===0,children:"Done"})})]})]})]})},Ne=r.memo(({name:o,onInputChange:n})=>e.jsxRuntimeExports.jsxs(t.FormControl,{mb:4,children:[e.jsxRuntimeExports.jsx(Z,{children:"Module Name"}),e.jsxRuntimeExports.jsx(t.Input,{placeholder:"i.e. ACL RTP Test Battery",value:o,onChange:n,isRequired:!0})]})),Le=r.memo(({availableCategories:o,value:n,onChange:l})=>{const d=r.useMemo(()=>[...o,{id:"other",name:"Other"}],[o]),m=r.useMemo(()=>d.map(c=>({value:c.id,label:c.name})),[d]);return e.jsxRuntimeExports.jsxs(t.FormControl,{mb:4,children:[e.jsxRuntimeExports.jsx(Z,{children:"Module Category"}),e.jsxRuntimeExports.jsx(X.st,{isDisabled:o.length===0,isClearable:!0,options:m,value:d.filter(c=>n.includes(c.id)).map(c=>({value:c.id,label:c.name})),onChange:c=>l(c?[c.value]:[]),placeholder:"Select category"})]})}),ke=r.memo(({description:o,onInputChange:n})=>e.jsxRuntimeExports.jsxs(t.FormControl,{mb:4,children:[e.jsxRuntimeExports.jsx(Z,{children:e.jsxRuntimeExports.jsxs("span",{children:["Description",e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.500",children:"Briefly describe the objective of this module. Max 40 words."})]})}),e.jsxRuntimeExports.jsx(t.Input,{placeholder:"i.e. Assess readiness to return to play post-ACL reconstruction",value:o,onChange:n})]})),Ie=r.memo(({value:o,onChange:n,onAdjustActivities:l})=>{const d=r.useMemo(()=>o.map(m=>({id:m.id,name:m.name})),[o]);return e.jsxRuntimeExports.jsxs(t.FormControl,{mb:4,children:[e.jsxRuntimeExports.jsxs(t.HStack,{justifyContent:"space-between",children:[e.jsxRuntimeExports.jsx(Z,{children:e.jsxRuntimeExports.jsxs("span",{children:["Activities",e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",color:"gray.500",children:"Drag and drop to reorder the activities in this module."})]})}),e.jsxRuntimeExports.jsx(t.Button,{size:"sm",variant:"solid",colorScheme:"blue",onClick:l,children:"Add / Remove Activities"})]}),d.length===0?e.jsxRuntimeExports.jsx(t.VStack,{children:e.jsxRuntimeExports.jsxs(t.Text,{color:"gray.500",fontSize:"lg",mb:"4rem",mt:"4rem",children:["No activities selected for this module.",e.jsxRuntimeExports.jsx(t.Button,{ml:"0.5em",size:"sm",variant:"link",colorScheme:"blue",onClick:l,children:"Add activities."})]})}):e.jsxRuntimeExports.jsx(fe,{value:d,onChange:m=>{const c=m(d);n(c.map(x=>x.id))}})]})}),pe=({value:o,onChange:n,forceKind:l,disableRemove:d,disableKind:m,isDisabled:c,lockRanges:x,...f})=>{const i=r.useMemo(()=>[...o].sort((p,S)=>{const a=oe.availablePlanes.indexOf(p.plane),u=oe.availablePlanes.indexOf(S.plane);return a-u}),[o]),N=r.useCallback(p=>"segment"in p.id?K.getSegmentNameWithPlane(p.id.segment,p.plane,!0)??"Unknown":K.getJointNameWithPlane(p.id.joint,p.plane,!0)??"Unknown",[]),E=r.useCallback((p,S)=>{const a=i.findIndex(j=>j.id===S.id&&j.plane===S.plane);let u=[...i];l&&(S={...S,kind:l}),u[a]=S,x&&(u=u.map(j=>({...j,min:S.min,max:S.max}))),n(u)},[n,i,l,x]),M=r.useCallback(p=>{const S=i.filter(a=>a.id!==p.id||a.plane!==p.plane);n(S)},[n,i]);return e.jsxRuntimeExports.jsx(t.VStack,{alignItems:"flex-start",overflowY:"auto",...f,children:i.map((p,S)=>e.jsxRuntimeExports.jsx(De,{label:N(p),parameter:p,onChange:a=>E(S,a),onRemove:d||c?void 0:()=>M(p),forceKind:l,disableKind:m||c,isDisabled:c},`${JSON.stringify(p.id)}-${p.plane}`))})},De=({label:o,parameter:n,onChange:l,onRemove:d,forceKind:m,disableKind:c,isDisabled:x})=>{const f=r.useCallback(E=>"joint"in n.id?K.getJointAngleDirectionName(n.id.joint,n.plane,E<0?-1:1):K.getSegmentAngleDirectionName(n.id.segment,n.plane,E<0?-1:1),[n]),{min:i,max:N}="joint"in n.id?K.getNormativeJointRange(n.id.joint,n.plane):{min:-180,max:180};return e.jsxRuntimeExports.jsxs(t.VStack,{borderRadius:"md",p:2,px:4,bg:"gray.100",w:"100%",overflow:"hidden",flexShrink:"0",children:[e.jsxRuntimeExports.jsxs(t.HStack,{w:"100%",children:[e.jsxRuntimeExports.jsx(t.Text,{fontSize:"sm",flex:1,textTransform:"capitalize",fontWeight:"semibold",children:o}),d&&!x&&e.jsxRuntimeExports.jsx(t.IconButton,{size:"xs",variant:"ghost","aria-label":"delete",icon:e.jsxRuntimeExports.jsx(t.Icon,{as:de.FaTrash}),onClick:d}),!m&&e.jsxRuntimeExports.jsx(ve,{selectedItem:n?.kind??F.ThresholdKind.Limit,onChange:({value:E})=>l({...n,kind:E}),isDisabled:c||x,buttonProps:{size:"sm",variant:"outline",colorScheme:"gray"},selectedProps:{variant:"solid",colorScheme:"teal"},items:[{value:F.ThresholdKind.Limit,label:"limit"},{value:F.ThresholdKind.Target,label:"target"}]})]}),e.jsxRuntimeExports.jsx(ye,{w:"100%",size:"xs",min:i,max:N,zeroMarker:!0,value:[n.min,n.max],onChange:E=>l({...n,min:E[0],max:E[1]}),formatValue:E=>`${Math.abs(E)}°`,valueLabel:E=>f(E)??"",positiveNegativeLabels:f(0)?[f(-1)??"",f(1)??""]:void 0,isDisabled:x})]})},ae=(o,n)=>"segment"in o&&"segment"in n&&o.segment===n.segment||"joint"in o&&"joint"in n&&o.joint===n.joint,he=({options:o,value:n,onChange:l,forceKind:d,singleValue:m,singleValueSideless:c,editOnly:x,disableKind:f,maxParameters:i,...N})=>{const E=c?2:i,M=r.useMemo(()=>o.map(u=>({label:"segment"in u.id?K.getSegmentNameWithPlane(u.id.segment,u.plane,!0)??"Unknown":K.getJointNameWithPlane(u.id.joint,u.plane,!0)??"Unknown",value:u.id,plane:u.plane})),[o]),p=r.useMemo(()=>{if(!c||n.length===0)return M;const u=n[0];return M.filter(j=>oe.getAnalysisPartIdNoSide(j.value)===oe.getAnalysisPartIdNoSide(u.id)&&j.plane===u.plane)},[M,n,c]),S=r.useMemo(()=>M.filter(u=>n.some(j=>ae(j.id,u.value)&&j.plane===u.plane)),[M,n]),a=r.useCallback(u=>{const j=u.map(g=>{const b=n.find(L=>ae(L.id,g.value)&&L.plane===g.plane),C=o.find(L=>ae(L.id,g.value)&&L.plane===g.plane),z=c?n.find(L=>oe.getAnalysisPartIdNoSide(L.id)===oe.getAnalysisPartIdNoSide(g.value)&&L.plane===g.plane):void 0,D=z&&!b?z.min:C&&C.min?C.min:0,A=z&&!b?z.max:C&&C.max?C.max:0;return b??{id:g.value,plane:g.plane,min:D,max:A,kind:d??F.ThresholdKind.Limit}});l(j)},[l,n,o,d,c]);return r.useEffect(()=>{const u=n.filter(j=>o.some(g=>ae(g.id,j.id)&&g.plane===j.plane));u.length!==n.length&&l(u)},[o,l]),e.jsxRuntimeExports.jsxs(t.Box,{...N,children:[e.jsxRuntimeExports.jsx(X.st,{isMulti:!m,placeholder:n.length?`${n.length} selected`:"Search...",value:S,isDisabled:x||S.length>=(E??1/0),onChange:u=>Array.isArray(u)?a([...u]):a(u!==null?[u]:[]),options:p,controlShouldRenderValue:!1}),e.jsxRuntimeExports.jsx(pe,{marginTop:2,maxH:"28rem",value:n,onChange:l,forceKind:d,disableKind:f,isDisabled:x,lockRanges:c})]})},je=o=>{switch(o){case F.SensorLocation.Thorax:return"Thorax";case F.SensorLocation.CenterBack:return"Center Back";case F.SensorLocation.Pelvis:return"Pelvis";case F.SensorLocation.LeftThigh:return"Left Thigh";case F.SensorLocation.RightThigh:return"Right Thigh";case F.SensorLocation.LeftShank:return"Left Shank";case F.SensorLocation.RightShank:return"Right Shank";case F.SensorLocation.LeftFoot:return"Left Foot";case F.SensorLocation.RightFoot:return"Right Foot";case F.SensorLocation.LeftUpperArm:return"Left Upper Arm";case F.SensorLocation.RightUpperArm:return"Right Upper Arm";case F.SensorLocation.LeftForearm:return"Left Forearm";case F.SensorLocation.RightForearm:return"Right Forearm";case F.SensorLocation.Head:return"Head"}return console.warn(`Unknown sensor location: ${o}`),"Unknown"},_e=6,Ge=[F.SensorLocation.LeftFoot,F.SensorLocation.LeftShank,F.SensorLocation.LeftThigh,F.SensorLocation.Pelvis,F.SensorLocation.RightFoot,F.SensorLocation.RightShank,F.SensorLocation.RightThigh,F.SensorLocation.Thorax,F.SensorLocation.CenterBack,F.SensorLocation.Head],Be=Ge.map(o=>({label:je(o),value:o})),ue=(o,n)=>o.map(l=>({label:n?n(l):l,value:l})),Pe=({id:o,onError:n,onCancel:l,onSave:d,hideButtons:m,setButtonOnClick:c,setButtonDisabled:x,quantumOwned:f,isView:i})=>{const[{fetching:N},E]=Q.useMutation(y.CREATE_ACTION),[{fetching:M},p]=Q.useMutation(y.UPDATE_ACTION),[{data:S}]=Q.useQuery({query:y.GET_ACTION_BY_ID,variables:{id:o??""},pause:!o}),a=$.getFragmentData(y.ACTION_FRAGMENT,S?.getActionById),u=N||M,j=!!a&&!!o,[g,b]=r.useState(""),[C,z]=r.useState(""),[D,A]=r.useState(""),[L,_]=r.useState(""),[P,R]=r.useState(),[w,k]=r.useState([]),[H,v]=r.useState([]),[G,J]=r.useState([]),s=r.useMemo(()=>H.map(O=>O.value),[H]),h=Ee.usePartOptionsForSensorLocations(s),[{data:T}]=Q.useQuery({query:y.GET_ALL_MODULE_CATEGORIES}),I=r.useMemo(()=>$.getFragmentData(y.MODULE_CATEGORY_FRAGMENT,T?.moduleCategories)?.map(W=>({label:W.name,value:W.id})),[T?.moduleCategories]),B=r.useMemo(()=>ue(Object.values(F.SessionType),K.mapSessionTypeEnumToLabel),[]),[U,Y]=r.useState([]),q=g.length>0,[te,ce]=r.useState({});r.useEffect(()=>{if(a){const O=$.getFragmentData(y.MODULE_CATEGORY_FRAGMENT,a.categories),W={name:a.name,activityType:a.activityType??void 0,description:a.description||"",cameraPlacement:a.cameraPlacement||"",videoLink:a.videoLink||"",sessionType:a.sessionType.map(V=>({label:K.mapSessionTypeEnumToLabel(V),value:V})),categories:O?.map(V=>V.id)||[],sensorLocations:a.sensorLocations.map(V=>({label:je(V),value:V})),thresholds:re.thresholdsToParameters(a.thresholds)};b(W.name),R(W.activityType??void 0),z(W.description),A(W.cameraPlacement),_(W.videoLink),k(W.sessionType),J(O?.map(V=>V.id)||[]),v(W.sensorLocations),Y(W.thresholds),ce(W)}},[a]);const ne=r.useMemo(()=>JSON.stringify(te)!==JSON.stringify({name:g,description:C,cameraPlacement:D,videoLink:L,activityType:P,sessionType:w.map(O=>O.value),categories:G,sensorLocations:s,thresholds:re.parametersToThresholds(U)}),[te,g,s,C,D,L,P,w,G,U]),se=r.useCallback(()=>{const O={name:g,description:C,cameraPlacement:D,videoLink:L,activityType:P,activityKind:K.getActivityKindFromActivityType(P),sessionType:w.map(V=>V.value),categories:G,sensorLocations:s,thresholds:re.parametersToThresholds(U),laterality:F.ActionLaterality.Either,quantumOwned:f};let W;j&&o?W=p({id:o,fields:O}):W=E({fields:O}),W.then(({error:V})=>{V?n(V):d()})},[f,E,p,o,g,s,C,D,L,P,w,G,j,U,d,n]);return r.useEffect(()=>{x&&x({cancelButton:u,saveButton:i?!0:u||!q||!ne})},[u,x,q,ne,i]),r.useEffect(()=>{c&&c({cancelButton:l,saveButton:i?()=>{}:se})},[c,l,se,i]),console.log(q,ne,u,te),e.jsxRuntimeExports.jsxs("div",{className:"grid grid-cols-2 gap-4 w-full",children:[e.jsxRuntimeExports.jsxs("div",{className:"col-span-2 lg:col-span-1 flex flex-col gap-4",children:[e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(ee,{children:"Name"}),e.jsxRuntimeExports.jsx(t.Input,{value:g,onChange:O=>b(O.target.value),type:"text",placeholder:"i.e. Lunge & Return",isDisabled:i})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(ee,{children:"Activity Type"}),e.jsxRuntimeExports.jsx(X.st,{isClearable:!0,isMulti:!1,value:P?{label:K.mapActivityTypeEnumToLabel(P),value:P}:null,onChange:O=>R(O?.value),options:ue(Object.values(F.ActivityType),K.mapActivityTypeEnumToLabel),placeholder:"(optional) Select activity type",isDisabled:i})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(ee,{children:"Camera Placement"}),e.jsxRuntimeExports.jsx(t.Textarea,{value:D,onChange:O=>A(O.target.value),rows:2,placeholder:"(optional) Describe camera setup, placement, angles",isDisabled:i})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(ee,{children:"Video Link"}),e.jsxRuntimeExports.jsx(t.Input,{value:L,onChange:O=>_(O.target.value),type:"url",placeholder:"(optional) https://...",isDisabled:i})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(ee,{children:"Description"}),e.jsxRuntimeExports.jsx(t.Textarea,{value:C,onChange:O=>z(O.target.value),rows:2,placeholder:"(optional) Describe how to perform the test or exercise",isDisabled:i})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(ee,{children:"Link to Category"}),e.jsxRuntimeExports.jsx(X.st,{isMulti:!0,value:I?.filter(O=>G.includes(O.value)),onChange:O=>J((O??[]).map(W=>W.value)),options:I,placeholder:"Select one or more categories",isDisabled:i})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(ee,{children:"Session Types"}),e.jsxRuntimeExports.jsx(X.st,{isMulti:!0,value:w,onChange:O=>k(O??[]),options:B,placeholder:"Select one or more session types",isDisabled:i})]})]}),e.jsxRuntimeExports.jsxs("div",{className:"col-span-2 lg:col-span-1 flex flex-col gap-4",children:[e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(ee,{children:"Sensor Locations"}),e.jsxRuntimeExports.jsx(X.st,{isMulti:!0,value:H,onChange:O=>v([...O]),options:Be,isOptionDisabled:()=>H.length>=_e,isDisabled:i})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(ee,{children:"Default Parameters"}),e.jsxRuntimeExports.jsx(he,{options:h,value:U,onChange:Y,editOnly:i})]})]}),e.jsxRuntimeExports.jsx("div",{className:re.cn("col-span-2 flex justify-end",(m||i)&&"hidden"),children:e.jsxRuntimeExports.jsxs(t.ButtonGroup,{mt:16,gap:4,children:[e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"gray",isDisabled:u,onClick:l,children:"Cancel"}),e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"blue",isDisabled:u||!q||!ne,isLoading:u,onClick:se,children:"Save changes"})]})})]})},ee=({children:o})=>e.jsxRuntimeExports.jsx(t.FormLabel,{fontWeight:"bold",fontFamily:"sans-serif",fontSize:"large",children:o}),ze=({id:o,onCancel:n,onSave:l,onError:d,hideButtons:m,quantumOwned:c,setButtonOnClick:x,setButtonDisabled:f})=>{const[{data:i}]=Q.useQuery({query:c?y.GET_QUANTUM_OWNED_ACTIONS:y.GET_ACTIONS}),[{data:N}]=Q.useQuery({query:y.GET_MODULE_BY_ID,variables:{id:o},pause:!o}),[{data:E}]=Q.useQuery({query:y.GET_ALL_MODULE_CATEGORIES}),M=$.getFragmentData(y.MODULE_CATEGORY_FRAGMENT,E?.moduleCategories),[{fetching:p},S]=Q.useMutation(y.UPDATE_MODULE),[{fetching:a},u]=Q.useMutation(y.CREATE_MODULE),j=$.getFragmentData(y.ACTION_FRAGMENT,c?i?.quantumOwnedActions:i?.actions)??[],g=$.getFragmentData(y.ACTION_MODULE_FRAGMENT,N?.module),b=$.getFragmentData(y.MODULE_ACTION_FRAGMENT,g?.moduleActions)??[],[C,z]=r.useState([...b.map(k=>k.actionId)??[]]),[D,A]=r.useState(g?.name??""),[L,_]=r.useState([]),[P,R]=r.useState(g?.description??"");r.useEffect(()=>{g&&(z(b.map(k=>k.actionId)),A(g.name),R(g.description??""),_(g.categories.map(k=>$.getFragmentData(y.MODULE_CATEGORY_FRAGMENT,k).id)??[]))},[g,b]);const w=r.useCallback(()=>{let k;const H={actions:C,name:D,categories:L.filter(v=>v!=="other"),description:P,quantumOwned:c};g?k=S({id:g.id,input:H}):k=u({input:H}),k.then(({error:v})=>{v?d(v):l()})},[u,S,C,D,P,L,g,l,d]);return r.useEffect(()=>{f&&f({cancelButton:p||a,saveButton:p||a||!D||P.trim().split(/\s+/).filter(Boolean).length>40})},[f,p,a,C,D,P]),r.useEffect(()=>{x&&x({cancelButton:n,saveButton:w})},[x,n,w]),e.jsxRuntimeExports.jsxs(t.Box,{width:"100%",children:[e.jsxRuntimeExports.jsx(me,{name:D,setName:A,actions:j,selectedActionIds:C,setSelectedActionIds:z,availableCategories:M??[],selectedCategoryIds:L,setSelectedCategoryIds:_,description:P,setDescription:R}),!m&&e.jsxRuntimeExports.jsx(t.HStack,{justifyContent:"flex-start",children:e.jsxRuntimeExports.jsxs(t.ButtonGroup,{mt:16,gap:4,children:[e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"gray",isDisabled:p||a,onClick:n,children:"Cancel"}),e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"blue",isDisabled:p||a||!D||P.trim().split(/\s+/).filter(Boolean).length>40,isLoading:p||a,onClick:w,children:"Save"})]})})]})};exports.ActivityList=xe;exports.CopyActivityForm=Oe;exports.CopyModuleForm=Fe;exports.ModuleForm=me;exports.ParameterEditList=pe;exports.ParameterEditSelect=he;exports.UpsertActivityForm=Pe;exports.UpsertModuleForm=ze;