@braedonsaunders/appkit-forms 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +74 -0
- package/canvas-editor.d.ts +24 -0
- package/canvas-editor.d.ts.map +1 -0
- package/canvas-editor.js +115 -0
- package/canvas-editor.js.map +1 -0
- package/canvas-runtime.d.ts +12 -0
- package/canvas-runtime.d.ts.map +1 -0
- package/canvas-runtime.js +54 -0
- package/canvas-runtime.js.map +1 -0
- package/element-preview.d.ts +9 -0
- package/element-preview.d.ts.map +1 -0
- package/element-preview.js +167 -0
- package/element-preview.js.map +1 -0
- package/form-designer.d.ts +29 -0
- package/form-designer.d.ts.map +1 -0
- package/form-designer.js +214 -0
- package/form-designer.js.map +1 -0
- package/form-flow-validation.d.ts +5 -0
- package/form-flow-validation.d.ts.map +1 -0
- package/form-flow-validation.js +154 -0
- package/form-flow-validation.js.map +1 -0
- package/form-renderer.d.ts +37 -0
- package/form-renderer.d.ts.map +1 -0
- package/form-renderer.js +282 -0
- package/form-renderer.js.map +1 -0
- package/formula-builder.d.ts +25 -0
- package/formula-builder.d.ts.map +1 -0
- package/formula-builder.js +310 -0
- package/formula-builder.js.map +1 -0
- package/generated-copy.d.ts +17 -0
- package/generated-copy.d.ts.map +1 -0
- package/generated-copy.js +396 -0
- package/generated-copy.js.map +1 -0
- package/index.d.ts +27 -0
- package/index.d.ts.map +1 -0
- package/index.js +25 -0
- package/index.js.map +1 -0
- package/logic-builder.d.ts +27 -0
- package/logic-builder.d.ts.map +1 -0
- package/logic-builder.js +106 -0
- package/logic-builder.js.map +1 -0
- package/package.json +54 -0
- package/photo-field-state.d.ts +9 -0
- package/photo-field-state.d.ts.map +1 -0
- package/photo-field-state.js +11 -0
- package/photo-field-state.js.map +1 -0
- package/production-designer-adapter.d.ts +100 -0
- package/production-designer-adapter.d.ts.map +1 -0
- package/production-designer-adapter.js +2 -0
- package/production-designer-adapter.js.map +1 -0
- package/production-file-upload.d.ts +27 -0
- package/production-file-upload.d.ts.map +1 -0
- package/production-file-upload.js +105 -0
- package/production-file-upload.js.map +1 -0
- package/production-form-designer.d.ts +3 -0
- package/production-form-designer.d.ts.map +1 -0
- package/production-form-designer.js +1124 -0
- package/production-form-designer.js.map +1 -0
- package/production-form-renderer.d.ts +16 -0
- package/production-form-renderer.d.ts.map +1 -0
- package/production-form-renderer.js +2134 -0
- package/production-form-renderer.js.map +1 -0
- package/production-runtime-adapter.d.ts +187 -0
- package/production-runtime-adapter.d.ts.map +1 -0
- package/production-runtime-adapter.js +2 -0
- package/production-runtime-adapter.js.map +1 -0
- package/production-runtime-context.d.ts +29 -0
- package/production-runtime-context.d.ts.map +1 -0
- package/production-runtime-context.js +35 -0
- package/production-runtime-context.js.map +1 -0
- package/production-runtime-layout.d.ts +21 -0
- package/production-runtime-layout.d.ts.map +1 -0
- package/production-runtime-layout.js +33 -0
- package/production-runtime-layout.js.map +1 -0
- package/properties.d.ts +36 -0
- package/properties.d.ts.map +1 -0
- package/properties.js +133 -0
- package/properties.js.map +1 -0
- package/record-actions-panel.d.ts +28 -0
- package/record-actions-panel.d.ts.map +1 -0
- package/record-actions-panel.js +136 -0
- package/record-actions-panel.js.map +1 -0
- package/record-behavior-panel.d.ts +15 -0
- package/record-behavior-panel.d.ts.map +1 -0
- package/record-behavior-panel.js +59 -0
- package/record-behavior-panel.js.map +1 -0
- package/record-config.d.ts +44 -0
- package/record-config.d.ts.map +1 -0
- package/record-config.js +2 -0
- package/record-config.js.map +1 -0
- package/record-list-panel.d.ts +16 -0
- package/record-list-panel.d.ts.map +1 -0
- package/record-list-panel.js +86 -0
- package/record-list-panel.js.map +1 -0
- package/risk-matrix.d.ts +93 -0
- package/risk-matrix.d.ts.map +1 -0
- package/risk-matrix.js +239 -0
- package/risk-matrix.js.map +1 -0
- package/runtime-controls.d.ts +19 -0
- package/runtime-controls.d.ts.map +1 -0
- package/runtime-controls.js +61 -0
- package/runtime-controls.js.map +1 -0
- package/sketch-pad-client.d.ts +4 -0
- package/sketch-pad-client.d.ts.map +1 -0
- package/sketch-pad-client.js +54 -0
- package/sketch-pad-client.js.map +1 -0
- package/sketch-pad.d.ts +13 -0
- package/sketch-pad.d.ts.map +1 -0
- package/sketch-pad.js +17 -0
- package/sketch-pad.js.map +1 -0
- package/styles.css +7 -0
- package/text.d.ts +5 -0
- package/text.d.ts.map +1 -0
- package/text.js +10 -0
- package/text.js.map +1 -0
- package/workflow-properties.d.ts +16 -0
- package/workflow-properties.d.ts.map +1 -0
- package/workflow-properties.js +31 -0
- package/workflow-properties.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EACnB,mBAAmB,GAQpB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAkB,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,4BAA4B,CAAA;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAoB5C,MAAM,UAAU,eAAe,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,WAAW,GAAG,EAAE,EAAE,kBAAkB,GAAG,KAAK,EAAE,oBAAoB,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAAwB;IAChN,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAW,OAAO,CAAC,CAAA;IACvD,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;IAChF,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACtD,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO,EAAE,CAAA;QAC5D,IAAI,CAAC,YAAY,EAAE,SAAS,IAAI,OAAO,CAAC,SAAS;YAAE,OAAO,EAAE,CAAA;QAC5D,OAAO,OAAO,CAAC,MAAM,CAAA;IACvB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACxL,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7b,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAgG,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACxb,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAI;QACZ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;QACxB,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC;QACzC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;QACxB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;QACnC,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;KACvC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAEvC,OAAO,eAAK,SAAS,EAAC,mBAAmB,aACvC,aAAI,SAAS,EAAC,+BAA+B,YAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,IAAI,GAAM,EACjG,cAAK,SAAS,EAAC,wDAAwD,YACpE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,iBAAoB,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,gDAAgD,CAAC,YAAG,KAAK,IAAxO,KAAK,CAA6O,CAAC,GAC1R,EACL,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC,CAAC,IAAI,EAC/R,GAAG,KAAK,YAAY,IAAI,WAAW,CAAC,CAAC,CAAC,KAAC,eAAe,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC,CAAC,IAAI,EACtH,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,eAAK,SAAS,EAAC,WAAW,aAAC,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,qCAA6B,EAAA,YAAG,SAAS,EAAC,4BAA4B,sDAA0C,EAAA,KAAC,YAAY,IAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAI,IAAM,CAAC,CAAC,CAAC,IAAI,EACtU,GAAG,KAAK,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC,CAAC,IAAI,EAChH,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,eAAK,SAAS,EAAC,WAAW,aAAC,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,wBAAgB,EAAA,YAAG,SAAS,EAAC,4BAA4B,0GAA8F,EAAA,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,GAAI,IAAM,CAAC,CAAC,CAAC,IAAI,IACtb,CAAA;AACR,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAAqE;IAC5M,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;IAChF,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAClW,OAAO,eAAK,SAAS,EAAC,WAAW,aAC/B,KAAC,OAAO,IAAC,KAAK,EAAC,WAAW,YAAC,KAAC,KAAK,IAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,QAAQ,QAAC,SAAS,EAAC,mBAAmB,GAAG,GAAU,EACtG,KAAC,OAAO,IAAC,KAAK,EAAE,WAAW,MAAM,CAAC,WAAW,EAAE,EAAE,YAAE,KAAC,KAAK,IAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,GAAI,GAAU,EAC9N,KAAC,OAAO,IAAC,KAAK,EAAC,WAAW,YAAC,KAAC,QAAQ,IAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,GAAI,GAAU,EAC1N,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAO,SAAS,EAAC,yBAAyB,aAAC,KAAC,QAAQ,IAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,GAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAC5O,MAAC,OAAO,IAAC,KAAK,EAAC,OAAO,aAAC,MAAC,MAAM,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,aAAE,iBAAQ,KAAK,EAAC,EAAE,2BAAoB,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAoB,KAAK,EAAE,KAAK,aAAG,KAAK,aAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAA1D,KAAK,CAA+D,CAAC,IAAU,EAAA,YAAG,SAAS,EAAC,4BAA4B,8DAAkD,IAAU,EACjc,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAC,aAAa,IAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC,CAAC,IAAI,EACnI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC,CAAC,IAAI,EACrG,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC,CAAC,IAAI,EACvG,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC,CAAC,IAAI,EACvG,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC,CAAC,IAAI,IACvT,CAAA;AACR,CAAC;AAED,SAAS,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAA0F;IAC5I,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAA;IACpC,MAAM,GAAG,GAAG,CAAC,KAA4B,EAAE,EAAE;QAC3C,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,CAAA;QACnC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAA0B;YAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;gBAAE,OAAQ,IAAgC,CAAC,GAAG,CAAC,CAAA;QAC5J,QAAQ,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAA;IACvE,CAAC,CAAA;IACD,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC7F,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAChF,OAAO,eAAK,SAAS,EAAC,WAAW,aAC/B,iBAAO,SAAS,EAAC,yBAAyB,aAAC,KAAC,QAAQ,IAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,GAAI,gBAAgB,EACnN,OAAO,CAAC,CAAC,CAAC,eAAK,SAAS,EAAC,wBAAwB,aAAC,KAAC,aAAa,IAAC,KAAK,EAAC,SAAS,EAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAI,EAAA,KAAC,aAAa,IAAC,KAAK,EAAC,SAAS,EAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAI,IAAM,CAAC,CAAC,CAAC,IAAI,EAC/Q,IAAI,CAAC,CAAC,CAAC,eAAK,SAAS,EAAC,wBAAwB,aAAC,KAAC,aAAa,IAAC,KAAK,EAAC,gBAAgB,EAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,GAAI,EAAA,KAAC,aAAa,IAAC,KAAK,EAAC,gBAAgB,EAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,GAAI,IAAM,CAAC,CAAC,CAAC,IAAI,EAC9T,IAAI,CAAC,CAAC,CAAC,MAAC,OAAO,IAAC,KAAK,EAAC,SAAS,aAAC,KAAC,KAAK,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,EAAE,WAAW,EAAC,oBAAoB,GAAG,EAAA,YAAG,SAAS,EAAC,4BAA4B,6EAAiE,IAAU,CAAC,CAAC,CAAC,IAAI,EAC9T,KAAC,OAAO,IAAC,KAAK,EAAC,oBAAoB,YAAC,KAAC,KAAK,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,EAAE,WAAW,EAAC,yBAAyB,GAAG,GAAU,IACjN,CAAA;AACR,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAA0F;IACzI,MAAM,KAAK,GAAG,KAAK,CAAC,YAAkD,CAAA;IACtE,SAAS,OAAO,CAAC,IAAY;QAC3B,MAAM,IAAI,GAAuC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QAClU,QAAQ,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,eAAK,SAAS,EAAC,WAAW,aAAC,YAAG,SAAS,EAAC,uBAAuB,gEAAoD,EAAA,MAAC,MAAM,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,aAAE,iBAAQ,KAAK,EAAC,EAAE,2BAAoB,EAAA,iBAAQ,KAAK,EAAC,SAAS,8BAAuB,EAAA,iBAAQ,KAAK,EAAC,OAAO,6BAA2B,EAAA,iBAAQ,KAAK,EAAC,KAAK,0BAAmB,EAAA,iBAAQ,KAAK,EAAC,wBAAwB,yCAAuC,EAAA,iBAAQ,KAAK,EAAC,mBAAmB,oCAAkC,IAAS,EAAC,KAAK,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAC,KAAK,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,GAAI,CAAC,CAAC,CAAC,IAAI,IAAO,CAAA;AAChvB,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAA6G;IACrK,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAA;IAC/C,MAAM,MAAM,GAAG,CAAC,IAAoB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;IACzG,OAAO,MAAC,SAAS,IAAC,KAAK,EAAC,SAAS,aAAC,cAAK,SAAS,EAAC,WAAW,YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,eAAsC,SAAS,EAAC,YAAY,aAAC,KAAC,KAAK,IAAC,SAAS,EAAC,mBAAmB,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,GAAI,EAAA,KAAC,KAAK,IAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,GAAI,EAAA,KAAC,YAAY,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,GAAI,KAA9kB,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,EAAE,CAA0jB,CAAC,GAAO,EAAA,MAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,aAAE,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,kBAAmB,EAAA,iBAAO,SAAS,EAAC,iCAAiC,aAAC,KAAC,QAAQ,IAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,IAAI,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,GAAI,2BAA2B,IAAY,CAAA;AAC7rC,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAA0F;IACzI,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAAC,MAAM,GAAG,GAAG,CAAC,KAA8B,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAA;IAChI,OAAO,MAAC,SAAS,IAAC,KAAK,EAAC,QAAQ,aAAC,eAAK,SAAS,EAAC,wBAAwB,aAAC,KAAC,aAAa,IAAC,KAAK,EAAC,SAAS,EAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAI,EAAA,KAAC,aAAa,IAAC,KAAK,EAAC,SAAS,EAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAI,EAAA,KAAC,aAAa,IAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAI,IAAM,EAAA,KAAC,OAAO,IAAC,KAAK,EAAC,MAAM,YAAC,KAAC,KAAK,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,EAAC,OAAO,GAAG,GAAU,IAAY,CAAA;AAC3mB,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAA0F;IACzI,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAAC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAwC,CAAC,CAAC,CAAC,EAAE,CAAC;IAAC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAA2C,CAAC,CAAC,CAAC,EAAE,CAAA;IACtO,MAAM,KAAK,GAAG,CAAC,IAA6B,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,CAAA;IAC7F,OAAO,MAAC,SAAS,IAAC,KAAK,EAAC,QAAQ,aAAC,KAAC,UAAU,IAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAC,KAAK,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAI,EAAA,KAAC,UAAU,IAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAI,IAAY,CAAA;AACpU,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAA0F;IACxI,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0C,IAAI,EAAE,CAAC;IAAC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAAC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAAC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7M,MAAM,GAAG,GAAG,CAAC,KAA2B,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAA;IAC1F,OAAO,MAAC,SAAS,IAAC,KAAK,EAAC,OAAO,aAAC,KAAC,OAAO,IAAC,KAAK,EAAC,MAAM,YAAC,MAAC,MAAM,IAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,aAAE,iBAAQ,KAAK,EAAC,SAAS,2CAAoC,EAAA,iBAAQ,KAAK,EAAC,OAAO,gCAAyB,IAAS,GAAU,EAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,eAAK,SAAS,EAAC,wBAAwB,aAAC,KAAC,aAAa,IAAC,KAAK,EAAC,cAAc,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,GAAI,EAAA,KAAC,aAAa,IAAC,KAAK,EAAC,cAAc,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,GAAI,IAAM,CAAC,CAAC,CAAC,IAAI,EAAC,eAAK,SAAS,EAAC,WAAW,aAAC,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,wBAAgB,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,eAAoC,SAAS,EAAC,uDAAuD,aAAC,eAAK,SAAS,EAAC,YAAY,aAAC,KAAC,KAAK,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAI,EAAA,MAAC,MAAM,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAA4B,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC,aAAE,iBAAQ,KAAK,EAAC,MAAM,qBAAc,EAAA,iBAAQ,KAAK,EAAC,QAAQ,uBAAgB,EAAA,iBAAQ,KAAK,EAAC,QAAQ,yBAAkB,EAAA,iBAAQ,KAAK,EAAC,UAAU,yBAAkB,EAAA,iBAAQ,KAAK,EAAC,MAAM,qBAAc,IAAS,EAAA,KAAC,YAAY,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,CAAC,GAAI,IAAM,EAAA,KAAC,KAAK,IAAC,SAAS,EAAC,mBAAmB,EAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAI,EAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAC,YAAY,IAAC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAI,CAAC,CAAC,CAAC,IAAI,KAAtuC,GAAG,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAqtC,CAAC,EAAC,MAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,aAAE,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,kBAAmB,IAAM,EAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,eAAK,SAAS,EAAC,WAAW,aAAC,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,gCAAwB,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,eAAiB,SAAS,EAAC,YAAY,aAAC,KAAC,KAAK,IAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAI,EAAA,KAAC,YAAY,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,CAAC,GAAI,KAA5R,KAAK,CAA6R,CAAC,EAAC,MAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,aAAE,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,eAAgB,IAAM,CAAC,CAAC,CAAC,IAAI,IAAa,CAAA;AAC/3F,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAuI;IACxL,OAAO,eAAK,SAAS,EAAC,kEAAkE,aAAC,KAAC,KAAK,IAAC,SAAS,EAAC,aAAa,iCAAyB,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,eAAiB,SAAS,EAAC,YAAY,aAAC,KAAC,KAAK,IAAC,SAAS,EAAC,aAAa,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,GAAI,EAAA,KAAC,YAAY,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,GAAI,KAApW,KAAK,CAAqW,CAAC,EAAC,MAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,aAAE,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,WAAY,IAAM,CAAA;AAC1vB,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAuR;IACrY,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAAC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,OAAO,EAAE,SAAS,CAAC,CAAC;IAAC,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAA;IACtJ,MAAM,KAAK,GAAG,CAAC,IAA0B,EAAE,EAAE,GAAG,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,EAAiB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;;QAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC,CAAA;IACnV,OAAO,MAAC,SAAS,IAAC,KAAK,EAAC,aAAa,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,kBAAQ,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,SAAS,EAAE,EAAE,SAAS,EAAC,yEAAyE,aAAC,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,eAAgB,CAAC,CAAC,CAAC,IAAI,aAAE,KAAC,OAAO,IAAC,KAAK,EAAC,QAAQ,YAAC,MAAC,MAAM,IAAC,KAAK,EAAE,OAAO,EAAE,SAAS,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,aAAE,iBAAQ,KAAK,EAAC,EAAE,YAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,sBAAsB,GAAU,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAsB,KAAK,EAAE,IAAI,CAAC,GAAG,YAAG,IAAI,CAAC,IAAI,IAApC,IAAI,CAAC,EAAE,CAAuC,CAAC,IAAU,GAAU,EAAC,MAAM,CAAC,CAAC,CAAC,8BAAG,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAC,aAAa,IAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,KAAC,gBAAgB,IAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAC,aAAa,IAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAa,CAAA;AACllC,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAsO;IAC3T,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAA;IACxC,OAAO,eAAK,SAAS,EAAC,WAAW,aAAC,eAAK,SAAS,EAAC,wBAAwB,aAAC,KAAC,YAAY,IAAC,KAAK,EAAC,cAAc,EAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC,GAAI,EAAA,KAAC,YAAY,IAAC,KAAK,EAAC,cAAc,EAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC,GAAI,IAAM,EAAA,eAAK,SAAS,EAAC,wBAAwB,aAAC,KAAC,OAAO,IAAC,KAAK,EAAC,cAAc,YAAC,MAAC,MAAM,IAAC,KAAK,EAAE,OAAO,EAAE,aAAa,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,aAAE,iBAAQ,KAAK,EAAC,EAAE,2BAAoB,EAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAsB,KAAK,EAAE,IAAI,CAAC,EAAE,YAAG,IAAI,CAAC,KAAK,IAApC,IAAI,CAAC,EAAE,CAAuC,CAAC,IAAU,GAAU,EAAA,KAAC,YAAY,IAAC,KAAK,EAAC,cAAc,EAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,GAAI,IAAM,EAAA,KAAC,OAAO,IAAC,KAAK,EAAC,oBAAoB,YAAC,KAAC,KAAK,IAAC,IAAI,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAI,GAAU,EAAA,eAAK,SAAS,EAAC,WAAW,aAAC,eAAK,SAAS,EAAC,mCAAmC,aAAC,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,0BAAkB,EAAA,MAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,aAAE,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,WAAY,IAAM,EAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,eAAiB,SAAS,EAAC,YAAY,aAAC,KAAC,MAAM,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,YAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAyB,KAAK,EAAE,MAAM,CAAC,GAAG,YAAG,MAAM,CAAC,KAAK,IAA5C,MAAM,CAAC,GAAG,CAA4C,CAAC,GAAU,EAAA,KAAC,MAAM,IAAC,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,YAAG,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAsB,KAAK,EAAE,IAAI,CAAC,EAAE,YAAG,IAAI,CAAC,KAAK,IAApC,IAAI,CAAC,EAAE,CAAuC,CAAC,GAAU,EAAA,KAAC,YAAY,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,CAAC,GAAI,KAArrB,KAAK,CAAsrB,CAAC,IAAO,IAAM,CAAA;AACxsE,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAuI;IAClM,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IACjF,OAAO,eAAK,SAAS,EAAC,WAAW,aAAC,KAAC,OAAO,IAAC,KAAK,EAAC,WAAW,YAAC,MAAC,MAAM,IAAC,KAAK,EAAE,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,KAAkC,EAAE,CAAC,aAAE,iBAAQ,KAAK,EAAC,MAAM,6BAAsB,EAAA,iBAAQ,KAAK,EAAC,QAAQ,+BAAwB,EAAA,iBAAQ,KAAK,EAAC,OAAO,qCAA8B,IAAS,GAAU,EAAA,KAAC,OAAO,IAAC,KAAK,EAAC,iBAAiB,YAAC,cAAK,SAAS,EAAC,WAAW,YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAwB,SAAS,EAAC,iCAAiC,aAAC,KAAC,QAAQ,IAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;oCAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;oCAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC,GAAI,EAAC,MAAM,CAAC,KAAK,KAAzS,MAAM,CAAC,GAAG,CAAwS,CAAC,GAAO,GAAU,EAAA,KAAC,OAAO,IAAC,KAAK,EAAC,eAAe,YAAC,KAAC,KAAK,IAAC,IAAI,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAI,GAAU,IAAM,CAAA;AAC/gC,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAuI;IAC/L,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,EAAE,EAAE,EAAE,OAAgB,EAAE,CAAC;IAAC,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,KAAK,OAAO,CAAA;IAC9G,MAAM,GAAG,GAAG,CAAC,IAAoD,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,CAAA;IACrH,OAAO,eAAK,SAAS,EAAC,WAAW,aAAC,eAAK,SAAS,EAAC,wBAAwB,aAAC,KAAC,OAAO,IAAC,KAAK,EAAC,WAAW,YAAC,MAAC,MAAM,IAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,KAA4B,CAAC,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC,aAAE,iBAAQ,KAAK,EAAC,OAAO,sBAAe,EAAA,iBAAQ,KAAK,EAAC,KAAK,oBAAa,EAAA,iBAAQ,KAAK,EAAC,KAAK,wBAAiB,EAAA,iBAAQ,KAAK,EAAC,KAAK,wBAAiB,EAAA,iBAAQ,KAAK,EAAC,KAAK,wBAAiB,IAAS,GAAU,EAAA,KAAC,YAAY,IAAC,KAAK,EAAC,cAAc,EAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,GAAI,IAAM,EAAA,eAAK,SAAS,EAAC,wBAAwB,aAAC,KAAC,YAAY,IAAC,KAAK,EAAC,UAAU,EAAC,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAI,EAAA,KAAC,OAAO,IAAC,KAAK,EAAC,SAAS,YAAC,KAAC,MAAM,IAAC,KAAK,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAA+B,EAAE,CAAC,YAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,8BAAE,iBAAQ,KAAK,EAAC,KAAK,0BAAmB,EAAA,iBAAQ,KAAK,EAAC,KAAK,0BAAmB,IAAG,CAAC,CAAC,CAAC,iBAAQ,KAAK,EAAC,QAAQ,uBAAgB,GAAU,GAAU,IAAM,EAAA,KAAC,OAAO,IAAC,KAAK,EAAC,aAAa,YAAC,KAAC,KAAK,IAAC,IAAI,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAI,GAAU,IAAM,CAAA;AACnkD,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAsI,IAAI,OAAO,KAAC,OAAO,IAAC,KAAK,EAAE,KAAK,YAAE,MAAC,MAAM,IAAC,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC,aAAE,iBAAQ,KAAK,EAAC,EAAE,0BAAmB,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAyB,KAAK,EAAE,MAAM,CAAC,GAAG,YAAG,MAAM,CAAC,KAAK,IAA5C,MAAM,CAAC,GAAG,CAA4C,CAAC,IAAU,GAAU,CAAA,CAAC,CAAC;AAE/e,SAAS,UAAU,CAAmC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAA4H;IACvO,OAAO,eAAK,SAAS,EAAC,WAAW,aAAC,eAAK,SAAS,EAAC,mCAAmC,aAAC,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,YAAE,KAAK,GAAS,EAAA,MAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,EAAO,CAAC,CAAC,aAAE,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,WAAY,IAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,eAAiB,SAAS,EAAC,YAAY,aAAC,KAAC,KAAK,IAAC,SAAS,EAAC,wBAAwB,EAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,GAAI,EAAA,KAAC,KAAK,IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,GAAI,EAAA,KAAC,YAAY,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,GAAI,KAAxe,KAAK,CAAye,CAAC,IAAO,CAAA;AACz5B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAA0I;IAC/N,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAClO,OAAO,eAAK,SAAS,EAAC,mBAAmB,aAAC,aAAI,SAAS,EAAC,+BAA+B,iCAAsB,EAAA,KAAC,OAAO,IAAC,KAAK,EAAC,aAAa,YAAC,KAAC,KAAK,IAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,QAAC,SAAS,EAAC,mBAAmB,GAAG,GAAU,EAAA,KAAC,OAAO,IAAC,KAAK,EAAE,WAAW,MAAM,CAAC,WAAW,EAAE,EAAE,YAAE,KAAC,KAAK,IAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,GAAI,GAAU,EAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,KAAK,EAAC,KAAK,YAAC,KAAC,MAAM,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,YAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAqB,KAAK,EAAE,GAAG,CAAC,EAAE,YAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,IAA3D,GAAG,CAAC,EAAE,CAA+D,CAAC,GAAU,GAAU,CAAC,CAAC,CAAC,IAAI,EAAC,KAAC,OAAO,IAAC,KAAK,EAAC,aAAa,YAAC,KAAC,QAAQ,IAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,GAAI,GAAU,EAAA,KAAC,OAAO,IAAC,KAAK,EAAC,eAAe,YAAC,MAAC,MAAM,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,aAAE,iBAAQ,KAAK,EAAC,EAAE,2BAAoB,EAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAuB,KAAK,EAAE,IAAI,CAAC,GAAG,YAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAlE,IAAI,CAAC,GAAG,CAAoE,CAAC,IAAU,GAAU,EAAA,KAAC,OAAO,IAAC,KAAK,EAAC,SAAS,YAAC,KAAC,MAAM,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAA,CAAC,CAAC,YAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAsB,KAAK,EAAE,OAAO,aAAG,OAAO,aAAS,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAlE,OAAO,CAAqE,CAAC,GAAU,GAAU,EAAA,iBAAO,SAAS,EAAC,yBAAyB,aAAC,KAAC,QAAQ,IAAC,OAAO,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,GAAI,yBAAyB,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAC,SAAS,IAAC,KAAK,EAAC,gBAAgB,aAAC,eAAK,SAAS,EAAC,wBAAwB,aAAC,KAAC,aAAa,IAAC,KAAK,EAAC,cAAc,EAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,GAAI,EAAA,KAAC,aAAa,IAAC,KAAK,EAAC,cAAc,EAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,GAAI,IAAM,EAAA,KAAC,OAAO,IAAC,KAAK,EAAC,WAAW,YAAC,KAAC,KAAK,IAAC,KAAK,EAAE,OAAO,CAAC,gBAAgB,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,EAAE,WAAW,EAAC,gBAAgB,GAAG,GAAU,IAAY,CAAC,CAAC,CAAC,IAAI,EAAC,KAAC,OAAO,IAAC,KAAK,EAAC,wBAAwB,YAAC,KAAC,YAAY,IAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAI,GAAU,EAAA,iBAAO,SAAS,EAAC,yBAAyB,aAAC,KAAC,QAAQ,IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAI,+BAA+B,IAAM,CAAA;AAC16F,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAA0E,IAAI,OAAO,eAAK,SAAS,EAAC,4DAA4D,aAAC,eAAK,SAAS,EAAC,2GAA2G,aAAC,yBAAO,KAAK,GAAQ,EAAC,MAAM,IAAO,EAAC,QAAQ,IAAO,CAAA,CAAC,CAAC;AAC5X,SAAS,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAgD,IAAI,OAAO,eAAK,SAAS,EAAC,WAAW,aAAC,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,YAAE,KAAK,GAAS,EAAC,QAAQ,IAAO,CAAA,CAAC,CAAC;AACpL,SAAS,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAA4F,IAAI,OAAO,KAAC,OAAO,IAAC,KAAK,EAAE,KAAK,YAAE,KAAC,KAAK,IAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAI,GAAU,CAAA,CAAC,CAAC;AACrW,SAAS,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAA8C,IAAI,OAAO,iBAAQ,IAAI,EAAC,QAAQ,gBAAY,QAAQ,EAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,6HAA6H,YAAC,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,GAAI,GAAS,CAAA,CAAC,CAAC;AACzV,SAAS,OAAO,CAAI,MAAoB,EAAE,KAAa,EAAE,KAAQ,IAAS,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,EAAE,CAAC,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA,CAAC,CAAC;AAC1K,SAAS,IAAI,CAAC,KAAa,IAAY,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC;AAC5H,SAAS,mBAAmB,CAAC,OAAoB;IAC/C,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAA,CAAC,CAAC,CAAC,EAAE,CAAA;AAC1L,CAAC","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Plus, RefreshCw, Trash2 } from 'lucide-react'\nimport {\n CHOICE_FIELD_TYPES,\n FIELD_TYPES,\n entityKindForPicker,\n storesResponseValue,\n type DataBinding,\n type DefaultValueExpression,\n type FormField,\n type FormSchemaV1,\n type FormSection,\n type TableColumn,\n type TableConfig,\n} from '@braedonsaunders/appkit-forms-core'\nimport { type AppLocale } from '@braedonsaunders/appkit-i18n'\nimport { Button, Checkbox, Input, Label, Select, Textarea, cn } from '@braedonsaunders/appkit-ui'\nimport { defaultBox } from './canvas-editor'\nimport { FormulaBuilder } from './formula-builder'\nimport { LogicBuilder } from './logic-builder'\nimport { readText, writeText } from './text'\n\nexport type FormDataSourceColumn = { key: string; label: string; type: 'text' | 'number' | 'date' | 'boolean' }\nexport type FormDataSource = { id: string; key: string; name: string; kind?: string; columns: FormDataSourceColumn[] }\n\nexport type FieldPropertiesProps = {\n sectionId: string\n field: FormField\n schema: FormSchemaV1\n locale: AppLocale\n defaultLocale?: AppLocale\n dataSources?: readonly FormDataSource[]\n dataSourcesLoading?: boolean\n onRefreshDataSources?: () => void | Promise<void>\n readOnly?: boolean\n onChange: (patch: Partial<FormField>) => void\n}\n\ntype FieldTab = 'basic' | 'validation' | 'logic' | 'default' | 'formula'\n\nexport function FieldProperties({ sectionId, field, schema, locale, defaultLocale = locale, dataSources = [], dataSourcesLoading = false, onRefreshDataSources, readOnly = false, onChange }: FieldPropertiesProps) {\n const [tab, setTab] = React.useState<FieldTab>('basic')\n const ownerSection = schema.sections.find((section) => section.id === sectionId)\n const otherFields = schema.sections.flatMap((section) => {\n if (section.repeating && section.id !== sectionId) return []\n if (!ownerSection?.repeating && section.repeating) return []\n return section.fields\n }).filter((candidate) => candidate.id !== field.id && storesResponseValue(candidate)).map((candidate) => ({ id: candidate.id, label: readText(candidate.label, locale, candidate.id) }))\n const repeatingSections = schema.sections.filter((section) => section.repeating).map((section) => ({ id: section.id, label: readText(section.title, locale, section.id), fields: section.fields.filter((candidate) => storesResponseValue(candidate) || (!ownerSection?.repeating && candidate.type === 'formula' && candidate.formula !== undefined)).map((candidate) => ({ id: candidate.id, label: readText(candidate.label, locale, candidate.id) })) }))\n const pickerFields = schema.sections.filter((section) => !section.repeating).flatMap((section) => section.fields).map((candidate) => ({ candidate, kind: entityKindForPicker(candidate.type) })).filter((entry): entry is { candidate: FormField; kind: NonNullable<ReturnType<typeof entityKindForPicker>> } => entry.kind !== null).map(({ candidate, kind }) => ({ id: candidate.id, label: readText(candidate.label, locale, candidate.id), kind }))\n const storesValue = storesResponseValue(field)\n const tabs = ([\n ['basic', 'Basic', true],\n ['validation', 'Validation', storesValue],\n ['logic', 'Logic', true],\n ['default', 'Default', storesValue],\n ['formula', 'Formula', field.type === 'formula'],\n ] as const).filter((entry) => entry[2])\n\n return <div className=\"space-y-3 text-sm\">\n <h3 className=\"text-sm font-semibold text-fg\">{FIELD_TYPES[field.type]?.label ?? field.type}</h3>\n <div className=\"app-scroll flex overflow-x-auto border-b border-border\">\n {tabs.map(([value, label]) => <button key={value} type=\"button\" onClick={() => setTab(value)} className={cn('-mb-px shrink-0 border-b-2 px-2 py-1 text-xs', tab === value ? 'border-primary font-semibold text-primary' : 'border-transparent text-fg-muted hover:text-fg')}>{label}</button>)}\n </div>\n {tab === 'basic' ? <FieldBasic field={field} schema={schema} sectionId={sectionId} locale={locale} defaultLocale={defaultLocale} dataSources={dataSources} dataSourcesLoading={dataSourcesLoading} onRefreshDataSources={onRefreshDataSources} readOnly={readOnly} onChange={onChange} /> : null}\n {tab === 'validation' && storesValue ? <FieldValidation field={field} readOnly={readOnly} onChange={onChange} /> : null}\n {tab === 'logic' ? <div className=\"space-y-1\"><Label className=\"text-xs\">Show this field when</Label><p className=\"text-[10px] text-fg-subtle\">Leave empty to always show the field.</p><LogicBuilder rule={field.showIf} availableFields={otherFields} onChange={(showIf) => onChange({ showIf })} disabled={readOnly} /></div> : null}\n {tab === 'default' && storesValue ? <FieldDefault field={field} readOnly={readOnly} onChange={onChange} /> : null}\n {tab === 'formula' && field.type === 'formula' ? <div className=\"space-y-1\"><Label className=\"text-xs\">Formula</Label><p className=\"text-[10px] text-fg-subtle\">Build a typed expression from fields, repeating sections, and selected entity attributes.</p><FormulaBuilder value={field.formula} allFields={otherFields} repeatingSections={repeatingSections} pickerFields={pickerFields} onChange={(formula) => onChange({ formula })} /></div> : null}\n </div>\n}\n\nfunction FieldBasic({ field, schema, sectionId, locale, dataSources, dataSourcesLoading, onRefreshDataSources, readOnly = false, onChange }: FieldPropertiesProps & { dataSources: readonly FormDataSource[] }) {\n const ownerSection = schema.sections.find((section) => section.id === sectionId)\n const otherFields = schema.sections.flatMap((section) => ownerSection?.repeating ? section.id === sectionId ? section.fields : [] : section.repeating ? [] : section.fields).filter((candidate) => candidate.id !== field.id && storesResponseValue(candidate)).map((candidate) => ({ id: candidate.id, label: readText(candidate.label, locale, candidate.id) }))\n return <div className=\"space-y-3\">\n <Labeled label=\"Field key\"><Input value={field.id} disabled className=\"font-mono text-xs\" /></Labeled>\n <Labeled label={`Label · ${locale.toUpperCase()}`}><Input value={readText(field.label, locale)} disabled={readOnly} onChange={(event) => onChange({ label: writeText(field.label, event.target.value, locale) })} /></Labeled>\n <Labeled label=\"Help text\"><Textarea rows={2} value={readText(field.helpText, locale)} disabled={readOnly} onChange={(event) => onChange({ helpText: writeText(field.helpText, event.target.value, locale) })} /></Labeled>\n {storesResponseValue(field) ? <label className=\"flex items-center gap-2\"><Checkbox checked={field.required ?? false} disabled={readOnly} onChange={(event) => onChange({ required: event.currentTarget.checked })} />Required</label> : null}\n <Labeled label=\"Width\"><Select value={String(field.colSpan ?? '')} disabled={readOnly} onChange={(event) => onChange({ colSpan: event.target.value ? Number(event.target.value) : undefined })}><option value=\"\">Full width</option>{[1, 2, 3, 4].map((value) => <option key={value} value={value}>{value} column{value === 1 ? '' : 's'}</option>)}</Select><p className=\"text-[10px] text-fg-subtle\">Width is clamped to the section column count.</p></Labeled>\n {CHOICE_FIELD_TYPES.has(field.type) ? <ChoiceOptions field={field} locale={locale} readOnly={readOnly} onChange={onChange} /> : null}\n {field.type === 'table' ? <TableEditor field={field} readOnly={readOnly} onChange={onChange} /> : null}\n {field.type === 'slider' ? <SliderEditor field={field} readOnly={readOnly} onChange={onChange} /> : null}\n {field.type === 'matrix' ? <MatrixEditor field={field} readOnly={readOnly} onChange={onChange} /> : null}\n {field.type === 'lookup' || field.type === 'data_table' || field.type === 'metric' ? <DataBindingEditor field={field} sources={dataSources} loading={Boolean(dataSourcesLoading)} otherFields={otherFields} autofillFields={otherFields} onRefresh={onRefreshDataSources} readOnly={readOnly} onChange={onChange} /> : null}\n </div>\n}\n\nfunction FieldValidation({ field, readOnly, onChange }: { field: FormField; readOnly: boolean; onChange: (patch: Partial<FormField>) => void }) {\n const value = field.validation ?? {}\n const set = (patch: Partial<typeof value>) => {\n const next = { ...value, ...patch }\n for (const key of Object.keys(next) as (keyof typeof next)[]) if (next[key] === undefined || next[key] === '') delete (next as Record<string, unknown>)[key]\n onChange({ validation: Object.keys(next).length ? next : undefined })\n }\n const numeric = ['number', 'currency', 'percentage', 'rating', 'slider'].includes(field.type)\n const text = ['text', 'long_text', 'email', 'phone', 'url'].includes(field.type)\n return <div className=\"space-y-3\">\n <label className=\"flex items-center gap-2\"><Checkbox checked={value.required ?? field.required ?? false} disabled={readOnly} onChange={(event) => set({ required: event.currentTarget.checked })} />Required</label>\n {numeric ? <div className=\"grid grid-cols-2 gap-2\"><NumberSetting label=\"Minimum\" value={value.min} disabled={readOnly} onChange={(min) => set({ min })} /><NumberSetting label=\"Maximum\" value={value.max} disabled={readOnly} onChange={(max) => set({ max })} /></div> : null}\n {text ? <div className=\"grid grid-cols-2 gap-2\"><NumberSetting label=\"Minimum length\" value={value.minLength} disabled={readOnly} onChange={(minLength) => set({ minLength })} /><NumberSetting label=\"Maximum length\" value={value.maxLength} disabled={readOnly} onChange={(maxLength) => set({ maxLength })} /></div> : null}\n {text ? <Labeled label=\"Pattern\"><Input value={value.pattern ?? ''} disabled={readOnly} onChange={(event) => set({ pattern: event.target.value || undefined })} placeholder=\"Regular expression\" /><p className=\"text-[11px] text-fg-subtle\">The pattern is validated before the schema can be published.</p></Labeled> : null}\n <Labeled label=\"Validation message\"><Input value={value.message ?? ''} disabled={readOnly} onChange={(event) => set({ message: event.target.value || undefined })} placeholder=\"Use the default message\" /></Labeled>\n </div>\n}\n\nfunction FieldDefault({ field, readOnly, onChange }: { field: FormField; readOnly: boolean; onChange: (patch: Partial<FormField>) => void }) {\n const value = field.defaultValue as DefaultValueExpression | undefined\n function setKind(kind: string) {\n const next: DefaultValueExpression | undefined = kind === 'literal' ? { kind: 'literal', value: '' } : kind === 'today' ? { kind: 'today' } : kind === 'now' ? { kind: 'now' } : kind === 'current_user_person_id' ? { kind: 'current_user_person_id' } : kind === 'current_user_name' ? { kind: 'current_user_name' } : undefined\n onChange({ defaultValue: next })\n }\n return <div className=\"space-y-3\"><p className=\"text-xs text-fg-muted\">Defaults apply once when a new response begins.</p><Select value={value?.kind ?? ''} disabled={readOnly} onChange={(event) => setKind(event.target.value)}><option value=\"\">No default</option><option value=\"literal\">Literal value</option><option value=\"today\">Today's date</option><option value=\"now\">Right now</option><option value=\"current_user_person_id\">Current user's person ID</option><option value=\"current_user_name\">Current user's name</option></Select>{value?.kind === 'literal' ? <Input value={String(value.value ?? '')} disabled={readOnly} onChange={(event) => onChange({ defaultValue: { kind: 'literal', value: event.target.value } })} /> : null}</div>\n}\n\nfunction ChoiceOptions({ field, locale, readOnly, onChange }: { field: FormField; locale: AppLocale; readOnly: boolean; onChange: (patch: Partial<FormField>) => void }) {\n const options = field.validation?.options ?? []\n const update = (next: typeof options) => onChange({ validation: { ...field.validation, options: next } })\n return <ConfigBox title=\"Options\"><div className=\"space-y-1\">{options.map((option, index) => <div key={`${option.value}-${index}`} className=\"flex gap-1\"><Input className=\"font-mono text-xs\" value={option.value} disabled={readOnly} onChange={(event) => { const next = [...options]; next[index] = { ...option, value: event.target.value }; update(next) }} /><Input value={readText(option.label, locale)} disabled={readOnly} onChange={(event) => { const next = [...options]; next[index] = { ...option, label: writeText(option.label, event.target.value, locale) }; update(next) }} /><DeleteButton disabled={readOnly} onClick={() => update(options.filter((_, candidate) => candidate !== index))} /></div>)}</div><Button size=\"sm\" variant=\"outline\" disabled={readOnly} onClick={() => update([...options, { value: `opt_${options.length + 1}`, label: writeText(undefined, 'New option', locale) }])}><Plus size={12} />Add option</Button><label className=\"flex items-center gap-2 text-xs\"><Checkbox checked={field.validation?.allowOther ?? false} disabled={readOnly} onChange={(event) => onChange({ validation: { ...field.validation, allowOther: event.currentTarget.checked } })} />Allow another value</label></ConfigBox>\n}\n\nfunction SliderEditor({ field, readOnly, onChange }: { field: FormField; readOnly: boolean; onChange: (patch: Partial<FormField>) => void }) {\n const config = field.config ?? {}; const set = (patch: Record<string, unknown>) => onChange({ config: { ...config, ...patch } })\n return <ConfigBox title=\"Slider\"><div className=\"grid grid-cols-3 gap-2\"><NumberSetting label=\"Minimum\" value={Number(config.min ?? 0)} disabled={readOnly} onChange={(min) => set({ min })} /><NumberSetting label=\"Maximum\" value={Number(config.max ?? 10)} disabled={readOnly} onChange={(max) => set({ max })} /><NumberSetting label=\"Step\" value={Number(config.step ?? 1)} disabled={readOnly} onChange={(step) => set({ step })} /></div><Labeled label=\"Unit\"><Input value={String(config.unit ?? '')} disabled={readOnly} onChange={(event) => set({ unit: event.target.value })} placeholder=\"hours\" /></Labeled></ConfigBox>\n}\n\nfunction MatrixEditor({ field, readOnly, onChange }: { field: FormField; readOnly: boolean; onChange: (patch: Partial<FormField>) => void }) {\n const config = field.config ?? {}; const rows = Array.isArray(config.rows) ? config.rows as { key: string; label: string }[] : []; const scale = Array.isArray(config.scale) ? config.scale as { value: string; label: string }[] : []\n const patch = (next: Record<string, unknown>) => onChange({ config: { ...config, ...next } })\n return <ConfigBox title=\"Matrix\"><ListEditor title=\"Rows\" values={rows} readOnly={readOnly} keyName=\"key\" valueName=\"label\" onChange={(next) => patch({ rows: next })} /><ListEditor title=\"Scale\" values={scale} readOnly={readOnly} keyName=\"value\" valueName=\"label\" onChange={(next) => patch({ scale: next })} /></ConfigBox>\n}\n\nfunction TableEditor({ field, readOnly, onChange }: { field: FormField; readOnly: boolean; onChange: (patch: Partial<FormField>) => void }) {\n const config = field.config as Partial<TableConfig> | undefined ?? {}; const columns = config.columns ?? []; const rows = config.rows ?? []; const rowMode = config.rowMode === 'fixed' ? 'fixed' : 'addable'\n const set = (patch: Partial<TableConfig>) => onChange({ config: { ...config, ...patch } })\n return <ConfigBox title=\"Table\"><Labeled label=\"Rows\"><Select value={rowMode} disabled={readOnly} onChange={(event) => set(event.target.value === 'fixed' ? { rowMode: 'fixed', minRows: undefined, maxRows: undefined } : { rowMode: 'addable', rows: undefined })}><option value=\"addable\">User adds and removes rows</option><option value=\"fixed\">Predefined rows</option></Select></Labeled>{rowMode === 'addable' ? <div className=\"grid grid-cols-2 gap-2\"><NumberSetting label=\"Minimum rows\" value={config.minRows} disabled={readOnly} onChange={(minRows) => set({ minRows })} /><NumberSetting label=\"Maximum rows\" value={config.maxRows} disabled={readOnly} onChange={(maxRows) => set({ maxRows })} /></div> : null}<div className=\"space-y-2\"><Label className=\"text-xs\">Columns</Label>{columns.map((column, index) => <div key={`${column.key}-${index}`} className=\"space-y-1 rounded border border-border bg-surface p-2\"><div className=\"flex gap-1\"><Input value={column.label} disabled={readOnly} onChange={(event) => set({ columns: replace(columns, index, { ...column, label: event.target.value }) })} /><Select value={column.type} disabled={readOnly} onChange={(event) => { const type = event.target.value as TableColumn['type']; set({ columns: replace(columns, index, { ...column, type, options: type === 'select' ? column.options ?? [] : undefined }) }) }}><option value=\"text\">Text</option><option value=\"number\">Number</option><option value=\"select\">Dropdown</option><option value=\"checkbox\">Checkbox</option><option value=\"date\">Date</option></Select><DeleteButton disabled={readOnly} onClick={() => set({ columns: columns.filter((_, candidate) => candidate !== index) })} /></div><Input className=\"font-mono text-xs\" value={column.key} disabled={readOnly} onChange={(event) => set({ columns: replace(columns, index, { ...column, key: event.target.value.replace(/\\s+/g, '_') }) })} />{column.type === 'select' ? <TableOptions options={column.options ?? []} readOnly={readOnly} onChange={(options) => set({ columns: replace(columns, index, { ...column, options }) })} /> : null}</div>)}<Button size=\"sm\" variant=\"outline\" disabled={readOnly} onClick={() => set({ columns: [...columns, { key: `col_${columns.length + 1}`, label: `Column ${columns.length + 1}`, type: 'text' }] })}><Plus size={12} />Add column</Button></div>{rowMode === 'fixed' ? <div className=\"space-y-2\"><Label className=\"text-xs\">Predefined rows</Label>{rows.map((row, index) => <div key={index} className=\"flex gap-1\"><Input value={row.label} disabled={readOnly} onChange={(event) => set({ rows: replace(rows, index, { label: event.target.value }) })} /><DeleteButton disabled={readOnly} onClick={() => set({ rows: rows.filter((_, candidate) => candidate !== index) })} /></div>)}<Button size=\"sm\" variant=\"outline\" disabled={readOnly} onClick={() => set({ rows: [...rows, { label: `Row ${rows.length + 1}` }] })}><Plus size={12} />Add row</Button></div> : null}</ConfigBox>\n}\n\nfunction TableOptions({ options, readOnly, onChange }: { options: { value: string; label: string }[]; readOnly: boolean; onChange: (options: { value: string; label: string }[]) => void }) {\n return <div className=\"space-y-1 rounded border border-border-subtle bg-bg-subtle p-1.5\"><Label className=\"text-[10px]\">Dropdown options</Label>{options.map((option, index) => <div key={index} className=\"flex gap-1\"><Input className=\"h-7 text-xs\" value={option.label} disabled={readOnly} onChange={(event) => onChange(replace(options, index, { value: option.value || slug(event.target.value), label: event.target.value }))} /><DeleteButton disabled={readOnly} onClick={() => onChange(options.filter((_, candidate) => candidate !== index))} /></div>)}<Button size=\"sm\" variant=\"outline\" disabled={readOnly} onClick={() => onChange([...options, { value: `opt_${options.length + 1}`, label: `Option ${options.length + 1}` }])}><Plus size={11} />Add</Button></div>\n}\n\nfunction DataBindingEditor({ field, sources, loading, otherFields, autofillFields, onRefresh, readOnly, onChange }: { field: FormField; sources: readonly FormDataSource[]; loading: boolean; otherFields: { id: string; label: string }[]; autofillFields: { id: string; label: string }[]; onRefresh?: () => void | Promise<void>; readOnly: boolean; onChange: (patch: Partial<FormField>) => void }) {\n const binding = field.binding; const source = sources.find((candidate) => candidate.key === binding?.sourceKey); const columns = source?.columns ?? []\n const patch = (next: Partial<DataBinding>) => { const merged = { ...binding, ...next } as DataBinding; if (!merged.sourceKey) onChange({ binding: undefined }); else onChange({ binding: merged, ...(field.type === 'data_table' && next.selectable === 'none' ? { required: undefined, validation: undefined, defaultValue: undefined } : {}) }) }\n return <ConfigBox title=\"Data source\" action={onRefresh ? <button type=\"button\" disabled={readOnly} onClick={() => void onRefresh()} className=\"inline-flex items-center gap-1 text-[11px] text-primary hover:underline\"><RefreshCw size={11} />Refresh</button> : null}><Labeled label=\"Source\"><Select value={binding?.sourceKey ?? ''} disabled={readOnly} onChange={(event) => onChange({ binding: event.target.value ? { sourceKey: event.target.value } : undefined })}><option value=\"\">{loading ? 'Loading…' : 'Choose a data source'}</option>{sources.map((item) => <option key={item.id} value={item.key}>{item.name}</option>)}</Select></Labeled>{source ? <>{field.type === 'lookup' ? <LookupBinding binding={binding} columns={columns} otherFields={otherFields} autofillFields={autofillFields} readOnly={readOnly} patch={patch} /> : null}{field.type === 'data_table' ? <DataTableBinding binding={binding} columns={columns} readOnly={readOnly} patch={patch} /> : null}{field.type === 'metric' ? <MetricBinding binding={binding} columns={columns} readOnly={readOnly} patch={patch} /> : null}</> : null}</ConfigBox>\n}\n\nfunction LookupBinding({ binding, columns, otherFields, autofillFields, readOnly, patch }: { binding?: DataBinding; columns: readonly FormDataSourceColumn[]; otherFields: { id: string; label: string }[]; autofillFields: { id: string; label: string }[]; readOnly: boolean; patch: (next: Partial<DataBinding>) => void }) {\n const autofill = binding?.autofill ?? []\n return <div className=\"space-y-2\"><div className=\"grid grid-cols-2 gap-2\"><ColumnSelect label=\"Label column\" value={binding?.labelColumn} columns={columns} readOnly={readOnly} onChange={(labelColumn) => patch({ labelColumn })} /><ColumnSelect label=\"Value column\" value={binding?.valueColumn} columns={columns} readOnly={readOnly} onChange={(valueColumn) => patch({ valueColumn })} /></div><div className=\"grid grid-cols-2 gap-2\"><Labeled label=\"Parent field\"><Select value={binding?.filterByField ?? ''} disabled={readOnly} onChange={(event) => patch({ filterByField: event.target.value || undefined })}><option value=\"\">No cascade</option>{otherFields.map((item) => <option key={item.id} value={item.id}>{item.label}</option>)}</Select></Labeled><ColumnSelect label=\"Match column\" value={binding?.filterColumn} columns={columns} readOnly={readOnly} onChange={(filterColumn) => patch({ filterColumn })} /></div><Labeled label=\"Results per search\"><Input type=\"number\" min={1} max={1000} value={binding?.limit ?? ''} disabled={readOnly} onChange={(event) => patch({ limit: event.target.value ? Number(event.target.value) : undefined })} /></Labeled><div className=\"space-y-1\"><div className=\"flex items-center justify-between\"><Label className=\"text-xs\">Auto-fill</Label><Button size=\"sm\" variant=\"ghost\" disabled={readOnly} onClick={() => patch({ autofill: [...autofill, { column: columns[0]?.key ?? '', targetFieldId: autofillFields[0]?.id ?? '' }] })}><Plus size={11} />Add</Button></div>{autofill.map((entry, index) => <div key={index} className=\"flex gap-1\"><Select value={entry.column} disabled={readOnly} onChange={(event) => patch({ autofill: replace(autofill, index, { ...entry, column: event.target.value }) })}>{columns.map((column) => <option key={column.key} value={column.key}>{column.label}</option>)}</Select><Select value={entry.targetFieldId} disabled={readOnly} onChange={(event) => patch({ autofill: replace(autofill, index, { ...entry, targetFieldId: event.target.value }) })}>{autofillFields.map((item) => <option key={item.id} value={item.id}>{item.label}</option>)}</Select><DeleteButton disabled={readOnly} onClick={() => patch({ autofill: autofill.filter((_, candidate) => candidate !== index) })} /></div>)}</div></div>\n}\n\nfunction DataTableBinding({ binding, columns, readOnly, patch }: { binding?: DataBinding; columns: readonly FormDataSourceColumn[]; readOnly: boolean; patch: (next: Partial<DataBinding>) => void }) {\n const selected = new Set(binding?.columns ?? columns.map((column) => column.key))\n return <div className=\"space-y-2\"><Labeled label=\"Selection\"><Select value={binding?.selectable ?? 'none'} disabled={readOnly} onChange={(event) => patch({ selectable: event.target.value as DataBinding['selectable'] })}><option value=\"none\">Display only</option><option value=\"single\">Select one row</option><option value=\"multi\">Select multiple rows</option></Select></Labeled><Labeled label=\"Visible columns\"><div className=\"space-y-1\">{columns.map((column) => <label key={column.key} className=\"flex items-center gap-2 text-xs\"><Checkbox checked={selected.has(column.key)} disabled={readOnly} onChange={() => { const next = new Set(selected); if (next.has(column.key)) next.delete(column.key); else next.add(column.key); patch({ columns: [...next] }) }} />{column.label}</label>)}</div></Labeled><Labeled label=\"Rows per page\"><Input type=\"number\" min={1} max={1000} value={binding?.limit ?? ''} disabled={readOnly} onChange={(event) => patch({ limit: event.target.value ? Number(event.target.value) : undefined })} /></Labeled></div>\n}\n\nfunction MetricBinding({ binding, columns, readOnly, patch }: { binding?: DataBinding; columns: readonly FormDataSourceColumn[]; readOnly: boolean; patch: (next: Partial<DataBinding>) => void }) {\n const aggregate = binding?.aggregate ?? { fn: 'count' as const }; const needsColumn = aggregate.fn !== 'count'\n const set = (next: Partial<NonNullable<DataBinding['aggregate']>>) => patch({ aggregate: { ...aggregate, ...next } })\n return <div className=\"space-y-2\"><div className=\"grid grid-cols-2 gap-2\"><Labeled label=\"Aggregate\"><Select value={aggregate.fn} disabled={readOnly} onChange={(event) => { const fn = event.target.value as typeof aggregate.fn; patch({ aggregate: fn === 'count' ? { fn } : { fn, column: columns.find((column) => column.type === 'number')?.key } }) }}><option value=\"count\">Count</option><option value=\"sum\">Sum</option><option value=\"avg\">Average</option><option value=\"min\">Minimum</option><option value=\"max\">Maximum</option></Select></Labeled><ColumnSelect label=\"Value column\" value={aggregate.column} columns={columns} readOnly={readOnly || !needsColumn} onChange={(column) => set({ column })} /></div><div className=\"grid grid-cols-2 gap-2\"><ColumnSelect label=\"Group by\" value={aggregate.groupBy} columns={columns} readOnly={readOnly} onChange={(groupBy) => patch({ aggregate: { ...aggregate, groupBy }, display: groupBy ? binding?.display === 'pie' ? 'pie' : 'bar' : 'number' })} /><Labeled label=\"Display\"><Select value={binding?.display ?? (aggregate.groupBy ? 'bar' : 'number')} disabled={readOnly} onChange={(event) => patch({ display: event.target.value as DataBinding['display'] })}>{aggregate.groupBy ? <><option value=\"bar\">Bar chart</option><option value=\"pie\">Pie chart</option></> : <option value=\"number\">Number</option>}</Select></Labeled></div><Labeled label=\"Group limit\"><Input type=\"number\" min={1} max={1000} value={binding?.limit ?? ''} disabled={readOnly} onChange={(event) => patch({ limit: event.target.value ? Number(event.target.value) : undefined })} /></Labeled></div>\n}\n\nfunction ColumnSelect({ label, value, columns, readOnly, onChange }: { label: string; value?: string; columns: readonly FormDataSourceColumn[]; readOnly: boolean; onChange: (value?: string) => void }) { return <Labeled label={label}><Select value={value ?? ''} disabled={readOnly} onChange={(event) => onChange(event.target.value || undefined)}><option value=\"\">Automatic</option>{columns.map((column) => <option key={column.key} value={column.key}>{column.label}</option>)}</Select></Labeled> }\n\nfunction ListEditor<T extends Record<string, string>>({ title, values, keyName, valueName, readOnly, onChange }: { title: string; values: T[]; keyName: keyof T; valueName: keyof T; readOnly: boolean; onChange: (values: T[]) => void }) {\n return <div className=\"space-y-1\"><div className=\"flex items-center justify-between\"><Label className=\"text-xs\">{title}</Label><Button size=\"sm\" variant=\"ghost\" disabled={readOnly} onClick={() => onChange([...values, { [keyName]: `${String(keyName)}_${values.length + 1}`, [valueName]: `${title.slice(0, -1)} ${values.length + 1}` } as T])}><Plus size={11} />Add</Button></div>{values.map((value, index) => <div key={index} className=\"flex gap-1\"><Input className=\"w-20 font-mono text-xs\" value={value[keyName]} disabled={readOnly} onChange={(event) => onChange(replace(values, index, { ...value, [keyName]: event.target.value }))} /><Input value={value[valueName]} disabled={readOnly} onChange={(event) => onChange(replace(values, index, { ...value, [valueName]: event.target.value }))} /><DeleteButton disabled={readOnly} onClick={() => onChange(values.filter((_, candidate) => candidate !== index))} /></div>)}</div>\n}\n\nexport function SectionProperties({ section, schema, locale, readOnly = false, onChange }: { section: FormSection; schema: FormSchemaV1; locale: AppLocale; readOnly?: boolean; onChange: (patch: Partial<FormSection>) => void }) {\n const fields = schema.sections.filter((candidate) => !candidate.repeating).flatMap((candidate) => candidate.fields).filter(storesResponseValue).map((field) => ({ id: field.id, label: readText(field.label, locale, field.id) }))\n return <div className=\"space-y-3 text-sm\"><h3 className=\"text-sm font-semibold text-fg\">Section settings</h3><Labeled label=\"Section key\"><Input value={section.id} disabled className=\"font-mono text-xs\" /></Labeled><Labeled label={`Title · ${locale.toUpperCase()}`}><Input value={readText(section.title, locale)} disabled={readOnly} onChange={(event) => onChange({ title: writeText(section.title, event.target.value, locale) })} /></Labeled>{schema.tabs?.length ? <Labeled label=\"Tab\"><Select value={section.tabId ?? schema.tabs[0]?.id} disabled={readOnly} onChange={(event) => onChange({ tabId: event.target.value })}>{schema.tabs.map((tab) => <option key={tab.id} value={tab.id}>{readText(tab.title, locale, tab.id)}</option>)}</Select></Labeled> : null}<Labeled label=\"Description\"><Textarea rows={2} value={readText(section.description, locale)} disabled={readOnly} onChange={(event) => onChange({ description: writeText(section.description, event.target.value, locale) })} /></Labeled><Labeled label=\"Workflow step\"><Select value={section.step ?? ''} disabled={readOnly} onChange={(event) => onChange({ step: event.target.value || undefined })}><option value=\"\">First step</option>{(schema.workflow?.steps ?? []).map((step) => <option key={step.key} value={step.key}>{readText(step.title, locale, step.key)}</option>)}</Select></Labeled><Labeled label=\"Columns\"><Select value={String(section.layout?.columns ?? 1)} disabled={readOnly} onChange={(event) => { const columns = Number(event.target.value); onChange({ layout: columns > 1 ? { columns, gap: section.layout?.gap } : undefined }) }}>{[1, 2, 3, 4].map((columns) => <option key={columns} value={columns}>{columns} column{columns === 1 ? '' : 's'}</option>)}</Select></Labeled><label className=\"flex items-center gap-2\"><Checkbox checked={section.repeating ?? false} disabled={readOnly} onChange={(event) => onChange({ repeating: event.currentTarget.checked })} />Repeating section</label>{section.repeating ? <ConfigBox title=\"Repeating rows\"><div className=\"grid grid-cols-2 gap-2\"><NumberSetting label=\"Minimum rows\" value={section.minRows} disabled={readOnly} onChange={(minRows) => onChange({ minRows })} /><NumberSetting label=\"Maximum rows\" value={section.maxRows} disabled={readOnly} onChange={(maxRows) => onChange({ maxRows })} /></div><Labeled label=\"Row label\"><Input value={section.rowLabelTemplate ?? ''} disabled={readOnly} onChange={(event) => onChange({ rowLabelTemplate: event.target.value || undefined })} placeholder=\"Item {{index}}\" /></Labeled></ConfigBox> : null}<Labeled label=\"Show this section when\"><LogicBuilder rule={section.showIf} availableFields={fields} onChange={(showIf) => onChange({ showIf })} disabled={readOnly} /></Labeled><label className=\"flex items-center gap-2\"><Checkbox checked={Boolean(section.canvas)} disabled={readOnly} onChange={(event) => onChange({ canvas: event.currentTarget.checked ? createSectionCanvas(section) : undefined })} />Free-form canvas layout</label></div>\n}\n\nfunction ConfigBox({ title, action, children }: { title: string; action?: React.ReactNode; children: React.ReactNode }) { return <div className=\"space-y-2 rounded-md border border-border bg-bg-subtle p-2\"><div className=\"flex items-center justify-between gap-2 text-[10px] font-semibold uppercase tracking-wider text-fg-subtle\"><span>{title}</span>{action}</div>{children}</div> }\nfunction Labeled({ label, children }: { label: string; children: React.ReactNode }) { return <div className=\"space-y-1\"><Label className=\"text-xs\">{label}</Label>{children}</div> }\nfunction NumberSetting({ label, value, disabled, onChange }: { label: string; value?: number; disabled: boolean; onChange: (value?: number) => void }) { return <Labeled label={label}><Input type=\"number\" value={value ?? ''} disabled={disabled} onChange={(event) => onChange(event.target.value === '' ? undefined : Number(event.target.value))} /></Labeled> }\nfunction DeleteButton({ disabled, onClick }: { disabled: boolean; onClick: () => void }) { return <button type=\"button\" aria-label=\"Delete\" disabled={disabled} onClick={onClick} className=\"grid size-9 shrink-0 place-items-center rounded text-fg-subtle hover:bg-danger-subtle hover:text-danger disabled:opacity-40\"><Trash2 size={13} /></button> }\nfunction replace<T>(values: readonly T[], index: number, value: T): T[] { return values.map((candidate, candidateIndex) => candidateIndex === index ? value : candidate) }\nfunction slug(value: string): string { return value.toLowerCase().trim().replace(/[^a-z0-9]+/g, '_').replace(/^_|_$/g, '') }\nfunction createSectionCanvas(section: FormSection): NonNullable<FormSection['canvas']> {\n let y = 0\n return { cols: 12, rowHeight: 40, items: section.fields.map((field) => { const box = defaultBox(field.type); const item = { i: field.id, x: 0, y, ...box }; y += box.h; return item }) }\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { AutomationGraph, TriggerData } from '@braedonsaunders/appkit-forms-core/safety-automation';
|
|
3
|
+
import type { RecordActionFlow, RecordActionFlowAdapter } from './record-config.js';
|
|
4
|
+
type ManualTrigger = Extract<TriggerData, {
|
|
5
|
+
trigger: 'manual';
|
|
6
|
+
}>;
|
|
7
|
+
type ButtonVariant = NonNullable<ManualTrigger['variant']>;
|
|
8
|
+
declare const QUICK_ACTIONS: readonly ["flag_non_compliant", "start_monitored_session", "duplicate_record", "export_pdf"];
|
|
9
|
+
type QuickAction = (typeof QUICK_ACTIONS)[number];
|
|
10
|
+
export declare function manualTrigger(graph: AutomationGraph): ManualTrigger | null;
|
|
11
|
+
export declare function buildRecordButtonGraph(input: {
|
|
12
|
+
label: string;
|
|
13
|
+
icon?: string;
|
|
14
|
+
variant: ButtonVariant;
|
|
15
|
+
actionKind: QuickAction;
|
|
16
|
+
order: number;
|
|
17
|
+
}): AutomationGraph;
|
|
18
|
+
export type RecordActionsPanelProps = {
|
|
19
|
+
flows: RecordActionFlow[];
|
|
20
|
+
adapter: RecordActionFlowAdapter;
|
|
21
|
+
onChanged?: () => void | Promise<void>;
|
|
22
|
+
confirmRemove?: (flow: RecordActionFlow) => boolean | Promise<boolean>;
|
|
23
|
+
readOnly?: boolean;
|
|
24
|
+
className?: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function RecordActionsPanel({ flows, adapter, onChanged, confirmRemove, readOnly, className }: RecordActionsPanelProps): React.JSX.Element;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=record-actions-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-actions-panel.d.ts","sourceRoot":"","sources":["../src/record-actions-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAc,eAAe,EAAE,WAAW,EAAE,MAAM,sDAAsD,CAAA;AAEpH,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEhF,KAAK,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAA;AAChE,KAAK,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAA;AAyB1D,QAAA,MAAM,aAAa,8FAAyI,CAAA;AAC5J,KAAK,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAoBjD,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,GAAG,IAAI,CAK1E;AAQD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,eAAe,CAiB/J;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,gBAAgB,EAAE,CAAA;IACzB,OAAO,EAAE,uBAAuB,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,QAAgB,EAAE,SAAS,EAAE,EAAE,uBAAuB,qBAapI"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { ExternalLink, MousePointerClick, Plus, Trash2 } from 'lucide-react';
|
|
5
|
+
import { Button, Input, Label, Select, cn } from '@braedonsaunders/appkit-ui';
|
|
6
|
+
const ACTION_LABEL = {
|
|
7
|
+
send_email: 'Send email',
|
|
8
|
+
create_capa: 'Create corrective action',
|
|
9
|
+
create_incident: 'Create incident',
|
|
10
|
+
notify_role: 'Notify role',
|
|
11
|
+
set_field: 'Set field',
|
|
12
|
+
flag_non_compliant: 'Flag non-compliant',
|
|
13
|
+
webhook: 'Webhook',
|
|
14
|
+
create_response: 'Start another form',
|
|
15
|
+
analyze_photos: 'Analyze photos (AI)',
|
|
16
|
+
start_monitored_session: 'Start monitored session',
|
|
17
|
+
change_status: 'Change status',
|
|
18
|
+
duplicate_record: 'Duplicate record',
|
|
19
|
+
export_pdf: 'Generate PDF',
|
|
20
|
+
};
|
|
21
|
+
const VARIANTS = [
|
|
22
|
+
{ value: 'default', label: 'Primary' },
|
|
23
|
+
{ value: 'outline', label: 'Outline' },
|
|
24
|
+
{ value: 'secondary', label: 'Secondary' },
|
|
25
|
+
{ value: 'destructive', label: 'Destructive' },
|
|
26
|
+
];
|
|
27
|
+
const QUICK_ACTIONS = ['flag_non_compliant', 'start_monitored_session', 'duplicate_record', 'export_pdf'];
|
|
28
|
+
function defaultAction(kind) {
|
|
29
|
+
switch (kind) {
|
|
30
|
+
case 'flag_non_compliant': return { action: 'flag_non_compliant' };
|
|
31
|
+
case 'start_monitored_session': return { action: 'start_monitored_session', intervalMinutes: 30, graceMinutes: 10, durationMinutes: 120, requireGeo: false };
|
|
32
|
+
case 'duplicate_record': return { action: 'duplicate_record' };
|
|
33
|
+
case 'export_pdf': return { action: 'export_pdf' };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function slugify(value) {
|
|
37
|
+
return value.normalize('NFKD').replace(/[\u0300-\u036f]/g, '').toLowerCase().trim().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 64);
|
|
38
|
+
}
|
|
39
|
+
function buttonIdFromLabel(label) {
|
|
40
|
+
const base = slugify(label);
|
|
41
|
+
return `btn_${base || globalThis.crypto.randomUUID().slice(0, 8)}`;
|
|
42
|
+
}
|
|
43
|
+
export function manualTrigger(graph) {
|
|
44
|
+
for (const node of graph.nodes) {
|
|
45
|
+
if (node.data.kind === 'trigger' && node.data.trigger.trigger === 'manual')
|
|
46
|
+
return node.data.trigger;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
function firstActionLabel(graph) {
|
|
51
|
+
const node = graph.nodes.find((candidate) => candidate.data.kind === 'action');
|
|
52
|
+
if (node?.data.kind === 'action')
|
|
53
|
+
return ACTION_LABEL[node.data.action.action];
|
|
54
|
+
return 'No action yet';
|
|
55
|
+
}
|
|
56
|
+
export function buildRecordButtonGraph(input) {
|
|
57
|
+
const trigger = {
|
|
58
|
+
trigger: 'manual',
|
|
59
|
+
buttonId: buttonIdFromLabel(input.label),
|
|
60
|
+
label: input.label.trim(),
|
|
61
|
+
variant: input.variant,
|
|
62
|
+
order: input.order,
|
|
63
|
+
...(input.icon?.trim() ? { icon: input.icon.trim() } : {}),
|
|
64
|
+
};
|
|
65
|
+
return {
|
|
66
|
+
schemaVersion: 1,
|
|
67
|
+
nodes: [
|
|
68
|
+
{ id: 'trg', position: { x: 80, y: 80 }, data: { kind: 'trigger', trigger } },
|
|
69
|
+
{ id: 'act', position: { x: 400, y: 80 }, data: { kind: 'action', action: defaultAction(input.actionKind) } },
|
|
70
|
+
],
|
|
71
|
+
edges: [{ id: 'e1', source: 'trg', target: 'act', sourceHandle: 'next' }],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function RecordActionsPanel({ flows, adapter, onChanged, confirmRemove, readOnly = false, className }) {
|
|
75
|
+
const buttons = React.useMemo(() => flows
|
|
76
|
+
.map((flow) => ({ flow, trigger: manualTrigger(flow.graph) }))
|
|
77
|
+
.filter((entry) => entry.trigger !== null)
|
|
78
|
+
.sort((left, right) => (left.trigger.order ?? 0) - (right.trigger.order ?? 0) || left.flow.name.localeCompare(right.flow.name)), [flows]);
|
|
79
|
+
return (_jsxs("div", { className: cn('space-y-4', className), children: [_jsx("p", { className: "text-xs text-fg-muted", children: "Add the buttons people can run from a record. Each button is a manual workflow that can be expanded into conditions, approvals, and multi-step branches in the workflow studio." }), _jsx(ButtonList, { buttons: buttons, adapter: adapter, onChanged: onChanged, confirmRemove: confirmRemove, readOnly: readOnly }), _jsx(AddButtonForm, { adapter: adapter, nextOrder: buttons.length, onChanged: onChanged, readOnly: readOnly })] }));
|
|
80
|
+
}
|
|
81
|
+
function ButtonList({ buttons, adapter, onChanged, confirmRemove, readOnly }) {
|
|
82
|
+
const [busyId, setBusyId] = React.useState(null);
|
|
83
|
+
const [error, setError] = React.useState(null);
|
|
84
|
+
async function run(flow, task) {
|
|
85
|
+
setBusyId(flow.id);
|
|
86
|
+
setError(null);
|
|
87
|
+
try {
|
|
88
|
+
await task();
|
|
89
|
+
await onChanged?.();
|
|
90
|
+
}
|
|
91
|
+
catch (cause) {
|
|
92
|
+
setError(cause instanceof Error ? cause.message : 'The record action could not be updated.');
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
setBusyId(null);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function remove(flow) {
|
|
99
|
+
if (confirmRemove ? !(await confirmRemove(flow)) : !globalThis.confirm(`Delete the “${manualTrigger(flow.graph)?.label || flow.name}” button? Its workflow is removed too.`))
|
|
100
|
+
return;
|
|
101
|
+
await run(flow, () => adapter.remove(flow.id));
|
|
102
|
+
}
|
|
103
|
+
if (buttons.length === 0)
|
|
104
|
+
return _jsx("p", { className: "rounded-md border border-dashed border-border px-3 py-4 text-center text-xs text-fg-subtle", children: "No record buttons yet." });
|
|
105
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsx("ul", { className: "space-y-2", children: buttons.map(({ flow, trigger }) => (_jsxs("li", { className: "rounded-md border border-border p-3", children: [_jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-sm font-medium text-fg", children: [_jsx(MousePointerClick, { size: 13, className: "shrink-0 text-fg-subtle" }), _jsx("span", { className: "truncate", children: trigger.label || 'Untitled button' })] }), _jsxs("div", { className: "mt-0.5 text-xs text-fg-muted", children: [firstActionLabel(flow.graph), !flow.enabled ? _jsx("span", { className: "ml-2 rounded bg-bg-subtle px-1.5 py-0.5 text-[10px] font-medium", children: "Disabled" }) : null] })] }), _jsxs("label", { className: "flex shrink-0 cursor-pointer items-center gap-1 text-[11px] text-fg-muted", children: [_jsx("input", { type: "checkbox", checked: flow.enabled, disabled: readOnly || busyId === flow.id, onChange: (event) => run(flow, () => adapter.setEnabled(flow.id, event.target.checked)) }), "Enabled"] })] }), _jsxs("div", { className: "mt-2 flex items-center gap-2", children: [adapter.open ? _jsxs("button", { type: "button", disabled: readOnly, onClick: () => adapter.open?.(flow.id), className: "inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline disabled:opacity-50", children: [_jsx(ExternalLink, { size: 12 }), "Open workflow"] }) : null, _jsxs("button", { type: "button", disabled: readOnly || busyId === flow.id, onClick: () => remove(flow), className: "ml-auto inline-flex items-center gap-1 text-xs font-medium text-danger hover:underline disabled:opacity-50", children: [_jsx(Trash2, { size: 12 }), "Delete"] })] })] }, flow.id))) }), error ? _jsx("p", { role: "alert", className: "text-xs text-danger", children: error }) : null] }));
|
|
106
|
+
}
|
|
107
|
+
function AddButtonForm({ adapter, nextOrder, onChanged, readOnly }) {
|
|
108
|
+
const [label, setLabel] = React.useState('');
|
|
109
|
+
const [actionKind, setActionKind] = React.useState('export_pdf');
|
|
110
|
+
const [icon, setIcon] = React.useState('');
|
|
111
|
+
const [variant, setVariant] = React.useState('default');
|
|
112
|
+
const [pending, startTransition] = React.useTransition();
|
|
113
|
+
const [error, setError] = React.useState(null);
|
|
114
|
+
function add() {
|
|
115
|
+
const trimmed = label.trim();
|
|
116
|
+
if (trimmed.length < 2) {
|
|
117
|
+
setError('Enter a button label with at least two characters.');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
setError(null);
|
|
121
|
+
startTransition(async () => {
|
|
122
|
+
try {
|
|
123
|
+
const graph = buildRecordButtonGraph({ label: trimmed, icon, variant, actionKind, order: nextOrder });
|
|
124
|
+
await adapter.create(trimmed, graph);
|
|
125
|
+
setLabel('');
|
|
126
|
+
setIcon('');
|
|
127
|
+
await onChanged?.();
|
|
128
|
+
}
|
|
129
|
+
catch (cause) {
|
|
130
|
+
setError(cause instanceof Error ? cause.message : 'The record button could not be created.');
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return (_jsxs("div", { className: "space-y-3 rounded-md border border-border p-3", children: [_jsx("div", { className: "text-sm font-medium text-fg", children: "Add record button" }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs", children: "Label" }), _jsx(Input, { value: label, disabled: readOnly, placeholder: "Generate PDF", onChange: (event) => setLabel(event.target.value) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs", children: "First action" }), _jsx(Select, { value: actionKind, disabled: readOnly, onChange: (event) => setActionKind(event.target.value), children: QUICK_ACTIONS.map((action) => _jsx("option", { value: action, children: ACTION_LABEL[action] }, action)) })] }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs", children: "Style" }), _jsx(Select, { value: variant, disabled: readOnly, onChange: (event) => setVariant(event.target.value), children: VARIANTS.map((option) => _jsx("option", { value: option.value, children: option.label }, option.value)) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs", children: "Icon" }), _jsx(Input, { value: icon, disabled: readOnly, placeholder: "download", onChange: (event) => setIcon(event.target.value) })] })] }), _jsx("p", { className: "text-[11px] text-fg-subtle", children: "The workflow opens with one trigger and one action. Add conditions, approvals, notifications, and branches in the workflow studio." }), error ? _jsx("p", { role: "alert", className: "text-xs text-danger", children: error }) : null, _jsxs(Button, { type: "button", disabled: pending || readOnly, className: "w-full", onClick: add, children: [_jsx(Plus, { size: 14 }), pending ? 'Adding…' : 'Add button'] })] }));
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=record-actions-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-actions-panel.js","sourceRoot":"","sources":["../src/record-actions-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { ExternalLink, MousePointerClick, Plus, Trash2 } from 'lucide-react'\nimport type { ActionData, AutomationGraph, TriggerData } from '@braedonsaunders/appkit-forms-core/safety-automation'\nimport { Button, Input, Label, Select, cn } from '@braedonsaunders/appkit-ui'\nimport type { RecordActionFlow, RecordActionFlowAdapter } from './record-config'\n\ntype ManualTrigger = Extract<TriggerData, { trigger: 'manual' }>\ntype ButtonVariant = NonNullable<ManualTrigger['variant']>\n\nconst ACTION_LABEL: Record<ActionData['action'], string> = {\n send_email: 'Send email',\n create_capa: 'Create corrective action',\n create_incident: 'Create incident',\n notify_role: 'Notify role',\n set_field: 'Set field',\n flag_non_compliant: 'Flag non-compliant',\n webhook: 'Webhook',\n create_response: 'Start another form',\n analyze_photos: 'Analyze photos (AI)',\n start_monitored_session: 'Start monitored session',\n change_status: 'Change status',\n duplicate_record: 'Duplicate record',\n export_pdf: 'Generate PDF',\n}\n\nconst VARIANTS: { value: ButtonVariant; label: string }[] = [\n { value: 'default', label: 'Primary' },\n { value: 'outline', label: 'Outline' },\n { value: 'secondary', label: 'Secondary' },\n { value: 'destructive', label: 'Destructive' },\n]\n\nconst QUICK_ACTIONS = ['flag_non_compliant', 'start_monitored_session', 'duplicate_record', 'export_pdf'] as const satisfies readonly ActionData['action'][]\ntype QuickAction = (typeof QUICK_ACTIONS)[number]\n\nfunction defaultAction(kind: QuickAction): ActionData {\n switch (kind) {\n case 'flag_non_compliant': return { action: 'flag_non_compliant' }\n case 'start_monitored_session': return { action: 'start_monitored_session', intervalMinutes: 30, graceMinutes: 10, durationMinutes: 120, requireGeo: false }\n case 'duplicate_record': return { action: 'duplicate_record' }\n case 'export_pdf': return { action: 'export_pdf' }\n }\n}\n\nfunction slugify(value: string): string {\n return value.normalize('NFKD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().trim().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 64)\n}\n\nfunction buttonIdFromLabel(label: string): string {\n const base = slugify(label)\n return `btn_${base || globalThis.crypto.randomUUID().slice(0, 8)}`\n}\n\nexport function manualTrigger(graph: AutomationGraph): ManualTrigger | null {\n for (const node of graph.nodes) {\n if (node.data.kind === 'trigger' && node.data.trigger.trigger === 'manual') return node.data.trigger\n }\n return null\n}\n\nfunction firstActionLabel(graph: AutomationGraph): string {\n const node = graph.nodes.find((candidate) => candidate.data.kind === 'action')\n if (node?.data.kind === 'action') return ACTION_LABEL[node.data.action.action]\n return 'No action yet'\n}\n\nexport function buildRecordButtonGraph(input: { label: string; icon?: string; variant: ButtonVariant; actionKind: QuickAction; order: number }): AutomationGraph {\n const trigger: TriggerData = {\n trigger: 'manual',\n buttonId: buttonIdFromLabel(input.label),\n label: input.label.trim(),\n variant: input.variant,\n order: input.order,\n ...(input.icon?.trim() ? { icon: input.icon.trim() } : {}),\n }\n return {\n schemaVersion: 1,\n nodes: [\n { id: 'trg', position: { x: 80, y: 80 }, data: { kind: 'trigger', trigger } },\n { id: 'act', position: { x: 400, y: 80 }, data: { kind: 'action', action: defaultAction(input.actionKind) } },\n ],\n edges: [{ id: 'e1', source: 'trg', target: 'act', sourceHandle: 'next' }],\n }\n}\n\nexport type RecordActionsPanelProps = {\n flows: RecordActionFlow[]\n adapter: RecordActionFlowAdapter\n onChanged?: () => void | Promise<void>\n confirmRemove?: (flow: RecordActionFlow) => boolean | Promise<boolean>\n readOnly?: boolean\n className?: string\n}\n\nexport function RecordActionsPanel({ flows, adapter, onChanged, confirmRemove, readOnly = false, className }: RecordActionsPanelProps) {\n const buttons = React.useMemo(() => flows\n .map((flow) => ({ flow, trigger: manualTrigger(flow.graph) }))\n .filter((entry): entry is { flow: RecordActionFlow; trigger: ManualTrigger } => entry.trigger !== null)\n .sort((left, right) => (left.trigger.order ?? 0) - (right.trigger.order ?? 0) || left.flow.name.localeCompare(right.flow.name)), [flows])\n\n return (\n <div className={cn('space-y-4', className)}>\n <p className=\"text-xs text-fg-muted\">Add the buttons people can run from a record. Each button is a manual workflow that can be expanded into conditions, approvals, and multi-step branches in the workflow studio.</p>\n <ButtonList buttons={buttons} adapter={adapter} onChanged={onChanged} confirmRemove={confirmRemove} readOnly={readOnly} />\n <AddButtonForm adapter={adapter} nextOrder={buttons.length} onChanged={onChanged} readOnly={readOnly} />\n </div>\n )\n}\n\nfunction ButtonList({ buttons, adapter, onChanged, confirmRemove, readOnly }: { buttons: { flow: RecordActionFlow; trigger: ManualTrigger }[]; adapter: RecordActionFlowAdapter; onChanged?: () => void | Promise<void>; confirmRemove?: (flow: RecordActionFlow) => boolean | Promise<boolean>; readOnly: boolean }) {\n const [busyId, setBusyId] = React.useState<string | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n\n async function run(flow: RecordActionFlow, task: () => Promise<void>) {\n setBusyId(flow.id)\n setError(null)\n try {\n await task()\n await onChanged?.()\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : 'The record action could not be updated.')\n } finally {\n setBusyId(null)\n }\n }\n\n async function remove(flow: RecordActionFlow) {\n if (confirmRemove ? !(await confirmRemove(flow)) : !globalThis.confirm(`Delete the “${manualTrigger(flow.graph)?.label || flow.name}” button? Its workflow is removed too.`)) return\n await run(flow, () => adapter.remove(flow.id))\n }\n\n if (buttons.length === 0) return <p className=\"rounded-md border border-dashed border-border px-3 py-4 text-center text-xs text-fg-subtle\">No record buttons yet.</p>\n\n return (\n <div className=\"space-y-2\">\n <ul className=\"space-y-2\">\n {buttons.map(({ flow, trigger }) => (\n <li key={flow.id} className=\"rounded-md border border-border p-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-fg\"><MousePointerClick size={13} className=\"shrink-0 text-fg-subtle\" /><span className=\"truncate\">{trigger.label || 'Untitled button'}</span></div>\n <div className=\"mt-0.5 text-xs text-fg-muted\">{firstActionLabel(flow.graph)}{!flow.enabled ? <span className=\"ml-2 rounded bg-bg-subtle px-1.5 py-0.5 text-[10px] font-medium\">Disabled</span> : null}</div>\n </div>\n <label className=\"flex shrink-0 cursor-pointer items-center gap-1 text-[11px] text-fg-muted\">\n <input type=\"checkbox\" checked={flow.enabled} disabled={readOnly || busyId === flow.id} onChange={(event) => run(flow, () => adapter.setEnabled(flow.id, event.target.checked))} />Enabled\n </label>\n </div>\n <div className=\"mt-2 flex items-center gap-2\">\n {adapter.open ? <button type=\"button\" disabled={readOnly} onClick={() => adapter.open?.(flow.id)} className=\"inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline disabled:opacity-50\"><ExternalLink size={12} />Open workflow</button> : null}\n <button type=\"button\" disabled={readOnly || busyId === flow.id} onClick={() => remove(flow)} className=\"ml-auto inline-flex items-center gap-1 text-xs font-medium text-danger hover:underline disabled:opacity-50\"><Trash2 size={12} />Delete</button>\n </div>\n </li>\n ))}\n </ul>\n {error ? <p role=\"alert\" className=\"text-xs text-danger\">{error}</p> : null}\n </div>\n )\n}\n\nfunction AddButtonForm({ adapter, nextOrder, onChanged, readOnly }: { adapter: RecordActionFlowAdapter; nextOrder: number; onChanged?: () => void | Promise<void>; readOnly: boolean }) {\n const [label, setLabel] = React.useState('')\n const [actionKind, setActionKind] = React.useState<QuickAction>('export_pdf')\n const [icon, setIcon] = React.useState('')\n const [variant, setVariant] = React.useState<ButtonVariant>('default')\n const [pending, startTransition] = React.useTransition()\n const [error, setError] = React.useState<string | null>(null)\n\n function add() {\n const trimmed = label.trim()\n if (trimmed.length < 2) { setError('Enter a button label with at least two characters.'); return }\n setError(null)\n startTransition(async () => {\n try {\n const graph = buildRecordButtonGraph({ label: trimmed, icon, variant, actionKind, order: nextOrder })\n await adapter.create(trimmed, graph)\n setLabel('')\n setIcon('')\n await onChanged?.()\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : 'The record button could not be created.')\n }\n })\n }\n\n return (\n <div className=\"space-y-3 rounded-md border border-border p-3\">\n <div className=\"text-sm font-medium text-fg\">Add record button</div>\n <div className=\"space-y-1\"><Label className=\"text-xs\">Label</Label><Input value={label} disabled={readOnly} placeholder=\"Generate PDF\" onChange={(event) => setLabel(event.target.value)} /></div>\n <div className=\"space-y-1\"><Label className=\"text-xs\">First action</Label><Select value={actionKind} disabled={readOnly} onChange={(event) => setActionKind(event.target.value as QuickAction)}>{QUICK_ACTIONS.map((action) => <option key={action} value={action}>{ACTION_LABEL[action]}</option>)}</Select></div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"space-y-1\"><Label className=\"text-xs\">Style</Label><Select value={variant} disabled={readOnly} onChange={(event) => setVariant(event.target.value as ButtonVariant)}>{VARIANTS.map((option) => <option key={option.value} value={option.value}>{option.label}</option>)}</Select></div>\n <div className=\"space-y-1\"><Label className=\"text-xs\">Icon</Label><Input value={icon} disabled={readOnly} placeholder=\"download\" onChange={(event) => setIcon(event.target.value)} /></div>\n </div>\n <p className=\"text-[11px] text-fg-subtle\">The workflow opens with one trigger and one action. Add conditions, approvals, notifications, and branches in the workflow studio.</p>\n {error ? <p role=\"alert\" className=\"text-xs text-danger\">{error}</p> : null}\n <Button type=\"button\" disabled={pending || readOnly} className=\"w-full\" onClick={add}><Plus size={14} />{pending ? 'Adding…' : 'Add button'}</Button>\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { RecordConfig } from './record-config.js';
|
|
3
|
+
export type RecordBehaviorPanelProps = {
|
|
4
|
+
value?: RecordConfig;
|
|
5
|
+
roles?: {
|
|
6
|
+
key: string;
|
|
7
|
+
name: string;
|
|
8
|
+
}[];
|
|
9
|
+
onChange: (config: RecordConfig) => void;
|
|
10
|
+
onSave?: (config: RecordConfig) => void | Promise<void>;
|
|
11
|
+
readOnly?: boolean;
|
|
12
|
+
className?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function RecordBehaviorPanel({ value, roles, onChange, onSave, readOnly, className, }: RecordBehaviorPanelProps): React.JSX.Element;
|
|
15
|
+
//# sourceMappingURL=record-behavior-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-behavior-panel.d.ts","sourceRoot":"","sources":["../src/record-behavior-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AA6BnD,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACvC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;IACxC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,KAAU,EACV,QAAQ,EACR,MAAM,EACN,QAAgB,EAChB,SAAS,GACV,EAAE,wBAAwB,qBAyJ1B"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Check } from 'lucide-react';
|
|
5
|
+
import { Button, Checkbox, Label, cn } from '@braedonsaunders/appkit-ui';
|
|
6
|
+
const EDITING_MODES = [
|
|
7
|
+
{
|
|
8
|
+
value: 'guided_fill',
|
|
9
|
+
title: 'Guided fill',
|
|
10
|
+
description: 'A step-by-step wizard ending in Submit. Best for one-off captures in the field.',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
value: 'inline_record',
|
|
14
|
+
title: 'Inline record',
|
|
15
|
+
description: 'A living record edited in place — every field autosaves as you type.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
value: 'both',
|
|
19
|
+
title: 'Both',
|
|
20
|
+
description: 'An inline record that can also be completed through the guided wizard.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
const LOCK_TRIGGERS = [
|
|
24
|
+
{ value: 'manual', label: 'Manually, with a Lock button' },
|
|
25
|
+
{ value: 'on_finalize', label: 'When the record is finalised' },
|
|
26
|
+
{ value: 'on_signoff', label: 'When all sign-off steps are complete' },
|
|
27
|
+
];
|
|
28
|
+
export function RecordBehaviorPanel({ value, roles = [], onChange, onSave, readOnly = false, className, }) {
|
|
29
|
+
const [pending, startTransition] = React.useTransition();
|
|
30
|
+
const config = value ?? {};
|
|
31
|
+
const editingMode = config.editingMode ?? 'guided_fill';
|
|
32
|
+
const locking = config.locking ?? {};
|
|
33
|
+
const tabs = config.tabs ?? {};
|
|
34
|
+
const patch = React.useCallback((next) => {
|
|
35
|
+
onChange({ ...config, ...next });
|
|
36
|
+
}, [config, onChange]);
|
|
37
|
+
const patchLocking = React.useCallback((next) => {
|
|
38
|
+
patch({ locking: { ...locking, ...next } });
|
|
39
|
+
}, [locking, patch]);
|
|
40
|
+
const toggleRole = (key, role) => {
|
|
41
|
+
const selected = new Set(locking[key] ?? []);
|
|
42
|
+
if (selected.has(role))
|
|
43
|
+
selected.delete(role);
|
|
44
|
+
else
|
|
45
|
+
selected.add(role);
|
|
46
|
+
patchLocking({ [key]: [...selected] });
|
|
47
|
+
};
|
|
48
|
+
return (_jsxs("div", { className: cn('space-y-4', className), children: [_jsx("p", { className: "text-xs text-fg-muted", children: "Choose how people edit records, when records lock, and which review tabs are available." }), _jsxs("section", { className: "space-y-2", children: [_jsx(Label, { className: "text-xs", children: "Editing mode" }), _jsx("div", { className: "space-y-2", children: EDITING_MODES.map((mode) => {
|
|
49
|
+
const active = editingMode === mode.value;
|
|
50
|
+
return (_jsxs("button", { type: "button", disabled: readOnly, onClick: () => patch({ editingMode: mode.value }), "aria-pressed": active, className: cn('flex w-full items-start gap-2 rounded-md border px-3 py-2 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-50', active ? 'border-primary bg-primary-subtle' : 'border-border hover:bg-surface-hover'), children: [_jsx("span", { className: cn('mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full border', active ? 'border-primary bg-primary text-primary-fg' : 'border-border-strong'), children: active ? _jsx(Check, { size: 11 }) : null }), _jsxs("span", { children: [_jsx("span", { className: "block text-sm font-medium text-fg", children: mode.title }), _jsx("span", { className: "block text-xs text-fg-muted", children: mode.description })] })] }, mode.value));
|
|
51
|
+
}) })] }), _jsxs("section", { className: "space-y-3 rounded-md border border-border p-3", children: [_jsxs("label", { className: "flex items-start gap-2 text-sm", children: [_jsx(Checkbox, { checked: locking.enabled ?? false, disabled: readOnly, onChange: (event) => patchLocking({ enabled: event.currentTarget.checked }), className: "mt-0.5" }), _jsxs("span", { children: [_jsx("span", { className: "font-medium text-fg", children: "Allow record locking" }), _jsx("span", { className: "block text-xs text-fg-muted", children: "Locked records become read-only until an authorised person unlocks them." })] })] }), locking.enabled ? (_jsxs("div", { className: "space-y-3 border-t border-border-subtle pt-3", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs", children: "Lock trigger" }), _jsx("div", { className: "space-y-1", children: LOCK_TRIGGERS.map((option) => (_jsxs("label", { className: "flex cursor-pointer items-center gap-2 rounded-md border border-border px-3 py-1.5 text-sm hover:bg-surface-hover", children: [_jsx("input", { type: "radio", name: "record-lock-trigger", checked: (locking.trigger ?? 'manual') === option.value, disabled: readOnly, onChange: () => patchLocking({ trigger: option.value }) }), _jsx("span", { className: "text-fg", children: option.label })] }, option.value))) })] }), _jsx(RoleMultiSelect, { label: "Who can lock records", help: "Leave empty to allow anyone with edit access. Administrators can always lock.", roles: roles, selected: new Set(locking.lockRoles ?? []), disabled: readOnly, onToggle: (key) => toggleRole('lockRoles', key) }), _jsx(RoleMultiSelect, { label: "Who can unlock records", help: "Leave empty to allow anyone with edit access. Administrators can always unlock.", roles: roles, selected: new Set(locking.unlockRoles ?? []), disabled: readOnly, onToggle: (key) => toggleRole('unlockRoles', key) }), _jsxs("label", { className: "flex items-start gap-2 text-sm", children: [_jsx(Checkbox, { checked: locking.autoLockOnFinalize ?? false, disabled: readOnly, onChange: (event) => patchLocking({ autoLockOnFinalize: event.currentTarget.checked }), className: "mt-0.5" }), _jsxs("span", { children: [_jsx("span", { className: "font-medium text-fg", children: "Automatically lock final records" }), _jsx("span", { className: "block text-xs text-fg-muted", children: "Prevent further edits as soon as the record is finalised." })] })] })] })) : null] }), _jsxs("section", { className: "space-y-3 rounded-md border border-border p-3", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { className: "text-xs", children: "Record tabs" }), _jsx("p", { className: "text-xs text-fg-muted", children: "Choose the system tabs shown beside the record form." })] }), _jsx(TabToggle, { label: "Review", help: "Compliance scoring and sign-off.", checked: tabs.review ?? false, disabled: readOnly, onChange: (review) => patch({ tabs: { ...tabs, review } }) }), _jsx(TabToggle, { label: "Comments", help: "Let reviewers discuss a record.", checked: tabs.comments ?? true, disabled: readOnly, onChange: (comments) => patch({ tabs: { ...tabs, comments } }) }), _jsx(TabToggle, { label: "Audit", help: "Show the complete change history.", checked: tabs.audit ?? true, disabled: readOnly, onChange: (audit) => patch({ tabs: { ...tabs, audit } }) })] }), onSave ? (_jsx(Button, { type: "button", disabled: pending || readOnly, className: "w-full", onClick: () => startTransition(async () => onSave(config)), children: pending ? 'Saving…' : 'Save record behavior' })) : null] }));
|
|
52
|
+
}
|
|
53
|
+
function TabToggle({ label, help, checked, disabled, onChange }) {
|
|
54
|
+
return (_jsxs("label", { className: "flex items-start gap-2 text-sm", children: [_jsx(Checkbox, { checked: checked, disabled: disabled, onChange: (event) => onChange(event.currentTarget.checked), className: "mt-0.5" }), _jsxs("span", { children: [_jsx("span", { className: "font-medium text-fg", children: label }), _jsx("span", { className: "block text-xs text-fg-muted", children: help })] })] }));
|
|
55
|
+
}
|
|
56
|
+
function RoleMultiSelect({ label, help, roles, selected, disabled, onToggle }) {
|
|
57
|
+
return (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs", children: label }), roles.length === 0 ? _jsx("p", { className: "text-xs text-fg-subtle", children: "No roles are available." }) : (_jsx("ul", { className: "space-y-1", children: roles.map((role) => (_jsx("li", { children: _jsxs("label", { className: "flex cursor-pointer items-center gap-2 rounded-md border border-border px-3 py-1.5 text-sm hover:bg-surface-hover", children: [_jsx(Checkbox, { checked: selected.has(role.key), disabled: disabled, onChange: () => onToggle(role.key) }), _jsx("span", { className: "flex-1 text-fg", children: role.name }), _jsx("span", { className: "text-[10px] text-fg-subtle", children: role.key })] }) }, role.key))) })), _jsx("p", { className: "text-[11px] text-fg-subtle", children: help })] }));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=record-behavior-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-behavior-panel.js","sourceRoot":"","sources":["../src/record-behavior-panel.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,4BAA4B,CAAA;AAMxE,MAAM,aAAa,GAAiE;IAClF;QACE,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,iFAAiF;KAC/F;IACD;QACE,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,sEAAsE;KACpF;IACD;QACE,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,wEAAwE;KACtF;CACF,CAAA;AAED,MAAM,aAAa,GAA4C;IAC7D,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,8BAA8B,EAAE;IAC1D,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,8BAA8B,EAAE;IAC/D,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,sCAAsC,EAAE;CACvE,CAAA;AAWD,MAAM,UAAU,mBAAmB,CAAC,EAClC,KAAK,EACL,KAAK,GAAG,EAAE,EACV,QAAQ,EACR,MAAM,EACN,QAAQ,GAAG,KAAK,EAChB,SAAS,GACgB;IACzB,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,aAAa,EAAE,CAAA;IACxD,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAA;IAC1B,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,aAAa,CAAA;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAA;IAE9B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,IAA2B,EAAE,EAAE;QAC9D,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;IAClC,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEtB,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,IAAmD,EAAE,EAAE;QAC7F,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,CAAA;IAC7C,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IAEpB,MAAM,UAAU,GAAG,CACjB,GAAgC,EAChC,IAAY,EACZ,EAAE;QACF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5C,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;;YACxC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACxC,CAAC,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,aACxC,YAAG,SAAS,EAAC,uBAAuB,wGAEhC,EAEJ,mBAAS,SAAS,EAAC,WAAW,aAC5B,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,6BAAqB,EAC/C,cAAK,SAAS,EAAC,WAAW,YACvB,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;4BAC1B,MAAM,MAAM,GAAG,WAAW,KAAK,IAAI,CAAC,KAAK,CAAA;4BACzC,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,kBACnC,MAAM,EACpB,SAAS,EAAE,EAAE,CACX,uIAAuI,EACvI,MAAM,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,sCAAsC,CACrF,aAED,eAAM,SAAS,EAAE,EAAE,CACjB,6EAA6E,EAC7E,MAAM,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,sBAAsB,CAC9E,YACE,MAAM,CAAC,CAAC,CAAC,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,IAAI,GAC/B,EACP,2BACE,eAAM,SAAS,EAAC,mCAAmC,YAAE,IAAI,CAAC,KAAK,GAAQ,EACvE,eAAM,SAAS,EAAC,6BAA6B,YAAE,IAAI,CAAC,WAAW,GAAQ,IAClE,KAnBF,IAAI,CAAC,KAAK,CAoBR,CACV,CAAA;wBACH,CAAC,CAAC,GACE,IACE,EAEV,mBAAS,SAAS,EAAC,+CAA+C,aAChE,iBAAO,SAAS,EAAC,gCAAgC,aAC/C,KAAC,QAAQ,IACP,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,EACjC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,EAC3E,SAAS,EAAC,QAAQ,GAClB,EACF,2BACE,eAAM,SAAS,EAAC,qBAAqB,qCAA4B,EACjE,eAAM,SAAS,EAAC,6BAA6B,yFAAgF,IACxH,IACD,EAEP,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CACjB,eAAK,SAAS,EAAC,8CAA8C,aAC3D,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,6BAAqB,EAC/C,cAAK,SAAS,EAAC,WAAW,YACvB,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC7B,iBAA0B,SAAS,EAAC,mHAAmH,aACrJ,gBACE,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,qBAAqB,EAC1B,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,KAAK,MAAM,CAAC,KAAK,EACvD,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,GACvD,EACF,eAAM,SAAS,EAAC,SAAS,YAAE,MAAM,CAAC,KAAK,GAAQ,KARrC,MAAM,CAAC,KAAK,CAShB,CACT,CAAC,GACE,IACF,EAEN,KAAC,eAAe,IACd,KAAK,EAAC,sBAAsB,EAC5B,IAAI,EAAC,+EAA+E,EACpF,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,EAC1C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,GAC/C,EACF,KAAC,eAAe,IACd,KAAK,EAAC,wBAAwB,EAC9B,IAAI,EAAC,iFAAiF,EACtF,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,EAC5C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC,GACjD,EAEF,iBAAO,SAAS,EAAC,gCAAgC,aAC/C,KAAC,QAAQ,IACP,OAAO,EAAE,OAAO,CAAC,kBAAkB,IAAI,KAAK,EAC5C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,kBAAkB,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,EACtF,SAAS,EAAC,QAAQ,GAClB,EACF,2BACE,eAAM,SAAS,EAAC,qBAAqB,iDAAwC,EAC7E,eAAM,SAAS,EAAC,6BAA6B,0EAAiE,IACzG,IACD,IACJ,CACP,CAAC,CAAC,CAAC,IAAI,IACA,EAEV,mBAAS,SAAS,EAAC,+CAA+C,aAChE,eAAK,SAAS,EAAC,aAAa,aAC1B,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,4BAAoB,EAC9C,YAAG,SAAS,EAAC,uBAAuB,qEAAyD,IACzF,EACN,KAAC,SAAS,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,kCAAkC,EAAC,OAAO,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,GAAI,EACnL,KAAC,SAAS,IAAC,KAAK,EAAC,UAAU,EAAC,IAAI,EAAC,iCAAiC,EAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAI,EACzL,KAAC,SAAS,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,EAAC,mCAAmC,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,GAAI,IACvK,EAET,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,OAAO,IAAI,QAAQ,EAC7B,SAAS,EAAC,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAEzD,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,GACtC,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAA2G;IACtK,OAAO,CACL,iBAAO,SAAS,EAAC,gCAAgC,aAC/C,KAAC,QAAQ,IAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,SAAS,EAAC,QAAQ,GAAG,EACjI,2BAAM,eAAM,SAAS,EAAC,qBAAqB,YAAE,KAAK,GAAQ,EAAA,eAAM,SAAS,EAAC,6BAA6B,YAAE,IAAI,GAAQ,IAAO,IACtH,CACT,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAsJ;IAC/N,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,YAAE,KAAK,GAAS,EACzC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,wBAAwB,wCAA4B,CAAC,CAAC,CAAC,CACxF,aAAI,SAAS,EAAC,WAAW,YACtB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,uBACE,iBAAO,SAAS,EAAC,mHAAmH,aAClI,KAAC,QAAQ,IAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAI,EACrG,eAAM,SAAS,EAAC,gBAAgB,YAAE,IAAI,CAAC,IAAI,GAAQ,EAAA,eAAM,SAAS,EAAC,4BAA4B,YAAE,IAAI,CAAC,GAAG,GAAQ,IAC3G,IAJD,IAAI,CAAC,GAAG,CAKZ,CACN,CAAC,GACC,CACN,EACD,YAAG,SAAS,EAAC,4BAA4B,YAAE,IAAI,GAAK,IAChD,CACP,CAAA;AACH,CAAC","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Check } from 'lucide-react'\nimport { Button, Checkbox, Label, cn } from '@braedonsaunders/appkit-ui'\nimport type { RecordConfig } from './record-config'\n\ntype EditingMode = NonNullable<RecordConfig['editingMode']>\ntype LockTrigger = NonNullable<NonNullable<RecordConfig['locking']>['trigger']>\n\nconst EDITING_MODES: { value: EditingMode; title: string; description: string }[] = [\n {\n value: 'guided_fill',\n title: 'Guided fill',\n description: 'A step-by-step wizard ending in Submit. Best for one-off captures in the field.',\n },\n {\n value: 'inline_record',\n title: 'Inline record',\n description: 'A living record edited in place — every field autosaves as you type.',\n },\n {\n value: 'both',\n title: 'Both',\n description: 'An inline record that can also be completed through the guided wizard.',\n },\n]\n\nconst LOCK_TRIGGERS: { value: LockTrigger; label: string }[] = [\n { value: 'manual', label: 'Manually, with a Lock button' },\n { value: 'on_finalize', label: 'When the record is finalised' },\n { value: 'on_signoff', label: 'When all sign-off steps are complete' },\n]\n\nexport type RecordBehaviorPanelProps = {\n value?: RecordConfig\n roles?: { key: string; name: string }[]\n onChange: (config: RecordConfig) => void\n onSave?: (config: RecordConfig) => void | Promise<void>\n readOnly?: boolean\n className?: string\n}\n\nexport function RecordBehaviorPanel({\n value,\n roles = [],\n onChange,\n onSave,\n readOnly = false,\n className,\n}: RecordBehaviorPanelProps) {\n const [pending, startTransition] = React.useTransition()\n const config = value ?? {}\n const editingMode = config.editingMode ?? 'guided_fill'\n const locking = config.locking ?? {}\n const tabs = config.tabs ?? {}\n\n const patch = React.useCallback((next: Partial<RecordConfig>) => {\n onChange({ ...config, ...next })\n }, [config, onChange])\n\n const patchLocking = React.useCallback((next: Partial<NonNullable<RecordConfig['locking']>>) => {\n patch({ locking: { ...locking, ...next } })\n }, [locking, patch])\n\n const toggleRole = (\n key: 'lockRoles' | 'unlockRoles',\n role: string,\n ) => {\n const selected = new Set(locking[key] ?? [])\n if (selected.has(role)) selected.delete(role)\n else selected.add(role)\n patchLocking({ [key]: [...selected] })\n }\n\n return (\n <div className={cn('space-y-4', className)}>\n <p className=\"text-xs text-fg-muted\">\n Choose how people edit records, when records lock, and which review tabs are available.\n </p>\n\n <section className=\"space-y-2\">\n <Label className=\"text-xs\">Editing mode</Label>\n <div className=\"space-y-2\">\n {EDITING_MODES.map((mode) => {\n const active = editingMode === mode.value\n return (\n <button\n key={mode.value}\n type=\"button\"\n disabled={readOnly}\n onClick={() => patch({ editingMode: mode.value })}\n aria-pressed={active}\n className={cn(\n 'flex w-full items-start gap-2 rounded-md border px-3 py-2 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-50',\n active ? 'border-primary bg-primary-subtle' : 'border-border hover:bg-surface-hover',\n )}\n >\n <span className={cn(\n 'mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full border',\n active ? 'border-primary bg-primary text-primary-fg' : 'border-border-strong',\n )}>\n {active ? <Check size={11} /> : null}\n </span>\n <span>\n <span className=\"block text-sm font-medium text-fg\">{mode.title}</span>\n <span className=\"block text-xs text-fg-muted\">{mode.description}</span>\n </span>\n </button>\n )\n })}\n </div>\n </section>\n\n <section className=\"space-y-3 rounded-md border border-border p-3\">\n <label className=\"flex items-start gap-2 text-sm\">\n <Checkbox\n checked={locking.enabled ?? false}\n disabled={readOnly}\n onChange={(event) => patchLocking({ enabled: event.currentTarget.checked })}\n className=\"mt-0.5\"\n />\n <span>\n <span className=\"font-medium text-fg\">Allow record locking</span>\n <span className=\"block text-xs text-fg-muted\">Locked records become read-only until an authorised person unlocks them.</span>\n </span>\n </label>\n\n {locking.enabled ? (\n <div className=\"space-y-3 border-t border-border-subtle pt-3\">\n <div className=\"space-y-1\">\n <Label className=\"text-xs\">Lock trigger</Label>\n <div className=\"space-y-1\">\n {LOCK_TRIGGERS.map((option) => (\n <label key={option.value} className=\"flex cursor-pointer items-center gap-2 rounded-md border border-border px-3 py-1.5 text-sm hover:bg-surface-hover\">\n <input\n type=\"radio\"\n name=\"record-lock-trigger\"\n checked={(locking.trigger ?? 'manual') === option.value}\n disabled={readOnly}\n onChange={() => patchLocking({ trigger: option.value })}\n />\n <span className=\"text-fg\">{option.label}</span>\n </label>\n ))}\n </div>\n </div>\n\n <RoleMultiSelect\n label=\"Who can lock records\"\n help=\"Leave empty to allow anyone with edit access. Administrators can always lock.\"\n roles={roles}\n selected={new Set(locking.lockRoles ?? [])}\n disabled={readOnly}\n onToggle={(key) => toggleRole('lockRoles', key)}\n />\n <RoleMultiSelect\n label=\"Who can unlock records\"\n help=\"Leave empty to allow anyone with edit access. Administrators can always unlock.\"\n roles={roles}\n selected={new Set(locking.unlockRoles ?? [])}\n disabled={readOnly}\n onToggle={(key) => toggleRole('unlockRoles', key)}\n />\n\n <label className=\"flex items-start gap-2 text-sm\">\n <Checkbox\n checked={locking.autoLockOnFinalize ?? false}\n disabled={readOnly}\n onChange={(event) => patchLocking({ autoLockOnFinalize: event.currentTarget.checked })}\n className=\"mt-0.5\"\n />\n <span>\n <span className=\"font-medium text-fg\">Automatically lock final records</span>\n <span className=\"block text-xs text-fg-muted\">Prevent further edits as soon as the record is finalised.</span>\n </span>\n </label>\n </div>\n ) : null}\n </section>\n\n <section className=\"space-y-3 rounded-md border border-border p-3\">\n <div className=\"space-y-0.5\">\n <Label className=\"text-xs\">Record tabs</Label>\n <p className=\"text-xs text-fg-muted\">Choose the system tabs shown beside the record form.</p>\n </div>\n <TabToggle label=\"Review\" help=\"Compliance scoring and sign-off.\" checked={tabs.review ?? false} disabled={readOnly} onChange={(review) => patch({ tabs: { ...tabs, review } })} />\n <TabToggle label=\"Comments\" help=\"Let reviewers discuss a record.\" checked={tabs.comments ?? true} disabled={readOnly} onChange={(comments) => patch({ tabs: { ...tabs, comments } })} />\n <TabToggle label=\"Audit\" help=\"Show the complete change history.\" checked={tabs.audit ?? true} disabled={readOnly} onChange={(audit) => patch({ tabs: { ...tabs, audit } })} />\n </section>\n\n {onSave ? (\n <Button\n type=\"button\"\n disabled={pending || readOnly}\n className=\"w-full\"\n onClick={() => startTransition(async () => onSave(config))}\n >\n {pending ? 'Saving…' : 'Save record behavior'}\n </Button>\n ) : null}\n </div>\n )\n}\n\nfunction TabToggle({ label, help, checked, disabled, onChange }: { label: string; help: string; checked: boolean; disabled: boolean; onChange: (next: boolean) => void }) {\n return (\n <label className=\"flex items-start gap-2 text-sm\">\n <Checkbox checked={checked} disabled={disabled} onChange={(event) => onChange(event.currentTarget.checked)} className=\"mt-0.5\" />\n <span><span className=\"font-medium text-fg\">{label}</span><span className=\"block text-xs text-fg-muted\">{help}</span></span>\n </label>\n )\n}\n\nfunction RoleMultiSelect({ label, help, roles, selected, disabled, onToggle }: { label: string; help: string; roles: { key: string; name: string }[]; selected: Set<string>; disabled: boolean; onToggle: (key: string) => void }) {\n return (\n <div className=\"space-y-1\">\n <Label className=\"text-xs\">{label}</Label>\n {roles.length === 0 ? <p className=\"text-xs text-fg-subtle\">No roles are available.</p> : (\n <ul className=\"space-y-1\">\n {roles.map((role) => (\n <li key={role.key}>\n <label className=\"flex cursor-pointer items-center gap-2 rounded-md border border-border px-3 py-1.5 text-sm hover:bg-surface-hover\">\n <Checkbox checked={selected.has(role.key)} disabled={disabled} onChange={() => onToggle(role.key)} />\n <span className=\"flex-1 text-fg\">{role.name}</span><span className=\"text-[10px] text-fg-subtle\">{role.key}</span>\n </label>\n </li>\n ))}\n </ul>\n )}\n <p className=\"text-[11px] text-fg-subtle\">{help}</p>\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { AutomationGraph } from '@braedonsaunders/appkit-forms-core/safety-automation';
|
|
2
|
+
export type RecordConfig = {
|
|
3
|
+
editingMode?: 'guided_fill' | 'inline_record' | 'both';
|
|
4
|
+
locking?: {
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
trigger?: 'manual' | 'on_finalize' | 'on_signoff';
|
|
7
|
+
lockRoles?: string[];
|
|
8
|
+
unlockRoles?: string[];
|
|
9
|
+
autoLockOnFinalize?: boolean;
|
|
10
|
+
};
|
|
11
|
+
tabs?: {
|
|
12
|
+
review?: boolean;
|
|
13
|
+
comments?: boolean;
|
|
14
|
+
audit?: boolean;
|
|
15
|
+
};
|
|
16
|
+
list?: ListConfig;
|
|
17
|
+
};
|
|
18
|
+
export type ListColumnConfig = {
|
|
19
|
+
key: string;
|
|
20
|
+
source: 'builtin' | 'field';
|
|
21
|
+
label?: string;
|
|
22
|
+
};
|
|
23
|
+
export type ListConfig = {
|
|
24
|
+
columns?: ListColumnConfig[];
|
|
25
|
+
defaultSort?: {
|
|
26
|
+
key: 'submitted_at' | 'created_at' | 'status';
|
|
27
|
+
dir: 'asc' | 'desc';
|
|
28
|
+
};
|
|
29
|
+
defaultStatus?: string;
|
|
30
|
+
};
|
|
31
|
+
export type RecordActionFlow = {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
enabled: boolean;
|
|
35
|
+
graph: AutomationGraph;
|
|
36
|
+
};
|
|
37
|
+
export type RecordActionFlowAdapter = {
|
|
38
|
+
create(name: string, graph: AutomationGraph): Promise<RecordActionFlow>;
|
|
39
|
+
update(id: string, graph: AutomationGraph): Promise<void>;
|
|
40
|
+
setEnabled(id: string, enabled: boolean): Promise<void>;
|
|
41
|
+
remove(id: string): Promise<void>;
|
|
42
|
+
open?(id: string): void;
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=record-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-config.d.ts","sourceRoot":"","sources":["../src/record-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sDAAsD,CAAA;AAE3F,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,CAAC,EAAE,aAAa,GAAG,eAAe,GAAG,MAAM,CAAA;IACtD,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,OAAO,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,YAAY,CAAA;QACjD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;QACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;QACtB,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAC7B,CAAA;IACD,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,KAAK,CAAC,EAAE,OAAO,CAAA;KAChB,CAAA;IACD,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,SAAS,GAAG,OAAO,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,WAAW,CAAC,EAAE;QACZ,GAAG,EAAE,cAAc,GAAG,YAAY,GAAG,QAAQ,CAAA;QAC7C,GAAG,EAAE,KAAK,GAAG,MAAM,CAAA;KACpB,CAAA;IACD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,eAAe,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACvE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,IAAI,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,CAAA"}
|
package/record-config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-config.js","sourceRoot":"","sources":["../src/record-config.ts"],"names":[],"mappings":"","sourcesContent":["import type { AutomationGraph } from '@braedonsaunders/appkit-forms-core/safety-automation'\n\nexport type RecordConfig = {\n editingMode?: 'guided_fill' | 'inline_record' | 'both'\n locking?: {\n enabled?: boolean\n trigger?: 'manual' | 'on_finalize' | 'on_signoff'\n lockRoles?: string[]\n unlockRoles?: string[]\n autoLockOnFinalize?: boolean\n }\n tabs?: {\n review?: boolean\n comments?: boolean\n audit?: boolean\n }\n list?: ListConfig\n}\n\nexport type ListColumnConfig = {\n key: string\n source: 'builtin' | 'field'\n label?: string\n}\n\nexport type ListConfig = {\n columns?: ListColumnConfig[]\n defaultSort?: {\n key: 'submitted_at' | 'created_at' | 'status'\n dir: 'asc' | 'desc'\n }\n defaultStatus?: string\n}\n\nexport type RecordActionFlow = {\n id: string\n name: string\n enabled: boolean\n graph: AutomationGraph\n}\n\nexport type RecordActionFlowAdapter = {\n create(name: string, graph: AutomationGraph): Promise<RecordActionFlow>\n update(id: string, graph: AutomationGraph): Promise<void>\n setEnabled(id: string, enabled: boolean): Promise<void>\n remove(id: string): Promise<void>\n open?(id: string): void\n}\n"]}
|