@solidstarters/solid-core 1.2.134 → 1.2.135
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/dist/controllers/ai-interaction.controller.d.ts +45 -0
- package/dist/controllers/ai-interaction.controller.d.ts.map +1 -0
- package/dist/controllers/ai-interaction.controller.js +192 -0
- package/dist/controllers/ai-interaction.controller.js.map +1 -0
- package/dist/controllers/dashboard-variable.controller.d.ts +43 -0
- package/dist/controllers/dashboard-variable.controller.d.ts.map +1 -0
- package/dist/controllers/dashboard-variable.controller.js +179 -0
- package/dist/controllers/dashboard-variable.controller.js.map +1 -0
- package/dist/controllers/dashboard.controller.d.ts +45 -0
- package/dist/controllers/dashboard.controller.d.ts.map +1 -0
- package/dist/controllers/dashboard.controller.js +192 -0
- package/dist/controllers/dashboard.controller.js.map +1 -0
- package/dist/controllers/question-sql-dataset-config.controller.d.ts +43 -0
- package/dist/controllers/question-sql-dataset-config.controller.d.ts.map +1 -0
- package/dist/controllers/question-sql-dataset-config.controller.js +179 -0
- package/dist/controllers/question-sql-dataset-config.controller.js.map +1 -0
- package/dist/controllers/question.controller.d.ts +45 -0
- package/dist/controllers/question.controller.d.ts.map +1 -0
- package/dist/controllers/question.controller.js +194 -0
- package/dist/controllers/question.controller.js.map +1 -0
- package/dist/controllers/test.controller.d.ts.map +1 -1
- package/dist/controllers/test.controller.js.map +1 -1
- package/dist/decorators/dashboard-question-data-provider.decorator.d.ts +3 -0
- package/dist/decorators/dashboard-question-data-provider.decorator.d.ts.map +1 -0
- package/dist/decorators/dashboard-question-data-provider.decorator.js +11 -0
- package/dist/decorators/dashboard-question-data-provider.decorator.js.map +1 -0
- package/dist/decorators/dashboard-selection-provider.decorator.d.ts +3 -0
- package/dist/decorators/dashboard-selection-provider.decorator.d.ts.map +1 -0
- package/dist/decorators/dashboard-selection-provider.decorator.js +11 -0
- package/dist/decorators/dashboard-selection-provider.decorator.js.map +1 -0
- package/dist/dtos/create-ai-interaction.dto.d.ts +14 -0
- package/dist/dtos/create-ai-interaction.dto.d.ts.map +1 -0
- package/dist/dtos/create-ai-interaction.dto.js +90 -0
- package/dist/dtos/create-ai-interaction.dto.js.map +1 -0
- package/dist/dtos/create-dashboard-variable.dto.d.ts +18 -0
- package/dist/dtos/create-dashboard-variable.dto.d.ts.map +1 -0
- package/dist/dtos/create-dashboard-variable.dto.js +97 -0
- package/dist/dtos/create-dashboard-variable.dto.js.map +1 -0
- package/dist/dtos/create-dashboard.dto.d.ts +15 -0
- package/dist/dtos/create-dashboard.dto.d.ts.map +1 -0
- package/dist/dtos/create-dashboard.dto.js +90 -0
- package/dist/dtos/create-dashboard.dto.js.map +1 -0
- package/dist/dtos/create-question-sql-dataset-config.dto.d.ts +12 -0
- package/dist/dtos/create-question-sql-dataset-config.dto.d.ts.map +1 -0
- package/dist/dtos/create-question-sql-dataset-config.dto.js +77 -0
- package/dist/dtos/create-question-sql-dataset-config.dto.js.map +1 -0
- package/dist/dtos/create-question.dto.d.ts +16 -0
- package/dist/dtos/create-question.dto.d.ts.map +1 -0
- package/dist/dtos/create-question.dto.js +99 -0
- package/dist/dtos/create-question.dto.js.map +1 -0
- package/dist/dtos/dashboard-variable-selection-dynamic-query.dto.d.ts +8 -0
- package/dist/dtos/dashboard-variable-selection-dynamic-query.dto.d.ts.map +1 -0
- package/dist/dtos/dashboard-variable-selection-dynamic-query.dto.js +52 -0
- package/dist/dtos/dashboard-variable-selection-dynamic-query.dto.js.map +1 -0
- package/dist/dtos/invoke-ai-prompt.dto.d.ts +4 -0
- package/dist/dtos/invoke-ai-prompt.dto.d.ts.map +1 -0
- package/dist/dtos/invoke-ai-prompt.dto.js +25 -0
- package/dist/dtos/invoke-ai-prompt.dto.js.map +1 -0
- package/dist/dtos/update-ai-interaction.dto.d.ts +15 -0
- package/dist/dtos/update-ai-interaction.dto.d.ts.map +1 -0
- package/dist/dtos/update-ai-interaction.dto.js +96 -0
- package/dist/dtos/update-ai-interaction.dto.js.map +1 -0
- package/dist/dtos/update-dashboard-variable.dto.d.ts +15 -0
- package/dist/dtos/update-dashboard-variable.dto.d.ts.map +1 -0
- package/dist/dtos/update-dashboard-variable.dto.js +95 -0
- package/dist/dtos/update-dashboard-variable.dto.js.map +1 -0
- package/dist/dtos/update-dashboard.dto.d.ts +16 -0
- package/dist/dtos/update-dashboard.dto.d.ts.map +1 -0
- package/dist/dtos/update-dashboard.dto.js +96 -0
- package/dist/dtos/update-dashboard.dto.js.map +1 -0
- package/dist/dtos/update-question-sql-dataset-config.dto.d.ts +13 -0
- package/dist/dtos/update-question-sql-dataset-config.dto.d.ts.map +1 -0
- package/dist/dtos/update-question-sql-dataset-config.dto.js +86 -0
- package/dist/dtos/update-question-sql-dataset-config.dto.js.map +1 -0
- package/dist/dtos/update-question.dto.d.ts +17 -0
- package/dist/dtos/update-question.dto.d.ts.map +1 -0
- package/dist/dtos/update-question.dto.js +106 -0
- package/dist/dtos/update-question.dto.js.map +1 -0
- package/dist/entities/ai-interaction.entity.d.ts +15 -0
- package/dist/entities/ai-interaction.entity.d.ts.map +1 -0
- package/dist/entities/ai-interaction.entity.js +70 -0
- package/dist/entities/ai-interaction.entity.js.map +1 -0
- package/dist/entities/dashboard-variable.entity.d.ts +15 -0
- package/dist/entities/dashboard-variable.entity.d.ts.map +1 -0
- package/dist/entities/dashboard-variable.entity.js +73 -0
- package/dist/entities/dashboard-variable.entity.js.map +1 -0
- package/dist/entities/dashboard.entity.d.ts +12 -0
- package/dist/entities/dashboard.entity.d.ts.map +1 -0
- package/dist/entities/dashboard.entity.js +50 -0
- package/dist/entities/dashboard.entity.js.map +1 -0
- package/dist/entities/question-sql-dataset-config.entity.d.ts +13 -0
- package/dist/entities/question-sql-dataset-config.entity.d.ts.map +1 -0
- package/dist/entities/question-sql-dataset-config.entity.js +60 -0
- package/dist/entities/question-sql-dataset-config.entity.js.map +1 -0
- package/dist/entities/question.entity.d.ts +15 -0
- package/dist/entities/question.entity.d.ts.map +1 -0
- package/dist/entities/question.entity.js +67 -0
- package/dist/entities/question.entity.js.map +1 -0
- package/dist/helpers/solid-registry.d.ts +9 -1
- package/dist/helpers/solid-registry.d.ts.map +1 -1
- package/dist/helpers/solid-registry.js +32 -0
- package/dist/helpers/solid-registry.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +12 -1
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/mappers/dashboard-mapper.d.ts +6 -0
- package/dist/mappers/dashboard-mapper.d.ts.map +1 -0
- package/dist/mappers/dashboard-mapper.js +60 -0
- package/dist/mappers/dashboard-mapper.js.map +1 -0
- package/dist/repository/dashboard.repository.d.ts +11 -0
- package/dist/repository/dashboard.repository.d.ts.map +1 -0
- package/dist/repository/dashboard.repository.js +93 -0
- package/dist/repository/dashboard.repository.js.map +1 -0
- package/dist/seeders/module-metadata-seeder.service.d.ts +5 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +18 -2
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +4222 -2418
- package/dist/services/ai-interaction.service.d.ts +23 -0
- package/dist/services/ai-interaction.service.d.ts.map +1 -0
- package/dist/services/ai-interaction.service.js +147 -0
- package/dist/services/ai-interaction.service.js.map +1 -0
- package/dist/services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service.d.ts +12 -0
- package/dist/services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service.d.ts.map +1 -0
- package/dist/services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service.js +55 -0
- package/dist/services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service.js.map +1 -0
- package/dist/services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service.d.ts +11 -0
- package/dist/services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service.d.ts.map +1 -0
- package/dist/services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service.js +45 -0
- package/dist/services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service.js.map +1 -0
- package/dist/services/dashboard-variable.service.d.ts +23 -0
- package/dist/services/dashboard-variable.service.d.ts.map +1 -0
- package/dist/services/dashboard-variable.service.js +57 -0
- package/dist/services/dashboard-variable.service.js.map +1 -0
- package/dist/services/dashboard.service.d.ts +38 -0
- package/dist/services/dashboard.service.d.ts.map +1 -0
- package/dist/services/dashboard.service.js +179 -0
- package/dist/services/dashboard.service.js.map +1 -0
- package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
- package/dist/services/menu-item-metadata.service.js +1 -1
- package/dist/services/menu-item-metadata.service.js.map +1 -1
- package/dist/services/question-data-providers/chartjs-sql-data-provider.service.d.ts +36 -0
- package/dist/services/question-data-providers/chartjs-sql-data-provider.service.d.ts.map +1 -0
- package/dist/services/question-data-providers/chartjs-sql-data-provider.service.js +85 -0
- package/dist/services/question-data-providers/chartjs-sql-data-provider.service.js.map +1 -0
- package/dist/services/question-data-providers/helpers.d.ts +4 -0
- package/dist/services/question-data-providers/helpers.d.ts.map +1 -0
- package/dist/services/question-data-providers/helpers.js +10 -0
- package/dist/services/question-data-providers/helpers.js.map +1 -0
- package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.d.ts +17 -0
- package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.d.ts.map +1 -0
- package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.js +64 -0
- package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.js.map +1 -0
- package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.d.ts +19 -0
- package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.d.ts.map +1 -0
- package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.js +84 -0
- package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.js.map +1 -0
- package/dist/services/question-sql-dataset-config.service.d.ts +22 -0
- package/dist/services/question-sql-dataset-config.service.d.ts.map +1 -0
- package/dist/services/question-sql-dataset-config.service.js +56 -0
- package/dist/services/question-sql-dataset-config.service.js.map +1 -0
- package/dist/services/question.service.d.ts +29 -0
- package/dist/services/question.service.d.ts.map +1 -0
- package/dist/services/question.service.js +117 -0
- package/dist/services/question.service.js.map +1 -0
- package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.js +22 -11
- package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
- package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.d.ts +11 -0
- package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.d.ts.map +1 -0
- package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.js +46 -0
- package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.js.map +1 -0
- package/dist/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.d.ts +11 -0
- package/dist/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.d.ts.map +1 -0
- package/dist/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.js +47 -0
- package/dist/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.js.map +1 -0
- package/dist/services/solid-introspect.service.d.ts +2 -0
- package/dist/services/solid-introspect.service.d.ts.map +1 -1
- package/dist/services/solid-introspect.service.js +28 -0
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/services/sql-expression-resolver.service.d.ts +9 -0
- package/dist/services/sql-expression-resolver.service.d.ts.map +1 -0
- package/dist/services/sql-expression-resolver.service.js +105 -0
- package/dist/services/sql-expression-resolver.service.js.map +1 -0
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +61 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/dashboard-variable.subscriber.d.ts +16 -0
- package/dist/subscribers/dashboard-variable.subscriber.d.ts.map +1 -0
- package/dist/subscribers/dashboard-variable.subscriber.js +72 -0
- package/dist/subscribers/dashboard-variable.subscriber.js.map +1 -0
- package/dist/subscribers/dashboard.subscriber.d.ts +15 -0
- package/dist/subscribers/dashboard.subscriber.d.ts.map +1 -0
- package/dist/subscribers/dashboard.subscriber.js +56 -0
- package/dist/subscribers/dashboard.subscriber.js.map +1 -0
- package/dist/subscribers/question-sql-dataset-config.subscriber.d.ts +16 -0
- package/dist/subscribers/question-sql-dataset-config.subscriber.d.ts.map +1 -0
- package/dist/subscribers/question-sql-dataset-config.subscriber.js +72 -0
- package/dist/subscribers/question-sql-dataset-config.subscriber.js.map +1 -0
- package/dist/subscribers/question.subscriber.d.ts +16 -0
- package/dist/subscribers/question.subscriber.d.ts.map +1 -0
- package/dist/subscribers/question.subscriber.js +72 -0
- package/dist/subscribers/question.subscriber.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/controllers/ai-interaction.controller.ts +98 -0
- package/src/controllers/dashboard-variable.controller.ts +93 -0
- package/src/controllers/dashboard.controller.ts +99 -0
- package/src/controllers/question-sql-dataset-config.controller.ts +93 -0
- package/src/controllers/question.controller.ts +104 -0
- package/src/controllers/test.controller.ts +1 -2
- package/src/decorators/dashboard-question-data-provider.decorator.ts +7 -0
- package/src/decorators/dashboard-selection-provider.decorator.ts +7 -0
- package/src/dtos/create-ai-interaction.dto.ts +60 -0
- package/src/dtos/create-dashboard-variable.dto.ts +56 -0
- package/src/dtos/create-dashboard.dto.ts +53 -0
- package/src/dtos/create-question-sql-dataset-config.dto.ts +42 -0
- package/src/dtos/create-question.dto.ts +58 -0
- package/src/dtos/dashboard-variable-selection-dynamic-query.dto.ts +29 -0
- package/src/dtos/invoke-ai-prompt.dto.ts +6 -0
- package/src/dtos/update-ai-interaction.dto.ts +65 -0
- package/src/dtos/update-dashboard-variable.dto.ts +54 -0
- package/src/dtos/update-dashboard.dto.ts +57 -0
- package/src/dtos/update-question-sql-dataset-config.dto.ts +49 -0
- package/src/dtos/update-question.dto.ts +63 -0
- package/src/entities/ai-interaction.entity.ts +39 -0
- package/src/entities/dashboard-variable.entity.ts +30 -0
- package/src/entities/dashboard.entity.ts +21 -0
- package/src/entities/question-sql-dataset-config.entity.ts +25 -0
- package/src/entities/question.entity.ts +30 -0
- package/src/helpers/solid-registry.ts +44 -2
- package/src/index.ts +5 -0
- package/src/interfaces.ts +41 -29
- package/src/mappers/dashboard-mapper.ts +52 -0
- package/src/repository/dashboard.repository.ts +100 -0
- package/src/seeders/module-metadata-seeder.service.ts +21 -1
- package/src/seeders/seed-data/solid-core-metadata.json +4225 -2421
- package/src/services/1. Create a context menu option i.py +12 -0
- package/src/services/ai-interaction.service.ts +127 -0
- package/src/services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service.ts +56 -0
- package/src/services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service.ts +37 -0
- package/src/services/dashboard-variable.service.ts +36 -0
- package/src/services/dashboard.service.ts +147 -0
- package/src/services/menu-item-metadata.service.ts +2 -1
- package/src/services/question-data-providers/chartjs-sql-data-provider.service.ts +121 -0
- package/src/services/question-data-providers/helpers.ts +11 -0
- package/src/services/question-data-providers/prime-react-datatable-sql-data-provider.service.ts +72 -0
- package/src/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.ts +110 -0
- package/src/services/question-sql-dataset-config.service.ts +34 -0
- package/src/services/question.service.ts +115 -0
- package/src/services/scheduled-jobs/scheduler.service.ts +32 -64
- package/src/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.ts +41 -0
- package/src/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.ts +41 -0
- package/src/services/solid-introspect.service.ts +42 -0
- package/src/services/sql-expression-resolver.service.ts +125 -0
- package/src/solid-core.module.ts +61 -1
- package/src/subscribers/dashboard-variable.subscriber.ts +63 -0
- package/src/subscribers/dashboard.subscriber.ts +43 -0
- package/src/subscribers/question-sql-dataset-config.subscriber.ts +63 -0
- package/src/subscribers/question.subscriber.ts +65 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
45
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.DashboardService = exports.SQL_DYNAMIC_PROVIDER_NAME = void 0;
|
|
49
|
+
const common_1 = require("@nestjs/common");
|
|
50
|
+
const core_1 = require("@nestjs/core");
|
|
51
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
52
|
+
const typeorm_2 = require("typeorm");
|
|
53
|
+
const config_1 = require("@nestjs/config");
|
|
54
|
+
const crud_helper_service_1 = require("./crud-helper.service");
|
|
55
|
+
const crud_service_1 = require("./crud.service");
|
|
56
|
+
const file_service_1 = require("./file.service");
|
|
57
|
+
const model_metadata_service_1 = require("./model-metadata.service");
|
|
58
|
+
const module_metadata_service_1 = require("./module-metadata.service");
|
|
59
|
+
const fs = __importStar(require("fs/promises"));
|
|
60
|
+
const create_dashboard_variable_dto_1 = require("../dtos/create-dashboard-variable.dto");
|
|
61
|
+
const dashboard_variable_entity_1 = require("../entities/dashboard-variable.entity");
|
|
62
|
+
const module_metadata_helper_service_1 = require("../helpers/module-metadata-helper.service");
|
|
63
|
+
const solid_registry_1 = require("../helpers/solid-registry");
|
|
64
|
+
const dashboard_mapper_1 = require("../mappers/dashboard-mapper");
|
|
65
|
+
const dashboard_repository_1 = require("../repository/dashboard.repository");
|
|
66
|
+
exports.SQL_DYNAMIC_PROVIDER_NAME = 'DashboardVariableSQLDynamicProvider';
|
|
67
|
+
let DashboardService = class DashboardService extends crud_service_1.CRUDService {
|
|
68
|
+
constructor(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, moduleRef, solidRegistry, moduleMetadataHelperService, dashboardMapper) {
|
|
69
|
+
super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'dashboard', 'solid-core', moduleRef);
|
|
70
|
+
this.modelMetadataService = modelMetadataService;
|
|
71
|
+
this.moduleMetadataService = moduleMetadataService;
|
|
72
|
+
this.configService = configService;
|
|
73
|
+
this.fileService = fileService;
|
|
74
|
+
this.discoveryService = discoveryService;
|
|
75
|
+
this.crudHelperService = crudHelperService;
|
|
76
|
+
this.entityManager = entityManager;
|
|
77
|
+
this.repo = repo;
|
|
78
|
+
this.moduleRef = moduleRef;
|
|
79
|
+
this.solidRegistry = solidRegistry;
|
|
80
|
+
this.moduleMetadataHelperService = moduleMetadataHelperService;
|
|
81
|
+
this.dashboardMapper = dashboardMapper;
|
|
82
|
+
this.logger = new common_1.Logger(this.constructor.name);
|
|
83
|
+
}
|
|
84
|
+
async getSelectionDynamicValues(query) {
|
|
85
|
+
const dashboardVariable = await this.loadDashboardVariable(query.variableId);
|
|
86
|
+
const [providerName, context] = this.getProviderNameAndContext(dashboardVariable, query);
|
|
87
|
+
const selectionProviderInstance = this.solidRegistry.getDashboardVariableSelectionProviderInstance(providerName);
|
|
88
|
+
if (!selectionProviderInstance) {
|
|
89
|
+
throw new common_1.NotFoundException(`Field incorrectly configured. No provider with name ${providerName} registered in backend.`);
|
|
90
|
+
}
|
|
91
|
+
return selectionProviderInstance.values(query.query, context);
|
|
92
|
+
}
|
|
93
|
+
getProviderNameAndContext(dashboardVariable, query) {
|
|
94
|
+
const sourceType = dashboardVariable.selectionDynamicSourceType;
|
|
95
|
+
let providerName;
|
|
96
|
+
const context = { limit: query.limit, offset: query.offset };
|
|
97
|
+
switch (sourceType) {
|
|
98
|
+
case create_dashboard_variable_dto_1.SelectionDynamicSourceType.SQL:
|
|
99
|
+
providerName = exports.SQL_DYNAMIC_PROVIDER_NAME;
|
|
100
|
+
context['sql'] = dashboardVariable.selectionDynamicSQL;
|
|
101
|
+
break;
|
|
102
|
+
case create_dashboard_variable_dto_1.SelectionDynamicSourceType.PROVIDER:
|
|
103
|
+
providerName = dashboardVariable.selectionDynamicProviderName;
|
|
104
|
+
break;
|
|
105
|
+
default:
|
|
106
|
+
throw new Error(`Unsupported selection dynamic source type: ${sourceType}`);
|
|
107
|
+
}
|
|
108
|
+
return [providerName, context];
|
|
109
|
+
}
|
|
110
|
+
async loadDashboardVariable(variableId) {
|
|
111
|
+
const dashboardVariableRepo = this.entityManager.getRepository(dashboard_variable_entity_1.DashboardVariable);
|
|
112
|
+
const dashboardVariable = await dashboardVariableRepo.findOne({
|
|
113
|
+
where: {
|
|
114
|
+
id: variableId,
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
return dashboardVariable;
|
|
118
|
+
}
|
|
119
|
+
async saveDashboardToConfig(entity) {
|
|
120
|
+
if (!entity) {
|
|
121
|
+
this.logger.debug('No entity found in the DashboardSubscriber saveDashboardToConfig method');
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const dashboard = entity;
|
|
125
|
+
const moduleMetadata = entity.module;
|
|
126
|
+
if (!moduleMetadata) {
|
|
127
|
+
throw new Error(`Module metadata not found for dashboard id ${entity.id}`);
|
|
128
|
+
}
|
|
129
|
+
const { filePath, metaData } = await this.getConfigFileDetails(moduleMetadata.name);
|
|
130
|
+
if (!filePath || !metaData) {
|
|
131
|
+
throw new Error(`Configuration details not found for module: ${moduleMetadata.name}`);
|
|
132
|
+
}
|
|
133
|
+
await this.writeToConfig(metaData, dashboard, filePath);
|
|
134
|
+
}
|
|
135
|
+
async getConfigFileDetails(moduleName) {
|
|
136
|
+
const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);
|
|
137
|
+
try {
|
|
138
|
+
await fs.access(filePath);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
throw new Error(`Configuration file not found for module: ${moduleName}`);
|
|
142
|
+
}
|
|
143
|
+
const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
|
|
144
|
+
return { filePath, metaData };
|
|
145
|
+
}
|
|
146
|
+
async writeToConfig(metaData, dashboard, filePath) {
|
|
147
|
+
if (metaData.dashboards) {
|
|
148
|
+
const dashboardIndex = metaData.dashboards?.findIndex((dashboardFromFile) => dashboardFromFile.name === dashboard.name);
|
|
149
|
+
const dto = await this.dashboardMapper.toDto(dashboard);
|
|
150
|
+
metaData.dashboards[dashboardIndex] = dto;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
const dashboards = [];
|
|
154
|
+
const dto = await this.dashboardMapper.toDto(dashboard);
|
|
155
|
+
dashboards.push(dto);
|
|
156
|
+
metaData.dashboards = dashboards;
|
|
157
|
+
}
|
|
158
|
+
const updatedContent = JSON.stringify(metaData, null, 2);
|
|
159
|
+
await fs.writeFile(filePath, updatedContent);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
exports.DashboardService = DashboardService;
|
|
163
|
+
exports.DashboardService = DashboardService = __decorate([
|
|
164
|
+
(0, common_1.Injectable)(),
|
|
165
|
+
__param(6, (0, typeorm_1.InjectEntityManager)()),
|
|
166
|
+
__metadata("design:paramtypes", [model_metadata_service_1.ModelMetadataService,
|
|
167
|
+
module_metadata_service_1.ModuleMetadataService,
|
|
168
|
+
config_1.ConfigService,
|
|
169
|
+
file_service_1.FileService,
|
|
170
|
+
core_1.DiscoveryService,
|
|
171
|
+
crud_helper_service_1.CrudHelperService,
|
|
172
|
+
typeorm_2.EntityManager,
|
|
173
|
+
dashboard_repository_1.DashboardRepository,
|
|
174
|
+
core_1.ModuleRef,
|
|
175
|
+
solid_registry_1.SolidRegistry,
|
|
176
|
+
module_metadata_helper_service_1.ModuleMetadataHelperService,
|
|
177
|
+
dashboard_mapper_1.DashboardMapper])
|
|
178
|
+
], DashboardService);
|
|
179
|
+
//# sourceMappingURL=dashboard.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.service.js","sourceRoot":"","sources":["../../src/services/dashboard.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { EntityManager } from 'typeorm';\n\nimport { ConfigService } from '@nestjs/config';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from 'src/services/file.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\n\n\nimport * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await\nimport { SelectionDynamicSourceType } from 'src/dtos/create-dashboard-variable.dto';\nimport { DashboardVariableSelectionDynamicQueryDto } from 'src/dtos/dashboard-variable-selection-dynamic-query.dto';\nimport { DashboardVariable } from 'src/entities/dashboard-variable.entity';\nimport { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';\nimport { SolidRegistry } from 'src/helpers/solid-registry';\nimport { DashboardMapper } from 'src/mappers/dashboard-mapper';\nimport { DashboardRepository } from 'src/repository/dashboard.repository';\nimport { Dashboard } from '../entities/dashboard.entity';\n\n\nexport const SQL_DYNAMIC_PROVIDER_NAME = 'DashboardVariableSQLDynamicProvider';\n@Injectable()\nexport class DashboardService extends CRUDService<Dashboard> {\n private readonly logger = new Logger(this.constructor.name);\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n readonly repo: DashboardRepository, // Assuming you have a DashboardRepository for custom queries\n readonly moduleRef: ModuleRef,\n readonly solidRegistry: SolidRegistry, // Assuming solidRegistry is injected for selection providers\n readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n readonly dashboardMapper: DashboardMapper,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'dashboard', 'solid-core', moduleRef);\n }\n\n async getSelectionDynamicValues(query: DashboardVariableSelectionDynamicQueryDto) {\n // Get the dashboard variable repo\n const dashboardVariable = await this.loadDashboardVariable(query.variableId);\n\n // Get the providerName and context for the dashboard variable\n const [providerName, context] = this.getProviderNameAndContext(dashboardVariable, query);\n\n // Get hold of the provider instance from the SolidRegistry\n const selectionProviderInstance = this.solidRegistry.getDashboardVariableSelectionProviderInstance(providerName);\n if (!selectionProviderInstance) {\n throw new NotFoundException(`Field incorrectly configured. No provider with name ${providerName} registered in backend.`);\n }\n\n // 4. Call the provider's getSelectionDynamicValues method\n return selectionProviderInstance.values(query.query, context);\n }\n\n\n private getProviderNameAndContext(dashboardVariable: DashboardVariable, query: DashboardVariableSelectionDynamicQueryDto): [string, any] {\n const sourceType = dashboardVariable.selectionDynamicSourceType;\n\n // Get the appropriate provide name based on the source type\n let providerName: string;\n const context = { limit: query.limit, offset: query.offset };\n switch (sourceType) {\n case SelectionDynamicSourceType.SQL:\n providerName = SQL_DYNAMIC_PROVIDER_NAME;\n context['sql'] = dashboardVariable.selectionDynamicSQL;\n break;\n case SelectionDynamicSourceType.PROVIDER:\n providerName = dashboardVariable.selectionDynamicProviderName;\n break;\n default:\n throw new Error(`Unsupported selection dynamic source type: ${sourceType}`);\n }\n return [providerName, context];\n }\n\n private async loadDashboardVariable(variableId: number) {\n const dashboardVariableRepo = this.entityManager.getRepository(DashboardVariable);\n\n // Load the dashboard record using the field\n const dashboardVariable = await dashboardVariableRepo.findOne({\n where: {\n id: variableId,\n },\n });\n return dashboardVariable;\n }\n\n async saveDashboardToConfig(entity: Dashboard) {\n if (!entity) {\n this.logger.debug('No entity found in the DashboardSubscriber saveDashboardToConfig method');\n return;\n }\n\n // Validate dashboard details\n const dashboard = entity as Dashboard;\n const moduleMetadata = entity.module;\n if (!moduleMetadata) {\n throw new Error(`Module metadata not found for dashboard id ${entity.id}`);\n }\n\n // Get config file details\n const { filePath, metaData } = await this.getConfigFileDetails(moduleMetadata.name);\n if (!filePath || !metaData) {\n throw new Error(`Configuration details not found for module: ${moduleMetadata.name}`);\n }\n\n // Write the dashboard to the config file\n await this.writeToConfig(metaData, dashboard, filePath);\n }\n\n private async getConfigFileDetails(moduleName: string): Promise<{ filePath: string; metaData: any }> {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);\n try {\n await fs.access(filePath);\n } catch (error) {\n throw new Error(`Configuration file not found for module: ${moduleName}`);\n }\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n return { filePath, metaData };\n }\n\n private async writeToConfig(metaData: any, dashboard: Dashboard, filePath: string) {\n if (metaData.dashboards) {\n const dashboardIndex = metaData.dashboards?.findIndex((dashboardFromFile: { name: string; }) => dashboardFromFile.name === dashboard.name);\n const dto = await this.dashboardMapper.toDto(dashboard);\n metaData.dashboards[dashboardIndex] = dto;\n }\n else {\n const dashboards = [];\n const dto = await this.dashboardMapper.toDto(dashboard);\n dashboards.push(dto);\n metaData.dashboards = dashboards;\n }\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-item-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAI3E,qBACa,uBAAwB,SAAQ,WAAW,CAAC,gBAAgB,CAAC;IAEtE,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,gBAAgB,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS;gBAVpB,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,gBAAgB,CAAC,EAClC,SAAS,EAAE,SAAS;IAOzB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK;IAU7C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB;IA+BxD,aAAa,CAAC,UAAU,EAAE,cAAc;IAkE9C,OAAO,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"menu-item-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAI3E,qBACa,uBAAwB,SAAQ,WAAW,CAAC,gBAAgB,CAAC;IAEtE,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,gBAAgB,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS;gBAVpB,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,gBAAgB,CAAC,EAClC,SAAS,EAAE,SAAS;IAOzB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK;IAU7C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB;IA+BxD,aAAa,CAAC,UAAU,EAAE,cAAc;IAkE9C,OAAO,CAAC,aAAa;CAiDtB"}
|
|
@@ -120,7 +120,7 @@ let MenuItemMetadataService = class MenuItemMetadataService extends crud_service
|
|
|
120
120
|
}
|
|
121
121
|
if (rootItem.action && rootItem.action.type === 'solid') {
|
|
122
122
|
if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {
|
|
123
|
-
path = `/admin/core/${rootItem.module.name}/${(0, strings_1.dasherize)(rootItem.action
|
|
123
|
+
path = `/admin/core/${rootItem.module.name}/${(0, strings_1.dasherize)(rootItem.action?.model?.singularName ?? 'unknown')}/${rootItem.action?.view?.type ?? 'list'}`;
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
const data = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-item-metadata.service.js","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository } from 'typeorm';\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from \"src/services/file.service\";\nimport { CrudHelperService } from \"src/services/crud-helper.service\";\n\n\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { UpdateMenuItemMetadataDto } from '../dtos/update-menu-item-metadata.dto';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\nimport { dasherize } from '@angular-devkit/core/src/utils/strings';\n\n@Injectable()\nexport class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(MenuItemMetadata, 'default')\n readonly repo: Repository<MenuItemMetadata>,\n readonly moduleRef: ModuleRef\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'menuItemMetadata', 'solid-core', moduleRef);\n }\n\n\n async findOneByUserKey(name: string, relations = {}) {\n const entity = await this.repo.findOne({\n where: {\n name: name,\n },\n relations: relations,\n });\n return entity;\n }\n\n async upsert(updateSolidMenuItemDto: UpdateMenuItemMetadataDto) {\n // Leave out all the extra attributes only keep the ones we are interested in updating.\n const { moduleUserKey, parentMenuItemUserKey, actionUserKey, rolesIds, rolesCommand, ...cleanUpdateSolidMenuItemDto } = updateSolidMenuItemDto;\n\n // First check if module already exists using name\n const existingMenuItem = await this.repo.findOne({\n where: {\n name: updateSolidMenuItemDto.name\n },\n relations: [\"roles\"]\n });\n\n // if found\n if (existingMenuItem) {\n const updatedSolidActionDto = { ...existingMenuItem, ...cleanUpdateSolidMenuItemDto };\n // @ts-ignore\n return this.repo.save(updatedSolidActionDto);\n // await this.repo.remove(existingSolidAction);\n }\n // if not found - create new \n else {\n // @ts-ignore\n const moduleMetadata = this.repo.create(cleanUpdateSolidMenuItemDto);\n return this.repo.save(moduleMetadata);\n }\n // const moduleMetadata = this.repo.create(updateSolidMenuItemDto);\n // return this.repo.save(moduleMetadata);\n\n }\n\n\n async findUserMenus(activeUser: ActiveUserData) {\n // 1. For the users role, fire a query to load all menus that this role has access to. \n // const usersMenuItems = this.solidMenuItemRepo.find({\n // where: {\n // roles: {\n // name: In(activeUser.roles)\n // }\n // },\n // relations: ['module', 'parentMenuItem', 'action']\n // });\n const menuItems = await this.repo\n .createQueryBuilder('menuItem')\n .leftJoinAndSelect('menuItem.module', 'module')\n .leftJoinAndSelect('menuItem.parentMenuItem', 'parentMenuItem')\n .leftJoinAndSelect('menuItem.action', 'action')\n .leftJoinAndSelect('action.model', 'model') // Join the model relation of action\n .leftJoinAndSelect('action.view', 'view') // Join the model relation of action\n .leftJoinAndSelect('menuItem.roles', 'roles')\n .where('roles.name IN (:...roleNames)', { roleNames: activeUser.roles })\n .addOrderBy('module.menuSequenceNumber', 'ASC')\n .addOrderBy('menuItem.sequenceNumber', 'ASC')\n .getMany();\n\n // 2. First arrange the output of the above query by module based on module\n const modulesToMenuItemsMap = new Map<string, MenuItemMetadata[]>();\n const modulesMap = new Map<string, ModuleMetadata>();\n menuItems.forEach(menuItem => {\n const moduleName = menuItem.module.name;\n\n // Keep track of all menu items under a given module.\n if (!modulesToMenuItemsMap.has(moduleName)) {\n modulesToMenuItemsMap.set(moduleName, []);\n }\n modulesToMenuItemsMap.get(moduleName).push(menuItem);\n\n // Keep track of the modules information separately.\n if (!modulesMap.has(moduleName)) {\n modulesMap.set(moduleName, menuItem.module);\n }\n });\n\n // 3. Then for each module, do a recursive compilation of children based on parentMenuItem, while doing this use the relation - action to get hold of the path. \n const menu: any[] = [];\n\n modulesToMenuItemsMap.forEach((menuItems, moduleName) => {\n const rootMenuItems = menuItems.filter(item => !item.parentMenuItem);\n const moduleMetadata = modulesMap.get(moduleName);\n\n const moduleMenu = {\n title: moduleMetadata.displayName,\n // No need for path the module level.\n // path: ``,\n key: moduleName.toLowerCase().replace(/\\s+/g, '-'),\n // TODO: We need to add the module icon as part of the metadata so it can be brought here. \n // icon: `/images/menu/${moduleName.toLowerCase().replace(/\\s+/g, '-')}.svg`,\n children: this.buildMenuTree(rootMenuItems, menuItems, activeUser),\n icon: moduleMetadata.menuIconUrl,\n };\n\n menu.push(moduleMenu);\n });\n\n return menu.filter(m => m.children.length > 0);\n }\n\n // Recursive function to build the tree\n private buildMenuTree(rootItems: MenuItemMetadata[], allMenuItems: MenuItemMetadata[], activeUser: ActiveUserData): any[] {\n const menuItemsData = rootItems.map(rootItem => {\n const allowedMenuItems = allMenuItems.filter(i => {\n if (!i.parentMenuItem) {\n return true\n } else {\n return this.crudHelperService.hasReadPermissionOnModel(activeUser, i.action.model.singularName)\n }\n });\n // Get immediate children of the current loop variable menuItem.\n const children = allowedMenuItems.filter(item => item.parentMenuItem && item.parentMenuItem.id === rootItem.id);\n\n // TODO: We should specify path only if there are no more children present. \n // For now adding path everywhere. \n let path = '';\n\n if (rootItem.action && rootItem.action.type === 'custom') {\n path = rootItem.action.customComponent;\n }\n if (rootItem.action && rootItem.action.type === 'solid') {\n if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {\n\n\n // TODO: Here we are assuming that we will always take the user to collection view of a model. \n // We can make provision to take them other views also in the future. \n // path = `/admin/core/${rootItem.module.name}/${rootItem.action.model.singularName}/${rootItem.action.view.name}`;\n path = `/admin/core/${rootItem.module.name}/${dasherize(rootItem.action.model.singularName)}/${rootItem.action.view.type}`;\n }\n }\n\n // We are not checking for empty path coz, this is required for parent menu items.\n const data = {\n title: rootItem.displayName || rootItem.name,\n path: path,\n key: rootItem.name.toLowerCase().replace(/\\s+/g, '-'),\n icon: rootItem.iconName,\n // iconVariant : rootItem.iconVariant\n }\n if (children.length > 0) {\n data[\"children\"] = this.buildMenuTree(children, allMenuItems, activeUser);\n }\n return data;\n\n });\n return menuItemsData.filter(mi => mi && mi)\n }\n\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"menu-item-metadata.service.js","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository } from 'typeorm';\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from \"src/services/file.service\";\nimport { CrudHelperService } from \"src/services/crud-helper.service\";\n\n\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { UpdateMenuItemMetadataDto } from '../dtos/update-menu-item-metadata.dto';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\nimport { dasherize } from '@angular-devkit/core/src/utils/strings';\n\n@Injectable()\nexport class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(MenuItemMetadata, 'default')\n readonly repo: Repository<MenuItemMetadata>,\n readonly moduleRef: ModuleRef\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'menuItemMetadata', 'solid-core', moduleRef);\n }\n\n\n async findOneByUserKey(name: string, relations = {}) {\n const entity = await this.repo.findOne({\n where: {\n name: name,\n },\n relations: relations,\n });\n return entity;\n }\n\n async upsert(updateSolidMenuItemDto: UpdateMenuItemMetadataDto) {\n // Leave out all the extra attributes only keep the ones we are interested in updating.\n const { moduleUserKey, parentMenuItemUserKey, actionUserKey, rolesIds, rolesCommand, ...cleanUpdateSolidMenuItemDto } = updateSolidMenuItemDto;\n\n // First check if module already exists using name\n const existingMenuItem = await this.repo.findOne({\n where: {\n name: updateSolidMenuItemDto.name\n },\n relations: [\"roles\"]\n });\n\n // if found\n if (existingMenuItem) {\n const updatedSolidActionDto = { ...existingMenuItem, ...cleanUpdateSolidMenuItemDto };\n // @ts-ignore\n return this.repo.save(updatedSolidActionDto);\n // await this.repo.remove(existingSolidAction);\n }\n // if not found - create new \n else {\n // @ts-ignore\n const moduleMetadata = this.repo.create(cleanUpdateSolidMenuItemDto);\n return this.repo.save(moduleMetadata);\n }\n // const moduleMetadata = this.repo.create(updateSolidMenuItemDto);\n // return this.repo.save(moduleMetadata);\n\n }\n\n\n async findUserMenus(activeUser: ActiveUserData) {\n // 1. For the users role, fire a query to load all menus that this role has access to. \n // const usersMenuItems = this.solidMenuItemRepo.find({\n // where: {\n // roles: {\n // name: In(activeUser.roles)\n // }\n // },\n // relations: ['module', 'parentMenuItem', 'action']\n // });\n const menuItems = await this.repo\n .createQueryBuilder('menuItem')\n .leftJoinAndSelect('menuItem.module', 'module')\n .leftJoinAndSelect('menuItem.parentMenuItem', 'parentMenuItem')\n .leftJoinAndSelect('menuItem.action', 'action')\n .leftJoinAndSelect('action.model', 'model') // Join the model relation of action\n .leftJoinAndSelect('action.view', 'view') // Join the model relation of action\n .leftJoinAndSelect('menuItem.roles', 'roles')\n .where('roles.name IN (:...roleNames)', { roleNames: activeUser.roles })\n .addOrderBy('module.menuSequenceNumber', 'ASC')\n .addOrderBy('menuItem.sequenceNumber', 'ASC')\n .getMany();\n\n // 2. First arrange the output of the above query by module based on module\n const modulesToMenuItemsMap = new Map<string, MenuItemMetadata[]>();\n const modulesMap = new Map<string, ModuleMetadata>();\n menuItems.forEach(menuItem => {\n const moduleName = menuItem.module.name;\n\n // Keep track of all menu items under a given module.\n if (!modulesToMenuItemsMap.has(moduleName)) {\n modulesToMenuItemsMap.set(moduleName, []);\n }\n modulesToMenuItemsMap.get(moduleName).push(menuItem);\n\n // Keep track of the modules information separately.\n if (!modulesMap.has(moduleName)) {\n modulesMap.set(moduleName, menuItem.module);\n }\n });\n\n // 3. Then for each module, do a recursive compilation of children based on parentMenuItem, while doing this use the relation - action to get hold of the path. \n const menu: any[] = [];\n\n modulesToMenuItemsMap.forEach((menuItems, moduleName) => {\n const rootMenuItems = menuItems.filter(item => !item.parentMenuItem);\n const moduleMetadata = modulesMap.get(moduleName);\n\n const moduleMenu = {\n title: moduleMetadata.displayName,\n // No need for path the module level.\n // path: ``,\n key: moduleName.toLowerCase().replace(/\\s+/g, '-'),\n // TODO: We need to add the module icon as part of the metadata so it can be brought here. \n // icon: `/images/menu/${moduleName.toLowerCase().replace(/\\s+/g, '-')}.svg`,\n children: this.buildMenuTree(rootMenuItems, menuItems, activeUser),\n icon: moduleMetadata.menuIconUrl,\n };\n\n menu.push(moduleMenu);\n });\n\n return menu.filter(m => m.children.length > 0);\n }\n\n // Recursive function to build the tree\n private buildMenuTree(rootItems: MenuItemMetadata[], allMenuItems: MenuItemMetadata[], activeUser: ActiveUserData): any[] {\n const menuItemsData = rootItems.map(rootItem => {\n const allowedMenuItems = allMenuItems.filter(i => {\n if (!i.parentMenuItem) {\n return true\n } else {\n return this.crudHelperService.hasReadPermissionOnModel(activeUser, i.action.model.singularName)\n }\n });\n // Get immediate children of the current loop variable menuItem.\n const children = allowedMenuItems.filter(item => item.parentMenuItem && item.parentMenuItem.id === rootItem.id);\n\n // TODO: We should specify path only if there are no more children present. \n // For now adding path everywhere. \n let path = '';\n\n if (rootItem.action && rootItem.action.type === 'custom') {\n path = rootItem.action.customComponent;\n }\n if (rootItem.action && rootItem.action.type === 'solid') {\n if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {\n\n\n // TODO: Here we are assuming that we will always take the user to collection view of a model. \n // We can make provision to take them other views also in the future. \n // path = `/admin/core/${rootItem.module.name}/${rootItem.action.model.singularName}/${rootItem.action.view.name}`;\n path = `/admin/core/${rootItem.module.name}/${dasherize(rootItem.action?.model?.singularName ?? 'unknown')}/${rootItem.action?.view?.type ?? 'list'}`;\n\n }\n }\n\n // We are not checking for empty path coz, this is required for parent menu items.\n const data = {\n title: rootItem.displayName || rootItem.name,\n path: path,\n key: rootItem.name.toLowerCase().replace(/\\s+/g, '-'),\n icon: rootItem.iconName,\n // iconVariant : rootItem.iconVariant\n }\n if (children.length > 0) {\n data[\"children\"] = this.buildMenuTree(children, allMenuItems, activeUser);\n }\n return data;\n\n });\n return menuItemsData.filter(mi => mi && mi)\n }\n\n\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Question } from "src/entities/question.entity";
|
|
2
|
+
import { IDashboardQuestionDataProvider } from "src/interfaces";
|
|
3
|
+
import { EntityManager } from "typeorm";
|
|
4
|
+
import { SqlExpressionResolverService } from "../sql-expression-resolver.service";
|
|
5
|
+
export interface QuestionSqlDataProviderContext {
|
|
6
|
+
}
|
|
7
|
+
export declare enum SqlExpressionOperator {
|
|
8
|
+
EQUALS = "$equals",
|
|
9
|
+
NOT_EQUALS = "$notEquals",
|
|
10
|
+
CONTAINS = "$contains",
|
|
11
|
+
NOT_CONTAINS = "$notContains",
|
|
12
|
+
STARTS_WITH = "$startsWith",
|
|
13
|
+
ENDS_WITH = "$endsWith",
|
|
14
|
+
IN = "$in",
|
|
15
|
+
NOT_IN = "$notIn",
|
|
16
|
+
BETWEEN = "$between",
|
|
17
|
+
LT = "$lt",
|
|
18
|
+
LTE = "$lte",
|
|
19
|
+
GT = "$gt",
|
|
20
|
+
GTE = "$gte"
|
|
21
|
+
}
|
|
22
|
+
export interface SqlExpression {
|
|
23
|
+
variableName: string;
|
|
24
|
+
operator: SqlExpressionOperator;
|
|
25
|
+
value: string[];
|
|
26
|
+
}
|
|
27
|
+
export declare class ChartJsSqlDataProvider implements IDashboardQuestionDataProvider<QuestionSqlDataProviderContext, any> {
|
|
28
|
+
private readonly entityManager;
|
|
29
|
+
private readonly sqlExpressionResolver;
|
|
30
|
+
private readonly logger;
|
|
31
|
+
constructor(entityManager: EntityManager, sqlExpressionResolver: SqlExpressionResolverService);
|
|
32
|
+
help(): string;
|
|
33
|
+
name(): string;
|
|
34
|
+
getData(question: Question, expressions?: SqlExpression[], context?: QuestionSqlDataProviderContext): Promise<any>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=chartjs-sql-data-provider.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chartjs-sql-data-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/question-data-providers/chartjs-sql-data-provider.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAIlF,MAAM,WAAW,8BAA8B;CAI9C;AAED,oBAAY,qBAAqB;IAC7B,MAAM,YAAY;IAClB,UAAU,eAAe;IACzB,QAAQ,cAAc;IACtB,YAAY,iBAAiB;IAC7B,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,EAAE,QAAQ;IACV,MAAM,WAAW;IACjB,OAAO,aAAa;IACpB,EAAE,QAAQ;IACV,GAAG,SAAS;IACZ,EAAE,QAAQ;IACV,GAAG,SAAS;CACf;AAED,MAAM,WAAW,aAAa;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAEa,sBAAuB,YAAW,8BAA8B,CAAC,8BAA8B,EAAE,GAAG,CAAC;IAGlG,OAAO,CAAC,QAAQ,CAAC,aAAa;IAAiB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAFjG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;gBAErC,aAAa,EAAE,aAAa,EAAmB,qBAAqB,EAAE,4BAA4B;IAE/H,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,8BAA8B,GAAG,OAAO,CAAC,GAAG,CAAC;CAoE3H"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var ChartJsSqlDataProvider_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.ChartJsSqlDataProvider = exports.SqlExpressionOperator = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const dashboard_question_data_provider_decorator_1 = require("../../decorators/dashboard-question-data-provider.decorator");
|
|
16
|
+
const typeorm_1 = require("typeorm");
|
|
17
|
+
const sql_expression_resolver_service_1 = require("../sql-expression-resolver.service");
|
|
18
|
+
const common_2 = require("@nestjs/common");
|
|
19
|
+
const helpers_1 = require("./helpers");
|
|
20
|
+
var SqlExpressionOperator;
|
|
21
|
+
(function (SqlExpressionOperator) {
|
|
22
|
+
SqlExpressionOperator["EQUALS"] = "$equals";
|
|
23
|
+
SqlExpressionOperator["NOT_EQUALS"] = "$notEquals";
|
|
24
|
+
SqlExpressionOperator["CONTAINS"] = "$contains";
|
|
25
|
+
SqlExpressionOperator["NOT_CONTAINS"] = "$notContains";
|
|
26
|
+
SqlExpressionOperator["STARTS_WITH"] = "$startsWith";
|
|
27
|
+
SqlExpressionOperator["ENDS_WITH"] = "$endsWith";
|
|
28
|
+
SqlExpressionOperator["IN"] = "$in";
|
|
29
|
+
SqlExpressionOperator["NOT_IN"] = "$notIn";
|
|
30
|
+
SqlExpressionOperator["BETWEEN"] = "$between";
|
|
31
|
+
SqlExpressionOperator["LT"] = "$lt";
|
|
32
|
+
SqlExpressionOperator["LTE"] = "$lte";
|
|
33
|
+
SqlExpressionOperator["GT"] = "$gt";
|
|
34
|
+
SqlExpressionOperator["GTE"] = "$gte";
|
|
35
|
+
})(SqlExpressionOperator || (exports.SqlExpressionOperator = SqlExpressionOperator = {}));
|
|
36
|
+
let ChartJsSqlDataProvider = ChartJsSqlDataProvider_1 = class ChartJsSqlDataProvider {
|
|
37
|
+
constructor(entityManager, sqlExpressionResolver) {
|
|
38
|
+
this.entityManager = entityManager;
|
|
39
|
+
this.sqlExpressionResolver = sqlExpressionResolver;
|
|
40
|
+
this.logger = new common_2.Logger(ChartJsSqlDataProvider_1.name);
|
|
41
|
+
}
|
|
42
|
+
help() {
|
|
43
|
+
return "Provides data for dashboard questions using a SQL dataset configuration. Configure your SQL dataset in the admin panel, then reference it in your dashboard question to fetch data.";
|
|
44
|
+
}
|
|
45
|
+
name() {
|
|
46
|
+
return "ChartJsSqlDataProvider";
|
|
47
|
+
}
|
|
48
|
+
async getData(question, expressions, context) {
|
|
49
|
+
let datasetIdx = 0;
|
|
50
|
+
const datasets = [];
|
|
51
|
+
const labels = await (0, helpers_1.getLabels)(question, this.entityManager);
|
|
52
|
+
for (const questionSqlDatasetConfig of question.questionSqlDatasetConfigs) {
|
|
53
|
+
const sql = questionSqlDatasetConfig.sql;
|
|
54
|
+
if (!sql) {
|
|
55
|
+
throw new Error(`SQL dataset ${questionSqlDatasetConfig.datasetName} configuration does not contain a valid SQL query.`);
|
|
56
|
+
}
|
|
57
|
+
const sqlReplacementResult = this.sqlExpressionResolver.resolveSqlWithExpressions(sql, expressions || []);
|
|
58
|
+
this.logger.log(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is query=[${sqlReplacementResult.rawSql}]`);
|
|
59
|
+
this.logger.log(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is parameters=[${JSON.stringify(sqlReplacementResult.parameters)}]`);
|
|
60
|
+
const results = await this.entityManager.query(sqlReplacementResult.rawSql, sqlReplacementResult.parameters);
|
|
61
|
+
const data = [];
|
|
62
|
+
for (let i = 0; i < results.length; i++) {
|
|
63
|
+
const result = results[i];
|
|
64
|
+
data.push(result[questionSqlDatasetConfig.valueColumnName]);
|
|
65
|
+
}
|
|
66
|
+
datasets.push({
|
|
67
|
+
label: questionSqlDatasetConfig.datasetDisplayName,
|
|
68
|
+
data: data,
|
|
69
|
+
...JSON.parse(questionSqlDatasetConfig.options || '{}'),
|
|
70
|
+
});
|
|
71
|
+
datasetIdx++;
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
labels,
|
|
75
|
+
datasets
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
exports.ChartJsSqlDataProvider = ChartJsSqlDataProvider;
|
|
80
|
+
exports.ChartJsSqlDataProvider = ChartJsSqlDataProvider = ChartJsSqlDataProvider_1 = __decorate([
|
|
81
|
+
(0, dashboard_question_data_provider_decorator_1.DashboardQuestionDataProvider)(),
|
|
82
|
+
(0, common_1.Injectable)(),
|
|
83
|
+
__metadata("design:paramtypes", [typeorm_1.EntityManager, sql_expression_resolver_service_1.SqlExpressionResolverService])
|
|
84
|
+
], ChartJsSqlDataProvider);
|
|
85
|
+
//# sourceMappingURL=chartjs-sql-data-provider.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chartjs-sql-data-provider.service.js","sourceRoot":"","sources":["../../../src/services/question-data-providers/chartjs-sql-data-provider.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DashboardQuestionDataProvider } from \"src/decorators/dashboard-question-data-provider.decorator\";\nimport { Question } from \"src/entities/question.entity\";\nimport { IDashboardQuestionDataProvider } from \"src/interfaces\";\nimport { EntityManager } from \"typeorm\";\nimport { SqlExpressionResolverService } from \"../sql-expression-resolver.service\";\nimport { Logger } from '@nestjs/common';\nimport { getLabels } from \"./helpers\";\n\nexport interface QuestionSqlDataProviderContext {\n // questionSqlDatasetConfig: QuestionSqlDatasetConfig;\n // questionId: number;\n // question: Question;\n}\n\nexport enum SqlExpressionOperator {\n EQUALS = '$equals',\n NOT_EQUALS = '$notEquals',\n CONTAINS = '$contains',\n NOT_CONTAINS = '$notContains',\n STARTS_WITH = '$startsWith',\n ENDS_WITH = '$endsWith',\n IN = '$in',\n NOT_IN = '$notIn',\n BETWEEN = '$between',\n LT = '$lt',\n LTE = '$lte',\n GT = '$gt',\n GTE = '$gte'\n}\n\nexport interface SqlExpression {\n variableName: string; // The name of the variable in the SQL query\n operator: SqlExpressionOperator; // The operator to use for the replacement (e.g., '=', '>', '<', etc.)\n value: string[]; // The value to replace the variable with\n}\n\n@DashboardQuestionDataProvider()\n@Injectable()\nexport class ChartJsSqlDataProvider implements IDashboardQuestionDataProvider<QuestionSqlDataProviderContext, any> {\n private readonly logger = new Logger(ChartJsSqlDataProvider.name);\n\n constructor(private readonly entityManager: EntityManager, private readonly sqlExpressionResolver: SqlExpressionResolverService) { }\n\n help(): string {\n return \"Provides data for dashboard questions using a SQL dataset configuration. Configure your SQL dataset in the admin panel, then reference it in your dashboard question to fetch data.\";\n }\n\n name(): string {\n return \"ChartJsSqlDataProvider\";\n }\n\n async getData(question: Question, expressions?: SqlExpression[], context?: QuestionSqlDataProviderContext): Promise<any> {\n // TODO: put some validation to check if the results of each SQL in each dataset returns the same number of rows \n\n // This is what we have to return.\n // const data = {\n // labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],\n // datasets: [\n // {\n // label: 'Dataset 1',\n // data: labels.map(() => faker.number.int({ min: 0, max: 1000 })),\n // backgroundColor: 'rgba(255, 99, 132, 0.5)',\n // },\n // {\n // label: 'Dataset 2',\n // data: labels.map(() => faker.number.int({ min: 0, max: 1000 })),\n // backgroundColor: 'rgba(53, 162, 235, 0.5)',\n // },\n // {\n // label: 'Dataset 3',\n // data: labels.map(() => faker.number.int({ min: 0, max: 1000 })),\n // backgroundColor: 'rgba(53, 235, 162, 0.5)',\n // },\n // ],\n // };\n\n // TODO: Load the set of labels by using a separate field on the question entity.\n\n let datasetIdx = 0;\n const datasets = [];\n\n const labels: string[] = await getLabels(question, this.entityManager);\n\n // const question = context.question;\n for (const questionSqlDatasetConfig of question.questionSqlDatasetConfigs) {\n\n const sql = questionSqlDatasetConfig.sql;\n if (!sql) {\n throw new Error(`SQL dataset ${questionSqlDatasetConfig.datasetName} configuration does not contain a valid SQL query.`);\n }\n\n const sqlReplacementResult = this.sqlExpressionResolver.resolveSqlWithExpressions(sql, expressions || []);\n this.logger.log(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is query=[${sqlReplacementResult.rawSql}]`);\n this.logger.log(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is parameters=[${JSON.stringify(sqlReplacementResult.parameters)}]`);\n const results = await this.entityManager.query(sqlReplacementResult.rawSql, sqlReplacementResult.parameters);\n\n // Also for each data set we create the dataset object as is expected by ChartJs.\n const data = [];\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n data.push(result[questionSqlDatasetConfig.valueColumnName]);\n }\n datasets.push({\n label: questionSqlDatasetConfig.datasetDisplayName,\n data: data,\n ...JSON.parse(questionSqlDatasetConfig.options || '{}'),\n });\n\n datasetIdx++;\n }\n\n return {\n labels,\n datasets\n };\n\n }\n\n\n}"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/services/question-data-providers/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,wBAAsB,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOnG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getLabels = getLabels;
|
|
4
|
+
async function getLabels(question, entityManager) {
|
|
5
|
+
const labelSql = question.labelSql;
|
|
6
|
+
const labelResults = await this.entityManager.query(labelSql);
|
|
7
|
+
const labels = labelResults.map((result) => result['label']);
|
|
8
|
+
return labels;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/services/question-data-providers/helpers.ts"],"names":[],"mappings":";;AAGA,8BAOC;AAPM,KAAK,UAAU,SAAS,CAAC,QAAkB,EAAE,aAA4B;IAC5E,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAG9D,MAAM,MAAM,GAAa,YAAY,CAAC,GAAG,CAAC,CAAC,MAAgC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACjG,OAAO,MAAM,CAAC;AAClB,CAAC","sourcesContent":["import { Question } from \"src/entities/question.entity\";\nimport { EntityManager } from \"typeorm\";\n\nexport async function getLabels(question: Question, entityManager: EntityManager): Promise<string[]> {\n const labelSql = question.labelSql;\n const labelResults = await this.entityManager.query(labelSql);\n // Assuming labelResults has a single row with a 'label' field\n // Map the label results to the labels array\n const labels: string[] = labelResults.map((result: { [x: string]: string; }) => result['label']);\n return labels;\n}"]}
|
package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Question } from "src/entities/question.entity";
|
|
2
|
+
import { IDashboardQuestionDataProvider } from "src/interfaces";
|
|
3
|
+
import { EntityManager } from "typeorm";
|
|
4
|
+
import { SqlExpressionResolverService } from "../sql-expression-resolver.service";
|
|
5
|
+
import { SqlExpression } from "./chartjs-sql-data-provider.service";
|
|
6
|
+
export interface QuestionSqlDataProviderContext {
|
|
7
|
+
}
|
|
8
|
+
export declare class PrimeReactDatatableSqlDataProvider implements IDashboardQuestionDataProvider<QuestionSqlDataProviderContext, any> {
|
|
9
|
+
private readonly entityManager;
|
|
10
|
+
private readonly sqlExpressionResolver;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
constructor(entityManager: EntityManager, sqlExpressionResolver: SqlExpressionResolverService);
|
|
13
|
+
help(): string;
|
|
14
|
+
name(): string;
|
|
15
|
+
getData(question: Question, expressions?: SqlExpression[], context?: QuestionSqlDataProviderContext): Promise<any>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=prime-react-datatable-sql-data-provider.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prime-react-datatable-sql-data-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/question-data-providers/prime-react-datatable-sql-data-provider.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEpE,MAAM,WAAW,8BAA8B;CAI9C;AAED,qBAEa,kCAAmC,YAAW,8BAA8B,CAAC,8BAA8B,EAAE,GAAG,CAAC;IAG9G,OAAO,CAAC,QAAQ,CAAC,aAAa;IAAiB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAFjG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuD;gBAEjD,aAAa,EAAE,aAAa,EAAmB,qBAAqB,EAAE,4BAA4B;IAE/H,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,8BAA8B,GAAG,OAAO,CAAC,GAAG,CAAC;CAyC3H"}
|
package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var PrimeReactDatatableSqlDataProvider_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.PrimeReactDatatableSqlDataProvider = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const dashboard_question_data_provider_decorator_1 = require("../../decorators/dashboard-question-data-provider.decorator");
|
|
16
|
+
const typeorm_1 = require("typeorm");
|
|
17
|
+
const sql_expression_resolver_service_1 = require("../sql-expression-resolver.service");
|
|
18
|
+
const common_2 = require("@nestjs/common");
|
|
19
|
+
let PrimeReactDatatableSqlDataProvider = PrimeReactDatatableSqlDataProvider_1 = class PrimeReactDatatableSqlDataProvider {
|
|
20
|
+
constructor(entityManager, sqlExpressionResolver) {
|
|
21
|
+
this.entityManager = entityManager;
|
|
22
|
+
this.sqlExpressionResolver = sqlExpressionResolver;
|
|
23
|
+
this.logger = new common_2.Logger(PrimeReactDatatableSqlDataProvider_1.name);
|
|
24
|
+
}
|
|
25
|
+
help() {
|
|
26
|
+
return "Provides data for dashboard questions using a SQL dataset configuration. Configure your SQL dataset in the admin panel, then reference it in your dashboard question to fetch data.";
|
|
27
|
+
}
|
|
28
|
+
name() {
|
|
29
|
+
return "PrimeReactDatatableSqlDataProvider";
|
|
30
|
+
}
|
|
31
|
+
async getData(question, expressions, context) {
|
|
32
|
+
const labelSql = question.labelSql;
|
|
33
|
+
const labelResults = await this.entityManager.query(labelSql);
|
|
34
|
+
const columns = [];
|
|
35
|
+
for (let i = 0; i < labelResults.length; i++) {
|
|
36
|
+
const labelResult = labelResults[i];
|
|
37
|
+
columns.push({
|
|
38
|
+
field: labelResult['field'],
|
|
39
|
+
header: labelResult['header'],
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const values = [];
|
|
43
|
+
const questionSqlDatasetConfig = question.questionSqlDatasetConfigs[0];
|
|
44
|
+
const sql = questionSqlDatasetConfig.sql;
|
|
45
|
+
if (!sql) {
|
|
46
|
+
throw new Error(`SQL dataset ${questionSqlDatasetConfig.datasetName} configuration does not contain a valid SQL query.`);
|
|
47
|
+
}
|
|
48
|
+
const sqlReplacementResult = this.sqlExpressionResolver.resolveSqlWithExpressions(sql, expressions || []);
|
|
49
|
+
this.logger.log(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is query=[${sqlReplacementResult.rawSql}]`);
|
|
50
|
+
this.logger.log(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is parameters=[${JSON.stringify(sqlReplacementResult.parameters)}]`);
|
|
51
|
+
const results = await this.entityManager.query(sqlReplacementResult.rawSql, sqlReplacementResult.parameters);
|
|
52
|
+
return {
|
|
53
|
+
columns,
|
|
54
|
+
data: results,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
exports.PrimeReactDatatableSqlDataProvider = PrimeReactDatatableSqlDataProvider;
|
|
59
|
+
exports.PrimeReactDatatableSqlDataProvider = PrimeReactDatatableSqlDataProvider = PrimeReactDatatableSqlDataProvider_1 = __decorate([
|
|
60
|
+
(0, dashboard_question_data_provider_decorator_1.DashboardQuestionDataProvider)(),
|
|
61
|
+
(0, common_1.Injectable)(),
|
|
62
|
+
__metadata("design:paramtypes", [typeorm_1.EntityManager, sql_expression_resolver_service_1.SqlExpressionResolverService])
|
|
63
|
+
], PrimeReactDatatableSqlDataProvider);
|
|
64
|
+
//# sourceMappingURL=prime-react-datatable-sql-data-provider.service.js.map
|
package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prime-react-datatable-sql-data-provider.service.js","sourceRoot":"","sources":["../../../src/services/question-data-providers/prime-react-datatable-sql-data-provider.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,4HAA0G;AAG1G,qCAAwC;AACxC,wFAAkF;AAClF,2CAAwC;AAWjC,IAAM,kCAAkC,0CAAxC,MAAM,kCAAkC;IAG3C,YAA6B,aAA4B,EAAmB,qBAAmD;QAAlG,kBAAa,GAAb,aAAa,CAAe;QAAmB,0BAAqB,GAArB,qBAAqB,CAA8B;QAF9G,WAAM,GAAG,IAAI,eAAM,CAAC,oCAAkC,CAAC,IAAI,CAAC,CAAC;IAEqD,CAAC;IAEpI,IAAI;QACA,OAAO,qLAAqL,CAAC;IACjM,CAAC;IAED,IAAI;QACA,OAAO,oCAAoC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAkB,EAAE,WAA6B,EAAE,OAAwC;QAMrG,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC;gBAC3B,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC;aAChC,CAAC,CAAC;QACP,CAAC;QAKD,MAAM,MAAM,GAAG,EAAE,CAAA;QAGjB,MAAM,wBAAwB,GAAG,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;QAEvE,MAAM,GAAG,GAAG,wBAAwB,CAAC,GAAG,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,eAAe,wBAAwB,CAAC,WAAW,oDAAoD,CAAC,CAAC;QAC7H,CAAC;QAED,MAAM,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,GAAG,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;QAC1G,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,wBAAwB,CAAC,WAAW,eAAe,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;QACnI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,wBAAwB,CAAC,WAAW,oBAAoB,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5J,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAE7G,OAAO;YACH,OAAO;YACP,IAAI,EAAE,OAAO;SAChB,CAAC;IAEN,CAAC;CACJ,CAAA;AAtDY,gFAAkC;6CAAlC,kCAAkC;IAF9C,IAAA,0EAA6B,GAAE;IAC/B,IAAA,mBAAU,GAAE;qCAImC,uBAAa,EAA0C,8DAA4B;GAHtH,kCAAkC,CAsD9C","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DashboardQuestionDataProvider } from \"src/decorators/dashboard-question-data-provider.decorator\";\nimport { Question } from \"src/entities/question.entity\";\nimport { IDashboardQuestionDataProvider } from \"src/interfaces\";\nimport { EntityManager } from \"typeorm\";\nimport { SqlExpressionResolverService } from \"../sql-expression-resolver.service\";\nimport { Logger } from '@nestjs/common';\nimport { SqlExpression } from \"./chartjs-sql-data-provider.service\";\n\nexport interface QuestionSqlDataProviderContext {\n // questionSqlDatasetConfig: QuestionSqlDatasetConfig;\n // questionId: number;\n // question: Question;\n}\n\n@DashboardQuestionDataProvider()\n@Injectable()\nexport class PrimeReactDatatableSqlDataProvider implements IDashboardQuestionDataProvider<QuestionSqlDataProviderContext, any> {\n private readonly logger = new Logger(PrimeReactDatatableSqlDataProvider.name);\n\n constructor(private readonly entityManager: EntityManager, private readonly sqlExpressionResolver: SqlExpressionResolverService) { }\n\n help(): string {\n return \"Provides data for dashboard questions using a SQL dataset configuration. Configure your SQL dataset in the admin panel, then reference it in your dashboard question to fetch data.\";\n }\n\n name(): string {\n return \"PrimeReactDatatableSqlDataProvider\";\n }\n\n async getData(question: Question, expressions?: SqlExpression[], context?: QuestionSqlDataProviderContext): Promise<any> {\n // TODO: put some validation to check if the results of each SQL in each dataset returns the same number of rows \n\n // Check the expected response for prime react data tables to understand what is going on here...\n\n // TODO: Load the set of labels by using a separate field on the question entity.\n const labelSql = question.labelSql;\n const labelResults = await this.entityManager.query(labelSql);\n const columns = [];\n for (let i = 0; i < labelResults.length; i++) {\n const labelResult = labelResults[i];\n columns.push({\n field: labelResult['field'],\n header: labelResult['header'],\n });\n }\n\n // Load the chart options as a JSON \n // const chartOptions = JSON.parse(question.barChartLabelOptions || '{}');\n\n const values = []\n\n // For meter group we can assume that we only have one sql dataset config.\n const questionSqlDatasetConfig = question.questionSqlDatasetConfigs[0];\n\n const sql = questionSqlDatasetConfig.sql;\n if (!sql) {\n throw new Error(`SQL dataset ${questionSqlDatasetConfig.datasetName} configuration does not contain a valid SQL query.`);\n }\n\n const sqlReplacementResult = this.sqlExpressionResolver.resolveSqlWithExpressions(sql, expressions || []);\n this.logger.log(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is query=[${sqlReplacementResult.rawSql}]`);\n this.logger.log(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is parameters=[${JSON.stringify(sqlReplacementResult.parameters)}]`);\n const results = await this.entityManager.query(sqlReplacementResult.rawSql, sqlReplacementResult.parameters);\n\n return {\n columns,\n data: results,\n };\n\n }\n}"]}
|
package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Question } from "src/entities/question.entity";
|
|
2
|
+
import { IDashboardQuestionDataProvider } from "src/interfaces";
|
|
3
|
+
import { EntityManager } from "typeorm";
|
|
4
|
+
import { SqlExpressionResolverService } from "../sql-expression-resolver.service";
|
|
5
|
+
import { SqlExpression } from "./chartjs-sql-data-provider.service";
|
|
6
|
+
export interface QuestionSqlDataProviderContext {
|
|
7
|
+
}
|
|
8
|
+
export declare class PrimeReactMeterGroupSqlDataProvider implements IDashboardQuestionDataProvider<QuestionSqlDataProviderContext, any> {
|
|
9
|
+
private readonly entityManager;
|
|
10
|
+
private readonly sqlExpressionResolver;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
constructor(entityManager: EntityManager, sqlExpressionResolver: SqlExpressionResolverService);
|
|
13
|
+
help(): string;
|
|
14
|
+
name(): string;
|
|
15
|
+
hslToHex(h: number, s: number, l: number): string;
|
|
16
|
+
generateDistinctColors(count: number): string[];
|
|
17
|
+
getData(question: Question, expressions?: SqlExpression[], context?: QuestionSqlDataProviderContext): Promise<any>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=prime-react-meter-group-sql-data-provider.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prime-react-meter-group-sql-data-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEpE,MAAM,WAAW,8BAA8B;CAI9C;AAED,qBAEa,mCAAoC,YAAW,8BAA8B,CAAC,8BAA8B,EAAE,GAAG,CAAC;IAG/G,OAAO,CAAC,QAAQ,CAAC,aAAa;IAAiB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAFjG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwD;gBAElD,aAAa,EAAE,aAAa,EAAmB,qBAAqB,EAAE,4BAA4B;IAE/H,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAId,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAcjD,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAezC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,8BAA8B,GAAG,OAAO,CAAC,GAAG,CAAC;CAkD3H"}
|