{e.preventDefault();}}>
diff --git a/web/pgadmin/tools/erd/static/js/erd_tool/components/MainToolBar.jsx b/web/pgadmin/tools/erd/static/js/erd_tool/components/MainToolBar.jsx
index 22122046c..ff28cfae7 100644
--- a/web/pgadmin/tools/erd/static/js/erd_tool/components/MainToolBar.jsx
+++ b/web/pgadmin/tools/erd/static/js/erd_tool/components/MainToolBar.jsx
@@ -8,7 +8,7 @@
//////////////////////////////////////////////////////////////
import React, {useCallback, useEffect, useState} from 'react';
import { makeStyles } from '@material-ui/styles';
-import { Box } from '@material-ui/core';
+import { Box, useTheme } from '@material-ui/core';
import { PgButtonGroup, PgIconButton } from '../../../../../../static/js/components/Buttons';
import FolderRoundedIcon from '@material-ui/icons/FolderRounded';
import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';
@@ -25,6 +25,8 @@ import NoteRoundedIcon from '@material-ui/icons/NoteRounded';
import VisibilityRoundedIcon from '@material-ui/icons/VisibilityRounded';
import VisibilityOffRoundedIcon from '@material-ui/icons/VisibilityOffRounded';
import ImageRoundedIcon from '@material-ui/icons/ImageRounded';
+import FormatColorFillRoundedIcon from '@material-ui/icons/FormatColorFillRounded';
+import FormatColorTextRoundedIcon from '@material-ui/icons/FormatColorTextRounded';
import { PgMenu, PgMenuItem, usePgMenuGroup } from '../../../../../../static/js/components/Menu';
import gettext from 'sources/gettext';
@@ -33,6 +35,7 @@ import PropTypes from 'prop-types';
import { ERD_EVENTS } from '../ERDConstants';
import { MagicIcon, SQLFileIcon } from '../../../../../../static/js/components/ExternalIcon';
import { useModal } from '../../../../../../static/js/helpers/ModalProvider';
+import { withColorPicker } from '../../../../../../static/js/helpers/withColorPicker';
const useStyles = makeStyles((theme)=>({
root: {
@@ -54,8 +57,9 @@ const useStyles = makeStyles((theme)=>({
},
}));
-export function MainToolBar({preferences, eventBus}) {
+export function MainToolBar({preferences, eventBus, fillColor, textColor}) {
const classes = useStyles();
+ const theme = useTheme();
const [buttonsDisabled, setButtonsDisabled] = useState({
'save': true,
'edit-table': true,
@@ -196,7 +200,7 @@ export function MainToolBar({preferences, eventBus}) {
}
shortcut={preferences.add_table}
onClick={()=>{
- eventBus.fireEvent(ERD_EVENTS.ADD_NODE);
+ eventBus.fireEvent(ERD_EVENTS.ADD_NODE, {fillColor: fillColor, textColor: textColor});
}} />
}
shortcut={preferences.edit_table} disabled={buttonsDisabled['edit-table']}
@@ -226,6 +230,30 @@ export function MainToolBar({preferences, eventBus}) {
eventBus.fireEvent(ERD_EVENTS.MANY_TO_MANY);
}} />
+
+ }
+ value={fillColor ?? theme.palette.background.default} options={{
+ allowSave: true,
+ }}
+ onSave={(val)=>{
+ if(val) {
+ eventBus.fireEvent(ERD_EVENTS.CHANGE_COLORS, val, textColor);
+ } else {
+ eventBus.fireEvent(ERD_EVENTS.CHANGE_COLORS, null, textColor);
+ }
+ }}/>
+ }
+ value={textColor ?? theme.palette.text.primary} options={{
+ allowSave: true,
+ }}
+ onSave={(val)=>{
+ if(val) {
+ eventBus.fireEvent(ERD_EVENTS.CHANGE_COLORS, fillColor, val);
+ } else {
+ eventBus.fireEvent(ERD_EVENTS.CHANGE_COLORS, fillColor, null);
+ }
+ }}/>
+
}
shortcut={preferences.add_edit_note} disabled={buttonsDisabled['show-note']}
@@ -290,4 +318,8 @@ export function MainToolBar({preferences, eventBus}) {
MainToolBar.propTypes = {
preferences: PropTypes.object,
eventBus: PropTypes.object,
+ fillColor: PropTypes.string,
+ textColor: PropTypes.string,
};
+
+const ColorButton = withColorPicker(PgIconButton);
diff --git a/web/pgadmin/tools/erd/static/js/erd_tool/nodes/TableNode.jsx b/web/pgadmin/tools/erd/static/js/erd_tool/nodes/TableNode.jsx
index 58f97f487..bbb6d2bfb 100644
--- a/web/pgadmin/tools/erd/static/js/erd_tool/nodes/TableNode.jsx
+++ b/web/pgadmin/tools/erd/static/js/erd_tool/nodes/TableNode.jsx
@@ -49,6 +49,7 @@ export class TableNodeModel extends DefaultNodeModel {
/* Once the data is available, it is no more a promise */
this._data = data;
this._metadata = {
+ ...this._metadata,
data_failed: false,
is_promise: false,
};
@@ -56,6 +57,7 @@ export class TableNodeModel extends DefaultNodeModel {
this.fireEvent({}, 'nodeUpdated');
}).catch(()=>{
this._metadata = {
+ ...this._metadata,
data_failed: true,
is_promise: true,
};
@@ -85,6 +87,13 @@ export class TableNodeModel extends DefaultNodeModel {
return this._metadata;
}
+ setMetadata(metadata) {
+ this._metadata = {
+ ...this._metadata,
+ ...metadata,
+ };
+ }
+
addColumn(col) {
this._data.columns.push(col);
}
@@ -152,6 +161,7 @@ RowIcon.propTypes = {
const styles = (theme)=>({
tableNode: {
backgroundColor: theme.palette.background.default,
+ color: theme.palette.text.primary,
...theme.mixins.panelBorder.all,
borderRadius: theme.shape.borderRadius,
position: 'relative',
@@ -202,6 +212,12 @@ class TableNodeWidgetRaw extends React.Component {
toggleDetails: (event) => {
this.setState({show_details: event.show_details});
},
+ changeColors: (event)=>{
+ this.props.node.setMetadata({
+ fillColor: event.fillColor, textColor: event.textColor,
+ });
+ this.setState({});
+ },
dataAvaiable: ()=>{
/* Just re-render */
this.setState({});
@@ -271,8 +287,13 @@ class TableNodeWidgetRaw extends React.Component {
localUkCols.push(...uk.columns.map((c)=>c.column));
});
const {classes} = this.props;
+ const styles = {
+ backgroundColor: tableMetaData.fillColor,
+ color: tableMetaData.textColor,
+ };
return (
- {this.props.node.fireEvent({}, 'editTable');}}>
+
{this.props.node.fireEvent({}, 'editTable');}} style={styles}>
:
}
onClick={this.toggleShowDetails} onDoubleClick={(e)=>{e.stopPropagation();}} />
diff --git a/web/regression/javascript/erd/fake_item.js b/web/regression/javascript/erd/fake_item.js
index 94b510c8d..9332ca73b 100644
--- a/web/regression/javascript/erd/fake_item.js
+++ b/web/regression/javascript/erd/fake_item.js
@@ -25,6 +25,7 @@ export class FakeNode {
retVal.name = tabName;
return retVal;
}
+ setMetadata() {/* no-op */}
getMetadata() {
return {
is_promise: false,
diff --git a/web/regression/javascript/erd/ui_components/ERDTool.spec.js b/web/regression/javascript/erd/ui_components/ERDTool.spec.js
index c65131113..a9dfdcd15 100644
--- a/web/regression/javascript/erd/ui_components/ERDTool.spec.js
+++ b/web/regression/javascript/erd/ui_components/ERDTool.spec.js
@@ -132,6 +132,7 @@ describe('ERDTool', ()=>{
body = erd.find('ERDTool');
bodyInstance = body.instance();
spyOn(bodyInstance, 'getDialog').and.callFake(getDialog);
+ spyOn(bodyInstance, 'onChangeColors').and.callFake(()=>{/*no op*/});
});
afterAll(() => {
@@ -248,7 +249,7 @@ describe('ERDTool', ()=>{
let saveCallback = tableDialog.calls.mostRecent().args[3];
let newData = {key: 'value'};
saveCallback(newData);
- expect(bodyInstance.diagram.addNode).toHaveBeenCalledWith(newData);
+ expect(bodyInstance.diagram.addNode.calls.mostRecent().args[0]).toEqual(newData);
/* Existing */
tableDialog.calls.reset();