@synerise/ds-item-picker 1.17.27 → 1.18.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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [1.18.0](https://github.com/Synerise/synerise-design/compare/@synerise/ds-item-picker@1.17.28...@synerise/ds-item-picker@1.18.0) (2026-08-11)
7
+
8
+ ### Features
9
+
10
+ - **item-picker:** add isErrorWarning prop for warning-style error display ([9aef866](https://github.com/Synerise/synerise-design/commit/9aef866e21bb86a3190baae3b32916e2911f5ac2))
11
+
12
+ ## [1.17.28](https://github.com/Synerise/synerise-design/compare/@synerise/ds-item-picker@1.17.27...@synerise/ds-item-picker@1.17.28) (2026-07-24)
13
+
14
+ **Note:** Version bump only for package @synerise/ds-item-picker
15
+
6
16
  ## [1.17.27](https://github.com/Synerise/synerise-design/compare/@synerise/ds-item-picker@1.17.26...@synerise/ds-item-picker@1.17.27) (2026-07-23)
7
17
 
8
18
  **Note:** Version bump only for package @synerise/ds-item-picker
package/CLAUDE.md CHANGED
@@ -112,6 +112,7 @@ Current API. Generic over `ItemType extends BaseItemType` and `SectionType exten
112
112
  | `tooltip?` | `ReactNode` | — | `FormField` tooltip |
113
113
  | `tooltipConfig?` | `FormFieldCommonProps['tooltipConfig']` | — | `FormField` tooltip config |
114
114
  | `error?` | `boolean` | — | Error state on trigger and FormField |
115
+ | `isObjectDeleted?` | `boolean` | — | Marks the selected item as deleted; renders its value text in `red-600` and drops the grey prefix-icon override |
115
116
  | `errorText?` | `FormFieldCommonProps['errorText']` | — | Preferred error message |
116
117
  | `errorMessage?` | `FormFieldCommonProps['errorText']` | — | **@deprecated** — use `errorText` |
117
118
  | `disabled?` | `boolean` | — | Disables trigger and dropdown |
@@ -166,6 +167,7 @@ Use `ItemPicker` (default) with `isNewVersion` instead.
166
167
  | `clearConfirmTitle?` | `string` | `'Please confirm'` | Popconfirm title |
167
168
  | `yesText?` / `noText?` | `string` | `'Yes'` / `'No'` | Popconfirm buttons |
168
169
  | `error?` | `boolean` | — | Error state |
170
+ | `isObjectDeleted?` | `boolean` | — | Marks the selected item as deleted; renders its value text in `red-600` |
169
171
  | `errorMessage?` | `ReactNode` | — | Error text |
170
172
  | `disabled?` | `boolean` | — | Disabled state |
171
173
  | `hideSearchBar?` | `boolean` | — | Hide search bar |
@@ -319,6 +321,7 @@ import { ItemPickerList } from '@synerise/ds-item-picker';
319
321
  - `LIST_FOLDERS_IN_SECTIONS` — folder tiles (no items loaded yet)
320
322
  - **`ItemPickerLegacy` is marked `@deprecated`** in source with a JSDoc comment on the component itself.
321
323
  - **`errorMessage` prop** on `ItemPickerNew` is marked `@deprecated`; prefer `errorText` (from `FormFieldCommonProps`).
324
+ - **`isObjectDeleted` prop** (on `ItemPickerNew`, `ItemPickerLegacy`, and the shared `Trigger`) flags a selected item that no longer exists. When `true`, `Trigger.styles` renders `ValueText` in `red-600` and skips the grey-600 `Prefix` icon override so the deleted state reads visually. It only affects the selected-value display — it has no effect while showing the placeholder.
322
325
  - **Several `ItemPickerTriggerProps` fields are `@deprecated`**: `clear`, `changeButtonLabel`, `clearConfirmTitle`, `yesText`, `noText` — move to `texts` object.
323
326
  - **`Props` alias** in `Trigger.types.ts` is marked `@deprecated`; use `ItemPickerTriggerProps`.
324
327
  - **Tests use Jest** (`jest.config.js` present); the package has not been migrated to Vitest.
package/README.md CHANGED
@@ -67,6 +67,7 @@ import ItemPicker from '@synerise/ds-item-picker'
67
67
  | placeholderIcon? | Icon visible with placeholder | React.ReactNode | - |
68
68
  | error? | Whether the component has error state | boolean | - |
69
69
  | errorMessage? | Error message | string, React.ReactNode | - |
70
+ | isObjectDeleted? | Styles the selected value as deleted (red text) | boolean | - |
70
71
  | tooltip? | Tooltip text | string, React.ReactNode | - |
71
72
  | disabled? | Whether the component is disabled | boolean | - |
72
73
  | changeButtonLabel? | Label of change button, available only when size='large' | string, React.ReactNode | 'Change' |
@@ -1,3 +1 @@
1
- export declare const ItemPickerWrapper: import('styled-components').StyledComponent<"div", any, {
2
- disabled?: boolean;
3
- }, never>;
1
+ export declare const ItemPickerWrapper: import('styled-components').StyledComponent<"div", any, {}, never>;
@@ -3,5 +3,5 @@ import { ItemPickerProps } from './ItemPickerLegacy.types';
3
3
  /**
4
4
  * @deprecated - use new ItemPicker
5
5
  */
6
- declare const ItemPickerLegacy: ({ dataSource, onChange, onClear, placeholder, changeButtonLabel, clear, clearConfirmTitle, closeOnBottomAction, description, disabled, dropdownBottomAction, dropdownProps, dropdownRowHeight, dropdownVisibleRows, error, errorMessage, label, onBlur, onFocus, noResults, noText, placeholderIcon, searchPlaceholder, searchBarProps, selectedItem, tooltip, tooltipConfig, size, yesText, withClearConfirmation, scrollbarProps, informationCardTooltipProps, hideSearchBar, }: ItemPickerProps) => React.JSX.Element;
6
+ declare const ItemPickerLegacy: ({ dataSource, onChange, onClear, placeholder, changeButtonLabel, clear, clearConfirmTitle, closeOnBottomAction, description, disabled, dropdownBottomAction, dropdownProps, dropdownRowHeight, dropdownVisibleRows, error, errorMessage, isObjectDeleted, label, onBlur, onFocus, noResults, noText, placeholderIcon, searchPlaceholder, searchBarProps, selectedItem, tooltip, tooltipConfig, size, yesText, withClearConfirmation, scrollbarProps, informationCardTooltipProps, hideSearchBar, }: ItemPickerProps) => React.JSX.Element;
7
7
  export default ItemPickerLegacy;
@@ -23,6 +23,7 @@ const ItemPickerLegacy = ({
23
23
  dropdownVisibleRows,
24
24
  error,
25
25
  errorMessage,
26
+ isObjectDeleted,
26
27
  label,
27
28
  onBlur,
28
29
  onFocus,
@@ -92,8 +93,8 @@ const ItemPickerLegacy = ({
92
93
  typeof onBlur === "function" && onBlur();
93
94
  }, [setDropdownOpened, onBlur]);
94
95
  const dropdownOverlay = useMemo(() => /* @__PURE__ */ jsx(ItemPickerDropdown, { searchBarProps, clearSearchQuery: clearSearchBarValue.current, onChange, dataSource, placeholder: texts.searchPlaceholder, closeDropdown, noResults: texts.noResults, dropdownVisibleRows, dropdownRowHeight, dropdownBottomAction, closeOnBottomAction, isDropdownOpened: dropdownOpened, scrollbarProps, hideSearchBar }), [searchBarProps, onChange, dataSource, texts, closeDropdown, dropdownVisibleRows, dropdownRowHeight, dropdownBottomAction, closeOnBottomAction, dropdownOpened, hideSearchBar, scrollbarProps]);
95
- const renderTrigger = useMemo(() => /* @__PURE__ */ jsx(Trigger, { clear: texts.clear, selected: selectedItem, onClear, opened: dropdownOpened, placeholder, placeholderIcon, error, disabled, openDropdown, closeDropdown, size, changeButtonLabel: texts.changeButtonLabel, withChangeButton: !withClearConfirmation, clearConfirmTitle: texts.clearConfirmTitle, yesText: texts.yesText, noText: texts.noText, withClearConfirmation: Boolean(withClearConfirmation), informationCardTooltipProps }), [closeDropdown, disabled, dropdownOpened, error, informationCardTooltipProps, onClear, openDropdown, placeholder, placeholderIcon, selectedItem, size, texts.changeButtonLabel, texts.clear, texts.clearConfirmTitle, texts.noText, texts.yesText, withClearConfirmation]);
96
- return /* @__PURE__ */ jsx(ItemPickerWrapper, { className: "ds-items-picker", disabled, children: /* @__PURE__ */ jsx(FormField, { label, tooltip, tooltipConfig, errorText: errorMessage, description, children: /* @__PURE__ */ jsx(Dropdown, { open: dropdownOpened, disabled, trigger: ["click"], overlay: dropdownOverlay, onOpenChange: onVisibilityChange, asChild: true, size: "match-trigger", ...dropdownProps, popoverProps: {
96
+ const renderTrigger = useMemo(() => /* @__PURE__ */ jsx(Trigger, { clear: texts.clear, selected: selectedItem, onClear, opened: dropdownOpened, placeholder, placeholderIcon, error, isObjectDeleted, disabled, openDropdown, closeDropdown, size, changeButtonLabel: texts.changeButtonLabel, withChangeButton: !withClearConfirmation, clearConfirmTitle: texts.clearConfirmTitle, yesText: texts.yesText, noText: texts.noText, withClearConfirmation: Boolean(withClearConfirmation), informationCardTooltipProps }), [closeDropdown, disabled, dropdownOpened, error, informationCardTooltipProps, onClear, openDropdown, placeholder, placeholderIcon, selectedItem, size, texts.changeButtonLabel, texts.clear, texts.clearConfirmTitle, texts.noText, texts.yesText, withClearConfirmation]);
97
+ return /* @__PURE__ */ jsx(ItemPickerWrapper, { className: "ds-items-picker", children: /* @__PURE__ */ jsx(FormField, { label, tooltip, tooltipConfig, errorText: errorMessage, description, children: /* @__PURE__ */ jsx(Dropdown, { open: dropdownOpened, disabled, trigger: ["click"], overlay: dropdownOverlay, onOpenChange: onVisibilityChange, asChild: true, size: "match-trigger", ...dropdownProps, popoverProps: {
97
98
  testId: "item-picker-legacy",
98
99
  ...dropdownProps?.popoverProps
99
100
  }, children: renderTrigger }) }) });
@@ -24,6 +24,7 @@ export type ItemPickerProps<ItemType extends ListItemProps = ListItemProps> = {
24
24
  dropdownVisibleRows?: number;
25
25
  error?: boolean;
26
26
  errorMessage?: FormFieldCommonProps['errorText'];
27
+ isObjectDeleted?: boolean;
27
28
  onBlur?: () => void;
28
29
  onFocus?: () => void;
29
30
  noResults?: string;
@@ -2,7 +2,7 @@ import { default as React } from 'react';
2
2
  import { ItemPickerListRef } from '../ItemPickerList/ItemPickerList.types';
3
3
  import { ItemPickerProps } from './ItemPickerNew.types';
4
4
  import { BaseItemType, BaseSectionType } from './types/baseItemSectionType.types';
5
- declare const ItemPickerNewInner: <ItemType extends BaseItemType, SectionType extends BaseSectionType>({ onFocus, onBlur, onClear, selectedItem, onChange, dropdownProps, texts, triggerProps, renderTrigger, placeholder, placeholderIcon, label, description, error, errorMessage, errorText, disabled, tooltip, tooltipConfig, ...rest }: ItemPickerProps<ItemType, SectionType>, forwardedRef: ItemPickerListRef) => React.JSX.Element;
5
+ declare const ItemPickerNewInner: <ItemType extends BaseItemType, SectionType extends BaseSectionType>({ onFocus, onBlur, onClear, selectedItem, onChange, dropdownProps, texts, triggerProps, renderTrigger, placeholder, placeholderIcon, label, description, error, isObjectDeleted, errorMessage, errorText, disabled, tooltip, tooltipConfig, ...rest }: ItemPickerProps<ItemType, SectionType>, forwardedRef: ItemPickerListRef) => React.JSX.Element;
6
6
  type ItemPickerNewType = <ItemType extends BaseItemType, SectionType extends BaseSectionType>(p: ItemPickerProps<ItemType, SectionType> & {
7
7
  ref?: ItemPickerListRef;
8
8
  }) => ReturnType<typeof ItemPickerNewInner>;
@@ -21,6 +21,7 @@ const ItemPickerNewInner = ({
21
21
  label,
22
22
  description,
23
23
  error,
24
+ isObjectDeleted,
24
25
  errorMessage,
25
26
  errorText,
26
27
  disabled,
@@ -58,9 +59,9 @@ const ItemPickerNewInner = ({
58
59
  closeDropdown,
59
60
  error,
60
61
  disabled
61
- }) : /* @__PURE__ */ jsx(Trigger, { size: "small", ...triggerProps, opened: visible, texts: allTexts, disabled, placeholder, placeholderIcon, selected: selectedItem, onClear, openDropdown, closeDropdown, error });
62
- }, [allTexts, disabled, error, onClear, placeholder, placeholderIcon, renderTrigger, selectedItem, triggerProps, visible]);
63
- return /* @__PURE__ */ jsx(ItemPickerWrapper, { className: "ds-items-picker", disabled, children: /* @__PURE__ */ jsx(FormField, { label, tooltip, tooltipConfig, errorText: errorText || errorMessage, description, children: /* @__PURE__ */ jsx(Dropdown, { overlayStyle: {
62
+ }) : /* @__PURE__ */ jsx(Trigger, { size: "small", ...triggerProps, opened: visible, texts: allTexts, disabled, placeholder, placeholderIcon, selected: selectedItem, onClear, openDropdown, closeDropdown, error, isObjectDeleted });
63
+ }, [allTexts, disabled, error, isObjectDeleted, onClear, placeholder, placeholderIcon, renderTrigger, selectedItem, triggerProps, visible]);
64
+ return /* @__PURE__ */ jsx(ItemPickerWrapper, { className: "ds-items-picker", children: /* @__PURE__ */ jsx(FormField, { label, tooltip, tooltipConfig, errorText: errorText || errorMessage, description, children: /* @__PURE__ */ jsx(Dropdown, { overlayStyle: {
64
65
  minWidth: "400px"
65
66
  }, size: "match-trigger", asChild: true, ...dropdownProps, popoverProps: {
66
67
  testId: "item-picker",
@@ -62,6 +62,7 @@ export type ItemPickerProps<ItemType extends BaseItemType, SectionType extends B
62
62
  */
63
63
  errorMessage?: FormFieldCommonProps['errorText'];
64
64
  error?: boolean;
65
+ isObjectDeleted?: boolean;
65
66
  disabled?: boolean;
66
67
  onChange?: (item: ItemType) => void;
67
68
  onFocus?: () => void;
@@ -9,6 +9,7 @@ declare const Trigger: React.ForwardRefExoticComponent<{
9
9
  placeholder: React.ReactNode;
10
10
  placeholderIcon?: React.ReactNode;
11
11
  error?: boolean;
12
+ isObjectDeleted?: boolean;
12
13
  disabled?: boolean;
13
14
  selected?: import('@synerise/ds-list-item').ListItemProps;
14
15
  changeButtonLabel?: React.ReactNode;
@@ -16,6 +16,7 @@ const Trigger = forwardRef(({
16
16
  placeholder,
17
17
  placeholderIcon,
18
18
  error,
19
+ isObjectDeleted,
19
20
  disabled,
20
21
  openDropdown,
21
22
  closeDropdown,
@@ -71,9 +72,9 @@ const Trigger = forwardRef(({
71
72
  }, [size, disabled, withChangeButton, handleChangeButtonClick, allTexts.changeButtonLabel]);
72
73
  const renderedTrigger = useMemo(() => /* @__PURE__ */ jsxs(TriggerWrapper, { tabIndex: selected ? void 0 : 0, size, opened, disabled, error, onClick: handleOpen, selected: Boolean(selected), clearable: Boolean(onClear && renderClear), ref: !informationCardTooltipProps ? ref : void 0, children: [
73
74
  /* @__PURE__ */ jsx(Trigger$1, { size, children: selected ? /* @__PURE__ */ jsxs(Fragment, { children: [
74
- /* @__PURE__ */ jsxs(Value, { children: [
75
+ /* @__PURE__ */ jsxs(Value, { isObjectDeleted, children: [
75
76
  selected.prefixel && /* @__PURE__ */ jsx(Prefix, { "data-testid": "value-prefixel", children: /* @__PURE__ */ jsx(Fragment, { children: selected.prefixel }) }),
76
- /* @__PURE__ */ jsx(ValueText, { children: selected.text })
77
+ /* @__PURE__ */ jsx(ValueText, { isObjectDeleted, children: selected.text })
77
78
  ] }),
78
79
  renderChangeButton
79
80
  ] }) : /* @__PURE__ */ jsxs(Placeholder, { size, children: [
@@ -17,11 +17,15 @@ export declare const Prefix: import('styled-components').StyledComponent<"div",
17
17
  export declare const Placeholder: import('styled-components').StyledComponent<"div", any, {
18
18
  size: ItemPickerSize;
19
19
  }, never>;
20
- export declare const Value: import('styled-components').StyledComponent<"div", any, {}, never>;
20
+ export declare const Value: import('styled-components').StyledComponent<"div", any, {
21
+ isObjectDeleted?: boolean;
22
+ }, never>;
21
23
  export declare const Trigger: import('styled-components').StyledComponent<"div", any, {
22
24
  size: ItemPickerSize;
23
25
  }, never>;
24
26
  export declare const TriggerWrapper: import('styled-components').StyledComponent<"div", any, TriggerWrapperProps, never>;
25
27
  export declare const ChangeButtonWrapper: import('styled-components').StyledComponent<"div", any, {}, never>;
26
- export declare const ValueText: import('styled-components').StyledComponent<"span", any, {}, never>;
28
+ export declare const ValueText: import('styled-components').StyledComponent<"span", any, {
29
+ isObjectDeleted?: boolean;
30
+ }, never>;
27
31
  export {};
@@ -50,7 +50,7 @@ const Placeholder = /* @__PURE__ */ styled.div.withConfig({
50
50
  const Value = /* @__PURE__ */ styled.div.withConfig({
51
51
  displayName: "Triggerstyles__Value",
52
52
  componentId: "sc-1t1uce7-6"
53
- })(["display:flex;flex-direction:row;align-items:center;justify-content:flex-start;flex:1;color:", ";max-width:100%;overflow:hidden;padding:0 0 0 4px;", "{svg{fill:", ";color:", ";}}"], (props) => props.theme.palette["grey-800"], Prefix, (props) => props.theme.palette["grey-600"], (props) => props.theme.palette["grey-600"]);
53
+ })(["display:flex;flex-direction:row;align-items:center;justify-content:flex-start;flex:1;color:", ";max-width:100%;overflow:hidden;padding:0 0 0 4px;", ""], (props) => props.theme.palette["grey-800"], (props) => !props.isObjectDeleted && css(["", "{svg{fill:", ";color:", ";}}"], Prefix, props.theme.palette["grey-600"], props.theme.palette["grey-600"]));
54
54
  const Trigger = /* @__PURE__ */ styled.div.withConfig({
55
55
  displayName: "Triggerstyles__Trigger",
56
56
  componentId: "sc-1t1uce7-7"
@@ -99,7 +99,7 @@ const ChangeButtonWrapper = /* @__PURE__ */ styled.div.withConfig({
99
99
  const ValueText = /* @__PURE__ */ styled.span.withConfig({
100
100
  displayName: "Triggerstyles__ValueText",
101
101
  componentId: "sc-1t1uce7-10"
102
- })(["text-overflow:ellipsis;overflow:hidden;white-space:nowrap;"]);
102
+ })(["text-overflow:ellipsis;overflow:hidden;white-space:nowrap;", ""], (props) => props.isObjectDeleted && css(["color:", ";"], props.theme.palette["red-600"]));
103
103
  export {
104
104
  AngleIconWrapper,
105
105
  ChangeButtonWrapper,
@@ -21,6 +21,7 @@ export type ItemPickerTriggerProps = {
21
21
  placeholder: ReactNode;
22
22
  placeholderIcon?: ReactNode;
23
23
  error?: boolean;
24
+ isObjectDeleted?: boolean;
24
25
  disabled?: boolean;
25
26
  selected?: ListItemProps;
26
27
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synerise/ds-item-picker",
3
- "version": "1.17.27",
3
+ "version": "1.18.0",
4
4
  "description": "ItemPicker UI Component for the Synerise Design System",
5
5
  "license": "ISC",
6
6
  "repository": "Synerise/synerise-design",
@@ -42,26 +42,26 @@
42
42
  ],
43
43
  "types": "dist/index.d.ts",
44
44
  "dependencies": {
45
- "@synerise/ds-alert": "^1.1.62",
46
- "@synerise/ds-avatar": "^1.3.19",
47
- "@synerise/ds-button": "^1.5.35",
48
- "@synerise/ds-dropdown": "^1.3.20",
45
+ "@synerise/ds-alert": "^1.1.63",
46
+ "@synerise/ds-avatar": "^1.3.20",
47
+ "@synerise/ds-button": "^1.5.36",
48
+ "@synerise/ds-dropdown": "^1.3.22",
49
49
  "@synerise/ds-empty-states": "^1.0.49",
50
50
  "@synerise/ds-flag": "^1.0.13",
51
- "@synerise/ds-form-field": "^1.3.24",
51
+ "@synerise/ds-form-field": "^1.3.25",
52
52
  "@synerise/ds-icon": "^1.18.5",
53
- "@synerise/ds-information-card": "^1.7.8",
54
- "@synerise/ds-list-item": "^1.6.2",
53
+ "@synerise/ds-information-card": "^1.7.10",
54
+ "@synerise/ds-list-item": "^1.6.3",
55
55
  "@synerise/ds-loader": "^1.0.18",
56
- "@synerise/ds-popconfirm": "^1.4.2",
57
- "@synerise/ds-result": "^1.0.66",
56
+ "@synerise/ds-popconfirm": "^1.4.3",
57
+ "@synerise/ds-result": "^1.0.67",
58
58
  "@synerise/ds-scrollbar": "^1.5.2",
59
- "@synerise/ds-search": "^1.5.34",
60
- "@synerise/ds-search-bar": "^1.4.35",
61
- "@synerise/ds-short-cuts": "^1.0.56",
62
- "@synerise/ds-skeleton": "^1.0.60",
63
- "@synerise/ds-tooltip": "^1.5.4",
64
- "@synerise/ds-typography": "^1.1.27",
59
+ "@synerise/ds-search": "^1.5.35",
60
+ "@synerise/ds-search-bar": "^1.4.37",
61
+ "@synerise/ds-short-cuts": "^1.0.57",
62
+ "@synerise/ds-skeleton": "^1.0.61",
63
+ "@synerise/ds-tooltip": "^1.5.5",
64
+ "@synerise/ds-typography": "^1.1.28",
65
65
  "@synerise/ds-utils": "^1.10.2",
66
66
  "lodash.debounce": "^4.0.8",
67
67
  "react-window": "^1.8.11",
@@ -77,5 +77,5 @@
77
77
  "styled-components": "^5.3.3",
78
78
  "vitest": "4"
79
79
  },
80
- "gitHead": "d0a43cc43d8528a36f105aceea52ab470edb71d9"
80
+ "gitHead": "6df24ed12cd5f276d8eccde730591807982e3385"
81
81
  }