@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,69 +1,71 @@
1
1
  import { proxyCustomElement, HTMLElement, createEvent, h } from '@stencil/core/internal/client';
2
- import { T as Te } from './index.esm.js';
3
- import { L as LIME_QUERY_OPERATORS, d as defineCustomElement$a } from './lime-query-filter-comparison.js';
2
+ import { T as Te, Z as Zt } from './index.esm.js';
4
3
  import { g as getNormalizedProperties, a as getPropertyFromPath, d as defineCustomElement$4 } from './property-selector.js';
5
- import { d as defineCustomElement$7, a as defineCustomElement$8, b as defineCustomElement$9, c as defineCustomElement$b } from './lime-query-filter-and.js';
4
+ import { d as defineCustomElement$a } from './lime-query-filter-comparison.js';
5
+ import { d as defineCustomElement$7, a as defineCustomElement$8, b as defineCustomElement$9 } from './lime-query-filter-expression.js';
6
6
  import { d as defineCustomElement$6 } from './lime-query-value-input.js';
7
7
  import { d as defineCustomElement$5 } from './limetype-field.js';
8
8
  import { d as defineCustomElement$3 } from './response-format-editor.js';
9
9
  import { d as defineCustomElement$2 } from './response-format-item.js';
10
10
 
11
11
  /**
12
- * Convert UI filter representation to Lime Query filter format
13
- * @param filter
12
+ * TypeScript type definitions for Lime Query DSL
13
+ *
14
+ * These types represent the structure of Lime Query as defined in:
15
+ * - lime-core/lime_query/schema.py
16
+ * - lime-core/lime_filter/schema.py
14
17
  */
