@limetech/lime-crm-building-blocks 1.99.0 → 1.100.1

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 (106) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/lime-crm-building-blocks.cjs.js +1 -1
  3. package/dist/cjs/limebb-lime-query-builder.cjs.entry.js +52 -216
  4. package/dist/cjs/{limebb-limetype-field_2.cjs.entry.js → limebb-lime-query-filter-builder_3.cjs.entry.js} +72 -1
  5. package/dist/cjs/limebb-lime-query-filter-comparison_2.cjs.entry.js +1 -1
  6. package/dist/cjs/{limebb-lime-query-filter-group_4.cjs.entry.js → limebb-lime-query-filter-group_3.cjs.entry.js} +5 -231
  7. package/dist/cjs/limebb-live-docs-info.cjs.entry.js +2 -2
  8. package/dist/cjs/limebb-locale-picker.cjs.entry.js +1 -1
  9. package/dist/cjs/limebb-mention-group-counter.cjs.entry.js +2 -2
  10. package/dist/cjs/limebb-navigation-button_2.cjs.entry.js +3 -3
  11. package/dist/cjs/limebb-notification-item.cjs.entry.js +1 -1
  12. package/dist/cjs/limebb-percentage-visualizer.cjs.entry.js +2 -2
  13. package/dist/cjs/limebb-property-selector.cjs.entry.js +234 -0
  14. package/dist/cjs/limebb-text-editor.cjs.entry.js +1 -1
  15. package/dist/cjs/limebb-trend-indicator.cjs.entry.js +1 -1
  16. package/dist/cjs/loader.cjs.js +1 -1
  17. package/dist/collection/collection-manifest.json +1 -2
  18. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-builder.css +5 -0
  19. package/dist/collection/components/lime-query-builder/expressions/{lime-query-filter-and.js → lime-query-filter-builder.js} +59 -83
  20. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-comparison.js +1 -1
  21. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-group.js +1 -1
  22. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-not.js +1 -1
  23. package/dist/collection/components/lime-query-builder/expressions/lime-query-value-input.js +7 -7
  24. package/dist/collection/components/lime-query-builder/lime-query-builder.js +9 -39
  25. package/dist/collection/components/lime-query-builder/lime-query-validation.js +46 -19
  26. package/dist/collection/components/lime-query-builder/lime-query.types.js +1 -57
  27. package/dist/collection/components/lime-query-builder/limetype-field/limetype-field.js +1 -1
  28. package/dist/collection/components/limeobject/file-viewer/live-docs-info.js +2 -2
  29. package/dist/collection/components/locale-picker/locale-picker.js +1 -1
  30. package/dist/collection/components/notification-list/notification-item/notification-item.js +1 -1
  31. package/dist/collection/components/percentage-visualizer/percentage-visualizer.js +2 -2
  32. package/dist/collection/components/summary-popover/summary-popover.js +3 -3
  33. package/dist/collection/components/text-editor/mention-group-counter.js +2 -2
  34. package/dist/collection/components/text-editor/text-editor.js +1 -1
  35. package/dist/collection/components/trend-indicator/trend-indicator.js +1 -1
  36. package/dist/components/lime-query-filter-builder.js +129 -0
  37. package/dist/components/lime-query-filter-comparison.js +1 -1
  38. package/dist/components/lime-query-filter-expression.js +2 -2
  39. package/dist/components/lime-query-value-input.js +2 -2
  40. package/dist/components/limebb-lime-query-builder.js +60 -218
  41. package/dist/components/limebb-lime-query-filter-builder.d.ts +11 -0
  42. package/dist/components/limebb-lime-query-filter-builder.js +6 -0
  43. package/dist/components/limebb-locale-picker.js +1 -1
  44. package/dist/components/limebb-mention-group-counter.js +2 -2
  45. package/dist/components/limebb-percentage-visualizer.js +2 -2
  46. package/dist/components/limebb-text-editor.js +1 -1
  47. package/dist/components/limebb-trend-indicator.js +1 -1
  48. package/dist/components/limetype-field.js +1 -1
  49. package/dist/components/live-docs-info.js +2 -2
  50. package/dist/components/notification-item.js +1 -1
  51. package/dist/components/summary-popover.js +3 -3
  52. package/dist/esm/lime-crm-building-blocks.js +1 -1
  53. package/dist/esm/limebb-lime-query-builder.entry.js +53 -217
  54. package/dist/esm/{limebb-limetype-field_2.entry.js → limebb-lime-query-filter-builder_3.entry.js} +73 -3
  55. package/dist/esm/limebb-lime-query-filter-comparison_2.entry.js +1 -1
  56. package/dist/esm/{limebb-lime-query-filter-group_4.entry.js → limebb-lime-query-filter-group_3.entry.js} +7 -232
  57. package/dist/esm/limebb-live-docs-info.entry.js +2 -2
  58. package/dist/esm/limebb-locale-picker.entry.js +1 -1
  59. package/dist/esm/limebb-mention-group-counter.entry.js +2 -2
  60. package/dist/esm/limebb-navigation-button_2.entry.js +3 -3
  61. package/dist/esm/limebb-notification-item.entry.js +1 -1
  62. package/dist/esm/limebb-percentage-visualizer.entry.js +2 -2
  63. package/dist/esm/limebb-property-selector.entry.js +230 -0
  64. package/dist/esm/limebb-text-editor.entry.js +1 -1
  65. package/dist/esm/limebb-trend-indicator.entry.js +1 -1
  66. package/dist/esm/loader.js +1 -1
  67. package/dist/lime-crm-building-blocks/lime-crm-building-blocks.esm.js +1 -1
  68. package/dist/lime-crm-building-blocks/{p-b9b954d9.entry.js → p-1034b4a5.entry.js} +1 -1
  69. package/dist/lime-crm-building-blocks/{p-93cadc1e.entry.js → p-2048ac67.entry.js} +1 -1
  70. package/dist/lime-crm-building-blocks/p-323c49bc.entry.js +1 -0
  71. package/dist/lime-crm-building-blocks/{p-631ca5a5.entry.js → p-58782467.entry.js} +1 -1
  72. package/dist/lime-crm-building-blocks/{p-aa646df7.entry.js → p-6aa216ec.entry.js} +1 -1
  73. package/dist/lime-crm-building-blocks/{p-9cac4de2.entry.js → p-76d81eee.entry.js} +1 -1
  74. package/dist/lime-crm-building-blocks/{p-e8946134.entry.js → p-79b8b09b.entry.js} +1 -1
  75. package/dist/lime-crm-building-blocks/{p-569c86b5.entry.js → p-8581245a.entry.js} +1 -1
  76. package/dist/lime-crm-building-blocks/p-89a6c396.entry.js +1 -0
  77. package/dist/lime-crm-building-blocks/{p-36ea13c0.entry.js → p-8fb2e192.entry.js} +1 -1
  78. package/dist/lime-crm-building-blocks/{p-3122ea05.entry.js → p-b57dafef.entry.js} +1 -1
  79. package/dist/lime-crm-building-blocks/p-f22b66f6.entry.js +1 -0
  80. package/dist/lime-crm-building-blocks/p-f79e354b.entry.js +1 -0
  81. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-builder.d.ts +50 -0
  82. package/dist/types/components/lime-query-builder/expressions/lime-query-value-input.d.ts +2 -3
  83. package/dist/types/components/lime-query-builder/lime-query-builder.d.ts +1 -6
  84. package/dist/types/components/lime-query-builder/lime-query.types.d.ts +0 -72
  85. package/dist/types/components.d.ts +58 -198
  86. package/package.json +1 -1
  87. package/dist/cjs/limebb-lime-query-filter-and.cjs.entry.js +0 -80
  88. package/dist/cjs/limebb-lime-query-filter-or.cjs.entry.js +0 -68
  89. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-and.css +0 -121
  90. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-or.css +0 -123
  91. package/dist/collection/components/lime-query-builder/expressions/lime-query-filter-or.js +0 -237
  92. package/dist/collection/components/lime-query-builder/filter-conversion.js +0 -255
  93. package/dist/components/limebb-lime-query-filter-and.d.ts +0 -11
  94. package/dist/components/limebb-lime-query-filter-and.js +0 -135
  95. package/dist/components/limebb-lime-query-filter-or.d.ts +0 -11
  96. package/dist/components/limebb-lime-query-filter-or.js +0 -123
  97. package/dist/esm/limebb-lime-query-filter-and.entry.js +0 -76
  98. package/dist/esm/limebb-lime-query-filter-or.entry.js +0 -64
  99. package/dist/lime-crm-building-blocks/p-03accd53.entry.js +0 -1
  100. package/dist/lime-crm-building-blocks/p-4715210d.entry.js +0 -1
  101. package/dist/lime-crm-building-blocks/p-5f7644b5.entry.js +0 -1
  102. package/dist/lime-crm-building-blocks/p-67dbaa4c.entry.js +0 -1
  103. package/dist/lime-crm-building-blocks/p-91732502.entry.js +0 -1
  104. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-and.d.ts +0 -57
  105. package/dist/types/components/lime-query-builder/expressions/lime-query-filter-or.d.ts +0 -56
  106. package/dist/types/components/lime-query-builder/filter-conversion.d.ts +0 -31
