@vuu-ui/vuu-data-react 0.8.1 → 0.8.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/cjs/index.js +1 -1
- package/cjs/index.js.map +3 -3
- package/esm/index.js +1 -1
- package/esm/index.js.map +3 -3
- package/package.json +8 -8
- package/types/hooks/useVuuMenuActions.d.ts +13 -2
package/cjs/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var v=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var K=(e,t)=>{for(var n in t)v(e,n,{get:t[n],enumerable:!0})},H=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let u of N(t))!G.call(e,u)&&u!==n&&v(e,u,{get:()=>t[u],enumerable:!(r=U(t,u))||r.enumerable});return e};var q=e=>H(v({},"__esModule",{value:!0}),e);var pe={};K(pe,{MovingWindow:()=>w,addRowsFromInstruments:()=>X,getTypeaheadParams:()=>Q,isViewportMenusAction:()=>A,isVisualLinkCreatedAction:()=>B,isVisualLinkRemovedAction:()=>z,isVisualLinksAction:()=>P,isVuuFeatureAction:()=>ee,isVuuFeatureInvocation:()=>te,useDataSource:()=>j,useServerConnectionQuality:()=>$,useServerConnectionStatus:()=>Y,useTypeaheadSuggestions:()=>J,useVuuMenuActions:()=>Me,useVuuTables:()=>de});module.exports=q(pe);var M=require("@vuu-ui/vuu-utils"),s=require("react"),{SELECTED:S}=M.metadataKeys;function j({dataSource:e,renderBufferSize:t=10}){let[,n]=(0,s.useState)(null),r=(0,s.useRef)(!0),u=(0,s.useRef)(!1),l=(0,s.useRef)(null),a=(0,s.useRef)([]),i=(0,s.useRef)({from:0,to:10}),c=(0,s.useMemo)(()=>new w((0,M.getFullRange)(i.current,t)),[t]),d=(0,s.useCallback)(o=>{for(let m of o)c.add(m);a.current=c.data.slice(),u.current=!0},[c]),p=(0,s.useCallback)(o=>{o.type==="viewport-update"&&(o.size!==void 0&&c.setRowCount(o.size),o.rows?(d(o.rows),n({})):o.size!==void 0&&(a.current=c.data.slice(),u.current=!0))},[c,d]);(0,s.useEffect)(()=>()=>{l.current&&(cancelAnimationFrame(l.current),l.current=null),r.current=!1},[]);let g=(0,s.useCallback)(o=>{i.current=o;let m=(0,M.getFullRange)(i.current,t);e.range=m,c.setRange(m.from,m.to)},[e,c,t]);return(0,s.useMemo)(()=>{let{from:o,to:m}=i.current,f=(0,M.getFullRange)({from:o,to:m},t);e.range=f,c.setRange(f.from,f.to)},[e,c,t]),(0,s.useEffect)(()=>{let{from:o,to:m}=(0,M.getFullRange)(i.current,t);e.subscribe({range:{from:o,to:m}},p)},[e,p,t]),(0,s.useEffect)(()=>()=>{e.unsubscribe()},[e]),[a.current,c.rowCount,(0,M.getFullRange)(i.current,t),g]}var w=class{constructor({from:t,to:n}){this.rowCount=0;this.setRowCount=t=>{t<this.data.length&&(this.data.length=t),this.rowCount=t};this.range=new M.WindowRange(t,n),this.data=new Array(n-t)}add(t){let[n]=t;if(this.isWithinRange(n)){let r=n-this.range.from;this.data[r]=t,this.data[r-1]&&this.data[r-1][S]===1&&t[S]===0&&(t[S]=2),n===this.rowCount-1&&(this.data.length=r+1)}}getAtIndex(t){return this.range.isWithin(t)&&this.data[t-this.range.from]!=null?this.data[t-this.range.from]:void 0}isWithinRange(t){return this.range.isWithin(t)}setRange(t,n){if(t!==this.range.from||n!==this.range.to){let[r,u]=this.range.overlap(t,n),l=new Array(n-t);for(let a=r;a<u;a++){let i=this.getAtIndex(a);if(i){let c=a-t;l[c]=i}}this.data=l,this.range.from=t,this.range.to=n}}};var V=require("react"),b=require("@vuu-ui/vuu-data"),Y=()=>{let[e,t]=(0,V.useState)("disconnected"),n=(0,V.useCallback)(({status:r})=>{t(r)},[]);return(0,V.useEffect)(()=>(b.ConnectionManager.on("connection-status",n),()=>{b.ConnectionManager.removeListener("connection-status",n)}),[n]),e};var h=require("react"),T=require("@vuu-ui/vuu-data"),$=()=>{let[e,t]=(0,h.useState)(0),n=(0,h.useCallback)(({messages:r})=>{t(r.messagesLength)},[]);return(0,h.useEffect)(()=>(T.ConnectionManager.on("connection-metrics",n),()=>{T.ConnectionManager.removeListener("connection-metrics",n)}),[n]),e};var y=require("react"),D=require("@vuu-ui/vuu-data"),x={type:"RPC_CALL",service:"TypeAheadRpcHandler"},Q=(e,t,n="",r=[])=>n!==""&&!r.includes(n.toLowerCase())?[e,t,n]:[e,t],J=()=>(0,y.useCallback)(async t=>{let n=t.length===2?{method:"getUniqueFieldValues",params:t,...x}:{method:"getUniqueFieldValuesStartingWith",params:t,...x};return await(0,D.makeRpcCall)(n)},[]);var I=require("@vuu-ui/vuu-filter-parser"),C=require("@vuu-ui/vuu-utils"),k=require("react"),X="addRowsFromInstruments",{KEY:L}=C.metadataKeys,Z={},P=e=>e.type==="vuu-links",B=e=>e.type==="vuu-link-created",z=e=>e.type==="vuu-link-removed",A=e=>e.type==="vuu-menu",ee=e=>A(e)||P(e),te=e=>e.type==="vuu-link-created"||e.type==="vuu-link-removed",ne=e=>"rpcName"in e,re=e=>"menus"in e,ue=e=>e.name==="ROOT",E=e=>e.context==="cell",oe=e=>e.context==="row",se=e=>e.context==="selected-rows",ae=(e,t,n=0)=>{switch(e){case"grid":return t==="selected-rows"?n>0:!0;case"header":return t==="grid";default:return!1}},ie=(e,t,n,r,u)=>{if(e==="cell"||e==="row")return(0,I.getFilterPredicate)(u,r)(t);if(e==="selected-rows"){if(n.length===0)return!1;{let l=(0,I.getFilterPredicate)(u,r);return n.every(l)}}return!0},ce=e=>{let{rpcName:t}=e;return E(e)?{field:e.field,rowKey:e.rowKey,rpcName:t,value:e.value,type:"VIEW_PORT_MENU_CELL_RPC"}:oe(e)?{rowKey:e.rowKey,row:e.row,rpcName:t,type:"VIEW_PORT_MENU_ROW_RPC"}:se(e)?{rpcName:t,type:"VIEW_PORT_MENUS_SELECT_RPC"}:{rpcName:t,type:"VIEW_PORT_MENU_TABLE_RPC"}},le=({filter:e})=>typeof e=="string"&&e.length>0,me=(e,t)=>{switch(e.context){case"cell":return{...e,field:t.columnName,rowKey:t.row[L],value:t.row[t.columnMap[t.columnName]]};case"row":return{...e,row:(0,C.getRowRecord)(t.row,t.columnMap),rowKey:t.row[L]};default:return e}},O=(e,t,n)=>{var r;return re(e)?e.menus.some(u=>O(u,t,n)):ae(t,e.context,(r=n.selectedRows)==null?void 0:r.length)?t==="grid"&&le(e)?ie(e.context,n.row,n.selectedRows,e.filter,n.columnMap):E(e)&&e.field!=="*"?e.field===n.columnName:!0:!1},_=(e,t,n)=>{if(O(e,t,n)){if(ne(e))return{label:e.name,action:"MENU_RPC_CALL",options:me(e,n)};{let r=e.menus.map(u=>_(u,t,n)).filter(u=>u!==void 0);if(r.length>0)return{label:e.name,children:r}}}},Me=({clientSideMenuActionHandler:e,dataSource:t,menuActionConfig:n=Z,onRpcResponse:r})=>{let u=(0,k.useCallback)((a,i)=>{let{visualLink:c,visualLinks:d,vuuMenu:p}=n,g=[];if(a==="grid"&&d&&!c&&d.forEach(o=>{let{link:m,label:f}=o,W=f||m.toTable;g.push({label:`Link to ${W}`,action:"link-table",options:o})}),p){let o=_(p,a,i);ue(p)&&(0,C.isGroupMenuItemDescriptor)(o)?g.push(...o.children):o&&g.push(o)}return g},[n]),l=(0,k.useCallback)((a,i)=>{if(e!=null&&e(a,i))return!0;if(a==="MENU_RPC_CALL"){let c=ce(i);return t.menuRpcCall(c).then(d=>{r&&d&&r&&r(d)}),!0}else{if(a==="link-table")return t.visualLink=i,!0;console.log(`useViewServer handleMenuAction, can't handle action type ${a}`)}return!1},[e,t,r]);return{buildViewserverMenuOptions:u,handleMenuAction:l}};var R=require("react"),F=require("@vuu-ui/vuu-data"),de=()=>{let[e,t]=(0,R.useState)(),n=(0,R.useCallback)(r=>{let u=new Map;return r.forEach(l=>{u.set(l.table.table,l)}),u},[]);return(0,R.useEffect)(()=>{async function r(){let u=await(0,F.getServerAPI)(),{tables:l}=await u.getTableList(),a=n(await Promise.all(l.map(i=>u.getTableSchema(i))));t(a)}r()},[n]),e};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../packages/vuu-data-react/src/index.ts", "../../../packages/vuu-data-react/src/hooks/useDataSource.ts", "../../../packages/vuu-data-react/src/hooks/useServerConnectionStatus.ts", "../../../packages/vuu-data-react/src/hooks/useServerConnectionQuality.ts", "../../../packages/vuu-data-react/src/hooks/useTypeaheadSuggestions.ts", "../../../packages/vuu-data-react/src/hooks/useVuuMenuActions.ts", "../../../packages/vuu-data-react/src/hooks/useVuuTables.ts"],
|
|
4
|
-
"sourcesContent": ["export * from \"./hooks\";\n", "// TODO is this hook needed ? it is currently used only in a vuu salt story\nimport { DataSource, SubscribeCallback } from \"@vuu-ui/vuu-data\";\nimport { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, metadataKeys, WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst { SELECTED } = metadataKeys;\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n renderBufferSize?: number;\n}\n\nexport function useDataSource({\n dataSource,\n renderBufferSize = 10,\n}: DataSourceHookProps): [\n DataSourceRow[],\n number,\n VuuRange,\n (range: VuuRange) => void\n] {\n const [, forceUpdate] = useState<object | null>(null);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rafHandle = useRef(null);\n const data = useRef<DataSourceRow[]>([]);\n const rangeRef = useRef({ from: 0, to: 10 });\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(rangeRef.current, renderBufferSize)),\n [renderBufferSize]\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n // Why bother with the slice ?\n data.current = dataWindow.data.slice();\n\n hasUpdated.current = true;\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"viewport-update\") {\n if (message.size !== undefined) {\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n forceUpdate({});\n } else if (message.size !== undefined) {\n // TODO is this right ?\n data.current = dataWindow.data.slice();\n hasUpdated.current = true;\n }\n }\n },\n [dataWindow, setData]\n );\n\n useEffect(\n () => () => {\n if (rafHandle.current) {\n cancelAnimationFrame(rafHandle.current);\n rafHandle.current = null;\n }\n isMounted.current = false;\n },\n []\n );\n\n const setRange = useCallback(\n (range) => {\n rangeRef.current = range;\n const fullRange = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n useMemo(() => {\n const { from, to } = rangeRef.current;\n const fullRange = getFullRange({ from, to }, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n }, [dataSource, dataWindow, renderBufferSize]);\n\n useEffect(() => {\n const { from, to } = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.subscribe(\n {\n range: { from, to },\n },\n datasourceMessageHandler\n );\n }, [dataSource, datasourceMessageHandler, renderBufferSize]);\n\n useEffect(\n () => () => {\n dataSource.unsubscribe();\n },\n [dataSource]\n );\n\n return [\n data.current,\n dataWindow.rowCount,\n getFullRange(rangeRef.current, renderBufferSize),\n setRange,\n ];\n}\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n this.data = new Array(to - from);\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n if (this.data[internalIndex - 1]) {\n // assign 'post-selected' selection state\n if (\n this.data[internalIndex - 1][SELECTED] === 1 &&\n data[SELECTED] === 0\n ) {\n data[SELECTED] = 2;\n }\n }\n if (index === this.rowCount - 1) {\n this.data.length = internalIndex + 1;\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange(from: number, to: number) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n}\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager, ConnectionStatusMessage } from \"@vuu-ui/vuu-data\";\n\nexport const useServerConnectionStatus = () => {\n const [connectionStatus, setConnectionStatus] = useState(\"disconnected\");\n\n const handleStatusChange = useCallback(\n ({ status }: ConnectionStatusMessage) => {\n setConnectionStatus(status);\n },\n []\n );\n\n useEffect(() => {\n ConnectionManager.on(\"connection-status\", handleStatusChange);\n return () => {\n ConnectionManager.removeListener(\"connection-status\", handleStatusChange);\n };\n }, [handleStatusChange]);\n\n return connectionStatus;\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data\";\n\nexport const useServerConnectionQuality = () => {\n const [messagesPerSecond, setMessagesPerSecond] = useState<number>(0);\n const handleConnectivityMessage = useCallback(({ messages }) => {\n setMessagesPerSecond(messages.messagesLength);\n }, []);\n\n useEffect(() => {\n ConnectionManager.on(\"connection-metrics\", handleConnectivityMessage);\n return () => {\n ConnectionManager.removeListener(\n \"connection-metrics\",\n handleConnectivityMessage\n );\n };\n }, [handleConnectivityMessage]);\n\n return messagesPerSecond;\n};\n", "import {\n ClientToServerGetUniqueValues,\n ClientToServerGetUniqueValuesStartingWith,\n TypeaheadParams,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback } from \"react\";\nimport { makeRpcCall } from \"@vuu-ui/vuu-data\";\n\nexport type SuggestionFetcher = (params: TypeaheadParams) => Promise<string[]>;\n\n// const SPECIAL_SPACE = \"_\";\nconst TYPEAHEAD_MESSAGE_CONSTANTS = {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n};\n\nexport const getTypeaheadParams = (\n table: VuuTable,\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\n// const containSpace = (text: string) => text.indexOf(\" \") !== -1;\n// const replaceSpace = (text: string) => text.replace(/\\s/g, SPECIAL_SPACE);\n\nexport const useTypeaheadSuggestions = () => {\n const getTypeaheadSuggestions: SuggestionFetcher = useCallback(\n async (params: TypeaheadParams) => {\n const rpcMessage =\n params.length === 2\n ? ({\n method: \"getUniqueFieldValues\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValues)\n : ({\n method: \"getUniqueFieldValuesStartingWith\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValuesStartingWith);\n\n const suggestions = await makeRpcCall<string[]>(rpcMessage);\n\n // TODO replacing space with underscores like this is not being correctly handled elsewhere\n return suggestions;\n // return suggestions.some(containSpace)\n // ? suggestions.map(replaceSpace)\n // : suggestions;\n },\n []\n );\n\n return getTypeaheadSuggestions;\n};\n", "import {\n DataSource,\n DataSourceMenusMessage,\n DataSourceVisualLinkCreatedMessage,\n DataSourceVisualLinkRemovedMessage,\n DataSourceVisualLinksMessage,\n MenuRpcResponse,\n VuuFeatureInvocationMessage,\n VuuFeatureMessage,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data\";\nimport {\n ContextMenuItemDescriptor,\n DataSourceRow,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { GridAction } from \"@vuu-ui/vuu-datagrid-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRowRPC,\n ClientToServerMenuRPC,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnMap,\n getRowRecord,\n isGroupMenuItemDescriptor,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\n\nexport const addRowsFromInstruments = \"addRowsFromInstruments\";\n\nexport interface VuuCellMenuItem extends VuuMenuItem {\n rowKey: string;\n field: string;\n value: VuuRowDataItemType;\n}\nexport interface VuuRowMenuItem extends VuuMenuItem {\n rowKey: string;\n row: { [key: string]: VuuRowDataItemType };\n}\n\nconst { KEY } = metadataKeys;\n\nconst NO_CONFIG: MenuActionConfig = {};\n\n// const contextSortPriorities = {\n// \"selected-rows\": 0,\n// cell: 1,\n// row: 2,\n// grid: 3,\n// };\n\n// const byContext = (menu1: VuuMenuItem, menu2: VuuMenuItem) => {\n// return (\n// contextSortPriorities[menu1.context] - contextSortPriorities[menu2.context]\n// );\n// };\n\nexport const isVisualLinksAction = (\n action: GridAction\n): action is DataSourceVisualLinksMessage => action.type === \"vuu-links\";\n\nexport const isVisualLinkCreatedAction = (\n action: GridAction\n): action is DataSourceVisualLinkCreatedMessage =>\n action.type === \"vuu-link-created\";\n\nexport const isVisualLinkRemovedAction = (\n action: GridAction\n): action is DataSourceVisualLinkRemovedMessage =>\n action.type === \"vuu-link-removed\";\n\nexport const isViewportMenusAction = (\n action: GridAction\n): action is DataSourceMenusMessage => action.type === \"vuu-menu\";\n\nexport const isVuuFeatureAction = (\n action: GridAction\n): action is VuuFeatureMessage =>\n isViewportMenusAction(action) || isVisualLinksAction(action);\n\nexport const isVuuFeatureInvocation = (\n action: GridAction\n): action is VuuFeatureInvocationMessage =>\n action.type === \"vuu-link-created\" || action.type === \"vuu-link-removed\";\n\nconst isMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nconst isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\nconst isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\nconst isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: \"grid\" | \"header\" | \"filter\",\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n\nexport interface ViewServerHookResult {\n buildViewserverMenuOptions: MenuBuilder<\n TableMenuLocation,\n VuuServerMenuOptions\n >;\n handleMenuAction: (type: string, options: unknown) => boolean;\n}\n\nexport interface MenuActionConfig {\n vuuMenu?: VuuMenu;\n visualLink?: DataSourceVisualLinkCreatedMessage;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\nexport interface VuuMenuActionHookProps {\n dataSource: DataSource;\n menuActionConfig?: MenuActionConfig;\n onRpcResponse?: (\n response:\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n ) => void;\n}\n\ntype TableMenuLocation = \"grid\" | \"header\" | \"filter\";\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst buildMenuDescriptor = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptor(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const useVuuMenuActions = ({\n dataSource,\n menuActionConfig = NO_CONFIG,\n onRpcResponse,\n}: VuuMenuActionHookProps): ViewServerHookResult => {\n const buildViewserverMenuOptions: MenuBuilder<\n TableMenuLocation,\n VuuServerMenuOptions\n > = useCallback(\n (tableLocation, options) => {\n const { visualLink, visualLinks, vuuMenu } = menuActionConfig;\n const descriptors: ContextMenuItemDescriptor[] = [];\n\n if (tableLocation === \"grid\" && visualLinks && !visualLink) {\n visualLinks.forEach((linkDescriptor: LinkDescriptorWithLabel) => {\n const { link, label: linkLabel } = linkDescriptor;\n const label = linkLabel ? linkLabel : link.toTable;\n descriptors.push({\n label: `Link to ${label}`,\n action: \"link-table\",\n options: linkDescriptor,\n });\n });\n }\n\n if (vuuMenu) {\n const menuDescriptor = buildMenuDescriptor(\n vuuMenu,\n tableLocation,\n options\n );\n if (isRoot(vuuMenu) && isGroupMenuItemDescriptor(menuDescriptor)) {\n descriptors.push(...menuDescriptor.children);\n } else if (menuDescriptor) {\n descriptors.push(menuDescriptor);\n }\n }\n\n return descriptors;\n },\n [menuActionConfig]\n );\n\n const handleMenuAction = useCallback(\n (type: string, options: unknown) => {\n if (type === \"MENU_RPC_CALL\") {\n const rpcRequest = getMenuRpcRequest(options as VuuMenuItem);\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (onRpcResponse && rpcResponse) {\n onRpcResponse && onRpcResponse(rpcResponse);\n }\n });\n return true;\n } else if (type === \"link-table\") {\n // return dataSource.createLink(options as LinkDescriptorWithLabel), true;\n return (\n (dataSource.visualLink = options as LinkDescriptorWithLabel), true\n );\n } else {\n console.log(\n `useViewServer handleMenuAction, can't handle action type ${type}`\n );\n }\n return false;\n },\n [dataSource, onRpcResponse]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { getServerAPI, TableSchema } from \"@vuu-ui/vuu-data\";\n\nexport const useVuuTables = () => {\n const [tables, setTables] = useState<Map<string, TableSchema> | undefined>();\n\n const buildTables = useCallback((schemas: TableSchema[]) => {\n const vuuTables = new Map<string, TableSchema>();\n schemas.forEach((schema) => {\n vuuTables.set(schema.table.table, schema);\n });\n return vuuTables;\n }, []);\n\n useEffect(() => {\n async function fetchTableMetadata() {\n const server = await getServerAPI();\n const { tables } = await server.getTableList();\n const tableSchemas = buildTables(\n await Promise.all(\n tables.map((tableDescriptor) =>\n server.getTableSchema(tableDescriptor)\n )\n )\n );\n setTables(tableSchemas);\n }\n\n fetchTableMetadata();\n }, [buildTables]);\n\n return tables;\n};\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,kBAAAE,EAAA,2BAAAC,EAAA,uBAAAC,EAAA,0BAAAC,EAAA,8BAAAC,EAAA,8BAAAC,EAAA,wBAAAC,EAAA,uBAAAC,
|
|
6
|
-
"names": ["src_exports", "__export", "MovingWindow", "addRowsFromInstruments", "getTypeaheadParams", "isViewportMenusAction", "isVisualLinkCreatedAction", "isVisualLinkRemovedAction", "isVisualLinksAction", "isVuuFeatureAction", "isVuuFeatureInvocation", "useDataSource", "useServerConnectionQuality", "useServerConnectionStatus", "useTypeaheadSuggestions", "useVuuMenuActions", "useVuuTables", "__toCommonJS", "import_vuu_utils", "import_react", "SELECTED", "useDataSource", "dataSource", "renderBufferSize", "forceUpdate", "isMounted", "hasUpdated", "rafHandle", "data", "rangeRef", "dataWindow", "MovingWindow", "setData", "updates", "row", "datasourceMessageHandler", "message", "setRange", "range", "fullRange", "from", "to", "rowCount", "index", "internalIndex", "overlapFrom", "overlapTo", "newData", "i", "import_react", "import_vuu_data", "useServerConnectionStatus", "connectionStatus", "setConnectionStatus", "handleStatusChange", "status", "import_react", "import_vuu_data", "useServerConnectionQuality", "messagesPerSecond", "setMessagesPerSecond", "handleConnectivityMessage", "messages", "import_react", "import_vuu_data", "TYPEAHEAD_MESSAGE_CONSTANTS", "getTypeaheadParams", "table", "column", "text", "selectedValues", "useTypeaheadSuggestions", "params", "rpcMessage", "import_vuu_filter_parser", "import_vuu_utils", "import_react", "addRowsFromInstruments", "KEY", "NO_CONFIG", "isVisualLinksAction", "action", "isVisualLinkCreatedAction", "isVisualLinkRemovedAction", "isViewportMenusAction", "isVuuFeatureAction", "isVuuFeatureInvocation", "isMenuItem", "menu", "isGroupMenuItem", "isRoot", "isCellMenu", "options", "isRowMenu", "isSelectionMenu", "vuuContextCompatibleWithTableLocation", "uiLocation", "vuuContext", "selectedRowCount", "gridRowMeetsFilterCriteria", "context", "row", "selectedRows", "filter", "columnMap", "filterPredicate", "getMenuRpcRequest", "rpcName", "hasFilter", "getMenuItemOptions", "menuShouldBeRenderedInThisContext", "menuItem", "tableLocation", "_a", "childMenu", "buildMenuDescriptor", "children", "useVuuMenuActions", "dataSource", "menuActionConfig", "onRpcResponse", "buildViewserverMenuOptions", "visualLink", "visualLinks", "vuuMenu", "descriptors", "linkDescriptor", "link", "linkLabel", "label", "menuDescriptor", "handleMenuAction", "type", "rpcRequest", "rpcResponse", "import_react", "import_vuu_data", "useVuuTables", "tables", "setTables", "buildTables", "schemas", "vuuTables", "schema", "fetchTableMetadata", "server", "tableSchemas", "tableDescriptor"]
|
|
4
|
+
"sourcesContent": ["export * from \"./hooks\";\n", "// TODO is this hook needed ? it is currently used only in a vuu salt story\nimport { DataSource, SubscribeCallback } from \"@vuu-ui/vuu-data\";\nimport { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, metadataKeys, WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst { SELECTED } = metadataKeys;\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n renderBufferSize?: number;\n}\n\nexport function useDataSource({\n dataSource,\n renderBufferSize = 10,\n}: DataSourceHookProps): [\n DataSourceRow[],\n number,\n VuuRange,\n (range: VuuRange) => void\n] {\n const [, forceUpdate] = useState<object | null>(null);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rafHandle = useRef(null);\n const data = useRef<DataSourceRow[]>([]);\n const rangeRef = useRef({ from: 0, to: 10 });\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(rangeRef.current, renderBufferSize)),\n [renderBufferSize]\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n // Why bother with the slice ?\n data.current = dataWindow.data.slice();\n\n hasUpdated.current = true;\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"viewport-update\") {\n if (message.size !== undefined) {\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n forceUpdate({});\n } else if (message.size !== undefined) {\n // TODO is this right ?\n data.current = dataWindow.data.slice();\n hasUpdated.current = true;\n }\n }\n },\n [dataWindow, setData]\n );\n\n useEffect(\n () => () => {\n if (rafHandle.current) {\n cancelAnimationFrame(rafHandle.current);\n rafHandle.current = null;\n }\n isMounted.current = false;\n },\n []\n );\n\n const setRange = useCallback(\n (range) => {\n rangeRef.current = range;\n const fullRange = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n useMemo(() => {\n const { from, to } = rangeRef.current;\n const fullRange = getFullRange({ from, to }, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n }, [dataSource, dataWindow, renderBufferSize]);\n\n useEffect(() => {\n const { from, to } = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.subscribe(\n {\n range: { from, to },\n },\n datasourceMessageHandler\n );\n }, [dataSource, datasourceMessageHandler, renderBufferSize]);\n\n useEffect(\n () => () => {\n dataSource.unsubscribe();\n },\n [dataSource]\n );\n\n return [\n data.current,\n dataWindow.rowCount,\n getFullRange(rangeRef.current, renderBufferSize),\n setRange,\n ];\n}\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n this.data = new Array(to - from);\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n if (this.data[internalIndex - 1]) {\n // assign 'post-selected' selection state\n if (\n this.data[internalIndex - 1][SELECTED] === 1 &&\n data[SELECTED] === 0\n ) {\n data[SELECTED] = 2;\n }\n }\n if (index === this.rowCount - 1) {\n this.data.length = internalIndex + 1;\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange(from: number, to: number) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n}\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager, ConnectionStatusMessage } from \"@vuu-ui/vuu-data\";\n\nexport const useServerConnectionStatus = () => {\n const [connectionStatus, setConnectionStatus] = useState(\"disconnected\");\n\n const handleStatusChange = useCallback(\n ({ status }: ConnectionStatusMessage) => {\n setConnectionStatus(status);\n },\n []\n );\n\n useEffect(() => {\n ConnectionManager.on(\"connection-status\", handleStatusChange);\n return () => {\n ConnectionManager.removeListener(\"connection-status\", handleStatusChange);\n };\n }, [handleStatusChange]);\n\n return connectionStatus;\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data\";\n\nexport const useServerConnectionQuality = () => {\n const [messagesPerSecond, setMessagesPerSecond] = useState<number>(0);\n const handleConnectivityMessage = useCallback(({ messages }) => {\n setMessagesPerSecond(messages.messagesLength);\n }, []);\n\n useEffect(() => {\n ConnectionManager.on(\"connection-metrics\", handleConnectivityMessage);\n return () => {\n ConnectionManager.removeListener(\n \"connection-metrics\",\n handleConnectivityMessage\n );\n };\n }, [handleConnectivityMessage]);\n\n return messagesPerSecond;\n};\n", "import {\n ClientToServerGetUniqueValues,\n ClientToServerGetUniqueValuesStartingWith,\n TypeaheadParams,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback } from \"react\";\nimport { makeRpcCall } from \"@vuu-ui/vuu-data\";\n\nexport type SuggestionFetcher = (params: TypeaheadParams) => Promise<string[]>;\n\n// const SPECIAL_SPACE = \"_\";\nconst TYPEAHEAD_MESSAGE_CONSTANTS = {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n};\n\nexport const getTypeaheadParams = (\n table: VuuTable,\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\n// const containSpace = (text: string) => text.indexOf(\" \") !== -1;\n// const replaceSpace = (text: string) => text.replace(/\\s/g, SPECIAL_SPACE);\n\nexport const useTypeaheadSuggestions = () => {\n const getTypeaheadSuggestions: SuggestionFetcher = useCallback(\n async (params: TypeaheadParams) => {\n const rpcMessage =\n params.length === 2\n ? ({\n method: \"getUniqueFieldValues\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValues)\n : ({\n method: \"getUniqueFieldValuesStartingWith\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValuesStartingWith);\n\n const suggestions = await makeRpcCall<string[]>(rpcMessage);\n\n // TODO replacing space with underscores like this is not being correctly handled elsewhere\n return suggestions;\n // return suggestions.some(containSpace)\n // ? suggestions.map(replaceSpace)\n // : suggestions;\n },\n []\n );\n\n return getTypeaheadSuggestions;\n};\n", "import {\n DataSource,\n DataSourceMenusMessage,\n DataSourceVisualLinkCreatedMessage,\n DataSourceVisualLinkRemovedMessage,\n DataSourceVisualLinksMessage,\n MenuRpcResponse,\n VuuFeatureInvocationMessage,\n VuuFeatureMessage,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data\";\nimport {\n ContextMenuItemDescriptor,\n DataSourceRow,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { GridAction } from \"@vuu-ui/vuu-datagrid-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRowRPC,\n ClientToServerMenuRPC,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnMap,\n getRowRecord,\n isGroupMenuItemDescriptor,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\n\nexport const addRowsFromInstruments = \"addRowsFromInstruments\";\n\nexport interface VuuCellMenuItem extends VuuMenuItem {\n rowKey: string;\n field: string;\n value: VuuRowDataItemType;\n}\nexport interface VuuRowMenuItem extends VuuMenuItem {\n rowKey: string;\n row: { [key: string]: VuuRowDataItemType };\n}\n\nconst { KEY } = metadataKeys;\n\nconst NO_CONFIG: MenuActionConfig = {};\n\nexport const isVisualLinksAction = (\n action: GridAction\n): action is DataSourceVisualLinksMessage => action.type === \"vuu-links\";\n\nexport const isVisualLinkCreatedAction = (\n action: GridAction\n): action is DataSourceVisualLinkCreatedMessage =>\n action.type === \"vuu-link-created\";\n\nexport const isVisualLinkRemovedAction = (\n action: GridAction\n): action is DataSourceVisualLinkRemovedMessage =>\n action.type === \"vuu-link-removed\";\n\nexport const isViewportMenusAction = (\n action: GridAction\n): action is DataSourceMenusMessage => action.type === \"vuu-menu\";\n\nexport const isVuuFeatureAction = (\n action: GridAction\n): action is VuuFeatureMessage =>\n isViewportMenusAction(action) || isVisualLinksAction(action);\n\nexport const isVuuFeatureInvocation = (\n action: GridAction\n): action is VuuFeatureInvocationMessage =>\n action.type === \"vuu-link-created\" || action.type === \"vuu-link-removed\";\n\nconst isMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nconst isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\nconst isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\nconst isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: \"grid\" | \"header\" | \"filter\",\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n\nexport type VuuMenuActionHandler = (type: string, options: unknown) => boolean;\n\nexport interface ViewServerHookResult {\n buildViewserverMenuOptions: MenuBuilder<\n TableMenuLocation,\n VuuServerMenuOptions\n >;\n handleMenuAction: VuuMenuActionHandler;\n}\n\nexport interface MenuActionConfig {\n vuuMenu?: VuuMenu;\n visualLink?: DataSourceVisualLinkCreatedMessage;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\nexport interface VuuMenuActionHookProps {\n /**\n * By default, vuuMenuActions will be handled automatically. When activated, a\n * message will be sent to server and response will be handled here too.\n * This prop allows client to provide a custom handler for a menu Item. This will\n * take priority and if handler returns true, no further processing for the menu\n * item will be handled by Vuu. This can also be used to prevent an item from being\n * actioned, even when no custom handling is intended. If the handler returns false,\n * Vuu will process the menuItem.\n */\n clientSideMenuActionHandler?: VuuMenuActionHandler;\n dataSource: DataSource;\n menuActionConfig?: MenuActionConfig;\n onRpcResponse?: (\n response:\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n ) => void;\n}\n\ntype TableMenuLocation = \"grid\" | \"header\" | \"filter\";\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst buildMenuDescriptor = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptor(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const useVuuMenuActions = ({\n clientSideMenuActionHandler,\n dataSource,\n menuActionConfig = NO_CONFIG,\n onRpcResponse,\n}: VuuMenuActionHookProps): ViewServerHookResult => {\n const buildViewserverMenuOptions: MenuBuilder<\n TableMenuLocation,\n VuuServerMenuOptions\n > = useCallback(\n (tableLocation, options) => {\n const { visualLink, visualLinks, vuuMenu } = menuActionConfig;\n const descriptors: ContextMenuItemDescriptor[] = [];\n\n if (tableLocation === \"grid\" && visualLinks && !visualLink) {\n visualLinks.forEach((linkDescriptor: LinkDescriptorWithLabel) => {\n const { link, label: linkLabel } = linkDescriptor;\n const label = linkLabel ? linkLabel : link.toTable;\n descriptors.push({\n label: `Link to ${label}`,\n action: \"link-table\",\n options: linkDescriptor,\n });\n });\n }\n\n if (vuuMenu) {\n const menuDescriptor = buildMenuDescriptor(\n vuuMenu,\n tableLocation,\n options\n );\n if (isRoot(vuuMenu) && isGroupMenuItemDescriptor(menuDescriptor)) {\n descriptors.push(...menuDescriptor.children);\n } else if (menuDescriptor) {\n descriptors.push(menuDescriptor);\n }\n }\n\n return descriptors;\n },\n [menuActionConfig]\n );\n\n const handleMenuAction = useCallback(\n (type: string, options: unknown) => {\n if (clientSideMenuActionHandler?.(type, options)) {\n return true;\n } else if (type === \"MENU_RPC_CALL\") {\n const rpcRequest = getMenuRpcRequest(options as VuuMenuItem);\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (onRpcResponse && rpcResponse) {\n onRpcResponse && onRpcResponse(rpcResponse);\n }\n });\n return true;\n } else if (type === \"link-table\") {\n // return dataSource.createLink(options as LinkDescriptorWithLabel), true;\n return (\n (dataSource.visualLink = options as LinkDescriptorWithLabel), true\n );\n } else {\n console.log(\n `useViewServer handleMenuAction, can't handle action type ${type}`\n );\n }\n return false;\n },\n [clientSideMenuActionHandler, dataSource, onRpcResponse]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { getServerAPI, TableSchema } from \"@vuu-ui/vuu-data\";\n\nexport const useVuuTables = () => {\n const [tables, setTables] = useState<Map<string, TableSchema> | undefined>();\n\n const buildTables = useCallback((schemas: TableSchema[]) => {\n const vuuTables = new Map<string, TableSchema>();\n schemas.forEach((schema) => {\n vuuTables.set(schema.table.table, schema);\n });\n return vuuTables;\n }, []);\n\n useEffect(() => {\n async function fetchTableMetadata() {\n const server = await getServerAPI();\n const { tables } = await server.getTableList();\n const tableSchemas = buildTables(\n await Promise.all(\n tables.map((tableDescriptor) =>\n server.getTableSchema(tableDescriptor)\n )\n )\n );\n setTables(tableSchemas);\n }\n\n fetchTableMetadata();\n }, [buildTables]);\n\n return tables;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["src_exports", "__export", "MovingWindow", "addRowsFromInstruments", "getTypeaheadParams", "isViewportMenusAction", "isVisualLinkCreatedAction", "isVisualLinkRemovedAction", "isVisualLinksAction", "isVuuFeatureAction", "isVuuFeatureInvocation", "useDataSource", "useServerConnectionQuality", "useServerConnectionStatus", "useTypeaheadSuggestions", "useVuuMenuActions", "useVuuTables", "__toCommonJS", "import_vuu_utils", "import_react", "SELECTED", "useDataSource", "dataSource", "renderBufferSize", "forceUpdate", "isMounted", "hasUpdated", "rafHandle", "data", "rangeRef", "dataWindow", "MovingWindow", "setData", "updates", "row", "datasourceMessageHandler", "message", "setRange", "range", "fullRange", "from", "to", "rowCount", "index", "internalIndex", "overlapFrom", "overlapTo", "newData", "i", "import_react", "import_vuu_data", "useServerConnectionStatus", "connectionStatus", "setConnectionStatus", "handleStatusChange", "status", "import_react", "import_vuu_data", "useServerConnectionQuality", "messagesPerSecond", "setMessagesPerSecond", "handleConnectivityMessage", "messages", "import_react", "import_vuu_data", "TYPEAHEAD_MESSAGE_CONSTANTS", "getTypeaheadParams", "table", "column", "text", "selectedValues", "useTypeaheadSuggestions", "params", "rpcMessage", "import_vuu_filter_parser", "import_vuu_utils", "import_react", "addRowsFromInstruments", "KEY", "NO_CONFIG", "isVisualLinksAction", "action", "isVisualLinkCreatedAction", "isVisualLinkRemovedAction", "isViewportMenusAction", "isVuuFeatureAction", "isVuuFeatureInvocation", "isMenuItem", "menu", "isGroupMenuItem", "isRoot", "isCellMenu", "options", "isRowMenu", "isSelectionMenu", "vuuContextCompatibleWithTableLocation", "uiLocation", "vuuContext", "selectedRowCount", "gridRowMeetsFilterCriteria", "context", "row", "selectedRows", "filter", "columnMap", "filterPredicate", "getMenuRpcRequest", "rpcName", "hasFilter", "getMenuItemOptions", "menuShouldBeRenderedInThisContext", "menuItem", "tableLocation", "_a", "childMenu", "buildMenuDescriptor", "children", "useVuuMenuActions", "clientSideMenuActionHandler", "dataSource", "menuActionConfig", "onRpcResponse", "buildViewserverMenuOptions", "visualLink", "visualLinks", "vuuMenu", "descriptors", "linkDescriptor", "link", "linkLabel", "label", "menuDescriptor", "handleMenuAction", "type", "rpcRequest", "rpcResponse", "import_react", "import_vuu_data", "useVuuTables", "tables", "setTables", "buildTables", "schemas", "vuuTables", "schema", "fetchTableMetadata", "server", "tableSchemas", "tableDescriptor"]
|
|
7
7
|
}
|
package/esm/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{getFullRange as g,metadataKeys as
|
|
1
|
+
import{getFullRange as g,metadataKeys as P,WindowRange as A}from"@vuu-ui/vuu-utils";import{useCallback as V,useEffect as h,useMemo as w,useRef as f,useState as E}from"react";var{SELECTED:C}=P;function me({dataSource:e,renderBufferSize:t=10}){let[,n]=E(null),r=f(!0),o=f(!1),c=f(null),s=f([]),a=f({from:0,to:10}),i=w(()=>new R(g(a.current,t)),[t]),m=V(u=>{for(let l of u)i.add(l);s.current=i.data.slice(),o.current=!0},[i]),M=V(u=>{u.type==="viewport-update"&&(u.size!==void 0&&i.setRowCount(u.size),u.rows?(m(u.rows),n({})):u.size!==void 0&&(s.current=i.data.slice(),o.current=!0))},[i,m]);h(()=>()=>{c.current&&(cancelAnimationFrame(c.current),c.current=null),r.current=!1},[]);let d=V(u=>{a.current=u;let l=g(a.current,t);e.range=l,i.setRange(l.from,l.to)},[e,i,t]);return w(()=>{let{from:u,to:l}=a.current,p=g({from:u,to:l},t);e.range=p,i.setRange(p.from,p.to)},[e,i,t]),h(()=>{let{from:u,to:l}=g(a.current,t);e.subscribe({range:{from:u,to:l}},M)},[e,M,t]),h(()=>()=>{e.unsubscribe()},[e]),[s.current,i.rowCount,g(a.current,t),d]}var R=class{constructor({from:t,to:n}){this.rowCount=0;this.setRowCount=t=>{t<this.data.length&&(this.data.length=t),this.rowCount=t};this.range=new A(t,n),this.data=new Array(n-t)}add(t){let[n]=t;if(this.isWithinRange(n)){let r=n-this.range.from;this.data[r]=t,this.data[r-1]&&this.data[r-1][C]===1&&t[C]===0&&(t[C]=2),n===this.rowCount-1&&(this.data.length=r+1)}}getAtIndex(t){return this.range.isWithin(t)&&this.data[t-this.range.from]!=null?this.data[t-this.range.from]:void 0}isWithinRange(t){return this.range.isWithin(t)}setRange(t,n){if(t!==this.range.from||n!==this.range.to){let[r,o]=this.range.overlap(t,n),c=new Array(n-t);for(let s=r;s<o;s++){let a=this.getAtIndex(s);if(a){let i=s-t;c[i]=a}}this.data=c,this.range.from=t,this.range.to=n}}};import{useCallback as O,useEffect as _,useState as F}from"react";import{ConnectionManager as v}from"@vuu-ui/vuu-data";var fe=()=>{let[e,t]=F("disconnected"),n=O(({status:r})=>{t(r)},[]);return _(()=>(v.on("connection-status",n),()=>{v.removeListener("connection-status",n)}),[n]),e};import{useCallback as W,useEffect as U,useState as N}from"react";import{ConnectionManager as S}from"@vuu-ui/vuu-data";var Re=()=>{let[e,t]=N(0),n=W(({messages:r})=>{t(r.messagesLength)},[]);return U(()=>(S.on("connection-metrics",n),()=>{S.removeListener("connection-metrics",n)}),[n]),e};import{useCallback as G}from"react";import{makeRpcCall as K}from"@vuu-ui/vuu-data";var b={type:"RPC_CALL",service:"TypeAheadRpcHandler"},be=(e,t,n="",r=[])=>n!==""&&!r.includes(n.toLowerCase())?[e,t,n]:[e,t],Te=()=>G(async t=>{let n=t.length===2?{method:"getUniqueFieldValues",params:t,...b}:{method:"getUniqueFieldValuesStartingWith",params:t,...b};return await K(n)},[]);import{getFilterPredicate as T}from"@vuu-ui/vuu-filter-parser";import{getRowRecord as H,isGroupMenuItemDescriptor as q,metadataKeys as j}from"@vuu-ui/vuu-utils";import{useCallback as I}from"react";var Le="addRowsFromInstruments",{KEY:k}=j,Y={},$=e=>e.type==="vuu-links",Pe=e=>e.type==="vuu-link-created",Ae=e=>e.type==="vuu-link-removed",Q=e=>e.type==="vuu-menu",Ee=e=>Q(e)||$(e),Oe=e=>e.type==="vuu-link-created"||e.type==="vuu-link-removed",J=e=>"rpcName"in e,X=e=>"menus"in e,Z=e=>e.name==="ROOT",x=e=>e.context==="cell",B=e=>e.context==="row",z=e=>e.context==="selected-rows",ee=(e,t,n=0)=>{switch(e){case"grid":return t==="selected-rows"?n>0:!0;case"header":return t==="grid";default:return!1}},te=(e,t,n,r,o)=>{if(e==="cell"||e==="row")return T(o,r)(t);if(e==="selected-rows"){if(n.length===0)return!1;{let c=T(o,r);return n.every(c)}}return!0},ne=e=>{let{rpcName:t}=e;return x(e)?{field:e.field,rowKey:e.rowKey,rpcName:t,value:e.value,type:"VIEW_PORT_MENU_CELL_RPC"}:B(e)?{rowKey:e.rowKey,row:e.row,rpcName:t,type:"VIEW_PORT_MENU_ROW_RPC"}:z(e)?{rpcName:t,type:"VIEW_PORT_MENUS_SELECT_RPC"}:{rpcName:t,type:"VIEW_PORT_MENU_TABLE_RPC"}},re=({filter:e})=>typeof e=="string"&&e.length>0,ue=(e,t)=>{switch(e.context){case"cell":return{...e,field:t.columnName,rowKey:t.row[k],value:t.row[t.columnMap[t.columnName]]};case"row":return{...e,row:H(t.row,t.columnMap),rowKey:t.row[k]};default:return e}},y=(e,t,n)=>{var r;return X(e)?e.menus.some(o=>y(o,t,n)):ee(t,e.context,(r=n.selectedRows)==null?void 0:r.length)?t==="grid"&&re(e)?te(e.context,n.row,n.selectedRows,e.filter,n.columnMap):x(e)&&e.field!=="*"?e.field===n.columnName:!0:!1},D=(e,t,n)=>{if(y(e,t,n)){if(J(e))return{label:e.name,action:"MENU_RPC_CALL",options:ue(e,n)};{let r=e.menus.map(o=>D(o,t,n)).filter(o=>o!==void 0);if(r.length>0)return{label:e.name,children:r}}}},_e=({clientSideMenuActionHandler:e,dataSource:t,menuActionConfig:n=Y,onRpcResponse:r})=>{let o=I((s,a)=>{let{visualLink:i,visualLinks:m,vuuMenu:M}=n,d=[];if(s==="grid"&&m&&!i&&m.forEach(u=>{let{link:l,label:p}=u,L=p||l.toTable;d.push({label:`Link to ${L}`,action:"link-table",options:u})}),M){let u=D(M,s,a);Z(M)&&q(u)?d.push(...u.children):u&&d.push(u)}return d},[n]),c=I((s,a)=>{if(e!=null&&e(s,a))return!0;if(s==="MENU_RPC_CALL"){let i=ne(a);return t.menuRpcCall(i).then(m=>{r&&m&&r&&r(m)}),!0}else{if(s==="link-table")return t.visualLink=a,!0;console.log(`useViewServer handleMenuAction, can't handle action type ${s}`)}return!1},[e,t,r]);return{buildViewserverMenuOptions:o,handleMenuAction:c}};import{useCallback as oe,useEffect as se,useState as ae}from"react";import{getServerAPI as ie}from"@vuu-ui/vuu-data";var Ge=()=>{let[e,t]=ae(),n=oe(r=>{let o=new Map;return r.forEach(c=>{o.set(c.table.table,c)}),o},[]);return se(()=>{async function r(){let o=await ie(),{tables:c}=await o.getTableList(),s=n(await Promise.all(c.map(a=>o.getTableSchema(a))));t(s)}r()},[n]),e};export{R as MovingWindow,Le as addRowsFromInstruments,be as getTypeaheadParams,Q as isViewportMenusAction,Pe as isVisualLinkCreatedAction,Ae as isVisualLinkRemovedAction,$ as isVisualLinksAction,Ee as isVuuFeatureAction,Oe as isVuuFeatureInvocation,me as useDataSource,Re as useServerConnectionQuality,fe as useServerConnectionStatus,Te as useTypeaheadSuggestions,_e as useVuuMenuActions,Ge as useVuuTables};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../packages/vuu-data-react/src/hooks/useDataSource.ts", "../../../packages/vuu-data-react/src/hooks/useServerConnectionStatus.ts", "../../../packages/vuu-data-react/src/hooks/useServerConnectionQuality.ts", "../../../packages/vuu-data-react/src/hooks/useTypeaheadSuggestions.ts", "../../../packages/vuu-data-react/src/hooks/useVuuMenuActions.ts", "../../../packages/vuu-data-react/src/hooks/useVuuTables.ts"],
|
|
4
|
-
"sourcesContent": ["// TODO is this hook needed ? it is currently used only in a vuu salt story\nimport { DataSource, SubscribeCallback } from \"@vuu-ui/vuu-data\";\nimport { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, metadataKeys, WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst { SELECTED } = metadataKeys;\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n renderBufferSize?: number;\n}\n\nexport function useDataSource({\n dataSource,\n renderBufferSize = 10,\n}: DataSourceHookProps): [\n DataSourceRow[],\n number,\n VuuRange,\n (range: VuuRange) => void\n] {\n const [, forceUpdate] = useState<object | null>(null);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rafHandle = useRef(null);\n const data = useRef<DataSourceRow[]>([]);\n const rangeRef = useRef({ from: 0, to: 10 });\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(rangeRef.current, renderBufferSize)),\n [renderBufferSize]\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n // Why bother with the slice ?\n data.current = dataWindow.data.slice();\n\n hasUpdated.current = true;\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"viewport-update\") {\n if (message.size !== undefined) {\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n forceUpdate({});\n } else if (message.size !== undefined) {\n // TODO is this right ?\n data.current = dataWindow.data.slice();\n hasUpdated.current = true;\n }\n }\n },\n [dataWindow, setData]\n );\n\n useEffect(\n () => () => {\n if (rafHandle.current) {\n cancelAnimationFrame(rafHandle.current);\n rafHandle.current = null;\n }\n isMounted.current = false;\n },\n []\n );\n\n const setRange = useCallback(\n (range) => {\n rangeRef.current = range;\n const fullRange = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n useMemo(() => {\n const { from, to } = rangeRef.current;\n const fullRange = getFullRange({ from, to }, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n }, [dataSource, dataWindow, renderBufferSize]);\n\n useEffect(() => {\n const { from, to } = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.subscribe(\n {\n range: { from, to },\n },\n datasourceMessageHandler\n );\n }, [dataSource, datasourceMessageHandler, renderBufferSize]);\n\n useEffect(\n () => () => {\n dataSource.unsubscribe();\n },\n [dataSource]\n );\n\n return [\n data.current,\n dataWindow.rowCount,\n getFullRange(rangeRef.current, renderBufferSize),\n setRange,\n ];\n}\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n this.data = new Array(to - from);\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n if (this.data[internalIndex - 1]) {\n // assign 'post-selected' selection state\n if (\n this.data[internalIndex - 1][SELECTED] === 1 &&\n data[SELECTED] === 0\n ) {\n data[SELECTED] = 2;\n }\n }\n if (index === this.rowCount - 1) {\n this.data.length = internalIndex + 1;\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange(from: number, to: number) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n}\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager, ConnectionStatusMessage } from \"@vuu-ui/vuu-data\";\n\nexport const useServerConnectionStatus = () => {\n const [connectionStatus, setConnectionStatus] = useState(\"disconnected\");\n\n const handleStatusChange = useCallback(\n ({ status }: ConnectionStatusMessage) => {\n setConnectionStatus(status);\n },\n []\n );\n\n useEffect(() => {\n ConnectionManager.on(\"connection-status\", handleStatusChange);\n return () => {\n ConnectionManager.removeListener(\"connection-status\", handleStatusChange);\n };\n }, [handleStatusChange]);\n\n return connectionStatus;\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data\";\n\nexport const useServerConnectionQuality = () => {\n const [messagesPerSecond, setMessagesPerSecond] = useState<number>(0);\n const handleConnectivityMessage = useCallback(({ messages }) => {\n setMessagesPerSecond(messages.messagesLength);\n }, []);\n\n useEffect(() => {\n ConnectionManager.on(\"connection-metrics\", handleConnectivityMessage);\n return () => {\n ConnectionManager.removeListener(\n \"connection-metrics\",\n handleConnectivityMessage\n );\n };\n }, [handleConnectivityMessage]);\n\n return messagesPerSecond;\n};\n", "import {\n ClientToServerGetUniqueValues,\n ClientToServerGetUniqueValuesStartingWith,\n TypeaheadParams,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback } from \"react\";\nimport { makeRpcCall } from \"@vuu-ui/vuu-data\";\n\nexport type SuggestionFetcher = (params: TypeaheadParams) => Promise<string[]>;\n\n// const SPECIAL_SPACE = \"_\";\nconst TYPEAHEAD_MESSAGE_CONSTANTS = {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n};\n\nexport const getTypeaheadParams = (\n table: VuuTable,\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\n// const containSpace = (text: string) => text.indexOf(\" \") !== -1;\n// const replaceSpace = (text: string) => text.replace(/\\s/g, SPECIAL_SPACE);\n\nexport const useTypeaheadSuggestions = () => {\n const getTypeaheadSuggestions: SuggestionFetcher = useCallback(\n async (params: TypeaheadParams) => {\n const rpcMessage =\n params.length === 2\n ? ({\n method: \"getUniqueFieldValues\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValues)\n : ({\n method: \"getUniqueFieldValuesStartingWith\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValuesStartingWith);\n\n const suggestions = await makeRpcCall<string[]>(rpcMessage);\n\n // TODO replacing space with underscores like this is not being correctly handled elsewhere\n return suggestions;\n // return suggestions.some(containSpace)\n // ? suggestions.map(replaceSpace)\n // : suggestions;\n },\n []\n );\n\n return getTypeaheadSuggestions;\n};\n", "import {\n DataSource,\n DataSourceMenusMessage,\n DataSourceVisualLinkCreatedMessage,\n DataSourceVisualLinkRemovedMessage,\n DataSourceVisualLinksMessage,\n MenuRpcResponse,\n VuuFeatureInvocationMessage,\n VuuFeatureMessage,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data\";\nimport {\n ContextMenuItemDescriptor,\n DataSourceRow,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { GridAction } from \"@vuu-ui/vuu-datagrid-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRowRPC,\n ClientToServerMenuRPC,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnMap,\n getRowRecord,\n isGroupMenuItemDescriptor,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\n\nexport const addRowsFromInstruments = \"addRowsFromInstruments\";\n\nexport interface VuuCellMenuItem extends VuuMenuItem {\n rowKey: string;\n field: string;\n value: VuuRowDataItemType;\n}\nexport interface VuuRowMenuItem extends VuuMenuItem {\n rowKey: string;\n row: { [key: string]: VuuRowDataItemType };\n}\n\nconst { KEY } = metadataKeys;\n\nconst NO_CONFIG: MenuActionConfig = {};\n\n// const contextSortPriorities = {\n// \"selected-rows\": 0,\n// cell: 1,\n// row: 2,\n// grid: 3,\n// };\n\n// const byContext = (menu1: VuuMenuItem, menu2: VuuMenuItem) => {\n// return (\n// contextSortPriorities[menu1.context] - contextSortPriorities[menu2.context]\n// );\n// };\n\nexport const isVisualLinksAction = (\n action: GridAction\n): action is DataSourceVisualLinksMessage => action.type === \"vuu-links\";\n\nexport const isVisualLinkCreatedAction = (\n action: GridAction\n): action is DataSourceVisualLinkCreatedMessage =>\n action.type === \"vuu-link-created\";\n\nexport const isVisualLinkRemovedAction = (\n action: GridAction\n): action is DataSourceVisualLinkRemovedMessage =>\n action.type === \"vuu-link-removed\";\n\nexport const isViewportMenusAction = (\n action: GridAction\n): action is DataSourceMenusMessage => action.type === \"vuu-menu\";\n\nexport const isVuuFeatureAction = (\n action: GridAction\n): action is VuuFeatureMessage =>\n isViewportMenusAction(action) || isVisualLinksAction(action);\n\nexport const isVuuFeatureInvocation = (\n action: GridAction\n): action is VuuFeatureInvocationMessage =>\n action.type === \"vuu-link-created\" || action.type === \"vuu-link-removed\";\n\nconst isMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nconst isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\nconst isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\nconst isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: \"grid\" | \"header\" | \"filter\",\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n\nexport interface ViewServerHookResult {\n buildViewserverMenuOptions: MenuBuilder<\n TableMenuLocation,\n VuuServerMenuOptions\n >;\n handleMenuAction: (type: string, options: unknown) => boolean;\n}\n\nexport interface MenuActionConfig {\n vuuMenu?: VuuMenu;\n visualLink?: DataSourceVisualLinkCreatedMessage;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\nexport interface VuuMenuActionHookProps {\n dataSource: DataSource;\n menuActionConfig?: MenuActionConfig;\n onRpcResponse?: (\n response:\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n ) => void;\n}\n\ntype TableMenuLocation = \"grid\" | \"header\" | \"filter\";\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst buildMenuDescriptor = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptor(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const useVuuMenuActions = ({\n dataSource,\n menuActionConfig = NO_CONFIG,\n onRpcResponse,\n}: VuuMenuActionHookProps): ViewServerHookResult => {\n const buildViewserverMenuOptions: MenuBuilder<\n TableMenuLocation,\n VuuServerMenuOptions\n > = useCallback(\n (tableLocation, options) => {\n const { visualLink, visualLinks, vuuMenu } = menuActionConfig;\n const descriptors: ContextMenuItemDescriptor[] = [];\n\n if (tableLocation === \"grid\" && visualLinks && !visualLink) {\n visualLinks.forEach((linkDescriptor: LinkDescriptorWithLabel) => {\n const { link, label: linkLabel } = linkDescriptor;\n const label = linkLabel ? linkLabel : link.toTable;\n descriptors.push({\n label: `Link to ${label}`,\n action: \"link-table\",\n options: linkDescriptor,\n });\n });\n }\n\n if (vuuMenu) {\n const menuDescriptor = buildMenuDescriptor(\n vuuMenu,\n tableLocation,\n options\n );\n if (isRoot(vuuMenu) && isGroupMenuItemDescriptor(menuDescriptor)) {\n descriptors.push(...menuDescriptor.children);\n } else if (menuDescriptor) {\n descriptors.push(menuDescriptor);\n }\n }\n\n return descriptors;\n },\n [menuActionConfig]\n );\n\n const handleMenuAction = useCallback(\n (type: string, options: unknown) => {\n if (type === \"MENU_RPC_CALL\") {\n const rpcRequest = getMenuRpcRequest(options as VuuMenuItem);\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (onRpcResponse && rpcResponse) {\n onRpcResponse && onRpcResponse(rpcResponse);\n }\n });\n return true;\n } else if (type === \"link-table\") {\n // return dataSource.createLink(options as LinkDescriptorWithLabel), true;\n return (\n (dataSource.visualLink = options as LinkDescriptorWithLabel), true\n );\n } else {\n console.log(\n `useViewServer handleMenuAction, can't handle action type ${type}`\n );\n }\n return false;\n },\n [dataSource, onRpcResponse]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { getServerAPI, TableSchema } from \"@vuu-ui/vuu-data\";\n\nexport const useVuuTables = () => {\n const [tables, setTables] = useState<Map<string, TableSchema> | undefined>();\n\n const buildTables = useCallback((schemas: TableSchema[]) => {\n const vuuTables = new Map<string, TableSchema>();\n schemas.forEach((schema) => {\n vuuTables.set(schema.table.table, schema);\n });\n return vuuTables;\n }, []);\n\n useEffect(() => {\n async function fetchTableMetadata() {\n const server = await getServerAPI();\n const { tables } = await server.getTableList();\n const tableSchemas = buildTables(\n await Promise.all(\n tables.map((tableDescriptor) =>\n server.getTableSchema(tableDescriptor)\n )\n )\n );\n setTables(tableSchemas);\n }\n\n fetchTableMetadata();\n }, [buildTables]);\n\n return tables;\n};\n"],
|
|
5
|
-
"mappings": "AAIA,OAAS,gBAAAA,EAAc,gBAAAC,EAAc,eAAAC,MAAmB,oBACxD,OAAS,eAAAC,EAAa,aAAAC,EAAW,WAAAC,EAAS,UAAAC,EAAQ,YAAAC,MAAgB,QAElE,GAAM,CAAE,SAAAC,CAAS,EAAIP,EAOd,SAASQ,GAAc,CAC5B,WAAAC,EACA,iBAAAC,EAAmB,EACrB,EAKE,CACA,GAAM,CAAC,CAAEC,CAAW,EAAIL,EAAwB,IAAI,EAC9CM,EAAYP,EAAO,EAAI,EACvBQ,EAAaR,EAAO,EAAK,EACzBS,EAAYT,EAAO,IAAI,EACvBU,EAAOV,EAAwB,CAAC,CAAC,EACjCW,EAAWX,EAAO,CAAE,KAAM,EAAG,GAAI,EAAG,CAAC,EAErCY,EAAab,EACjB,IAAM,IAAIc,EAAanB,EAAaiB,EAAS,QAASN,CAAgB,CAAC,EACvE,CAACA,CAAgB,CACnB,EAEMS,EAAUjB,EACbkB,GAA6B,CAC5B,QAAWC,KAAOD,EAChBH,EAAW,IAAII,CAAG,EAGpBN,EAAK,QAAUE,EAAW,KAAK,MAAM,EAErCJ,EAAW,QAAU,EACvB,EACA,CAACI,CAAU,CACb,EAEMK,EAA8CpB,EACjDqB,GAAY,CACPA,EAAQ,OAAS,oBACfA,EAAQ,OAAS,QACnBN,EAAW,YAAYM,EAAQ,IAAI,EAEjCA,EAAQ,MACVJ,EAAQI,EAAQ,IAAI,EACpBZ,EAAY,CAAC,CAAC,GACLY,EAAQ,OAAS,SAE1BR,EAAK,QAAUE,EAAW,KAAK,MAAM,EACrCJ,EAAW,QAAU,IAG3B,EACA,CAACI,EAAYE,CAAO,CACtB,EAEAhB,EACE,IAAM,IAAM,CACNW,EAAU,UACZ,qBAAqBA,EAAU,OAAO,EACtCA,EAAU,QAAU,MAEtBF,EAAU,QAAU,EACtB,EACA,CAAC,CACH,EAEA,IAAMY,EAAWtB,EACduB,GAAU,CACTT,EAAS,QAAUS,EACnB,IAAMC,EAAY3B,EAAaiB,EAAS,QAASN,CAAgB,EACjED,EAAW,MAAQiB,EACnBT,EAAW,SAASS,EAAU,KAAMA,EAAU,EAAE,CAClD,EACA,CAACjB,EAAYQ,EAAYP,CAAgB,CAC3C,EAEA,OAAAN,EAAQ,IAAM,CACZ,GAAM,CAAE,KAAAuB,EAAM,GAAAC,CAAG,EAAIZ,EAAS,QACxBU,EAAY3B,EAAa,CAAE,KAAA4B,EAAM,GAAAC,CAAG,EAAGlB,CAAgB,EAC7DD,EAAW,MAAQiB,EACnBT,EAAW,SAASS,EAAU,KAAMA,EAAU,EAAE,CAClD,EAAG,CAACjB,EAAYQ,EAAYP,CAAgB,CAAC,EAE7CP,EAAU,IAAM,CACd,GAAM,CAAE,KAAAwB,EAAM,GAAAC,CAAG,EAAI7B,EAAaiB,EAAS,QAASN,CAAgB,EACpED,EAAW,UACT,CACE,MAAO,CAAE,KAAAkB,EAAM,GAAAC,CAAG,CACpB,EACAN,CACF,CACF,EAAG,CAACb,EAAYa,EAA0BZ,CAAgB,CAAC,EAE3DP,EACE,IAAM,IAAM,CACVM,EAAW,YAAY,CACzB,EACA,CAACA,CAAU,CACb,EAEO,CACLM,EAAK,QACLE,EAAW,SACXlB,EAAaiB,EAAS,QAASN,CAAgB,EAC/Cc,CACF,CACF,CAEO,IAAMN,EAAN,KAAmB,CAKxB,YAAY,CAAE,KAAAS,EAAM,GAAAC,CAAG,EAAa,CAHpC,KAAO,SAAW,EAQlB,iBAAeC,GAAqB,CAC9BA,EAAW,KAAK,KAAK,SACvB,KAAK,KAAK,OAASA,GAErB,KAAK,SAAWA,CAClB,EATE,KAAK,MAAQ,IAAI5B,EAAY0B,EAAMC,CAAE,EACrC,KAAK,KAAO,IAAI,MAAMA,EAAKD,CAAI,CACjC,CASA,IAAIZ,EAAqB,CACvB,GAAM,CAACe,CAAK,EAAIf,EAChB,GAAI,KAAK,cAAce,CAAK,EAAG,CAC7B,IAAMC,EAAgBD,EAAQ,KAAK,MAAM,KACzC,KAAK,KAAKC,CAAa,EAAIhB,EACvB,KAAK,KAAKgB,EAAgB,CAAC,GAG3B,KAAK,KAAKA,EAAgB,CAAC,EAAExB,CAAQ,IAAM,GAC3CQ,EAAKR,CAAQ,IAAM,IAEnBQ,EAAKR,CAAQ,EAAI,GAGjBuB,IAAU,KAAK,SAAW,IAC5B,KAAK,KAAK,OAASC,EAAgB,GAGzC,CAEA,WAAWD,EAAe,CACxB,OAAO,KAAK,MAAM,SAASA,CAAK,GAC9B,KAAK,KAAKA,EAAQ,KAAK,MAAM,IAAI,GAAK,KACpC,KAAK,KAAKA,EAAQ,KAAK,MAAM,IAAI,EACjC,MACN,CAEA,cAAcA,EAAe,CAC3B,OAAO,KAAK,MAAM,SAASA,CAAK,CAClC,CAEA,SAASH,EAAcC,EAAY,CACjC,GAAID,IAAS,KAAK,MAAM,MAAQC,IAAO,KAAK,MAAM,GAAI,CACpD,GAAM,CAACI,EAAaC,CAAS,EAAI,KAAK,MAAM,QAAQN,EAAMC,CAAE,EACtDM,EAAU,IAAI,MAAMN,EAAKD,CAAI,EACnC,
|
|
6
|
-
"names": ["getFullRange", "metadataKeys", "WindowRange", "useCallback", "useEffect", "useMemo", "useRef", "useState", "SELECTED", "useDataSource", "dataSource", "renderBufferSize", "forceUpdate", "isMounted", "hasUpdated", "rafHandle", "data", "rangeRef", "dataWindow", "MovingWindow", "setData", "updates", "row", "datasourceMessageHandler", "message", "setRange", "range", "fullRange", "from", "to", "rowCount", "index", "internalIndex", "overlapFrom", "overlapTo", "newData", "useCallback", "useEffect", "useState", "ConnectionManager", "useServerConnectionStatus", "connectionStatus", "setConnectionStatus", "handleStatusChange", "status", "useCallback", "useEffect", "useState", "ConnectionManager", "useServerConnectionQuality", "messagesPerSecond", "setMessagesPerSecond", "handleConnectivityMessage", "messages", "useCallback", "makeRpcCall", "TYPEAHEAD_MESSAGE_CONSTANTS", "getTypeaheadParams", "table", "column", "text", "selectedValues", "useTypeaheadSuggestions", "params", "rpcMessage", "getFilterPredicate", "getRowRecord", "isGroupMenuItemDescriptor", "metadataKeys", "useCallback", "addRowsFromInstruments", "KEY", "NO_CONFIG", "isVisualLinksAction", "action", "isVisualLinkCreatedAction", "isVisualLinkRemovedAction", "isViewportMenusAction", "isVuuFeatureAction", "isVuuFeatureInvocation", "isMenuItem", "menu", "isGroupMenuItem", "isRoot", "isCellMenu", "options", "isRowMenu", "isSelectionMenu", "vuuContextCompatibleWithTableLocation", "uiLocation", "vuuContext", "selectedRowCount", "gridRowMeetsFilterCriteria", "context", "row", "selectedRows", "filter", "columnMap", "filterPredicate", "getMenuRpcRequest", "rpcName", "hasFilter", "getMenuItemOptions", "menuShouldBeRenderedInThisContext", "menuItem", "tableLocation", "_a", "childMenu", "buildMenuDescriptor", "children", "useVuuMenuActions", "dataSource", "menuActionConfig", "onRpcResponse", "buildViewserverMenuOptions", "visualLink", "visualLinks", "vuuMenu", "descriptors", "linkDescriptor", "link", "linkLabel", "label", "menuDescriptor", "handleMenuAction", "type", "rpcRequest", "rpcResponse", "useCallback", "useEffect", "useState", "getServerAPI", "useVuuTables", "tables", "setTables", "buildTables", "schemas", "vuuTables", "schema", "fetchTableMetadata", "server", "tableSchemas", "tableDescriptor"]
|
|
4
|
+
"sourcesContent": ["// TODO is this hook needed ? it is currently used only in a vuu salt story\nimport { DataSource, SubscribeCallback } from \"@vuu-ui/vuu-data\";\nimport { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, metadataKeys, WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst { SELECTED } = metadataKeys;\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n renderBufferSize?: number;\n}\n\nexport function useDataSource({\n dataSource,\n renderBufferSize = 10,\n}: DataSourceHookProps): [\n DataSourceRow[],\n number,\n VuuRange,\n (range: VuuRange) => void\n] {\n const [, forceUpdate] = useState<object | null>(null);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rafHandle = useRef(null);\n const data = useRef<DataSourceRow[]>([]);\n const rangeRef = useRef({ from: 0, to: 10 });\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(rangeRef.current, renderBufferSize)),\n [renderBufferSize]\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n // Why bother with the slice ?\n data.current = dataWindow.data.slice();\n\n hasUpdated.current = true;\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"viewport-update\") {\n if (message.size !== undefined) {\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n forceUpdate({});\n } else if (message.size !== undefined) {\n // TODO is this right ?\n data.current = dataWindow.data.slice();\n hasUpdated.current = true;\n }\n }\n },\n [dataWindow, setData]\n );\n\n useEffect(\n () => () => {\n if (rafHandle.current) {\n cancelAnimationFrame(rafHandle.current);\n rafHandle.current = null;\n }\n isMounted.current = false;\n },\n []\n );\n\n const setRange = useCallback(\n (range) => {\n rangeRef.current = range;\n const fullRange = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n useMemo(() => {\n const { from, to } = rangeRef.current;\n const fullRange = getFullRange({ from, to }, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n }, [dataSource, dataWindow, renderBufferSize]);\n\n useEffect(() => {\n const { from, to } = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.subscribe(\n {\n range: { from, to },\n },\n datasourceMessageHandler\n );\n }, [dataSource, datasourceMessageHandler, renderBufferSize]);\n\n useEffect(\n () => () => {\n dataSource.unsubscribe();\n },\n [dataSource]\n );\n\n return [\n data.current,\n dataWindow.rowCount,\n getFullRange(rangeRef.current, renderBufferSize),\n setRange,\n ];\n}\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n this.data = new Array(to - from);\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n if (this.data[internalIndex - 1]) {\n // assign 'post-selected' selection state\n if (\n this.data[internalIndex - 1][SELECTED] === 1 &&\n data[SELECTED] === 0\n ) {\n data[SELECTED] = 2;\n }\n }\n if (index === this.rowCount - 1) {\n this.data.length = internalIndex + 1;\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange(from: number, to: number) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n}\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager, ConnectionStatusMessage } from \"@vuu-ui/vuu-data\";\n\nexport const useServerConnectionStatus = () => {\n const [connectionStatus, setConnectionStatus] = useState(\"disconnected\");\n\n const handleStatusChange = useCallback(\n ({ status }: ConnectionStatusMessage) => {\n setConnectionStatus(status);\n },\n []\n );\n\n useEffect(() => {\n ConnectionManager.on(\"connection-status\", handleStatusChange);\n return () => {\n ConnectionManager.removeListener(\"connection-status\", handleStatusChange);\n };\n }, [handleStatusChange]);\n\n return connectionStatus;\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data\";\n\nexport const useServerConnectionQuality = () => {\n const [messagesPerSecond, setMessagesPerSecond] = useState<number>(0);\n const handleConnectivityMessage = useCallback(({ messages }) => {\n setMessagesPerSecond(messages.messagesLength);\n }, []);\n\n useEffect(() => {\n ConnectionManager.on(\"connection-metrics\", handleConnectivityMessage);\n return () => {\n ConnectionManager.removeListener(\n \"connection-metrics\",\n handleConnectivityMessage\n );\n };\n }, [handleConnectivityMessage]);\n\n return messagesPerSecond;\n};\n", "import {\n ClientToServerGetUniqueValues,\n ClientToServerGetUniqueValuesStartingWith,\n TypeaheadParams,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback } from \"react\";\nimport { makeRpcCall } from \"@vuu-ui/vuu-data\";\n\nexport type SuggestionFetcher = (params: TypeaheadParams) => Promise<string[]>;\n\n// const SPECIAL_SPACE = \"_\";\nconst TYPEAHEAD_MESSAGE_CONSTANTS = {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n};\n\nexport const getTypeaheadParams = (\n table: VuuTable,\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\n// const containSpace = (text: string) => text.indexOf(\" \") !== -1;\n// const replaceSpace = (text: string) => text.replace(/\\s/g, SPECIAL_SPACE);\n\nexport const useTypeaheadSuggestions = () => {\n const getTypeaheadSuggestions: SuggestionFetcher = useCallback(\n async (params: TypeaheadParams) => {\n const rpcMessage =\n params.length === 2\n ? ({\n method: \"getUniqueFieldValues\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValues)\n : ({\n method: \"getUniqueFieldValuesStartingWith\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValuesStartingWith);\n\n const suggestions = await makeRpcCall<string[]>(rpcMessage);\n\n // TODO replacing space with underscores like this is not being correctly handled elsewhere\n return suggestions;\n // return suggestions.some(containSpace)\n // ? suggestions.map(replaceSpace)\n // : suggestions;\n },\n []\n );\n\n return getTypeaheadSuggestions;\n};\n", "import {\n DataSource,\n DataSourceMenusMessage,\n DataSourceVisualLinkCreatedMessage,\n DataSourceVisualLinkRemovedMessage,\n DataSourceVisualLinksMessage,\n MenuRpcResponse,\n VuuFeatureInvocationMessage,\n VuuFeatureMessage,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data\";\nimport {\n ContextMenuItemDescriptor,\n DataSourceRow,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { GridAction } from \"@vuu-ui/vuu-datagrid-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRowRPC,\n ClientToServerMenuRPC,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnMap,\n getRowRecord,\n isGroupMenuItemDescriptor,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\n\nexport const addRowsFromInstruments = \"addRowsFromInstruments\";\n\nexport interface VuuCellMenuItem extends VuuMenuItem {\n rowKey: string;\n field: string;\n value: VuuRowDataItemType;\n}\nexport interface VuuRowMenuItem extends VuuMenuItem {\n rowKey: string;\n row: { [key: string]: VuuRowDataItemType };\n}\n\nconst { KEY } = metadataKeys;\n\nconst NO_CONFIG: MenuActionConfig = {};\n\nexport const isVisualLinksAction = (\n action: GridAction\n): action is DataSourceVisualLinksMessage => action.type === \"vuu-links\";\n\nexport const isVisualLinkCreatedAction = (\n action: GridAction\n): action is DataSourceVisualLinkCreatedMessage =>\n action.type === \"vuu-link-created\";\n\nexport const isVisualLinkRemovedAction = (\n action: GridAction\n): action is DataSourceVisualLinkRemovedMessage =>\n action.type === \"vuu-link-removed\";\n\nexport const isViewportMenusAction = (\n action: GridAction\n): action is DataSourceMenusMessage => action.type === \"vuu-menu\";\n\nexport const isVuuFeatureAction = (\n action: GridAction\n): action is VuuFeatureMessage =>\n isViewportMenusAction(action) || isVisualLinksAction(action);\n\nexport const isVuuFeatureInvocation = (\n action: GridAction\n): action is VuuFeatureInvocationMessage =>\n action.type === \"vuu-link-created\" || action.type === \"vuu-link-removed\";\n\nconst isMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nconst isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\nconst isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\nconst isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: \"grid\" | \"header\" | \"filter\",\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n\nexport type VuuMenuActionHandler = (type: string, options: unknown) => boolean;\n\nexport interface ViewServerHookResult {\n buildViewserverMenuOptions: MenuBuilder<\n TableMenuLocation,\n VuuServerMenuOptions\n >;\n handleMenuAction: VuuMenuActionHandler;\n}\n\nexport interface MenuActionConfig {\n vuuMenu?: VuuMenu;\n visualLink?: DataSourceVisualLinkCreatedMessage;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\nexport interface VuuMenuActionHookProps {\n /**\n * By default, vuuMenuActions will be handled automatically. When activated, a\n * message will be sent to server and response will be handled here too.\n * This prop allows client to provide a custom handler for a menu Item. This will\n * take priority and if handler returns true, no further processing for the menu\n * item will be handled by Vuu. This can also be used to prevent an item from being\n * actioned, even when no custom handling is intended. If the handler returns false,\n * Vuu will process the menuItem.\n */\n clientSideMenuActionHandler?: VuuMenuActionHandler;\n dataSource: DataSource;\n menuActionConfig?: MenuActionConfig;\n onRpcResponse?: (\n response:\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n ) => void;\n}\n\ntype TableMenuLocation = \"grid\" | \"header\" | \"filter\";\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst buildMenuDescriptor = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptor(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const useVuuMenuActions = ({\n clientSideMenuActionHandler,\n dataSource,\n menuActionConfig = NO_CONFIG,\n onRpcResponse,\n}: VuuMenuActionHookProps): ViewServerHookResult => {\n const buildViewserverMenuOptions: MenuBuilder<\n TableMenuLocation,\n VuuServerMenuOptions\n > = useCallback(\n (tableLocation, options) => {\n const { visualLink, visualLinks, vuuMenu } = menuActionConfig;\n const descriptors: ContextMenuItemDescriptor[] = [];\n\n if (tableLocation === \"grid\" && visualLinks && !visualLink) {\n visualLinks.forEach((linkDescriptor: LinkDescriptorWithLabel) => {\n const { link, label: linkLabel } = linkDescriptor;\n const label = linkLabel ? linkLabel : link.toTable;\n descriptors.push({\n label: `Link to ${label}`,\n action: \"link-table\",\n options: linkDescriptor,\n });\n });\n }\n\n if (vuuMenu) {\n const menuDescriptor = buildMenuDescriptor(\n vuuMenu,\n tableLocation,\n options\n );\n if (isRoot(vuuMenu) && isGroupMenuItemDescriptor(menuDescriptor)) {\n descriptors.push(...menuDescriptor.children);\n } else if (menuDescriptor) {\n descriptors.push(menuDescriptor);\n }\n }\n\n return descriptors;\n },\n [menuActionConfig]\n );\n\n const handleMenuAction = useCallback(\n (type: string, options: unknown) => {\n if (clientSideMenuActionHandler?.(type, options)) {\n return true;\n } else if (type === \"MENU_RPC_CALL\") {\n const rpcRequest = getMenuRpcRequest(options as VuuMenuItem);\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (onRpcResponse && rpcResponse) {\n onRpcResponse && onRpcResponse(rpcResponse);\n }\n });\n return true;\n } else if (type === \"link-table\") {\n // return dataSource.createLink(options as LinkDescriptorWithLabel), true;\n return (\n (dataSource.visualLink = options as LinkDescriptorWithLabel), true\n );\n } else {\n console.log(\n `useViewServer handleMenuAction, can't handle action type ${type}`\n );\n }\n return false;\n },\n [clientSideMenuActionHandler, dataSource, onRpcResponse]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { getServerAPI, TableSchema } from \"@vuu-ui/vuu-data\";\n\nexport const useVuuTables = () => {\n const [tables, setTables] = useState<Map<string, TableSchema> | undefined>();\n\n const buildTables = useCallback((schemas: TableSchema[]) => {\n const vuuTables = new Map<string, TableSchema>();\n schemas.forEach((schema) => {\n vuuTables.set(schema.table.table, schema);\n });\n return vuuTables;\n }, []);\n\n useEffect(() => {\n async function fetchTableMetadata() {\n const server = await getServerAPI();\n const { tables } = await server.getTableList();\n const tableSchemas = buildTables(\n await Promise.all(\n tables.map((tableDescriptor) =>\n server.getTableSchema(tableDescriptor)\n )\n )\n );\n setTables(tableSchemas);\n }\n\n fetchTableMetadata();\n }, [buildTables]);\n\n return tables;\n};\n"],
|
|
5
|
+
"mappings": "AAIA,OAAS,gBAAAA,EAAc,gBAAAC,EAAc,eAAAC,MAAmB,oBACxD,OAAS,eAAAC,EAAa,aAAAC,EAAW,WAAAC,EAAS,UAAAC,EAAQ,YAAAC,MAAgB,QAElE,GAAM,CAAE,SAAAC,CAAS,EAAIP,EAOd,SAASQ,GAAc,CAC5B,WAAAC,EACA,iBAAAC,EAAmB,EACrB,EAKE,CACA,GAAM,CAAC,CAAEC,CAAW,EAAIL,EAAwB,IAAI,EAC9CM,EAAYP,EAAO,EAAI,EACvBQ,EAAaR,EAAO,EAAK,EACzBS,EAAYT,EAAO,IAAI,EACvBU,EAAOV,EAAwB,CAAC,CAAC,EACjCW,EAAWX,EAAO,CAAE,KAAM,EAAG,GAAI,EAAG,CAAC,EAErCY,EAAab,EACjB,IAAM,IAAIc,EAAanB,EAAaiB,EAAS,QAASN,CAAgB,CAAC,EACvE,CAACA,CAAgB,CACnB,EAEMS,EAAUjB,EACbkB,GAA6B,CAC5B,QAAWC,KAAOD,EAChBH,EAAW,IAAII,CAAG,EAGpBN,EAAK,QAAUE,EAAW,KAAK,MAAM,EAErCJ,EAAW,QAAU,EACvB,EACA,CAACI,CAAU,CACb,EAEMK,EAA8CpB,EACjDqB,GAAY,CACPA,EAAQ,OAAS,oBACfA,EAAQ,OAAS,QACnBN,EAAW,YAAYM,EAAQ,IAAI,EAEjCA,EAAQ,MACVJ,EAAQI,EAAQ,IAAI,EACpBZ,EAAY,CAAC,CAAC,GACLY,EAAQ,OAAS,SAE1BR,EAAK,QAAUE,EAAW,KAAK,MAAM,EACrCJ,EAAW,QAAU,IAG3B,EACA,CAACI,EAAYE,CAAO,CACtB,EAEAhB,EACE,IAAM,IAAM,CACNW,EAAU,UACZ,qBAAqBA,EAAU,OAAO,EACtCA,EAAU,QAAU,MAEtBF,EAAU,QAAU,EACtB,EACA,CAAC,CACH,EAEA,IAAMY,EAAWtB,EACduB,GAAU,CACTT,EAAS,QAAUS,EACnB,IAAMC,EAAY3B,EAAaiB,EAAS,QAASN,CAAgB,EACjED,EAAW,MAAQiB,EACnBT,EAAW,SAASS,EAAU,KAAMA,EAAU,EAAE,CAClD,EACA,CAACjB,EAAYQ,EAAYP,CAAgB,CAC3C,EAEA,OAAAN,EAAQ,IAAM,CACZ,GAAM,CAAE,KAAAuB,EAAM,GAAAC,CAAG,EAAIZ,EAAS,QACxBU,EAAY3B,EAAa,CAAE,KAAA4B,EAAM,GAAAC,CAAG,EAAGlB,CAAgB,EAC7DD,EAAW,MAAQiB,EACnBT,EAAW,SAASS,EAAU,KAAMA,EAAU,EAAE,CAClD,EAAG,CAACjB,EAAYQ,EAAYP,CAAgB,CAAC,EAE7CP,EAAU,IAAM,CACd,GAAM,CAAE,KAAAwB,EAAM,GAAAC,CAAG,EAAI7B,EAAaiB,EAAS,QAASN,CAAgB,EACpED,EAAW,UACT,CACE,MAAO,CAAE,KAAAkB,EAAM,GAAAC,CAAG,CACpB,EACAN,CACF,CACF,EAAG,CAACb,EAAYa,EAA0BZ,CAAgB,CAAC,EAE3DP,EACE,IAAM,IAAM,CACVM,EAAW,YAAY,CACzB,EACA,CAACA,CAAU,CACb,EAEO,CACLM,EAAK,QACLE,EAAW,SACXlB,EAAaiB,EAAS,QAASN,CAAgB,EAC/Cc,CACF,CACF,CAEO,IAAMN,EAAN,KAAmB,CAKxB,YAAY,CAAE,KAAAS,EAAM,GAAAC,CAAG,EAAa,CAHpC,KAAO,SAAW,EAQlB,iBAAeC,GAAqB,CAC9BA,EAAW,KAAK,KAAK,SACvB,KAAK,KAAK,OAASA,GAErB,KAAK,SAAWA,CAClB,EATE,KAAK,MAAQ,IAAI5B,EAAY0B,EAAMC,CAAE,EACrC,KAAK,KAAO,IAAI,MAAMA,EAAKD,CAAI,CACjC,CASA,IAAIZ,EAAqB,CACvB,GAAM,CAACe,CAAK,EAAIf,EAChB,GAAI,KAAK,cAAce,CAAK,EAAG,CAC7B,IAAMC,EAAgBD,EAAQ,KAAK,MAAM,KACzC,KAAK,KAAKC,CAAa,EAAIhB,EACvB,KAAK,KAAKgB,EAAgB,CAAC,GAG3B,KAAK,KAAKA,EAAgB,CAAC,EAAExB,CAAQ,IAAM,GAC3CQ,EAAKR,CAAQ,IAAM,IAEnBQ,EAAKR,CAAQ,EAAI,GAGjBuB,IAAU,KAAK,SAAW,IAC5B,KAAK,KAAK,OAASC,EAAgB,GAGzC,CAEA,WAAWD,EAAe,CACxB,OAAO,KAAK,MAAM,SAASA,CAAK,GAC9B,KAAK,KAAKA,EAAQ,KAAK,MAAM,IAAI,GAAK,KACpC,KAAK,KAAKA,EAAQ,KAAK,MAAM,IAAI,EACjC,MACN,CAEA,cAAcA,EAAe,CAC3B,OAAO,KAAK,MAAM,SAASA,CAAK,CAClC,CAEA,SAASH,EAAcC,EAAY,CACjC,GAAID,IAAS,KAAK,MAAM,MAAQC,IAAO,KAAK,MAAM,GAAI,CACpD,GAAM,CAACI,EAAaC,CAAS,EAAI,KAAK,MAAM,QAAQN,EAAMC,CAAE,EACtDM,EAAU,IAAI,MAAMN,EAAKD,CAAI,EACnC,QAASQ,EAAIH,EAAaG,EAAIF,EAAWE,IAAK,CAC5C,IAAMpB,EAAO,KAAK,WAAWoB,CAAC,EAC9B,GAAIpB,EAAM,CACR,IAAMe,EAAQK,EAAIR,EAClBO,EAAQJ,CAAK,EAAIf,GAGrB,KAAK,KAAOmB,EACZ,KAAK,MAAM,KAAOP,EAClB,KAAK,MAAM,GAAKC,EAEpB,CACF,ECxLA,OAAS,eAAAQ,EAAa,aAAAC,EAAW,YAAAC,MAAgB,QACjD,OAAS,qBAAAC,MAAkD,mBAEpD,IAAMC,GAA4B,IAAM,CAC7C,GAAM,CAACC,EAAkBC,CAAmB,EAAIJ,EAAS,cAAc,EAEjEK,EAAqBP,EACzB,CAAC,CAAE,OAAAQ,CAAO,IAA+B,CACvCF,EAAoBE,CAAM,CAC5B,EACA,CAAC,CACH,EAEA,OAAAP,EAAU,KACRE,EAAkB,GAAG,oBAAqBI,CAAkB,EACrD,IAAM,CACXJ,EAAkB,eAAe,oBAAqBI,CAAkB,CAC1E,GACC,CAACA,CAAkB,CAAC,EAEhBF,CACT,ECrBA,OAAS,eAAAI,EAAa,aAAAC,EAAW,YAAAC,MAAgB,QACjD,OAAS,qBAAAC,MAAyB,mBAE3B,IAAMC,GAA6B,IAAM,CAC9C,GAAM,CAACC,EAAmBC,CAAoB,EAAIJ,EAAiB,CAAC,EAC9DK,EAA4BP,EAAY,CAAC,CAAE,SAAAQ,CAAS,IAAM,CAC9DF,EAAqBE,EAAS,cAAc,CAC9C,EAAG,CAAC,CAAC,EAEL,OAAAP,EAAU,KACRE,EAAkB,GAAG,qBAAsBI,CAAyB,EAC7D,IAAM,CACXJ,EAAkB,eAChB,qBACAI,CACF,CACF,GACC,CAACA,CAAyB,CAAC,EAEvBF,CACT,ECdA,OAAS,eAAAI,MAAmB,QAC5B,OAAS,eAAAC,MAAmB,mBAK5B,IAAMC,EAA8B,CAClC,KAAM,WACN,QAAS,qBACX,EAEaC,GAAqB,CAChCC,EACAC,EACAC,EAAO,GACPC,EAA2B,CAAC,IAExBD,IAAS,IAAM,CAACC,EAAe,SAASD,EAAK,YAAY,CAAC,EACrD,CAACF,EAAOC,EAAQC,CAAI,EAEtB,CAACF,EAAOC,CAAM,EAMVG,GAA0B,IACcR,EACjD,MAAOS,GAA4B,CACjC,IAAMC,EACJD,EAAO,SAAW,EACb,CACC,OAAQ,uBACR,OAAAA,EACA,GAAGP,CACL,EACC,CACC,OAAQ,mCACR,OAAAO,EACA,GAAGP,CACL,EAKN,OAHoB,MAAMD,EAAsBS,CAAU,CAO5D,EACA,CAAC,CACH,ECvCF,OAAS,sBAAAC,MAA0B,4BAWnC,OAEE,gBAAAC,EACA,6BAAAC,EACA,gBAAAC,MACK,oBACP,OAAS,eAAAC,MAAmB,QAErB,IAAMC,GAAyB,yBAYhC,CAAE,IAAAC,CAAI,EAAIH,EAEVI,EAA8B,CAAC,EAExBC,EACXC,GAC2CA,EAAO,OAAS,YAEhDC,GACXD,GAEAA,EAAO,OAAS,mBAELE,GACXF,GAEAA,EAAO,OAAS,mBAELG,EACXH,GACqCA,EAAO,OAAS,WAE1CI,GACXJ,GAEAG,EAAsBH,CAAM,GAAKD,EAAoBC,CAAM,EAEhDK,GACXL,GAEAA,EAAO,OAAS,oBAAsBA,EAAO,OAAS,mBAElDM,EAAcC,GAClB,YAAaA,EAETC,EAAmBD,GACvB,UAAWA,EAEPE,EAAUF,GAAkBA,EAAK,OAAS,OAE1CG,EAAcC,GAClBA,EAAQ,UAAY,OAChBC,EAAaD,GACjBA,EAAQ,UAAY,MAChBE,EAAmBF,GACvBA,EAAQ,UAAY,gBAEhBG,GAAwC,CAC5CC,EACAC,EACAC,EAAmB,IAChB,CACH,OAAQF,EAAY,CAClB,IAAK,OACH,OAAIC,IAAe,gBACVC,EAAmB,EAEnB,GAEX,IAAK,SACH,OAAOD,IAAe,OACxB,QACE,MAAO,EACX,CACF,EAEME,GAA6B,CACjCC,EACAC,EACAC,EACAC,EACAC,IACY,CACZ,GAAIJ,IAAY,QAAUA,IAAY,MAEpC,OADwB5B,EAAmBgC,EAAWD,CAAM,EACrCF,CAAG,EACrB,GAAID,IAAY,gBAAiB,CACtC,GAAIE,EAAa,SAAW,EAC1B,MAAO,GACF,CACL,IAAMG,EAAkBjC,EAAmBgC,EAAWD,CAAM,EAC5D,OAAOD,EAAa,MAAMG,CAAe,GAG7C,MAAO,EACT,EAEMC,GACJd,GACwC,CACxC,GAAM,CAAE,QAAAe,CAAQ,EAAIf,EACpB,OAAID,EAAWC,CAAO,EACb,CACL,MAAOA,EAAQ,MACf,OAAQA,EAAQ,OAChB,QAAAe,EACA,MAAOf,EAAQ,MACf,KAAM,yBACR,EACSC,EAAUD,CAAO,EACnB,CACL,OAAQA,EAAQ,OAChB,IAAKA,EAAQ,IACb,QAAAe,EACA,KAAM,wBACR,EACSb,EAAgBF,CAAO,EACzB,CACL,QAAAe,EACA,KAAM,4BACR,EAEO,CACL,QAAAA,EACA,KAAM,0BACR,CAEJ,EAiDMC,GAAY,CAAC,CAAE,OAAAL,CAAO,IAC1B,OAAOA,GAAW,UAAYA,EAAO,OAAS,EAE1CM,GAAqB,CACzBrB,EACAI,IACgB,CAChB,OAAQJ,EAAK,QAAS,CACpB,IAAK,OACH,MAAO,CACL,GAAGA,EACH,MAAOI,EAAQ,WACf,OAAQA,EAAQ,IAAId,CAAG,EACvB,MAAOc,EAAQ,IAAIA,EAAQ,UAAUA,EAAQ,UAAU,CAAC,CAC1D,EACF,IAAK,MACH,MAAO,CACL,GAAGJ,EACH,IAAKf,EAAamB,EAAQ,IAAKA,EAAQ,SAAS,EAChD,OAAQA,EAAQ,IAAId,CAAG,CACzB,EACF,QACE,OAAOU,CACX,CACF,EAEMsB,EAAoC,CACxCC,EACAC,EACApB,IACY,CArPd,IAAAqB,EAsPE,OAAIxB,EAAgBsB,CAAQ,EACnBA,EAAS,MAAM,KAAMG,GAC1BJ,EAAkCI,EAAWF,EAAepB,CAAO,CACrE,EAGCG,GACCiB,EACAD,EAAS,SACTE,EAAArB,EAAQ,eAAR,YAAAqB,EAAsB,MACxB,EAKED,IAAkB,QAAUJ,GAAUG,CAAQ,EACzCZ,GACLY,EAAS,QACTnB,EAAQ,IACRA,EAAQ,aACRmB,EAAS,OACTnB,EAAQ,SACV,EAGED,EAAWoB,CAAQ,GAAKA,EAAS,QAAU,IACtCA,EAAS,QAAUnB,EAAQ,WAG7B,GAjBE,EAkBX,EAEMuB,EAAsB,CAC1B3B,EACAwB,EACApB,IAC0C,CAC1C,GAAIkB,EAAkCtB,EAAMwB,EAAepB,CAAO,EAAG,CACnE,GAAIL,EAAWC,CAAI,EACjB,MAAO,CACL,MAAOA,EAAK,KACZ,OAAQ,gBACR,QAASqB,GAAmBrB,EAAMI,CAAO,CAC3C,EACK,CACL,IAAMwB,EAAW5B,EAAK,MACnB,IAAK0B,GACJC,EAAoBD,EAAWF,EAAepB,CAAO,CACvD,EACC,OACEsB,GAAcA,IAAc,MAC/B,EACF,GAAIE,EAAS,OAAS,EACpB,MAAO,CACL,MAAO5B,EAAK,KACZ,SAAA4B,CACF,GAIR,EAEaC,GAAoB,CAAC,CAChC,4BAAAC,EACA,WAAAC,EACA,iBAAAC,EAAmBzC,EACnB,cAAA0C,CACF,IAAoD,CAClD,IAAMC,EAGF9C,EACF,CAACoC,EAAepB,IAAY,CAC1B,GAAM,CAAE,WAAA+B,EAAY,YAAAC,EAAa,QAAAC,CAAQ,EAAIL,EACvCM,EAA2C,CAAC,EAclD,GAZId,IAAkB,QAAUY,GAAe,CAACD,GAC9CC,EAAY,QAASG,GAA4C,CAC/D,GAAM,CAAE,KAAAC,EAAM,MAAOC,CAAU,EAAIF,EAC7BG,EAAQD,GAAwBD,EAAK,QAC3CF,EAAY,KAAK,CACf,MAAO,WAAWI,IAClB,OAAQ,aACR,QAASH,CACX,CAAC,CACH,CAAC,EAGCF,EAAS,CACX,IAAMM,EAAiBhB,EACrBU,EACAb,EACApB,CACF,EACIF,EAAOmC,CAAO,GAAKnD,EAA0ByD,CAAc,EAC7DL,EAAY,KAAK,GAAGK,EAAe,QAAQ,EAClCA,GACTL,EAAY,KAAKK,CAAc,EAInC,OAAOL,CACT,EACA,CAACN,CAAgB,CACnB,EAEMY,EAAmBxD,EACvB,CAACyD,EAAczC,IAAqB,CAClC,GAAI0B,GAAA,MAAAA,EAA8Be,EAAMzC,GACtC,MAAO,GACF,GAAIyC,IAAS,gBAAiB,CACnC,IAAMC,EAAa5B,GAAkBd,CAAsB,EAC3D,OAAA2B,EAAW,YAAYe,CAAU,EAAE,KAAMC,GAAgB,CACnDd,GAAiBc,GACnBd,GAAiBA,EAAcc,CAAW,CAE9C,CAAC,EACM,OACF,IAAIF,IAAS,aAElB,OACGd,EAAW,WAAa3B,EAAqC,GAGhE,QAAQ,IACN,6DAA6DyC,GAC/D,EAEF,MAAO,EACT,EACA,CAACf,EAA6BC,EAAYE,CAAa,CACzD,EAEA,MAAO,CACL,2BAAAC,EACA,iBAAAU,CACF,CACF,EC/XA,OAAS,eAAAI,GAAa,aAAAC,GAAW,YAAAC,OAAgB,QACjD,OAAS,gBAAAC,OAAiC,mBAEnC,IAAMC,GAAe,IAAM,CAChC,GAAM,CAACC,EAAQC,CAAS,EAAIJ,GAA+C,EAErEK,EAAcP,GAAaQ,GAA2B,CAC1D,IAAMC,EAAY,IAAI,IACtB,OAAAD,EAAQ,QAASE,GAAW,CAC1BD,EAAU,IAAIC,EAAO,MAAM,MAAOA,CAAM,CAC1C,CAAC,EACMD,CACT,EAAG,CAAC,CAAC,EAEL,OAAAR,GAAU,IAAM,CACd,eAAeU,GAAqB,CAClC,IAAMC,EAAS,MAAMT,GAAa,EAC5B,CAAE,OAAAE,CAAO,EAAI,MAAMO,EAAO,aAAa,EACvCC,EAAeN,EACnB,MAAM,QAAQ,IACZF,EAAO,IAAKS,GACVF,EAAO,eAAeE,CAAe,CACvC,CACF,CACF,EACAR,EAAUO,CAAY,CACxB,CAEAF,EAAmB,CACrB,EAAG,CAACJ,CAAW,CAAC,EAETF,CACT",
|
|
6
|
+
"names": ["getFullRange", "metadataKeys", "WindowRange", "useCallback", "useEffect", "useMemo", "useRef", "useState", "SELECTED", "useDataSource", "dataSource", "renderBufferSize", "forceUpdate", "isMounted", "hasUpdated", "rafHandle", "data", "rangeRef", "dataWindow", "MovingWindow", "setData", "updates", "row", "datasourceMessageHandler", "message", "setRange", "range", "fullRange", "from", "to", "rowCount", "index", "internalIndex", "overlapFrom", "overlapTo", "newData", "i", "useCallback", "useEffect", "useState", "ConnectionManager", "useServerConnectionStatus", "connectionStatus", "setConnectionStatus", "handleStatusChange", "status", "useCallback", "useEffect", "useState", "ConnectionManager", "useServerConnectionQuality", "messagesPerSecond", "setMessagesPerSecond", "handleConnectivityMessage", "messages", "useCallback", "makeRpcCall", "TYPEAHEAD_MESSAGE_CONSTANTS", "getTypeaheadParams", "table", "column", "text", "selectedValues", "useTypeaheadSuggestions", "params", "rpcMessage", "getFilterPredicate", "getRowRecord", "isGroupMenuItemDescriptor", "metadataKeys", "useCallback", "addRowsFromInstruments", "KEY", "NO_CONFIG", "isVisualLinksAction", "action", "isVisualLinkCreatedAction", "isVisualLinkRemovedAction", "isViewportMenusAction", "isVuuFeatureAction", "isVuuFeatureInvocation", "isMenuItem", "menu", "isGroupMenuItem", "isRoot", "isCellMenu", "options", "isRowMenu", "isSelectionMenu", "vuuContextCompatibleWithTableLocation", "uiLocation", "vuuContext", "selectedRowCount", "gridRowMeetsFilterCriteria", "context", "row", "selectedRows", "filter", "columnMap", "filterPredicate", "getMenuRpcRequest", "rpcName", "hasFilter", "getMenuItemOptions", "menuShouldBeRenderedInThisContext", "menuItem", "tableLocation", "_a", "childMenu", "buildMenuDescriptor", "children", "useVuuMenuActions", "clientSideMenuActionHandler", "dataSource", "menuActionConfig", "onRpcResponse", "buildViewserverMenuOptions", "visualLink", "visualLinks", "vuuMenu", "descriptors", "linkDescriptor", "link", "linkLabel", "label", "menuDescriptor", "handleMenuAction", "type", "rpcRequest", "rpcResponse", "useCallback", "useEffect", "useState", "getServerAPI", "useVuuTables", "tables", "setTables", "buildTables", "schemas", "vuuTables", "schema", "fetchTableMetadata", "server", "tableSchemas", "tableDescriptor"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vuu-ui/vuu-data-react",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"author": "heswell",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"devDependencies": {
|
|
7
|
-
"@vuu-ui/vuu-datagrid-types": "0.8.
|
|
8
|
-
"@vuu-ui/vuu-filter-types": "0.8.
|
|
9
|
-
"@vuu-ui/vuu-protocol-types": "0.8.
|
|
7
|
+
"@vuu-ui/vuu-datagrid-types": "0.8.2",
|
|
8
|
+
"@vuu-ui/vuu-filter-types": "0.8.2",
|
|
9
|
+
"@vuu-ui/vuu-protocol-types": "0.8.2"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@vuu-ui/vuu-data": "0.8.
|
|
13
|
-
"@vuu-ui/vuu-data-types": "0.8.
|
|
14
|
-
"@vuu-ui/vuu-filter-parser": "0.8.
|
|
15
|
-
"@vuu-ui/vuu-utils": "0.8.
|
|
12
|
+
"@vuu-ui/vuu-data": "0.8.2",
|
|
13
|
+
"@vuu-ui/vuu-data-types": "0.8.2",
|
|
14
|
+
"@vuu-ui/vuu-filter-parser": "0.8.2",
|
|
15
|
+
"@vuu-ui/vuu-utils": "0.8.2"
|
|
16
16
|
},
|
|
17
17
|
"peerDependencies": {
|
|
18
18
|
"react": "^17.0.2"
|
|
@@ -21,9 +21,10 @@ export declare const isVisualLinkRemovedAction: (action: GridAction) => action i
|
|
|
21
21
|
export declare const isViewportMenusAction: (action: GridAction) => action is DataSourceMenusMessage;
|
|
22
22
|
export declare const isVuuFeatureAction: (action: GridAction) => action is VuuFeatureMessage;
|
|
23
23
|
export declare const isVuuFeatureInvocation: (action: GridAction) => action is VuuFeatureInvocationMessage;
|
|
24
|
+
export type VuuMenuActionHandler = (type: string, options: unknown) => boolean;
|
|
24
25
|
export interface ViewServerHookResult {
|
|
25
26
|
buildViewserverMenuOptions: MenuBuilder<TableMenuLocation, VuuServerMenuOptions>;
|
|
26
|
-
handleMenuAction:
|
|
27
|
+
handleMenuAction: VuuMenuActionHandler;
|
|
27
28
|
}
|
|
28
29
|
export interface MenuActionConfig {
|
|
29
30
|
vuuMenu?: VuuMenu;
|
|
@@ -31,6 +32,16 @@ export interface MenuActionConfig {
|
|
|
31
32
|
visualLinks?: LinkDescriptorWithLabel[];
|
|
32
33
|
}
|
|
33
34
|
export interface VuuMenuActionHookProps {
|
|
35
|
+
/**
|
|
36
|
+
* By default, vuuMenuActions will be handled automatically. When activated, a
|
|
37
|
+
* message will be sent to server and response will be handled here too.
|
|
38
|
+
* This prop allows client to provide a custom handler for a menu Item. This will
|
|
39
|
+
* take priority and if handler returns true, no further processing for the menu
|
|
40
|
+
* item will be handled by Vuu. This can also be used to prevent an item from being
|
|
41
|
+
* actioned, even when no custom handling is intended. If the handler returns false,
|
|
42
|
+
* Vuu will process the menuItem.
|
|
43
|
+
*/
|
|
44
|
+
clientSideMenuActionHandler?: VuuMenuActionHandler;
|
|
34
45
|
dataSource: DataSource;
|
|
35
46
|
menuActionConfig?: MenuActionConfig;
|
|
36
47
|
onRpcResponse?: (response: MenuRpcResponse | VuuUIMessageInRPCEditReject | VuuUIMessageInRPCEditResponse) => void;
|
|
@@ -43,5 +54,5 @@ export type VuuServerMenuOptions = {
|
|
|
43
54
|
selectedRows: DataSourceRow[];
|
|
44
55
|
viewport: string;
|
|
45
56
|
};
|
|
46
|
-
export declare const useVuuMenuActions: ({ dataSource, menuActionConfig, onRpcResponse, }: VuuMenuActionHookProps) => ViewServerHookResult;
|
|
57
|
+
export declare const useVuuMenuActions: ({ clientSideMenuActionHandler, dataSource, menuActionConfig, onRpcResponse, }: VuuMenuActionHookProps) => ViewServerHookResult;
|
|
47
58
|
export {};
|