@opengis/gis 0.2.177 → 0.2.179

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 (83) hide show
  1. package/dist/{CardIcon-CMRD1LLh.js → CardIcon-DXkwtXRm.js} +1 -1
  2. package/dist/{EntityTablePage-XNNCltAN.js → EntityTablePage-VVLGYH2c.js} +1 -1
  3. package/dist/{ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BqUjKTDY.js → ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-Dm5Fyjh9.js} +1 -1
  4. package/dist/{MapSettings-P3h-vHn3.js → MapSettings-CqgwRydf.js} +1 -1
  5. package/dist/MapToolbarRight.vue_vue_type_script_setup_true_lang-k3Zo1Hqm.js +1230 -0
  6. package/dist/{RastersTablePage-DnhGZLiH.js → RastersTablePage-Br_0QBMH.js} +1 -1
  7. package/dist/cartocss-C9OJk3VI.js +1460 -0
  8. package/dist/{import-utils-BCATsbB5.js → import-utils-DV6Yls6G.js} +1 -1
  9. package/dist/{index-cUagVqgA.js → index-hX98i4hU.js} +11 -11
  10. package/dist/index.css +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/index.umd.cjs +29 -29
  13. package/dist/{raster-CP0tUp3j.js → raster-NZ1TCJvt.js} +225 -219
  14. package/dist/{register-Cr-uQcby.js → register-BcPTINMn.js} +3 -3
  15. package/dist/{service-DwJaKrOd.js → service-NBe9fmay.js} +603 -597
  16. package/dist/{vs-datatable-B9WoVk-b.js → vs-datatable-CyjZaDoO.js} +3 -2
  17. package/module/gis/card/gis.metadata.table/index.yml +22 -22
  18. package/module/gis/card/gis.rasters.table/index.yml +11 -11
  19. package/module/gis/card/gis.registers.table/index.yml +23 -23
  20. package/module/gis/card/gis.services.table/index.yml +25 -25
  21. package/module/gis/cls/bool.yes_no.json +12 -12
  22. package/module/gis/cls/encoding.json +14 -14
  23. package/module/gis/cls/geom_type.json +14 -14
  24. package/module/gis/cls/gis.column_type.json +34 -34
  25. package/module/gis/cls/gis.column_view_type.json +26 -26
  26. package/module/gis/cls/gis.filter_type.json +22 -22
  27. package/module/gis/cls/language.json +10 -10
  28. package/module/gis/cls/meta.service_type.json +42 -42
  29. package/module/gis/cls/ogc.service.json +21 -21
  30. package/module/gis/cls/source_type.json +10 -10
  31. package/module/gis/cls/standarts.json +6 -6
  32. package/module/gis/cls/topic_category.json +106 -106
  33. package/module/gis/cls/update_frequency.json +29 -29
  34. package/module/gis/cls/view.json +21 -21
  35. package/module/gis/form/feedback.answer.form.json +10 -10
  36. package/module/gis/form/gis.cartocss.form.json +64 -64
  37. package/module/gis/form/gis.group_list.form.json +17 -17
  38. package/module/gis/form/gis.maps.form.json +61 -61
  39. package/module/gis/form/gis.metadata.form.json +240 -240
  40. package/module/gis/form/gis.metadata_new.form.json +195 -195
  41. package/module/gis/form/gis.ogc_service.form.json +51 -51
  42. package/module/gis/form/gis.rasters.form.json +76 -76
  43. package/module/gis/form/gis.registers_column.form.json +84 -84
  44. package/module/gis/form/gis.registers_filter.form.json +65 -65
  45. package/module/gis/form/gis.services.form.json +111 -111
  46. package/module/gis/form/gis.services_attributes.form.json +75 -75
  47. package/module/gis/form/gis.services_filter.form.json +65 -65
  48. package/module/gis/menu.json +43 -43
  49. package/module/gis/select/admin.cls.name.sql +9 -9
  50. package/module/gis/select/layer_list.sql +7 -7
  51. package/module/gis/select/layer_list_text.sql +7 -7
  52. package/module/gis/select/pg.column_name.geometry.sql +12 -12
  53. package/module/gis/select/pg.columns.parent.sql +6 -6
  54. package/module/gis/select/pg.table_name.sql +17 -17
  55. package/module/gis/select/service_id.sql +1 -1
  56. package/module/gis/select/srid.sql +7 -7
  57. package/module/gis/table/gis.cartocss.table.json +74 -74
  58. package/module/gis/table/gis.group_list.table.json +58 -58
  59. package/module/gis/table/gis.maps.table.json +110 -110
  60. package/module/gis/table/gis.metadata.table.json +70 -70
  61. package/module/gis/table/gis.metadata_new.table.json +137 -137
  62. package/module/gis/table/gis.ogc_service.table.json +100 -100
  63. package/module/gis/table/gis.rasters.table.json +113 -113
  64. package/module/gis/table/gis.registers.table.json +143 -143
  65. package/module/gis/table/gis.services.table.json +120 -120
  66. package/module/gis/table/site.gis.registers.table.json +88 -88
  67. package/module/gis/table/site.gis.services.table.json +106 -106
  68. package/module/gis/templates/ISO19136_2017_gml_template.xml +330 -330
  69. package/module/gis/tokens.yml +5 -5
  70. package/module/permissions/form/permissions.users.form.json +151 -151
  71. package/module/permissions/table/gis.permissions.table.json +97 -97
  72. package/package.json +1 -1
  73. package/server/routes/registers/functions/getFilterSQLParametrized/formatValue.js +312 -0
  74. package/server/routes/registers/functions/getFilterSQLParametrized/getFilterQuery.js +126 -0
  75. package/server/routes/registers/functions/getFilterSQLParametrized/getRangeQuery.js +353 -0
  76. package/server/routes/registers/functions/getFilterSQLParametrized/index.js +81 -0
  77. package/server/routes/registers/functions/getTableColumnMeta.js +2 -8
  78. package/server/routes/registers/functions/gis.suggest.js +5 -14
  79. package/server/routes/registers/functions/handleRegistryRequest.js +13 -5
  80. package/server/routes/registers/registers.route.test.js +32 -3
  81. package/server/routes/registers/registers.schema.js +7 -2
  82. package/dist/HeaderActions.vue_vue_type_script_setup_true_lang-BXQ3hKwa.js +0 -1099
  83. package/dist/cartocss-BkrOeQg4.js +0 -1586
