@eccenca/gui-elements 23.2.0-rc.0 → 23.2.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 (140) hide show
  1. package/CHANGELOG.md +32 -3
  2. package/dist/cjs/components/AutoSuggestion/AutoSuggestion.js +24 -20
  3. package/dist/cjs/components/AutoSuggestion/AutoSuggestion.js.map +1 -1
  4. package/dist/cjs/components/AutocompleteField/AutoCompleteField.js +59 -50
  5. package/dist/cjs/components/AutocompleteField/AutoCompleteField.js.map +1 -1
  6. package/dist/cjs/components/AutocompleteField/autoCompleteFieldUtils.js +3 -3
  7. package/dist/cjs/components/AutocompleteField/autoCompleteFieldUtils.js.map +1 -1
  8. package/dist/cjs/components/Breadcrumb/BreadcrumbItem.js +9 -6
  9. package/dist/cjs/components/Breadcrumb/BreadcrumbItem.js.map +1 -1
  10. package/dist/cjs/components/CodeAutocompleteField/CodeAutocompleteField.js +33 -0
  11. package/dist/cjs/components/CodeAutocompleteField/CodeAutocompleteField.js.map +1 -0
  12. package/dist/cjs/components/CodeAutocompleteField/index.js +14 -0
  13. package/dist/cjs/components/CodeAutocompleteField/index.js.map +1 -0
  14. package/dist/cjs/components/Depiction/Depiction.js +13 -13
  15. package/dist/cjs/components/Depiction/Depiction.js.map +1 -1
  16. package/dist/cjs/components/Dialog/SimpleDialog.js +5 -5
  17. package/dist/cjs/components/Dialog/SimpleDialog.js.map +1 -1
  18. package/dist/cjs/components/Icon/IconButton.js +9 -3
  19. package/dist/cjs/components/Icon/IconButton.js.map +1 -1
  20. package/dist/cjs/components/Icon/canonicalIconNames.js +2 -0
  21. package/dist/cjs/components/Icon/canonicalIconNames.js.map +1 -1
  22. package/dist/cjs/components/MultiSelect/MultiSelect.js +45 -17
  23. package/dist/cjs/components/MultiSelect/MultiSelect.js.map +1 -1
  24. package/dist/cjs/components/MultiSuggestField/MultiSuggestField.js +33 -0
  25. package/dist/cjs/components/MultiSuggestField/MultiSuggestField.js.map +1 -0
  26. package/dist/cjs/components/OverviewItem/OverviewItem.js +8 -10
  27. package/dist/cjs/components/OverviewItem/OverviewItem.js.map +1 -1
  28. package/dist/cjs/components/PropertyValuePair/PropertyName.js +4 -3
  29. package/dist/cjs/components/PropertyValuePair/PropertyName.js.map +1 -1
  30. package/dist/cjs/components/Select/Select.js +18 -3
  31. package/dist/cjs/components/Select/Select.js.map +1 -1
  32. package/dist/cjs/components/SuggestField/SuggestField.js +39 -0
  33. package/dist/cjs/components/SuggestField/SuggestField.js.map +1 -0
  34. package/dist/cjs/components/SuggestField/index.js +19 -0
  35. package/dist/cjs/components/SuggestField/index.js.map +1 -0
  36. package/dist/cjs/components/index.js +3 -0
  37. package/dist/cjs/components/index.js.map +1 -1
  38. package/dist/cjs/extensions/react-flow/nodes/NodeContent.js +54 -41
  39. package/dist/cjs/extensions/react-flow/nodes/NodeContent.js.map +1 -1
  40. package/dist/cjs/index.js +1 -0
  41. package/dist/cjs/index.js.map +1 -1
  42. package/dist/esm/components/AutoSuggestion/AutoSuggestion.js +23 -18
  43. package/dist/esm/components/AutoSuggestion/AutoSuggestion.js.map +1 -1
  44. package/dist/esm/components/AutocompleteField/AutoCompleteField.js +68 -59
  45. package/dist/esm/components/AutocompleteField/AutoCompleteField.js.map +1 -1
  46. package/dist/esm/components/AutocompleteField/autoCompleteFieldUtils.js +3 -3
  47. package/dist/esm/components/AutocompleteField/autoCompleteFieldUtils.js.map +1 -1
  48. package/dist/esm/components/Breadcrumb/BreadcrumbItem.js +9 -6
  49. package/dist/esm/components/Breadcrumb/BreadcrumbItem.js.map +1 -1
  50. package/dist/esm/components/CodeAutocompleteField/CodeAutocompleteField.js +37 -0
  51. package/dist/esm/components/CodeAutocompleteField/CodeAutocompleteField.js.map +1 -0
  52. package/dist/esm/components/CodeAutocompleteField/index.js +2 -0
  53. package/dist/esm/components/CodeAutocompleteField/index.js.map +1 -0
  54. package/dist/esm/components/Depiction/Depiction.js +12 -12
  55. package/dist/esm/components/Depiction/Depiction.js.map +1 -1
  56. package/dist/esm/components/Dialog/SimpleDialog.js +7 -7
  57. package/dist/esm/components/Dialog/SimpleDialog.js.map +1 -1
  58. package/dist/esm/components/Icon/IconButton.js +10 -4
  59. package/dist/esm/components/Icon/IconButton.js.map +1 -1
  60. package/dist/esm/components/Icon/canonicalIconNames.js +2 -0
  61. package/dist/esm/components/Icon/canonicalIconNames.js.map +1 -1
  62. package/dist/esm/components/MultiSelect/MultiSelect.js +52 -22
  63. package/dist/esm/components/MultiSelect/MultiSelect.js.map +1 -1
  64. package/dist/esm/components/MultiSuggestField/MultiSuggestField.js +37 -0
  65. package/dist/esm/components/MultiSuggestField/MultiSuggestField.js.map +1 -0
  66. package/dist/esm/components/OverviewItem/OverviewItem.js +8 -10
  67. package/dist/esm/components/OverviewItem/OverviewItem.js.map +1 -1
  68. package/dist/esm/components/PropertyValuePair/PropertyName.js +4 -3
  69. package/dist/esm/components/PropertyValuePair/PropertyName.js.map +1 -1
  70. package/dist/esm/components/Select/Select.js +19 -4
  71. package/dist/esm/components/Select/Select.js.map +1 -1
  72. package/dist/esm/components/SuggestField/SuggestField.js +43 -0
  73. package/dist/esm/components/SuggestField/SuggestField.js.map +1 -0
  74. package/dist/esm/components/SuggestField/index.js +6 -0
  75. package/dist/esm/components/SuggestField/index.js.map +1 -0
  76. package/dist/esm/components/index.js +3 -0
  77. package/dist/esm/components/index.js.map +1 -1
  78. package/dist/esm/extensions/react-flow/nodes/NodeContent.js +51 -39
  79. package/dist/esm/extensions/react-flow/nodes/NodeContent.js.map +1 -1
  80. package/dist/esm/index.js +2 -1
  81. package/dist/esm/index.js.map +1 -1
  82. package/dist/types/components/AutoSuggestion/AutoSuggestion.d.ts +35 -4
  83. package/dist/types/components/AutocompleteField/AutoCompleteField.d.ts +23 -6
  84. package/dist/types/components/AutocompleteField/autoCompleteFieldUtils.d.ts +3 -3
  85. package/dist/types/components/AutocompleteField/index.d.ts +1 -1
  86. package/dist/types/components/AutocompleteField/interfaces.d.ts +1 -1
  87. package/dist/types/components/CodeAutocompleteField/CodeAutocompleteField.d.ts +10 -0
  88. package/dist/types/components/CodeAutocompleteField/index.d.ts +1 -0
  89. package/dist/types/components/Dialog/SimpleDialog.d.ts +2 -2
  90. package/dist/types/components/Icon/IconButton.d.ts +2 -2
  91. package/dist/types/components/Icon/canonicalIconNames.d.ts +1 -1
  92. package/dist/types/components/MultiSelect/MultiSelect.d.ts +20 -2
  93. package/dist/types/components/MultiSuggestField/MultiSuggestField.d.ts +10 -0
  94. package/dist/types/components/PropertyValuePair/PropertyName.d.ts +5 -1
  95. package/dist/types/components/Select/Select.d.ts +28 -9
  96. package/dist/types/components/SuggestField/SuggestField.d.ts +16 -0
  97. package/dist/types/components/SuggestField/index.d.ts +5 -0
  98. package/dist/types/components/index.d.ts +3 -0
  99. package/dist/types/extensions/react-flow/nodes/NodeContent.d.ts +7 -7
  100. package/dist/types/index.d.ts +2 -1
  101. package/package.json +1 -1
  102. package/src/components/Application/_header.scss +49 -58
  103. package/src/components/AutoSuggestion/AutoSuggestion.stories.tsx +14 -0
  104. package/src/components/AutoSuggestion/AutoSuggestion.tsx +280 -221
  105. package/src/components/AutocompleteField/AutoCompleteField.stories.tsx +14 -0
  106. package/src/components/AutocompleteField/AutoCompleteField.tsx +157 -121
  107. package/src/components/AutocompleteField/autoCompleteFieldUtils.tsx +10 -16
  108. package/src/components/AutocompleteField/interfaces.ts +5 -6
  109. package/src/components/Breadcrumb/BreadcrumbItem.tsx +19 -18
  110. package/src/components/Breadcrumb/breadcrumb.scss +18 -16
  111. package/src/components/Breadcrumb/stories/BreadcrumbList.stories.tsx +18 -15
  112. package/src/components/CodeAutocompleteField/CodeAutocompleteField.stories.tsx +89 -0
  113. package/src/components/CodeAutocompleteField/CodeAutocompleteField.tsx +22 -0
  114. package/src/components/CodeAutocompleteField/index.ts +1 -0
  115. package/src/components/ContextOverlay/contextoverlay.scss +10 -2
  116. package/src/components/Depiction/Depiction.tsx +57 -55
  117. package/src/components/Dialog/SimpleDialog.tsx +20 -33
  118. package/src/components/Icon/IconButton.tsx +25 -11
  119. package/src/components/Icon/canonicalIconNames.tsx +4 -0
  120. package/src/components/MultiSelect/MultiSelect.stories.tsx +9 -47
  121. package/src/components/MultiSelect/MultiSelect.tsx +110 -66
  122. package/src/components/MultiSuggestField/MultiSuggestField.stories.tsx +58 -0
  123. package/src/components/MultiSuggestField/MultiSuggestField.tsx +22 -0
  124. package/src/components/Notification/notification.scss +20 -17
  125. package/src/components/OverviewItem/OverviewItem.tsx +11 -20
  126. package/src/components/PropertyValuePair/PropertyName.tsx +17 -4
  127. package/src/components/PropertyValuePair/propertyvalue.scss +17 -1
  128. package/src/components/Select/Select.stories.tsx +49 -20
  129. package/src/components/Select/Select.tsx +96 -18
  130. package/src/components/Select/_select.scss +13 -1
  131. package/src/components/SuggestField/SuggestField.stories.tsx +99 -0
  132. package/src/components/SuggestField/SuggestField.tsx +28 -0
  133. package/src/components/SuggestField/index.ts +5 -0
  134. package/src/components/TagInput/taginput.scss +14 -0
  135. package/src/components/index.scss +1 -1
  136. package/src/components/index.ts +3 -0
  137. package/src/extensions/react-flow/nodes/NodeContent.tsx +105 -87
  138. package/src/index.ts +2 -5
  139. package/src/components/AutoSuggestion/stories/AutoSuggestion.stories.tsx +0 -83
  140. package/src/components/AutocompleteField/stories/AutoCompleteField.stories.tsx +0 -86
