@vuu-ui/vuu-data-react 0.13.8 → 0.13.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/cjs/data-editing/EditForm.css.js +6 -0
  2. package/cjs/data-editing/EditForm.css.js.map +1 -0
  3. package/cjs/data-editing/EditForm.js +90 -0
  4. package/cjs/data-editing/EditForm.js.map +1 -0
  5. package/cjs/data-editing/UnsavedChangesReport.css.js +6 -0
  6. package/cjs/data-editing/UnsavedChangesReport.css.js.map +1 -0
  7. package/cjs/data-editing/UnsavedChangesReport.js +29 -0
  8. package/cjs/data-editing/UnsavedChangesReport.js.map +1 -0
  9. package/cjs/data-editing/edit-rule-validation-checker.js +41 -0
  10. package/cjs/data-editing/edit-rule-validation-checker.js.map +1 -0
  11. package/cjs/data-editing/edit-validation-rules.js +52 -0
  12. package/cjs/data-editing/edit-validation-rules.js.map +1 -0
  13. package/cjs/data-editing/form-edit-state.js +26 -0
  14. package/cjs/data-editing/form-edit-state.js.map +1 -0
  15. package/cjs/data-editing/get-data-item-edit-control.js +56 -0
  16. package/cjs/data-editing/get-data-item-edit-control.js.map +1 -0
  17. package/cjs/data-editing/useEditForm.js +249 -0
  18. package/cjs/data-editing/useEditForm.js.map +1 -0
  19. package/cjs/datasource-provider/RestDataSourceProvider.js +78 -0
  20. package/cjs/datasource-provider/RestDataSourceProvider.js.map +1 -0
  21. package/cjs/datasource-provider/VuuDataSourceProvider.js +34 -0
  22. package/cjs/datasource-provider/VuuDataSourceProvider.js.map +1 -0
  23. package/cjs/datasource-provider/useAutoLoginToVuuServer.js +54 -0
  24. package/cjs/datasource-provider/useAutoLoginToVuuServer.js.map +1 -0
  25. package/cjs/hooks/useLookupValues.js +100 -0
  26. package/cjs/hooks/useLookupValues.js.map +1 -0
  27. package/cjs/hooks/useSessionDataSource.js +72 -0
  28. package/cjs/hooks/useSessionDataSource.js.map +1 -0
  29. package/cjs/hooks/useTypeaheadSuggestions.js +41 -0
  30. package/cjs/hooks/useTypeaheadSuggestions.js.map +1 -0
  31. package/cjs/hooks/useVisualLinks.js +83 -0
  32. package/cjs/hooks/useVisualLinks.js.map +1 -0
  33. package/cjs/hooks/useVuuMenuActions.js +362 -0
  34. package/cjs/hooks/useVuuMenuActions.js.map +1 -0
  35. package/cjs/hooks/useVuuTables.js +38 -0
  36. package/cjs/hooks/useVuuTables.js.map +1 -0
  37. package/cjs/index.js +40 -1556
  38. package/cjs/index.js.map +1 -1
  39. package/cjs/session-editing-form/SessionEditingForm.css.js +6 -0
  40. package/cjs/session-editing-form/SessionEditingForm.css.js.map +1 -0
  41. package/cjs/session-editing-form/SessionEditingForm.js +269 -0
  42. package/cjs/session-editing-form/SessionEditingForm.js.map +1 -0
  43. package/esm/data-editing/EditForm.css.js +4 -0
  44. package/esm/data-editing/EditForm.css.js.map +1 -0
  45. package/esm/data-editing/EditForm.js +88 -0
  46. package/esm/data-editing/EditForm.js.map +1 -0
  47. package/esm/data-editing/UnsavedChangesReport.css.js +4 -0
  48. package/esm/data-editing/UnsavedChangesReport.css.js.map +1 -0
  49. package/esm/data-editing/UnsavedChangesReport.js +27 -0
  50. package/esm/data-editing/UnsavedChangesReport.js.map +1 -0
  51. package/esm/data-editing/edit-rule-validation-checker.js +37 -0
  52. package/esm/data-editing/edit-rule-validation-checker.js.map +1 -0
  53. package/esm/data-editing/edit-validation-rules.js +50 -0
  54. package/esm/data-editing/edit-validation-rules.js.map +1 -0
  55. package/esm/data-editing/form-edit-state.js +23 -0
  56. package/esm/data-editing/form-edit-state.js.map +1 -0
  57. package/esm/data-editing/get-data-item-edit-control.js +54 -0
  58. package/esm/data-editing/get-data-item-edit-control.js.map +1 -0
  59. package/esm/data-editing/useEditForm.js +247 -0
  60. package/esm/data-editing/useEditForm.js.map +1 -0
  61. package/esm/datasource-provider/RestDataSourceProvider.js +75 -0
  62. package/esm/datasource-provider/RestDataSourceProvider.js.map +1 -0
  63. package/esm/datasource-provider/VuuDataSourceProvider.js +32 -0
  64. package/esm/datasource-provider/VuuDataSourceProvider.js.map +1 -0
  65. package/esm/datasource-provider/useAutoLoginToVuuServer.js +52 -0
  66. package/esm/datasource-provider/useAutoLoginToVuuServer.js.map +1 -0
  67. package/esm/hooks/useLookupValues.js +98 -0
  68. package/esm/hooks/useLookupValues.js.map +1 -0
  69. package/esm/hooks/useSessionDataSource.js +70 -0
  70. package/esm/hooks/useSessionDataSource.js.map +1 -0
  71. package/esm/hooks/useTypeaheadSuggestions.js +38 -0
  72. package/esm/hooks/useTypeaheadSuggestions.js.map +1 -0
  73. package/esm/hooks/useVisualLinks.js +81 -0
  74. package/esm/hooks/useVisualLinks.js.map +1 -0
  75. package/esm/hooks/useVuuMenuActions.js +358 -0
  76. package/esm/hooks/useVuuMenuActions.js.map +1 -0
  77. package/esm/hooks/useVuuTables.js +36 -0
  78. package/esm/hooks/useVuuTables.js.map +1 -0
  79. package/esm/index.js +15 -1535
  80. package/esm/index.js.map +1 -1
  81. package/esm/session-editing-form/SessionEditingForm.css.js +4 -0
  82. package/esm/session-editing-form/SessionEditingForm.css.js.map +1 -0
  83. package/esm/session-editing-form/SessionEditingForm.js +267 -0
  84. package/esm/session-editing-form/SessionEditingForm.js.map +1 -0
  85. package/package.json +14 -14
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEditForm.js","sources":["../../src/data-editing/useEditForm.tsx"],"sourcesContent":["import type { DataSource, DataValueDescriptor } from \"@vuu-ui/vuu-data-types\";\nimport { useDialogContext } from \"@vuu-ui/vuu-popups\";\nimport type { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n CommitHandler,\n Entity,\n Range,\n buildColumnMap,\n dataSourceRowToEntity,\n messageHasDataRows,\n queryClosest,\n viewportRpcRequest,\n} from \"@vuu-ui/vuu-utils\";\nimport { Button } from \"@salt-ds/core\";\nimport {\n FocusEventHandler,\n SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { UnsavedChangesReport } from \"./UnsavedChangesReport\";\nimport {\n buildValidationChecker,\n getEditValidationRules,\n} from \"./edit-rule-validation-checker\";\nimport {\n CLEAN_FORM,\n FormEditState,\n buildFormEditState,\n} from \"./form-edit-state\";\n\nexport interface EditFormHookProps {\n dataSource?: DataSource;\n formFieldDescriptors: DataValueDescriptor[];\n onSubmit?: () => void;\n}\n\ntype ValidationState = {\n ok: boolean;\n messages: Record<string, string>;\n};\n\nconst CLEAN_VALIDATION: ValidationState = {\n ok: true,\n messages: {},\n};\n\nconst getValidationChecker = (\n descriptor: DataValueDescriptor,\n editPhase: \"change\" | \"commit\",\n) => {\n const rules = getEditValidationRules(descriptor, editPhase) ?? [];\n return buildValidationChecker(rules);\n};\n\nconst nextValidationState = (\n state: ValidationState,\n dataDescriptor: DataValueDescriptor,\n value: VuuRowDataItemType,\n): ValidationState => {\n const check = getValidationChecker(dataDescriptor, \"change\");\n const result = check(value, \"change\");\n const { name } = dataDescriptor;\n\n const { ok: wasOk, messages: existingMessages } = state;\n\n if (result.ok) {\n if (!wasOk) {\n // if this field was the only one in error, the overall state\n // will now be ok, but not if there is still one or more other\n // field still in error.\n const fieldsInError = Object.keys(existingMessages);\n if (fieldsInError.includes(name)) {\n if (fieldsInError.length === 1) {\n return { ok: true, messages: {} };\n } else {\n const messages = { ...existingMessages };\n delete messages[name];\n return { ok: false, messages };\n }\n }\n }\n } else {\n return {\n ok: false,\n messages: {\n ...existingMessages,\n [name]: result.messages.join(\"\\n\"),\n },\n };\n }\n\n return state;\n};\n\nfunction find(descriptors: DataValueDescriptor[], fieldname: string) {\n const d = descriptors.find(({ name }) => name === fieldname);\n if (d) {\n return d;\n }\n throw Error(`DataValueDescriptor not found for field ${fieldname}`);\n}\n\nconst getField = (target: EventTarget | HTMLElement) => {\n const fieldElement = queryClosest(target, \"[data-field]\");\n if (fieldElement) {\n return fieldElement.dataset.field as string;\n } else {\n throw Error(\"no field \");\n }\n};\n\ntype Resolver = (value: unknown) => void;\n\nexport const useEditForm = ({\n dataSource,\n formFieldDescriptors,\n onSubmit,\n}: EditFormHookProps) => {\n const { showDialog, closeDialog } = useDialogContext();\n\n const currentDataSource = useRef<DataSource>(undefined);\n const formFieldsContainerRef = useRef<HTMLDivElement>(null);\n const entityRef = useRef<Entity>(undefined);\n const focusedFieldRef = useRef(\"\");\n const originalEntityRef = useRef<Entity>(undefined);\n const formEditStateRef = useRef<FormEditState>(CLEAN_FORM);\n const validationStateRef = useRef<ValidationState>({\n ok: true,\n messages: {},\n });\n\n const [entity, _setEntity] = useState<Entity>();\n const [, forceUpdate] = useState({});\n\n const setFormEditState = useCallback((newState: FormEditState) => {\n formEditStateRef.current = newState;\n }, []);\n\n const setEntity = useCallback(\n (newEntity: Entity) => {\n setFormEditState(\n buildFormEditState(originalEntityRef.current, newEntity),\n );\n entityRef.current = newEntity;\n _setEntity(newEntity);\n },\n [setFormEditState],\n );\n\n const submitChanges = useCallback(async () => {\n const rpcResponse = await currentDataSource.current?.rpcCall?.(\n viewportRpcRequest(\"VP_BULK_EDIT_SUBMIT_RPC\"),\n );\n console.log({ rpcResponse });\n }, []);\n\n const showSaveOrDiscardPrompt = useCallback(async () => {\n const { current: currentEntity } = entityRef;\n const { current: originalEntity } = originalEntityRef;\n let resolver: Resolver | undefined = undefined;\n const save = async () => {\n await submitChanges();\n closeDialog();\n resolver?.(\"saved\");\n };\n\n const discard = () => {\n closeDialog();\n resolver?.(\"discarded\");\n };\n\n requestAnimationFrame(() => {\n showDialog(\n <UnsavedChangesReport\n entity={originalEntity as Entity}\n editedEntity={currentEntity as Entity}\n />,\n \"Unsaved Changes\",\n [\n <Button key=\"cancel\" onClick={discard}>\n Discard Changes\n </Button>,\n <Button key=\"submit\" onClick={save}>\n Save Changes\n </Button>,\n ],\n true, // hideCloseButton\n );\n });\n\n return new Promise((resolve) => {\n resolver = resolve;\n });\n }, [closeDialog, showDialog, submitChanges]);\n\n useMemo(async () => {\n if (dataSource) {\n if (formEditStateRef.current.isClean === false) {\n await showSaveOrDiscardPrompt();\n }\n\n currentDataSource.current = dataSource;\n\n originalEntityRef.current = undefined;\n\n const columnMap = buildColumnMap(dataSource.columns);\n\n dataSource?.subscribe({ range: Range(0, 1) }, (message) => {\n if (messageHasDataRows(message)) {\n const [row] = message.rows;\n if (row) {\n const entity = dataSourceRowToEntity(row, columnMap);\n if (originalEntityRef.current === undefined) {\n originalEntityRef.current = entity;\n setEntity(entity);\n }\n\n const { editedFields } = buildFormEditState(\n entityRef.current,\n entity,\n );\n\n // for controls which do not yield incremental changes, e.g dropdown, calendar\n // we apply the server update to our entity.\n if (editedFields.length === 1) {\n setEntity(entity);\n }\n\n // Do not overwrite entity here, just check that values returned by server\n // match whats expected\n }\n }\n });\n }\n }, [dataSource, setEntity, showSaveOrDiscardPrompt]);\n\n const setValidationState = useCallback((state: ValidationState) => {\n validationStateRef.current = state;\n forceUpdate({});\n }, []);\n\n const handleFieldCommit = useCallback<CommitHandler<HTMLElement>>(\n (_, value) => {\n const { current: fieldName } = focusedFieldRef;\n const dataDescriptor = find(formFieldDescriptors, fieldName);\n\n const { current: state } = validationStateRef;\n const newState = nextValidationState(state, dataDescriptor, value);\n if (newState !== state) {\n setValidationState(newState);\n }\n\n if (newState.ok && dataSource?.tableSchema) {\n const { key } = dataSource.tableSchema;\n const keyValue = entity?.[key] as string;\n dataSource\n ?.applyEdit(keyValue, fieldName, value)\n .then((rpcResponse) => {\n console.log({ rpcResponse });\n });\n }\n },\n [dataSource, entity, formFieldDescriptors, setValidationState],\n );\n\n const handleFieldChange = useCallback(\n (evt: SyntheticEvent<HTMLInputElement>) => {\n const { current: fieldName } = focusedFieldRef;\n if (fieldName) {\n const input = queryClosest<HTMLInputElement>(evt.target, \"input\", true);\n const dataDescriptor = find(formFieldDescriptors, fieldName);\n const value = input.value as string;\n const { current: state } = validationStateRef;\n const newState = nextValidationState(state, dataDescriptor, value);\n if (newState !== state) {\n setValidationState(newState);\n }\n\n setEntity({ ...entity, [fieldName]: value });\n }\n },\n [entity, formFieldDescriptors, setEntity, setValidationState],\n );\n\n const handleFormSubmit = useCallback(async () => {\n submitChanges();\n setFormEditState(CLEAN_FORM);\n originalEntityRef.current = entity;\n onSubmit?.();\n forceUpdate({});\n }, [entity, onSubmit, setFormEditState, submitChanges]);\n\n const handleFormCancel = useCallback(async () => {\n // const rpcResponse = await dataSource?.rpcCall?.(\n // viewportRpcRequest(\"VP_BULK_EDIT_CANCEL_RPC\"),\n // );\n setFormEditState(CLEAN_FORM);\n setValidationState(CLEAN_VALIDATION);\n // console.log({ rpcResponse });\n setEntity(originalEntityRef.current as Entity);\n }, [setEntity, setFormEditState, setValidationState]);\n\n const handleFocus = useCallback<FocusEventHandler>((evt) => {\n // Ignore focus on popup Calendars, Lists etc\n if (formFieldsContainerRef.current?.contains(evt.target)) {\n const fieldName = getField(evt.target);\n if (fieldName) {\n if (fieldName) {\n focusedFieldRef.current = fieldName;\n }\n }\n }\n }, []);\n\n const {\n current: { ok, messages: errorMessages },\n } = validationStateRef;\n\n const {\n current: { isClean, editedFields },\n } = formEditStateRef;\n\n return {\n editedFields,\n editEntity: entity,\n errorMessages,\n formFieldsContainerRef,\n isClean,\n ok,\n onCancel: handleFormCancel,\n onChange: handleFieldChange,\n onCommit: handleFieldCommit,\n onFocus: handleFocus,\n onSubmit: handleFormSubmit,\n };\n};\n"],"names":["getEditValidationRules","buildValidationChecker","queryClosest","useDialogContext","useRef","CLEAN_FORM","useState","useCallback","buildFormEditState","viewportRpcRequest","jsx","UnsavedChangesReport","Button","useMemo","buildColumnMap","Range","messageHasDataRows","entity","dataSourceRowToEntity","editedFields"],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuDataRemote = require('@vuu-ui/vuu-data-remote');
5
+ var vuuUtils = require('@vuu-ui/vuu-utils');
6
+
7
+ const serverAPI = (schemas) => ({
8
+ getTableList: async () => {
9
+ if (schemas) {
10
+ return {
11
+ tables: Object.keys(schemas).map((key) => {
12
+ const [module, table] = key.split(":");
13
+ return { module, table };
14
+ })
15
+ };
16
+ } else {
17
+ console.log(`Rest data source does not yet support table list`);
18
+ return { tables: [] };
19
+ }
20
+ },
21
+ getTableSchema: async ({ module, table }) => {
22
+ const schema = schemas?.[`${module}:${table}`];
23
+ if (schema) {
24
+ return schema;
25
+ } else {
26
+ throw Error(
27
+ `Rest data source does not yet support table schema (${table})`
28
+ );
29
+ }
30
+ },
31
+ rpcCall: async (message) => Promise.reject(
32
+ Error(`Rest data source does not yet support RPC (${message.type})`)
33
+ )
34
+ });
35
+ const getServerAPI = (schemas) => async () => serverAPI(schemas);
36
+ const isRestDataSourceExtension = (o) => {
37
+ return vuuUtils.isObject(o) && "createHttpHeaders" in o && typeof o["createHttpHeaders"] === "function";
38
+ };
39
+ const getRestDataSourceClass = ({
40
+ createHttpHeaders
41
+ }) => {
42
+ if (createHttpHeaders) {
43
+ return class ExtendedClass extends vuuDataRemote.RestDataSource {
44
+ constructor(props) {
45
+ super(props);
46
+ }
47
+ get httpHeaders() {
48
+ return createHttpHeaders();
49
+ }
50
+ };
51
+ } else {
52
+ return vuuDataRemote.RestDataSource;
53
+ }
54
+ };
55
+ const RestDataSourceProvider = ({
56
+ children,
57
+ createHttpHeaders,
58
+ tableSchemas,
59
+ url
60
+ }) => {
61
+ vuuDataRemote.RestDataSource.api = url;
62
+ const restDataSourceClass = getRestDataSourceClass({ createHttpHeaders });
63
+ return /* @__PURE__ */ jsxRuntime.jsx(
64
+ vuuUtils.DataProvider,
65
+ {
66
+ VuuDataSource: restDataSourceClass,
67
+ dataSourceExtensions: { createHttpHeaders },
68
+ getServerAPI: getServerAPI(tableSchemas),
69
+ isLocalData: false,
70
+ tableSchemas,
71
+ children
72
+ }
73
+ );
74
+ };
75
+
76
+ exports.RestDataSourceProvider = RestDataSourceProvider;
77
+ exports.isRestDataSourceExtension = isRestDataSourceExtension;
78
+ //# sourceMappingURL=RestDataSourceProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RestDataSourceProvider.js","sources":["../../src/datasource-provider/RestDataSourceProvider.tsx"],"sourcesContent":["import { RestDataSource } from \"@vuu-ui/vuu-data-remote\";\nimport {\n DataSourceConstructorProps,\n ServerAPI,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n VuuRpcMenuRequest,\n VuuRpcServiceRequest,\n VuuRpcViewportRequest,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { DataProvider, isObject } from \"@vuu-ui/vuu-utils\";\nimport { ReactNode } from \"react\";\n\nconst serverAPI = (\n schemas?: Record<string, TableSchema>,\n): Pick<ServerAPI, \"getTableList\" | \"getTableSchema\" | \"rpcCall\"> => ({\n getTableList: async () => {\n if (schemas) {\n return {\n tables: Object.keys(schemas).map((key) => {\n const [module, table] = key.split(\":\");\n return { module, table };\n }),\n };\n } else {\n console.log(`Rest data source does not yet support table list`);\n return { tables: [] };\n }\n },\n getTableSchema: async ({ module, table }: VuuTable) => {\n const schema = schemas?.[`${module}:${table}`];\n if (schema) {\n return schema;\n } else {\n throw Error(\n `Rest data source does not yet support table schema (${table})`,\n );\n }\n },\n rpcCall: async (\n message:\n | VuuRpcServiceRequest\n | VuuRpcMenuRequest\n | VuuRpcViewportRequest\n | VuuCreateVisualLink\n | VuuRemoveVisualLink,\n ) =>\n Promise.reject(\n Error(`Rest data source does not yet support RPC (${message.type})`),\n ),\n});\n\nconst getServerAPI = (schemas?: Record<string, TableSchema>) => async () =>\n serverAPI(schemas);\n\nexport type RestDataSourceExtension = {\n createHttpHeaders?: () => Headers;\n};\n\nexport const isRestDataSourceExtension = (\n o?: unknown,\n): o is RestDataSourceExtension => {\n return (\n isObject(o) &&\n \"createHttpHeaders\" in o &&\n typeof o[\"createHttpHeaders\"] === \"function\"\n );\n};\n\nconst getRestDataSourceClass = ({\n createHttpHeaders,\n}: RestDataSourceExtension) => {\n if (createHttpHeaders) {\n return class ExtendedClass extends RestDataSource {\n constructor(props: DataSourceConstructorProps) {\n super(props);\n }\n get httpHeaders(): Headers | undefined {\n return createHttpHeaders();\n }\n };\n } else {\n return RestDataSource;\n }\n};\n\nexport const RestDataSourceProvider = ({\n children,\n createHttpHeaders,\n tableSchemas,\n url,\n}: {\n children: ReactNode;\n tableSchemas?: Record<string, TableSchema>;\n url: string;\n} & RestDataSourceExtension) => {\n RestDataSource.api = url;\n\n const restDataSourceClass = getRestDataSourceClass({ createHttpHeaders });\n\n return (\n <DataProvider\n VuuDataSource={restDataSourceClass}\n dataSourceExtensions={{ createHttpHeaders }}\n getServerAPI={getServerAPI(tableSchemas)}\n isLocalData={false}\n tableSchemas={tableSchemas}\n >\n {children}\n </DataProvider>\n );\n};\n"],"names":["isObject","RestDataSource","jsx","DataProvider"],"mappings":";;;;;;AAiBA,MAAM,SAAA,GAAY,CAChB,OACoE,MAAA;AAAA,EACpE,cAAc,YAAY;AACxB,IAAA,IAAI,OAAS,EAAA;AACX,MAAO,OAAA;AAAA,QACL,QAAQ,MAAO,CAAA,IAAA,CAAK,OAAO,CAAE,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA;AACxC,UAAA,MAAM,CAAC,MAAQ,EAAA,KAAK,CAAI,GAAA,GAAA,CAAI,MAAM,GAAG,CAAA;AACrC,UAAO,OAAA,EAAE,QAAQ,KAAM,EAAA;AAAA,SACxB;AAAA,OACH;AAAA,KACK,MAAA;AACL,MAAA,OAAA,CAAQ,IAAI,CAAkD,gDAAA,CAAA,CAAA;AAC9D,MAAO,OAAA,EAAE,MAAQ,EAAA,EAAG,EAAA;AAAA;AACtB,GACF;AAAA,EACA,cAAgB,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAsB,KAAA;AACrD,IAAA,MAAM,SAAS,OAAU,GAAA,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAK,CAAE,CAAA,CAAA;AAC7C,IAAA,IAAI,MAAQ,EAAA;AACV,MAAO,OAAA,MAAA;AAAA,KACF,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,uDAAuD,KAAK,CAAA,CAAA;AAAA,OAC9D;AAAA;AACF,GACF;AAAA,EACA,OAAA,EAAS,OACP,OAAA,KAOA,OAAQ,CAAA,MAAA;AAAA,IACN,KAAM,CAAA,CAAA,2CAAA,EAA8C,OAAQ,CAAA,IAAI,CAAG,CAAA,CAAA;AAAA;AAEzE,CAAA,CAAA;AAEA,MAAM,YAAe,GAAA,CAAC,OAA0C,KAAA,YAC9D,UAAU,OAAO,CAAA;AAMN,MAAA,yBAAA,GAA4B,CACvC,CACiC,KAAA;AACjC,EACE,OAAAA,iBAAA,CAAS,CAAC,CACV,IAAA,mBAAA,IAAuB,KACvB,OAAO,CAAA,CAAE,mBAAmB,CAAM,KAAA,UAAA;AAEtC;AAEA,MAAM,yBAAyB,CAAC;AAAA,EAC9B;AACF,CAA+B,KAAA;AAC7B,EAAA,IAAI,iBAAmB,EAAA;AACrB,IAAO,OAAA,MAAM,sBAAsBC,4BAAe,CAAA;AAAA,MAChD,YAAY,KAAmC,EAAA;AAC7C,QAAA,KAAA,CAAM,KAAK,CAAA;AAAA;AACb,MACA,IAAI,WAAmC,GAAA;AACrC,QAAA,OAAO,iBAAkB,EAAA;AAAA;AAC3B,KACF;AAAA,GACK,MAAA;AACL,IAAO,OAAAA,4BAAA;AAAA;AAEX,CAAA;AAEO,MAAM,yBAAyB,CAAC;AAAA,EACrC,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAIgC,KAAA;AAC9B,EAAAA,4BAAA,CAAe,GAAM,GAAA,GAAA;AAErB,EAAA,MAAM,mBAAsB,GAAA,sBAAA,CAAuB,EAAE,iBAAA,EAAmB,CAAA;AAExE,EACE,uBAAAC,cAAA;AAAA,IAACC,qBAAA;AAAA,IAAA;AAAA,MACC,aAAe,EAAA,mBAAA;AAAA,MACf,oBAAA,EAAsB,EAAE,iBAAkB,EAAA;AAAA,MAC1C,YAAA,EAAc,aAAa,YAAY,CAAA;AAAA,MACvC,WAAa,EAAA,KAAA;AAAA,MACb,YAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;;;;;"}
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuDataRemote = require('@vuu-ui/vuu-data-remote');
5
+ var vuuUtils = require('@vuu-ui/vuu-utils');
6
+ var useAutoLoginToVuuServer = require('./useAutoLoginToVuuServer.js');
7
+
8
+ const getServerAPI = () => vuuDataRemote.ConnectionManager.serverAPI;
9
+ const VuuDataSourceProvider = ({
10
+ authenticate,
11
+ autoConnect = false,
12
+ autoLogin = false,
13
+ children,
14
+ websocketUrl
15
+ }) => {
16
+ useAutoLoginToVuuServer.useAutoLoginToVuuServer({
17
+ authenticate,
18
+ autoConnect,
19
+ autoLogin,
20
+ websocketUrl
21
+ });
22
+ return /* @__PURE__ */ jsxRuntime.jsx(
23
+ vuuUtils.DataProvider,
24
+ {
25
+ VuuDataSource: vuuDataRemote.VuuDataSource,
26
+ getServerAPI,
27
+ isLocalData: false,
28
+ children
29
+ }
30
+ );
31
+ };
32
+
33
+ exports.VuuDataSourceProvider = VuuDataSourceProvider;
34
+ //# sourceMappingURL=VuuDataSourceProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VuuDataSourceProvider.js","sources":["../../src/datasource-provider/VuuDataSourceProvider.tsx"],"sourcesContent":["import { ConnectionManager, VuuDataSource } from \"@vuu-ui/vuu-data-remote\";\nimport { DataProvider } from \"@vuu-ui/vuu-utils\";\nimport { ReactNode } from \"react\";\nimport { useAutoLoginToVuuServer } from \"./useAutoLoginToVuuServer\";\n\nconst getServerAPI = () => ConnectionManager.serverAPI;\n\nexport const VuuDataSourceProvider = ({\n authenticate,\n autoConnect = false,\n autoLogin = false,\n children,\n websocketUrl,\n}: {\n authenticate?: boolean;\n autoConnect?: boolean;\n autoLogin?: boolean;\n children: ReactNode;\n websocketUrl?: string;\n}) => {\n useAutoLoginToVuuServer({\n authenticate,\n autoConnect,\n autoLogin,\n websocketUrl,\n });\n return (\n <DataProvider\n VuuDataSource={VuuDataSource}\n getServerAPI={getServerAPI}\n isLocalData={false}\n >\n {children}\n </DataProvider>\n );\n};\n"],"names":["ConnectionManager","useAutoLoginToVuuServer","jsx","DataProvider","VuuDataSource"],"mappings":";;;;;;;AAKA,MAAM,YAAA,GAAe,MAAMA,+BAAkB,CAAA,SAAA;AAEtC,MAAM,wBAAwB,CAAC;AAAA,EACpC,YAAA;AAAA,EACA,WAAc,GAAA,KAAA;AAAA,EACd,SAAY,GAAA,KAAA;AAAA,EACZ,QAAA;AAAA,EACA;AACF,CAMM,KAAA;AACJ,EAAwBC,+CAAA,CAAA;AAAA,IACtB,YAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EACE,uBAAAC,cAAA;AAAA,IAACC,qBAAA;AAAA,IAAA;AAAA,qBACCC,2BAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAa,EAAA,KAAA;AAAA,MAEZ;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuDataRemote = require('@vuu-ui/vuu-data-remote');
5
+ var react = require('react');
6
+
7
+ const useAutoLoginToVuuServer = ({
8
+ authenticate = true,
9
+ autoConnect = true,
10
+ // autoLogin = true,
11
+ secure = true,
12
+ websocketUrl
13
+ } = {}) => {
14
+ const [errorMessage, setErrorMessage] = react.useState("");
15
+ react.useEffect(() => {
16
+ const connect = async () => {
17
+ try {
18
+ let token = "no-token";
19
+ if (authenticate) {
20
+ token = await vuuDataRemote.authenticate(
21
+ "steve",
22
+ "xyz",
23
+ "/api/authn"
24
+ );
25
+ }
26
+ const url = websocketUrl ?? `${secure ? "wss" : "ws"}://localhost/8090/websocket`;
27
+ vuuDataRemote.ConnectionManager.connect({
28
+ url,
29
+ token,
30
+ username: "steve"
31
+ });
32
+ } catch (e) {
33
+ if (e instanceof Error) {
34
+ console.error(e.message);
35
+ setErrorMessage(e.message);
36
+ }
37
+ }
38
+ };
39
+ if (autoConnect) {
40
+ connect();
41
+ }
42
+ return () => {
43
+ if (autoConnect) {
44
+ vuuDataRemote.ConnectionManager.disconnect();
45
+ }
46
+ };
47
+ }, [authenticate, autoConnect, secure, websocketUrl]);
48
+ if (errorMessage) {
49
+ return /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Unable to authenticate against Vuu Server A Vuu Server instance must be running to show this example." });
50
+ }
51
+ };
52
+
53
+ exports.useAutoLoginToVuuServer = useAutoLoginToVuuServer;
54
+ //# sourceMappingURL=useAutoLoginToVuuServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAutoLoginToVuuServer.js","sources":["../../src/datasource-provider/useAutoLoginToVuuServer.tsx"],"sourcesContent":["import {\n authenticate as vuuAuthenticate,\n ConnectionManager,\n} from \"@vuu-ui/vuu-data-remote\";\nimport { useEffect, useState } from \"react\";\n\nexport const useAutoLoginToVuuServer = ({\n authenticate = true,\n autoConnect = true,\n // autoLogin = true,\n secure = true,\n websocketUrl,\n}: {\n authenticate?: boolean;\n autoConnect?: boolean;\n autoLogin?: boolean;\n secure?: boolean;\n websocketUrl?: string;\n} = {}) => {\n const [errorMessage, setErrorMessage] = useState(\"\");\n useEffect(() => {\n const connect = async () => {\n try {\n let token = \"no-token\";\n if (authenticate) {\n token = (await vuuAuthenticate(\n \"steve\",\n \"xyz\",\n \"/api/authn\",\n )) as string;\n }\n\n const url =\n websocketUrl ?? `${secure ? \"wss\" : \"ws\"}://localhost/8090/websocket`;\n\n ConnectionManager.connect({\n url,\n token,\n username: \"steve\",\n });\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.error(e.message);\n setErrorMessage(e.message);\n }\n }\n };\n if (autoConnect) {\n connect();\n }\n\n return () => {\n if (autoConnect) {\n ConnectionManager.disconnect();\n }\n };\n }, [authenticate, autoConnect, secure, websocketUrl]);\n\n if (errorMessage) {\n return (\n <p>\n Unable to authenticate against Vuu Server A Vuu Server instance must be\n running to show this example.\n </p>\n );\n }\n};\n"],"names":["useState","useEffect","vuuAuthenticate","ConnectionManager","jsx"],"mappings":";;;;;;AAMO,MAAM,0BAA0B,CAAC;AAAA,EACtC,YAAe,GAAA,IAAA;AAAA,EACf,WAAc,GAAA,IAAA;AAAA;AAAA,EAEd,MAAS,GAAA,IAAA;AAAA,EACT;AACF,CAAA,GAMI,EAAO,KAAA;AACT,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,EAAE,CAAA;AACnD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,YAAY;AAC1B,MAAI,IAAA;AACF,QAAA,IAAI,KAAQ,GAAA,UAAA;AACZ,QAAA,IAAI,YAAc,EAAA;AAChB,UAAA,KAAA,GAAS,MAAMC,0BAAA;AAAA,YACb,OAAA;AAAA,YACA,KAAA;AAAA,YACA;AAAA,WACF;AAAA;AAGF,QAAA,MAAM,GACJ,GAAA,YAAA,IAAgB,CAAG,EAAA,MAAA,GAAS,QAAQ,IAAI,CAAA,2BAAA,CAAA;AAE1C,QAAAC,+BAAA,CAAkB,OAAQ,CAAA;AAAA,UACxB,GAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAU,EAAA;AAAA,SACX,CAAA;AAAA,eACM,CAAY,EAAA;AACnB,QAAA,IAAI,aAAa,KAAO,EAAA;AACtB,UAAQ,OAAA,CAAA,KAAA,CAAM,EAAE,OAAO,CAAA;AACvB,UAAA,eAAA,CAAgB,EAAE,OAAO,CAAA;AAAA;AAC3B;AACF,KACF;AACA,IAAA,IAAI,WAAa,EAAA;AACf,MAAQ,OAAA,EAAA;AAAA;AAGV,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,WAAa,EAAA;AACf,QAAAA,+BAAA,CAAkB,UAAW,EAAA;AAAA;AAC/B,KACF;AAAA,KACC,CAAC,YAAA,EAAc,WAAa,EAAA,MAAA,EAAQ,YAAY,CAAC,CAAA;AAEpD,EAAA,IAAI,YAAc,EAAA;AAChB,IACE,uBAAAC,cAAA,CAAC,OAAE,QAGH,EAAA,uGAAA,EAAA,CAAA;AAAA;AAGN;;;;"}
@@ -0,0 +1,100 @@
1
+ 'use strict';
2
+
3
+ var vuuDataRemote = require('@vuu-ui/vuu-data-remote');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var react = require('react');
6
+
7
+ const NO_VALUES = [];
8
+ const toListOption = (value) => ({
9
+ label: value,
10
+ value
11
+ });
12
+ const lookupValueMap = /* @__PURE__ */ new Map();
13
+ const loadLookupValues = ({
14
+ labelColumn,
15
+ table,
16
+ valueColumn
17
+ }) => {
18
+ const tableKey = `${table.module}:${table.table}`;
19
+ const lookupValues = lookupValueMap.get(tableKey);
20
+ if (lookupValues) {
21
+ return lookupValues;
22
+ } else {
23
+ const promise = new Promise((resolve) => {
24
+ const columns = [valueColumn, labelColumn];
25
+ const columnMap = vuuUtils.buildColumnMap(columns);
26
+ const dataSource = new vuuDataRemote.VuuDataSource({
27
+ bufferSize: 0,
28
+ table
29
+ });
30
+ dataSource.subscribe(
31
+ {
32
+ columns,
33
+ range: vuuUtils.Range(0, 100)
34
+ },
35
+ (message) => {
36
+ if (message.type === "viewport-update") {
37
+ if (message.rows) {
38
+ const listOptions = message.rows.map((row) => ({
39
+ value: row[columnMap[valueColumn]],
40
+ label: row[columnMap[labelColumn]]
41
+ }));
42
+ resolve(listOptions);
43
+ dataSource.unsubscribe();
44
+ }
45
+ }
46
+ }
47
+ );
48
+ });
49
+ lookupValueMap.set(tableKey, promise);
50
+ return promise;
51
+ }
52
+ };
53
+ const getLookupDetails = ({ name, type }) => {
54
+ if (vuuUtils.isTypeDescriptor(type) && vuuUtils.isLookupRenderer(type.renderer)) {
55
+ return type.renderer.lookup;
56
+ } else {
57
+ throw Error(
58
+ `useLookupValues column ${name} is not configured to use lookup values`
59
+ );
60
+ }
61
+ };
62
+ const useLookupValues = (column, initialValueProp) => {
63
+ const { type: columnType } = column;
64
+ const { getLookupValues } = vuuUtils.useShellContext();
65
+ const initialState = react.useMemo(() => {
66
+ if (vuuUtils.isTypeDescriptor(columnType) && vuuUtils.isValueListRenderer(columnType?.renderer)) {
67
+ const values2 = columnType.renderer.values.map(toListOption);
68
+ return {
69
+ initialValue: vuuUtils.getSelectedOption(values2, initialValueProp) ?? null,
70
+ values: values2
71
+ };
72
+ } else {
73
+ const lookupDetails = getLookupDetails(column);
74
+ const values2 = getLookupValues?.(lookupDetails.table) ?? NO_VALUES;
75
+ return {
76
+ initialValue: vuuUtils.getSelectedOption(values2, initialValueProp) ?? null,
77
+ values: values2
78
+ };
79
+ }
80
+ }, [column, columnType, getLookupValues, initialValueProp]);
81
+ const [{ initialValue, values }, setLookupState] = react.useState(initialState);
82
+ react.useMemo(() => {
83
+ if (values === NO_VALUES) {
84
+ const lookupDetails = getLookupDetails(column);
85
+ loadLookupValues(lookupDetails).then(
86
+ (values2) => setLookupState({
87
+ initialValue: vuuUtils.getSelectedOption(values2, initialValueProp) ?? null,
88
+ values: values2
89
+ })
90
+ );
91
+ }
92
+ }, [values, column, initialValueProp]);
93
+ return {
94
+ initialValue,
95
+ values
96
+ };
97
+ };
98
+
99
+ exports.useLookupValues = useLookupValues;
100
+ //# sourceMappingURL=useLookupValues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLookupValues.js","sources":["../../src/hooks/useLookupValues.ts"],"sourcesContent":["import {\n ColumnDescriptor,\n ListOption,\n LookupTableDetails,\n} from \"@vuu-ui/vuu-table-types\";\nimport { VuuDataSource } from \"@vuu-ui/vuu-data-remote\";\nimport {\n buildColumnMap,\n getSelectedOption,\n isLookupRenderer,\n isTypeDescriptor,\n isValueListRenderer,\n Range,\n useShellContext,\n} from \"@vuu-ui/vuu-utils\";\nimport { useMemo, useState } from \"react\";\n\nconst NO_VALUES: ListOption[] = [];\n\nconst toListOption = (value: string): ListOption => ({\n label: value,\n value,\n});\n\nconst lookupValueMap = new Map<string, Promise<ListOption[]>>();\n\nconst loadLookupValues = ({\n labelColumn,\n table,\n valueColumn,\n}: LookupTableDetails): Promise<ListOption[]> => {\n const tableKey = `${table.module}:${table.table}`;\n const lookupValues = lookupValueMap.get(tableKey);\n if (lookupValues) {\n return lookupValues;\n } else {\n const promise: Promise<ListOption[]> = new Promise((resolve) => {\n const columns = [valueColumn, labelColumn];\n const columnMap = buildColumnMap(columns);\n const dataSource = new VuuDataSource({\n bufferSize: 0,\n table,\n });\n dataSource.subscribe(\n {\n columns,\n range: Range(0, 100),\n },\n (message) => {\n if (message.type === \"viewport-update\") {\n //TODO check we have full dataset\n if (message.rows) {\n const listOptions = message.rows.map<ListOption>((row) => ({\n value: row[columnMap[valueColumn]] as string | number,\n label: row[columnMap[labelColumn]] as string,\n }));\n resolve(listOptions);\n dataSource.unsubscribe();\n }\n }\n },\n );\n });\n lookupValueMap.set(tableKey, promise);\n return promise;\n }\n};\n\ntype LookupState = {\n initialValue: ListOption | null;\n values: ListOption[];\n};\n\nconst getLookupDetails = ({ name, type }: ColumnDescriptor) => {\n if (isTypeDescriptor(type) && isLookupRenderer(type.renderer)) {\n return type.renderer.lookup;\n } else {\n throw Error(\n `useLookupValues column ${name} is not configured to use lookup values`,\n );\n }\n};\n\nexport const useLookupValues = (\n column: ColumnDescriptor,\n initialValueProp: number | string,\n) => {\n const { type: columnType } = column;\n const { getLookupValues } = useShellContext();\n\n const initialState = useMemo<LookupState>(() => {\n if (\n isTypeDescriptor(columnType) &&\n isValueListRenderer(columnType?.renderer)\n ) {\n const values = columnType.renderer.values.map(toListOption);\n return {\n initialValue: getSelectedOption(values, initialValueProp) ?? null,\n values,\n };\n } else {\n const lookupDetails = getLookupDetails(column);\n const values = getLookupValues?.(lookupDetails.table) ?? NO_VALUES;\n\n return {\n initialValue: getSelectedOption(values, initialValueProp) ?? null,\n values,\n };\n }\n }, [column, columnType, getLookupValues, initialValueProp]);\n\n const [{ initialValue, values }, setLookupState] =\n useState<LookupState>(initialState);\n\n useMemo(() => {\n if (values === NO_VALUES) {\n const lookupDetails = getLookupDetails(column);\n loadLookupValues(lookupDetails).then((values) =>\n setLookupState({\n initialValue: getSelectedOption(values, initialValueProp) ?? null,\n values,\n }),\n );\n }\n }, [values, column, initialValueProp]);\n\n return {\n initialValue,\n values,\n };\n};\n"],"names":["buildColumnMap","VuuDataSource","Range","isTypeDescriptor","isLookupRenderer","useShellContext","useMemo","isValueListRenderer","values","getSelectedOption","useState"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ var vuuLayout = require('@vuu-ui/vuu-layout');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var react = require('react');
6
+
7
+ const NO_CONFIG = {};
8
+ const useSessionDataSource = ({
9
+ dataSourceSessionKey = "data-source",
10
+ tableSchema
11
+ }) => {
12
+ const { id, load, save, loadSession, saveSession, title } = vuuLayout.useViewContext();
13
+ const { VuuDataSource } = vuuUtils.useData();
14
+ const { "datasource-config": dataSourceConfigFromState } = react.useMemo(() => load?.() ?? NO_CONFIG, [load]);
15
+ const dataSourceConfigRef = react.useRef(
16
+ dataSourceConfigFromState
17
+ );
18
+ const handleDataSourceConfigChange = react.useCallback(
19
+ (config, _range, confirmed) => {
20
+ if (confirmed !== false) {
21
+ const { noChanges } = vuuUtils.isConfigChanged(
22
+ dataSourceConfigRef.current,
23
+ config
24
+ );
25
+ if (noChanges === false) {
26
+ dataSourceConfigRef.current = config;
27
+ save?.(config, "datasource-config");
28
+ }
29
+ }
30
+ },
31
+ [save]
32
+ );
33
+ const dataSource = react.useMemo(() => {
34
+ let ds = loadSession?.(dataSourceSessionKey);
35
+ if (ds) {
36
+ if (dataSourceConfigFromState) {
37
+ ds.applyConfig(dataSourceConfigFromState, true);
38
+ }
39
+ if (ds.range.from > 0) {
40
+ ds.range = ds.range.reset;
41
+ }
42
+ return ds;
43
+ }
44
+ const columns = dataSourceConfigFromState?.columns ?? tableSchema.columns.map((col) => col.name);
45
+ ds = new VuuDataSource({
46
+ // bufferSize: 0,
47
+ viewport: id,
48
+ table: tableSchema.table,
49
+ ...dataSourceConfigRef.current,
50
+ columns,
51
+ title
52
+ });
53
+ ds.on("config", handleDataSourceConfigChange);
54
+ saveSession?.(ds, "data-source");
55
+ return ds;
56
+ }, [
57
+ VuuDataSource,
58
+ dataSourceConfigFromState,
59
+ dataSourceSessionKey,
60
+ handleDataSourceConfigChange,
61
+ id,
62
+ loadSession,
63
+ saveSession,
64
+ tableSchema.columns,
65
+ tableSchema.table,
66
+ title
67
+ ]);
68
+ return dataSource;
69
+ };
70
+
71
+ exports.useSessionDataSource = useSessionDataSource;
72
+ //# sourceMappingURL=useSessionDataSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSessionDataSource.js","sources":["../../src/hooks/useSessionDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceConfig,\n DataSourceConfigChangeHandler,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { useViewContext } from \"@vuu-ui/vuu-layout\";\nimport type { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { isConfigChanged, useData } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\ntype SessionState = {\n \"datasource-config\"?: DataSourceConfig;\n};\n\nconst NO_CONFIG: SessionState = {};\n\nexport const useSessionDataSource = ({\n dataSourceSessionKey = \"data-source\",\n tableSchema,\n}: {\n dataSourceSessionKey?: string;\n tableSchema: TableSchema;\n}) => {\n const { id, load, save, loadSession, saveSession, title } = useViewContext();\n const { VuuDataSource } = useData();\n\n const { \"datasource-config\": dataSourceConfigFromState } =\n useMemo<SessionState>(() => load?.() ?? NO_CONFIG, [load]);\n\n const dataSourceConfigRef = useRef<DataSourceConfig | undefined>(\n dataSourceConfigFromState,\n );\n\n const handleDataSourceConfigChange =\n useCallback<DataSourceConfigChangeHandler>(\n (\n config: DataSourceConfig | undefined,\n _range: VuuRange,\n confirmed?: boolean,\n ) => {\n if (confirmed !== false) {\n const { noChanges } = isConfigChanged(\n dataSourceConfigRef.current,\n config,\n );\n if (noChanges === false) {\n dataSourceConfigRef.current = config;\n save?.(config, \"datasource-config\");\n }\n }\n },\n [save],\n );\n\n const dataSource: DataSource = useMemo(() => {\n let ds = loadSession?.(dataSourceSessionKey) as DataSource;\n if (ds) {\n if (dataSourceConfigFromState) {\n // this won't do anything if dataSource config already matches this\n // This is only really used when injecting a dataSource into session\n // state in Showcase examples\n // DO we definitely need this ? If not apply config can be provate\n ds.applyConfig(dataSourceConfigFromState, true);\n }\n\n if (ds.range.from > 0) {\n // UI does not currently restore scroll position, so always reset to top of dataset\n ds.range = ds.range.reset;\n }\n\n return ds;\n }\n\n const columns =\n dataSourceConfigFromState?.columns ??\n tableSchema.columns.map((col) => col.name);\n\n ds = new VuuDataSource({\n // bufferSize: 0,\n viewport: id,\n table: tableSchema.table,\n ...dataSourceConfigRef.current,\n columns,\n title,\n });\n ds.on(\"config\", handleDataSourceConfigChange);\n saveSession?.(ds, \"data-source\");\n return ds;\n }, [\n VuuDataSource,\n dataSourceConfigFromState,\n dataSourceSessionKey,\n handleDataSourceConfigChange,\n id,\n loadSession,\n saveSession,\n tableSchema.columns,\n tableSchema.table,\n title,\n ]);\n\n return dataSource;\n};\n"],"names":["useViewContext","useData","useMemo","useRef","useCallback","isConfigChanged"],"mappings":";;;;;;AAeA,MAAM,YAA0B,EAAC;AAE1B,MAAM,uBAAuB,CAAC;AAAA,EACnC,oBAAuB,GAAA,aAAA;AAAA,EACvB;AACF,CAGM,KAAA;AACJ,EAAM,MAAA,EAAE,IAAI,IAAM,EAAA,IAAA,EAAM,aAAa,WAAa,EAAA,KAAA,KAAUA,wBAAe,EAAA;AAC3E,EAAM,MAAA,EAAE,aAAc,EAAA,GAAIC,gBAAQ,EAAA;AAElC,EAAM,MAAA,EAAE,mBAAqB,EAAA,yBAAA,EAC3B,GAAAC,aAAA,CAAsB,MAAM,IAAA,IAAY,IAAA,SAAA,EAAW,CAAC,IAAI,CAAC,CAAA;AAE3D,EAAA,MAAM,mBAAsB,GAAAC,YAAA;AAAA,IAC1B;AAAA,GACF;AAEA,EAAA,MAAM,4BACJ,GAAAC,iBAAA;AAAA,IACE,CACE,MACA,EAAA,MAAA,EACA,SACG,KAAA;AACH,MAAA,IAAI,cAAc,KAAO,EAAA;AACvB,QAAM,MAAA,EAAE,WAAc,GAAAC,wBAAA;AAAA,UACpB,mBAAoB,CAAA,OAAA;AAAA,UACpB;AAAA,SACF;AACA,QAAA,IAAI,cAAc,KAAO,EAAA;AACvB,UAAA,mBAAA,CAAoB,OAAU,GAAA,MAAA;AAC9B,UAAA,IAAA,GAAO,QAAQ,mBAAmB,CAAA;AAAA;AACpC;AACF,KACF;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEF,EAAM,MAAA,UAAA,GAAyBH,cAAQ,MAAM;AAC3C,IAAI,IAAA,EAAA,GAAK,cAAc,oBAAoB,CAAA;AAC3C,IAAA,IAAI,EAAI,EAAA;AACN,MAAA,IAAI,yBAA2B,EAAA;AAK7B,QAAG,EAAA,CAAA,WAAA,CAAY,2BAA2B,IAAI,CAAA;AAAA;AAGhD,MAAI,IAAA,EAAA,CAAG,KAAM,CAAA,IAAA,GAAO,CAAG,EAAA;AAErB,QAAG,EAAA,CAAA,KAAA,GAAQ,GAAG,KAAM,CAAA,KAAA;AAAA;AAGtB,MAAO,OAAA,EAAA;AAAA;AAGT,IAAM,MAAA,OAAA,GACJ,2BAA2B,OAC3B,IAAA,WAAA,CAAY,QAAQ,GAAI,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,IAAI,CAAA;AAE3C,IAAA,EAAA,GAAK,IAAI,aAAc,CAAA;AAAA;AAAA,MAErB,QAAU,EAAA,EAAA;AAAA,MACV,OAAO,WAAY,CAAA,KAAA;AAAA,MACnB,GAAG,mBAAoB,CAAA,OAAA;AAAA,MACvB,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAG,EAAA,CAAA,EAAA,CAAG,UAAU,4BAA4B,CAAA;AAC5C,IAAA,WAAA,GAAc,IAAI,aAAa,CAAA;AAC/B,IAAO,OAAA,EAAA;AAAA,GACN,EAAA;AAAA,IACD,aAAA;AAAA,IACA,yBAAA;AAAA,IACA,oBAAA;AAAA,IACA,4BAAA;AAAA,IACA,EAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAY,CAAA,OAAA;AAAA,IACZ,WAAY,CAAA,KAAA;AAAA,IACZ;AAAA,GACD,CAAA;AAED,EAAO,OAAA,UAAA;AACT;;;;"}
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ var vuuUtils = require('@vuu-ui/vuu-utils');
4
+ var react = require('react');
5
+
6
+ const getTypeaheadParams = (table, column, text = "", selectedValues = []) => {
7
+ if (text !== "" && !selectedValues.includes(text.toLowerCase())) {
8
+ return [table, column, text];
9
+ }
10
+ return [table, column];
11
+ };
12
+ const useTypeaheadSuggestions = () => {
13
+ const { getServerAPI } = vuuUtils.useData();
14
+ return react.useCallback(
15
+ async (params) => {
16
+ const rpcMessage = params.length === 2 ? {
17
+ type: "RPC_CALL",
18
+ service: "TypeAheadRpcHandler",
19
+ method: "getUniqueFieldValues",
20
+ params
21
+ } : {
22
+ type: "RPC_CALL",
23
+ service: "TypeAheadRpcHandler",
24
+ method: "getUniqueFieldValuesStartingWith",
25
+ params
26
+ };
27
+ try {
28
+ const serverAPI = await getServerAPI();
29
+ const response = await serverAPI.rpcCall(rpcMessage);
30
+ return response;
31
+ } catch (err) {
32
+ return false;
33
+ }
34
+ },
35
+ [getServerAPI]
36
+ );
37
+ };
38
+
39
+ exports.getTypeaheadParams = getTypeaheadParams;
40
+ exports.useTypeaheadSuggestions = useTypeaheadSuggestions;
41
+ //# sourceMappingURL=useTypeaheadSuggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTypeaheadSuggestions.js","sources":["../../src/hooks/useTypeaheadSuggestions.ts"],"sourcesContent":["import { SuggestionFetcher, TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuRpcServiceRequest,\n TypeaheadParams,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useData } from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\n\nexport const getTypeaheadParams = (\n table: TableSchemaTable,\n column: string,\n text = \"\",\n selectedValues: string[] = [],\n): TypeaheadParams => {\n if (text !== \"\" && !selectedValues.includes(text.toLowerCase())) {\n return [table, column, text];\n }\n return [table, column];\n};\n\nexport const useTypeaheadSuggestions = () => {\n const { getServerAPI } = useData();\n return useCallback<SuggestionFetcher>(\n async (params: TypeaheadParams) => {\n const rpcMessage: VuuRpcServiceRequest =\n params.length === 2\n ? {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n method: \"getUniqueFieldValues\",\n params,\n }\n : {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n method: \"getUniqueFieldValuesStartingWith\",\n params,\n };\n\n try {\n const serverAPI = await getServerAPI();\n // We don't just return serverAPI.rpcCall . In the case of an\n // error we will be returning the rejected promise, bypassing\n // the catch block below.\n const response = await serverAPI.rpcCall<string[]>(rpcMessage);\n return response;\n } catch (err) {\n return false;\n }\n },\n [getServerAPI],\n );\n};\n"],"names":["useData","useCallback"],"mappings":";;;;;AAQa,MAAA,kBAAA,GAAqB,CAChC,KACA,EAAA,MAAA,EACA,OAAO,EACP,EAAA,cAAA,GAA2B,EACP,KAAA;AACpB,EAAI,IAAA,IAAA,KAAS,MAAM,CAAC,cAAA,CAAe,SAAS,IAAK,CAAA,WAAA,EAAa,CAAG,EAAA;AAC/D,IAAO,OAAA,CAAC,KAAO,EAAA,MAAA,EAAQ,IAAI,CAAA;AAAA;AAE7B,EAAO,OAAA,CAAC,OAAO,MAAM,CAAA;AACvB;AAEO,MAAM,0BAA0B,MAAM;AAC3C,EAAM,MAAA,EAAE,YAAa,EAAA,GAAIA,gBAAQ,EAAA;AACjC,EAAO,OAAAC,iBAAA;AAAA,IACL,OAAO,MAA4B,KAAA;AACjC,MAAM,MAAA,UAAA,GACJ,MAAO,CAAA,MAAA,KAAW,CACd,GAAA;AAAA,QACE,IAAM,EAAA,UAAA;AAAA,QACN,OAAS,EAAA,qBAAA;AAAA,QACT,MAAQ,EAAA,sBAAA;AAAA,QACR;AAAA,OAEF,GAAA;AAAA,QACE,IAAM,EAAA,UAAA;AAAA,QACN,OAAS,EAAA,qBAAA;AAAA,QACT,MAAQ,EAAA,kCAAA;AAAA,QACR;AAAA,OACF;AAEN,MAAI,IAAA;AACF,QAAM,MAAA,SAAA,GAAY,MAAM,YAAa,EAAA;AAIrC,QAAA,MAAM,QAAW,GAAA,MAAM,SAAU,CAAA,OAAA,CAAkB,UAAU,CAAA;AAC7D,QAAO,OAAA,QAAA;AAAA,eACA,GAAK,EAAA;AACZ,QAAO,OAAA,KAAA;AAAA;AACT,KACF;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AACF;;;;;"}
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuLayout = require('@vuu-ui/vuu-layout');
5
+ var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
6
+ var react = require('react');
7
+
8
+ const useVisualLinks = (dataSource) => {
9
+ const { dispatch } = vuuLayout.useViewContext();
10
+ const clearVisualLinkTarget = react.useCallback(() => {
11
+ if (dataSource.visualLink) {
12
+ dispatch?.({
13
+ type: "broadcast-message",
14
+ message: {
15
+ targetId: dataSource.visualLink.parentClientVpId,
16
+ type: "highlight-off"
17
+ }
18
+ });
19
+ }
20
+ }, [dataSource, dispatch]);
21
+ const removeVisualLink = react.useCallback(() => {
22
+ if (dataSource.visualLink) {
23
+ dispatch?.({
24
+ type: "broadcast-message",
25
+ message: {
26
+ targetId: dataSource.visualLink.parentClientVpId,
27
+ type: "highlight-off"
28
+ }
29
+ });
30
+ dataSource.visualLink = void 0;
31
+ }
32
+ }, [dataSource, dispatch]);
33
+ const handleLinkRemoved = react.useCallback(() => {
34
+ dispatch?.({
35
+ type: "remove-toolbar-contribution",
36
+ location: "post-title"
37
+ });
38
+ }, [dispatch]);
39
+ const highlightVisualLinkTarget = react.useCallback(() => {
40
+ if (dataSource.visualLink) {
41
+ dispatch?.({
42
+ type: "broadcast-message",
43
+ message: {
44
+ targetId: dataSource.visualLink.parentClientVpId,
45
+ type: "highlight-on"
46
+ }
47
+ });
48
+ }
49
+ }, [dataSource, dispatch]);
50
+ const handleLinkCreated = react.useCallback(() => {
51
+ dispatch?.({
52
+ type: "add-toolbar-contribution",
53
+ location: "post-title",
54
+ content: /* @__PURE__ */ jsxRuntime.jsx(
55
+ vuuUiControls.IconButton,
56
+ {
57
+ "aria-label": "remove-link",
58
+ icon: "link",
59
+ onClick: removeVisualLink,
60
+ onMouseEnter: highlightVisualLinkTarget,
61
+ onMouseLeave: clearVisualLinkTarget,
62
+ variant: "secondary"
63
+ }
64
+ )
65
+ });
66
+ }, [
67
+ dispatch,
68
+ removeVisualLink,
69
+ highlightVisualLinkTarget,
70
+ clearVisualLinkTarget
71
+ ]);
72
+ react.useEffect(() => {
73
+ dataSource.on("visual-link-created", handleLinkCreated);
74
+ dataSource.on("visual-link-removed", handleLinkRemoved);
75
+ return () => {
76
+ dataSource.removeListener("visual-link-created", handleLinkCreated);
77
+ dataSource.removeListener("visual-link-removed", handleLinkRemoved);
78
+ };
79
+ }, [dataSource, handleLinkCreated, handleLinkRemoved]);
80
+ };
81
+
82
+ exports.useVisualLinks = useVisualLinks;
83
+ //# sourceMappingURL=useVisualLinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVisualLinks.js","sources":["../../src/hooks/useVisualLinks.tsx"],"sourcesContent":["import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { useViewContext } from \"@vuu-ui/vuu-layout\";\nimport { IconButton } from \"@vuu-ui/vuu-ui-controls\";\nimport { useCallback, useEffect } from \"react\";\n\nexport const useVisualLinks = (dataSource: DataSource) => {\n const { dispatch } = useViewContext();\n\n const clearVisualLinkTarget = useCallback(() => {\n if (dataSource.visualLink) {\n dispatch?.({\n type: \"broadcast-message\",\n message: {\n targetId: dataSource.visualLink.parentClientVpId,\n type: \"highlight-off\",\n },\n });\n }\n }, [dataSource, dispatch]);\n\n const removeVisualLink = useCallback(() => {\n if (dataSource.visualLink) {\n dispatch?.({\n type: \"broadcast-message\",\n message: {\n targetId: dataSource.visualLink.parentClientVpId,\n type: \"highlight-off\",\n },\n });\n\n dataSource.visualLink = undefined;\n }\n }, [dataSource, dispatch]);\n\n const handleLinkRemoved = useCallback(() => {\n dispatch?.({\n type: \"remove-toolbar-contribution\",\n location: \"post-title\",\n });\n }, [dispatch]);\n\n const highlightVisualLinkTarget = useCallback(() => {\n if (dataSource.visualLink) {\n dispatch?.({\n type: \"broadcast-message\",\n message: {\n targetId: dataSource.visualLink.parentClientVpId,\n type: \"highlight-on\",\n },\n });\n }\n }, [dataSource, dispatch]);\n\n const handleLinkCreated = useCallback(() => {\n dispatch?.({\n type: \"add-toolbar-contribution\",\n location: \"post-title\",\n content: (\n <IconButton\n aria-label=\"remove-link\"\n icon=\"link\"\n onClick={removeVisualLink}\n onMouseEnter={highlightVisualLinkTarget}\n onMouseLeave={clearVisualLinkTarget}\n variant=\"secondary\"\n />\n ),\n });\n }, [\n dispatch,\n removeVisualLink,\n highlightVisualLinkTarget,\n clearVisualLinkTarget,\n ]);\n\n useEffect(() => {\n dataSource.on(\"visual-link-created\", handleLinkCreated);\n dataSource.on(\"visual-link-removed\", handleLinkRemoved);\n return () => {\n dataSource.removeListener(\"visual-link-created\", handleLinkCreated);\n dataSource.removeListener(\"visual-link-removed\", handleLinkRemoved);\n };\n }, [dataSource, handleLinkCreated, handleLinkRemoved]);\n};\n"],"names":["useViewContext","useCallback","jsx","IconButton","useEffect"],"mappings":";;;;;;;AAKa,MAAA,cAAA,GAAiB,CAAC,UAA2B,KAAA;AACxD,EAAM,MAAA,EAAE,QAAS,EAAA,GAAIA,wBAAe,EAAA;AAEpC,EAAM,MAAA,qBAAA,GAAwBC,kBAAY,MAAM;AAC9C,IAAA,IAAI,WAAW,UAAY,EAAA;AACzB,MAAW,QAAA,GAAA;AAAA,QACT,IAAM,EAAA,mBAAA;AAAA,QACN,OAAS,EAAA;AAAA,UACP,QAAA,EAAU,WAAW,UAAW,CAAA,gBAAA;AAAA,UAChC,IAAM,EAAA;AAAA;AACR,OACD,CAAA;AAAA;AACH,GACC,EAAA,CAAC,UAAY,EAAA,QAAQ,CAAC,CAAA;AAEzB,EAAM,MAAA,gBAAA,GAAmBA,kBAAY,MAAM;AACzC,IAAA,IAAI,WAAW,UAAY,EAAA;AACzB,MAAW,QAAA,GAAA;AAAA,QACT,IAAM,EAAA,mBAAA;AAAA,QACN,OAAS,EAAA;AAAA,UACP,QAAA,EAAU,WAAW,UAAW,CAAA,gBAAA;AAAA,UAChC,IAAM,EAAA;AAAA;AACR,OACD,CAAA;AAED,MAAA,UAAA,CAAW,UAAa,GAAA,KAAA,CAAA;AAAA;AAC1B,GACC,EAAA,CAAC,UAAY,EAAA,QAAQ,CAAC,CAAA;AAEzB,EAAM,MAAA,iBAAA,GAAoBA,kBAAY,MAAM;AAC1C,IAAW,QAAA,GAAA;AAAA,MACT,IAAM,EAAA,6BAAA;AAAA,MACN,QAAU,EAAA;AAAA,KACX,CAAA;AAAA,GACH,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAM,MAAA,yBAAA,GAA4BA,kBAAY,MAAM;AAClD,IAAA,IAAI,WAAW,UAAY,EAAA;AACzB,MAAW,QAAA,GAAA;AAAA,QACT,IAAM,EAAA,mBAAA;AAAA,QACN,OAAS,EAAA;AAAA,UACP,QAAA,EAAU,WAAW,UAAW,CAAA,gBAAA;AAAA,UAChC,IAAM,EAAA;AAAA;AACR,OACD,CAAA;AAAA;AACH,GACC,EAAA,CAAC,UAAY,EAAA,QAAQ,CAAC,CAAA;AAEzB,EAAM,MAAA,iBAAA,GAAoBA,kBAAY,MAAM;AAC1C,IAAW,QAAA,GAAA;AAAA,MACT,IAAM,EAAA,0BAAA;AAAA,MACN,QAAU,EAAA,YAAA;AAAA,MACV,OACE,kBAAAC,cAAA;AAAA,QAACC,wBAAA;AAAA,QAAA;AAAA,UACC,YAAW,EAAA,aAAA;AAAA,UACX,IAAK,EAAA,MAAA;AAAA,UACL,OAAS,EAAA,gBAAA;AAAA,UACT,YAAc,EAAA,yBAAA;AAAA,UACd,YAAc,EAAA,qBAAA;AAAA,UACd,OAAQ,EAAA;AAAA;AAAA;AACV,KAEH,CAAA;AAAA,GACA,EAAA;AAAA,IACD,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAAC,eAAA,CAAU,MAAM;AACd,IAAW,UAAA,CAAA,EAAA,CAAG,uBAAuB,iBAAiB,CAAA;AACtD,IAAW,UAAA,CAAA,EAAA,CAAG,uBAAuB,iBAAiB,CAAA;AACtD,IAAA,OAAO,MAAM;AACX,MAAW,UAAA,CAAA,cAAA,CAAe,uBAAuB,iBAAiB,CAAA;AAClE,MAAW,UAAA,CAAA,cAAA,CAAe,uBAAuB,iBAAiB,CAAA;AAAA,KACpE;AAAA,GACC,EAAA,CAAC,UAAY,EAAA,iBAAA,EAAmB,iBAAiB,CAAC,CAAA;AACvD;;;;"}