@limetech/lime-crm-building-blocks 1.140.0 → 2.0.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 (216) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cjs/file-contents-url-CIoCVl85.js +14 -0
  3. package/dist/cjs/{filter-group-logic-BPpM2NqX.js → filter-group-logic-EDLGrkTt.js} +12 -12
  4. package/dist/cjs/{filter-operators-BTWvpD6A.js → filter-operators-CVCyCZ7Q.js} +11 -11
  5. package/dist/cjs/index.cjs.js +2 -2
  6. package/dist/cjs/{index.esm-Se3EtD3m.js → index.esm-CcYbS__E.js} +210 -181
  7. package/dist/cjs/lime-crm-building-blocks.cjs.js +1 -1
  8. package/dist/cjs/{lime-query-validation-CJC3mtnT.js → lime-query-validation-B0oYW7Z6.js} +7 -7
  9. package/dist/cjs/limebb-browser.cjs.entry.js +1 -1
  10. package/dist/cjs/limebb-chat-icon-list_3.cjs.entry.js +1 -1
  11. package/dist/cjs/limebb-chat-list.cjs.entry.js +1 -1
  12. package/dist/cjs/limebb-component-config.cjs.entry.js +1 -1
  13. package/dist/cjs/limebb-component-picker.cjs.entry.js +1 -1
  14. package/dist/cjs/limebb-composer-toolbar.cjs.entry.js +1 -1
  15. package/dist/cjs/limebb-currency-picker.cjs.entry.js +1 -1
  16. package/dist/cjs/limebb-data-cells.cjs.entry.js +1 -1
  17. package/dist/cjs/limebb-date-picker.cjs.entry.js +1 -1
  18. package/dist/cjs/limebb-feed-timeline-item.cjs.entry.js +22 -6
  19. package/dist/cjs/limebb-feed.cjs.entry.js +1 -1
  20. package/dist/cjs/limebb-filter-chip_6.cjs.entry.js +22 -22
  21. package/dist/cjs/limebb-info-tile.cjs.entry.js +10 -9
  22. package/dist/cjs/limebb-inline-image.cjs.entry.js +49 -0
  23. package/dist/cjs/limebb-kanban-group.cjs.entry.js +2 -2
  24. package/dist/cjs/limebb-kanban-item.cjs.entry.js +1 -1
  25. package/dist/cjs/limebb-lime-query-builder.cjs.entry.js +3 -3
  26. package/dist/cjs/limebb-lime-query-filter-builder.cjs.entry.js +5 -5
  27. package/dist/cjs/limebb-lime-query-filter-comparison_2.cjs.entry.js +4 -4
  28. package/dist/cjs/limebb-lime-query-order-by-editor_2.cjs.entry.js +2 -2
  29. package/dist/cjs/limebb-lime-query-response-format-builder.cjs.entry.js +3 -3
  30. package/dist/cjs/limebb-limeobject-file-viewer.cjs.entry.js +3 -3
  31. package/dist/cjs/limebb-loader.cjs.entry.js +2 -2
  32. package/dist/cjs/limebb-locale-picker.cjs.entry.js +1 -1
  33. package/dist/cjs/limebb-mention.cjs.entry.js +1 -1
  34. package/dist/cjs/limebb-notification-item.cjs.entry.js +1 -1
  35. package/dist/cjs/limebb-notification-list.cjs.entry.js +1 -1
  36. package/dist/cjs/limebb-object-chip.cjs.entry.js +3 -3
  37. package/dist/cjs/limebb-percentage-visualizer.cjs.entry.js +1 -1
  38. package/dist/cjs/limebb-property-selector.cjs.entry.js +3 -3
  39. package/dist/cjs/limebb-rule-arg-filter-editor.cjs.entry.js +2 -2
  40. package/dist/cjs/limebb-rule-chip-popover.cjs.entry.js +2 -2
  41. package/dist/cjs/limebb-rule-editor.cjs.entry.js +2 -2
  42. package/dist/cjs/limebb-rule-gate.cjs.entry.js +1 -1
  43. package/dist/cjs/limebb-text-editor.cjs.entry.js +51 -144
  44. package/dist/cjs/limebb-trend-indicator.cjs.entry.js +1 -1
  45. package/dist/cjs/limebb-value-comparison-editor.cjs.entry.js +9 -9
  46. package/dist/cjs/{limetype-CmgP0nbZ.js → limetype-C-fVThrI.js} +1 -1
  47. package/dist/cjs/loader.cjs.js +1 -1
  48. package/dist/collection/collection-manifest.json +1 -0
  49. package/dist/collection/components/feed/feed-item/feed-timeline-item.js +21 -5
  50. package/dist/collection/components/info-tile/info-tile.js +1 -1
  51. package/dist/collection/components/info-tile/loader.js +2 -1
  52. package/dist/collection/components/inline-image/inline-image.css +12 -0
  53. package/dist/collection/components/inline-image/inline-image.js +146 -0
  54. package/dist/collection/components/rule-editor/value-comparison-editor/value-comparison-editor.js +1 -1
  55. package/dist/collection/components/text-editor/text-editor.js +57 -45
  56. package/dist/collection/util/file-contents-url.js +10 -0
  57. package/dist/components/chat-item.js +1 -1
  58. package/dist/components/currency-picker.js +1 -1
  59. package/dist/components/date-picker.js +1 -1
  60. package/dist/components/feed-timeline-item.js +1 -1
  61. package/dist/components/file-contents-url.js +1 -0
  62. package/dist/components/filter-chip.js +1 -1
  63. package/dist/components/filter-condition-picker.js +1 -1
  64. package/dist/components/filter-operators.js +1 -1
  65. package/dist/components/index.esm.js +1 -1
  66. package/dist/components/kanban-group.js +1 -1
  67. package/dist/components/kanban-item.js +1 -1
  68. package/dist/components/lime-query-filter-builder.js +1 -1
  69. package/dist/components/lime-query-filter-comparison-editor.js +1 -1
  70. package/dist/components/lime-query-filter-comparison.js +1 -1
  71. package/dist/components/lime-query-filter-expression.js +1 -1
  72. package/dist/components/lime-query-validation.js +1 -1
  73. package/dist/components/lime-query-value-input.js +1 -1
  74. package/dist/components/limebb-browser.js +1 -1
  75. package/dist/components/limebb-chat-list.js +1 -1
  76. package/dist/components/limebb-component-config.js +1 -1
  77. package/dist/components/limebb-component-picker.js +1 -1
  78. package/dist/components/limebb-composer-toolbar.js +1 -1
  79. package/dist/components/limebb-data-cells.js +1 -1
  80. package/dist/components/limebb-feed.js +1 -1
  81. package/dist/components/limebb-info-tile.js +1 -1
  82. package/dist/components/limebb-inline-image.d.ts +11 -0
  83. package/dist/components/limebb-inline-image.js +1 -0
  84. package/dist/components/limebb-lime-query-builder.js +1 -1
  85. package/dist/components/limebb-lime-query-response-format-builder.js +1 -1
  86. package/dist/components/limebb-limeobject-file-viewer.js +1 -1
  87. package/dist/components/limebb-loader.js +1 -1
  88. package/dist/components/limebb-locale-picker.js +1 -1
  89. package/dist/components/limebb-mention.js +1 -1
  90. package/dist/components/limebb-notification-list.js +1 -1
  91. package/dist/components/limebb-object-chip.js +1 -1
  92. package/dist/components/limebb-rule-arg-filter-editor.js +1 -1
  93. package/dist/components/limebb-rule-editor.js +1 -1
  94. package/dist/components/limebb-rule-gate.js +1 -1
  95. package/dist/components/limebb-text-editor.js +1 -1
  96. package/dist/components/limebb-trend-indicator.js +1 -1
  97. package/dist/components/limebb-value-comparison-editor.js +1 -1
  98. package/dist/components/limetype-field.js +1 -1
  99. package/dist/components/notification-item.js +1 -1
  100. package/dist/components/percentage-visualizer.js +1 -1
  101. package/dist/components/property-selector.js +1 -1
  102. package/dist/components/rule-chip-popover.js +1 -1
  103. package/dist/esm/file-contents-url-Oswz9F3I.js +12 -0
  104. package/dist/esm/{filter-group-logic-BMY_GEsX.js → filter-group-logic-DS1inQTh.js} +12 -12
  105. package/dist/esm/{filter-operators-Lw-ccmxQ.js → filter-operators-CsZi5iCV.js} +11 -11
  106. package/dist/esm/{index.esm-C-L5fkQs.js → index.esm-BjIhvFKX.js} +200 -172
  107. package/dist/esm/index.js +2 -2
  108. package/dist/esm/lime-crm-building-blocks.js +1 -1
  109. package/dist/esm/{lime-query-validation-BwvluehW.js → lime-query-validation-CVV7mrLj.js} +7 -7
  110. package/dist/esm/limebb-browser.entry.js +1 -1
  111. package/dist/esm/limebb-chat-icon-list_3.entry.js +1 -1
  112. package/dist/esm/limebb-chat-list.entry.js +1 -1
  113. package/dist/esm/limebb-component-config.entry.js +1 -1
  114. package/dist/esm/limebb-component-picker.entry.js +1 -1
  115. package/dist/esm/limebb-composer-toolbar.entry.js +1 -1
  116. package/dist/esm/limebb-currency-picker.entry.js +1 -1
  117. package/dist/esm/limebb-data-cells.entry.js +1 -1
  118. package/dist/esm/limebb-date-picker.entry.js +1 -1
  119. package/dist/esm/limebb-feed-timeline-item.entry.js +22 -6
  120. package/dist/esm/limebb-feed.entry.js +1 -1
  121. package/dist/esm/limebb-filter-chip_6.entry.js +22 -22
  122. package/dist/esm/limebb-info-tile.entry.js +10 -9
  123. package/dist/esm/limebb-inline-image.entry.js +47 -0
  124. package/dist/esm/limebb-kanban-group.entry.js +2 -2
  125. package/dist/esm/limebb-kanban-item.entry.js +1 -1
  126. package/dist/esm/limebb-lime-query-builder.entry.js +3 -3
  127. package/dist/esm/limebb-lime-query-filter-builder.entry.js +5 -5
  128. package/dist/esm/limebb-lime-query-filter-comparison_2.entry.js +4 -4
  129. package/dist/esm/limebb-lime-query-order-by-editor_2.entry.js +2 -2
  130. package/dist/esm/limebb-lime-query-response-format-builder.entry.js +3 -3
  131. package/dist/esm/limebb-limeobject-file-viewer.entry.js +3 -3
  132. package/dist/esm/limebb-loader.entry.js +2 -2
  133. package/dist/esm/limebb-locale-picker.entry.js +1 -1
  134. package/dist/esm/limebb-mention.entry.js +1 -1
  135. package/dist/esm/limebb-notification-item.entry.js +1 -1
  136. package/dist/esm/limebb-notification-list.entry.js +1 -1
  137. package/dist/esm/limebb-object-chip.entry.js +3 -3
  138. package/dist/esm/limebb-percentage-visualizer.entry.js +1 -1
  139. package/dist/esm/limebb-property-selector.entry.js +3 -3
  140. package/dist/esm/limebb-rule-arg-filter-editor.entry.js +2 -2
  141. package/dist/esm/limebb-rule-chip-popover.entry.js +2 -2
  142. package/dist/esm/limebb-rule-editor.entry.js +2 -2
  143. package/dist/esm/limebb-rule-gate.entry.js +1 -1
  144. package/dist/esm/limebb-text-editor.entry.js +51 -144
  145. package/dist/esm/limebb-trend-indicator.entry.js +1 -1
  146. package/dist/esm/limebb-value-comparison-editor.entry.js +9 -9
  147. package/dist/esm/{limetype-D4ZaWZ-3.js → limetype-BbMRN-SU.js} +1 -1
  148. package/dist/esm/loader.js +1 -1
  149. package/dist/lime-crm-building-blocks/index.esm.js +1 -1
  150. package/dist/lime-crm-building-blocks/lime-crm-building-blocks.esm.js +1 -1
  151. package/dist/lime-crm-building-blocks/p-1c6e5402.entry.js +1 -0
  152. package/dist/lime-crm-building-blocks/{p-9452fb56.entry.js → p-240cbd82.entry.js} +1 -1
  153. package/dist/lime-crm-building-blocks/{p-58f18819.entry.js → p-25984c90.entry.js} +1 -1
  154. package/dist/lime-crm-building-blocks/{p-80e04b27.entry.js → p-397a6191.entry.js} +1 -1
  155. package/dist/lime-crm-building-blocks/{p-a6e9cefe.entry.js → p-52a92d89.entry.js} +1 -1
  156. package/dist/lime-crm-building-blocks/p-585f6cfe.entry.js +1 -0
  157. package/dist/lime-crm-building-blocks/{p-05a1762a.entry.js → p-59fb624c.entry.js} +1 -1
  158. package/dist/lime-crm-building-blocks/{p-fb8d854b.entry.js → p-5beb508a.entry.js} +1 -1
  159. package/dist/lime-crm-building-blocks/{p-92bf5318.entry.js → p-662fb8b6.entry.js} +1 -1
  160. package/dist/lime-crm-building-blocks/{p-00ca6522.entry.js → p-673226a6.entry.js} +1 -1
  161. package/dist/lime-crm-building-blocks/{p-e242b955.entry.js → p-69b08896.entry.js} +1 -1
  162. package/dist/lime-crm-building-blocks/{p-01f84b0c.entry.js → p-6c2e25d9.entry.js} +1 -1
  163. package/dist/lime-crm-building-blocks/{p-3bf316f9.entry.js → p-742926a3.entry.js} +1 -1
  164. package/dist/lime-crm-building-blocks/p-78d362b4.entry.js +1 -0
  165. package/dist/lime-crm-building-blocks/p-79c492b2.entry.js +1 -0
  166. package/dist/lime-crm-building-blocks/{p-dba6f583.entry.js → p-7a5c2dda.entry.js} +1 -1
  167. package/dist/lime-crm-building-blocks/{p-354257f4.entry.js → p-7ce967b6.entry.js} +1 -1
  168. package/dist/lime-crm-building-blocks/{p-d40f53a5.entry.js → p-906b4eca.entry.js} +1 -1
  169. package/dist/lime-crm-building-blocks/p-CE43qjk3.js +1 -0
  170. package/dist/lime-crm-building-blocks/p-Cw4kdMw3.js +1 -0
  171. package/dist/lime-crm-building-blocks/p-DLehg4hi.js +1 -0
  172. package/dist/lime-crm-building-blocks/{p-CI6VHE0w.js → p-Dhyy9Td7.js} +1 -1
  173. package/dist/lime-crm-building-blocks/p-Oswz9F3I.js +1 -0
  174. package/dist/lime-crm-building-blocks/p-a3058b72.entry.js +1 -0
  175. package/dist/lime-crm-building-blocks/p-b78ub0mY.js +1 -0
  176. package/dist/lime-crm-building-blocks/{p-f3cb68d6.entry.js → p-bc297cf4.entry.js} +1 -1
  177. package/dist/lime-crm-building-blocks/{p-cac2a49f.entry.js → p-bcd8c767.entry.js} +1 -1
  178. package/dist/lime-crm-building-blocks/p-c4e5e589.entry.js +1 -0
  179. package/dist/lime-crm-building-blocks/p-c97c4604.entry.js +1 -0
  180. package/dist/lime-crm-building-blocks/{p-8986f27b.entry.js → p-d014ec57.entry.js} +1 -1
  181. package/dist/lime-crm-building-blocks/p-d20404ec.entry.js +1 -0
  182. package/dist/lime-crm-building-blocks/{p-fb050628.entry.js → p-d2e85be2.entry.js} +1 -1
  183. package/dist/lime-crm-building-blocks/{p-dec2b87d.entry.js → p-d3fe25a7.entry.js} +1 -1
  184. package/dist/lime-crm-building-blocks/{p-f1090436.entry.js → p-d43cf8d1.entry.js} +1 -1
  185. package/dist/lime-crm-building-blocks/{p-430e3d11.entry.js → p-dd7aec09.entry.js} +1 -1
  186. package/dist/lime-crm-building-blocks/{p-b34817df.entry.js → p-e2e1358d.entry.js} +1 -1
  187. package/dist/lime-crm-building-blocks/{p-c0fa239a.entry.js → p-e4a21ebe.entry.js} +1 -1
  188. package/dist/lime-crm-building-blocks/{p-c4e2dca5.entry.js → p-e581d0b7.entry.js} +1 -1
  189. package/dist/lime-crm-building-blocks/{p-863f456c.entry.js → p-e6a85c26.entry.js} +1 -1
  190. package/dist/lime-crm-building-blocks/p-e8b2df7c.entry.js +1 -0
  191. package/dist/lime-crm-building-blocks/{p-6fe4c1cd.entry.js → p-ef890206.entry.js} +1 -1
  192. package/dist/lime-crm-building-blocks/{p-d7d21bad.entry.js → p-f6377fa5.entry.js} +1 -1
  193. package/dist/lime-crm-building-blocks/p-f9e9d18e.entry.js +1 -0
  194. package/dist/test/setup.js +1 -0
  195. package/dist/types/components/feed/feed-item/feed-timeline-item.d.ts +2 -0
  196. package/dist/types/components/inline-image/inline-image.d.ts +32 -0
  197. package/dist/types/components/text-editor/text-editor.d.ts +17 -11
  198. package/dist/types/components.d.ts +93 -14
  199. package/dist/types/interface.d.ts +0 -5
  200. package/dist/types/util/file-contents-url.d.ts +9 -0
  201. package/package.json +12 -13
  202. package/dist/collection/components/text-editor/uploader/building-blocks-upload-handler.js +0 -112
  203. package/dist/lime-crm-building-blocks/p-29758303.entry.js +0 -1
  204. package/dist/lime-crm-building-blocks/p-2dab7d4b.entry.js +0 -1
  205. package/dist/lime-crm-building-blocks/p-43bdd66b.entry.js +0 -1
  206. package/dist/lime-crm-building-blocks/p-752742f8.entry.js +0 -1
  207. package/dist/lime-crm-building-blocks/p-B-WBKAaa.js +0 -1
  208. package/dist/lime-crm-building-blocks/p-BjXRsiQr.js +0 -1
  209. package/dist/lime-crm-building-blocks/p-Bkno2RtN.js +0 -1
  210. package/dist/lime-crm-building-blocks/p-D1RJ1y7s.js +0 -1
  211. package/dist/lime-crm-building-blocks/p-c891125e.entry.js +0 -1
  212. package/dist/lime-crm-building-blocks/p-cd7106f7.entry.js +0 -1
  213. package/dist/lime-crm-building-blocks/p-dbbc5ba7.entry.js +0 -1
  214. package/dist/lime-crm-building-blocks/p-ec1e079e.entry.js +0 -1
  215. package/dist/lime-crm-building-blocks/p-edeb359f.entry.js +0 -1
  216. package/dist/types/components/text-editor/uploader/building-blocks-upload-handler.d.ts +0 -62
