@opengis/bi 1.2.0 → 1.2.1
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.js +1 -1
- package/dist/bi.umd.cjs +1 -1
- package/dist/{import-file-Bx4xpxVb.js → import-file-D06AZEtP.js} +11 -11
- package/dist/{vs-funnel-bar-C_TceUrc.js → vs-funnel-bar-C8m-602x.js} +1 -1
- package/dist/{vs-list-DyhLUIPb.js → vs-list-BJ0NjSm5.js} +1 -1
- package/dist/{vs-map-BtQJNN4L.js → vs-map-PLlJqaaW.js} +2 -2
- package/dist/{vs-map-cluster-BbPUosvt.js → vs-map-cluster-9tV6eiDA.js} +2 -2
- package/dist/{vs-number-D2GkU586.js → vs-number-B2V_BPer.js} +1 -1
- package/dist/{vs-table-D_Yn9QqB.js → vs-table-WGE9jyDq.js} +1 -1
- package/dist/{vs-text-BivVd6cY.js → vs-text-DkLKRC7F.js} +1 -1
- package/package.json +8 -8
- package/plugin.js +22 -0
- package/server/helpers/mdToHTML.js +17 -0
- package/server/migrations/bi.dataset.sql +46 -0
- package/server/migrations/bi.sql +112 -0
- package/server/plugins/docs.js +48 -0
- package/server/plugins/hook.js +89 -0
- package/server/plugins/vite.js +69 -0
- package/server/routes/dashboard/controllers/dashboard.import.js +103 -0
- package/server/routes/dashboard/controllers/dashboard.js +157 -0
- package/server/routes/dashboard/controllers/dashboard.list.js +40 -0
- package/server/routes/dashboard/controllers/utils/yaml.js +11 -0
- package/server/routes/dashboard/index.mjs +26 -0
- package/server/routes/data/controllers/data.js +229 -0
- package/server/routes/data/controllers/util/chartSQL.js +49 -0
- package/server/routes/data/controllers/util/normalizeData.js +65 -0
- package/server/routes/data/index.mjs +32 -0
- package/server/routes/dataset/controllers/bi.dataset.list.js +29 -0
- package/server/routes/dataset/controllers/bi.db.list.js +19 -0
- package/server/routes/dataset/controllers/comment.js +55 -0
- package/server/routes/dataset/controllers/createDatasetPost.js +134 -0
- package/server/routes/dataset/controllers/data.js +149 -0
- package/server/routes/dataset/controllers/dbTablePreview.js +58 -0
- package/server/routes/dataset/controllers/dbTables.js +34 -0
- package/server/routes/dataset/controllers/delete.js +40 -0
- package/server/routes/dataset/controllers/deleteDataset.js +52 -0
- package/server/routes/dataset/controllers/editDataset.js +90 -0
- package/server/routes/dataset/controllers/export.js +213 -0
- package/server/routes/dataset/controllers/form.js +99 -0
- package/server/routes/dataset/controllers/format.js +46 -0
- package/server/routes/dataset/controllers/insert.js +47 -0
- package/server/routes/dataset/controllers/table.js +68 -0
- package/server/routes/dataset/controllers/update.js +43 -0
- package/server/routes/dataset/index.mjs +132 -0
- package/server/routes/dataset/utils/convertJSONToCSV.js +17 -0
- package/server/routes/dataset/utils/convertJSONToXls.js +47 -0
- package/server/routes/dataset/utils/createTableQuery.js +59 -0
- package/server/routes/dataset/utils/datasetForms.js +1 -0
- package/server/routes/dataset/utils/descriptionList.js +46 -0
- package/server/routes/dataset/utils/downloadRemoteFile.js +58 -0
- package/server/routes/dataset/utils/executeQuery.js +46 -0
- package/server/routes/dataset/utils/getLayersData.js +107 -0
- package/server/routes/dataset/utils/getTableData.js +47 -0
- package/server/routes/dataset/utils/insertDataQuery.js +12 -0
- package/server/routes/dataset/utils/metaFormat.js +24 -0
- package/server/routes/edit/controllers/dashboard.add.js +36 -0
- package/server/routes/edit/controllers/dashboard.delete.js +39 -0
- package/server/routes/edit/controllers/dashboard.edit.js +61 -0
- package/server/routes/edit/controllers/widget.add.js +78 -0
- package/server/routes/edit/controllers/widget.del.js +58 -0
- package/server/routes/edit/controllers/widget.edit.js +106 -0
- package/server/routes/edit/index.mjs +33 -0
- package/server/routes/map/controllers/cluster.js +125 -0
- package/server/routes/map/controllers/clusterVtile.js +166 -0
- package/server/routes/map/controllers/geojson.js +127 -0
- package/server/routes/map/controllers/heatmap.js +118 -0
- package/server/routes/map/controllers/map.js +69 -0
- package/server/routes/map/controllers/utils/downloadClusterData.js +45 -0
- package/server/routes/map/controllers/vtile.js +183 -0
- package/server/routes/map/index.mjs +32 -0
- package/server/templates/page/login.html +59 -0
- package/server/utils/getWidget.js +117 -0
- package/utils.js +12 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { getTemplate, getPGAsync, pgClients, getMeta } from '@opengis/fastify-table/utils.js';
|
|
2
|
+
|
|
3
|
+
import mdToHTML from '../helpers/mdToHTML.js';
|
|
4
|
+
|
|
5
|
+
async function getWidget({ pg: pg1 = pgClients.client, dashboard, widget }) {
|
|
6
|
+
if (!dashboard && !widget) {
|
|
7
|
+
return { message: `not enough params: dashboard / widget`, status: 400 };
|
|
8
|
+
}
|
|
9
|
+
const dashboardData = dashboard
|
|
10
|
+
? await getTemplate('dashboard', dashboard)
|
|
11
|
+
: null;
|
|
12
|
+
|
|
13
|
+
const dashboardData1 = await pg1.query(`select db, table_name, widgets as "dashboardWidgets" from bi.dashboard where dashboard_id=$1`, [dashboard])
|
|
14
|
+
.then(el => el.rows?.[0] || {});
|
|
15
|
+
const { dashboardWidgets = [] } = dashboardData1;
|
|
16
|
+
const dashboardDb = typeof dashboardData1?.db === 'string' && dashboardData1?.db?.startsWith('{') ? JSON.parse(dashboardData1?.db) : dashboardData1?.db;
|
|
17
|
+
|
|
18
|
+
const dashboardIndex = dashboardData?.find((el) => el[0] == 'index.yml')?.[1]; // dashboardData?.find((el) => el[2] == 'index')?.[1]
|
|
19
|
+
const pg = dashboardDb || dashboardIndex?.db ? await getPGAsync(dashboardDb || dashboardIndex?.db) : pg1;
|
|
20
|
+
|
|
21
|
+
const { id, tableName } =
|
|
22
|
+
!dashboardData && !dashboardData1 && pg.pk['bi.dashboard'] && dashboard
|
|
23
|
+
? await pg1.query(`select dashboard_id as id, table_name as "tableName" from bi.dashboard where $1 in (dashboard_id, name)`, [dashboard])
|
|
24
|
+
.then(el => el.rows?.[0] || {})
|
|
25
|
+
: {};
|
|
26
|
+
|
|
27
|
+
if (!dashboardData && !dashboardData1 && dashboard && !id) {
|
|
28
|
+
return { message: `dashboard not found: ${dashboard}`, status: 404 };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
dashboardData?.forEach((el) => {
|
|
32
|
+
el[2] = el[0].split('.')[0];
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const widgetData = dashboard
|
|
36
|
+
? dashboardData?.find((el) => el[2] === (widget || 'index'))?.[1]
|
|
37
|
+
|| dashboardWidgets?.find(el => el.name === widget)
|
|
38
|
+
: await getTemplate('widget', widget);
|
|
39
|
+
|
|
40
|
+
if (typeof widgetData === 'string' || typeof widgetData?.html === 'string' || (widgetData?.type === 'text' && typeof widgetData?.data?.text === 'string')) {
|
|
41
|
+
const html = widgetData?.html || mdToHTML(widgetData?.data?.text || widgetData);
|
|
42
|
+
return { source: html, status: 200 };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (!id && !dashboardData && !dashboardData1 && !widgetData) {
|
|
46
|
+
return { message: `not found ${widget} ${dashboard}`, status: 404 };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const q = `select *, title as text, coalesce(data::jsonb, '{}'::jsonb) || jsonb_build_object('table', table_name) as data from bi.widget where dashboard_id=$1 and name=$2`;
|
|
50
|
+
|
|
51
|
+
const {
|
|
52
|
+
type,
|
|
53
|
+
text,
|
|
54
|
+
data = {},
|
|
55
|
+
controls,
|
|
56
|
+
style,
|
|
57
|
+
options,
|
|
58
|
+
yml
|
|
59
|
+
} = widgetData ||
|
|
60
|
+
(await pg
|
|
61
|
+
.query(q, [id || dashboard, widget])
|
|
62
|
+
.then(el => el.rows?.[0] || {}));
|
|
63
|
+
|
|
64
|
+
if (!type) {
|
|
65
|
+
return { message: `widget not found: ${widget}`, status: 404 };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
Object.assign(data, {
|
|
69
|
+
table:
|
|
70
|
+
data.table ||
|
|
71
|
+
tableName ||
|
|
72
|
+
widgetData?.table_name ||
|
|
73
|
+
dashboardIndex?.table ||
|
|
74
|
+
dashboardIndex?.table_name ||
|
|
75
|
+
dashboardData1?.table_name,
|
|
76
|
+
db: dashboardDb?.db || dashboardDb || dashboardIndex?.db || widgetData?.db || pg?.options?.database,
|
|
77
|
+
});
|
|
78
|
+
const main = { ...(dashboardIndex || {}), ...widgetData, ...data, ...data?.data || {} };
|
|
79
|
+
const widgetDb = widgetData?.db ? await getPGAsync(widgetData?.db) : pg;
|
|
80
|
+
|
|
81
|
+
if (!main?.table) {
|
|
82
|
+
return {
|
|
83
|
+
message: /* json.error || */ `invalid ${widget ? 'widget' : 'dashboard'}: empty table`,
|
|
84
|
+
status: 404,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const loadTemplate = pg.pk?.['admin.doc_template'] ? await pg.query(
|
|
89
|
+
'select body from admin.doc_template where doc_type=5 and title=$1',
|
|
90
|
+
[main.table]
|
|
91
|
+
).then(el => el.rows?.[0]?.body) : null;
|
|
92
|
+
|
|
93
|
+
const { pk, view, columns = [] } = await getMeta({ pg: widgetDb, table: loadTemplate?.table || main?.table });
|
|
94
|
+
if (!pk && !view) {
|
|
95
|
+
return {
|
|
96
|
+
message: /* json.error || */ `invalid ${widget ? 'widget' : 'dashboard'}: table not found (${loadTemplate?.table || main?.table})`,
|
|
97
|
+
status: 404,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const tableSQL = Array.isArray(main?.tableSQL) ? main?.tableSQL?.map?.(
|
|
102
|
+
(el, i) => `left join lateral(${el})t${i + 1} on 1=1`
|
|
103
|
+
)?.join?.(' ') : main?.tableSQL;
|
|
104
|
+
|
|
105
|
+
const columnList = columns.map(col => col.name);
|
|
106
|
+
|
|
107
|
+
const res = { ...main, pg: widgetDb, sql: widgetData?.sql, limit: widgetData?.limit, tableSQL, data, type, text, controls, style, options, yml };
|
|
108
|
+
if (res.x && !columnList.includes(res.x) && !loadTemplate?.table && !tableSQL?.includes?.(res.x)) {
|
|
109
|
+
Object.assign(res, { x: null, error: `column does not exists: ${res.x} at table ${res.table}` });
|
|
110
|
+
}
|
|
111
|
+
if (loadTemplate?.table) {
|
|
112
|
+
Object.assign(res.data || {}, { table: loadTemplate?.table });
|
|
113
|
+
Object.assign(res, { table: loadTemplate?.table, table_name: loadTemplate?.table, tableSQL: loadTemplate.sql?.filter?.(el => !el.disabled && el?.sql?.replace)?.map?.((el, i) => `left join lateral(${el.sql})t${i + 1} on 1=1`)?.join?.(' ') });
|
|
114
|
+
}
|
|
115
|
+
return res;
|
|
116
|
+
}
|
|
117
|
+
export default getWidget;
|
package/utils.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// This file contains code that we reuse
|
|
2
|
+
// between our tests.
|
|
3
|
+
|
|
4
|
+
// import getTemplatePath from '@opengis/fastify-table/table/controllers/utils/getTemplatePath.js';
|
|
5
|
+
import getWidget from './server/utils/getWidget.js';
|
|
6
|
+
import yamlSafe from './server/routes/dashboard/controllers/utils/yaml.js';
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
// getTemplatePath,
|
|
10
|
+
yamlSafe,
|
|
11
|
+
getWidget,
|
|
12
|
+
};
|