@@ -1,15 +1,28 @@
1
1
  import React from "react";
2
+
2
3
  import { CLASSPREFIX as eccgui } from "../../configuration/constants";
3
4
  import Label from "../Label/Label";
4
5
 
5
- export interface PropertyNameProps extends React.HTMLAttributes<HTMLElement> {};
6
+ export interface PropertyNameProps extends React.HTMLAttributes<HTMLElement> {
7
+ /**
8
+ * Increase or decrease the width used for the property name.
9
+ */
10
+ size?: "small" | "medium" | "large";
11
+ }
6
12
 
7
- export const PropertyName = ({ className = "", children, ...otherProps }: PropertyNameProps) => {
13
+ export const PropertyName = ({ className = "", size, children, ...otherProps }: PropertyNameProps) => {
8
14
  return (
9
- <dt className={`${eccgui}-propertyvalue__property` + (className ? " " + className : "")} {...otherProps}>
15
+ <dt
16
+ className={
17
+ `${eccgui}-propertyvalue__property` +
18
+ (size ? ` ${eccgui}-propertyvalue__property--${size}` : "") +
19
+ (className ? " " + className : "")
20
+ }
21
+ {...otherProps}
22
+ >
10
23
  <div>{typeof children === "string" ? <Label text={children} isLayoutForElement="span" /> : children}</div>
11
24
  </dt>
12
25
  );
13
- }
26
+ };
14
27
 
