@octo-cyber/bi 0.5.0
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/bi.module.d.ts +8 -0
- package/dist/bi.module.d.ts.map +1 -0
- package/dist/bi.module.js +25 -0
- package/dist/bi.module.js.map +1 -0
- package/dist/entities/bi-chart.entity.d.ts +13 -0
- package/dist/entities/bi-chart.entity.d.ts.map +1 -0
- package/dist/entities/bi-chart.entity.js +63 -0
- package/dist/entities/bi-chart.entity.js.map +1 -0
- package/dist/entities/bi-dashboard.entity.d.ts +20 -0
- package/dist/entities/bi-dashboard.entity.d.ts.map +1 -0
- package/dist/entities/bi-dashboard.entity.js +99 -0
- package/dist/entities/bi-dashboard.entity.js.map +1 -0
- package/dist/entities/bi-data-permission.entity.d.ts +12 -0
- package/dist/entities/bi-data-permission.entity.d.ts.map +1 -0
- package/dist/entities/bi-data-permission.entity.js +64 -0
- package/dist/entities/bi-data-permission.entity.js.map +1 -0
- package/dist/entities/bi-datasource.entity.d.ts +20 -0
- package/dist/entities/bi-datasource.entity.d.ts.map +1 -0
- package/dist/entities/bi-datasource.entity.js +93 -0
- package/dist/entities/bi-datasource.entity.js.map +1 -0
- package/dist/entities/bi-query.entity.d.ts +17 -0
- package/dist/entities/bi-query.entity.d.ts.map +1 -0
- package/dist/entities/bi-query.entity.js +83 -0
- package/dist/entities/bi-query.entity.js.map +1 -0
- package/dist/entities/bi-report.entity.d.ts +14 -0
- package/dist/entities/bi-report.entity.d.ts.map +1 -0
- package/dist/entities/bi-report.entity.js +73 -0
- package/dist/entities/bi-report.entity.js.map +1 -0
- package/dist/entities/index.d.ts +18 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +21 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/services/chart.service.d.ts +27 -0
- package/dist/services/chart.service.d.ts.map +1 -0
- package/dist/services/chart.service.js +86 -0
- package/dist/services/chart.service.js.map +1 -0
- package/dist/services/dashboard.service.d.ts +34 -0
- package/dist/services/dashboard.service.d.ts.map +1 -0
- package/dist/services/dashboard.service.js +121 -0
- package/dist/services/dashboard.service.js.map +1 -0
- package/dist/services/datasource.service.d.ts +32 -0
- package/dist/services/datasource.service.d.ts.map +1 -0
- package/dist/services/datasource.service.js +97 -0
- package/dist/services/datasource.service.js.map +1 -0
- package/dist/services/query.service.d.ts +28 -0
- package/dist/services/query.service.d.ts.map +1 -0
- package/dist/services/query.service.js +113 -0
- package/dist/services/query.service.js.map +1 -0
- package/dist/services/report.service.d.ts +26 -0
- package/dist/services/report.service.d.ts.map +1 -0
- package/dist/services/report.service.js +80 -0
- package/dist/services/report.service.js.map +1 -0
- package/package.json +64 -0
- package/web/index.ts +12 -0
- package/web/manifest.ts +37 -0
- package/web/messages/en-US.json +15 -0
- package/web/messages/zh-CN.json +15 -0
- package/web/pages/ChartsPage.tsx +15 -0
- package/web/pages/DashboardsPage.tsx +15 -0
- package/web/pages/DatasourcesPage.tsx +15 -0
- package/web/pages/ReportsPage.tsx +15 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.service.d.ts","sourceRoot":"","sources":["../../src/services/query.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAEzD,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,WAAW,CAAS;IAE5B,UAAU,IAAI,IAAI;IAMlB,OAAO,CAAC,UAAU;IAQZ,aAAa,CAAC,MAAM,GAAE,eAAoB;;;;;;IAiB1C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAK7C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAMhD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ5D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAwB7E,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAQrE,QAAQ;CAmBvB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Service, Container, DatabaseService, AppError } from '@octo-cyber/core';
|
|
8
|
+
import { BiQuery } from '../entities/bi-query.entity.js';
|
|
9
|
+
let QueryService = class QueryService {
|
|
10
|
+
repo;
|
|
11
|
+
initialized = false;
|
|
12
|
+
initialize() {
|
|
13
|
+
const db = Container.get(DatabaseService);
|
|
14
|
+
this.repo = db.getRepository(BiQuery);
|
|
15
|
+
this.initialized = true;
|
|
16
|
+
}
|
|
17
|
+
ensureInit() {
|
|
18
|
+
if (!this.initialized) {
|
|
19
|
+
const db = Container.get(DatabaseService);
|
|
20
|
+
this.repo = db.getRepository(BiQuery);
|
|
21
|
+
this.initialized = true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async findPaginated(params = {}) {
|
|
25
|
+
this.ensureInit();
|
|
26
|
+
const page = params.page ?? 1;
|
|
27
|
+
const pageSize = params.pageSize ?? 20;
|
|
28
|
+
const qb = this.repo.createQueryBuilder('q');
|
|
29
|
+
if (params.dataSourceId) {
|
|
30
|
+
qb.andWhere('q.datasource_id = :dsId', { dsId: params.dataSourceId });
|
|
31
|
+
}
|
|
32
|
+
if (params.keyword) {
|
|
33
|
+
qb.andWhere('q.name LIKE :kw', { kw: `%${params.keyword}%` });
|
|
34
|
+
}
|
|
35
|
+
qb.orderBy('q.created_at', 'DESC');
|
|
36
|
+
qb.skip((page - 1) * pageSize).take(pageSize);
|
|
37
|
+
const [items, total] = await qb.getManyAndCount();
|
|
38
|
+
return { items, total, page, pageSize };
|
|
39
|
+
}
|
|
40
|
+
async findById(id) {
|
|
41
|
+
this.ensureInit();
|
|
42
|
+
return this.repo.findOneBy({ id });
|
|
43
|
+
}
|
|
44
|
+
async create(data) {
|
|
45
|
+
this.ensureInit();
|
|
46
|
+
const query = this.repo.create(data);
|
|
47
|
+
return this.repo.save(query);
|
|
48
|
+
}
|
|
49
|
+
async update(id, data) {
|
|
50
|
+
this.ensureInit();
|
|
51
|
+
const query = await this.repo.findOneBy({ id });
|
|
52
|
+
if (!query)
|
|
53
|
+
throw AppError.notFound(`Query #${id} not found`);
|
|
54
|
+
Object.assign(query, data);
|
|
55
|
+
return this.repo.save(query);
|
|
56
|
+
}
|
|
57
|
+
async delete(id) {
|
|
58
|
+
this.ensureInit();
|
|
59
|
+
const query = await this.repo.findOneBy({ id });
|
|
60
|
+
if (!query)
|
|
61
|
+
throw AppError.notFound(`Query #${id} not found`);
|
|
62
|
+
await this.repo.remove(query);
|
|
63
|
+
}
|
|
64
|
+
async execute(id, params = {}) {
|
|
65
|
+
this.ensureInit();
|
|
66
|
+
const query = await this.repo.findOneBy({ id });
|
|
67
|
+
if (!query)
|
|
68
|
+
throw AppError.notFound(`Query #${id} not found`);
|
|
69
|
+
const now = new Date();
|
|
70
|
+
if (query.cachedResult && query.cachedAt && query.cacheSeconds) {
|
|
71
|
+
const ageSeconds = (now.getTime() - query.cachedAt.getTime()) / 1000;
|
|
72
|
+
if (ageSeconds < query.cacheSeconds) {
|
|
73
|
+
return JSON.parse(query.cachedResult);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const result = await this.runQuery(query, params);
|
|
77
|
+
if (query.cacheSeconds && query.cacheSeconds > 0) {
|
|
78
|
+
query.cachedAt = now;
|
|
79
|
+
query.cachedResult = JSON.stringify(result);
|
|
80
|
+
await this.repo.save(query);
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
async preview(id, params = {}) {
|
|
85
|
+
this.ensureInit();
|
|
86
|
+
const query = await this.repo.findOneBy({ id });
|
|
87
|
+
if (!query)
|
|
88
|
+
throw AppError.notFound(`Query #${id} not found`);
|
|
89
|
+
const result = await this.runQuery(query, params);
|
|
90
|
+
return result.slice(0, 100);
|
|
91
|
+
}
|
|
92
|
+
async runQuery(query, _params) {
|
|
93
|
+
const db = Container.get(DatabaseService);
|
|
94
|
+
if (query.mode === 'sql' && query.rawSql) {
|
|
95
|
+
const dataSource = db.getDataSource();
|
|
96
|
+
const rows = await dataSource.query(query.rawSql);
|
|
97
|
+
return rows;
|
|
98
|
+
}
|
|
99
|
+
if (query.mode === 'visual' && query.visualConfigJson) {
|
|
100
|
+
const config = JSON.parse(query.visualConfigJson);
|
|
101
|
+
const limit = config.limit ?? 1000;
|
|
102
|
+
const dataSource = db.getDataSource();
|
|
103
|
+
const rows = await dataSource.query(`SELECT * FROM "${config.table}" LIMIT ${limit}`);
|
|
104
|
+
return rows;
|
|
105
|
+
}
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
QueryService = __decorate([
|
|
110
|
+
Service()
|
|
111
|
+
], QueryService);
|
|
112
|
+
export { QueryService };
|
|
113
|
+
//# sourceMappingURL=query.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.service.js","sourceRoot":"","sources":["../../src/services/query.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BiReport } from '../entities/bi-report.entity.js';
|
|
2
|
+
interface ReportListParams {
|
|
3
|
+
keyword?: string;
|
|
4
|
+
createdBy?: string;
|
|
5
|
+
page?: number;
|
|
6
|
+
pageSize?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class ReportService {
|
|
9
|
+
private repo;
|
|
10
|
+
private initialized;
|
|
11
|
+
initialize(): void;
|
|
12
|
+
private ensureInit;
|
|
13
|
+
findPaginated(params?: ReportListParams): Promise<{
|
|
14
|
+
items: BiReport[];
|
|
15
|
+
total: number;
|
|
16
|
+
page: number;
|
|
17
|
+
pageSize: number;
|
|
18
|
+
}>;
|
|
19
|
+
findById(id: string): Promise<BiReport | null>;
|
|
20
|
+
create(data: Partial<BiReport>): Promise<BiReport>;
|
|
21
|
+
update(id: string, data: Partial<BiReport>): Promise<BiReport>;
|
|
22
|
+
delete(id: string): Promise<void>;
|
|
23
|
+
generate(id: string): Promise<BiReport>;
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=report.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.service.d.ts","sourceRoot":"","sources":["../../src/services/report.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAE3D,UAAU,gBAAgB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,WAAW,CAAS;IAE5B,UAAU,IAAI,IAAI;IAMlB,OAAO,CAAC,UAAU;IAQZ,aAAa,CAAC,MAAM,GAAE,gBAAqB;;;;;;IAiB3C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAK9C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IASlD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAQ9D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;CAO9C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Service, Container, DatabaseService, AppError } from '@octo-cyber/core';
|
|
8
|
+
import { BiReport } from '../entities/bi-report.entity.js';
|
|
9
|
+
let ReportService = class ReportService {
|
|
10
|
+
repo;
|
|
11
|
+
initialized = false;
|
|
12
|
+
initialize() {
|
|
13
|
+
const db = Container.get(DatabaseService);
|
|
14
|
+
this.repo = db.getRepository(BiReport);
|
|
15
|
+
this.initialized = true;
|
|
16
|
+
}
|
|
17
|
+
ensureInit() {
|
|
18
|
+
if (!this.initialized) {
|
|
19
|
+
const db = Container.get(DatabaseService);
|
|
20
|
+
this.repo = db.getRepository(BiReport);
|
|
21
|
+
this.initialized = true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async findPaginated(params = {}) {
|
|
25
|
+
this.ensureInit();
|
|
26
|
+
const page = params.page ?? 1;
|
|
27
|
+
const pageSize = params.pageSize ?? 20;
|
|
28
|
+
const qb = this.repo.createQueryBuilder('r');
|
|
29
|
+
if (params.createdBy) {
|
|
30
|
+
qb.andWhere('r.created_by = :cb', { cb: params.createdBy });
|
|
31
|
+
}
|
|
32
|
+
if (params.keyword) {
|
|
33
|
+
qb.andWhere('r.name LIKE :kw', { kw: `%${params.keyword}%` });
|
|
34
|
+
}
|
|
35
|
+
qb.orderBy('r.updated_at', 'DESC');
|
|
36
|
+
qb.skip((page - 1) * pageSize).take(pageSize);
|
|
37
|
+
const [items, total] = await qb.getManyAndCount();
|
|
38
|
+
return { items, total, page, pageSize };
|
|
39
|
+
}
|
|
40
|
+
async findById(id) {
|
|
41
|
+
this.ensureInit();
|
|
42
|
+
return this.repo.findOneBy({ id });
|
|
43
|
+
}
|
|
44
|
+
async create(data) {
|
|
45
|
+
this.ensureInit();
|
|
46
|
+
if (!data.sectionsJson) {
|
|
47
|
+
data.sectionsJson = JSON.stringify([]);
|
|
48
|
+
}
|
|
49
|
+
const report = this.repo.create(data);
|
|
50
|
+
return this.repo.save(report);
|
|
51
|
+
}
|
|
52
|
+
async update(id, data) {
|
|
53
|
+
this.ensureInit();
|
|
54
|
+
const report = await this.repo.findOneBy({ id });
|
|
55
|
+
if (!report)
|
|
56
|
+
throw AppError.notFound(`Report #${id} not found`);
|
|
57
|
+
Object.assign(report, data);
|
|
58
|
+
return this.repo.save(report);
|
|
59
|
+
}
|
|
60
|
+
async delete(id) {
|
|
61
|
+
this.ensureInit();
|
|
62
|
+
const report = await this.repo.findOneBy({ id });
|
|
63
|
+
if (!report)
|
|
64
|
+
throw AppError.notFound(`Report #${id} not found`);
|
|
65
|
+
await this.repo.remove(report);
|
|
66
|
+
}
|
|
67
|
+
async generate(id) {
|
|
68
|
+
this.ensureInit();
|
|
69
|
+
const report = await this.repo.findOneBy({ id });
|
|
70
|
+
if (!report)
|
|
71
|
+
throw AppError.notFound(`Report #${id} not found`);
|
|
72
|
+
report.lastGeneratedAt = new Date();
|
|
73
|
+
return this.repo.save(report);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
ReportService = __decorate([
|
|
77
|
+
Service()
|
|
78
|
+
], ReportService);
|
|
79
|
+
export { ReportService };
|
|
80
|
+
//# sourceMappingURL=report.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.service.js","sourceRoot":"","sources":["../../src/services/report.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@octo-cyber/bi",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "Octo BI module — data analytics and business intelligence",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./web": {
|
|
15
|
+
"types": "./web/index.ts",
|
|
16
|
+
"import": "./web/index.ts",
|
|
17
|
+
"default": "./web/index.ts"
|
|
18
|
+
},
|
|
19
|
+
"./web/pages/*": {
|
|
20
|
+
"types": "./web/pages/*.tsx",
|
|
21
|
+
"import": "./web/pages/*.tsx",
|
|
22
|
+
"default": "./web/pages/*.tsx"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"@octo-cyber/ui": "^0.5.0",
|
|
27
|
+
"lucide-react": ">=0.400.0",
|
|
28
|
+
"next": "^16.0.0",
|
|
29
|
+
"next-intl": "^4.0.0",
|
|
30
|
+
"react": "^19.0.0",
|
|
31
|
+
"react-dom": "^19.0.0",
|
|
32
|
+
"recharts": "^3.0.0",
|
|
33
|
+
"sonner": "^2.0.0",
|
|
34
|
+
"zod": "^3.0.0",
|
|
35
|
+
"@octo-cyber/core": "^0.5.4",
|
|
36
|
+
"@octo-cyber/auth": "^0.5.6"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/express": "^5.0.0",
|
|
40
|
+
"@types/react": "^19",
|
|
41
|
+
"@types/react-dom": "^19",
|
|
42
|
+
"typescript": "^5.8.0"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"web"
|
|
47
|
+
],
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public",
|
|
50
|
+
"registry": "https://registry.npmjs.org"
|
|
51
|
+
},
|
|
52
|
+
"octoMeta": {
|
|
53
|
+
"module": "bi",
|
|
54
|
+
"gitUrl": "git@github.com:jefflower/octo-bi.git",
|
|
55
|
+
"branch": "main",
|
|
56
|
+
"commitHash": "__COMMIT_HASH__",
|
|
57
|
+
"version": "0.5.0"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"build": "tsc -p tsconfig.build.json",
|
|
61
|
+
"dev": "tsc -p tsconfig.build.json --watch",
|
|
62
|
+
"typecheck": "tsc --noEmit"
|
|
63
|
+
}
|
|
64
|
+
}
|
package/web/index.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Manifest
|
|
2
|
+
export { biFrontendManifest } from './manifest'
|
|
3
|
+
|
|
4
|
+
// Pages
|
|
5
|
+
export { default as DashboardsPage } from './pages/DashboardsPage'
|
|
6
|
+
export { default as ChartsPage } from './pages/ChartsPage'
|
|
7
|
+
export { default as ReportsPage } from './pages/ReportsPage'
|
|
8
|
+
export { default as DatasourcesPage } from './pages/DatasourcesPage'
|
|
9
|
+
|
|
10
|
+
// i18n Messages
|
|
11
|
+
export { default as biMessagesZhCN } from './messages/zh-CN.json'
|
|
12
|
+
export { default as biMessagesEnUS } from './messages/en-US.json'
|
package/web/manifest.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { IFrontendManifest } from '@octo-cyber/core';
|
|
2
|
+
|
|
3
|
+
export const biFrontendManifest: IFrontendManifest = {
|
|
4
|
+
moduleId: 'bi',
|
|
5
|
+
icon: 'BarChart3',
|
|
6
|
+
color: 'indigo',
|
|
7
|
+
position: 'main',
|
|
8
|
+
titleKey: 'bi.title',
|
|
9
|
+
descriptionKey: 'bi.description',
|
|
10
|
+
pages: [
|
|
11
|
+
{
|
|
12
|
+
path: '/bi/dashboards',
|
|
13
|
+
titleKey: 'bi.pages.dashboards',
|
|
14
|
+
icon: 'LayoutDashboard',
|
|
15
|
+
component: '@octo-cyber/bi/web/pages/DashboardsPage',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
path: '/bi/charts',
|
|
19
|
+
titleKey: 'bi.pages.charts',
|
|
20
|
+
icon: 'BarChart2',
|
|
21
|
+
component: '@octo-cyber/bi/web/pages/ChartsPage',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
path: '/bi/reports',
|
|
25
|
+
titleKey: 'bi.pages.reports',
|
|
26
|
+
icon: 'FileBarChart',
|
|
27
|
+
component: '@octo-cyber/bi/web/pages/ReportsPage',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
path: '/bi/datasources',
|
|
31
|
+
titleKey: 'bi.pages.datasources',
|
|
32
|
+
icon: 'Database',
|
|
33
|
+
group: 'settings',
|
|
34
|
+
component: '@octo-cyber/bi/web/pages/DatasourcesPage',
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"bi": {
|
|
3
|
+
"title": "Business Intelligence",
|
|
4
|
+
"description": "Data analytics and visualization platform",
|
|
5
|
+
"pages": {
|
|
6
|
+
"dashboards": "Dashboards",
|
|
7
|
+
"charts": "Charts",
|
|
8
|
+
"reports": "Reports",
|
|
9
|
+
"datasources": "Data Sources"
|
|
10
|
+
},
|
|
11
|
+
"groups": {
|
|
12
|
+
"settings": "Settings"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useTranslations } from 'next-intl'
|
|
4
|
+
|
|
5
|
+
export default function ChartsPage() {
|
|
6
|
+
const t = useTranslations('bi')
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<div className="p-6">
|
|
10
|
+
<h1 className="text-2xl font-bold text-foreground dark:text-foreground">
|
|
11
|
+
{t('pages.charts')}
|
|
12
|
+
</h1>
|
|
13
|
+
</div>
|
|
14
|
+
)
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useTranslations } from 'next-intl'
|
|
4
|
+
|
|
5
|
+
export default function DashboardsPage() {
|
|
6
|
+
const t = useTranslations('bi')
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<div className="p-6">
|
|
10
|
+
<h1 className="text-2xl font-bold text-foreground dark:text-foreground">
|
|
11
|
+
{t('pages.dashboards')}
|
|
12
|
+
</h1>
|
|
13
|
+
</div>
|
|
14
|
+
)
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useTranslations } from 'next-intl'
|
|
4
|
+
|
|
5
|
+
export default function DatasourcesPage() {
|
|
6
|
+
const t = useTranslations('bi')
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<div className="p-6">
|
|
10
|
+
<h1 className="text-2xl font-bold text-foreground dark:text-foreground">
|
|
11
|
+
{t('pages.datasources')}
|
|
12
|
+
</h1>
|
|
13
|
+
</div>
|
|
14
|
+
)
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useTranslations } from 'next-intl'
|
|
4
|
+
|
|
5
|
+
export default function ReportsPage() {
|
|
6
|
+
const t = useTranslations('bi')
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<div className="p-6">
|
|
10
|
+
<h1 className="text-2xl font-bold text-foreground dark:text-foreground">
|
|
11
|
+
{t('pages.reports')}
|
|
12
|
+
</h1>
|
|
13
|
+
</div>
|
|
14
|
+
)
|
|
15
|
+
}
|