@progressive-development/pd-forms 0.9.2 → 1.0.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.
Files changed (164) hide show
  1. package/LICENSE +21 -2
  2. package/README.md +56 -62
  3. package/dist/base/pd-base-input-element.d.ts +10 -10
  4. package/dist/base/pd-base-input-element.d.ts.map +1 -1
  5. package/dist/base/pd-base-input-element.js +8 -1
  6. package/dist/base/pd-base-ui-input.d.ts +41 -16
  7. package/dist/base/pd-base-ui-input.d.ts.map +1 -1
  8. package/dist/base/pd-base-ui-input.js +25 -6
  9. package/dist/base/pd-base-ui.js +0 -18
  10. package/dist/generated/locales/be.d.ts +3 -0
  11. package/dist/generated/locales/be.d.ts.map +1 -1
  12. package/dist/generated/locales/de.d.ts +3 -0
  13. package/dist/generated/locales/de.d.ts.map +1 -1
  14. package/dist/generated/locales/en.d.ts +3 -0
  15. package/dist/generated/locales/en.d.ts.map +1 -1
  16. package/dist/index.d.ts +4 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +6 -0
  19. package/dist/locales/be.js +4 -1
  20. package/dist/locales/de.js +4 -1
  21. package/dist/locales/en.js +4 -1
  22. package/dist/pd-button/PdButton.d.ts +171 -37
  23. package/dist/pd-button/PdButton.d.ts.map +1 -1
  24. package/dist/pd-button/PdButton.js +502 -71
  25. package/dist/pd-button/pd-button.stories.d.ts +82 -10
  26. package/dist/pd-button/pd-button.stories.d.ts.map +1 -1
  27. package/dist/pd-button-group/PdButtonGroup.d.ts +25 -0
  28. package/dist/pd-button-group/PdButtonGroup.d.ts.map +1 -1
  29. package/dist/pd-button-group/PdButtonGroup.js +52 -27
  30. package/dist/pd-button-group/pd-button-group.stories.d.ts +42 -17
  31. package/dist/pd-button-group/pd-button-group.stories.d.ts.map +1 -1
  32. package/dist/pd-button-select-group/PdButtonSelectGroup.d.ts +17 -3
  33. package/dist/pd-button-select-group/PdButtonSelectGroup.d.ts.map +1 -1
  34. package/dist/pd-button-select-group/PdButtonSelectGroup.js +23 -19
  35. package/dist/pd-button-select-group/pd-button-select-group.stories.d.ts +43 -18
  36. package/dist/pd-button-select-group/pd-button-select-group.stories.d.ts.map +1 -1
  37. package/dist/pd-checkbox/PdCheckbox.d.ts +23 -2
  38. package/dist/pd-checkbox/PdCheckbox.d.ts.map +1 -1
  39. package/dist/pd-checkbox/PdCheckbox.js +85 -21
  40. package/dist/pd-checkbox/pd-checkbox.stories.d.ts +43 -27
  41. package/dist/pd-checkbox/pd-checkbox.stories.d.ts.map +1 -1
  42. package/dist/pd-form-container/PdFormContainer.d.ts +30 -9
  43. package/dist/pd-form-container/PdFormContainer.d.ts.map +1 -1
  44. package/dist/pd-form-container/PdFormContainer.js +59 -8
  45. package/dist/pd-form-container/pd-form-container.stories.d.ts +49 -0
  46. package/dist/pd-form-container/pd-form-container.stories.d.ts.map +1 -0
  47. package/dist/pd-form-field/PdFormField.d.ts +35 -0
  48. package/dist/pd-form-field/PdFormField.d.ts.map +1 -0
  49. package/dist/pd-form-field/PdFormField.js +38 -0
  50. package/dist/pd-form-field/pd-form-field.d.ts +3 -0
  51. package/dist/pd-form-field/pd-form-field.d.ts.map +1 -0
  52. package/dist/pd-form-field/pd-form-field.stories.d.ts +40 -0
  53. package/dist/pd-form-field/pd-form-field.stories.d.ts.map +1 -0
  54. package/dist/pd-form-field.d.ts +2 -0
  55. package/dist/pd-form-field.js +8 -0
  56. package/dist/pd-form-fieldset/PdFormFieldset.d.ts +144 -0
  57. package/dist/pd-form-fieldset/PdFormFieldset.d.ts.map +1 -0
  58. package/dist/pd-form-fieldset/PdFormFieldset.js +364 -0
  59. package/dist/pd-form-fieldset/index.d.ts +2 -0
  60. package/dist/pd-form-fieldset/index.d.ts.map +1 -0
  61. package/dist/pd-form-fieldset/pd-form-fieldset.d.ts +3 -0
  62. package/dist/pd-form-fieldset/pd-form-fieldset.d.ts.map +1 -0
  63. package/dist/pd-form-fieldset/pd-form-fieldset.js +8 -0
  64. package/dist/pd-form-fieldset/pd-form-fieldset.stories.d.ts +38 -0
  65. package/dist/pd-form-fieldset/pd-form-fieldset.stories.d.ts.map +1 -0
  66. package/dist/pd-form-row/PdFormRow.d.ts +35 -5
  67. package/dist/pd-form-row/PdFormRow.d.ts.map +1 -1
  68. package/dist/pd-form-row/PdFormRow.js +135 -69
  69. package/dist/pd-form-row/pd-form-row.stories.d.ts +41 -25
  70. package/dist/pd-form-row/pd-form-row.stories.d.ts.map +1 -1
  71. package/dist/pd-generic-form/PdGenericForm.d.ts +50 -0
  72. package/dist/pd-generic-form/PdGenericForm.d.ts.map +1 -0
  73. package/dist/pd-generic-form/PdGenericForm.js +334 -0
  74. package/dist/pd-generic-form/pd-generic-form.d.ts +3 -0
  75. package/dist/pd-generic-form/pd-generic-form.d.ts.map +1 -0
  76. package/dist/pd-generic-form/pd-generic-form.stories.d.ts +35 -0
  77. package/dist/pd-generic-form/pd-generic-form.stories.d.ts.map +1 -0
  78. package/dist/pd-generic-form/pd-generic-form.styles.d.ts +2 -0
  79. package/dist/pd-generic-form/pd-generic-form.styles.d.ts.map +1 -0
  80. package/dist/pd-generic-form/pd-generic-form.styles.js +110 -0
  81. package/dist/pd-generic-form/pd-generic-form.test.d.ts +1 -0
  82. package/dist/pd-generic-form/pd-generic-form.test.d.ts.map +1 -0
  83. package/dist/pd-generic-form.d.ts +2 -0
  84. package/dist/pd-generic-form.js +8 -0
  85. package/dist/pd-hover-box/PdHoverBox.d.ts +61 -11
  86. package/dist/pd-hover-box/PdHoverBox.d.ts.map +1 -1
  87. package/dist/pd-hover-box/PdHoverBox.js +130 -28
  88. package/dist/pd-hover-box/pd-hover-box.stories.d.ts +28 -5
  89. package/dist/pd-hover-box/pd-hover-box.stories.d.ts.map +1 -1
  90. package/dist/pd-input/PdComboboxInput.d.ts +20 -0
  91. package/dist/pd-input/PdComboboxInput.d.ts.map +1 -0
  92. package/dist/pd-input/PdComboboxInput.js +67 -0
  93. package/dist/pd-input/PdInput.d.ts +33 -15
  94. package/dist/pd-input/PdInput.d.ts.map +1 -1
  95. package/dist/pd-input/PdInput.js +49 -21
  96. package/dist/pd-input/pd-input.stories.d.ts +71 -35
  97. package/dist/pd-input/pd-input.stories.d.ts.map +1 -1
  98. package/dist/pd-input-area/PdInputArea.d.ts +19 -6
  99. package/dist/pd-input-area/PdInputArea.d.ts.map +1 -1
  100. package/dist/pd-input-area/PdInputArea.js +17 -15
  101. package/dist/pd-input-area/pd-input-area.stories.d.ts +65 -52
  102. package/dist/pd-input-area/pd-input-area.stories.d.ts.map +1 -1
  103. package/dist/pd-input-file/PdInputFile.d.ts +24 -0
  104. package/dist/pd-input-file/PdInputFile.d.ts.map +1 -1
  105. package/dist/pd-input-file/PdInputFile.js +53 -22
  106. package/dist/pd-input-file/pd-input-file.stories.d.ts +51 -47
  107. package/dist/pd-input-file/pd-input-file.stories.d.ts.map +1 -1
  108. package/dist/pd-input-time/PdInputTime.d.ts +21 -0
  109. package/dist/pd-input-time/PdInputTime.d.ts.map +1 -1
  110. package/dist/pd-input-time/PdInputTime.js +48 -22
  111. package/dist/pd-input-time/pd-input-time.stories.d.ts +94 -0
  112. package/dist/pd-input-time/pd-input-time.stories.d.ts.map +1 -0
  113. package/dist/pd-panel-button/PdPanelButton.d.ts +50 -34
  114. package/dist/pd-panel-button/PdPanelButton.d.ts.map +1 -1
  115. package/dist/pd-panel-button/PdPanelButton.js +149 -262
  116. package/dist/pd-panel-button/pd-panel-button.stories.d.ts +55 -25
  117. package/dist/pd-panel-button/pd-panel-button.stories.d.ts.map +1 -1
  118. package/dist/pd-radio-group/PdRadioGroup.d.ts +14 -0
  119. package/dist/pd-radio-group/PdRadioGroup.d.ts.map +1 -1
  120. package/dist/pd-radio-group/PdRadioGroup.js +48 -11
  121. package/dist/pd-radio-group/pd-radio-group.stories.d.ts +37 -7
  122. package/dist/pd-radio-group/pd-radio-group.stories.d.ts.map +1 -1
  123. package/dist/pd-range/PdRange.d.ts +22 -2
  124. package/dist/pd-range/PdRange.d.ts.map +1 -1
  125. package/dist/pd-range/PdRange.js +54 -43
  126. package/dist/pd-range/pd-range.stories.d.ts +49 -7
  127. package/dist/pd-range/pd-range.stories.d.ts.map +1 -1
  128. package/dist/pd-select/PdSelect.d.ts +16 -4
  129. package/dist/pd-select/PdSelect.d.ts.map +1 -1
  130. package/dist/pd-select/PdSelect.js +23 -21
  131. package/dist/pd-select/pd-select.stories.d.ts +56 -35
  132. package/dist/pd-select/pd-select.stories.d.ts.map +1 -1
  133. package/dist/pd-suggestion-box/PdSuggestionBox.d.ts +74 -0
  134. package/dist/pd-suggestion-box/PdSuggestionBox.d.ts.map +1 -0
  135. package/dist/pd-suggestion-box/PdSuggestionBox.js +277 -0
  136. package/dist/pd-suggestion-box/PdSuggestionPanel.d.ts +42 -0
  137. package/dist/pd-suggestion-box/PdSuggestionPanel.d.ts.map +1 -0
  138. package/dist/pd-suggestion-box/PdSuggestionPanel.js +227 -0
  139. package/dist/pd-suggestion-box/pd-suggestion-box.d.ts +3 -0
  140. package/dist/pd-suggestion-box/pd-suggestion-box.d.ts.map +1 -0
  141. package/dist/pd-suggestion-box/pd-suggestion-box.stories.d.ts +79 -0
  142. package/dist/pd-suggestion-box/pd-suggestion-box.stories.d.ts.map +1 -0
  143. package/dist/pd-suggestion-box.d.ts +2 -0
  144. package/dist/pd-suggestion-box.js +8 -0
  145. package/dist/pd-utils/dist/position-helper.js +35 -0
  146. package/dist/stories/pd-forms-overview.stories.d.ts +48 -0
  147. package/dist/stories/pd-forms-overview.stories.d.ts.map +1 -0
  148. package/dist/stories/story-helpers.d.ts +10 -0
  149. package/dist/stories/story-helpers.d.ts.map +1 -0
  150. package/dist/styles/shared-input-field-styles.d.ts.map +1 -1
  151. package/dist/styles/shared-input-field-styles.js +13 -19
  152. package/dist/styles/shared-input-styles.d.ts.map +1 -1
  153. package/dist/styles/shared-input-styles.js +18 -14
  154. package/dist/types.d.ts +11 -0
  155. package/dist/types.d.ts.map +1 -1
  156. package/package.json +11 -4
  157. package/dist/pd-form-container/form-container.stories.d.ts +0 -28
  158. package/dist/pd-form-container/form-container.stories.d.ts.map +0 -1
  159. package/dist/pd-form-container/form-container2.stories.d.ts +0 -8
  160. package/dist/pd-form-container/form-container2.stories.d.ts.map +0 -1
  161. package/dist/pd-form-container/form-container3.stories.d.ts +0 -11
  162. package/dist/pd-form-container/form-container3.stories.d.ts.map +0 -1
  163. package/dist/stories/01_index.stories.d.ts +0 -58
  164. package/dist/stories/01_index.stories.d.ts.map +0 -1
