@deephaven/iris-grid 0.26.2-beta.2 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/IrisGrid.d.ts.map +1 -1
- package/dist/IrisGrid.js +5 -1
- package/dist/IrisGrid.js.map +1 -1
- package/dist/mousehandlers/IrisGridContextMenuHandler.d.ts +1 -1
- package/dist/mousehandlers/IrisGridContextMenuHandler.d.ts.map +1 -1
- package/dist/mousehandlers/IrisGridContextMenuHandler.js +16 -14
- package/dist/mousehandlers/IrisGridContextMenuHandler.js.map +1 -1
- package/dist/sidebar/CustomColumnBuilder.d.ts +2 -7
- package/dist/sidebar/CustomColumnBuilder.d.ts.map +1 -1
- package/dist/sidebar/CustomColumnBuilder.js +39 -14
- package/dist/sidebar/CustomColumnBuilder.js.map +1 -1
- package/dist/sidebar/CustomColumnInput.d.ts +4 -20
- package/dist/sidebar/CustomColumnInput.d.ts.map +1 -1
- package/dist/sidebar/CustomColumnInput.js +80 -91
- package/dist/sidebar/CustomColumnInput.js.map +1 -1
- package/dist/sidebar/InputEditor.d.ts +2 -2
- package/dist/sidebar/InputEditor.d.ts.map +1 -1
- package/dist/sidebar/InputEditor.js +9 -8
- package/dist/sidebar/InputEditor.js.map +1 -1
- package/package.json +15 -15
|
@@ -8,7 +8,7 @@ type Input = {
|
|
|
8
8
|
name: string;
|
|
9
9
|
formula: string;
|
|
10
10
|
};
|
|
11
|
-
interface CustomColumnBuilderProps {
|
|
11
|
+
export interface CustomColumnBuilderProps {
|
|
12
12
|
model: IrisGridModel;
|
|
13
13
|
customColumns: string[];
|
|
14
14
|
onSave: (columns: string[]) => void;
|
|
@@ -23,11 +23,6 @@ interface CustomColumnBuilderState {
|
|
|
23
23
|
}
|
|
24
24
|
declare class CustomColumnBuilder extends Component<CustomColumnBuilderProps, CustomColumnBuilderState> {
|
|
25
25
|
static SUCCESS_SHOW_DURATION: number;
|
|
26
|
-
static defaultProps: {
|
|
27
|
-
customColumns: never[];
|
|
28
|
-
onSave: () => void;
|
|
29
|
-
onCancel: () => void;
|
|
30
|
-
};
|
|
31
26
|
static makeCustomColumnInputEventKey(): string;
|
|
32
27
|
static createCustomColumnInput(): Input;
|
|
33
28
|
constructor(props: CustomColumnBuilderProps);
|
|
@@ -52,7 +47,7 @@ declare class CustomColumnBuilder extends Component<CustomColumnBuilderProps, Cu
|
|
|
52
47
|
resetRequestFailed(): void;
|
|
53
48
|
renderInputs(): ReactElement[];
|
|
54
49
|
renderSaveButton(): ReactElement;
|
|
55
|
-
render():
|
|
50
|
+
render(): JSX.Element;
|
|
56
51
|
}
|
|
57
52
|
export default CustomColumnBuilder;
|
|
58
53
|
//# sourceMappingURL=CustomColumnBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomColumnBuilder.d.ts","sourceRoot":"","sources":["../../src/sidebar/CustomColumnBuilder.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAIvD,OAAO,EAA8B,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"CustomColumnBuilder.d.ts","sourceRoot":"","sources":["../../src/sidebar/CustomColumnBuilder.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAIvD,OAAO,EAA8B,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAM7E,OAAO,4BAA4B,CAAC;AACpC,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAE7C,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;AAE9D,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AACF,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,UAAU,wBAAwB;IAChC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,sBAAsB,EAAE,OAAO,CAAC;IAChC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AACD,cAAM,mBAAoB,SAAQ,SAAS,CACzC,wBAAwB,EACxB,wBAAwB,CACzB;IACC,MAAM,CAAC,qBAAqB,SAAO;IAEnC,MAAM,CAAC,6BAA6B,IAAI,MAAM;IAI9C,MAAM,CAAC,uBAAuB,IAAI,KAAK;gBAQ3B,KAAK,EAAE,wBAAwB;IAyB3C,iBAAiB,IAAI,IAAI;IAMzB,oBAAoB,IAAI,IAAI;IAO5B,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IAEjC,kBAAkB,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;IAEzD,QAAQ,WAAoB,KAAK,EAAE,OAAO,MAAM,uBAE9C;IAEF,aAAa,WAAoB,KAAK,EAAE,OAAO,MAAM,YAEnD;IAEF,iBAAiB,IAAI,IAAI;IAIzB,cAAc,IAAI,IAAI;IAgBtB,aAAa,IAAI,IAAI;IAgBrB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI;IAkBjD,oBAAoB,IAAI,IAAI;IAS5B,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAa1C,iBAAiB,CACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,GACZ,IAAI;IAeP,yBAAyB,IAAI,IAAI;IAgBjC,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IA0BvC,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAmBvC,yBAAyB,CAAC,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAsB5E,eAAe,IAAI,IAAI;IAsBvB,kBAAkB,IAAI,IAAI;IAS1B,YAAY,IAAI,YAAY,EAAE;IA4B9B,gBAAgB,IAAI,YAAY;IAyChC,MAAM,IAAI,GAAG,CAAC,OAAO;CA2DtB;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -12,6 +12,7 @@ import { DragDropContext, Droppable } from 'react-beautiful-dnd';
|
|
|
12
12
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
13
13
|
import { Button, DragUtils, LoadingSpinner } from '@deephaven/components';
|
|
14
14
|
import { dhNewCircleLargeFilled, vsWarning, vsPass } from '@deephaven/icons';
|
|
15
|
+
import { DbNameValidator } from '@deephaven/utils';
|
|
15
16
|
import CustomColumnInput from "./CustomColumnInput.js";
|
|
16
17
|
import "./CustomColumnBuilder.css";
|
|
17
18
|
import IrisGridModel from "../IrisGridModel.js";
|
|
@@ -203,12 +204,12 @@ class CustomColumnBuilder extends Component {
|
|
|
203
204
|
// focus on drag handle
|
|
204
205
|
if (shiftKey) {
|
|
205
206
|
var _this$container;
|
|
206
|
-
((_this$container = this.container) === null || _this$container === void 0 ? void 0 : _this$container.querySelectorAll(
|
|
207
|
+
((_this$container = this.container) === null || _this$container === void 0 ? void 0 : _this$container.querySelectorAll('.btn-drag-handle')[focusEditorIndex]).focus();
|
|
207
208
|
return;
|
|
208
209
|
}
|
|
209
210
|
if (focusEditorIndex === inputs.length - 1) {
|
|
210
|
-
var _this$container2;
|
|
211
|
-
(
|
|
211
|
+
var _this$container2, _this$container2$quer;
|
|
212
|
+
(_this$container2 = this.container) === null || _this$container2 === void 0 ? void 0 : (_this$container2$quer = _this$container2.querySelector('.btn-add-column')) === null || _this$container2$quer === void 0 ? void 0 : _this$container2$quer.focus();
|
|
212
213
|
} else {
|
|
213
214
|
var _this$container3;
|
|
214
215
|
// focus on next column name input
|
|
@@ -218,7 +219,8 @@ class CustomColumnBuilder extends Component {
|
|
|
218
219
|
}
|
|
219
220
|
handleSaveClick() {
|
|
220
221
|
var {
|
|
221
|
-
onSave
|
|
222
|
+
onSave,
|
|
223
|
+
customColumns: originalCustomColumns
|
|
222
224
|
} = this.props;
|
|
223
225
|
var {
|
|
224
226
|
inputs,
|
|
@@ -239,7 +241,8 @@ class CustomColumnBuilder extends Component {
|
|
|
239
241
|
});
|
|
240
242
|
this.resetErrorMessage();
|
|
241
243
|
this.setState({
|
|
242
|
-
|
|
244
|
+
// If both are 0, then moving from no custom to no custom. The parent won't re-render to cancel the loading state
|
|
245
|
+
isCustomColumnApplying: customColumns.length > 0 || originalCustomColumns.length > 0
|
|
243
246
|
});
|
|
244
247
|
onSave(customColumns);
|
|
245
248
|
}
|
|
@@ -261,12 +264,22 @@ class CustomColumnBuilder extends Component {
|
|
|
261
264
|
inputs,
|
|
262
265
|
hasRequestFailed
|
|
263
266
|
} = this.state;
|
|
267
|
+
var nameCount = new Map();
|
|
268
|
+
inputs.forEach(_ref2 => {
|
|
269
|
+
var _nameCount$get;
|
|
270
|
+
var {
|
|
271
|
+
name
|
|
272
|
+
} = _ref2;
|
|
273
|
+
return nameCount.set(name, ((_nameCount$get = nameCount.get(name)) !== null && _nameCount$get !== void 0 ? _nameCount$get : 0) + 1);
|
|
274
|
+
});
|
|
264
275
|
return inputs.map((input, index) => {
|
|
276
|
+
var _nameCount$get2;
|
|
265
277
|
var {
|
|
266
278
|
eventKey,
|
|
267
279
|
name,
|
|
268
280
|
formula
|
|
269
281
|
} = input;
|
|
282
|
+
var isDuplicate = ((_nameCount$get2 = nameCount.get(name)) !== null && _nameCount$get2 !== void 0 ? _nameCount$get2 : 0) > 1;
|
|
270
283
|
return /*#__PURE__*/React.createElement(CustomColumnInput, {
|
|
271
284
|
key: eventKey,
|
|
272
285
|
inputIndex: index,
|
|
@@ -276,7 +289,8 @@ class CustomColumnBuilder extends Component {
|
|
|
276
289
|
onChange: this.handleInputChange,
|
|
277
290
|
onDeleteColumn: this.handleDeleteColumn,
|
|
278
291
|
onTabInEditor: this.handleEditorTabNavigation,
|
|
279
|
-
invalid: hasRequestFailed
|
|
292
|
+
invalid: hasRequestFailed,
|
|
293
|
+
isDuplicate: isDuplicate
|
|
280
294
|
});
|
|
281
295
|
});
|
|
282
296
|
}
|
|
@@ -287,17 +301,33 @@ class CustomColumnBuilder extends Component {
|
|
|
287
301
|
isSuccessShowing
|
|
288
302
|
} = this.state;
|
|
289
303
|
var saveText = inputs.length > 1 ? 'Save Columns' : 'Save Column';
|
|
304
|
+
var areNamesValid = inputs.every(_ref3 => {
|
|
305
|
+
var {
|
|
306
|
+
name
|
|
307
|
+
} = _ref3;
|
|
308
|
+
return name === '' || DbNameValidator.isValidColumnName(name);
|
|
309
|
+
});
|
|
310
|
+
var filteredNames = inputs.filter(_ref4 => {
|
|
311
|
+
var {
|
|
312
|
+
name
|
|
313
|
+
} = _ref4;
|
|
314
|
+
return name !== '';
|
|
315
|
+
}).map(_ref5 => {
|
|
316
|
+
var {
|
|
317
|
+
name
|
|
318
|
+
} = _ref5;
|
|
319
|
+
return name;
|
|
320
|
+
});
|
|
321
|
+
var areNamesUnique = new Set(filteredNames).size === filteredNames.length;
|
|
290
322
|
return /*#__PURE__*/React.createElement(Button, {
|
|
291
323
|
kind: isSuccessShowing ? 'success' : 'primary',
|
|
292
324
|
className: classNames('btn-apply', {
|
|
293
325
|
'btn-spinner': isCustomColumnApplying
|
|
294
326
|
}),
|
|
295
|
-
disabled: isSuccessShowing || isCustomColumnApplying,
|
|
327
|
+
disabled: isSuccessShowing || isCustomColumnApplying || !areNamesValid || !areNamesUnique,
|
|
296
328
|
onClick: this.handleSaveClick
|
|
297
329
|
}, isCustomColumnApplying && /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(LoadingSpinner, null), /*#__PURE__*/React.createElement("span", {
|
|
298
330
|
className: "btn-normal-content"
|
|
299
|
-
}, "Applying"), /*#__PURE__*/React.createElement("span", {
|
|
300
|
-
className: "btn-hover-content"
|
|
301
331
|
}, "Applying")), !isSuccessShowing && !isCustomColumnApplying && saveText, isSuccessShowing && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
302
332
|
icon: vsPass
|
|
303
333
|
}), " Success"));
|
|
@@ -350,10 +380,5 @@ class CustomColumnBuilder extends Component {
|
|
|
350
380
|
}
|
|
351
381
|
}
|
|
352
382
|
_defineProperty(CustomColumnBuilder, "SUCCESS_SHOW_DURATION", 750);
|
|
353
|
-
_defineProperty(CustomColumnBuilder, "defaultProps", {
|
|
354
|
-
customColumns: [],
|
|
355
|
-
onSave: () => undefined,
|
|
356
|
-
onCancel: () => undefined
|
|
357
|
-
});
|
|
358
383
|
export default CustomColumnBuilder;
|
|
359
384
|
//# sourceMappingURL=CustomColumnBuilder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomColumnBuilder.js","names":["React","Component","classNames","shortid","memoize","DragDropContext","Droppable","FontAwesomeIcon","Button","DragUtils","LoadingSpinner","dhNewCircleLargeFilled","vsWarning","vsPass","CustomColumnInput","IrisGridModel","CustomColumnBuilder","makeCustomColumnInputEventKey","generate","createCustomColumnInput","eventKey","name","formula","constructor","props","inputs","key","find","input","findIndex","handleAddColumnClick","bind","handleSaveClick","handleInputChange","handleDeleteColumn","handleCustomColumnUpdated","handleRequestFailed","handleDragEnd","resetRequestFailed","handleEditorTabNavigation","state","isCustomColumnApplying","errorMessage","hasRequestFailed","isSuccessShowing","container","successButtonTimer","componentDidMount","customColumns","parseCustomColumns","startListening","componentWillUnmount","stopListening","clearTimeout","resetErrorMessage","setState","model","addEventListener","EVENT","COLUMNS_CHANGED","UPDATED","REQUEST_FAILED","removeEventListener","length","customColumnInputs","map","customColumn","split","newInputs","push","customColumnIndex","getInputIndex","splice","type","value","customColumnInput","getInput","newCustomInput","setTimeout","SUCCESS_SHOW_DURATION","event","customEvent","detail","JSON","stringify","configuration","result","stopDragging","destination","sourceIndex","source","index","destinationIndex","sourceInput","focusEditorIndex","shiftKey","querySelectorAll","focus","nextFocusIndex","onSave","forEach","renderInputs","renderSaveButton","saveText","render","onCancel","startDragging","provided","snapshot","innerRef","droppableProps","dragging","draggingFromThisWith","placeholder","undefined"],"sources":["../../src/sidebar/CustomColumnBuilder.tsx"],"sourcesContent":["import React, { Component, ReactElement } from 'react';\nimport classNames from 'classnames';\nimport shortid from 'shortid';\nimport memoize from 'memoize-one';\nimport { DragDropContext, Droppable, DropResult } from 'react-beautiful-dnd';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, DragUtils, LoadingSpinner } from '@deephaven/components';\nimport { dhNewCircleLargeFilled, vsWarning, vsPass } from '@deephaven/icons';\nimport CustomColumnInput from './CustomColumnInput';\nimport './CustomColumnBuilder.scss';\nimport IrisGridModel from '../IrisGridModel';\n\nexport type CustomColumnKey = 'eventKey' | 'name' | 'formula';\n\ntype Input = {\n eventKey: string;\n name: string;\n formula: string;\n};\ninterface CustomColumnBuilderProps {\n model: IrisGridModel;\n customColumns: string[];\n onSave: (columns: string[]) => void;\n onCancel: () => void;\n}\n\ninterface CustomColumnBuilderState {\n inputs: Input[];\n isCustomColumnApplying: boolean;\n errorMessage: ReactElement | null;\n hasRequestFailed: boolean;\n isSuccessShowing: boolean;\n}\nclass CustomColumnBuilder extends Component<\n CustomColumnBuilderProps,\n CustomColumnBuilderState\n> {\n static SUCCESS_SHOW_DURATION = 750;\n\n static defaultProps = {\n customColumns: [],\n onSave: (): void => undefined,\n onCancel: (): void => undefined,\n };\n\n static makeCustomColumnInputEventKey(): string {\n return shortid.generate();\n }\n\n static createCustomColumnInput(): Input {\n return {\n eventKey: shortid.generate(),\n name: '',\n formula: '',\n };\n }\n\n constructor(props: CustomColumnBuilderProps) {\n super(props);\n\n this.handleAddColumnClick = this.handleAddColumnClick.bind(this);\n this.handleSaveClick = this.handleSaveClick.bind(this);\n this.handleInputChange = this.handleInputChange.bind(this);\n this.handleDeleteColumn = this.handleDeleteColumn.bind(this);\n this.handleCustomColumnUpdated = this.handleCustomColumnUpdated.bind(this);\n this.handleRequestFailed = this.handleRequestFailed.bind(this);\n this.handleDragEnd = this.handleDragEnd.bind(this);\n this.resetRequestFailed = this.resetRequestFailed.bind(this);\n\n this.handleEditorTabNavigation = this.handleEditorTabNavigation.bind(this);\n\n this.state = {\n inputs: [],\n isCustomColumnApplying: false,\n errorMessage: null,\n hasRequestFailed: false,\n isSuccessShowing: false,\n };\n this.container = null;\n this.successButtonTimer = null;\n }\n\n componentDidMount(): void {\n const { customColumns } = this.props;\n this.parseCustomColumns(customColumns);\n this.startListening();\n }\n\n componentWillUnmount(): void {\n this.stopListening();\n if (this.successButtonTimer) {\n clearTimeout(this.successButtonTimer);\n }\n }\n\n container: HTMLDivElement | null;\n\n successButtonTimer: ReturnType<typeof setTimeout> | null;\n\n getInput = memoize((inputs: Input[], key: string) =>\n inputs.find(input => input.eventKey === key)\n );\n\n getInputIndex = memoize((inputs: Input[], key: string) =>\n inputs.findIndex(input => input.eventKey === key)\n );\n\n resetErrorMessage(): void {\n this.setState({ errorMessage: null });\n }\n\n startListening(): void {\n const { model } = this.props;\n model.addEventListener(\n IrisGridModel.EVENT.COLUMNS_CHANGED,\n this.handleCustomColumnUpdated\n );\n model.addEventListener(\n IrisGridModel.EVENT.UPDATED,\n this.handleCustomColumnUpdated\n );\n model.addEventListener(\n IrisGridModel.EVENT.REQUEST_FAILED,\n this.handleRequestFailed\n );\n }\n\n stopListening(): void {\n const { model } = this.props;\n model.removeEventListener(\n IrisGridModel.EVENT.COLUMNS_CHANGED,\n this.handleCustomColumnUpdated\n );\n model.removeEventListener(\n IrisGridModel.EVENT.UPDATED,\n this.handleCustomColumnUpdated\n );\n model.removeEventListener(\n IrisGridModel.EVENT.REQUEST_FAILED,\n this.handleRequestFailed\n );\n }\n\n parseCustomColumns(customColumns: string[]): void {\n if (customColumns.length > 0) {\n const customColumnInputs = customColumns.map(customColumn => {\n const input = customColumn.split(/=(.+)/, 2);\n return {\n eventKey: CustomColumnBuilder.makeCustomColumnInputEventKey(),\n name: input[0],\n formula: input[1],\n };\n });\n this.setState({ inputs: customColumnInputs });\n } else {\n this.setState({\n inputs: [CustomColumnBuilder.createCustomColumnInput()],\n });\n }\n }\n\n handleAddColumnClick(): void {\n const { inputs } = this.state;\n const newInputs = [...inputs];\n newInputs.push(CustomColumnBuilder.createCustomColumnInput());\n this.setState({\n inputs: newInputs,\n });\n }\n\n handleDeleteColumn(eventKey: string): void {\n const { inputs } = this.state;\n const customColumnIndex = this.getInputIndex(inputs, eventKey);\n const newInputs = [...inputs];\n newInputs.splice(customColumnIndex, 1);\n if (newInputs.length === 0) {\n newInputs.push(CustomColumnBuilder.createCustomColumnInput());\n }\n this.setState({\n inputs: newInputs,\n });\n }\n\n handleInputChange(\n eventKey: string,\n type: CustomColumnKey,\n value: string\n ): void {\n const { inputs } = this.state;\n const customColumnIndex = this.getInputIndex(inputs, eventKey);\n const customColumnInput = this.getInput(inputs, eventKey);\n\n const newCustomInput = { ...customColumnInput } as Input;\n newCustomInput[type] = value;\n\n const newInputs = [...inputs];\n newInputs.splice(customColumnIndex, 1, newCustomInput);\n this.setState({\n inputs: newInputs,\n });\n }\n\n handleCustomColumnUpdated(): void {\n const { isCustomColumnApplying } = this.state;\n if (!isCustomColumnApplying) {\n return;\n }\n this.setState(\n { isCustomColumnApplying: false, isSuccessShowing: true },\n () => {\n this.successButtonTimer = setTimeout(\n () => this.setState({ isSuccessShowing: false }),\n CustomColumnBuilder.SUCCESS_SHOW_DURATION\n );\n }\n );\n }\n\n handleRequestFailed(event: Event): void {\n const customEvent = event as CustomEvent;\n const { isCustomColumnApplying } = this.state;\n if (!isCustomColumnApplying) {\n return;\n }\n\n this.setState({\n isCustomColumnApplying: false,\n errorMessage: (\n <>\n <p>\n <FontAwesomeIcon icon={vsWarning} /> Failed to apply custom columns.\n </p>\n <div className=\"error-box\">\n {customEvent.detail.errorMessage}\n <br />\n Table configuration:{' '}\n {JSON.stringify(customEvent.detail.configuration)}\n </div>\n </>\n ),\n hasRequestFailed: true,\n });\n }\n\n handleDragEnd(result: DropResult): void {\n DragUtils.stopDragging();\n\n // if dropped outside the list\n if (!result.destination) {\n return;\n }\n const { inputs } = this.state;\n const sourceIndex = result.source.index;\n const destinationIndex = result.destination.index;\n const newInputs = [...inputs];\n const sourceInput = inputs[sourceIndex];\n\n newInputs.splice(sourceIndex, 1);\n newInputs.splice(destinationIndex, 0, sourceInput);\n\n this.setState({ inputs: newInputs });\n }\n\n handleEditorTabNavigation(focusEditorIndex: number, shiftKey: boolean): void {\n const { inputs } = this.state;\n // focus on drag handle\n if (shiftKey) {\n (this.container?.querySelectorAll(`.btn-drag-handle`)[\n focusEditorIndex\n ] as HTMLButtonElement).focus();\n return;\n }\n if (focusEditorIndex === inputs.length - 1) {\n (this.container?.querySelectorAll(`.btn-add-column`)[\n focusEditorIndex\n ] as HTMLButtonElement).focus();\n } else {\n // focus on next column name input\n const nextFocusIndex = focusEditorIndex + 1;\n (this.container?.querySelectorAll(`.custom-column-input`)[\n nextFocusIndex\n ] as HTMLInputElement).focus();\n }\n }\n\n handleSaveClick(): void {\n const { onSave } = this.props;\n const { inputs, isCustomColumnApplying } = this.state;\n if (isCustomColumnApplying) {\n return;\n }\n const customColumns = [] as string[];\n inputs.forEach(input => {\n const { name, formula } = input;\n if (name && formula) {\n customColumns.push(`${name}=${formula}`);\n }\n });\n this.resetErrorMessage();\n this.setState({ isCustomColumnApplying: true });\n onSave(customColumns);\n }\n\n resetRequestFailed(): void {\n this.setState(({ hasRequestFailed }) => {\n if (hasRequestFailed) {\n return { hasRequestFailed: false };\n }\n return null;\n });\n }\n\n renderInputs(): ReactElement[] {\n const { inputs, hasRequestFailed } = this.state;\n\n return inputs.map((input, index) => {\n const { eventKey, name, formula } = input;\n return (\n <CustomColumnInput\n key={eventKey}\n inputIndex={index}\n eventKey={eventKey}\n name={name}\n formula={formula}\n onChange={this.handleInputChange}\n onDeleteColumn={this.handleDeleteColumn}\n onTabInEditor={this.handleEditorTabNavigation}\n invalid={hasRequestFailed}\n />\n );\n });\n }\n\n renderSaveButton(): ReactElement {\n const { inputs, isCustomColumnApplying, isSuccessShowing } = this.state;\n const saveText = inputs.length > 1 ? 'Save Columns' : 'Save Column';\n\n return (\n <Button\n kind={isSuccessShowing ? 'success' : 'primary'}\n className={classNames('btn-apply', {\n 'btn-spinner': isCustomColumnApplying,\n })}\n disabled={isSuccessShowing || isCustomColumnApplying}\n onClick={this.handleSaveClick}\n >\n {isCustomColumnApplying && (\n <span>\n <LoadingSpinner />\n <span className=\"btn-normal-content\">Applying</span>\n <span className=\"btn-hover-content\">Applying</span>\n </span>\n )}\n {!isSuccessShowing && !isCustomColumnApplying && saveText}\n {isSuccessShowing && (\n <>\n <FontAwesomeIcon icon={vsPass} /> Success\n </>\n )}\n </Button>\n );\n }\n\n render(): ReactElement {\n const { onCancel } = this.props;\n const { errorMessage } = this.state;\n return (\n <div\n role=\"presentation\"\n className=\"custom-column-builder-container\"\n ref={container => {\n this.container = container;\n }}\n onClick={this.resetRequestFailed}\n onFocus={this.resetRequestFailed}\n >\n <hr />\n <DragDropContext\n onDragStart={DragUtils.startDragging}\n onDragEnd={this.handleDragEnd}\n >\n <Droppable droppableId=\"droppable-custom-columns\">\n {(provided, snapshot) => (\n <div\n ref={provided.innerRef}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.droppableProps}\n className={classNames('droppable-container', {\n dragging: snapshot.draggingFromThisWith,\n })}\n >\n {this.renderInputs()}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n\n <div className=\"pt-1 px-3\">\n <Button\n kind=\"ghost\"\n className=\"btn-add-column\"\n onClick={this.handleAddColumnClick}\n icon={dhNewCircleLargeFilled}\n >\n Add Another Column\n </Button>\n </div>\n\n <div className=\"custom-column-builder-footer\">\n {errorMessage && <div className=\"error-message\">{errorMessage}</div>}\n\n <div className=\"d-flex justify-content-end\">\n <Button kind=\"secondary\" className=\"mr-2\" onClick={onCancel}>\n Cancel\n </Button>\n {this.renderSaveButton()}\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default CustomColumnBuilder;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CustomColumnBuilder.js","names":["React","Component","classNames","shortid","memoize","DragDropContext","Droppable","FontAwesomeIcon","Button","DragUtils","LoadingSpinner","dhNewCircleLargeFilled","vsWarning","vsPass","DbNameValidator","CustomColumnInput","IrisGridModel","CustomColumnBuilder","makeCustomColumnInputEventKey","generate","createCustomColumnInput","eventKey","name","formula","constructor","props","inputs","key","find","input","findIndex","handleAddColumnClick","bind","handleSaveClick","handleInputChange","handleDeleteColumn","handleCustomColumnUpdated","handleRequestFailed","handleDragEnd","resetRequestFailed","handleEditorTabNavigation","state","isCustomColumnApplying","errorMessage","hasRequestFailed","isSuccessShowing","container","successButtonTimer","componentDidMount","customColumns","parseCustomColumns","startListening","componentWillUnmount","stopListening","clearTimeout","resetErrorMessage","setState","model","addEventListener","EVENT","COLUMNS_CHANGED","UPDATED","REQUEST_FAILED","removeEventListener","length","customColumnInputs","map","customColumn","split","newInputs","push","customColumnIndex","getInputIndex","splice","type","value","customColumnInput","getInput","newCustomInput","setTimeout","SUCCESS_SHOW_DURATION","event","customEvent","detail","JSON","stringify","configuration","result","stopDragging","destination","sourceIndex","source","index","destinationIndex","sourceInput","focusEditorIndex","shiftKey","querySelectorAll","focus","querySelector","nextFocusIndex","onSave","originalCustomColumns","forEach","renderInputs","nameCount","Map","set","get","isDuplicate","renderSaveButton","saveText","areNamesValid","every","isValidColumnName","filteredNames","filter","areNamesUnique","Set","size","render","onCancel","startDragging","provided","snapshot","innerRef","droppableProps","dragging","draggingFromThisWith","placeholder"],"sources":["../../src/sidebar/CustomColumnBuilder.tsx"],"sourcesContent":["import React, { Component, ReactElement } from 'react';\nimport classNames from 'classnames';\nimport shortid from 'shortid';\nimport memoize from 'memoize-one';\nimport { DragDropContext, Droppable, DropResult } from 'react-beautiful-dnd';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, DragUtils, LoadingSpinner } from '@deephaven/components';\nimport { dhNewCircleLargeFilled, vsWarning, vsPass } from '@deephaven/icons';\nimport { DbNameValidator } from '@deephaven/utils';\nimport CustomColumnInput from './CustomColumnInput';\nimport './CustomColumnBuilder.scss';\nimport IrisGridModel from '../IrisGridModel';\n\nexport type CustomColumnKey = 'eventKey' | 'name' | 'formula';\n\ntype Input = {\n eventKey: string;\n name: string;\n formula: string;\n};\nexport interface CustomColumnBuilderProps {\n model: IrisGridModel;\n customColumns: string[];\n onSave: (columns: string[]) => void;\n onCancel: () => void;\n}\n\ninterface CustomColumnBuilderState {\n inputs: Input[];\n isCustomColumnApplying: boolean;\n errorMessage: ReactElement | null;\n hasRequestFailed: boolean;\n isSuccessShowing: boolean;\n}\nclass CustomColumnBuilder extends Component<\n CustomColumnBuilderProps,\n CustomColumnBuilderState\n> {\n static SUCCESS_SHOW_DURATION = 750;\n\n static makeCustomColumnInputEventKey(): string {\n return shortid.generate();\n }\n\n static createCustomColumnInput(): Input {\n return {\n eventKey: shortid.generate(),\n name: '',\n formula: '',\n };\n }\n\n constructor(props: CustomColumnBuilderProps) {\n super(props);\n\n this.handleAddColumnClick = this.handleAddColumnClick.bind(this);\n this.handleSaveClick = this.handleSaveClick.bind(this);\n this.handleInputChange = this.handleInputChange.bind(this);\n this.handleDeleteColumn = this.handleDeleteColumn.bind(this);\n this.handleCustomColumnUpdated = this.handleCustomColumnUpdated.bind(this);\n this.handleRequestFailed = this.handleRequestFailed.bind(this);\n this.handleDragEnd = this.handleDragEnd.bind(this);\n this.resetRequestFailed = this.resetRequestFailed.bind(this);\n\n this.handleEditorTabNavigation = this.handleEditorTabNavigation.bind(this);\n\n this.state = {\n inputs: [],\n isCustomColumnApplying: false,\n errorMessage: null,\n hasRequestFailed: false,\n isSuccessShowing: false,\n };\n this.container = null;\n this.successButtonTimer = null;\n }\n\n componentDidMount(): void {\n const { customColumns } = this.props;\n this.parseCustomColumns(customColumns);\n this.startListening();\n }\n\n componentWillUnmount(): void {\n this.stopListening();\n if (this.successButtonTimer) {\n clearTimeout(this.successButtonTimer);\n }\n }\n\n container: HTMLDivElement | null;\n\n successButtonTimer: ReturnType<typeof setTimeout> | null;\n\n getInput = memoize((inputs: Input[], key: string) =>\n inputs.find(input => input.eventKey === key)\n );\n\n getInputIndex = memoize((inputs: Input[], key: string) =>\n inputs.findIndex(input => input.eventKey === key)\n );\n\n resetErrorMessage(): void {\n this.setState({ errorMessage: null });\n }\n\n startListening(): void {\n const { model } = this.props;\n model.addEventListener(\n IrisGridModel.EVENT.COLUMNS_CHANGED,\n this.handleCustomColumnUpdated\n );\n model.addEventListener(\n IrisGridModel.EVENT.UPDATED,\n this.handleCustomColumnUpdated\n );\n model.addEventListener(\n IrisGridModel.EVENT.REQUEST_FAILED,\n this.handleRequestFailed\n );\n }\n\n stopListening(): void {\n const { model } = this.props;\n model.removeEventListener(\n IrisGridModel.EVENT.COLUMNS_CHANGED,\n this.handleCustomColumnUpdated\n );\n model.removeEventListener(\n IrisGridModel.EVENT.UPDATED,\n this.handleCustomColumnUpdated\n );\n model.removeEventListener(\n IrisGridModel.EVENT.REQUEST_FAILED,\n this.handleRequestFailed\n );\n }\n\n parseCustomColumns(customColumns: string[]): void {\n if (customColumns.length > 0) {\n const customColumnInputs = customColumns.map(customColumn => {\n const input = customColumn.split(/=(.+)/, 2);\n return {\n eventKey: CustomColumnBuilder.makeCustomColumnInputEventKey(),\n name: input[0],\n formula: input[1],\n };\n });\n this.setState({ inputs: customColumnInputs });\n } else {\n this.setState({\n inputs: [CustomColumnBuilder.createCustomColumnInput()],\n });\n }\n }\n\n handleAddColumnClick(): void {\n const { inputs } = this.state;\n const newInputs = [...inputs];\n newInputs.push(CustomColumnBuilder.createCustomColumnInput());\n this.setState({\n inputs: newInputs,\n });\n }\n\n handleDeleteColumn(eventKey: string): void {\n const { inputs } = this.state;\n const customColumnIndex = this.getInputIndex(inputs, eventKey);\n const newInputs = [...inputs];\n newInputs.splice(customColumnIndex, 1);\n if (newInputs.length === 0) {\n newInputs.push(CustomColumnBuilder.createCustomColumnInput());\n }\n this.setState({\n inputs: newInputs,\n });\n }\n\n handleInputChange(\n eventKey: string,\n type: CustomColumnKey,\n value: string\n ): void {\n const { inputs } = this.state;\n const customColumnIndex = this.getInputIndex(inputs, eventKey);\n const customColumnInput = this.getInput(inputs, eventKey);\n\n const newCustomInput = { ...customColumnInput } as Input;\n newCustomInput[type] = value;\n\n const newInputs = [...inputs];\n newInputs.splice(customColumnIndex, 1, newCustomInput);\n this.setState({\n inputs: newInputs,\n });\n }\n\n handleCustomColumnUpdated(): void {\n const { isCustomColumnApplying } = this.state;\n if (!isCustomColumnApplying) {\n return;\n }\n this.setState(\n { isCustomColumnApplying: false, isSuccessShowing: true },\n () => {\n this.successButtonTimer = setTimeout(\n () => this.setState({ isSuccessShowing: false }),\n CustomColumnBuilder.SUCCESS_SHOW_DURATION\n );\n }\n );\n }\n\n handleRequestFailed(event: Event): void {\n const customEvent = event as CustomEvent;\n const { isCustomColumnApplying } = this.state;\n if (!isCustomColumnApplying) {\n return;\n }\n\n this.setState({\n isCustomColumnApplying: false,\n errorMessage: (\n <>\n <p>\n <FontAwesomeIcon icon={vsWarning} /> Failed to apply custom columns.\n </p>\n <div className=\"error-box\">\n {customEvent.detail.errorMessage}\n <br />\n Table configuration:{' '}\n {JSON.stringify(customEvent.detail.configuration)}\n </div>\n </>\n ),\n hasRequestFailed: true,\n });\n }\n\n handleDragEnd(result: DropResult): void {\n DragUtils.stopDragging();\n\n // if dropped outside the list\n if (!result.destination) {\n return;\n }\n const { inputs } = this.state;\n const sourceIndex = result.source.index;\n const destinationIndex = result.destination.index;\n const newInputs = [...inputs];\n const sourceInput = inputs[sourceIndex];\n\n newInputs.splice(sourceIndex, 1);\n newInputs.splice(destinationIndex, 0, sourceInput);\n\n this.setState({ inputs: newInputs });\n }\n\n handleEditorTabNavigation(focusEditorIndex: number, shiftKey: boolean): void {\n const { inputs } = this.state;\n // focus on drag handle\n if (shiftKey) {\n (this.container?.querySelectorAll('.btn-drag-handle')[\n focusEditorIndex\n ] as HTMLButtonElement).focus();\n return;\n }\n if (focusEditorIndex === inputs.length - 1) {\n (this.container?.querySelector(\n '.btn-add-column'\n ) as HTMLButtonElement)?.focus();\n } else {\n // focus on next column name input\n const nextFocusIndex = focusEditorIndex + 1;\n (this.container?.querySelectorAll(`.custom-column-input`)[\n nextFocusIndex\n ] as HTMLInputElement).focus();\n }\n }\n\n handleSaveClick(): void {\n const { onSave, customColumns: originalCustomColumns } = this.props;\n const { inputs, isCustomColumnApplying } = this.state;\n if (isCustomColumnApplying) {\n return;\n }\n const customColumns = [] as string[];\n inputs.forEach(input => {\n const { name, formula } = input;\n if (name && formula) {\n customColumns.push(`${name}=${formula}`);\n }\n });\n this.resetErrorMessage();\n this.setState({\n // If both are 0, then moving from no custom to no custom. The parent won't re-render to cancel the loading state\n isCustomColumnApplying:\n customColumns.length > 0 || originalCustomColumns.length > 0,\n });\n onSave(customColumns);\n }\n\n resetRequestFailed(): void {\n this.setState(({ hasRequestFailed }) => {\n if (hasRequestFailed) {\n return { hasRequestFailed: false };\n }\n return null;\n });\n }\n\n renderInputs(): ReactElement[] {\n const { inputs, hasRequestFailed } = this.state;\n\n const nameCount = new Map();\n inputs.forEach(({ name }) =>\n nameCount.set(name, (nameCount.get(name) ?? 0) + 1)\n );\n\n return inputs.map((input, index) => {\n const { eventKey, name, formula } = input;\n const isDuplicate = (nameCount.get(name) ?? 0) > 1;\n return (\n <CustomColumnInput\n key={eventKey}\n inputIndex={index}\n eventKey={eventKey}\n name={name}\n formula={formula}\n onChange={this.handleInputChange}\n onDeleteColumn={this.handleDeleteColumn}\n onTabInEditor={this.handleEditorTabNavigation}\n invalid={hasRequestFailed}\n isDuplicate={isDuplicate}\n />\n );\n });\n }\n\n renderSaveButton(): ReactElement {\n const { inputs, isCustomColumnApplying, isSuccessShowing } = this.state;\n const saveText = inputs.length > 1 ? 'Save Columns' : 'Save Column';\n const areNamesValid = inputs.every(\n ({ name }) => name === '' || DbNameValidator.isValidColumnName(name)\n );\n const filteredNames = inputs\n .filter(({ name }) => name !== '')\n .map(({ name }) => name);\n const areNamesUnique = new Set(filteredNames).size === filteredNames.length;\n\n return (\n <Button\n kind={isSuccessShowing ? 'success' : 'primary'}\n className={classNames('btn-apply', {\n 'btn-spinner': isCustomColumnApplying,\n })}\n disabled={\n isSuccessShowing ||\n isCustomColumnApplying ||\n !areNamesValid ||\n !areNamesUnique\n }\n onClick={this.handleSaveClick}\n >\n {isCustomColumnApplying && (\n <span>\n <LoadingSpinner />\n <span className=\"btn-normal-content\">Applying</span>\n </span>\n )}\n {!isSuccessShowing && !isCustomColumnApplying && saveText}\n {isSuccessShowing && (\n <>\n <FontAwesomeIcon icon={vsPass} /> Success\n </>\n )}\n </Button>\n );\n }\n\n render(): JSX.Element {\n const { onCancel } = this.props;\n const { errorMessage } = this.state;\n return (\n <div\n role=\"presentation\"\n className=\"custom-column-builder-container\"\n ref={container => {\n this.container = container;\n }}\n onClick={this.resetRequestFailed}\n onFocus={this.resetRequestFailed}\n >\n <hr />\n <DragDropContext\n onDragStart={DragUtils.startDragging}\n onDragEnd={this.handleDragEnd}\n >\n <Droppable droppableId=\"droppable-custom-columns\">\n {(provided, snapshot) => (\n <div\n ref={provided.innerRef}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.droppableProps}\n className={classNames('droppable-container', {\n dragging: snapshot.draggingFromThisWith,\n })}\n >\n {this.renderInputs()}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n\n <div className=\"pt-1 px-3\">\n <Button\n kind=\"ghost\"\n className=\"btn-add-column\"\n onClick={this.handleAddColumnClick}\n icon={dhNewCircleLargeFilled}\n >\n Add Another Column\n </Button>\n </div>\n\n <div className=\"custom-column-builder-footer\">\n {errorMessage && <div className=\"error-message\">{errorMessage}</div>}\n\n <div className=\"d-flex justify-content-end\">\n <Button kind=\"secondary\" className=\"mr-2\" onClick={onCancel}>\n Cancel\n </Button>\n {this.renderSaveButton()}\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default CustomColumnBuilder;\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="react" />
|
|
2
2
|
import { CustomColumnKey } from './CustomColumnBuilder';
|
|
3
|
-
interface CustomColumnInputProps {
|
|
3
|
+
export interface CustomColumnInputProps {
|
|
4
4
|
eventKey: string;
|
|
5
5
|
inputIndex: number;
|
|
6
6
|
name: string;
|
|
@@ -9,24 +9,8 @@ interface CustomColumnInputProps {
|
|
|
9
9
|
onDeleteColumn: (eventKey: string) => void;
|
|
10
10
|
onTabInEditor: (editorIndex: number, shiftKey: boolean) => void;
|
|
11
11
|
invalid: boolean;
|
|
12
|
+
isDuplicate: boolean;
|
|
12
13
|
}
|
|
13
|
-
declare
|
|
14
|
-
static INPUT_TYPE: {
|
|
15
|
-
NAME: string;
|
|
16
|
-
FORMULA: string;
|
|
17
|
-
};
|
|
18
|
-
static defaultProps: {
|
|
19
|
-
name: string;
|
|
20
|
-
inputIndex: number;
|
|
21
|
-
formula: string;
|
|
22
|
-
onChange: () => void;
|
|
23
|
-
onDeleteColumn: () => void;
|
|
24
|
-
onTabInEditor: () => void;
|
|
25
|
-
invalid: boolean;
|
|
26
|
-
};
|
|
27
|
-
constructor(props: CustomColumnInputProps);
|
|
28
|
-
handleFormulaEditorContentChanged(formulaValue?: string): void;
|
|
29
|
-
render(): ReactElement;
|
|
30
|
-
}
|
|
14
|
+
declare function CustomColumnInput({ eventKey, name, inputIndex, formula, onChange, onDeleteColumn, onTabInEditor, invalid, isDuplicate, }: CustomColumnInputProps): JSX.Element;
|
|
31
15
|
export default CustomColumnInput;
|
|
32
16
|
//# sourceMappingURL=CustomColumnInput.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomColumnInput.d.ts","sourceRoot":"","sources":["../../src/sidebar/CustomColumnInput.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CustomColumnInput.d.ts","sourceRoot":"","sources":["../../src/sidebar/CustomColumnInput.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CACR,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,MAAM,KACV,IAAI,CAAC;IACV,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AAWD,iBAAS,iBAAiB,CAAC,EACzB,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,OAAO,EACP,QAAQ,EACR,cAAc,EACd,aAAa,EACb,OAAO,EACP,WAAW,GACZ,EAAE,sBAAsB,GAAG,GAAG,CAAC,OAAO,CAgFtC;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,101 +1,90 @@
|
|
|
1
1
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
-
|
|
3
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
4
|
-
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
5
|
-
import React, { PureComponent } from 'react';
|
|
2
|
+
import React, { useCallback } from 'react';
|
|
6
3
|
import classNames from 'classnames';
|
|
7
4
|
import { Draggable } from 'react-beautiful-dnd';
|
|
8
|
-
import {
|
|
9
|
-
import { Button, Tooltip } from '@deephaven/components';
|
|
5
|
+
import { Button } from '@deephaven/components';
|
|
10
6
|
import { vsTrash, vsGripper } from '@deephaven/icons';
|
|
7
|
+
import { DbNameValidator } from '@deephaven/utils';
|
|
11
8
|
import InputEditor from "./InputEditor.js";
|
|
12
|
-
|
|
13
|
-
constructor(props) {
|
|
14
|
-
super(props);
|
|
15
|
-
this.handleFormulaEditorContentChanged = this.handleFormulaEditorContentChanged.bind(this);
|
|
16
|
-
}
|
|
17
|
-
handleFormulaEditorContentChanged(formulaValue) {
|
|
18
|
-
var {
|
|
19
|
-
onChange,
|
|
20
|
-
eventKey
|
|
21
|
-
} = this.props;
|
|
22
|
-
if (formulaValue !== undefined && formulaValue !== '') {
|
|
23
|
-
formulaValue.replace(/(\r\n|\n|\r)/gm, ''); // remove line break
|
|
24
|
-
onChange(eventKey, CustomColumnInput.INPUT_TYPE.FORMULA, formulaValue);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
render() {
|
|
28
|
-
var {
|
|
29
|
-
eventKey,
|
|
30
|
-
name,
|
|
31
|
-
formula,
|
|
32
|
-
onChange: _onChange,
|
|
33
|
-
onDeleteColumn,
|
|
34
|
-
inputIndex,
|
|
35
|
-
onTabInEditor,
|
|
36
|
-
invalid
|
|
37
|
-
} = this.props;
|
|
38
|
-
return /*#__PURE__*/React.createElement(Draggable, {
|
|
39
|
-
draggableId: eventKey,
|
|
40
|
-
index: inputIndex,
|
|
41
|
-
disableInteractiveElementBlocking: true
|
|
42
|
-
}, (provided, snapshot) => /*#__PURE__*/React.createElement("div", _extends({
|
|
43
|
-
className: classNames('draggable-container', {
|
|
44
|
-
dragging: snapshot.isDragging
|
|
45
|
-
}),
|
|
46
|
-
ref: provided.innerRef
|
|
47
|
-
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
48
|
-
}, provided.draggableProps), /*#__PURE__*/React.createElement("div", {
|
|
49
|
-
className: "custom-column-input-container"
|
|
50
|
-
}, /*#__PURE__*/React.createElement("div", {
|
|
51
|
-
className: "d-flex flex-row pb-3 custom-column-name"
|
|
52
|
-
}, /*#__PURE__*/React.createElement("input", {
|
|
53
|
-
className: classNames('form-control custom-column-input', {
|
|
54
|
-
'is-invalid': invalid
|
|
55
|
-
}),
|
|
56
|
-
placeholder: "Column Name",
|
|
57
|
-
value: name,
|
|
58
|
-
onChange: event => {
|
|
59
|
-
_onChange(eventKey, CustomColumnInput.INPUT_TYPE.NAME, event.target.value);
|
|
60
|
-
}
|
|
61
|
-
}), /*#__PURE__*/React.createElement(Button, {
|
|
62
|
-
kind: "ghost",
|
|
63
|
-
className: "ml-1 px-2",
|
|
64
|
-
onClick: () => {
|
|
65
|
-
onDeleteColumn(eventKey);
|
|
66
|
-
},
|
|
67
|
-
icon: vsTrash,
|
|
68
|
-
tooltip: "Delete custom column"
|
|
69
|
-
}), /*#__PURE__*/React.createElement("button", _extends({
|
|
70
|
-
type: "button",
|
|
71
|
-
className: "btn btn-link btn-link-icon px-2 btn-drag-handle"
|
|
72
|
-
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
73
|
-
}, provided.dragHandleProps), /*#__PURE__*/React.createElement(Tooltip, null, "Drag column to re-order"), /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
74
|
-
icon: vsGripper
|
|
75
|
-
}))), /*#__PURE__*/React.createElement(InputEditor, {
|
|
76
|
-
editorSettings: {
|
|
77
|
-
language: 'deephavenDb'
|
|
78
|
-
},
|
|
79
|
-
editorIndex: inputIndex,
|
|
80
|
-
value: formula,
|
|
81
|
-
onContentChanged: this.handleFormulaEditorContentChanged,
|
|
82
|
-
onTab: onTabInEditor,
|
|
83
|
-
invalid: invalid
|
|
84
|
-
})), /*#__PURE__*/React.createElement("hr", null)));
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
_defineProperty(CustomColumnInput, "INPUT_TYPE", {
|
|
9
|
+
var INPUT_TYPE = Object.freeze({
|
|
88
10
|
NAME: 'name',
|
|
89
11
|
FORMULA: 'formula'
|
|
90
12
|
});
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
13
|
+
var EMPTY_FN = () => {
|
|
14
|
+
// no-op
|
|
15
|
+
};
|
|
16
|
+
function CustomColumnInput(_ref) {
|
|
17
|
+
var {
|
|
18
|
+
eventKey,
|
|
19
|
+
name,
|
|
20
|
+
inputIndex,
|
|
21
|
+
formula,
|
|
22
|
+
onChange: _onChange,
|
|
23
|
+
onDeleteColumn,
|
|
24
|
+
onTabInEditor,
|
|
25
|
+
invalid,
|
|
26
|
+
isDuplicate
|
|
27
|
+
} = _ref;
|
|
28
|
+
var isValidName = name === '' || DbNameValidator.isValidColumnName(name);
|
|
29
|
+
var handleFormulaEditorContentChanged = useCallback(formulaValue => {
|
|
30
|
+
if (formulaValue !== undefined) {
|
|
31
|
+
formulaValue.replace(/(\r\n|\n|\r)/gm, ''); // remove line break
|
|
32
|
+
_onChange(eventKey, INPUT_TYPE.FORMULA, formulaValue);
|
|
33
|
+
}
|
|
34
|
+
}, [_onChange, eventKey]);
|
|
35
|
+
return /*#__PURE__*/React.createElement(Draggable, {
|
|
36
|
+
draggableId: eventKey,
|
|
37
|
+
index: inputIndex,
|
|
38
|
+
disableInteractiveElementBlocking: true
|
|
39
|
+
}, (provided, snapshot) => /*#__PURE__*/React.createElement("div", _extends({
|
|
40
|
+
className: classNames('draggable-container', {
|
|
41
|
+
dragging: snapshot.isDragging
|
|
42
|
+
}),
|
|
43
|
+
ref: provided.innerRef
|
|
44
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
45
|
+
}, provided.draggableProps), /*#__PURE__*/React.createElement("div", {
|
|
46
|
+
className: "custom-column-input-container"
|
|
47
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
48
|
+
className: "pb-3"
|
|
49
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
50
|
+
className: "d-flex flex-row custom-column-name"
|
|
51
|
+
}, /*#__PURE__*/React.createElement("input", {
|
|
52
|
+
className: classNames('form-control custom-column-input', {
|
|
53
|
+
'is-invalid': invalid || !isValidName || isDuplicate
|
|
54
|
+
}),
|
|
55
|
+
placeholder: "Column Name",
|
|
56
|
+
value: name,
|
|
57
|
+
onChange: event => {
|
|
58
|
+
_onChange(eventKey, INPUT_TYPE.NAME, event.target.value);
|
|
59
|
+
}
|
|
60
|
+
}), /*#__PURE__*/React.createElement(Button, {
|
|
61
|
+
kind: "ghost",
|
|
62
|
+
className: "ml-1 px-2",
|
|
63
|
+
onClick: () => {
|
|
64
|
+
onDeleteColumn(eventKey);
|
|
65
|
+
},
|
|
66
|
+
icon: vsTrash,
|
|
67
|
+
tooltip: "Delete custom column"
|
|
68
|
+
}), /*#__PURE__*/React.createElement(Button, _extends({
|
|
69
|
+
kind: "ghost",
|
|
70
|
+
className: "btn-drag-handle",
|
|
71
|
+
onClick: EMPTY_FN
|
|
72
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
73
|
+
}, provided.dragHandleProps, {
|
|
74
|
+
icon: vsGripper,
|
|
75
|
+
tooltip: "Drag column to re-order"
|
|
76
|
+
}))), (!isValidName || isDuplicate) && /*#__PURE__*/React.createElement("p", {
|
|
77
|
+
className: "validate-label-error text-danger mb-0 mt-2 pl-1"
|
|
78
|
+
}, !isValidName ? 'Invalid name' : 'Duplicate name')), /*#__PURE__*/React.createElement(InputEditor, {
|
|
79
|
+
editorSettings: {
|
|
80
|
+
language: 'deephavenDb'
|
|
81
|
+
},
|
|
82
|
+
editorIndex: inputIndex,
|
|
83
|
+
value: formula,
|
|
84
|
+
onContentChanged: handleFormulaEditorContentChanged,
|
|
85
|
+
onTab: onTabInEditor,
|
|
86
|
+
invalid: invalid
|
|
87
|
+
})), /*#__PURE__*/React.createElement("hr", null)));
|
|
88
|
+
}
|
|
100
89
|
export default CustomColumnInput;
|
|
101
90
|
//# sourceMappingURL=CustomColumnInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomColumnInput.js","names":["React","
|
|
1
|
+
{"version":3,"file":"CustomColumnInput.js","names":["React","useCallback","classNames","Draggable","Button","vsTrash","vsGripper","DbNameValidator","InputEditor","INPUT_TYPE","Object","freeze","NAME","FORMULA","EMPTY_FN","CustomColumnInput","eventKey","name","inputIndex","formula","onChange","onDeleteColumn","onTabInEditor","invalid","isDuplicate","isValidName","isValidColumnName","handleFormulaEditorContentChanged","formulaValue","undefined","replace","provided","snapshot","dragging","isDragging","innerRef","draggableProps","event","target","value","dragHandleProps","language"],"sources":["../../src/sidebar/CustomColumnInput.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport classNames from 'classnames';\nimport { Draggable } from 'react-beautiful-dnd';\nimport { Button } from '@deephaven/components';\nimport { vsTrash, vsGripper } from '@deephaven/icons';\nimport { DbNameValidator } from '@deephaven/utils';\nimport InputEditor from './InputEditor';\nimport { CustomColumnKey } from './CustomColumnBuilder';\n\nexport interface CustomColumnInputProps {\n eventKey: string;\n inputIndex: number;\n name: string;\n formula: string;\n onChange: (\n eventKey: string,\n inputType: CustomColumnKey,\n value: string\n ) => void;\n onDeleteColumn: (eventKey: string) => void;\n onTabInEditor: (editorIndex: number, shiftKey: boolean) => void;\n invalid: boolean;\n isDuplicate: boolean;\n}\n\nconst INPUT_TYPE = Object.freeze({\n NAME: 'name',\n FORMULA: 'formula',\n});\n\nconst EMPTY_FN = () => {\n // no-op\n};\n\nfunction CustomColumnInput({\n eventKey,\n name,\n inputIndex,\n formula,\n onChange,\n onDeleteColumn,\n onTabInEditor,\n invalid,\n isDuplicate,\n}: CustomColumnInputProps): JSX.Element {\n const isValidName = name === '' || DbNameValidator.isValidColumnName(name);\n const handleFormulaEditorContentChanged = useCallback(\n (formulaValue?: string) => {\n if (formulaValue !== undefined) {\n formulaValue.replace(/(\\r\\n|\\n|\\r)/gm, ''); // remove line break\n onChange(eventKey, INPUT_TYPE.FORMULA, formulaValue);\n }\n },\n [onChange, eventKey]\n );\n\n return (\n <Draggable\n draggableId={eventKey}\n index={inputIndex}\n disableInteractiveElementBlocking\n >\n {(provided, snapshot) => (\n <div\n className={classNames('draggable-container', {\n dragging: snapshot.isDragging,\n })}\n ref={provided.innerRef}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n >\n <div className=\"custom-column-input-container\">\n <div className=\"pb-3\">\n <div className=\"d-flex flex-row custom-column-name\">\n <input\n className={classNames('form-control custom-column-input', {\n 'is-invalid': invalid || !isValidName || isDuplicate,\n })}\n placeholder=\"Column Name\"\n value={name}\n onChange={event => {\n onChange(eventKey, INPUT_TYPE.NAME, event.target.value);\n }}\n />\n <Button\n kind=\"ghost\"\n className=\"ml-1 px-2\"\n onClick={() => {\n onDeleteColumn(eventKey);\n }}\n icon={vsTrash}\n tooltip=\"Delete custom column\"\n />\n\n <Button\n kind=\"ghost\"\n className=\"btn-drag-handle\"\n onClick={EMPTY_FN}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n icon={vsGripper}\n tooltip=\"Drag column to re-order\"\n />\n </div>\n {(!isValidName || isDuplicate) && (\n <p className=\"validate-label-error text-danger mb-0 mt-2 pl-1\">\n {!isValidName ? 'Invalid name' : 'Duplicate name'}\n </p>\n )}\n </div>\n <InputEditor\n editorSettings={{ language: 'deephavenDb' }}\n editorIndex={inputIndex}\n value={formula}\n onContentChanged={handleFormulaEditorContentChanged}\n onTab={onTabInEditor}\n invalid={invalid}\n />\n </div>\n <hr />\n </div>\n )}\n </Draggable>\n );\n}\n\nexport default CustomColumnInput;\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Component, ReactElement } from 'react';
|
|
2
2
|
import * as monaco from 'monaco-editor';
|
|
3
3
|
import './InputEditor.scss';
|
|
4
4
|
interface InputEditorProps {
|
|
@@ -36,7 +36,7 @@ export default class InputEditor extends Component<InputEditorProps, InputEditor
|
|
|
36
36
|
handleEditorFocus(): void;
|
|
37
37
|
handleEditorBlur(): void;
|
|
38
38
|
handleContainerClick(): void;
|
|
39
|
-
handleKeyDown(event:
|
|
39
|
+
handleKeyDown(event: monaco.IKeyboardEvent): void;
|
|
40
40
|
render(): ReactElement;
|
|
41
41
|
}
|
|
42
42
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputEditor.d.ts","sourceRoot":"","sources":["../../src/sidebar/InputEditor.tsx"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"InputEditor.d.ts","sourceRoot":"","sources":["../../src/sidebar/InputEditor.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,oBAAoB,CAAC;AAE5B,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,gBAAgB;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;CACxB;AACD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS,CAChD,gBAAgB,EAChB,gBAAgB,CACjB;IACC,MAAM,CAAC,YAAY;;gCAEK,IAAI;;;qBAGf,IAAI;;MAEf;gBAEU,KAAK,EAAE,gBAAgB;IAgBnC,iBAAiB,IAAI,IAAI;IAIzB,oBAAoB,IAAI,IAAI;IAI5B,eAAe,EAAE,cAAc,GAAG,IAAI,CAAC;IAEvC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC;IAE7C,UAAU,IAAI,IAAI;IAkDlB,aAAa,IAAI,IAAI;IAKrB,oBAAoB,IAAI,IAAI;IAS5B,iBAAiB,IAAI,IAAI;IAIzB,gBAAgB,IAAI,IAAI;IASxB,oBAAoB,IAAI,IAAI;IAQ5B,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI;IASjD,MAAM,IAAI,YAAY;CAwBvB"}
|