diff --git a/web/.eslintrc.js b/web/.eslintrc.js
index 5df669247..a53d0ca70 100644
--- a/web/.eslintrc.js
+++ b/web/.eslintrc.js
@@ -22,5 +22,7 @@ module.exports = {
"react"
],
"rules": {
+ "react/prop-types": "off",
+ "no-unused-vars": "warn"
}
};
\ No newline at end of file
diff --git a/web/package.json b/web/package.json
index 7bdfa8c68..02f050aa1 100644
--- a/web/package.json
+++ b/web/package.json
@@ -3,9 +3,6 @@
"version": "0.1.0",
"private": true,
"dependencies": {
- "@fortawesome/fontawesome-svg-core": "^1.2.26",
- "@fortawesome/free-solid-svg-icons": "^5.12.0",
- "@fortawesome/react-fontawesome": "^0.1.8",
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
@@ -37,5 +34,7 @@
"last 1 safari version"
]
},
- "devDependencies": {}
+ "devDependencies": {
+ "@fortawesome/fontawesome-free": "^5.12.0"
+ }
}
diff --git a/web/src/Screen.js b/web/src/Screen.js
index b2bbacec4..b242d322a 100644
--- a/web/src/Screen.js
+++ b/web/src/Screen.js
@@ -2,10 +2,7 @@ import React from "react";
import theme from "./theme";
import styled from "styled-components";
import FilesTabsPanel from "./FilesTabsPanel";
-
-
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-import { faTable } from '@fortawesome/free-solid-svg-icons'
+import SideIconPanel from "./SideIconPanel";
const BodyDiv = styled.div`
position: fixed;
@@ -56,7 +53,9 @@ const StausBar = styled.div`
export default function Screen({ children }) {
return (
<>
-
+
+
+
diff --git a/web/src/SideIconPanel.js b/web/src/SideIconPanel.js
new file mode 100644
index 000000000..db7d96f92
--- /dev/null
+++ b/web/src/SideIconPanel.js
@@ -0,0 +1,47 @@
+import React from "react";
+import theme from "./theme";
+import styled from "styled-components";
+import { FontIcon } from "./icons";
+
+const IconWrapper = styled.div`
+ color: ${theme.widgetMenu.iconFontColor};
+ font-size: ${theme.widgetMenu.iconFontSize};
+ height: ${theme.widgetMenu.iconSize}px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ &:hover {
+ background-color: ${theme.widgetMenu.backgroundHover};
+ }
+ background-color: ${props =>
+ props.isSelected ? theme.widgetMenu.backgroundSelected : "inherit"};
+`;
+
+export default function SideIconPanel() {
+ const widgets = [
+ {
+ icon: "fa-database"
+ },
+ {
+ icon: "fa-table",
+ isSelected: true
+ },
+ {
+ icon: "fa-file-alt"
+ },
+ {
+ icon: "fa-cog"
+ },
+ {
+ icon: "fa-check"
+ }
+ ];
+
+ return widgets.map(({ icon, isSelected }) => (
+
+
+
+
+
+ ));
+}
diff --git a/web/src/icons.js b/web/src/icons.js
index 62339ceda..a0ec71c87 100644
--- a/web/src/icons.js
+++ b/web/src/icons.js
@@ -1,4 +1,5 @@
-import React from 'react';
+import React from "react";
+import _ from "lodash";
function getIconImage(src, { size = 16, style = {}, className, title }) {
if (src.endsWith(".svg")) {
@@ -21,52 +22,92 @@ function getIconImage(src, { size = 16, style = {}, className, title }) {
);
}
-export const TableIcon = (props) => getIconImage("table2.svg", props);
-export const ViewIcon = (props) => getIconImage("view2.svg", props);
-export const DatabaseIcon = (props) => getIconImage("database.svg", props);
-export const ServerIcon = (props) => getIconImage("server.svg", props);
+export function getFontIcon(fontIconSpec, props = {}) {
+ let iconClass = fontIconSpec;
+ if (!iconClass) return null;
+ var parts = iconClass.split(" ");
+ var name = parts[0];
+ parts = parts.slice(1);
-export const MicrosoftIcon = (props) => getIconImage("microsoft.svg", props);
-export const MySqlIcon = (props) => getIconImage("mysql.svg", props);
-export const PostgreSqlIcon = (props) => getIconImage("postgresql.svg", props);
-export const SqliteIcon = (props) => getIconImage("sqlite.svg", props);
+ var className = props.className || "";
-export const ProcedureIcon = (props) => getIconImage("procedure2.svg", props);
-export const FunctionIcon = (props) => getIconImage("function.svg", props);
-export const TriggerIcon = (props) => getIconImage("trigger.svg", props);
+ // if (_.startsWith(name, 'bs-')) className += ` glyphicon glyphicon-${name.substr(3)}`;
+ if (_.startsWith(name, "fa-")) className += ` fas fa-${name.substr(3)}`;
-export const HomeIcon = (props) => getIconImage("home.svg", props);
-export const PrimaryKeyIcon = (props) => getIconImage("primarykey.svg", props);
-export const ForeignKeyIcon = (props) => getIconImage("foreignkey.svg", props);
-export const ComplexKeyIcon = (props) => getIconImage("complexkey.svg", props);
-export const VariableIcon = (props) => getIconImage("variable.svg", props);
-export const UniqueIcon = (props) => getIconImage("unique.svg", props);
-export const IndexIcon = (props) => getIconImage("index.svg", props);
+ if (_.includes(parts, "spin")) className += " fa-spin";
-export const StartIcon = (props) => getIconImage("start.svg", props);
-export const DownCircleIcon = (props) => getIconImage("down_circle.svg", props);
+ var style = props.style || {};
-export const ColumnIcon = (props) => getIconImage("column.svg", props);
+ var last = parts[parts.length - 1];
+ if (last && last != "spin") {
+ style["color"] = last;
+ }
-export const SqlIcon = (props) => getIconImage("sql.svg", props);
-export const ExcelIcon = (props) => getIconImage("excel.svg", props);
-export const DiagramIcon = (props) => getIconImage("diagram.svg", props);
-export const QueryDesignIcon = (props) => getIconImage("querydesign.svg", props);
-export const LocalDbIcon = (props) => getIconImage("localdb.svg", props);
-export const CsvIcon = (props) => getIconImage("csv.svg", props);
-export const ChangeSetIcon = (props) => getIconImage("changeset.svg", props);
-export const BinaryFileIcon = (props) => getIconImage("binaryfile.svg", props);
+ return ;
+}
-export const ReferenceIcon = (props) => getIconImage("reference.svg", props);
-export const LinkIcon = (props) => getIconImage("link.svg", props);
+export const TableIcon = props => getIconImage("table2.svg", props);
+export const ViewIcon = props => getIconImage("view2.svg", props);
+export const DatabaseIcon = props => getIconImage("database.svg", props);
+export const ServerIcon = props => getIconImage("server.svg", props);
-export const SequenceIcon = (props) => getIconImage("sequence.svg", props);
-export const CheckIcon = (props) => getIconImage("check.svg", props);
+export const MicrosoftIcon = props => getIconImage("microsoft.svg", props);
+export const MySqlIcon = props => getIconImage("mysql.svg", props);
+export const PostgreSqlIcon = props => getIconImage("postgresql.svg", props);
+export const SqliteIcon = props => getIconImage("sqlite.svg", props);
-export const LinkedServerIcon = (props) => getIconImage("linkedserver.svg", props);
+export const ProcedureIcon = props => getIconImage("procedure2.svg", props);
+export const FunctionIcon = props => getIconImage("function.svg", props);
+export const TriggerIcon = props => getIconImage("trigger.svg", props);
-export const EmptyIcon = (props) =>
+export const HomeIcon = props => getIconImage("home.svg", props);
+export const PrimaryKeyIcon = props => getIconImage("primarykey.svg", props);
+export const ForeignKeyIcon = props => getIconImage("foreignkey.svg", props);
+export const ComplexKeyIcon = props => getIconImage("complexkey.svg", props);
+export const VariableIcon = props => getIconImage("variable.svg", props);
+export const UniqueIcon = props => getIconImage("unique.svg", props);
+export const IndexIcon = props => getIconImage("index.svg", props);
+
+export const StartIcon = props => getIconImage("start.svg", props);
+export const DownCircleIcon = props => getIconImage("down_circle.svg", props);
+
+export const ColumnIcon = props => getIconImage("column.svg", props);
+
+export const SqlIcon = props => getIconImage("sql.svg", props);
+export const ExcelIcon = props => getIconImage("excel.svg", props);
+export const DiagramIcon = props => getIconImage("diagram.svg", props);
+export const QueryDesignIcon = props => getIconImage("querydesign.svg", props);
+export const LocalDbIcon = props => getIconImage("localdb.svg", props);
+export const CsvIcon = props => getIconImage("csv.svg", props);
+export const ChangeSetIcon = props => getIconImage("changeset.svg", props);
+export const BinaryFileIcon = props => getIconImage("binaryfile.svg", props);
+
+export const ReferenceIcon = props => getIconImage("reference.svg", props);
+export const LinkIcon = props => getIconImage("link.svg", props);
+
+export const SequenceIcon = props => getIconImage("sequence.svg", props);
+export const CheckIcon = props => getIconImage("check.svg", props);
+
+export const LinkedServerIcon = props =>
+ getIconImage("linkedserver.svg", props);
+
+export const EmptyIcon = props =>
getIconImage(
"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",
props
);
+
+export const TimesRedIcon = props => getFontIcon("fa-times red", props);
+export const TimesGreenCircleIcon = props =>
+ getFontIcon("fa-times-circle green", props);
+export const GrayFilterIcon = props =>
+ getFontIcon("fa-filter lightgray", props);
+export const ExclamationTriangleIcon = props =>
+ getFontIcon("fa-exclamation-triangle", props);
+export const HourGlassIcon = props => getFontIcon("fa-hourglass", props);
+export const InfoBlueCircleIcon = props =>
+ getFontIcon("fa-info-circle blue", props);
+
+export const SpinnerIcon = props => getFontIcon("fa-spinner spin", props);
+
+export const FontIcon = ({ name }) => ;
diff --git a/web/src/index.js b/web/src/index.js
index 87d1be551..137927ce3 100644
--- a/web/src/index.js
+++ b/web/src/index.js
@@ -1,10 +1,11 @@
-import React from 'react';
-import ReactDOM from 'react-dom';
-import './index.css';
-import App from './App';
-import * as serviceWorker from './serviceWorker';
+import React from "react";
+import ReactDOM from "react-dom";
+import "./index.css";
+import "@fortawesome/fontawesome-free/css/all.css";
+import App from "./App";
+import * as serviceWorker from "./serviceWorker";
-ReactDOM.render(, document.getElementById('root'));
+ReactDOM.render(, document.getElementById("root"));
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
diff --git a/web/src/theme.js b/web/src/theme.js
index a9e31f07d..03ed1f7c1 100644
--- a/web/src/theme.js
+++ b/web/src/theme.js
@@ -1,7 +1,11 @@
export default {
widgetMenu: {
- iconSize: 80,
- background: "#222"
+ iconSize: 60,
+ background: "#222",
+ iconFontSize: "23pt",
+ iconFontColor: "#eee",
+ backgroundHover: "#555",
+ backgroundSelected: "#4CAF50",
},
leftPanel: {
width: 300,
@@ -9,8 +13,8 @@ export default {
},
tabsPanel: {
height: 30,
- background:'#ddd',
- hoverFont: '#338'
+ background: "#ddd",
+ hoverFont: "#338"
},
statusBar: {
height: 20,
diff --git a/web/yarn.lock b/web/yarn.lock
index fde470a4a..b583e8c54 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -988,31 +988,10 @@
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
-"@fortawesome/fontawesome-common-types@^0.2.26":
- version "0.2.26"
- resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.26.tgz#6e0b13a752676036f8196f8a1500d53a27b4adc1"
- integrity sha512-CcM/fIFwZlRdiWG/25xE/wHbtyUuCtqoCTrr6BsWw7hH072fR++n4L56KPydAr3ANgMJMjT8v83ZFIsDc7kE+A==
-
-"@fortawesome/fontawesome-svg-core@^1.2.26":
- version "1.2.26"
- resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.26.tgz#671569271d6b532cdea5e3deb8ff16f8b7ac251d"
- integrity sha512-3Dfd/v2IztP1TxKOxZiB5+4kaOZK9mNy0KU1vVK7nFlPWz3gzxrCWB+AloQhQUoJ8HhGqbzjliK89Vl7PExGbw==
- dependencies:
- "@fortawesome/fontawesome-common-types" "^0.2.26"
-
-"@fortawesome/free-solid-svg-icons@^5.12.0":
+"@fortawesome/fontawesome-free@^5.12.0":
version "5.12.0"
- resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.12.0.tgz#8decac5844e60453cc0c7c51437d1461df053a35"
- integrity sha512-CnpsWs6GhTs9ekNB3d8rcO5HYqRkXbYKf2YNiAlTWbj5eVlPqsd/XH1F9If8jkcR1aegryAbln/qYeKVZzpM0g==
- dependencies:
- "@fortawesome/fontawesome-common-types" "^0.2.26"
-
-"@fortawesome/react-fontawesome@^0.1.8":
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.8.tgz#cb6d4dd3aeec45b6ff2d48c812317a6627618511"
- integrity sha512-I5h9YQg/ePA3Br9ISS18fcwOYmzQYDSM1ftH03/8nHkiqIVHtUyQBw482+60dnzvlr82gHt3mGm+nDUp159FCw==
- dependencies:
- prop-types "^15.5.10"
+ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.12.0.tgz#8ceb9f09edfb85ea18a6c7bf098f6f5dd5ffd62b"
+ integrity sha512-vKDJUuE2GAdBERaQWmmtsciAMzjwNrROXA5KTGSZvayAsmuTGjam5z6QNqNPCwDfVljLWuov1nEC3mEQf/n6fQ==
"@hapi/address@2.x.x":
version "2.1.4"
@@ -8250,7 +8229,7 @@ prompts@^2.0.1:
kleur "^3.0.3"
sisteransi "^1.0.3"
-prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.6.2, prop-types@^15.7.2:
+prop-types@^15.5.4, prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==