15
28
  export default PropertyName;
@@ -46,9 +46,25 @@
46
46
  }
47
47
  }
48
48
 
49
+ .#{$eccgui}-propertyvalue__property--small {
50
+ width: math.div(2, 16) * 100%;
51
+
52
+ & + .#{$eccgui}-propertyvalue__value {
53
+ margin-left: math.div(2, 16) * 100%;
54
+ }
55
+ }
56
+
57
+ .#{$eccgui}-propertyvalue__property--large {
58
+ width: math.div(5, 16) * 100%;
59
+
60
+ & + .#{$eccgui}-propertyvalue__value {
61
+ margin-left: math.div(5, 16) * 100%;
62
+ }
63
+ }
64
+
49
65
  .#{$eccgui}-propertyvalue__value {
50
- margin-left: math.div(3, 16) * 100%;
51
66
  box-sizing: content-box;
67
+ margin-left: math.div(3, 16) * 100%;
52
68
 
53
69
  &:not(:last-child) {
54
70
  .#{$eccgui}-propertyvalue__pair--hasdivider > & {
@@ -1,35 +1,64 @@
1
1
  import React from "react";
2
- import { ComponentStory, ComponentMeta } from "@storybook/react";
3
2
  import { loremIpsum } from "react-lorem-ipsum";
3
+ import { Meta, StoryFn } from "@storybook/react";
4
4
 
5
- import {
6
- Select,
7
- Button,
8
- MenuItem,
9
- } from "../../index";
5
+ import { helpersArgTypes } from "../../../.storybook/helpers";
6
+ import { Button, MenuItem, Select } from "../../index";
10
7
 
11
8
  export default {
12
- title: "Forms/Select",
13
- component: Select,
14
- argTypes: {
15
- },
16
- } as ComponentMeta<typeof Select>;
9
+ title: "Forms/Select",
10
+ component: Select,
11
+ argTypes: {
12
+ icon: {
13
+ ...helpersArgTypes.exampleIcon,
14
+ },
15
+ rightIcon: {
16
+ ...helpersArgTypes.exampleIcon,
17
+ },
18
+ },
19
+ } as Meta<typeof Select>;
17
20
 