@@ -1,6 +1,6 @@
1
1
  import { r as registerInstance, c as createEvent, h } from './index-96dd111f.js';
2
2
  import { Z as Zt, T as Te } from './index.esm-bb569663.js';
3
- import { a as getPropertyFromPath, g as getNormalizedProperties } from './property-resolution-fde2375e.js';
3
+ import { a as getPropertyFromPath } from './property-resolution-fde2375e.js';
4
4
 
5
5
  const limeQueryFilterGroupCss = "@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 .clickable-header{cursor:pointer;user-select:none}.expression .clickable-header:hover{background-color:rgb(var(--contrast-200))}.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;display:flex;gap:0.5rem}";
6
6
  const LimebbLimeQueryFilterGroupStyle0 = limeQueryFilterGroupCss;
@@ -76,7 +76,7 @@ const LimeQueryFilterGroupComponent = class {
76
76
  }
77
77
  render() {
78
78
  const subheading = this.getSubheading();
79
- return (h("div", { key: '43a1d99fd896e3ad49dd97594e54bccaf74c3aa0', class: "expression" }, subheading && (h("limel-header", { key: '534eb0a3db2f0194e8a28e2fb071beb545f38458', subheading: subheading, onClick: this.handleToggleOperator, class: "clickable-header" })), h("ul", { key: '9d29d98ab034bf2878e7dc19828bc045dbdd492f' }, this.expression.exp.map(this.renderChildExpression), h("li", { key: '44b266c8aeb390b8a68b3e08a51a0760a6421f93', class: "add-button" }, this.renderAddButton(), this.renderAddGroupButton()))));
79
+ return (h("div", { key: '0ed5a1403d9641926cd6d474910cedf9c7bba89e', class: "expression" }, subheading && (h("limel-header", { key: 'ea88a97df09f0fb5a21bf9afb4745256a611c7f8', subheading: subheading, onClick: this.handleToggleOperator, class: "clickable-header" })), h("ul", { key: 'cfbcdd539e84f79bf1d778e075cd3317d7409647' }, this.expression.exp.map(this.renderChildExpression), h("li", { key: 'ec443459245bf5852920bb4d3e341f2490a7b75b', class: "add-button" }, this.renderAddButton(), this.renderAddGroupButton()))));
80
80
  }
