@limetech/lime-crm-building-blocks 1.97.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 +14 -0
  2. package/dist/cjs/{index.esm-a894ac76.js → index.esm-d785eb6e.js} +2 -0
  3. package/dist/cjs/lime-crm-building-blocks.cjs.js +1 -1
  4. package/dist/cjs/limebb-browser.cjs.entry.js +1 -1
  5. package/dist/cjs/limebb-chat-item_2.cjs.entry.js +1 -1
  6. package/dist/cjs/limebb-chat-list.cjs.entry.js +1 -1
  7. package/dist/cjs/limebb-component-config.cjs.entry.js +1 -1
  8. package/dist/cjs/limebb-component-picker.cjs.entry.js +1 -1
  9. package/dist/cjs/limebb-currency-picker.cjs.entry.js +1 -1
  10. package/dist/cjs/limebb-date-picker.cjs.entry.js +1 -1
  11. package/dist/cjs/limebb-feed-timeline-item.cjs.entry.js +1 -1
  12. package/dist/cjs/limebb-feed.cjs.entry.js +1 -1
  13. package/dist/cjs/limebb-info-tile.cjs.entry.js +1 -1
  14. package/dist/cjs/limebb-kanban-group.cjs.entry.js +1 -1
  15. package/dist/cjs/limebb-kanban-item.cjs.entry.js +1 -1
  16. package/dist/cjs/limebb-lime-query-builder.cjs.entry.js +90 -174
  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 +60 -24
  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 +96 -184
  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 +89 -173
  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 +19 -2
  148. package/dist/types/components/lime-query-builder/lime-query.types.d.ts +2 -1
  149. package/dist/types/components.d.ts +209 -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-3b0a15ec.js +0 -1
  165. package/dist/lime-crm-building-blocks/p-5a6d2e7f.js +0 -1
  166. package/dist/lime-crm-building-blocks/p-60971d64.js +0 -1
  167. package/dist/lime-crm-building-blocks/p-70a28b93.entry.js +0 -1
  168. package/dist/lime-crm-building-blocks/p-96beaabc.entry.js +0 -1
  169. package/dist/lime-crm-building-blocks/p-b7c72179.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
  };
@@ -707,10 +612,6 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
707
612
  this.limit = value ? Number.parseInt(value, 10) : undefined;
708
613
  this.emitChange();
709
614
  };
710
- this.handleActiveLimetypeChange = (event) => {
711
- event.stopPropagation();
712
- this.activeLimetype = event.detail || undefined;
713
- };
714
615
  this.switchToGui = () => {
715
616
  // Validate JSON before switching
716
617
  try {
@@ -723,7 +624,7 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
723
624
  }
724
625
  // Update internal state from parsed query
725
626
  this.limetype = parsed.limetype || '';
726
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(parsed.filter));
627
+ this.filter = this.normalizeFilter(parsed.filter);
727
628
  this.internalResponseFormat = parsed.responseFormat;
728
629
  this.limit = parsed.limit;
729
630
  this.mode = 'gui';
@@ -764,7 +665,7 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
764
665
  }
765
666
  if (this.value) {
766
667
  this.limetype = this.value.limetype || '';
767
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(this.value.filter));
668
+ this.filter = this.normalizeFilter(this.value.filter);
768
669
  this.internalResponseFormat = this.value.responseFormat;
769
670
  this.limit = this.value.limit;
770
671
  }