15
- function guiFilterToLimeQuery(filter) {
16
- if (filter.filter_type === '') {
17
- return undefined;
18
- }
19
- if (filter.filter_type === 'comparison') {
20
- return {
21
- key: filter.property,
22
- op: filter.operator,
23
- exp: filter.value,
24
- };
25
- }
26
- if (filter.filter_type === 'AND') {
27
- const expressions = filter.expressions
28
- .map(guiFilterToLimeQuery)
29
- .filter((f) => f !== undefined);
30
- if (expressions.length === 0) {
31
- return undefined;
32
- }
33
- if (expressions.length === 1) {
34
- return expressions[0];
35
- }
36
- return {
37
- op: 'AND',
38
- exp: expressions,
39
- };
40
- }
41
- if (filter.filter_type === 'OR') {
42
- const expressions = filter.expressions
43
- .map(guiFilterToLimeQuery)
44
- .filter((f) => f !== undefined);
45
- if (expressions.length === 0) {
46
- return undefined;
47
- }
48
- if (expressions.length === 1) {
49
- return expressions[0];
50
- }
51
- return {
52
- op: 'OR',
53
- exp: expressions,
54
- };
55
- }
56
- if (filter.filter_type === 'NOT') {
57
- const innerFilter = guiFilterToLimeQuery(filter.expression);
58
- if (innerFilter) {
59
- return {
60
- op: '!',
61
- exp: innerFilter,
62
- };
63
- }
64
- }
65
- return undefined;
66
- }
18
+ /**
19
+ * Available operators with display metadata
20
+ */
21
+ const LIME_QUERY_OPERATORS = [
22
+ { value: '=', label: 'Equals', icon: 'equals' },
23
+ { value: '!=', label: 'Not Equals', icon: 'not-equal' },
24
+ {
25
+ value: '>',
26
+ label: 'Greater Than',
27
+ icon: 'greater-than',
28
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
29
+ },
30
+ {
31
+ value: '>=',
32
+ label: 'Greater or Equal',
33
+ icon: 'greater-or-equal',
34
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
35
+ },
36
+ {
37
+ value: '<',
38
+ label: 'Less Than',
39
+ icon: 'less-than',
40
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
41
+ },
42
+ {
43
+ value: '<=',
44
+ label: 'Less or Equal',
45
+ icon: 'less-or-equal',
46
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
47
+ },
48
+ { value: 'IN', label: 'In List', icon: 'list' },
49
+ {
50
+ value: '?',
51
+ label: 'Contains',
52
+ icon: '-lime-filter-contain',
53
+ applicableTypes: ['string', 'text'],
54
+ },
55
+ {
56
+ value: '=?',
57
+ label: 'Begins With',
58
+ icon: '-lime-filter-begin',
59
+ applicableTypes: ['string', 'text'],
60
+ },
61
+ {
62
+ value: '=$',
63
+ label: 'Ends With',
64
+ icon: '-lime-filter-end',
65
+ applicableTypes: ['string', 'text'],
66
+ },
67
+ ];
68
+
67
69
  /**
68
70
  * Validate and convert a FilterExpression (comparison filter)
69
71
  * @param filter
@@ -165,103 +167,6 @@ function limeQueryToGuiFilter(filter) {
165
167
  // It's a FilterGroup
166
168
  return validateAndConvertFilterGroup(filter);
167
169
  }
168
- /**
169
- * Normalize filter for GUI mode by ensuring proper AND/OR wrapper structure.
170
- * GUI mode requires filters to be wrapped in AND([OR(...)]) so users have
171
- * access to add/remove buttons on the AND and OR components.
172
- *
173
- * This function ensures that:
174
- * - Single comparisons are wrapped in AND([OR([comparison])])
175
- * - OR groups are wrapped in AND([OR group])
176
- * - AND groups have their comparison children wrapped in OR
177
- * - Empty/undefined filters become AND([])
178
- *
179
- * When converting back to Lime Query JSON, limeQueryFilterToLimeQuery()
180
- * automatically unwraps single-item AND/OR groups.
181
- *
182
- * @param filter The filter expression from limeQueryToLimeQueryFilter
183
- * @returns Normalized filter suitable for GUI editing
184
- */
185
- function normalizeLimeQueryFilterForGui(filter) {
186
- // Empty AND is already correct for GUI
187
- if (filter.filter_type === 'AND' && filter.expressions.length === 0) {
188
- return filter;
189
- }
190
- // Single comparison needs wrapping
191
- if (filter.filter_type === 'comparison') {
192
- return {
193
- filter_type: 'AND',
194
- expressions: [
195
- {
196
- filter_type: 'OR',
197
- expressions: [filter],
198
- },
199
- ],
200
- };
201
- }
202
- // OR needs wrapping in AND
203
- if (filter.filter_type === 'OR') {
204
- return {
205
- filter_type: 'AND',
206
- expressions: [filter],
207
- };
208
- }
209
- // NOT needs wrapping
210
- if (filter.filter_type === 'NOT') {
211
- return {
212
- filter_type: 'AND',
213
- expressions: [
214
- {
215
- filter_type: 'OR',
216
- expressions: [filter],
217
- },
218
- ],
219
- };
220
- }
221
- // AND group - check if children need OR wrappers
222
- if (filter.filter_type === 'AND') {
223
- const normalizedChildren = filter.expressions.map((child) => {
224
- // If child is already OR, keep it
225
- if (child.filter_type === 'OR') {
226
- return child;
227
- }
228
- // If child is NOT, keep it (NOT can be a direct child of AND)
229
- if (child.filter_type === 'NOT') {
230
- return child;
231
- }
232
- // If child is comparison, wrap in OR
233
- if (child.filter_type === 'comparison') {
234
- return {
235
- filter_type: 'OR',
236
- expressions: [child],
237
- };
238
- }
239
- // If child is nested AND, recursively normalize and wrap in OR
240
- if (child.filter_type === 'AND') {
241
- return {
242
- filter_type: 'OR',
243
- expressions: [normalizeLimeQueryFilterForGui(child)],
244
- };
245
- }
246
- // Unknown filter type, keep as is
247
- return child;
248
- });
249
- return {
250
- filter_type: 'AND',
251
- expressions: normalizedChildren,
252
- };
253
- }
254
- // Fallback: wrap in AND/OR structure
255
- return {
256
- filter_type: 'AND',
257
- expressions: [
258
- {
259
- filter_type: 'OR',
260
- expressions: [filter],
261
- },
262
- ],
263
- };
264
- }
265
170
 