81
81
  getSubheading() {
82
82
  if (this.expression.exp.length <= 1) {
@@ -133,7 +133,7 @@ const LimeQueryFilterNotComponent = class {
133
133
  };
134
134
  }
135
135
  render() {
136
- return (h("div", { key: 'f1dfd7fd4ec7dc1873841d1c8b3d2bb6677634fd', class: "expression" }, this.label && h("limel-header", { key: '91e1b754f6e45c70f49bf2a770898a590defaf22', heading: this.label }), h("limebb-lime-query-filter-expression", { key: 'bf42f3c71521a413e5ecc49a8e0d6401b34384a2', platform: this.platform, context: this.context, label: "Not", limetype: this.limetype, activeLimetype: this.activeLimetype, expression: this.expression.exp, onExpressionChange: this.handleExpressionChange })));
136
+ return (h("div", { key: '9ab4a6b1e99668a0bcee3e3ba8cbbbe5185222e0', class: "expression" }, this.label && h("limel-header", { key: '85e997b0f96db306dd7a4433da959a74303aacfa', heading: this.label }), h("limebb-lime-query-filter-expression", { key: '14f634e125ee78f2aa70c7537b270a31699ba7c2', platform: this.platform, context: this.context, label: "Not", limetype: this.limetype, activeLimetype: this.activeLimetype, expression: this.expression.exp, onExpressionChange: this.handleExpressionChange })));
137
137
  }
138
138
  };
139
139
  LimeQueryFilterNotComponent.style = LimebbLimeQueryFilterNotStyle0;
@@ -141,7 +141,7 @@ LimeQueryFilterNotComponent.style = LimebbLimeQueryFilterNotStyle0;
141
141
  const limeQueryValueInputCss = ":host{display:block}.value-input-container{display:flex;flex-direction:row;align-items:flex-start;gap:0.5rem;width:100%}.mode-toggle{flex-shrink:0;margin-top:0.5rem;opacity:0.7;transition:opacity 0.2s ease}.mode-toggle:hover{opacity:1}.placeholder-input{flex-grow:1;display:flex;flex-direction:column;gap:0.5rem}.placeholder-preview{display:flex;align-items:center;gap:0.5rem;padding:0.5rem;background-color:rgba(var(--color-blue-light), 0.1);border-radius:var(--border-radius-small);font-size:0.875rem;color:rgb(var(--color-blue-default));border-left:3px solid rgb(var(--color-blue-default))}.placeholder-preview limel-icon{flex-shrink:0;color:rgb(var(--color-blue-default))}.placeholder-preview span{font-family:var(--font-monospace);word-break:break-all}";
142
142
  const LimebbLimeQueryValueInputStyle0 = limeQueryValueInputCss;
143
143
 
144
- var __decorate$1 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
144
+ var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
145
145
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
146
146
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
147
147
  r = Reflect.decorate(decorators, target, key, desc);
@@ -283,7 +283,7 @@ const LimeQueryValueInput = class {
283
283
  }