18
- const Template: ComponentStory<typeof Select> = (args) => (
19
- <Select {...args}>
20
- <Button alignText="left" text="Select an element" fill outlined rightIcon="toggler-showmore"/>
21
- </Select>
22
- );
21
+ const Template: StoryFn<typeof Select> = (args) => <Select {...args} />;
23
22
 
24
23
  export const Default = Template.bind({});
25
24
  Default.args = {
26
25
  items: loremIpsum({ p: 1, avgSentencesPerParagraph: 5, random: false })
27
26
  .toString()
28
27
  .split(".")
29
- .map((item) => { return { label: item }}),
28
+ .map((item) => {
29
+ return { label: item };
30
+ }),
30
31
  itemRenderer: (item, props) => {
31
- return <MenuItem text={item.label} />
32
+ return <MenuItem text={item.label} title={item.label} />;
32
33
  },
33
34
  fill: true,
34
- filterable: false,
35
- }
35
+ // placeholder: loremIpsum({ p: 1, avgSentencesPerParagraph: 5, random: false })
36
+ };
37
+
38
+ /**
39
+ * A controlled select target is used by adding `children` elements to `<Select />` directly.
40
+ * Properties like `text`, `placeholder`, `onClearanceHandler` and `onClearanceText` won't be evaluated then.
41
+ */
42
+ export const ControlledTarget = Template.bind({});
43
+ ControlledTarget.args = {
44
+ ...Default.args,
45
+ fill: false,
46
+ children: <Button text="Controlled select target" intent="primary" />,
47
+ };
48
+
49
+ /**
50
+ * If the selection is not mandatory it is suggested to add an option letting the user reset the select value.
51
+ * `onClearanceHandler` follows the pattern to add a button on the right side of the element.
52
+ * An alternate way would be to add an additional select item to reset the value but this could come with a few usablity issues:
53
+ * user do not see it when the options are filtered, or the "empty" select option leads to the pre-selected option, etc.
54
+ */
55
+ export const ClearanceOption = Template.bind({});
56
+ ClearanceOption.args = {
57
+ ...Default.args,
58
+ text: "Example selection",
59
+ onClearanceText: "Reset the selection",
60
+ //onClearanceHandler: false,
61
+ onClearanceHandler: () => {
62
+ alert("Reset now.");
63
+ },
64
+ };
@@ -1,38 +1,116 @@
1
1
  import React from "react";