266
171
  /**
267
172
  * Dynamic filter values and placeholders that are valid in Lime Query
@@ -663,16 +568,16 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
663
568
  this.codeValue = '';
664
569
  this.limetype = '';
665
570
  this.filter = {
666
- filter_type: 'AND',
667
- expressions: [],
571
+ op: Zt.AND,
572
+ exp: [],
668
573
  };
669
574
  this.handleLimetypeChange = (event) => {
670
575
  event.stopPropagation();
671
576
  this.limetype = event.detail;
672
577
  // Reset filter when limetype changes
673
578
  this.filter = {
674
- filter_type: 'AND',
675
- expressions: [],
579
+ op: Zt.AND,
580
+ exp: [],
676
581
  };
677
582
  // Reset response format when limetype changes
678
583
  this.internalResponseFormat = {
@@ -684,15 +589,15 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
684
589
  };
685
590
  this.handleFilterChange = (event) => {
686
591
  event.stopPropagation();
687
- // Convert missing expression back to empty AND to keep the UI consistent
688
- if (event.detail.filter_type === '') {
592
+ const expression = event.detail;
593
+ if (expression === undefined) {
689
594
  this.filter = {
690
- filter_type: 'AND',
691
- expressions: [],
595
+ op: Zt.AND,
596
+ exp: [],
692
597
  };
693
598
  }
694
599
  else {
695
- this.filter = event.detail;
600
+ this.filter = expression;
696
601
  }
697
602
  this.emitChange();
698
603
  };
@@ -719,7 +624,7 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
719
624
  }
720
625
  // Update internal state from parsed query
721
626
  this.limetype = parsed.limetype || '';
722
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(parsed.filter));
627
+ this.filter = this.normalizeFilter(parsed.filter);
723
628
  this.internalResponseFormat = parsed.responseFormat;
724
629
  this.limit = parsed.limit;
725
630
  this.mode = 'gui';
@@ -760,7 +665,7 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
760
665
  }
761
666
  if (this.value) {
762
667
  this.limetype = this.value.limetype || '';
763
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(this.value.filter));
668
+ this.filter = this.normalizeFilter(this.value.filter);
764
669
  this.internalResponseFormat = this.value.responseFormat;
765
670
  this.limit = this.value.limit;
766
671
  }
@@ -775,10 +680,26 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
775
680
  render() {
776
681
  const guiSupported = this.checkGuiSupport();
777
682
  const showCodeMode = !this.guiModeEnabled || this.mode === 'code';
778
- return (h("div", { key: '96d1a933f699404c3806af3742e9ad30d53562aa', class: "lime-query-builder" }, this.renderLabel(), this.renderModeControls(guiSupported), showCodeMode
683
+ return (h("div", { key: '5ff70a352e3e57ff4c51d44627bd4b5ed367fff4', class: "lime-query-builder" }, this.renderLabel(), this.renderModeControls(guiSupported), showCodeMode
779
684
  ? this.renderCodeMode(guiSupported)
780
685
  : this.renderGuiMode()));
781
686
  }
687
+ /**
688
+ * Normalize filter to ensure top-level is an AND group.
689
+ * This ensures Add buttons are available in the UI.
690
+ * @param filter
691
+ */
692
+ normalizeFilter(filter) {
693
+ if (!filter) {
694
+ return { op: Zt.AND, exp: [] };
695
+ }
696
+ // If it's already an AND at the top level, keep it
697
+ if ('op' in filter && filter.op === Zt.AND) {
698
+ return filter;
699
+ }
700
+ // Otherwise wrap in AND
701
+ return { op: Zt.AND, exp: [filter] };
702
+ }
782
703
  emitChange() {
783
704
  // Only emit in GUI mode
784
705
  if (this.mode === 'code') {
@@ -796,7 +717,7 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
796
717
  const limeQuery = {
797
718
  limetype: this.limetype,
798
719
  responseFormat: responseFormat,
799
- filter: guiFilterToLimeQuery(this.filter),
720
+ filter: this.filter,
800
721
  };
801
722
  if (this.limit !== undefined && this.limit > 0) {
802
723
  limeQuery.limit = this.limit;
@@ -817,7 +738,7 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
817
738
  const limeQuery = {
818
739
  limetype: this.limetype,
819
740
  responseFormat: responseFormat,
820
- filter: guiFilterToLimeQuery(this.filter),
741
+ filter: this.filter,
821
742
  };
822
743
  if (this.limit !== undefined && this.limit > 0) {
823
744
  limeQuery.limit = this.limit;
@@ -868,7 +789,7 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
868
789
  queryToCheck = {
869
790
  limetype: this.limetype,
870
791
  responseFormat: responseFormat,
871
- filter: guiFilterToLimeQuery(this.filter),
792
+ filter: this.filter,
872
793
  };
873
794
  if (this.limit !== undefined && this.limit > 0) {
874
795
  queryToCheck.limit = this.limit;
@@ -949,18 +870,13 @@ function defineCustomElement$1() {
949
870
  if (typeof customElements === "undefined") {
950
871
  return;
951
872
  }
952
- const components = ["limebb-lime-query-builder", "limebb-lime-query-filter-and", "limebb-lime-query-filter-comparison", "limebb-lime-query-filter-expression", "limebb-lime-query-filter-not", "limebb-lime-query-filter-or", "limebb-lime-query-value-input", "limebb-limetype-field", "limebb-property-selector", "limebb-response-format-editor", "limebb-response-format-item"];
873
+ const components = ["limebb-lime-query-builder", "limebb-lime-query-filter-comparison", "limebb-lime-query-filter-expression", "limebb-lime-query-filter-group", "limebb-lime-query-filter-not", "limebb-lime-query-value-input", "limebb-limetype-field", "limebb-property-selector", "limebb-response-format-editor", "limebb-response-format-item"];
953
874
  components.forEach(tagName => { switch (tagName) {
954
875
  case "limebb-lime-query-builder":
955
876
  if (!customElements.get(tagName)) {
956
877
  customElements.define(tagName, LimeQueryBuilder);
957
878
  }
958
879
  break;
959
- case "limebb-lime-query-filter-and":
960
- if (!customElements.get(tagName)) {
961
- defineCustomElement$b();
962
- }
963
- break;
964
880
  case "limebb-lime-query-filter-comparison":
965
881
  if (!customElements.get(tagName)) {
966
882
  defineCustomElement$a();
@@ -971,12 +887,12 @@ function defineCustomElement$1() {
971
887
  defineCustomElement$9();
972
888
  }
973
889
  break;
974
- case "limebb-lime-query-filter-not":
890
+ case "limebb-lime-query-filter-group":
975
891
  if (!customElements.get(tagName)) {
976
892
  defineCustomElement$8();
977
893
  }
978
894
  break;
979
- case "limebb-lime-query-filter-or":
895
+ case "limebb-lime-query-filter-not":
980
896
  if (!customElements.get(tagName)) {
981
897
  defineCustomElement$7();
982
898
  }
@@ -1,4 +1,133 @@
1
- import { L as LimeQueryFilterAndComponent, c as defineCustomElement$1 } from './lime-query-filter-and.js';
1
+ import { proxyCustomElement, HTMLElement, createEvent, h } from '@stencil/core/internal/client';
2
+ import { Z as Zt } from './index.esm.js';
3
+ import { d as defineCustomElement$7 } from './lime-query-filter-comparison.js';
4
+ import { d as defineCustomElement$4, a as defineCustomElement$5, b as defineCustomElement$6 } from './lime-query-filter-expression.js';
5
+ import { d as defineCustomElement$3 } from './lime-query-value-input.js';
6
+ import { d as defineCustomElement$2 } from './property-selector.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 = /*@__PURE__*/ proxyCustomElement(class LimeQueryFilterAndComponent extends HTMLElement {
12
+ constructor() {
13
+ super();
14
+ this.__registerHost();
15
+ this.__attachShadow();
16
+ this.expressionChange = createEvent(this, "expressionChange", 7);
17
+ 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) })));
18
+ this.handleAddChildExpression = () => {
19
+ const newOrGroup = {
20
+ op: Zt.OR,
21
+ exp: [
22
+ {
23
+ key: '',
24
+ op: Zt.EQUALS,
25
+ exp: '',
26
+ },
27
+ ],
28
+ };
29
+ const updatedExpressionsList = [
30
+ ...this.expression.exp,
31
+ newOrGroup,
32
+ ];
33
+ this.expressionChange.emit({
34
+ op: Zt.AND,
35
+ exp: updatedExpressionsList,
36
+ });
37
+ };
38
+ this.handleExpressionChange = (updatedChildIndex) => (event) => {
39
+ var _a;
40
+ event.stopPropagation();
41
+ const updatedExpression = (_a = event.detail) !== null && _a !== void 0 ? _a : undefined;
42
+ const expressions = [...this.expression.exp];
43
+ if (updatedExpression === undefined) {
44
+ expressions.splice(updatedChildIndex, 1);
45
+ }
46
+ else {
47
+ expressions[updatedChildIndex] = updatedExpression;
48
+ }
49
+ if (expressions.length === 0) {
50
+ this.expressionChange.emit(undefined);
51
+ return;
52
+ }
53
+ if (expressions.length === 1) {
54
+ this.expressionChange.emit(expressions[0]);
55
+ return;
56
+ }
57
+ this.expressionChange.emit({
58
+ op: Zt.AND,
59
+ exp: expressions,
60
+ });
61
+ };
62
+ }
63
+ render() {
64
+ let subheading = 'All of these conditions are true';
65
+ if (this.expression.exp.length <= 1) {
66
+ subheading = '';
67
+ }
68
+ 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()))));
69
+ }
70
+ renderAddChildExpression() {
71
+ return (h("limel-button", { label: this.getAddButtonLabel(), icon: "plus_math", onClick: this.handleAddChildExpression }));
72
+ }
73
+ getAddButtonLabel() {
74
+ if (this.expression.exp.length === 0) {
75
+ return 'Add a condition';
76
+ }
77
+ return 'Add another condition';
78
+ }
79
+ static get style() { return LimebbLimeQueryFilterAndStyle0; }
80
+ }, [1, "limebb-lime-query-filter-and", {
81
+ "platform": [16],
82
+ "context": [16],
83
+ "label": [1],
84
+ "limetype": [1],
85
+ "activeLimetype": [1, "active-limetype"],
86
+ "expression": [16]
87
+ }]);
88
+ function defineCustomElement$1() {
89
+ if (typeof customElements === "undefined") {
90
+ return;
91
+ }
92
+ const components = ["limebb-lime-query-filter-and", "limebb-lime-query-filter-comparison", "limebb-lime-query-filter-expression", "limebb-lime-query-filter-group", "limebb-lime-query-filter-not", "limebb-lime-query-value-input", "limebb-property-selector"];
93
+ components.forEach(tagName => { switch (tagName) {
94
+ case "limebb-lime-query-filter-and":
95
+ if (!customElements.get(tagName)) {
96
+ customElements.define(tagName, LimeQueryFilterAndComponent);
97
+ }
98
+ break;
99
+ case "limebb-lime-query-filter-comparison":
100
+ if (!customElements.get(tagName)) {
101
+ defineCustomElement$7();
102
+ }
103
+ break;
104
+ case "limebb-lime-query-filter-expression":
105
+ if (!customElements.get(tagName)) {
106
+ defineCustomElement$6();
107
+ }
108
+ break;
109
+ case "limebb-lime-query-filter-group":
110
+ if (!customElements.get(tagName)) {
111
+ defineCustomElement$5();
112
+ }
113
+ break;
114
+ case "limebb-lime-query-filter-not":
115
+ if (!customElements.get(tagName)) {
116
+ defineCustomElement$4();
117
+ }
118
+ break;
119
+ case "limebb-lime-query-value-input":
120
+ if (!customElements.get(tagName)) {
121
+ defineCustomElement$3();
122
+ }
123
+ break;
124
+ case "limebb-property-selector":
125
+ if (!customElements.get(tagName)) {
126
+ defineCustomElement$2();
127
+ }
128
+ break;
129
+ } });
130
+ }
2
131
 