284
284
  renderValueInputByType() {
285
285
  // Special handling for IN operator - always use chip set for arrays
286
- if (this.operator === 'IN') {
286
+ if (this.operator === Zt.IN) {
287
287
  return this.renderMultiValueInput();
288
288
  }
289
289
  const property = this.getProperty();
@@ -363,234 +363,9 @@ const LimeQueryValueInput = class {
363
363
  return getPropertyFromPath(this.limetypes, this.limetype, this.propertyPath);
364
364
  }
365
365
  };
366
- __decorate$1([
366
+ __decorate([
367
367
  Te()
368
368
  ], LimeQueryValueInput.prototype, "limetypes", void 0);
369
369
  LimeQueryValueInput.style = LimebbLimeQueryValueInputStyle0;
370
370
 
371
- const propertySelectorCss = ":host(limebb-property-selector){display:block}limel-menu{display:block;width:100%}";
372
- const LimebbPropertySelectorStyle0 = propertySelectorCss;
373
-
374
- var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
375
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
376
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
377
- r = Reflect.decorate(decorators, target, key, desc);
378
- else
379
- for (var i = decorators.length - 1; i >= 0; i--)
380
- if (d = decorators[i])
381
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
382
- return c > 3 && r && Object.defineProperty(target, key, r), r;
383
- };
384
- const PropertySelector = class {
385
- constructor(hostRef) {
386
- registerInstance(this, hostRef);
387
- this.change = createEvent(this, "change", 7);
388
- /**
389
- * Label for the input
390
- */
391
- this.label = 'Property';
392
- /**
393
- * Whether the field is required
394
- */
395
- this.required = false;
396
- this.isOpen = false;
397
- this.navigationPath = '';
398
- this.menuItems = [];
399
- this.handleChipSetWrapperClick = (event) => {
400
- // Stop all clicks on the chip-set from bubbling
401
- // This prevents the menu from opening when clicking chip remove buttons
402
- event.stopPropagation();
403
- };
404
- this.handleChipSetFocus = () => {
405
- // Open menu when the chip-set input receives focus
406
- // This happens when user clicks to type/edit
407
- if (!this.isOpen) {
408
- this.navigationPath = this.value || '';
409
- this.loadMenuItems();
410
- this.isOpen = true;
411
- }
412
- };
413
- this.handleSelect = (event) => {
414
- event.stopPropagation();
415
- const selectedPath = event.detail.value;
416
- if (!selectedPath) {
417
- return;
418
- }
419
- // Check if this is a complete path (leaf property, not a relation)
420
- const property = getPropertyFromPath(this.limetypes, this.limetype, selectedPath);
421
- if (property === null || property === void 0 ? void 0 : property.relation) {
422
- // This is a relation - update navigation but don't emit
423
- this.navigationPath = selectedPath;
424
- }
425
- else {
426
- // This is a leaf property - emit and close
427
- this.change.emit(selectedPath);
428
- this.isOpen = false;
429
- this.navigationPath = '';
430
- }
431
- };
432
- this.handleNavigateMenu = (event) => {
433
- var _a;
434
- event.stopPropagation();
435
- if ((_a = event.detail) === null || _a === void 0 ? void 0 : _a.value) {
436
- // Update navigation path when drilling down
437
- this.navigationPath = event.detail.value;
438
- }
439
- };
440
- this.handleCancel = () => {
441
- this.isOpen = false;
442
- this.navigationPath = '';
443
- };
444
- this.handleChipSetChange = (event) => {
445
- event.stopPropagation();
446
- const detail = event.detail;
447
- // Handle both single chip and array of chips
448
- if (!detail) {
449
- // Clear all was clicked
450
- this.change.emit('');
451
- this.navigationPath = '';
452
- return;
453
- }
454
- // Convert to array if it's a single chip
455
- const chips = Array.isArray(detail) ? detail : [detail];
456
- if (chips.length === 0) {
457
- // All chips removed
458
- this.change.emit('');
459
- this.navigationPath = '';
460
- }
461
- else {
462
- // A chip was removed - emit the last remaining chip's value
463
- const lastChip = chips.at(-1);
464
- if (lastChip) {
465
- this.change.emit(lastChip.value);
466
- }
467
- this.navigationPath = '';
468
- }
469
- };
470
- }
471
- render() {
472
- if (!this.limetype || !this.limetypes) {
473
- return null;
474
- }
475
- const chips = this.getChipsForPath(this.navigationPath || this.value || '');
476
- return (h("limel-menu", { items: this.menuItems, open: this.isOpen, emptyResultMessage: "No available properties", surfaceWidth: "inherit-from-trigger", openDirection: "bottom-end", onSelect: this.handleSelect, onNavigateMenu: this.handleNavigateMenu, onCancel: this.handleCancel }, h("div", { slot: "trigger" }, h("div", { onClick: this.handleChipSetWrapperClick }, h("limel-chip-set", { type: "input", label: this.label, value: chips, required: this.required, helperText: this.helperText, delimiter: "\u203A", maxItems: 1, onChange: this.handleChipSetChange, onFocus: this.handleChipSetFocus })))));
477
- }
478
- loadMenuItems() {
479
- // Get the limetype we're currently navigating in
480
- const currentLimetype = this.getCurrentLimetype();
481
- if (!currentLimetype) {
482
- this.menuItems = [];
483
- return;
484
- }
485
- this.menuItems = this.createMenuItems(currentLimetype, '');
486
- }
487
- getCurrentLimetype() {
488
- if (!this.navigationPath) {
489
- return this.limetypes[this.limetype];
490
- }
491
- // Get the limetype at the current navigation path
492
- const property = getPropertyFromPath(this.limetypes, this.limetype, this.navigationPath);
493
- if (property === null || property === void 0 ? void 0 : property.relation) {
494
- return property.relation.getLimetype();
495
- }
496
- return this.limetypes[this.limetype];
497
- }
498
- createMenuItems(limetype, pathPrefix) {
499
- const results = [];
500
- if (!limetype) {
501
- return results;
502
- }
503
- const normalizedProperties = getNormalizedProperties(limetype);
504
- for (const [propName, property] of Object.entries(normalizedProperties)) {
505
- // Skip hasMany and hasAndBelongsToMany relations
506
- if (property.type === 'hasmany' ||
507
- property.type === 'hasandbelongstomany') {
508
- continue;
509
- }
510
- const fullPath = pathPrefix
511
- ? `${pathPrefix}.${propName}`
512
- : propName;
513
- const isRelation = !!property.relation;
514
- let items;
515
- if (isRelation && property.relation) {
516
- // Create submenu for relation (only belongsto at this point)
517
- const relatedLimetype = property.relation.getLimetype();
518
- if (relatedLimetype) {
519
- items = async () => this.createMenuItems(relatedLimetype, fullPath);
520
- }
521
- }
522
- results.push({
523
- text: property.localname || propName,
524
- secondaryText: this.getSecondaryText(property),
525
- icon: this.getIconForProperty(property),
526
- value: fullPath,
527
- items: items,
528
- });
529
- }
530
- if (results.length === 0) {
531
- return [
532
- {
533
- text: 'No available properties',
534
- value: '',
535
- disabled: true,
536
- },
537
- ];
538
- }
539
- return results;
540
- }
541
- getSecondaryText(property) {
542
- var _a;
543
- if (property.relation) {
544
- const relatedLimetype = property.relation.getLimetype();
545
- return ((_a = relatedLimetype === null || relatedLimetype === void 0 ? void 0 : relatedLimetype.localname) === null || _a === void 0 ? void 0 : _a.singular) || 'Object';
546
- }
547
- // Return the property type as the secondary text
548
- return property.type.charAt(0).toUpperCase() + property.type.slice(1);
549
- }
550
- getIconForProperty(property) {
551
- if (property.relation) {
552
- return {
553
- name: 'link',
554
- color: 'rgb(var(--color-sky-default))',
555
- };
556
- }
557
- // Use generic property icon
558
- return {
559
- name: 'decision',
560
- color: 'rgb(var(--color-gray-default))',
561
- };
562
- }
563
- getChipsForPath(path) {
564
- if (!path) {
565
- return [];
566
- }
567
- const parts = path.split('.');
568
- const chips = [];
569
- let currentLimetype = this.limetypes[this.limetype];
570
- let currentPath = '';
571
- for (const part of parts) {
572
- currentPath = currentPath ? `${currentPath}.${part}` : part;
573
- // Use getNormalizedProperties to include _id and _timestamp
574
- const normalizedProperties = getNormalizedProperties(currentLimetype);
575
- const property = normalizedProperties[part];
576
- if (property) {
577
- chips.push({
578
- id: currentPath,
579
- text: property.localname || part,
580
- icon: this.getIconForProperty(property),
581
- value: currentPath,
582
- });
583
- if (property.relation) {
584
- currentLimetype = property.relation.getLimetype();
585
- }
586
- }
587
- }
588
- return chips;
589
- }
590
- };
591
- __decorate([
592
- Te()
593
- ], PropertySelector.prototype, "limetypes", void 0);
594
- PropertySelector.style = LimebbPropertySelectorStyle0;
595
-
596
- export { LimeQueryFilterGroupComponent as limebb_lime_query_filter_group, LimeQueryFilterNotComponent as limebb_lime_query_filter_not, LimeQueryValueInput as limebb_lime_query_value_input, PropertySelector as limebb_property_selector };
371
+ export { LimeQueryFilterGroupComponent as limebb_lime_query_filter_group, LimeQueryFilterNotComponent as limebb_lime_query_filter_not, LimeQueryValueInput as limebb_lime_query_value_input };
@@ -9,8 +9,8 @@ const LiveDocsInfo = class {
9
9
  }
10
10
  render() {
11
11
  return [
12
- h("div", { key: '849694495956b6afbdfeac8aa7de680e1ab03450', class: "header" }, h("limel-icon", { key: '84117fdfff949d6b41b9ec3f2b3ec73f21e5be7b', name: "not_showing_video_frames" }), h("h2", { key: '90f1738815699808c6353707b4f366d8a2c661ac' }, "Viewing this file type requires ", h("em", { key: 'ef09921e893851f06b756e1e2777847a7e4bd563' }, "Live Docs"))),
13
- h("p", { key: 'a835a0e1cabd84d7509167b3331878807b083130' }, h("em", { key: '3f9ce9e473f33b89adfeb3b143e46cabb6feb1d4' }, "Live Docs"), " not only enables you to view many file formats such as Microsoft Office documents, but it also empowers you to edit them right in the CRM. No need to download anything on your device!", h("a", { key: 'f3e683b041ddd66e6f23514d9bb5f3faf80f4c3a', target: "_blank", href: "https://www.lime-technologies.com/en/lime-crm/live-docs/" }, "Learn more")),
12
+ h("div", { key: 'f215884110f6647cf6c0b501d6bec3d0475c7eb5', class: "header" }, h("limel-icon", { key: '483ac1d1166621d9ec91d430b58fe37d720ef740', name: "not_showing_video_frames" }), h("h2", { key: 'c9d8894b11a48ebecb3cac470df3b292e41f7c8e' }, "Viewing this file type requires ", h("em", { key: 'cc8b9bf7005a24ec608e7e14d86fe5047c543251' }, "Live Docs"))),
13
+ h("p", { key: '091075e3ffebbd89142b0466474977e05a6f8086' }, h("em", { key: 'b7393f26c3a1e5737b920389a8dab5ca5d5f591c' }, "Live Docs"), " not only enables you to view many file formats such as Microsoft Office documents, but it also empowers you to edit them right in the CRM. No need to download anything on your device!", h("a", { key: '67f751f807d209c7bf5c752bda39f4e4911b332b', target: "_blank", href: "https://www.lime-technologies.com/en/lime-crm/live-docs/" }, "Learn more")),
14
14
  ];
15
15
  }
16
16
  };
@@ -1129,7 +1129,7 @@ const LocalePicker = class {
1129
1129
  const value = this.value;
1130
1130
  selectedOptions = options.find((option) => option.value === value);
1131
1131
  }
1132
- return (h("limel-select", { key: '5b3491e9dd6725186c4a2795e7893de43457e147', value: selectedOptions, options: sortBy$1(options, 'text'), helperText: this.helperText, label: this.label, required: this.required, disabled: this.disabled, readonly: this.readonly, onChange: this.handleChange, multiple: this.multipleChoice }));
1132
+ return (h("limel-select", { key: 'd8592dd9e39e3dba64e2ee11cd223a66138ef57d', value: selectedOptions, options: sortBy$1(options, 'text'), helperText: this.helperText, label: this.label, required: this.required, disabled: this.disabled, readonly: this.readonly, onChange: this.handleChange, multiple: this.multipleChoice }));
1133
1133
  }
