adminforth 2.4.0-next.25 → 2.4.0-next.250
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/callTsProxy.js +14 -4
- package/commands/cli.js +10 -3
- package/commands/createApp/templates/api.ts.hbs +10 -0
- package/commands/createApp/templates/custom/tsconfig.json.hbs +2 -3
- package/commands/createApp/templates/index.ts.hbs +12 -1
- package/commands/createApp/templates/package.json.hbs +1 -1
- package/commands/createApp/utils.js +32 -2
- package/commands/createCustomComponent/configLoader.js +17 -4
- package/commands/createCustomComponent/main.js +1 -0
- package/commands/createCustomComponent/templates/customCrud/beforeActionButtons.vue.hbs +38 -0
- package/commands/createPlugin/templates/custom/tsconfig.json.hbs +2 -5
- package/commands/createPlugin/templates/package.json.hbs +1 -1
- package/commands/generateModels.js +30 -22
- package/dist/auth.d.ts +9 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +15 -2
- package/dist/auth.js.map +1 -1
- package/dist/dataConnectors/baseConnector.d.ts.map +1 -1
- package/dist/dataConnectors/baseConnector.js +46 -15
- package/dist/dataConnectors/baseConnector.js.map +1 -1
- package/dist/dataConnectors/clickhouse.d.ts.map +1 -1
- package/dist/dataConnectors/clickhouse.js +15 -0
- package/dist/dataConnectors/clickhouse.js.map +1 -1
- package/dist/dataConnectors/mongo.d.ts.map +1 -1
- package/dist/dataConnectors/mongo.js +50 -15
- package/dist/dataConnectors/mongo.js.map +1 -1
- package/dist/dataConnectors/mysql.d.ts.map +1 -1
- package/dist/dataConnectors/mysql.js +11 -0
- package/dist/dataConnectors/mysql.js.map +1 -1
- package/dist/dataConnectors/postgres.d.ts.map +1 -1
- package/dist/dataConnectors/postgres.js +11 -0
- package/dist/dataConnectors/postgres.js.map +1 -1
- package/dist/dataConnectors/sqlite.d.ts.map +1 -1
- package/dist/dataConnectors/sqlite.js +11 -0
- package/dist/dataConnectors/sqlite.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -9
- package/dist/index.js.map +1 -1
- package/dist/modules/codeInjector.d.ts +2 -0
- package/dist/modules/codeInjector.d.ts.map +1 -1
- package/dist/modules/codeInjector.js +52 -8
- package/dist/modules/codeInjector.js.map +1 -1
- package/dist/modules/configValidator.d.ts +6 -0
- package/dist/modules/configValidator.d.ts.map +1 -1
- package/dist/modules/configValidator.js +184 -19
- package/dist/modules/configValidator.js.map +1 -1
- package/dist/modules/restApi.d.ts.map +1 -1
- package/dist/modules/restApi.js +154 -26
- package/dist/modules/restApi.js.map +1 -1
- package/dist/modules/styles.d.ts +499 -13
- package/dist/modules/styles.d.ts.map +1 -1
- package/dist/modules/styles.js +555 -31
- package/dist/modules/styles.js.map +1 -1
- package/dist/modules/utils.d.ts +7 -15
- package/dist/modules/utils.d.ts.map +1 -1
- package/dist/modules/utils.js +45 -68
- package/dist/modules/utils.js.map +1 -1
- package/dist/servers/express.d.ts +5 -0
- package/dist/servers/express.d.ts.map +1 -1
- package/dist/servers/express.js +40 -1
- package/dist/servers/express.js.map +1 -1
- package/dist/spa/index.html +1 -1
- package/dist/spa/package-lock.json +5 -4
- package/dist/spa/package.json +1 -1
- package/dist/spa/src/App.vue +58 -173
- package/dist/spa/src/adminforth.ts +42 -18
- package/dist/spa/src/afcl/BarChart.vue +2 -2
- package/dist/spa/src/afcl/Button.vue +6 -6
- package/dist/spa/src/afcl/ButtonGroup.vue +91 -0
- package/dist/spa/src/afcl/Card.vue +25 -0
- package/dist/spa/src/afcl/Checkbox.vue +21 -13
- package/dist/spa/src/afcl/CountryFlag.vue +4 -1
- package/dist/spa/src/{components/CustomDatePicker.vue → afcl/DatePicker.vue} +95 -9
- package/dist/spa/src/afcl/Dialog.vue +47 -27
- package/dist/spa/src/afcl/Dropzone.vue +12 -12
- package/dist/spa/src/afcl/Input.vue +5 -5
- package/dist/spa/src/afcl/JsonViewer.vue +25 -0
- package/dist/spa/src/afcl/LinkButton.vue +3 -3
- package/dist/spa/src/afcl/PieChart.vue +5 -5
- package/dist/spa/src/afcl/ProgressBar.vue +7 -7
- package/dist/spa/src/afcl/Select.vue +68 -34
- package/dist/spa/src/afcl/Skeleton.vue +6 -6
- package/dist/spa/src/afcl/Table.vue +213 -74
- package/dist/spa/src/afcl/Textarea.vue +31 -0
- package/dist/spa/src/afcl/Toggle.vue +32 -0
- package/dist/spa/src/afcl/Tooltip.vue +26 -18
- package/dist/spa/src/afcl/VerticalTabs.vue +16 -7
- package/dist/spa/src/afcl/index.ts +6 -3
- package/dist/spa/src/components/AcceptModal.vue +47 -14
- package/dist/spa/src/components/Breadcrumbs.vue +5 -5
- package/dist/spa/src/components/ColumnValueInput.vue +38 -18
- package/dist/spa/src/components/ColumnValueInputWrapper.vue +4 -3
- package/dist/spa/src/components/CustomDateRangePicker.vue +9 -8
- package/dist/spa/src/components/CustomRangePicker.vue +37 -8
- package/dist/spa/src/components/ErrorMessage.vue +21 -0
- package/dist/spa/src/components/Filters.vue +85 -39
- package/dist/spa/src/components/GroupsTable.vue +9 -8
- package/dist/spa/src/components/MenuLink.vue +90 -23
- package/dist/spa/src/components/ResourceForm.vue +94 -51
- package/dist/spa/src/components/ResourceListTable.vue +90 -80
- package/dist/spa/src/components/ResourceListTableVirtual.vue +86 -76
- package/dist/spa/src/components/ShowTable.vue +21 -15
- package/dist/spa/src/components/Sidebar.vue +470 -0
- package/dist/spa/src/components/SingleSkeletLoader.vue +6 -6
- package/dist/spa/src/components/SkeleteLoader.vue +3 -3
- package/dist/spa/src/components/ThreeDotsMenu.vue +73 -14
- package/dist/spa/src/components/Toast.vue +27 -9
- package/dist/spa/src/components/UserMenuSettingsButton.vue +67 -0
- package/dist/spa/src/components/ValueRenderer.vue +43 -16
- package/dist/spa/src/controls/BoolToggle.vue +34 -0
- package/dist/spa/src/i18n.ts +1 -1
- package/dist/spa/src/renderers/CompactField.vue +1 -1
- package/dist/spa/src/renderers/CompactUUID.vue +1 -1
- package/dist/spa/src/router/index.ts +8 -0
- package/dist/spa/src/shims-vue.d.ts +5 -0
- package/dist/spa/src/spa_types/core.ts +13 -1
- package/dist/spa/src/stores/core.ts +9 -1
- package/dist/spa/src/stores/filters.ts +29 -2
- package/dist/spa/src/stores/modal.ts +6 -1
- package/dist/spa/src/stores/toast.ts +22 -3
- package/dist/spa/src/types/Back.ts +158 -22
- package/dist/spa/src/types/Common.ts +81 -32
- package/dist/spa/src/types/FrontendAPI.ts +31 -5
- package/dist/spa/src/types/adapters/CaptchaAdapter.ts +34 -0
- package/dist/spa/src/types/adapters/EmailAdapter.ts +2 -2
- package/dist/spa/src/types/adapters/ImageVisionAdapter.ts +30 -0
- package/dist/spa/src/types/adapters/KeyValueAdapter.ts +16 -0
- package/dist/spa/src/types/adapters/index.ts +8 -0
- package/dist/spa/src/utils.ts +279 -9
- package/dist/spa/src/views/CreateView.vue +18 -19
- package/dist/spa/src/views/EditView.vue +25 -19
- package/dist/spa/src/views/ListView.vue +139 -86
- package/dist/spa/src/views/LoginView.vue +26 -35
- package/dist/spa/src/views/ResourceParent.vue +2 -2
- package/dist/spa/src/views/SettingsView.vue +121 -0
- package/dist/spa/src/views/ShowView.vue +59 -39
- package/dist/spa/src/websocket.ts +6 -1
- package/dist/spa/tsconfig.app.json +1 -1
- package/dist/spa/vite.config.ts +45 -2
- package/dist/types/Back.d.ts +134 -14
- package/dist/types/Back.d.ts.map +1 -1
- package/dist/types/Back.js +15 -0
- package/dist/types/Back.js.map +1 -1
- package/dist/types/Common.d.ts +96 -29
- package/dist/types/Common.d.ts.map +1 -1
- package/dist/types/Common.js.map +1 -1
- package/dist/types/FrontendAPI.d.ts +31 -3
- package/dist/types/FrontendAPI.d.ts.map +1 -1
- package/dist/types/FrontendAPI.js.map +1 -1
- package/dist/types/adapters/CaptchaAdapter.d.ts +30 -0
- package/dist/types/adapters/CaptchaAdapter.d.ts.map +1 -0
- package/dist/types/adapters/CaptchaAdapter.js +5 -0
- package/dist/types/adapters/CaptchaAdapter.js.map +1 -0
- package/dist/types/adapters/EmailAdapter.d.ts +1 -1
- package/dist/types/adapters/ImageVisionAdapter.d.ts +25 -0
- package/dist/types/adapters/ImageVisionAdapter.d.ts.map +1 -0
- package/dist/types/adapters/ImageVisionAdapter.js +2 -0
- package/dist/types/adapters/ImageVisionAdapter.js.map +1 -0
- package/dist/types/adapters/KeyValueAdapter.d.ts +10 -0
- package/dist/types/adapters/KeyValueAdapter.d.ts.map +1 -0
- package/dist/types/adapters/KeyValueAdapter.js +2 -0
- package/dist/types/adapters/KeyValueAdapter.js.map +1 -0
- package/dist/types/adapters/index.d.ts +9 -0
- package/dist/types/adapters/index.d.ts.map +1 -0
- package/dist/types/adapters/index.js +2 -0
- package/dist/types/adapters/index.js.map +1 -0
- package/package.json +4 -2
- package/dist/spa/src/types/adapters/index.js +0 -5
package/commands/callTsProxy.js
CHANGED
|
@@ -3,18 +3,28 @@ import { spawn } from "child_process";
|
|
|
3
3
|
import path from "path";
|
|
4
4
|
import fs from "fs";
|
|
5
5
|
import chalk from "chalk";
|
|
6
|
+
import dotenv from "dotenv";
|
|
6
7
|
|
|
7
8
|
const currentFilePath = import.meta.url;
|
|
8
9
|
const currentFileFolder = path.dirname(currentFilePath).replace("file:", "");
|
|
9
10
|
|
|
10
11
|
export function callTsProxy(tsCode, silent=false) {
|
|
11
12
|
|
|
13
|
+
const currentDirectory = process.cwd();
|
|
14
|
+
const envPath = path.resolve(currentDirectory, ".env");
|
|
15
|
+
const envLocalPath = path.resolve(currentDirectory, ".env.local");
|
|
16
|
+
if (fs.existsSync(envLocalPath)) {
|
|
17
|
+
dotenv.config({ path: envLocalPath, override: true });
|
|
18
|
+
}
|
|
19
|
+
if (fs.existsSync(envPath)) {
|
|
20
|
+
dotenv.config({ path: envPath, override: true });
|
|
21
|
+
}
|
|
22
|
+
|
|
12
23
|
process.env.HEAVY_DEBUG && console.log("🌐 Calling tsproxy with code:", path.join(currentFileFolder, "proxy.ts"));
|
|
13
24
|
return new Promise((resolve, reject) => {
|
|
14
|
-
const child = spawn("tsx", [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
25
|
+
const child = spawn("tsx", [path.join(currentFileFolder, "proxy.ts")], {
|
|
26
|
+
env: process.env,
|
|
27
|
+
});
|
|
18
28
|
let stdout = "";
|
|
19
29
|
let stderr = "";
|
|
20
30
|
|
package/commands/cli.js
CHANGED
|
@@ -12,6 +12,7 @@ import createResource from "./createResource/main.js";
|
|
|
12
12
|
import chalk from "chalk";
|
|
13
13
|
import path from "path";
|
|
14
14
|
import fs from "fs";
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
15
16
|
|
|
16
17
|
function showHelp() {
|
|
17
18
|
console.log(
|
|
@@ -25,19 +26,25 @@ function showHelp() {
|
|
|
25
26
|
);
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
function currentFileDir(importMetaUrl) {
|
|
29
|
-
const filePath = importMetaUrl
|
|
29
|
+
export function currentFileDir(importMetaUrl) {
|
|
30
|
+
const filePath = fileURLToPath(importMetaUrl);
|
|
30
31
|
const fileDir = path.dirname(filePath);
|
|
31
32
|
return fileDir;
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
function
|
|
35
|
+
export function getVersion() {
|
|
35
36
|
const ADMIN_FORTH_ABSOLUTE_PATH = path.join(currentFileDir(import.meta.url), '..');
|
|
36
37
|
|
|
37
38
|
const package_json = JSON.parse(fs.readFileSync(path.join(ADMIN_FORTH_ABSOLUTE_PATH, 'package.json'), 'utf8'));
|
|
38
39
|
|
|
39
40
|
const ADMINFORTH_VERSION = package_json.version;
|
|
40
41
|
|
|
42
|
+
return ADMINFORTH_VERSION;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function showVersion() {
|
|
46
|
+
const ADMINFORTH_VERSION = getVersion();
|
|
47
|
+
|
|
41
48
|
console.log(
|
|
42
49
|
chalk.white('AdminForth CLI version: ') +
|
|
43
50
|
chalk.cyan.bold(ADMINFORTH_VERSION)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Express } from "express";
|
|
2
|
+
import { IAdminForth } from "adminforth";
|
|
3
|
+
|
|
4
|
+
export function initApi(app: Express, admin: IAdminForth) {
|
|
5
|
+
app.get(`${admin.config.baseUrl}/api/hello/`,
|
|
6
|
+
(req, res) => {
|
|
7
|
+
res.json({ message: "Hello from AdminForth API!" });
|
|
8
|
+
}
|
|
9
|
+
);
|
|
10
|
+
}
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
"compilerOptions": {
|
|
3
3
|
"baseUrl": ".",
|
|
4
4
|
"paths": {
|
|
5
|
-
"
|
|
6
|
-
"": "
|
|
7
|
-
"@@/*": "."
|
|
5
|
+
"@/*": ["../node_modules/adminforth/dist/spa/src/*"],
|
|
6
|
+
"@@/*": ["./*"]
|
|
8
7
|
}
|
|
9
8
|
}
|
|
10
9
|
}
|
|
@@ -3,6 +3,8 @@ import AdminForth from 'adminforth';
|
|
|
3
3
|
import usersResource from "./resources/adminuser.js";
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import path from 'path';
|
|
6
|
+
import { Filters } from 'adminforth';
|
|
7
|
+
import { initApi } from './api.js';
|
|
6
8
|
|
|
7
9
|
const ADMIN_BASE_URL = '';
|
|
8
10
|
|
|
@@ -15,6 +17,12 @@ export const admin = new AdminForth({
|
|
|
15
17
|
rememberMeDays: 30,
|
|
16
18
|
loginBackgroundImage: 'https://images.unsplash.com/photo-1534239697798-120952b76f2b?q=80&w=3389&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
17
19
|
loginBackgroundPosition: '1/2',
|
|
20
|
+
loginPromptHTML: async () => {
|
|
21
|
+
const adminforthUserExists = await admin.resource("adminuser").count(Filters.EQ('email', 'adminforth')) > 0;
|
|
22
|
+
if (adminforthUserExists) {
|
|
23
|
+
return "Please use <b>adminforth</b> as username and <b>adminforth</b> as password"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
18
26
|
},
|
|
19
27
|
customization: {
|
|
20
28
|
brandName: "{{appName}}",
|
|
@@ -23,7 +31,8 @@ export const admin = new AdminForth({
|
|
|
23
31
|
brandLogo: '@@/assets/logo.svg',
|
|
24
32
|
datesFormat: 'DD MMM',
|
|
25
33
|
timeFormat: 'HH:mm a',
|
|
26
|
-
|
|
34
|
+
showBrandNameInSidebar: true,
|
|
35
|
+
showBrandLogoInSidebar: true,
|
|
27
36
|
emptyFieldPlaceholder: '-',
|
|
28
37
|
styles: {
|
|
29
38
|
colors: {
|
|
@@ -61,6 +70,8 @@ if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) {
|
|
|
61
70
|
const app = express();
|
|
62
71
|
app.use(express.json());
|
|
63
72
|
|
|
73
|
+
initApi(app, admin);
|
|
74
|
+
|
|
64
75
|
const port = 3500;
|
|
65
76
|
|
|
66
77
|
admin.bundleNow({ hotReload: process.env.NODE_ENV === 'development' }).then(() => {
|
|
@@ -11,9 +11,31 @@ import { exec } from 'child_process';
|
|
|
11
11
|
|
|
12
12
|
import Handlebars from 'handlebars';
|
|
13
13
|
import { promisify } from 'util';
|
|
14
|
+
import { getVersion } from '../cli.js';
|
|
14
15
|
|
|
15
16
|
const execAsync = promisify(exec);
|
|
16
17
|
|
|
18
|
+
function detectAdminforthVersion() {
|
|
19
|
+
try {
|
|
20
|
+
const version = getVersion();
|
|
21
|
+
|
|
22
|
+
if (typeof version !== 'string') {
|
|
23
|
+
throw new Error('Invalid version format');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (version.includes('next')) {
|
|
27
|
+
return 'next';
|
|
28
|
+
}
|
|
29
|
+
return 'latest';
|
|
30
|
+
} catch (err) {
|
|
31
|
+
console.warn('⚠️ Could not detect AdminForth version, defaulting to "latest".');
|
|
32
|
+
return 'latest';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const adminforthVersion = detectAdminforthVersion();
|
|
37
|
+
|
|
38
|
+
|
|
17
39
|
export function parseArgumentsIntoOptions(rawArgs) {
|
|
18
40
|
const args = arg(
|
|
19
41
|
{
|
|
@@ -203,13 +225,21 @@ async function writeTemplateFiles(dirname, cwd, options) {
|
|
|
203
225
|
{
|
|
204
226
|
src: 'package.json.hbs',
|
|
205
227
|
dest: 'package.json',
|
|
206
|
-
data: {
|
|
228
|
+
data: {
|
|
229
|
+
appName,
|
|
230
|
+
adminforthVersion: adminforthVersion,
|
|
231
|
+
},
|
|
207
232
|
},
|
|
208
233
|
{
|
|
209
234
|
src: 'index.ts.hbs',
|
|
210
235
|
dest: 'index.ts',
|
|
211
236
|
data: { appName },
|
|
212
237
|
},
|
|
238
|
+
{
|
|
239
|
+
src: 'api.ts.hbs',
|
|
240
|
+
dest: 'api.ts',
|
|
241
|
+
data: {},
|
|
242
|
+
},
|
|
213
243
|
{
|
|
214
244
|
src: '.gitignore.hbs',
|
|
215
245
|
dest: '.gitignore',
|
|
@@ -287,7 +317,7 @@ async function installDependencies(ctx, cwd) {
|
|
|
287
317
|
const isWindows = process.platform === 'win32';
|
|
288
318
|
|
|
289
319
|
const nodeBinary = process.execPath;
|
|
290
|
-
const npmPath = path.join(path.dirname(nodeBinary), 'npm');
|
|
320
|
+
const npmPath = path.join(path.dirname(nodeBinary), isWindows ? 'npm.cmd' : 'npm');
|
|
291
321
|
const customDir = ctx.customDir;
|
|
292
322
|
if (isWindows) {
|
|
293
323
|
const res = await Promise.all([
|
|
@@ -2,18 +2,20 @@ import fs from 'fs/promises';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
4
|
import jiti from 'jiti';
|
|
5
|
+
import dotenv, { config } from "dotenv";
|
|
5
6
|
|
|
7
|
+
dotenv.config({ path: '.env.local', override: true });
|
|
8
|
+
dotenv.config({ path: '.env', override: true });
|
|
6
9
|
|
|
7
|
-
export async function
|
|
10
|
+
export async function getAdminInstance() {
|
|
8
11
|
const configFileName = 'index.ts';
|
|
9
12
|
const configPath = path.resolve(process.cwd(), configFileName);
|
|
10
|
-
|
|
11
13
|
try {
|
|
12
14
|
await fs.access(configPath);
|
|
13
15
|
} catch (error) {
|
|
14
16
|
console.error(chalk.red(`\nError: Configuration file not found at ${configPath}`));
|
|
15
17
|
console.error(chalk.yellow(`Please ensure you are running this command from your project's root directory and the '${configFileName}' file exists.`));
|
|
16
|
-
|
|
18
|
+
return null;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
try {
|
|
@@ -26,8 +28,19 @@ export async function loadAdminForthConfig() {
|
|
|
26
28
|
const configModule = _require(configPath);
|
|
27
29
|
|
|
28
30
|
const adminInstance = configModule.admin || configModule.default?.admin;
|
|
31
|
+
return { adminInstance, configPath, configFileName };
|
|
32
|
+
} catch (error) {
|
|
33
|
+
console.error(chalk.red(`\nError loading or parsing configuration file: ${configPath}`));
|
|
34
|
+
console.error(error);
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
29
38
|
|
|
39
|
+
export async function loadAdminForthConfig() {
|
|
40
|
+
|
|
41
|
+
const { adminInstance, configPath, configFileName } = await getAdminInstance();
|
|
30
42
|
|
|
43
|
+
try {
|
|
31
44
|
if (!adminInstance) {
|
|
32
45
|
throw new Error(`Could not find 'admin' export in ${configFileName}. Please ensure your config file exports the AdminForth instance like: 'export const admin = new AdminForth({...});'`);
|
|
33
46
|
}
|
|
@@ -50,7 +63,7 @@ export async function loadAdminForthConfig() {
|
|
|
50
63
|
return config;
|
|
51
64
|
|
|
52
65
|
} catch (error) {
|
|
53
|
-
console.error(chalk.red(`\nError loading or parsing configuration file: ${configPath}`));
|
|
66
|
+
console.error(chalk.red(`\nError loading or parsing configuration file: ${configPath}, error: ${error}`));
|
|
54
67
|
console.error(error);
|
|
55
68
|
process.exit(1);
|
|
56
69
|
}
|
|
@@ -189,6 +189,7 @@ async function handleCrudPageInjectionCreation(config, resources) {
|
|
|
189
189
|
message: 'Where exactly do you want to inject the component?',
|
|
190
190
|
choices: [
|
|
191
191
|
{ name: '⬆️ Before Breadcrumbs', value: 'beforeBreadcrumbs' },
|
|
192
|
+
{ name: '➡️ Before Action Buttons', value: 'beforeActionButtons' },
|
|
192
193
|
{ name: '⬇️ After Breadcrumbs', value: 'afterBreadcrumbs' },
|
|
193
194
|
{ name: '📄 After Page', value: 'bottom' },
|
|
194
195
|
{ name: '⋯ threeDotsDropdownItems', value: 'threeDotsDropdownItems' },
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="flex items-center p-4 md:p-5 gap-2">
|
|
3
|
+
<button
|
|
4
|
+
type="button"
|
|
5
|
+
@click="handleClick"
|
|
6
|
+
class="text-white bg-blue-600 hover:bg-blue-700 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-4 py-2.5 text-center dark:bg-blue-500 dark:hover:bg-blue-600 dark:focus:ring-blue-800"
|
|
7
|
+
>
|
|
8
|
+
{{ '{{' }} $t('Example') {{ '}}' }}
|
|
9
|
+
</button>
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script setup lang="ts">
|
|
14
|
+
import { onMounted } from 'vue';
|
|
15
|
+
import { useI18n } from 'vue-i18n';
|
|
16
|
+
import adminforth from '@/adminforth';
|
|
17
|
+
import { AdminForthResourceCommon, AdminUser } from "@/types/Common";
|
|
18
|
+
|
|
19
|
+
const { t } = useI18n();
|
|
20
|
+
|
|
21
|
+
const props = defineProps<{
|
|
22
|
+
record: any
|
|
23
|
+
resource: AdminForthResourceCommon
|
|
24
|
+
adminUser: AdminUser
|
|
25
|
+
meta?: any
|
|
26
|
+
}>();
|
|
27
|
+
|
|
28
|
+
onMounted(() => {
|
|
29
|
+
// Logic on mount if needed
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
function handleClick() {
|
|
33
|
+
adminforth.alert({
|
|
34
|
+
message: t('Confirmed'),
|
|
35
|
+
variant: 'success',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
</script>
|
|
@@ -3,15 +3,12 @@
|
|
|
3
3
|
"baseUrl": ".", // This should point to your project root
|
|
4
4
|
"paths": {
|
|
5
5
|
"@/*": [
|
|
6
|
-
|
|
7
|
-
"../../../spa/src/*"
|
|
6
|
+
"../node_modules/adminforth/dist/spa/src/*"
|
|
8
7
|
],
|
|
9
8
|
"*": [
|
|
10
|
-
|
|
11
|
-
"../../../spa/node_modules/*"
|
|
9
|
+
"../node_modules/adminforth/dist/spa/node_modules/*"
|
|
12
10
|
],
|
|
13
11
|
"@@/*": [
|
|
14
|
-
// "node_modules/adminforth/dist/spa/src/*"
|
|
15
12
|
"."
|
|
16
13
|
]
|
|
17
14
|
}
|
|
@@ -2,6 +2,8 @@ import fs from "fs";
|
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { toPascalCase, mapToTypeScriptType, getInstance } from "./utils.js";
|
|
4
4
|
import dotenv from "dotenv";
|
|
5
|
+
import { callTsProxy } from "./callTsProxy.js";
|
|
6
|
+
import { getAdminInstance } from "../commands/createCustomComponent/configLoader.js";
|
|
5
7
|
|
|
6
8
|
const envFileArg = process.argv.find((arg) => arg.startsWith("--env-file="));
|
|
7
9
|
const envFilePath = envFileArg ? envFileArg.split("=")[1] : ".env";
|
|
@@ -23,39 +25,45 @@ async function generateModels() {
|
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
let modelContent = "// Generated model file\n\n";
|
|
26
|
-
const files = fs.readdirSync(currentDirectory);
|
|
27
28
|
let instanceFound = false;
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
30
|
+
const { adminInstance, configPath, configFileName } = await getAdminInstance();
|
|
31
|
+
if (adminInstance) {
|
|
32
|
+
await adminInstance.discoverDatabases();
|
|
33
|
+
instanceFound = true;
|
|
34
|
+
for (const resource of adminInstance.config.resources) {
|
|
35
|
+
if (resource.columns) {
|
|
36
|
+
const typeName = toPascalCase(resource.resourceId);
|
|
37
|
+
const tsCode = `
|
|
38
|
+
export async function exec() {
|
|
39
|
+
const columns = ${JSON.stringify(resource.columns)};
|
|
40
|
+
const typeName = "${typeName}";
|
|
41
|
+
function mapToTypeScriptType(type) {
|
|
42
|
+
const map = { "integer": "number", "varchar": "string", "boolean": "boolean", "date": "string", "datetime": "string", "decimal": "number", "float": "number", "json": "Record<string, any>", "text": "string", "string": "string", "time": "string" };
|
|
43
|
+
return map[type] || "any";
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let typeStr = \`export type \${typeName} = {\\n\`;
|
|
47
|
+
for (const col of columns) {
|
|
48
|
+
if (col.name && col.type) {
|
|
49
|
+
typeStr += \` \${col.name}: \${mapToTypeScriptType(col.type)};\\n\`;
|
|
45
50
|
}
|
|
46
|
-
}
|
|
47
|
-
|
|
51
|
+
}
|
|
52
|
+
typeStr += "}\\n\\n";
|
|
53
|
+
return typeStr;
|
|
48
54
|
}
|
|
49
|
-
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
const result = await callTsProxy(tsCode);
|
|
58
|
+
modelContent += result;
|
|
50
59
|
}
|
|
51
|
-
}
|
|
60
|
+
};
|
|
52
61
|
}
|
|
53
62
|
|
|
54
63
|
if (!instanceFound) {
|
|
55
64
|
console.error("Error: No valid instance found to generate models.");
|
|
56
65
|
return;
|
|
57
66
|
}
|
|
58
|
-
|
|
59
67
|
fs.writeFileSync(modelFilePath, modelContent, "utf-8");
|
|
60
68
|
console.log(`Generated TypeScript model file: ${modelFilePath}`);
|
|
61
69
|
return true;
|
package/dist/auth.d.ts
CHANGED
|
@@ -20,10 +20,18 @@ declare class AdminForthAuth implements IAdminForthAuth {
|
|
|
20
20
|
payload: {
|
|
21
21
|
name: string;
|
|
22
22
|
value: string;
|
|
23
|
-
expiry: number;
|
|
23
|
+
expiry: number | undefined;
|
|
24
|
+
expirySeconds: number | undefined;
|
|
24
25
|
httpOnly: boolean;
|
|
25
26
|
};
|
|
26
27
|
}): void;
|
|
28
|
+
getCustomCookie({ cookies, name }: {
|
|
29
|
+
cookies: {
|
|
30
|
+
key: string;
|
|
31
|
+
value: string;
|
|
32
|
+
}[];
|
|
33
|
+
name: string;
|
|
34
|
+
}): string | null;
|
|
27
35
|
issueJWT(payload: Object, type: string, expiresIn?: string): string;
|
|
28
36
|
verify(jwtToken: string, mustHaveType: string, decodeUser?: boolean | undefined): Promise<Object>;
|
|
29
37
|
static generatePasswordHash(password: any): Promise<string>;
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../auth.ts"],"names":[],"mappings":"AAGA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAkClD,cAAM,cAAe,YAAW,eAAe;IAC7C,UAAU,EAAE,UAAU,CAAC;gBAEX,UAAU,KAAA;IAItB,WAAW,CAAC,OAAO,EAAE,MAAM;IA4B3B,gBAAgB,CAAC,QAAQ,KAAA;IAKzB,aAAa,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAC,EAAE;QACrD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,GAAG,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;KAClB;IAYD,kBAAkB,CAAC,EAAC,QAAQ,EAAE,IAAI,EAAC;;;KAAA;IAKnC,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QACrC,QAAQ,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../auth.ts"],"names":[],"mappings":"AAGA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAkClD,cAAM,cAAe,YAAW,eAAe;IAC7C,UAAU,EAAE,UAAU,CAAC;gBAEX,UAAU,KAAA;IAItB,WAAW,CAAC,OAAO,EAAE,MAAM;IA4B3B,gBAAgB,CAAC,QAAQ,KAAA;IAKzB,aAAa,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAC,EAAE;QACrD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,GAAG,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;KAClB;IAYD,kBAAkB,CAAC,EAAC,QAAQ,EAAE,IAAI,EAAC;;;KAAA;IAKnC,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QACrC,QAAQ,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;YAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAA;SAAE,CAAA;KAC1I;IAiBD,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QACjC,OAAO,EAAE;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAC,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KACtD,GAAG,MAAM,GAAG,IAAI;IAKjB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc,GAAG,MAAM;IAWpE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAE,OAAO,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;WAsChG,oBAAoB,CAAC,QAAQ,KAAA;WAM7B,cAAc,CAAC,QAAQ,KAAA,EAAE,cAAc,KAAA;CAOrD;AAED,eAAe,cAAc,CAAC"}
|
package/dist/auth.js
CHANGED
|
@@ -80,9 +80,22 @@ class AdminForthAuth {
|
|
|
80
80
|
response.setHeader('Set-Cookie', `adminforth_${brandSlug}_${name}=; Path=${this.adminforth.config.baseUrl || '/'}; HttpOnly; SameSite=Strict; Expires=Thu, 01 Jan 1970 00:00:00 GMT`);
|
|
81
81
|
}
|
|
82
82
|
setCustomCookie({ response, payload }) {
|
|
83
|
-
const { name, value, expiry, httpOnly } = payload;
|
|
83
|
+
const { name, value, expiry, httpOnly, expirySeconds } = payload;
|
|
84
|
+
let expiryMs = 24 * 60 * 60 * 1000; // default 1 day
|
|
85
|
+
if (expirySeconds !== undefined) {
|
|
86
|
+
expiryMs = expirySeconds * 1000;
|
|
87
|
+
}
|
|
88
|
+
else if (expiry !== undefined) {
|
|
89
|
+
console.warn('setCustomCookie: expiry(in ms) is deprecated, use expirySeconds instead (seconds), traceback:', new Error().stack);
|
|
90
|
+
expiryMs = expiry;
|
|
91
|
+
}
|
|
92
|
+
const brandSlug = this.adminforth.config.customization.brandNameSlug;
|
|
93
|
+
response.setHeader('Set-Cookie', `adminforth_${brandSlug}_${name}=${value}; Path=${this.adminforth.config.baseUrl || '/'};${httpOnly ? ' HttpOnly;' : ''} SameSite=Strict; Expires=${new Date(Date.now() + expiryMs).toUTCString()} `);
|
|
94
|
+
}
|
|
95
|
+
getCustomCookie({ cookies, name }) {
|
|
96
|
+
var _a;
|
|
84
97
|
const brandSlug = this.adminforth.config.customization.brandNameSlug;
|
|
85
|
-
|
|
98
|
+
return ((_a = cookies.find((cookie) => cookie.key === `adminforth_${brandSlug}_${name}`)) === null || _a === void 0 ? void 0 : _a.value) || null;
|
|
86
99
|
}
|
|
87
100
|
issueJWT(payload, type, expiresIn = '24h') {
|
|
88
101
|
// read ADMINFORH_SECRET from environment if not drop error
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../auth.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseConnector.d.ts","sourceRoot":"","sources":["../../dataConnectors/baseConnector.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAAE,kCAAkC,EACtD,wBAAwB,EACxB,eAAe,EAAE,uBAAuB,EAAE,sBAAsB,EACjE,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAkD,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAI9G,MAAM,CAAC,OAAO,OAAO,uBAAwB,YAAW,kCAAkC;IAExF,MAAM,EAAE,GAAG,CAAC;IAEZ,IAAI,EAAE,QAGL;IAED,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,aAAa,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM;IAQ7C,sCAAsC,CAAC,QAAQ,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAWpG,gCAAgC,CAAC,MAAM,EAAE,uBAAuB,GAAG,sBAAsB,GAAG,KAAK,CAAC,uBAAuB,GAAG,sBAAsB,CAAC,GAAG,SAAS,GAAG,sBAAsB;IAqBxL,2BAA2B,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,GAAG,KAAK,CAAC,uBAAuB,GAAG,sBAAsB,CAAC,EAAE,QAAQ,EAAE,kBAAkB,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;
|
|
1
|
+
{"version":3,"file":"baseConnector.d.ts","sourceRoot":"","sources":["../../dataConnectors/baseConnector.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,7 +46,7 @@ export default class AdminForthBaseConnector {
|
|
|
46
46
|
return { operator: AdminForthFilterOperators.AND, subFilters: [filter] };
|
|
47
47
|
}
|
|
48
48
|
validateAndNormalizeFilters(filters, resource) {
|
|
49
|
-
var _a;
|
|
49
|
+
var _a, _b, _c;
|
|
50
50
|
if (Array.isArray(filters)) {
|
|
51
51
|
// go through all filters in array and call validation+normalization for each
|
|
52
52
|
// as soon as error is encountered, there is no point in calling validation for other filters
|
|
@@ -73,36 +73,67 @@ export default class AdminForthBaseConnector {
|
|
|
73
73
|
return filterValidation;
|
|
74
74
|
}, { ok: true, error: '' });
|
|
75
75
|
}
|
|
76
|
-
|
|
76
|
+
const filtersAsSingle = filters;
|
|
77
|
+
if (filtersAsSingle.field) {
|
|
77
78
|
// if "field" is present, filter must be Single
|
|
78
79
|
if (!filters.operator) {
|
|
79
80
|
return { ok: false, error: `Field "operator" not specified in filter object: ${JSON.stringify(filters)}` };
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
+
// Either compare with value or with rightField (field-to-field). If rightField is set, value must be undefined.
|
|
83
|
+
const comparingWithRightField = filtersAsSingle.rightField !== undefined && filtersAsSingle.rightField !== null;
|
|
84
|
+
if (!comparingWithRightField && filtersAsSingle.value === undefined) {
|
|
82
85
|
return { ok: false, error: `Field "value" not specified in filter object: ${JSON.stringify(filters)}` };
|
|
83
86
|
}
|
|
84
|
-
if (
|
|
87
|
+
if (comparingWithRightField && filtersAsSingle.value !== undefined) {
|
|
88
|
+
return { ok: false, error: `Specify either "value" or "rightField", not both: ${JSON.stringify(filters)}` };
|
|
89
|
+
}
|
|
90
|
+
if (filtersAsSingle.insecureRawSQL) {
|
|
85
91
|
return { ok: false, error: `Field "insecureRawSQL" should not be specified in filter object alongside "field": ${JSON.stringify(filters)}` };
|
|
86
92
|
}
|
|
93
|
+
if (filtersAsSingle.insecureRawNoSQL) {
|
|
94
|
+
return { ok: false, error: `Field "insecureRawNoSQL" should not be specified in filter object alongside "field": ${JSON.stringify(filters)}` };
|
|
95
|
+
}
|
|
87
96
|
if (![AdminForthFilterOperators.EQ, AdminForthFilterOperators.NE, AdminForthFilterOperators.GT,
|
|
88
97
|
AdminForthFilterOperators.LT, AdminForthFilterOperators.GTE, AdminForthFilterOperators.LTE,
|
|
89
98
|
AdminForthFilterOperators.LIKE, AdminForthFilterOperators.ILIKE, AdminForthFilterOperators.IN,
|
|
90
99
|
AdminForthFilterOperators.NIN].includes(filters.operator)) {
|
|
91
100
|
return { ok: false, error: `Field "operator" has wrong value in filter object: ${JSON.stringify(filters)}` };
|
|
92
101
|
}
|
|
93
|
-
const fieldObj = resource.dataSourceColumns.find((col) => col.name ==
|
|
102
|
+
const fieldObj = resource.dataSourceColumns.find((col) => col.name == filtersAsSingle.field);
|
|
94
103
|
if (!fieldObj) {
|
|
95
|
-
const similar = suggestIfTypo(resource.dataSourceColumns.map((col) => col.name),
|
|
96
|
-
|
|
104
|
+
const similar = suggestIfTypo(resource.dataSourceColumns.map((col) => col.name), filtersAsSingle.field);
|
|
105
|
+
let isPolymorphicTarget = false;
|
|
106
|
+
if ((_b = (_a = global.adminforth) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.resources) {
|
|
107
|
+
isPolymorphicTarget = global.adminforth.config.resources.some(res => res.dataSourceColumns.some(col => {
|
|
108
|
+
var _a, _b;
|
|
109
|
+
return (_b = (_a = col.foreignResource) === null || _a === void 0 ? void 0 : _a.polymorphicResources) === null || _b === void 0 ? void 0 : _b.some(pr => pr.resourceId === resource.resourceId);
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
if (isPolymorphicTarget) {
|
|
113
|
+
process.env.HEAVY_DEBUG && console.log(`⚠️ Field '${filtersAsSingle.field}' not found in polymorphic target resource '${resource.resourceId}', allowing query to proceed.`);
|
|
114
|
+
return { ok: true, error: '' };
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
throw new Error(`Field '${filtersAsSingle.field}' not found in resource '${resource.resourceId}'. ${similar ? `Did you mean '${similar}'?` : ''}`);
|
|
118
|
+
}
|
|
97
119
|
}
|
|
98
120
|
// value normalization
|
|
99
|
-
if (
|
|
121
|
+
if (comparingWithRightField) {
|
|
122
|
+
// ensure rightField exists in resource
|
|
123
|
+
const rightFieldObj = resource.dataSourceColumns.find((col) => col.name == filtersAsSingle.rightField);
|
|
124
|
+
if (!rightFieldObj) {
|
|
125
|
+
const similar = suggestIfTypo(resource.dataSourceColumns.map((col) => col.name), filtersAsSingle.rightField);
|
|
126
|
+
throw new Error(`Field '${filtersAsSingle.rightField}' not found in resource '${resource.resourceId}'. ${similar ? `Did you mean '${similar}'?` : ''}`);
|
|
127
|
+
}
|
|
128
|
+
// No value conversion needed for field-to-field comparison here
|
|
129
|
+
}
|
|
130
|
+
else if (filters.operator == AdminForthFilterOperators.IN || filters.operator == AdminForthFilterOperators.NIN) {
|
|
100
131
|
if (!Array.isArray(filters.value)) {
|
|
101
132
|
return { ok: false, error: `Value for operator '${filters.operator}' should be an array, in filter object: ${JSON.stringify(filters)}` };
|
|
102
133
|
}
|
|
103
134
|
if (filters.value.length === 0) {
|
|
104
135
|
// nonsense, and some databases might not accept IN []
|
|
105
|
-
const colType = (
|
|
136
|
+
const colType = (_c = resource.dataSourceColumns.find((col) => col.name == filtersAsSingle.field)) === null || _c === void 0 ? void 0 : _c.type;
|
|
106
137
|
if (colType === AdminForthDataTypes.STRING || colType === AdminForthDataTypes.TEXT) {
|
|
107
138
|
filters.value = [randomUUID()];
|
|
108
139
|
return { ok: true, error: `` };
|
|
@@ -114,16 +145,16 @@ export default class AdminForthBaseConnector {
|
|
|
114
145
|
filters.value = filters.value.map((val) => this.setFieldValue(fieldObj, val));
|
|
115
146
|
}
|
|
116
147
|
else {
|
|
117
|
-
|
|
148
|
+
filtersAsSingle.value = this.setFieldValue(fieldObj, filtersAsSingle.value);
|
|
118
149
|
}
|
|
119
150
|
}
|
|
120
|
-
else if (
|
|
151
|
+
else if (filtersAsSingle.insecureRawSQL || filtersAsSingle.insecureRawNoSQL) {
|
|
121
152
|
// if "insecureRawSQL" filter is insecure sql string
|
|
122
|
-
if (
|
|
123
|
-
return { ok: false, error: `Field "operator" should not be specified in filter object alongside "insecureRawSQL": ${JSON.stringify(filters)}` };
|
|
153
|
+
if (filtersAsSingle.operator) {
|
|
154
|
+
return { ok: false, error: `Field "operator" should not be specified in filter object alongside "insecureRawSQL" or "insecureRawNoSQL": ${JSON.stringify(filters)}` };
|
|
124
155
|
}
|
|
125
|
-
if (
|
|
126
|
-
return { ok: false, error: `Field "value" should not be specified in filter object alongside "insecureRawSQL": ${JSON.stringify(filters)}` };
|
|
156
|
+
if (filtersAsSingle.value !== undefined) {
|
|
157
|
+
return { ok: false, error: `Field "value" should not be specified in filter object alongside "insecureRawSQL" or "insecureRawNoSQL": ${JSON.stringify(filters)}` };
|
|
127
158
|
}
|
|
128
159
|
}
|
|
129
160
|
else if (filters.subFilters) {
|