diff --git a/src/Gridler/Gridler.tsx b/src/Gridler/Gridler.tsx index 9cfd203..f7b9539 100644 --- a/src/Gridler/Gridler.tsx +++ b/src/Gridler/Gridler.tsx @@ -2,6 +2,9 @@ import '@glideapps/glide-data-grid/dist/index.css'; import React from 'react'; import { MantineBetterMenusProvider } from '../MantineBetterMenu'; +import { APIAdaptorGoLangv2 } from './components/APIAdaptorGoLangv2'; +import { GlidlerFormInterface } from './components/GridlerFormInterface'; +import { LocalDataAdaptor } from './components/LocalDataAdaptor'; import { type GridlerProps, Provider } from './components/Store'; import { GridlerDataGrid } from './GridlerDataGrid'; @@ -23,3 +26,7 @@ export const Gridler = (props: GridlerProps) => { ); }; + +Gridler.GlidlerFormInterface = GlidlerFormInterface; +Gridler.APIAdaptorGoLangv2 = APIAdaptorGoLangv2; +Gridler.LocalDataAdaptor = LocalDataAdaptor; diff --git a/src/Gridler/components/GridlerFormInterface.tsx b/src/Gridler/components/GridlerFormInterface.tsx index 9ccb605..c78c4fb 100644 --- a/src/Gridler/components/GridlerFormInterface.tsx +++ b/src/Gridler/components/GridlerFormInterface.tsx @@ -1,26 +1,112 @@ -import { useEffect } from 'react'; +import { useCallback, useEffect } from 'react'; +import type { MantineBetterMenuInstanceItem } from '../../MantineBetterMenu'; import type { FormRequestType } from '../utils/types'; +import type { GridlerColumn } from './Column'; -import { type GridlerProps, useGridlerStore } from './Store'; +import { type GridlerProps, type GridlerState, useGridlerStore } from './Store'; export function GlidlerFormInterface(props: { getMenuItems?: GridlerProps['getMenuItems']; - onRequestForm: (request: FormRequestType, data: Record) => void; + onReload?: () => void; + onRequestForm: (request: FormRequestType, data: Record) => void; }) { - // const [getMenuItems, getState, , mounted, setState] = useGridlerStore((s) => [ - // s.getMenuItems, - // s.getState, - // s.mounted, - // s.setState, - // ]); + const [getState, mounted, setState, reload] = useGridlerStore((s) => [ + s.getState, + s.mounted, + s.setState, + s.reload, + ]); - // useEffect(() => { - // if (mounted) { - // setState('getMenuItems', props.getMenuItems); - // setState('onRequestForm', props.onRequestForm); - // } - // }, [props.getMenuItems, props.onRequestForm, mounted, setState]); + const getMenuItems = useCallback( + ( + id: string, + storeState: GridlerState, + row?: unknown, + col?: GridlerColumn, + defaultItems?: Array + ) => { + //console.log('GlidlerFormInterface getMenuItems', id); + + if (id === 'header-menu') { + return defaultItems || []; + } + + const items = [] as Array; + if (!row) { + const firstRow = getState('_gridSelection')?.rows?.first(); + if (firstRow !== undefined) { + row = storeState.getRowBuffer(firstRow); + } + } + + if (id === 'other') { + items.push({ + c: 'blue', + label: 'Add', + onClick: () => { + props.onRequestForm('insert', row as Record); + }, + }); + } + if ((id === 'cell' && row) || (id === 'menu' && row)) { + items.push({ + c: 'blue', + label: 'Add', + onClick: () => { + props.onRequestForm('insert', row as Record); + }, + }); + items.push({ + c: 'green', + label: 'Change', + onClick: () => { + props.onRequestForm('change', row as Record); + }, + }); + items.push({ + c: 'red', + label: 'Delete', + onClick: () => { + props.onRequestForm('delete', row as Record); + }, + }); + } + + items.push({ + isDivider: true, + }); + + items.push({ + c: 'orange', + label: 'Refresh', + onClick: () => { + reload?.(); + }, + }); + + const result = props.getMenuItems + ? props.getMenuItems(id, storeState, row, col, items) + : items; + //console.log('GlidlerFormInterface getMenuItems', id, items); + + if (!items || items.length === 0) { + return defaultItems || []; + } + return result; + }, + [props.onRequestForm, getState] + ); + + useEffect(() => { + if (mounted && typeof setState === 'function') { + //console.log('GlidlerFormInterface setState getMenuItems1', mounted); + if (getState('getMenuItems') !== getMenuItems) { + setState('getMenuItems', getMenuItems); + } + } + return () => {}; + }, [props.getMenuItems, mounted]); return <>; } diff --git a/src/Gridler/components/LocalDataAdaptor.tsx b/src/Gridler/components/LocalDataAdaptor.tsx index 955e9a4..10153fc 100644 --- a/src/Gridler/components/LocalDataAdaptor.tsx +++ b/src/Gridler/components/LocalDataAdaptor.tsx @@ -5,7 +5,7 @@ import type { APIOptions } from '../utils/types'; import { useGridlerStore } from './Store'; -interface LocalDataAdaptorProps extends APIOptions { +interface LocalDataAdaptorProps { data: Array; } @@ -16,27 +16,23 @@ export const LocalDataAdaptor = React.memo((props: LocalDataAdaptorProps) => { s.setState, s.getState, s.addError, - s.mounted + s.mounted, ]); const useAPIQuery: (index: number) => Promise = async (index: number) => { - const colSort = getState('colSort'); const pageSize = getState('pageSize'); - const colFilters = getState('colFilters'); - const _active_requests = getState('_active_requests'); if (!(props.data && Array.isArray(props.data))) { return []; } - setState('total_rows', props.data.length); - return props.data.slice(index * (pageSize ?? 50), (index + 1) * (pageSize ?? 50)); - + setState('total_rows', props.data.length); + return props.data.slice(index * (pageSize ?? 50), (index + 1) * (pageSize ?? 50)); }; useEffect(() => { setState('useAPIQuery', useAPIQuery); - }, [props.url, props.authtoken, mounted, setState]); + }, [mounted, setState]); return <>; }); diff --git a/src/Gridler/components/Store.tsx b/src/Gridler/components/Store.tsx index b265781..e545adb 100644 --- a/src/Gridler/components/Store.tsx +++ b/src/Gridler/components/Store.tsx @@ -22,7 +22,11 @@ import { createSyncStore } from '@warkypublic/zustandsyncstore'; import { produce } from 'immer'; import { type PropsWithChildren, type ReactNode, useEffect } from 'react'; -import { type MantineBetterMenuInstance, useMantineBetterMenus } from '../../MantineBetterMenu'; +import { + type MantineBetterMenuInstance, + type MantineBetterMenuInstanceItem, + useMantineBetterMenus, +} from '../../MantineBetterMenu'; import { type FormRequestType } from '../utils/types'; import { ColumnFilterSet, type GridlerColumn, type GridlerColumns } from './Column'; import { SortDownSprite } from './sprites/SortDown'; @@ -51,7 +55,7 @@ export type FilterOptionOperator = export interface GridlerProps extends PropsWithChildren { askAPIRowNumber?: (key: string) => Promise; columns?: GridlerColumns; - data?: Array; + defaultSort?: Array; enableOddEvenRowColor?: boolean; getMenuItems?: ( @@ -59,8 +63,8 @@ export interface GridlerProps extends PropsWithChildren { storeState: GridlerState, row?: any, col?: GridlerColumn, - defaultItems?: Array - ) => Array; + defaultItems?: Array + ) => Array; glideProps?: Partial; headerHeight?: number; @@ -103,6 +107,7 @@ export interface GridlerProps extends PropsWithChildren { export interface GridlerState { _active_requests?: Array<{ controller: AbortController; page: number }>; _activeTooltip?: ReactNode; + _events: EventTarget; _glideref?: DataEditorRef; _gridSelection?: GridSelection; _gridSelectionRows?: GridSelection['rows']; @@ -111,14 +116,15 @@ export interface GridlerState { _scrollTimeout?: any | number; _visibleArea: Rectangle; _visiblePages: Rectangle; + addError: (err: string, ...args: Array) => void; colFilters?: Array; colOrder?: Record; colSize?: Record; colSort?: Array; data?: Array; - errors: Array; + errors: Array; focused?: boolean; get: () => GridlerState; getCellContent: (cell: Item) => GridCell; @@ -128,8 +134,8 @@ export interface GridlerState { ) => CellArray | GetCellsThunk; getRowBuffer: (row: number) => any; getState: (key: K) => GridlerStoreState[K]; - hasLocalData: boolean; + hasLocalData: boolean; loadingData?: boolean; loadPage: (page: number, clearMode?: 'all' | 'page') => Promise; mounted: boolean; @@ -146,6 +152,7 @@ export interface GridlerState { onHeaderClicked: (colIndex: number, event: HeaderClickedEventArgs) => void; onHeaderMenuClick: (col: number, screenPosition: Rectangle) => void; onItemHovered: (args: GridMouseEventArgs) => void; + onVisibleRegionChanged: ( r: Rectangle, tx: number, @@ -158,7 +165,6 @@ export interface GridlerState { ) => void; pageSize: number; - reload?: () => Promise; renderColumns?: GridlerColumns; setState: ( @@ -179,6 +185,7 @@ export type SortOption = { direction: 'asc' | 'desc'; id: string; order?: number const { Provider, useStore: useGridlerStore } = createSyncStore( (set, get) => ({ + _events: new EventTarget(), _loadingList: CompactSelection.empty(), _page_data: {}, _visibleArea: { height: 10000, width: 1000, x: 0, y: 0 }, @@ -265,6 +272,15 @@ const { Provider, useStore: useGridlerStore } = createSyncStore { console.warn('loadPage Error: ', page, e); + state._events.dispatchEvent( + new CustomEvent('loadPage_error', { + detail: { clearMode, error: e, page: pPage, state }, + }) + ); }); } }, @@ -316,6 +342,11 @@ const { Provider, useStore: useGridlerStore } = createSyncStore { const s = get(); @@ -396,22 +427,17 @@ const { Provider, useStore: useGridlerStore } = createSyncStore { const onUnMounted = getState('onUnMounted'); setState('mounted', false); + getState('_events').dispatchEvent( + new CustomEvent('unmounted', { + detail: {}, + }) + ); if (typeof onUnMounted === 'function') { onUnMounted(); } @@ -742,6 +778,11 @@ const { Provider, useStore: useGridlerStore } = createSyncStore { if (r >= 0) { ref.scrollTo(0, r); + getState('_events').dispatchEvent( + new CustomEvent('selectedRowFound', { + detail: { rowNumber: r, selectedRow: selectedRow }, + }) + ); } }) .catch((e) => { @@ -751,6 +792,10 @@ const { Provider, useStore: useGridlerStore } = createSyncStore { + getState('reload')?.(); + }); + return { ...props, hasLocalData: props.data && props.data.length > 0, diff --git a/src/Gridler/stories/Examples.goapi.tsx b/src/Gridler/stories/Examples.goapi.tsx index 73fa09d..acd6a8c 100644 --- a/src/Gridler/stories/Examples.goapi.tsx +++ b/src/Gridler/stories/Examples.goapi.tsx @@ -68,18 +68,19 @@ export const GridlerGoAPIExampleEventlog = () => { { - return [ - ...(defaultItems ?? []), - // { - // id: 'test', - // label: `Test -${id}`, - // onClick: () => { - // console.log('Test clicked', row, col); - // }, - // }, - ]; - }} + // getMenuItems={(id, _state, row, col, defaultItems) => { + // console.log('GridlerGoAPIExampleEventlog getMenuItems root', id, row, col, defaultItems); + // return [ + // ...(defaultItems ?? []), + // // { + // // id: 'test', + // // label: `Test -${id}`, + // // onClick: () => { + // // console.log('Test clicked', row, col); + // // }, + // // }, + // ]; + // }} keyField="id_process" onChange={(v) => { //console.log('GridlerGoAPIExampleEventlog onChange', v); @@ -91,7 +92,12 @@ export const GridlerGoAPIExampleEventlog = () => { uniqueid="gridtest" values={values} > - + + { + console.log('Form requested', request, data); + }} + /> diff --git a/src/Gridler/stories/Examples.localdata.tsx b/src/Gridler/stories/Examples.localdata.tsx index 37f4c05..2853c95 100644 --- a/src/Gridler/stories/Examples.localdata.tsx +++ b/src/Gridler/stories/Examples.localdata.tsx @@ -5,7 +5,6 @@ import type { GridlerColumns } from '../components/Column'; import { Gridler } from '../Gridler'; export const GridlerLocaldataExampleEventlog = () => { - const columns: GridlerColumns = [ { id: 'rid_atevent', @@ -47,17 +46,13 @@ export const GridlerLocaldataExampleEventlog = () => {

Demo Using Local Data

- - + +
); }; - -const localData = JSON.parse(`[{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978827,"rid_deletedparent":null,"rid_parent":5784029,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":101},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978826,"rid_deletedparent":null,"rid_parent":5784028,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":102},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978825,"rid_deletedparent":null,"rid_parent":5784027,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":103},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978824,"rid_deletedparent":null,"rid_parent":5784026,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":104},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978823,"rid_deletedparent":null,"rid_parent":5784025,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":105},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978822,"rid_deletedparent":null,"rid_parent":5784024,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":106},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978821,"rid_deletedparent":null,"rid_parent":5784023,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":107},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978820,"rid_deletedparent":null,"rid_parent":5784022,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":108},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978819,"rid_deletedparent":null,"rid_parent":5784021,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":109},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978818,"rid_deletedparent":null,"rid_parent":5784020,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":110},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978817,"rid_deletedparent":null,"rid_parent":5784019,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":111},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978816,"rid_deletedparent":null,"rid_parent":5784018,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":112},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978815,"rid_deletedparent":null,"rid_parent":5784017,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":113},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978814,"rid_deletedparent":null,"rid_parent":5784016,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":114},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978813,"rid_deletedparent":null,"rid_parent":5784015,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":115},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978812,"rid_deletedparent":null,"rid_parent":5784014,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":116},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978811,"rid_deletedparent":null,"rid_parent":5784013,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":117},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978810,"rid_deletedparent":null,"rid_parent":5784012,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":118},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978809,"rid_deletedparent":null,"rid_parent":5784011,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":119},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978808,"rid_deletedparent":null,"rid_parent":5784010,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":120},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978807,"rid_deletedparent":null,"rid_parent":5784009,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":121},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978790,"rid_deletedparent":null,"rid_parent":5776667,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":122},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978789,"rid_deletedparent":null,"rid_parent":5776666,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":123},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978788,"rid_deletedparent":null,"rid_parent":5776665,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":124},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978787,"rid_deletedparent":null,"rid_parent":5776664,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":125},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978786,"rid_deletedparent":null,"rid_parent":5776663,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":126},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978785,"rid_deletedparent":null,"rid_parent":5776662,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":127},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978784,"rid_deletedparent":null,"rid_parent":5776661,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":128},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978783,"rid_deletedparent":null,"rid_parent":5776660,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":129},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978782,"rid_deletedparent":null,"rid_parent":5776659,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":130},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978781,"rid_deletedparent":null,"rid_parent":5776658,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":131},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978780,"rid_deletedparent":null,"rid_parent":5776657,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":132},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978779,"rid_deletedparent":null,"rid_parent":5776656,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":133},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978778,"rid_deletedparent":null,"rid_parent":5776655,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":134},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978777,"rid_deletedparent":null,"rid_parent":5776654,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":135},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978776,"rid_deletedparent":null,"rid_parent":5776653,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":136},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978775,"rid_deletedparent":null,"rid_parent":5776652,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":137},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978774,"rid_deletedparent":null,"rid_parent":5776651,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":138},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978773,"rid_deletedparent":null,"rid_parent":5776650,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":139},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978772,"rid_deletedparent":null,"rid_parent":5776649,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":140},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978771,"rid_deletedparent":null,"rid_parent":5776648,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":141},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978770,"rid_deletedparent":null,"rid_parent":5776647,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":142},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978769,"rid_deletedparent":null,"rid_parent":5776646,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":143},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978768,"rid_deletedparent":null,"rid_parent":5776645,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":144},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978767,"rid_deletedparent":null,"rid_parent":5776644,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":145},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978766,"rid_deletedparent":null,"rid_parent":5776643,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":146},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978765,"rid_deletedparent":null,"rid_parent":5776642,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":147},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978764,"rid_deletedparent":null,"rid_parent":5776641,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":148},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978763,"rid_deletedparent":null,"rid_parent":5776640,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":149},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978762,"rid_deletedparent":null,"rid_parent":5776639,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":150}]`) \ No newline at end of file +const localData = JSON.parse( + `[{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978827,"rid_deletedparent":null,"rid_parent":5784029,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":101},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978826,"rid_deletedparent":null,"rid_parent":5784028,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":102},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978825,"rid_deletedparent":null,"rid_parent":5784027,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":103},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978824,"rid_deletedparent":null,"rid_parent":5784026,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":104},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978823,"rid_deletedparent":null,"rid_parent":5784025,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":105},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978822,"rid_deletedparent":null,"rid_parent":5784024,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":106},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978821,"rid_deletedparent":null,"rid_parent":5784023,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":107},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978820,"rid_deletedparent":null,"rid_parent":5784022,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":108},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978819,"rid_deletedparent":null,"rid_parent":5784021,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":109},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978818,"rid_deletedparent":null,"rid_parent":5784020,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":110},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978817,"rid_deletedparent":null,"rid_parent":5784019,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":111},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978816,"rid_deletedparent":null,"rid_parent":5784018,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":112},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978815,"rid_deletedparent":null,"rid_parent":5784017,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":113},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978814,"rid_deletedparent":null,"rid_parent":5784016,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":114},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978813,"rid_deletedparent":null,"rid_parent":5784015,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":115},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978812,"rid_deletedparent":null,"rid_parent":5784014,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":116},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978811,"rid_deletedparent":null,"rid_parent":5784013,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":117},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978810,"rid_deletedparent":null,"rid_parent":5784012,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":118},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978809,"rid_deletedparent":null,"rid_parent":5784011,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":119},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978808,"rid_deletedparent":null,"rid_parent":5784010,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":120},{"actionx":1,"changedate":"2025-08-11","changetime":"09:58:12","changeuser":"","rid_atevent":38978807,"rid_deletedparent":null,"rid_parent":5784009,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":121},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978790,"rid_deletedparent":null,"rid_parent":5776667,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":122},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978789,"rid_deletedparent":null,"rid_parent":5776666,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":123},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978788,"rid_deletedparent":null,"rid_parent":5776665,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":124},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978787,"rid_deletedparent":null,"rid_parent":5776664,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":125},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978786,"rid_deletedparent":null,"rid_parent":5776663,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":126},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978785,"rid_deletedparent":null,"rid_parent":5776662,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":127},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978784,"rid_deletedparent":null,"rid_parent":5776661,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":128},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978783,"rid_deletedparent":null,"rid_parent":5776660,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":129},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978782,"rid_deletedparent":null,"rid_parent":5776659,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":130},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978781,"rid_deletedparent":null,"rid_parent":5776658,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":131},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978780,"rid_deletedparent":null,"rid_parent":5776657,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":132},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978779,"rid_deletedparent":null,"rid_parent":5776656,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":133},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978778,"rid_deletedparent":null,"rid_parent":5776655,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":134},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978777,"rid_deletedparent":null,"rid_parent":5776654,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":135},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978776,"rid_deletedparent":null,"rid_parent":5776653,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":136},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978775,"rid_deletedparent":null,"rid_parent":5776652,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":137},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978774,"rid_deletedparent":null,"rid_parent":5776651,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":138},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978773,"rid_deletedparent":null,"rid_parent":5776650,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":139},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978772,"rid_deletedparent":null,"rid_parent":5776649,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":140},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978771,"rid_deletedparent":null,"rid_parent":5776648,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":141},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978770,"rid_deletedparent":null,"rid_parent":5776647,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":142},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978769,"rid_deletedparent":null,"rid_parent":5776646,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":143},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978768,"rid_deletedparent":null,"rid_parent":5776645,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":144},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978767,"rid_deletedparent":null,"rid_parent":5776644,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":145},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978766,"rid_deletedparent":null,"rid_parent":5776643,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":146},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978765,"rid_deletedparent":null,"rid_parent":5776642,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":147},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978764,"rid_deletedparent":null,"rid_parent":5776641,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":148},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978763,"rid_deletedparent":null,"rid_parent":5776640,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":149},{"actionx":3,"changedate":"2025-08-11","changetime":"09:58:11","changeuser":"","rid_atevent":38978762,"rid_deletedparent":null,"rid_parent":5776639,"rid_user":null,"tablename":"scriptcode","updatecnt":0,"_changed_date":null,"_changed_time":null,"_rownumber":150}]` +);