diff --git a/packages/api/src/controllers/jsldata.js b/packages/api/src/controllers/jsldata.js
index 609a673c3..0ab2f2ecf 100644
--- a/packages/api/src/controllers/jsldata.js
+++ b/packages/api/src/controllers/jsldata.js
@@ -1,3 +1,4 @@
+const { filterName } = require('dbgate-tools');
const fs = require('fs');
const lineReader = require('line-reader');
const _ = require('lodash');
@@ -148,6 +149,19 @@ module.exports = {
return {};
},
+ loadFieldValues_meta: true,
+ async loadFieldValues({ jslid, field, search }) {
+ const datastore = await this.ensureDatastore(jslid);
+ const res = new Set();
+ await datastore.enumRows(row => {
+ if (!filterName(search, row[field])) return true;
+ res.add(row[field]);
+ return res.size < 100;
+ });
+ // @ts-ignore
+ return [...res].map(value => ({ value }));
+ },
+
async notifyChangedStats(stats) {
// console.log('SENDING STATS', JSON.stringify(stats));
const datastore = this.datastores[stats.jslid];
diff --git a/packages/api/src/utility/JsonLinesDatastore.js b/packages/api/src/utility/JsonLinesDatastore.js
index 0f22a12f7..68fec9455 100644
--- a/packages/api/src/utility/JsonLinesDatastore.js
+++ b/packages/api/src/utility/JsonLinesDatastore.js
@@ -159,6 +159,18 @@ class JsonLinesDatastore {
}
}
+ async enumRows(eachRow) {
+ await lock.acquire('reader', async () => {
+ await this._ensureReader(0, null);
+ for (;;) {
+ const line = await this._readLine(true);
+ if (line == null) break;
+ const shouldContinue = eachRow(line);
+ if (!shouldContinue) break;
+ }
+ });
+ }
+
async getRows(offset, limit, filter) {
const res = [];
await lock.acquire('reader', async () => {
diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte
index 881227cff..b32ef4016 100644
--- a/packages/web/src/datagrid/DataFilterControl.svelte
+++ b/packages/web/src/datagrid/DataFilterControl.svelte
@@ -29,6 +29,7 @@
export let conid = null;
export let database = null;
export let driver = null;
+ export let jslid = null;
export let pureName = null;
export let schemaName = null;
@@ -177,9 +178,8 @@
{ onClick: () => openFilterWindow('>='), text: 'Greater Than Or Equal To...' },
{ onClick: () => openFilterWindow('<'), text: 'Less Than...' },
{ onClick: () => openFilterWindow('<='), text: 'Less Than Or Equal To...' },
-
- { divider: true },
+ { divider: true },
{ onClick: () => openFilterWindow('+'), text: 'Contains...' },
{ onClick: () => openFilterWindow('~'), text: 'Does Not Contain...' },
@@ -248,6 +248,7 @@
conid,
database,
driver,
+ jslid,
multiselect: true,
schemaName,
pureName,
@@ -304,6 +305,10 @@
{/if}
+ {:else if jslid}
+
+
+
{/if}
{#if showResizeSplitter}
diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte
index 99b60a8b3..831245bdd 100644
--- a/packages/web/src/datagrid/DataGridCore.svelte
+++ b/packages/web/src/datagrid/DataGridCore.svelte
@@ -336,6 +336,7 @@
export let tabControlHiddenTab = false;
export let onCustomGridRefresh;
export let useEvalFilters = false;
+ export let jslid;
// export let generalAllowSave = false;
export const activator = createActivator('DataGridCore', false);
@@ -1548,6 +1549,7 @@
schemaName={col.schemaName}
{conid}
{database}
+ {jslid}
driver={display?.driver}
filterType={useEvalFilters ? 'eval' : col.filterType || getFilterType(col.dataType)}
filter={display.getFilter(col.uniqueName)}
diff --git a/packages/web/src/modals/ValueLookupModal.svelte b/packages/web/src/modals/ValueLookupModal.svelte
index 8abb3435b..b235486e4 100644
--- a/packages/web/src/modals/ValueLookupModal.svelte
+++ b/packages/web/src/modals/ValueLookupModal.svelte
@@ -24,6 +24,7 @@
export let field;
export let driver;
export let multiselect = false;
+ export let jslid;
// console.log('ValueLookupModal', conid, database, pureName, schemaName, columnName, driver);
@@ -36,14 +37,22 @@
async function reload() {
isLoading = true;
- rows = await apiCall('database-connections/load-field-values', {
- conid,
- database,
- search,
- schemaName,
- pureName,
- field,
- });
+ if (jslid) {
+ rows = await apiCall('jsldata/load-field-values', {
+ jslid,
+ search,
+ field,
+ });
+ } else {
+ rows = await apiCall('database-connections/load-field-values', {
+ conid,
+ database,
+ search,
+ schemaName,
+ pureName,
+ field,
+ });
+ }
isLoading = false;
}