@vaadin/hilla-react-crud
Advanced tools
Comparing version
@@ -58,2 +58,11 @@ import type { AbstractModel, DetachedModelConstructor, Value } from '@vaadin/hilla-lit-form'; | ||
/** | ||
* Determines whether to display the "New" button in the toolbar. By default, | ||
* this is set to `true`, meaning the button will be shown. | ||
* | ||
* NOTE: This setting only hides the button; it does not prevent new items | ||
* from being sent to the service. Ensure your backend Java service is | ||
* properly secured to prevent unauthorized creation of new items. | ||
*/ | ||
newButton?: boolean; | ||
/** | ||
* Props to pass to the form. See the `AutoForm` component for details. | ||
@@ -82,3 +91,3 @@ */ | ||
*/ | ||
export declare function AutoCrud<TModel extends AbstractModel>({ service, model, itemIdProperty, formProps, gridProps, style, id, className, }: AutoCrudProps<TModel>): JSX.Element; | ||
export declare function AutoCrud<TModel extends AbstractModel>({ service, model, itemIdProperty, newButton, formProps, gridProps, style, id, className, }: AutoCrudProps<TModel>): JSX.Element; | ||
//# sourceMappingURL=autocrud.d.ts.map |
@@ -20,2 +20,3 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime"; | ||
itemIdProperty, | ||
newButton, | ||
formProps, | ||
@@ -57,3 +58,3 @@ gridProps, | ||
), | ||
/* @__PURE__ */ jsx("div", { className: "auto-crud-toolbar", children: /* @__PURE__ */ jsx(Button, { theme: "primary", onClick: () => setItem(emptyItem), children: "+ New" }) }) | ||
newButton !== false && /* @__PURE__ */ jsx("div", { className: "auto-crud-toolbar", children: /* @__PURE__ */ jsx(Button, { theme: "primary", onClick: () => setItem(emptyItem), children: "+ New" }) }) | ||
] }); | ||
@@ -60,0 +61,0 @@ const autoForm = /* @__PURE__ */ jsx( |
@@ -1,5 +0,7 @@ | ||
import type { GridDataProviderCallback, GridDataProviderParams } from '@vaadin/react-components/Grid'; | ||
import type { GridDataProvider } from '@vaadin/react-components/Grid'; | ||
import type { ComboBoxDataProvider, ComboBoxDataProviderCallback, ComboBoxDataProviderParams } from '@vaadin/react-components'; | ||
import type { GridDataProvider, GridDataProviderCallback, GridDataProviderParams } from '@vaadin/react-components/Grid'; | ||
import { type DependencyList } from 'react'; | ||
import type { CountService, ListService } from './crud'; | ||
import type FilterUnion from './types/com/vaadin/hilla/crud/filter/FilterUnion'; | ||
import type Pageable from './types/com/vaadin/hilla/mappedtypes/Pageable'; | ||
import type Sort from './types/com/vaadin/hilla/mappedtypes/Sort'; | ||
@@ -44,2 +46,15 @@ type MaybeCountService<TItem> = Partial<CountService<TItem>>; | ||
} | ||
export declare abstract class AbstractComboBoxDataProvider<TItem> { | ||
protected readonly list: ComboBoxFetchMethod<TItem>; | ||
protected readonly loadTotalCount?: boolean; | ||
protected sort: Sort | undefined; | ||
protected totalCount: number | undefined; | ||
protected filteredCount: number | undefined; | ||
constructor(list: ComboBoxFetchMethod<TItem>, sort: Sort | undefined); | ||
reset(): void; | ||
load(params: ComboBoxDataProviderParams, callback: ComboBoxDataProviderCallback<TItem>): void; | ||
protected fetchPage(params: ComboBoxDataProviderParams): Promise<DataPage<TItem>>; | ||
protected abstract fetchTotalCount(page: DataPage<TItem>): Promise<number | undefined> | number | undefined; | ||
protected abstract fetchFilteredCount(page: DataPage<TItem>): Promise<number | undefined> | number | undefined; | ||
} | ||
export declare class InfiniteDataProvider<TItem> extends DataProvider<TItem> { | ||
@@ -49,2 +64,6 @@ protected fetchTotalCount(): undefined; | ||
} | ||
export declare class InfiniteComboBoxDataProvider<TItem> extends AbstractComboBoxDataProvider<TItem> { | ||
protected fetchTotalCount(): undefined; | ||
protected fetchFilteredCount(page: DataPage<TItem>): number | undefined; | ||
} | ||
export declare class FixedSizeDataProvider<TItem> extends DataProvider<TItem> { | ||
@@ -62,3 +81,30 @@ service: ListAndCountService<TItem>; | ||
export declare function useDataProvider<TItem>(service: ListAndMaybeCountService<TItem>, filter?: FilterUnion): UseDataProviderResult<TItem>; | ||
export type UseGridDataProviderResult<TItem> = GridDataProvider<TItem> & { | ||
refresh(): void; | ||
}; | ||
export type GridFetchMethod<TItem> = (pageable: Pageable) => Promise<TItem[]>; | ||
/** | ||
* Creates a data provider for a grid component that fetches data using the provided fetch callback. | ||
* | ||
* @param fetch - the callback that fetches the data for the grid. The callback should return a promise that resolves to an array of items. | ||
* @param dependencies - A list of all reactive values referenced inside of the fetch callback. A change to any of the listed values will cause the grid to refresh its data. | ||
* @returns a data provider that can be assigned to a <Grid> component usings its dataProvider property and additionally contains a refresh method that can be called to force a reload of the grid data. | ||
*/ | ||
export declare function useGridDataProvider<TItem>(fetch: GridFetchMethod<TItem>, dependencies?: DependencyList): UseGridDataProviderResult<TItem>; | ||
export type UseComboBoxDataProviderResult<TItem> = ComboBoxDataProvider<TItem> & { | ||
refresh(): void; | ||
}; | ||
export type ComboBoxFetchMethod<TItem> = (pageable: Pageable, filterString: string) => Promise<TItem[]>; | ||
type ComboboxDataProviderOptions = { | ||
sort?: Sort; | ||
}; | ||
/** | ||
* Creates a data provider for a combo box component that fetches data using the provided fetch callback. | ||
* | ||
* @param fetch - the method that fetches the data for the grid. The method should return a promise that resolves to an array of items. | ||
* @param dependencies - A list of all reactive values referenced inside of the fetch callback. A change to any of the listed values will cause the combo box to refresh its data. | ||
* @returns a data provider that can be assigned to a <ComboBox> component usings its dataProvider property and additionally contains a refresh method that can be called to force a reload of the combo box data. | ||
*/ | ||
export declare function useComboBoxDataProvider<TItem>(fetch: ComboBoxFetchMethod<TItem>, options?: ComboboxDataProviderOptions, dependencies?: DependencyList): UseComboBoxDataProviderResult<TItem>; | ||
export {}; | ||
//# sourceMappingURL=data-provider.d.ts.map |
@@ -66,2 +66,53 @@ import { useMemo, useState } from "react"; | ||
} | ||
class AbstractComboBoxDataProvider { | ||
list; | ||
loadTotalCount; | ||
sort; | ||
totalCount; | ||
filteredCount; | ||
constructor(list, sort) { | ||
this.list = list; | ||
this.sort = sort; | ||
} | ||
reset() { | ||
this.totalCount = void 0; | ||
this.filteredCount = void 0; | ||
} | ||
load(params, callback) { | ||
this.fetchPage(params).then(async (page) => { | ||
this.filteredCount = await this.fetchFilteredCount(page); | ||
if (this.loadTotalCount) { | ||
this.totalCount = await this.fetchTotalCount(page); | ||
} | ||
callback(page.items, this.filteredCount); | ||
}).catch((error) => { | ||
throw error; | ||
}); | ||
} | ||
async fetchPage(params) { | ||
const pageNumber = params.page; | ||
const { pageSize } = params; | ||
const pageRequest = { | ||
pageNumber, | ||
pageSize, | ||
sort: this.sort ?? { orders: [] } | ||
}; | ||
const items = await this.list(pageRequest, params.filter); | ||
return { items, pageRequest }; | ||
} | ||
} | ||
function determineInfiniteScrollingSize(page, lastKnownSize) { | ||
const { items, pageRequest } = page; | ||
const { pageNumber, pageSize } = pageRequest; | ||
let infiniteScrollingSize; | ||
if (items.length === pageSize) { | ||
infiniteScrollingSize = (pageNumber + 1) * pageSize + 1; | ||
if (lastKnownSize !== void 0 && infiniteScrollingSize < lastKnownSize) { | ||
infiniteScrollingSize = lastKnownSize; | ||
} | ||
} else { | ||
infiniteScrollingSize = pageNumber * pageSize + items.length; | ||
} | ||
return infiniteScrollingSize; | ||
} | ||
class InfiniteDataProvider extends DataProvider { | ||
@@ -74,16 +125,15 @@ // cannot be static, otherwise it does not implement superclass | ||
fetchFilteredCount(page) { | ||
const { items, pageRequest } = page; | ||
const { pageNumber, pageSize } = pageRequest; | ||
let infiniteScrollingSize; | ||
if (items.length === pageSize) { | ||
infiniteScrollingSize = (pageNumber + 1) * pageSize + 1; | ||
if (this.filteredCount !== void 0 && infiniteScrollingSize < this.filteredCount) { | ||
infiniteScrollingSize = this.filteredCount; | ||
} | ||
} else { | ||
infiniteScrollingSize = pageNumber * pageSize + items.length; | ||
} | ||
return infiniteScrollingSize; | ||
return determineInfiniteScrollingSize(page, this.filteredCount); | ||
} | ||
} | ||
class InfiniteComboBoxDataProvider extends AbstractComboBoxDataProvider { | ||
// cannot be static, otherwise it does not implement superclass | ||
// eslint-disable-next-line @typescript-eslint/class-methods-use-this | ||
fetchTotalCount() { | ||
return void 0; | ||
} | ||
fetchFilteredCount(page) { | ||
return determineInfiniteScrollingSize(page, this.filteredCount); | ||
} | ||
} | ||
class FixedSizeDataProvider extends DataProvider { | ||
@@ -129,10 +179,45 @@ constructor(service, options = {}) { | ||
} | ||
function useGridDataProvider(fetch, dependencies) { | ||
const result = useDataProvider( | ||
useMemo( | ||
() => ({ | ||
list: async (pageable) => fetch(pageable) | ||
}), | ||
dependencies ?? [] | ||
) | ||
); | ||
const dataProvider = result.dataProvider; | ||
dataProvider.refresh = result.refresh; | ||
return dataProvider; | ||
} | ||
function createComboBoxDataProvider(list, sort) { | ||
return new InfiniteComboBoxDataProvider(list, sort); | ||
} | ||
function useComboBoxDataProvider(fetch, options, dependencies) { | ||
const [refreshCounter, setRefreshCounter] = useState(0); | ||
const dataProvider = useMemo( | ||
() => createComboBoxDataProvider(fetch, options?.sort), | ||
[options?.sort, ...dependencies ?? []] | ||
); | ||
return useMemo(() => { | ||
const dataProviderWithRefresh = (...args) => dataProvider.load(...args); | ||
dataProviderWithRefresh.refresh = () => { | ||
dataProvider.reset(); | ||
setRefreshCounter(refreshCounter + 1); | ||
}; | ||
return dataProviderWithRefresh; | ||
}, [dataProvider, refreshCounter]); | ||
} | ||
export { | ||
AbstractComboBoxDataProvider, | ||
DataProvider, | ||
FixedSizeDataProvider, | ||
InfiniteComboBoxDataProvider, | ||
InfiniteDataProvider, | ||
createDataProvider, | ||
isCountService, | ||
useDataProvider | ||
useComboBoxDataProvider, | ||
useDataProvider, | ||
useGridDataProvider | ||
}; | ||
//# sourceMappingURL=data-provider.js.map |
@@ -5,3 +5,3 @@ export * from './autogrid-feature.js'; | ||
export * from './autocrud-feature.js'; | ||
export { useDataProvider } from './data-provider.js'; | ||
export { useDataProvider, useGridDataProvider, useComboBoxDataProvider } from './data-provider.js'; | ||
//# sourceMappingURL=index.d.ts.map |
@@ -5,3 +5,3 @@ function __REGISTER__(feature, vaadinObj = window.Vaadin ??= {}) { | ||
is: feature ? `${"@vaadin/hilla-react-crud"}/${feature}` : "@vaadin/hilla-react-crud", | ||
version: "24.7.0-alpha14" | ||
version: "24.7.0-alpha15" | ||
}); | ||
@@ -12,7 +12,9 @@ } | ||
export * from "./autocrud-feature.js"; | ||
import { useDataProvider } from "./data-provider.js"; | ||
import { useDataProvider, useGridDataProvider, useComboBoxDataProvider } from "./data-provider.js"; | ||
__REGISTER__(); | ||
export { | ||
useDataProvider | ||
useComboBoxDataProvider, | ||
useDataProvider, | ||
useGridDataProvider | ||
}; | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@vaadin/hilla-react-crud", | ||
"version": "24.7.0-alpha14", | ||
"version": "24.7.0-alpha15", | ||
"description": "Hilla CRUD utils for React", | ||
@@ -59,6 +59,6 @@ "main": "index.js", | ||
"dependencies": { | ||
"@vaadin/hilla-frontend": "24.7.0-alpha14", | ||
"@vaadin/hilla-lit-form": "24.7.0-alpha14", | ||
"@vaadin/hilla-react-form": "24.7.0-alpha14", | ||
"@vaadin/react-components": "24.7.0-alpha9" | ||
"@vaadin/hilla-frontend": "24.7.0-alpha15", | ||
"@vaadin/hilla-lit-form": "24.7.0-alpha15", | ||
"@vaadin/hilla-react-form": "24.7.0-alpha15", | ||
"@vaadin/react-components": "24.7.0-alpha10" | ||
}, | ||
@@ -65,0 +65,0 @@ "peerDependencies": { |
@@ -5,3 +5,3 @@ function __REGISTER__(feature, vaadinObj = window.Vaadin ??= {}) { | ||
is: feature ? `${"@vaadin/hilla-react-crud"}/${feature}` : "@vaadin/hilla-react-crud", | ||
version: "24.7.0-alpha14" | ||
version: "24.7.0-alpha15" | ||
}); | ||
@@ -8,0 +8,0 @@ } |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
322618
5.43%3041
4.93%1
Infinity%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed