Browse Source

Merge branch 'develop' into refactor/timezone-locale

pull/5689/head
Wing-Kam Wong 1 year ago
parent
commit
e3a9a19c6d
  1. 2
      .run/Run NocoDB Sqlite.run.xml
  2. 4
      packages/nc-gui/components/dashboard/settings/data-sources/CreateBase.vue
  3. 10
      packages/nc-gui/lang/fr.json
  4. 2
      packages/nc-gui/package-lock.json
  5. 2
      packages/nc-lib-gui/package.json
  6. 4
      packages/nocodb-sdk/package-lock.json
  7. 2
      packages/nocodb-sdk/package.json
  8. 2
      packages/nocodb-sdk/src/lib/Api.ts
  9. 20
      packages/nocodb/package-lock.json
  10. 4
      packages/nocodb/package.json
  11. 2
      packages/nocodb/src/Noco.ts
  12. 33
      packages/nocodb/src/db/BaseModelSqlv2.ts
  13. 5
      packages/nocodb/src/schema/swagger.json
  14. 2
      packages/nocodb/src/services/app-init.service.ts
  15. 23
      packages/nocodb/src/services/datas.service.ts
  16. 37
      packages/nocodb/tests/unit/rest/tests/tableRow.test.ts
  17. 2
      packages/nocodb/tests/unit/rest/tests/viewRow.test.ts

2
.run/Run NocoDB Sqlite.run.xml

@ -12,4 +12,4 @@
</envs>
<method v="2" />
</configuration>
</component>
</component>

4
packages/nc-gui/components/dashboard/settings/data-sources/CreateBase.vue

@ -495,7 +495,7 @@ watch(
</a-form-item>
<div class="flex items-right justify-end gap-2">
<!-- Use Connection URL -->
<a-button type="primary" class="nc-extdb-btn-import-url !rounded-md" @click.stop="importURLDlg = true">
<a-button class="nc-extdb-btn-import-url !rounded-md" @click.stop="importURLDlg = true">
{{ $t('activity.useConnectionUrl') }}
</a-button>
</div>
@ -611,7 +611,7 @@ watch(
<a-form-item class="flex justify-end !mt-5">
<div class="flex justify-end gap-2">
<a-button type="text" class="nc-extdb-btn-test-connection !rounded-md" @click="testConnection">
<a-button type="primary" class="nc-extdb-btn-test-connection !rounded-md" @click="testConnection">
{{ $t('activity.testDbConn') }}
</a-button>

10
packages/nc-gui/lang/fr.json

@ -260,7 +260,7 @@
"barcodeFormat": "Format du code-barres",
"qrCodeValueTooLong": "Trop de caractères pour un code QR",
"barcodeValueTooLong": "Trop de caractères pour un code-barres",
"currentLocation": "Current Location",
"currentLocation": "Emplacement actuel",
"lng": "Lng",
"lat": "Lat",
"aggregateFunction": "Fonction agrégée",
@ -385,12 +385,12 @@
"nextRecord": "Ligne suivante",
"previousRecord": "Ligne précédente",
"copyApiURL": "Copier l'URL de l'API",
"createTable": "Create New Table",
"createTable": "Créer une nouvelle table",
"refreshTable": "Actualiser le tableau",
"renameTable": "Rename Table",
"deleteTable": "Delete Table",
"renameTable": "Renommer la table",
"deleteTable": "Supprimer la table",
"addField": "Ajouter un nouveau champ à ce tableau",
"setDisplay": "Set as Display value",
"setDisplay": "Définir comme valeur d'affichage",
"addRow": "Ajouter une nouvelle ligne",
"saveRow": "Enregistrer la ligne",
"saveAndExit": "Enregistrer et quitter",

2
packages/nc-gui/package-lock.json generated

@ -110,7 +110,7 @@
}
},
"../nocodb-sdk": {
"version": "0.107.4",
"version": "0.107.5",
"license": "AGPL-3.0-or-later",
"dependencies": {
"axios": "^0.21.1",

2
packages/nc-lib-gui/package.json

@ -1,6 +1,6 @@
{
"name": "nc-lib-gui",
"version": "0.107.4",
"version": "0.107.5",
"description": "NocoDB GUI",
"author": {
"name": "NocoDB",

4
packages/nocodb-sdk/package-lock.json generated

@ -1,12 +1,12 @@
{
"name": "nocodb-sdk",
"version": "0.107.4",
"version": "0.107.5",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "nocodb-sdk",
"version": "0.107.4",
"version": "0.107.5",
"license": "AGPL-3.0-or-later",
"dependencies": {
"axios": "^0.21.1",

2
packages/nocodb-sdk/package.json

@ -1,6 +1,6 @@
{
"name": "nocodb-sdk",
"version": "0.107.4",
"version": "0.107.5",
"description": "NocoDB SDK",
"main": "build/main/index.js",
"typings": "build/main/index.d.ts",

2
packages/nocodb-sdk/src/lib/Api.ts

@ -1603,7 +1603,7 @@ export interface NormalColumnRequestType {
/** Data Type Extra */
dtx?: StringOrNullType;
/** Data Type Extra Precision */
dtxp?: StringOrNullType | number;
dtxp?: string | number | null;
/** Data Type Extra Scale */
dtxs?: StringOrNullType | number;
/** Numeric Precision */

20
packages/nocodb/package-lock.json generated

@ -1,12 +1,12 @@
{
"name": "nocodb",
"version": "0.107.4",
"version": "0.107.5",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "nocodb",
"version": "0.107.4",
"version": "0.107.5",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@google-cloud/storage": "^5.7.2",
@ -80,7 +80,7 @@
"mysql2": "^3.2.0",
"nanoid": "^3.1.20",
"nc-help": "^0.2.87",
"nc-lib-gui": "0.107.4",
"nc-lib-gui": "0.107.5",
"nc-plugin": "^0.1.3",
"ncp": "^2.0.0",
"nocodb-sdk": "file:../nocodb-sdk",
@ -190,7 +190,7 @@
}
},
"../nocodb-sdk": {
"version": "0.107.4",
"version": "0.107.5",
"license": "AGPL-3.0-or-later",
"dependencies": {
"axios": "^0.21.1",
@ -13157,9 +13157,9 @@
}
},
"node_modules/nc-lib-gui": {
"version": "0.107.4",
"resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.107.4.tgz",
"integrity": "sha512-+e0jjJgrBfgLGTTShkcu1QQ2I0QxE/NUCCJ5L8KeZibm71pvgxL/P2hfatSz8PvzSDU/YwXnyXZQkeaSDBzNyA==",
"version": "0.107.5",
"resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.107.5.tgz",
"integrity": "sha512-bFmKo6qDmrHY7a3itHMnp1A8qFecHyNKZABWK4GIdA8xCeSx6rLL8LGzxDRsD3fIXFwTCzSd8iPJECHaF5fcFg==",
"dependencies": {
"express": "^4.17.1"
}
@ -28442,9 +28442,9 @@
}
},
"nc-lib-gui": {
"version": "0.107.4",
"resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.107.4.tgz",
"integrity": "sha512-+e0jjJgrBfgLGTTShkcu1QQ2I0QxE/NUCCJ5L8KeZibm71pvgxL/P2hfatSz8PvzSDU/YwXnyXZQkeaSDBzNyA==",
"version": "0.107.5",
"resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.107.5.tgz",
"integrity": "sha512-bFmKo6qDmrHY7a3itHMnp1A8qFecHyNKZABWK4GIdA8xCeSx6rLL8LGzxDRsD3fIXFwTCzSd8iPJECHaF5fcFg==",
"requires": {
"express": "^4.17.1"
}

4
packages/nocodb/package.json

@ -1,6 +1,6 @@
{
"name": "nocodb",
"version": "0.107.4",
"version": "0.107.5",
"description": "NocoDB Backend",
"main": "dist/bundle.js",
"author": {
@ -113,7 +113,7 @@
"mysql2": "^3.2.0",
"nanoid": "^3.1.20",
"nc-help": "^0.2.87",
"nc-lib-gui": "0.107.4",
"nc-lib-gui": "0.107.5",
"nc-plugin": "^0.1.3",
"ncp": "^2.0.0",
"nocodb-sdk": "file:../nocodb-sdk",

2
packages/nocodb/src/Noco.ts

@ -1,6 +1,6 @@
import path from 'path';
import Sentry, { Handlers } from '@sentry/node';
import { Logger } from '@nestjs/common';
import path from 'path';
import { NestFactory } from '@nestjs/core';
import clear from 'clear';
import * as express from 'express';

33
packages/nocodb/src/db/BaseModelSqlv2.ts

@ -144,10 +144,24 @@ class BaseModelSqlv2 {
autoBind(this);
}
public async readByPk(id?: any, validateFormula = false): Promise<any> {
public async readByPk(
id?: any,
validateFormula = false,
query: any = {},
): Promise<any> {
const qb = this.dbDriver(this.tnPath);
await this.selectObject({ qb, validateFormula });
const { ast, dependencyFields } = await getAst({
query,
model: this.model,
view: this.viewId && (await View.get(this.viewId)),
});
await this.selectObject({
...(dependencyFields ?? {}),
qb,
validateFormula,
});
qb.where(_wherePk(this.model.primaryKeys, id));
@ -167,14 +181,7 @@ class BaseModelSqlv2 {
data.__proto__ = proto;
}
// retrieve virtual column data as well
const project = await Project.get(this.model.project_id);
const { model, view } = await getViewAndModelByAliasOrId({
projectName: project.title,
tableName: this.model.title,
});
const { ast } = await getAst({ model, view });
return data ? await nocoExecute(ast, data, {}) : {};
return data ? await nocoExecute(ast, data, {}, query) : {};
}
public async exist(id?: any): Promise<any> {
@ -204,7 +211,7 @@ class BaseModelSqlv2 {
): Promise<any> {
const { where, ...rest } = this._getListArgs(args as any);
const qb = this.dbDriver(this.tnPath);
await this.selectObject({ qb, validateFormula });
await this.selectObject({ ...args, qb, validateFormula });
const aliasColObjMap = await this.model.getAliasColObjMap();
const sorts = extractSortsObject(rest?.sort, aliasColObjMap);
@ -2188,6 +2195,7 @@ class BaseModelSqlv2 {
raw?: boolean;
} = {},
) {
let trx;
try {
// TODO: ag column handling for raw bulk insert
const insertDatas = raw
@ -2216,7 +2224,7 @@ class BaseModelSqlv2 {
// refer : https://www.sqlite.org/limits.html
const chunkSize = this.isSqlite ? 10 : _chunkSize;
const trx = await this.dbDriver.transaction();
trx = await this.dbDriver.transaction();
if (!foreign_key_checks) {
if (this.isPg) {
@ -2247,6 +2255,7 @@ class BaseModelSqlv2 {
return response;
} catch (e) {
await trx?.rollback();
// await this.errorInsertb(e, data, null);
throw e;
}

5
packages/nocodb/src/schema/swagger.json

@ -17834,10 +17834,13 @@
"dtxp": {
"oneOf": [
{
"$ref": "#/components/schemas/StringOrNull"
"type": "string"
},
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Data Type Extra Precision"

2
packages/nocodb/src/services/app-init.service.ts

@ -4,7 +4,7 @@ import { Connection } from '../connection/connection';
import initAdminFromEnv from '../helpers/initAdminFromEnv';
import NcPluginMgrv2 from '../helpers/NcPluginMgrv2';
import { MetaService } from '../meta/meta.service';
import { User } from '../models'
import { User } from '../models';
import Noco from '../Noco';
import getInstance from '../utils/getInstance';
import NcConfigFactory from '../utils/NcConfigFactory';

23
packages/nocodb/src/services/datas.service.ts

@ -185,8 +185,8 @@ export class DatasService {
view,
});
const data = await baseModel.findOne({ ...args, dependencyFields });
return data ? await nocoExecute(ast, data, {}, {}) : {};
const data = await baseModel.findOne({ ...args, ...dependencyFields });
return data ? await nocoExecute(ast, data, {}, dependencyFields) : {};
}
async getDataGroupBy(param: { model: Model; view: View; query?: any }) {
@ -221,15 +221,13 @@ export class DatasService {
dbDriver: await NcConnectionMgrv2.get(base),
});
const row = await baseModel.readByPk(param.rowId);
const row = await baseModel.readByPk(param.rowId, false, param.query);
if (!row) {
NcError.notFound('Row not found');
}
const { ast } = await getAst({ model, query: param.query, view });
return await nocoExecute(ast, row, {}, param.query);
return row;
}
async dataExist(param: PathParams & { rowId: string; query: any }) {
@ -274,9 +272,9 @@ export class DatasService {
dbDriver: await NcConnectionMgrv2.get(base),
});
const { ast } = await getAst({ model, query, view });
const { ast, dependencyFields } = await getAst({ model, query, view });
const listArgs: any = { ...query };
const listArgs: any = { ...dependencyFields };
try {
listArgs.filterArr = JSON.parse(listArgs.filterArrJson);
} catch (e) {}
@ -637,13 +635,16 @@ export class DatasService {
dbDriver: await NcConnectionMgrv2.get(base),
});
const { ast } = await getAst({ model, query: param.query });
const { ast, dependencyFields } = await getAst({
model,
query: param.query,
});
return await nocoExecute(
ast,
await baseModel.readByPk(param.rowId),
{},
await baseModel.readByPk(param.rowId, false),
{},
dependencyFields,
);
} catch (e) {
console.log(e);

37
packages/nocodb/tests/unit/rest/tests/tableRow.test.ts

@ -1106,7 +1106,9 @@ function tableTest() {
);
const nestedFields = {
'Rental List': ['RentalDate', 'ReturnDate'],
'Rental List': {
f: 'RentalDate,ReturnDate',
},
};
const nestedFilter = [
@ -1276,6 +1278,39 @@ function tableTest() {
}
});
it('Read table row with nested fields', async () => {
const rowId = 1;
const actorTable = await getTable({
project: sakilaProject,
name: 'actor',
});
const response = await request(context.app)
.get(
`/api/v1/db/data/noco/${sakilaProject.id}/${actorTable.id}/${rowId}/`,
)
.set('xc-auth', context.token)
.query({
'nested[Film List][fields]': 'Title,ReleaseYear,Language',
})
.expect(200);
const record = response.body;
expect(record['Film List']).length(19);
expect(record['Film List'][0]).to.have.all.keys(
'Title',
'ReleaseYear',
'Language',
);
// for SQLite Sakila, Language is null
if (isPg(context)) {
expect(record['Film List'][0]['Language']).to.have.all.keys(
'Name',
'LanguageId',
);
}
});
it('Update table row', async function () {
const table = await createTable(context, project);
const row = await createRow(context, { project, table });

2
packages/nocodb/tests/unit/rest/tests/viewRow.test.ts

@ -901,7 +901,7 @@ function viewRowTests() {
);
const nestedFields = {
'Rental List': ['RentalDate', 'ReturnDate'],
'Rental List': { f: 'RentalDate,ReturnDate' },
};
const nestedFilter = [

Loading…
Cancel
Save