@deephaven/iris-grid 0.9.2-beta.10 → 0.9.2-beta.13
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.js +3 -3
- package/dist/IrisGrid.js.map +1 -1
- package/dist/sidebar/CustomColumnBuilder.d.ts +3 -0
- package/dist/sidebar/CustomColumnBuilder.d.ts.map +1 -1
- package/dist/sidebar/CustomColumnBuilder.js +41 -17
- package/dist/sidebar/CustomColumnBuilder.js.map +1 -1
- package/package.json +11 -11
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export default CustomColumnBuilder;
|
|
2
2
|
declare class CustomColumnBuilder extends React.Component<any, any, any> {
|
|
3
|
+
static SUCCESS_SHOW_DURATION: number;
|
|
3
4
|
static makeCustomColumnInputEventKey(): string;
|
|
4
5
|
static createCustomColumnInput(): {
|
|
5
6
|
eventKey: string;
|
|
@@ -17,6 +18,7 @@ declare class CustomColumnBuilder extends React.Component<any, any, any> {
|
|
|
17
18
|
resetRequestFailed(): void;
|
|
18
19
|
handleEditorTabNavigation(focusEditorIndex: any, shiftKey: any): void;
|
|
19
20
|
container: HTMLDivElement | null;
|
|
21
|
+
successButtonTimer: NodeJS.Timeout | null;
|
|
20
22
|
getInput: (this: any, inputs: any, key: any) => any;
|
|
21
23
|
getInputIndex: (this: any, inputs: any, key: any) => any;
|
|
22
24
|
resetErrorMessage(): void;
|
|
@@ -24,6 +26,7 @@ declare class CustomColumnBuilder extends React.Component<any, any, any> {
|
|
|
24
26
|
stopListening(): void;
|
|
25
27
|
parseCustomColumns(customColumns: any): void;
|
|
26
28
|
renderInputs(): JSX.Element[];
|
|
29
|
+
renderSaveButton(): JSX.Element;
|
|
27
30
|
}
|
|
28
31
|
declare namespace CustomColumnBuilder {
|
|
29
32
|
namespace propTypes {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomColumnBuilder.d.ts","sourceRoot":"","sources":["../../src/sidebar/CustomColumnBuilder.jsx"],"names":[],"mappings":";AAaA;IACE,+CAEC;IAED;;;;MAMC;IAED,
|
|
1
|
+
{"version":3,"file":"CustomColumnBuilder.d.ts","sourceRoot":"","sources":["../../src/sidebar/CustomColumnBuilder.jsx"],"names":[],"mappings":";AAaA;IACE,qCAAmC;IAEnC,+CAEC;IAED;;;;MAMC;IAED,wBAuBC;IAgFD,6BAOC;IA8GD,wBAgBC;IA/GD,8DAaC;IA1BD,wCAWC;IAiBD,kCAcC;IAED,sCAsBC;IAED,iCAiBC;IAyCD,2BAOC;IA9CD,sEAmBC;IArMC,iCAAqB;IACrB,0CAA8B;IAmBhC,oDAEE;IAEF,yDAEE;IAEF,0BAEC;IAED,uBAcC;IAED,sBAcC;IAED,6CAgBC;IAkJD,8BAmBC;IAED,gCAgCC;CAkEF;;;;;;;;;;;QAWS,iCAAQ;;QACN,mCAAQ"}
|
|
@@ -14,7 +14,7 @@ import memoize from 'memoize-one';
|
|
|
14
14
|
import { DragDropContext, Droppable } from 'react-beautiful-dnd';
|
|
15
15
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
16
16
|
import { DragUtils, LoadingSpinner } from '@deephaven/components';
|
|
17
|
-
import { dhNewCircleLargeFilled, vsIssues } from '@deephaven/icons';
|
|
17
|
+
import { dhNewCircleLargeFilled, vsIssues, vsPass } from '@deephaven/icons';
|
|
18
18
|
import CustomColumnInput from "./CustomColumnInput.js";
|
|
19
19
|
import "./CustomColumnBuilder.css";
|
|
20
20
|
import IrisGridModel from "../IrisGridModel.js";
|
|
@@ -52,9 +52,11 @@ class CustomColumnBuilder extends Component {
|
|
|
52
52
|
inputs: [],
|
|
53
53
|
isCustomColumnApplying: false,
|
|
54
54
|
errorMessage: null,
|
|
55
|
-
hasRequestFailed: false
|
|
55
|
+
hasRequestFailed: false,
|
|
56
|
+
isSuccessShowing: false
|
|
56
57
|
};
|
|
57
58
|
this.container = null;
|
|
59
|
+
this.successButtonTimer = null;
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
componentDidMount() {
|
|
@@ -71,6 +73,10 @@ class CustomColumnBuilder extends Component {
|
|
|
71
73
|
if (this.messageTimer) {
|
|
72
74
|
clearTimeout(this.messageTimer);
|
|
73
75
|
}
|
|
76
|
+
|
|
77
|
+
if (this.successButtonTimer) {
|
|
78
|
+
clearTimeout(this.successButtonTimer);
|
|
79
|
+
}
|
|
74
80
|
}
|
|
75
81
|
|
|
76
82
|
resetErrorMessage() {
|
|
@@ -172,7 +178,12 @@ class CustomColumnBuilder extends Component {
|
|
|
172
178
|
}
|
|
173
179
|
|
|
174
180
|
this.setState({
|
|
175
|
-
isCustomColumnApplying: false
|
|
181
|
+
isCustomColumnApplying: false,
|
|
182
|
+
isSuccessShowing: true
|
|
183
|
+
}, () => {
|
|
184
|
+
this.successButtonTimer = setTimeout(() => this.setState({
|
|
185
|
+
isSuccessShowing: false
|
|
186
|
+
}), CustomColumnBuilder.SUCCESS_SHOW_DURATION);
|
|
176
187
|
});
|
|
177
188
|
}
|
|
178
189
|
|
|
@@ -311,14 +322,35 @@ class CustomColumnBuilder extends Component {
|
|
|
311
322
|
});
|
|
312
323
|
}
|
|
313
324
|
|
|
325
|
+
renderSaveButton() {
|
|
326
|
+
var {
|
|
327
|
+
inputs,
|
|
328
|
+
isCustomColumnApplying,
|
|
329
|
+
isSuccessShowing
|
|
330
|
+
} = this.state;
|
|
331
|
+
var saveText = inputs.length > 1 ? 'Save Columns' : 'Save Column';
|
|
332
|
+
return /*#__PURE__*/React.createElement("button", {
|
|
333
|
+
type: "button",
|
|
334
|
+
className: classNames('btn btn-apply', {
|
|
335
|
+
'btn-spinner': isCustomColumnApplying
|
|
336
|
+
}, isSuccessShowing ? 'btn-success' : 'btn-primary'),
|
|
337
|
+
disabled: isSuccessShowing || isCustomColumnApplying,
|
|
338
|
+
onClick: this.handleSaveClick
|
|
339
|
+
}, isCustomColumnApplying && /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(LoadingSpinner, null), /*#__PURE__*/React.createElement("span", {
|
|
340
|
+
className: "btn-normal-content"
|
|
341
|
+
}, "Applying"), /*#__PURE__*/React.createElement("span", {
|
|
342
|
+
className: "btn-hover-content"
|
|
343
|
+
}, "Applying")), !isSuccessShowing && !isCustomColumnApplying && saveText, isSuccessShowing && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
344
|
+
icon: vsPass
|
|
345
|
+
}), " Success"));
|
|
346
|
+
}
|
|
347
|
+
|
|
314
348
|
render() {
|
|
315
349
|
var {
|
|
316
350
|
onCancel
|
|
317
351
|
} = this.props;
|
|
318
352
|
var {
|
|
319
|
-
|
|
320
|
-
errorMessage,
|
|
321
|
-
isCustomColumnApplying
|
|
353
|
+
errorMessage
|
|
322
354
|
} = this.state;
|
|
323
355
|
return /*#__PURE__*/React.createElement("div", {
|
|
324
356
|
role: "presentation",
|
|
@@ -360,21 +392,13 @@ class CustomColumnBuilder extends Component {
|
|
|
360
392
|
type: "button",
|
|
361
393
|
className: "btn btn-outline-primary mr-2",
|
|
362
394
|
onClick: onCancel
|
|
363
|
-
}, "Cancel"),
|
|
364
|
-
type: "button",
|
|
365
|
-
className: classNames('btn btn-primary btn-apply', {
|
|
366
|
-
'btn-spinner': isCustomColumnApplying
|
|
367
|
-
}),
|
|
368
|
-
onClick: this.handleSaveClick
|
|
369
|
-
}, isCustomColumnApplying && /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(LoadingSpinner, null), /*#__PURE__*/React.createElement("span", {
|
|
370
|
-
className: "btn-normal-content"
|
|
371
|
-
}, "Applying"), /*#__PURE__*/React.createElement("span", {
|
|
372
|
-
className: "btn-hover-content"
|
|
373
|
-
}, "Applying")), !isCustomColumnApplying && (inputs.length > 1 ? 'Save Columns' : 'Save Column')))));
|
|
395
|
+
}, "Cancel"), this.renderSaveButton())));
|
|
374
396
|
}
|
|
375
397
|
|
|
376
398
|
}
|
|
377
399
|
|
|
400
|
+
_defineProperty(CustomColumnBuilder, "SUCCESS_SHOW_DURATION", 750);
|
|
401
|
+
|
|
378
402
|
CustomColumnBuilder.propTypes = {
|
|
379
403
|
model: PropTypes.instanceOf(IrisGridModel).isRequired,
|
|
380
404
|
customColumns: PropTypes.arrayOf(PropTypes.string),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sidebar/CustomColumnBuilder.jsx"],"names":["React","Component","classNames","PropTypes","shortid","memoize","DragDropContext","Droppable","FontAwesomeIcon","DragUtils","LoadingSpinner","dhNewCircleLargeFilled","vsIssues","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","container","componentDidMount","customColumns","parseCustomColumns","startListening","componentWillUnmount","stopListening","messageTimer","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","event","detail","JSON","stringify","configuration","result","stopDragging","destination","sourceIndex","source","index","destinationIndex","sourceInput","focusEditorIndex","shiftKey","querySelectorAll","focus","querySelector","nextFocusIndex","onSave","forEach","renderInputs","render","onCancel","startDragging","provided","snapshot","innerRef","droppableProps","dragging","draggingFromThisWith","placeholder","propTypes","instanceOf","isRequired","arrayOf","string","func","defaultProps"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport classNames from 'classnames';\nimport PropTypes from 'prop-types';\nimport shortid from 'shortid';\nimport memoize from 'memoize-one';\nimport { DragDropContext, Droppable } from 'react-beautiful-dnd';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { DragUtils, LoadingSpinner } from '@deephaven/components';\nimport { dhNewCircleLargeFilled, vsIssues } from '@deephaven/icons';\nimport CustomColumnInput from './CustomColumnInput';\nimport './CustomColumnBuilder.scss';\nimport IrisGridModel from '../IrisGridModel';\n\nclass CustomColumnBuilder extends Component {\n static makeCustomColumnInputEventKey() {\n return shortid.generate();\n }\n\n static createCustomColumnInput() {\n return {\n eventKey: shortid.generate(),\n name: '',\n formula: '',\n };\n }\n\n constructor(props) {\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 };\n this.container = null;\n }\n\n componentDidMount() {\n const { customColumns } = this.props;\n this.parseCustomColumns(customColumns);\n this.startListening();\n }\n\n componentWillUnmount() {\n this.stopListening();\n if (this.messageTimer) {\n clearTimeout(this.messageTimer);\n }\n }\n\n getInput = memoize((inputs, key) =>\n inputs.find(input => input.eventKey === key)\n );\n\n getInputIndex = memoize((inputs, key) =>\n inputs.findIndex(input => input.eventKey === key)\n );\n\n resetErrorMessage() {\n this.setState({ errorMessage: null });\n }\n\n startListening() {\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() {\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) {\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() {\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) {\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(eventKey, type, value) {\n const { inputs } = this.state;\n const customColumnIndex = this.getInputIndex(inputs, eventKey);\n const customColumnInput = this.getInput(inputs, eventKey);\n\n const newCustomInput = { ...customColumnInput };\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() {\n const { isCustomColumnApplying } = this.state;\n if (!isCustomColumnApplying) {\n return;\n }\n this.setState({ isCustomColumnApplying: false });\n }\n\n handleRequestFailed(event) {\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={vsIssues} /> Failed to apply custom columns.\n </p>\n <div className=\"error-box\">\n {event.detail.errorMessage}\n <br />\n Table configuration: {JSON.stringify(event.detail.configuration)}\n </div>\n </>\n ),\n hasRequestFailed: true,\n });\n }\n\n handleDragEnd(result) {\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, shiftKey) {\n const { inputs } = this.state;\n // focus on drag handle\n if (shiftKey) {\n this.container\n .querySelectorAll(`.btn-drag-handle`) // eslint-disable-next-line no-unexpected-multiline\n [focusEditorIndex].focus();\n return;\n }\n if (focusEditorIndex === inputs.length - 1) {\n // focus on add another column button\n this.container.querySelector('.btn-add-column').focus();\n } else {\n // focus on next column name input\n const nextFocusIndex = focusEditorIndex + 1;\n this.container\n .querySelectorAll('.custom-column-input') // eslint-disable-next-line no-unexpected-multiline\n [nextFocusIndex].focus();\n }\n }\n\n handleSaveClick() {\n const { onSave } = this.props;\n const { inputs, isCustomColumnApplying } = this.state;\n if (isCustomColumnApplying) {\n return;\n }\n const customColumns = [];\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() {\n this.setState(({ hasRequestFailed }) => {\n if (hasRequestFailed) {\n return { hasRequestFailed: false };\n }\n return null;\n });\n }\n\n renderInputs() {\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 render() {\n const { onCancel } = this.props;\n const { inputs, errorMessage, isCustomColumnApplying } = 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 <div className=\"section-title\">Custom Column Name and Formula</div>\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 type=\"button\"\n className=\"btn btn-link btn-add-column\"\n onClick={this.handleAddColumnClick}\n >\n <FontAwesomeIcon icon={dhNewCircleLargeFilled} />\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\n type=\"button\"\n className=\"btn btn-outline-primary mr-2\"\n onClick={onCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className={classNames('btn btn-primary btn-apply', {\n 'btn-spinner': isCustomColumnApplying,\n })}\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 {!isCustomColumnApplying &&\n (inputs.length > 1 ? 'Save Columns' : 'Save Column')}\n </button>\n </div>\n </div>\n </div>\n );\n }\n}\n\nCustomColumnBuilder.propTypes = {\n model: PropTypes.instanceOf(IrisGridModel).isRequired,\n customColumns: PropTypes.arrayOf(PropTypes.string),\n onSave: PropTypes.func,\n onCancel: PropTypes.func,\n};\n\nCustomColumnBuilder.defaultProps = {\n customColumns: [],\n onSave: () => {},\n onCancel: () => {},\n};\n\nexport default CustomColumnBuilder;\n"],"file":"CustomColumnBuilder.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/sidebar/CustomColumnBuilder.jsx"],"names":["React","Component","classNames","PropTypes","shortid","memoize","DragDropContext","Droppable","FontAwesomeIcon","DragUtils","LoadingSpinner","dhNewCircleLargeFilled","vsIssues","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","messageTimer","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","detail","JSON","stringify","configuration","result","stopDragging","destination","sourceIndex","source","index","destinationIndex","sourceInput","focusEditorIndex","shiftKey","querySelectorAll","focus","querySelector","nextFocusIndex","onSave","forEach","renderInputs","renderSaveButton","saveText","render","onCancel","startDragging","provided","snapshot","innerRef","droppableProps","dragging","draggingFromThisWith","placeholder","propTypes","instanceOf","isRequired","arrayOf","string","func","defaultProps"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport classNames from 'classnames';\nimport PropTypes from 'prop-types';\nimport shortid from 'shortid';\nimport memoize from 'memoize-one';\nimport { DragDropContext, Droppable } from 'react-beautiful-dnd';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { DragUtils, LoadingSpinner } from '@deephaven/components';\nimport { dhNewCircleLargeFilled, vsIssues, vsPass } from '@deephaven/icons';\nimport CustomColumnInput from './CustomColumnInput';\nimport './CustomColumnBuilder.scss';\nimport IrisGridModel from '../IrisGridModel';\n\nclass CustomColumnBuilder extends Component {\n static SUCCESS_SHOW_DURATION = 750;\n\n static makeCustomColumnInputEventKey() {\n return shortid.generate();\n }\n\n static createCustomColumnInput() {\n return {\n eventKey: shortid.generate(),\n name: '',\n formula: '',\n };\n }\n\n constructor(props) {\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() {\n const { customColumns } = this.props;\n this.parseCustomColumns(customColumns);\n this.startListening();\n }\n\n componentWillUnmount() {\n this.stopListening();\n if (this.messageTimer) {\n clearTimeout(this.messageTimer);\n }\n if (this.successButtonTimer) {\n clearTimeout(this.successButtonTimer);\n }\n }\n\n getInput = memoize((inputs, key) =>\n inputs.find(input => input.eventKey === key)\n );\n\n getInputIndex = memoize((inputs, key) =>\n inputs.findIndex(input => input.eventKey === key)\n );\n\n resetErrorMessage() {\n this.setState({ errorMessage: null });\n }\n\n startListening() {\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() {\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) {\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() {\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) {\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(eventKey, type, value) {\n const { inputs } = this.state;\n const customColumnIndex = this.getInputIndex(inputs, eventKey);\n const customColumnInput = this.getInput(inputs, eventKey);\n\n const newCustomInput = { ...customColumnInput };\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() {\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) {\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={vsIssues} /> Failed to apply custom columns.\n </p>\n <div className=\"error-box\">\n {event.detail.errorMessage}\n <br />\n Table configuration: {JSON.stringify(event.detail.configuration)}\n </div>\n </>\n ),\n hasRequestFailed: true,\n });\n }\n\n handleDragEnd(result) {\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, shiftKey) {\n const { inputs } = this.state;\n // focus on drag handle\n if (shiftKey) {\n this.container\n .querySelectorAll(`.btn-drag-handle`) // eslint-disable-next-line no-unexpected-multiline\n [focusEditorIndex].focus();\n return;\n }\n if (focusEditorIndex === inputs.length - 1) {\n // focus on add another column button\n this.container.querySelector('.btn-add-column').focus();\n } else {\n // focus on next column name input\n const nextFocusIndex = focusEditorIndex + 1;\n this.container\n .querySelectorAll('.custom-column-input') // eslint-disable-next-line no-unexpected-multiline\n [nextFocusIndex].focus();\n }\n }\n\n handleSaveClick() {\n const { onSave } = this.props;\n const { inputs, isCustomColumnApplying } = this.state;\n if (isCustomColumnApplying) {\n return;\n }\n const customColumns = [];\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() {\n this.setState(({ hasRequestFailed }) => {\n if (hasRequestFailed) {\n return { hasRequestFailed: false };\n }\n return null;\n });\n }\n\n renderInputs() {\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() {\n const { inputs, isCustomColumnApplying, isSuccessShowing } = this.state;\n const saveText = inputs.length > 1 ? 'Save Columns' : 'Save Column';\n\n return (\n <button\n type=\"button\"\n className={classNames(\n 'btn btn-apply',\n {\n 'btn-spinner': isCustomColumnApplying,\n },\n isSuccessShowing ? 'btn-success' : 'btn-primary'\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() {\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 <div className=\"section-title\">Custom Column Name and Formula</div>\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 type=\"button\"\n className=\"btn btn-link btn-add-column\"\n onClick={this.handleAddColumnClick}\n >\n <FontAwesomeIcon icon={dhNewCircleLargeFilled} />\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\n type=\"button\"\n className=\"btn btn-outline-primary mr-2\"\n onClick={onCancel}\n >\n Cancel\n </button>\n {this.renderSaveButton()}\n </div>\n </div>\n </div>\n );\n }\n}\n\nCustomColumnBuilder.propTypes = {\n model: PropTypes.instanceOf(IrisGridModel).isRequired,\n customColumns: PropTypes.arrayOf(PropTypes.string),\n onSave: PropTypes.func,\n onCancel: PropTypes.func,\n};\n\nCustomColumnBuilder.defaultProps = {\n customColumns: [],\n onSave: () => {},\n onCancel: () => {},\n};\n\nexport default CustomColumnBuilder;\n"],"file":"CustomColumnBuilder.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/iris-grid",
|
|
3
|
-
"version": "0.9.2-beta.
|
|
3
|
+
"version": "0.9.2-beta.13+0ad3c48",
|
|
4
4
|
"description": "Deephaven Iris Grid",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
"start": "cross-env NODE_ENV=development npm run watch"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@deephaven/grid": "^0.9.2-beta.
|
|
33
|
-
"@deephaven/icons": "^0.9.2-beta.
|
|
34
|
-
"@deephaven/jsapi-shim": "^0.9.2-beta.
|
|
35
|
-
"@deephaven/react-hooks": "^0.9.2-beta.
|
|
36
|
-
"@deephaven/utils": "^0.9.2-beta.
|
|
32
|
+
"@deephaven/grid": "^0.9.2-beta.13+0ad3c48",
|
|
33
|
+
"@deephaven/icons": "^0.9.2-beta.13+0ad3c48",
|
|
34
|
+
"@deephaven/jsapi-shim": "^0.9.2-beta.13+0ad3c48",
|
|
35
|
+
"@deephaven/react-hooks": "^0.9.2-beta.13+0ad3c48",
|
|
36
|
+
"@deephaven/utils": "^0.9.2-beta.13+0ad3c48",
|
|
37
37
|
"@fortawesome/react-fontawesome": "^0.1.12",
|
|
38
38
|
"classnames": "^2.3.1",
|
|
39
39
|
"deep-equal": "^2.0.4",
|
|
@@ -56,10 +56,10 @@
|
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@babel/cli": "^7.16.0",
|
|
59
|
-
"@deephaven/components": "^0.9.2-beta.
|
|
60
|
-
"@deephaven/log": "^0.9.2-beta.
|
|
61
|
-
"@deephaven/mocks": "^0.9.2-beta.
|
|
62
|
-
"@deephaven/tsconfig": "^0.9.2-beta.
|
|
59
|
+
"@deephaven/components": "^0.9.2-beta.13+0ad3c48",
|
|
60
|
+
"@deephaven/log": "^0.9.2-beta.13+0ad3c48",
|
|
61
|
+
"@deephaven/mocks": "^0.9.2-beta.13+0ad3c48",
|
|
62
|
+
"@deephaven/tsconfig": "^0.9.2-beta.13+0ad3c48",
|
|
63
63
|
"@svgr/cli": "^5.5.0",
|
|
64
64
|
"@types/react": "^16.14.8",
|
|
65
65
|
"@types/react-dom": "^16.9.13",
|
|
@@ -80,5 +80,5 @@
|
|
|
80
80
|
"publishConfig": {
|
|
81
81
|
"access": "public"
|
|
82
82
|
},
|
|
83
|
-
"gitHead": "
|
|
83
|
+
"gitHead": "0ad3c4899a2a6cc97835706ecf09803885e178ee"
|
|
84
84
|
}
|