@limetech/lime-crm-building-blocks 1.98.0 → 1.100.0

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 (176) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/{index.esm-a894ac76.js → index.esm-d785eb6e.js} +2 -0
  3. package/dist/cjs/lime-crm-building-blocks.cjs.js +1 -1
  4. package/dist/cjs/limebb-browser.cjs.entry.js +1 -1
  5. package/dist/cjs/limebb-chat-item_2.cjs.entry.js +1 -1
  6. package/dist/cjs/limebb-chat-list.cjs.entry.js +1 -1
  7. package/dist/cjs/limebb-component-config.cjs.entry.js +1 -1
  8. package/dist/cjs/limebb-component-picker.cjs.entry.js +1 -1
  9. package/dist/cjs/limebb-currency-picker.cjs.entry.js +1 -1
  10. package/dist/cjs/limebb-date-picker.cjs.entry.js +1 -1
  11. package/dist/cjs/limebb-feed-timeline-item.cjs.entry.js +1 -1
  12. package/dist/cjs/limebb-feed.cjs.entry.js +1 -1
  13. package/dist/cjs/limebb-info-tile.cjs.entry.js +1 -1
  14. package/dist/cjs/limebb-kanban-group.cjs.entry.js +1 -1
  15. package/dist/cjs/limebb-kanban-item.cjs.entry.js +1 -1
  16. package/dist/cjs/limebb-lime-query-builder.cjs.entry.js +68 -179
  17. package/dist/cjs/limebb-lime-query-filter-and.cjs.entry.js +80 -0
  18. package/dist/cjs/{limebb-limetype-field_2.cjs.entry.js → limebb-lime-query-filter-builder_3.cjs.entry.js} +108 -6
  19. package/dist/cjs/limebb-lime-query-filter-comparison_5.cjs.entry.js +705 -0
  20. package/dist/cjs/limebb-lime-query-filter-expression.cjs.entry.js +45 -0
  21. package/dist/cjs/limebb-lime-query-filter-or.cjs.entry.js +68 -0
  22. package/dist/cjs/limebb-limeobject-file-viewer.cjs.entry.js +1 -1
  23. package/dist/cjs/limebb-live-docs-info.cjs.entry.js +2 -2
  24. package/dist/cjs/limebb-loader.cjs.entry.js +1 -1
  25. package/dist/cjs/limebb-locale-picker.cjs.entry.js +2 -2
  26. package/dist/cjs/limebb-mention-group-counter.cjs.entry.js +2 -2
  27. package/dist/cjs/limebb-mention.cjs.entry.js +1 -1
  28. package/dist/cjs/limebb-navigation-button_2.cjs.entry.js +3 -3
  29. package/dist/cjs/limebb-notification-item.cjs.entry.js +2 -2
  30. package/dist/cjs/limebb-notification-list.cjs.entry.js +1 -1
  31. package/dist/cjs/limebb-percentage-visualizer.cjs.entry.js +2 -2
  32. package/dist/cjs/limebb-text-editor.cjs.entry.js +3 -3
  33. package/dist/cjs/limebb-trend-indicator.cjs.entry.js +1 -1
  34. package/dist/cjs/{limetype-1fe0207f.js → limetype-f2e4376e.js} +1 -1
  35. package/dist/cjs/loader.cjs.js +1 -1
  36. package/dist/collection/collection-manifest.json +2 -0
  37. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-and.js +41 -49
  38. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-builder.css +5 -0
  39. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-builder.js +225 -0
  40. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-comparison.js +77 -41
  41. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-expression.js +35 -46
  42. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-group.css +130 -0
  43. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-group.js +269 -0
  44. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-not.js +19 -25
  45. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-or.js +34 -34
  46. package/dist/collection/components/lime-query-builder/lime-query-builder.js +11 -26
  47. package/dist/collection/components/lime-query-builder/limetype-field/limetype-field.js +1 -1
  48. package/dist/collection/components/limeobject/file-viewer/live-docs-info.js +2 -2
  49. package/dist/collection/components/locale-picker/locale-picker.js +1 -1
  50. package/dist/collection/components/notification-list/notification-item/notification-item.js +1 -1
  51. package/dist/collection/components/percentage-visualizer/percentage-visualizer.js +2 -2
  52. package/dist/collection/components/summary-popover/summary-popover.js +3 -3
  53. package/dist/collection/components/text-editor/mention-group-counter.js +2 -2
  54. package/dist/collection/components/text-editor/text-editor.js +1 -1
  55. package/dist/collection/components/trend-indicator/trend-indicator.js +1 -1
  56. package/dist/components/index.esm.js +2 -1
  57. package/dist/components/lime-query-filter-builder.js +129 -0
  58. package/dist/components/lime-query-filter-comparison.js +32 -45
  59. package/dist/components/lime-query-filter-expression.js +315 -0
  60. package/dist/components/limebb-lime-query-builder.js +73 -182
  61. package/dist/components/limebb-lime-query-filter-and.js +130 -1
  62. package/dist/components/limebb-lime-query-filter-builder.d.ts +11 -0
  63. package/dist/components/limebb-lime-query-filter-builder.js +6 -0
  64. package/dist/components/limebb-lime-query-filter-comparison.js +1 -1
  65. package/dist/components/limebb-lime-query-filter-expression.js +1 -1
  66. package/dist/components/limebb-lime-query-filter-group.d.ts +11 -0
  67. package/dist/components/limebb-lime-query-filter-group.js +6 -0
  68. package/dist/components/limebb-lime-query-filter-not.js +1 -1
  69. package/dist/components/limebb-lime-query-filter-or.js +118 -1
  70. package/dist/components/limebb-locale-picker.js +1 -1
  71. package/dist/components/limebb-mention-group-counter.js +2 -2
  72. package/dist/components/limebb-percentage-visualizer.js +2 -2
  73. package/dist/components/limebb-text-editor.js +1 -1
  74. package/dist/components/limebb-trend-indicator.js +1 -1
  75. package/dist/components/limetype-field.js +34 -2
  76. package/dist/components/live-docs-info.js +2 -2
  77. package/dist/components/notification-item.js +1 -1
  78. package/dist/components/summary-popover.js +3 -3
  79. package/dist/esm/{index.esm-d8fdeb18.js → index.esm-bb569663.js} +2 -1
  80. package/dist/esm/lime-crm-building-blocks.js +1 -1
  81. package/dist/esm/limebb-browser.entry.js +1 -1
  82. package/dist/esm/limebb-chat-item_2.entry.js +1 -1
  83. package/dist/esm/limebb-chat-list.entry.js +1 -1
  84. package/dist/esm/limebb-component-config.entry.js +1 -1
  85. package/dist/esm/limebb-component-picker.entry.js +1 -1
  86. package/dist/esm/limebb-currency-picker.entry.js +1 -1
  87. package/dist/esm/limebb-date-picker.entry.js +1 -1
  88. package/dist/esm/limebb-feed-timeline-item.entry.js +1 -1
  89. package/dist/esm/limebb-feed.entry.js +1 -1
  90. package/dist/esm/limebb-info-tile.entry.js +1 -1
  91. package/dist/esm/limebb-kanban-group.entry.js +1 -1
  92. package/dist/esm/limebb-kanban-item.entry.js +1 -1
  93. package/dist/esm/limebb-lime-query-builder.entry.js +67 -178
  94. package/dist/esm/limebb-lime-query-filter-and.entry.js +76 -0
  95. package/dist/esm/{limebb-limetype-field_2.entry.js → limebb-lime-query-filter-builder_3.entry.js} +107 -6
  96. package/dist/esm/limebb-lime-query-filter-comparison_5.entry.js +697 -0
  97. package/dist/esm/limebb-lime-query-filter-expression.entry.js +41 -0
  98. package/dist/esm/limebb-lime-query-filter-or.entry.js +64 -0
  99. package/dist/esm/limebb-limeobject-file-viewer.entry.js +1 -1
  100. package/dist/esm/limebb-live-docs-info.entry.js +2 -2
  101. package/dist/esm/limebb-loader.entry.js +1 -1
  102. package/dist/esm/limebb-locale-picker.entry.js +2 -2
  103. package/dist/esm/limebb-mention-group-counter.entry.js +2 -2
  104. package/dist/esm/limebb-mention.entry.js +1 -1
  105. package/dist/esm/limebb-navigation-button_2.entry.js +3 -3
  106. package/dist/esm/limebb-notification-item.entry.js +2 -2
  107. package/dist/esm/limebb-notification-list.entry.js +1 -1
  108. package/dist/esm/limebb-percentage-visualizer.entry.js +2 -2
  109. package/dist/esm/limebb-text-editor.entry.js +3 -3
  110. package/dist/esm/limebb-trend-indicator.entry.js +1 -1
  111. package/dist/esm/{limetype-6e7552a7.js → limetype-c0e041f7.js} +1 -1
  112. package/dist/esm/loader.js +1 -1
  113. package/dist/lime-crm-building-blocks/lime-crm-building-blocks.esm.js +1 -1
  114. package/dist/lime-crm-building-blocks/{p-a1818969.entry.js → p-03af0e66.entry.js} +1 -1
  115. package/dist/lime-crm-building-blocks/{p-f402184f.entry.js → p-098ee6c1.entry.js} +1 -1
  116. package/dist/lime-crm-building-blocks/{p-42e52b50.entry.js → p-1be0eec7.entry.js} +1 -1
  117. package/dist/lime-crm-building-blocks/{p-2aa18c2b.entry.js → p-206575e4.entry.js} +1 -1
  118. package/dist/lime-crm-building-blocks/p-20bfca36.js +1 -0
  119. package/dist/lime-crm-building-blocks/p-24aeb928.entry.js +1 -0
  120. package/dist/lime-crm-building-blocks/{p-82d33d43.entry.js → p-2faaacbc.entry.js} +1 -1
  121. package/dist/lime-crm-building-blocks/{p-d4016891.entry.js → p-2fdcb868.entry.js} +1 -1
  122. package/dist/lime-crm-building-blocks/{p-f52125a0.entry.js → p-3122ea05.entry.js} +1 -1
  123. package/dist/lime-crm-building-blocks/{p-baf4e428.entry.js → p-3175883d.entry.js} +1 -1
  124. package/dist/lime-crm-building-blocks/{p-8c8b7115.entry.js → p-32534eb7.entry.js} +1 -1
  125. package/dist/lime-crm-building-blocks/{p-6c1146ca.entry.js → p-36ea13c0.entry.js} +1 -1
  126. package/dist/lime-crm-building-blocks/p-422f6d51.entry.js +1 -0
  127. package/dist/lime-crm-building-blocks/{p-1fba0ade.js → p-4838284a.js} +1 -1
  128. package/dist/lime-crm-building-blocks/{p-5e4ba110.entry.js → p-5464f0de.entry.js} +1 -1
  129. package/dist/lime-crm-building-blocks/{p-e9d23ef7.entry.js → p-569c86b5.entry.js} +1 -1
  130. package/dist/lime-crm-building-blocks/{p-90e1716a.entry.js → p-5dc574a3.entry.js} +1 -1
  131. package/dist/lime-crm-building-blocks/{p-00da9b24.entry.js → p-631ca5a5.entry.js} +1 -1
  132. package/dist/lime-crm-building-blocks/p-67dbaa4c.entry.js +1 -0
  133. package/dist/lime-crm-building-blocks/p-6d119dab.entry.js +1 -0
  134. package/dist/lime-crm-building-blocks/{p-beb0d164.entry.js → p-7271f47a.entry.js} +1 -1
  135. package/dist/lime-crm-building-blocks/{p-34357744.entry.js → p-9031f136.entry.js} +1 -1
  136. package/dist/lime-crm-building-blocks/p-91732502.entry.js +1 -0
  137. package/dist/lime-crm-building-blocks/{p-8c4eb49f.entry.js → p-93cadc1e.entry.js} +1 -1
  138. package/dist/lime-crm-building-blocks/{p-3932077b.entry.js → p-9cac4de2.entry.js} +1 -1
  139. package/dist/lime-crm-building-blocks/{p-79d4668a.entry.js → p-a200954f.entry.js} +1 -1
  140. package/dist/lime-crm-building-blocks/p-b198194a.entry.js +1 -0
  141. package/dist/lime-crm-building-blocks/{p-d89c44ad.entry.js → p-b9b954d9.entry.js} +1 -1
  142. package/dist/lime-crm-building-blocks/{p-3a620226.entry.js → p-cfa1a4ad.entry.js} +1 -1
  143. package/dist/lime-crm-building-blocks/{p-ef8a5266.entry.js → p-e8946134.entry.js} +1 -1
  144. package/dist/lime-crm-building-blocks/{p-9d9f25da.entry.js → p-eb81bceb.entry.js} +1 -1
  145. package/dist/lime-crm-building-blocks/{p-50d3d61a.entry.js → p-ee1b00b9.entry.js} +1 -1
  146. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-and.d.ts +5 -4
  147. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-builder.d.ts +50 -0
  148. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-comparison.d.ts +6 -4
  149. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-expression.d.ts +10 -14
  150. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-group.d.ts +60 -0
  151. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-not.d.ts +4 -4
  152. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-or.d.ts +5 -4
  153. package/dist/types/components/lime-query-builder/lime-query-builder.d.ts +1 -0
  154. package/dist/types/components/lime-query-builder/lime-query.types.d.ts +2 -1
  155. package/dist/types/components.d.ts +293 -65
  156. package/package.json +1 -1
  157. package/dist/cjs/isEqual-e77cce75.js +0 -37
  158. package/dist/cjs/lime-query.types-bcb63a22.js +0 -61
  159. package/dist/cjs/limebb-lime-query-filter-and_5.cjs.entry.js +0 -278
  160. package/dist/cjs/limebb-lime-query-value-input.cjs.entry.js +0 -239
  161. package/dist/cjs/limebb-property-selector.cjs.entry.js +0 -234
  162. package/dist/components/isEqual.js +0 -35
  163. package/dist/components/lime-query-filter-and.js +0 -408
  164. package/dist/esm/isEqual-57d0c223.js +0 -35
  165. package/dist/esm/lime-query.types-f72355e1.js +0 -59
  166. package/dist/esm/limebb-lime-query-filter-and_5.entry.js +0 -270
  167. package/dist/esm/limebb-lime-query-value-input.entry.js +0 -235
  168. package/dist/esm/limebb-property-selector.entry.js +0 -230
  169. package/dist/lime-crm-building-blocks/p-02c0cc04.entry.js +0 -1
  170. package/dist/lime-crm-building-blocks/p-0957b2a6.entry.js +0 -1
  171. package/dist/lime-crm-building-blocks/p-3b0a15ec.js +0 -1
  172. package/dist/lime-crm-building-blocks/p-5a6d2e7f.js +0 -1
  173. package/dist/lime-crm-building-blocks/p-60971d64.js +0 -1
  174. package/dist/lime-crm-building-blocks/p-70a28b93.entry.js +0 -1
  175. package/dist/lime-crm-building-blocks/p-96beaabc.entry.js +0 -1
  176. package/dist/lime-crm-building-blocks/p-f99c611d.entry.js +0 -1