2
- import {
3
- Select2 as BlueprintSelect,
4
- Select2Props as BlueprintSelectProps,
5
- } from "@blueprintjs/select";
6
- import { ContextOverlayProps } from "./../../index";
2
+ import { Select2 as BlueprintSelect, Select2Props as BlueprintSelectProps } from "@blueprintjs/select";
7
3
 
8
- /**
9
- * FIXME: Currently we only route the original element through.
10
- * We should add here basic elemeents and processes for target and selections, etc.
11
- */
4
+ import { CLASSPREFIX as eccgui } from "../../configuration/constants";
12
5
 
13
- export interface SelectProps<T> extends Omit<
14
- BlueprintSelectProps<T>,
15
- "popoverTargetProps" | "popoverContentProps" | "popoverProps" | "popoverRef"
16
- > {
6
+ import { Button, ButtonProps, ContextOverlayProps, Icon, OverflowText } from "./../../index";
7
+
8
+ export interface SelectProps<T>
9
+ extends Omit<BlueprintSelectProps<T>, "popoverTargetProps" | "popoverContentProps" | "popoverProps" | "popoverRef">,
10
+ Pick<ButtonProps, "icon" | "rightIcon"> {
11
+ /**
12
+ * Textual representation of the the selected value.
13
+ * This is displayed if the select target is not controlled directly via `children` elements.
14
+ */
15
+ text?: string;
16
+ /**
17
+ * Placeholder text displayed for selects without defined `text`.
18
+ * This is displayed if the select target is not controlled directly via `children` elements.
19
+ */
20
+ placeholder?: string;
17
21
  /**
18
22
  * Props to spread to `ContextOverlay` that is used to display the dropdown.
19
23
  */
20
- contextOverlayProps?: Partial<Omit<ContextOverlayProps, "content" | "defaultIsOpen" | "disabled" | "fill" | "renderTarget" | "targetTagName">>
24
+ contextOverlayProps?: Partial<
25
+ Omit<ContextOverlayProps, "content" | "defaultIsOpen" | "disabled" | "fill" | "renderTarget" | "targetTagName">
26
+ >;
27
+ /**
28
+ * Event handler to reset search input.
29
+ * Only works with the uncontrolled default select target.
30
+ * If set then `rightElement` is automatically set with an action button to trigger the handler.
31
+ */
32
+ onClearanceHandler?: () => void;
33
+ /**
34
+ * Tooltip to show for the clear button.
35
+ * Only works with the uncontrolled default select target.
36
+ */
37
+ onClearanceText?: string;
21
38
  }
22
39
 
23
40
  /**
24
41
  * Create a Select box without the HTML select element.
25
42
  * It is possible to filter options, as well as to add new options if necessary.
43
+ *
44
+ * **Use this input element when the value is primarily selected from a defined set of elements.**
26
45
  */
27
- export function Select<T>({contextOverlayProps, ...otherSelectProps}: SelectProps<T>) {
46
+ export function Select<T>({
47
+ contextOverlayProps,
48
+ className,
49
+ children,
50
+ text,
51
+ placeholder = "Select item ...",
52
+ icon,
53
+ rightIcon,
54
+ onClearanceHandler,
55
+ inputProps,
56
+ onClearanceText = "Reset selection",
57
+ ...otherSelectProps
58
+ }: SelectProps<T>) {
28
59
  return (
29
60
  <BlueprintSelect<T>
30
- popoverProps={{ minimal: true, ...contextOverlayProps}}
61
+ popoverProps={{
62
+ minimal: true,
63
+ matchTargetWidth: otherSelectProps.fill ?? false,
64
+ ...contextOverlayProps,
65
+ }}
66
+ inputProps={{
67
+ round: true,
68
+ ...inputProps,
69
+ }}
70
+ className={`${eccgui}-select` + (className ? ` ${className}` : "")}
31
71
  {...otherSelectProps}
32
- />
72
+ >
73
+ {children ?? (
74
+ <Button
75
+ text={text ? <OverflowText>{text}</OverflowText> : <OverflowText>{placeholder}</OverflowText>}
76
+ alignText="left"
77
+ outlined
78
+ fill={otherSelectProps.fill ?? false}
79
+ disabled={otherSelectProps.disabled ?? false}
80
+ icon={icon}
81
+ rightIcon={
82
+ <>
83
+ {onClearanceHandler && text && (
84
+ <Icon
85
+ name="operation-clear"
86
+ tooltipText={onClearanceText ? onClearanceText : undefined}
87
+ onClick={(e) => {
88
+ e.stopPropagation();
89
+ onClearanceHandler();
90
+ }}
91
+ />
92
+ )}
93
+ {typeof rightIcon === "string" ? (
94
+ <Icon name={rightIcon} />
95
+ ) : (
96
+ rightIcon ?? <Icon name={"toggler-caretdown"} />
97
+ )}
98
+ </>
99
+ }
100
+ />
101
+ )}
102
+ </BlueprintSelect>
103
+ );
104
+ }
105
+
106
+ /** @deprecated: instead of `const MySelect = Select.ofType<MyType>()` use directly `<Select<MyType> {...props} />` */
107
+ function ofType<U>() {
108
+ console.warn(
109
+ "Usage of `ofType()` is deprecated! Instead of `const MySelect = Select.ofType<MyType>()` use directly `<Select<MyType> {...props} />`"
33
110
  );
111
+ return (props: SelectProps<U>) => <Select<U> {...props} />;
34
112
  }
35
113
 
36
- Select.ofType = BlueprintSelect.ofType;
114
+ Select.ofType = ofType;
37
115
 
38
116
  export default Select;
@@ -2,7 +2,19 @@
2
2
 
3
3
  .#{$ns}-select-popover {
4
4
  .#{$ns}-menu {
5
- max-height: unset;
6
5
  max-width: unset;
6
+ max-height: 40vh;
7
+ }
8
+ }
9
+
10
+ .#{$eccgui}-select {
11
+ display: inline-block;
12
+
13
+ &.#{$ns}-fill {
14
+ display: block;
15
+ }
16
+
17
+ .#{$eccgui}-button {
18
+ max-width: 100%;
7
19
  }