@@ -1 +1 @@
1
- import{r as e,c as r,h as i,H as o}from"./p-DwHAn7LS.js";import{b as a}from"./p-Bkno2RtN.js";const s=class{constructor(o){e(this,o),this.interact=r(this,"interact"),this.renderRelations=()=>{var e,r,o;if(null===(r=null===(e=this.item)||void 0===e?void 0:e.relations)||void 0===r?void 0:r.length)return i("limel-chip-set",{value:null===(o=this.item)||void 0===o?void 0:o.relations})},this.renderAssigneesAvatar=e=>e.picture?i("img",{loading:"lazy",src:e.picture,alt:e.name.text}):i("limel-icon",{name:e.icon.name,style:{color:`${e.icon.color}`,"background-color":`${e.icon.backgroundColor}`}}),this.createMenuItem=e=>{var r,i;return"separator"in e?e:{value:e,text:null!==(r=e.label)&&void 0!==r?r:"",secondaryText:e.description,disabled:e.disabled,icon:null!==(i=e.icon)&&void 0!==i?i:""}},this.handleMenuItemSelect=e=>{var r;e.stopPropagation();const i=null===(r=e.detail.value)||void 0===r?void 0:r.command;i&&this.commandbus.handle(i)},this.handleKeyDown=e=>{"Enter"===e.key&&this.handleKanbanItemClick()},this.handleKanbanItemClick=()=>{this.interact.emit(this.item)}}render(){var e,r;return i(o,{key:"282342e6a11234154e4cbcc8df113aafd5cd9cd2",id:this.item.id.toString(),class:{"has-unpromoted-actions":!!(null===(e=this.item.unpromotedActions)||void 0===e?void 0:e.length),"is-selected":!!(null===(r=this.item)||void 0===r?void 0:r.selected)},style:{"--limebb-kanban-item-color-code":`${this.item.color}`},onClick:this.handleKanbanItemClick,onKeyDown:this.handleKeyDown},this.renderHeader(),this.renderContent(),this.renderSlot(),this.renderRelations(),this.renderFooter())}renderHeader(){return i("div",{class:"header"},this.renderIcon(),this.renderHeading(),this.renderUnpromotedActionsMenu())}renderIcon(){var e,r,o,a;if(this.item.icon)return i("limel-icon",{class:"icon",badge:!0,name:null!==(r=null===(e=this.item.icon)||void 0===e?void 0:e.name)&&void 0!==r?r:"dot_circle",style:{color:`${null===(o=this.item.icon)||void 0===o?void 0:o.color}`,"background-color":`${null===(a=this.item.icon)||void 0===a?void 0:a.backgroundColor}`}})}renderContent(){if(this.item.value)return i("div",{class:"content"},this.renderValue())}renderHeading(){if(this.item.heading)return i("limel-markdown",{class:"heading",value:this.item.heading})}renderValue(){if(this.item.value)return i("limel-markdown",{class:"body reset-img-height",value:this.item.value})}renderUnpromotedActionsMenu(){var e,r;if(!(null===(e=this.item.unpromotedActions)||void 0===e?void 0:e.length))return;const o=this.item.unpromotedActions.map(this.createMenuItem);return i("limel-menu",{class:"unpromoted-actions-menu",items:o,openDirection:"bottom-end",onSelect:this.handleMenuItemSelect},i("limel-icon",{class:"actions",name:"menu_2",slot:"trigger",size:"small",id:"item-actions-tooltip"}),i("limel-tooltip",{elementId:"item-actions-tooltip",label:null===(r=this.translator)||void 0===r?void 0:r.get("webclient.more-actions"),openDirection:"top-end"}))}renderSlot(){var e;if(null===(e=this.item)||void 0===e?void 0:e.bodyComponent)return i("slot",{name:"body"})}renderFooter(){var e;if(null===(e=this.item.assignees)||void 0===e?void 0:e.length)return i("div",{class:"footer"},this.renderAssignees())}renderAssignees(){var e;if(null===(e=this.item.assignees)||void 0===e?void 0:e.length)return i("div",{class:"assignees"},this.item.assignees.map((e=>{var r;return i("limebb-summary-popover",Object.assign({icon:null===(r=e.icon)||void 0===r?void 0:r.name},e.picture&&{image:{src:e.picture,alt:e.name.text||""}},{heading:e.name.text,value:this.createLinkToAssignee(e)}),i("a",{slot:"trigger",class:"assignee",href:e.name.href,title:e.name.text},this.renderAssigneesAvatar(e),i("span",null,e.name.text)))})))}createLinkToAssignee(e){const r=this.translator.get("webclient.actions.goto-object",{limetype:": <br><b>"+e.name.text+"</b>"});return`<a class="author" href="${e.name.href}" title="${e.name.text}">${r}</a>`}get translator(){var e;return null===(e=this.platform)||void 0===e?void 0:e.get(a.Translate)}get commandbus(){var e;return null===(e=this.platform)||void 0===e?void 0:e.get(a.CommandBus)}};s.style='@charset "UTF-8";*,*:before,*:after{box-sizing:border-box}:host(limebb-kanban-item){position:relative;box-sizing:border-box;display:flex;flex-direction:column;border-radius:0.5rem}:host(limebb-kanban-item):before{content:"";display:block;position:absolute;top:1rem;bottom:1rem;right:0;transform:translateX(50%);width:0.25rem;border-radius:1rem;background-color:var(--limebb-kanban-item-color-code)}.content{padding-top:0.25rem}.header{display:flex;align-items:flex-start;gap:0.5rem;min-height:1.75rem;padding:0.25rem 0.5rem;border-radius:0.5rem 0.5rem 0 0;background-color:rgb(var(--contrast-300))}.header a{position:relative;cursor:pointer;transition:color 0.2s ease;color:var(--mdc-theme-primary)}.header a:before{transition:opacity 0.2s ease, transform 0.3s ease-out;content:"";position:absolute;inset:auto 0 0 0;width:calc(100% - 0.5rem);margin:auto;height:0.125rem;border-radius:1rem;background-color:currentColor;opacity:0;transform:scale(0.6)}.header a:hover{color:rgb(var(--color-teal-light))}.header a:hover:before{opacity:0.3;transform:scale(1)}.header a{text-decoration:none}.heading{--markdown-hyperlink-color:var(--mdc-theme-primary);--markdown-hyperlink-color--hovered:rgb(var(--color-teal-light))}.unpromoted-actions-menu{margin:-0.5rem -0.5rem -0.25rem auto}.body{--limel-top-edge-fade-height:0.5rem;--limel-bottom-edge-fade-height:0.5rem;display:block;padding-left:0.5rem;padding-right:0.5rem;margin-top:-0.5rem;color:rgb(var(--contrast-1100));max-height:12rem;--limel-overflow-mask-vertical:linear-gradient( to bottom, transparent 0%, black calc(0% + var(--limel-top-edge-fade-height, 1rem)), black calc(100% - var(--limel-bottom-edge-fade-height, 1rem)), transparent 100% );-webkit-mask-image:var(--limel-overflow-mask-vertical);mask-image:var(--limel-overflow-mask-vertical);padding-top:var(--limel-top-edge-fade-height, 1rem);padding-bottom:var(--limel-bottom-edge-fade-height, 1rem)}limel-chip-set{--limel-chip-size:1.5rem;display:block;margin-left:-0.5rem;margin-right:0.5rem;padding-bottom:0.5rem}.footer{position:relative;display:flex;align-items:center;gap:0.5rem;padding:0.25rem 0.25rem 0.125rem;margin:0 0.25rem;border-top:1px dashed rgb(var(--contrast-300))}.header limel-icon,.footer limel-icon{flex-shrink:0;width:1.25rem;height:1.25rem}.header .actions{margin:0.5rem 0.25rem 0}.header .actions:hover{transition:color var(--limel-clickable-transition-speed, 0.4s) ease, background-color var(--limel-clickable-transition-speed, 0.4s) ease, box-shadow var(--limel-clickable-transform-speed, 0.4s) ease, transform var(--limel-clickable-transform-speed, 0.4s) var(--limel-clickable-transform-timing-function, ease);cursor:pointer;color:var(--limel-theme-on-surface-color);background-color:var(--lime-elevated-surface-background-color);box-shadow:var(--button-shadow-normal)}.header .actions:hover:hover,.header .actions:hover:focus,.header .actions:hover:focus-visible{will-change:color, background-color, box-shadow, transform}.header .actions:hover:hover,.header .actions:hover:focus-visible{transform:translate3d(0, -0.04rem, 0);color:var(--limel-theme-on-surface-color);background-color:var(--lime-elevated-surface-background-color);box-shadow:var(--button-shadow-hovered)}.header .actions:hover:active{--limel-clickable-transform-timing-function:cubic-bezier( 0.83, -0.15, 0.49, 1.16 );transform:translate3d(0, 0.05rem, 0);box-shadow:var(--button-shadow-pressed)}.header .actions:hover:hover,.header .actions:hover:active{--limel-clickable-transition-speed:0.2s;--limel-clickable-transform-speed:0.16s}.footer img{border-radius:50%;object-fit:cover;box-shadow:0 0 0 1px rgb(var(--contrast-800), 0.4);flex-shrink:0;width:1.25rem;height:1.25rem}.assignees{display:flex;align-items:center;gap:0.25rem}.assignees:has(>:nth-child(2)) span{display:none}.assignees:has(>:nth-child(2)) img,.assignees:has(>:nth-child(2)) limel-icon{margin-right:-0.5rem}.assignees:hover img,.assignees:hover limel-icon,.assignees:focus-within img,.assignees:focus-within limel-icon{margin-right:0rem}.assignees:hover .assignee:not(:hover):not(:focus-visible) img,.assignees:hover .assignee:not(:hover):not(:focus-visible) limel-icon,.assignees:focus-within .assignee:not(:hover):not(:focus-visible) img,.assignees:focus-within .assignee:not(:hover):not(:focus-visible) limel-icon{filter:grayscale(1);opacity:0.6}.assignee{transition:color var(--limel-clickable-transition-speed, 0.4s) ease, background-color var(--limel-clickable-transition-speed, 0.4s) ease, box-shadow var(--limel-clickable-transform-speed, 0.4s) ease, transform var(--limel-clickable-transform-speed, 0.4s) var(--limel-clickable-transform-timing-function, ease);cursor:pointer;color:var(--limel-theme-on-surface-color);background-color:transparent}.assignee:hover,.assignee:focus,.assignee:focus-visible{will-change:color, background-color, box-shadow, transform}.assignee:hover,.assignee:focus-visible{transform:translate3d(0, 0.01rem, 0);color:var(--limel-theme-on-surface-color);background-color:var(--lime-elevated-surface-background-color)}.assignee:hover{box-shadow:var(--button-shadow-hovered)}.assignee:active{--limel-clickable-transform-timing-function:cubic-bezier( 0.83, -0.15, 0.49, 1.16 );transform:translate3d(0, 0.05rem, 0);box-shadow:var(--button-shadow-pressed)}.assignee:hover,.assignee:active{--limel-clickable-transition-speed:0.2s;--limel-clickable-transform-speed:0.16s}.assignee:focus{outline:none}.assignee:focus-visible{outline:none;box-shadow:var(--shadow-depth-8-focused)}.assignee{display:flex;align-items:center;text-decoration:none;gap:0.25rem;margin-left:0;border-radius:1rem}.assignee limel-icon,.assignee img{transition:margin 0.2s ease, opacity 0.2s ease, filter 0.2s ease}.assignee limel-icon{padding:0.125rem;box-shadow:0 0 0 1px rgb(var(--contrast-800), 0.4);background-color:rgb(var(--contrast-100))}.assignee span{font-size:0.75rem;color:rgb(var(--contrast-900));padding-right:0.5rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}slot[name=body]{display:block;padding:0.5rem}';export{s as limebb_kanban_item}
1
+ import{r as e,c as r,h as i,H as o}from"./p-DwHAn7LS.js";import{n as a}from"./p-b78ub0mY.js";const s=class{constructor(o){e(this,o),this.interact=r(this,"interact"),this.renderRelations=()=>{var e,r,o;if(null===(r=null===(e=this.item)||void 0===e?void 0:e.relations)||void 0===r?void 0:r.length)return i("limel-chip-set",{value:null===(o=this.item)||void 0===o?void 0:o.relations})},this.renderAssigneesAvatar=e=>e.picture?i("img",{loading:"lazy",src:e.picture,alt:e.name.text}):i("limel-icon",{name:e.icon.name,style:{color:`${e.icon.color}`,"background-color":`${e.icon.backgroundColor}`}}),this.createMenuItem=e=>{var r,i;return"separator"in e?e:{value:e,text:null!==(r=e.label)&&void 0!==r?r:"",secondaryText:e.description,disabled:e.disabled,icon:null!==(i=e.icon)&&void 0!==i?i:""}},this.handleMenuItemSelect=e=>{var r;e.stopPropagation();const i=null===(r=e.detail.value)||void 0===r?void 0:r.command;i&&this.commandbus.handle(i)},this.handleKeyDown=e=>{"Enter"===e.key&&this.handleKanbanItemClick()},this.handleKanbanItemClick=()=>{this.interact.emit(this.item)}}render(){var e,r;return i(o,{key:"282342e6a11234154e4cbcc8df113aafd5cd9cd2",id:this.item.id.toString(),class:{"has-unpromoted-actions":!!(null===(e=this.item.unpromotedActions)||void 0===e?void 0:e.length),"is-selected":!!(null===(r=this.item)||void 0===r?void 0:r.selected)},style:{"--limebb-kanban-item-color-code":`${this.item.color}`},onClick:this.handleKanbanItemClick,onKeyDown:this.handleKeyDown},this.renderHeader(),this.renderContent(),this.renderSlot(),this.renderRelations(),this.renderFooter())}renderHeader(){return i("div",{class:"header"},this.renderIcon(),this.renderHeading(),this.renderUnpromotedActionsMenu())}renderIcon(){var e,r,o,a;if(this.item.icon)return i("limel-icon",{class:"icon",badge:!0,name:null!==(r=null===(e=this.item.icon)||void 0===e?void 0:e.name)&&void 0!==r?r:"dot_circle",style:{color:`${null===(o=this.item.icon)||void 0===o?void 0:o.color}`,"background-color":`${null===(a=this.item.icon)||void 0===a?void 0:a.backgroundColor}`}})}renderContent(){if(this.item.value)return i("div",{class:"content"},this.renderValue())}renderHeading(){if(this.item.heading)return i("limel-markdown",{class:"heading",value:this.item.heading})}renderValue(){if(this.item.value)return i("limel-markdown",{class:"body reset-img-height",value:this.item.value})}renderUnpromotedActionsMenu(){var e,r;if(!(null===(e=this.item.unpromotedActions)||void 0===e?void 0:e.length))return;const o=this.item.unpromotedActions.map(this.createMenuItem);return i("limel-menu",{class:"unpromoted-actions-menu",items:o,openDirection:"bottom-end",onSelect:this.handleMenuItemSelect},i("limel-icon",{class:"actions",name:"menu_2",slot:"trigger",size:"small",id:"item-actions-tooltip"}),i("limel-tooltip",{elementId:"item-actions-tooltip",label:null===(r=this.translator)||void 0===r?void 0:r.get("webclient.more-actions"),openDirection:"top-end"}))}renderSlot(){var e;if(null===(e=this.item)||void 0===e?void 0:e.bodyComponent)return i("slot",{name:"body"})}renderFooter(){var e;if(null===(e=this.item.assignees)||void 0===e?void 0:e.length)return i("div",{class:"footer"},this.renderAssignees())}renderAssignees(){var e;if(null===(e=this.item.assignees)||void 0===e?void 0:e.length)return i("div",{class:"assignees"},this.item.assignees.map((e=>{var r;return i("limebb-summary-popover",Object.assign({icon:null===(r=e.icon)||void 0===r?void 0:r.name},e.picture&&{image:{src:e.picture,alt:e.name.text||""}},{heading:e.name.text,value:this.createLinkToAssignee(e)}),i("a",{slot:"trigger",class:"assignee",href:e.name.href,title:e.name.text},this.renderAssigneesAvatar(e),i("span",null,e.name.text)))})))}createLinkToAssignee(e){const r=this.translator.get("webclient.actions.goto-object",{limetype:": <br><b>"+e.name.text+"</b>"});return`<a class="author" href="${e.name.href}" title="${e.name.text}">${r}</a>`}get translator(){var e;return null===(e=this.platform)||void 0===e?void 0:e.get(a.Translate)}get commandbus(){var e;return null===(e=this.platform)||void 0===e?void 0:e.get(a.CommandBus)}};s.style='@charset "UTF-8";*,*:before,*:after{box-sizing:border-box}:host(limebb-kanban-item){position:relative;box-sizing:border-box;display:flex;flex-direction:column;border-radius:0.5rem}:host(limebb-kanban-item):before{content:"";display:block;position:absolute;top:1rem;bottom:1rem;right:0;transform:translateX(50%);width:0.25rem;border-radius:1rem;background-color:var(--limebb-kanban-item-color-code)}.content{padding-top:0.25rem}.header{display:flex;align-items:flex-start;gap:0.5rem;min-height:1.75rem;padding:0.25rem 0.5rem;border-radius:0.5rem 0.5rem 0 0;background-color:rgb(var(--contrast-300))}.header a{position:relative;cursor:pointer;transition:color 0.2s ease;color:var(--mdc-theme-primary)}.header a:before{transition:opacity 0.2s ease, transform 0.3s ease-out;content:"";position:absolute;inset:auto 0 0 0;width:calc(100% - 0.5rem);margin:auto;height:0.125rem;border-radius:1rem;background-color:currentColor;opacity:0;transform:scale(0.6)}.header a:hover{color:rgb(var(--color-teal-light))}.header a:hover:before{opacity:0.3;transform:scale(1)}.header a{text-decoration:none}.heading{--markdown-hyperlink-color:var(--mdc-theme-primary);--markdown-hyperlink-color--hovered:rgb(var(--color-teal-light))}.unpromoted-actions-menu{margin:-0.5rem -0.5rem -0.25rem auto}.body{--limel-top-edge-fade-height:0.5rem;--limel-bottom-edge-fade-height:0.5rem;display:block;padding-left:0.5rem;padding-right:0.5rem;margin-top:-0.5rem;color:rgb(var(--contrast-1100));max-height:12rem;--limel-overflow-mask-vertical:linear-gradient( to bottom, transparent 0%, black calc(0% + var(--limel-top-edge-fade-height, 1rem)), black calc(100% - var(--limel-bottom-edge-fade-height, 1rem)), transparent 100% );-webkit-mask-image:var(--limel-overflow-mask-vertical);mask-image:var(--limel-overflow-mask-vertical);padding-top:var(--limel-top-edge-fade-height, 1rem);padding-bottom:var(--limel-bottom-edge-fade-height, 1rem)}limel-chip-set{--limel-chip-size:1.5rem;display:block;margin-left:-0.5rem;margin-right:0.5rem;padding-bottom:0.5rem}.footer{position:relative;display:flex;align-items:center;gap:0.5rem;padding:0.25rem 0.25rem 0.125rem;margin:0 0.25rem;border-top:1px dashed rgb(var(--contrast-300))}.header limel-icon,.footer limel-icon{flex-shrink:0;width:1.25rem;height:1.25rem}.header .actions{margin:0.5rem 0.25rem 0}.header .actions:hover{transition:color var(--limel-clickable-transition-speed, 0.4s) ease, background-color var(--limel-clickable-transition-speed, 0.4s) ease, box-shadow var(--limel-clickable-transform-speed, 0.4s) ease, transform var(--limel-clickable-transform-speed, 0.4s) var(--limel-clickable-transform-timing-function, ease);cursor:pointer;color:var(--limel-theme-on-surface-color);background-color:var(--lime-elevated-surface-background-color);box-shadow:var(--button-shadow-normal)}.header .actions:hover:hover,.header .actions:hover:focus,.header .actions:hover:focus-visible{will-change:color, background-color, box-shadow, transform}.header .actions:hover:hover,.header .actions:hover:focus-visible{transform:translate3d(0, -0.04rem, 0);color:var(--limel-theme-on-surface-color);background-color:var(--lime-elevated-surface-background-color);box-shadow:var(--button-shadow-hovered)}.header .actions:hover:active{--limel-clickable-transform-timing-function:cubic-bezier( 0.83, -0.15, 0.49, 1.16 );transform:translate3d(0, 0.05rem, 0);box-shadow:var(--button-shadow-pressed)}.header .actions:hover:hover,.header .actions:hover:active{--limel-clickable-transition-speed:0.2s;--limel-clickable-transform-speed:0.16s}.footer img{border-radius:50%;object-fit:cover;box-shadow:0 0 0 1px rgb(var(--contrast-800), 0.4);flex-shrink:0;width:1.25rem;height:1.25rem}.assignees{display:flex;align-items:center;gap:0.25rem}.assignees:has(>:nth-child(2)) span{display:none}.assignees:has(>:nth-child(2)) img,.assignees:has(>:nth-child(2)) limel-icon{margin-right:-0.5rem}.assignees:hover img,.assignees:hover limel-icon,.assignees:focus-within img,.assignees:focus-within limel-icon{margin-right:0rem}.assignees:hover .assignee:not(:hover):not(:focus-visible) img,.assignees:hover .assignee:not(:hover):not(:focus-visible) limel-icon,.assignees:focus-within .assignee:not(:hover):not(:focus-visible) img,.assignees:focus-within .assignee:not(:hover):not(:focus-visible) limel-icon{filter:grayscale(1);opacity:0.6}.assignee{transition:color var(--limel-clickable-transition-speed, 0.4s) ease, background-color var(--limel-clickable-transition-speed, 0.4s) ease, box-shadow var(--limel-clickable-transform-speed, 0.4s) ease, transform var(--limel-clickable-transform-speed, 0.4s) var(--limel-clickable-transform-timing-function, ease);cursor:pointer;color:var(--limel-theme-on-surface-color);background-color:transparent}.assignee:hover,.assignee:focus,.assignee:focus-visible{will-change:color, background-color, box-shadow, transform}.assignee:hover,.assignee:focus-visible{transform:translate3d(0, 0.01rem, 0);color:var(--limel-theme-on-surface-color);background-color:var(--lime-elevated-surface-background-color)}.assignee:hover{box-shadow:var(--button-shadow-hovered)}.assignee:active{--limel-clickable-transform-timing-function:cubic-bezier( 0.83, -0.15, 0.49, 1.16 );transform:translate3d(0, 0.05rem, 0);box-shadow:var(--button-shadow-pressed)}.assignee:hover,.assignee:active{--limel-clickable-transition-speed:0.2s;--limel-clickable-transform-speed:0.16s}.assignee:focus{outline:none}.assignee:focus-visible{outline:none;box-shadow:var(--shadow-depth-8-focused)}.assignee{display:flex;align-items:center;text-decoration:none;gap:0.25rem;margin-left:0;border-radius:1rem}.assignee limel-icon,.assignee img{transition:margin 0.2s ease, opacity 0.2s ease, filter 0.2s ease}.assignee limel-icon{padding:0.125rem;box-shadow:0 0 0 1px rgb(var(--contrast-800), 0.4);background-color:rgb(var(--contrast-100))}.assignee span{font-size:0.75rem;color:rgb(var(--contrast-900));padding-right:0.5rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}slot[name=body]{display:block;padding:0.5rem}';export{s as limebb_kanban_item}
@@ -1 +1 @@
1
- import{r as t,c as i,h as e}from"./p-DwHAn7LS.js";import{b as s}from"./p-Bkno2RtN.js";const h=class{constructor(e){t(this,e),this.change=i(this,"change"),this.disabled=!1,this.readonly=!1,this.invalid=!1,this.required=!1,this.type="datetime",this.shouldEmitValueAsString=!0,this.handleChange=t=>{if(!t.detail)return;t.stopPropagation();const i=(e=t.detail,"datetime"===(s=this.type)||"time"===s?e:new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())));var e,s;this.change.emit(this.shouldEmitValueAsString?i.toISOString():i)},this.formatter=t=>this.dateTimeFormatter.format(t,a[this.type]||this.type)}render(){return this.language||(this.language=this.getAppLanguage()),this.value&&(this.shouldEmitValueAsString="string"==typeof this.value),e("limel-date-picker",{key:"218c0a409c7a508fd551099d1df5e7e05734db10",disabled:this.disabled,readonly:this.readonly,invalid:this.invalid,label:this.label,placeholder:this.placeholder,helperText:this.helperText,required:this.required,value:this.parseDateValue(),type:this.type,language:this.language,formatter:this.formatter,onChange:this.handleChange})}parseDateValue(){const t=this.value;if(t)return this.dateTimeFormatter.parse(t,a[this.type]||this.type)}get dateTimeFormatter(){return this.platform.get(s.DateTimeFormatter)}getAppLanguage(){const t=this.platform.get(s.Translate),i=this.platform.get(s.Application);let e;var h;return e="function"==typeof(null==(h=t)?void 0:h.getLanguage)?t.getLanguage():i.getLanguage(),n(e)?e:"en"}},a={datetime:"time",time:"timeofday"},r=new Set(["da","de","en","fi","fr","nb","no","nl","sv"]),n=t=>r.has(t);export{h as limebb_date_picker}
1
+ import{r as t,c as i,h as e}from"./p-DwHAn7LS.js";import{n as s}from"./p-b78ub0mY.js";const h=class{constructor(e){t(this,e),this.change=i(this,"change"),this.disabled=!1,this.readonly=!1,this.invalid=!1,this.required=!1,this.type="datetime",this.shouldEmitValueAsString=!0,this.handleChange=t=>{if(!t.detail)return;t.stopPropagation();const i=(e=t.detail,"datetime"===(s=this.type)||"time"===s?e:new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())));var e,s;this.change.emit(this.shouldEmitValueAsString?i.toISOString():i)},this.formatter=t=>this.dateTimeFormatter.format(t,r[this.type]||this.type)}render(){return this.language||(this.language=this.getAppLanguage()),this.value&&(this.shouldEmitValueAsString="string"==typeof this.value),e("limel-date-picker",{key:"218c0a409c7a508fd551099d1df5e7e05734db10",disabled:this.disabled,readonly:this.readonly,invalid:this.invalid,label:this.label,placeholder:this.placeholder,helperText:this.helperText,required:this.required,value:this.parseDateValue(),type:this.type,language:this.language,formatter:this.formatter,onChange:this.handleChange})}parseDateValue(){const t=this.value;if(t)return this.dateTimeFormatter.parse(t,r[this.type]||this.type)}get dateTimeFormatter(){return this.platform.get(s.DateTimeFormatter)}getAppLanguage(){const t=this.platform.get(s.Translate),i=this.platform.get(s.Application);let e;var h;return e="function"==typeof(null==(h=t)?void 0:h.getLanguage)?t.getLanguage():i.getLanguage(),n(e)?e:"en"}},r={datetime:"time",time:"timeofday"},a=new Set(["da","de","en","fi","fr","nb","no","nl","sv"]),n=t=>a.has(t);export{h as limebb_date_picker}
@@ -0,0 +1 @@
1
+ import{r as i,c as t,h as e,H as s}from"./p-DwHAn7LS.js";import{n as r,o}from"./p-b78ub0mY.js";import{a as n}from"./p-CE43qjk3.js";import{a as h}from"./p-CQUZjrU4.js";import{g as l}from"./p-CVEd2QZ8.js";import{a}from"./p-Cw4kdMw3.js";const p=class{constructor(e){i(this,e),this.expressionChange=t(this,"expressionChange"),this.isOpen=!1,this.handleOpen=()=>{this.isOpen=!0},this.handleClose=()=>{this.isOpen=!1},this.handleEditorChange=i=>{i.stopPropagation(),this.expressionChange.emit(i.detail)},this.removeExpression=()=>{this.expressionChange.emit(void 0)}}componentWillLoad(){var i;(null===(i=this.expression)||void 0===i?void 0:i.key)||(this.isOpen=!0)}render(){var i,t;const r=!!(null===(i=this.expression)||void 0===i?void 0:i.key),o=Array.isArray(null===(t=this.expression)||void 0===t?void 0:t.exp),h=r?this.getPropertyType(this.expression.key):void 0;return e(s,{key:"3e312a0124577ab70c6ab46074f7a34e0b87decc"},this.renderHeader(),e("limel-popover",{key:"37b5e3b58ef4a20950b1f6fc24075388b4bdc932",open:this.isOpen,openDirection:"bottom-start",onClose:this.handleClose},e("limebb-filter-chip",{key:"d34fc11734714a8b83ef7c014fd9468522e8ffbf",slot:"trigger",platform:this.platform,label:r?this.getPropertyLabel(this.expression.key):void 0,condition:r?n(this.expression.op):void 0,propertyType:h,value:r?this.chipValue():"New condition",conjunction:o?"or":void 0,selected:this.isOpen,removable:!0,onClick:this.handleOpen,onRemove:this.removeExpression}),e("limebb-lime-query-filter-comparison-editor",{key:"abaa2fbbdf8ab350f1da21412b82405d02f1546f",platform:this.platform,context:this.context,limetype:this.limetype,activeLimetype:this.activeLimetype,expression:this.expression,propertyType:h,onExpressionChange:this.handleEditorChange})))}getPropertyLabel(i){return this.resolveProperty(i).labels.join(" › ")}getPropertyType(i){const{property:t}=this.resolveProperty(i);return t?l(t):void 0}resolveProperty(i){var t,e;const s=null===(t=this.platform)||void 0===t?void 0:t.get(r.LimeTypeRepository);if(!s||!this.limetype)return{labels:[i]};const o=[];let n,l=s.getLimeType(this.limetype);for(const t of i.split("."))n=l?h(l)[t]:void 0,o.push((null==n?void 0:n.localname)||t),l=null===(e=null==n?void 0:n.relation)||void 0===e?void 0:e.getLimetype();return{labels:o,property:n}}chipValue(){const i=this.expression.exp;return Array.isArray(i)?i.map((i=>this.formatValue(i))):this.formatValue(i)}formatValue(i){return null==i||""===i?"…":Array.isArray(i)?i.map((i=>this.formatValue(i))).join(", "):"string"==typeof i?i:String(i)}renderHeader(){if(this.label)return e("limel-header",{subheading:this.label})}};p.style=":host(limebb-lime-query-filter-comparison){display:inline-block;max-width:25rem}";const m=class{constructor(e){i(this,e),this.expressionChange=t(this,"expressionChange"),this.handleExpressionChange=i=>{i.stopPropagation(),this.expressionChange.emit(i.detail)}}render(){if(!this.expression)return;const i={platform:this.platform,context:this.context,label:this.label,limetype:this.limetype,activeLimetype:this.activeLimetype};if("key"in this.expression)return e("limebb-lime-query-filter-comparison",Object.assign({},i,{expression:this.expression,onExpressionChange:this.handleExpressionChange}));const t=a(this.expression);return t?e("limebb-lime-query-filter-group",Object.assign({},i,{expression:t,onExpressionChange:this.handleExpressionChange})):this.expression.op===o.NOT?e("limebb-lime-query-filter-not",Object.assign({},i,{expression:this.expression,onExpressionChange:this.handleExpressionChange})):void 0}};export{p as limebb_lime_query_filter_comparison,m as limebb_lime_query_filter_expression}
@@ -2,6 +2,7 @@
2
2
  import { PlatformServiceName, } from "@limetech/lime-web-components";
