@onetype/framework 2.0.49 → 2.0.52

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 (104) hide show
  1. package/addons/core/commands/front/directives/run.js +1 -1
  2. package/addons/core/commands/front/directives/submit.js +1 -1
  3. package/addons/core/commands/front/functions/api.js +1 -1
  4. package/addons/core/database/back/addon.js +14 -0
  5. package/addons/core/database/back/events/addon.init.js +42 -0
  6. package/addons/core/database/back/events/addon.item.init.js +24 -0
  7. package/addons/core/database/back/functions/item/create.js +92 -0
  8. package/addons/core/database/back/functions/item/delete.js +34 -0
  9. package/addons/core/database/back/functions/item/save.js +13 -0
  10. package/addons/core/database/back/functions/item/update.js +90 -0
  11. package/addons/core/database/back/functions/items/builder.js +160 -0
  12. package/addons/core/database/back/functions/items/filter.js +32 -0
  13. package/addons/core/database/back/functions/items/filters.js +7 -0
  14. package/addons/core/database/back/functions/items/find.js +28 -0
  15. package/addons/core/database/back/functions/items/methods/aggregate.js +15 -0
  16. package/addons/core/database/back/functions/items/methods/count.js +12 -0
  17. package/addons/core/database/back/functions/items/methods/exists.js +8 -0
  18. package/addons/core/database/back/functions/items/methods/many.js +13 -0
  19. package/addons/core/database/back/functions/items/methods/one.js +8 -0
  20. package/addons/core/database/back/functions/items/methods/plain.js +29 -0
  21. package/addons/core/database/back/functions/items/methods/query.js +33 -0
  22. package/addons/core/database/back/functions/items/methods.js +142 -0
  23. package/addons/core/database/back/functions/items/transform/join.js +63 -0
  24. package/addons/core/database/back/functions/items/transform/translate.js +57 -0
  25. package/addons/core/database/back/functions/items/validation.js +125 -0
  26. package/addons/core/database/back/item/catch/add.js +1 -1
  27. package/addons/core/database/back/items/commands/create.js +54 -0
  28. package/addons/core/database/back/items/commands/delete.js +62 -0
  29. package/addons/core/database/back/items/commands/find.js +118 -0
  30. package/addons/core/database/back/items/commands/update.js +70 -0
  31. package/addons/core/database/back/load.js +27 -26
  32. package/addons/core/database/front/events/addon.init.js +42 -0
  33. package/addons/core/database/front/functions/create.js +11 -0
  34. package/addons/core/database/front/functions/delete.js +10 -0
  35. package/addons/core/database/front/functions/find.js +96 -142
  36. package/addons/core/database/front/functions/update.js +12 -0
  37. package/addons/float/popup/css/popup.css +141 -18
  38. package/addons/float/popup/js/addon.js +5 -0
  39. package/addons/float/popup/js/functions/confirm.js +100 -0
  40. package/addons/float/popup/js/functions/toast.js +1 -1
  41. package/addons/float/popup/js/items/directives/tooltip.js +5 -1
  42. package/addons/render/directives/front/addon.js +5 -0
  43. package/addons/render/directives/front/functions/process/data.js +19 -1
  44. package/addons/render/directives/front/functions/process/locale.js +46 -0
  45. package/addons/render/directives/front/functions/process.js +4 -1
  46. package/addons/render/directives/front/items/self/660-form.js +74 -163
  47. package/addons/render/directives/front/items/self/750-html.js +1 -1
  48. package/addons/render/elements/front/items/self/form/button/button.css +9 -0
  49. package/addons/render/elements/front/items/self/form/button/button.js +1 -1
  50. package/addons/render/elements/front/items/self/form/color/color.css +1 -1
  51. package/addons/render/elements/front/items/self/form/color/color.js +25 -10
  52. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.css +410 -0
  53. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.js +191 -0
  54. package/addons/render/elements/front/items/self/form/field/field.css +18 -4
  55. package/addons/render/elements/front/items/self/form/field/field.js +6 -1
  56. package/addons/render/elements/front/items/self/form/section/section.js +3 -1
  57. package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +8 -3
  58. package/addons/render/pages/core/addon.js +1 -1
  59. package/addons/render/pages/front/items/directives/change.js +1 -1
  60. package/addons/render/pages/front/styles/page.css +0 -7
  61. package/addons/render/transforms/js/functions/data.js +21 -2
  62. package/lib/src/classes/addon/class.js +0 -16
  63. package/lib/src/classes/addon/classes/item/class.js +0 -2
  64. package/lib/src/classes/addon/classes/item/mixins/get.js +0 -1
  65. package/lib/src/classes/addon/classes/render/mixins/compile.js +3 -2
  66. package/lib/src/classes/addon/mixins/items.js +2 -0
  67. package/lib/src/mixins/addons.js +2 -0
  68. package/lib/src/mixins/data.js +10 -9
  69. package/lib/src/mixins/emitter.js +5 -1
  70. package/lib/src/mixins/form.js +4 -0
  71. package/lib/src/mixins/function.js +6 -1
  72. package/lib/src/mixins/language.js +55 -0
  73. package/lib/src/mixins/locale.js +49 -0
  74. package/lib/src/onetype.js +6 -11
  75. package/package.json +1 -1
  76. package/addons/core/database/back/events/addon.add.js +0 -18
  77. package/addons/core/database/back/events/middleware/addon.items.find.js +0 -24
  78. package/addons/core/database/back/events/middleware/item.crud.create.js +0 -24
  79. package/addons/core/database/back/events/middleware/item.crud.delete.js +0 -24
  80. package/addons/core/database/back/events/middleware/item.crud.update.js +0 -24
  81. package/addons/core/database/back/functions/create.js +0 -6
  82. package/addons/core/database/back/functions/delete.js +0 -6
  83. package/addons/core/database/back/functions/find/builder.js +0 -160
  84. package/addons/core/database/back/functions/find/count.js +0 -12
  85. package/addons/core/database/back/functions/find/filter.js +0 -37
  86. package/addons/core/database/back/functions/find/filters.js +0 -7
  87. package/addons/core/database/back/functions/find/many.js +0 -93
  88. package/addons/core/database/back/functions/find/methods.js +0 -235
  89. package/addons/core/database/back/functions/find/plain.js +0 -25
  90. package/addons/core/database/back/functions/find/validation.js +0 -214
  91. package/addons/core/database/back/functions/find.js +0 -25
  92. package/addons/core/database/back/functions/update.js +0 -6
  93. package/addons/core/database/back/item/functions/create.js +0 -94
  94. package/addons/core/database/back/item/functions/delete.js +0 -25
  95. package/addons/core/database/back/item/functions/find.js +0 -19
  96. package/addons/core/database/back/item/functions/save.js +0 -15
  97. package/addons/core/database/back/item/functions/transaction.js +0 -17
  98. package/addons/core/database/back/item/functions/update.js +0 -76
  99. package/addons/core/database/back/items/commands/expose.js +0 -321
  100. package/addons/core/database/front/events/addon.add.js +0 -13
  101. package/lib/src/classes/addon/classes/item/mixins/crud.js +0 -28
  102. package/lib/src/classes/addon/mixins/find.js +0 -12
  103. package/lib/src/classes/addon/mixins/table.js +0 -35
  104. package/lib/src/mixins/dependencies.js +0 -104
