@opengis/admin 0.2.129 → 0.2.130

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. package/README.md +97 -97
  2. package/config.js +4 -4
  3. package/dist/{add-page-l7Ssdd2k.js → add-page-B9j1X71R.js} +1 -1
  4. package/dist/{admin-interface-gN7lGeoz.js → admin-interface-DZ_JAuHP.js} +2 -2
  5. package/dist/{admin-view-BmxE02FG.js → admin-view-CHq_9aht.js} +2 -2
  6. package/dist/admin.js +1 -1
  7. package/dist/admin.umd.cjs +75 -75
  8. package/dist/assets/logo.svg +41 -41
  9. package/dist/{card-view-Dj5OFVzG.js → card-view-DHcY64lQ.js} +1 -1
  10. package/dist/{edit-page-DEjYfNP6.js → edit-page-DPeBqCDl.js} +1 -1
  11. package/dist/{import-file-BMB-tu-Z.js → import-file-BWQ2bV93.js} +13044 -13055
  12. package/dist/{profile-page-C97qFx1c.js → profile-page-vqy75jEB.js} +1 -1
  13. package/dist/style.css +1 -1
  14. package/module/settings/card/admin.accounts.table/index.yml +7 -7
  15. package/module/settings/card/admin.accounts.table/rules.hbs +18 -18
  16. package/module/settings/card/admin.accounts.table/users.hbs +13 -13
  17. package/module/settings/card/admin.routes.table/groups.hbs +11 -11
  18. package/module/settings/card/admin.routes.table/users.hbs +16 -16
  19. package/module/settings/cls/core.actions.json +17 -17
  20. package/module/settings/cls/core.scope.json +13 -13
  21. package/module/settings/cls/properties.site_status.json +13 -13
  22. package/module/settings/cls/properties.widget_status.json +13 -13
  23. package/module/settings/cls/users.user_type.json +13 -13
  24. package/module/settings/cls/yes_no.json +11 -11
  25. package/module/settings/form/admin.accounts.form.json +13 -13
  26. package/module/settings/form/admin.properties.form.json +15 -15
  27. package/module/settings/form/admin.roles.form.json +21 -21
  28. package/module/settings/form/admin.user_properties.form.json +15 -15
  29. package/module/settings/form/admin.user_roles_card.form.json +13 -13
  30. package/module/settings/interface/admin.properties.json +4 -4
  31. package/module/settings/interface/admin.roles.json +4 -4
  32. package/module/settings/interface/admin.routes.json +4 -4
  33. package/module/settings/interface/admin.users.json +4 -4
  34. package/module/settings/select/core.routes.sql +1 -1
  35. package/module/settings/select/core.user_mentioned.sql +1 -1
  36. package/module/settings/select/core.user_uid.sql +1 -1
  37. package/module/settings/table/admin.properties.table.json +39 -39
  38. package/module/settings/table/admin.user_properties.table.json +34 -34
  39. package/package.json +3 -2
  40. package/plugin.js +29 -29
  41. package/server/helpers/core/badge.js +16 -16
  42. package/server/helpers/core/buttonHelper.js +21 -21
  43. package/server/helpers/core/coalesce.js +8 -0
  44. package/server/helpers/core/select.js +48 -48
  45. package/server/helpers/core/token.js +18 -18
  46. package/server/helpers/index.js +35 -31
  47. package/server/helpers/list/buttonHelper.js +21 -21
  48. package/server/helpers/list/descriptionList.js +12 -9
  49. package/server/helpers/list/utils/button.js +5 -5
  50. package/server/helpers/temp/contentList.js +58 -58
  51. package/server/helpers/temp/ifCond.js +101 -101
  52. package/server/helpers/utils/button.js +5 -5
  53. package/server/helpers/utils/mdToHTML.js +17 -0
  54. package/server/plugins/access/index.mjs +6 -6
  55. package/server/plugins/adminHook.js +81 -81
  56. package/server/plugins/cron.js +10 -10
  57. package/server/plugins/docs.js +28 -28
  58. package/server/routes/access/controllers/access.group.js +29 -29
  59. package/server/routes/access/controllers/access.group.post.js +54 -54
  60. package/server/routes/access/index.mjs +11 -11
  61. package/server/routes/access/schema.mjs +67 -67
  62. package/server/routes/calendar/controllers/calendar.data.js +125 -125
  63. package/server/routes/calendar/index.mjs +7 -7
  64. package/server/routes/calendar/schema.js +21 -21
  65. package/server/routes/data/controllers/cardTabData.js +49 -49
  66. package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
  67. package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
  68. package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  69. package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
  70. package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  71. package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
  72. package/server/routes/data/controllers/tableData.js +31 -31
  73. package/server/routes/data/controllers/tableDataId.js +27 -27
  74. package/server/routes/data/controllers/tableFilter.js +108 -108
  75. package/server/routes/data/controllers/tokenInfo.js +9 -9
  76. package/server/routes/data/controllers/utils/assignTokens.js +30 -30
  77. package/server/routes/data/controllers/utils/conditions.js +20 -20
  78. package/server/routes/data/controllers/utils/getColumns.js +8 -8
  79. package/server/routes/data/index.mjs +20 -20
  80. package/server/routes/data/schema.js +54 -54
  81. package/server/routes/menu/index.mjs +5 -5
  82. package/server/routes/notifications/controllers/readNotifications.js +27 -27
  83. package/server/routes/notifications/controllers/testEmail.js +35 -35
  84. package/server/routes/notifications/controllers/userNotifications.js +53 -53
  85. package/server/routes/notifications/funcs/addNotification.js +21 -21
  86. package/server/routes/notifications/funcs/sendNotification.js +92 -92
  87. package/server/routes/notifications/hook/onWidgetSet.js +56 -56
  88. package/server/routes/notifications/index.mjs +26 -26
  89. package/server/routes/notifications/schema.js +16 -16
  90. package/server/routes/print/controllers/cardPrint.js +134 -134
  91. package/server/routes/properties/funcs/getSettings.js +56 -56
  92. package/server/routes/properties/schema.js +10 -10
  93. package/server/routes/report/controllers/data.js +76 -76
  94. package/server/routes/report/controllers/list.js +18 -18
  95. package/server/routes/report/index.mjs +7 -7
  96. package/server/routes/report/utils/formatValue.js +179 -179
  97. package/server/routes/root.mjs +3 -3
  98. package/server/routes/templates/controllers/getTemplate.js +49 -49
  99. package/server/routes/templates/index.mjs +16 -16
  100. package/server/routes/templates/schema.js +8 -8
  101. package/server/routes/user/controllers/user.cls.id.js +14 -14
  102. package/server/routes/user/controllers/user.cls.js +71 -71
  103. package/server/routes/user/controllers/user.info.js +17 -17
  104. package/server/routes/user/schema.js +14 -14
  105. package/server/routes/widget/controllers/widget.del.js +47 -47
  106. package/server/routes/widget/controllers/widget.set.js +84 -84
  107. package/server/routes/widget/hook/onWidgetSet.js +12 -12
  108. package/server/routes/widget/index.mjs +16 -16
  109. package/server/routes/widget/schema.js +12 -12
  110. package/server/templates/cls/itree.recrzone_category.json +73 -73
  111. package/server/templates/cls/test.json +9 -9
  112. package/server/templates/form/admin.user_cls.data.form.json +49 -49
  113. package/server/templates/form/admin.user_group_rel.form.json +21 -21
  114. package/server/templates/form/form-user-pass.json +10 -10
  115. package/server/templates/form/form-user_group.json +39 -39
  116. package/server/templates/form/form-users.json +156 -156
  117. package/server/templates/form/user_group_access.form.json +22 -22
  118. package/server/templates/select/account_id.json +2 -2
  119. package/server/templates/table/gis.dataset.table.json +43 -43
  120. package/server/templates/table/management.user_group.table.json +112 -112
  121. package/server/templates/table/management.users.table.json +126 -126
  122. package/utils.js +29 -29
