diff --git a/packages/web/src/appobj/MacroAppObject.js b/packages/web/src/appobj/MacroAppObject.js
new file mode 100644
index 000000000..cb5176abd
--- /dev/null
+++ b/packages/web/src/appobj/MacroAppObject.js
@@ -0,0 +1,15 @@
+import _ from 'lodash';
+import { filterName } from '@dbgate/datalib';
+import { StartIcon } from '../icons';
+
+const macroAppObject = () => ({ name, type, title, group }, { setOpenedTabs }) => {
+ const key = name;
+ // const Icon = (props) => ;
+ const Icon = StartIcon;
+ const matcher = (filter) => filterName(filter, name, title);
+ const groupTitle = group;
+
+ return { title, key, Icon, groupTitle, matcher };
+};
+
+export default macroAppObject;
diff --git a/packages/web/src/datagrid/DataGrid.js b/packages/web/src/datagrid/DataGrid.js
index c03078fc1..e8014e653 100644
--- a/packages/web/src/datagrid/DataGrid.js
+++ b/packages/web/src/datagrid/DataGrid.js
@@ -8,8 +8,8 @@ import {
// WidgetsInnerContainer,
// Input,
ManagerMainContainer,
- ManagerOuterContainer1,
- ManagerOuterContainer2,
+ ManagerOuterContainer_60,
+ ManagerOuterContainer_40,
ManagerOuterContainerFull,
WidgetTitle,
} from './ManagerStyles';
@@ -43,7 +43,7 @@ const DataGridContainer = styled.div`
export default function DataGrid(props) {
const { GridCore } = props;
- const Container1 = props.showReferences ? ManagerOuterContainer1 : ManagerOuterContainerFull;
+ const Container1 = props.showReferences ? ManagerOuterContainer_60 : ManagerOuterContainerFull;
const [managerSize, setManagerSize] = React.useState(0);
return (
@@ -53,9 +53,9 @@ export default function DataGrid(props) {
{props.showReferences && (
-
+
-
+
)}
diff --git a/packages/web/src/datagrid/ManagerStyles.js b/packages/web/src/datagrid/ManagerStyles.js
index cd8e9c823..07182915f 100644
--- a/packages/web/src/datagrid/ManagerStyles.js
+++ b/packages/web/src/datagrid/ManagerStyles.js
@@ -23,11 +23,11 @@ export const ManagerOuterContainer = styled.div`
display: flex;
`;
-export const ManagerOuterContainer1 = styled(ManagerOuterContainer)`
+export const ManagerOuterContainer_60 = styled(ManagerOuterContainer)`
flex: 0 0 60%;
`;
-export const ManagerOuterContainer2 = styled(ManagerOuterContainer)`
+export const ManagerOuterContainer_40 = styled(ManagerOuterContainer)`
flex: 0 0 40%;
`;
diff --git a/packages/web/src/freetable/FreeTableGrid.js b/packages/web/src/freetable/FreeTableGrid.js
index 549ae2d86..d9766962f 100644
--- a/packages/web/src/freetable/FreeTableGrid.js
+++ b/packages/web/src/freetable/FreeTableGrid.js
@@ -1,10 +1,12 @@
import React from 'react';
import styled from 'styled-components';
-import { ManagerMainContainer, ManagerOuterContainerFull } from '../datagrid/ManagerStyles';
-import { HorizontalSplitter } from '../widgets/Splitter';
+import { ManagerMainContainer, ManagerOuterContainer_60, ManagerOuterContainer_40 } from '../datagrid/ManagerStyles';
+import { HorizontalSplitter, VerticalSplitter } from '../widgets/Splitter';
import FreeTableColumnEditor from './FreeTableColumnEditor';
import FreeTableGridCore from './FreeTableGridCore';
+import MacroDetail from './MacroDetail';
+import MacroManager from './MacroManager';
const LeftContainer = styled.div`
background-color: white;
@@ -19,18 +21,38 @@ const DataGridContainer = styled.div`
export default function FreeTableGrid(props) {
const [managerSize, setManagerSize] = React.useState(0);
+ const [selectedMacro, setSelectedMacro] = React.useState(null);
+ const [macroValues, setMacroValues] = React.useState({});
return (
-
+
-
+
+
+
+
-
+
+
+ {!!selectedMacro && (
+
+ )}
+
);
diff --git a/packages/web/src/freetable/FreeTableGridCore.js b/packages/web/src/freetable/FreeTableGridCore.js
index 6857cd10e..f2c867bae 100644
--- a/packages/web/src/freetable/FreeTableGridCore.js
+++ b/packages/web/src/freetable/FreeTableGridCore.js
@@ -4,7 +4,7 @@ import DataGridCore from '../datagrid/DataGridCore';
import FreeTableGrider from './FreeTableGrider';
export default function FreeTableGridCore(props) {
- const { modelState, dispatchModel, config, setConfig } = props;
+ const { modelState, dispatchModel, config, setConfig, macroPreview, macroValues } = props;
const grider = React.useMemo(() => FreeTableGrider.factory(props), FreeTableGrider.factoryDeps(props));
const [cache, setCache] = React.useState(createGridCache());
const display = React.useMemo(() => new FreeTableGridDisplay(modelState.value, config, setConfig, cache, setCache), [
diff --git a/packages/web/src/freetable/MacroDetail.js b/packages/web/src/freetable/MacroDetail.js
new file mode 100644
index 000000000..002f6e7d0
--- /dev/null
+++ b/packages/web/src/freetable/MacroDetail.js
@@ -0,0 +1,70 @@
+import React from 'react';
+import ToolbarButton from '../widgets/ToolbarButton';
+import styled from 'styled-components';
+import { ReferenceIcon } from '../icons';
+import { TabPage, TabControl } from '../widgets/TabControl';
+import theme from '../theme';
+import JavaScriptEditor from '../sqleditor/JavaScriptEditor';
+import MacroParameters from './MacroParameters';
+
+const Container = styled.div`
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: #ddeeee;
+ height: ${theme.toolBar.height}px;
+ min-height: ${theme.toolBar.height}px;
+ overflow: hidden;
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+`;
+
+const Header = styled.div`
+ font-weight: bold;
+ margin-left: 10px;
+ display: flex;
+`;
+
+const HeaderText = styled.div`
+ margin-left: 10px;
+`;
+
+const MacroDetailContainer = styled.div`
+ position: absolute;
+ display: flex;
+ flex-direction: column;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+`;
+
+function MacroHeader({ selectedMacro, setSelectedMacro }) {
+ return (
+
+
+
+ {selectedMacro.title}
+
+ setSelectedMacro(null)} patchY={6}>
+ Close
+
+
+ );
+}
+
+export default function MacroDetail({ selectedMacro, setSelectedMacro, onChangeValues, macroValues }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/packages/web/src/freetable/MacroManager.js b/packages/web/src/freetable/MacroManager.js
new file mode 100644
index 000000000..400a6e91d
--- /dev/null
+++ b/packages/web/src/freetable/MacroManager.js
@@ -0,0 +1,52 @@
+import styled from 'styled-components';
+import _ from 'lodash';
+import React from 'react';
+import { ManagerInnerContainer } from '../datagrid/ManagerStyles';
+import SearchInput from '../widgets/SearchInput';
+import { WidgetTitle } from '../widgets/WidgetStyles';
+import macros from './macros';
+import { AppObjectList } from '../appobj/AppObjectList';
+import macroAppObject from '../appobj/MacroAppObject';
+
+const SearchBoxWrapper = styled.div`
+ display: flex;
+ margin-bottom: 5px;
+`;
+
+// const MacroItemStyled = styled.div`
+// white-space: nowrap;
+// padding: 5px;
+// &:hover {
+// background-color: lightblue;
+// }
+// `;
+
+// function MacroListItem({ macro }) {
+// return {macro.title};
+// }
+
+export default function MacroManager({ managerSize, selectedMacro, setSelectedMacro }) {
+ const inputRef = React.useRef(null);
+ const [filter, setFilter] = React.useState('');
+
+ return (
+ <>
+ Macros
+
+
+
+
+ setSelectedMacro(macro)}
+ filter={filter}
+ groupFunc={(appobj) => appobj.groupTitle}
+ />
+ {/* {macros.map((macro) => (
+
+ ))} */}
+
+ >
+ );
+}
diff --git a/packages/web/src/freetable/MacroParameters.js b/packages/web/src/freetable/MacroParameters.js
new file mode 100644
index 000000000..1dceab963
--- /dev/null
+++ b/packages/web/src/freetable/MacroParameters.js
@@ -0,0 +1,36 @@
+import React from 'react';
+import { FormTextField, FormSubmit, FormArchiveFolderSelect, FormRow, FormLabel } from '../utility/forms';
+import { Formik, Form, useFormikContext } from 'formik';
+
+function MacroArgument({ arg }) {
+ if (arg.type == 'text') {
+ return ;
+ }
+ return null;
+}
+
+function MacroArgumentList({ args, onChangeValues }) {
+ const { values } = useFormikContext();
+ React.useEffect(() => {
+ if (onChangeValues) onChangeValues(values);
+ }, [values]);
+ return (
+ <>
+ {' '}
+ {args.map((arg) => (
+
+ ))}
+ >
+ );
+}
+
+export default function MacroParameters({ args, onChangeValues, initialValues }) {
+ if (!args || args.length == 0) return null;
+ return (
+ {}}>
+
+
+ );
+}
diff --git a/packages/web/src/freetable/macros.js b/packages/web/src/freetable/macros.js
new file mode 100644
index 000000000..2e6301612
--- /dev/null
+++ b/packages/web/src/freetable/macros.js
@@ -0,0 +1,32 @@
+const macros = [
+ {
+ title: 'Remove diacritics',
+ name: 'removeDiacritics',
+ group: 'text',
+ description: 'Removes diacritics from selected cells',
+ type: 'transformValue',
+ code: `value => modules.diacritics.remove(value)`,
+ },
+ {
+ title: 'Search & replace text',
+ name: 'stringReplace',
+ group: 'text',
+ description: 'Search & replace text or regular expression',
+ type: 'transformValue',
+ args: [
+ {
+ type: 'text',
+ label: 'Find',
+ name: 'find',
+ },
+ {
+ type: 'text',
+ label: 'Replace with',
+ name: 'replace',
+ },
+ ],
+ code: `value => value ? value.toString().replace(args.find, args.replace) : value`,
+ },
+];
+
+export default macros;