@contember/bindx-dataview 0.1.48 → 0.1.50
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/dist/DataGrid.d.ts.map +1 -1
- package/dist/DataViewContext.d.ts +4 -0
- package/dist/DataViewContext.d.ts.map +1 -1
- package/dist/HasManyDataGrid.d.ts.map +1 -1
- package/dist/contextHooks.d.ts +3 -1
- package/dist/contextHooks.d.ts.map +1 -1
- package/dist/export.d.ts.map +1 -1
- package/dist/filterHooks.d.ts.map +1 -1
- package/dist/hasManyRelationQuery.d.ts +32 -0
- package/dist/hasManyRelationQuery.d.ts.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/select/SelectDataView.d.ts.map +1 -1
- package/dist/useDataViewState.d.ts +8 -1
- package/dist/useDataViewState.d.ts.map +1 -1
- package/dist/useListFetchAllData.d.ts +15 -0
- package/dist/useListFetchAllData.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/DataGrid.tsx +11 -1
- package/src/DataViewContext.tsx +5 -0
- package/src/HasManyDataGrid.tsx +38 -50
- package/src/contextHooks.ts +11 -2
- package/src/export.tsx +10 -40
- package/src/filterHooks.ts +9 -8
- package/src/hasManyRelationQuery.ts +92 -0
- package/src/index.ts +5 -0
- package/src/select/SelectDataView.tsx +10 -1
- package/src/useDataViewState.ts +57 -31
- package/src/useListFetchAllData.ts +38 -0
package/dist/DataGrid.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataGrid.d.ts","sourceRoot":"","sources":["../src/DataGrid.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,KAAK,YAAY,EAAE,KAAK,SAAS,EAAqD,MAAM,OAAO,CAAA;AAClH,OAAO,KAAK,EACX,SAAS,EACT,cAAc,EACd,cAAc,EACd,cAAc,EACd,eAAe,EACf,YAAY,EACZ,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAQ3D,OAAO,EAAoB,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"DataGrid.d.ts","sourceRoot":"","sources":["../src/DataGrid.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,KAAK,YAAY,EAAE,KAAK,SAAS,EAAqD,MAAM,OAAO,CAAA;AAClH,OAAO,KAAK,EACX,SAAS,EACT,cAAc,EACd,cAAc,EACd,cAAc,EACd,eAAe,EACf,YAAY,EACZ,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAQ3D,OAAO,EAAoB,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAG3E,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAM5B,MAAM,WAAW,aAAa,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAC9F,wBAAwB;IACxB,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAA;IAC3B,4FAA4F;IAC5F,QAAQ,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,KAAK,SAAS,CAAA;IACnE,8EAA8E;IAC9E,cAAc,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;IACxD,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,wBAAwB;IACxB,OAAO,CAAC,EAAE,SAAS,cAAc,EAAE,CAAA;IACnC,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,eAAe,CAAA;IAClC,uDAAuD;IACvD,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,qCAAqC;IACrC,uBAAuB,CAAC,EAAE,kBAAkB,CAAA;IAC5C,6CAA6C;IAC7C,qBAAqB,CAAC,EAAE,kBAAkB,CAAA;IAC1C,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD,iBAAS,YAAY,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAC9D,MAAM,EACN,QAAQ,EACR,cAAc,EACd,YAAiB,EACjB,MAAM,EAAE,YAAY,EACpB,OAAO,EACP,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EACvB,qBAAqB,EACrB,UAAU,GACV,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,YAAY,GAAG,IAAI,CAkH/C;AAMD,eAAO,MAAM,QAAQ,EAAoC,OAAO,YAAY,CAAA"}
|
|
@@ -13,6 +13,8 @@ export interface DataViewElementData {
|
|
|
13
13
|
readonly label?: React.ReactNode;
|
|
14
14
|
readonly fallback?: boolean;
|
|
15
15
|
}
|
|
16
|
+
/** Fetches every row in the view's scope, unpaged. Resolves to null when the query returned an unexpected result. */
|
|
17
|
+
export type DataViewFetchAllData = () => Promise<readonly Record<string, unknown>[] | null>;
|
|
16
18
|
export interface DataViewContextValue {
|
|
17
19
|
readonly filtering: FilteringState;
|
|
18
20
|
readonly sorting: SortingStateResult;
|
|
@@ -27,6 +29,8 @@ export interface DataViewContextValue {
|
|
|
27
29
|
readonly highlightIndex: number | null;
|
|
28
30
|
readonly setHighlightIndex: (index: number | null) => void;
|
|
29
31
|
readonly selectionMeta: SelectionMeta;
|
|
32
|
+
/** Owned by each view, so the query keeps the scope the view loads with (static filter, parent relation). */
|
|
33
|
+
readonly fetchAllData: DataViewFetchAllData;
|
|
30
34
|
readonly toolbarContent?: React.ReactNode;
|
|
31
35
|
/** Named layout render callbacks — analyzed during collection, called per item at runtime */
|
|
32
36
|
readonly layoutRenders: ReadonlyMap<string, (item: DataViewItem) => React.ReactNode>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataViewContext.d.ts","sourceRoot":"","sources":["../src/DataViewContext.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAoC,MAAM,OAAO,CAAA;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACxH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErE,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAA;AAEhF,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;AAEjD,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;IACpC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAClC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAA;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAA;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAA;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAA;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC1D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzC,6FAA6F;IAC7F,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,KAAK,CAAC,SAAS,CAAC,CAAA;IACpF,qFAAqF;IACrF,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC,CAAA;CAC5E;AAID,wBAAgB,kBAAkB,IAAI,oBAAoB,CAMzD;AAED,wBAAgB,0BAA0B,IAAI,oBAAoB,GAAG,IAAI,CAExE;AAED,eAAO,MAAM,gBAAgB,6CAA2B,CAAA"}
|
|
1
|
+
{"version":3,"file":"DataViewContext.d.ts","sourceRoot":"","sources":["../src/DataViewContext.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAoC,MAAM,OAAO,CAAA;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACxH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErE,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAA;AAEhF,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;AAEjD,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,qHAAqH;AACrH,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;AAE3F,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;IACpC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAClC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAA;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAA;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAA;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAA;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC1D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,6GAA6G;IAC7G,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAA;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzC,6FAA6F;IAC7F,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,KAAK,CAAC,SAAS,CAAC,CAAA;IACpF,qFAAqF;IACrF,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC,CAAA;CAC5E;AAID,wBAAgB,kBAAkB,IAAI,oBAAoB,CAMzD;AAED,wBAAgB,0BAA0B,IAAI,oBAAoB,GAAG,IAAI,CAExE;AAED,eAAO,MAAM,gBAAgB,6CAA2B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HasManyDataGrid.d.ts","sourceRoot":"","sources":["../src/HasManyDataGrid.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAQ,KAAK,YAAY,EAAE,KAAK,SAAS,EAAqD,MAAM,OAAO,CAAA;AAClH,OAAO,KAAK,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"HasManyDataGrid.d.ts","sourceRoot":"","sources":["../src/HasManyDataGrid.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAQ,KAAK,YAAY,EAAE,KAAK,SAAS,EAAqD,MAAM,OAAO,CAAA;AAClH,OAAO,KAAK,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,MAAM,kBAAkB,CAAA;AAQzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAa3D,MAAM,WAAW,oBAAoB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM;IACpE,iDAAiD;IACjD,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC/B,4FAA4F;IAC5F,QAAQ,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,SAAS,CAAA;IACpD,sBAAsB;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;IACxD,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,wBAAwB;IACxB,OAAO,CAAC,EAAE,SAAS,cAAc,EAAE,CAAA;IACnC,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,eAAe,CAAA;IAClC,uDAAuD;IACvD,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,qCAAqC;IACrC,uBAAuB,CAAC,EAAE,kBAAkB,CAAA;IAC5C,6CAA6C;IAC7C,qBAAqB,CAAC,EAAE,kBAAkB,CAAA;IAC1C,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAkBD,iBAAS,mBAAmB,CAAC,OAAO,SAAS,MAAM,EAAE,EACpD,KAAK,EACL,QAAQ,EACR,cAAc,EACd,YAAiB,EACjB,MAAM,EAAE,YAAY,EACpB,OAAO,EACP,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EACvB,qBAAqB,EACrB,UAAU,GACV,EAAE,oBAAoB,CAAC,OAAO,CAAC,GAAG,YAAY,GAAG,IAAI,CAqMrD;AAMD,eAAO,MAAM,eAAe,EAA2C,OAAO,mBAAmB,CAAA"}
|
package/dist/contextHooks.d.ts
CHANGED
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { DataViewElementData } from './DataViewContext.js';
|
|
8
8
|
import type { FilteringState } from './useDataViewState.js';
|
|
9
|
-
import type { SortingState, SortingDirectionAction, PagingState, PagingInfo, OrderDirection, FilterHandler, FilterArtifact, DataViewLayout, FieldRef } from '@contember/bindx';
|
|
9
|
+
import type { SortingState, SortingDirections, SortingDirectionAction, PagingState, PagingInfo, OrderDirection, FilterHandler, FilterArtifact, DataViewLayout, FieldRef } from '@contember/bindx';
|
|
10
10
|
export interface DataViewSortingMethods {
|
|
11
11
|
setOrderBy<T>(field: FieldRef<T>, action: SortingDirectionAction, append?: boolean): void;
|
|
12
|
+
setDirections(directions: SortingDirections): void;
|
|
12
13
|
}
|
|
13
14
|
export declare function useDataViewSortingState(): SortingState;
|
|
14
15
|
export declare function useDataViewSortingMethods(): DataViewSortingMethods;
|
|
@@ -23,6 +24,7 @@ export declare function useDataViewPagingInfo(): PagingInfo;
|
|
|
23
24
|
export declare function useDataViewPagingMethods(): DataViewPagingMethods;
|
|
24
25
|
export interface DataViewFilteringMethods {
|
|
25
26
|
setFilter(name: string, artifact: FilterArtifact): void;
|
|
27
|
+
setAllFilters(artifacts: Record<string, FilterArtifact>): void;
|
|
26
28
|
}
|
|
27
29
|
export declare function useDataViewFilteringState(): FilteringState;
|
|
28
30
|
export declare function useDataViewFilteringMethods(): DataViewFilteringMethods;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextHooks.d.ts","sourceRoot":"","sources":["../src/contextHooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAA+D,MAAM,uBAAuB,CAAA;AACxH,OAAO,KAAK,EACX,YAAY,EACZ,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EACd,QAAQ,EACR,MAAM,kBAAkB,CAAA;AAMzB,MAAM,WAAW,sBAAsB;IACtC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"contextHooks.d.ts","sourceRoot":"","sources":["../src/contextHooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAA+D,MAAM,uBAAuB,CAAA;AACxH,OAAO,KAAK,EACX,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EACd,QAAQ,EACR,MAAM,kBAAkB,CAAA;AAMzB,MAAM,WAAW,sBAAsB;IACtC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IACzF,aAAa,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAA;CAClD;AAED,wBAAgB,uBAAuB,IAAI,YAAY,CAEtD;AAED,wBAAgB,yBAAyB,IAAI,sBAAsB,CAMlE;AAED,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,cAAc,GAAG,IAAI,CAExF;AAMD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,CAAA;IACrE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IAC3C,iBAAiB,IAAI,IAAI,CAAA;CACzB;AAED,wBAAgB,sBAAsB,IAAI,WAAW,CAEpD;AAED,wBAAgB,qBAAqB,IAAI,UAAU,CAElD;AAED,wBAAgB,wBAAwB,IAAI,qBAAqB,CAahE;AAMD,MAAM,WAAW,wBAAwB;IACxC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAA;IACvD,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI,CAAA;CAC9D;AAED,wBAAgB,yBAAyB,IAAI,cAAc,CAE1D;AAED,wBAAgB,2BAA2B,IAAI,wBAAwB,CAMtE;AAED,wBAAgB,gCAAgC,IAAI,WAAW,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;CAAE,CAAC,CAElH;AAMD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,CAAA;IACxD,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAA;CAC3C;AAED,MAAM,WAAW,wBAAwB;IACxC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;IAC3C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;CACnD;AAED,wBAAgB,yBAAyB,IAAI,sBAAsB,CAOlE;AAED,wBAAgB,2BAA2B,IAAI,wBAAwB,CAMtE;AAMD,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE/D,wBAAgB,mBAAmB,IAAI,SAAS,mBAAmB,EAAE,CAoBpE"}
|
package/dist/export.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../src/export.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAA+D,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../src/export.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAA+D,MAAM,OAAO,CAAA;AASnF,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACjD,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,CAAA;CACvE;AAED,MAAM,WAAW,aAAa;IAC7B,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,YAAY,CAAA;CAC7C;AAMD,qBAAa,gBAAiB,YAAW,aAAa;IACrD,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,iBAAiB,GAAG,YAAY;CAqB1D;AAyCD,MAAM,WAAW,0BAA0B;IAC1C,qBAAqB;IACrB,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAA;IAC5B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mCAAmC;IACnC,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,eAAO,MAAM,qBAAqB,sGAwDjC,CAAA;AAOD,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;CACxC;AAED,wBAAgB,uBAAuB,IAAI,MAAM,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAOlF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterHooks.d.ts","sourceRoot":"","sources":["../src/filterHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAqD,MAAM,OAAO,CAAA;AAEhH,OAAO,KAAK,EACX,cAAc,EACd,kBAAkB,EAKlB,MAAM,kBAAkB,CAAA;AAMzB,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,cAAc,IAAI;IAC/D,KAAK,EAAE,CAAC,GAAG,SAAS;IACpB,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,IAAI;IAC1D,IAAI,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;CAC3B,CAAA;
|
|
1
|
+
{"version":3,"file":"filterHooks.d.ts","sourceRoot":"","sources":["../src/filterHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parent-scoped relation query used by HasManyDataGrid.
|
|
3
|
+
*
|
|
4
|
+
* The grid reads its rows through the parent record, so every read of the
|
|
5
|
+
* relation — paged load and unpaged export alike — has to go through it.
|
|
6
|
+
*/
|
|
7
|
+
import type { GetQuery, QuerySpec } from '@contember/bindx';
|
|
8
|
+
export interface HasManyRelationQueryOptions {
|
|
9
|
+
readonly parentEntityType: string;
|
|
10
|
+
readonly parentEntityId: string;
|
|
11
|
+
readonly fieldName: string;
|
|
12
|
+
readonly filter: Record<string, unknown> | undefined;
|
|
13
|
+
readonly orderBy: readonly Record<string, unknown>[] | undefined;
|
|
14
|
+
readonly limit?: number;
|
|
15
|
+
readonly offset?: number;
|
|
16
|
+
readonly targetSpec: QuerySpec;
|
|
17
|
+
}
|
|
18
|
+
export interface HasManyRelationQuery {
|
|
19
|
+
/** Alias the relation rows are returned under */
|
|
20
|
+
readonly alias: string;
|
|
21
|
+
readonly query: GetQuery;
|
|
22
|
+
}
|
|
23
|
+
export interface HasManyRelationRows {
|
|
24
|
+
readonly rows: readonly Record<string, unknown>[];
|
|
25
|
+
readonly totalCount: number | undefined;
|
|
26
|
+
}
|
|
27
|
+
export declare function buildHasManyRelationQuery({ parentEntityType, parentEntityId, fieldName, filter, orderBy, limit, offset, targetSpec, }: HasManyRelationQueryOptions): HasManyRelationQuery;
|
|
28
|
+
export declare function extractHasManyRelationRows(data: Record<string, unknown>, { alias, fieldName }: {
|
|
29
|
+
alias: string;
|
|
30
|
+
fieldName: string;
|
|
31
|
+
}): HasManyRelationRows | null;
|
|
32
|
+
//# sourceMappingURL=hasManyRelationQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasManyRelationQuery.d.ts","sourceRoot":"","sources":["../src/hasManyRelationQuery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE3D,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IACpD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,SAAS,CAAA;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAA;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACpC,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CACxB;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CACvC;AAED,wBAAgB,yBAAyB,CAAC,EACzC,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,MAAM,EACN,OAAO,EACP,KAAK,EACL,MAAM,EACN,UAAU,GACV,EAAE,2BAA2B,GAAG,oBAAoB,CAoCpD;AAED,wBAAgB,0BAA0B,CACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxD,mBAAmB,GAAG,IAAI,CAK5B"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,8 +8,9 @@ export { createRelationColumn, hasOneCellConfig, hasManyCellConfig, type Relatio
|
|
|
8
8
|
export { DataGridTextColumn, DataGridNumberColumn, DataGridDateColumn, DataGridDateTimeColumn, DataGridBooleanColumn, DataGridEnumColumn, DataGridEnumListColumn, DataGridUuidColumn, DataGridIsDefinedColumn, DataGridHasOneColumn, DataGridHasManyColumn, DataGridActionColumn, DataGridColumn, type DataGridTextColumnProps, type DataGridNumberColumnProps, type DataGridDateColumnProps, type DataGridDateTimeColumnProps, type DataGridBooleanColumnProps, type DataGridEnumColumnProps, type DataGridEnumListColumnProps, type DataGridUuidColumnProps, type DataGridIsDefinedColumnProps, type DataGridHasOneColumnProps, type DataGridHasManyColumnProps, type DataGridActionColumnProps, type DataGridColumnProps, type ColumnMeta, } from './columns.js';
|
|
9
9
|
export { extractFieldName, extractEnumName, extractRelatedEntityName, hasFieldRefMeta, } from './fieldRef.js';
|
|
10
10
|
export { getRelatedAccessor } from './columnTypes.js';
|
|
11
|
-
export
|
|
12
|
-
export {
|
|
11
|
+
export type { FilterArtifact, SortingDirections } from '@contember/bindx';
|
|
12
|
+
export { useFilteringState, useSortingState, usePagingState, useSelectionState, type FilteringState, type FilterArtifactUpdate, type RegisteredFilter, type UseFilteringOptions, type UseSortingOptions, type SortingStateResult, type UsePagingOptions, type PagingStateResult, type UseSelectionOptions, type SelectionStateResult, } from './useDataViewState.js';
|
|
13
|
+
export { useDataViewContext, useOptionalDataViewContext, DataViewProvider, type DataViewContextValue, type DataViewFetchAllData, type DataViewItem, type DataViewLoaderState as DataViewLoaderStateType, type DataViewElementData, } from './DataViewContext.js';
|
|
13
14
|
export { useDataView, type UseDataViewOptions, type DataViewResult } from './useDataView.js';
|
|
14
15
|
export { dataAttribute } from './dataAttribute.js';
|
|
15
16
|
export { useDataViewFilterName, useOptionalDataViewFilterName, DataViewFilterNameProvider, } from './filterContext.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC/E,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAGjF,OAAO,EACN,gBAAgB,EAChB,KAAK,aAAa,EAClB,aAAa,EACb,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,WAAW,GACX,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACN,UAAU,EACV,KAAK,eAAe,EACpB,mBAAmB,EACnB,eAAe,EACf,KAAK,sBAAsB,GAC3B,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACN,sBAAsB,EACtB,KAAK,2BAA2B,EAChC,cAAc,EACd,KAAK,mBAAmB,GACxB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACN,YAAY,EACZ,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,eAAe,GACpB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACN,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,GAC5B,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EACN,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,UAAU,GACf,MAAM,cAAc,CAAA;AAGrB,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,eAAe,GACf,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAGrD,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAGzE,OAAO,EACN,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GACzB,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACN,kBAAkB,EAClB,0BAA0B,EAC1B,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,mBAAmB,IAAI,uBAAuB,EACnD,KAAK,mBAAmB,GACxB,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAG5F,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,OAAO,EACN,qBAAqB,EACrB,6BAA6B,EAC7B,0BAA0B,GAC1B,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACN,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,cAAc,EACd,KAAK,mBAAmB,EACxB,qBAAqB,EACrB,KAAK,0BAA0B,GAC/B,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACN,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,qBAAqB,EACrB,KAAK,0BAA0B,EAC/B,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,sBAAsB,EACtB,KAAK,2BAA2B,EAChC,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,qBAAqB,EACrB,KAAK,0BAA0B,EAC/B,uBAAuB,EACvB,KAAK,4BAA4B,EACjC,uBAAuB,EACvB,KAAK,4BAA4B,GACjC,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACN,iBAAiB,EACjB,KAAK,uBAAuB,EAC5B,wBAAwB,EACxB,+BAA+B,EAC/B,KAAK,8BAA8B,EACnC,KAAK,4BAA4B,EACjC,KAAK,8BAA8B,EACnC,qBAAqB,EACrB,4BAA4B,EAC5B,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,yBAAyB,EACzB,gCAAgC,EAChC,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,KAAK,+BAA+B,EACpC,0BAA0B,EAC1B,KAAK,gCAAgC,EACrC,8BAA8B,EAC9B,KAAK,oCAAoC,EACzC,4BAA4B,EAC5B,KAAK,kCAAkC,EACvC,KAAK,iCAAiC,EACtC,qBAAqB,EACrB,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,GAChC,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACN,KAAK,mBAAmB,EACxB,uBAAuB,EACvB,KAAK,4BAA4B,EACjC,kCAAkC,EAClC,KAAK,uCAAuC,EAC5C,gCAAgC,EAChC,KAAK,qCAAqC,EAC1C,8BAA8B,EAC9B,KAAK,mCAAmC,EACxC,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,uBAAuB,EACvB,KAAK,4BAA4B,EACjC,4BAA4B,EAC5B,KAAK,iCAAiC,EACtC,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,uBAAuB,EACvB,KAAK,4BAA4B,EACjC,6BAA6B,EAC7B,KAAK,kCAAkC,EACvC,2BAA2B,EAC3B,KAAK,gCAAgC,EACrC,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,0BAA0B,EAC1B,KAAK,+BAA+B,EACpC,8BAA8B,EAC9B,KAAK,mCAAmC,EACxC,gCAAgC,EAChC,KAAK,qCAAqC,GAC1C,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACN,sBAAsB,EACtB,KAAK,2BAA2B,EAChC,qBAAqB,EACrB,KAAK,0BAA0B,GAC/B,MAAM,wBAAwB,CAAA;AAG/B,OAAO,EACN,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,8BAA8B,EAC9B,KAAK,mCAAmC,EACxC,uBAAuB,EACvB,KAAK,4BAA4B,EACjC,kBAAkB,EAClB,KAAK,uBAAuB,GAC5B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACN,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,eAAe,EACf,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,cAAc,EACd,KAAK,mBAAmB,EACxB,qBAAqB,EACrB,KAAK,0BAA0B,GAC/B,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACN,qBAAqB,EACrB,KAAK,0BAA0B,EAC/B,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,uBAAuB,EACvB,KAAK,kBAAkB,GACvB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACN,4BAA4B,EAC5B,KAAK,iCAAiC,EACtC,2BAA2B,EAC3B,KAAK,gCAAgC,EACrC,kCAAkC,EAClC,KAAK,uCAAuC,EAC5C,8BAA8B,GAC9B,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACN,qBAAqB,EACrB,KAAK,0BAA0B,EAC/B,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,sBAAsB,EACtB,iBAAiB,EACjB,yBAAyB,EACzB,aAAa,EACb,KAAK,kBAAkB,EACvB,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,eAAe,EACf,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,4BAA4B,EAC5B,KAAK,iCAAiC,GACtC,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACN,uBAAuB,EACvB,yBAAyB,EACzB,2BAA2B,EAC3B,KAAK,sBAAsB,EAC3B,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,gCAAgC,EAChC,KAAK,wBAAwB,EAC7B,yBAAyB,EACzB,2BAA2B,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,mBAAmB,GACnB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,cAAc,EACd,gBAAgB,GAChB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACN,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,cAAc,GACd,MAAM,0BAA0B,CAAA;AAGjC,cAAc,mBAAmB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectDataView.d.ts","sourceRoot":"","sources":["../../src/select/SelectDataView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAQ,KAAK,YAAY,EAAE,KAAK,SAAS,EAAqD,MAAM,OAAO,CAAA;AAClH,OAAO,KAAK,EACX,cAAc,EAGd,cAAc,EAEd,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"SelectDataView.d.ts","sourceRoot":"","sources":["../../src/select/SelectDataView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAQ,KAAK,YAAY,EAAE,KAAK,SAAS,EAAqD,MAAM,OAAO,CAAA;AAClH,OAAO,KAAK,EACX,cAAc,EAGd,cAAc,EAEd,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAchD,MAAM,WAAW,mBAAmB;IACnC,oDAAoD;IACpD,QAAQ,EAAE,SAAS,CAAA;IACnB,yEAAyE;IACzE,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,SAAS,CAAA;IACrD,gCAAgC;IAChC,UAAU,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,CAAA;IAC/D,yBAAyB;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;IACxD,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAID,iBAAS,kBAAkB,CAAC,EAC3B,QAAQ,EACR,SAAS,EAAE,gBAAgB,EAC3B,UAAU,EACV,cAAc,EACd,MAAM,EAAE,YAAY,EACpB,YAAiB,GACjB,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,CA8K3C;AAED,eAAO,MAAM,cAAc,EAA0C,OAAO,kBAAkB,CAAA"}
|
|
@@ -11,10 +11,15 @@ export interface RegisteredFilter {
|
|
|
11
11
|
readonly handler: FilterHandler<FilterArtifact>;
|
|
12
12
|
artifact: FilterArtifact;
|
|
13
13
|
}
|
|
14
|
+
/** Value or updater accepted by {@link FilteringState.setArtifact}. */
|
|
15
|
+
export type FilterArtifactUpdate = FilterArtifact | ((current: FilterArtifact | undefined) => FilterArtifact | undefined);
|
|
14
16
|
export interface FilteringState {
|
|
15
17
|
readonly filters: ReadonlyMap<string, RegisteredFilter>;
|
|
16
18
|
getArtifact(name: string): FilterArtifact | undefined;
|
|
17
|
-
|
|
19
|
+
/** An updater sees the live artifact, not a render snapshot; returning `undefined` resets the filter to its default. */
|
|
20
|
+
setArtifact(name: string, artifact: FilterArtifactUpdate): void;
|
|
21
|
+
/** Replaces the whole artifact record at once — for restoring a saved filter preset. */
|
|
22
|
+
setAllArtifacts(artifacts: Record<string, FilterArtifact>): void;
|
|
18
23
|
resetFilter(name: string): void;
|
|
19
24
|
resetAll(): void;
|
|
20
25
|
readonly hasActiveFilters: boolean;
|
|
@@ -40,6 +45,8 @@ export interface UseSortingOptions {
|
|
|
40
45
|
export interface SortingStateResult {
|
|
41
46
|
readonly state: SortingState;
|
|
42
47
|
setOrderBy<T>(field: FieldRef<T>, action: SortingDirectionAction, append?: boolean): void;
|
|
48
|
+
/** Replaces the whole direction record at once — for restoring saved sorting. */
|
|
49
|
+
setDirections(directions: SortingDirections): void;
|
|
43
50
|
clear(): void;
|
|
44
51
|
directionOf<T>(field: FieldRef<T>): OrderDirection | null;
|
|
45
52
|
readonly resolvedOrderBy: readonly Record<string, unknown>[] | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDataViewState.d.ts","sourceRoot":"","sources":["../src/useDataViewState.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACX,aAAa,EACb,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,cAAc,EACd,QAAQ,EACR,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAO3E,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;IAC/C,QAAQ,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAA;IACrD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"useDataViewState.d.ts","sourceRoot":"","sources":["../src/useDataViewState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unpaged fetch-all for views that load through a root list query.
|
|
3
|
+
*/
|
|
4
|
+
import type { SelectionMeta } from '@contember/bindx';
|
|
5
|
+
import type { DataViewFetchAllData } from './DataViewContext.js';
|
|
6
|
+
export interface ListFetchAllDataOptions {
|
|
7
|
+
/** Entity the view lists */
|
|
8
|
+
readonly entityType: string;
|
|
9
|
+
/** Full scope of the view — static filter combined with the user filters */
|
|
10
|
+
readonly filter: Record<string, unknown> | undefined;
|
|
11
|
+
readonly orderBy: readonly Record<string, unknown>[] | undefined;
|
|
12
|
+
readonly selection: SelectionMeta;
|
|
13
|
+
}
|
|
14
|
+
export declare function useListFetchAllData({ entityType, filter, orderBy, selection }: ListFetchAllDataOptions): DataViewFetchAllData;
|
|
15
|
+
//# sourceMappingURL=useListFetchAllData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useListFetchAllData.d.ts","sourceRoot":"","sources":["../src/useListFetchAllData.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAEhE,MAAM,WAAW,uBAAuB;IACvC,4BAA4B;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IACpD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,SAAS,CAAA;IAChE,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAA;CACjC;AAED,wBAAgB,mBAAmB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,uBAAuB,GAAG,oBAAoB,CAkB7H"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contember/bindx-dataview",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.50",
|
|
4
4
|
"description": "Headless DataGrid and DataView components for bindx",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/index.ts",
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"react": ">=18.0.0"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@contember/bindx": "0.1.
|
|
19
|
-
"@contember/bindx-react": "0.1.
|
|
18
|
+
"@contember/bindx": "0.1.50",
|
|
19
|
+
"@contember/bindx-react": "0.1.50",
|
|
20
20
|
"@radix-ui/primitive": "^1.1.3",
|
|
21
21
|
"@radix-ui/react-slot": "^1.2.4"
|
|
22
22
|
},
|
package/src/DataGrid.tsx
CHANGED
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
import { useDataViewKey } from './DataViewKeyProvider.js'
|
|
24
24
|
import { DataViewProvider, type DataViewContextValue, type DataViewLoaderState } from './DataViewContext.js'
|
|
25
25
|
import { useDataGridSetup, QUERY_FILTER_NAME } from './useDataGridSetup.js'
|
|
26
|
+
import { useListFetchAllData } from './useListFetchAllData.js'
|
|
26
27
|
|
|
27
28
|
export { QUERY_FILTER_NAME }
|
|
28
29
|
|
|
@@ -152,6 +153,14 @@ function DataGridImpl<TRoleMap extends Record<string, object>>({
|
|
|
152
153
|
setHighlightIndex(null)
|
|
153
154
|
}, [items])
|
|
154
155
|
|
|
156
|
+
// ---- Unpaged fetch of the same list the grid loads ----
|
|
157
|
+
const fetchAllData = useListFetchAllData({
|
|
158
|
+
entityType,
|
|
159
|
+
filter: setup.combinedFilter,
|
|
160
|
+
orderBy: setup.sorting.resolvedOrderBy,
|
|
161
|
+
selection: setup.selection,
|
|
162
|
+
})
|
|
163
|
+
|
|
155
164
|
const contextValue = useMemo((): DataViewContextValue => ({
|
|
156
165
|
filtering: setup.filtering,
|
|
157
166
|
sorting: setup.sorting,
|
|
@@ -166,10 +175,11 @@ function DataGridImpl<TRoleMap extends Record<string, object>>({
|
|
|
166
175
|
highlightIndex,
|
|
167
176
|
setHighlightIndex,
|
|
168
177
|
selectionMeta: setup.selection,
|
|
178
|
+
fetchAllData,
|
|
169
179
|
toolbarContent: setup.toolbarContent,
|
|
170
180
|
layoutRenders: setup.layoutRenders,
|
|
171
181
|
layoutElements: setup.layoutElements,
|
|
172
|
-
}), [setup.filtering, setup.sorting, setup.paging, setup.selectionState, setup.columns, entityType, items, itemCount, loaderState, reload, highlightIndex, setup.selection, setup.toolbarContent, setup.layoutRenders, setup.layoutElements])
|
|
182
|
+
}), [setup.filtering, setup.sorting, setup.paging, setup.selectionState, setup.columns, entityType, items, itemCount, loaderState, reload, highlightIndex, setup.selection, fetchAllData, setup.toolbarContent, setup.layoutRenders, setup.layoutElements])
|
|
173
183
|
|
|
174
184
|
return (
|
|
175
185
|
<DataViewProvider value={contextValue}>
|
package/src/DataViewContext.tsx
CHANGED
|
@@ -18,6 +18,9 @@ export interface DataViewElementData {
|
|
|
18
18
|
readonly fallback?: boolean
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
/** Fetches every row in the view's scope, unpaged. Resolves to null when the query returned an unexpected result. */
|
|
22
|
+
export type DataViewFetchAllData = () => Promise<readonly Record<string, unknown>[] | null>
|
|
23
|
+
|
|
21
24
|
export interface DataViewContextValue {
|
|
22
25
|
readonly filtering: FilteringState
|
|
23
26
|
readonly sorting: SortingStateResult
|
|
@@ -32,6 +35,8 @@ export interface DataViewContextValue {
|
|
|
32
35
|
readonly highlightIndex: number | null
|
|
33
36
|
readonly setHighlightIndex: (index: number | null) => void
|
|
34
37
|
readonly selectionMeta: SelectionMeta
|
|
38
|
+
/** Owned by each view, so the query keeps the scope the view loads with (static filter, parent relation). */
|
|
39
|
+
readonly fetchAllData: DataViewFetchAllData
|
|
35
40
|
readonly toolbarContent?: React.ReactNode
|
|
36
41
|
/** Named layout render callbacks — analyzed during collection, called per item at runtime */
|
|
37
42
|
readonly layoutRenders: ReadonlyMap<string, (item: DataViewItem) => React.ReactNode>
|
package/src/HasManyDataGrid.tsx
CHANGED
|
@@ -30,7 +30,6 @@ import type {
|
|
|
30
30
|
import { FIELD_REF_META } from '@contember/bindx'
|
|
31
31
|
import {
|
|
32
32
|
buildQueryFromSelection,
|
|
33
|
-
generateHasManyAlias,
|
|
34
33
|
EntityHandle,
|
|
35
34
|
setEntityData,
|
|
36
35
|
} from '@contember/bindx'
|
|
@@ -40,8 +39,9 @@ import {
|
|
|
40
39
|
useBindxContext,
|
|
41
40
|
} from '@contember/bindx-react'
|
|
42
41
|
import { useDataViewKey } from './DataViewKeyProvider.js'
|
|
43
|
-
import { DataViewProvider, type DataViewContextValue, type DataViewLoaderState } from './DataViewContext.js'
|
|
42
|
+
import { DataViewProvider, type DataViewContextValue, type DataViewFetchAllData, type DataViewLoaderState } from './DataViewContext.js'
|
|
44
43
|
import { useDataGridSetup } from './useDataGridSetup.js'
|
|
44
|
+
import { buildHasManyRelationQuery, extractHasManyRelationRows } from './hasManyRelationQuery.js'
|
|
45
45
|
|
|
46
46
|
// ============================================================================
|
|
47
47
|
// Props
|
|
@@ -133,17 +133,6 @@ function HasManyDataGridImpl<TEntity extends object>({
|
|
|
133
133
|
const [loaderState, setLoaderState] = useState<DataViewLoaderState>('initial')
|
|
134
134
|
const [listState, setListState] = useState<ListState>(INITIAL_LIST_STATE)
|
|
135
135
|
|
|
136
|
-
// ---- Build relation query spec ----
|
|
137
|
-
const alias = useMemo(
|
|
138
|
-
() => generateHasManyAlias(fieldName, {
|
|
139
|
-
filter: setup.combinedFilter,
|
|
140
|
-
orderBy: setup.sorting.resolvedOrderBy as unknown[],
|
|
141
|
-
limit: setup.paging.queryLimit,
|
|
142
|
-
offset: setup.paging.queryOffset,
|
|
143
|
-
}),
|
|
144
|
-
[fieldName, setup.combinedFilter, setup.sorting.resolvedOrderBy, setup.paging.queryLimit, setup.paging.queryOffset],
|
|
145
|
-
)
|
|
146
|
-
|
|
147
136
|
const optionsKey = useMemo(
|
|
148
137
|
() => JSON.stringify({
|
|
149
138
|
filter: setup.combinedFilter ?? {},
|
|
@@ -161,7 +150,6 @@ function HasManyDataGridImpl<TEntity extends object>({
|
|
|
161
150
|
|
|
162
151
|
const fetchData = async (): Promise<void> => {
|
|
163
152
|
try {
|
|
164
|
-
const targetSpec = buildQueryFromSelection(setup.selection)
|
|
165
153
|
const currentOptions = JSON.parse(optionsKey) as {
|
|
166
154
|
filter: Record<string, unknown>
|
|
167
155
|
orderBy: readonly Record<string, unknown>[]
|
|
@@ -169,32 +157,18 @@ function HasManyDataGridImpl<TEntity extends object>({
|
|
|
169
157
|
offset?: number
|
|
170
158
|
}
|
|
171
159
|
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
limit: currentOptions.limit,
|
|
183
|
-
offset: currentOptions.offset,
|
|
184
|
-
nested: targetSpec,
|
|
185
|
-
},
|
|
186
|
-
],
|
|
187
|
-
}
|
|
160
|
+
const { alias, query } = buildHasManyRelationQuery({
|
|
161
|
+
parentEntityType,
|
|
162
|
+
parentEntityId,
|
|
163
|
+
fieldName,
|
|
164
|
+
filter: currentOptions.filter,
|
|
165
|
+
orderBy: currentOptions.orderBy,
|
|
166
|
+
limit: currentOptions.limit,
|
|
167
|
+
offset: currentOptions.offset,
|
|
168
|
+
targetSpec: buildQueryFromSelection(setup.selection),
|
|
169
|
+
})
|
|
188
170
|
|
|
189
|
-
const result = await batcher.enqueue(
|
|
190
|
-
{
|
|
191
|
-
type: 'get',
|
|
192
|
-
entityType: parentEntityType,
|
|
193
|
-
by: { id: parentEntityId },
|
|
194
|
-
spec: parentSpec,
|
|
195
|
-
},
|
|
196
|
-
{ signal: abortController.signal },
|
|
197
|
-
)
|
|
171
|
+
const result = await batcher.enqueue(query, { signal: abortController.signal })
|
|
198
172
|
|
|
199
173
|
if (abortController.signal.aborted) return
|
|
200
174
|
|
|
@@ -203,17 +177,13 @@ function HasManyDataGridImpl<TEntity extends object>({
|
|
|
203
177
|
return
|
|
204
178
|
}
|
|
205
179
|
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
: undefined
|
|
210
|
-
|
|
211
|
-
if (!Array.isArray(relationData)) {
|
|
212
|
-
setListState({ status: 'ready', items: [], totalCount })
|
|
180
|
+
const relation = extractHasManyRelationRows(result.data, { alias, fieldName })
|
|
181
|
+
if (!relation) {
|
|
182
|
+
setListState({ status: 'ready', items: [] })
|
|
213
183
|
return
|
|
214
184
|
}
|
|
215
185
|
|
|
216
|
-
const items =
|
|
186
|
+
const items = relation.rows.map((data: Record<string, unknown>) => {
|
|
217
187
|
const id = data['id'] as string
|
|
218
188
|
dispatcher.dispatch(
|
|
219
189
|
setEntityData(targetEntityType, id, data, true),
|
|
@@ -221,7 +191,7 @@ function HasManyDataGridImpl<TEntity extends object>({
|
|
|
221
191
|
return { id, data: data as object }
|
|
222
192
|
})
|
|
223
193
|
|
|
224
|
-
setListState({ status: 'ready', items, totalCount })
|
|
194
|
+
setListState({ status: 'ready', items, totalCount: relation.totalCount })
|
|
225
195
|
} catch (error) {
|
|
226
196
|
if (abortController.signal.aborted) return
|
|
227
197
|
setListState({ status: 'error', items: [] })
|
|
@@ -233,7 +203,7 @@ function HasManyDataGridImpl<TEntity extends object>({
|
|
|
233
203
|
return () => {
|
|
234
204
|
abortController.abort()
|
|
235
205
|
}
|
|
236
|
-
}, [parentEntityType, parentEntityId, fieldName, targetEntityType,
|
|
206
|
+
}, [parentEntityType, parentEntityId, fieldName, targetEntityType, optionsKey, setup.selection, batcher, dispatcher, store])
|
|
237
207
|
|
|
238
208
|
// ---- Build items from state ----
|
|
239
209
|
const items = useMemo((): EntityAccessor<TEntity>[] => {
|
|
@@ -285,6 +255,23 @@ function HasManyDataGridImpl<TEntity extends object>({
|
|
|
285
255
|
setHighlightIndex(null)
|
|
286
256
|
}, [items])
|
|
287
257
|
|
|
258
|
+
// ---- Unpaged read of the same parent-scoped relation ----
|
|
259
|
+
const fetchAllData = useCallback<DataViewFetchAllData>(async () => {
|
|
260
|
+
const { alias, query } = buildHasManyRelationQuery({
|
|
261
|
+
parentEntityType,
|
|
262
|
+
parentEntityId,
|
|
263
|
+
fieldName,
|
|
264
|
+
filter: setup.combinedFilter,
|
|
265
|
+
orderBy: setup.sorting.resolvedOrderBy,
|
|
266
|
+
targetSpec: buildQueryFromSelection(setup.selection),
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
const result = await batcher.enqueue(query)
|
|
270
|
+
if (result.type !== 'get' || !result.data) return null
|
|
271
|
+
|
|
272
|
+
return extractHasManyRelationRows(result.data, { alias, fieldName })?.rows ?? null
|
|
273
|
+
}, [parentEntityType, parentEntityId, fieldName, setup.combinedFilter, setup.sorting.resolvedOrderBy, setup.selection, batcher])
|
|
274
|
+
|
|
288
275
|
const contextValue = useMemo((): DataViewContextValue => ({
|
|
289
276
|
filtering: setup.filtering,
|
|
290
277
|
sorting: setup.sorting,
|
|
@@ -299,10 +286,11 @@ function HasManyDataGridImpl<TEntity extends object>({
|
|
|
299
286
|
highlightIndex,
|
|
300
287
|
setHighlightIndex,
|
|
301
288
|
selectionMeta: setup.selection,
|
|
289
|
+
fetchAllData,
|
|
302
290
|
toolbarContent: setup.toolbarContent,
|
|
303
291
|
layoutRenders: setup.layoutRenders,
|
|
304
292
|
layoutElements: setup.layoutElements,
|
|
305
|
-
}), [setup.filtering, setup.sorting, setup.paging, setup.selectionState, setup.columns, targetEntityType, items, itemCount, loaderState, reload, highlightIndex, setup.selection, setup.toolbarContent, setup.layoutRenders, setup.layoutElements])
|
|
293
|
+
}), [setup.filtering, setup.sorting, setup.paging, setup.selectionState, setup.columns, targetEntityType, items, itemCount, loaderState, reload, highlightIndex, setup.selection, fetchAllData, setup.toolbarContent, setup.layoutRenders, setup.layoutElements])
|
|
306
294
|
|
|
307
295
|
return (
|
|
308
296
|
<DataViewProvider value={contextValue}>
|
package/src/contextHooks.ts
CHANGED
|
@@ -11,6 +11,7 @@ import type { DataViewElementData } from './DataViewContext.js'
|
|
|
11
11
|
import type { FilteringState, SortingStateResult, PagingStateResult, SelectionStateResult } from './useDataViewState.js'
|
|
12
12
|
import type {
|
|
13
13
|
SortingState,
|
|
14
|
+
SortingDirections,
|
|
14
15
|
SortingDirectionAction,
|
|
15
16
|
PagingState,
|
|
16
17
|
PagingInfo,
|
|
@@ -27,6 +28,7 @@ import type {
|
|
|
27
28
|
|
|
28
29
|
export interface DataViewSortingMethods {
|
|
29
30
|
setOrderBy<T>(field: FieldRef<T>, action: SortingDirectionAction, append?: boolean): void
|
|
31
|
+
setDirections(directions: SortingDirections): void
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
export function useDataViewSortingState(): SortingState {
|
|
@@ -35,7 +37,10 @@ export function useDataViewSortingState(): SortingState {
|
|
|
35
37
|
|
|
36
38
|
export function useDataViewSortingMethods(): DataViewSortingMethods {
|
|
37
39
|
const { sorting } = useDataViewContext()
|
|
38
|
-
return useMemo(() => ({
|
|
40
|
+
return useMemo((): DataViewSortingMethods => ({
|
|
41
|
+
setOrderBy: sorting.setOrderBy,
|
|
42
|
+
setDirections: sorting.setDirections,
|
|
43
|
+
}), [sorting.setOrderBy, sorting.setDirections])
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
export function useDataViewSortingDirection<T>(field: FieldRef<T>): OrderDirection | null {
|
|
@@ -81,6 +86,7 @@ export function useDataViewPagingMethods(): DataViewPagingMethods {
|
|
|
81
86
|
|
|
82
87
|
export interface DataViewFilteringMethods {
|
|
83
88
|
setFilter(name: string, artifact: FilterArtifact): void
|
|
89
|
+
setAllFilters(artifacts: Record<string, FilterArtifact>): void
|
|
84
90
|
}
|
|
85
91
|
|
|
86
92
|
export function useDataViewFilteringState(): FilteringState {
|
|
@@ -89,7 +95,10 @@ export function useDataViewFilteringState(): FilteringState {
|
|
|
89
95
|
|
|
90
96
|
export function useDataViewFilteringMethods(): DataViewFilteringMethods {
|
|
91
97
|
const { filtering } = useDataViewContext()
|
|
92
|
-
return useMemo(() => ({
|
|
98
|
+
return useMemo((): DataViewFilteringMethods => ({
|
|
99
|
+
setFilter: filtering.setArtifact,
|
|
100
|
+
setAllFilters: filtering.setAllArtifacts,
|
|
101
|
+
}), [filtering.setArtifact, filtering.setAllArtifacts])
|
|
93
102
|
}
|
|
94
103
|
|
|
95
104
|
export function useDataViewFilterHandlerRegistry(): ReadonlyMap<string, { handler: FilterHandler<FilterArtifact> }> {
|
package/src/export.tsx
CHANGED
|
@@ -15,9 +15,6 @@ import React, { forwardRef, type ReactElement, useCallback, useState } from 'rea
|
|
|
15
15
|
import { Slot } from '@radix-ui/react-slot'
|
|
16
16
|
import { composeEventHandlers } from '@radix-ui/primitive'
|
|
17
17
|
import { useDataViewContext } from './DataViewContext.js'
|
|
18
|
-
import { useBindxContext } from '@contember/bindx-react'
|
|
19
|
-
import { buildQueryFromSelection } from '@contember/bindx'
|
|
20
|
-
import type { ListQuery, ListQueryResult } from '@contember/bindx'
|
|
21
18
|
|
|
22
19
|
// ============================================================================
|
|
23
20
|
// Export Factory Interface
|
|
@@ -117,12 +114,11 @@ export interface DataViewExportTriggerProps {
|
|
|
117
114
|
|
|
118
115
|
export const DataViewExportTrigger = forwardRef<HTMLButtonElement, DataViewExportTriggerProps>(
|
|
119
116
|
({ baseName, exportFactory = defaultExportFactory, onlyVisible = false, ...props }, ref) => {
|
|
120
|
-
const { columns, entityType,
|
|
121
|
-
const { adapter } = useBindxContext()
|
|
117
|
+
const { columns, entityType, fetchAllData, selection } = useDataViewContext()
|
|
122
118
|
const [isExporting, setIsExporting] = useState(false)
|
|
123
119
|
|
|
124
120
|
const handleExport = useCallback(async (): Promise<void> => {
|
|
125
|
-
if (
|
|
121
|
+
if (isExporting) return
|
|
126
122
|
setIsExporting(true)
|
|
127
123
|
|
|
128
124
|
try {
|
|
@@ -130,19 +126,8 @@ export const DataViewExportTrigger = forwardRef<HTMLButtonElement, DataViewExpor
|
|
|
130
126
|
? columns.filter((c, i) => selection.isVisible(c.fieldName ?? `col-${i}`))
|
|
131
127
|
: columns
|
|
132
128
|
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
entityType,
|
|
136
|
-
filter: filtering.resolvedWhere,
|
|
137
|
-
orderBy: undefined,
|
|
138
|
-
limit: undefined,
|
|
139
|
-
offset: undefined,
|
|
140
|
-
spec: buildQueryFromSelection(selectionMeta),
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const results = await adapter.query([listQuery])
|
|
144
|
-
const result = results[0]
|
|
145
|
-
if (!result || result.type !== 'list') {
|
|
129
|
+
const data = await fetchAllData()
|
|
130
|
+
if (!data) {
|
|
146
131
|
console.error('Export failed: unexpected result')
|
|
147
132
|
return
|
|
148
133
|
}
|
|
@@ -152,7 +137,7 @@ export const DataViewExportTrigger = forwardRef<HTMLButtonElement, DataViewExpor
|
|
|
152
137
|
.map(c => ({ name: String(c.header ?? c.fieldName ?? ''), fieldName: c.fieldName }))
|
|
153
138
|
|
|
154
139
|
const { blob, extension } = exportFactory.create({
|
|
155
|
-
data
|
|
140
|
+
data,
|
|
156
141
|
columns: exportColumns,
|
|
157
142
|
})
|
|
158
143
|
|
|
@@ -169,7 +154,7 @@ export const DataViewExportTrigger = forwardRef<HTMLButtonElement, DataViewExpor
|
|
|
169
154
|
} finally {
|
|
170
155
|
setIsExporting(false)
|
|
171
156
|
}
|
|
172
|
-
}, [
|
|
157
|
+
}, [columns, entityType, fetchAllData, exportFactory, baseName, isExporting, onlyVisible, selection])
|
|
173
158
|
|
|
174
159
|
const { onClick, ...otherProps } = props as React.ButtonHTMLAttributes<HTMLButtonElement>
|
|
175
160
|
|
|
@@ -195,25 +180,10 @@ export interface FetchAllDataResult {
|
|
|
195
180
|
}
|
|
196
181
|
|
|
197
182
|
export function useDataViewFetchAllData(): () => Promise<FetchAllDataResult | null> {
|
|
198
|
-
const {
|
|
199
|
-
const { adapter } = useBindxContext()
|
|
183
|
+
const { fetchAllData } = useDataViewContext()
|
|
200
184
|
|
|
201
185
|
return useCallback(async (): Promise<FetchAllDataResult | null> => {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
type: 'list',
|
|
206
|
-
entityType,
|
|
207
|
-
filter: filtering.resolvedWhere,
|
|
208
|
-
orderBy: undefined,
|
|
209
|
-
limit: undefined,
|
|
210
|
-
offset: undefined,
|
|
211
|
-
spec: buildQueryFromSelection(selectionMeta),
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
const results = await adapter.query([listQuery])
|
|
215
|
-
const result = results[0]
|
|
216
|
-
if (!result || result.type !== 'list') return null
|
|
217
|
-
return { data: (result as ListQueryResult).data }
|
|
218
|
-
}, [adapter, entityType, filtering.resolvedWhere, selectionMeta])
|
|
186
|
+
const data = await fetchAllData()
|
|
187
|
+
return data ? { data } : null
|
|
188
|
+
}, [fetchAllData])
|
|
219
189
|
}
|
package/src/filterHooks.ts
CHANGED
|
@@ -32,22 +32,23 @@ export type UseDataViewFilterResult<T extends FilterArtifact> = [
|
|
|
32
32
|
meta: { isEmpty?: boolean },
|
|
33
33
|
]
|
|
34
34
|
|
|
35
|
+
/** The store is keyed by filter name, so the artifact's concrete type is the caller's claim. */
|
|
36
|
+
function narrowArtifact<T extends FilterArtifact>(artifact: FilterArtifact | undefined): T | undefined {
|
|
37
|
+
return artifact as T | undefined
|
|
38
|
+
}
|
|
39
|
+
|
|
35
40
|
export function useDataViewFilter<T extends FilterArtifact>(key: string): UseDataViewFilterResult<T> {
|
|
36
41
|
const { filtering } = useDataViewContext()
|
|
37
|
-
const state = filtering.getArtifact(key)
|
|
42
|
+
const state = narrowArtifact<T>(filtering.getArtifact(key))
|
|
38
43
|
const filter = filtering.filters.get(key)
|
|
39
44
|
const isEmpty = state ? !filter?.handler.isActive(state) : true
|
|
40
45
|
|
|
41
46
|
const setFilter = useCallback(
|
|
42
47
|
(filterOrUpdater: SetStateAction<T | undefined>): void => {
|
|
43
48
|
if (typeof filterOrUpdater === 'function') {
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
filtering.setArtifact(key, next)
|
|
48
|
-
} else {
|
|
49
|
-
filtering.resetFilter(key)
|
|
50
|
-
}
|
|
49
|
+
// Handed to the state layer unresolved — resolving it here would use the render snapshot.
|
|
50
|
+
const updater = filterOrUpdater
|
|
51
|
+
filtering.setArtifact(key, current => updater(narrowArtifact<T>(current)))
|
|
51
52
|
} else if (filterOrUpdater !== undefined) {
|
|
52
53
|
filtering.setArtifact(key, filterOrUpdater)
|
|
53
54
|
} else {
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parent-scoped relation query used by HasManyDataGrid.
|
|
3
|
+
*
|
|
4
|
+
* The grid reads its rows through the parent record, so every read of the
|
|
5
|
+
* relation — paged load and unpaged export alike — has to go through it.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { generateHasManyAlias } from '@contember/bindx'
|
|
9
|
+
import type { GetQuery, QuerySpec } from '@contember/bindx'
|
|
10
|
+
|
|
11
|
+
export interface HasManyRelationQueryOptions {
|
|
12
|
+
readonly parentEntityType: string
|
|
13
|
+
readonly parentEntityId: string
|
|
14
|
+
readonly fieldName: string
|
|
15
|
+
readonly filter: Record<string, unknown> | undefined
|
|
16
|
+
readonly orderBy: readonly Record<string, unknown>[] | undefined
|
|
17
|
+
readonly limit?: number
|
|
18
|
+
readonly offset?: number
|
|
19
|
+
readonly targetSpec: QuerySpec
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface HasManyRelationQuery {
|
|
23
|
+
/** Alias the relation rows are returned under */
|
|
24
|
+
readonly alias: string
|
|
25
|
+
readonly query: GetQuery
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface HasManyRelationRows {
|
|
29
|
+
readonly rows: readonly Record<string, unknown>[]
|
|
30
|
+
readonly totalCount: number | undefined
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function buildHasManyRelationQuery({
|
|
34
|
+
parentEntityType,
|
|
35
|
+
parentEntityId,
|
|
36
|
+
fieldName,
|
|
37
|
+
filter,
|
|
38
|
+
orderBy,
|
|
39
|
+
limit,
|
|
40
|
+
offset,
|
|
41
|
+
targetSpec,
|
|
42
|
+
}: HasManyRelationQueryOptions): HasManyRelationQuery {
|
|
43
|
+
const relationFilter = filter && Object.keys(filter).length > 0 ? filter : undefined
|
|
44
|
+
const relationOrderBy = orderBy && orderBy.length > 0 ? orderBy : undefined
|
|
45
|
+
const alias = generateHasManyAlias(fieldName, {
|
|
46
|
+
filter: relationFilter,
|
|
47
|
+
orderBy: relationOrderBy,
|
|
48
|
+
limit,
|
|
49
|
+
offset,
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
const spec: QuerySpec = {
|
|
53
|
+
fields: [
|
|
54
|
+
{ name: 'id', sourcePath: ['id'] },
|
|
55
|
+
{
|
|
56
|
+
name: alias,
|
|
57
|
+
sourcePath: [fieldName],
|
|
58
|
+
isArray: true,
|
|
59
|
+
totalCount: true,
|
|
60
|
+
filter: relationFilter,
|
|
61
|
+
orderBy: relationOrderBy,
|
|
62
|
+
limit,
|
|
63
|
+
offset,
|
|
64
|
+
nested: targetSpec,
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
alias,
|
|
71
|
+
query: {
|
|
72
|
+
type: 'get',
|
|
73
|
+
entityType: parentEntityType,
|
|
74
|
+
by: { id: parentEntityId },
|
|
75
|
+
spec,
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function extractHasManyRelationRows(
|
|
81
|
+
data: Record<string, unknown>,
|
|
82
|
+
{ alias, fieldName }: { alias: string; fieldName: string },
|
|
83
|
+
): HasManyRelationRows | null {
|
|
84
|
+
const value = data[alias] ?? data[fieldName]
|
|
85
|
+
if (!isRecordArray(value)) return null
|
|
86
|
+
const totalCount = 'totalCount' in value && typeof value.totalCount === 'number' ? value.totalCount : undefined
|
|
87
|
+
return { rows: value, totalCount }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function isRecordArray(value: unknown): value is readonly Record<string, unknown>[] {
|
|
91
|
+
return Array.isArray(value) && value.every(item => typeof item === 'object' && item !== null)
|
|
92
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -100,6 +100,9 @@ export {
|
|
|
100
100
|
} from './fieldRef.js'
|
|
101
101
|
export { getRelatedAccessor } from './columnTypes.js'
|
|
102
102
|
|
|
103
|
+
// Argument types of the bulk state setters — saves consumers a second import.
|
|
104
|
+
export type { FilterArtifact, SortingDirections } from '@contember/bindx'
|
|
105
|
+
|
|
103
106
|
// State hooks
|
|
104
107
|
export {
|
|
105
108
|
useFilteringState,
|
|
@@ -107,6 +110,7 @@ export {
|
|
|
107
110
|
usePagingState,
|
|
108
111
|
useSelectionState,
|
|
109
112
|
type FilteringState,
|
|
113
|
+
type FilterArtifactUpdate,
|
|
110
114
|
type RegisteredFilter,
|
|
111
115
|
type UseFilteringOptions,
|
|
112
116
|
type UseSortingOptions,
|
|
@@ -123,6 +127,7 @@ export {
|
|
|
123
127
|
useOptionalDataViewContext,
|
|
124
128
|
DataViewProvider,
|
|
125
129
|
type DataViewContextValue,
|
|
130
|
+
type DataViewFetchAllData,
|
|
126
131
|
type DataViewItem,
|
|
127
132
|
type DataViewLoaderState as DataViewLoaderStateType,
|
|
128
133
|
type DataViewElementData,
|
|
@@ -45,6 +45,7 @@ import {
|
|
|
45
45
|
import { useSelectOptions } from './selectContext.js'
|
|
46
46
|
import { DataViewProvider, type DataViewContextValue, type DataViewLoaderState } from '../DataViewContext.js'
|
|
47
47
|
import { useFilteringState, useSortingState, usePagingState, useSelectionState } from '../useDataViewState.js'
|
|
48
|
+
import { useListFetchAllData } from '../useListFetchAllData.js'
|
|
48
49
|
|
|
49
50
|
export interface SelectDataViewProps {
|
|
50
51
|
/** Children rendered inside the DataView context */
|
|
@@ -212,6 +213,13 @@ function SelectDataViewImpl({
|
|
|
212
213
|
|
|
213
214
|
const emptyMap = useMemo(() => new Map(), [])
|
|
214
215
|
|
|
216
|
+
const fetchAllData = useListFetchAllData({
|
|
217
|
+
entityType,
|
|
218
|
+
filter: combinedFilter,
|
|
219
|
+
orderBy: sorting.resolvedOrderBy,
|
|
220
|
+
selection,
|
|
221
|
+
})
|
|
222
|
+
|
|
215
223
|
const contextValue = useMemo((): DataViewContextValue => ({
|
|
216
224
|
filtering,
|
|
217
225
|
sorting,
|
|
@@ -226,10 +234,11 @@ function SelectDataViewImpl({
|
|
|
226
234
|
highlightIndex,
|
|
227
235
|
setHighlightIndex,
|
|
228
236
|
selectionMeta: selection,
|
|
237
|
+
fetchAllData,
|
|
229
238
|
toolbarContent: undefined,
|
|
230
239
|
layoutRenders: emptyMap,
|
|
231
240
|
layoutElements: emptyMap,
|
|
232
|
-
}), [filtering, sorting, paging, selectionState, entityType, items, itemCount, loaderState, reload, highlightIndex, selection, emptyMap])
|
|
241
|
+
}), [filtering, sorting, paging, selectionState, entityType, items, itemCount, loaderState, reload, highlightIndex, selection, fetchAllData, emptyMap])
|
|
233
242
|
|
|
234
243
|
return (
|
|
235
244
|
<DataViewProvider value={contextValue}>
|
package/src/useDataViewState.ts
CHANGED
|
@@ -33,10 +33,18 @@ export interface RegisteredFilter {
|
|
|
33
33
|
artifact: FilterArtifact
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
/** Value or updater accepted by {@link FilteringState.setArtifact}. */
|
|
37
|
+
export type FilterArtifactUpdate =
|
|
38
|
+
| FilterArtifact
|
|
39
|
+
| ((current: FilterArtifact | undefined) => FilterArtifact | undefined)
|
|
40
|
+
|
|
36
41
|
export interface FilteringState {
|
|
37
42
|
readonly filters: ReadonlyMap<string, RegisteredFilter>
|
|
38
43
|
getArtifact(name: string): FilterArtifact | undefined
|
|
39
|
-
|
|
44
|
+
/** An updater sees the live artifact, not a render snapshot; returning `undefined` resets the filter to its default. */
|
|
45
|
+
setArtifact(name: string, artifact: FilterArtifactUpdate): void
|
|
46
|
+
/** Replaces the whole artifact record at once — for restoring a saved filter preset. */
|
|
47
|
+
setAllArtifacts(artifacts: Record<string, FilterArtifact>): void
|
|
40
48
|
resetFilter(name: string): void
|
|
41
49
|
resetAll(): void
|
|
42
50
|
readonly hasActiveFilters: boolean
|
|
@@ -73,20 +81,25 @@ export function useFilteringState(options: UseFilteringOptions): FilteringState
|
|
|
73
81
|
[artifacts],
|
|
74
82
|
)
|
|
75
83
|
|
|
84
|
+
// Functional form: two writes batched into one commit must compose, not clobber.
|
|
76
85
|
const setArtifact = useCallback(
|
|
77
|
-
(name: string, artifact:
|
|
78
|
-
setArtifacts(
|
|
86
|
+
(name: string, artifact: FilterArtifactUpdate): void => {
|
|
87
|
+
setArtifacts(current => {
|
|
88
|
+
const next = typeof artifact === 'function' ? artifact(current[name]) : artifact
|
|
89
|
+
const resolved = next ?? filterDefs.get(name)?.handler.defaultArtifact()
|
|
90
|
+
return resolved === undefined ? current : { ...current, [name]: resolved }
|
|
91
|
+
})
|
|
79
92
|
},
|
|
80
|
-
[
|
|
93
|
+
[filterDefs, setArtifacts],
|
|
81
94
|
)
|
|
82
95
|
|
|
83
96
|
const resetFilter = useCallback(
|
|
84
97
|
(name: string): void => {
|
|
85
98
|
const def = filterDefs.get(name)
|
|
86
99
|
if (!def) return
|
|
87
|
-
setArtifacts({ ...
|
|
100
|
+
setArtifacts(current => ({ ...current, [name]: def.handler.defaultArtifact() }))
|
|
88
101
|
},
|
|
89
|
-
[filterDefs,
|
|
102
|
+
[filterDefs, setArtifacts],
|
|
90
103
|
)
|
|
91
104
|
|
|
92
105
|
const resetAll = useCallback((): void => {
|
|
@@ -128,7 +141,16 @@ export function useFilteringState(options: UseFilteringOptions): FilteringState
|
|
|
128
141
|
return map
|
|
129
142
|
}, [filterDefs, artifacts])
|
|
130
143
|
|
|
131
|
-
return {
|
|
144
|
+
return {
|
|
145
|
+
filters,
|
|
146
|
+
getArtifact,
|
|
147
|
+
setArtifact,
|
|
148
|
+
setAllArtifacts: setArtifacts,
|
|
149
|
+
resetFilter,
|
|
150
|
+
resetAll,
|
|
151
|
+
hasActiveFilters,
|
|
152
|
+
resolvedWhere,
|
|
153
|
+
}
|
|
132
154
|
}
|
|
133
155
|
|
|
134
156
|
// ============================================================================
|
|
@@ -145,6 +167,8 @@ export interface UseSortingOptions {
|
|
|
145
167
|
export interface SortingStateResult {
|
|
146
168
|
readonly state: SortingState
|
|
147
169
|
setOrderBy<T>(field: FieldRef<T>, action: SortingDirectionAction, append?: boolean): void
|
|
170
|
+
/** Replaces the whole direction record at once — for restoring saved sorting. */
|
|
171
|
+
setDirections(directions: SortingDirections): void
|
|
148
172
|
clear(): void
|
|
149
173
|
directionOf<T>(field: FieldRef<T>): OrderDirection | null
|
|
150
174
|
readonly resolvedOrderBy: readonly Record<string, unknown>[] | undefined
|
|
@@ -186,24 +210,23 @@ export function useSortingState(options: UseSortingOptions): SortingStateResult
|
|
|
186
210
|
// Dotted path, not the leaf — `sortableFields` is keyed the same way (see #68).
|
|
187
211
|
const fieldName = extractFieldName(field)
|
|
188
212
|
if (fieldName === null || !sortableFields.has(fieldName)) return
|
|
189
|
-
const currentDir = directions[fieldName] ?? null
|
|
190
|
-
const newDir = resolveSortAction(currentDir, action)
|
|
191
213
|
|
|
192
|
-
|
|
193
|
-
|
|
214
|
+
// Functional form: two writes batched into one commit must compose, not clobber.
|
|
215
|
+
setDirections((current): SortingDirections => {
|
|
216
|
+
const newDir = resolveSortAction(current[fieldName] ?? null, action)
|
|
217
|
+
if (!append) {
|
|
218
|
+
return newDir ? { [fieldName]: newDir } : {}
|
|
219
|
+
}
|
|
220
|
+
const next = { ...current }
|
|
194
221
|
if (newDir) {
|
|
195
222
|
next[fieldName] = newDir
|
|
196
223
|
} else {
|
|
197
224
|
delete next[fieldName]
|
|
198
225
|
}
|
|
199
|
-
|
|
200
|
-
}
|
|
201
|
-
setDirections({ [fieldName]: newDir })
|
|
202
|
-
} else {
|
|
203
|
-
setDirections({})
|
|
204
|
-
}
|
|
226
|
+
return next
|
|
227
|
+
})
|
|
205
228
|
},
|
|
206
|
-
[sortableFields,
|
|
229
|
+
[sortableFields, setDirections],
|
|
207
230
|
)
|
|
208
231
|
|
|
209
232
|
const clear = useCallback((): void => {
|
|
@@ -224,7 +247,7 @@ export function useSortingState(options: UseSortingOptions): SortingStateResult
|
|
|
224
247
|
return entries.map(([field, dir]) => buildNestedOrderBy(field, dir))
|
|
225
248
|
}, [directions])
|
|
226
249
|
|
|
227
|
-
return { state, setOrderBy, clear, directionOf, resolvedOrderBy }
|
|
250
|
+
return { state, setOrderBy, setDirections, clear, directionOf, resolvedOrderBy }
|
|
228
251
|
}
|
|
229
252
|
|
|
230
253
|
function buildNestedOrderBy(fieldPath: string, direction: OrderDirection): Record<string, unknown> {
|
|
@@ -319,8 +342,8 @@ export function usePagingState(options: UsePagingOptions = {}): PagingStateResul
|
|
|
319
342
|
[setPageIndex],
|
|
320
343
|
)
|
|
321
344
|
|
|
322
|
-
const next = useCallback((): void => setPageIndex(
|
|
323
|
-
const previous = useCallback((): void => setPageIndex(Math.max(0,
|
|
345
|
+
const next = useCallback((): void => setPageIndex(current => current + 1), [setPageIndex])
|
|
346
|
+
const previous = useCallback((): void => setPageIndex(current => Math.max(0, current - 1)), [setPageIndex])
|
|
324
347
|
const first = useCallback((): void => setPageIndex(0), [setPageIndex])
|
|
325
348
|
|
|
326
349
|
const last = useCallback((): void => {
|
|
@@ -395,18 +418,21 @@ export function useSelectionState(options: UseSelectionOptions = {}): SelectionS
|
|
|
395
418
|
const state = useMemo((): SelectionState => ({ values, layouts }), [values, layouts])
|
|
396
419
|
|
|
397
420
|
const setLayout = useCallback((layout: string | undefined): void => {
|
|
398
|
-
setValues({ ...
|
|
399
|
-
}, [
|
|
421
|
+
setValues(current => ({ ...current, layout }))
|
|
422
|
+
}, [setValues])
|
|
400
423
|
|
|
424
|
+
// Functional form: toggling several columns in one commit must compose, not clobber.
|
|
401
425
|
const setVisibility = useCallback((name: string, visible: boolean | undefined): void => {
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
426
|
+
setValues((current): SelectionValues => {
|
|
427
|
+
const next = { ...current.visibility }
|
|
428
|
+
if (visible === undefined) {
|
|
429
|
+
delete next[name]
|
|
430
|
+
} else {
|
|
431
|
+
next[name] = visible
|
|
432
|
+
}
|
|
433
|
+
return { ...current, visibility: next }
|
|
434
|
+
})
|
|
435
|
+
}, [setValues])
|
|
410
436
|
|
|
411
437
|
const isVisible = useCallback((name: string, fallback = true): boolean => {
|
|
412
438
|
return values.visibility[name] ?? fallback
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unpaged fetch-all for views that load through a root list query.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { useCallback } from 'react'
|
|
6
|
+
import { buildQueryFromSelection } from '@contember/bindx'
|
|
7
|
+
import type { ListQuery, SelectionMeta } from '@contember/bindx'
|
|
8
|
+
import { useBindxContext } from '@contember/bindx-react'
|
|
9
|
+
import type { DataViewFetchAllData } from './DataViewContext.js'
|
|
10
|
+
|
|
11
|
+
export interface ListFetchAllDataOptions {
|
|
12
|
+
/** Entity the view lists */
|
|
13
|
+
readonly entityType: string
|
|
14
|
+
/** Full scope of the view — static filter combined with the user filters */
|
|
15
|
+
readonly filter: Record<string, unknown> | undefined
|
|
16
|
+
readonly orderBy: readonly Record<string, unknown>[] | undefined
|
|
17
|
+
readonly selection: SelectionMeta
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function useListFetchAllData({ entityType, filter, orderBy, selection }: ListFetchAllDataOptions): DataViewFetchAllData {
|
|
21
|
+
const { adapter } = useBindxContext()
|
|
22
|
+
|
|
23
|
+
return useCallback(async (): Promise<readonly Record<string, unknown>[] | null> => {
|
|
24
|
+
const listQuery: ListQuery = {
|
|
25
|
+
type: 'list',
|
|
26
|
+
entityType,
|
|
27
|
+
filter,
|
|
28
|
+
orderBy,
|
|
29
|
+
limit: undefined,
|
|
30
|
+
offset: undefined,
|
|
31
|
+
spec: buildQueryFromSelection(selection),
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const results = await adapter.query([listQuery])
|
|
35
|
+
const result = results[0]
|
|
36
|
+
return result?.type === 'list' ? result.data : null
|
|
37
|
+
}, [adapter, entityType, filter, orderBy, selection])
|
|
38
|
+
}
|