Compare commits
2 Commits
1f5999b2d1
...
ad5bc14d7c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad5bc14d7c | ||
|
|
5d8388c2db |
@ -1,5 +1,11 @@
|
|||||||
# @warkypublic/zustandsyncstore
|
# @warkypublic/zustandsyncstore
|
||||||
|
|
||||||
|
## 0.0.9
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- 5d8388c: Added selectFirstRowOnMount and fixed selection of first row
|
||||||
|
|
||||||
## 0.0.8
|
## 0.0.8
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@warkypublic/oranguru",
|
"name": "@warkypublic/oranguru",
|
||||||
"author": "Warky Devs",
|
"author": "Warky Devs",
|
||||||
"version": "0.0.8",
|
"version": "0.0.9",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@ -245,6 +245,45 @@ export const Computer = React.memo(() => {
|
|||||||
loadPage(0);
|
loadPage(0);
|
||||||
}, [ready, loadPage]);
|
}, [ready, loadPage]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const _events = getState('_events');
|
||||||
|
const loadPage = () => {
|
||||||
|
const selectFirstRowOnMount = getState('selectFirstRowOnMount');
|
||||||
|
if (selectFirstRowOnMount) {
|
||||||
|
const selectedRow = getState('selectedRow');
|
||||||
|
if (selectedRow && selectedRow >= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const keyField = getState('keyField') ?? 'id';
|
||||||
|
const page_data = getState('_page_data');
|
||||||
|
const firstBuffer = page_data?.[0]?.[0];
|
||||||
|
const firstRow = firstBuffer?.[keyField];
|
||||||
|
|
||||||
|
if (firstRow && firstRow > 0) {
|
||||||
|
const values = [
|
||||||
|
firstBuffer,
|
||||||
|
...((getState('values') ?? []) as Array<Record<string, unknown>>),
|
||||||
|
];
|
||||||
|
|
||||||
|
const onChange = getState('onChange');
|
||||||
|
console.log('Selecting first row:', firstRow, firstBuffer, values);
|
||||||
|
if (onChange) {
|
||||||
|
onChange(values);
|
||||||
|
} else {
|
||||||
|
setState('values', values);
|
||||||
|
}
|
||||||
|
|
||||||
|
setState('selectedRow', firstRow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_events?.addEventListener('loadPage', loadPage);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
_events?.removeEventListener('loadPage', loadPage);
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
// console.log('Gridler:Debug:Computer', {
|
// console.log('Gridler:Debug:Computer', {
|
||||||
// colFilters,
|
// colFilters,
|
||||||
// colOrder,
|
// colOrder,
|
||||||
|
|||||||
@ -56,7 +56,6 @@ export type FilterOptionOperator =
|
|||||||
| 'startswith';
|
| 'startswith';
|
||||||
|
|
||||||
export interface GridlerProps extends PropsWithChildren {
|
export interface GridlerProps extends PropsWithChildren {
|
||||||
askAPIRowNumber?: (key: string) => Promise<number>;
|
|
||||||
columns?: GridlerColumns;
|
columns?: GridlerColumns;
|
||||||
|
|
||||||
defaultSort?: Array<SortOption>;
|
defaultSort?: Array<SortOption>;
|
||||||
@ -99,13 +98,14 @@ export interface GridlerProps extends PropsWithChildren {
|
|||||||
top?: React.ReactNode;
|
top?: React.ReactNode;
|
||||||
};
|
};
|
||||||
selectedRow?: number;
|
selectedRow?: number;
|
||||||
|
selectFirstRowOnMount?: boolean;
|
||||||
selectMode?: 'cell' | 'row';
|
selectMode?: 'cell' | 'row';
|
||||||
showMenu?: (id: string, options?: Partial<MantineBetterMenuInstance>) => void;
|
showMenu?: (id: string, options?: Partial<MantineBetterMenuInstance>) => void;
|
||||||
title?: string;
|
title?: string;
|
||||||
tooltipBarProps?: React.HTMLAttributes<HTMLDivElement>;
|
tooltipBarProps?: React.HTMLAttributes<HTMLDivElement>;
|
||||||
total_rows?: number;
|
total_rows?: number;
|
||||||
uniqueid: string;
|
uniqueid: string;
|
||||||
useAPIQuery?: (index: number) => Promise<Array<Record<string, any>>>;
|
|
||||||
values?: Array<Record<string, any>>;
|
values?: Array<Record<string, any>>;
|
||||||
width?: number | string;
|
width?: number | string;
|
||||||
}
|
}
|
||||||
@ -124,13 +124,14 @@ export interface GridlerState {
|
|||||||
_visiblePages: Rectangle;
|
_visiblePages: Rectangle;
|
||||||
|
|
||||||
addError: (err: string, ...args: Array<any>) => void;
|
addError: (err: string, ...args: Array<any>) => void;
|
||||||
|
askAPIRowNumber?: (key: string) => Promise<number>;
|
||||||
colFilters?: Array<FilterOption>;
|
colFilters?: Array<FilterOption>;
|
||||||
colOrder?: Record<string, number>;
|
colOrder?: Record<string, number>;
|
||||||
colSize?: Record<string, number>;
|
colSize?: Record<string, number>;
|
||||||
colSort?: Array<SortOption>;
|
colSort?: Array<SortOption>;
|
||||||
data?: Array<any>;
|
data?: Array<any>;
|
||||||
|
|
||||||
errors: Array<string>;
|
errors: Array<string>;
|
||||||
|
|
||||||
focused?: boolean;
|
focused?: boolean;
|
||||||
get: () => GridlerState;
|
get: () => GridlerState;
|
||||||
getCellContent: (cell: Item) => GridCell;
|
getCellContent: (cell: Item) => GridCell;
|
||||||
@ -140,8 +141,8 @@ export interface GridlerState {
|
|||||||
) => CellArray | GetCellsThunk;
|
) => CellArray | GetCellsThunk;
|
||||||
getRowBuffer: (row: number) => Record<string, any>;
|
getRowBuffer: (row: number) => Record<string, any>;
|
||||||
getState: <K extends keyof GridlerStoreState>(key: K) => GridlerStoreState[K];
|
getState: <K extends keyof GridlerStoreState>(key: K) => GridlerStoreState[K];
|
||||||
|
|
||||||
hasLocalData: boolean;
|
hasLocalData: boolean;
|
||||||
|
|
||||||
loadingData?: boolean;
|
loadingData?: boolean;
|
||||||
loadPage: (page: number, clearMode?: 'all' | 'page') => Promise<void>;
|
loadPage: (page: number, clearMode?: 'all' | 'page') => Promise<void>;
|
||||||
mounted: boolean;
|
mounted: boolean;
|
||||||
@ -159,7 +160,6 @@ export interface GridlerState {
|
|||||||
onHeaderClicked: (colIndex: number, event: HeaderClickedEventArgs) => void;
|
onHeaderClicked: (colIndex: number, event: HeaderClickedEventArgs) => void;
|
||||||
onHeaderMenuClick: (col: number, screenPosition: Rectangle) => void;
|
onHeaderMenuClick: (col: number, screenPosition: Rectangle) => void;
|
||||||
onItemHovered: (args: GridMouseEventArgs) => void;
|
onItemHovered: (args: GridMouseEventArgs) => void;
|
||||||
|
|
||||||
onVisibleRegionChanged: (
|
onVisibleRegionChanged: (
|
||||||
r: Rectangle,
|
r: Rectangle,
|
||||||
tx: number,
|
tx: number,
|
||||||
@ -172,6 +172,7 @@ export interface GridlerState {
|
|||||||
) => void;
|
) => void;
|
||||||
|
|
||||||
pageSize: number;
|
pageSize: number;
|
||||||
|
|
||||||
ready: boolean;
|
ready: boolean;
|
||||||
reload?: () => Promise<void>;
|
reload?: () => Promise<void>;
|
||||||
renderColumns?: GridlerColumns;
|
renderColumns?: GridlerColumns;
|
||||||
@ -184,6 +185,7 @@ export interface GridlerState {
|
|||||||
value: (current: GridlerStoreState[K]) => Partial<GridlerStoreState[K]>
|
value: (current: GridlerStoreState[K]) => Partial<GridlerStoreState[K]>
|
||||||
) => Promise<void>;
|
) => Promise<void>;
|
||||||
toCell: <TRowType extends Record<string, string>>(row: TRowType, col: number) => GridCell;
|
toCell: <TRowType extends Record<string, string>>(row: TRowType, col: number) => GridCell;
|
||||||
|
useAPIQuery?: (index: number) => Promise<Array<Record<string, any>>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type GridlerStoreState = GridlerProps & GridlerState;
|
export type GridlerStoreState = GridlerProps & GridlerState;
|
||||||
@ -842,6 +844,11 @@ const { Provider, useStore: useGridlerStore } = createSyncStore<GridlerStoreStat
|
|||||||
|
|
||||||
if (rowIndex > 0) {
|
if (rowIndex > 0) {
|
||||||
ref.scrollTo(0, rowIndex);
|
ref.scrollTo(0, rowIndex);
|
||||||
|
getState('_events').dispatchEvent(
|
||||||
|
new CustomEvent('selectedRowFound', {
|
||||||
|
detail: { rowNumber: rowIndex, selectedRow: selectedRow },
|
||||||
|
})
|
||||||
|
);
|
||||||
} else if (typeof askAPIRowNumber === 'function') {
|
} else if (typeof askAPIRowNumber === 'function') {
|
||||||
askAPIRowNumber(String(selectedRow))
|
askAPIRowNumber(String(selectedRow))
|
||||||
.then((r) => {
|
.then((r) => {
|
||||||
@ -868,6 +875,7 @@ const { Provider, useStore: useGridlerStore } = createSyncStore<GridlerStoreStat
|
|||||||
return {
|
return {
|
||||||
...props,
|
...props,
|
||||||
|
|
||||||
|
colSort: props.defaultSort ?? getState('colSort') ?? [],
|
||||||
hideMenu: props.hideMenu ?? menus.hide,
|
hideMenu: props.hideMenu ?? menus.hide,
|
||||||
showMenu: props.showMenu ?? menus.show,
|
showMenu: props.showMenu ?? menus.show,
|
||||||
total_rows: props.total_rows ?? getState('total_rows') ?? 0,
|
total_rows: props.total_rows ?? getState('total_rows') ?? 0,
|
||||||
|
|||||||
@ -7,17 +7,19 @@ import { GoAPIHeaders, type GoAPIOperation } from '../../utils/golang-restapi-v2
|
|||||||
import { useGridlerStore } from '../GridlerStore';
|
import { useGridlerStore } from '../GridlerStore';
|
||||||
|
|
||||||
export interface GlidlerAPIAdaptorForGoLangv2Props<T = unknown> extends APIOptions {
|
export interface GlidlerAPIAdaptorForGoLangv2Props<T = unknown> extends APIOptions {
|
||||||
|
filter?: string;
|
||||||
initialData?: Array<T>;
|
initialData?: Array<T>;
|
||||||
options?: Array<GoAPIOperation>;
|
options?: Array<GoAPIOperation>;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _GlidlerAPIAdaptorForGoLangv2<T = unknown>(props: GlidlerAPIAdaptorForGoLangv2Props<T>) {
|
function _GlidlerAPIAdaptorForGoLangv2<T = unknown>(props: GlidlerAPIAdaptorForGoLangv2Props<T>) {
|
||||||
const [setStateFN, setState, getState, addError, mounted] = useGridlerStore((s) => [
|
const [setStateFN, setState, getState, addError, mounted, loadPage] = useGridlerStore((s) => [
|
||||||
s.setStateFN,
|
s.setStateFN,
|
||||||
s.setState,
|
s.setState,
|
||||||
s.getState,
|
s.getState,
|
||||||
s.addError,
|
s.addError,
|
||||||
s.mounted,
|
s.mounted,
|
||||||
|
s.loadPage,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const useAPIQuery: (index: number) => Promise<any> = useCallback(
|
const useAPIQuery: (index: number) => Promise<any> = useCallback(
|
||||||
@ -54,7 +56,9 @@ function _GlidlerAPIAdaptorForGoLangv2<T = unknown>(props: GlidlerAPIAdaptorForG
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (props.filter && props.filter !== '') {
|
||||||
|
head.set('x-custom-sql-w-buildin-filter', props.filter);
|
||||||
|
}
|
||||||
if (props.options && props.options.length > 0) {
|
if (props.options && props.options.length > 0) {
|
||||||
const optionHeaders = GoAPIHeaders(props.options);
|
const optionHeaders = GoAPIHeaders(props.options);
|
||||||
for (const oh in optionHeaders) {
|
for (const oh in optionHeaders) {
|
||||||
@ -116,7 +120,16 @@ function _GlidlerAPIAdaptorForGoLangv2<T = unknown>(props: GlidlerAPIAdaptorForG
|
|||||||
setState('loadingData', false);
|
setState('loadingData', false);
|
||||||
return [];
|
return [];
|
||||||
},
|
},
|
||||||
[getState, props.authtoken, props.url, props.options, setState, setStateFN, addError]
|
[
|
||||||
|
getState,
|
||||||
|
props.authtoken,
|
||||||
|
props.url,
|
||||||
|
props.filter,
|
||||||
|
props.options,
|
||||||
|
setState,
|
||||||
|
setStateFN,
|
||||||
|
addError,
|
||||||
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
const askAPIRowNumber: (key: string) => Promise<number> = useCallback(
|
const askAPIRowNumber: (key: string) => Promise<number> = useCallback(
|
||||||
@ -141,6 +154,10 @@ function _GlidlerAPIAdaptorForGoLangv2<T = unknown>(props: GlidlerAPIAdaptorForG
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (props.filter && props.filter !== '') {
|
||||||
|
head.set('x-custom-sql-w-buildin-filter', props.filter);
|
||||||
|
}
|
||||||
|
|
||||||
if (props.options && props.options.length > 0) {
|
if (props.options && props.options.length > 0) {
|
||||||
const optionHeaders = GoAPIHeaders(props.options);
|
const optionHeaders = GoAPIHeaders(props.options);
|
||||||
for (const oh in optionHeaders) {
|
for (const oh in optionHeaders) {
|
||||||
@ -165,13 +182,19 @@ function _GlidlerAPIAdaptorForGoLangv2<T = unknown>(props: GlidlerAPIAdaptorForG
|
|||||||
}
|
}
|
||||||
return [];
|
return [];
|
||||||
},
|
},
|
||||||
[props.url, props.authtoken, props.options, getState, addError]
|
[props.url, props.authtoken, props.filter, props.options, getState, addError]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//Reset the loaded pages to new rules
|
||||||
|
useEffect(() => {
|
||||||
|
loadPage(0, 'all');
|
||||||
|
}, [JSON.stringify(props.options), props.filter, props.url, props.authtoken]);
|
||||||
|
|
||||||
|
//Reset the function in the store.
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setState('useAPIQuery', useAPIQuery);
|
setState('useAPIQuery', useAPIQuery);
|
||||||
setState('askAPIRowNumber', askAPIRowNumber);
|
setState('askAPIRowNumber', askAPIRowNumber);
|
||||||
}, [props.url, props.authtoken, props.options, mounted, setState]);
|
}, [props.url, props.authtoken, props.filter, props.options, mounted, setState]);
|
||||||
|
|
||||||
return <></>;
|
return <></>;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -108,6 +108,7 @@ export const GridlerGoAPIExampleEventlog = () => {
|
|||||||
}}
|
}}
|
||||||
sections={{ ...sections, rightElementDisabled: false }}
|
sections={{ ...sections, rightElementDisabled: false }}
|
||||||
selectedRow={selectRow ? parseInt(selectRow, 10) : undefined}
|
selectedRow={selectRow ? parseInt(selectRow, 10) : undefined}
|
||||||
|
selectFirstRowOnMount={true}
|
||||||
selectMode="row"
|
selectMode="row"
|
||||||
title="Go API Example"
|
title="Go API Example"
|
||||||
uniqueid="gridtest"
|
uniqueid="gridtest"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user