@factorialco/f0-react 1.294.0 → 1.295.0

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.
@@ -1908,7 +1908,7 @@ export declare type DataSourceDefinition<R extends RecordType = RecordType, Filt
1908
1908
  /** Selectable items value under the checkbox column (undefined if not selectable) */
1909
1909
  selectable?: (item: R) => string | number | undefined;
1910
1910
  /** Default selected items */
1911
- defaultSelectedItems?: SelectedItemsState;
1911
+ defaultSelectedItems?: SelectedItemsState<R>;
1912
1912
  /***** GROUPING ***************************************************/
1913
1913
  /** Grouping configuration */
1914
1914
  grouping?: Grouping;
@@ -2217,6 +2217,7 @@ declare const defaultTranslations: {
2217
2217
  readonly selected: {
2218
2218
  readonly singular: "Selected";
2219
2219
  readonly plural: "Selected";
2220
+ readonly all: "All selected";
2220
2221
  };
2221
2222
  };
2222
2223
  readonly filters: {
@@ -2874,6 +2875,26 @@ declare interface F0IconProps extends SVGProps<SVGSVGElement>, VariantProps<type
2874
2875
  color?: "default" | "currentColor" | `#${string}` | Lowercase<NestedKeyOf<typeof f1Colors.icon>>;
2875
2876
  }
2876
2877
 
