@opengis/fastify-table 1.0.5 → 1.0.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/fastify-table",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "type": "module",
5
5
  "description": "core-plugins",
6
6
  "main": "index.js",
@@ -9,9 +9,16 @@ export default async function filter(req) {
9
9
  const loadTable = await getTemplate('table', params.table);
10
10
  if (!loadTable) { return { status: 404, message: 'not found' }; }
11
11
 
12
- await Promise.all(loadTable?.filters.filter((el) => el.data).map(async (el) => {
12
+ const filters = loadTable?.filters || loadTable?.filterList || [];
13
+ await Promise.all(filters.filter((el) => el.data).map(async (el) => {
13
14
  const cls = await getSelect(el.data);
14
15
  Object.assign(el, { options: cls?.arr });
15
16
  }));
16
- return { time: Date.now() - time, filters: loadTable?.filters || [] };
17
+ return {
18
+ time: Date.now() - time,
19
+ list: filters,
20
+ custom: loadTable?.filterCustom?.map(el => ({ label: el.label })),
21
+ inline: loadTable?.filterInline,
22
+ state: loadTable?.filterState?.map(el => ({ label: el.label })),
23
+ };
17
24
  }
@@ -9,12 +9,13 @@ export default async function suggest(req) {
9
9
 
10
10
  const lang = query.lang || 'ua';
11
11
  const time = Date.now();
12
+ const parent = query.parent || '';
12
13
 
13
14
  const selectName = query.sel || query.name || params.data;
14
15
  if (!selectName) return { headers, status: 400, message: 'name is required' };
15
16
 
16
17
  const meta = await getSelectMeta({ name: selectName });
17
- const pg = meta.db ? getPG(meta.db) : pg1;
18
+ const pg = meta.db ? getPG({ db: meta.db }) : pg1;
18
19
  if (!meta) return { headers, status: 404, message: 'Not found query select ' };
19
20
 
20
21
  const { arr, searchQuery } = meta;
@@ -36,7 +37,7 @@ export default async function suggest(req) {
36
37
  const pk = meta.originalCols.split(',')[0];
37
38
  const val = query.val ? ` ${pk}=any('{${query.val.replace(/'/g, "''")}}')` : '';
38
39
 
39
- const sqlSuggest = `with rows(id,text) as (${meta.original} where ${[search, val].filter((el) => el).join(' and ') || 'true'}) select * from rows limit ${limit}`;
40
+ const sqlSuggest = `with rows(id,text) as (${meta.original.replace(/{{parent}}/gi, parent)} where ${[search, val].filter((el) => el).join(' and ') || 'true'}) select * from rows limit ${limit}`;
40
41
  if (query.sql) return sqlSuggest;
41
42
 
42
43
  // query
@@ -39,7 +39,7 @@ export default async function getSelectMeta({ name, pg: pg1 }) {
39
39
 
40
40
  // column name
41
41
  const cols = dataOrigin.fields.map((el) => el.name);
42
- const type = dataOrigin.fields.map((el) => pg.pgType[el.dataTypeID]);
42
+ const type = dataOrigin.fields.map((el) => pg.pgType?.[el.dataTypeID] || 'text');
43
43
 
44
44
  const searchColumn = cls?.searchColumn || (
45
45
  dataOrigin.fields.find((el) => el.name === 'search') ? 'search' : dataOrigin1.fields[1].name);
@@ -11,13 +11,38 @@ test('api crud', async (t) => {
11
11
  const res = await app.inject({
12
12
  method: 'POST',
13
13
  url: '/api/crud/gis.dataset',
14
- body: { dataset_name: '111' },
14
+ body: { dataset_name: '111', dataset_id: '5400000' },
15
15
  });
16
16
 
17
17
  const rep = JSON.parse(res?.body);
18
18
  // rep.dataset_id
19
- // console.log(rep.total);
20
- pgClients.client.query('delete from gis.dataset where dataset_id=$1', [rep.dataset_id]);
19
+ // console.log(rep);
20
+ // pgClients.client.query('delete from gis.dataset where dataset_id=$1', [rep.dataset_id]);
21
21
  assert.ok(rep.dataset_id);
22
22
  });
23
+
24
+ await t.test('PUT /update', async () => {
25
+ const res = await app.inject({
26
+ method: 'PUT',
27
+ url: '/api/crud/gis.dataset/5400000',
28
+ body: { editor_id: '11' },
29
+ });
30
+
31
+ const rep = JSON.parse(res?.body);
32
+ // rep.dataset_id
33
+ // console.log(rep);
34
+ assert.equal(rep.editor_id, '11')
35
+ });
36
+
37
+ await t.test('DELETE /delete', async () => {
38
+ const res = await app.inject({
39
+ method: 'DELETE',
40
+ url: '/api/crud/gis.dataset/5400000',
41
+ });
42
+
43
+ const rep = JSON.parse(res?.body);
44
+ // rep.dataset_id
45
+ // console.log(rep);
46
+ assert.ok(rep);
47
+ });
23
48
  });
@@ -26,4 +26,24 @@ test('api table', async (t) => {
26
26
  // console.log(rep.total);
27
27
  assert.ok(rep.total);
28
28
  });
29
+ await t.test('GET /form', async () => {
30
+ const res = await app.inject({
31
+ method: 'GET',
32
+ url: '/api/form/cp_building.form',
33
+ });
34
+ // console.log(res);
35
+ const rep = JSON.parse(res?.body);
36
+ // console.log(rep.total);
37
+ assert.ok(rep);
38
+ });
39
+ await t.test('GET /filter', async () => {
40
+ const res = await app.inject({
41
+ method: 'GET',
42
+ url: '/api/filter/gis.dataset.table',
43
+ });
44
+ // console.log(res);
45
+ const rep = JSON.parse(res?.body);
46
+ // console.log(rep.total);
47
+ assert.ok(rep);
48
+ });
29
49
  });
@@ -7,17 +7,21 @@ import rclient from '../../redis/client.js';
7
7
 
8
8
  import dataInsert from '../../crud/funcs/dataInsert.js';
9
9
  import dataUpdate from '../../crud/funcs/dataUpdate.js';
10
+ import dataDelete from '../../crud/funcs/dataDelete.js';
11
+ import isFileExists from '../../crud/funcs/isFileExists.js';
10
12
 
11
13
  import getOpt from '../../crud/funcs/getOpt.js';
12
14
  import setOpt from '../../crud/funcs/setOpt.js';
13
15
 
14
- test('fucns crud', async (t) => {
16
+ test('funcs crud', async (t) => {
17
+
15
18
  await t.test('getOpt/setOpt', async () => {
16
19
  const opt = await setOpt({ table: 'gis.dataset' });
17
20
  const data = await getOpt(opt);
18
21
  // console.log(data);
19
22
  assert.equal(data.table, 'gis.dataset');
20
23
  });
24
+
21
25
  const id = (Math.random() * 10000).toFixed();
22
26
  await t.test('dataInsert', async () => {
23
27
  const data = await dataInsert({ table: 'gis.dataset', data: { dataset_id: id, dataset_name: '222' } });
@@ -29,7 +33,17 @@ test('fucns crud', async (t) => {
29
33
  assert.equal(data.dataset_name, '22211');
30
34
  });
31
35
 
32
- pgClients.client.query('delete from gis.dataset where dataset_id=$1', [id]);
36
+ await t.test('dataDelete', async () => {
37
+ const data = await dataDelete({ table: 'gis.dataset', id });
38
+ assert.ok(data);
39
+ });
40
+
41
+ await t.test('isFileExists', async () => {
42
+ const data = await isFileExists({filepath: '../../crud/funcs/isFileExists.js'});
43
+ assert.equal(data, false);
44
+ });
45
+
46
+ // pgClients.client.query('delete from gis.dataset where dataset_id=$1', [id]);
33
47
  t.after(() => {
34
48
  pgClients.client?.end();
35
49
  rclient.quit();
@@ -7,6 +7,7 @@ import getMeta from '../../pg/funcs/getMeta.js';
7
7
  import autoIndex from '../../pg/funcs/autoIndex.js';
8
8
  import pgClients from '../../pg/pgClients.js';
9
9
  import rclient from '../../redis/client.js';
10
+ import getPG from '../../pg/funcs/getPG.js'
10
11
 
11
12
  test('funcs pg', async (t) => {
12
13
  await t.test('getMeta', async () => {
@@ -15,6 +16,11 @@ test('funcs pg', async (t) => {
15
16
  assert.ok(columns);
16
17
  });
17
18
 
19
+ await t.test('getPG', async (t) => {
20
+ const data = await getPG({});
21
+ assert.ok(data);
22
+ });
23
+
18
24
  await t.test('autoIndex', async () => {
19
25
  await autoIndex({ table: 'gis.dataset', columns: ['service_type'] });
20
26
  assert.ok(1);
@@ -4,6 +4,11 @@ import '../config.js';
4
4
  import pgClients from '../../pg/pgClients.js';
5
5
  import rclient from '../../redis/client.js';
6
6
  import getFilterSQL from '../../table/funcs/getFilterSQL/index.js';
7
+ import getTableSql from '../../table/funcs/getFilterSQL/index.js';
8
+ import getCustomQuery from '../../table/funcs/getFilterSQL/index.js';
9
+ import getFilterQuery from '../../table/funcs/getFilterSQL/index.js';
10
+ import formatValue from '../../table/funcs/getFilterSQL/index.js';
11
+ import getOptimizedQuery from '../../table/funcs/getFilterSQL/index.js';
7
12
 
8
13
  test('fucns table', async (t) => {
9
14
  await t.test('getMeta', async () => {
@@ -11,7 +16,31 @@ test('fucns table', async (t) => {
11
16
  // console.log(data);
12
17
  assert.ok(data.q);
13
18
  });
14
-
19
+
20
+ await t.test('formatValue', async (t) => {
21
+ const data = await formatValue( {table: 'gis.dataset'} );
22
+ assert.ok(data);
23
+ });
24
+
25
+ await t.test('getCustomQuery', async (t) => {
26
+ const data = await getCustomQuery( {table: 'gis.dataset'} );
27
+ assert.ok(data);
28
+ });
29
+
30
+ await t.test('getFilterQuery', async (t) => {
31
+ const data = await getFilterQuery( {table: 'gis.dataset'} );
32
+ assert.ok(data);
33
+ });
34
+
35
+ await t.test('getOptimizedQuery', async (t) => {
36
+ const data = await getOptimizedQuery( {table: 'gis.dataset'} );
37
+ assert.ok(data);
38
+ });
39
+
40
+ await t.test('getTableSql', async (t) => {
41
+ const data = await getTableSql( {table: 'gis.dataset'} );
42
+ assert.ok(data);
43
+ });
15
44
  t.after(() => {
16
45
  pgClients.client.end();
17
46
  rclient.quit();
@@ -0,0 +1,383 @@
1
+ {
2
+ "ua": "Зелені насадження",
3
+ "key": "green_space_id",
4
+ "sql": [
5
+ {
6
+ "sql": "select short_ukr,short_rus,full_rus,full_ukr,latin,tr_family,genus from itree.green_space_species where gss_id in (t.type_tree,t.type_bush) limit 1",
7
+ "name": "green_space_species_sql"
8
+ },
9
+ {
10
+ "sql": "select json_agg(file_path) as img_list from admin.doc_file where object_id=t.green_space_id and file_status=1",
11
+ "name": "image_sql"
12
+ }
13
+ ],
14
+ "table": "itree.green_space_pass",
15
+ "form": "green_space.form",
16
+ "columns": [
17
+ {
18
+ "ua": "Інвентарний номер",
19
+ "name": "invent_number",
20
+ "meta": "id",
21
+ "format": "text"
22
+ },
23
+ {
24
+ "en": "Object name",
25
+ "ru": "Назва объекта",
26
+ "ua": "Назва об'єкта",
27
+ "name": "type_tree",
28
+ "meta": "title",
29
+ "data": "itree.type_plant",
30
+ "format": "select",
31
+ "html": "{{#ifCond type_plant 'in' '1,2,3,4,5,8'}}{{#ifCond type_plant '==' '1'}}{{select type_bush data=\"itree.type_bush\"}}{{/ifCond}}{{#ifCond type_plant 'in' '2,8'}}{{select type_tree data=\"itree.type_tree\" }}{{/ifCond}}{{#ifCond type_plant '==' '3'}}{{select type_hedge data=\"itree.type_hedge\"}}{{/ifCond}}{{#ifCond type_plant '==' '4'}}{{select type_lawn data=\"itree.type_lawn\"}}{{/ifCond}}{{#ifCond type_plant '==' '5'}}{{select type_flower data=\"itree.type_flower\"}}{{/ifCond}} {{^}}...{{/ifCond}}"
32
+ },
33
+ {
34
+ "en": "Type",
35
+ "ru": "Тип",
36
+ "ua": "Тип насадження",
37
+ "name": "type_plant",
38
+ "meta": "type",
39
+ "data": "itree.type_plant",
40
+ "format": "select"
41
+ },
42
+ {
43
+ "name": "quality_condition",
44
+ "ua": "Якісний стан об'єкта",
45
+ "data": "itree.quality_condition",
46
+ "meta": "status",
47
+ "format": "badge"
48
+ },
49
+ {
50
+ "en": "Recomendations",
51
+ "ru": "Рекомендации",
52
+ "ua": "Рекомендації",
53
+ "name": "recommend",
54
+ "data": "itree.recommend",
55
+ "meta": "other",
56
+ "format": "badge"
57
+ },
58
+ {
59
+ "name": "uid",
60
+ "ua": "Хто додав",
61
+ "width": "70",
62
+ "data": "contact_id",
63
+ "format": "select"
64
+ },
65
+ {
66
+ "ua": "Зона відпочинку",
67
+ "hidden": true,
68
+ "meta": "other",
69
+ "name": "rz_id",
70
+ "format": "select",
71
+ "data": "rz_id"
72
+ },
73
+ {
74
+ "name": "address_id",
75
+ "ua": "Адреса",
76
+ "hidden": true,
77
+ "meta": "other",
78
+ "format": "select",
79
+ "data": "itree.address_id"
80
+ },
81
+ {
82
+ "name": "age",
83
+ "ua": "Вік, років",
84
+ "meta": "other",
85
+ "hidden": true,
86
+ "format": "number"
87
+ },
88
+ {
89
+ "name": "height",
90
+ "ua": "Висота, м",
91
+ "meta": "other",
92
+ "hidden": true,
93
+ "format": "number"
94
+ },
95
+ {
96
+ "name": "diameter",
97
+ "ua": "Діаметр стовбура на висоті 1.3 м, см",
98
+ "meta": "other",
99
+ "hidden": true,
100
+ "format": "number"
101
+ },
102
+ {
103
+ "name": "cdate",
104
+ "ua": "Дата",
105
+ "meta": "other",
106
+ "format": "date"
107
+ },
108
+ {
109
+ "name": "amount",
110
+ "ua": "Кількіть (шт./м2)",
111
+ "meta": "other",
112
+ "hidden": true,
113
+ "format": "number"
114
+ },
115
+ {
116
+ "name": "area",
117
+ "ua": "Площа кв.м.",
118
+ "meta": "other",
119
+ "hidden": true,
120
+ "format": "number"
121
+ },
122
+ {
123
+ "ua": "Балансова вартість, грн",
124
+ "name": "cost",
125
+ "meta": "other",
126
+ "hidden": true,
127
+ "format": "text"
128
+ },
129
+ {
130
+ "ua": "Штрих-код",
131
+ "hidden": true,
132
+ "meta": "other",
133
+ "name": "barcode",
134
+ "format": "text"
135
+ },
136
+ {
137
+ "name": "trunk_circ",
138
+ "ua": "Окружність стовбура, см",
139
+ "hidden": true,
140
+ "meta": "other",
141
+ "format": "number"
142
+ },
143
+ {
144
+ "name": "soil_condi",
145
+ "ua": "Розмір лунки",
146
+ "hidden": true,
147
+ "meta": "other",
148
+ "format": "select",
149
+ "data": "itree.soil_condi"
150
+ },
151
+ {
152
+ "name": "discrete_s",
153
+ "ua": "Рівень нахилу в градусах",
154
+ "hidden": true,
155
+ "meta": "other",
156
+ "format": "select",
157
+ "data": "itree.discrete_s"
158
+ },
159
+ {
160
+ "name": "undercut",
161
+ "ua": "Підрізка",
162
+ "hidden": true,
163
+ "meta": "other",
164
+ "format": "select",
165
+ "data": "itree.undercut"
166
+ },
167
+ {
168
+ "name": "bark_damag",
169
+ "ua": "Пошкодження кори (в відсотках)",
170
+ "hidden": true,
171
+ "meta": "other",
172
+ "format": "select",
173
+ "data": "itree.bark_damag"
174
+ },
175
+ {
176
+ "name": "fungus",
177
+ "ua": "Гриби",
178
+ "hidden": true,
179
+ "meta": "other",
180
+ "format": "yes/no"
181
+ },
182
+ {
183
+ "name": "woodworms",
184
+ "ua": "Древоточець",
185
+ "hidden": true,
186
+ "meta": "other",
187
+ "format": "yes/no"
188
+ },
189
+ {
190
+ "name": "rottenness",
191
+ "ua": "Трухлявість",
192
+ "hidden": true,
193
+ "meta": "other",
194
+ "format": "yes/no"
195
+ },
196
+ {
197
+ "name": "hollow",
198
+ "ua": "Дупла",
199
+ "hidden": true,
200
+ "meta": "other",
201
+ "format": "yes/no"
202
+ },
203
+ {
204
+ "name": "frost_bump",
205
+ "ua": "Морозобоїни",
206
+ "hidden": true,
207
+ "meta": "other",
208
+ "format": "yes/no"
209
+ },
210
+ {
211
+ "name": "burns",
212
+ "ua": "Опіки",
213
+ "hidden": true,
214
+ "meta": "other",
215
+ "format": "yes/no"
216
+ },
217
+ {
218
+ "name": "nails",
219
+ "ua": "Цвяхи",
220
+ "hidden": true,
221
+ "meta": "other",
222
+ "format": "yes/no"
223
+ },
224
+ {
225
+ "name": "lamps_and_wires",
226
+ "ua": "Лампи та дроти",
227
+ "hidden": true,
228
+ "meta": "other",
229
+ "format": "yes/no"
230
+ },
231
+ {
232
+ "name": "trunk_inje",
233
+ "ua": "Інєкції в стовбур",
234
+ "hidden": true,
235
+ "meta": "other",
236
+ "format": "yes/no"
237
+ },
238
+ {
239
+ "name": "needs_trea",
240
+ "ua": "Потребує лікування",
241
+ "hidden": true,
242
+ "meta": "other",
243
+ "format": "yes/no"
244
+ },
245
+ {
246
+ "name": "crown_bare",
247
+ "ua": "Оцінка стану крони (частка голих гілок в вегетаційний період)",
248
+ "hidden": true,
249
+ "meta": "other",
250
+ "format": "select",
251
+ "data": "itree.crown_bare"
252
+ },
253
+ {
254
+ "name": "diameter_stump",
255
+ "ua": "Діаметр пенька, см",
256
+ "hidden": true,
257
+ "meta": "other",
258
+ "format": "number"
259
+ },
260
+ {
261
+ "en": "Photo",
262
+ "ru": "Фото",
263
+ "ua": "Фото",
264
+ "html": "{{#each img_list}}<a class='btn btn-xs btn-default' href=\"{{this}}\" download><i class='fa fa-file-text'></i></a><a target=\"_blank\" class='btn btn-xs btn-default' href=\"{{this}}\"><i class='fa fa-eye'></i></a><br>{{/each}}",
265
+ "name": "image",
266
+ "format": "image"
267
+ },
268
+ {
269
+ "ua": "Верифіковано",
270
+ "html": " {{#ifCond verif '==' true}} \r\n <span class=\"label\" style=\"color:#fff;background:green\"> Так</span> \r\n {{else}} \r\n <span class=\"label\" style=\"color:#fff;background:red\"> Ні</span>\r\n {{/ifCond}}",
271
+ "name": "verif",
272
+ "format": "verify"
273
+ }
274
+ ],
275
+ "filterInline": [
276
+ {
277
+ "label": "Дата",
278
+ "id": "cdate",
279
+ "type": "Date"
280
+ }
281
+ ],
282
+ "filterCustom": [
283
+ {
284
+ "label": "Поточний рік",
285
+ "sql": "date_trunc('year',cdate) = date_trunc('year',now())"
286
+ }
287
+ ],
288
+ "filterState": [
289
+ {
290
+ "label": "Не верифіковано",
291
+ "sql": "yes_no=false"
292
+ },
293
+ {
294
+ "label": "Верифіковано",
295
+ "sql": "yes_no=true"
296
+ }
297
+ ],
298
+ "filterList": [
299
+ {
300
+ "label": "Інвентарний номер",
301
+ "id": "invent_number",
302
+ "type": "Text"
303
+ },
304
+ {
305
+ "label": "Дата",
306
+ "id": "cdate",
307
+ "type": "Date"
308
+ },
309
+ {
310
+ "label": "Тип насадження",
311
+ "data": "itree.type_plant",
312
+ "id": "type_plant",
313
+ "type": "Check"
314
+ },
315
+ {
316
+ "label": "Якісний стан об'єкта",
317
+ "data": "itree.quality_condition",
318
+ "id": "quality_condition",
319
+ "type": "Check"
320
+ },
321
+ {
322
+ "label": "Рекомендації",
323
+ "data": "itree.recommend",
324
+ "id": "recommend",
325
+ "type": "Check"
326
+ },
327
+ {
328
+ "label": "Зона відпочинку",
329
+ "data": "rz_id",
330
+ "id": "rz_id",
331
+ "type": "Text"
332
+ },
333
+ {
334
+ "label": "Адреса",
335
+ "data": "itree.address_id",
336
+ "id": "address_id",
337
+ "type": "Text"
338
+ },
339
+ {
340
+ "id": "bark_damag",
341
+ "label": "Пошкодження кори (в відсотках)",
342
+ "data": "itree.bark_damag",
343
+ "type": "Check"
344
+ },
345
+ {
346
+ "id": "undercut",
347
+ "label": "Підрізка",
348
+ "data": "itree.undercut",
349
+ "type": "Check"
350
+ },
351
+ {
352
+ "id": "crown_bare",
353
+ "label": "Оцінка стану крони (частка голих гілок в вегетаційний період)",
354
+ "data": "itree.crown_bare",
355
+ "type": "Check"
356
+ },
357
+ {
358
+ "id": "needs_trea",
359
+ "label": "Потребує лікування",
360
+ "data": "yes_no",
361
+ "type": "Check"
362
+ },
363
+ {
364
+ "id": "verif",
365
+ "label": "Верифіковано?",
366
+ "data": "yes_no",
367
+ "type": "Check"
368
+ },
369
+ {
370
+ "label": "Балансова вартість, грн",
371
+ "id": "cost",
372
+ "type": "Range"
373
+ }
374
+ ],
375
+ "meta": {
376
+ "title": "invent_number",
377
+ "search": "invent_number"
378
+ },
379
+ "actions": [
380
+ "edit",
381
+ "del"
382
+ ]
383
+ }