@@ -3,66 +3,67 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-ff255a0d.js');
6
- const index_esm = require('./index.esm-a894ac76.js');
7
- const limeQuery_types = require('./lime-query.types-bcb63a22.js');
6
+ const index_esm = require('./index.esm-d785eb6e.js');
8
7
  const propertyResolution = require('./property-resolution-fb42a46b.js');
9
8
 
10
9
  /**
11
- * Convert UI filter representation to Lime Query filter format
12
- * @param filter
10
+ * TypeScript type definitions for Lime Query DSL
11
+ *
12
+ * These types represent the structure of Lime Query as defined in:
13
+ * - lime-core/lime_query/schema.py
14
+ * - lime-core/lime_filter/schema.py
13
15
  */
14
- function guiFilterToLimeQuery(filter) {
15
- if (filter.filter_type === '') {
16
- return undefined;
17
- }
18
- if (filter.filter_type === 'comparison') {
19
- return {
20
- key: filter.property,
21
- op: filter.operator,
22
- exp: filter.value,
23
- };
24
- }
25
- if (filter.filter_type === 'AND') {
26
- const expressions = filter.expressions
27
- .map(guiFilterToLimeQuery)
28
- .filter((f) => f !== undefined);
29
- if (expressions.length === 0) {
30
- return undefined;
31
- }
32
- if (expressions.length === 1) {
33
- return expressions[0];
34
- }
35
- return {
36
- op: 'AND',
37
- exp: expressions,
38
- };
39
- }
40
- if (filter.filter_type === 'OR') {
41
- const expressions = filter.expressions
42
- .map(guiFilterToLimeQuery)
43
- .filter((f) => f !== undefined);
44
- if (expressions.length === 0) {
45
- return undefined;
46
- }
47
- if (expressions.length === 1) {
48
- return expressions[0];
49
- }
50
- return {
51
- op: 'OR',
52
- exp: expressions,
53
- };
54
- }
55
- if (filter.filter_type === 'NOT') {
56
- const innerFilter = guiFilterToLimeQuery(filter.expression);
57
- if (innerFilter) {
58
- return {
59
- op: '!',
60
- exp: innerFilter,
61
- };
62
- }
63
- }
64
- return undefined;
65
- }
16
+ /**
17
+ * Available operators with display metadata
18
+ */
19
+ const LIME_QUERY_OPERATORS = [
20
+ { value: '=', label: 'Equals', icon: 'equals' },
21
+ { value: '!=', label: 'Not Equals', icon: 'not-equal' },
22
+ {
23
+ value: '>',
24
+ label: 'Greater Than',
25
+ icon: 'greater-than',
26
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
27
+ },
28
+ {
29
+ value: '>=',
30
+ label: 'Greater or Equal',
31
+ icon: 'greater-or-equal',
32
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
33
+ },
34
+ {
35
+ value: '<',
36
+ label: 'Less Than',
37
+ icon: 'less-than',
38
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
39
+ },
40
+ {
41
+ value: '<=',
42
+ label: 'Less or Equal',
43
+ icon: 'less-or-equal',
44
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
45
+ },
46
+ { value: 'IN', label: 'In List', icon: 'list' },
47
+ {
48
+ value: '?',
49
+ label: 'Contains',
50
+ icon: '-lime-filter-contain',
51
+ applicableTypes: ['string', 'text'],
52
+ },
53
+ {
54
+ value: '=?',
55
+ label: 'Begins With',
56
+ icon: '-lime-filter-begin',
57
+ applicableTypes: ['string', 'text'],
58
+ },
59
+ {
60
+ value: '=$',
61
+ label: 'Ends With',
62
+ icon: '-lime-filter-end',
63
+ applicableTypes: ['string', 'text'],
64
+ },
65
+ ];
66
+
66
67
  /**
67
68
  * Validate and convert a FilterExpression (comparison filter)
68
69
  * @param filter
@@ -73,7 +74,7 @@ function validateAndConvertFilterExpression(filter) {
73
74
  throw new Error('Invalid filter: comparison must have key, op, and exp properties');
74
75
  }
75
76
  // Validate operator is supported
76
- const supportedOps = limeQuery_types.LIME_QUERY_OPERATORS.map((o) => o.value);
77
+ const supportedOps = LIME_QUERY_OPERATORS.map((o) => o.value);
77
78
  if (!supportedOps.includes(filter.op)) {
78
79
  throw new Error(`Unsupported filter operator: ${filter.op}`);
79
80
  }
@@ -164,103 +165,6 @@ function limeQueryToGuiFilter(filter) {
164
165
  // It's a FilterGroup
165
166
  return validateAndConvertFilterGroup(filter);
166
167
  }
167
- /**
168
- * Normalize filter for GUI mode by ensuring proper AND/OR wrapper structure.
169
- * GUI mode requires filters to be wrapped in AND([OR(...)]) so users have
170
- * access to add/remove buttons on the AND and OR components.
171
- *
172
- * This function ensures that:
173
- * - Single comparisons are wrapped in AND([OR([comparison])])
174
- * - OR groups are wrapped in AND([OR group])
175
- * - AND groups have their comparison children wrapped in OR
176
- * - Empty/undefined filters become AND([])
177
- *
178
- * When converting back to Lime Query JSON, limeQueryFilterToLimeQuery()
179
- * automatically unwraps single-item AND/OR groups.
180
- *
181
- * @param filter The filter expression from limeQueryToLimeQueryFilter
182
- * @returns Normalized filter suitable for GUI editing
183
- */
184
- function normalizeLimeQueryFilterForGui(filter) {
185
- // Empty AND is already correct for GUI
186
- if (filter.filter_type === 'AND' && filter.expressions.length === 0) {
187
- return filter;
188
- }
189
- // Single comparison needs wrapping
190
- if (filter.filter_type === 'comparison') {
191
- return {
192
- filter_type: 'AND',
193
- expressions: [
194
- {
195
- filter_type: 'OR',
196
- expressions: [filter],
197
- },
198
- ],
199
- };
200
- }
201
- // OR needs wrapping in AND
202
- if (filter.filter_type === 'OR') {
203
- return {
204
- filter_type: 'AND',
205
- expressions: [filter],
206
- };
207
- }
208
- // NOT needs wrapping
209
- if (filter.filter_type === 'NOT') {
210
- return {
211
- filter_type: 'AND',
212
- expressions: [
213
- {
214
- filter_type: 'OR',
215
- expressions: [filter],
216
- },
217
- ],
218
- };
219
- }
220
- // AND group - check if children need OR wrappers
221
- if (filter.filter_type === 'AND') {
222
- const normalizedChildren = filter.expressions.map((child) => {
223
- // If child is already OR, keep it
224
- if (child.filter_type === 'OR') {
225
- return child;
226
- }
227
- // If child is NOT, keep it (NOT can be a direct child of AND)
228
- if (child.filter_type === 'NOT') {
229
- return child;
230
- }
231
- // If child is comparison, wrap in OR
232
- if (child.filter_type === 'comparison') {
233
- return {
234
- filter_type: 'OR',
235
- expressions: [child],
236
- };
237
- }
238
- // If child is nested AND, recursively normalize and wrap in OR
239
- if (child.filter_type === 'AND') {
240
- return {
241
- filter_type: 'OR',
242
- expressions: [normalizeLimeQueryFilterForGui(child)],
243
- };
244
- }
245
- // Unknown filter type, keep as is
246
- return child;
247
- });
248
- return {
249
- filter_type: 'AND',
250
- expressions: normalizedChildren,
251
- };
252
- }
253
- // Fallback: wrap in AND/OR structure
254
- return {
255
- filter_type: 'AND',
256
- expressions: [
257
- {
258
- filter_type: 'OR',
259
- expressions: [filter],
260
- },
261
- ],
262
- };
263
- }
264
168
 