@@ -779,10 +680,26 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
779
680
  render() {
780
681
  const guiSupported = this.checkGuiSupport();
781
682
  const showCodeMode = !this.guiModeEnabled || this.mode === 'code';
782
- return (h("div", { key: 'd179549c02b40689f61a47f327c9b4ab3e578258', 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
783
684
  ? this.renderCodeMode(guiSupported)
784
685
  : this.renderGuiMode()));
785
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
+ }
786
703
  emitChange() {
787
704
  // Only emit in GUI mode
788
705
  if (this.mode === 'code') {
@@ -800,7 +717,7 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
800
717
  const limeQuery = {
801
718
  limetype: this.limetype,
802
719
  responseFormat: responseFormat,
803
- filter: guiFilterToLimeQuery(this.filter),
720
+ filter: this.filter,
804
721
  };
805
722
  if (this.limit !== undefined && this.limit > 0) {
806
723
  limeQuery.limit = this.limit;
@@ -821,7 +738,7 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
821
738
  const limeQuery = {
822
739
  limetype: this.limetype,
823
740
  responseFormat: responseFormat,
824
- filter: guiFilterToLimeQuery(this.filter),
741
+ filter: this.filter,
825
742
  };
826
743
  if (this.limit !== undefined && this.limit > 0) {
827
744
  limeQuery.limit = this.limit;
@@ -872,7 +789,7 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
872
789
  queryToCheck = {
873
790
  limetype: this.limetype,
874
791
  responseFormat: responseFormat,
875
- filter: guiFilterToLimeQuery(this.filter),
792
+ filter: this.filter,
876
793
  };
877
794
  if (this.limit !== undefined && this.limit > 0) {
878
795
  queryToCheck.limit = this.limit;
@@ -911,7 +828,7 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
911
828
  if (!this.limetype) {
912
829
  return;
913
830
  }
914
- return (h("div", { class: "query-options-section" }, h("h4", { class: "section-label" }, "Query Options"), h("div", { class: "query-options-controls" }, h("limebb-limetype-field", { platform: this.platform, context: this.context, label: "Active Object Type", value: this.activeLimetype, required: false, fieldName: "activeLimetype", helperText: "Limetype of the active object (for %activeObject% placeholders)", onChange: this.handleActiveLimetypeChange }), h("limel-input-field", { label: "Limit", type: "number", value: ((_a = this.limit) === null || _a === void 0 ? void 0 : _a.toString()) || '', placeholder: "No limit", helperText: "Maximum number of results", onChange: this.handleLimitChange }))));
831
+ return (h("div", { class: "query-options-section" }, h("h4", { class: "section-label" }, "Query Options"), h("div", { class: "query-options-controls" }, h("limel-input-field", { label: "Limit", type: "number", value: ((_a = this.limit) === null || _a === void 0 ? void 0 : _a.toString()) || '', placeholder: "No limit", helperText: "Maximum number of results", onChange: this.handleLimitChange }))));
915
832
  }
916
833
  renderGuiMode() {
917
834
  return (h("div", { class: "gui-mode" }, this.renderLimetypeSection(), this.renderResponseFormatSection(), this.renderFilterSection(), this.renderQueryOptionsSection()));
@@ -937,14 +854,14 @@ const LimeQueryBuilder = /*@__PURE__*/ proxyCustomElement(class LimeQueryBuilder
937
854
  "context": [16],
938
855
  "value": [16],
939
856
  "label": [1],
857
+ "activeLimetype": [1, "active-limetype"],
940
858
  "limetypes": [32],
941
859
  "mode": [32],
942
860
  "codeValue": [32],
943
861
  "limetype": [32],
944
862
  "filter": [32],
945
863
  "internalResponseFormat": [32],
946
- "limit": [32],
947
- "activeLimetype": [32]
864
+ "limit": [32]
948
865
  }]);
949
866
  __decorate([
950
867
  Te()
@@ -953,18 +870,13 @@ function defineCustomElement$1() {
953
870
  if (typeof customElements === "undefined") {
954
871
  return;
955
872
  }
956
- 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"];
957
874
  components.forEach(tagName => { switch (tagName) {
958
875
  case "limebb-lime-query-builder":
959
876
  if (!customElements.get(tagName)) {
960
877
  customElements.define(tagName, LimeQueryBuilder);
961
878
  }
962
879
  break;
963
- case "limebb-lime-query-filter-and":
964
- if (!customElements.get(tagName)) {
965
- defineCustomElement$b();
966
- }
967
- break;
968
880
  case "limebb-lime-query-filter-comparison":
969
881
  if (!customElements.get(tagName)) {
970
882
  defineCustomElement$a();
@@ -975,12 +887,12 @@ function defineCustomElement$1() {
975
887
  defineCustomElement$9();
976
888
  }
977
889
  break;
978
- case "limebb-lime-query-filter-not":
890
+ case "limebb-lime-query-filter-group":
979
891
  if (!customElements.get(tagName)) {
980
892
  defineCustomElement$8();
981
893
  }
982
894
  break;
983
- case "limebb-lime-query-filter-or":
895
+ case "limebb-lime-query-filter-not":
984
896
  if (!customElements.get(tagName)) {
985
897
  defineCustomElement$7();
986
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;