docs(changeset): Added refs and exports, isEmpty
This commit is contained in:
@@ -35,6 +35,7 @@ export interface GridlerColumn extends Partial<BaseGridColumn> {
|
||||
maxWidth?: number;
|
||||
minWidth?: number;
|
||||
tooltip?: ((buffer: any, row: number, col: number) => ReactNode) | string;
|
||||
virtual?: boolean;
|
||||
width?: number;
|
||||
}
|
||||
|
||||
|
||||
@@ -307,7 +307,7 @@ export const Computer = React.memo(() => {
|
||||
if (scrollToRowKey && ref && ready) {
|
||||
getRowIndexByKey?.(scrollToRowKey).then((r) => {
|
||||
if (r !== undefined) {
|
||||
console.log('Scrolling to selected row:', scrollToRowKey, r);
|
||||
//console.log('Scrolling to selected row:', scrollToRowKey, r);
|
||||
ref.scrollTo(0, r);
|
||||
getState('_events').dispatchEvent(
|
||||
new CustomEvent('scrollToRowKeyFound', {
|
||||
@@ -328,7 +328,7 @@ export const Computer = React.memo(() => {
|
||||
if (key && ref && ready) {
|
||||
getRowIndexByKey?.(key).then((r) => {
|
||||
if (r !== undefined) {
|
||||
console.log('Scrolling to selected row:', r, selectedRowKey, scrollToRowKey);
|
||||
//console.log('Scrolling to selected row:', r, selectedRowKey, scrollToRowKey);
|
||||
|
||||
if (selectedRowKey) {
|
||||
const onChange = getState('onChange');
|
||||
|
||||
@@ -115,6 +115,7 @@ export interface GridlerProps extends PropsWithChildren {
|
||||
export interface GridlerRef {
|
||||
getGlideRef: () => DataEditorRef | undefined;
|
||||
getState: GridlerState['getState'];
|
||||
isEmpty: () => boolean;
|
||||
refresh: (parms?: any) => Promise<void>;
|
||||
reload: (parms?: any) => Promise<void>;
|
||||
reloadRow: (key: number | string) => Promise<void>;
|
||||
@@ -132,10 +133,10 @@ export interface GridlerState {
|
||||
_gridSelectionRows?: GridSelection['rows'];
|
||||
_loadingList: CompactSelection;
|
||||
_page_data: Record<number, Array<any>>;
|
||||
_refresh: () => void;
|
||||
_scrollTimeout?: any | number;
|
||||
_visibleArea: Rectangle;
|
||||
_visiblePages: Rectangle;
|
||||
|
||||
addError: (err: string, ...args: Array<any>) => void;
|
||||
askAPIRowNumber?: (key: string) => Promise<number>;
|
||||
colFilters?: Array<FilterOption>;
|
||||
@@ -144,8 +145,8 @@ export interface GridlerState {
|
||||
colSort?: Array<SortOption>;
|
||||
data?: Array<any>;
|
||||
errors: Array<string>;
|
||||
|
||||
focused?: boolean;
|
||||
|
||||
get: () => GridlerState;
|
||||
getCellContent: (cell: Item) => GridCell;
|
||||
getCellsForSelection: (
|
||||
@@ -156,6 +157,7 @@ export interface GridlerState {
|
||||
getRowIndexByKey: (key: number | string) => Promise<number | undefined>;
|
||||
getState: <K extends keyof GridlerStoreState>(key: K) => GridlerStoreState[K];
|
||||
hasLocalData: boolean;
|
||||
isEmpty: boolean;
|
||||
|
||||
loadingData?: boolean;
|
||||
loadPage: (page: number, clearMode?: 'all' | 'page') => Promise<void>;
|
||||
@@ -213,6 +215,13 @@ const { Provider, useStore: useGridlerStore } = createSyncStore<GridlerStoreStat
|
||||
_events: new EventTarget(),
|
||||
_loadingList: CompactSelection.empty(),
|
||||
_page_data: {},
|
||||
_refresh: () => {
|
||||
const s = get();
|
||||
s.loadPage(0, 'all').then(() => {
|
||||
s.refreshCells();
|
||||
s.reload?.();
|
||||
});
|
||||
},
|
||||
_visibleArea: { height: 10000, width: 1000, x: 0, y: 0 },
|
||||
_visiblePages: { height: 0, width: 0, x: 0, y: 0 },
|
||||
addError: (err: string, ...args: Array<unknown>) => {
|
||||
@@ -266,7 +275,6 @@ const { Provider, useStore: useGridlerStore } = createSyncStore<GridlerStoreStat
|
||||
return result as CellArray;
|
||||
};
|
||||
},
|
||||
|
||||
getRowBuffer: (row: number) => {
|
||||
const state = get();
|
||||
//Handle local data
|
||||
@@ -289,6 +297,7 @@ const { Provider, useStore: useGridlerStore } = createSyncStore<GridlerStoreStat
|
||||
|
||||
return rowData;
|
||||
},
|
||||
|
||||
getRowIndexByKey: async (key: number | string) => {
|
||||
const state = get();
|
||||
|
||||
@@ -330,6 +339,7 @@ const { Provider, useStore: useGridlerStore } = createSyncStore<GridlerStoreStat
|
||||
return get()[key];
|
||||
},
|
||||
hasLocalData: false,
|
||||
isEmpty: true,
|
||||
keyField: 'id',
|
||||
loadPage: async (pPage: number, clearMode?: 'all' | 'page') => {
|
||||
const state = get();
|
||||
@@ -659,7 +669,7 @@ const { Provider, useStore: useGridlerStore } = createSyncStore<GridlerStoreStat
|
||||
{
|
||||
label: `Refresh`,
|
||||
onClickAsync: async () => {
|
||||
await s.reload?.();
|
||||
await s._refresh?.();
|
||||
},
|
||||
},
|
||||
];
|
||||
@@ -836,8 +846,8 @@ const { Provider, useStore: useGridlerStore } = createSyncStore<GridlerStoreStat
|
||||
|
||||
return {
|
||||
allowOverlay: true,
|
||||
data: val,
|
||||
displayData: String(val),
|
||||
data: val ?? '',
|
||||
displayData: String(val ?? ''),
|
||||
kind: GridCellKind.Text,
|
||||
};
|
||||
} catch (e) {
|
||||
@@ -895,8 +905,7 @@ const { Provider, useStore: useGridlerStore } = createSyncStore<GridlerStoreStat
|
||||
}, [setState, getState]);
|
||||
|
||||
getState('_events').addEventListener('reload', (_e: Event) => {
|
||||
getState('reload')?.();
|
||||
getState('refreshCells')?.();
|
||||
getState('_refresh')?.();
|
||||
});
|
||||
|
||||
return {
|
||||
|
||||
@@ -7,6 +7,7 @@ import { useGridlerStore } from './GridlerStore';
|
||||
export const Pager = React.memo(() => {
|
||||
const [
|
||||
setState,
|
||||
getState,
|
||||
glideref,
|
||||
visiblePages,
|
||||
//_visibleArea,
|
||||
@@ -16,6 +17,7 @@ export const Pager = React.memo(() => {
|
||||
hasLocalData,
|
||||
] = useGridlerStore((s) => [
|
||||
s.setState,
|
||||
s.getState,
|
||||
s._glideref,
|
||||
s._visiblePages,
|
||||
//s._visibleArea,
|
||||
@@ -38,10 +40,10 @@ export const Pager = React.memo(() => {
|
||||
if (!glideref) {
|
||||
return;
|
||||
}
|
||||
if (hasLocalData) {
|
||||
//using local data, no need to load pages
|
||||
return;
|
||||
}
|
||||
// if (hasLocalData) {
|
||||
// //using local data, no need to load pages
|
||||
// return;
|
||||
// }
|
||||
const firstPage = Math.max(0, Math.floor(visiblePages.y / pageSize));
|
||||
const lastPage = Math.floor((visiblePages.y + visiblePages.height) / pageSize);
|
||||
//const upperPage = pageSize * firstPage;
|
||||
@@ -57,7 +59,10 @@ export const Pager = React.memo(() => {
|
||||
// );
|
||||
|
||||
for (const page of range(firstPage, lastPage + 1, 1)) {
|
||||
loadPage(page);
|
||||
loadPage(page).then(() => {
|
||||
const pg = getState('_page_data')?.[0] ?? {};
|
||||
setState('isEmpty', pg && pg.length > 0);
|
||||
});
|
||||
}
|
||||
}, [loadPage, pageSize, visiblePages, glideref, _loadingList, hasLocalData]);
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ function _GridlerRefHandler(props: PropsWithChildren, ref: Ref<GridlerRef> | und
|
||||
return getstate('_glideref');
|
||||
},
|
||||
getState: getstate,
|
||||
isEmpty: () => getstate('isEmpty'),
|
||||
refresh: async (parms?: any) => {
|
||||
const refreshCells = getstate('refreshCells');
|
||||
const loadPage = getstate('loadPage');
|
||||
|
||||
@@ -2,12 +2,14 @@
|
||||
import React, { useCallback, useEffect } from 'react';
|
||||
|
||||
import type { APIOptions } from '../../utils/types';
|
||||
import type { GridlerColumn } from '../Column';
|
||||
|
||||
import { GoAPIHeaders, type GoAPIOperation } from '../../utils/golang-restapi-v2';
|
||||
import { useGridlerStore } from '../GridlerStore';
|
||||
|
||||
export interface GlidlerAPIAdaptorForGoLangv2Props<T = unknown> extends APIOptions {
|
||||
filter?: string;
|
||||
hotfields?: Array<string>;
|
||||
initialData?: Array<T>;
|
||||
options?: Array<GoAPIOperation>;
|
||||
}
|
||||
@@ -24,6 +26,7 @@ function _GlidlerAPIAdaptorForGoLangv2<T = unknown>(props: GlidlerAPIAdaptorForG
|
||||
|
||||
const useAPIQuery: (index: number) => Promise<any> = useCallback(
|
||||
async (index: number) => {
|
||||
const columns = getState('columns');
|
||||
const colSort = getState('colSort');
|
||||
const pageSize = getState('pageSize');
|
||||
const colFilters = getState('colFilters');
|
||||
@@ -66,6 +69,21 @@ function _GlidlerAPIAdaptorForGoLangv2<T = unknown>(props: GlidlerAPIAdaptorForG
|
||||
}
|
||||
}
|
||||
|
||||
const col_ids =
|
||||
columns
|
||||
?.filter((col) => !col.virtual)
|
||||
?.map((col: GridlerColumn) => {
|
||||
return col.id;
|
||||
}) ?? [];
|
||||
|
||||
if (props.hotfields && props.hotfields.length > 0) {
|
||||
col_ids?.push(props.hotfields.join(','));
|
||||
}
|
||||
|
||||
if (col_ids && col_ids.length > 0) {
|
||||
head.set(`x-select-fields`, col_ids.join(','));
|
||||
}
|
||||
|
||||
const currentRequestIndex = _active_requests?.findIndex((f) => f.page === index) ?? -1;
|
||||
_active_requests?.forEach((r) => {
|
||||
if ((r.page >= 0 && r.page < index - 2) || (index >= 0 && r.page > index + 2)) {
|
||||
|
||||
@@ -2,7 +2,7 @@ export {GlidlerAPIAdaptorForGoLangv2 } from './components/adaptors/GlidlerAPIAda
|
||||
export {GlidlerFormAdaptor } from './components/adaptors/GlidlerFormAdaptor'
|
||||
export {GlidlerLocalDataAdaptor } from './components/adaptors/GlidlerLocalDataAdaptor'
|
||||
export * from './components/Column'
|
||||
export {useGridlerStore } from './components/GridlerStore'
|
||||
export {type GridlerProps, useGridlerStore } from './components/GridlerStore'
|
||||
export { GridlerRightMenuIcon } from './components/RightMenuIcon'
|
||||
export {Gridler} from './Gridler'
|
||||
export * from './utils'
|
||||
Reference in New Issue
Block a user