@limetech/lime-crm-building-blocks 1.98.0 → 1.99.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 (170) hide show
  1. package/CHANGELOG.md +7 -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 +89 -169
  17. package/dist/cjs/limebb-lime-query-filter-and.cjs.entry.js +80 -0
  18. package/dist/cjs/limebb-lime-query-filter-comparison_2.cjs.entry.js +147 -0
  19. package/dist/cjs/limebb-lime-query-filter-group_4.cjs.entry.js +603 -0
  20. package/dist/cjs/limebb-lime-query-filter-or.cjs.entry.js +68 -0
  21. package/dist/cjs/limebb-limeobject-file-viewer.cjs.entry.js +1 -1
  22. package/dist/cjs/limebb-limetype-field_2.cjs.entry.js +37 -6
  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 +1 -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-comparison.js +77 -41
  39. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-expression.js +35 -46
  40. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-group.css +130 -0
  41. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-group.js +269 -0
  42. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-not.js +19 -25
  43. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-or.js +34 -34
  44. package/dist/collection/components/lime-query-builder/lime-query-builder.js +32 -17
  45. package/dist/collection/components/lime-query-builder/limetype-field/limetype-field.js +1 -1
  46. package/dist/collection/components/limeobject/file-viewer/live-docs-info.js +2 -2
  47. package/dist/collection/components/locale-picker/locale-picker.js +1 -1
  48. package/dist/collection/components/notification-list/notification-item/notification-item.js +1 -1
  49. package/dist/collection/components/percentage-visualizer/percentage-visualizer.js +2 -2
  50. package/dist/collection/components/summary-popover/summary-popover.js +3 -3
  51. package/dist/collection/components/text-editor/mention-group-counter.js +2 -2
  52. package/dist/collection/components/text-editor/text-editor.js +1 -1
  53. package/dist/collection/components/trend-indicator/trend-indicator.js +1 -1
  54. package/dist/components/index.esm.js +2 -1
  55. package/dist/components/lime-query-filter-comparison.js +32 -45
  56. package/dist/components/lime-query-filter-expression.js +315 -0
  57. package/dist/components/limebb-lime-query-builder.js +93 -177
  58. package/dist/components/limebb-lime-query-filter-and.js +130 -1
  59. package/dist/components/limebb-lime-query-filter-comparison.js +1 -1
  60. package/dist/components/limebb-lime-query-filter-expression.js +1 -1
  61. package/dist/components/limebb-lime-query-filter-group.d.ts +11 -0
  62. package/dist/components/limebb-lime-query-filter-group.js +6 -0
  63. package/dist/components/limebb-lime-query-filter-not.js +1 -1
  64. package/dist/components/limebb-lime-query-filter-or.js +118 -1
  65. package/dist/components/limebb-locale-picker.js +1 -1
  66. package/dist/components/limebb-mention-group-counter.js +2 -2
  67. package/dist/components/limebb-percentage-visualizer.js +2 -2
  68. package/dist/components/limebb-text-editor.js +1 -1
  69. package/dist/components/limebb-trend-indicator.js +1 -1
  70. package/dist/components/limetype-field.js +34 -2
  71. package/dist/components/live-docs-info.js +2 -2
  72. package/dist/components/notification-item.js +1 -1
  73. package/dist/components/summary-popover.js +3 -3
  74. package/dist/esm/{index.esm-d8fdeb18.js → index.esm-bb569663.js} +2 -1
  75. package/dist/esm/lime-crm-building-blocks.js +1 -1
  76. package/dist/esm/limebb-browser.entry.js +1 -1
  77. package/dist/esm/limebb-chat-item_2.entry.js +1 -1
  78. package/dist/esm/limebb-chat-list.entry.js +1 -1
  79. package/dist/esm/limebb-component-config.entry.js +1 -1
  80. package/dist/esm/limebb-component-picker.entry.js +1 -1
  81. package/dist/esm/limebb-currency-picker.entry.js +1 -1
  82. package/dist/esm/limebb-date-picker.entry.js +1 -1
  83. package/dist/esm/limebb-feed-timeline-item.entry.js +1 -1
  84. package/dist/esm/limebb-feed.entry.js +1 -1
  85. package/dist/esm/limebb-info-tile.entry.js +1 -1
  86. package/dist/esm/limebb-kanban-group.entry.js +1 -1
  87. package/dist/esm/limebb-kanban-item.entry.js +1 -1
  88. package/dist/esm/limebb-lime-query-builder.entry.js +88 -168
  89. package/dist/esm/limebb-lime-query-filter-and.entry.js +76 -0
  90. package/dist/esm/limebb-lime-query-filter-comparison_2.entry.js +142 -0
  91. package/dist/esm/limebb-lime-query-filter-group_4.entry.js +596 -0
  92. package/dist/esm/limebb-lime-query-filter-or.entry.js +64 -0
  93. package/dist/esm/limebb-limeobject-file-viewer.entry.js +1 -1
  94. package/dist/esm/limebb-limetype-field_2.entry.js +36 -5
  95. package/dist/esm/limebb-live-docs-info.entry.js +2 -2
  96. package/dist/esm/limebb-loader.entry.js +1 -1
  97. package/dist/esm/limebb-locale-picker.entry.js +2 -2
  98. package/dist/esm/limebb-mention-group-counter.entry.js +2 -2
  99. package/dist/esm/limebb-mention.entry.js +1 -1
  100. package/dist/esm/limebb-navigation-button_2.entry.js +3 -3
  101. package/dist/esm/limebb-notification-item.entry.js +2 -2
  102. package/dist/esm/limebb-notification-list.entry.js +1 -1
  103. package/dist/esm/limebb-percentage-visualizer.entry.js +2 -2
  104. package/dist/esm/limebb-text-editor.entry.js +3 -3
  105. package/dist/esm/limebb-trend-indicator.entry.js +1 -1
  106. package/dist/esm/{limetype-6e7552a7.js → limetype-c0e041f7.js} +1 -1
  107. package/dist/esm/loader.js +1 -1
  108. package/dist/lime-crm-building-blocks/lime-crm-building-blocks.esm.js +1 -1
  109. package/dist/lime-crm-building-blocks/p-03accd53.entry.js +1 -0
  110. package/dist/lime-crm-building-blocks/{p-a1818969.entry.js → p-03af0e66.entry.js} +1 -1
  111. package/dist/lime-crm-building-blocks/{p-f402184f.entry.js → p-098ee6c1.entry.js} +1 -1
  112. package/dist/lime-crm-building-blocks/{p-42e52b50.entry.js → p-1be0eec7.entry.js} +1 -1
  113. package/dist/lime-crm-building-blocks/{p-2aa18c2b.entry.js → p-206575e4.entry.js} +1 -1
  114. package/dist/lime-crm-building-blocks/p-20bfca36.js +1 -0
  115. package/dist/lime-crm-building-blocks/{p-82d33d43.entry.js → p-2faaacbc.entry.js} +1 -1
  116. package/dist/lime-crm-building-blocks/{p-d4016891.entry.js → p-2fdcb868.entry.js} +1 -1
  117. package/dist/lime-crm-building-blocks/{p-f52125a0.entry.js → p-3122ea05.entry.js} +1 -1
  118. package/dist/lime-crm-building-blocks/{p-baf4e428.entry.js → p-3175883d.entry.js} +1 -1
  119. package/dist/lime-crm-building-blocks/{p-8c8b7115.entry.js → p-32534eb7.entry.js} +1 -1
  120. package/dist/lime-crm-building-blocks/{p-6c1146ca.entry.js → p-36ea13c0.entry.js} +1 -1
  121. package/dist/lime-crm-building-blocks/p-4715210d.entry.js +1 -0
  122. package/dist/lime-crm-building-blocks/{p-1fba0ade.js → p-4838284a.js} +1 -1
  123. package/dist/lime-crm-building-blocks/{p-5e4ba110.entry.js → p-5464f0de.entry.js} +1 -1
  124. package/dist/lime-crm-building-blocks/{p-e9d23ef7.entry.js → p-569c86b5.entry.js} +1 -1
  125. package/dist/lime-crm-building-blocks/{p-90e1716a.entry.js → p-5dc574a3.entry.js} +1 -1
  126. package/dist/lime-crm-building-blocks/p-5f7644b5.entry.js +1 -0
  127. package/dist/lime-crm-building-blocks/{p-00da9b24.entry.js → p-631ca5a5.entry.js} +1 -1
  128. package/dist/lime-crm-building-blocks/p-67dbaa4c.entry.js +1 -0
  129. package/dist/lime-crm-building-blocks/{p-beb0d164.entry.js → p-7271f47a.entry.js} +1 -1
  130. package/dist/lime-crm-building-blocks/{p-34357744.entry.js → p-9031f136.entry.js} +1 -1
  131. package/dist/lime-crm-building-blocks/p-91732502.entry.js +1 -0
  132. package/dist/lime-crm-building-blocks/{p-8c4eb49f.entry.js → p-93cadc1e.entry.js} +1 -1
  133. package/dist/lime-crm-building-blocks/{p-3932077b.entry.js → p-9cac4de2.entry.js} +1 -1
  134. package/dist/lime-crm-building-blocks/{p-79d4668a.entry.js → p-a200954f.entry.js} +1 -1
  135. package/dist/lime-crm-building-blocks/p-aa646df7.entry.js +1 -0
  136. package/dist/lime-crm-building-blocks/{p-d89c44ad.entry.js → p-b9b954d9.entry.js} +1 -1
  137. package/dist/lime-crm-building-blocks/{p-3a620226.entry.js → p-cfa1a4ad.entry.js} +1 -1
  138. package/dist/lime-crm-building-blocks/{p-ef8a5266.entry.js → p-e8946134.entry.js} +1 -1
  139. package/dist/lime-crm-building-blocks/{p-9d9f25da.entry.js → p-eb81bceb.entry.js} +1 -1
  140. package/dist/lime-crm-building-blocks/{p-50d3d61a.entry.js → p-ee1b00b9.entry.js} +1 -1
  141. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-and.d.ts +5 -4
  142. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-comparison.d.ts +6 -4
  143. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-expression.d.ts +10 -14
  144. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-group.d.ts +60 -0
  145. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-not.d.ts +4 -4
  146. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-or.d.ts +5 -4
  147. package/dist/types/components/lime-query-builder/lime-query-builder.d.ts +6 -0
  148. package/dist/types/components/lime-query-builder/lime-query.types.d.ts +2 -1
  149. package/dist/types/components.d.ts +177 -65
  150. package/package.json +1 -1
  151. package/dist/cjs/isEqual-e77cce75.js +0 -37
  152. package/dist/cjs/lime-query.types-bcb63a22.js +0 -61
  153. package/dist/cjs/limebb-lime-query-filter-and_5.cjs.entry.js +0 -278
  154. package/dist/cjs/limebb-lime-query-value-input.cjs.entry.js +0 -239
  155. package/dist/cjs/limebb-property-selector.cjs.entry.js +0 -234
  156. package/dist/components/isEqual.js +0 -35
  157. package/dist/components/lime-query-filter-and.js +0 -408
  158. package/dist/esm/isEqual-57d0c223.js +0 -35
  159. package/dist/esm/lime-query.types-f72355e1.js +0 -59
  160. package/dist/esm/limebb-lime-query-filter-and_5.entry.js +0 -270
  161. package/dist/esm/limebb-lime-query-value-input.entry.js +0 -235
  162. package/dist/esm/limebb-property-selector.entry.js +0 -230
  163. package/dist/lime-crm-building-blocks/p-02c0cc04.entry.js +0 -1
  164. package/dist/lime-crm-building-blocks/p-0957b2a6.entry.js +0 -1
  165. package/dist/lime-crm-building-blocks/p-3b0a15ec.js +0 -1
  166. package/dist/lime-crm-building-blocks/p-5a6d2e7f.js +0 -1
  167. package/dist/lime-crm-building-blocks/p-60971d64.js +0 -1
  168. package/dist/lime-crm-building-blocks/p-70a28b93.entry.js +0 -1
  169. package/dist/lime-crm-building-blocks/p-96beaabc.entry.js +0 -1
  170. 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