8
20
  }
@@ -0,0 +1,99 @@
1
+ import React from "react";
2
+ import { Meta, StoryFn } from "@storybook/react";
3
+
4
+ import { highlighterUtils, SuggestField, SuggestFieldProps, suggestFieldUtils } from "../../index";
5
+
6
+ const SuggestFieldStory: Meta<typeof SuggestField> = {
7
+ title: "Forms/SuggestField",
8
+ component: SuggestField,
9
+ argTypes: {},
10
+ };
11
+
12
+ const Template: StoryFn<typeof SuggestField> = (args) => <SuggestField {...args}></SuggestField>;
13
+
14
+ // Renders string values as string
15
+ const defaultRenderer = (item: string) => item;
16
+
17
+ export const Default = Template.bind({});
18
+ const defaultArgs: SuggestFieldProps<string, string> = {
19
+ itemRenderer: (item: string) => `Rendered item: ${item}`,
20
+ itemValueRenderer: (item: string) => `Selected item: ${item}`,
21
+ itemValueString: (item: string) => `Query: ${item}`,
22
+ onSearch: (query: string) => {
23
+ const multiWord = highlighterUtils.extractSearchWords(query, true);
24
+ return ["search item A", "search element B", "search object C"].filter((word) =>
25
+ highlighterUtils.matchesAllWords(word.toLowerCase(), multiWord)
26
+ );
27
+ },
28
+ onChange: (elem) => {
29
+ console.log(`Entry '${elem}' selected!`);
30
+ },
31
+ itemValueSelector: defaultRenderer,
32
+ noResultText: "No result",
33
+ //fill: false,
34
+ onlyDropdownWithQuery: true,
35
+ };
36
+ Default.args = defaultArgs;
37
+
38
+ /**
39
+ * Display always the dropdown after the element has the focus.
40
+ * Do not wait until the query input was startet.
41
+ */
42
+ export const DropdownOnFocus = Template.bind({});
43
+ const dropdownOnFocus: SuggestFieldProps<string, string> = {
44
+ ...defaultArgs,
45
+ onlyDropdownWithQuery: false,
46
+ };
47
+ DropdownOnFocus.args = dropdownOnFocus;
48
+
49
+ /**
50
+ * Changes the search query for the selected item, e.g. when the rendered item text should be different from the query finding this item.
51
+ */
52
+ export const AdaptQueryAfterSelection = Template.bind({});
53
+ const adaptQueryAfterSelection: SuggestFieldProps<string, string> = {
54
+ ...defaultArgs,
55
+ resetQueryToValue: (selectedValue: string) => selectedValue,
56
+ };
57
+ AdaptQueryAfterSelection.args = adaptQueryAfterSelection;
58
+
59
+ /**
60
+ * Allows to reset a selection.
61
+ */
62
+ export const AllowReset = Template.bind({});
63
+ const resetSelection: SuggestFieldProps<string, string> = {
64
+ ...defaultArgs,
65
+ reset: {
66
+ resetValue: "",
67
+ resetButtonText: "Clear selected value",
68
+ resettableValue: (_value: string) => true,
69
+ },
70
+ };
71
+ AllowReset.args = resetSelection;
72
+
73
+ export const AllowCustomValues = Template.bind({});
74
+ const allowCustomValues: SuggestFieldProps<string, string> = {
75
+ ...defaultArgs,
76
+ createNewItem: {
77
+ itemRenderer: suggestFieldUtils.createNewItemRendererFactory(
78
+ (query: string) => `Create new item: ${query}`,
79
+ "item-add-artefact"
80
+ ),
81
+ itemFromQuery: (item) => item,
82
+ },
83
+ };
84
+ AllowCustomValues.args = allowCustomValues;
85
+
86
+ /**
87
+ * Changes the search query for the selected item, e.g. when the rendered item text should be different from the query finding this item.
88
+ */
89
+ export const ReadOnlyState = Template.bind({});
90
+ const readOnlyState: SuggestFieldProps<string, string> = {
91
+ ...defaultArgs,
92
+ initialValue: "search item B",
93
+ inputProps: {
94
+ readOnly: true,
95
+ },
96
+ };
97
+ ReadOnlyState.args = readOnlyState;
98
+
99
+ export default SuggestFieldStory;
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+
3
+ import { CLASSPREFIX as eccgui } from "../../configuration/constants";
4
+ import { AutoCompleteField, AutoCompleteFieldProps } from "../AutocompleteField/AutoCompleteField";
5
+
6
+ export type SuggestFieldProps<T, UPDATE_VALUE> = AutoCompleteFieldProps<T, UPDATE_VALUE>;
7
+
8
+ /**
9
+ * A component with the appearance of an input field that allows to select and optionally create new items.
10
+ * It shows suggestions for the entered text from which the user can select any option.
11
+ * It has the following fixed behavior:
12
+ *
13
+ * - When not focused, a different representation of the item value can be shown, e.g. the label of the value.
14
+ * - When changing an existing item the input text is set to the original value in order to be able to edit the original value.
15
+ * - When for a specific input text, the only item returns is the currently set item itself, all items are shown below it, to make
16
+ * clear that there are still other items to choose from.
17
+ * - The suggestions are fetched with a short delay, so not too many unnecessary requests are fired.
18
+ * - Items where itemRenderer returns a string have a default representation, i.e. highlighting of search words, active flag etc.
19
+ */
20
+ export function SuggestField<T, UPDATE_VALUE>({ className, ...otherProps }: SuggestFieldProps<T, UPDATE_VALUE>) {
21
+ // Currently this works only as an alias element for `AutoCompleteField`.
22
+ return (
23
+ <AutoCompleteField<T, UPDATE_VALUE>
24
+ className={`${eccgui}-suggestfield` + (className ? ` ${className}` : "")}
25
+ {...otherProps}
26
+ />
27
+ );
28
+ }
@@ -0,0 +1,5 @@
1
+ import { createNewItemRendererFactory } from "./../AutocompleteField/autoCompleteFieldUtils";
2
+ export * from "./SuggestField";
3
+ export const suggestFieldUtils = {
4
+ createNewItemRendererFactory,
5
+ };
@@ -1,7 +1,21 @@
1
1
  @import "~@blueprintjs/core/src/components/tag-input/tag-input";
