@akanjs/ui 0.9.7 → 0.9.8

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/Field.d.ts CHANGED
@@ -26,8 +26,8 @@ export declare const Field: {
26
26
  Price: import("react").MemoExoticComponent<({ label, desc, labelClassName, className, value, onChange, placeholder, nullable, disabled, minlength, maxlength, transform, validate, onPressEnter, inputClassName, inputStyleType, }: PriceProps) => import("react/jsx-runtime").JSX.Element>;
27
27
  TextArea: import("react").MemoExoticComponent<({ label, desc, labelClassName, className, value, onChange, placeholder, nullable, disabled, rows, minlength, maxlength, transform, validate, onPressEnter, cache, inputClassName, }: TextAreaProps) => import("react/jsx-runtime").JSX.Element>;
28
28
  Switch: ({ label, desc, labelClassName, className, value, onChange, disabled, inputClassName, onDesc, offDesc, }: SwitchProps) => import("react/jsx-runtime").JSX.Element;
29
- ToggleSelect: <I extends string>({ className, labelClassName, label, desc, model, field, items, value, validate, onChange, nullable, disabled, btnClassName, }: ToggleSelectProps<I>) => import("react/jsx-runtime").JSX.Element;
30
- MultiToggleSelect: <I>({ className, labelClassName, label, desc, model, field, items, value, minlength, maxlength, validate, onChange, disabled, }: MultiToggleSelectProps<I>) => import("react/jsx-runtime").JSX.Element;
29
+ ToggleSelect: <I extends string | number | boolean | null>({ className, labelClassName, label, desc, model, field, items, value, validate, onChange, nullable, disabled, btnClassName, }: ToggleSelectProps<I>) => import("react/jsx-runtime").JSX.Element;
30
+ MultiToggleSelect: <I extends string | number | boolean>({ className, labelClassName, label, desc, model, field, items, value, minlength, maxlength, validate, onChange, disabled, }: MultiToggleSelectProps<I>) => import("react/jsx-runtime").JSX.Element;
31
31
  TextList: ({ label, desc, labelClassName, className, value, onChange, placeholder, disabled, transform, minlength, maxlength, minTextlength, maxTextlength, cache, validate, inputClassName, }: TextListProps) => import("react/jsx-runtime").JSX.Element;
32
32
  Tags: ({ label, desc, labelClassName, className, value, onChange, placeholder, disabled, transform, minlength, maxlength, minTextlength, maxTextlength, validate, inputClassName, }: TagsProps) => import("react/jsx-runtime").JSX.Element;
33
33
  Date: <Nullable extends boolean>({ className, labelClassName, nullable, label, desc, value, min, max, onChange, showTime, dateClassName, }: DateProps<Nullable>) => import("react/jsx-runtime").JSX.Element;
@@ -148,14 +148,14 @@ interface ToggleSelectProps<I> {
148
148
  label: string;
149
149
  value: I;
150
150
  }[] | readonly I[] | I[] | Enum<I>;
151
- value: I | null;
151
+ value: I;
152
152
  nullable?: boolean;
153
153
  disabled?: boolean;
154
154
  validate?: (value: I) => boolean | string;
155
155
  onChange: (value: I) => void;
156
156
  btnClassName?: string;
157
157
  }