265
169
  /**
266
170
  * Dynamic filter values and placeholders that are valid in Lime Query
@@ -659,18 +563,11 @@ const LimeQueryBuilder = class {
659
563
  this.mode = 'gui';
660
564
  this.codeValue = '';
661
565
  this.limetype = '';
662
- this.filter = {
663
- filter_type: 'AND',
664
- expressions: [],
665
- };
666
566
  this.handleLimetypeChange = (event) => {
667
567
  event.stopPropagation();
668
568
  this.limetype = event.detail;
669
569
  // Reset filter when limetype changes
670
- this.filter = {
671
- filter_type: 'AND',
672
- expressions: [],
673
- };
570
+ this.filter = undefined;
674
571
  // Reset response format when limetype changes
675
572
  this.internalResponseFormat = {
676
573
  object: {
@@ -680,17 +577,9 @@ const LimeQueryBuilder = class {
680
577
  this.emitChange();
681
578
  };
682
579
  this.handleFilterChange = (event) => {
580
+ var _a;
683
581
  event.stopPropagation();
684
- // Convert missing expression back to empty AND to keep the UI consistent
685
- if (event.detail.filter_type === '') {
686
- this.filter = {
687
- filter_type: 'AND',
688
- expressions: [],
689
- };
690
- }
691
- else {
692
- this.filter = event.detail;
693
- }
582
+ this.filter = (_a = event.detail) !== null && _a !== void 0 ? _a : undefined;
694
583
  this.emitChange();
695
584
  };
696
585
  this.handleResponseFormatChange = (event) => {
@@ -716,7 +605,7 @@ const LimeQueryBuilder = class {
716
605
  }
717
606
  // Update internal state from parsed query
718
607
  this.limetype = parsed.limetype || '';
719
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(parsed.filter));
608
+ this.filter = parsed.filter;
720
609
  this.internalResponseFormat = parsed.responseFormat;
721
610
  this.limit = parsed.limit;
722
611
  this.mode = 'gui';
@@ -757,7 +646,7 @@ const LimeQueryBuilder = class {
757
646
  }
758
647
  if (this.value) {
759
648
  this.limetype = this.value.limetype || '';
760
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(this.value.filter));
649
+ this.filter = this.value.filter;
761
650
  this.internalResponseFormat = this.value.responseFormat;
762
651
  this.limit = this.value.limit;
763
652
  }
@@ -772,7 +661,7 @@ const LimeQueryBuilder = class {
772
661
  render() {
773
662
  const guiSupported = this.checkGuiSupport();
774
663
  const showCodeMode = !this.guiModeEnabled || this.mode === 'code';
775
- return (index.h("div", { key: '96d1a933f699404c3806af3742e9ad30d53562aa', class: "lime-query-builder" }, this.renderLabel(), this.renderModeControls(guiSupported), showCodeMode
664
+ return (index.h("div", { key: '0b4d2bb5b4d503a775d8d3215e1e4c74fdb1eceb', class: "lime-query-builder" }, this.renderLabel(), this.renderModeControls(guiSupported), showCodeMode
776
665
  ? this.renderCodeMode(guiSupported)
777
666
  : this.renderGuiMode()));
778
667
  }
@@ -793,7 +682,7 @@ const LimeQueryBuilder = class {
793
682
  const limeQuery = {
794
683
  limetype: this.limetype,
795
684
  responseFormat: responseFormat,
796
- filter: guiFilterToLimeQuery(this.filter),
685
+ filter: this.filter,
797
686
  };
798
687
  if (this.limit !== undefined && this.limit > 0) {
799
688
  limeQuery.limit = this.limit;
@@ -814,7 +703,7 @@ const LimeQueryBuilder = class {
814
703
  const limeQuery = {
815
704
  limetype: this.limetype,
816
705
  responseFormat: responseFormat,
817
- filter: guiFilterToLimeQuery(this.filter),
706
+ filter: this.filter,
818
707
  };
819
708
  if (this.limit !== undefined && this.limit > 0) {
820
709
  limeQuery.limit = this.limit;
@@ -865,7 +754,7 @@ const LimeQueryBuilder = class {
865
754
  queryToCheck = {
866
755
  limetype: this.limetype,
867
756
  responseFormat: responseFormat,
868
- filter: guiFilterToLimeQuery(this.filter),
757
+ filter: this.filter,
869
758
  };
870
759
  if (this.limit !== undefined && this.limit > 0) {
871
760
  queryToCheck.limit = this.limit;
@@ -897,7 +786,7 @@ const LimeQueryBuilder = class {
897
786
  if (!this.limetype) {
898
787
  return;
899
788
  }
900
- return (index.h("div", { class: "filter-section" }, index.h("h4", { class: "section-label" }, "Filter Conditions"), index.h("limebb-lime-query-filter-expression", { platform: this.platform, context: this.context, limetype: this.limetype, activeLimetype: this.activeLimetype, expression: this.filter, onExpressionChange: this.handleFilterChange })));
789
+ return (index.h("div", { class: "filter-section" }, index.h("h4", { class: "section-label" }, "Filter Conditions"), index.h("limebb-lime-query-filter-builder", { platform: this.platform, context: this.context, limetype: this.limetype, activeLimetype: this.activeLimetype, expression: this.filter, onExpressionChange: this.handleFilterChange })));
901
790
  }
902
791
  renderQueryOptionsSection() {
903
792
  var _a;
@@ -0,0 +1,80 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const index = require('./index-ff255a0d.js');
6
+ const index_esm = require('./index.esm-d785eb6e.js');
7
+
8
+ const limeQueryFilterAndCss = "@charset \"UTF-8\";.expression{display:flex;flex-direction:column;margin-bottom:1rem;gap:0;background-color:rgb(var(--contrast-100));border:1px solid rgb(var(--contrast-500));border-radius:0.75rem}.expression>ul{margin-top:0;margin-right:1rem;margin-bottom:1rem;margin-left:1rem;padding-left:1rem;list-style:disc}.expression>ul li{margin-top:1rem}.expression>ul li.add-button{list-style:none}";
9
+ const LimebbLimeQueryFilterAndStyle0 = limeQueryFilterAndCss;
10
+
11
+ const LimeQueryFilterAndComponent = class {
12
+ constructor(hostRef) {
13
+ index.registerInstance(this, hostRef);
14
+ this.expressionChange = index.createEvent(this, "expressionChange", 7);
15
+ this.renderChildExpression = (expression, childIndex) => (index.h("li", null, index.h("limebb-lime-query-filter-expression", { platform: this.platform, context: this.context, limetype: this.limetype, activeLimetype: this.activeLimetype, expression: expression, onExpressionChange: this.handleExpressionChange(childIndex) })));
16
+ this.handleAddChildExpression = () => {
17
+ const newOrGroup = {
18
+ op: index_esm.Zt.OR,
19
+ exp: [
20
+ {
21
+ key: '',
22
+ op: index_esm.Zt.EQUALS,
23
+ exp: '',
24
+ },
25
+ ],
26
+ };
27
+ const updatedExpressionsList = [
28
+ ...this.expression.exp,
29
+ newOrGroup,
30
+ ];
31
+ this.expressionChange.emit({
32
+ op: index_esm.Zt.AND,
33
+ exp: updatedExpressionsList,
34
+ });
35
+ };
36
+ this.handleExpressionChange = (updatedChildIndex) => (event) => {
37
+ var _a;
38
+ event.stopPropagation();
39
+ const updatedExpression = (_a = event.detail) !== null && _a !== void 0 ? _a : undefined;
40
+ const expressions = [...this.expression.exp];
41
+ if (updatedExpression === undefined) {
42
+ expressions.splice(updatedChildIndex, 1);
43
+ }
44
+ else {
45
+ expressions[updatedChildIndex] = updatedExpression;
46
+ }
47
+ if (expressions.length === 0) {
48
+ this.expressionChange.emit(undefined);
49
+ return;
50
+ }
51
+ if (expressions.length === 1) {
52
+ this.expressionChange.emit(expressions[0]);
53
+ return;
54
+ }
55
+ this.expressionChange.emit({
56
+ op: index_esm.Zt.AND,
57
+ exp: expressions,
58
+ });
59
+ };
60
+ }
61
+ render() {
62
+ let subheading = 'All of these conditions are true';
63
+ if (this.expression.exp.length <= 1) {
64
+ subheading = '';
65
+ }
66
+ return (index.h("div", { key: 'f07c53808d6be8d846f5a45223abb5c94b1a0b16', class: "expression" }, (this.label || subheading) && (index.h("limel-header", { key: '229f0d58ff15743fbb12da53ad9c593bfba801d1', heading: this.label, subheading: subheading })), index.h("ul", { key: '2600c2bee2b958036ea606141bcfcac0e277114c' }, this.expression.exp.map(this.renderChildExpression), index.h("li", { key: '6395e605ee8f454a820ac73601da89b19686187a', class: "add-button" }, this.renderAddChildExpression()))));
67
+ }
68
+ renderAddChildExpression() {
69
+ return (index.h("limel-button", { label: this.getAddButtonLabel(), icon: "plus_math", onClick: this.handleAddChildExpression }));
70
+ }
71
+ getAddButtonLabel() {
72
+ if (this.expression.exp.length === 0) {
73
+ return 'Add a condition';
74
+ }
75
+ return 'Add another condition';
76
+ }
77
+ };
78
+ LimeQueryFilterAndComponent.style = LimebbLimeQueryFilterAndStyle0;
79
+
80
+ exports.limebb_lime_query_filter_and = LimeQueryFilterAndComponent;
@@ -3,12 +3,11 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-ff255a0d.js');
6
- const index_esm = require('./index.esm-a894ac76.js');
7
- const limetype = require('./limetype-1fe0207f.js');
6
+ const index_esm = require('./index.esm-d785eb6e.js');
7
+ const limetype = require('./limetype-f2e4376e.js');
8
8
  const nonNull = require('./non-null-3bf14aa1.js');
9
- const isEqual = require('./isEqual-e77cce75.js');
9
+ const _baseIsEqual = require('./_baseIsEqual-cb7951b0.js');
10
10
  const _Map = require('./_Map-60aae0ed.js');
11
- require('./_baseIsEqual-cb7951b0.js');
12
11
  require('./_Uint8Array-95263550.js');
13
12
  require('./_MapCache-8b125fbb.js');
14
13
  require('./_getTag-8809c5c6.js');
@@ -38,6 +37,108 @@ function isString(value) {
38
37
  (!_Map.isArray(value) && _Map.isObjectLike(value) && _Map.baseGetTag(value) == stringTag);
39
38
  }
40
39
 
40
+ /**
41
+ * Performs a deep comparison between two values to determine if they are
42
+ * equivalent.
43
+ *
44
+ * **Note:** This method supports comparing arrays, array buffers, booleans,
45
+ * date objects, error objects, maps, numbers, `Object` objects, regexes,
46
+ * sets, strings, symbols, and typed arrays. `Object` objects are compared
47
+ * by their own, not inherited, enumerable properties. Functions and DOM
48
+ * nodes are compared by strict equality, i.e. `===`.
49
+ *
50
+ * @static
51
+ * @memberOf _
52
+ * @since 0.1.0
53
+ * @category Lang
54
+ * @param {*} value The value to compare.
55
+ * @param {*} other The other value to compare.
56
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
57
+ * @example
58
+ *
59
+ * var object = { 'a': 1 };
60
+ * var other = { 'a': 1 };
61
+ *
62
+ * _.isEqual(object, other);
63
+ * // => true
64
+ *
65
+ * object === other;
66
+ * // => false
67
+ */
68
+ function isEqual(value, other) {
69
+ return _baseIsEqual.baseIsEqual(value, other);
70
+ }
71
+
72
+ const limeQueryFilterBuilderCss = ".expression-with-promotion{display:flex;flex-direction:column;gap:1rem}";
73
+ const LimebbLimeQueryFilterBuilderStyle0 = limeQueryFilterBuilderCss;
74
+
75
+ const LimeQueryFilterBuilderComponent = class {
76
+ constructor(hostRef) {
77
+ index.registerInstance(this, hostRef);
78
+ this.expressionChange = index.createEvent(this, "expressionChange", 7);
79
+ this.handleAddFirstCondition = () => {
80
+ const newExpression = {
81
+ key: '',
82
+ op: index_esm.Zt.EQUALS,
83
+ exp: '',
84
+ };
85
+ this.expressionChange.emit(newExpression);
86
+ };
87
+ this.handlePromoteAndAdd = () => {
88
+ if (!this.expression) {
89
+ return;
90
+ }
91
+ // Wrap current expression in AND and add a new comparison
92
+ const newExpression = {
93
+ op: index_esm.Zt.AND,
94
+ exp: [
95
+ this.expression,
96
+ {
97
+ key: '',
98
+ op: index_esm.Zt.EQUALS,
99
+ exp: '',
100
+ },
101
+ ],
102
+ };
103
+ this.expressionChange.emit(newExpression);
104
+ };
105
+ this.handleExpressionChange = (event) => {
106
+ var _a;
107
+ event.stopPropagation();
108
+ this.expressionChange.emit((_a = event.detail) !== null && _a !== void 0 ? _a : undefined);
109
+ };
110
+ }
111
+ render() {
112
+ if (!this.expression) {
113
+ return this.renderEmptyState();
114
+ }
115
+ // Check if we need to show promotion UI (comparison or NOT)
116
+ if (this.needsPromotion()) {
117
+ return this.renderWithPromotionButton();
118
+ }
119
+ // AND/OR groups handle their own Add buttons
120
+ return (index.h("limebb-lime-query-filter-expression", { platform: this.platform, context: this.context, limetype: this.limetype, activeLimetype: this.activeLimetype, expression: this.expression, onExpressionChange: this.handleExpressionChange }));
121
+ }
122
+ needsPromotion() {
123
+ if (!this.expression) {
124
+ return false;
125
+ }
126
+ // Basic comparison needs promotion
127
+ if ('key' in this.expression) {
128
+ return true;
129
+ }
130
+ // NOT needs promotion
131
+ return this.expression.op === index_esm.Zt.NOT;
132
+ }
133
+ renderEmptyState() {
134
+ return (index.h("limel-button", { label: "Add a condition", icon: "plus_math", onClick: this.handleAddFirstCondition }));
135
+ }
136
+ renderWithPromotionButton() {
137
+ return (index.h("div", { class: "expression-with-promotion" }, index.h("limebb-lime-query-filter-expression", { platform: this.platform, context: this.context, limetype: this.limetype, activeLimetype: this.activeLimetype, expression: this.expression, onExpressionChange: this.handleExpressionChange }), index.h("limel-button", { label: "Add another condition", icon: "plus_math", onClick: this.handlePromoteAndAdd })));
138
+ }
139
+ };
140
+ LimeQueryFilterBuilderComponent.style = LimebbLimeQueryFilterBuilderStyle0;
141
+
41
142
  const RELATION_PROPERTY_TYPES = [
42
143
  'belongsto',
43
144
  'hasone',
@@ -102,7 +203,7 @@ const LimetypeField = class {
102
203
  componentShouldUpdate(newValue, oldValue, property) {
103
204
  var _a, _b;
104
205
  return (property !== 'formInfo' ||
105
- !isEqual.isEqual((_a = newValue === null || newValue === void 0 ? void 0 : newValue.schema) === null || _a === void 0 ? void 0 : _a.oneOf, (_b = oldValue === null || oldValue === void 0 ? void 0 : oldValue.schema) === null || _b === void 0 ? void 0 : _b.oneOf));
206
+ !isEqual((_a = newValue === null || newValue === void 0 ? void 0 : newValue.schema) === null || _a === void 0 ? void 0 : _a.oneOf, (_b = oldValue === null || oldValue === void 0 ? void 0 : oldValue.schema) === null || _b === void 0 ? void 0 : _b.oneOf));
106
207
  }
107
208
  render() {
108
209
  var _a;
@@ -123,7 +224,7 @@ const LimetypeField = class {
123
224
  value: '',
124
225
  };
125
226
  options.unshift(emptyOption);
126
- return (index.h("limel-select", { key: '82ce4b92e4ff1285e259f07a35634df722f5baab', label: this.label, options: options, value: selectedOption, required: this.required, helperText: this.helperText, invalid: invalid, disabled: this.disabled || this.readonly, onChange: this.handleChange }));
227
+ return (index.h("limel-select", { key: 'cf27b83c4751838e85436af443a275b3d7c9dfee', label: this.label, options: options, value: selectedOption, required: this.required, helperText: this.helperText, invalid: invalid, disabled: this.disabled || this.readonly, onChange: this.handleChange }));
127
228
  }
128
229
  componentWillRender() {
129
230
  this.updatePropertyFields(this.value || '');
@@ -402,5 +503,6 @@ const ResponseFormatEditor = class {
402
503
  };
403
504
  ResponseFormatEditor.style = LimebbResponseFormatEditorStyle0;
404
505
 
506
+ exports.limebb_lime_query_filter_builder = LimeQueryFilterBuilderComponent;
405
507
  exports.limebb_limetype_field = LimetypeField;
406
508
  exports.limebb_response_format_editor = ResponseFormatEditor;