@monolith-forensics/monolith-ui 1.3.92 → 1.3.95

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.
@@ -1,4 +1,5 @@
1
- export interface SearchableTextAreaProps {
1
+ import type { DropDownItem } from "../DropDownMenu";
2
+ export interface SelectableTextAreaProps {
2
3
  label?: string;
3
4
  data?: Array<{
4
5
  label: string;
@@ -17,9 +18,14 @@ export interface SearchableTextAreaProps {
17
18
  textAreaMaxRows?: number;
18
19
  textAreaProps?: Record<string, any>;
19
20
  initialValue?: string;
21
+ actionMenuData?: Array<{
22
+ label: string;
23
+ value: string;
24
+ }>;
25
+ onActionMenuSelect?: (item: DropDownItem) => void;
20
26
  }
21
- declare function SearchableTextArea({ label, data, searchable, allowCustomValue, required, error, description, selectProps, value, onChange, textAreaPlaceholder, textAreaMinRows, textAreaMaxRows, textAreaProps, initialValue, }: SearchableTextAreaProps): import("react/jsx-runtime").JSX.Element;
22
- declare namespace SearchableTextArea {
27
+ declare function SelectableTextArea({ label, data, searchable, allowCustomValue, required, error, description, selectProps, value, onChange, textAreaPlaceholder, textAreaMinRows, textAreaMaxRows, textAreaProps, initialValue, actionMenuData, onActionMenuSelect, }: SelectableTextAreaProps): import("react/jsx-runtime").JSX.Element;
28
+ declare namespace SelectableTextArea {
23
29
  var displayName: string;
24
30
  }
25
- export default SearchableTextArea;
31
+ export default SelectableTextArea;
@@ -17,20 +17,45 @@ const TextAreaRow = styled.div `
17
17
  display: flex;
18
18
  align-items: flex-start;
19
19
  width: 100%;
20
+ z-index: 1; /* Lower than SelectBoxWrapper */
20
21
  `;
21
22
  const SelectBoxWrapper = styled.div `
22
- position: relative;
23
+ position: absolute;
23
24
  width: 100%;
25
+ top: 0; /* Position at the top of the textarea */
26
+ left: 0;
27
+ z-index: 10; /* Ensure dropdown appears above textarea */
24
28
  `;
25
29
  const StyledSelectBox = styled(SelectBox) `
26
- /* Completely hide the SelectBox but keep it functional for dropdown */
27
- position: absolute;
28
- top: 0;
29
- left: 0;
30
+ /* Completely hide the SelectBox and disable all interactions */
31
+ position: relative;
30
32
  width: 100%;
31
33
  opacity: 0;
32
- pointer-events: auto; /* Allow interactions for dropdown */
33
- z-index: -1;
34
+ pointer-events: none; /* Disable all interactions */
35
+ height: 0;
36
+ overflow: hidden;
37
+
38
+ /* Hide all child elements */
39
+ * {
40
+ opacity: 0;
41
+ pointer-events: none;
42
+ height: 0;
43
+ overflow: hidden;
44
+ }
45
+
46
+ /* Only allow dropdown portal to be visible and interactive when opened programmatically */
47
+ [data-floating-ui-portal] {
48
+ opacity: 1 !important;
49
+ pointer-events: auto !important;
50
+ z-index: 1000 !important;
51
+
52
+ * {
53
+ opacity: 1 !important;
54
+ pointer-events: auto !important;
55
+ height: auto !important;
56
+ overflow: visible !important;
57
+ }
58
+ }
34
59
  `;
35
60
  const StyledFieldLabel = styled(FieldLabel) `
36
61
  .action-section {
@@ -72,7 +97,7 @@ const StyledTextArea = styled.textarea `
72
97
  opacity: 0.5;
73
98
  }
74
99
  `;
75
- function SearchableTextArea({ label, data, searchable, allowCustomValue, required, error, description, selectProps = {}, value, onChange, textAreaPlaceholder, textAreaMinRows = 3, textAreaMaxRows, textAreaProps = {}, initialValue = "", }) {
100
+ function SelectableTextArea({ label, data, searchable, allowCustomValue, required, error, description, selectProps = {}, value, onChange, textAreaPlaceholder, textAreaMinRows = 3, textAreaMaxRows, textAreaProps = {}, initialValue = "", actionMenuData, onActionMenuSelect, }) {
76
101
  // Use controlled value if provided, otherwise use internal state
77
102
  const [internalValue, setInternalValue] = useState(initialValue);
78
103
  const [selectValue, setSelectValue] = useState(null);
@@ -108,36 +133,49 @@ function SearchableTextArea({ label, data, searchable, allowCustomValue, require
108
133
  onChange(newValue);
109
134
  }
110
135
  };
111
- // Handle keyboard shortcuts for dropdown
112
- const handleTextAreaKeyDown = (event) => {
113
- // Ctrl/Cmd + Space to open dropdown
114
- if ((event.ctrlKey || event.metaKey) && event.code === "Space") {
115
- event.preventDefault();
116
- handleSearchClick();
117
- }
118
- };
119
- const handleSearchClick = () => {
136
+ const handleMenuClick = () => {
120
137
  if (selectBoxRef.current) {
121
138
  const selectInput = selectBoxRef.current.querySelector("input");
122
139
  if (selectInput) {
140
+ // Temporarily enable interactions to trigger dropdown
141
+ selectInput.style.pointerEvents = "auto";
142
+ selectInput.style.opacity = "1";
143
+ selectInput.style.height = "auto";
123
144
  selectInput.focus();
124
145
  selectInput.click();
146
+ // Hide again immediately after triggering
147
+ setTimeout(() => {
148
+ selectInput.style.pointerEvents = "none";
149
+ selectInput.style.opacity = "0";
150
+ selectInput.style.height = "0";
151
+ }, 50);
125
152
  }
126
153
  }
127
154
  };
128
155
  // Used to create red border when zod validation detects errors
129
156
  const hasError = Boolean(error);
130
- return (_jsxs(CombinedInputWrapper, { children: [label && (_jsx(StyledFieldLabel, { asterisk: required, error: error, description: description, actionComponent: _jsx(DropDownMenu, { data: [
131
- {
132
- value: "search",
133
- label: "Select Recent Entry",
134
- visible: true,
135
- },
136
- ], variant: "text", size: "xs", arrow: false, onItemSelect: (item) => {
137
- if (item.value === "search") {
138
- handleSearchClick();
139
- }
140
- }, buttonProps: {
157
+ // Create default menu data if none provided
158
+ const defaultMenuData = [
159
+ {
160
+ value: "recent",
161
+ label: "Select Recent Entry",
162
+ },
163
+ ];
164
+ // Use provided menu data or fall back to default
165
+ const menuData = actionMenuData || defaultMenuData;
166
+ // Handle menu item selection with custom callback or default behavior
167
+ const handleActionMenuSelect = (item) => {
168
+ if (onActionMenuSelect) {
169
+ onActionMenuSelect(item);
170
+ }
171
+ else {
172
+ // Default behavior: if item value is "recent", trigger handleMenuClick
173
+ if (item.value === "recent") {
174
+ handleMenuClick();
175
+ }
176
+ }
177
+ };
178
+ return (_jsxs(CombinedInputWrapper, { children: [label && (_jsx(StyledFieldLabel, { asterisk: required, error: error, description: description, actionComponent: _jsx(DropDownMenu, { data: menuData, variant: "text", size: "xs", arrow: false, onItemSelect: handleActionMenuSelect, buttonProps: {
141
179
  style: {
142
180
  minWidth: "auto",
143
181
  border: "none",
@@ -147,7 +185,7 @@ function SearchableTextArea({ label, data, searchable, allowCustomValue, require
147
185
  height: "16px",
148
186
  width: "16px",
149
187
  },
150
- }, children: _jsx(MoreHorizontal, { size: 16 }) }), children: label })), _jsx(TextAreaRow, { children: _jsx(StyledTextArea, Object.assign({ placeholder: textAreaPlaceholder || "Enter details about the move", "$minRows": textAreaMinRows, "$maxRows": textAreaMaxRows, "$hasError": hasError, value: textAreaValue, onChange: handleTextAreaChange, onKeyDown: handleTextAreaKeyDown }, textAreaProps)) }), _jsx(SelectBoxWrapper, { ref: selectBoxRef, children: _jsx(StyledSelectBox, Object.assign({ data: data, searchable: searchable, allowCustomValue: allowCustomValue, arrow: false, value: selectValue || undefined, onChange: handleSelectChange, hasError: hasError }, selectProps), selectKey) })] }));
188
+ }, children: _jsx(MoreHorizontal, { size: 16 }) }), children: label })), _jsxs(TextAreaRow, { children: [_jsx(StyledTextArea, Object.assign({ placeholder: textAreaPlaceholder || "Enter details about the move", "$minRows": textAreaMinRows, "$maxRows": textAreaMaxRows, "$hasError": hasError, value: textAreaValue, onChange: handleTextAreaChange }, textAreaProps)), _jsx(SelectBoxWrapper, { ref: selectBoxRef, children: _jsx(StyledSelectBox, Object.assign({ data: data, searchable: searchable, allowCustomValue: allowCustomValue, arrow: false, value: selectValue || undefined, onChange: handleSelectChange, hasError: hasError }, selectProps), selectKey) })] })] }));
151
189
  }
152
- SearchableTextArea.displayName = "SearchableTextArea";
153
- export default SearchableTextArea;
190
+ SelectableTextArea.displayName = "SelectableTextArea";
191
+ export default SelectableTextArea;
@@ -0,0 +1,2 @@
1
+ export { default } from "./SelectableTextArea";
2
+ export type { SelectableTextAreaProps } from "./SelectableTextArea";
@@ -0,0 +1 @@
1
+ export { default } from "./SelectableTextArea";
package/dist/index.d.ts CHANGED
@@ -14,8 +14,8 @@ export type { DropDownItem } from "./DropDownMenu";
14
14
  export { default as DateInput } from "./DateInput";
15
15
  export { default as TextArea } from "./TextArea";
16
16
  export { default as TextAreaInput } from "./TextAreaInput";
17
- export { default as SearchableTextArea } from "./SearchableTextArea";
18
- export type { SearchableTextAreaProps } from "./SearchableTextArea";
17
+ export { default as SelectableTextArea } from "./SelectableTextArea";
18
+ export type { SelectableTextAreaProps } from "./SelectableTextArea";
19
19
  export { default as TagBox } from "./TagBox";
20
20
  export type { TagBoxProps, TagboxOption } from "./TagBox";
21
21
  export { default as FieldLabel } from "./FieldLabel";
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ export { default as DropDownMenu } from "./DropDownMenu";
8
8
  export { default as DateInput } from "./DateInput";
9
9
  export { default as TextArea } from "./TextArea";
10
10
  export { default as TextAreaInput } from "./TextAreaInput";
11
- export { default as SearchableTextArea } from "./SearchableTextArea";
11
+ export { default as SelectableTextArea } from "./SelectableTextArea";
12
12
  export { default as TagBox } from "./TagBox";
13
13
  export { default as FieldLabel } from "./FieldLabel";
14
14
  export { default as Modal } from "./Modal";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monolith-forensics/monolith-ui",
3
- "version": "1.3.92",
3
+ "version": "1.3.95",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "author": "Matt Danner (Monolith Forensics LLC)",
@@ -1,2 +0,0 @@
1
- export { default } from "./SearchableTextArea";
2
- export type { SearchableTextAreaProps } from "./SearchableTextArea";
@@ -1 +0,0 @@
1
- export { default } from "./SearchableTextArea";