@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
@@ -1,64 +1,65 @@
1
1
  import { r as registerInstance, c as createEvent, h } from './index-96dd111f.js';
2
- import { T as Te } from './index.esm-d8fdeb18.js';
3
- import { L as LIME_QUERY_OPERATORS } from './lime-query.types-f72355e1.js';
2
+ import { T as Te, Z as Zt } from './index.esm-bb569663.js';
4
3
  import { g as getNormalizedProperties, a as getPropertyFromPath } from './property-resolution-fde2375e.js';
5
4
 
6
5
  /**
7
- * Convert UI filter representation to Lime Query filter format
8
- * @param filter
6
+ * TypeScript type definitions for Lime Query DSL
7
+ *
8
+ * These types represent the structure of Lime Query as defined in:
9
+ * - lime-core/lime_query/schema.py
10
+ * - lime-core/lime_filter/schema.py
9
11
  */
10
- function guiFilterToLimeQuery(filter) {
11
- if (filter.filter_type === '') {
12
- return undefined;
13
- }
14
- if (filter.filter_type === 'comparison') {
15
- return {
16
- key: filter.property,
17
- op: filter.operator,
18
- exp: filter.value,
19
- };
20
- }
21
- if (filter.filter_type === 'AND') {
22
- const expressions = filter.expressions
23
- .map(guiFilterToLimeQuery)
24
- .filter((f) => f !== undefined);
25
- if (expressions.length === 0) {
26
- return undefined;
27
- }
28
- if (expressions.length === 1) {
29
- return expressions[0];
30
- }
31
- return {
32
- op: 'AND',
33
- exp: expressions,
34
- };
35
- }
36
- if (filter.filter_type === 'OR') {
37
- const expressions = filter.expressions
38
- .map(guiFilterToLimeQuery)
39
- .filter((f) => f !== undefined);
40
- if (expressions.length === 0) {
41
- return undefined;
42
- }
43
- if (expressions.length === 1) {
44
- return expressions[0];
45
- }
46
- return {
47
- op: 'OR',
48
- exp: expressions,
49
- };
50
- }
51
- if (filter.filter_type === 'NOT') {
52
- const innerFilter = guiFilterToLimeQuery(filter.expression);
53
- if (innerFilter) {
54
- return {
55
- op: '!',
56
- exp: innerFilter,
57
- };
58
- }
59
- }
60
- return undefined;
61
- }
12
+ /**
13
+ * Available operators with display metadata
14
+ */
15
+ const LIME_QUERY_OPERATORS = [
16
+ { value: '=', label: 'Equals', icon: 'equals' },
17
+ { value: '!=', label: 'Not Equals', icon: 'not-equal' },
18
+ {
19
+ value: '>',
20
+ label: 'Greater Than',
21
+ icon: 'greater-than',
22
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
23
+ },
24
+ {
25
+ value: '>=',
26
+ label: 'Greater or Equal',
27
+ icon: 'greater-or-equal',
28
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
29
+ },
30
+ {
31
+ value: '<',
32
+ label: 'Less Than',
33
+ icon: 'less-than',
34
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
35
+ },
36
+ {
37
+ value: '<=',
38
+ label: 'Less or Equal',
39
+ icon: 'less-or-equal',
40
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
41
+ },
42
+ { value: 'IN', label: 'In List', icon: 'list' },
43
+ {
44
+ value: '?',
45
+ label: 'Contains',
46
+ icon: '-lime-filter-contain',
47
+ applicableTypes: ['string', 'text'],
48
+ },
49
+ {
50
+ value: '=?',
51
+ label: 'Begins With',
52
+ icon: '-lime-filter-begin',
53
+ applicableTypes: ['string', 'text'],
54
+ },
55
+ {
56
+ value: '=$',
57
+ label: 'Ends With',
58
+ icon: '-lime-filter-end',
59
+ applicableTypes: ['string', 'text'],
60
+ },
61
+ ];
62
+
62
63
  /**
63
64
  * Validate and convert a FilterExpression (comparison filter)
64
65
  * @param filter
@@ -160,103 +161,6 @@ function limeQueryToGuiFilter(filter) {
160
161
  // It's a FilterGroup
161
162
  return validateAndConvertFilterGroup(filter);
162
163
  }
163
- /**
164
- * Normalize filter for GUI mode by ensuring proper AND/OR wrapper structure.
165
- * GUI mode requires filters to be wrapped in AND([OR(...)]) so users have
166
- * access to add/remove buttons on the AND and OR components.
167
- *
168
- * This function ensures that:
169
- * - Single comparisons are wrapped in AND([OR([comparison])])
170
- * - OR groups are wrapped in AND([OR group])
171
- * - AND groups have their comparison children wrapped in OR
172
- * - Empty/undefined filters become AND([])
173
- *
174
- * When converting back to Lime Query JSON, limeQueryFilterToLimeQuery()
175
- * automatically unwraps single-item AND/OR groups.
176
- *
177
- * @param filter The filter expression from limeQueryToLimeQueryFilter
178
- * @returns Normalized filter suitable for GUI editing
179
- */
180
- function normalizeLimeQueryFilterForGui(filter) {
181
- // Empty AND is already correct for GUI
182
- if (filter.filter_type === 'AND' && filter.expressions.length === 0) {
183
- return filter;
184
- }
185
- // Single comparison needs wrapping
186
- if (filter.filter_type === 'comparison') {
187
- return {
188
- filter_type: 'AND',
189
- expressions: [
190
- {
191
- filter_type: 'OR',
192
- expressions: [filter],
193
- },
194
- ],
195
- };
196
- }
197
- // OR needs wrapping in AND
198
- if (filter.filter_type === 'OR') {
199
- return {
200
- filter_type: 'AND',
201
- expressions: [filter],
202
- };
203
- }
204
- // NOT needs wrapping
205
- if (filter.filter_type === 'NOT') {
206
- return {
207
- filter_type: 'AND',
208
- expressions: [
209
- {
210
- filter_type: 'OR',
211
- expressions: [filter],
212
- },
213
- ],
214
- };
215
- }
216
- // AND group - check if children need OR wrappers
217
- if (filter.filter_type === 'AND') {
218
- const normalizedChildren = filter.expressions.map((child) => {
219
- // If child is already OR, keep it
220
- if (child.filter_type === 'OR') {
221
- return child;
222
- }
223
- // If child is NOT, keep it (NOT can be a direct child of AND)
224
- if (child.filter_type === 'NOT') {
225
- return child;
226
- }
227
- // If child is comparison, wrap in OR
228
- if (child.filter_type === 'comparison') {
229
- return {
230
- filter_type: 'OR',
231
- expressions: [child],
232
- };
233
- }
234
- // If child is nested AND, recursively normalize and wrap in OR
235
- if (child.filter_type === 'AND') {
236
- return {
237
- filter_type: 'OR',
238
- expressions: [normalizeLimeQueryFilterForGui(child)],
239
- };
240
- }
241
- // Unknown filter type, keep as is
242
- return child;
243
- });
244
- return {
245
- filter_type: 'AND',
246
- expressions: normalizedChildren,
247
- };
248
- }
249
- // Fallback: wrap in AND/OR structure
250
- return {
251
- filter_type: 'AND',
252
- expressions: [
253
- {
254
- filter_type: 'OR',
255
- expressions: [filter],
256
- },
257
- ],
258
- };
259
- }
260
164
 