2878
+ /**
2879
+ * Base props shared across all F0Select variants
2880
+ */
2881
+ declare type F0SelectBaseProps<T extends string, R = unknown> = {
2882
+ onChangeSelectedOption?: (option: F0SelectItemObject<T, ResolvedRecordType<R>> | undefined, checked: boolean) => void;
2883
+ children?: React.ReactNode;
2884
+ open?: boolean;
2885
+ showSearchBox?: boolean;
2886
+ searchBoxPlaceholder?: string;
2887
+ onSearchChange?: (value: string) => void;
2888
+ searchValue?: string;
2889
+ onOpenChange?: (open: boolean) => void;
2890
+ searchEmptyMessage?: string;
2891
+ className?: string;
2892
+ selectContentClassName?: string;
2893
+ actions?: Action[];
2894
+ /** Container element to render the portal content into */
2895
+ portalContainer?: HTMLElement | null;
2896
+ };
2897
+
2877
2898
  declare type F0SelectItemObject<T, R = unknown> = {
2878
2899
  type?: "item";
2879
2900
  value: T;
@@ -2897,42 +2918,43 @@ export { F0SelectItemProps as SelectItemProps }
2897
2918
  /**
2898
2919
  * Select component for choosing from a list of options.
2899
2920
  *
2900
- * @template T - The type of the emitted value
2921
+ * @template T - The type of the emitted value
2901
2922
  * @template R - The type of the record/item data (used with data source)
2902
- *
2903
2923
  */
2904
- declare type F0SelectProps<T extends string, R = unknown> = {
2905
- onChangeSelectedOption?: (option: F0SelectItemObject<T, ResolvedRecordType<R>> | undefined, checked: boolean) => void;
2906
- children?: React.ReactNode;
2907
- open?: boolean;
2908
- showSearchBox?: boolean;
2909
- searchBoxPlaceholder?: string;
2910
- onSearchChange?: (value: string) => void;
2911
- searchValue?: string;
2912
- onOpenChange?: (open: boolean) => void;
2913
- searchEmptyMessage?: string;
2914
- className?: string;
2915
- selectContentClassName?: string;
2916
- actions?: Action[];
2917
- portalContainer?: HTMLElement | null;
2918
- } & ({
2924
+ declare type F0SelectProps<T extends string, R = unknown> = F0SelectBaseProps<T, R> & // Single select not clearable
2925
+ ({
2919
2926
  clearable?: false;
2920
2927
  multiple?: false;
2921
2928
  value?: T;
2922
2929
  defaultItem?: F0SelectItemObject<T, ResolvedRecordType<R>>;
2923
2930
  onChange?: (value: T, originalItem?: ResolvedRecordType<R> | undefined, option?: F0SelectItemObject<T, ResolvedRecordType<R>>) => void;
2931
+ /** Callback for selection changes - provides full selection state for advanced use cases (e.g., "Select All" with exclusions) */
2932
+ onSelectItems?: never;
2924
2933
  } | {
2925
2934
  clearable: true;
2926
2935
  multiple?: false;
2927
2936
  value?: T;
2928
2937
  defaultItem?: F0SelectItemObject<T, ResolvedRecordType<R>>;
2929
2938
  onChange?: (value: T, originalItem?: ResolvedRecordType<R> | undefined, option?: F0SelectItemObject<T, ResolvedRecordType<R>>) => void;
2939
+ onSelectItems?: never;
2930
2940
  } | {
2931
2941
  multiple: true;
2932
2942
  clearable?: boolean;
2933
2943
  value?: T[];
2934
2944
  defaultItem?: F0SelectItemObject<T, ResolvedRecordType<R>>[];
2935
2945
  onChange?: (value: T[], originalItems: ResolvedRecordType<R>[], options: F0SelectItemObject<T, ResolvedRecordType<R>>[]) => void;
2946
+ /**
2947
+ * Callback for selection changes - provides full selection state including:
2948
+ * - `status.allSelected`: true if "Select All" was used, "indeterminate" if some items deselected after Select All
2949
+ * - `status.items`: Map of all items with their checked state
2950
+ * - `filters`: Current applied filters
2951
+ * - `selectedCount`: Total number of selected items
2952
+ *
2953
+ * Use this for "chunked" selection mode where you need to track:
2954
+ * - When allSelected is true/indeterminate: excluded items are those with checked=false
2955
+ * - When allSelected is false: included items are those with checked=true
2956
+ */
2957
+ onSelectItems?: OnSelectItemsCallback<ResolvedRecordType<R>, FiltersDefinition>;
2936
2958
  }) & ({
2937
2959
  source: DataSourceDefinition<ResolvedRecordType<R>, FiltersDefinition, SortingsDefinition, GroupingDefinition<ResolvedRecordType<R>>>;
2938
2960
  mapOptions: (item: ResolvedRecordType<R>) => F0SelectItemProps<T, ResolvedRecordType<R>>;
@@ -5210,10 +5232,13 @@ export declare type SelectedItems<T> = ReadonlyArray<T>;
5210
5232
 
5211
5233
  export declare type SelectedItemsDetailedStatus<R extends RecordType, Filters extends FiltersDefinition> = {
5212
5234
  allSelected: boolean | "indeterminate";
5235
+ /** Status of items that have been loaded. Items not yet loaded won't appear here. */
5213
5236
  itemsStatus: ReadonlyArray<{
5214
5237
  item: R;
5215
5238
  checked: boolean;
5216
5239
  }>;
5240
+ /** All selected item IDs, including those not yet loaded */
5241
+ selectedIds: ReadonlyArray<SelectionId>;
5217
5242
  groupsStatus: Record<string, boolean>;
5218
5243
  filters: FiltersState<Filters>;
5219
5244
  selectedCount: number;
@@ -5222,18 +5247,23 @@ export declare type SelectedItemsDetailedStatus<R extends RecordType, Filters ex
5222
5247
  /**
5223
5248
  * Represents the selected items by id
5224
5249
  */
5225
- export declare type SelectedItemsState = {
5226
- allSelected?: boolean | "indeterminate";
5227
- items?: ReadonlyArray<{
5228
- id: string;
5229
- checked: boolean;
5230
- }>;
5231
- groups?: ReadonlyArray<{
5232
- groupId: string;
5233
- checked: boolean;
5234
- }>;
5250
+ export declare type SelectedItemsState<R extends RecordType> = {
5251
+ allSelected: boolean | "indeterminate";
5252
+ items: Map<SelectedItemState<R>["id"], SelectedItemState<R>>;
5253
+ groups: Map<SelectedState["id"], SelectedState>;
5254
+ };
5255
+
5256
+ export declare type SelectedItemState<R extends RecordType> = SelectedState & {
5257
+ item?: WithGroupId<R>;
5235
5258
  };
5236
5259
 
5260
+ export declare type SelectedState = {
5261
+ id: SelectionId;
5262
+ checked: boolean;
5263
+ };
5264
+
5265
+ export declare type SelectionId = number | string;
5266
+
5237
5267
  export declare type SelectQuestionOption = {
5238
5268
  id?: string;
5239
5269
  value: string;
@@ -6286,31 +6316,6 @@ declare global {
6286
6316
  }
6287
6317
 
6288
6318
 
6289
- declare module "gridstack" {
6290
- interface GridStackWidget {
6291
- id?: string;
6292
- allowedSizes?: Array<{
6293
- w: number;
6294
- h: number;
6295
- }>;
6296
- renderFn?: () => React.ReactElement | null;
6297
- meta?: Record<string, unknown>;
6298
- }
6299
- interface GridStackNode {
6300
- id?: string;
6301
- w?: number;
6302
- h?: number;
6303
- x?: number;
6304
- y?: number;
6305
- allowedSizes?: Array<{
6306
- w: number;
6307
- h: number;
6308
- }>;
6309
- renderFn?: () => React.ReactElement | null;
6310
- }
6311
- }
6312
-
6313
-
6314
6319
  declare module "@tiptap/core" {
6315
6320
  interface Commands<ReturnType> {
6316
6321
  aiBlock: {
@@ -6338,6 +6343,31 @@ declare module "@tiptap/core" {
6338
6343
  }
6339
6344
 
6340
6345
 
6346
+ declare module "gridstack" {
6347
+ interface GridStackWidget {
6348
+ id?: string;
6349
+ allowedSizes?: Array<{
6350
+ w: number;
6351
+ h: number;
6352
+ }>;
6353
+ renderFn?: () => React.ReactElement | null;
6354
+ meta?: Record<string, unknown>;
6355
+ }
6356
+ interface GridStackNode {
6357
+ id?: string;
6358
+ w?: number;
6359
+ h?: number;
6360
+ x?: number;
6361
+ y?: number;
6362
+ allowedSizes?: Array<{
6363
+ w: number;
6364
+ h: number;
6365
+ }>;
6366
+ renderFn?: () => React.ReactElement | null;
6367
+ }
6368
+ }
6369
+
6370
+
6341
6371
  declare namespace Calendar {
6342
6372
  var displayName: string;
6343
6373
  }