@@ -1,160 +0,0 @@
1
- import database from '#database/addon.js';
2
-
3
- database.Fn('find.builder', function()
4
- {
5
- const builder = {};
6
-
7
- builder.applyFilters = (knexQuery, filters) =>
8
- {
9
- if(!filters.length)
10
- {
11
- return;
12
- }
13
-
14
- const groups = {};
15
-
16
- filters.forEach(filter =>
17
- {
18
- if(!groups[filter.group])
19
- {
20
- groups[filter.group] = { type: 'AND', filters: [] };
21
- }
22
-
23
- if(filter.groupStart)
24
- {
25
- groups[filter.group].type = filter.type;
26
- }
27
- else
28
- {
29
- groups[filter.group].filters.push(filter);
30
- }
31
- });
32
-
33
- knexQuery.where(function()
34
- {
35
- let first = true;
36
-
37
- Object.entries(groups).forEach(([groupId, group]) =>
38
- {
39
- if(!group.filters.length)
40
- {
41
- return;
42
- }
43
-
44
- const method = first ? 'where' : (group.type === 'OR' ? 'orWhere' : 'andWhere');
45
- first = false;
46
-
47
- this[method](function()
48
- {
49
- group.filters.forEach((filter, i) =>
50
- {
51
- builder.applyFilter(this, filter, i);
52
- });
53
- });
54
- });
55
- });
56
- };
57
-
58
- builder.applyFilter = (query, filter, index) =>
59
- {
60
- const method = index === 0 ? 'where' : (filter.type === 'OR' ? 'orWhere' : 'where');
61
- const operator = filter.operator.toUpperCase();
62
-
63
- if(operator === 'NULL')
64
- {
65
- query[method + 'Null'](filter.field);
66
- }
67
- else if(operator === 'NOT NULL')
68
- {
69
- query[method + 'NotNull'](filter.field);
70
- }
71
- else if(operator === 'BETWEEN')
72
- {
73
- query[method + 'Between'](filter.field, filter.value);
74
- }
75
- else if(operator === 'NOT BETWEEN')
76
- {
77
- query[method + 'NotBetween'](filter.field, filter.value);
78
- }
79
- else if(operator === 'CONTAINS')
80
- {
81
- const val = Array.isArray(filter.value) ? filter.value : [filter.value];
82
- const type = typeof val[0] === 'number' ? '::int[]' : '::varchar[]';
83
- query.whereRaw(`?? @> ARRAY[${val.map(() => '?').join(',')}]${type}`, [filter.field, ...val]);
84
- }
85
- else if(operator === 'CONTAINED')
86
- {
87
- const val = Array.isArray(filter.value) ? filter.value : [filter.value];
88
- const type = typeof val[0] === 'number' ? '::int[]' : '::varchar[]';
89
- query.whereRaw(`?? <@ ARRAY[${val.map(() => '?').join(',')}]${type}`, [filter.field, ...val]);
90
- }
91
- else if(operator === 'HAS')
92
- {
93
- query.whereRaw(`?? ? ?`, [filter.field, filter.value]);
94
- }
95
- else if(['IN', 'NOT IN'].includes(operator))
96
- {
97
- const values = Array.isArray(filter.value) ? filter.value : [filter.value];
98
- query[method](filter.field, operatorToKnex(operator), values);
99
- }
100
- else
101
- {
102
- query[method](filter.field, operatorToKnex(operator), filter.value);
103
- }
104
- };
105
-
106
- const operatorToKnex = (operator) =>
107
- {
108
- const map = {
109
- 'EQUALS': '=',
110
- 'NOT EQUALS': '!=',
111
- 'LESS': '<',
112
- 'GREATER': '>',
113
- 'LESS EQUALS': '<=',
114
- 'GREATER EQUALS': '>=',
115
- 'LIKE': 'like',
116
- 'NOT LIKE': 'not like',
117
- 'ILIKE': 'ilike',
118
- 'NOT ILIKE': 'not ilike',
119
- 'IN': 'in',
120
- 'NOT IN': 'not in'
121
- };
122
-
123
- return map[operator] || operator.toLowerCase();
124
- };
125
-
126
- builder.applySort = (knexQuery, sort) =>
127
- {
128
- if(sort)
129
- {
130
- knexQuery.orderBy(sort.field, sort.direction);
131
- }
132
- };
133
-
134
- builder.applyPagination = (knexQuery, limit, page) =>
135
- {
136
- if(limit > 0)
137
- {
138
- knexQuery.limit(limit);
139
-
140
- if(page > 1)
141
- {
142
- knexQuery.offset((page - 1) * limit);
143
- }
144
- }
145
- };
146
-
147
- builder.applySelect = (knexQuery, select, distinct) =>
148
- {
149
- if(select)
150
- {
151
- knexQuery[distinct ? 'distinct' : 'select'](select);
152
- }
153
- else
154
- {
155
- knexQuery[distinct ? 'distinct' : 'select']('*');
156
- }
157
- };
158
-
159
- return builder;
160
- });
@@ -1,12 +0,0 @@
1
- import database from '#database/addon.js';
2
-
3
- database.Fn('find.count', async function(query)
4
- {
5
- const builder = database.Fn('find.builder');
6
- const knexQuery = query.connection(query.table.name).count('* as count');
7
-
8
- builder.applyFilters(knexQuery, query.filters);
9
-
10
- const result = await knexQuery;
11
- return parseInt(result[0]?.count || 0);
12
- });
@@ -1,37 +0,0 @@
1
- import database from '#database/addon.js';
2
-
3
- database.Fn('find.filter', function(query, field, value, operator, type, group, returnMethods)
4
- {
5
- const validation = database.Fn('find.validation');
6
- const normalizedOperator = operator.toUpperCase();
7
-
8
- if(normalizedOperator === 'NULL' || normalizedOperator === 'NOT NULL')
9
- {
10
- validation.field(field);
11
- }
12
- else if(normalizedOperator === 'BETWEEN' || normalizedOperator === 'NOT BETWEEN')
13
- {
14
- validation.field(field);
15
- validation.between(value);
16
- }
17
- else if(normalizedOperator === 'IN' || normalizedOperator === 'NOT IN')
18
- {
19
- validation.field(field);
20
- validation.operator(normalizedOperator, query.operators.map(op => op.toUpperCase()));
21
- validation.inList(value);
22
- }
23
- else
24
- {
25
- validation.field(field);
26
- validation.operator(normalizedOperator, query.operators.map(op => op.toUpperCase()));
27
- validation.value(value);
28
- }
29
-
30
- if(query.table.prefix)
31
- {
32
- field = query.table.prefix + field;
33
- }
34
-
35
- query.filters.push({ field, value, operator: normalizedOperator, type, group });
36
- return returnMethods;
37
- });
@@ -1,7 +0,0 @@
1
- import database from '#database/addon.js';
2
-
3
- database.Fn('find.filters', function(knexQuery, filters = [])
4
- {
5
- const builder = database.Fn('find.builder');
6
- builder.applyFilters(knexQuery, filters);
7
- });
@@ -1,93 +0,0 @@
1
- import onetype from '#framework/load.js';
2
- import database from '#database/addon.js';
3
-
4
- database.Fn('find.many', async function(query, set = false)
5
- {
6
- const builder = database.Fn('find.builder');
7
- const knexQuery = query.connection(query.table.name);
8
-
9
- builder.applySelect(knexQuery, query.select, query.distinct);
10
- builder.applyFilters(knexQuery, query.filters);
11
- builder.applySort(knexQuery, query.sort);
12
- builder.applyPagination(knexQuery, query.limit, query.page);
13
-
14
- const result = await knexQuery;
15
-
16
- const items = result.map((record) =>
17
- {
18
- const data = {};
19
-
20
- Object.entries(record).forEach(([key, value]) =>
21
- {
22
- if(value instanceof Date)
23
- {
24
- value = value.toISOString();
25
- }
26
-
27
- if(query.table.prefix && key.startsWith(query.table.prefix))
28
- {
29
- key = key.slice(query.table.prefix.length);
30
- }
31
-
32
- data[key] = value;
33
- });
34
-
35
- return query.addon.ItemAdd(data, null, false, set);
36
- });
37
-
38
- if(query.joins.length)
39
- {
40
- for(const join of query.joins)
41
- {
42
- const addon = onetype.AddonGet(join.addon);
43
-
44
- if(!addon)
45
- {
46
- throw new Error(`Join addon '${join.addon}' not found`);
47
- }
48
-
49
- const ids = [];
50
-
51
- items.forEach(item =>
52
- {
53
- const value = item.Get(join.field);
54
-
55
- if(join.many && Array.isArray(value))
56
- {
57
- value.forEach(id => { if(id && !ids.includes(id)) ids.push(id); });
58
- }
59
- else if(value && !ids.includes(value))
60
- {
61
- ids.push(value);
62
- }
63
- });
64
-
65
- if(!ids.length)
66
- {
67
- continue;
68
- }
69
-
70
- const joined = await addon.Find(query.connection).filter('id', ids, 'IN').limit(ids.length).many();
71
- const map = {};
72
-
73
- const fields = Object.keys(addon.Fields().data);
74
- joined.forEach(item => { map[String(item.Get('id'))] = item.Get(fields); });
75
-
76
- items.forEach(item =>
77
- {
78
- const value = item.Get(join.field);
79
-
80
- if(join.many && Array.isArray(value))
81
- {
82
- item.Set(join.output, value.map(id => map[String(id)]).filter(Boolean));
83
- }
84
- else if(value)
85
- {
86
- item.Set(join.output, map[String(value)] || null);
87
- }
88
- });
89
- }
90
- }
91
-
92
- return items;
93
- });
@@ -1,235 +0,0 @@
1
- import onetype from '#framework/load.js';
2
- import database from '#database/addon.js';
3
-
4
- database.Fn('find.methods', function(query, context = null, groupId = 'default')
5
- {
6
- const validation = database.Fn('find.validation');
7
- const methods = {};
8
-
9
- methods.limit = limit =>
10
- {
11
- try
12
- {
13
- validation.limit(limit);
14
- query.limit = limit;
15
- return methods;
16
- }
17
- catch (error)
18
- {
19
- throw new Error(`Invalid limit parameter: ${error.message}`);
20
- }
21
- };
22
-
23
- methods.page = page =>
24
- {
25
- try
26
- {
27
- validation.page(page);
28
- query.page = page;
29
- return methods;
30
- }
31
- catch (error)
32
- {
33
- throw new Error(`Invalid page parameter: ${error.message}`);
34
- }
35
- };
36
-
37
- methods.sort = (field, direction = 'asc') =>
38
- {
39
- try
40
- {
41
- validation.field(field);
42
- direction = validation.direction(direction);
43
-
44
- if(query.table.prefix)
45
- {
46
- field = query.table.prefix + field;
47
- }
48
-
49
- query.sort = { field, direction };
50
- return methods;
51
- }
52
- catch (error)
53
- {
54
- throw new Error(`Invalid sort parameters: ${error.message}`);
55
- }
56
- };
57
-
58
- methods.select = fields =>
59
- {
60
- try
61
- {
62
- if (fields === undefined || fields === null)
63
- {
64
- throw new Error('Fields parameter cannot be null or undefined');
65
- }
66
-
67
- fields = Array.isArray(fields) ? fields : [fields];
68
- validation.fields(fields);
69
-
70
- if(query.table.prefix)
71
- {
72
- fields = fields.map(f => query.table.prefix + f);
73
- }
74
-
75
- query.select = fields;
76
- return methods;
77
- }
78
- catch (error)
79
- {
80
- throw new Error(`Invalid select parameters: ${error.message}`);
81
- }
82
- };
83
-
84
- methods.distinct = (value = true) =>
85
- {
86
- query.distinct = Boolean(value);
87
- return methods;
88
- };
89
-
90
- methods.filter = (field, value, operator = 'EQUALS') =>
91
- {
92
- try
93
- {
94
- return database.Fn('find.filter', query, field, value, operator, 'AND', groupId, methods);
95
- }
96
- catch (error)
97
- {
98
- throw new Error(`Filter error for field '${field}': ${error.message}`);
99
- }
100
- };
101
-
102
- methods.orFilter = (field, value, operator = 'EQUALS') =>
103
- {
104
- try
105
- {
106
- return database.Fn('find.filter', query, field, value, operator, 'OR', groupId, methods);
107
- }
108
- catch (error)
109
- {
110
- throw new Error(`OR filter error for field '${field}': ${error.message}`);
111
- }
112
- };
113
-
114
- methods.group = (type = 'AND') =>
115
- {
116
- try
117
- {
118
- if (type !== 'AND' && type !== 'OR')
119
- {
120
- throw new Error(`Group type must be 'AND' or 'OR', received: ${type}`);
121
- }
122
-
123
- const TID = onetype.GenerateTID();
124
-
125
- if (!query.filters)
126
- {
127
- query.filters = [];
128
- }
129
-
130
- query.filters.push({ groupStart: true, group: TID, type });
131
-
132
- const groupMethods = database.Fn('find.methods', query, methods, TID);
133
- groupMethods.end = () => context || methods;
134
-
135
- return groupMethods;
136
- }
137
- catch (error)
138
- {
139
- throw new Error(`Error creating filter group: ${error.message}`);
140
- }
141
- };
142
-
143
- methods.join = (addon, field, output = null) =>
144
- {
145
- try
146
- {
147
- const config = query.addon.FieldGet(field);
148
-
149
- if(!config)
150
- {
151
- throw new Error(`Field '${field}' not found in addon`);
152
- }
153
-
154
- const parsed = onetype.DataParseConfig(config.define);
155
- const many = parsed.type.includes('array');
156
-
157
- query.joins.push({ addon, field, output: output || field, many });
158
-
159
- return methods;
160
- }
161
- catch (error)
162
- {
163
- throw new Error(`Join error for field '${field}': ${error.message}`);
164
- }
165
- };
166
-
167
- methods.many = async (set = false) =>
168
- {
169
- try
170
- {
171
- return database.Fn('find.many', query, set);
172
- }
173
- catch (error)
174
- {
175
- throw new Error(`Error executing 'many' query: ${error.message}`);
176
- }
177
- };
178
-
179
- methods.plain = async () =>
180
- {
181
- try
182
- {
183
- return database.Fn('find.plain', query);
184
- }
185
- catch (error)
186
- {
187
- throw new Error(`Error executing 'plain' query: ${error.message}`);
188
- }
189
- };
190
-
191
- methods.count = async () =>
192
- {
193
- try
194
- {
195
- return database.Fn('find.count', query);
196
- }
197
- catch (error)
198
- {
199
- throw new Error(`Error executing 'count' query: ${error.message}`);
200
- }
201
- };
202
-
203
- methods.one = async (set = false) =>
204
- {
205
- try
206
- {
207
- const results = await methods.limit(1).many(set);
208
- return results.length > 0 ? results[0] : null;
209
- }
210
- catch (error)
211
- {
212
- throw new Error(`Error executing 'one' query: ${error.message}`);
213
- }
214
- };
215
-
216
- methods.exists = async () =>
217
- {
218
- try
219
- {
220
- const count = await methods.limit(1).count();
221
- return count > 0;
222
- }
223
- catch (error)
224
- {
225
- throw new Error(`Error executing 'exists' query: ${error.message}`);
226
- }
227
- };
228
-
229
- if(context)
230
- {
231
- methods.end = () => context;
232
- }
233
-
234
- return methods;
235
- });
@@ -1,25 +0,0 @@
1
- import database from '#database/addon.js';
2
-
3
- database.Fn('find.plain', async function(query)
4
- {
5
- const builder = database.Fn('find.builder');
6
- const countQuery = query.connection(query.table.name).count('* as count');
7
-
8
- builder.applyFilters(countQuery, query.filters);
9
-
10
- const [items, countResult] = await Promise.all([
11
- database.Fn('find.many', query),
12
- countQuery
13
- ]);
14
-
15
- const total = parseInt(countResult[0]?.count || 0);
16
- const fields = Object.keys(query.addon.Fields().data);
17
-
18
- return {
19
- items: items.map(item => item.Get(fields)),
20
- total,
21
- page: query.page,
22
- pages: query.limit > 0 ? Math.ceil(total / query.limit) : 1,
23
- limit: query.limit
24
- };
25
- });