261
165
  /**
262
166
  * Dynamic filter values and placeholders that are valid in Lime Query
@@ -656,16 +560,16 @@ const LimeQueryBuilder = class {
656
560
  this.codeValue = '';
657
561
  this.limetype = '';
658
562
  this.filter = {
659
- filter_type: 'AND',
660
- expressions: [],
563
+ op: Zt.AND,
564
+ exp: [],
661
565
  };
662
566
  this.handleLimetypeChange = (event) => {
663
567
  event.stopPropagation();
664
568
  this.limetype = event.detail;
665
569
  // Reset filter when limetype changes
666
570
  this.filter = {
667
- filter_type: 'AND',
668
- expressions: [],
571
+ op: Zt.AND,
572
+ exp: [],
669
573
  };
670
574
  // Reset response format when limetype changes
671
575
  this.internalResponseFormat = {
@@ -677,15 +581,15 @@ const LimeQueryBuilder = class {
677
581
  };
678
582
  this.handleFilterChange = (event) => {
679
583
  event.stopPropagation();
680
- // Convert missing expression back to empty AND to keep the UI consistent
681
- if (event.detail.filter_type === '') {
584
+ const expression = event.detail;
585
+ if (expression === undefined) {
682
586
  this.filter = {
683
- filter_type: 'AND',
684
- expressions: [],
587
+ op: Zt.AND,
588
+ exp: [],
685
589
  };
686
590
  }
687
591
  else {
688
- this.filter = event.detail;
592
+ this.filter = expression;
689
593
  }
690
594
  this.emitChange();
691
595
  };
@@ -712,7 +616,7 @@ const LimeQueryBuilder = class {
712
616
  }
713
617
  // Update internal state from parsed query
714
618
  this.limetype = parsed.limetype || '';
715
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(parsed.filter));
619
+ this.filter = this.normalizeFilter(parsed.filter);
716
620
  this.internalResponseFormat = parsed.responseFormat;
717
621
  this.limit = parsed.limit;
718
622
  this.mode = 'gui';
@@ -753,7 +657,7 @@ const LimeQueryBuilder = class {
753
657
  }
754
658
  if (this.value) {
755
659
  this.limetype = this.value.limetype || '';
756
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(this.value.filter));
660
+ this.filter = this.normalizeFilter(this.value.filter);
757
661
  this.internalResponseFormat = this.value.responseFormat;
758
662
  this.limit = this.value.limit;
759
663
  }
@@ -768,10 +672,26 @@ const LimeQueryBuilder = class {
768
672
  render() {
769
673
  const guiSupported = this.checkGuiSupport();
770
674
  const showCodeMode = !this.guiModeEnabled || this.mode === 'code';
771
- return (h("div", { key: '96d1a933f699404c3806af3742e9ad30d53562aa', class: "lime-query-builder" }, this.renderLabel(), this.renderModeControls(guiSupported), showCodeMode
675
+ return (h("div", { key: '5ff70a352e3e57ff4c51d44627bd4b5ed367fff4', class: "lime-query-builder" }, this.renderLabel(), this.renderModeControls(guiSupported), showCodeMode
772
676
  ? this.renderCodeMode(guiSupported)
773
677
  : this.renderGuiMode()));
774
678
  }
679
+ /**
680
+ * Normalize filter to ensure top-level is an AND group.
681
+ * This ensures Add buttons are available in the UI.
682
+ * @param filter
683
+ */
684
+ normalizeFilter(filter) {
685
+ if (!filter) {
686
+ return { op: Zt.AND, exp: [] };
687
+ }
688
+ // If it's already an AND at the top level, keep it
689
+ if ('op' in filter && filter.op === Zt.AND) {
690
+ return filter;
691
+ }
692
+ // Otherwise wrap in AND
693
+ return { op: Zt.AND, exp: [filter] };
694
+ }
775
695
  emitChange() {
776
696
  // Only emit in GUI mode
777
697
  if (this.mode === 'code') {
@@ -789,7 +709,7 @@ const LimeQueryBuilder = class {
789
709
  const limeQuery = {
790
710
  limetype: this.limetype,
791
711
  responseFormat: responseFormat,
792
- filter: guiFilterToLimeQuery(this.filter),
712
+ filter: this.filter,
793
713
  };
794
714
  if (this.limit !== undefined && this.limit > 0) {
795
715
  limeQuery.limit = this.limit;
@@ -810,7 +730,7 @@ const LimeQueryBuilder = class {
810
730
  const limeQuery = {
811
731
  limetype: this.limetype,
812
732
  responseFormat: responseFormat,
813
- filter: guiFilterToLimeQuery(this.filter),
733
+ filter: this.filter,
814
734
  };
815
735
  if (this.limit !== undefined && this.limit > 0) {
816
736
  limeQuery.limit = this.limit;
@@ -861,7 +781,7 @@ const LimeQueryBuilder = class {
861
781
  queryToCheck = {
862
782
  limetype: this.limetype,
863
783
  responseFormat: responseFormat,
864
- filter: guiFilterToLimeQuery(this.filter),
784
+ filter: this.filter,
865
785
  };
866
786
  if (this.limit !== undefined && this.limit > 0) {
867
787
  queryToCheck.limit = this.limit;
@@ -0,0 +1,76 @@
1
+ import { r as registerInstance, c as createEvent, h } from './index-96dd111f.js';
2
+ import { Z as Zt } from './index.esm-bb569663.js';
3
+
4
+ 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}";
5
+ const LimebbLimeQueryFilterAndStyle0 = limeQueryFilterAndCss;
6
+
7
+ const LimeQueryFilterAndComponent = class {
8
+ constructor(hostRef) {
9
+ registerInstance(this, hostRef);
10
+ this.expressionChange = createEvent(this, "expressionChange", 7);
11
+ this.renderChildExpression = (expression, childIndex) => (h("li", null, h("limebb-lime-query-filter-expression", { platform: this.platform, context: this.context, limetype: this.limetype, activeLimetype: this.activeLimetype, expression: expression, onExpressionChange: this.handleExpressionChange(childIndex) })));
12
+ this.handleAddChildExpression = () => {
13
+ const newOrGroup = {
14
+ op: Zt.OR,
15
+ exp: [
16
+ {
17
+ key: '',
18
+ op: Zt.EQUALS,
19
+ exp: '',
20
+ },
21
+ ],
22
+ };
23
+ const updatedExpressionsList = [
24
+ ...this.expression.exp,
25
+ newOrGroup,
26
+ ];
27
+ this.expressionChange.emit({
28
+ op: Zt.AND,
29
+ exp: updatedExpressionsList,
30
+ });
31
+ };
32
+ this.handleExpressionChange = (updatedChildIndex) => (event) => {
33
+ var _a;
34
+ event.stopPropagation();
35
+ const updatedExpression = (_a = event.detail) !== null && _a !== void 0 ? _a : undefined;
36
+ const expressions = [...this.expression.exp];
37
+ if (updatedExpression === undefined) {
38
+ expressions.splice(updatedChildIndex, 1);
39
+ }
40
+ else {
41
+ expressions[updatedChildIndex] = updatedExpression;
42
+ }
43
+ if (expressions.length === 0) {
44
+ this.expressionChange.emit(undefined);
45
+ return;
46
+ }
47
+ if (expressions.length === 1) {
48
+ this.expressionChange.emit(expressions[0]);
49
+ return;
50
+ }
51
+ this.expressionChange.emit({
52
+ op: Zt.AND,
53
+ exp: expressions,
54
+ });
55
+ };
56
+ }
57
+ render() {
58
+ let subheading = 'All of these conditions are true';
59
+ if (this.expression.exp.length <= 1) {
60
+ subheading = '';
61
+ }
62
+ return (h("div", { key: 'f07c53808d6be8d846f5a45223abb5c94b1a0b16', class: "expression" }, (this.label || subheading) && (h("limel-header", { key: '229f0d58ff15743fbb12da53ad9c593bfba801d1', heading: this.label, subheading: subheading })), h("ul", { key: '2600c2bee2b958036ea606141bcfcac0e277114c' }, this.expression.exp.map(this.renderChildExpression), h("li", { key: '6395e605ee8f454a820ac73601da89b19686187a', class: "add-button" }, this.renderAddChildExpression()))));
63
+ }
64
+ renderAddChildExpression() {
65
+ return (h("limel-button", { label: this.getAddButtonLabel(), icon: "plus_math", onClick: this.handleAddChildExpression }));
66
+ }
67
+ getAddButtonLabel() {
68
+ if (this.expression.exp.length === 0) {
69
+ return 'Add a condition';
70
+ }
71
+ return 'Add another condition';
72
+ }
73
+ };
74
+ LimeQueryFilterAndComponent.style = LimebbLimeQueryFilterAndStyle0;
75
+
76
+ export { LimeQueryFilterAndComponent as limebb_lime_query_filter_and };
@@ -0,0 +1,142 @@
1
+ import { r as registerInstance, c as createEvent, h } from './index-96dd111f.js';
2
+ import { Z as Zt } from './index.esm-bb569663.js';
3
+
4
+ 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}}";
5
+ const LimebbLimeQueryFilterComparisonStyle0 = limeQueryFilterComparisonCss;
6
+
7
+ const LIME_QUERY_OPERATORS = [
8
+ { value: Zt.EQUALS, label: 'Equals', icon: 'equals' },
9
+ { value: Zt.NOT_EQUALS, label: 'Not Equals', icon: 'not-equal' },
10
+ {
11
+ value: Zt.GREATER,
12
+ label: 'Greater Than',
13
+ icon: 'greater-than',
14
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
15
+ },
16
+ {
17
+ value: Zt.GREATER_OR_EQUAL,
18
+ label: 'Greater or Equal',
19
+ icon: 'greater-or-equal',
20
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
21
+ },
22
+ {
23
+ value: Zt.LESS,
24
+ label: 'Less Than',
25
+ icon: 'less-than',
26
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
27
+ },
28
+ {
29
+ value: Zt.LESS_OR_EQUAL,
30
+ label: 'Less or Equal',
31
+ icon: 'less-or-equal',
32
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
33
+ },
34
+ { value: Zt.IN, label: 'In List', icon: 'list' },
35
+ {
36
+ value: Zt.LIKE,
37
+ label: 'Contains',
38
+ icon: '-lime-filter-contain',
39
+ applicableTypes: ['string', 'text'],
40
+ },
41
+ {
42
+ value: Zt.BEGINS,
43
+ label: 'Begins With',
44
+ icon: '-lime-filter-begin',
45
+ applicableTypes: ['string', 'text'],
46
+ },
47
+ {
48
+ value: Zt.ENDS,
49
+ label: 'Ends With',
50
+ icon: '-lime-filter-end',
51
+ applicableTypes: ['string', 'text'],
52
+ },
53
+ ];
54
+ const LimeQueryFilterComparisonComponent = class {
55
+ constructor(hostRef) {
56
+ registerInstance(this, hostRef);
57
+ this.expressionChange = createEvent(this, "expressionChange", 7);
58
+ this.handlePropertyChange = (event) => {
59
+ event.stopPropagation();
60
+ this.expressionChange.emit(Object.assign(Object.assign({}, this.expression), { key: event.detail }));
61
+ };
62
+ this.handleOperatorChange = (event) => {
63
+ event.stopPropagation();
64
+ // TODO: Clear value when switching between IN and other operators
65
+ // since array values are incompatible with single-value operators
66
+ this.expressionChange.emit({
67
+ key: this.expression.key,
68
+ op: event.detail.value,
69
+ exp: this.expression.exp,
70
+ });
71
+ };
72
+ this.handleValueChange = (event) => {
73
+ event.stopPropagation();
74
+ this.expressionChange.emit(Object.assign(Object.assign({}, this.expression), { exp: event.detail }));
75
+ };
76
+ this.removeExpression = () => {
77
+ this.expressionChange.emit(undefined);
78
+ };
79
+ }
80
+ render() {
81
+ return (h("div", { key: '668e0f05bdb1fb25ffd652ea650c34e5431a3332', class: "expression" }, this.label && h("limel-header", { key: '5034070b58afe31cf90699dd2a27f884e647f540', heading: this.label }), h("div", { key: '14a2b1270e5e6d7e158e29ebc5f61051e5670e80', class: "expression-container" }, this.renderPropertySelector(), this.renderOperator(), this.renderValueInput(), h("limel-icon-button", { key: 'b69bde6e88c40d2623ef015794db28cec3676c73', class: "remove", icon: "trash", label: "Remove condition", onClick: this.removeExpression }))));
82
+ }
83
+ renderPropertySelector() {
84
+ return (h("limebb-property-selector", { platform: this.platform, context: this.context, label: "Property", limetype: this.limetype, value: this.expression.key, required: true, onChange: this.handlePropertyChange }));
85
+ }
86
+ renderOperator() {
87
+ const operatorHasBeenSet = !!this.expression.op;
88
+ const options = LIME_QUERY_OPERATORS.map((op) => ({
89
+ text: op.label,
90
+ value: op.value,
91
+ icon: op.icon ? { name: op.icon } : undefined,
92
+ }));
93
+ const selectedOption = options.find((o) => o.value === this.expression.op);
94
+ return (h("limel-select", { class: "operator", label: "Operator", value: selectedOption, options: options, disabled: !operatorHasBeenSet && !this.expression.key, onChange: this.handleOperatorChange }));
95
+ }
96
+ renderValueInput() {
97
+ if (!this.expression.op) {
98
+ return null;
99
+ }
100
+ return (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 }));
101
+ }
102
+ };
103
+ LimeQueryFilterComparisonComponent.style = LimebbLimeQueryFilterComparisonStyle0;
104
+
105
+ const limeQueryFilterExpressionCss = "@charset \"UTF-8\";.expression{display:flex;flex-direction:column;margin-bottom:1rem;gap:1rem}";
106
+ const LimebbLimeQueryFilterExpressionStyle0 = limeQueryFilterExpressionCss;
107
+
108
+ const LimeQueryFilterExpressionComponent = class {
109
+ constructor(hostRef) {
110
+ registerInstance(this, hostRef);
111
+ this.expressionChange = createEvent(this, "expressionChange", 7);
112
+ this.handleExpressionChange = (event) => {
113
+ event.stopPropagation();
114
+ this.expressionChange.emit(event.detail);
115
+ };
116
+ }
117
+ render() {
118
+ if (!this.expression) {
119
+ return;
120
+ }
121
+ const props = {
122
+ platform: this.platform,
123
+ context: this.context,
124
+ label: this.label,
125
+ limetype: this.limetype,
126
+ activeLimetype: this.activeLimetype,
127
+ };
128
+ if ('key' in this.expression) {
129
+ return (h("limebb-lime-query-filter-comparison", Object.assign({}, props, { expression: this.expression, onExpressionChange: this.handleExpressionChange })));
130
+ }
131
+ if (this.expression.op === Zt.AND ||
132
+ this.expression.op === Zt.OR) {
133
+ return (h("limebb-lime-query-filter-group", Object.assign({}, props, { expression: this.expression, onExpressionChange: this.handleExpressionChange })));
134
+ }
135
+ if (this.expression.op === Zt.NOT) {
136
+ return (h("limebb-lime-query-filter-not", Object.assign({}, props, { expression: this.expression, onExpressionChange: this.handleExpressionChange })));
137
+ }
138
+ }
139
+ };
140
+ LimeQueryFilterExpressionComponent.style = LimebbLimeQueryFilterExpressionStyle0;
141
+
142
+ export { LimeQueryFilterComparisonComponent as limebb_lime_query_filter_comparison, LimeQueryFilterExpressionComponent as limebb_lime_query_filter_expression };