@porsche-design-system/components-react 4.5.0 → 4.6.0-rc.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 +8 -0
- package/bin/pds-skill.js +259 -0
- package/esm/lib/components/button.wrapper.d.ts +2 -2
- package/esm/lib/components/link.wrapper.d.ts +2 -2
- package/package.json +4 -3
- package/skill/SKILL.md +136 -0
- package/skill/references/components/p-accordion/examples/Default.tsx +24 -0
- package/skill/references/components/p-accordion/examples/InteractiveElementsInSummary.tsx +28 -0
- package/skill/references/components/p-accordion/examples/StickySummary.tsx +24 -0
- package/skill/references/components/p-accordion/p-accordion.md +95 -0
- package/skill/references/components/p-ai-tag/examples/Default.tsx +10 -0
- package/skill/references/components/p-ai-tag/examples/WithinCheckbox.tsx +30 -0
- package/skill/references/components/p-ai-tag/examples/WithinFormLabel.tsx +37 -0
- package/skill/references/components/p-ai-tag/examples/WithinImage.tsx +13 -0
- package/skill/references/components/p-ai-tag/examples/WithinInputSearch.tsx +12 -0
- package/skill/references/components/p-ai-tag/examples/WithinRadioGroup.tsx +29 -0
- package/skill/references/components/p-ai-tag/examples/WithinTable.tsx +91 -0
- package/skill/references/components/p-ai-tag/examples/WithinText.tsx +14 -0
- package/skill/references/components/p-ai-tag/p-ai-tag.md +47 -0
- package/skill/references/components/p-banner/examples/Customization.tsx +35 -0
- package/skill/references/components/p-banner/examples/Default.tsx +24 -0
- package/skill/references/components/p-banner/p-banner.md +92 -0
- package/skill/references/components/p-button/examples/Default.tsx +12 -0
- package/skill/references/components/p-button/examples/Form.tsx +28 -0
- package/skill/references/components/p-button/examples/FormAttribute.tsx +31 -0
- package/skill/references/components/p-button/p-button.md +118 -0
- package/skill/references/components/p-button-pure/examples/CustomClickableArea.tsx +12 -0
- package/skill/references/components/p-button-pure/examples/Default.tsx +12 -0
- package/skill/references/components/p-button-pure/examples/Form.tsx +28 -0
- package/skill/references/components/p-button-pure/examples/FormAttribute.tsx +32 -0
- package/skill/references/components/p-button-pure/p-button-pure.md +118 -0
- package/skill/references/components/p-button-tile/examples/ColorScheme.tsx +15 -0
- package/skill/references/components/p-button-tile/examples/Default.tsx +18 -0
- package/skill/references/components/p-button-tile/examples/FooterSlot.tsx +29 -0
- package/skill/references/components/p-button-tile/examples/Hyphens.tsx +33 -0
- package/skill/references/components/p-button-tile/examples/UiBehaviour.tsx +41 -0
- package/skill/references/components/p-button-tile/p-button-tile.md +115 -0
- package/skill/references/components/p-canvas/examples/Default.tsx +10 -0
- package/skill/references/components/p-canvas/p-canvas.md +91 -0
- package/skill/references/components/p-carousel/examples/Default.tsx +23 -0
- package/skill/references/components/p-carousel/examples/DynamicSlides.tsx +32 -0
- package/skill/references/components/p-carousel/examples/FlexibleWidths.tsx +29 -0
- package/skill/references/components/p-carousel/examples/FocusOnCenterSlide.tsx +56 -0
- package/skill/references/components/p-carousel/examples/Intl.tsx +20 -0
- package/skill/references/components/p-carousel/examples/JumpToSlide.tsx +42 -0
- package/skill/references/components/p-carousel/p-carousel.md +142 -0
- package/skill/references/components/p-checkbox/examples/Default.tsx +10 -0
- package/skill/references/components/p-checkbox/examples/Form.tsx +45 -0
- package/skill/references/components/p-checkbox/examples/Indeterminate.tsx +13 -0
- package/skill/references/components/p-checkbox/examples/Slots.tsx +54 -0
- package/skill/references/components/p-checkbox/examples/WrappedLabel.tsx +24 -0
- package/skill/references/components/p-checkbox/p-checkbox.md +122 -0
- package/skill/references/components/p-crest/examples/CustomClickableArea.tsx +10 -0
- package/skill/references/components/p-crest/examples/Default.tsx +10 -0
- package/skill/references/components/p-crest/examples/Link.tsx +10 -0
- package/skill/references/components/p-crest/p-crest.md +65 -0
- package/skill/references/components/p-display/examples/Color.tsx +12 -0
- package/skill/references/components/p-display/examples/Default.tsx +12 -0
- package/skill/references/components/p-display/examples/Semantics.tsx +18 -0
- package/skill/references/components/p-display/examples/Size.tsx +12 -0
- package/skill/references/components/p-display/examples/SizeResponsive.tsx +12 -0
- package/skill/references/components/p-display/p-display.md +78 -0
- package/skill/references/components/p-divider/examples/Default.tsx +10 -0
- package/skill/references/components/p-divider/examples/Responsive.tsx +12 -0
- package/skill/references/components/p-divider/examples/Vertical.tsx +12 -0
- package/skill/references/components/p-divider/p-divider.md +49 -0
- package/skill/references/components/p-drilldown/examples/CustomContent.tsx +164 -0
- package/skill/references/components/p-drilldown/examples/Default.tsx +117 -0
- package/skill/references/components/p-drilldown/p-drilldown.md +168 -0
- package/skill/references/components/p-fieldset/examples/Default.tsx +12 -0
- package/skill/references/components/p-fieldset/examples/Required.tsx +13 -0
- package/skill/references/components/p-fieldset/examples/SlottedLabel.tsx +15 -0
- package/skill/references/components/p-fieldset/examples/SlottedMessage.tsx +15 -0
- package/skill/references/components/p-fieldset/p-fieldset.md +88 -0
- package/skill/references/components/p-flag/examples/Default.tsx +10 -0
- package/skill/references/components/p-flag/examples/ResponsiveSize.tsx +10 -0
- package/skill/references/components/p-flag/examples/Size.tsx +13 -0
- package/skill/references/components/p-flag/examples/SizeCssVar.tsx +10 -0
- package/skill/references/components/p-flag/p-flag.md +68 -0
- package/skill/references/components/p-flyout/examples/CustomStyling.tsx +45 -0
- package/skill/references/components/p-flyout/examples/Default.tsx +42 -0
- package/skill/references/components/p-flyout/examples/Form.tsx +54 -0
- package/skill/references/components/p-flyout/examples/StickyTop.tsx +42 -0
- package/skill/references/components/p-flyout/p-flyout.md +128 -0
- package/skill/references/components/p-heading/examples/Color.tsx +12 -0
- package/skill/references/components/p-heading/examples/Default.tsx +12 -0
- package/skill/references/components/p-heading/examples/Semantics.tsx +18 -0
- package/skill/references/components/p-heading/p-heading.md +78 -0
- package/skill/references/components/p-icon/examples/Color.tsx +13 -0
- package/skill/references/components/p-icon/examples/ColorCssVar.tsx +10 -0
- package/skill/references/components/p-icon/examples/Custom.tsx +10 -0
- package/skill/references/components/p-icon/examples/Default.tsx +10 -0
- package/skill/references/components/p-icon/examples/Overview.tsx +588 -0
- package/skill/references/components/p-icon/examples/ResponsiveSize.tsx +10 -0
- package/skill/references/components/p-icon/examples/Size.tsx +13 -0
- package/skill/references/components/p-icon/examples/SizeCssVar.tsx +10 -0
- package/skill/references/components/p-icon/p-icon.md +88 -0
- package/skill/references/components/p-inline-notification/examples/ActionButton.tsx +25 -0
- package/skill/references/components/p-inline-notification/examples/Default.tsx +10 -0
- package/skill/references/components/p-inline-notification/examples/EventHandling.tsx +25 -0
- package/skill/references/components/p-inline-notification/p-inline-notification.md +74 -0
- package/skill/references/components/p-input-date/examples/Default.tsx +10 -0
- package/skill/references/components/p-input-date/examples/Form.tsx +45 -0
- package/skill/references/components/p-input-date/examples/Slots.tsx +41 -0
- package/skill/references/components/p-input-date/p-input-date.md +142 -0
- package/skill/references/components/p-input-email/examples/Default.tsx +10 -0
- package/skill/references/components/p-input-email/examples/Form.tsx +51 -0
- package/skill/references/components/p-input-email/examples/Slots.tsx +41 -0
- package/skill/references/components/p-input-email/p-input-email.md +146 -0
- package/skill/references/components/p-input-month/examples/Default.tsx +10 -0
- package/skill/references/components/p-input-month/examples/Form.tsx +45 -0
- package/skill/references/components/p-input-month/examples/Slots.tsx +41 -0
- package/skill/references/components/p-input-month/p-input-month.md +142 -0
- package/skill/references/components/p-input-number/examples/Default.tsx +10 -0
- package/skill/references/components/p-input-number/examples/Form.tsx +51 -0
- package/skill/references/components/p-input-number/examples/Slots.tsx +41 -0
- package/skill/references/components/p-input-number/p-input-number.md +150 -0
- package/skill/references/components/p-input-password/examples/Default.tsx +10 -0
- package/skill/references/components/p-input-password/examples/Form.tsx +51 -0
- package/skill/references/components/p-input-password/examples/Slots.tsx +39 -0
- package/skill/references/components/p-input-password/examples/Toggle.tsx +10 -0
- package/skill/references/components/p-input-password/p-input-password.md +145 -0
- package/skill/references/components/p-input-search/examples/AriaCombobox.tsx +35 -0
- package/skill/references/components/p-input-search/examples/Default.tsx +10 -0
- package/skill/references/components/p-input-search/examples/Form.tsx +52 -0
- package/skill/references/components/p-input-search/examples/Slots.tsx +41 -0
- package/skill/references/components/p-input-search/p-input-search.md +182 -0
- package/skill/references/components/p-input-tel/examples/Default.tsx +10 -0
- package/skill/references/components/p-input-tel/examples/Form.tsx +45 -0
- package/skill/references/components/p-input-tel/examples/Slots.tsx +41 -0
- package/skill/references/components/p-input-tel/p-input-tel.md +145 -0
- package/skill/references/components/p-input-text/examples/Controlled.tsx +36 -0
- package/skill/references/components/p-input-text/examples/Default.tsx +10 -0
- package/skill/references/components/p-input-text/examples/Form.tsx +45 -0
- package/skill/references/components/p-input-text/examples/Slots.tsx +41 -0
- package/skill/references/components/p-input-text/p-input-text.md +150 -0
- package/skill/references/components/p-input-time/examples/Default.tsx +10 -0
- package/skill/references/components/p-input-time/examples/Form.tsx +45 -0
- package/skill/references/components/p-input-time/examples/Slots.tsx +41 -0
- package/skill/references/components/p-input-time/p-input-time.md +144 -0
- package/skill/references/components/p-input-url/examples/Default.tsx +10 -0
- package/skill/references/components/p-input-url/examples/Form.tsx +45 -0
- package/skill/references/components/p-input-url/examples/Slots.tsx +41 -0
- package/skill/references/components/p-input-url/p-input-url.md +145 -0
- package/skill/references/components/p-input-week/examples/Default.tsx +10 -0
- package/skill/references/components/p-input-week/examples/Form.tsx +45 -0
- package/skill/references/components/p-input-week/examples/Slots.tsx +41 -0
- package/skill/references/components/p-input-week/p-input-week.md +142 -0
- package/skill/references/components/p-link/examples/Default.tsx +12 -0
- package/skill/references/components/p-link/examples/FrameworkRouting.tsx +14 -0
- package/skill/references/components/p-link/examples/Icon.tsx +17 -0
- package/skill/references/components/p-link/p-link.md +101 -0
- package/skill/references/components/p-link-pure/examples/CustomClickableArea.tsx +12 -0
- package/skill/references/components/p-link-pure/examples/Default.tsx +12 -0
- package/skill/references/components/p-link-pure/examples/FrameworkRouting.tsx +14 -0
- package/skill/references/components/p-link-pure/examples/Icon.tsx +17 -0
- package/skill/references/components/p-link-pure/p-link-pure.md +110 -0
- package/skill/references/components/p-link-tile/examples/ColorScheme.tsx +15 -0
- package/skill/references/components/p-link-tile/examples/Default.tsx +18 -0
- package/skill/references/components/p-link-tile/examples/FooterSlot.tsx +29 -0
- package/skill/references/components/p-link-tile/examples/Hyphens.tsx +34 -0
- package/skill/references/components/p-link-tile/examples/UiBehaviour.tsx +41 -0
- package/skill/references/components/p-link-tile/examples/WithVideo.tsx +15 -0
- package/skill/references/components/p-link-tile/p-link-tile.md +105 -0
- package/skill/references/components/p-link-tile-product/examples/Default.tsx +22 -0
- package/skill/references/components/p-link-tile-product/examples/FrameworkRouting.tsx +25 -0
- package/skill/references/components/p-link-tile-product/p-link-tile-product.md +93 -0
- package/skill/references/components/p-modal/examples/AlertDialog.tsx +39 -0
- package/skill/references/components/p-modal/examples/CustomStyling.tsx +26 -0
- package/skill/references/components/p-modal/examples/Default.tsx +39 -0
- package/skill/references/components/p-modal/examples/Scrollable.tsx +43 -0
- package/skill/references/components/p-modal/p-modal.md +135 -0
- package/skill/references/components/p-model-signature/examples/CustomStyling.tsx +14 -0
- package/skill/references/components/p-model-signature/examples/Default.tsx +10 -0
- package/skill/references/components/p-model-signature/examples/MaskBlendMode.tsx +32 -0
- package/skill/references/components/p-model-signature/examples/MaskImage.tsx +12 -0
- package/skill/references/components/p-model-signature/examples/MaskVideo.tsx +12 -0
- package/skill/references/components/p-model-signature/examples/SafeZone.tsx +60 -0
- package/skill/references/components/p-model-signature/p-model-signature.md +62 -0
- package/skill/references/components/p-multi-select/examples/AsyncFilter.tsx +136 -0
- package/skill/references/components/p-multi-select/examples/Default.tsx +29 -0
- package/skill/references/components/p-multi-select/examples/Form.tsx +53 -0
- package/skill/references/components/p-multi-select/examples/Optgroups.tsx +42 -0
- package/skill/references/components/p-multi-select/examples/SelectedSlot.tsx +94 -0
- package/skill/references/components/p-multi-select/examples/SetValue.tsx +80 -0
- package/skill/references/components/p-multi-select/examples/Slots.tsx +48 -0
- package/skill/references/components/p-multi-select/p-multi-select.md +197 -0
- package/skill/references/components/p-pagination/examples/Default.tsx +10 -0
- package/skill/references/components/p-pagination/p-pagination.md +83 -0
- package/skill/references/components/p-pin-code/examples/CopyPaste.tsx +10 -0
- package/skill/references/components/p-pin-code/examples/Default.tsx +10 -0
- package/skill/references/components/p-pin-code/examples/Form.tsx +45 -0
- package/skill/references/components/p-pin-code/examples/Slots.tsx +39 -0
- package/skill/references/components/p-pin-code/p-pin-code.md +109 -0
- package/skill/references/components/p-popover/examples/Default.tsx +14 -0
- package/skill/references/components/p-popover/examples/SlottedButton.tsx +15 -0
- package/skill/references/components/p-popover/p-popover.md +116 -0
- package/skill/references/components/p-radio-group/examples/Default.tsx +17 -0
- package/skill/references/components/p-radio-group/examples/Form.tsx +53 -0
- package/skill/references/components/p-radio-group/examples/Slots.tsx +69 -0
- package/skill/references/components/p-radio-group/p-radio-group.md +157 -0
- package/skill/references/components/p-scroller/examples/Default.tsx +51 -0
- package/skill/references/components/p-scroller/examples/Height.tsx +26 -0
- package/skill/references/components/p-scroller/examples/ScrollToPosition.tsx +58 -0
- package/skill/references/components/p-scroller/p-scroller.md +93 -0
- package/skill/references/components/p-segmented-control/examples/Default.tsx +26 -0
- package/skill/references/components/p-segmented-control/examples/Form.tsx +52 -0
- package/skill/references/components/p-segmented-control/examples/Slots.tsx +54 -0
- package/skill/references/components/p-segmented-control/examples/WithLabels.tsx +26 -0
- package/skill/references/components/p-segmented-control/p-segmented-control.md +162 -0
- package/skill/references/components/p-select/examples/AsyncFilter.tsx +136 -0
- package/skill/references/components/p-select/examples/Default.tsx +29 -0
- package/skill/references/components/p-select/examples/Form.tsx +53 -0
- package/skill/references/components/p-select/examples/Optgroups.tsx +42 -0
- package/skill/references/components/p-select/examples/Required.tsx +48 -0
- package/skill/references/components/p-select/examples/SelectedSlot.tsx +124 -0
- package/skill/references/components/p-select/examples/SetValue.tsx +80 -0
- package/skill/references/components/p-select/examples/Slots.tsx +48 -0
- package/skill/references/components/p-select/examples/SlottedImages.tsx +35 -0
- package/skill/references/components/p-select/p-select.md +194 -0
- package/skill/references/components/p-sheet/examples/Default.tsx +31 -0
- package/skill/references/components/p-sheet/p-sheet.md +121 -0
- package/skill/references/components/p-spinner/examples/Color.tsx +13 -0
- package/skill/references/components/p-spinner/examples/ColorCssVar.tsx +10 -0
- package/skill/references/components/p-spinner/examples/Default.tsx +10 -0
- package/skill/references/components/p-spinner/examples/ResponsiveSize.tsx +10 -0
- package/skill/references/components/p-spinner/examples/Size.tsx +13 -0
- package/skill/references/components/p-spinner/examples/SizeCssVar.tsx +10 -0
- package/skill/references/components/p-spinner/p-spinner.md +96 -0
- package/skill/references/components/p-stepper-horizontal/examples/Default.tsx +23 -0
- package/skill/references/components/p-stepper-horizontal/examples/FrameworkImplementation.tsx +100 -0
- package/skill/references/components/p-stepper-horizontal/p-stepper-horizontal.md +109 -0
- package/skill/references/components/p-switch/examples/Default.tsx +19 -0
- package/skill/references/components/p-switch/p-switch.md +103 -0
- package/skill/references/components/p-table/examples/Advanced.tsx +186 -0
- package/skill/references/components/p-table/examples/CaptionProperty.tsx +37 -0
- package/skill/references/components/p-table/examples/CaptionSlot.tsx +40 -0
- package/skill/references/components/p-table/examples/Default.tsx +117 -0
- package/skill/references/components/p-table/examples/HideLabel.tsx +37 -0
- package/skill/references/components/p-table/examples/LayoutFixed.tsx +50 -0
- package/skill/references/components/p-table/examples/Sorting.tsx +86 -0
- package/skill/references/components/p-table/p-table.md +189 -0
- package/skill/references/components/p-tabs/examples/ActiveTab.tsx +26 -0
- package/skill/references/components/p-tabs/examples/Default.tsx +26 -0
- package/skill/references/components/p-tabs/examples/Gradient.tsx +111 -0
- package/skill/references/components/p-tabs/examples/Labelling.tsx +26 -0
- package/skill/references/components/p-tabs/p-tabs.md +136 -0
- package/skill/references/components/p-tabs-bar/examples/Default.tsx +27 -0
- package/skill/references/components/p-tabs-bar/examples/Gradient.tsx +78 -0
- package/skill/references/components/p-tabs-bar/examples/Labelling.tsx +27 -0
- package/skill/references/components/p-tabs-bar/examples/Links.tsx +20 -0
- package/skill/references/components/p-tabs-bar/p-tabs-bar.md +181 -0
- package/skill/references/components/p-tag/examples/Default.tsx +12 -0
- package/skill/references/components/p-tag/examples/Multiline.tsx +14 -0
- package/skill/references/components/p-tag/examples/SlottedButton.tsx +41 -0
- package/skill/references/components/p-tag/examples/SlottedLink.tsx +41 -0
- package/skill/references/components/p-tag/p-tag.md +66 -0
- package/skill/references/components/p-tag-dismissible/examples/Default.tsx +12 -0
- package/skill/references/components/p-tag-dismissible/p-tag-dismissible.md +75 -0
- package/skill/references/components/p-text/examples/Default.tsx +12 -0
- package/skill/references/components/p-text/examples/Semantics.tsx +18 -0
- package/skill/references/components/p-text/examples/Size.tsx +12 -0
- package/skill/references/components/p-text/examples/SizeResponsive.tsx +12 -0
- package/skill/references/components/p-text/p-text.md +68 -0
- package/skill/references/components/p-text-list/examples/Default.tsx +28 -0
- package/skill/references/components/p-text-list/p-text-list.md +68 -0
- package/skill/references/components/p-textarea/examples/Default.tsx +10 -0
- package/skill/references/components/p-textarea/examples/Form.tsx +45 -0
- package/skill/references/components/p-textarea/examples/Slots.tsx +39 -0
- package/skill/references/components/p-textarea/p-textarea.md +122 -0
- package/skill/references/components/p-toast/examples/Default.tsx +22 -0
- package/skill/references/components/p-toast/p-toast.md +61 -0
- package/skill/references/components/p-wordmark/examples/CustomClickableArea.tsx +10 -0
- package/skill/references/components/p-wordmark/examples/Default.tsx +10 -0
- package/skill/references/components/p-wordmark/examples/Size.tsx +10 -0
- package/skill/references/components/p-wordmark/p-wordmark.md +66 -0
- package/skill/references/icons.md +5 -0
- package/skill/references/styles/emotion.md +439 -0
- package/skill/references/styles/scss.md +402 -0
- package/skill/references/styles/tailwindcss.md +356 -0
- package/skill/references/styles/vanilla-extract.md +444 -0
- package/skill/references/stylesheets.md +331 -0
- package/skill/references/tokens.md +323 -0
- package/ssr/cjs/components/dist/styles/esm/styles-entry.cjs +1 -1
- package/ssr/cjs/components/dist/utils/esm/utils-entry.cjs +1 -1
- package/ssr/esm/components/dist/styles/esm/styles-entry.mjs +1 -1
- package/ssr/esm/components/dist/utils/esm/utils-entry.mjs +1 -1
- package/ssr/esm/lib/components/button.wrapper.d.ts +2 -2
- package/ssr/esm/lib/components/link.wrapper.d.ts +2 -2
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
type InputSearchInputEventDetail,
|
|
4
|
+
type MultiSelectChangeEventDetail,
|
|
5
|
+
type MultiSelectToggleEventDetail,
|
|
6
|
+
PIcon,
|
|
7
|
+
PInputSearch,
|
|
8
|
+
PMultiSelect,
|
|
9
|
+
PMultiSelectOption,
|
|
10
|
+
type PMultiSelectProps,
|
|
11
|
+
} from '@porsche-design-system/components-react';
|
|
12
|
+
import { useCallback, useRef, useState } from 'react';
|
|
13
|
+
|
|
14
|
+
const useDebounce = <T,>(callback: (value: T) => void, delay = 400) => {
|
|
15
|
+
const timer = useRef<number | undefined>(undefined);
|
|
16
|
+
return (value: T) => {
|
|
17
|
+
if (timer.current) clearTimeout(timer.current);
|
|
18
|
+
timer.current = window.setTimeout(() => callback(value), delay);
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const Example = () => {
|
|
23
|
+
const [value, setValue] = useState<PMultiSelectProps['value']>([]);
|
|
24
|
+
const [options, setOptions] = useState<{ value: string; label: string }[]>([]);
|
|
25
|
+
|
|
26
|
+
const [searchValue, setSearchValue] = useState('');
|
|
27
|
+
const [initialLoading, setInitialLoading] = useState(false);
|
|
28
|
+
const [loading, setLoading] = useState(false);
|
|
29
|
+
const [error, setError] = useState<string | null>(null);
|
|
30
|
+
|
|
31
|
+
const hasLoadedOnce = useRef(false);
|
|
32
|
+
const currentFetchId = useRef(0);
|
|
33
|
+
|
|
34
|
+
// 💡Consider using a data-fetching library like React Query or SWR here.
|
|
35
|
+
// They provide built-in caching, deduplication, retries, and loading/error state management,
|
|
36
|
+
// which would make this async logic cleaner and more reliable than manual fetch handling.
|
|
37
|
+
const fetchOptions = useCallback(async (term?: string, isInitial?: boolean) => {
|
|
38
|
+
const fetchId = ++currentFetchId.current;
|
|
39
|
+
isInitial ? setInitialLoading(true) : setLoading(true);
|
|
40
|
+
try {
|
|
41
|
+
const url = term
|
|
42
|
+
? `https://jsonplaceholder.typicode.com/users?username_like=${term}`
|
|
43
|
+
: `https://jsonplaceholder.typicode.com/users`;
|
|
44
|
+
|
|
45
|
+
const res = await fetch(url);
|
|
46
|
+
const data: { id: number; name: string; username: string }[] = await res.json();
|
|
47
|
+
|
|
48
|
+
// Ignore stale results
|
|
49
|
+
if (fetchId !== currentFetchId.current) return;
|
|
50
|
+
|
|
51
|
+
const newOptions = data.map((user) => ({
|
|
52
|
+
value: user.id.toString(),
|
|
53
|
+
label: `${user.name} (${user.username})`,
|
|
54
|
+
}));
|
|
55
|
+
|
|
56
|
+
setOptions(newOptions);
|
|
57
|
+
setError(null);
|
|
58
|
+
hasLoadedOnce.current = true;
|
|
59
|
+
} catch (err) {
|
|
60
|
+
console.error('Failed to fetch options', err);
|
|
61
|
+
setOptions([]);
|
|
62
|
+
setError('Failed to load options');
|
|
63
|
+
} finally {
|
|
64
|
+
isInitial ? setInitialLoading(false) : setLoading(false);
|
|
65
|
+
}
|
|
66
|
+
}, []);
|
|
67
|
+
|
|
68
|
+
const debouncedFetch = useDebounce(fetchOptions, 400);
|
|
69
|
+
|
|
70
|
+
const onInput = (e: CustomEvent<InputSearchInputEventDetail>) => {
|
|
71
|
+
const term = (e.target as HTMLElement & { value: string }).value;
|
|
72
|
+
setSearchValue(term);
|
|
73
|
+
debouncedFetch(term.trim() || undefined);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const onChange = (e: CustomEvent<MultiSelectChangeEventDetail>) => {
|
|
77
|
+
setValue((e.target as HTMLElement & { value: string[] }).value);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const onToggle = async (e: CustomEvent<MultiSelectToggleEventDetail>) => {
|
|
81
|
+
if (e.detail.open && !hasLoadedOnce.current) {
|
|
82
|
+
fetchOptions(undefined, true);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<PMultiSelect name="async-search-select" label="Async Search" value={value} onChange={onChange} onToggle={onToggle}>
|
|
88
|
+
<PInputSearch
|
|
89
|
+
slot="filter"
|
|
90
|
+
name="search"
|
|
91
|
+
value={searchValue}
|
|
92
|
+
loading={loading}
|
|
93
|
+
clear
|
|
94
|
+
indicator
|
|
95
|
+
compact
|
|
96
|
+
autoComplete="off"
|
|
97
|
+
onInput={onInput}
|
|
98
|
+
// Prevent bubbling
|
|
99
|
+
onBlur={(e: any) => e.stopPropagation()}
|
|
100
|
+
onChange={(e: any) => e.stopPropagation()}
|
|
101
|
+
/>
|
|
102
|
+
|
|
103
|
+
{/* Initial skeleton loading */}
|
|
104
|
+
{initialLoading &&
|
|
105
|
+
!error &&
|
|
106
|
+
Array.from({ length: 9 }).map((_, i) => <div key={i} slot="options-status" className="skeleton h-[40px]" />)}
|
|
107
|
+
|
|
108
|
+
{/* Options */}
|
|
109
|
+
{options.map((opt) => (
|
|
110
|
+
<PMultiSelectOption key={opt.value} value={opt.value}>
|
|
111
|
+
{opt.label}
|
|
112
|
+
</PMultiSelectOption>
|
|
113
|
+
))}
|
|
114
|
+
|
|
115
|
+
{/* No filter results */}
|
|
116
|
+
{!initialLoading && options.length === 0 && !error && (
|
|
117
|
+
<div
|
|
118
|
+
slot="options-status"
|
|
119
|
+
className="text-contrast-medium cursor-not-allowed py-static-sm px-[12px]"
|
|
120
|
+
role="alert"
|
|
121
|
+
>
|
|
122
|
+
<span aria-hidden="true">–</span>
|
|
123
|
+
<span className="sr-only">No results found</span>
|
|
124
|
+
</div>
|
|
125
|
+
)}
|
|
126
|
+
|
|
127
|
+
{/* Error state */}
|
|
128
|
+
{error && (
|
|
129
|
+
<div slot="options-status" className="flex gap-static-sm py-static-sm px-[12px]" role="alert">
|
|
130
|
+
<PIcon name="information" color="error" />
|
|
131
|
+
<span className="text-error">{error}</span>
|
|
132
|
+
</div>
|
|
133
|
+
)}
|
|
134
|
+
</PMultiSelect>
|
|
135
|
+
);
|
|
136
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PMultiSelect, PMultiSelectOption } from '@porsche-design-system/components-react';
|
|
3
|
+
|
|
4
|
+
export const Example = () => {
|
|
5
|
+
return (
|
|
6
|
+
<>
|
|
7
|
+
<PMultiSelect name="name" label="Some Label" description="Some description">
|
|
8
|
+
<PMultiSelectOption value="a">
|
|
9
|
+
Option A
|
|
10
|
+
</PMultiSelectOption>
|
|
11
|
+
<PMultiSelectOption value="b">
|
|
12
|
+
Option B
|
|
13
|
+
</PMultiSelectOption>
|
|
14
|
+
<PMultiSelectOption value="c">
|
|
15
|
+
Option C
|
|
16
|
+
</PMultiSelectOption>
|
|
17
|
+
<PMultiSelectOption value="d">
|
|
18
|
+
Option D
|
|
19
|
+
</PMultiSelectOption>
|
|
20
|
+
<PMultiSelectOption value="e">
|
|
21
|
+
Option E
|
|
22
|
+
</PMultiSelectOption>
|
|
23
|
+
<PMultiSelectOption value="f">
|
|
24
|
+
Option F
|
|
25
|
+
</PMultiSelectOption>
|
|
26
|
+
</PMultiSelect>
|
|
27
|
+
</>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
type MultiSelectChangeEventDetail,
|
|
4
|
+
PButton,
|
|
5
|
+
PMultiSelect,
|
|
6
|
+
PMultiSelectOption,
|
|
7
|
+
type PMultiSelectProps,
|
|
8
|
+
PText,
|
|
9
|
+
} from '@porsche-design-system/components-react';
|
|
10
|
+
import { FormEvent, useState } from 'react';
|
|
11
|
+
|
|
12
|
+
export const Example = () => {
|
|
13
|
+
const [form, setForm] = useState({ myMultiSelect: [] });
|
|
14
|
+
const [lastSubmittedData, setLastSubmittedData] = useState<any>();
|
|
15
|
+
|
|
16
|
+
const onChange = (e: CustomEvent<MultiSelectChangeEventDetail>) => {
|
|
17
|
+
const { name, value } = e.target as HTMLElement & PMultiSelectProps;
|
|
18
|
+
setForm((prev) => ({
|
|
19
|
+
...prev,
|
|
20
|
+
[name]: value,
|
|
21
|
+
}));
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const onSubmit = (e: FormEvent<HTMLFormElement>) => {
|
|
25
|
+
e.preventDefault();
|
|
26
|
+
setLastSubmittedData(JSON.stringify(form));
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const onReset = (e: FormEvent<HTMLFormElement>) => {
|
|
30
|
+
e.preventDefault();
|
|
31
|
+
setForm({ myMultiSelect: [] });
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<>
|
|
36
|
+
<form onSubmit={onSubmit} onReset={onReset} className="flex flex-col gap-fluid-sm">
|
|
37
|
+
<PMultiSelect name="myMultiSelect" label="Some Label" value={form.myMultiSelect} onChange={onChange}>
|
|
38
|
+
<PMultiSelectOption value="a">Option A</PMultiSelectOption>
|
|
39
|
+
<PMultiSelectOption value="b">Option B</PMultiSelectOption>
|
|
40
|
+
<PMultiSelectOption value="c">Option C</PMultiSelectOption>
|
|
41
|
+
<PMultiSelectOption value="d">Option D</PMultiSelectOption>
|
|
42
|
+
<PMultiSelectOption value="e">Option E</PMultiSelectOption>
|
|
43
|
+
<PMultiSelectOption value="f">Option F</PMultiSelectOption>
|
|
44
|
+
</PMultiSelect>
|
|
45
|
+
<div className="flex gap-fluid-sm">
|
|
46
|
+
<PButton type="submit">Submit</PButton>
|
|
47
|
+
<PButton type="reset">Reset</PButton>
|
|
48
|
+
</div>
|
|
49
|
+
<PText>Last submitted data: {lastSubmittedData}</PText>
|
|
50
|
+
</form>
|
|
51
|
+
</>
|
|
52
|
+
);
|
|
53
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PMultiSelect, PMultiSelectOption, POptgroup } from '@porsche-design-system/components-react';
|
|
3
|
+
|
|
4
|
+
export const Example = () => {
|
|
5
|
+
return (
|
|
6
|
+
<>
|
|
7
|
+
<PMultiSelect name="options" label="Some Label">
|
|
8
|
+
<POptgroup label="Some optgroup label 1">
|
|
9
|
+
<PMultiSelectOption value="a">
|
|
10
|
+
Option A
|
|
11
|
+
</PMultiSelectOption>
|
|
12
|
+
<PMultiSelectOption value="b">
|
|
13
|
+
Option B
|
|
14
|
+
</PMultiSelectOption>
|
|
15
|
+
<PMultiSelectOption value="c">
|
|
16
|
+
Option C
|
|
17
|
+
</PMultiSelectOption>
|
|
18
|
+
<PMultiSelectOption value="d">
|
|
19
|
+
Option D
|
|
20
|
+
</PMultiSelectOption>
|
|
21
|
+
<PMultiSelectOption value="e">
|
|
22
|
+
Option E
|
|
23
|
+
</PMultiSelectOption>
|
|
24
|
+
<PMultiSelectOption value="f">
|
|
25
|
+
Option F
|
|
26
|
+
</PMultiSelectOption>
|
|
27
|
+
</POptgroup>
|
|
28
|
+
<POptgroup label="Some optgroup label 2">
|
|
29
|
+
<PMultiSelectOption value="g">
|
|
30
|
+
Option G
|
|
31
|
+
</PMultiSelectOption>
|
|
32
|
+
<PMultiSelectOption value="h">
|
|
33
|
+
Option H
|
|
34
|
+
</PMultiSelectOption>
|
|
35
|
+
<PMultiSelectOption value="i">
|
|
36
|
+
Option I
|
|
37
|
+
</PMultiSelectOption>
|
|
38
|
+
</POptgroup>
|
|
39
|
+
</PMultiSelect>
|
|
40
|
+
</>
|
|
41
|
+
)
|
|
42
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
type MultiSelectChangeEventDetail,
|
|
4
|
+
PMultiSelect,
|
|
5
|
+
PMultiSelectOption,
|
|
6
|
+
type PMultiSelectProps,
|
|
7
|
+
PTag,
|
|
8
|
+
} from '@porsche-design-system/components-react';
|
|
9
|
+
import { useState } from 'react';
|
|
10
|
+
|
|
11
|
+
type Option = { value: string; label: string; description: string; tags: string[]; imgSrc: string };
|
|
12
|
+
|
|
13
|
+
const optionsData: Option[] = [
|
|
14
|
+
{
|
|
15
|
+
value: '718',
|
|
16
|
+
label: '718',
|
|
17
|
+
description: 'Präziser Sportwagen mit Mittelmotor',
|
|
18
|
+
tags: ['Benzin'],
|
|
19
|
+
imgSrc: 'assets/718.png',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
value: '911',
|
|
23
|
+
label: '911',
|
|
24
|
+
description: 'Ikonischer Sportwagen mit Heckmotor',
|
|
25
|
+
tags: ['Benzin'],
|
|
26
|
+
imgSrc: 'assets/911.png',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
value: 'taycan',
|
|
30
|
+
label: 'Taycan',
|
|
31
|
+
description: 'Elektrischer Sportwagen',
|
|
32
|
+
tags: ['Elektro'],
|
|
33
|
+
imgSrc: 'assets/taycan.png',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
value: 'macan',
|
|
37
|
+
label: 'Macan',
|
|
38
|
+
tags: ['Elektro'],
|
|
39
|
+
description: 'Sportlicher Kompakt-SUV',
|
|
40
|
+
imgSrc: 'assets/macan.png',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
value: 'cayenne',
|
|
44
|
+
label: 'Cayenne',
|
|
45
|
+
tags: ['Hybrid', 'Benzin'],
|
|
46
|
+
description: 'Vielseitiger SUV',
|
|
47
|
+
imgSrc: 'assets/cayenne.png',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
value: 'panamera',
|
|
51
|
+
label: 'Panamera',
|
|
52
|
+
tags: ['Hybrid', 'Benzin'],
|
|
53
|
+
description: 'Luxuslimousine mit hohem Komfort',
|
|
54
|
+
imgSrc: 'assets/panamera.png',
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
export const Example = () => {
|
|
59
|
+
const [value, setValue] = useState<PMultiSelectProps['value']>([]);
|
|
60
|
+
const [options] = useState<Option[]>(optionsData);
|
|
61
|
+
const [selectedOptions, setSelectedOptions] = useState<Option[]>([]);
|
|
62
|
+
|
|
63
|
+
const onChange = (e: CustomEvent<MultiSelectChangeEventDetail>) => {
|
|
64
|
+
const value = (e.target as HTMLElement & { value: string[] }).value;
|
|
65
|
+
setValue(value);
|
|
66
|
+
setSelectedOptions(options.filter((option) => value.includes(option.value)));
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<PMultiSelect name="selected-slot-select" label="Selected Slot" value={value} onChange={onChange}>
|
|
71
|
+
<span slot="selected" className="h-full flex items-center">
|
|
72
|
+
<span className="truncate">{selectedOptions.map((option) => option.label).join(', ')}</span>
|
|
73
|
+
</span>
|
|
74
|
+
{options.map((option) => (
|
|
75
|
+
<PMultiSelectOption key={option.value} value={option.value}>
|
|
76
|
+
<div className="w-full flex gap-fluid-sm">
|
|
77
|
+
<img src={option.imgSrc} alt="" className="h-[34px] w-auto self-center" />
|
|
78
|
+
<div className="flex flex-col justify-center flex-1 min-w-0">
|
|
79
|
+
<p className="prose-text-sm m-0">{option.label}</p>
|
|
80
|
+
<p className="prose-text-2xs m-0">{option.description}</p>
|
|
81
|
+
</div>
|
|
82
|
+
<div className="self-center flex gap-fluid-sm">
|
|
83
|
+
{option.tags.map((tag) => (
|
|
84
|
+
<PTag key={tag} variant="info" compact={true}>
|
|
85
|
+
{tag}
|
|
86
|
+
</PTag>
|
|
87
|
+
))}
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
</PMultiSelectOption>
|
|
91
|
+
))}
|
|
92
|
+
</PMultiSelect>
|
|
93
|
+
);
|
|
94
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
type InputTextInputEventDetail,
|
|
4
|
+
type MultiSelectChangeEventDetail,
|
|
5
|
+
PButton,
|
|
6
|
+
PInputText,
|
|
7
|
+
PMultiSelect,
|
|
8
|
+
PMultiSelectOption,
|
|
9
|
+
type PMultiSelectProps,
|
|
10
|
+
} from '@porsche-design-system/components-react';
|
|
11
|
+
import { useState } from 'react';
|
|
12
|
+
|
|
13
|
+
export const Example = () => {
|
|
14
|
+
const [selectedValues, setSelectedValues] = useState<PMultiSelectProps['value']>([]);
|
|
15
|
+
const [inputValue, setInputValue] = useState('');
|
|
16
|
+
const [optionCount, setOptionCount] = useState(3);
|
|
17
|
+
|
|
18
|
+
const onChangeInput = (e: CustomEvent<InputTextInputEventDetail>) => {
|
|
19
|
+
setInputValue((e.detail.target as HTMLInputElement).value);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const onSetValue = () => {
|
|
23
|
+
setSelectedValues(inputValue.split(','));
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const onResetValue = () => {
|
|
27
|
+
setSelectedValues([]);
|
|
28
|
+
setInputValue('');
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const onChange = (e: CustomEvent<MultiSelectChangeEventDetail>) => {
|
|
32
|
+
setSelectedValues(e.detail.value);
|
|
33
|
+
setInputValue(e.detail.value.join(','));
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const onAddOption = () => {
|
|
37
|
+
setOptionCount((prev) => prev + 1);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const onRemoveOption = () => {
|
|
41
|
+
if (optionCount > 0) {
|
|
42
|
+
setOptionCount((prev) => prev - 1);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<div className="flex flex-col gap-fluid-sm">
|
|
48
|
+
<PInputText
|
|
49
|
+
name="input-value"
|
|
50
|
+
label="Value:"
|
|
51
|
+
placeholder="e.g. 1,2"
|
|
52
|
+
value={inputValue}
|
|
53
|
+
onInput={(e) => onChangeInput(e as CustomEvent<InputTextInputEventDetail>)}
|
|
54
|
+
/>
|
|
55
|
+
<div className="flex gap-fluid-sm">
|
|
56
|
+
<PButton type="button" onClick={onSetValue} compact={true}>
|
|
57
|
+
Set Value
|
|
58
|
+
</PButton>
|
|
59
|
+
<PButton type="button" onClick={onResetValue} compact={true}>
|
|
60
|
+
Reset value
|
|
61
|
+
</PButton>
|
|
62
|
+
</div>
|
|
63
|
+
<PMultiSelect name="options" label="Some Label" value={selectedValues} onChange={onChange}>
|
|
64
|
+
{[...Array(optionCount).keys()].map((idx) => (
|
|
65
|
+
<PMultiSelectOption key={idx} value={`${idx + 1}`}>
|
|
66
|
+
Option {idx + 1}
|
|
67
|
+
</PMultiSelectOption>
|
|
68
|
+
))}
|
|
69
|
+
</PMultiSelect>
|
|
70
|
+
<div className="flex gap-fluid-sm">
|
|
71
|
+
<PButton type="button" onClick={onAddOption} compact={true}>
|
|
72
|
+
Add option
|
|
73
|
+
</PButton>
|
|
74
|
+
<PButton type="button" onClick={onRemoveOption} compact={true}>
|
|
75
|
+
Remove last option
|
|
76
|
+
</PButton>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
);
|
|
80
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PMultiSelect, PMultiSelectOption, PPopover } from '@porsche-design-system/components-react';
|
|
3
|
+
|
|
4
|
+
export const Example = () => {
|
|
5
|
+
return (
|
|
6
|
+
<>
|
|
7
|
+
<PMultiSelect name="options" state="error">
|
|
8
|
+
<span slot="label" id="some-label-id">
|
|
9
|
+
Some label with a
|
|
10
|
+
<a href="https://designsystem.porsche.com" className="underline">
|
|
11
|
+
link
|
|
12
|
+
</a>
|
|
13
|
+
and a "label-after" slot.
|
|
14
|
+
</span>
|
|
15
|
+
<PPopover slot="label-after">
|
|
16
|
+
Some Popover content with a
|
|
17
|
+
<a href="https://designsystem.porsche.com" className="underline">
|
|
18
|
+
link
|
|
19
|
+
</a>
|
|
20
|
+
.
|
|
21
|
+
</PPopover>
|
|
22
|
+
<span slot="description" id="some-description-id">
|
|
23
|
+
Some description with a
|
|
24
|
+
<a href="https://designsystem.porsche.com" className="underline">
|
|
25
|
+
link
|
|
26
|
+
</a>
|
|
27
|
+
.
|
|
28
|
+
</span>
|
|
29
|
+
<span slot="message" id="some-message-id">
|
|
30
|
+
Some error message with a
|
|
31
|
+
<a href="https://designsystem.porsche.com" className="underline">
|
|
32
|
+
link
|
|
33
|
+
</a>
|
|
34
|
+
.
|
|
35
|
+
</span>
|
|
36
|
+
<PMultiSelectOption value="a">
|
|
37
|
+
Option A
|
|
38
|
+
</PMultiSelectOption>
|
|
39
|
+
<PMultiSelectOption value="b">
|
|
40
|
+
Option B
|
|
41
|
+
</PMultiSelectOption>
|
|
42
|
+
<PMultiSelectOption value="c">
|
|
43
|
+
Option C
|
|
44
|
+
</PMultiSelectOption>
|
|
45
|
+
</PMultiSelect>
|
|
46
|
+
</>
|
|
47
|
+
)
|
|
48
|
+
}
|