3
132
  const LimebbLimeQueryFilterAnd = LimeQueryFilterAndComponent;
4
133
  const defineCustomElement = defineCustomElement$1;
@@ -1,4 +1,4 @@
1
- import { a as LimeQueryFilterComparisonComponent, d as defineCustomElement$1 } from './lime-query-filter-comparison.js';
1
+ import { L as LimeQueryFilterComparisonComponent, d as defineCustomElement$1 } from './lime-query-filter-comparison.js';
2
2
 
3
3
  const LimebbLimeQueryFilterComparison = LimeQueryFilterComparisonComponent;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,4 +1,4 @@
1
- import { e as LimeQueryFilterExpressionComponent, b as defineCustomElement$1 } from './lime-query-filter-and.js';
1
+ import { L as LimeQueryFilterExpressionComponent, b as defineCustomElement$1 } from './lime-query-filter-expression.js';
2
2
 
3
3
  const LimebbLimeQueryFilterExpression = LimeQueryFilterExpressionComponent;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface LimebbLimeQueryFilterGroup extends Components.LimebbLimeQueryFilterGroup, HTMLElement {}
4
+ export const LimebbLimeQueryFilterGroup: {
5
+ prototype: LimebbLimeQueryFilterGroup;
6
+ new (): LimebbLimeQueryFilterGroup;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1,6 @@
1
+ import { c as LimeQueryFilterGroupComponent, a as defineCustomElement$1 } from './lime-query-filter-expression.js';
2
+
3
+ const LimebbLimeQueryFilterGroup = LimeQueryFilterGroupComponent;
4
+ const defineCustomElement = defineCustomElement$1;
5
+
6
+ export { LimebbLimeQueryFilterGroup, defineCustomElement };
@@ -1,4 +1,4 @@
1
- import { f as LimeQueryFilterNotComponent, a as defineCustomElement$1 } from './lime-query-filter-and.js';
1
+ import { e as LimeQueryFilterNotComponent, d as defineCustomElement$1 } from './lime-query-filter-expression.js';
2
2
 
3
3
  const LimebbLimeQueryFilterNot = LimeQueryFilterNotComponent;
4
4
  const defineCustomElement = defineCustomElement$1;