@@ -1,179 +1,179 @@
1
- const dateTypeList = ['date', 'timestamp', 'timestamp without time zone', 'timestamp with time zone'];
2
- const numberTypeList = ['float8', 'int4', 'int8', 'numeric', 'double precision', 'integer'];
3
- const isValidDate = (dateStr) => {
4
- const [dd, mm, yyyy] = dateStr.split('.');
5
- return new Date(mm + '/' + dd + '/' + yyyy).toString() !== 'Invalid Date';
6
- };
7
-
8
- function dt(y, m, d) {
9
- return new Date(Date.UTC(y, m, d)).toISOString().slice(0, 10);
10
- }
11
- const dp = {
12
- d: new Date().getDate(),
13
- w: new Date().getDate() - (new Date().getDay() || 7) + 1,
14
- m: new Date().getMonth(),
15
- q: (new Date().getMonth() / 4).toFixed() * 3,
16
- y: new Date().getFullYear(),
17
- };
18
-
19
- function formatDateISOString(date) {
20
- if (!date?.includes('.')) return date;
21
- const [day, month, year] = date.split('.');
22
- return `${year}-${month}-${day}`;
23
- }
24
-
25
- function formatValue({
26
- pg, filter = {}, name, value, operator = '=', dataTypeID, uid = 1, optimize,
27
- }) {
28
- const { data, sql, extra } = filter;
29
- const pk = false;
30
-
31
- if (!dataTypeID && !extra) return {};
32
- const fieldType = extra ? pg.pgType?.[{ Date: 1114 }[filter?.type] || 25] : pg.pgType?.[dataTypeID];
33
- if (!name || !value || !fieldType) return {};
34
- const filterType = filter.type?.toLowerCase();
35
-
36
- // current day, week, month, year etc.
37
- if (dateTypeList.includes(fieldType) && !value?.includes('_') && ['cd', 'cw', 'cm', 'cq', 'cy'].includes(value)) {
38
- const query = {
39
- cd: `${name}::date = '${dt(dp.y, dp.m, dp.d)}'::date`,
40
- cw: `${name}::date >= '${dt(dp.y, dp.m, dp.w)}'::date and ${name} <= '${dt(dp.y, dp.m, dp.w + 6)}'::date`,
41
- cm: `${name}::date >= '${dt(dp.y, dp.m, 1)}'::date and ${name} <= '${dt(dp.y, dp.m + 1, 0)}'::date`,
42
- cq: `${name}::date >= '${dt(dp.y, dp.q, 1)}'::date and ${name} <= '${dt(dp.y, dp.q + 3, 0)}'::date`,
43
- cy: `${name}::date >= '${dt(dp.y, 0, 1)}'::date and ${name}::date <= '${dt(dp.y, 11, 31)}'::date`,
44
- }[value];
45
- return { op: '=', query, extra };
46
- }
47
-
48
- // date range
49
- if (dateTypeList.includes(fieldType) && value?.includes('_')) {
50
- const [min, max] = value.split('_');
51
- const query = `${name} >= '${min}'::date and ${name} <= '${max}'::date`;
52
- return { op: 'between', query, extra };
53
- }
54
-
55
- // v3 filter date range, example - "01.01.2024-31.12.2024"
56
- if (dateTypeList.includes(fieldType) && value?.includes('.') && value?.indexOf('-') === 10 && value?.length === 21) {
57
- const [startDate, endDate] = value.split('-');
58
- const min = formatDateISOString(startDate);
59
- const max = formatDateISOString(endDate);
60
-
61
- if (!isValidDate(startDate) || !isValidDate(endDate)) {
62
- return { op: 'between', query: 'false', extra };
63
- }
64
- const query = extra && pk
65
- ? `${pk} in (select object_id from crm.extra_data where property_key='${name}' and value_date::date >= '${min}'::date and value_date::date <= '${max}'::date)`
66
- : `${name}::date >= '${min}'::date and ${name}::date <= '${max}'::date`;
67
- return { op: 'between', query, extra };
68
- }
69
-
70
- // my rows
71
- if (value === 'me' && uid && fieldType === 'text') {
72
- return { op: '=', query: extra ? `uid = '${uid}'` : `${name}::text = '${uid}'`, extra };
73
- }
74
-
75
- const formatType = {
76
- float8: 'numeric',
77
- int4: 'numeric',
78
- int8: 'numeric',
79
- varchar: 'text',
80
- bool: 'boolean',
81
- geometry: 'geom',
82
- }[fieldType] || 'text';
83
-
84
- if (optimize && optimize.name !== optimize.pk) {
85
- const val = filterType === 'text' ? `ilike '%${value}%'` : `= any('{${value}}')`;
86
- return {
87
- op: '~',
88
- query: fieldType?.includes('[]')
89
- ? `${optimize.pk} && (select array_agg(${optimize.pk}) from ${optimize.table} where ${name} ${val} )`
90
- : `${optimize.pk} in (select ${optimize.pk} from ${optimize.table} where ${name} ${val} )`,
91
- extra,
92
- };
93
- }
94
-
95
- if (fieldType?.includes('[]')) {
96
- return { op: 'in', query: `'{${value}}'::text[] && ${name}::text[]`, extra };
97
- }
98
-
99
- // multiple items of 1 param
100
- if (value?.indexOf(',') !== -1) {
101
- const values = value.split(',').filter((el) => el !== 'null');
102
- if (extra && pk) {
103
- const query = value?.indexOf('null') !== -1
104
- ? `${pk} in (select object_id from crm.extra_data where property_key='${name}' and ( value_text is null or value_text in (${values?.map((el) => `'"${el}"'`).join(',')}) ) )`
105
- : `${pk} in (select object_id from crm.extra_data where property_key='${name}' and value_text in (${values?.map((el) => `'"${el}"'`).join(',')}) )`;
106
- return { op: 'in', query, extra };
107
- }
108
- const query = value?.indexOf('null') !== -1
109
- ? `( ${name} is null or ${name}::text in (${values?.map((el) => `'${el}'`).join(',')}) )`
110
- : `${name}::text in (${value.split(',')?.map((el) => `'${el}'`).join(',')})`;
111
- return { op: 'in', query, extra };
112
- }
113
-
114
- // v3 filter number range, example - "100_500"
115
- if (numberTypeList.includes(fieldType) && value?.indexOf('_') !== -1) {
116
- const [min, max] = value.split('_');
117
- const query = (max === 'max' ? `${name} > ${min}` : null) || (min === 'min' ? `${name} <= ${max}` : null) || `${name} between ${min} and ${max}`;
118
- return { op: 'between', query, extra };
119
- }
120
-
121
- // number range
122
- if (numberTypeList.includes(fieldType) && value?.indexOf('-') !== -1) {
123
- const [min, max] = value.split('-');
124
- if (min === 'min' && max === 'max') return {};
125
- const query = (max === 'max' ? `${name} > ${min}` : null) || (min === 'min' ? `${name} < ${max}` : null) || `${name} between ${min} and ${max}`;
126
- return { op: 'between', query, extra };
127
- }
128
-
129
- if (['<', '>'].includes(operator)) {
130
- const query = `${name} ${operator} '${value}'::${formatType}`;
131
- return { op: operator, query, extra };
132
- }
133
-
134
- if (operator === '=' && filterType !== 'text' && !filter?.data) {
135
- const query = {
136
- null: `${name} is null`,
137
- notnull: `${name} is not null`,
138
- }[value] || `${name}::${formatType}='${value}'::${formatType}`;
139
- return { op: '=', query, extra };
140
- }
141
-
142
- if (['~', '='].includes(operator)) {
143
- const operator1 = (filterType === 'text' && (filter?.id || filter?.name) && operator === '=' ? '~' : operator);
144
- const matchNull = { null: 'is null', notnull: 'is not null' }[value];
145
- const match = matchNull || ((operator1 === '=' || filterType === 'autocomplete') ? `='${value}'` : `ilike '%${value}%'`);
146
- if (extra && pk) {
147
- const query = data && sql
148
- ? `${pk} in (select object_id from crm.extra_data where property_key='${name}' and value_text in ( ( with q(id,name) as (${sql}) select id from q where ${filterType === 'autocomplete' ? 'id' : 'name'} ${match})))`
149
- : `${pk} in (select object_id from crm.extra_data where property_key='${name}' and value_text ${match})`;
150
- return { op: 'ilike', query, extra };
151
- }
152
-
153
- const query = filter?.data && filter?.sql
154
- ? `${filter?.name || filter?.id} in ( ( with q(id,name) as (${filter?.sql}) select id from q where ${filterType === 'autocomplete' ? 'id' : 'name'}::text ${match}) )` // filter with cls
155
- : `${name}::text ${match}`; // simple filter
156
- // console.log(query);
157
- return { op: 'ilike', query };
158
- }
159
-
160
- // json
161
- if (name.includes('.')) {
162
- const [col, prop] = name.split('.');
163
- const query = ` ${col}->>'${prop}' in ('${value.join("','")}')`;
164
- return { op: 'in', query, extra };
165
- }
166
-
167
- // geometry
168
- if (['geometry'].includes(fieldType)) {
169
- const bbox = value[0].split('_');
170
-
171
- if (bbox?.length === 4) {
172
- const query = ` ${name} && 'box(${bbox[0]} ${bbox[1]},${bbox[2]} ${bbox[3]})'::box2d `;
173
- return { op: '&&', query, extra };
174
- }
175
- }
176
- return {};
177
- }
178
-
179
- export default formatValue;
1
+ const dateTypeList = ['date', 'timestamp', 'timestamp without time zone', 'timestamp with time zone'];
2
+ const numberTypeList = ['float8', 'int4', 'int8', 'numeric', 'double precision', 'integer'];
3
+ const isValidDate = (dateStr) => {
4
+ const [dd, mm, yyyy] = dateStr.split('.');
5
+ return new Date(mm + '/' + dd + '/' + yyyy).toString() !== 'Invalid Date';
6
+ };
7
+
8
+ function dt(y, m, d) {
9
+ return new Date(Date.UTC(y, m, d)).toISOString().slice(0, 10);
10
+ }
11
+ const dp = {
12
+ d: new Date().getDate(),
13
+ w: new Date().getDate() - (new Date().getDay() || 7) + 1,
14
+ m: new Date().getMonth(),
15
+ q: (new Date().getMonth() / 4).toFixed() * 3,
16
+ y: new Date().getFullYear(),
17
+ };
18
+
19
+ function formatDateISOString(date) {
20
+ if (!date?.includes('.')) return date;
21
+ const [day, month, year] = date.split('.');
22
+ return `${year}-${month}-${day}`;
23
+ }
24
+
25
+ function formatValue({
26
+ pg, filter = {}, name, value, operator = '=', dataTypeID, uid = 1, optimize,
27
+ }) {
28
+ const { data, sql, extra } = filter;
29
+ const pk = false;
30
+
31
+ if (!dataTypeID && !extra) return {};
32
+ const fieldType = extra ? pg.pgType?.[{ Date: 1114 }[filter?.type] || 25] : pg.pgType?.[dataTypeID];
33
+ if (!name || !value || !fieldType) return {};
34
+ const filterType = filter.type?.toLowerCase();
35
+
36
+ // current day, week, month, year etc.
37
+ if (dateTypeList.includes(fieldType) && !value?.includes('_') && ['cd', 'cw', 'cm', 'cq', 'cy'].includes(value)) {
38
+ const query = {
39
+ cd: `${name}::date = '${dt(dp.y, dp.m, dp.d)}'::date`,
40
+ cw: `${name}::date >= '${dt(dp.y, dp.m, dp.w)}'::date and ${name} <= '${dt(dp.y, dp.m, dp.w + 6)}'::date`,
41
+ cm: `${name}::date >= '${dt(dp.y, dp.m, 1)}'::date and ${name} <= '${dt(dp.y, dp.m + 1, 0)}'::date`,
42
+ cq: `${name}::date >= '${dt(dp.y, dp.q, 1)}'::date and ${name} <= '${dt(dp.y, dp.q + 3, 0)}'::date`,
43
+ cy: `${name}::date >= '${dt(dp.y, 0, 1)}'::date and ${name}::date <= '${dt(dp.y, 11, 31)}'::date`,
44
+ }[value];
45
+ return { op: '=', query, extra };
46
+ }
47
+
48
+ // date range
49
+ if (dateTypeList.includes(fieldType) && value?.includes('_')) {
50
+ const [min, max] = value.split('_');
51
+ const query = `${name} >= '${min}'::date and ${name} <= '${max}'::date`;
52
+ return { op: 'between', query, extra };
53
+ }
54
+
55
+ // v3 filter date range, example - "01.01.2024-31.12.2024"
56
+ if (dateTypeList.includes(fieldType) && value?.includes('.') && value?.indexOf('-') === 10 && value?.length === 21) {
57
+ const [startDate, endDate] = value.split('-');
58
+ const min = formatDateISOString(startDate);
59
+ const max = formatDateISOString(endDate);
60
+
61
+ if (!isValidDate(startDate) || !isValidDate(endDate)) {
62
+ return { op: 'between', query: 'false', extra };
63
+ }
64
+ const query = extra && pk
65
+ ? `${pk} in (select object_id from crm.extra_data where property_key='${name}' and value_date::date >= '${min}'::date and value_date::date <= '${max}'::date)`
66
+ : `${name}::date >= '${min}'::date and ${name}::date <= '${max}'::date`;
67
+ return { op: 'between', query, extra };
68
+ }
69
+
70
+ // my rows
71
+ if (value === 'me' && uid && fieldType === 'text') {
72
+ return { op: '=', query: extra ? `uid = '${uid}'` : `${name}::text = '${uid}'`, extra };
73
+ }
74
+
75
+ const formatType = {
76
+ float8: 'numeric',
77
+ int4: 'numeric',
78
+ int8: 'numeric',
79
+ varchar: 'text',
80
+ bool: 'boolean',
81
+ geometry: 'geom',
82
+ }[fieldType] || 'text';
83
+
84
+ if (optimize && optimize.name !== optimize.pk) {
85
+ const val = filterType === 'text' ? `ilike '%${value}%'` : `= any('{${value}}')`;
86
+ return {
87
+ op: '~',
88
+ query: fieldType?.includes('[]')
89
+ ? `${optimize.pk} && (select array_agg(${optimize.pk}) from ${optimize.table} where ${name} ${val} )`
90
+ : `${optimize.pk} in (select ${optimize.pk} from ${optimize.table} where ${name} ${val} )`,
91
+ extra,
92
+ };
93
+ }
94
+
95
+ if (fieldType?.includes('[]')) {
96
+ return { op: 'in', query: `'{${value}}'::text[] && ${name}::text[]`, extra };
97
+ }
98
+
99
+ // multiple items of 1 param
100
+ if (value?.indexOf(',') !== -1) {
101
+ const values = value.split(',').filter((el) => el !== 'null');
102
+ if (extra && pk) {
103
+ const query = value?.indexOf('null') !== -1
104
+ ? `${pk} in (select object_id from crm.extra_data where property_key='${name}' and ( value_text is null or value_text in (${values?.map((el) => `'"${el}"'`).join(',')}) ) )`
105
+ : `${pk} in (select object_id from crm.extra_data where property_key='${name}' and value_text in (${values?.map((el) => `'"${el}"'`).join(',')}) )`;
106
+ return { op: 'in', query, extra };
107
+ }
108
+ const query = value?.indexOf('null') !== -1
109
+ ? `( ${name} is null or ${name}::text in (${values?.map((el) => `'${el}'`).join(',')}) )`
110
+ : `${name}::text in (${value.split(',')?.map((el) => `'${el}'`).join(',')})`;
111
+ return { op: 'in', query, extra };
112
+ }
113
+
114
+ // v3 filter number range, example - "100_500"
115
+ if (numberTypeList.includes(fieldType) && value?.indexOf('_') !== -1) {
116
+ const [min, max] = value.split('_');
117
+ const query = (max === 'max' ? `${name} > ${min}` : null) || (min === 'min' ? `${name} <= ${max}` : null) || `${name} between ${min} and ${max}`;
118
+ return { op: 'between', query, extra };
119
+ }
120
+
121
+ // number range
122
+ if (numberTypeList.includes(fieldType) && value?.indexOf('-') !== -1) {
123
+ const [min, max] = value.split('-');
124
+ if (min === 'min' && max === 'max') return {};
125
+ const query = (max === 'max' ? `${name} > ${min}` : null) || (min === 'min' ? `${name} < ${max}` : null) || `${name} between ${min} and ${max}`;
126
+ return { op: 'between', query, extra };
127
+ }
128
+
129
+ if (['<', '>'].includes(operator)) {
130
+ const query = `${name} ${operator} '${value}'::${formatType}`;
131
+ return { op: operator, query, extra };
132
+ }
133
+
134
+ if (operator === '=' && filterType !== 'text' && !filter?.data) {
135
+ const query = {
136
+ null: `${name} is null`,
137
+ notnull: `${name} is not null`,
138
+ }[value] || `${name}::${formatType}='${value}'::${formatType}`;
139
+ return { op: '=', query, extra };
140
+ }
141
+
142
+ if (['~', '='].includes(operator)) {
143
+ const operator1 = (filterType === 'text' && (filter?.id || filter?.name) && operator === '=' ? '~' : operator);
144
+ const matchNull = { null: 'is null', notnull: 'is not null' }[value];
145
+ const match = matchNull || ((operator1 === '=' || filterType === 'autocomplete') ? `='${value}'` : `ilike '%${value}%'`);
146
+ if (extra && pk) {
147
+ const query = data && sql
148
+ ? `${pk} in (select object_id from crm.extra_data where property_key='${name}' and value_text in ( ( with q(id,name) as (${sql}) select id from q where ${filterType === 'autocomplete' ? 'id' : 'name'} ${match})))`
149
+ : `${pk} in (select object_id from crm.extra_data where property_key='${name}' and value_text ${match})`;
150
+ return { op: 'ilike', query, extra };
151
+ }
152
+
153
+ const query = filter?.data && filter?.sql
154
+ ? `${filter?.name || filter?.id} in ( ( with q(id,name) as (${filter?.sql}) select id from q where ${filterType === 'autocomplete' ? 'id' : 'name'}::text ${match}) )` // filter with cls
155
+ : `${name}::text ${match}`; // simple filter
156
+ // console.log(query);
157
+ return { op: 'ilike', query };
158
+ }
159
+
160
+ // json
161
+ if (name.includes('.')) {
162
+ const [col, prop] = name.split('.');
163
+ const query = ` ${col}->>'${prop}' in ('${value.join("','")}')`;
164
+ return { op: 'in', query, extra };
165
+ }
166
+
167
+ // geometry
168
+ if (['geometry'].includes(fieldType)) {
169
+ const bbox = value[0].split('_');
170
+
171
+ if (bbox?.length === 4) {
172
+ const query = ` ${name} && 'box(${bbox[0]} ${bbox[1]},${bbox[2]} ${bbox[3]})'::box2d `;
173
+ return { op: '&&', query, extra };
174
+ }
175
+ }
176
+ return {};
177
+ }
178
+
179
+ export default formatValue;
@@ -1,3 +1,3 @@
1
- export default async function (fastify, opts) {
2
- fastify.get(`/test`, () => { return { test: true } });
3
- }
1
+ export default async function (fastify, opts) {
2
+ fastify.get(`/test`, () => { return { test: true } });
3
+ }
@@ -1,50 +1,50 @@
1
- import { config, applyHook, getTemplate, getToken, setToken } from "@opengis/fastify-table/utils.js";
2
-
3
- function formatSchema(schema, user) {
4
- function parseDataTables(obj) {
5
- if (obj?.add) {
6
- const [token] = setToken({
7
- ids: [JSON.stringify({ ... obj.add, table: obj.add?.table || obj.add?.model })],
8
- uid: user.uid,
9
- array: 1,
10
- });
11
- Object.assign(obj.add, { token, api: `${config.prefix || '/api'}/table/${token}` });
12
- } else if (obj?.type === 'DataTable' && obj.colModel?.length) {
13
- obj.colModel.forEach(parseDataTables);
14
- }
15
- }
16
- Object.keys(schema).map(key => ({ key, ...schema[key] })).forEach(parseDataTables);
17
- }
18
-
19
- export default async function getTemplateApi(req) {
20
- const { user } = req?.session?.passport || {};
21
- const { params = {}, session = {} } = req;
22
- const { type, name } = params;
23
-
24
- const tokenData = await getToken({ token: name, uid: user?.uid, json: 1 }) || {};
25
-
26
- const hookData = await applyHook('preTemplate', { name: tokenData.name || name, type, user });
27
- if (hookData?.message && hookData?.status) {
28
- return hookData;
29
- }
30
-
31
- const data = await getTemplate(type, hookData?.name || tokenData.form || name);
32
- if (!['interface', 'table'].includes(type)
33
- && (!data?.public || !data?.ispublic)
34
- && !config?.auth?.disable
35
- && !session.passport?.user?.uid
36
- && false
37
- ) {
38
- return `access restricted ${name}`;
39
- }
40
- if (type === 'form' && user?.uid) {
41
- const schema = data.schema || data;
42
- formatSchema(schema, user);
43
- }
44
- await applyHook('afterTemplate', { name, type, data, user });
45
- if (tokenData.obj) {
46
- const obj = tokenData.obj.split('#').reduce((p, el) => ({ ...p, [el.split('=')[0]]: el.split('=')[1] }), {})
47
- Object.assign(data, { obj });
48
- }
49
- return data?.html || data || `template not found "${name}"`;
1
+ import { config, applyHook, getTemplate, getToken, setToken } from "@opengis/fastify-table/utils.js";
2
+
3
+ function formatSchema(schema, user) {
4
+ function parseDataTables(obj) {
5
+ if (obj?.add) {
6
+ const [token] = setToken({
7
+ ids: [JSON.stringify({ ... obj.add, table: obj.add?.table || obj.add?.model })],
8
+ uid: user.uid,
9
+ array: 1,
10
+ });
11
+ Object.assign(obj.add, { token, api: `${config.prefix || '/api'}/table/${token}` });
12
+ } else if (obj?.type === 'DataTable' && obj.colModel?.length) {
13
+ obj.colModel.forEach(parseDataTables);
14
+ }
15
+ }
16
+ Object.keys(schema).map(key => ({ key, ...schema[key] })).forEach(parseDataTables);
17
+ }
18
+
19
+ export default async function getTemplateApi(req) {
20
+ const { user } = req?.session?.passport || {};
21
+ const { params = {}, session = {} } = req;
22
+ const { type, name } = params;
23
+
24
+ const tokenData = await getToken({ token: name, uid: user?.uid, json: 1 }) || {};
25
+
26
+ const hookData = await applyHook('preTemplate', { name: tokenData.name || name, type, user });
27
+ if (hookData?.message && hookData?.status) {
28
+ return hookData;
29
+ }
30
+
31
+ const data = await getTemplate(type, hookData?.name || tokenData.form || name);
32
+ if (!['interface', 'table'].includes(type)
33
+ && (!data?.public || !data?.ispublic)
34
+ && !config?.auth?.disable
35
+ && !session.passport?.user?.uid
36
+ && false
37
+ ) {
38
+ return `access restricted ${name}`;
39
+ }
40
+ if (type === 'form' && user?.uid) {
41
+ const schema = data.schema || data;
42
+ formatSchema(schema, user);
43
+ }
44
+ await applyHook('afterTemplate', { name, type, data, user });
45
+ if (tokenData.obj) {
46
+ const obj = tokenData.obj.split('#').reduce((p, el) => ({ ...p, [el.split('=')[0]]: el.split('=')[1] }), {})
47
+ Object.assign(data, { obj });
48
+ }
49
+ return data?.html || data || `template not found "${name}"`;
50
50
  }
@@ -1,16 +1,16 @@
1
- import getTemplateApi from './controllers/getTemplate.js';
2
-
3
- import getTemplateSchema from './schema.js'
4
-
5
- export default async function route(fastify) {
6
- //fastify.decorate('addTempateFolder', addTempateFolder); // call from funcs
7
- fastify.get(`/template/:type/:name`, { config: { policy: ['public'] }, scheme: getTemplateSchema }, getTemplateApi);
8
-
9
- /*fastify.addHook('onListen', async () => {
10
- await addTempateFolder(path.join(process.cwd(), '/module/itree'));
11
- await addTempateFolder(path.join(process.cwd(), '/module/test'));
12
- });*/
13
-
14
-
15
-
16
- }
1
+ import getTemplateApi from './controllers/getTemplate.js';
2
+
3
+ import getTemplateSchema from './schema.js'
4
+
5
+ export default async function route(fastify) {
6
+ //fastify.decorate('addTempateFolder', addTempateFolder); // call from funcs
7
+ fastify.get(`/template/:type/:name`, { config: { policy: ['public'] }, scheme: getTemplateSchema }, getTemplateApi);
8
+
9
+ /*fastify.addHook('onListen', async () => {
10
+ await addTempateFolder(path.join(process.cwd(), '/module/itree'));
11
+ await addTempateFolder(path.join(process.cwd(), '/module/test'));
12
+ });*/
13
+
14
+
15
+
16
+ }
@@ -1,9 +1,9 @@
1
- const getTemplateSchema = {
2
- params: {
3
- name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
4
- // type: { type: 'string' },
5
- }
6
- };
7
-
8
- export default null;
1
+ const getTemplateSchema = {
2
+ params: {
3
+ name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
4
+ // type: { type: 'string' },
5
+ }
6
+ };
7
+
8
+ export default null;
9
9
  export { getTemplateSchema }
@@ -1,14 +1,14 @@
1
- import userCls from './user.cls.js';
2
-
3
- export default async function userClsId(req) {
4
- const { id } = req.params || {};
5
- const res = await userCls(req);
6
- if (req.query?.sql || res?.error) {
7
- return res;
8
- }
9
- const { rows = [] } = res?.message || {};
10
- if (!rows?.length) {
11
- return { message: `cls not found: ${id}`, status: 404 };
12
- }
13
- return { message: rows?.[0], status: 200 };
14
- }
1
+ import userCls from './user.cls.js';
2
+
3
+ export default async function userClsId(req) {
4
+ const { id } = req.params || {};
5
+ const res = await userCls(req);
6
+ if (req.query?.sql || res?.error) {
7
+ return res;
8
+ }
9
+ const { rows = [] } = res?.message || {};
10
+ if (!rows?.length) {
11
+ return { message: `cls not found: ${id}`, status: 404 };
12
+ }
13
+ return { message: rows?.[0], status: 200 };
14
+ }