@@ -660,16 +564,16 @@ const LimeQueryBuilder = class {
660
564
  this.codeValue = '';
661
565
  this.limetype = '';
662
566
  this.filter = {
663
- filter_type: 'AND',
664
- expressions: [],
567
+ op: index_esm.Zt.AND,
568
+ exp: [],
665
569
  };
666
570
  this.handleLimetypeChange = (event) => {
667
571
  event.stopPropagation();
668
572
  this.limetype = event.detail;
669
573
  // Reset filter when limetype changes
670
574
  this.filter = {
671
- filter_type: 'AND',
672
- expressions: [],
575
+ op: index_esm.Zt.AND,
576
+ exp: [],
673
577
  };
674
578
  // Reset response format when limetype changes
675
579
  this.internalResponseFormat = {
@@ -681,15 +585,15 @@ const LimeQueryBuilder = class {
681
585
  };
682
586
  this.handleFilterChange = (event) => {
683
587
  event.stopPropagation();
684
- // Convert missing expression back to empty AND to keep the UI consistent
685
- if (event.detail.filter_type === '') {
588
+ const expression = event.detail;
589
+ if (expression === undefined) {
686
590
  this.filter = {
687
- filter_type: 'AND',
688
- expressions: [],
591
+ op: index_esm.Zt.AND,
592
+ exp: [],
689
593
  };
690
594
  }
691
595
  else {
692
- this.filter = event.detail;
596
+ this.filter = expression;
693
597
  }
694
598
  this.emitChange();
695
599
  };
@@ -716,7 +620,7 @@ const LimeQueryBuilder = class {
716
620
  }
717
621
  // Update internal state from parsed query
718
622
  this.limetype = parsed.limetype || '';
719
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(parsed.filter));
623
+ this.filter = this.normalizeFilter(parsed.filter);
720
624
  this.internalResponseFormat = parsed.responseFormat;
721
625
  this.limit = parsed.limit;
722
626
  this.mode = 'gui';
@@ -757,7 +661,7 @@ const LimeQueryBuilder = class {
757
661
  }
758
662
  if (this.value) {
759
663
  this.limetype = this.value.limetype || '';
760
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(this.value.filter));
664
+ this.filter = this.normalizeFilter(this.value.filter);
761
665
  this.internalResponseFormat = this.value.responseFormat;
762
666
  this.limit = this.value.limit;
763
667
  }
@@ -772,10 +676,26 @@ const LimeQueryBuilder = class {
772
676
  render() {
773
677
  const guiSupported = this.checkGuiSupport();
774
678
  const showCodeMode = !this.guiModeEnabled || this.mode === 'code';
775
- return (index.h("div", { key: '96d1a933f699404c3806af3742e9ad30d53562aa', class: "lime-query-builder" }, this.renderLabel(), this.renderModeControls(guiSupported), showCodeMode
679
+ return (index.h("div", { key: '5ff70a352e3e57ff4c51d44627bd4b5ed367fff4', class: "lime-query-builder" }, this.renderLabel(), this.renderModeControls(guiSupported), showCodeMode
776
680
  ? this.renderCodeMode(guiSupported)
777
681
  : this.renderGuiMode()));
778
682
  }
683
+ /**
684
+ * Normalize filter to ensure top-level is an AND group.
685
+ * This ensures Add buttons are available in the UI.
686
+ * @param filter
687
+ */
688
+ normalizeFilter(filter) {
689
+ if (!filter) {
690
+ return { op: index_esm.Zt.AND, exp: [] };
691
+ }
692
+ // If it's already an AND at the top level, keep it
693
+ if ('op' in filter && filter.op === index_esm.Zt.AND) {
694
+ return filter;
695
+ }
696
+ // Otherwise wrap in AND
697
+ return { op: index_esm.Zt.AND, exp: [filter] };
698
+ }
779
699
  emitChange() {
780
700
  // Only emit in GUI mode
781
701
  if (this.mode === 'code') {
@@ -793,7 +713,7 @@ const LimeQueryBuilder = class {
793
713
  const limeQuery = {
794
714
  limetype: this.limetype,
795
715
  responseFormat: responseFormat,
796
- filter: guiFilterToLimeQuery(this.filter),
716
+ filter: this.filter,
797
717
  };
798
718
  if (this.limit !== undefined && this.limit > 0) {
799
719
  limeQuery.limit = this.limit;
@@ -814,7 +734,7 @@ const LimeQueryBuilder = class {
814
734
  const limeQuery = {
815
735
  limetype: this.limetype,
816
736
  responseFormat: responseFormat,
817
- filter: guiFilterToLimeQuery(this.filter),
737
+ filter: this.filter,
818
738
  };
819
739
  if (this.limit !== undefined && this.limit > 0) {
820
740
  limeQuery.limit = this.limit;
@@ -865,7 +785,7 @@ const LimeQueryBuilder = class {
865
785
  queryToCheck = {
866
786
  limetype: this.limetype,
867
787
  responseFormat: responseFormat,
868
- filter: guiFilterToLimeQuery(this.filter),
788
+ filter: this.filter,
869
789
  };
870
790
  if (this.limit !== undefined && this.limit > 0) {
871
791
  queryToCheck.limit = this.limit;
@@ -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;
@@ -0,0 +1,147 @@
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 limeQueryFilterComparisonCss = ".expression-container{display:flex;flex-direction:row;align-items:flex-start;gap:1rem;flex-wrap:wrap}.expression-container>*{flex-grow:2;width:30%;max-width:calc(100% - 3.25rem)}.expression-container>.operator{flex-grow:1;width:calc(30% + 1rem);min-width:4rem}.expression-container>.remove{flex-grow:0;width:auto;margin-left:auto}@media (max-width: 768px){.expression-container{flex-direction:column}.expression-container>*{width:100%;max-width:100%}.expression-container>.operator{width:100%}.expression-container>.remove{margin-left:0;align-self:flex-end}}";
9
+ const LimebbLimeQueryFilterComparisonStyle0 = limeQueryFilterComparisonCss;
10
+
11
+ const LIME_QUERY_OPERATORS = [
12
+ { value: index_esm.Zt.EQUALS, label: 'Equals', icon: 'equals' },
13
+ { value: index_esm.Zt.NOT_EQUALS, label: 'Not Equals', icon: 'not-equal' },
14
+ {
15
+ value: index_esm.Zt.GREATER,
16
+ label: 'Greater Than',
17
+ icon: 'greater-than',
18
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
19
+ },
20
+ {
21
+ value: index_esm.Zt.GREATER_OR_EQUAL,
22
+ label: 'Greater or Equal',
23
+ icon: 'greater-or-equal',
24
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
25
+ },
26
+ {
27
+ value: index_esm.Zt.LESS,
28
+ label: 'Less Than',
29
+ icon: 'less-than',
30
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
31
+ },
32
+ {
33
+ value: index_esm.Zt.LESS_OR_EQUAL,
34
+ label: 'Less or Equal',
35
+ icon: 'less-or-equal',
36
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
37
+ },
38
+ { value: index_esm.Zt.IN, label: 'In List', icon: 'list' },
39
+ {
40
+ value: index_esm.Zt.LIKE,
41
+ label: 'Contains',
42
+ icon: '-lime-filter-contain',
43
+ applicableTypes: ['string', 'text'],
44
+ },
45
+ {
46
+ value: index_esm.Zt.BEGINS,
47
+ label: 'Begins With',
48
+ icon: '-lime-filter-begin',
49
+ applicableTypes: ['string', 'text'],
50
+ },
51
+ {
52
+ value: index_esm.Zt.ENDS,
53
+ label: 'Ends With',
54
+ icon: '-lime-filter-end',
55
+ applicableTypes: ['string', 'text'],
56
+ },
57
+ ];
58
+ const LimeQueryFilterComparisonComponent = class {
59
+ constructor(hostRef) {
60
+ index.registerInstance(this, hostRef);
61
+ this.expressionChange = index.createEvent(this, "expressionChange", 7);
62
+ this.handlePropertyChange = (event) => {
63
+ event.stopPropagation();
64
+ this.expressionChange.emit(Object.assign(Object.assign({}, this.expression), { key: event.detail }));
65
+ };
66
+ this.handleOperatorChange = (event) => {
67
+ event.stopPropagation();
68
+ // TODO: Clear value when switching between IN and other operators
69
+ // since array values are incompatible with single-value operators
70
+ this.expressionChange.emit({
71
+ key: this.expression.key,
72
+ op: event.detail.value,
73
+ exp: this.expression.exp,
74
+ });
75
+ };
76
+ this.handleValueChange = (event) => {
77
+ event.stopPropagation();
78
+ this.expressionChange.emit(Object.assign(Object.assign({}, this.expression), { exp: event.detail }));
79
+ };
80
+ this.removeExpression = () => {
81
+ this.expressionChange.emit(undefined);
82
+ };
83
+ }
84
+ render() {
85
+ return (index.h("div", { key: '668e0f05bdb1fb25ffd652ea650c34e5431a3332', class: "expression" }, this.label && index.h("limel-header", { key: '5034070b58afe31cf90699dd2a27f884e647f540', heading: this.label }), index.h("div", { key: '14a2b1270e5e6d7e158e29ebc5f61051e5670e80', class: "expression-container" }, this.renderPropertySelector(), this.renderOperator(), this.renderValueInput(), index.h("limel-icon-button", { key: 'b69bde6e88c40d2623ef015794db28cec3676c73', class: "remove", icon: "trash", label: "Remove condition", onClick: this.removeExpression }))));
86
+ }
87
+ renderPropertySelector() {
88
+ return (index.h("limebb-property-selector", { platform: this.platform, context: this.context, label: "Property", limetype: this.limetype, value: this.expression.key, required: true, onChange: this.handlePropertyChange }));
89
+ }
90
+ renderOperator() {
91
+ const operatorHasBeenSet = !!this.expression.op;
92
+ const options = LIME_QUERY_OPERATORS.map((op) => ({
93
+ text: op.label,
94
+ value: op.value,
95
+ icon: op.icon ? { name: op.icon } : undefined,
96
+ }));
97
+ const selectedOption = options.find((o) => o.value === this.expression.op);
98
+ return (index.h("limel-select", { class: "operator", label: "Operator", value: selectedOption, options: options, disabled: !operatorHasBeenSet && !this.expression.key, onChange: this.handleOperatorChange }));
99
+ }
100
+ renderValueInput() {
101
+ if (!this.expression.op) {
102
+ return null;
103
+ }
104
+ return (index.h("limebb-lime-query-value-input", { platform: this.platform, context: this.context, limetype: this.limetype, activeLimetype: this.activeLimetype, propertyPath: this.expression.key, operator: this.expression.op, value: this.expression.exp, onChange: this.handleValueChange }));
105
+ }
106
+ };
107
+ LimeQueryFilterComparisonComponent.style = LimebbLimeQueryFilterComparisonStyle0;
108
+
109
+ const limeQueryFilterExpressionCss = "@charset \"UTF-8\";.expression{display:flex;flex-direction:column;margin-bottom:1rem;gap:1rem}";
110
+ const LimebbLimeQueryFilterExpressionStyle0 = limeQueryFilterExpressionCss;
111
+
112
+ const LimeQueryFilterExpressionComponent = class {
113
+ constructor(hostRef) {
114
+ index.registerInstance(this, hostRef);
115
+ this.expressionChange = index.createEvent(this, "expressionChange", 7);
116
+ this.handleExpressionChange = (event) => {
117
+ event.stopPropagation();
118
+ this.expressionChange.emit(event.detail);
119
+ };
120
+ }
121
+ render() {
122
+ if (!this.expression) {
123
+ return;
124
+ }
125
+ const props = {
126
+ platform: this.platform,
127
+ context: this.context,
128
+ label: this.label,
129
+ limetype: this.limetype,
130
+ activeLimetype: this.activeLimetype,
131
+ };
132
+ if ('key' in this.expression) {
133
+ return (index.h("limebb-lime-query-filter-comparison", Object.assign({}, props, { expression: this.expression, onExpressionChange: this.handleExpressionChange })));
134
+ }
135
+ if (this.expression.op === index_esm.Zt.AND ||
136
+ this.expression.op === index_esm.Zt.OR) {
137
+ return (index.h("limebb-lime-query-filter-group", Object.assign({}, props, { expression: this.expression, onExpressionChange: this.handleExpressionChange })));
138
+ }
139
+ if (this.expression.op === index_esm.Zt.NOT) {
140
+ return (index.h("limebb-lime-query-filter-not", Object.assign({}, props, { expression: this.expression, onExpressionChange: this.handleExpressionChange })));
141
+ }
142
+ }
143
+ };
144
+ LimeQueryFilterExpressionComponent.style = LimebbLimeQueryFilterExpressionStyle0;
145
+
146
+ exports.limebb_lime_query_filter_comparison = LimeQueryFilterComparisonComponent;
147
+ exports.limebb_lime_query_filter_expression = LimeQueryFilterExpressionComponent;