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;