@@ -1,37 +1,58 @@
1
- import { StoryObj } from '@storybook/web-components';
2
- declare const meta: {
3
- title: string;
4
- argTypes: {
5
- primaryColor: {
6
- control: "color";
7
- };
8
- secondaryColor: {
9
- control: "color";
10
- };
11
- textColor: {
12
- control: "color";
13
- };
14
- highlightColor: {
15
- control: "color";
16
- };
17
- errorColor: {
18
- control: "color";
19
- };
20
- errorBackgroundColor: {
21
- control: "color";
22
- };
23
- borderRadius: {
24
- control: "text";
25
- };
26
- displayFont: {
27
- control: "text";
28
- };
29
- fontSize: {
30
- control: "text";
31
- };
32
- };
33
- };
1
+ import { Meta, StoryObj } from '@storybook/web-components-vite';
2
+ import { PdSelectOption } from '../types.js';
3
+ /**
4
+ * Story arguments interface for pd-select component.
5
+ * Defines all configurable properties available in Storybook controls.
6
+ */
7
+ interface PdSelectArgs {
8
+ /** Label text displayed above the select */
9
+ label: string;
10
+ /** Array of options to display in the select */
11
+ values: PdSelectOption[];
12
+ /** Initially selected value */
13
+ initValue: string;
14
+ /** Whether the select is disabled */
15
+ disabled: boolean;
16
+ /** Whether the select is read-only */
17
+ readonly: boolean;
18
+ /** Whether a selection is required */
19
+ required: boolean;
20
+ /** Helper text displayed below the select */
21
+ helperTxt: string;
22
+ /** Apply gradient background styling */
23
+ gradient: boolean;
24
+ /** The name attribute for form submission */
25
+ valueName: string;
26
+ }
27
+ /**
28
+ * ## pd-select
29
+ *
30
+ * A styled select dropdown component for single-option selection.
31
+ *
32
+ * ### Features
33
+ * - **Native Select**: Uses native HTML select for accessibility and mobile support
34
+ * - **Custom Styling**: Styled dropdown arrow and consistent appearance across browsers
35
+ * - **Gradient Option**: Optional gradient background styling
36
+ * - **Form Integration**: Works with `pd-form-container` for validation
37
+ * - **Label Support**: Optional label with required indicator
38
+ * - **Helper Text**: Hover icon with additional information
39
+ *
40
+ * ### Accessibility
41
+ * - Native select element for full keyboard and screen reader support
42
+ * - Mobile-friendly with native picker on touch devices
43
+ * - Required field indication with asterisk
44
+ */
45
+ declare const meta: Meta<PdSelectArgs>;
34
46
  export default meta;
