@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
@@ -3,66 +3,67 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-ff255a0d.js');
6
- const index_esm = require('./index.esm-a894ac76.js');
7
- const limeQuery_types = require('./lime-query.types-bcb63a22.js');
6
+ const index_esm = require('./index.esm-d785eb6e.js');
8
7
  const propertyResolution = require('./property-resolution-fb42a46b.js');
9
8
 
10
9
  /**
11
- * Convert UI filter representation to Lime Query filter format
12
- * @param filter
10
+ * TypeScript type definitions for Lime Query DSL
11
+ *
12
+ * These types represent the structure of Lime Query as defined in:
13
+ * - lime-core/lime_query/schema.py
14
+ * - lime-core/lime_filter/schema.py
13
15
  */
14
- function guiFilterToLimeQuery(filter) {
15
- if (filter.filter_type === '') {
16
- return undefined;
17
- }
18
- if (filter.filter_type === 'comparison') {
19
- return {
20
- key: filter.property,
21
- op: filter.operator,
22
- exp: filter.value,
23
- };
24
- }
25
- if (filter.filter_type === 'AND') {
26
- const expressions = filter.expressions
27
- .map(guiFilterToLimeQuery)
28
- .filter((f) => f !== undefined);
29
- if (expressions.length === 0) {
30
- return undefined;
31
- }
32
- if (expressions.length === 1) {
33
- return expressions[0];
34
- }
35
- return {
36
- op: 'AND',
37
- exp: expressions,
38
- };
39
- }
40
- if (filter.filter_type === 'OR') {
41
- const expressions = filter.expressions
42
- .map(guiFilterToLimeQuery)
43
- .filter((f) => f !== undefined);
44
- if (expressions.length === 0) {
45
- return undefined;
46
- }
47
- if (expressions.length === 1) {
48
- return expressions[0];
49
- }
50
- return {
51
- op: 'OR',
52
- exp: expressions,
53
- };
54
- }
55
- if (filter.filter_type === 'NOT') {
56
- const innerFilter = guiFilterToLimeQuery(filter.expression);
57
- if (innerFilter) {
58
- return {
59
- op: '!',
60
- exp: innerFilter,
61
- };
62
- }
63
- }
64
- return undefined;
65
- }
16
+ /**
17
+ * Available operators with display metadata
18
+ */
19
+ const LIME_QUERY_OPERATORS = [
20
+ { value: '=', label: 'Equals', icon: 'equals' },
21
+ { value: '!=', label: 'Not Equals', icon: 'not-equal' },
22
+ {
23
+ value: '>',
24
+ label: 'Greater Than',
25
+ icon: 'greater-than',
26
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
27
+ },
28
+ {
29
+ value: '>=',
30
+ label: 'Greater or Equal',
31
+ icon: 'greater-or-equal',
32
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
33
+ },
34
+ {
35
+ value: '<',
36
+ label: 'Less Than',
37
+ icon: 'less-than',
38
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
39
+ },
40
+ {
41
+ value: '<=',
42
+ label: 'Less or Equal',
43
+ icon: 'less-or-equal',
44
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
45
+ },
46
+ { value: 'IN', label: 'In List', icon: 'list' },
47
+ {
48
+ value: '?',
49
+ label: 'Contains',
50
+ icon: '-lime-filter-contain',
51
+ applicableTypes: ['string', 'text'],
52
+ },
53
+ {
54
+ value: '=?',
55
+ label: 'Begins With',
56
+ icon: '-lime-filter-begin',
57
+ applicableTypes: ['string', 'text'],
58
+ },
59
+ {
60
+ value: '=$',
61
+ label: 'Ends With',
62
+ icon: '-lime-filter-end',
63
+ applicableTypes: ['string', 'text'],
64
+ },
65
+ ];
66
+
66
67
  /**
67
68
  * Validate and convert a FilterExpression (comparison filter)
68
69
  * @param filter
@@ -73,7 +74,7 @@ function validateAndConvertFilterExpression(filter) {
73
74
  throw new Error('Invalid filter: comparison must have key, op, and exp properties');
74
75
  }
75
76
  // Validate operator is supported
76
- const supportedOps = limeQuery_types.LIME_QUERY_OPERATORS.map((o) => o.value);
77
+ const supportedOps = LIME_QUERY_OPERATORS.map((o) => o.value);
77
78
  if (!supportedOps.includes(filter.op)) {
78
79
  throw new Error(`Unsupported filter operator: ${filter.op}`);
79
80
  }
@@ -164,103 +165,6 @@ function limeQueryToGuiFilter(filter) {
164
165
  // It's a FilterGroup
165
166
  return validateAndConvertFilterGroup(filter);
166
167
  }
167
- /**
168
- * Normalize filter for GUI mode by ensuring proper AND/OR wrapper structure.
169
- * GUI mode requires filters to be wrapped in AND([OR(...)]) so users have
170
- * access to add/remove buttons on the AND and OR components.
171
- *
172
- * This function ensures that:
173
- * - Single comparisons are wrapped in AND([OR([comparison])])
174
- * - OR groups are wrapped in AND([OR group])
175
- * - AND groups have their comparison children wrapped in OR
176
- * - Empty/undefined filters become AND([])
177
- *
178
- * When converting back to Lime Query JSON, limeQueryFilterToLimeQuery()
179
- * automatically unwraps single-item AND/OR groups.
180
- *
181
- * @param filter The filter expression from limeQueryToLimeQueryFilter
182
- * @returns Normalized filter suitable for GUI editing
183
- */
184
- function normalizeLimeQueryFilterForGui(filter) {
185
- // Empty AND is already correct for GUI
186
- if (filter.filter_type === 'AND' && filter.expressions.length === 0) {
187
- return filter;
188
- }
189
- // Single comparison needs wrapping
190
- if (filter.filter_type === 'comparison') {
191
- return {
192
- filter_type: 'AND',
193
- expressions: [
194
- {
195
- filter_type: 'OR',
196
- expressions: [filter],
197
- },
198
- ],
199
- };
200
- }
201
- // OR needs wrapping in AND
202
- if (filter.filter_type === 'OR') {
203
- return {
204
- filter_type: 'AND',
205
- expressions: [filter],
206
- };
207
- }
208
- // NOT needs wrapping
209
- if (filter.filter_type === 'NOT') {
210
- return {
211
- filter_type: 'AND',
212
- expressions: [
213
- {
214
- filter_type: 'OR',
215
- expressions: [filter],
216
- },
217
- ],
218
- };
219
- }
220
- // AND group - check if children need OR wrappers
221
- if (filter.filter_type === 'AND') {
222
- const normalizedChildren = filter.expressions.map((child) => {
223
- // If child is already OR, keep it
224
- if (child.filter_type === 'OR') {
225
- return child;
226
- }
227
- // If child is NOT, keep it (NOT can be a direct child of AND)
228
- if (child.filter_type === 'NOT') {
229
- return child;
230
- }
231
- // If child is comparison, wrap in OR
232
- if (child.filter_type === 'comparison') {
233
- return {
234
- filter_type: 'OR',
235
- expressions: [child],
236
- };
237
- }
238
- // If child is nested AND, recursively normalize and wrap in OR
239
- if (child.filter_type === 'AND') {
240
- return {
241
- filter_type: 'OR',
242
- expressions: [normalizeLimeQueryFilterForGui(child)],
243
- };
244
- }
245
- // Unknown filter type, keep as is
246
- return child;
247
- });
248
- return {
249
- filter_type: 'AND',
250
- expressions: normalizedChildren,
251
- };
252
- }
253
- // Fallback: wrap in AND/OR structure
254
- return {
255
- filter_type: 'AND',
256
- expressions: [
257
- {
258
- filter_type: 'OR',
259
- expressions: [filter],
260
- },
261
- ],
262
- };
263
- }
264
168
 
