diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte new file mode 100644 index 000000000..3719a8aea --- /dev/null +++ b/packages/web/src/datagrid/DataFilterControl.svelte @@ -0,0 +1,149 @@ + + + + +
+ + +
+ + diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 0d23541f0..77e8c1396 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -45,6 +45,7 @@ import registerCommand from '../commands/registerCommand'; import ColumnHeaderControl from './ColumnHeaderControl.svelte'; import DataGridRow from './DataGridRow.svelte'; + import { getFilterType, getFilterValueExpression } from 'dbgate-filterparser'; import { cellIsSelected, countColumnSizes, @@ -56,6 +57,9 @@ import { cellFromEvent, emptyCellArray, getCellRange, isRegularCell, nullCell, topLeftCell } from './selection'; import VerticalScrollBar from './VerticalScrollBar.svelte'; import LoadingInfo from '../widgets/LoadingInfo.svelte'; + import InlineButton from '../widgets/InlineButton.svelte'; + import FontIcon from '../icons/FontIcon.svelte'; + import DataFilterControl from './DataFilterControl.svelte'; export let loadNextData = undefined; export let grider = undefined; @@ -296,6 +300,36 @@ {/each} + {#if display.filterable} + + + {#if display.filterCount > 0} + display.clearFilters()} square> + + + {/if} + + {#each visibleRealColumns as col (col.uniqueName)} + + display.setFilter(col.uniqueName, value)} + /> + + {/each} + + {/if} {#each _.range(firstVisibleRowScrollIndex, Math.min(firstVisibleRowScrollIndex + visibleRowCountUpperBound, grider.rowCount)) as rowIndex (rowIndex)} diff --git a/packages/web/src/forms/FormCheckboxField.svelte b/packages/web/src/forms/FormCheckboxField.svelte index ff5b13948..652d806b1 100644 --- a/packages/web/src/forms/FormCheckboxField.svelte +++ b/packages/web/src/forms/FormCheckboxField.svelte @@ -1,6 +1,6 @@ + +
+ setFieldValue(name, value)} + /> + setFieldValue(name, value)}>{text} +
diff --git a/packages/web/src/forms/FormSelectField.svelte b/packages/web/src/forms/FormSelectField.svelte index 6bec9ef29..34e5555b2 100644 --- a/packages/web/src/forms/FormSelectField.svelte +++ b/packages/web/src/forms/FormSelectField.svelte @@ -1,6 +1,6 @@ - + diff --git a/packages/web/src/forms/FromSelectFieldRaw.svelte b/packages/web/src/forms/FormSelectFieldRaw.svelte similarity index 100% rename from packages/web/src/forms/FromSelectFieldRaw.svelte rename to packages/web/src/forms/FormSelectFieldRaw.svelte diff --git a/packages/web/src/forms/FormTextField.svelte b/packages/web/src/forms/FormTextField.svelte index 0e9ac3d54..dbcdfb9d9 100644 --- a/packages/web/src/forms/FormTextField.svelte +++ b/packages/web/src/forms/FormTextField.svelte @@ -1,6 +1,6 @@ - + diff --git a/packages/web/src/forms/FromTextFieldRaw.svelte b/packages/web/src/forms/FormTextFieldRaw.svelte similarity index 66% rename from packages/web/src/forms/FromTextFieldRaw.svelte rename to packages/web/src/forms/FormTextFieldRaw.svelte index b5a171c6c..6e148ceec 100644 --- a/packages/web/src/forms/FromTextFieldRaw.svelte +++ b/packages/web/src/forms/FormTextFieldRaw.svelte @@ -7,4 +7,4 @@ const { values, setFieldValue } = getFormContext(); - setFieldValue(name, e.target['value'])} /> + setFieldValue(name, e.target['value'])} /> diff --git a/packages/web/src/forms/TextField.svelte b/packages/web/src/forms/TextField.svelte index 3c0692a19..86e15492e 100644 --- a/packages/web/src/forms/TextField.svelte +++ b/packages/web/src/forms/TextField.svelte @@ -9,4 +9,4 @@ if (focused) onMount(() => domEditor.focus()); - + diff --git a/packages/web/src/modals/ConnectionModal.svelte b/packages/web/src/modals/ConnectionModal.svelte index 3fcc19f0c..54d9a4a7b 100644 --- a/packages/web/src/modals/ConnectionModal.svelte +++ b/packages/web/src/modals/ConnectionModal.svelte @@ -12,10 +12,9 @@ import FormFieldTemplateLarge from './FormFieldTemplateLarge.svelte'; import ModalBase from './ModalBase.svelte'; - import { closeModal } from './modalTools'; + import { closeCurrentModal, closeModal } from './modalTools'; export let connection; - export let modalId; let isTesting; let sqlConnectResult; @@ -40,7 +39,7 @@ async function handleSubmit(e) { axios.post('connections/save', e.detail); - closeModal(modalId); + closeCurrentModal(); } @@ -48,7 +47,7 @@ template={FormFieldTemplateLarge} initialValues={connection || { server: 'localhost', engine: 'mssql@dbgate-plugin-mssql' }} > - +
Add connection
+ import FormButton from '../forms/FormButton.svelte'; + + import FormProvider from '../forms/FormProvider.svelte'; + import FormSubmit from '../forms/FormSubmit.svelte'; + import FormTextFieldRaw from '../forms/FormTextFieldRaw.svelte'; + import FormFieldTemplateLarge from './FormFieldTemplateLarge.svelte'; + import SetFilterModal_Select from './SetFilterModal_Select.svelte'; + import ModalBase from './ModalBase.svelte'; + import { closeCurrentModal } from './modalTools'; + import FormRadioGroupItem from '../forms/FormRadioGroupItem.svelte'; + + export let condition1; + export let onFilter; + export let filterType; + + const createTerm = (condition, value) => { + if (!value) return null; + if (filterType == 'string') return `${condition}"${value}"`; + return `${condition}${value}`; + }; + + const handleOk = e => { + const values = e.detail; + const { value1, condition1, value2, condition2, joinOperator } = values; + const term1 = createTerm(condition1, value1); + const term2 = createTerm(condition2, value2); + if (term1 && term2) onFilter(`${term1}${joinOperator}${term2}`); + else if (term1) onFilter(term1); + else if (term2) onFilter(term2); + closeCurrentModal(); + }; + + + + +
Set filter
+ +
+
Show rows where
+
+
+ +
+
+ +
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+
+ +
+ + +
+
+
+ + diff --git a/packages/web/src/modals/SetFilterModal_Select.svelte b/packages/web/src/modals/SetFilterModal_Select.svelte new file mode 100644 index 000000000..c57bfde13 --- /dev/null +++ b/packages/web/src/modals/SetFilterModal_Select.svelte @@ -0,0 +1,46 @@ + + + diff --git a/packages/web/src/modals/modalTools.ts b/packages/web/src/modals/modalTools.ts index c23718b82..dcfd7793b 100644 --- a/packages/web/src/modals/modalTools.ts +++ b/packages/web/src/modals/modalTools.ts @@ -1,5 +1,6 @@ import { openedModals } from '../stores'; import uuidv1 from 'uuid/v1'; +import _ from 'lodash'; export function showModal(component, props = {}) { const modalId = uuidv1(); @@ -9,3 +10,7 @@ export function showModal(component, props = {}) { export function closeModal(modalId) { openedModals.update(x => x.filter(y => y.modalId != modalId)); } + +export function closeCurrentModal() { + openedModals.update(x => _.dropRight(x)); +} diff --git a/packages/web/src/widgets/DropDownButton.svelte b/packages/web/src/widgets/DropDownButton.svelte index 7f6213837..e60c92f69 100644 --- a/packages/web/src/widgets/DropDownButton.svelte +++ b/packages/web/src/widgets/DropDownButton.svelte @@ -1,8 +1,22 @@ - - - + + diff --git a/packages/web/src/widgets/InlineButton.svelte b/packages/web/src/widgets/InlineButton.svelte index 3625ff2bf..2ea2a9088 100644 --- a/packages/web/src/widgets/InlineButton.svelte +++ b/packages/web/src/widgets/InlineButton.svelte @@ -1,9 +1,15 @@ -
+
@@ -41,7 +47,6 @@ background-color: var(--bg-2); } - .inner { margin: auto; flex: 1;