@@ -0,0 +1,312 @@
1
+ import { pgClients } from "@opengis/fastify-table/utils.js";
2
+
3
+ import getRangeQuery from "./getRangeQuery.js";
4
+
5
+ const selectFilterTypes = [
6
+ "check",
7
+ "autocomplete",
8
+ "tags",
9
+ "avatar",
10
+ "radio",
11
+ "select",
12
+ "button",
13
+ ];
14
+ const matchNullObj = {
15
+ null: "is null",
16
+ notnull: "is not null",
17
+ };
18
+
19
+ export default function formatValue(
20
+ {
21
+ table,
22
+ filter = {},
23
+ name,
24
+ value,
25
+ dataTypeID,
26
+ uid = "2",
27
+ args: argsParams,
28
+ },
29
+ pg = pgClients.client
30
+ ) {
31
+ const { sql, select, strict, options, optionsFromColumns, api } = filter;
32
+
33
+ const filterType = filter.type?.toLowerCase?.() || "text";
34
+
35
+ const args = Array.from(argsParams || []);
36
+
37
+ const sval =
38
+ typeof value === "string"
39
+ ? `%${decodeURIComponent(value.replace(/%/g, "%25")).replace(
40
+ /%/g,
41
+ "\\%"
42
+ )}%`
43
+ : undefined;
44
+
45
+ if (filterType === "text" && typeof value === "string" && filter?.columns) {
46
+ args.push(sval);
47
+ const columns = filter.columns.split(",");
48
+
49
+ const query = `(${columns
50
+ .map((el) => `"${el}"::text ilike $${args.length}`)
51
+ .join(" or ")})`;
52
+ return { op: "~", query, values: [sval] };
53
+ }
54
+
55
+ const fieldType =
56
+ pg?.pgType?.[dataTypeID] ||
57
+ pg?.pgType?.[{ date: 1114 }[filterType] || 25];
58
+
59
+ if (
60
+ !name ||
61
+ !value ||
62
+ (!dataTypeID && !sql && !options) ||
63
+ (!selectFilterTypes.includes(filterType) &&
64
+ options?.find?.((el) => el?.sql))
65
+ ) {
66
+ return {};
67
+ }
68
+
69
+ // my rows
70
+ if (value === "me" && uid) {
71
+ args.push(uid);
72
+ return { op: "=", query: `${name}::text = $${args.length}`, values: [uid] };
73
+ }
74
+
75
+ const matchNull = matchNullObj[value];
76
+
77
+ const includesNull =
78
+ !matchNull &&
79
+ value &&
80
+ value.includes(",") &&
81
+ (value.startsWith("null") ||
82
+ value.includes(",null") ||
83
+ value.startsWith("notnull") ||
84
+ value.includes(",notnull"));
85
+
86
+ const includesNull1 = includesNull
87
+ ? value
88
+ .split(",")
89
+ .map((el) => matchNullObj[el])
90
+ .filter(Boolean)
91
+ : undefined;
92
+
93
+ // skip if requested both: is null and not null
94
+ const includesNullQuery =
95
+ includesNull1 && includesNull1.length > 1 ? undefined : includesNull1?.[0];
96
+
97
+ // geometry
98
+ if (["geometry"].includes(fieldType || "")) {
99
+ if (matchNull) {
100
+ return { op: "nullable", query: `${name} ${matchNull}` };
101
+ }
102
+
103
+ const bbox = value?.[0]?.split?.("_");
104
+
105
+ if (bbox?.length !== 4) {
106
+ return {};
107
+ }
108
+
109
+ const query = ` ${name} && 'box(${bbox[0]} ${bbox[1]},${bbox[2]} ${bbox[3]})'::box2d `;
110
+ return { op: "&&", query };
111
+ }
112
+
113
+ const op = filterType === "text" && !strict ? "~" : "=";
114
+ // text
115
+ if (["text"].includes(filterType)) {
116
+ // with sql subquery
117
+ if (typeof sql === "string") {
118
+ args.push(value);
119
+ const querysql = sql
120
+ .replace(/= ?any\(\$1\)/g, `::text=any($${args.length}::text[])`)
121
+ .replace(/\$1/g, `$${args.length}`);
122
+ return { op: "=", query: querysql, values: [[value]] };
123
+ }
124
+
125
+ // default
126
+ if (!select) {
127
+ const value1 = op === "~" ? `%${value}%` : value;
128
+ args.push(value1);
129
+ const query = `${name}::text ${op === "~" ? "ilike" : "="} $${args.length
130
+ }`;
131
+ return {
132
+ op,
133
+ query,
134
+ values: [value1],
135
+ };
136
+ }
137
+ }
138
+
139
+ // nullable
140
+ if (matchNull) {
141
+ const query = `${name} ${matchNull}`;
142
+ return { op, query };
143
+ }
144
+
145
+ // boolean
146
+ if (fieldType === "boolean" && ["true", "false"].includes(value)) {
147
+ const query = `${name} IS ${value === "true" ? "TRUE" : "FALSE"}`;
148
+ return { op, query };
149
+ }
150
+
151
+ // boolean + nullable
152
+ const value1 = ["true", "false"].find((el) => value.includes(el));
153
+ const values = ["true", "false"].filter((el) => value.includes(el));
154
+
155
+ // boolean: true, false and null => skip
156
+ if (fieldType === "boolean" && values.length === 2 && !!includesNullQuery) {
157
+ return { op, query: "3=3" };
158
+ }
159
+
160
+ // boolean: both true and false => not null
161
+ if (fieldType === "boolean" && values.length === 2) {
162
+ return { op, query: `${name} is not null` };
163
+ }
164
+
165
+ // boolean: not null over any value
166
+ if (
167
+ fieldType === "boolean" &&
168
+ value1 &&
169
+ includesNullQuery === "is not null"
170
+ ) {
171
+ const query = `${name} ${includesNullQuery}`;
172
+ return { op, query };
173
+ }
174
+
175
+ // boolean: true or null
176
+ if (
177
+ fieldType === "boolean" &&
178
+ value1 &&
179
+ includesNullQuery === "is null" &&
180
+ value1 === "true"
181
+ ) {
182
+ return { op, query: `${name} IS NOT FALSE` };
183
+ }
184
+
185
+ // boolean: false or null
186
+ if (
187
+ fieldType === "boolean" &&
188
+ value1 &&
189
+ includesNullQuery === "is null" &&
190
+ value1 === "false"
191
+ ) {
192
+ return { op, query: `${name} IS NOT TRUE` };
193
+ }
194
+
195
+ // select / cls - any filter type w/ out sql subquery
196
+ if (
197
+ value &&
198
+ select &&
199
+ Array.isArray(options) &&
200
+ !options.find((el) => el?.sql)
201
+ ) {
202
+ const value1 = value.split(",");
203
+ // by id (checkbox)
204
+ if (options.find((el) => el?.id && value1.includes(el.id))) {
205
+ args.push(value1);
206
+ if (fieldType && fieldType.endsWith("[]")) {
207
+ const query = `EXISTS ( SELECT 1 FROM unnest(${name}) AS elem WHERE elem in (with q(id, name) as (${select}) select id from q where id = any($${args.length}) ) )`;
208
+ return {
209
+ op,
210
+ query,
211
+ values: [value1],
212
+ };
213
+ }
214
+
215
+ const query = `${name}::text in ( ( with q(id,name) as (${select}) select id from q where id = any($${args.length}) ) )`;
216
+ return {
217
+ op,
218
+ query,
219
+ values: [value1],
220
+ };
221
+ }
222
+ // by text
223
+ args.push(`%${value1[0]}%`);
224
+ return {
225
+ op,
226
+ query: `${name}::text in ( ( with q(id,name) as (${select}) select id from q where name::text ilike $${args.length} ) )`,
227
+ values: [`%${value1[0]}%`],
228
+ };
229
+ }
230
+
231
+ // date: 01.01.2024-31.12.2024 / number range: 100-500
232
+ if (["date", "datepicker", "range"].includes(filterType)) {
233
+ const { query, values } = getRangeQuery({
234
+ value,
235
+ name,
236
+ fieldType,
237
+ filterType,
238
+ sql,
239
+ args,
240
+ });
241
+ return { op: "between", query, values };
242
+ }
243
+
244
+ /* select query - from admin.cls / filter options */
245
+ if (selectFilterTypes.includes(filterType)) {
246
+ // multiple checks with predefined query
247
+ if (options?.find?.((el) => el?.sql)) {
248
+ const query =
249
+ options
250
+ .filter((el) => value.split(",").includes(el.id?.toString?.()))
251
+ .map((el) => el.sql || "false")
252
+ .join(" and ") || "false";
253
+ return { op: "=", query };
254
+ }
255
+
256
+ // with sql subquery
257
+ if (sql) {
258
+ args.push(value);
259
+ const querysql = sql
260
+ .replace(/= ?any\(\$1\)/g, `::text=any($${args.length}::text[])`)
261
+ .replace(/\$1/g, `$${args.length}`);
262
+ return { op: "=", query: querysql, values: [[value]] };
263
+ }
264
+
265
+ // if pseudo-suggest column contain commas
266
+ if (optionsFromColumns && options?.length) {
267
+ const optionValues = options.map((e) => e.id);
268
+ const vals = optionValues.filter((e) => value.includes(e));
269
+ args.push(vals);
270
+ return {
271
+ op: "=",
272
+ query: `${name}::text=any($${args.length}::text[])`,
273
+ values: vals,
274
+ };
275
+ }
276
+
277
+ // default
278
+ args.push(value);
279
+
280
+ if (fieldType?.includes("[]")) {
281
+ const query = `${name}::text[] && $${args.length}::text[]`;
282
+
283
+ return {
284
+ op: "=",
285
+ query,
286
+ values: [value.split(",")],
287
+ };
288
+ }
289
+
290
+ if (api && api.startsWith('/api/gis-suggest/')) {
291
+ const query = fieldType?.includes("[]") ? `EXISTS (
292
+ SELECT 1
293
+ FROM unnest(${name}) AS value
294
+ WHERE rtrim(
295
+ replace(replace(replace(encode(value::bytea, 'base64'), '+', ''), '-', ''), '/', ''),
296
+ '='
297
+ ) = ANY($${args.length})
298
+ )`
299
+ : `rtrim( replace( replace( replace( encode(${name}::bytea, 'base64'), '+', '' ), '-', '' ), '/', '' ), '=' )=any($${args.length})`;
300
+
301
+ return {
302
+ op: "=",
303
+ query,
304
+ values: [value.split(",")],
305
+ };
306
+ }
307
+
308
+ const query = `${name}::text=any($${args.length})`;
309
+ return { op: "=", query, values: [value.split(",")] };
310
+ }
311
+ return {};
312
+ }
@@ -0,0 +1,126 @@
1
+ /* eslint-disable no-continue */
2
+
3
+ import { pgClients } from "@opengis/fastify-table/utils.js";
4
+
5
+ import formatValue from "./formatValue.js";
6
+
7
+ /**
8
+ * @param {Number} opt.json - (1|0) 1 - Результат - Object, 0 - String
9
+ * @param {String} opt.query - запит до таблиці
10
+ * @param {String} opt.hash - інформація з хешу по запиту
11
+ */
12
+
13
+ function getFilterQuery(
14
+ {
15
+ filter: filterStr = "",
16
+ table = "",
17
+ tableSQL = [],
18
+ fields,
19
+ filterList,
20
+ uid,
21
+ objectId,
22
+ args,
23
+ },
24
+ pg = pgClients.client
25
+ ) {
26
+ // if (!filterStr) return null; // filter list API
27
+ const mainOperators = ["=", "~", ">", "<"];
28
+ const filterQueryArray =
29
+ decodeURIComponent(
30
+ filterStr
31
+ ?.replace?.(/%/g, "%25")
32
+ ?.replace?.(/%/g, "\\%")
33
+ ?.replace?.(/(^,)|(,$)/g, "")
34
+ )
35
+ ?.replace?.(/'/g, "''")
36
+ ?.split?.(/[;|]/) || [];
37
+ // default filter value form checkboxes, autocomplete or sql-defined only - if not called from card
38
+ const filterDefaultQueryArray = !objectId
39
+ ? filterList
40
+ ?.filter?.(
41
+ (el) =>
42
+ el.name &&
43
+ !filterStr?.includes?.(`${el.name}=`) &&
44
+ el.default &&
45
+ (el.options || el.sql)
46
+ )
47
+ ?.map?.((el) => `${el.name}=${el.default}`) || []
48
+ : [];
49
+
50
+ // concat default + request filters
51
+ const arr = filterQueryArray.concat(filterDefaultQueryArray).filter(Boolean);
52
+
53
+ const resultList = [];
54
+
55
+ for (let i = 0; i < arr.length; i += 1) {
56
+ const item = arr[i];
57
+ if (!item) {
58
+ continue;
59
+ }
60
+ const splitby = mainOperators?.find((el) => item.indexOf(el) !== -1) || "=";
61
+ const [name] = item.split(splitby);
62
+
63
+ // skip already added filter
64
+ if (resultList.find((el) => el.name === name)) {
65
+ continue;
66
+ }
67
+
68
+ // filter
69
+ const filter = filterList?.find?.((el) => el.type && el.name === name) || {
70
+ type: "text",
71
+ };
72
+
73
+ // find all value
74
+ const value = arr
75
+ .filter((el) => el.split(splitby)?.[0] === name)
76
+ .map((el) => el.substring((name?.length || 0) + 1))
77
+ .join(",");
78
+
79
+ // find field and skip not exists
80
+ const { dataTypeID } =
81
+ fields?.find((el) => el.name === name) ||
82
+ {};
83
+
84
+ // format query
85
+ const {
86
+ op,
87
+ query,
88
+ values: filterValues,
89
+ } = formatValue(
90
+ {
91
+ table,
92
+ filter,
93
+ name,
94
+ value,
95
+ dataTypeID,
96
+ uid,
97
+ args,
98
+ },
99
+ pg
100
+ ) || {};
101
+
102
+ if (!query) {
103
+ continue;
104
+ }
105
+
106
+ if (
107
+ args &&
108
+ filterValues &&
109
+ Array.isArray(filterValues) &&
110
+ filterValues.length
111
+ ) {
112
+ filterValues.forEach((val) => args.push(val));
113
+ }
114
+
115
+ resultList.push({
116
+ name,
117
+ value,
118
+ values: filterValues,
119
+ query,
120
+ operator: op,
121
+ });
122
+ }
123
+ return resultList;
124
+ }
125
+
126
+ export default getFilterQuery;