2
2
 
3
3
  .#{$ns}-tag-input {
4
+ display: inline-flex;
5
+
6
+ &.#{$ns}-input {
7
+ height: auto;
8
+ min-height: $eccgui-size-textfield-height-regular;
9
+ padding-right: ($pt-button-height - $pt-button-height-small) * 0.5;
10
+ }
11
+
4
12
  .#{$eccgui}-spinner--position-inline {
5
13
  height: $pt-button-height-small;
6
14
  }
15
+
16
+ .#{$eccgui}-button {
17
+ min-width: $pt-button-height-small;
18
+ min-height: $pt-button-height-small;
19
+ margin: ($pt-button-height - $pt-button-height-small) * 0.5 0 0 0;
20
+ }
7
21
  }
@@ -26,9 +26,9 @@
26
26
  @import "./Structure/titles";
27
27
  @import "./Table/table";
28
28
  @import "./Tabs/tabs";
29
- @import "./TagInput/taginput";
30
29
  @import "./Tag/tag";
31
30
  @import "./TextField/textfield";
31
+ @import "./TagInput/taginput";
32
32
  @import "./Toolbar/toolbar";
33
33
  @import "./Tooltip/tooltip";
34
34
  @import "./Tree/tree";
@@ -1,7 +1,9 @@
1
1
  export * from "./Accordion";
2
2
  export * from "./Application";
3
3
  export * from "./AutocompleteField";
4
+ export * from "./SuggestField";
4
5
  export * from "./AutoSuggestion";
6
+ export * from "./CodeAutocompleteField";
5
7
  export * from "./Badge/Badge";
6
8
  export * from "./Breadcrumb";
7
9
  export * from "./Button/Button";
@@ -21,6 +23,7 @@ export * from "./Link/Link";
21
23
  export * from "./List/List";
22
24
  export * from "./Menu";
23
25
  export * from "./MultiSelect/MultiSelect";
26
+ export * from "./MultiSuggestField/MultiSuggestField";
24
27
  export * from "./Notification";
25
28
  export * from "./NumericInput/NumericInput";
26
29
  export * from "./OverviewItem";