158
- interface MultiToggleSelectProps<I> {
158
+ interface MultiToggleSelectProps<I extends string | number | boolean> {
159
159
  className?: string;
160
160
  labelClassName?: string;
161
161
  label?: string;
package/Select.d.ts CHANGED
@@ -1,19 +1,17 @@
1
1
  import { Enum } from "@akanjs/base";
2
2
  import { ReactNode } from "react";
3
- type Options<T> = T[] | {
3
+ interface LabelOption<T> {
4
4
  label: string | boolean | number;
5
5
  value: T;
6
- }[] | Enum<T>;
7
- interface SelectProps<T, Multiple extends boolean = false, Searchable extends boolean = false> {
6
+ }
7
+ type Options<T> = T[] | LabelOption<T>[] | Enum<T>;
8
+ interface SelectProps<T extends string | number | boolean | null | undefined, Multiple extends boolean = false, Searchable extends boolean = false, Option extends Options<T> = Options<T>> {
8
9
  label?: string;
9
10
  desc?: string;
10
11
  labelClassName?: string;
11
12
  className?: string;
12
- value: Multiple extends true ? T[] : T | null;
13
- options: Searchable extends true ? T extends string ? Options<T> : {
14
- label: string | boolean | number;
15
- value: T;
16
- }[] : Options<T>;
13
+ value: Multiple extends true ? T[] : T;
14
+ options: Searchable extends true ? (T extends string ? Option : LabelOption<T>[]) : Option;
17
15
  multiple?: Multiple;
18
16
  searchable?: Searchable;
19
17
  placeholder?: string;
@@ -23,10 +21,10 @@ interface SelectProps<T, Multiple extends boolean = false, Searchable extends bo
23
21
  nullable?: boolean;
24
22
  disabled?: boolean;
25
23
  onOpen?: () => void;
26
- onChange: Multiple extends true ? (value: T[], prev: T[]) => void : (value: T | undefined, prev: T | undefined) => void;
24
+ onChange: Multiple extends true ? (value: T[], prev: T[]) => void : (value: T, prev: T) => void;
27
25
  onSearch?: (text: string) => void;
28
26
  renderOption?: (value: T) => ReactNode;
29
27
  renderSelected?: (value: T) => ReactNode;
30
28
  }
31
- export declare const Select: <T, Multiple extends boolean = false, Searchable extends boolean = false>({ label, desc, labelClassName, className, value, options, nullable, disabled, multiple, searchable, placeholder, selectClassName, selectorClassName, selectedClassName, onOpen, onChange, onSearch, renderOption, renderSelected, }: SelectProps<T, Multiple, Searchable>) => import("react/jsx-runtime").JSX.Element;
29
+ export declare const Select: <T extends string | number | boolean | null | undefined, Multiple extends boolean = false, Searchable extends boolean = false, Option extends Options<T> = Options<T>>({ label, desc, labelClassName, className, value, options, nullable, disabled, multiple, searchable, placeholder, selectClassName, selectorClassName, selectedClassName, onOpen, onChange, onSearch, renderOption, renderSelected, }: SelectProps<T, Multiple, Searchable, Option>) => import("react/jsx-runtime").JSX.Element;
32
30
  export {};
package/ToggleSelect.d.ts CHANGED
@@ -1,18 +1,18 @@
1
- interface ToggleSelectProps {
1
+ interface ToggleSelectProps<I extends string | number | boolean | null> {
2
2
  className?: string;
3
3
  btnClassName?: string;
4
4
  items: string[] | {
5
5
  label: string;
6
- value: string;
6
+ value: I;
7
7
  }[];
8
- value: string | null;
8
+ value: I;
9
9
  nullable: boolean;
10
- validate: (value: string) => boolean | string;
11
- onChange: (value: string, idx: number) => void;
10
+ validate: (value: I) => boolean | string;
11
+ onChange: (value: I, idx: number) => void;
12
12
  disabled?: boolean;
13
13
  }
14
14
  export declare const ToggleSelect: {
15
- ({ className, btnClassName, items, nullable, validate, value, onChange, disabled, }: ToggleSelectProps): import("react/jsx-runtime").JSX.Element;
15
+ <I extends string | number | boolean | null>({ className, btnClassName, items, nullable, validate, value, onChange, disabled, }: ToggleSelectProps<I>): import("react/jsx-runtime").JSX.Element;
16
16
  Multi: ({ className, btnClassName, items, nullable, validate, value, onChange, disabled }: MultiProps) => import("react/jsx-runtime").JSX.Element;
17
17
  };
18
18
  interface MultiProps {
@@ -223,11 +223,11 @@ const SelectIDWithRef = ({ queryArgMeta, value, onChange }) => {
223
223
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
224
224
  import_Select.Select,
225
225
  {
226
+ value,
226
227
  options: modelList.map((model) => ({
227
228
  label: renderOption(model),
228
229
  value: model.id
229
230
  })),
230
- value,
231
231
  onChange: (value2) => {
232
232
  onChange(value2);
233
233
  }
package/cjs/Field.js CHANGED
@@ -990,26 +990,33 @@ const Parent = ({
990
990
  desc,
991
991
  labelClassName,
992
992
  selectClassName,
993
- value: value?.id,
993
+ value: value?.id ?? null,
994
994
  searchable: true,
995
995
  options: modelList.map((model) => {
996
996
  const render = renderOption(model);
997
997
  return { label: typeof render === "string" ? render : model.id, value: model.id };
998
998
  }),
999
999
  renderOption: (modelId) => {
1000
+ if (!modelId)
1001
+ return null;
1000
1002
  const model = modelList.get(modelId);
1001
1003
  if (!model)
1002
1004
  return null;
1003
1005
  return renderOption(model);
1004
1006
  },
1005
1007
  renderSelected: (modelId) => {
1008
+ if (!modelId)
1009
+ return null;
1006
1010
  const model = modelList.get(modelId);
1007
1011
  if (!model)
1008
1012
  return null;
1009
1013
  return renderSelected(model);
1010
1014
  },
1011
1015
  onChange: (modelId) => {
1012
- onChange(modelList.get(modelId));
1016
+ if (modelId)
1017
+ onChange(modelList.get(modelId) ?? null);
1018
+ else
1019
+ onChange(null);
1013
1020
  },
1014
1021
  onOpen: () => {
1015
1022
  if (!disabled)
@@ -1072,12 +1079,16 @@ const ParentId = ({
1072
1079
  return { label: typeof label2 === "string" ? label2 : model.id, value: model.id };
1073
1080
  }),
1074
1081
  renderOption: (renderId) => {
1082
+ if (!renderId)
1083
+ return null;
1075
1084
  const model = modelList.get(renderId);
1076
1085
  if (!model)
1077
1086
  return null;
1078
1087
  return renderOption?.(model) ?? null;
1079
1088
  },
1080
1089
  renderSelected: (renderId) => {
1090
+ if (!renderId)
1091
+ return null;
1081
1092
  const model = modelList.get(renderId);
1082
1093
  if (!model)
1083
1094
  return null;
@@ -1088,7 +1099,10 @@ const ParentId = ({
1088
1099
  void storeDo[namesOfSlice.initModel](...initArgs ?? []);
1089
1100
  },
1090
1101
  onChange: (modelId) => {
1091
- onChange(modelId, modelList.get(modelId));
1102
+ if (modelId)
1103
+ onChange(modelId, modelList.get(modelId));
1104
+ else
1105
+ onChange(null, null);
1092
1106
  },
1093
1107
  onSearch
1094
1108
  }
package/cjs/Select.js CHANGED
@@ -53,7 +53,10 @@ const Select = ({
53
53
  const { l } = (0, import_next.usePage)();
54
54
  const [isOpen, setIsOpen] = (0, import_react.useState)(false);
55
55
  const labeledOptions = (0, import_react.useMemo)(
56
- () => options instanceof import_base.Enum ? options.values.map((v) => ({ label: v, value: v })) : options[0]?.label && options[0]?.value ? options : options.map((v) => ({ label: v, value: v })),
56
+ () => options instanceof import_base.Enum ? options.values.map((v) => ({
57
+ label: typeof v === "string" ? v : typeof v === "object" ? JSON.stringify(v) : String(v),
58
+ value: v
59
+ })) : options[0]?.label && options[0]?.value ? options : options.map((v) => ({ label: v, value: v })),
57
60
  [options]
58
61
  );
59
62
  const [selectedValues, setSelectedValues] = (0, import_react.useState)(multiple ? value : [value]);
@@ -34,8 +34,8 @@ const ToggleSelect = ({
34
34
  disabled
35
35
  }) => {
36
36
  const { l } = (0, import_next.usePage)();
37
- const validateResult = validate(value ?? "");
38
- const invalidMessage = !value?.length || validateResult === true ? null : validateResult === false ? l("util.invalidValueError") : validateResult;
37
+ const validateResult = value ? validate(value) : false;
38
+ const invalidMessage = value === null || typeof value === "string" && !value.length || validateResult === true ? null : validateResult === false ? l("util.invalidValueError") : validateResult;
39
39
  const options = items.map(
40
40
  (item) => typeof item === "string" ? { label: item, value: item } : item
41
41
  );
@@ -209,11 +209,11 @@ const SelectIDWithRef = ({ queryArgMeta, value, onChange }) => {
209
209
  /* @__PURE__ */ jsx(
210
210
  Select,
211
211
  {
212
+ value,
212
213
  options: modelList.map((model) => ({
213
214
  label: renderOption(model),
214
215
  value: model.id
215
216
  })),
216
- value,
217
217
  onChange: (value2) => {
218
218
  onChange(value2);
219
219
  }
package/esm/Field.js CHANGED
@@ -968,26 +968,33 @@ const Parent = ({
968
968
  desc,
969
969
  labelClassName,
970
970
  selectClassName,
971
- value: value?.id,
971
+ value: value?.id ?? null,
972
972
  searchable: true,
973
973
  options: modelList.map((model) => {
974
974
  const render = renderOption(model);
975
975
  return { label: typeof render === "string" ? render : model.id, value: model.id };
976
976
  }),
977
977
  renderOption: (modelId) => {
978
+ if (!modelId)
979
+ return null;
978
980
  const model = modelList.get(modelId);
979
981
  if (!model)
980
982
  return null;
981
983
  return renderOption(model);
982
984
  },
983
985
  renderSelected: (modelId) => {
986
+ if (!modelId)
987
+ return null;
984
988
  const model = modelList.get(modelId);
985
989
  if (!model)
986
990
  return null;
987
991
  return renderSelected(model);
988
992
  },
989
993
  onChange: (modelId) => {
990
- onChange(modelList.get(modelId));
994
+ if (modelId)
995
+ onChange(modelList.get(modelId) ?? null);
996
+ else
997
+ onChange(null);
991
998
  },
992
999
  onOpen: () => {
993
1000
  if (!disabled)
@@ -1050,12 +1057,16 @@ const ParentId = ({
1050
1057
  return { label: typeof label2 === "string" ? label2 : model.id, value: model.id };
1051
1058
  }),
1052
1059
  renderOption: (renderId) => {
1060
+ if (!renderId)
1061
+ return null;
1053
1062
  const model = modelList.get(renderId);
1054
1063
  if (!model)
1055
1064
  return null;
1056
1065
  return renderOption?.(model) ?? null;
1057
1066
  },
1058
1067
  renderSelected: (renderId) => {
1068
+ if (!renderId)
1069
+ return null;
1059
1070
  const model = modelList.get(renderId);
1060
1071
  if (!model)
1061
1072
  return null;
@@ -1066,7 +1077,10 @@ const ParentId = ({
1066
1077
  void storeDo[namesOfSlice.initModel](...initArgs ?? []);
1067
1078
  },
1068
1079
  onChange: (modelId) => {
1069
- onChange(modelId, modelList.get(modelId));
1080
+ if (modelId)
1081
+ onChange(modelId, modelList.get(modelId));
1082
+ else
1083
+ onChange(null, null);
1070
1084
  },
1071
1085
  onSearch
1072
1086
  }
package/esm/Select.js CHANGED
@@ -31,7 +31,10 @@ const Select = ({
31
31
  const { l } = usePage();
32
32
  const [isOpen, setIsOpen] = useState(false);
33
33
  const labeledOptions = useMemo(
34
- () => options instanceof Enum ? options.values.map((v) => ({ label: v, value: v })) : options[0]?.label && options[0]?.value ? options : options.map((v) => ({ label: v, value: v })),
34
+ () => options instanceof Enum ? options.values.map((v) => ({
35
+ label: typeof v === "string" ? v : typeof v === "object" ? JSON.stringify(v) : String(v),
36
+ value: v
37
+ })) : options[0]?.label && options[0]?.value ? options : options.map((v) => ({ label: v, value: v })),
35
38
  [options]
36
39
  );
37
40
  const [selectedValues, setSelectedValues] = useState(multiple ? value : [value]);
@@ -12,8 +12,8 @@ const ToggleSelect = ({
12
12
  disabled
13
13
  }) => {
14
14
  const { l } = usePage();
15
- const validateResult = validate(value ?? "");
16
- const invalidMessage = !value?.length || validateResult === true ? null : validateResult === false ? l("util.invalidValueError") : validateResult;
15
+ const validateResult = value ? validate(value) : false;
16
+ const invalidMessage = value === null || typeof value === "string" && !value.length || validateResult === true ? null : validateResult === false ? l("util.invalidValueError") : validateResult;
17
17
  const options = items.map(
18
18
  (item) => typeof item === "string" ? { label: item, value: item } : item
19
19
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akanjs/ui",
3
- "version": "0.9.7",
3
+ "version": "0.9.8",
4
4
  "sourceType": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"