35
- type Story = StoryObj;
36
- export declare const Select: Story;
47
+ type Story = StoryObj<PdSelectArgs>;
48
+ /** Default select with label. Interactive via Controls panel. */
49
+ export declare const Default: Story;
50
+ /** All select states at a glance. */
51
+ export declare const AllVariants: Story;
52
+ /** Required select with form validation — demonstrates error state on empty submit. */
53
+ export declare const RequiredValidation: Story;
54
+ /** Select with many options — demonstrates native scroll behavior. */
55
+ export declare const ManyOptions: Story;
56
+ /** CSS Custom Properties — Branded and Redesigned variants. */
57
+ export declare const CustomStyling: Story;
37
58
  //# sourceMappingURL=pd-select.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pd-select.stories.d.ts","sourceRoot":"","sources":["../../src/pd-select/pd-select.stories.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,gBAAgB,CAAC;AACxB,OAAO,2CAA2C,CAAC;AACnD,OAAO,+BAA+B,CAAC;AAGvC,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAaM,CAAC;AAEjB,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC;AAEtB,eAAO,MAAM,MAAM,EAAE,KAqDpB,CAAC"}
1
+ {"version":3,"file":"pd-select.stories.d.ts","sourceRoot":"","sources":["../../src/pd-select/pd-select.stories.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,gBAAgB,CAAC;AACxB,OAAO,2CAA2C,CAAC;AACnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAM7C;;;GAGG;AACH,UAAU,YAAY;IACpB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,QAAQ,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAoBD;;;;;;;;;;;;;;;;;GAiBG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,YAAY,CA6F5B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;AAMpC,iEAAiE;AACjE,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAMF,qCAAqC;AACrC,eAAO,MAAM,WAAW,EAAE,KAgEzB,CAAC;AAMF,uFAAuF;AACvF,eAAO,MAAM,kBAAkB,EAAE,KAiChC,CAAC;AAMF,sEAAsE;AACtE,eAAO,MAAM,WAAW,EAAE,KAsCzB,CAAC;AAMF,+DAA+D;AAC/D,eAAO,MAAM,aAAa,EAAE,KA0G3B,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { LitElement, CSSResultGroup } from 'lit';
2
+ import { SuggestedElement } from '../types.js';
3
+ /**
4
+ * Autocomplete/suggestion input with async search support.
5
+ *
6
+ * @tagname pd-suggestion-box
7
+ * @summary Typeahead input with async search and suggestion panel.
8
+ *
9
+ * @event element-selected - Fired when a suggestion is selected.
10
+ * @event element-unselected - Fired when selection is cleared.
11
+ *
12
+ * @cssprop --pd-input-field-width - Input and panel width. Default: `300px`.
13
+ * @cssprop --pd-input-field-height - Input height. Default: `2.2rem`.
14
+ * @cssprop --pd-input-field-bg-col - Input background. Default: `var(--pd-default-bg-col)`.
15
+ * @cssprop --pd-input-field-border - Input border. Default: `1px solid var(--pd-default-light-col)`.
16
+ * @cssprop --pd-input-field-border-bottom - Input bottom border. Default: `2px solid var(--pd-default-col)`.
17
+ * @cssprop --pd-radius-md - Input and panel border radius. Default: `0`.
18
+ * @cssprop --pd-input-label-col - Label color. Default: `var(--pd-default-font-title-col)`.
19
+ * @cssprop --pd-suggestion-panel-bg - Panel background. Default: `var(--pd-default-bg-col)`.
20
+ * @cssprop --pd-suggestion-panel-border - Panel border. Default: `1px solid var(--pd-default-light-col)`.
21
+ * @cssprop --pd-suggestion-panel-shadow - Panel shadow. Default: `var(--pd-shadow-lg)`.
22
+ * @cssprop --pd-suggestion-item-hover-bg - Item hover background. Default: `var(--pd-default-hover-col)`.
23
+ * @cssprop --pd-suggestion-item-name-color - Item name color. Default: `var(--pd-default-font-col)`.
24
+ * @cssprop --pd-suggestion-item-subinfo-color - Item subinfo color. Default: `var(--pd-default-font-muted-col)`.
25
+ */
26
+ export declare class PdSuggestionBox<T> extends LitElement {
27
+ /** Async function to fetch suggestions based on input. */
28
+ callFunction: (input: string) => Promise<SuggestedElement<T>[]>;
29
+ /** Allow creating new items when no results found. */
30
+ createNewEmptyItem: boolean;
31
+ /** Whether input is required. */
32
+ required: boolean;
33
+ /** Input label text. */
34
+ label: string;
35
+ /** Input placeholder text. */
36
+ placeholder: string;
37
+ /** Debounce delay in ms before triggering search. */
38
+ delayTime: number;
39
+ /** Minimum characters before searching. */
40
+ minCharsToSearch: number;
41
+ /** Maximum results to display. */
42
+ maxResult: number;
43
+ /** @ignore */
44
+ _selectedValue: string;
45
+ /** @ignore */
46
+ _currentSearchKey: string;
47
+ /** @ignore */
48
+ _loading: boolean;
49
+ /** @ignore */
50
+ _error: boolean;
51
+ /** @ignore */
52
+ _currentElements: SuggestedElement<T>[];
53
+ /** @ignore */
54
+ _localFilteredElements?: SuggestedElement<T>[];
55
+ /** @ignore */
56
+ _activeIndex: number;
57
+ /** @ignore */
58
+ private _timeoutRef;
59
+ static styles: CSSResultGroup;
60
+ disconnectedCallback(): void;
61
+ reset(): void;
62
+ private get _panelId();
63
+ private get _isPanelOpen();
64
+ private get _displayElements();
65
+ private get _activeOptionId();
66
+ render(): import('lit').TemplateResult<1>;
67
+ private _doSelection;
68
+ private _handleKeydown;
69
+ private _closePanel;
70
+ private _doChange;
71
+ private _createNewRecord;
72
+ private _unselectElement;
73
+ }
74
+ //# sourceMappingURL=PdSuggestionBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdSuggestionBox.d.ts","sourceRoot":"","sources":["../../src/pd-suggestion-box/PdSuggestionBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAO,cAAc,EAAW,MAAM,KAAK,CAAC;AAIrE,OAAO,gCAAgC,CAAC;AAExC,OAAO,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,eAAe,CAAC,CAAC,CAAE,SAAQ,UAAU;IAChD,0DAA0D;IAE1D,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAI7D;IAEF,sDAAsD;IAEtD,kBAAkB,EAAE,OAAO,CAAS;IAEpC,iCAAiC;IAEjC,QAAQ,EAAE,OAAO,CAAS;IAE1B,wBAAwB;IAExB,KAAK,EAAE,MAAM,CAAM;IAEnB,8BAA8B;IAE9B,WAAW,EAAE,MAAM,CAAM;IAEzB,qDAAqD;IAErD,SAAS,EAAE,MAAM,CAAO;IAExB,2CAA2C;IAE3C,gBAAgB,EAAE,MAAM,CAAK;IAE7B,kCAAkC;IAElC,SAAS,EAAE,MAAM,CAAO;IAExB,cAAc;IAEd,cAAc,EAAE,MAAM,CAAM;IAE5B,cAAc;IAEd,iBAAiB,EAAE,MAAM,CAAM;IAE/B,cAAc;IAEd,QAAQ,EAAE,OAAO,CAAS;IAE1B,cAAc;IAEd,MAAM,EAAE,OAAO,CAAS;IAExB,cAAc;IAEd,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAM;IAE7C,cAAc;IAEd,sBAAsB,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,cAAc;IAEd,YAAY,EAAE,MAAM,CAAM;IAE1B,cAAc;IACd,OAAO,CAAC,WAAW,CAAqB;IAExC,MAAM,CAAC,MAAM,EAOR,cAAc,CAAC;IAIX,oBAAoB,IAAI,IAAI;IAQrC,KAAK;IAUL,OAAO,KAAK,QAAQ,GAEnB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,gBAAgB,GAE3B;IAED,OAAO,KAAK,eAAe,GAQ1B;IAED,MAAM;IAkCN,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,cAAc;IAkDtB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,SAAS;IAoEjB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,gBAAgB;CAQzB"}
@@ -0,0 +1,277 @@
1
+ import { LitElement, css, nothing, html } from 'lit';
2
+ import { msg, str } from '@lit/localize';
3
+ import { property, state } from 'lit/decorators.js';
4
+ import '../pd-input/PdComboboxInput.js';
5
+ import './PdSuggestionPanel.js';
6
+
7
+ var __defProp = Object.defineProperty;
8
+ var __decorateClass = (decorators, target, key, kind) => {
9
+ var result = void 0 ;
10
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
11
+ if (decorator = decorators[i])
12
+ result = (decorator(target, key, result) ) || result;
13
+ if (result) __defProp(target, key, result);
14
+ return result;
15
+ };
16
+ class PdSuggestionBox extends LitElement {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.callFunction = async (_searchInput) => {
20
+ return Promise.resolve([]);
21
+ };
22
+ this.createNewEmptyItem = false;
23
+ this.required = false;
24
+ this.label = "";
25
+ this.placeholder = "";
26
+ this.delayTime = 800;
27
+ this.minCharsToSearch = 2;
28
+ this.maxResult = 100;
29
+ this._selectedValue = "";
30
+ this._currentSearchKey = "";
31
+ this._loading = false;
32
+ this._error = false;
33
+ this._currentElements = [];
34
+ this._activeIndex = -1;
35
+ }
36
+ static {
37
+ this.styles = [
38
+ css`
39
+ :host {
40
+ position: relative;
41
+ --pd-input-field-width: 300px;
42
+ }
43
+ `
44
+ ];
45
+ }
46
+ /* class="${classMap({"panel-show": this._showPanel})}" */
47
+ disconnectedCallback() {
48
+ super.disconnectedCallback();
49
+ if (this._timeoutRef) {
50
+ window.clearTimeout(this._timeoutRef);
51
+ this._timeoutRef = void 0;
52
+ }
53
+ }
54
+ reset() {
55
+ this._selectedValue = "";
56
+ this._currentElements = [];
57
+ this._currentSearchKey = "";
58
+ this._localFilteredElements = void 0;
59
+ this._loading = false;
60
+ this._error = false;
61
+ this._activeIndex = -1;
62
+ }
63
+ get _panelId() {
64
+ return `${this.id || "suggestion"}-listbox`;
65
+ }
66
+ get _isPanelOpen() {
67
+ return this._displayElements.length > 0 || this._loading;
68
+ }
69
+ get _displayElements() {
70
+ return this._localFilteredElements || this._currentElements;
71
+ }
72
+ get _activeOptionId() {
73
+ if (this._activeIndex >= 0 && this._activeIndex < this._displayElements.length) {
74
+ return `option-${this._displayElements[this._activeIndex].id}`;
75
+ }
76
+ return void 0;
77
+ }
78
+ render() {
79
+ return html`
80
+ <pd-combobox-input
81
+ id="searchInputId"
82
+ label="${this.label}"
83
+ placeholder="${this.placeholder}"
84
+ icon-right
85
+ icon="searchIcon"
86
+ initValue="${this._selectedValue}"
87
+ ?expanded="${this._isPanelOpen}"
88
+ ariaControls="${this._panelId}"
89
+ ariaAutocomplete="list"
90
+ ariaActivedescendant="${this._activeOptionId ?? ""}"
91
+ @pd-form-element-change="${this._doChange}"
92
+ @keydown="${this._handleKeydown}"
93
+ ?required="${this.required}"
94
+ ></pd-combobox-input>
95
+ <pd-suggestion-panel
96
+ id="${this._panelId}"
97
+ ?loading="${this._loading}"
98
+ .displayElements="${this._displayElements}"
99
+ .activeIndex="${this._activeIndex}"
100
+ @element-selected="${this._doSelection}"
101
+ ></pd-suggestion-panel>
102
+ ${this._error ? html`<p>
103
+ ${msg("Technischer Fehler bei der Suche", {
104
+ id: "pd.suggestion.box.error.txt"
105
+ })}
106
+ </p>` : nothing}
107
+ `;
108
+ }
109
+ _doSelection(e) {
110
+ if (this._timeoutRef) {
111
+ window.clearTimeout(this._timeoutRef);
112
+ this._timeoutRef = void 0;
113
+ }
114
+ const selectedEl = e.detail;
115
+ this._selectedValue = selectedEl.name || selectedEl.label || selectedEl.id;
116
+ this._closePanel();
117
+ }
118
+ _handleKeydown(e) {
119
+ const elements = this._displayElements;
120
+ switch (e.key) {
121
+ case "ArrowDown":
122
+ if (this._isPanelOpen && elements.length > 0) {
123
+ e.preventDefault();
124
+ this._activeIndex = Math.min(
125
+ this._activeIndex + 1,
126
+ elements.length - 1
127
+ );
128
+ }
129
+ break;
130
+ case "ArrowUp":
131
+ if (this._isPanelOpen && elements.length > 0) {
132
+ e.preventDefault();
133
+ if (this._activeIndex <= 0) {
134
+ this._activeIndex = -1;
135
+ } else {
136
+ this._activeIndex = this._activeIndex - 1;
137
+ }
138
+ }
139
+ break;
140
+ case "Enter":
141
+ if (this._activeIndex >= 0 && this._activeIndex < elements.length) {
142
+ e.preventDefault();
143
+ const selectedEl = elements[this._activeIndex];
144
+ this._selectedValue = selectedEl.name || selectedEl.id;
145
+ this._closePanel();
146
+ this.dispatchEvent(
147
+ new CustomEvent("element-selected", {
148
+ detail: selectedEl.objectValue || selectedEl,
149
+ bubbles: true,
150
+ composed: true
151
+ })
152
+ );
153
+ }
154
+ break;
155
+ case "Escape":
156
+ if (this._isPanelOpen) {
157
+ e.preventDefault();
158
+ this._closePanel();
159
+ }
160
+ break;
161
+ }
162
+ }
163
+ _closePanel() {
164
+ this._currentSearchKey = "";
165
+ this._currentElements = [];
166
+ this._localFilteredElements = void 0;
167
+ this._activeIndex = -1;
168
+ }
169
+ _doChange(e) {
170
+ this._unselectElement();
171
+ if (this._timeoutRef) {
172
+ window.clearTimeout(this._timeoutRef);
173
+ }
174
+ this._activeIndex = -1;
175
+ if (e.detail.value === "") {
176
+ this._currentElements = [];
177
+ this._currentSearchKey = "";
178
+ this._localFilteredElements = void 0;
179
+ this._loading = false;
180
+ this._error = false;
181
+ } else if (this._currentSearchKey !== "" && e.detail.value.startsWith(this._currentSearchKey)) {
182
+ this._localFilteredElements = this._currentElements.filter(
183
+ (ce) => ce.name && ce.name.toLowerCase().replaceAll(" ", "").includes(e.detail.value.toLowerCase().replaceAll(" ", "")) || ce.subInfo && ce.subInfo.toLowerCase().includes(e.detail.value.toLowerCase())
184
+ );
185
+ if (this.createNewEmptyItem && this._localFilteredElements.length === 0) {
186
+ this._localFilteredElements = [this._createNewRecord(e)];
187
+ }
188
+ } else if (e.detail.value.length >= this.minCharsToSearch) {
189
+ this._loading = true;
190
+ this._currentElements = [];
191
+ this._localFilteredElements = void 0;
192
+ this._timeoutRef = window.setTimeout(() => {
193
+ this.callFunction(e.detail.value).then((result) => {
194
+ this._currentSearchKey = e.detail.value;
195
+ this._loading = false;
196
+ this._localFilteredElements = void 0;
197
+ this._currentElements = result;
198
+ this._timeoutRef = void 0;
199
+ if (this.createNewEmptyItem && this._currentElements.length === 0) {
200
+ this._currentElements = [this._createNewRecord(e)];
201
+ }
202
+ }).catch((error) => {
203
+ console.error("Error during suggestion search", error);
204
+ this._loading = false;
205
+ this._error = true;
206
+ this._currentElements = [];
207
+ this._localFilteredElements = void 0;
208
+ });
209
+ }, this.delayTime);
210
+ }
211
+ }
212
+ // eslint-disable-next-line class-methods-use-this
213
+ _createNewRecord(e) {
214
+ return {
215
+ id: "NEW",
216
+ name: msg(str`"${e.detail.value}" neu anlegen`, {
217
+ id: "pd.suggestion.box.add.new"
218
+ }),
219
+ createNew: e.detail.value
220
+ };
221
+ }
222
+ _unselectElement() {
223
+ this.dispatchEvent(
224
+ new CustomEvent("element-unselected", {
225
+ bubbles: true,
226
+ composed: true
227
+ })
228
+ );
229
+ }
230
+ }
231
+ __decorateClass([
232
+ property({ type: Object })
233
+ ], PdSuggestionBox.prototype, "callFunction");
234
+ __decorateClass([
235
+ property({ type: Boolean })
236
+ ], PdSuggestionBox.prototype, "createNewEmptyItem");
237
+ __decorateClass([
238
+ property({ type: Boolean })
239
+ ], PdSuggestionBox.prototype, "required");
240
+ __decorateClass([
241
+ property({ type: String })
242
+ ], PdSuggestionBox.prototype, "label");
243
+ __decorateClass([
244
+ property({ type: String })
245
+ ], PdSuggestionBox.prototype, "placeholder");
246
+ __decorateClass([
247
+ property({ type: Number })
248
+ ], PdSuggestionBox.prototype, "delayTime");
249
+ __decorateClass([
250
+ property({ type: Number })
251
+ ], PdSuggestionBox.prototype, "minCharsToSearch");
252
+ __decorateClass([
253
+ property({ type: Number })
254
+ ], PdSuggestionBox.prototype, "maxResult");
255
+ __decorateClass([
256
+ state()
257
+ ], PdSuggestionBox.prototype, "_selectedValue");
258
+ __decorateClass([
259
+ state()
260
+ ], PdSuggestionBox.prototype, "_currentSearchKey");
261
+ __decorateClass([
262
+ state()
263
+ ], PdSuggestionBox.prototype, "_loading");
264
+ __decorateClass([
265
+ state()
266
+ ], PdSuggestionBox.prototype, "_error");
267
+ __decorateClass([
268
+ state()
269
+ ], PdSuggestionBox.prototype, "_currentElements");
270
+ __decorateClass([
271
+ state()
272
+ ], PdSuggestionBox.prototype, "_localFilteredElements");
273
+ __decorateClass([
274
+ state()
275
+ ], PdSuggestionBox.prototype, "_activeIndex");
276
+
277
+ export { PdSuggestionBox };
@@ -0,0 +1,42 @@
1
+ import { LitElement, CSSResultGroup, PropertyValues } from 'lit';
2
+ import { SuggestedElement } from '../types';
3
+ /**
4
+ * Dropdown panel displaying suggestion results.
5
+ *
6
+ * @tagname pd-suggestion-panel
7
+ *
8
+ * @property {boolean} loading - Whether data is loading.
9
+ * @property {SuggestedElement[]} displayElements - Suggestions to display.
10
+ *
11
+ * @event element-selected - Fired when a suggestion is clicked.
12
+ *
13
+ * @cssprop --pd-input-field-width - Panel width. Default: inherits from parent.
14
+ * @cssprop --pd-suggestion-panel-bg - Panel background color. Default: `var(--pd-default-bg-col)`.
15
+ * @cssprop --pd-suggestion-panel-bg-gradient - Panel gradient background. Default: `linear-gradient(...)`.
16
+ * @cssprop --pd-suggestion-panel-border - Panel border. Default: `1px solid var(--pd-default-light-col)`.
17
+ * @cssprop --pd-suggestion-panel-shadow - Panel shadow. Default: `var(--pd-shadow-lg)`.
18
+ * @cssprop --pd-suggestion-panel-max-height - Panel max height. Default: `15em`.
19
+ * @cssprop --pd-suggestion-item-hover-bg - Item hover background. Default: `var(--pd-default-hover-col)`.
20
+ * @cssprop --pd-suggestion-item-hover-border - Item hover border. Default: `1px solid var(--pd-default-light-col)`.
21
+ * @cssprop --pd-suggestion-item-padding - Item padding. Default: `0.5em`.
22
+ * @cssprop --pd-suggestion-item-name-color - Item name color. Default: `var(--pd-default-font-col)`.
23
+ * @cssprop --pd-suggestion-item-name-size - Item name font size. Default: `var(--pd-default-font-input-size)`.
24
+ * @cssprop --pd-suggestion-item-subinfo-color - Item subinfo color. Default: `var(--pd-default-font-muted-col)`.
25
+ * @cssprop --pd-suggestion-item-subinfo-size - Item subinfo font size. Default: `0.875rem`.
26
+ * @cssprop --pd-suggestion-loader-color - Loader border color. Default: `var(--pd-default-dark-col)`.
27
+ * @cssprop --pd-suggestion-loader-active-color - Loader active color. Default: `var(--pd-default-col)`.
28
+ * @cssprop --pd-suggestion-panel-z-index - Panel z-index. Default: `1000`.
29
+ * @cssprop --pd-suggestion-item-focus-outline - Focus outline color for keyboard navigation. Default: `var(--pd-default-col, #067394)`.
30
+ */
31
+ declare class PdSuggestionPanel<T> extends LitElement {
32
+ loading: boolean;
33
+ displayElements: SuggestedElement<T>[];
34
+ activeIndex: number;
35
+ static styles: CSSResultGroup;
36
+ render(): import('lit').TemplateResult<1>;
37
+ protected updated(changedProperties: PropertyValues): void;
38
+ private _scrollActiveIntoView;
39
+ private _selectElement;
40
+ }
41
+ export { PdSuggestionPanel };
42
+ //# sourceMappingURL=PdSuggestionPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdSuggestionPanel.d.ts","sourceRoot":"","sources":["../../src/pd-suggestion-box/PdSuggestionPanel.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EAEV,cAAc,EAEd,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAIb,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,cAAM,iBAAiB,CAAC,CAAC,CAAE,SAAQ,UAAU;IAE3C,OAAO,EAAE,OAAO,CAAS;IAGzB,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAM;IAG5C,WAAW,EAAE,MAAM,CAAM;IAEzB,MAAM,CAAC,MAAM,EAoIR,cAAc,CAAC;IAEpB,MAAM;cAyCa,OAAO,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IAMnE,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,cAAc;CAavB;AAOD,OAAO,EAAE,iBAAiB,EAAE,CAAC"}