@glideappsfinal/glide-data-grid-cells 6.0.9

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 (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -0
  3. package/dist/cjs/cells/article-cell-editor.css +1 -0
  4. package/dist/cjs/cells/article-cell-editor.js +62 -0
  5. package/dist/cjs/cells/article-cell-editor.js.map +1 -0
  6. package/dist/cjs/cells/article-cell-types.js +2 -0
  7. package/dist/cjs/cells/article-cell-types.js.map +1 -0
  8. package/dist/cjs/cells/article-cell.js +46 -0
  9. package/dist/cjs/cells/article-cell.js.map +1 -0
  10. package/dist/cjs/cells/button-cell.js +92 -0
  11. package/dist/cjs/cells/button-cell.js.map +1 -0
  12. package/dist/cjs/cells/date-picker-cell.css +1 -0
  13. package/dist/cjs/cells/date-picker-cell.js +127 -0
  14. package/dist/cjs/cells/date-picker-cell.js.map +1 -0
  15. package/dist/cjs/cells/dropdown-cell.css +3 -0
  16. package/dist/cjs/cells/dropdown-cell.js +206 -0
  17. package/dist/cjs/cells/dropdown-cell.js.map +1 -0
  18. package/dist/cjs/cells/links-cell.css +1 -0
  19. package/dist/cjs/cells/links-cell.js +245 -0
  20. package/dist/cjs/cells/links-cell.js.map +1 -0
  21. package/dist/cjs/cells/multi-select-cell.css +2 -0
  22. package/dist/cjs/cells/multi-select-cell.js +456 -0
  23. package/dist/cjs/cells/multi-select-cell.js.map +1 -0
  24. package/dist/cjs/cells/range-cell.js +101 -0
  25. package/dist/cjs/cells/range-cell.js.map +1 -0
  26. package/dist/cjs/cells/sparkline-cell.js +114 -0
  27. package/dist/cjs/cells/sparkline-cell.js.map +1 -0
  28. package/dist/cjs/cells/spinner-cell.js +22 -0
  29. package/dist/cjs/cells/spinner-cell.js.map +1 -0
  30. package/dist/cjs/cells/star-cell.css +1 -0
  31. package/dist/cjs/cells/star-cell.js +88 -0
  32. package/dist/cjs/cells/star-cell.js.map +1 -0
  33. package/dist/cjs/cells/tags-cell.css +1 -0
  34. package/dist/cjs/cells/tags-cell.js +117 -0
  35. package/dist/cjs/cells/tags-cell.js.map +1 -0
  36. package/dist/cjs/cells/tree-view-cell.js +60 -0
  37. package/dist/cjs/cells/tree-view-cell.js.map +1 -0
  38. package/dist/cjs/cells/user-profile-cell.js +56 -0
  39. package/dist/cjs/cells/user-profile-cell.js.map +1 -0
  40. package/dist/cjs/draw-fns.js +28 -0
  41. package/dist/cjs/draw-fns.js.map +1 -0
  42. package/dist/cjs/index.js +30 -0
  43. package/dist/cjs/index.js.map +1 -0
  44. package/dist/dts/cells/article-cell-editor.d.ts +5 -0
  45. package/dist/dts/cells/article-cell-editor.d.ts.map +1 -0
  46. package/dist/dts/cells/article-cell-types.d.ts +8 -0
  47. package/dist/dts/cells/article-cell-types.d.ts.map +1 -0
  48. package/dist/dts/cells/article-cell.d.ts +5 -0
  49. package/dist/dts/cells/article-cell.d.ts.map +1 -0
  50. package/dist/dts/cells/button-cell.d.ts +17 -0
  51. package/dist/dts/cells/button-cell.d.ts.map +1 -0
  52. package/dist/dts/cells/date-picker-cell.d.ts +19 -0
  53. package/dist/dts/cells/date-picker-cell.d.ts.map +1 -0
  54. package/dist/dts/cells/dropdown-cell.d.ts +14 -0
  55. package/dist/dts/cells/dropdown-cell.d.ts.map +1 -0
  56. package/dist/dts/cells/links-cell.d.ts +20 -0
  57. package/dist/dts/cells/links-cell.d.ts.map +1 -0
  58. package/dist/dts/cells/multi-select-cell.d.ts +43 -0
  59. package/dist/dts/cells/multi-select-cell.d.ts.map +1 -0
  60. package/dist/dts/cells/range-cell.d.ts +15 -0
  61. package/dist/dts/cells/range-cell.d.ts.map +1 -0
  62. package/dist/dts/cells/sparkline-cell.d.ts +14 -0
  63. package/dist/dts/cells/sparkline-cell.d.ts.map +1 -0
  64. package/dist/dts/cells/spinner-cell.d.ts +8 -0
  65. package/dist/dts/cells/spinner-cell.d.ts.map +1 -0
  66. package/dist/dts/cells/star-cell.d.ts +9 -0
  67. package/dist/dts/cells/star-cell.d.ts.map +1 -0
  68. package/dist/dts/cells/tags-cell.d.ts +13 -0
  69. package/dist/dts/cells/tags-cell.d.ts.map +1 -0
  70. package/dist/dts/cells/tree-view-cell.d.ts +15 -0
  71. package/dist/dts/cells/tree-view-cell.d.ts.map +1 -0
  72. package/dist/dts/cells/user-profile-cell.d.ts +12 -0
  73. package/dist/dts/cells/user-profile-cell.d.ts.map +1 -0
  74. package/dist/dts/draw-fns.d.ts +9 -0
  75. package/dist/dts/draw-fns.d.ts.map +1 -0
  76. package/dist/dts/index.d.ts +18 -0
  77. package/dist/dts/index.d.ts.map +1 -0
  78. package/dist/esm/cells/article-cell-editor.css +1 -0
  79. package/dist/esm/cells/article-cell-editor.js +62 -0
  80. package/dist/esm/cells/article-cell-editor.js.map +1 -0
  81. package/dist/esm/cells/article-cell-types.js +2 -0
  82. package/dist/esm/cells/article-cell-types.js.map +1 -0
  83. package/dist/esm/cells/article-cell.js +46 -0
  84. package/dist/esm/cells/article-cell.js.map +1 -0
  85. package/dist/esm/cells/button-cell.js +92 -0
  86. package/dist/esm/cells/button-cell.js.map +1 -0
  87. package/dist/esm/cells/date-picker-cell.css +1 -0
  88. package/dist/esm/cells/date-picker-cell.js +127 -0
  89. package/dist/esm/cells/date-picker-cell.js.map +1 -0
  90. package/dist/esm/cells/dropdown-cell.css +3 -0
  91. package/dist/esm/cells/dropdown-cell.js +206 -0
  92. package/dist/esm/cells/dropdown-cell.js.map +1 -0
  93. package/dist/esm/cells/links-cell.css +1 -0
  94. package/dist/esm/cells/links-cell.js +245 -0
  95. package/dist/esm/cells/links-cell.js.map +1 -0
  96. package/dist/esm/cells/multi-select-cell.css +2 -0
  97. package/dist/esm/cells/multi-select-cell.js +456 -0
  98. package/dist/esm/cells/multi-select-cell.js.map +1 -0
  99. package/dist/esm/cells/range-cell.js +101 -0
  100. package/dist/esm/cells/range-cell.js.map +1 -0
  101. package/dist/esm/cells/sparkline-cell.js +114 -0
  102. package/dist/esm/cells/sparkline-cell.js.map +1 -0
  103. package/dist/esm/cells/spinner-cell.js +22 -0
  104. package/dist/esm/cells/spinner-cell.js.map +1 -0
  105. package/dist/esm/cells/star-cell.css +1 -0
  106. package/dist/esm/cells/star-cell.js +88 -0
  107. package/dist/esm/cells/star-cell.js.map +1 -0
  108. package/dist/esm/cells/tags-cell.css +1 -0
  109. package/dist/esm/cells/tags-cell.js +117 -0
  110. package/dist/esm/cells/tags-cell.js.map +1 -0
  111. package/dist/esm/cells/tree-view-cell.js +60 -0
  112. package/dist/esm/cells/tree-view-cell.js.map +1 -0
  113. package/dist/esm/cells/user-profile-cell.js +56 -0
  114. package/dist/esm/cells/user-profile-cell.js.map +1 -0
  115. package/dist/esm/draw-fns.js +28 -0
  116. package/dist/esm/draw-fns.js.map +1 -0
  117. package/dist/esm/index.js +30 -0
  118. package/dist/esm/index.js.map +1 -0
  119. package/dist/index.css +8 -0
  120. package/package.json +74 -0
@@ -0,0 +1,456 @@
1
+ import * as React from "react";
2
+ import { measureTextCached, getMiddleCenterBias, useTheme, GridCellKind, roundedRect, getLuminance } from "@glideapps/glide-data-grid";
3
+ import { styled } from "@linaria/react";
4
+ import Select, { components } from "react-select";
5
+ import CreatableSelect from "react-select/creatable";
6
+ /* This prefix is used when allowDuplicates is enabled to make sure that
7
+ all underlying values are unique. */
8
+ const VALUE_PREFIX = "__value";
9
+ const VALUE_PREFIX_REGEX = new RegExp(`^${VALUE_PREFIX}\\d+__`);
10
+ const Wrap = /*#__PURE__*/styled('div')({
11
+ name: "Wrap",
12
+ class: "gdg-w1i61rz",
13
+ propsAsIs: false
14
+ });
15
+ const PortalWrap = /*#__PURE__*/styled('div')({
16
+ name: "PortalWrap",
17
+ class: "gdg-phbadu4",
18
+ propsAsIs: false
19
+ });
20
+ /**
21
+ * Prepares the options for usage with the react-select component.
22
+ *
23
+ * @param options The options to prepare.
24
+ * @returns The prepared options in the format required by react-select.
25
+ */
26
+ export const prepareOptions = options => {
27
+ return options.map(option => {
28
+ if (typeof option === "string" || option === null || option === undefined) {
29
+ return {
30
+ value: option,
31
+ label: option ?? "",
32
+ color: undefined
33
+ };
34
+ }
35
+ return {
36
+ value: option.value,
37
+ label: option.label ?? option.value ?? "",
38
+ color: option.color ?? undefined
39
+ };
40
+ });
41
+ };
42
+ /**
43
+ * Resolve a list values to values compatible with react-select.
44
+ * If allowDuplicates is true, the values will be prefixed with a numbered prefix to
45
+ * make sure that all values are unique.
46
+ *
47
+ * @param values The values to resolve.
48
+ * @param options The options to use for the resolution.
49
+ * @param allowDuplicates If true, the values can contain duplicates.
50
+ * @returns The list of values compatible with react-select.
51
+ */
52
+ export const resolveValues = (values, options, allowDuplicates) => {
53
+ if (values === undefined || values === null) {
54
+ return [];
55
+ }
56
+ return values.map((value, index) => {
57
+ const valuePrefix = allowDuplicates ? `${VALUE_PREFIX}${index}__` : "";
58
+ const matchedOption = options.find(option => {
59
+ return option.value === value;
60
+ });
61
+ if (matchedOption) {
62
+ return {
63
+ ...matchedOption,
64
+ value: `${valuePrefix}${matchedOption.value}`
65
+ };
66
+ }
67
+ return {
68
+ value: `${valuePrefix}${value}`,
69
+ label: value
70
+ };
71
+ });
72
+ };
73
+ const CustomMenu = p => {
74
+ const {
75
+ Menu
76
+ } = components;
77
+ const {
78
+ children,
79
+ ...rest
80
+ } = p;
81
+ return React.createElement(Menu, {
82
+ ...rest
83
+ }, children);
84
+ };
85
+ const Editor = p => {
86
+ const {
87
+ value: cell,
88
+ initialValue,
89
+ onChange,
90
+ onFinishedEditing,
91
+ portalElementRef
92
+ } = p;
93
+ const {
94
+ options: optionsIn,
95
+ values: valuesIn,
96
+ allowCreation,
97
+ allowDuplicates
98
+ } = cell.data;
99
+ const theme = useTheme();
100
+ const [value, setValue] = React.useState(valuesIn);
101
+ const [menuOpen, setMenuOpen] = React.useState(true);
102
+ const [inputValue, setInputValue] = React.useState(initialValue ?? "");
103
+ const options = React.useMemo(() => {
104
+ return prepareOptions(optionsIn ?? []);
105
+ }, [optionsIn]);
106
+ const menuDisabled = allowCreation && allowDuplicates && options.length === 0;
107
+ // Prevent the grid from handling the keydown as long as the menu is open:
108
+ // This allows usage of enter without triggering the grid to finish editing.
109
+ const onKeyDown = React.useCallback(e => {
110
+ if (menuOpen) {
111
+ e.stopPropagation();
112
+ }
113
+ }, [menuOpen]);
114
+ // Apply styles to the react-select component.
115
+ // All components: https://react-select.com/components
116
+ const colorStyles = {
117
+ control: (base, state) => ({
118
+ ...base,
119
+ border: 0,
120
+ boxShadow: "none",
121
+ backgroundColor: theme.bgCell,
122
+ // Allow interaction (e.g. wheel scrolling) even when the select is disabled
123
+ pointerEvents: state.isDisabled ? "auto" : base.pointerEvents,
124
+ cursor: state.isDisabled ? "default" : base.cursor
125
+ }),
126
+ valueContainer: base => ({
127
+ ...base,
128
+ // Keep default wrapping so multiple chips can move to new lines
129
+ flexWrap: base.flexWrap ?? "wrap",
130
+ overflowX: "auto",
131
+ overflowY: "hidden"
132
+ }),
133
+ menu: styles => ({
134
+ ...styles,
135
+ backgroundColor: theme.bgCell
136
+ }),
137
+ option: (styles, state) => {
138
+ return {
139
+ ...styles,
140
+ fontSize: theme.editorFontSize,
141
+ fontFamily: theme.fontFamily,
142
+ color: theme.textDark,
143
+ ...(state.isFocused ? {
144
+ backgroundColor: theme.accentLight,
145
+ cursor: "pointer"
146
+ } : {}),
147
+ ":active": {
148
+ ...styles[":active"],
149
+ color: theme.accentFg,
150
+ backgroundColor: theme.accentColor
151
+ }
152
+ };
153
+ },
154
+ input: (styles, {
155
+ isDisabled
156
+ }) => {
157
+ if (isDisabled) {
158
+ return {
159
+ display: "none"
160
+ };
161
+ }
162
+ return {
163
+ ...styles,
164
+ fontSize: theme.editorFontSize,
165
+ fontFamily: theme.fontFamily,
166
+ color: theme.textDark
167
+ };
168
+ },
169
+ placeholder: styles => {
170
+ return {
171
+ ...styles,
172
+ fontSize: theme.editorFontSize,
173
+ fontFamily: theme.fontFamily,
174
+ color: theme.textLight
175
+ };
176
+ },
177
+ noOptionsMessage: styles => {
178
+ return {
179
+ ...styles,
180
+ fontSize: theme.editorFontSize,
181
+ fontFamily: theme.fontFamily,
182
+ color: theme.textLight
183
+ };
184
+ },
185
+ clearIndicator: styles => {
186
+ return {
187
+ ...styles,
188
+ color: theme.textLight,
189
+ ":hover": {
190
+ color: theme.textDark,
191
+ cursor: "pointer"
192
+ }
193
+ };
194
+ },
195
+ multiValue: (styles, {
196
+ data
197
+ }) => {
198
+ return {
199
+ ...styles,
200
+ backgroundColor: data.color ?? theme.bgBubble,
201
+ borderRadius: `${theme.roundingRadius ?? theme.bubbleHeight / 2}px`,
202
+ flexShrink: 0,
203
+ whiteSpace: "nowrap"
204
+ };
205
+ },
206
+ multiValueLabel: (styles, {
207
+ data,
208
+ isDisabled
209
+ }) => {
210
+ return {
211
+ ...styles,
212
+ paddingRight: isDisabled ? theme.bubblePadding : 0,
213
+ paddingLeft: theme.bubblePadding,
214
+ paddingTop: 0,
215
+ paddingBottom: 0,
216
+ color: data.color ?
217
+ // If a color is set for this option,
218
+ // we use it to determine the text color.
219
+ getLuminance(data.color) > 0.5 ? "black" : "white" : theme.textBubble,
220
+ fontSize: theme.editorFontSize,
221
+ fontFamily: theme.fontFamily,
222
+ justifyContent: "center",
223
+ alignItems: "center",
224
+ display: "flex",
225
+ height: theme.bubbleHeight,
226
+ whiteSpace: "nowrap"
227
+ };
228
+ },
229
+ multiValueRemove: (styles, {
230
+ data,
231
+ isDisabled,
232
+ isFocused
233
+ }) => {
234
+ if (isDisabled) {
235
+ return {
236
+ display: "none"
237
+ };
238
+ }
239
+ return {
240
+ ...styles,
241
+ color: data.color ?
242
+ // If a color is set for this option,
243
+ // we use it to determine the text color.
244
+ getLuminance(data.color) > 0.5 ? "black" : "white" : theme.textBubble,
245
+ backgroundColor: undefined,
246
+ borderRadius: isFocused ? `${theme.roundingRadius ?? theme.bubbleHeight / 2}px` : undefined,
247
+ ":hover": {
248
+ cursor: "pointer"
249
+ }
250
+ };
251
+ }
252
+ };
253
+ // This is used to submit the values to the grid.
254
+ const submitValues = React.useCallback(values => {
255
+ // Change the list of values to the actual values by removing the prefix.
256
+ // This is only relevant in the case of allowDuplicates being true.
257
+ const mappedValues = values.map(v => {
258
+ return allowDuplicates && v.startsWith(VALUE_PREFIX) ? v.replace(new RegExp(VALUE_PREFIX_REGEX), "") : v;
259
+ });
260
+ setValue(mappedValues);
261
+ onChange({
262
+ ...cell,
263
+ data: {
264
+ ...cell.data,
265
+ values: mappedValues
266
+ }
267
+ });
268
+ }, [cell, onChange, allowDuplicates]);
269
+ const handleKeyDown = event => {
270
+ switch (event.key) {
271
+ case "Enter":
272
+ case "Tab":
273
+ if (!inputValue) {
274
+ // If the user pressed enter or tab without entering anything,
275
+ // we finish editing based on the current state.
276
+ onFinishedEditing(cell, [0, 1]);
277
+ return;
278
+ }
279
+ if (allowDuplicates && allowCreation) {
280
+ // This is a workaround to allow the user to enter new values
281
+ // multiple times.
282
+ setInputValue("");
283
+ submitValues([...(value ?? []), inputValue]);
284
+ setMenuOpen(false);
285
+ event.preventDefault();
286
+ }
287
+ }
288
+ };
289
+ const SelectComponent = allowCreation ? CreatableSelect : Select;
290
+ return React.createElement(Wrap, {
291
+ onKeyDown: onKeyDown,
292
+ "data-testid": "multi-select-cell"
293
+ }, React.createElement(SelectComponent, {
294
+ className: "gdg-multi-select",
295
+ isMulti: true,
296
+ isDisabled: cell.readonly,
297
+ isClearable: true,
298
+ isSearchable: true,
299
+ inputValue: inputValue,
300
+ onInputChange: setInputValue,
301
+ options: options,
302
+ placeholder: cell.readonly ? "" : allowCreation ? "Add..." : undefined,
303
+ noOptionsMessage: input => {
304
+ return allowCreation && allowDuplicates && input.inputValue ? `Create "${input.inputValue}"` : undefined;
305
+ },
306
+ menuIsOpen: cell.readonly ? false : menuOpen,
307
+ onMenuOpen: () => setMenuOpen(true),
308
+ onMenuClose: () => setMenuOpen(false),
309
+ value: resolveValues(value, options, allowDuplicates),
310
+ onKeyDown: cell.readonly ? undefined : handleKeyDown,
311
+ menuPlacement: "auto",
312
+ menuPortalTarget: portalElementRef?.current ?? document.getElementById("portal"),
313
+ autoFocus: true,
314
+ openMenuOnFocus: true,
315
+ openMenuOnClick: true,
316
+ closeMenuOnSelect: true,
317
+ backspaceRemovesValue: true,
318
+ escapeClearsValue: false,
319
+ styles: colorStyles,
320
+ components: {
321
+ DropdownIndicator: () => null,
322
+ IndicatorSeparator: () => null,
323
+ Menu: props => {
324
+ if (menuDisabled) {
325
+ return null;
326
+ }
327
+ return React.createElement(PortalWrap, null, React.createElement(CustomMenu, {
328
+ className: "click-outside-ignore",
329
+ ...props
330
+ }));
331
+ }
332
+ },
333
+ onChange: async e => {
334
+ if (e === null) {
335
+ return;
336
+ }
337
+ submitValues(e.map(x => x.value));
338
+ }
339
+ }));
340
+ };
341
+ const renderer = {
342
+ kind: GridCellKind.Custom,
343
+ isMatch: c => c.data.kind === "multi-select-cell",
344
+ draw: (args, cell) => {
345
+ const {
346
+ ctx,
347
+ theme,
348
+ rect,
349
+ highlighted
350
+ } = args;
351
+ const {
352
+ values,
353
+ options: optionsIn
354
+ } = cell.data;
355
+ if (values === undefined || values === null) {
356
+ return true;
357
+ }
358
+ const options = prepareOptions(optionsIn ?? []);
359
+ const drawArea = {
360
+ x: rect.x + theme.cellHorizontalPadding,
361
+ y: rect.y + theme.cellVerticalPadding,
362
+ width: rect.width - 2 * theme.cellHorizontalPadding,
363
+ height: rect.height - 2 * theme.cellVerticalPadding
364
+ };
365
+ const rows = Math.max(1, Math.floor(drawArea.height / (theme.bubbleHeight + theme.bubblePadding)));
366
+ let {
367
+ x
368
+ } = drawArea;
369
+ let row = 1;
370
+ let y = rows === 1 ? drawArea.y + (drawArea.height - theme.bubbleHeight) / 2 : drawArea.y + (drawArea.height - rows * theme.bubbleHeight - (rows - 1) * theme.bubblePadding) / 2;
371
+ for (const value of values) {
372
+ const matchedOption = options.find(t => t.value === value);
373
+ const color = matchedOption?.color ?? (highlighted ? theme.bgBubbleSelected : theme.bgBubble);
374
+ const displayText = matchedOption?.label ?? value;
375
+ const metrics = measureTextCached(displayText, ctx);
376
+ const width = metrics.width + theme.bubblePadding * 2;
377
+ const textY = theme.bubbleHeight / 2;
378
+ if (x !== drawArea.x && x + width > drawArea.x + drawArea.width && row < rows) {
379
+ row++;
380
+ y += theme.bubbleHeight + theme.bubblePadding;
381
+ x = drawArea.x;
382
+ }
383
+ ctx.fillStyle = color;
384
+ ctx.beginPath();
385
+ roundedRect(ctx, x, y, width, theme.bubbleHeight, theme.roundingRadius ?? theme.bubbleHeight / 2);
386
+ ctx.fill();
387
+ // If a color is set for this option, we use either black or white as the text color depending on the background.
388
+ // Otherwise, use the configured textBubble color.
389
+ ctx.fillStyle = matchedOption?.color ? getLuminance(color) > 0.5 ? "#000000" : "#ffffff" : theme.textBubble;
390
+ ctx.fillText(displayText, x + theme.bubblePadding, y + textY + getMiddleCenterBias(ctx, theme));
391
+ x += width + theme.bubbleMargin;
392
+ if (x > drawArea.x + drawArea.width + theme.cellHorizontalPadding && row >= rows) {
393
+ break;
394
+ }
395
+ }
396
+ return true;
397
+ },
398
+ measure: (ctx, cell, theme) => {
399
+ const {
400
+ values,
401
+ options
402
+ } = cell.data;
403
+ if (!values) {
404
+ return theme.cellHorizontalPadding * 2;
405
+ }
406
+ // Resolve the values to the actual display labels:
407
+ const labels = resolveValues(values, prepareOptions(options ?? []), cell.data.allowDuplicates).map(x => x.label ?? x.value);
408
+ const bubblesWidth = labels.reduce((acc, data) => ctx.measureText(data).width + acc + theme.bubblePadding * 2 + theme.bubbleMargin, 0);
409
+ if (labels.length === 0) {
410
+ return theme.cellHorizontalPadding * 2;
411
+ }
412
+ return bubblesWidth + 2 * theme.cellHorizontalPadding - theme.bubbleMargin;
413
+ },
414
+ provideEditor: () => ({
415
+ editor: Editor,
416
+ disablePadding: true,
417
+ deletedValue: v => ({
418
+ ...v,
419
+ copyData: "",
420
+ data: {
421
+ ...v.data,
422
+ values: []
423
+ }
424
+ })
425
+ }),
426
+ onPaste: (val, cell) => {
427
+ if (!val || !val.trim()) {
428
+ // Empty values should result in empty strings
429
+ return {
430
+ ...cell,
431
+ values: []
432
+ };
433
+ }
434
+ let values = val.split(",").map(s => s.trim());
435
+ if (!cell.allowDuplicates) {
436
+ // Remove all duplicates
437
+ values = values.filter((v, index) => values.indexOf(v) === index);
438
+ }
439
+ if (!cell.allowCreation) {
440
+ // Only allow values that are part of the options:
441
+ const options = prepareOptions(cell.options ?? []);
442
+ values = values.filter(v => options.find(o => o.value === v));
443
+ }
444
+ if (values.length === 0) {
445
+ // We were not able to parse any values, return undefined to
446
+ // not change the cell value.
447
+ return undefined;
448
+ }
449
+ return {
450
+ ...cell,
451
+ values
452
+ };
453
+ }
454
+ };
455
+ export default renderer;
456
+
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-select-cell.js","sourceRoot":"","sources":["../../../src/cells/multi-select-cell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import { measureTextCached, getMiddleCenterBias, GridCellKind, getEmHeight, } from "@glideapps/glide-data-grid";
2
+ import * as React from "react";
3
+ import { roundedRect } from "../draw-fns.js";
4
+ function adaptFontSize(font, percentage) {
5
+ const regex = /(\d+\.?\d*)\s*(px|rem|em|%|pt)/;
6
+ const match = font.match(regex);
7
+ if (match) {
8
+ const value = parseFloat(match[1]);
9
+ const unit = match[2];
10
+ const scaledValue = value * percentage;
11
+ return font.replace(regex, `${Number(scaledValue.toPrecision(3))}${unit}`);
12
+ }
13
+ return font;
14
+ }
15
+ const inputStyle = {
16
+ marginRight: 8,
17
+ };
18
+ const wrapperStyle = {
19
+ display: "flex",
20
+ alignItems: "center",
21
+ flexGrow: 1,
22
+ };
23
+ const renderer = {
24
+ kind: GridCellKind.Custom,
25
+ isMatch: (c) => c.data.kind === "range-cell",
26
+ draw: (args, cell) => {
27
+ const { ctx, theme, rect } = args;
28
+ const { min, max, value, label, measureLabel, color } = cell.data;
29
+ const x = rect.x + theme.cellHorizontalPadding;
30
+ const yMid = rect.y + rect.height / 2;
31
+ const rangeSize = max - min;
32
+ const fillRatio = (value - min) / rangeSize;
33
+ // Only use 90% of the base font size for the label
34
+ const labelFont = `${adaptFontSize(theme.baseFontStyle, 0.9)} ${theme.fontFamily}`;
35
+ const emHeight = getEmHeight(ctx, labelFont);
36
+ const rangeHeight = emHeight / 2;
37
+ ctx.save();
38
+ let labelWidth = 0;
39
+ if (label !== undefined) {
40
+ ctx.font = labelFont; // fixme this is slow
41
+ labelWidth = measureTextCached(measureLabel ?? label, ctx, labelFont).width + theme.cellHorizontalPadding;
42
+ }
43
+ const rangeWidth = rect.width - theme.cellHorizontalPadding * 2 - labelWidth;
44
+ if (rangeWidth >= rangeHeight) {
45
+ const gradient = ctx.createLinearGradient(x, yMid, x + rangeWidth, yMid);
46
+ const fillColor = color ?? theme.accentColor;
47
+ gradient.addColorStop(0, fillColor);
48
+ gradient.addColorStop(fillRatio, fillColor);
49
+ gradient.addColorStop(fillRatio, theme.bgBubble);
50
+ gradient.addColorStop(1, theme.bgBubble);
51
+ ctx.beginPath();
52
+ ctx.fillStyle = gradient;
53
+ roundedRect(ctx, x, yMid - rangeHeight / 2, rangeWidth, rangeHeight, rangeHeight / 2);
54
+ ctx.fill();
55
+ ctx.beginPath();
56
+ roundedRect(ctx, x + 0.5, yMid - rangeHeight / 2 + 0.5, rangeWidth - 1, rangeHeight - 1, (rangeHeight - 1) / 2);
57
+ ctx.strokeStyle = theme.accentLight;
58
+ ctx.lineWidth = 1;
59
+ ctx.stroke();
60
+ }
61
+ if (label !== undefined) {
62
+ ctx.textAlign = "right";
63
+ ctx.fillStyle = theme.textDark;
64
+ ctx.fillText(label, rect.x + rect.width - theme.cellHorizontalPadding, yMid + getMiddleCenterBias(ctx, labelFont));
65
+ }
66
+ ctx.restore();
67
+ return true;
68
+ },
69
+ provideEditor: () => {
70
+ // eslint-disable-next-line react/display-name
71
+ return p => {
72
+ const { data, readonly } = p.value;
73
+ const strValue = data.value.toString();
74
+ const strMin = data.min.toString();
75
+ const strMax = data.max.toString();
76
+ const strStep = data.step.toString();
77
+ const onChange = (e) => {
78
+ p.onChange({
79
+ ...p.value,
80
+ data: {
81
+ ...data,
82
+ value: Number(e.target.value),
83
+ },
84
+ });
85
+ };
86
+ return (React.createElement("label", { style: wrapperStyle },
87
+ React.createElement("input", { style: inputStyle, type: "range", value: strValue, min: strMin, max: strMax, step: strStep, onChange: onChange, disabled: readonly }),
88
+ strValue));
89
+ };
90
+ },
91
+ onPaste: (v, d) => {
92
+ let num = Number.parseFloat(v);
93
+ num = Number.isNaN(num) ? d.value : Math.max(d.min, Math.min(d.max, num));
94
+ return {
95
+ ...d,
96
+ value: num,
97
+ };
98
+ },
99
+ };
100
+ export default renderer;
101
+ //# sourceMappingURL=range-cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-cell.js","sourceRoot":"","sources":["../../../src/cells/range-cell.tsx"],"names":[],"mappings":"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"}