@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.
Files changed (65) hide show
  1. package/dist/bi.module.d.ts +8 -0
  2. package/dist/bi.module.d.ts.map +1 -0
  3. package/dist/bi.module.js +25 -0
  4. package/dist/bi.module.js.map +1 -0
  5. package/dist/entities/bi-chart.entity.d.ts +13 -0
  6. package/dist/entities/bi-chart.entity.d.ts.map +1 -0
  7. package/dist/entities/bi-chart.entity.js +63 -0
  8. package/dist/entities/bi-chart.entity.js.map +1 -0
  9. package/dist/entities/bi-dashboard.entity.d.ts +20 -0
  10. package/dist/entities/bi-dashboard.entity.d.ts.map +1 -0
  11. package/dist/entities/bi-dashboard.entity.js +99 -0
  12. package/dist/entities/bi-dashboard.entity.js.map +1 -0
  13. package/dist/entities/bi-data-permission.entity.d.ts +12 -0
  14. package/dist/entities/bi-data-permission.entity.d.ts.map +1 -0
  15. package/dist/entities/bi-data-permission.entity.js +64 -0
  16. package/dist/entities/bi-data-permission.entity.js.map +1 -0
  17. package/dist/entities/bi-datasource.entity.d.ts +20 -0
  18. package/dist/entities/bi-datasource.entity.d.ts.map +1 -0
  19. package/dist/entities/bi-datasource.entity.js +93 -0
  20. package/dist/entities/bi-datasource.entity.js.map +1 -0
  21. package/dist/entities/bi-query.entity.d.ts +17 -0
  22. package/dist/entities/bi-query.entity.d.ts.map +1 -0
  23. package/dist/entities/bi-query.entity.js +83 -0
  24. package/dist/entities/bi-query.entity.js.map +1 -0
  25. package/dist/entities/bi-report.entity.d.ts +14 -0
  26. package/dist/entities/bi-report.entity.d.ts.map +1 -0
  27. package/dist/entities/bi-report.entity.js +73 -0
  28. package/dist/entities/bi-report.entity.js.map +1 -0
  29. package/dist/entities/index.d.ts +18 -0
  30. package/dist/entities/index.d.ts.map +1 -0
  31. package/dist/entities/index.js +21 -0
  32. package/dist/entities/index.js.map +1 -0
  33. package/dist/index.d.ts +16 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +15 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/services/chart.service.d.ts +27 -0
  38. package/dist/services/chart.service.d.ts.map +1 -0
  39. package/dist/services/chart.service.js +86 -0
  40. package/dist/services/chart.service.js.map +1 -0
  41. package/dist/services/dashboard.service.d.ts +34 -0
  42. package/dist/services/dashboard.service.d.ts.map +1 -0
  43. package/dist/services/dashboard.service.js +121 -0
  44. package/dist/services/dashboard.service.js.map +1 -0
  45. package/dist/services/datasource.service.d.ts +32 -0
  46. package/dist/services/datasource.service.d.ts.map +1 -0
  47. package/dist/services/datasource.service.js +97 -0
  48. package/dist/services/datasource.service.js.map +1 -0
  49. package/dist/services/query.service.d.ts +28 -0
  50. package/dist/services/query.service.d.ts.map +1 -0
  51. package/dist/services/query.service.js +113 -0
  52. package/dist/services/query.service.js.map +1 -0
  53. package/dist/services/report.service.d.ts +26 -0
  54. package/dist/services/report.service.d.ts.map +1 -0
  55. package/dist/services/report.service.js +80 -0
  56. package/dist/services/report.service.js.map +1 -0
  57. package/package.json +64 -0
  58. package/web/index.ts +12 -0
  59. package/web/manifest.ts +37 -0
  60. package/web/messages/en-US.json +15 -0
  61. package/web/messages/zh-CN.json +15 -0
  62. package/web/pages/ChartsPage.tsx +15 -0
  63. package/web/pages/DashboardsPage.tsx +15 -0
  64. package/web/pages/DatasourcesPage.tsx +15 -0
  65. 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'
@@ -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
+ {
2
+ "bi": {
3
+ "title": "商业智能",
4
+ "description": "数据分析与可视化平台",
5
+ "pages": {
6
+ "dashboards": "仪表盘",
7
+ "charts": "图表管理",
8
+ "reports": "报表管理",
9
+ "datasources": "数据源"
10
+ },
11
+ "groups": {
12
+ "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
+ }