265
169
  /**
266
170
  * Dynamic filter values and placeholders that are valid in Lime Query
@@ -660,16 +564,16 @@ const LimeQueryBuilder = class {
660
564
  this.codeValue = '';
661
565
  this.limetype = '';
662
566
  this.filter = {
663
- filter_type: 'AND',
664
- expressions: [],
567
+ op: index_esm.Zt.AND,
568
+ exp: [],
665
569
  };
666
570
  this.handleLimetypeChange = (event) => {
667
571
  event.stopPropagation();
668
572
  this.limetype = event.detail;
669
573
  // Reset filter when limetype changes
670
574
  this.filter = {
671
- filter_type: 'AND',
672
- expressions: [],
575
+ op: index_esm.Zt.AND,
576
+ exp: [],
673
577
  };
674
578
  // Reset response format when limetype changes
675
579
  this.internalResponseFormat = {
@@ -681,15 +585,15 @@ const LimeQueryBuilder = class {
681
585
  };
682
586
  this.handleFilterChange = (event) => {
683
587
  event.stopPropagation();
684
- // Convert missing expression back to empty AND to keep the UI consistent
685
- if (event.detail.filter_type === '') {
588
+ const expression = event.detail;
589
+ if (expression === undefined) {
686
590
  this.filter = {
687
- filter_type: 'AND',
688
- expressions: [],
591
+ op: index_esm.Zt.AND,
592
+ exp: [],
689
593
  };
690
594
  }
691
595
  else {
692
- this.filter = event.detail;
596
+ this.filter = expression;
693
597
  }
694
598
  this.emitChange();
695
599
  };
@@ -704,10 +608,6 @@ const LimeQueryBuilder = class {
704
608
  this.limit = value ? Number.parseInt(value, 10) : undefined;
705
609
  this.emitChange();
706
610
  };
707
- this.handleActiveLimetypeChange = (event) => {
708
- event.stopPropagation();
709
- this.activeLimetype = event.detail || undefined;
710
- };
711
611
  this.switchToGui = () => {
712
612
  // Validate JSON before switching
713
613
  try {
@@ -720,7 +620,7 @@ const LimeQueryBuilder = class {
720
620
  }
721
621
  // Update internal state from parsed query
722
622
  this.limetype = parsed.limetype || '';
723
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(parsed.filter));
623
+ this.filter = this.normalizeFilter(parsed.filter);
724
624
  this.internalResponseFormat = parsed.responseFormat;
725
625
  this.limit = parsed.limit;
726
626
  this.mode = 'gui';
@@ -761,7 +661,7 @@ const LimeQueryBuilder = class {
761
661
  }
762
662
  if (this.value) {
763
663
  this.limetype = this.value.limetype || '';
764
- this.filter = normalizeLimeQueryFilterForGui(limeQueryToGuiFilter(this.value.filter));
664
+ this.filter = this.normalizeFilter(this.value.filter);
765
665
  this.internalResponseFormat = this.value.responseFormat;
766
666
  this.limit = this.value.limit;
767
667
  }
@@ -776,10 +676,26 @@ const LimeQueryBuilder = class {
776
676
  render() {
777
677
  const guiSupported = this.checkGuiSupport();
778
678
  const showCodeMode = !this.guiModeEnabled || this.mode === 'code';
779
- return (index.h("div", { key: 'd179549c02b40689f61a47f327c9b4ab3e578258', class: "lime-query-builder" }, this.renderLabel(), this.renderModeControls(guiSupported), showCodeMode
679
+ return (index.h("div", { key: '5ff70a352e3e57ff4c51d44627bd4b5ed367fff4', class: "lime-query-builder" }, this.renderLabel(), this.renderModeControls(guiSupported), showCodeMode
780
680
  ? this.renderCodeMode(guiSupported)
781
681
  : this.renderGuiMode()));
782
682
  }
683
+ /**
684
+ * Normalize filter to ensure top-level is an AND group.
685
+ * This ensures Add buttons are available in the UI.
686
+ * @param filter
687
+ */
688
+ normalizeFilter(filter) {
689
+ if (!filter) {
690
+ return { op: index_esm.Zt.AND, exp: [] };
691
+ }
692
+ // If it's already an AND at the top level, keep it
693
+ if ('op' in filter && filter.op === index_esm.Zt.AND) {
694
+ return filter;
695
+ }
696
+ // Otherwise wrap in AND
697
+ return { op: index_esm.Zt.AND, exp: [filter] };
698
+ }
783
699
  emitChange() {
784
700
  // Only emit in GUI mode
785
701
  if (this.mode === 'code') {
@@ -797,7 +713,7 @@ const LimeQueryBuilder = class {
797
713
  const limeQuery = {
798
714
  limetype: this.limetype,
799
715
  responseFormat: responseFormat,
800
- filter: guiFilterToLimeQuery(this.filter),
716
+ filter: this.filter,
801
717
  };
802
718
  if (this.limit !== undefined && this.limit > 0) {
803
719
  limeQuery.limit = this.limit;
@@ -818,7 +734,7 @@ const LimeQueryBuilder = class {
818
734
  const limeQuery = {
819
735
  limetype: this.limetype,
820
736
  responseFormat: responseFormat,
821
- filter: guiFilterToLimeQuery(this.filter),
737
+ filter: this.filter,
822
738
  };
823
739
  if (this.limit !== undefined && this.limit > 0) {
824
740
  limeQuery.limit = this.limit;
@@ -869,7 +785,7 @@ const LimeQueryBuilder = class {
869
785
  queryToCheck = {
870
786
  limetype: this.limetype,
871
787
  responseFormat: responseFormat,
872
- filter: guiFilterToLimeQuery(this.filter),
788
+ filter: this.filter,
873
789
  };
874
790
  if (this.limit !== undefined && this.limit > 0) {
875
791
  queryToCheck.limit = this.limit;
@@ -908,7 +824,7 @@ const LimeQueryBuilder = class {
908
824
  if (!this.limetype) {
909
825
  return;
910
826
  }
911
- return (index.h("div", { class: "query-options-section" }, index.h("h4", { class: "section-label" }, "Query Options"), index.h("div", { class: "query-options-controls" }, index.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 }), index.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 }))));
827
+ return (index.h("div", { class: "query-options-section" }, index.h("h4", { class: "section-label" }, "Query Options"), index.h("div", { class: "query-options-controls" }, index.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 }))));
912
828
  }
913
829
  renderGuiMode() {
914
830
  return (index.h("div", { class: "gui-mode" }, this.renderLimetypeSection(), this.renderResponseFormatSection(), this.renderFilterSection(), this.renderQueryOptionsSection()));
@@ -0,0 +1,80 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const index = require('./index-ff255a0d.js');
6
+ const index_esm = require('./index.esm-d785eb6e.js');
7
+
8
+ const limeQueryFilterAndCss = "@charset \"UTF-8\";.expression{display:flex;flex-direction:column;margin-bottom:1rem;gap:0;background-color:rgb(var(--contrast-100));border:1px solid rgb(var(--contrast-500));border-radius:0.75rem}.expression>ul{margin-top:0;margin-right:1rem;margin-bottom:1rem;margin-left:1rem;padding-left:1rem;list-style:disc}.expression>ul li{margin-top:1rem}.expression>ul li.add-button{list-style:none}";
9
+ const LimebbLimeQueryFilterAndStyle0 = limeQueryFilterAndCss;
10
+
11
+ const LimeQueryFilterAndComponent = class {
12
+ constructor(hostRef) {
13
+ index.registerInstance(this, hostRef);
14
+ this.expressionChange = index.createEvent(this, "expressionChange", 7);
15
+ this.renderChildExpression = (expression, childIndex) => (index.h("li", null, index.h("limebb-lime-query-filter-expression", { platform: this.platform, context: this.context, limetype: this.limetype, activeLimetype: this.activeLimetype, expression: expression, onExpressionChange: this.handleExpressionChange(childIndex) })));
16
+ this.handleAddChildExpression = () => {
17
+ const newOrGroup = {
18
+ op: index_esm.Zt.OR,
19
+ exp: [
20
+ {
21
+ key: '',
22
+ op: index_esm.Zt.EQUALS,
23
+ exp: '',
24
+ },
25
+ ],
26
+ };
27
+ const updatedExpressionsList = [
28
+ ...this.expression.exp,
29
+ newOrGroup,
30
+ ];
31
+ this.expressionChange.emit({
32
+ op: index_esm.Zt.AND,
33
+ exp: updatedExpressionsList,
34
+ });
35
+ };
36
+ this.handleExpressionChange = (updatedChildIndex) => (event) => {
37
+ var _a;
38
+ event.stopPropagation();
39
+ const updatedExpression = (_a = event.detail) !== null && _a !== void 0 ? _a : undefined;
40
+ const expressions = [...this.expression.exp];
41
+ if (updatedExpression === undefined) {
42
+ expressions.splice(updatedChildIndex, 1);
43
+ }
44
+ else {
45
+ expressions[updatedChildIndex] = updatedExpression;
46
+ }
47
+ if (expressions.length === 0) {
48
+ this.expressionChange.emit(undefined);
49
+ return;
50
+ }
51
+ if (expressions.length === 1) {
52
+ this.expressionChange.emit(expressions[0]);
53
+ return;
54
+ }
55
+ this.expressionChange.emit({
56
+ op: index_esm.Zt.AND,
57
+ exp: expressions,
58
+ });
59
+ };
60
+ }
61
+ render() {
62
+ let subheading = 'All of these conditions are true';
63
+ if (this.expression.exp.length <= 1) {
64
+ subheading = '';
65
+ }
66
+ return (index.h("div", { key: 'f07c53808d6be8d846f5a45223abb5c94b1a0b16', class: "expression" }, (this.label || subheading) && (index.h("limel-header", { key: '229f0d58ff15743fbb12da53ad9c593bfba801d1', heading: this.label, subheading: subheading })), index.h("ul", { key: '2600c2bee2b958036ea606141bcfcac0e277114c' }, this.expression.exp.map(this.renderChildExpression), index.h("li", { key: '6395e605ee8f454a820ac73601da89b19686187a', class: "add-button" }, this.renderAddChildExpression()))));
67
+ }
68
+ renderAddChildExpression() {
69
+ return (index.h("limel-button", { label: this.getAddButtonLabel(), icon: "plus_math", onClick: this.handleAddChildExpression }));
70
+ }
71
+ getAddButtonLabel() {
72
+ if (this.expression.exp.length === 0) {
73
+ return 'Add a condition';
74
+ }
75
+ return 'Add another condition';
76
+ }
77
+ };
78
+ LimeQueryFilterAndComponent.style = LimebbLimeQueryFilterAndStyle0;
79
+
80
+ exports.limebb_lime_query_filter_and = LimeQueryFilterAndComponent;
@@ -0,0 +1,147 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const index = require('./index-ff255a0d.js');
6
+ const index_esm = require('./index.esm-d785eb6e.js');
7
+
8
+ const limeQueryFilterComparisonCss = ".expression-container{display:flex;flex-direction:row;align-items:flex-start;gap:1rem;flex-wrap:wrap}.expression-container>*{flex-grow:2;width:30%;max-width:calc(100% - 3.25rem)}.expression-container>.operator{flex-grow:1;width:calc(30% + 1rem);min-width:4rem}.expression-container>.remove{flex-grow:0;width:auto;margin-left:auto}@media (max-width: 768px){.expression-container{flex-direction:column}.expression-container>*{width:100%;max-width:100%}.expression-container>.operator{width:100%}.expression-container>.remove{margin-left:0;align-self:flex-end}}";
9
+ const LimebbLimeQueryFilterComparisonStyle0 = limeQueryFilterComparisonCss;
10
+
11
+ const LIME_QUERY_OPERATORS = [
12
+ { value: index_esm.Zt.EQUALS, label: 'Equals', icon: 'equals' },
13
+ { value: index_esm.Zt.NOT_EQUALS, label: 'Not Equals', icon: 'not-equal' },
14
+ {
15
+ value: index_esm.Zt.GREATER,
16
+ label: 'Greater Than',
17
+ icon: 'greater-than',
18
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
19
+ },
20
+ {
21
+ value: index_esm.Zt.GREATER_OR_EQUAL,
22
+ label: 'Greater or Equal',
23
+ icon: 'greater-or-equal',
24
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
25
+ },
26
+ {
27
+ value: index_esm.Zt.LESS,
28
+ label: 'Less Than',
29
+ icon: 'less-than',
30
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
31
+ },
32
+ {
33
+ value: index_esm.Zt.LESS_OR_EQUAL,
34
+ label: 'Less or Equal',
35
+ icon: 'less-or-equal',
36
+ applicableTypes: ['integer', 'decimal', 'date', 'time'],
37
+ },
38
+ { value: index_esm.Zt.IN, label: 'In List', icon: 'list' },
39
+ {
40
+ value: index_esm.Zt.LIKE,
41
+ label: 'Contains',
42
+ icon: '-lime-filter-contain',
43
+ applicableTypes: ['string', 'text'],
44
+ },
45
+ {
46
+ value: index_esm.Zt.BEGINS,
47
+ label: 'Begins With',
48
+ icon: '-lime-filter-begin',
49
+ applicableTypes: ['string', 'text'],
50
+ },
51
+ {
52
+ value: index_esm.Zt.ENDS,
53
+ label: 'Ends With',
54
+ icon: '-lime-filter-end',
55
+ applicableTypes: ['string', 'text'],
56
+ },
57
+ ];
58
+ const LimeQueryFilterComparisonComponent = class {
59
+ constructor(hostRef) {
60
+ index.registerInstance(this, hostRef);
61
+ this.expressionChange = index.createEvent(this, "expressionChange", 7);
62
+ this.handlePropertyChange = (event) => {
63
+ event.stopPropagation();
64
+ this.expressionChange.emit(Object.assign(Object.assign({}, this.expression), { key: event.detail }));
65
+ };
66
+ this.handleOperatorChange = (event) => {
67
+ event.stopPropagation();
68
+ // TODO: Clear value when switching between IN and other operators
69
+ // since array values are incompatible with single-value operators
70
+ this.expressionChange.emit({
71
+ key: this.expression.key,
72
+ op: event.detail.value,
73
+ exp: this.expression.exp,
74
+ });
75
+ };
76
+ this.handleValueChange = (event) => {
77
+ event.stopPropagation();
78
+ this.expressionChange.emit(Object.assign(Object.assign({}, this.expression), { exp: event.detail }));
79
+ };
80
+ this.removeExpression = () => {
81
+ this.expressionChange.emit(undefined);
82
+ };
83
+ }
84
+ render() {
85
+ return (index.h("div", { key: '668e0f05bdb1fb25ffd652ea650c34e5431a3332', class: "expression" }, this.label && index.h("limel-header", { key: '5034070b58afe31cf90699dd2a27f884e647f540', heading: this.label }), index.h("div", { key: '14a2b1270e5e6d7e158e29ebc5f61051e5670e80', class: "expression-container" }, this.renderPropertySelector(), this.renderOperator(), this.renderValueInput(), index.h("limel-icon-button", { key: 'b69bde6e88c40d2623ef015794db28cec3676c73', class: "remove", icon: "trash", label: "Remove condition", onClick: this.removeExpression }))));
86
+ }
87
+ renderPropertySelector() {
88
+ return (index.h("limebb-property-selector", { platform: this.platform, context: this.context, label: "Property", limetype: this.limetype, value: this.expression.key, required: true, onChange: this.handlePropertyChange }));
89
+ }
90
+ renderOperator() {
91
+ const operatorHasBeenSet = !!this.expression.op;
92
+ const options = LIME_QUERY_OPERATORS.map((op) => ({
93
+ text: op.label,
94
+ value: op.value,
95
+ icon: op.icon ? { name: op.icon } : undefined,
96
+ }));
97
+ const selectedOption = options.find((o) => o.value === this.expression.op);
98
+ return (index.h("limel-select", { class: "operator", label: "Operator", value: selectedOption, options: options, disabled: !operatorHasBeenSet && !this.expression.key, onChange: this.handleOperatorChange }));
99
+ }
100
+ renderValueInput() {
101
+ if (!this.expression.op) {
102
+ return null;
103
+ }
104
+ return (index.h("limebb-lime-query-value-input", { platform: this.platform, context: this.context, limetype: this.limetype, activeLimetype: this.activeLimetype, propertyPath: this.expression.key, operator: this.expression.op, value: this.expression.exp, onChange: this.handleValueChange }));
105
+ }
106
+ };
107
+ LimeQueryFilterComparisonComponent.style = LimebbLimeQueryFilterComparisonStyle0;
108
+
109
+ const limeQueryFilterExpressionCss = "@charset \"UTF-8\";.expression{display:flex;flex-direction:column;margin-bottom:1rem;gap:1rem}";
110
+ const LimebbLimeQueryFilterExpressionStyle0 = limeQueryFilterExpressionCss;
111
+
112
+ const LimeQueryFilterExpressionComponent = class {
113
+ constructor(hostRef) {
114
+ index.registerInstance(this, hostRef);
115
+ this.expressionChange = index.createEvent(this, "expressionChange", 7);
116
+ this.handleExpressionChange = (event) => {
117
+ event.stopPropagation();
118
+ this.expressionChange.emit(event.detail);
119
+ };
120
+ }
121
+ render() {
122
+ if (!this.expression) {
123
+ return;
124
+ }
125
+ const props = {
126
+ platform: this.platform,
127
+ context: this.context,
128
+ label: this.label,
129
+ limetype: this.limetype,
130
+ activeLimetype: this.activeLimetype,
131
+ };
132
+ if ('key' in this.expression) {
133
+ return (index.h("limebb-lime-query-filter-comparison", Object.assign({}, props, { expression: this.expression, onExpressionChange: this.handleExpressionChange })));
134
+ }
135
+ if (this.expression.op === index_esm.Zt.AND ||
136
+ this.expression.op === index_esm.Zt.OR) {
137
+ return (index.h("limebb-lime-query-filter-group", Object.assign({}, props, { expression: this.expression, onExpressionChange: this.handleExpressionChange })));
138
+ }
139
+ if (this.expression.op === index_esm.Zt.NOT) {
140
+ return (index.h("limebb-lime-query-filter-not", Object.assign({}, props, { expression: this.expression, onExpressionChange: this.handleExpressionChange })));
141
+ }
142
+ }
143
+ };
144
+ LimeQueryFilterExpressionComponent.style = LimebbLimeQueryFilterExpressionStyle0;
145
+
146
+ exports.limebb_lime_query_filter_comparison = LimeQueryFilterComparisonComponent;
147
+ exports.limebb_lime_query_filter_expression = LimeQueryFilterExpressionComponent;