3
3
  import { TestClient, } from "@lundalogik/limeclient.js/testing";
4
4
  import { readFile } from "node:fs/promises";
5
+ import { beforeAll } from "vitest";
5
6
  export let testClient;
6
7
  let limetypesFixtures;
7
8
  let limeobjectsFixtures;
@@ -66,7 +66,9 @@ export declare class FeedTimelineItem implements LimeWebComponent {
66
66
  private bodyTextHeight;
67
67
  private lastMeasuredWidth;
68
68
  private collapsibleButtonId;
69
+ connectedCallback(): void;
69
70
  componentDidLoad(): void;
71
+ private observe;
70
72
  private setHeaderCollapsible;
71
73
  disconnectedCallback(): void;
72
74
  private bodyTextTall;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * An inline image, referenced only by its file id so stored content stays
3
+ * portable. The contents URL is resolved at render time. Used for read-only
4
+ * rendering via `limel-markdown`; inside the editor the same tag is handled by
5
+ * `limel-text-editor`.
6
+ *
7
+ * @private
8
+ */
9
+ export declare class InlineImage {
10
+ /**
11
+ * Id of the file backing this image. Maps to the `image-id` attribute.
12
+ */
13
+ imageId: string;
14
+ /**
15
+ * Alternative text for the image.
16
+ */
17
+ alt: string;
18
+ /**
19
+ * Rendered width (e.g. `400` or `400px`).
20
+ */
21
+ width?: string;
22
+ /**
23
+ * Rendered height (e.g. `300` or `300px`).
24
+ */
25
+ height?: string;
26
+ private appName;
27
+ connectedCallback(): void;
28
+ render(): any;
29
+ private hasPlatform;
30
+ private toCssSize;
31
+ }
32
+ //# sourceMappingURL=inline-image.d.ts.map
@@ -2,7 +2,6 @@ import { CustomElementDefinition, EditorUiType, FormComponent, Languages } from
2
2
  import { LimeWebComponentContext, LimeWebComponentPlatform } from '@limetech/lime-web-components';
3
3
  import { EventEmitter } from '../../stencil-public-runtime';
4
4
  import { TriggerMap } from './text-editor.types';
5
- import { EnhancedEditorMetadata } from './uploader/building-blocks-upload-handler';
6
5
  /**
7
6
  * This component is a wrapper on the `limel-text-editor`. It adds support for platform
8
7
  * specific things that can't reside in lime-elements. So this is basically an
@@ -164,19 +163,24 @@ export declare class LimeBBTextEditor implements FormComponent<string> {
164
163
  triggerMap: TriggerMap;
165
164
  customElements: CustomElementDefinition[];
166
165
  /**
167
- * Enables image pasting in the editor.
166
+ * Enables pasting images into the editor.
168
167
  * Default: `false`
169
168
  *
169
+ * Existing inline images always render and round-trip regardless of this
170
+ * setting; it only controls whether the user can paste and upload new ones.
171
+ *
170
172
  * :::note
171
- * This component handles the upload process.
172
- * The consumer must process the uploaded images by listening to `metadataChange` event.
173
+ * This component handles the upload process and embeds pasted images
174
+ * directly in the editor content. Listen to `imageUploadingChange` to know
175
+ * when an upload is in progress (e.g. to disable a save button).
173
176
  * :::
174
177
  */
175
- allowInlineImages: boolean;
178
+ allowPasteImages: boolean;
176
179
  private items;
177
180
  private highlightedItemIndex;
178
181
  private editorPickerQuery;
179
182
  private searchableLimetypes;
183
+ private appName;
180
184
  /**
181
185
  * Open state of the picker
182
186
  */
@@ -191,9 +195,11 @@ export declare class LimeBBTextEditor implements FormComponent<string> {
191
195
  */
192
196
  change: EventEmitter<string>;
193
197
  /**
194
- * Dispatched when the metadata of the editor changes
198
+ * Dispatched when an inline image upload starts (`true`) and when all
199
+ * in-flight uploads have settled (`false`). Use it to gate actions that
200
+ * must wait for pasted images to finish uploading, such as saving.
195
201
  */
196
- metadataChange: EventEmitter<EnhancedEditorMetadata>;
202
+ imageUploadingChange: EventEmitter<boolean>;
197
203
  private registeredTriggers;
198
204
  private registeredTriggerMap;
199
205
  private registeredCustomElements;
@@ -205,7 +211,7 @@ export declare class LimeBBTextEditor implements FormComponent<string> {
205
211
  private textEditorPickerElement;
206
212
  private textEditorInnerId;
207
213
  private debouncedSearchFn;
208
- private uploadHandler;
214
+ private pendingUploads;
209
215
  protected watchOpen(): void;
210
216
  protected watchQuery(): void;
211
217
  constructor();
@@ -225,9 +231,9 @@ export declare class LimeBBTextEditor implements FormComponent<string> {
225
231
  private readonly handleEnterOrTabKey;
226
232
  render(): any[];
227
233
  private renderPicker;
228
- private readonly handleMetadataChange;
229
- private getEnhancedImages;
230
- private readonly handleImagePasted;
234
+ private get inlineImages();
235
+ private uploadImage;
236
+ private uploadFile;
231
237
  private readonly handleTriggerStart;
232
238
  private readonly handleTriggerStop;
233
239
  private readonly handleTriggerChange;
@@ -33,7 +33,6 @@ import { NavigationButtonType } from "./components/navigation-button/navigation-
33
33
  import { NotificationItem } from "./components/notification-list/notification-item/notification-item.types";
34
34
  import { RuleArgFilterEditorValue } from "./components/rule-editor/rule-arg-filter-editor/rule-arg-filter-editor";
35
35
  import { TriggerMap } from "./components/text-editor/text-editor.types";
36
- import { EnhancedEditorMetadata } from "./components/text-editor/uploader/building-blocks-upload-handler";
37
36
  import { ValueComparisonEditorValue } from "./components/rule-editor/value-comparison-editor/value-comparison-editor";
38
37
  export { AlertType } from "./components/alert-dialog/alert-dialog.types";
39
38
  export { AggregateOperator, ContextMap, ContextScope, Expression, JsonValue, LimeFileUrlType, LimeType, LimeWebComponentContext, LimeWebComponentPlatform, NotExpression, Operator, PrimitiveMetadata, PropertyType, Rule, RuleRef } from "@limetech/lime-web-components";
@@ -63,7 +62,6 @@ export { NavigationButtonType } from "./components/navigation-button/navigation-
63
62
  export { NotificationItem } from "./components/notification-list/notification-item/notification-item.types";
64
63
  export { RuleArgFilterEditorValue } from "./components/rule-editor/rule-arg-filter-editor/rule-arg-filter-editor";
65
64
  export { TriggerMap } from "./components/text-editor/text-editor.types";
66
- export { EnhancedEditorMetadata } from "./components/text-editor/uploader/building-blocks-upload-handler";
67
65
  export { ValueComparisonEditorValue } from "./components/rule-editor/value-comparison-editor/value-comparison-editor";
68
66
  export namespace Components {
69
67
  /**
@@ -1319,6 +1317,32 @@ export namespace Components {
1319
1317
  */
1320
1318
  "value": NumberFormat;
1321
1319
  }
1320
+ /**
1321
+ * An inline image, referenced only by its file id so stored content stays
1322
+ * portable. The contents URL is resolved at render time. Used for read-only
1323
+ * rendering via `limel-markdown`; inside the editor the same tag is handled by
1324
+ * `limel-text-editor`.
1325
+ * @private
1326
+ */
1327
+ interface LimebbInlineImage {
1328
+ /**
1329
+ * Alternative text for the image.
1330
+ * @default ''
1331
+ */
1332
+ "alt": string;
1333
+ /**
1334
+ * Rendered height (e.g. `300` or `300px`).
1335
+ */
1336
+ "height"?: string;
1337
+ /**
1338
+ * Id of the file backing this image. Maps to the `image-id` attribute.
1339
+ */
1340
+ "imageId": string;
1341
+ /**
1342
+ * Rendered width (e.g. `400` or `400px`).
1343
+ */
1344
+ "width"?: string;
1345
+ }
1322
1346
  /**
1323
1347
  * A Kanban board is a visual management tool that displays work items as
1324
1348
  * cards, organized into groups representing different stages of a workflow.
@@ -2641,15 +2665,15 @@ export namespace Components {
2641
2665
  */
2642
2666
  interface LimebbTextEditor {
2643
2667
  /**
2644
- * Enables image pasting in the editor. Default: `false` :::note This component handles the upload process. The consumer must process the uploaded images by listening to `metadataChange` event. :::
2668
+ * Set to true to enable mentioning a coworker or groups of coworkers. Mentions already present will still be rendered with a link to the coworker or the group of coworkers regardless of the value of this property
2645
2669
  * @default false
2646
2670
  */
2647
- "allowInlineImages": boolean;
2671
+ "allowMentioning": boolean;
2648
2672
  /**
2649
- * Set to true to enable mentioning a coworker or groups of coworkers. Mentions already present will still be rendered with a link to the coworker or the group of coworkers regardless of the value of this property
2673
+ * Enables pasting images into the editor. Default: `false` Existing inline images always render and round-trip regardless of this setting; it only controls whether the user can paste and upload new ones. :::note This component handles the upload process and embeds pasted images directly in the editor content. Listen to `imageUploadingChange` to know when an upload is in progress (e.g. to disable a save button). :::
2650
2674
  * @default false
2651
2675
  */
2652
- "allowMentioning": boolean;
2676
+ "allowPasteImages": boolean;
2653
2677
  /**
2654
2678
  * Set to `true` to allow the user to vertically resize the editor. Set to `false` to disable the resize functionality.
2655
2679
  * @default true
@@ -3888,6 +3912,19 @@ declare global {
3888
3912
  prototype: HTMLLimebbInfoTileUnitFormatElement;
3889
3913
  new (): HTMLLimebbInfoTileUnitFormatElement;
3890
3914
  };
3915
+ /**
3916
+ * An inline image, referenced only by its file id so stored content stays
3917
+ * portable. The contents URL is resolved at render time. Used for read-only
3918
+ * rendering via `limel-markdown`; inside the editor the same tag is handled by
3919
+ * `limel-text-editor`.
3920
+ * @private
3921
+ */
3922
+ interface HTMLLimebbInlineImageElement extends Components.LimebbInlineImage, HTMLStencilElement {
3923
+ }
3924
+ var HTMLLimebbInlineImageElement: {
3925
+ prototype: HTMLLimebbInlineImageElement;
3926
+ new (): HTMLLimebbInlineImageElement;
3927
+ };
3891
3928
  interface HTMLLimebbKanbanElementEventMap {
3892
3929
  "loadMore": KanbanGroup;
3893
3930
  "interact": KanbanItem;
@@ -4824,7 +4861,7 @@ declare global {
4824
4861
  };
4825
4862
  interface HTMLLimebbTextEditorElementEventMap {
4826
4863
  "change": string;
4827
- "metadataChange": EnhancedEditorMetadata;
4864
+ "imageUploadingChange": boolean;
4828
4865
  }
4829
4866
  /**
4830
4867
  * This component is a wrapper on the `limel-text-editor`. It adds support for platform
@@ -4983,6 +5020,7 @@ declare global {
4983
5020
  "limebb-info-tile-format": HTMLLimebbInfoTileFormatElement;
4984
5021
  "limebb-info-tile-relative-date-format": HTMLLimebbInfoTileRelativeDateFormatElement;
4985
5022
  "limebb-info-tile-unit-format": HTMLLimebbInfoTileUnitFormatElement;
5023
+ "limebb-inline-image": HTMLLimebbInlineImageElement;
4986
5024
  "limebb-kanban": HTMLLimebbKanbanElement;
4987
5025
  "limebb-kanban-group": HTMLLimebbKanbanGroupElement;
4988
5026
  "limebb-kanban-item": HTMLLimebbKanbanItemElement;
@@ -6384,6 +6422,32 @@ declare namespace LocalJSX {
6384
6422
  */
6385
6423
  "value"?: NumberFormat;
6386
6424
  }
6425
+ /**
6426
+ * An inline image, referenced only by its file id so stored content stays
6427
+ * portable. The contents URL is resolved at render time. Used for read-only
6428
+ * rendering via `limel-markdown`; inside the editor the same tag is handled by
6429
+ * `limel-text-editor`.
6430
+ * @private
6431
+ */
6432
+ interface LimebbInlineImage {
6433
+ /**
6434
+ * Alternative text for the image.
6435
+ * @default ''
6436
+ */
6437
+ "alt"?: string;
6438
+ /**
6439
+ * Rendered height (e.g. `300` or `300px`).
6440
+ */
6441
+ "height"?: string;
6442
+ /**
6443
+ * Id of the file backing this image. Maps to the `image-id` attribute.
6444
+ */
6445
+ "imageId"?: string;
6446
+ /**
6447
+ * Rendered width (e.g. `400` or `400px`).
6448
+ */
6449
+ "width"?: string;
6450
+ }
6387
6451
  /**
6388
6452
  * A Kanban board is a visual management tool that displays work items as
6389
6453
  * cards, organized into groups representing different stages of a workflow.
@@ -7813,15 +7877,15 @@ declare namespace LocalJSX {
7813
7877
  */
7814
7878
  interface LimebbTextEditor {
7815
7879
  /**
7816
- * Enables image pasting in the editor. Default: `false` :::note This component handles the upload process. The consumer must process the uploaded images by listening to `metadataChange` event. :::
7880
+ * Set to true to enable mentioning a coworker or groups of coworkers. Mentions already present will still be rendered with a link to the coworker or the group of coworkers regardless of the value of this property
7817
7881
  * @default false
7818
7882
  */
7819
- "allowInlineImages"?: boolean;
7883
+ "allowMentioning"?: boolean;
7820
7884
  /**
7821
- * Set to true to enable mentioning a coworker or groups of coworkers. Mentions already present will still be rendered with a link to the coworker or the group of coworkers regardless of the value of this property
7885
+ * Enables pasting images into the editor. Default: `false` Existing inline images always render and round-trip regardless of this setting; it only controls whether the user can paste and upload new ones. :::note This component handles the upload process and embeds pasted images directly in the editor content. Listen to `imageUploadingChange` to know when an upload is in progress (e.g. to disable a save button). :::
7822
7886
  * @default false
7823
7887
  */
7824
- "allowMentioning"?: boolean;
7888
+ "allowPasteImages"?: boolean;
7825
7889
  /**
7826
7890
  * Set to `true` to allow the user to vertically resize the editor. Set to `false` to disable the resize functionality.
7827
7891
  * @default true
@@ -7873,9 +7937,9 @@ declare namespace LocalJSX {
7873
7937
  */
7874
7938
  "onChange"?: (event: LimebbTextEditorCustomEvent<string>) => void;
7875
7939
  /**
7876
- * Dispatched when the metadata of the editor changes
7940
+ * Dispatched when an inline image upload starts (`true`) and when all in-flight uploads have settled (`false`). Use it to gate actions that must wait for pasted images to finish uploading, such as saving.
7877
7941
  */
7878
- "onMetadataChange"?: (event: LimebbTextEditorCustomEvent<EnhancedEditorMetadata>) => void;
7942
+ "onImageUploadingChange"?: (event: LimebbTextEditorCustomEvent<boolean>) => void;
7879
7943
  /**
7880
7944
  * The placeholder text shown inside the input field, when the field is empty.
7881
7945
  */
@@ -8220,6 +8284,12 @@ declare namespace LocalJSX {
8220
8284
  interface LimebbInfoTileFormatAttributes {
8221
8285
  "type": 'number' | 'date' | 'none';
8222
8286
  }
8287
+ interface LimebbInlineImageAttributes {
8288
+ "imageId": string;
8289
+ "alt": string;
8290
+ "width": string;
8291
+ "height": string;
8292
+ }
8223
8293
  interface LimebbKanbanGroupAttributes {
8224
8294
  "identifier": string;
8225
8295
  "heading": string;
@@ -8390,7 +8460,7 @@ declare namespace LocalJSX {
8390
8460
  "allowResize": boolean;
8391
8461
  "value": string;
8392
8462
  "draftIdentifier": string;
8393
- "allowInlineImages": boolean;
8463
+ "allowPasteImages": boolean;
8394
8464
  }
8395
8465
  interface LimebbTextEditorPickerAttributes {
8396
8466
  "open": boolean;
@@ -8441,6 +8511,7 @@ declare namespace LocalJSX {
8441
8511
  "limebb-info-tile-format": Omit<LimebbInfoTileFormat, keyof LimebbInfoTileFormatAttributes> & { [K in keyof LimebbInfoTileFormat & keyof LimebbInfoTileFormatAttributes]?: LimebbInfoTileFormat[K] } & { [K in keyof LimebbInfoTileFormat & keyof LimebbInfoTileFormatAttributes as `attr:${K}`]?: LimebbInfoTileFormatAttributes[K] } & { [K in keyof LimebbInfoTileFormat & keyof LimebbInfoTileFormatAttributes as `prop:${K}`]?: LimebbInfoTileFormat[K] };
8442
8512
  "limebb-info-tile-relative-date-format": LimebbInfoTileRelativeDateFormat;
8443
8513
  "limebb-info-tile-unit-format": LimebbInfoTileUnitFormat;
8514
+ "limebb-inline-image": Omit<LimebbInlineImage, keyof LimebbInlineImageAttributes> & { [K in keyof LimebbInlineImage & keyof LimebbInlineImageAttributes]?: LimebbInlineImage[K] } & { [K in keyof LimebbInlineImage & keyof LimebbInlineImageAttributes as `attr:${K}`]?: LimebbInlineImageAttributes[K] } & { [K in keyof LimebbInlineImage & keyof LimebbInlineImageAttributes as `prop:${K}`]?: LimebbInlineImage[K] };
8444
8515
  "limebb-kanban": LimebbKanban;
8445
8516
  "limebb-kanban-group": Omit<LimebbKanbanGroup, keyof LimebbKanbanGroupAttributes> & { [K in keyof LimebbKanbanGroup & keyof LimebbKanbanGroupAttributes]?: LimebbKanbanGroup[K] } & { [K in keyof LimebbKanbanGroup & keyof LimebbKanbanGroupAttributes as `attr:${K}`]?: LimebbKanbanGroupAttributes[K] } & { [K in keyof LimebbKanbanGroup & keyof LimebbKanbanGroupAttributes as `prop:${K}`]?: LimebbKanbanGroup[K] };
8446
8517
  "limebb-kanban-item": LimebbKanbanItem;
@@ -8905,6 +8976,14 @@ declare module "@stencil/core" {
8905
8976
  * @private
8906
8977
  */
8907
8978
  "limebb-info-tile-unit-format": LocalJSX.IntrinsicElements["limebb-info-tile-unit-format"] & JSXBase.HTMLAttributes<HTMLLimebbInfoTileUnitFormatElement>;
8979
+ /**
8980
+ * An inline image, referenced only by its file id so stored content stays
8981
+ * portable. The contents URL is resolved at render time. Used for read-only
8982
+ * rendering via `limel-markdown`; inside the editor the same tag is handled by
8983
+ * `limel-text-editor`.
8984
+ * @private
8985
+ */
8986
+ "limebb-inline-image": LocalJSX.IntrinsicElements["limebb-inline-image"] & JSXBase.HTMLAttributes<HTMLLimebbInlineImageElement>;
8908
8987
  /**
8909
8988
  * A Kanban board is a visual management tool that displays work items as
8910
8989
  * cards, organized into groups representing different stages of a workflow.
@@ -9,11 +9,6 @@ export * from './components/notification-list/notification-item/notification-ite
9
9
  export * from './components/browser/browser-item.types';
10
10
  export * from './components/text-editor/text-editor.types';
11
11
  export * from './util/basic-limetype-props';
12
- export {
13
- EnhancedEditorMetadata,
14
- EnhancedEditorImage,
15
- UploadHandler,
16
- } from './components/text-editor/uploader/building-blocks-upload-handler';
17
12
  export {
18
13
  FileUpload,
19
14
  FileStatus,
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Builds the contents URL for a stored file, relative to the application base.
3
+ *
4
+ * @param appName - the current application name
5
+ * @param fileId - the id of the file
6
+ * @returns the file contents URL
7
+ */
8
+ export declare function getFileContentsUrl(appName: string, fileId: string): string;
9
+ //# sourceMappingURL=file-contents-url.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@limetech/lime-crm-building-blocks",
3
- "version": "1.140.0",
3
+ "version": "2.0.1",
4
4
  "description": "A home for shared components meant for use with Lime CRM",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.js",
@@ -21,9 +21,8 @@
21
21
  "lint": "eslint --max-warnings=0 && prettier -c --ignore-path .gitignore **/*.scss",
22
22
  "lint:fix": "eslint --max-warnings=0 --fix && prettier --write --ignore-path .gitignore **/*.scss",
23
23
  "start": "stencil build --dev --watch --serve --docs",
24
- "test": "cross-env-shell TZ=Europe/Stockholm \"stencil test --spec --collect-coverage\"",
25
- "test:watch": "cross-env-shell TZ=Europe/Stockholm \"stencil test --spec --watchAll\"",
26
- "test:watch:cov": "npm run test:watch -- --collect-coverage",
24
+ "test": "cross-env-shell TZ=Europe/Stockholm \"vitest run --config vitest.config.mts --coverage\"",
25
+ "test:watch": "cross-env-shell TZ=Europe/Stockholm \"vitest --config vitest.config.mts\"",
27
26
  "generate": "stencil generate"
28
27
  },
29
28
  "repository": {
@@ -35,29 +34,29 @@
35
34
  },
36
35
  "devDependencies": {
37
36
  "@limetech/eslint-config": "^4.0.1",
38
- "@limetech/lime-elements": "^39.35.0",
39
- "@limetech/lime-web-components": "^6.26.0",
37
+ "@limetech/lime-elements": "^39.42.1",
38
+ "@limetech/lime-web-components": "^7.2.0",
40
39
  "@lundalogik/lime-icons8": "^2.41.0",
41
- "@lundalogik/limeclient.js": "^1.110.0",
40
+ "@lundalogik/limeclient.js": "^1.113.1",
42
41
  "@stencil/core": "^4.43.5",
43
42
  "@stencil/sass": "^3.2.3",
44
- "@types/jest": "^29.5.14",
43
+ "@stencil/vitest": "^1.13.3",
45
44
  "@types/json-schema": "^7.0.15",
46
45
  "@types/lodash-es": "^4.17.12",
46
+ "@vitest/coverage-v8": "^4.1.10",
47
47
  "cross-env": "^10.1.0",
48
48
  "currency-codes": "^2.2.0",
49
49
  "date-fns": "^4.4.0",
50
- "eslint": "^10.5.0",
50
+ "eslint": "^10.6.0",
51
51
  "fs": "^0.0.1-security",
52
52
  "globals": "^17.7.0",
53
- "jest": "^29.7.0",
54
- "jest-cli": "^29.7.0",
53
+ "happy-dom": "^20.10.6",
55
54
  "kompendium": "npm:@limetech/kompendium@^1.3.0",
56
55
  "lodash-es": "^4.18.1",
57
- "prettier": "^3.8.4",
58
- "puppeteer": "^25.2.1",
56
+ "prettier": "^3.9.4",
59
57
  "replace-in-file": "^7.2.0",
60
58
  "shelljs": "^0.10.0",
59
+ "vitest": "^4.1.9",
61
60
  "yargs": "^18.0.0"
62
61
  }
63
62
  }
@@ -1,112 +0,0 @@
1
- import { PlatformServiceName, } from "@limetech/lime-web-components";
2
- import { FileUpload, MAX_FILE_SIZE, } from "./building-blocks-uploader";
3
- const UPLOAD_COMPLETED = 100;
4
- export class UploadHandler {
5
- constructor(platform) {
6
- this.platform = platform;
7
- }
8
- /**
9
- * Handles image paste events in the text editor
10
- *
11
- * @param imageInserter - The image inserter with the file info
12
- * @returns Promise resolving to the uploaded file wrapper or undefined if upload fails
13
- */
14
- async handleImagePasted(imageInserter) {
15
- const fileInfo = imageInserter === null || imageInserter === void 0 ? void 0 : imageInserter.fileInfo;
16
- if (!fileInfo) {
17
- return;
18
- }
19
- if (!this.validateImageSize(fileInfo)) {
20
- return;
21
- }
22
- imageInserter.insertThumbnail();
23
- const uploadedFile = await this.createFileUpload(fileInfo);
24
- const fileUrl = uploadedFile === null || uploadedFile === void 0 ? void 0 : uploadedFile.href;
25
- const fileId = uploadedFile === null || uploadedFile === void 0 ? void 0 : uploadedFile.fileId;
26
- if (fileUrl && fileId !== undefined) {
27
- imageInserter.insertImage(fileUrl);
28
- }
29
- else {
30
- imageInserter.insertFailedThumbnail();
31
- }
32
- return uploadedFile;
33
- }
34
- /**
35
- * Extracts a file ID from a image source string.
36
- *
37
- * This function parses a URL to find a file ID that appears before
38
- * '/contents/' at the end of the URL.
39
- *
40
- * @param src - The URL string to parse
41
- * @returns The extracted file ID or undefined if no match is found
42
- *
43
- * @example
44
- * // Returns 123
45
- * parseFileIdFromSrc('/api/file/123/contents/');
46
- *
47
- * @example
48
- * // Returns 456
49
- * parseFileIdFromSrc('https://example.com/limepkg-email/api/v1/file/456/contents/');
50
- *
51
- * @example
52
- * // Returns undefined
53
- * parseFileIdFromSrc('/invalid/url/format/');
54
- */
55
- parseFileIdFromSrc(src) {
56
- if (src) {
57
- const regex = /\/(\d+)\/contents\/?$/;
58
- const matches = regex.exec(src);
59
- if (matches && matches[1]) {
60
- return Number(matches[1]);
61
- }
62
- }
63
- }
64
- /**
65
- * Validates that the image file size is within limits
66
- *
67
- * @param fileInfo - The file info to validate
68
- * @returns True if file size is valid, false otherwise
69
- */
70
- validateImageSize(fileInfo) {
71
- if (!fileInfo.fileContent) {
72
- return false;
73
- }
74
- return fileInfo.fileContent.size <= MAX_FILE_SIZE;
75
- }
76
- /**
77
- * Creates and uploads a file
78
- *
79
- * @param fileInfo - The file info to upload
80
- * @returns Promise resolving to the uploaded file wrapper or undefined if upload fails
81
- */
82
- async createFileUpload(fileInfo) {
83
- var _a;
84
- if (!fileInfo.fileContent) {
85
- return;
86
- }
87
- const imageFile = new FileUpload(fileInfo.fileContent, this.http);
88
- await imageFile.initialize();
89
- const imageUpload = Object.assign(Object.assign({}, fileInfo), { progress: 0, file: imageFile, state: 'added', fileId: undefined, href: undefined, id: fileInfo.id });
90
- imageFile.onProgress = (progress) => {
91
- if (imageUpload.progress === 0) {
92
- imageUpload.state = 'uploading';
93
- }
94
- imageUpload.progress = progress;
95
- if (progress === UPLOAD_COMPLETED) {
96
- imageUpload.state = 'finalizing';
97
- }
98
- };
99
- const response = await imageFile.upload();
100
- imageUpload.fileId = response.id;
101
- imageUpload.filename = response.filename;
102
- imageUpload.extension = response.extension;
103
- imageUpload.contentType = response.contentType;
104
- imageUpload.size = response.size;
105
- imageUpload.state = 'done';
106
- imageUpload.href = (_a = response._links) === null || _a === void 0 ? void 0 : _a.contents.href;
107
- return imageUpload;
108
- }
109
- get http() {
110
- return this.platform.get(PlatformServiceName.Http);
111
- }
112
- }
@@ -1 +0,0 @@
1
- import{r as t,c as o,h as i}from"./p-DwHAn7LS.js";import{L as e}from"./p-DI3GWqfD.js";import{b as n}from"./p-Bkno2RtN.js";import{g as r}from"./p-BsH0YW6Z.js";import"./p-BgAfMcRA.js";import"./p-6PYziigk.js";const s=class{constructor(i){t(this,i),this.change=o(this,"change"),this.value={},this.type="component",this.configViewType="code",this.findConfigComponent=t=>{var o,i;return"component"===this.type?null===(o=this.registry.getAll().find((o=>o.name===t)))||void 0===o?void 0:o.configComponent:"command"===this.type?null===(i=this.commandbus.getAll().find((o=>o.id===t)))||void 0===i?void 0:i.configComponent:void 0},this.handleChangeMode=t=>{t.stopPropagation(),this.configViewType=t.detail.id},this.handleCodeEditorChange=t=>{t.stopPropagation();try{const o=JSON.parse(t.detail);this.change.emit(o)}catch(t){}}}componentWillLoad(){this.configComponent=this.getComponentName()}componentShouldUpdate(t,o,i){return"formInfo"!==i}watchFormInfo(){this.configComponent=this.getComponentName()}watchconfigComponent(t,o){t&&!o&&(this.configViewType="config"),t||(this.configViewType="code")}getComponentName(){var t,o,i;const e=[...null!==(o=null===(t=this.formInfo)||void 0===t?void 0:t.schemaPath.slice(0,-1))&&void 0!==o?o:[],this.getNameField()],n=r(null===(i=this.formInfo)||void 0===i?void 0:i.rootValue,e),s=this.findConfigComponent(n);if(s&&customElements.get(s.name))return s}getSiblingPickerTags(){var t,o,i,e,n;const s=null===(t=this.formInfo)||void 0===t?void 0:t.rootSchema,l=null===(o=this.formInfo)||void 0===o?void 0:o.schemaPath;if(!s||!l)return;const d=l.slice(0,-1).flatMap((t=>["properties",t])),h=r(s,[...d,"properties"]);if(h&&"object"==typeof h)for(const t of Object.keys(h)){const o=null===(e=null===(i=h[t])||void 0===i?void 0:i.lime)||void 0===e?void 0:e.component;if("limebb-component-picker"===(null==o?void 0:o.name)&&Array.isArray(null===(n=null==o?void 0:o.props)||void 0===n?void 0:n.tags))return o.props.tags}}render(){return[this.renderHeader(),this.renderContent()]}renderHeader(){let t=[];return this.configComponent&&(t=[{id:"config",title:"Config",selected:"config"===this.configViewType},{id:"code",title:"Code",selected:"code"===this.configViewType}]),i("limel-header",{icon:"edit_property",heading:this.label,subheading:this.helperText},i("limel-button-group",{slot:"actions",value:t,onChange:this.handleChangeMode}))}renderContent(){return"config"===this.configViewType?this.renderConfigComponent():this.renderCodeEditor()}renderCodeEditor(){return i("limel-code-editor",{value:JSON.stringify(this.value,null,"\t"),language:"json",readonly:this.readonly,lineNumbers:!0,fold:!0,lint:!0,onChange:this.handleCodeEditorChange})}renderConfigComponent(){var t,o;const n=this.getSiblingPickerTags();return i(e,{class:"config-component",platform:this.platform,context:this.context,name:null===(t=this.configComponent)||void 0===t?void 0:t.name,props:Object.assign(Object.assign({},null===(o=this.configComponent)||void 0===o?void 0:o.props),{value:this.value,required:this.required,readonly:this.readonly,disabled:this.disabled,label:this.label,helperText:this.helperText,formInfo:this.formInfo,tags:n})})}getNameField(){return this.nameField?this.nameField:{component:"name",command:"id"}[this.type]}get registry(){return this.platform.get(n.WebComponentRegistry)}get commandbus(){return this.platform.get(n.CommandBus)}static get watchers(){return{formInfo:[{watchFormInfo:0}],configComponent:[{watchconfigComponent:0}]}}};s.style=":host(*){--header-background-color:rgb(var(--contrast-600));display:flex;flex-direction:column;border:1px dashed rgb(var(--contrast-700));overflow:clip;border-radius:0.75rem;background-color:rgb(var(--contrast-500))}*{box-sizing:border-box}.label{margin-top:1rem;margin-bottom:1rem}.config-component{display:grid;column-gap:1rem;row-gap:1rem;margin:1rem;grid-template-columns:repeat(3, minmax(0, 1fr))}";export{s as limebb_component_config}