1134
1134
  };
1135
1135
 
@@ -11,8 +11,8 @@ const MentionGroupCounter = class {
11
11
  render() {
12
12
  const label = this.getLabel();
13
13
  return [
14
- h("span", { key: 'dcd5792c82409e75e149e263fc7b4864e195a387', id: this.tooltipId }, label),
15
- h("limel-tooltip", { key: '2c17e50ac616348df3a98da324b6538891cff75c', elementId: this.tooltipId, label: label, helperLabel: this.helperLabel }),
14
+ h("span", { key: '32727487e0750dad1e08b94915af9b33e562ba9d', id: this.tooltipId }, label),
15
+ h("limel-tooltip", { key: 'a9c062dca4f2f46fb187c902de8ecab4993e456d', elementId: this.tooltipId, label: label, helperLabel: this.helperLabel }),
16
16
  ];
17
17
  }
18
18
  getLabel() {
@@ -120,14 +120,14 @@ const SummaryPopover = class {
120
120
  top: '0.125rem',
121
121
  right: '0.125rem',
122
122
  };
123
- return (h("limel-popover", { key: '1681bf3578fb29886f68070e3e07397d1e312dc1', style: {
123
+ return (h("limel-popover", { key: '2fb3afb6c2a05cfbd4e1991b3204c5b495c20c03', style: {
124
124
  '--limebb-summary-popover-timeout': `${this.triggerDelay}ms`,
125
- }, open: this.isPopoverOpen, onClose: this.onPopoverClose, openDirection: this.openDirection }, h("div", { key: '1e2daa75c518f4949a7ca6fdd0ff29bc1a6d529e', slot: "trigger", tabIndex: 0, onMouseEnter: this.openPopoverWithDelay, onMouseLeave: this.resetTimeout, onFocus: this.openPopoverWithDelay }, h("slot", { key: '9d1a9b69db8ac1c4cfddd62fb9949c98700e61b7', name: "trigger" }), h("div", { key: '95fcc70f46106c426ae191b6a8d66c7d7a025ca9', class: "opening-countdown-indicator" })), h("limel-card", { key: '9294ae443aa9f279c3c01f0af48ca6a2d0d1409f', style: {
125
+ }, open: this.isPopoverOpen, onClose: this.onPopoverClose, openDirection: this.openDirection }, h("div", { key: 'fbd08fbebaed580db3aaaf3b1bbba4e52605bced', slot: "trigger", tabIndex: 0, onMouseEnter: this.openPopoverWithDelay, onMouseLeave: this.resetTimeout, onFocus: this.openPopoverWithDelay }, h("slot", { key: 'd16285c72329080ecde42bc6f7c3966f27a66968', name: "trigger" }), h("div", { key: '77c127616635768db8012adf936c56f75d2bccb3', class: "opening-countdown-indicator" })), h("limel-card", { key: '2d3c9a55b1292945422af4783b29d37ea9570fde', style: {
126
126
  'max-width': this.popoverMaxWidth,
127
127
  'max-height': this.popoverMaxHeight,
128
128
  'min-width': '7rem',
129
129
  'min-height': '3rem',
130
- }, orientation: "landscape", heading: this.heading, subheading: this.subheading, icon: this.icon, value: this.value, image: this.image, actions: this.actions, onActionSelected: this.handleSelected }, h("limebb-navigation-button", { key: 'b26fecf7c748fcd82fea453ece55189bcd1302ef', slot: "component", type: "close", style: closeButtonStyle, tooltipLabel: "Close", tooltipHelperLabel: "Esc", onClick: this.handleCloseClick }))));
130
+ }, orientation: "landscape", heading: this.heading, subheading: this.subheading, icon: this.icon, value: this.value, image: this.image, actions: this.actions, onActionSelected: this.handleSelected }, h("limebb-navigation-button", { key: '234309cf2f82f6493a5d72944d320a902618c83b', slot: "component", type: "close", style: closeButtonStyle, tooltipLabel: "Close", tooltipHelperLabel: "Esc", onClick: this.handleCloseClick }))));
131
131
  }
132
132
  };
