quantum-component-library 1.4.47-qa → 1.4.48-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -115
- package/dist/components.cjs +1 -1
- package/dist/components.js +1009 -1018
- package/dist/generated/gql.d.ts +17 -2
- package/dist/generated/graphql.d.ts +64 -0
- package/dist/generated-graphql.cjs +1 -1
- package/dist/generated-graphql.js +47 -44
- package/dist/generated.cjs +1 -1
- package/dist/generated.js +56 -53
- package/dist/graphql/fragments/index.d.ts +1 -0
- package/dist/graphql/fragments/metadata.d.ts +2 -0
- package/dist/graphql/queries/metadata.d.ts +3 -0
- package/dist/{graphql-C6M9oyU0.cjs → graphql-BnWfFu1Y.cjs} +39 -16
- package/dist/{graphql-CvUc6Vdv.js → graphql-Cts9cAoH.js} +61 -35
- package/dist/{graphql-vendor-B0NjgbDB.js → graphql-vendor-BWnD0b-j.js} +3 -2
- package/dist/{graphql-vendor-B-QTAQSb.cjs → graphql-vendor-CL0XsjHb.cjs} +9 -9
- package/dist/hooks.cjs +1 -1
- package/dist/hooks.js +1 -1
- package/dist/lib/services/rom.json.d.ts +223 -223
- package/dist/providers.cjs +1 -1
- package/dist/providers.js +3 -3
- package/dist/quantum-component-library.css +1 -1
- package/package.json +133 -133
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
|
+
```
|
package/dist/components.cjs
CHANGED
|
@@ -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"),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,C)=>{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,T=C.getClientOffset().y-j.top;a<u&&T<g||a>u&&T>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[C,a]=r.useState([void 0,void 0]),u=C[0],j=C[1],g=f&&n<-5&&l>5,b=Number(d?.[0]??j??n)>0?1:-1,T=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),S=ie(Number(s),T),I=b<0?Math.max(h,n):Math.min(h,l),B=T<0?Math.max(S,n):Math.min(S,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,T,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),T);a(([J,s])=>[J,G.toString()])},[a,T]),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),S=v?Number(j):s(Number(j));h>S?m([S,h]):m([h,S])},[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:T<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:T,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:C,containerProps:a,quantumIconSrc:u="/favicon.ico"})=>{const[j,g]=r.useState(""),[b,T]=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:T,hideUseCaseFilter:p})]}),e.jsxRuntimeExports.jsx(t.TableContainer,{mr:"2rem",overflowX:"hidden",...C,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,C]=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),[,T]=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),C([])},[]),_=r.useCallback(s=>{const h=s.map(S=>S.value);C(h)},[]),P=r.useCallback(async s=>{const h=$.getFragmentData(y.MODULE_CATEGORY_FRAGMENT,s.categories),S={...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:S});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 T({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")},[T]),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 S=i==="copy"?P:R,I=i==="copy"?"copy":"convert";for(const B of A)try{const U=await S(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(""),C([])}else throw new Error(`Failed to ${I} any activities`)}catch(s){const h=i==="copy"?"copy":"convert",S=s instanceof Error?s.message:`Failed to ${h} activities`;f({title:`${i==="copy"?"Copy":"Convert"} failed`,description:S,status:"error",duration:5e3,isClosable:!0}),l?.(s instanceof Error?s:new Error(S))}finally{u(!1)}},[A,i,P,R,f,o,l]),k=r.useCallback(()=>{M(""),C([]),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),C([])},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(S=>S.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,C]=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),[,T]=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 S=$.getFragmentData(y.MODULE_ACTION_FRAGMENT,h.moduleActions);return{...h,moduleActions:S.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(S=>S.value);M(h)},[]),w=r.useCallback(async()=>{if(C(!0),!_.length){C(!1);const s=new Error(`No modules selected for ${a==="convert"?"converting":"copying"}`);l?.(s);return}try{const s=[];let h=0;for(const S of _)try{let I=S.moduleActions.map(B=>B.actionId);if(x){const B=S.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:S.name,description:S.description||void 0,actions:I,categories:S.categories.map(Y=>Y.id),quantumOwned:!0},U=await T({id:S.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:`${S.name} (Copy)`,description:S.description||void 0,actions:I,categories:S.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 "${S.name}":`,I),h++}if(s.length>0){const S=s.length,I=_.length;f({title:h>0?`Partial ${a==="convert"?"convert":"copy"} completed`:`Modules ${a==="convert"?"converted":"copied"} successfully`,description:h>0?`${S} of ${I} modules ${a==="convert"?"converted":"copied"} successfully`:`${S} module${S>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{C(!1)}},[_,b,T,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(S=>S.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]),C=r.useMemo(()=>l.reduce((b,T)=>(b[T.id]=T,b),{}),[l]),a=r.useMemo(()=>d.map(b=>C[b]),[d,C]),u=r.useCallback((b,T)=>{m(T?[...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,options:m,value:n.length===0?{value:"other",label:"Other"}:d.filter(c=>n.includes(c.id)).map(c=>({value:c.id,label:c.name}))[0],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,C)=>{const a=oe.availablePlanes.indexOf(p.plane),u=oe.availablePlanes.indexOf(C.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,C)=>{const a=i.findIndex(j=>j.id===C.id&&j.plane===C.plane);let u=[...i];l&&(C={...C,kind:l}),u[a]=C,x&&(u=u.map(j=>({...j,min:C.min,max:C.max}))),n(u)},[n,i,l,x]),M=r.useCallback(p=>{const C=i.filter(a=>a.id!==p.id||a.plane!==p.plane);n(C)},[n,i]);return e.jsxRuntimeExports.jsx(t.VStack,{alignItems:"flex-start",overflowY:"auto",...f,children:i.map((p,C)=>e.jsxRuntimeExports.jsx(De,{label:N(p),parameter:p,onChange:a=>E(C,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]),C=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),T=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:T&&T.min?T.min:0,A=z&&!b?z.max:T&&T.max?T.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:C,isDisabled:x||C.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:C}]=q.useQuery({query:y.GET_ACTION_BY_ID,variables:{id:o??""},pause:!o}),a=$.getFragmentData(y.ACTION_FRAGMENT,C?.getActionById),u=N||M,j=!!a&&!!o,[g,b]=r.useState(""),[T,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:S}]=q.useQuery({query:y.GET_ALL_MODULE_CATEGORIES}),I=r.useMemo(()=>$.getFragmentData(y.MODULE_CATEGORY_FRAGMENT,S?.moduleCategories)?.map(W=>({label:W.name,value:W.id})),[S?.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:T,cameraPlacement:D,videoLink:L,activityType:P,sessionType:w.map(O=>O.value),categories:G,sensorLocations:s,thresholds:re.parametersToThresholds(U)}),[te,g,s,T,D,L,P,w,G,U]),se=r.useCallback(()=>{const O={name:g,description:T,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,T,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:T,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},C]=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)??[],[T,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:T,name:D,categories:L.filter(v=>v!=="other"),description:P,quantumOwned:c};g?k=C({id:g.id,input:H}):k=u({input:H}),k.then(({error:v})=>{v?d(v):l()})},[u,C,T,D,P,L,g,l,d,c]);return r.useEffect(()=>{f&&f({cancelButton:p||a,saveButton:p||a||!D||P.trim().split(/\s+/).filter(Boolean).length>40})},[f,p,a,T,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:T,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;
|
|
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"),fe=require("./ufuzzy-vendor-7qHa_k39.cjs"),ee=require("./react-select-vendor-D_Q2fL5j.cjs"),me=require("./react-icons-vendor-D2s8zw9h.cjs"),Y=require("./graphql-vendor-CL0XsjHb.cjs"),G=require("./generated.cjs"),R=require("./graphql-BnWfFu1Y.cjs"),ue=require("./react-dnd-vendor-BPzSDojS.cjs"),N=require("./generated-graphql.cjs"),ne=require("./services.cjs"),re=require("./types.cjs"),ae=require("./utils.cjs"),be=require("./hooks.cjs"),ve=({setSearch:o,actions:n,updateUseCases:l,hideUseCaseFilter:d=!1})=>{const m=r.useMemo(()=>n?.flatMap(a=>a.useCases).filter((a,x,v)=>v.findIndex(i=>i.id===a.id)===x).map(a=>({label:a.name,value:a.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:me.FaSearch,color:"gray.300"})}),e.jsxRuntimeExports.jsx(t.Input,{placeholder:"Search by name...",width:"100%",maxW:d?void 0:"30rem",onChange:a=>o(a.target.value)})]}),!d&&e.jsxRuntimeExports.jsx(t.InputGroup,{size:"md",children:e.jsxRuntimeExports.jsx(ee.st,{size:"md",chakraStyles:{container:a=>({...a,width:"100%"})},menuPortalTarget:document.body,placeholder:"Filter use case",isMulti:!0,options:m,onChange:a=>l(a.map(x=>x.value))})})]})},Z=({children:o})=>e.jsxRuntimeExports.jsx(t.FormLabel,{fontWeight:"bold",fontFamily:"sans-serif",fontSize:"large",children:o}),ye=({value:o,onChange:n})=>{const l=r.useState(()=>Math.random().toString(36).substring(2,15))[0],d=r.useCallback((m,a)=>{n(x=>{const v=[...x],[i]=v.splice(m,1);return v.splice(a,0,i),v})},[n]);return e.jsxRuntimeExports.jsx(t.Box,{children:e.jsxRuntimeExports.jsx(ue.DndProvider,{backend:ue.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,a)=>e.jsxRuntimeExports.jsx(Ce,{listKey:l,index:a,id:m.id,name:m.name,move:d},m.id))})]})})})})},Ce=({listKey:o,index:n,id:l,name:d,move:m})=>{const a=r.useRef(null),[{handlerId:x},v]=ue.useDrop({accept:o,collect:j=>({handlerId:j.getHandlerId()?.toString()??""}),hover:(j,C)=>{if(!a.current)return;const c=j.index,u=n;if(c===u)return;const h=a.current?.getBoundingClientRect(),g=(h.bottom-h.top)/2,S=C.getClientOffset().y-h.top;c<u&&S<g||c>u&&S>g||(m(c,u),j.index=u)}}),[{isDragging:i},O]=ue.useDrag({type:o,item:()=>({id:l,index:n}),collect:j=>({isDragging:j.isDragging()})}),y=i?.6:1,M=i?"grabbing":"grab";return O(v(a)),e.jsxRuntimeExports.jsxs(t.Tr,{ref:a,style:{opacity:y,cursor:M},"data-handler-id":x,children:[e.jsxRuntimeExports.jsx(t.Td,{children:n+1}),e.jsxRuntimeExports.jsx(t.Td,{children:d})]})},Te=({items:o,onChange:n,selectedItem:l,isDisabled:d,selectedProps:m,buttonProps:a})=>{const x=i=>i===l||i.value===l,v=i=>x(i)?{...a,...m}:a;return e.jsxRuntimeExports.jsx(t.ButtonGroup,{isAttached:!0,isDisabled:d,children:o.map((i,O)=>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,O),isDisabled:i.disabled,...v(i),children:i.label})},O))})},le=(o,n)=>n<0?-1*Math.abs(o):Math.abs(o),Se=({isReversed:o,min:n,max:l,value:d,onChange:m,inputProps:a,size:x,zeroMarker:v,formatValue:i,valueLabel:O,positiveNegativeLabels:y,isDisabled:M,...j})=>{const[C,c]=r.useState([void 0,void 0]),u=C[0],h=C[1],g=v&&n<-5&&l>5,E=Number(d?.[0]??h??n)>0?1:-1,S=Number(d?.[1]??h??l)<0?-1:1,D=y?.[0]===y?.[1],B=d?.[0],A=d?.[1];r.useEffect(()=>{B!==void 0&&A!==void 0&&c([B.toFixed(0),A.toFixed(0)])},[B,A,c]);const _=r.useCallback(([b,U])=>{b<U&&c([b.toFixed(0),U.toFixed(0)])},[c]),k=r.useCallback(([b,U])=>{b<U&&m([b,U])},[m]),W=r.useCallback(()=>{c(([b,U])=>{const V=isNaN(Number(b))?n:Number(b),s=isNaN(Number(U))?l:Number(U),p=le(Number(V),E),T=le(Number(s),S),L=E<0?Math.max(p,n):Math.min(p,l),P=S<0?Math.max(T,n):Math.min(T,l);return L>P?(m([P,L]),[P.toFixed(0),L.toFixed(0)]):(m([L,P]),[L.toFixed(0),P.toFixed(0)])})},[m,c,E,S,n,l]),f=r.useCallback(b=>{const U=b===""||isNaN(Number(b))?b:le(Number(b),E);c(([V,s])=>[U.toString(),s])},[c,E]),I=r.useCallback(b=>{const U=b===""||isNaN(Number(b))?b:le(Number(b),S);c(([V,s])=>[V,U.toString()])},[c,S]),w=r.useMemo(()=>x==="xs"?"0.75rem":void 0,[x]),J=r.useCallback((b,U)=>{const V=Number(U.target.value);if(!u||!h||![-1,1].includes(V))return;const s=L=>V<0?-1*Math.abs(L):Math.abs(L),p=b?s(Number(u)):Number(u),T=b?Number(h):s(Number(h));p>T?m([T,p]):m([p,T])},[u,h,m]);return e.jsxRuntimeExports.jsxs(t.Flex,{direction:"column",...j,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(h??l)],max:l,min:n,minStepsBetweenThumbs:3,step:1,onChange:_,onChangeEnd:k,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,h:w}),e.jsxRuntimeExports.jsx(t.RangeSliderThumb,{index:1,w,h:w})]})}),O&&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:O(n)}),e.jsxRuntimeExports.jsx(t.Text,{fontSize:x??"sm",fontWeight:"semibold",whiteSpace:"nowrap",children:O(l)})]}),e.jsxRuntimeExports.jsxs(t.Flex,{direction:o?"row-reverse":"row",justifyContent:"center",alignItems:"center",gap:"0.125em",children:[y&&e.jsxRuntimeExports.jsxs(t.Select,{width:"auto",size:x,fontWeight:"bold",value:E,onChange:b=>J(!0,b),isDisabled:D||M,children:[e.jsxRuntimeExports.jsx("option",{value:-1,children:y[0]}),e.jsxRuntimeExports.jsx("option",{value:1,children:y[1]})]}),e.jsxRuntimeExports.jsx(t.NumberInput,{precision:0,size:x??"sm",min:0,max:E<0?Math.abs(n):A??l,value:u===""?"":Math.abs(Number(u??n)),onChange:f,onBlur:W,borderWidth:1,borderRadius:3,borderColor:"#ccc",isDisabled:M,...a,children:e.jsxRuntimeExports.jsx(t.NumberInputField,{backgroundColor:"#fff",paddingRight:0,width:"4em"})}),e.jsxRuntimeExports.jsx(t.NumberInput,{size:x??"sm",min:0,max:S<0?Math.abs(B??n):l,precision:0,value:h===""?"":Math.abs(Number(h??l)),onChange:I,onBlur:W,borderWidth:1,borderRadius:3,borderColor:"#ccc",isDisabled:M,...a,children:e.jsxRuntimeExports.jsx(t.NumberInputField,{backgroundColor:"#fff",paddingRight:0,width:"4em"})}),y&&e.jsxRuntimeExports.jsxs(t.Select,{width:"auto",size:x,fontWeight:"bold",value:S,onChange:b=>J(!1,b),isDisabled:D||M,children:[e.jsxRuntimeExports.jsx("option",{value:-1,children:y[0]}),e.jsxRuntimeExports.jsx("option",{value:1,children:y[1]})]})]})]})},Me=({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))}),Ae=new fe.uFuzzy({}),we=({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,Fe=(o,n)=>{if(!n||!n.trim().length)return o;const l=o.map(m=>m.name??"");return Ae.filter(l,n)?.map(m=>o[m])??[]},Oe=o=>!o||o.length===0?"None":o.map(n=>n.replace(/([A-Z])/g," $1").trim()).join(", "),ke=(o,n)=>!n||n.length==0?o:o.filter(l=>l.useCases?.some(d=>n.includes(d.id))??!1),pe=({actions:o,totalActions:n,onCreate:l,onDelete:d,onEdit:m,onView:a,onSelected:x,onDuplicate:v,disableMultiSelect:i,disableDelete:O,disableEdit:y,disableCreate:M,hideUseCase:j=!0,tableProps:C,containerProps:c,quantumIconSrc:u="/favicon.ico"})=>{const[h,g]=r.useState(""),[E,S]=r.useState(),D=r.useMemo(()=>{if(!o)return;const f=Fe(o,h);return j?f:ke(f,E)},[o,h,E,j]),B=r.useCallback(()=>{if(!d)return;const I=o.filter(w=>w.selected&&!w.quantumOwned).map(w=>w.id);d(I)},[o,d]),A=r.useCallback(()=>{if(!v)return;const f=o.filter(I=>I.selected);v(f.map(I=>I.id)),x&&f.forEach(I=>x(I,!1))},[o,v,x]),_=r.useMemo(()=>o.some(f=>f.selected&&!f.quantumOwned),[o]),k=r.useMemo(()=>o.some(f=>f.selected),[o]),W=r.useMemo(()=>o.some(f=>f.selected&&f.quantumOwned),[o]);return e.jsxRuntimeExports.jsxs(t.Box,{...c,children:[e.jsxRuntimeExports.jsxs(t.Flex,{alignContent:"space-between",gap:4,children:[(l||d||v)&&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:W?_?"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:!_||!d||O,onClick:B,children:"Delete Selected"})}),v&&!i&&e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"gray",isDisabled:!k,onClick:A,children:"Duplicate Selected"})]}),e.jsxRuntimeExports.jsx(ve,{setSearch:g,actions:o,updateUseCases:S,hideUseCaseFilter:j})]}),e.jsxRuntimeExports.jsx(t.TableContainer,{mr:"2rem",overflowX:"hidden",...C,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 ",D?.length??0," of"," ",n??o.length,")"]}),e.jsxRuntimeExports.jsx(t.Th,{children:"Name"}),e.jsxRuntimeExports.jsx(t.Th,{children:"Sensor Locations"}),!j&&e.jsxRuntimeExports.jsx(t.Th,{children:"Use Case"}),e.jsxRuntimeExports.jsx(t.Th,{})]})}),e.jsxRuntimeExports.jsx(t.Tbody,{children:D?.map(f=>e.jsxRuntimeExports.jsxs(t.Tr,{title:i&&f.selected?"This activity is selected. Click it again to deselect.":void 0,bg:i&&f.selected?"gray.200":void 0,_hover:{bg:i&&!f.selected?"#f7f7f7":void 0},cursor:i?"pointer":"default",onClick:()=>i?x?.(f,!f.selected):void 0,children:[e.jsxRuntimeExports.jsx(t.Td,{children:e.jsxRuntimeExports.jsxs(t.Flex,{children:[x&&!i&&e.jsxRuntimeExports.jsx(t.Checkbox,{isChecked:f.selected,"aria-label":"Select activity",onChange:I=>x(f,I.target.checked)}),(f.quantumOwned||!m)&&a&&e.jsxRuntimeExports.jsx(t.Button,{ml:"1em",size:"sm",variant:"link",colorScheme:"blue",onClick:()=>a(f.id),children:"View"}),!f.quantumOwned&&m&&e.jsxRuntimeExports.jsx(t.Button,{isDisabled:y,ml:"1em",size:"sm",variant:"link",colorScheme:"blue",onClick:()=>m(f.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(we,{action:f,quantumIconSrc:u}),f.name]})}),e.jsxRuntimeExports.jsx(t.Td,{maxW:"20rem",whiteSpace:"break-spaces",children:Oe(f.sensorLocations)}),!j&&e.jsxRuntimeExports.jsx(t.Td,{maxW:"20rem",children:e.jsxRuntimeExports.jsx(Me,{containerProps:{flexWrap:"wrap"},tags:f.useCases?.map(I=>I.name)??[]})})]},f.id))})]})})]})},Ie=({onSave:o,onCancel:n,onError:l,hideButtons:d=!1,setButtonDisabled:m,setButtonOnClick:a,quantumOwned:x})=>{const v=t.useToast(),[i,O]=r.useState("copy"),[y,M]=r.useState(""),[j,C]=r.useState([]),[c,u]=r.useState(!1),[h]=Y.useQuery({query:R.GET_GROUPS}),[g]=Y.useQuery({query:R.GET_ACTIONS_BY_GROUP,variables:{groupId:y},pause:!y}),[,E]=Y.useMutation(R.CREATE_ACTION),[,S]=Y.useMutation(R.CONVERT_ACTION_TO_QUANTUM_OWNED),D=r.useMemo(()=>h.data?.groups?h.data.groups.map(s=>G.getFragmentData(R.GROUP_FRAGMENT,s)):[],[h.data]),B=r.useMemo(()=>g.data?g.data.actions.map(p=>G.getFragmentData(R.ACTION_FRAGMENT,p)):[],[g.data]),A=r.useMemo(()=>B.filter(s=>j.includes(s.id)),[B,j]),_=r.useCallback(s=>{const p=s?.value||"";M(p),C([])},[]),k=r.useCallback(s=>{const p=s.map(T=>T.value);C(p)},[]),W=r.useCallback(async s=>{const p=G.getFragmentData(R.MODULE_CATEGORY_FRAGMENT,s.categories),L=G.getFragmentData(R.METADATA_GROUP_FRAGMENT,s.metadataGroups).flatMap($=>$.data.map(q=>G.getFragmentData(R.METADATA_ITEM_FRAGMENT,q).id)),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($=>({...$,id:void 0})),categories:p?.map($=>$.id),quantumOwned:x,metadataItemIds:L,id:void 0},z=await E({fields:P});if(z.error)throw new Error(z.error.message);if(z.data?.createAction)return G.getFragmentData(R.ACTION_FRAGMENT,z.data.createAction);throw new Error("No action data returned")},[E,x]),f=r.useCallback(async s=>{const p=await S({id:s.id});if(p.error)throw new Error(p.error.message);if(p.data?.convertActionToQuantumOwned)return G.getFragmentData(R.ACTION_FRAGMENT,p.data.convertActionToQuantumOwned);throw new Error("No action data returned")},[S]),I=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 p=0;const T=i==="copy"?W:f,L=i==="copy"?"copy":"convert";for(const P of A)try{const z=await T(P);s.push(z)}catch(z){console.error(`Failed to ${L} activity "${P.name}":`,z),p++}if(s.length>0){const P=s.length,z=A.length,$=i==="copy"?"copied":"converted",q=i==="copy"?"copy":"convert";v({title:p>0?`Partial ${q} completed`:`Activities ${$} successfully`,description:p>0?`${P} of ${z} activities ${$} successfully`:`${P} activit${P>1?"ies":"y"} ${$} successfully`,status:p>0?"warning":"success",duration:3e3,isClosable:!0}),o?.(),M(""),C([])}else throw new Error(`Failed to ${L} any activities`)}catch(s){const p=i==="copy"?"copy":"convert",T=s instanceof Error?s.message:`Failed to ${p} activities`;v({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,W,f,v,o,l]),w=r.useCallback(()=>{M(""),C([]),O("copy"),n?.()},[n]);r.useEffect(()=>{m&&m({cancelButton:!1,saveButton:A.length===0||c})},[A.length,c,m]),r.useEffect(()=>{a&&a({cancelButton:w,saveButton:I})},[a,w,I]);const J=r.useMemo(()=>D.map(s=>({value:s.id,label:s.name})),[D]),b=r.useMemo(()=>B.filter(s=>i==="copy"?!0:!s.quantumOwned).map(s=>({value:s.id,label:s.name,isQuantumOwned:s.quantumOwned})),[B,i]),U=h.fetching,V=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=>{O(s),C([])},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(ee.st,{placeholder:"Choose a group...",options:J,value:J.find(s=>s.value===y)||null,onChange:_,isLoading:U,isDisabled:U,isClearable:!0}),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 groups: ",h.error.message]})]})]}),y&&e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsxs(Z,{children:["Select Activities to"," ",i==="copy"?"Copy":"Convert"]}),V?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(ee.st,{placeholder:`Choose activities to ${i}...`,options:b,value:b.filter(s=>j.includes(s.value)),onChange:k,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"})]}),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,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(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:w,isDisabled:c,children:"Cancel"}),e.jsxRuntimeExports.jsxs(t.Button,{colorScheme:i==="copy"?"blue":"green",onClick:I,isDisabled:A.length===0||c,isLoading:c,loadingText:`${i==="copy"?"Copying":"Converting"}...`,children:[i==="copy"?"Copy":"Convert"," ",A.length===1?"Activity":`${A.length} Activities`]})]})]})})},Ne=({onSave:o,onCancel:n,onError:l,hideButtons:d=!1,setButtonDisabled:m,setButtonOnClick:a,quantumOwned:x})=>{const v=t.useToast(),[i,O]=r.useState(""),[y,M]=r.useState([]),[j,C]=r.useState(!1),[c,u]=r.useState("copy"),[h]=Y.useQuery({query:R.GET_GROUPS}),[g]=Y.useQuery({query:R.GET_MODULES_BY_GROUP,variables:{groupId:i},pause:!i}),[,E]=Y.useMutation(R.CREATE_MODULE),[,S]=Y.useMutation(R.UPDATE_MODULE),[,D]=Y.useMutation(R.CREATE_ACTION),[,B]=Y.useMutation(R.CONVERT_ACTION_TO_QUANTUM_OWNED),A=r.useMemo(()=>h.data?.groups?h.data.groups.map(s=>G.getFragmentData(R.GROUP_FRAGMENT,s)):[],[h.data]),_=r.useMemo(()=>g.data?.modules?G.getFragmentData(R.ACTION_MODULE_FRAGMENT,g.data?.modules).map(p=>{const T=G.getFragmentData(R.MODULE_ACTION_FRAGMENT,p.moduleActions);return{...p,moduleActions:T.map(L=>({...L,action:G.getFragmentData(R.ACTION_FRAGMENT,L.action)})),categories:G.getFragmentData(R.MODULE_CATEGORY_FRAGMENT,p.categories)}}):[],[g.data]),k=r.useMemo(()=>_.filter(s=>y.includes(s.id)),[_,y]),W=r.useCallback(s=>{const p=s?.value||"";O(p),M([])},[]),f=r.useCallback(s=>{const p=s.map(T=>T.value);M(p)},[]),I=r.useCallback(async()=>{if(C(!0),!k.length){C(!1);const s=new Error(`No modules selected for ${c==="convert"?"converting":"copying"}`);l?.(s);return}try{const s=[];let p=0;for(const T of k)try{let L=T.moduleActions.map(P=>P.actionId);if(x){const P=T.moduleActions.map(q=>q.action),z=async q=>{if(c==="copy"){if(q.quantumOwned)return q;const F=G.getFragmentData(R.MODULE_CATEGORY_FRAGMENT,q.categories),H={...q,quantumOwned:!0,thresholds:q.thresholds.map(K=>({...K,id:void 0})),categories:F?.map(K=>K.id),id:void 0},Q=await D({fields:H});return Q.error||!Q.data?.createAction?null:G.getFragmentData(R.ACTION_FRAGMENT,Q.data.createAction)}if(q.quantumOwned)return q;const oe=await B({id:q.id});return oe.error||!oe.data?.convertActionToQuantumOwned?null:G.getFragmentData(R.ACTION_FRAGMENT,oe.data.convertActionToQuantumOwned)};L=(await Promise.all(P.map(z))).filter(q=>!!q).map(q=>q.id)}if(c==="convert"){const P={name:T.name,description:T.description||void 0,actions:L,categories:T.categories.map($=>$.id),quantumOwned:!0},z=await S({id:T.id,input:P});if(z.error)throw new Error(z.error.message);if(z.data?.updateModule){const $=G.getFragmentData(R.ACTION_MODULE_FRAGMENT,z.data.updateModule);s.push($)}}else{const P={name:`${T.name} (Copy)`,description:T.description||void 0,actions:L,categories:T.categories.map($=>$.id),quantumOwned:x},z=await E({input:P});if(z.error)throw new Error(z.error.message);if(z.data?.createModule){const $=G.getFragmentData(R.ACTION_MODULE_FRAGMENT,z.data.createModule);s.push($)}}}catch(L){console.error(`Failed to ${c==="convert"?"convert":"copy"} module "${T.name}":`,L),p++}if(s.length>0){const T=s.length,L=k.length;v({title:p>0?`Partial ${c==="convert"?"convert":"copy"} completed`:`Modules ${c==="convert"?"converted":"copied"} successfully`,description:p>0?`${T} of ${L} modules ${c==="convert"?"converted":"copied"} successfully`:`${T} module${T>1?"s":""} ${c==="convert"?"converted":"copied"} successfully`,status:p>0?"warning":"success",duration:3e3,isClosable:!0}),s.length>0&&o?.(),O(""),M([])}else throw new Error(`Failed to ${c==="convert"?"convert":"copy"} any modules`)}catch(s){const p=s instanceof Error?s.message:`Failed to ${c==="convert"?"convert":"copy"} modules`;v({title:c==="convert"?"Convert failed":"Copy failed",description:p,status:"error",duration:5e3,isClosable:!0}),l?.(s instanceof Error?s:new Error(p))}finally{C(!1)}},[k,E,S,v,o,l,x,D,B,c]),w=r.useCallback(()=>{O(""),M([]),u("copy"),n?.()},[n]);r.useEffect(()=>{m&&m({cancelButton:!1,saveButton:k.length===0||j})},[k.length,j,m]),r.useEffect(()=>{a&&a({cancelButton:w,saveButton:I})},[a,w,I]);const J=r.useMemo(()=>A.map(s=>({value:s.id,label:s.name})),[A]),b=r.useMemo(()=>_.filter(s=>c==="copy"?!0:!s.quantumOwned).map(s=>({value:s.id,label:s.name,isQuantumOwned:s.quantumOwned})),[_,c]),U=h.fetching,V=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:c,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(ee.st,{placeholder:"Choose a group...",options:J,value:J.find(s=>s.value===i)||null,onChange:W,isLoading:U,isDisabled:U,isClearable:!0}),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 groups: ",h.error.message]})]})]}),i&&e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(Z,{children:c==="convert"?"Select Module to Convert":"Select Module to Copy"}),V?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(ee.st,{placeholder:c==="convert"?"Choose modules to convert...":"Choose modules to copy...",options:b,value:b.filter(s=>y.includes(s.value)),onChange:f,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"})]}),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]})]})]}),k.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:k.length===1?`Module to ${c==="copy"?"Copy":"Convert"}`:`${k.length} Modules to ${c==="copy"?"Copy":"Convert"}`}),e.jsxRuntimeExports.jsxs(t.VStack,{align:"start",spacing:3,children:[k.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(T=>T.name).join(", ")||"None"]})]})]},s.id)),k.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: ",k.length," modules will be"," ",c==="copy"?"copied":"converted"]})}),x&&k.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:c==="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:w,isDisabled:j,children:"Cancel"}),e.jsxRuntimeExports.jsxs(t.Button,{colorScheme:c==="copy"?"blue":"green",onClick:I,isDisabled:k.length===0||j,isLoading:j,loadingText:`${c==="copy"?"Copying":"Converting"}...`,children:[c==="copy"?"Copy":"Convert"," ",k.length===1?"Module":`${k.length} Modules`]})]})]})})},he=({name:o,setName:n,actions:l,selectedActionIds:d,setSelectedActionIds:m,availableCategories:a,selectedCategoryIds:x,setSelectedCategoryIds:v,description:i,setDescription:O,...y})=>{const M=t.useDisclosure(),j=r.useMemo(()=>l.map(E=>({...E,selected:d.includes(E.id)})),[l,d]),C=r.useMemo(()=>l.reduce((E,S)=>(E[S.id]=S,E),{}),[l]),c=r.useMemo(()=>d.map(E=>C[E]),[d,C]),u=r.useCallback((E,S)=>{m(S?[...d,E.id]:d.filter(D=>D!==E.id))},[d,m]),h=r.useCallback(E=>{n(E.target.value)},[n]),g=r.useCallback(E=>{O?.(E.target.value)},[O]);return e.jsxRuntimeExports.jsxs(t.Box,{...y,children:[e.jsxRuntimeExports.jsxs(t.HStack,{gap:"2rem",children:[e.jsxRuntimeExports.jsx(Le,{name:o??"",onInputChange:h}),e.jsxRuntimeExports.jsx(De,{availableCategories:a,value:x,onChange:v})]}),e.jsxRuntimeExports.jsx(_e,{description:i??"",onInputChange:g}),e.jsxRuntimeExports.jsx(Ge,{value:c,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(pe,{actions:j,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"})})]})]})]})},Le=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})]})),De=r.memo(({availableCategories:o,value:n,onChange:l})=>{const d=r.useMemo(()=>[...o,{id:"other",name:"Other"}],[o]),m=r.useMemo(()=>d.map(a=>({value:a.id,label:a.name})),[d]);return e.jsxRuntimeExports.jsxs(t.FormControl,{mb:4,children:[e.jsxRuntimeExports.jsx(Z,{children:"Module Category"}),e.jsxRuntimeExports.jsx(ee.st,{isDisabled:o.length===0,options:m,value:n.length===0?{value:"other",label:"Other"}:d.filter(a=>n.includes(a.id)).map(a=>({value:a.id,label:a.name}))[0],onChange:a=>l(a?[a.value]:[]),placeholder:"Select category"})]})}),_e=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})]})),Ge=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(ye,{value:d,onChange:m=>{const a=m(d);n(a.map(x=>x.id))}})]})}),je=({value:o,onChange:n,forceKind:l,disableRemove:d,disableKind:m,isDisabled:a,lockRanges:x,...v})=>{const i=r.useMemo(()=>[...o].sort((j,C)=>{const c=re.availablePlanes.indexOf(j.plane),u=re.availablePlanes.indexOf(C.plane);return c-u}),[o]),O=r.useCallback(j=>"segment"in j.id?ne.getSegmentNameWithPlane(j.id.segment,j.plane,!0)??"Unknown":ne.getJointNameWithPlane(j.id.joint,j.plane,!0)??"Unknown",[]),y=r.useCallback((j,C)=>{const c=i.findIndex(h=>h.id===C.id&&h.plane===C.plane);let u=[...i];l&&(C={...C,kind:l}),u[c]=C,x&&(u=u.map(h=>({...h,min:C.min,max:C.max}))),n(u)},[n,i,l,x]),M=r.useCallback(j=>{const C=i.filter(c=>c.id!==j.id||c.plane!==j.plane);n(C)},[n,i]);return e.jsxRuntimeExports.jsx(t.VStack,{alignItems:"flex-start",overflowY:"auto",...v,children:i.map((j,C)=>e.jsxRuntimeExports.jsx(Be,{label:O(j),parameter:j,onChange:c=>y(C,c),onRemove:d||a?void 0:()=>M(j),forceKind:l,disableKind:m||a,isDisabled:a},`${JSON.stringify(j.id)}-${j.plane}`))})},Be=({label:o,parameter:n,onChange:l,onRemove:d,forceKind:m,disableKind:a,isDisabled:x})=>{const v=r.useCallback(y=>"joint"in n.id?ne.getJointAngleDirectionName(n.id.joint,n.plane,y<0?-1:1):ne.getSegmentAngleDirectionName(n.id.segment,n.plane,y<0?-1:1),[n]),{min:i,max:O}="joint"in n.id?ne.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:me.FaTrash}),onClick:d}),!m&&e.jsxRuntimeExports.jsx(Te,{selectedItem:n?.kind??N.ThresholdKind.Limit,onChange:({value:y})=>l({...n,kind:y}),isDisabled:a||x,buttonProps:{size:"sm",variant:"outline",colorScheme:"gray"},selectedProps:{variant:"solid",colorScheme:"teal"},items:[{value:N.ThresholdKind.Limit,label:"limit"},{value:N.ThresholdKind.Target,label:"target"}]})]}),e.jsxRuntimeExports.jsx(Se,{w:"100%",size:"xs",min:i,max:O,zeroMarker:!0,value:[n.min,n.max],onChange:y=>l({...n,min:y[0],max:y[1]}),formatValue:y=>`${Math.abs(y)}°`,valueLabel:y=>v(y)??"",positiveNegativeLabels:v(0)?[v(-1)??"",v(1)??""]:void 0,isDisabled:x})]})},ce=(o,n)=>"segment"in o&&"segment"in n&&o.segment===n.segment||"joint"in o&&"joint"in n&&o.joint===n.joint,ge=({options:o,value:n,onChange:l,forceKind:d,singleValue:m,singleValueSideless:a,editOnly:x,disableKind:v,maxParameters:i,...O})=>{const y=a?2:i,M=r.useMemo(()=>o.map(u=>({label:"segment"in u.id?ne.getSegmentNameWithPlane(u.id.segment,u.plane,!0)??"Unknown":ne.getJointNameWithPlane(u.id.joint,u.plane,!0)??"Unknown",value:u.id,plane:u.plane})),[o]),j=r.useMemo(()=>{if(!a||n.length===0)return M;const u=n[0];return M.filter(h=>re.getAnalysisPartIdNoSide(h.value)===re.getAnalysisPartIdNoSide(u.id)&&h.plane===u.plane)},[M,n,a]),C=r.useMemo(()=>M.filter(u=>n.some(h=>ce(h.id,u.value)&&h.plane===u.plane)),[M,n]),c=r.useCallback(u=>{const h=u.map(g=>{const E=n.find(_=>ce(_.id,g.value)&&_.plane===g.plane),S=o.find(_=>ce(_.id,g.value)&&_.plane===g.plane),D=a?n.find(_=>re.getAnalysisPartIdNoSide(_.id)===re.getAnalysisPartIdNoSide(g.value)&&_.plane===g.plane):void 0,B=D&&!E?D.min:S&&S.min?S.min:0,A=D&&!E?D.max:S&&S.max?S.max:0;return E??{id:g.value,plane:g.plane,min:B,max:A,kind:d??N.ThresholdKind.Limit}});l(h)},[l,n,o,d,a]);return r.useEffect(()=>{const u=n.filter(h=>o.some(g=>ce(g.id,h.id)&&g.plane===h.plane));u.length!==n.length&&l(u)},[o,l]),e.jsxRuntimeExports.jsxs(t.Box,{...O,children:[e.jsxRuntimeExports.jsx(ee.st,{isMulti:!m,placeholder:n.length?`${n.length} selected`:"Search...",value:C,isDisabled:x||C.length>=(y??1/0),onChange:u=>Array.isArray(u)?c([...u]):c(u!==null?[u]:[]),options:j,controlShouldRenderValue:!1}),e.jsxRuntimeExports.jsx(je,{marginTop:2,maxH:"28rem",value:n,onChange:l,forceKind:d,disableKind:v,isDisabled:x,lockRanges:a})]})},Ee=o=>{switch(o){case N.SensorLocation.Thorax:return"Thorax";case N.SensorLocation.CenterBack:return"Center Back";case N.SensorLocation.Pelvis:return"Pelvis";case N.SensorLocation.LeftThigh:return"Left Thigh";case N.SensorLocation.RightThigh:return"Right Thigh";case N.SensorLocation.LeftShank:return"Left Shank";case N.SensorLocation.RightShank:return"Right Shank";case N.SensorLocation.LeftFoot:return"Left Foot";case N.SensorLocation.RightFoot:return"Right Foot";case N.SensorLocation.LeftUpperArm:return"Left Upper Arm";case N.SensorLocation.RightUpperArm:return"Right Upper Arm";case N.SensorLocation.LeftForearm:return"Left Forearm";case N.SensorLocation.RightForearm:return"Right Forearm";case N.SensorLocation.Head:return"Head"}return console.warn(`Unknown sensor location: ${o}`),"Unknown"},Pe=6,ze=[N.SensorLocation.LeftFoot,N.SensorLocation.LeftShank,N.SensorLocation.LeftThigh,N.SensorLocation.Pelvis,N.SensorLocation.RightFoot,N.SensorLocation.RightShank,N.SensorLocation.RightThigh,N.SensorLocation.Thorax,N.SensorLocation.CenterBack,N.SensorLocation.Head],Ue=ze.map(o=>({label:Ee(o),value:o})),xe=[{key:"module_category",label:"Link Category",multi:!0},{key:"activity_type",label:"Activity Type",multi:!1},{key:"session_type",label:"Session Type",multi:!0},{key:"body_region",label:"Body Region",multi:!0},{key:"sport",label:"Sport",multi:!0}],$e=({id:o,onError:n,onCancel:l,onSave:d,hideButtons:m,setButtonOnClick:a,setButtonDisabled:x,quantumOwned:v,isView:i})=>{const O=Y.useClient(),[{fetching:y},M]=Y.useMutation(R.CREATE_ACTION),[{fetching:j},C]=Y.useMutation(R.UPDATE_ACTION),[{data:c}]=Y.useQuery({query:R.GET_ACTION_BY_ID,variables:{id:o??""},pause:!o}),u=G.getFragmentData(R.ACTION_FRAGMENT,c?.getActionById),h=y||j,g=!!u&&!!o,[E,S]=r.useState(""),[D,B]=r.useState(""),[A,_]=r.useState(""),[k,W]=r.useState(""),[f,I]=r.useState([]),[w,J]=r.useState([]),[b,U]=r.useState({}),V=r.useMemo(()=>f.map(F=>F.value),[f]),s=be.usePartOptionsForSensorLocations(V),[p,T]=r.useState([]),L=E.length>0,[P,z]=r.useState({});r.useEffect(()=>{const F=xe.map(H=>O.query(R.GET_METADATA_BY_KEY,{key:H.key}));Promise.all(F).then(H=>{const Q={};H.forEach(K=>{if(K.error||!K.data)return;const X=G.getFragmentData(R.METADATA_GROUP_FRAGMENT,K.data.getMetadataByKey),de=G.getFragmentData(R.METADATA_ITEM_FRAGMENT,X.data);Q[X.key]=de.map(se=>({label:se.label||se.value,value:se.value,id:se.id}))}),U(Q)})},[O]),r.useEffect(()=>{if(u){const H=G.getFragmentData(R.METADATA_GROUP_FRAGMENT,u.metadataGroups).map(K=>K.data.map(X=>G.getFragmentData(R.METADATA_ITEM_FRAGMENT,X).id)),Q={name:u.name,description:u.description||"",cameraPlacement:u.cameraPlacement||"",videoLink:u.videoLink||"",sensorLocations:u.sensorLocations.map(K=>({label:Ee(K),value:K})),thresholds:ae.thresholdsToParameters(u.thresholds),metadataIds:H.flat()};S(Q.name),B(Q.description),_(Q.cameraPlacement),W(Q.videoLink),I(Q.sensorLocations),T(Q.thresholds),J(Q.metadataIds),z(Q)}},[u]);const $=r.useMemo(()=>JSON.stringify(P)!==JSON.stringify({name:E,description:D,cameraPlacement:A,videoLink:k,sensorLocations:V,thresholds:ae.parametersToThresholds(p),metadataIds:w}),[P,E,V,D,A,k,w,p]),q=r.useCallback(()=>{const F={name:E,description:D,cameraPlacement:A,videoLink:k,sensorLocations:V,thresholds:ae.parametersToThresholds(p),metadataItemIds:w,laterality:N.ActionLaterality.Either,quantumOwned:v,sessionType:[]};let H;g&&o?H=C({id:o,fields:F}):H=M({fields:F}),H.then(({error:Q})=>{Q?n(Q):d()})},[v,M,C,o,E,V,D,A,k,w,g,p,d,n]);r.useEffect(()=>{x&&x({cancelButton:h,saveButton:i?!0:h||!L||!$})},[h,x,L,$,i]),r.useEffect(()=>{a&&a({cancelButton:l,saveButton:i?()=>{}:q})},[a,l,q,i]);const oe=(F,H)=>{const Q=xe.find(X=>X.key===F);if(!Q)return;const K=Q.multi?(H??[]).map(X=>X.id):H?[H.id]:[];J(X=>[...X.filter(se=>Object.values(b).flat().find(ie=>ie.id===se)&&!Object.keys(b).find(ie=>b[ie]?.some(Re=>Re.id===se&&ie===F))),...K])};return 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(te,{children:"Name"}),e.jsxRuntimeExports.jsx(t.Input,{value:E,onChange:F=>S(F.target.value),type:"text",placeholder:"i.e. Lunge & Return",isDisabled:i})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(te,{children:"Camera Placement"}),e.jsxRuntimeExports.jsx(t.Textarea,{value:A,onChange:F=>_(F.target.value),rows:2,placeholder:"(optional) Describe camera setup, placement, angles",isDisabled:i})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(te,{children:"Video Link"}),e.jsxRuntimeExports.jsx(t.Input,{value:k,onChange:F=>W(F.target.value),type:"url",placeholder:"(optional) https://...",isDisabled:i})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(te,{children:"Description"}),e.jsxRuntimeExports.jsx(t.Textarea,{value:D,onChange:F=>B(F.target.value),rows:2,placeholder:"(optional) Describe how to perform the test or exercise",isDisabled:i})]}),e.jsxRuntimeExports.jsxs("div",{className:"space-y-4",children:[e.jsxRuntimeExports.jsx(te,{children:"Metadata Tags"}),xe.map(F=>e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(te,{children:F.label}),e.jsxRuntimeExports.jsx(ee.st,{isMulti:F.multi,value:b[F.key]?.filter(H=>w.includes(H.id)),onChange:H=>{oe(F.key,H)},options:b[F.key],placeholder:`Select ${F.multi?"one or more":"one"} ${F.label.toLowerCase()}`,isDisabled:i,isClearable:F.multi})]},F.key))]})]}),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(te,{children:"Sensor Locations"}),e.jsxRuntimeExports.jsx(ee.st,{isMulti:!0,value:f,onChange:F=>I([...F]),options:Ue,isOptionDisabled:()=>f.length>=Pe,isDisabled:i})]}),e.jsxRuntimeExports.jsxs(t.FormControl,{children:[e.jsxRuntimeExports.jsx(te,{children:"Default Parameters"}),e.jsxRuntimeExports.jsx(ge,{options:s,value:p,onChange:T,editOnly:i})]})]}),e.jsxRuntimeExports.jsx("div",{className:ae.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:h,onClick:l,children:"Cancel"}),e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"blue",isDisabled:h||!L||!$,isLoading:h,onClick:q,children:"Save changes"})]})})]})},te=({children:o})=>e.jsxRuntimeExports.jsx(t.FormLabel,{fontWeight:"bold",fontFamily:"sans-serif",fontSize:"large",children:o}),qe=({id:o,onCancel:n,onSave:l,onError:d,hideButtons:m,quantumOwned:a,setButtonOnClick:x,setButtonDisabled:v})=>{const[{data:i}]=Y.useQuery({query:a?R.GET_QUANTUM_OWNED_ACTIONS:R.GET_ACTIONS}),[{data:O}]=Y.useQuery({query:R.GET_MODULE_BY_ID,variables:{id:o},pause:!o}),[{data:y}]=Y.useQuery({query:R.GET_ALL_MODULE_CATEGORIES}),M=G.getFragmentData(R.MODULE_CATEGORY_FRAGMENT,y?.moduleCategories),[{fetching:j},C]=Y.useMutation(R.UPDATE_MODULE),[{fetching:c},u]=Y.useMutation(R.CREATE_MODULE),h=G.getFragmentData(R.ACTION_FRAGMENT,a?i?.quantumOwnedActions:i?.actions)??[],g=G.getFragmentData(R.ACTION_MODULE_FRAGMENT,O?.module),E=G.getFragmentData(R.MODULE_ACTION_FRAGMENT,g?.moduleActions)??[],[S,D]=r.useState([...E.map(w=>w.actionId)??[]]),[B,A]=r.useState(g?.name??""),[_,k]=r.useState([]),[W,f]=r.useState(g?.description??"");r.useEffect(()=>{g&&(D(E.map(w=>w.actionId)),A(g.name),f(g.description??""),k(g.categories.map(w=>G.getFragmentData(R.MODULE_CATEGORY_FRAGMENT,w).id)??[]))},[g,E]);const I=r.useCallback(()=>{let w;const J={actions:S,name:B,categories:_.filter(b=>b!=="other"),description:W,quantumOwned:a};g?w=C({id:g.id,input:J}):w=u({input:J}),w.then(({error:b})=>{b?d(b):l()})},[u,C,S,B,W,_,g,l,d,a]);return r.useEffect(()=>{v&&v({cancelButton:j||c,saveButton:j||c||!B||W.trim().split(/\s+/).filter(Boolean).length>40})},[v,j,c,S,B,W]),r.useEffect(()=>{x&&x({cancelButton:n,saveButton:I})},[x,n,I]),e.jsxRuntimeExports.jsxs(t.Box,{width:"100%",children:[e.jsxRuntimeExports.jsx(he,{name:B,setName:A,actions:h,selectedActionIds:S,setSelectedActionIds:D,availableCategories:M??[],selectedCategoryIds:_,setSelectedCategoryIds:k,description:W,setDescription:f}),!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:j||c,onClick:n,children:"Cancel"}),e.jsxRuntimeExports.jsx(t.Button,{colorScheme:"blue",isDisabled:j||c||!B||W.trim().split(/\s+/).filter(Boolean).length>40,isLoading:j||c,onClick:I,children:"Save"})]})})]})};exports.ActivityList=pe;exports.CopyActivityForm=Ie;exports.CopyModuleForm=Ne;exports.ModuleForm=he;exports.ParameterEditList=je;exports.ParameterEditSelect=ge;exports.UpsertActivityForm=$e;exports.UpsertModuleForm=qe;
|