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}
+
+
+ {#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
+
+
+
+
+
+
+
+
+
+
+
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 @@
-