133
133
  SummaryPopover.currentOpenPopover = null;
@@ -56,7 +56,7 @@ const NotificationListItem = class {
56
56
  }
57
57
  render() {
58
58
  var _a, _b;
59
- return (h(Host, { key: '39801fd8e10f1dc228741df48561cad3c59d81d7', id: this.item.id, class: {
59
+ return (h(Host, { key: 'bcbac9d93025efeaf1d6f6cde3ab7632b527b5a0', id: this.item.id, class: {
60
60
  'is-clickable': this.isItemClickable(),
61
61
  'is-read': !!((_a = this.item) === null || _a === void 0 ? void 0 : _a.read),
62
62
  'is-selected': !!((_b = this.item) === null || _b === void 0 ? void 0 : _b.selected),
@@ -74,11 +74,11 @@ const PercentageVisualizer = class {
74
74
  render() {
75
75
  const normalizedValue = this.getNormalizedValue();
76
76
  const zeroPoint = this.getZeroPointPosition();
77
- return (h(Host, { key: '069ab0188df35e32bca3fe7c000d2c5c874012a5', class: this.getContainerClassList(), style: {
77
+ return (h(Host, { key: '85bcdba3b1ba660f32eebcdc0e46dd8652ae9b48', class: this.getContainerClassList(), style: {
78
78
  '--limebb-percentage-visualizer-zero-point-position': `${zeroPoint}%`,
79
79
  '--limebb-percentage-visualizer-width': `${Math.abs(normalizedValue)}%`,
80
80
  '--limebb-percentage-visualizer-rotate': `${normalizedValue >= 0 ? '0deg' : '180deg'}`,
81
- } }, h("limel-notched-outline", { key: 'f6e544a1859f3166ee540435c687415bbfd5de1d', tabIndex: 0, role: "meter", "aria-valuemin": this.rangeMin, "aria-valuemax": this.rangeMax, "aria-valuenow": this.numValue, "aria-labelledby": this.labelId, "aria-describedby": this.helperTextId, label: this.label, labelId: this.labelId, invalid: this.invalid, required: this.required, hasValue: true, hasFloatingLabel: true, "aria-controls": this.helperTextId }, h("div", { key: '348f345b2212b3da15c0e081385a5fee76317ebe', slot: "content" }, this.renderVisualization())), this.renderHelperLine()));
81
+ } }, h("limel-notched-outline", { key: 'ef664323cf5a8a6a091394e8dffa291959c9e3f3', tabIndex: 0, role: "meter", "aria-valuemin": this.rangeMin, "aria-valuemax": this.rangeMax, "aria-valuenow": this.numValue, "aria-labelledby": this.labelId, "aria-describedby": this.helperTextId, label: this.label, labelId: this.labelId, invalid: this.invalid, required: this.required, hasValue: true, hasFloatingLabel: true, "aria-controls": this.helperTextId }, h("div", { key: '20b55181865c993677fec5fc86a66ea9cd817cd0', slot: "content" }, this.renderVisualization())), this.renderHelperLine()));
82
82
  }
83
83
  renderVisualization() {
84
84
  if (this.reducePresence && (this.numValue === 0 || !this.hasValue())) {
@@ -0,0 +1,230 @@
1
+ import { r as registerInstance, c as createEvent, h } from './index-96dd111f.js';
2
+ import { T as Te } from './index.esm-bb569663.js';
3
+ import { a as getPropertyFromPath, g as getNormalizedProperties } from './property-resolution-fde2375e.js';
4
+
5
+ const propertySelectorCss = ":host(limebb-property-selector){display:block}limel-menu{display:block;width:100%}";
6
+ const LimebbPropertySelectorStyle0 = propertySelectorCss;
7
+
8
+ var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
9
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
11
+ r = Reflect.decorate(decorators, target, key, desc);
12
+ else
13
+ for (var i = decorators.length - 1; i >= 0; i--)
14
+ if (d = decorators[i])
15
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
16
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
17
+ };
18
+ const PropertySelector = class {
19
+ constructor(hostRef) {
20
+ registerInstance(this, hostRef);
21
+ this.change = createEvent(this, "change", 7);
22
+ /**
23
+ * Label for the input
24
+ */
25
+ this.label = 'Property';
26
+ /**
27
+ * Whether the field is required
28
+ */
29
+ this.required = false;
30
+ this.isOpen = false;
31
+ this.navigationPath = '';
32
+ this.menuItems = [];
33
+ this.handleChipSetWrapperClick = (event) => {
34
+ // Stop all clicks on the chip-set from bubbling
35
+ // This prevents the menu from opening when clicking chip remove buttons
36
+ event.stopPropagation();
37
+ };
38
+ this.handleChipSetFocus = () => {
39
+ // Open menu when the chip-set input receives focus
40
+ // This happens when user clicks to type/edit
41
+ if (!this.isOpen) {
42
+ this.navigationPath = this.value || '';
43
+ this.loadMenuItems();
44
+ this.isOpen = true;
45
+ }
46
+ };
47
+ this.handleSelect = (event) => {
48
+ event.stopPropagation();
49
+ const selectedPath = event.detail.value;
50
+ if (!selectedPath) {
51
+ return;
52
+ }
53
+ // Check if this is a complete path (leaf property, not a relation)
54
+ const property = getPropertyFromPath(this.limetypes, this.limetype, selectedPath);
55
+ if (property === null || property === void 0 ? void 0 : property.relation) {
56
+ // This is a relation - update navigation but don't emit
57
+ this.navigationPath = selectedPath;
58
+ }
59
+ else {
60
+ // This is a leaf property - emit and close
61
+ this.change.emit(selectedPath);
62
+ this.isOpen = false;
63
+ this.navigationPath = '';
64
+ }
65
+ };
66
+ this.handleNavigateMenu = (event) => {
67
+ var _a;
68
+ event.stopPropagation();
69
+ if ((_a = event.detail) === null || _a === void 0 ? void 0 : _a.value) {
70
+ // Update navigation path when drilling down
71
+ this.navigationPath = event.detail.value;
72
+ }
73
+ };
74
+ this.handleCancel = () => {
75
+ this.isOpen = false;
76
+ this.navigationPath = '';
77
+ };
78
+ this.handleChipSetChange = (event) => {
79
+ event.stopPropagation();
80
+ const detail = event.detail;
81
+ // Handle both single chip and array of chips
82
+ if (!detail) {
83
+ // Clear all was clicked
84
+ this.change.emit('');
85
+ this.navigationPath = '';
86
+ return;
87
+ }
88
+ // Convert to array if it's a single chip
89
+ const chips = Array.isArray(detail) ? detail : [detail];
90
+ if (chips.length === 0) {
91
+ // All chips removed
92
+ this.change.emit('');
93
+ this.navigationPath = '';
94
+ }
95
+ else {
96
+ // A chip was removed - emit the last remaining chip's value
97
+ const lastChip = chips.at(-1);
98
+ if (lastChip) {
99
+ this.change.emit(lastChip.value);
100
+ }
101
+ this.navigationPath = '';
102
+ }
103
+ };
104
+ }
105
+ render() {
106
+ if (!this.limetype || !this.limetypes) {
107
+ return null;
108
+ }
109
+ const chips = this.getChipsForPath(this.navigationPath || this.value || '');
110
+ return (h("limel-menu", { items: this.menuItems, open: this.isOpen, emptyResultMessage: "No available properties", surfaceWidth: "inherit-from-trigger", openDirection: "bottom-end", onSelect: this.handleSelect, onNavigateMenu: this.handleNavigateMenu, onCancel: this.handleCancel }, h("div", { slot: "trigger" }, h("div", { onClick: this.handleChipSetWrapperClick }, h("limel-chip-set", { type: "input", label: this.label, value: chips, required: this.required, helperText: this.helperText, delimiter: "\u203A", maxItems: 1, onChange: this.handleChipSetChange, onFocus: this.handleChipSetFocus })))));
111
+ }
112
+ loadMenuItems() {
113
+ // Get the limetype we're currently navigating in
114
+ const currentLimetype = this.getCurrentLimetype();
115
+ if (!currentLimetype) {
116
+ this.menuItems = [];
117
+ return;
118
+ }
119
+ this.menuItems = this.createMenuItems(currentLimetype, '');
120
+ }
121
+ getCurrentLimetype() {
122
+ if (!this.navigationPath) {
123
+ return this.limetypes[this.limetype];
124
+ }
125
+ // Get the limetype at the current navigation path
126
+ const property = getPropertyFromPath(this.limetypes, this.limetype, this.navigationPath);
127
+ if (property === null || property === void 0 ? void 0 : property.relation) {
128
+ return property.relation.getLimetype();
129
+ }
130
+ return this.limetypes[this.limetype];
131
+ }
132
+ createMenuItems(limetype, pathPrefix) {
133
+ const results = [];
134
+ if (!limetype) {
135
+ return results;
136
+ }
137
+ const normalizedProperties = getNormalizedProperties(limetype);
138
+ for (const [propName, property] of Object.entries(normalizedProperties)) {
139
+ // Skip hasMany and hasAndBelongsToMany relations
140
+ if (property.type === 'hasmany' ||
141
+ property.type === 'hasandbelongstomany') {
142
+ continue;
143
+ }
144
+ const fullPath = pathPrefix
145
+ ? `${pathPrefix}.${propName}`
146
+ : propName;
147
+ const isRelation = !!property.relation;
148
+ let items;
149
+ if (isRelation && property.relation) {
150
+ // Create submenu for relation (only belongsto at this point)
151
+ const relatedLimetype = property.relation.getLimetype();
152
+ if (relatedLimetype) {
153
+ items = async () => this.createMenuItems(relatedLimetype, fullPath);
154
+ }
155
+ }
156
+ results.push({
157
+ text: property.localname || propName,
158
+ secondaryText: this.getSecondaryText(property),
159
+ icon: this.getIconForProperty(property),
160
+ value: fullPath,
161
+ items: items,
162
+ });
163
+ }
164
+ if (results.length === 0) {
165
+ return [
166
+ {
167
+ text: 'No available properties',
168
+ value: '',
169
+ disabled: true,
170
+ },
171
+ ];
172
+ }
173
+ return results;
174
+ }
175
+ getSecondaryText(property) {
176
+ var _a;
177
+ if (property.relation) {
178
+ const relatedLimetype = property.relation.getLimetype();
179
+ return ((_a = relatedLimetype === null || relatedLimetype === void 0 ? void 0 : relatedLimetype.localname) === null || _a === void 0 ? void 0 : _a.singular) || 'Object';
180
+ }
181
+ // Return the property type as the secondary text
182
+ return property.type.charAt(0).toUpperCase() + property.type.slice(1);
183
+ }
184
+ getIconForProperty(property) {
185
+ if (property.relation) {
186
+ return {
187
+ name: 'link',
188
+ color: 'rgb(var(--color-sky-default))',
189
+ };
190
+ }
191
+ // Use generic property icon
192
+ return {
193
+ name: 'decision',
194
+ color: 'rgb(var(--color-gray-default))',
195
+ };
196
+ }
197
+ getChipsForPath(path) {
198
+ if (!path) {
199
+ return [];
200
+ }
201
+ const parts = path.split('.');
202
+ const chips = [];
203
+ let currentLimetype = this.limetypes[this.limetype];
204
+ let currentPath = '';
205
+ for (const part of parts) {
206
+ currentPath = currentPath ? `${currentPath}.${part}` : part;
207
+ // Use getNormalizedProperties to include _id and _timestamp
208
+ const normalizedProperties = getNormalizedProperties(currentLimetype);
209
+ const property = normalizedProperties[part];
210
+ if (property) {
211
+ chips.push({
212
+ id: currentPath,
213
+ text: property.localname || part,
214
+ icon: this.getIconForProperty(property),
215
+ value: currentPath,
216
+ });
217
+ if (property.relation) {
218
+ currentLimetype = property.relation.getLimetype();
219
+ }
220
+ }
221
+ }
222
+ return chips;
223
+ }
224
+ };
225
+ __decorate([
226
+ Te()
227
+ ], PropertySelector.prototype, "limetypes", void 0);
228
+ PropertySelector.style = LimebbPropertySelectorStyle0;
229
+
230
+ export { PropertySelector as limebb_property_selector };
@@ -1770,7 +1770,7 @@ const LimeBBTextEditor = class {
1770
1770
  }
1771
1771
  render() {
1772
1772
  return [
1773
- h("limel-text-editor", { key: '277ec61f05d5edff319ed8bb37df9bc385cb3941', ref: (el) => (this.textEditor = el), tabindex: this.disabled ? -1 : 0, value: this.value, contentType: this.contentType, customElements: this.registeredCustomElements, "aria-disabled": this.disabled, language: this.language, triggers: this.registeredTriggers, onTriggerStart: this.handleTriggerStart, onTriggerStop: this.handleTriggerStop, onTriggerChange: this.handleTriggerChange, onImagePasted: this.handleImagePasted, onMetadataChange: this.handleMetadataChange, ui: this.ui, allowResize: this.allowResize, required: this.required, disabled: this.disabled, readonly: this.readonly, helperText: this.helperText, placeholder: this.placeholder, label: this.label, invalid: this.invalid }),
1773
+ h("limel-text-editor", { key: '42b8630e5e15e4e7ca20277687695a245f2ea267', ref: (el) => (this.textEditor = el), tabindex: this.disabled ? -1 : 0, value: this.value, contentType: this.contentType, customElements: this.registeredCustomElements, "aria-disabled": this.disabled, language: this.language, triggers: this.registeredTriggers, onTriggerStart: this.handleTriggerStart, onTriggerStop: this.handleTriggerStop, onTriggerChange: this.handleTriggerChange, onImagePasted: this.handleImagePasted, onMetadataChange: this.handleMetadataChange, ui: this.ui, allowResize: this.allowResize, required: this.required, disabled: this.disabled, readonly: this.readonly, helperText: this.helperText, placeholder: this.placeholder, label: this.label, invalid: this.invalid }),
1774
1774
  this.renderPicker(),
1775
1775
  ];
1776
1776
  }
@@ -35,7 +35,7 @@ const TrendIndicator = class {
35
35
  this.numValue = this.parseValue(this.value);
36
36
  }
37
37
  render() {
38
- return (h(Host, { key: '8c503e1a099f65fe29e2ef1903f78ddf62f815d9', class: this.getContainerClassList() }, h("limel-notched-outline", { key: '76d8b456dec89cea949ae427091256dffc1e71ab', id: this.tooltipId, label: this.label, labelId: this.labelId, invalid: this.invalid, required: this.required, hasValue: true, hasFloatingLabel: true, "aria-labelledby": this.labelId, "aria-describedby": this.helperTextId, "aria-controls": this.helperTextId }, h("div", { key: 'e295b50dcc7a3d4cb017f7d1ca5dd187bf52299c', slot: "content", tabIndex: 0 }, this.renderVisualization())), this.renderHelperLine(), this.renderTooltip()));
38
+ return (h(Host, { key: '33119aa80ea39fbe4ad0fd7da3c89d844efd7bd6', class: this.getContainerClassList() }, h("limel-notched-outline", { key: '9357919d89ea26063f9c0bbf85a48e3e235364c7', id: this.tooltipId, label: this.label, labelId: this.labelId, invalid: this.invalid, required: this.required, hasValue: true, hasFloatingLabel: true, "aria-labelledby": this.labelId, "aria-describedby": this.helperTextId, "aria-controls": this.helperTextId }, h("div", { key: 'b29c00421943e45fed684e63dfebf895686f6d45', slot: "content", tabIndex: 0 }, this.renderVisualization())), this.renderHelperLine(), this.renderTooltip()));
39
39
  }
40
40
  renderVisualization() {
41
41
  if (this.reducePresence && (this.numValue === 0 || !this.hasValue())) {