@nyaruka/temba-components 0.43.1 → 0.43.3

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 (33) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/{481989ca.js → 96591394.js} +67 -41
  3. package/dist/index.js +67 -41
  4. package/dist/sw.js +1 -1
  5. package/dist/sw.js.map +1 -1
  6. package/dist/templates/components-body.html +1 -1
  7. package/dist/templates/components-head.html +1 -1
  8. package/out-tsc/src/compose/Compose.js +26 -31
  9. package/out-tsc/src/compose/Compose.js.map +1 -1
  10. package/out-tsc/src/dialog/Dialog.js +0 -2
  11. package/out-tsc/src/dialog/Dialog.js.map +1 -1
  12. package/out-tsc/src/dropdown/Dropdown.js +0 -1
  13. package/out-tsc/src/dropdown/Dropdown.js.map +1 -1
  14. package/out-tsc/src/list/ContentMenu.js +4 -4
  15. package/out-tsc/src/list/ContentMenu.js.map +1 -1
  16. package/out-tsc/src/list/TembaMenu.js +60 -27
  17. package/out-tsc/src/list/TembaMenu.js.map +1 -1
  18. package/out-tsc/test/temba-compose.test.js +0 -1
  19. package/out-tsc/test/temba-compose.test.js.map +1 -1
  20. package/package.json +1 -1
  21. package/screenshots/truth/menu/menu-focused-with items.png +0 -0
  22. package/screenshots/truth/menu/menu-refresh-1.png +0 -0
  23. package/screenshots/truth/menu/menu-refresh-2.png +0 -0
  24. package/screenshots/truth/menu/menu-root.png +0 -0
  25. package/screenshots/truth/menu/menu-submenu.png +0 -0
  26. package/screenshots/truth/menu/menu-tasks-nextup.png +0 -0
  27. package/screenshots/truth/menu/menu-tasks.png +0 -0
  28. package/src/compose/Compose.ts +29 -32
  29. package/src/dialog/Dialog.ts +0 -2
  30. package/src/dropdown/Dropdown.ts +0 -1
  31. package/src/list/ContentMenu.ts +4 -4
  32. package/src/list/TembaMenu.ts +61 -30
  33. package/test/temba-compose.test.ts +0 -1
@@ -89,17 +89,39 @@ export class TembaMenu extends RapidElement {
89
89
 
90
90
  .level-0 > .item,
91
91
  .level-0 > temba-dropdown > div[slot='toggle'] > .avatar {
92
- background: var(--color-primary-dark);
92
+ padding: 0px;
93
93
  --icon-color: rgba(255, 255, 255, 0.7);
94
94
  font-size: 1em;
95
+ flex-direction: column;
96
+ border: 0px solid green;
97
+ width: 100%;
98
+ display: flex;
99
+ align-items: center;
95
100
  }
96
101
 
97
- .level-0 > .top {
98
- padding-top: var(--menu-padding);
102
+ .level-0 > .item.selected::before,
103
+ .level-0 > .item.selected::after {
104
+ content: ' ';
105
+ height: var(--curvature);
99
106
  background: var(--color-primary-dark);
100
- display: flex;
101
- flex-direction: column;
102
- align-items: center;
107
+ display: block;
108
+ width: 100%;
109
+ }
110
+
111
+ .level-0 > .item.selected::before {
112
+ border-bottom-right-radius: var(--curvature);
113
+ }
114
+
115
+ .level-0 > .item > temba-tip {
116
+ padding: 1em;
117
+ }
118
+
119
+ .level-0 > .item.selected::after {
120
+ border-top-right-radius: var(--curvature);
121
+ }
122
+
123
+ .level-0 {
124
+ padding-top: var(--menu-padding) !important;
103
125
  }
104
126
 
105
127
  .level-0 > .empty {
@@ -113,6 +135,14 @@ export class TembaMenu extends RapidElement {
113
135
  background: var(--color-primary-dark);
114
136
  }
115
137
 
138
+ .level-0 > temba-dropdown.open > div[slot='toggle'] > .avatar {
139
+ background: transparent !important;
140
+ }
141
+
142
+ .level-0 {
143
+ background: var(--color-primary-dark);
144
+ }
145
+
116
146
  temba-dropdown {
117
147
  z-index: 1;
118
148
  }
@@ -139,7 +169,7 @@ export class TembaMenu extends RapidElement {
139
169
  }
140
170
 
141
171
  .level-0 > .item.selected {
142
- background: inherit;
172
+ background: white;
143
173
  --icon-color: var(--color-primary-dark);
144
174
  }
145
175
 
@@ -149,7 +179,12 @@ export class TembaMenu extends RapidElement {
149
179
 
150
180
  .level-0 {
151
181
  padding: 0px;
152
- z-index: 500;
182
+ }
183
+
184
+ .top {
185
+ display: flex;
186
+ align-items: center;
187
+ flex-direction: column;
153
188
  }
154
189
 
155
190
  .item {
@@ -173,7 +208,6 @@ export class TembaMenu extends RapidElement {
173
208
  }
174
209
 
175
210
  .level-0 > .item {
176
- padding: 1em 1em;
177
211
  margin-top: 0em;
178
212
  border-radius: 0px;
179
213
  min-width: inherit;
@@ -214,12 +248,12 @@ export class TembaMenu extends RapidElement {
214
248
  }
215
249
 
216
250
  .level-0 > .item:hover {
217
- background: rgba(var(--primary-rgb), 0.85);
251
+ background: rgba(255, 255, 255, 0.15);
218
252
  --icon-color: #fff;
219
253
  }
220
254
 
221
255
  .level-0 > .item.selected:hover {
222
- background: inherit;
256
+ background: white;
223
257
  --icon-color: var(--color-primary-dark);
224
258
  cursor: default;
225
259
  }
@@ -237,13 +271,11 @@ export class TembaMenu extends RapidElement {
237
271
  .level-1 {
238
272
  transition: opacity 100ms linear, margin 200ms linear;
239
273
  overflow-y: scroll;
240
- z-index: 150;
241
274
  }
242
275
 
243
276
  .level-2 {
244
277
  background: #fbfbfb;
245
278
  overflow-y: auto;
246
- z-index: 1000;
247
279
  }
248
280
 
249
281
  .level-2 .item .details {
@@ -493,9 +525,7 @@ export class TembaMenu extends RapidElement {
493
525
  if (menuItem.avatar) {
494
526
  icon = renderAvatar({ name: menuItem.avatar });
495
527
  }
496
- const item = html ` <div
497
- class="item-top ${isSelected ? 'selected' : null} "
498
- ></div>
528
+ const item = html `
499
529
  <div
500
530
  id="menu-${menuItem.id}"
501
531
  class="${itemClasses}"
@@ -550,8 +580,7 @@ export class TembaMenu extends RapidElement {
550
580
  </div>
551
581
  <div class="right"></div>
552
582
  </div>
553
-
554
- <div class="item-bottom ${isSelected ? 'selected' : null}"></div>`;
583
+ `;
555
584
  if (menuItem.popup) {
556
585
  return html `
557
586
  <temba-dropdown offsetx="10" arrowoffset="8" mask>
@@ -630,7 +659,7 @@ export class TembaMenu extends RapidElement {
630
659
  this.loadItems(item);
631
660
  }
632
661
  // eslint-disable-next-line @typescript-eslint/no-empty-function
633
- loadItems(item, selectFirst = false) {
662
+ loadItems(item, event = null) {
634
663
  if (item && item.endpoint) {
635
664
  item.loading = true;
636
665
  this.httpComplete = fetchResults(item.endpoint).then((items) => {
@@ -656,15 +685,15 @@ export class TembaMenu extends RapidElement {
656
685
  item.loading = false;
657
686
  if (this.submenu && this.selection.length == 0) {
658
687
  const sub = this.getMenuItemForSelection([this.submenu]);
659
- this.handleItemClicked(null, sub);
688
+ this.handleItemClicked(event, sub);
660
689
  }
661
690
  if (!this.wait) {
662
691
  this.fireCustomEvent(CustomEventType.Ready);
663
692
  this.wait = true;
664
693
  }
665
694
  // once we've set our items check if we need to auto-select
666
- if (selectFirst && item.items.length > 0) {
667
- this.handleItemClicked(null, item.items[0]);
695
+ if (event && item.items.length > 0) {
696
+ this.handleItemClicked(event, item.items[0]);
668
697
  }
669
698
  this.requestUpdate('root');
670
699
  this.scrollSelectedIntoView();
@@ -692,16 +721,20 @@ export class TembaMenu extends RapidElement {
692
721
  }
693
722
  return;
694
723
  }
724
+ if (event) {
725
+ event.preventDefault();
726
+ event.stopPropagation();
727
+ if (event.metaKey && menuItem.href) {
728
+ window.open(menuItem.href, '_blank');
729
+ return;
730
+ }
731
+ }
695
732
  if (parent && parent.inline) {
696
733
  this.handleItemClicked(null, parent);
697
734
  }
698
735
  if (this.collapsed) {
699
736
  this.collapsed = false;
700
737
  }
701
- if (event) {
702
- event.preventDefault();
703
- event.stopPropagation();
704
- }
705
738
  if (menuItem.trigger) {
706
739
  this.fireCustomEvent(CustomEventType.ButtonClicked, {
707
740
  item: menuItem,
@@ -718,7 +751,7 @@ export class TembaMenu extends RapidElement {
718
751
  this.selection.splice(menuItem.level, this.selection.length - menuItem.level, menuItem.vanity_id || menuItem.id);
719
752
  }
720
753
  if (menuItem.endpoint) {
721
- this.loadItems(menuItem, !!event);
754
+ this.loadItems(menuItem, event);
722
755
  // make sure change events fire for events with hrefs
723
756
  if (!menuItem.href) {
724
757
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"TembaMenu.js","sourceRoot":"","sources":["../../../src/list/TembaMenu.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { CustomEventType } from '../interfaces';\nimport { RapidElement } from '../RapidElement';\nimport { debounce, fetchResults, getClasses, renderAvatar } from '../utils';\nimport { Icon } from '../vectoricon';\n\nexport interface MenuItem {\n id?: string;\n vanity_id?: string;\n name?: string;\n verbose_name?: string;\n count?: number;\n icon?: string;\n collapsed_icon?: string;\n endpoint?: string;\n loading?: boolean;\n bottom?: boolean;\n level?: number;\n href?: string;\n show_header?: boolean;\n items?: MenuItem[];\n inline?: boolean;\n type?: string;\n on_submit?: string;\n bubble?: string;\n popup?: boolean;\n avatar?: string;\n trigger?: boolean;\n}\n\ninterface MenuItemState {\n collapsed?: string;\n}\n\nconst findItem = (\n items: MenuItem[],\n id: string\n): { item: MenuItem; index: number } => {\n const search = items || [];\n\n const index = search.findIndex((item: MenuItem) => {\n return item.id == id || item.vanity_id == id;\n });\n\n if (index > -1) {\n const item = search[index];\n return { item, index };\n }\n\n return { item: null, index: -1 };\n};\n\nexport class TembaMenu extends RapidElement {\n static get styles() {\n return css`\n :host {\n width: 100%;\n display: block;\n --color-widget-bg-focused: transparent;\n --options-block-shadow: none;\n }\n\n .bubble {\n width: 8px;\n height: 8px;\n left: 14px;\n bottom: -1px;\n border-radius: 99px;\n border: 1px solid rgb(255, 255, 255);\n position: relative;\n margin-top: -10px;\n }\n\n .section {\n font-size: 1.5em;\n margin-bottom: 0.2em;\n color: var(--color-text-dark);\n }\n\n .collapse-toggle {\n width: 0.5em;\n cursor: pointer;\n display: block;\n margin-right: 5px;\n margin-top: 3px;\n margin-bottom: 3px;\n }\n\n .collapse-toggle:hover {\n background: rgb(100, 100, 100, 0.05);\n }\n\n .item {\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n display: flex;\n font-size: 1em;\n --icon-color: var(--color-text-dark);\n }\n\n .item.selected,\n .item.pressed {\n background: var(--color-selection);\n color: var(--color-primary-dark);\n --icon-color: var(--color-primary-dark);\n }\n\n .root {\n display: flex;\n flex-direction: row;\n height: 100%;\n }\n\n .level {\n display: flex;\n flex-direction: column;\n }\n\n .level.hidden {\n display: none;\n }\n\n .level-0 > .item,\n .level-0 > temba-dropdown > div[slot='toggle'] > .avatar {\n background: var(--color-primary-dark);\n --icon-color: rgba(255, 255, 255, 0.7);\n font-size: 1em;\n }\n\n .level-0 > .top {\n padding-top: var(--menu-padding);\n background: var(--color-primary-dark);\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .level-0 > .empty {\n background: var(--color-primary-dark);\n align-self: stretch;\n flex-grow: 1;\n }\n\n .level-0 > .bottom {\n height: 1em;\n background: var(--color-primary-dark);\n }\n\n temba-dropdown {\n z-index: 1;\n }\n\n temba-dropdown > div[slot='dropdown'] .avatar > .details {\n margin-left: 0.75em;\n }\n\n .level-0 > .item > .details,\n .level-0 > temba-dropdown > div[slot='toggle'] > .avatar > .details {\n display: none !important;\n }\n\n .avatar {\n align-items: center;\n }\n\n temba-dropdown > div[slot='dropdown'] .avatar .avatar-circle {\n font-size: 0.7em;\n }\n\n .level-0.expanded {\n background: inherit;\n }\n\n .level-0 > .item.selected {\n background: inherit;\n --icon-color: var(--color-primary-dark);\n }\n\n .level {\n padding: var(--menu-padding);\n }\n\n .level-0 {\n padding: 0px;\n z-index: 500;\n }\n\n .item {\n padding: 0.2em 0.75em;\n margin-top: 0.1em;\n border-radius: var(--curvature);\n display: flex;\n min-width: 12em;\n }\n\n .item > temba-icon {\n margin-right: 0.5em;\n }\n\n .item > .details > .name {\n flex-grow: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 0;\n }\n\n .level-0 > .item {\n padding: 1em 1em;\n margin-top: 0em;\n border-radius: 0px;\n min-width: inherit;\n max-width: inherit;\n }\n\n .level-0 > .item > temba-icon {\n margin-right: 0px;\n }\n\n .level-0 > .item > .name {\n min-width: 0px;\n }\n\n .count {\n align-self: center;\n margin-left: 1em;\n font-size: 0.8em;\n font-weight: 400;\n }\n\n .level-0 > .item-top {\n background: var(--color-primary-dark);\n min-height: var(--curvature);\n }\n\n .level-0 > .item-bottom {\n background: var(--color-primary-dark);\n min-height: var(--curvature);\n }\n\n .level-0 > .item-bottom.selected {\n border-top-right-radius: var(--curvature);\n }\n\n .level-0 > .item-top.selected {\n border-bottom-right-radius: var(--curvature);\n }\n\n .level-0 > .item:hover {\n background: rgba(var(--primary-rgb), 0.85);\n --icon-color: #fff;\n }\n\n .level-0 > .item.selected:hover {\n background: inherit;\n --icon-color: var(--color-primary-dark);\n cursor: default;\n }\n\n .item.inline {\n border: 0px solid transparent;\n }\n\n .level-1,\n .level-2 {\n border-right: 1px solid rgba(0 0 0 / 8%);\n box-shadow: rgb(0 0 0 / 6%) 4px 0px 6px 1px;\n }\n\n .level-1 {\n transition: opacity 100ms linear, margin 200ms linear;\n overflow-y: scroll;\n z-index: 150;\n }\n\n .level-2 {\n background: #fbfbfb;\n overflow-y: auto;\n z-index: 1000;\n }\n\n .level-2 .item .details {\n overflow: hidden;\n }\n\n .level-2 .item {\n min-width: 12em;\n max-width: 12em;\n }\n\n .level-1 .item {\n overflow: hidden;\n max-width: 12em;\n min-width: 12em;\n min-height: 1.5em;\n max-height: 1.5em;\n transition: min-width var(--transition-speed) !important;\n }\n\n .collapsed .item {\n overflow: hidden;\n min-width: 0;\n margin: 0;\n }\n\n .item .details {\n opacity: 1;\n min-height: 1.5em;\n max-height: 1.5em;\n align-items: center;\n }\n\n .collapsed .item {\n margin-bottom: 0.5em;\n }\n\n .collapsed .item .details {\n overflow: hidden;\n max-height: 0em;\n max-width: 0em;\n }\n\n .collapsed .item .details {\n max-height: 0em;\n }\n\n .collapsed .item temba-icon {\n margin-right: 0;\n }\n\n .section {\n max-width: 12em;\n }\n\n .collapsed .section {\n opacity: 0;\n max-width: 0em;\n max-height: 0.6em;\n }\n\n .collapsed.level-1 {\n overflow: hidden;\n padding: 0.5em;\n --icon-color: #999;\n }\n\n .collapsed .item .right {\n flex-grow: 1;\n }\n\n .collapse-icon {\n display: none;\n }\n\n .collapsed .collapse-icon {\n --icon-color: #ccc;\n display: block;\n }\n\n .collapsed .item.iconless {\n max-height: 0em;\n padding: 0em;\n min-height: 0em;\n margin-bottom: 0em;\n }\n\n .divider {\n height: 1px;\n background: #f3f3f3;\n margin: 0.5em 0.75em;\n min-height: 1px;\n }\n\n .space {\n margin: 0.5em;\n }\n\n .collapsed .divider {\n height: 0;\n margin: 0;\n padding: 0;\n min-height: 0px;\n }\n\n .sub-section {\n font-size: 1rem;\n color: #888;\n margin-top: 1rem;\n margin-left: 0.3rem;\n }\n\n .fully-collapsed .level-1 {\n margin-left: -208px;\n pointer-events: none;\n border: none;\n overflow: hidden;\n }\n\n .fully-collapsed .level-1 > * {\n opacity: 0;\n }\n\n .fully-collapsed .level-1 .item,\n .fully-collapsed .level-1 .divider {\n opacity: 0;\n }\n\n .fully-collapsed .level-2,\n .fully-collapsed .level-3 {\n display: none;\n }\n\n temba-button {\n margin-top: 0.2em;\n margin-bottom: 0.2em;\n margin-left: 0.75em;\n margin-right: 0.75em;\n }\n\n .expand-icon {\n transform: rotate(180deg);\n --icon-color: rgba(255, 255, 255, 0.5);\n cursor: pointer;\n max-height: 0px;\n overflow: hidden;\n opacity: 0;\n transition: all 400ms ease-in-out 400ms;\n }\n\n .expand-icon:hover {\n --icon-color: #fff;\n }\n\n .fully-collapsed .expand-icon {\n padding-top: 0.5em;\n max-height: 2em;\n opacity: 1;\n }\n\n .section-header {\n display: flex;\n align-items: center;\n }\n\n .section-header .section {\n flex-grow: 1;\n }\n\n .section-header temba-icon {\n --icon-color: #ddd;\n cursor: pointer;\n padding-bottom: 0.5em;\n padding-right: 0.5em;\n }\n\n .section-header temba-icon:hover {\n --icon-color: var(--color-link-primary);\n }\n\n slot[name='header'] {\n display: none;\n }\n\n slot[name='header'].show-header {\n display: block;\n }\n `;\n }\n\n @property({ type: Boolean })\n wraps = false;\n\n @property({ type: Boolean })\n wait: boolean;\n\n @property({ type: String })\n endpoint: string;\n\n @property({ type: String })\n expanding: string;\n\n @property({ type: String })\n value: string;\n\n // submenu to constrain to\n @property({ type: String })\n submenu: string;\n\n @property({ type: Boolean })\n collapsed: boolean;\n\n @property({ type: Object })\n pressedItem: MenuItem;\n\n // http promise to monitor for completeness\n public httpComplete: Promise<void>;\n\n root: MenuItem;\n selection: string[] = [];\n state: { [id: string]: MenuItemState } = {};\n\n constructor() {\n super();\n this.doRefresh = this.doRefresh.bind(this);\n }\n\n public setBubble(id: string, color: string) {\n const found = findItem(this.root.items, id);\n if (found && found.item) {\n found.item.bubble = color;\n this.requestUpdate('root');\n return true;\n }\n return false;\n }\n\n private getMenuItemState(id: string): MenuItemState {\n let itemState = {};\n if (id) {\n itemState = this.state[id];\n if (!itemState) {\n itemState = {};\n this.state[id] = itemState;\n }\n }\n return itemState;\n }\n\n public updated(changes: Map<string, any>) {\n if (changes.has('endpoint')) {\n this.root = {\n level: -1,\n endpoint: this.endpoint,\n };\n\n if (!this.wait) {\n this.loadItems(this.root);\n } else {\n this.fireCustomEvent(CustomEventType.Ready);\n }\n }\n\n if (changes.has('root')) {\n if (this.value) {\n this.setFocusedItem(this.value);\n this.value = null;\n }\n }\n }\n\n public reset() {\n this.loadItems(this.root);\n }\n\n public async doRefresh() {\n const path = [...this.selection];\n let item = this.root;\n\n while (path.length > 0) {\n this.loadItems(item);\n // we need to wait until the load is complete before doing the replace\n await this.httpComplete;\n const id = path.shift();\n item = (item.items || []).find(_item => _item.id == id);\n }\n\n this.loadItems(item);\n }\n\n public refresh = debounce(this.doRefresh, 200);\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private loadItems(item: MenuItem, selectFirst = false) {\n if (item && item.endpoint) {\n item.loading = true;\n this.httpComplete = fetchResults(item.endpoint).then(\n (items: MenuItem[]) => {\n items.forEach(newItem => {\n if (!newItem.items) {\n const prevItem = (item.items || []).find(\n prev => prev.id == newItem.id\n );\n if (prevItem && prevItem.items) {\n newItem.items = prevItem.items;\n }\n }\n });\n\n // update our item level\n items.forEach(subItem => {\n subItem.level = item.level + 1;\n // if we came with preset items, set the level for them accordingly\n if (subItem.items) {\n subItem.items.forEach(inlineItem => {\n inlineItem.level = item.level + 2;\n });\n }\n });\n\n item.items = items;\n item.loading = false;\n\n if (this.submenu && this.selection.length == 0) {\n const sub = this.getMenuItemForSelection([this.submenu]);\n this.handleItemClicked(null, sub);\n }\n\n if (!this.wait) {\n this.fireCustomEvent(CustomEventType.Ready);\n this.wait = true;\n }\n\n // once we've set our items check if we need to auto-select\n if (selectFirst && item.items.length > 0) {\n this.handleItemClicked(null, item.items[0]);\n }\n\n this.requestUpdate('root');\n this.scrollSelectedIntoView();\n }\n );\n }\n }\n\n private handleItemClicked(\n event: MouseEvent,\n menuItem: MenuItem,\n parent: MenuItem = null\n ) {\n if (parent && parent.popup) {\n if (event) {\n this.fireCustomEvent(CustomEventType.ButtonClicked, {\n item: menuItem,\n selection: this.getSelection(),\n parent,\n });\n }\n\n return;\n }\n\n if (menuItem.popup) {\n if (event) {\n this.fireCustomEvent(CustomEventType.ButtonClicked, {\n item: menuItem,\n selection: this.getSelection(),\n parent,\n });\n }\n\n return;\n }\n\n if (parent && parent.inline) {\n this.handleItemClicked(null, parent);\n }\n\n if (this.collapsed) {\n this.collapsed = false;\n }\n\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (menuItem.trigger) {\n this.fireCustomEvent(CustomEventType.ButtonClicked, {\n item: menuItem,\n selection: this.getSelection(),\n parent,\n });\n return;\n }\n\n // update our selection\n if (menuItem.level >= this.selection.length) {\n this.selection.push(menuItem.vanity_id || menuItem.id);\n } else {\n this.selection.splice(\n menuItem.level,\n this.selection.length - menuItem.level,\n menuItem.vanity_id || menuItem.id\n );\n }\n\n if (menuItem.endpoint) {\n this.loadItems(menuItem, !!event);\n\n // make sure change events fire for events with hrefs\n if (!menuItem.href) {\n return;\n }\n } else {\n this.requestUpdate();\n }\n\n if (menuItem.href) {\n this.dispatchEvent(new Event('change'));\n }\n\n this.fireCustomEvent(CustomEventType.ButtonClicked, {\n item: menuItem,\n selection: this.getSelection(),\n parent,\n });\n }\n\n public scrollSelectedIntoView() {\n // makes sure we are scrolled into view\n window.setTimeout(() => {\n const eles = this.shadowRoot.querySelectorAll('.selected');\n eles.forEach(ele => {\n ele.scrollIntoView({ block: 'end', behavior: 'smooth' });\n });\n }, 0);\n }\n\n public clickItem(id: string): boolean {\n const path = [...this.selection];\n path.splice(path.length - 1, 1, id);\n const item = this.getMenuItemForSelection(path);\n\n if (item) {\n this.handleItemClicked(null, item);\n this.scrollSelectedIntoView();\n return true;\n }\n return false;\n }\n\n public getMenuItem(): MenuItem {\n return this.getMenuItemForSelection([...this.selection]);\n }\n\n public getMenuItemForSelection(selection: string[]) {\n const path = [...selection];\n let items = this.root.items;\n let item = null;\n while (path.length > 0) {\n const step = path.splice(0, 1)[0];\n if (items) {\n item = findItem(items, step).item;\n if (item) {\n items = item.items;\n } else {\n break;\n }\n } else {\n break;\n }\n }\n\n return item;\n }\n\n public getSelection() {\n return this.selection;\n }\n\n public handleExpand() {\n this.collapsed = false;\n }\n\n public handleCollapse() {\n this.collapsed = true;\n }\n\n public async setFocusedItem(path: string) {\n const focusedPath = path.split('/').filter(step => !!step);\n if (!this.root) {\n return;\n }\n\n // if we don't match at the first level, we are a noop\n if (focusedPath.length > 0) {\n const rootItem = findItem(this.root.items, focusedPath[0]).item;\n if (!rootItem) {\n return;\n }\n }\n\n const newPath = [];\n let level = this.root;\n while (focusedPath.length > 0) {\n const nextId = focusedPath.shift();\n if (nextId) {\n if (!level.items) {\n this.loadItems(level);\n await this.httpComplete;\n }\n\n level = findItem(level.items, nextId).item;\n if (!level) {\n focusedPath.splice(0, focusedPath.length);\n } else {\n newPath.push(nextId);\n }\n }\n }\n\n this.selection = newPath;\n this.refresh();\n this.requestUpdate('root');\n }\n\n private isSelected(menuItem: MenuItem) {\n if (menuItem.level < this.selection.length) {\n const selected =\n this.selection[menuItem.level] == (menuItem.vanity_id || menuItem.id);\n return selected;\n }\n return false;\n }\n\n private isExpanded(menuItem: MenuItem) {\n const expanded = !!this.selection.find(\n id => id === menuItem.vanity_id || menuItem.id\n );\n return expanded;\n }\n\n private renderMenuItem = (\n menuItem: MenuItem,\n parent: MenuItem = null\n ): TemplateResult => {\n if (menuItem.type === 'divider') {\n return html`<div class=\"divider\"></div>`;\n }\n\n if (menuItem.type === 'space') {\n return html`<div class=\"space\"></div>`;\n }\n\n if (menuItem.type === 'section' || menuItem.inline) {\n return html`<div class=\"sub-section\">${menuItem.name}</div>`;\n }\n\n if (menuItem.type === 'modax-button') {\n return html`<temba-button\n name=${menuItem.name}\n @click=${event => {\n this.handleItemClicked(event, menuItem);\n }}\n />`;\n }\n\n const isSelected = this.isSelected(menuItem);\n const isChildSelected =\n isSelected && this.selection.length > menuItem.level + 1;\n\n let icon = menuItem.icon\n ? html`<temba-icon\n size=\"${menuItem.level === 0 ? '1.5' : '1'}\"\n name=\"${menuItem.icon}\"\n ></temba-icon\n >${menuItem.bubble\n ? html`<div\n style=\"background-color: ${menuItem.bubble}\"\n class=\"bubble\"\n ></div>`\n : null}`\n : null;\n\n const collapsedIcon = menuItem.collapsed_icon\n ? html`<temba-icon\n size=\"${menuItem.level === 0 ? '1.5' : '1'}\"\n name=\"${menuItem.collapsed_icon}\"\n class=\"collapse-icon\"\n ></temba-icon>`\n : null;\n\n const itemClasses = getClasses({\n ['menu-' + menuItem.id]: true,\n 'child-selected': isChildSelected,\n selected: isSelected,\n item: !(menuItem.avatar && menuItem.level === 0),\n avatar: !!menuItem.avatar,\n inline: menuItem.inline,\n expanding: this.expanding && this.expanding === menuItem.id,\n expanded: this.isExpanded(menuItem),\n iconless: !icon && !collapsedIcon && !menuItem.avatar,\n pressed: this.pressedItem && this.pressedItem.id == menuItem.id,\n });\n\n if (menuItem.avatar) {\n icon = renderAvatar({ name: menuItem.avatar });\n }\n\n const item = html` <div\n class=\"item-top ${isSelected ? 'selected' : null} \"\n ></div>\n <div\n id=\"menu-${menuItem.id}\"\n class=\"${itemClasses}\"\n @click=${event => {\n this.pressedItem = null;\n this.handleItemClicked(event, menuItem, parent);\n }}\n @mousedown=${() => {\n if (menuItem.level > 0) {\n this.pressedItem = menuItem;\n }\n }}\n @mouseleave=${() => {\n this.pressedItem = null;\n }}\n >\n ${menuItem.level === 0\n ? menuItem.avatar\n ? icon\n : html`<temba-tip\n style=\"display:flex;\"\n text=\"${menuItem.name}\"\n position=\"right\"\n >${icon}</temba-tip\n >`\n : html`${icon}${collapsedIcon}`}\n\n <div class=\"details\" style=\"flex-grow:1;display:flex\">\n <div\n class=\"name\"\n style=\"flex-grow:1; flex-shrink:0; white-space: ${this.wraps\n ? 'normal'\n : 'nowrap'};\"\n >\n ${menuItem.name}\n </div>\n ${menuItem.level > 0\n ? menuItem.inline\n ? html`<temba-icon\n name=\"${isSelected || isChildSelected\n ? Icon.arrow_up\n : Icon.arrow_down}\"\n ></temba-icon>`\n : html`${menuItem.count || menuItem.count == 0\n ? html`\n <div class=\"count\">\n ${menuItem.count.toLocaleString()}\n </div>\n `\n : html`<div class=\"count\"></div>`}`\n : null}\n </div>\n <div class=\"right\"></div>\n </div>\n\n <div class=\"item-bottom ${isSelected ? 'selected' : null}\"></div>`;\n\n if (menuItem.popup) {\n return html`\n <temba-dropdown offsetx=\"10\" arrowoffset=\"8\" mask>\n <div slot=\"toggle\">${item}</div>\n <div\n slot=\"dropdown\"\n style=\"width:300px;overflow:hidden;padding-bottom:0.5em\"\n >\n <div style=\"max-height:400px;overflow-y:auto\">\n ${(menuItem.items || []).map((child: MenuItem) => {\n child.level = menuItem.level + 1;\n return this.renderMenuItem(child, menuItem);\n })}\n </div>\n </div>\n </temba-dropdown>\n `;\n }\n return item;\n };\n\n public render(): TemplateResult {\n if (!this.root || !this.root.items) {\n return html`<temba-loading\n units=\"3\"\n size=\"10\"\n direction=\"column\"\n style=\"margin:1em;margin-right:0em\"\n />`;\n }\n\n let items = this.root.items || [];\n const levels = [];\n\n levels.push(\n html`<div class=\"level level-0 ${this.submenu ? 'hidden' : ''}\">\n <div class=\"top\">\n <div class=\"expand-icon\" @click=${this.handleExpand}>\n <temba-icon\n name=\"${Icon.menu_collapse}\"\n class=\"collapse\"\n class=\"expand\"\n size=\"1.4\"\n ></temba-icon>\n </div>\n </div>\n\n ${items\n .filter(item => !item.bottom)\n .map((item: MenuItem) => {\n return this.renderMenuItem(item);\n })}\n\n <div class=\"empty\"></div>\n ${items\n .filter(item => !!item.bottom)\n .map((item: MenuItem) => {\n return this.renderMenuItem(item);\n })}\n <div class=\"bottom\"></div>\n </div>`\n );\n\n this.selection.forEach((id, index) => {\n const selected = findItem(items, id).item;\n\n let collapsed = false;\n if (selected) {\n items = selected.items;\n const itemState = this.getMenuItemState(selected.id);\n // users set an explicit collapse state\n if (itemState.collapsed) {\n collapsed = itemState.collapsed === 'collapsed';\n }\n // otherwise pick a default collapse state\n else {\n if (this.selection.length > selected.level + 2) {\n collapsed = false;\n }\n }\n } else {\n items = null;\n }\n\n if (items && items.length > 0 && !selected.inline) {\n levels.push(\n html`<div\n class=\"${getClasses({\n level: true,\n ['level-' + (index + 1)]: true,\n collapsed,\n })}\"\n >\n ${!this.submenu\n ? html`\n <slot\n class=\"${getClasses({\n 'show-header': selected.show_header,\n })}\"\n name=\"header\"\n ></slot>\n <div class=\"section-header\">\n <div class=\"section\">${selected.name}</div>\n\n ${index == 0 && !this.collapsed\n ? html`<temba-icon\n name=\"${Icon.menu_collapse}\"\n size=\"1.1\"\n @click=${this.handleCollapse}\n ></temba-icon>`\n : null}\n </div>\n `\n : null}\n ${items.map((item: MenuItem) => {\n if (item.inline && item.items) {\n return html`${this.renderMenuItem(item)}\n <div class=\"inline-children\">\n ${(item.items || []).map((child: MenuItem) => {\n return this.renderMenuItem(child, item);\n })}\n </div>`;\n }\n return this.renderMenuItem(item);\n })}\n </div>`\n );\n }\n });\n\n const menu = html`<div\n class=\"${getClasses({\n root: true,\n 'fully-collapsed': this.collapsed,\n })}\"\n >\n ${levels}\n </div>`;\n return html`${menu}`;\n }\n}\n"]}
1
+ {"version":3,"file":"TembaMenu.js","sourceRoot":"","sources":["../../../src/list/TembaMenu.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { CustomEventType } from '../interfaces';\nimport { RapidElement } from '../RapidElement';\nimport { debounce, fetchResults, getClasses, renderAvatar } from '../utils';\nimport { Icon } from '../vectoricon';\n\nexport interface MenuItem {\n id?: string;\n vanity_id?: string;\n name?: string;\n verbose_name?: string;\n count?: number;\n icon?: string;\n collapsed_icon?: string;\n endpoint?: string;\n loading?: boolean;\n bottom?: boolean;\n level?: number;\n href?: string;\n show_header?: boolean;\n items?: MenuItem[];\n inline?: boolean;\n type?: string;\n on_submit?: string;\n bubble?: string;\n popup?: boolean;\n avatar?: string;\n trigger?: boolean;\n}\n\ninterface MenuItemState {\n collapsed?: string;\n}\n\nconst findItem = (\n items: MenuItem[],\n id: string\n): { item: MenuItem; index: number } => {\n const search = items || [];\n\n const index = search.findIndex((item: MenuItem) => {\n return item.id == id || item.vanity_id == id;\n });\n\n if (index > -1) {\n const item = search[index];\n return { item, index };\n }\n\n return { item: null, index: -1 };\n};\n\nexport class TembaMenu extends RapidElement {\n static get styles() {\n return css`\n :host {\n width: 100%;\n display: block;\n --color-widget-bg-focused: transparent;\n --options-block-shadow: none;\n }\n\n .bubble {\n width: 8px;\n height: 8px;\n left: 14px;\n bottom: -1px;\n border-radius: 99px;\n border: 1px solid rgb(255, 255, 255);\n position: relative;\n margin-top: -10px;\n }\n\n .section {\n font-size: 1.5em;\n margin-bottom: 0.2em;\n color: var(--color-text-dark);\n }\n\n .collapse-toggle {\n width: 0.5em;\n cursor: pointer;\n display: block;\n margin-right: 5px;\n margin-top: 3px;\n margin-bottom: 3px;\n }\n\n .collapse-toggle:hover {\n background: rgb(100, 100, 100, 0.05);\n }\n\n .item {\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n display: flex;\n font-size: 1em;\n --icon-color: var(--color-text-dark);\n }\n\n .item.selected,\n .item.pressed {\n background: var(--color-selection);\n color: var(--color-primary-dark);\n --icon-color: var(--color-primary-dark);\n }\n\n .root {\n display: flex;\n flex-direction: row;\n height: 100%;\n }\n\n .level {\n display: flex;\n flex-direction: column;\n }\n\n .level.hidden {\n display: none;\n }\n\n .level-0 > .item,\n .level-0 > temba-dropdown > div[slot='toggle'] > .avatar {\n padding: 0px;\n --icon-color: rgba(255, 255, 255, 0.7);\n font-size: 1em;\n flex-direction: column;\n border: 0px solid green;\n width: 100%;\n display: flex;\n align-items: center;\n }\n\n .level-0 > .item.selected::before,\n .level-0 > .item.selected::after {\n content: ' ';\n height: var(--curvature);\n background: var(--color-primary-dark);\n display: block;\n width: 100%;\n }\n\n .level-0 > .item.selected::before {\n border-bottom-right-radius: var(--curvature);\n }\n\n .level-0 > .item > temba-tip {\n padding: 1em;\n }\n\n .level-0 > .item.selected::after {\n border-top-right-radius: var(--curvature);\n }\n\n .level-0 {\n padding-top: var(--menu-padding) !important;\n }\n\n .level-0 > .empty {\n background: var(--color-primary-dark);\n align-self: stretch;\n flex-grow: 1;\n }\n\n .level-0 > .bottom {\n height: 1em;\n background: var(--color-primary-dark);\n }\n\n .level-0 > temba-dropdown.open > div[slot='toggle'] > .avatar {\n background: transparent !important;\n }\n\n .level-0 {\n background: var(--color-primary-dark);\n }\n\n temba-dropdown {\n z-index: 1;\n }\n\n temba-dropdown > div[slot='dropdown'] .avatar > .details {\n margin-left: 0.75em;\n }\n\n .level-0 > .item > .details,\n .level-0 > temba-dropdown > div[slot='toggle'] > .avatar > .details {\n display: none !important;\n }\n\n .avatar {\n align-items: center;\n }\n\n temba-dropdown > div[slot='dropdown'] .avatar .avatar-circle {\n font-size: 0.7em;\n }\n\n .level-0.expanded {\n background: inherit;\n }\n\n .level-0 > .item.selected {\n background: white;\n --icon-color: var(--color-primary-dark);\n }\n\n .level {\n padding: var(--menu-padding);\n }\n\n .level-0 {\n padding: 0px;\n }\n\n .top {\n display: flex;\n align-items: center;\n flex-direction: column;\n }\n\n .item {\n padding: 0.2em 0.75em;\n margin-top: 0.1em;\n border-radius: var(--curvature);\n display: flex;\n min-width: 12em;\n }\n\n .item > temba-icon {\n margin-right: 0.5em;\n }\n\n .item > .details > .name {\n flex-grow: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 0;\n }\n\n .level-0 > .item {\n margin-top: 0em;\n border-radius: 0px;\n min-width: inherit;\n max-width: inherit;\n }\n\n .level-0 > .item > temba-icon {\n margin-right: 0px;\n }\n\n .level-0 > .item > .name {\n min-width: 0px;\n }\n\n .count {\n align-self: center;\n margin-left: 1em;\n font-size: 0.8em;\n font-weight: 400;\n }\n\n .level-0 > .item-top {\n background: var(--color-primary-dark);\n min-height: var(--curvature);\n }\n\n .level-0 > .item-bottom {\n background: var(--color-primary-dark);\n min-height: var(--curvature);\n }\n\n .level-0 > .item-bottom.selected {\n border-top-right-radius: var(--curvature);\n }\n\n .level-0 > .item-top.selected {\n border-bottom-right-radius: var(--curvature);\n }\n\n .level-0 > .item:hover {\n background: rgba(255, 255, 255, 0.15);\n --icon-color: #fff;\n }\n\n .level-0 > .item.selected:hover {\n background: white;\n --icon-color: var(--color-primary-dark);\n cursor: default;\n }\n\n .item.inline {\n border: 0px solid transparent;\n }\n\n .level-1,\n .level-2 {\n border-right: 1px solid rgba(0 0 0 / 8%);\n box-shadow: rgb(0 0 0 / 6%) 4px 0px 6px 1px;\n }\n\n .level-1 {\n transition: opacity 100ms linear, margin 200ms linear;\n overflow-y: scroll;\n }\n\n .level-2 {\n background: #fbfbfb;\n overflow-y: auto;\n }\n\n .level-2 .item .details {\n overflow: hidden;\n }\n\n .level-2 .item {\n min-width: 12em;\n max-width: 12em;\n }\n\n .level-1 .item {\n overflow: hidden;\n max-width: 12em;\n min-width: 12em;\n min-height: 1.5em;\n max-height: 1.5em;\n transition: min-width var(--transition-speed) !important;\n }\n\n .collapsed .item {\n overflow: hidden;\n min-width: 0;\n margin: 0;\n }\n\n .item .details {\n opacity: 1;\n min-height: 1.5em;\n max-height: 1.5em;\n align-items: center;\n }\n\n .collapsed .item {\n margin-bottom: 0.5em;\n }\n\n .collapsed .item .details {\n overflow: hidden;\n max-height: 0em;\n max-width: 0em;\n }\n\n .collapsed .item .details {\n max-height: 0em;\n }\n\n .collapsed .item temba-icon {\n margin-right: 0;\n }\n\n .section {\n max-width: 12em;\n }\n\n .collapsed .section {\n opacity: 0;\n max-width: 0em;\n max-height: 0.6em;\n }\n\n .collapsed.level-1 {\n overflow: hidden;\n padding: 0.5em;\n --icon-color: #999;\n }\n\n .collapsed .item .right {\n flex-grow: 1;\n }\n\n .collapse-icon {\n display: none;\n }\n\n .collapsed .collapse-icon {\n --icon-color: #ccc;\n display: block;\n }\n\n .collapsed .item.iconless {\n max-height: 0em;\n padding: 0em;\n min-height: 0em;\n margin-bottom: 0em;\n }\n\n .divider {\n height: 1px;\n background: #f3f3f3;\n margin: 0.5em 0.75em;\n min-height: 1px;\n }\n\n .space {\n margin: 0.5em;\n }\n\n .collapsed .divider {\n height: 0;\n margin: 0;\n padding: 0;\n min-height: 0px;\n }\n\n .sub-section {\n font-size: 1rem;\n color: #888;\n margin-top: 1rem;\n margin-left: 0.3rem;\n }\n\n .fully-collapsed .level-1 {\n margin-left: -208px;\n pointer-events: none;\n border: none;\n overflow: hidden;\n }\n\n .fully-collapsed .level-1 > * {\n opacity: 0;\n }\n\n .fully-collapsed .level-1 .item,\n .fully-collapsed .level-1 .divider {\n opacity: 0;\n }\n\n .fully-collapsed .level-2,\n .fully-collapsed .level-3 {\n display: none;\n }\n\n temba-button {\n margin-top: 0.2em;\n margin-bottom: 0.2em;\n margin-left: 0.75em;\n margin-right: 0.75em;\n }\n\n .expand-icon {\n transform: rotate(180deg);\n --icon-color: rgba(255, 255, 255, 0.5);\n cursor: pointer;\n max-height: 0px;\n overflow: hidden;\n opacity: 0;\n transition: all 400ms ease-in-out 400ms;\n }\n\n .expand-icon:hover {\n --icon-color: #fff;\n }\n\n .fully-collapsed .expand-icon {\n padding-top: 0.5em;\n max-height: 2em;\n opacity: 1;\n }\n\n .section-header {\n display: flex;\n align-items: center;\n }\n\n .section-header .section {\n flex-grow: 1;\n }\n\n .section-header temba-icon {\n --icon-color: #ddd;\n cursor: pointer;\n padding-bottom: 0.5em;\n padding-right: 0.5em;\n }\n\n .section-header temba-icon:hover {\n --icon-color: var(--color-link-primary);\n }\n\n slot[name='header'] {\n display: none;\n }\n\n slot[name='header'].show-header {\n display: block;\n }\n `;\n }\n\n @property({ type: Boolean })\n wraps = false;\n\n @property({ type: Boolean })\n wait: boolean;\n\n @property({ type: String })\n endpoint: string;\n\n @property({ type: String })\n expanding: string;\n\n @property({ type: String })\n value: string;\n\n // submenu to constrain to\n @property({ type: String })\n submenu: string;\n\n @property({ type: Boolean })\n collapsed: boolean;\n\n @property({ type: Object })\n pressedItem: MenuItem;\n\n // http promise to monitor for completeness\n public httpComplete: Promise<void>;\n\n root: MenuItem;\n selection: string[] = [];\n state: { [id: string]: MenuItemState } = {};\n\n constructor() {\n super();\n this.doRefresh = this.doRefresh.bind(this);\n }\n\n public setBubble(id: string, color: string) {\n const found = findItem(this.root.items, id);\n if (found && found.item) {\n found.item.bubble = color;\n this.requestUpdate('root');\n return true;\n }\n return false;\n }\n\n private getMenuItemState(id: string): MenuItemState {\n let itemState = {};\n if (id) {\n itemState = this.state[id];\n if (!itemState) {\n itemState = {};\n this.state[id] = itemState;\n }\n }\n return itemState;\n }\n\n public updated(changes: Map<string, any>) {\n if (changes.has('endpoint')) {\n this.root = {\n level: -1,\n endpoint: this.endpoint,\n };\n\n if (!this.wait) {\n this.loadItems(this.root);\n } else {\n this.fireCustomEvent(CustomEventType.Ready);\n }\n }\n\n if (changes.has('root')) {\n if (this.value) {\n this.setFocusedItem(this.value);\n this.value = null;\n }\n }\n }\n\n public reset() {\n this.loadItems(this.root);\n }\n\n public async doRefresh() {\n const path = [...this.selection];\n let item = this.root;\n\n while (path.length > 0) {\n this.loadItems(item);\n // we need to wait until the load is complete before doing the replace\n await this.httpComplete;\n const id = path.shift();\n item = (item.items || []).find(_item => _item.id == id);\n }\n\n this.loadItems(item);\n }\n\n public refresh = debounce(this.doRefresh, 200);\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private loadItems(item: MenuItem, event: MouseEvent = null) {\n if (item && item.endpoint) {\n item.loading = true;\n this.httpComplete = fetchResults(item.endpoint).then(\n (items: MenuItem[]) => {\n items.forEach(newItem => {\n if (!newItem.items) {\n const prevItem = (item.items || []).find(\n prev => prev.id == newItem.id\n );\n if (prevItem && prevItem.items) {\n newItem.items = prevItem.items;\n }\n }\n });\n\n // update our item level\n items.forEach(subItem => {\n subItem.level = item.level + 1;\n // if we came with preset items, set the level for them accordingly\n if (subItem.items) {\n subItem.items.forEach(inlineItem => {\n inlineItem.level = item.level + 2;\n });\n }\n });\n\n item.items = items;\n item.loading = false;\n\n if (this.submenu && this.selection.length == 0) {\n const sub = this.getMenuItemForSelection([this.submenu]);\n this.handleItemClicked(event, sub);\n }\n\n if (!this.wait) {\n this.fireCustomEvent(CustomEventType.Ready);\n this.wait = true;\n }\n\n // once we've set our items check if we need to auto-select\n if (event && item.items.length > 0) {\n this.handleItemClicked(event, item.items[0]);\n }\n\n this.requestUpdate('root');\n this.scrollSelectedIntoView();\n }\n );\n }\n }\n\n private handleItemClicked(\n event: MouseEvent,\n menuItem: MenuItem,\n parent: MenuItem = null\n ) {\n if (parent && parent.popup) {\n if (event) {\n this.fireCustomEvent(CustomEventType.ButtonClicked, {\n item: menuItem,\n selection: this.getSelection(),\n parent,\n });\n }\n return;\n }\n\n if (menuItem.popup) {\n if (event) {\n this.fireCustomEvent(CustomEventType.ButtonClicked, {\n item: menuItem,\n selection: this.getSelection(),\n parent,\n });\n }\n return;\n }\n\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n if (event.metaKey && menuItem.href) {\n window.open(menuItem.href, '_blank');\n return;\n }\n }\n\n if (parent && parent.inline) {\n this.handleItemClicked(null, parent);\n }\n\n if (this.collapsed) {\n this.collapsed = false;\n }\n\n if (menuItem.trigger) {\n this.fireCustomEvent(CustomEventType.ButtonClicked, {\n item: menuItem,\n selection: this.getSelection(),\n parent,\n });\n return;\n }\n\n // update our selection\n if (menuItem.level >= this.selection.length) {\n this.selection.push(menuItem.vanity_id || menuItem.id);\n } else {\n this.selection.splice(\n menuItem.level,\n this.selection.length - menuItem.level,\n menuItem.vanity_id || menuItem.id\n );\n }\n\n if (menuItem.endpoint) {\n this.loadItems(menuItem, event);\n\n // make sure change events fire for events with hrefs\n if (!menuItem.href) {\n return;\n }\n } else {\n this.requestUpdate();\n }\n\n if (menuItem.href) {\n this.dispatchEvent(new Event('change'));\n }\n\n this.fireCustomEvent(CustomEventType.ButtonClicked, {\n item: menuItem,\n selection: this.getSelection(),\n parent,\n });\n }\n\n public scrollSelectedIntoView() {\n // makes sure we are scrolled into view\n window.setTimeout(() => {\n const eles = this.shadowRoot.querySelectorAll('.selected');\n eles.forEach(ele => {\n ele.scrollIntoView({ block: 'end', behavior: 'smooth' });\n });\n }, 0);\n }\n\n public clickItem(id: string): boolean {\n const path = [...this.selection];\n path.splice(path.length - 1, 1, id);\n const item = this.getMenuItemForSelection(path);\n\n if (item) {\n this.handleItemClicked(null, item);\n this.scrollSelectedIntoView();\n return true;\n }\n return false;\n }\n\n public getMenuItem(): MenuItem {\n return this.getMenuItemForSelection([...this.selection]);\n }\n\n public getMenuItemForSelection(selection: string[]) {\n const path = [...selection];\n let items = this.root.items;\n let item = null;\n while (path.length > 0) {\n const step = path.splice(0, 1)[0];\n if (items) {\n item = findItem(items, step).item;\n if (item) {\n items = item.items;\n } else {\n break;\n }\n } else {\n break;\n }\n }\n\n return item;\n }\n\n public getSelection() {\n return this.selection;\n }\n\n public handleExpand() {\n this.collapsed = false;\n }\n\n public handleCollapse() {\n this.collapsed = true;\n }\n\n public async setFocusedItem(path: string) {\n const focusedPath = path.split('/').filter(step => !!step);\n if (!this.root) {\n return;\n }\n\n // if we don't match at the first level, we are a noop\n if (focusedPath.length > 0) {\n const rootItem = findItem(this.root.items, focusedPath[0]).item;\n if (!rootItem) {\n return;\n }\n }\n\n const newPath = [];\n let level = this.root;\n while (focusedPath.length > 0) {\n const nextId = focusedPath.shift();\n if (nextId) {\n if (!level.items) {\n this.loadItems(level);\n await this.httpComplete;\n }\n\n level = findItem(level.items, nextId).item;\n if (!level) {\n focusedPath.splice(0, focusedPath.length);\n } else {\n newPath.push(nextId);\n }\n }\n }\n\n this.selection = newPath;\n this.refresh();\n this.requestUpdate('root');\n }\n\n private isSelected(menuItem: MenuItem) {\n if (menuItem.level < this.selection.length) {\n const selected =\n this.selection[menuItem.level] == (menuItem.vanity_id || menuItem.id);\n return selected;\n }\n return false;\n }\n\n private isExpanded(menuItem: MenuItem) {\n const expanded = !!this.selection.find(\n id => id === menuItem.vanity_id || menuItem.id\n );\n return expanded;\n }\n\n private renderMenuItem = (\n menuItem: MenuItem,\n parent: MenuItem = null\n ): TemplateResult => {\n if (menuItem.type === 'divider') {\n return html`<div class=\"divider\"></div>`;\n }\n\n if (menuItem.type === 'space') {\n return html`<div class=\"space\"></div>`;\n }\n\n if (menuItem.type === 'section' || menuItem.inline) {\n return html`<div class=\"sub-section\">${menuItem.name}</div>`;\n }\n\n if (menuItem.type === 'modax-button') {\n return html`<temba-button\n name=${menuItem.name}\n @click=${event => {\n this.handleItemClicked(event, menuItem);\n }}\n />`;\n }\n\n const isSelected = this.isSelected(menuItem);\n const isChildSelected =\n isSelected && this.selection.length > menuItem.level + 1;\n\n let icon = menuItem.icon\n ? html`<temba-icon\n size=\"${menuItem.level === 0 ? '1.5' : '1'}\"\n name=\"${menuItem.icon}\"\n ></temba-icon\n >${menuItem.bubble\n ? html`<div\n style=\"background-color: ${menuItem.bubble}\"\n class=\"bubble\"\n ></div>`\n : null}`\n : null;\n\n const collapsedIcon = menuItem.collapsed_icon\n ? html`<temba-icon\n size=\"${menuItem.level === 0 ? '1.5' : '1'}\"\n name=\"${menuItem.collapsed_icon}\"\n class=\"collapse-icon\"\n ></temba-icon>`\n : null;\n\n const itemClasses = getClasses({\n ['menu-' + menuItem.id]: true,\n 'child-selected': isChildSelected,\n selected: isSelected,\n item: !(menuItem.avatar && menuItem.level === 0),\n avatar: !!menuItem.avatar,\n inline: menuItem.inline,\n expanding: this.expanding && this.expanding === menuItem.id,\n expanded: this.isExpanded(menuItem),\n iconless: !icon && !collapsedIcon && !menuItem.avatar,\n pressed: this.pressedItem && this.pressedItem.id == menuItem.id,\n });\n\n if (menuItem.avatar) {\n icon = renderAvatar({ name: menuItem.avatar });\n }\n\n const item = html`\n <div\n id=\"menu-${menuItem.id}\"\n class=\"${itemClasses}\"\n @click=${event => {\n this.pressedItem = null;\n this.handleItemClicked(event, menuItem, parent);\n }}\n @mousedown=${() => {\n if (menuItem.level > 0) {\n this.pressedItem = menuItem;\n }\n }}\n @mouseleave=${() => {\n this.pressedItem = null;\n }}\n >\n ${menuItem.level === 0\n ? menuItem.avatar\n ? icon\n : html`<temba-tip\n style=\"display:flex;\"\n text=\"${menuItem.name}\"\n position=\"right\"\n >${icon}</temba-tip\n >`\n : html`${icon}${collapsedIcon}`}\n\n <div class=\"details\" style=\"flex-grow:1;display:flex\">\n <div\n class=\"name\"\n style=\"flex-grow:1; flex-shrink:0; white-space: ${this.wraps\n ? 'normal'\n : 'nowrap'};\"\n >\n ${menuItem.name}\n </div>\n ${menuItem.level > 0\n ? menuItem.inline\n ? html`<temba-icon\n name=\"${isSelected || isChildSelected\n ? Icon.arrow_up\n : Icon.arrow_down}\"\n ></temba-icon>`\n : html`${menuItem.count || menuItem.count == 0\n ? html`\n <div class=\"count\">\n ${menuItem.count.toLocaleString()}\n </div>\n `\n : html`<div class=\"count\"></div>`}`\n : null}\n </div>\n <div class=\"right\"></div>\n </div>\n `;\n\n if (menuItem.popup) {\n return html`\n <temba-dropdown offsetx=\"10\" arrowoffset=\"8\" mask>\n <div slot=\"toggle\">${item}</div>\n <div\n slot=\"dropdown\"\n style=\"width:300px;overflow:hidden;padding-bottom:0.5em\"\n >\n <div style=\"max-height:400px;overflow-y:auto\">\n ${(menuItem.items || []).map((child: MenuItem) => {\n child.level = menuItem.level + 1;\n return this.renderMenuItem(child, menuItem);\n })}\n </div>\n </div>\n </temba-dropdown>\n `;\n }\n return item;\n };\n\n public render(): TemplateResult {\n if (!this.root || !this.root.items) {\n return html`<temba-loading\n units=\"3\"\n size=\"10\"\n direction=\"column\"\n style=\"margin:1em;margin-right:0em\"\n />`;\n }\n\n let items = this.root.items || [];\n const levels = [];\n\n levels.push(\n html`<div class=\"level level-0 ${this.submenu ? 'hidden' : ''}\">\n <div class=\"top\">\n <div class=\"expand-icon\" @click=${this.handleExpand}>\n <temba-icon\n name=\"${Icon.menu_collapse}\"\n class=\"collapse\"\n class=\"expand\"\n size=\"1.4\"\n ></temba-icon>\n </div>\n </div>\n\n ${items\n .filter(item => !item.bottom)\n .map((item: MenuItem) => {\n return this.renderMenuItem(item);\n })}\n\n <div class=\"empty\"></div>\n ${items\n .filter(item => !!item.bottom)\n .map((item: MenuItem) => {\n return this.renderMenuItem(item);\n })}\n <div class=\"bottom\"></div>\n </div>`\n );\n\n this.selection.forEach((id, index) => {\n const selected = findItem(items, id).item;\n\n let collapsed = false;\n if (selected) {\n items = selected.items;\n const itemState = this.getMenuItemState(selected.id);\n // users set an explicit collapse state\n if (itemState.collapsed) {\n collapsed = itemState.collapsed === 'collapsed';\n }\n // otherwise pick a default collapse state\n else {\n if (this.selection.length > selected.level + 2) {\n collapsed = false;\n }\n }\n } else {\n items = null;\n }\n\n if (items && items.length > 0 && !selected.inline) {\n levels.push(\n html`<div\n class=\"${getClasses({\n level: true,\n ['level-' + (index + 1)]: true,\n collapsed,\n })}\"\n >\n ${!this.submenu\n ? html`\n <slot\n class=\"${getClasses({\n 'show-header': selected.show_header,\n })}\"\n name=\"header\"\n ></slot>\n <div class=\"section-header\">\n <div class=\"section\">${selected.name}</div>\n\n ${index == 0 && !this.collapsed\n ? html`<temba-icon\n name=\"${Icon.menu_collapse}\"\n size=\"1.1\"\n @click=${this.handleCollapse}\n ></temba-icon>`\n : null}\n </div>\n `\n : null}\n ${items.map((item: MenuItem) => {\n if (item.inline && item.items) {\n return html`${this.renderMenuItem(item)}\n <div class=\"inline-children\">\n ${(item.items || []).map((child: MenuItem) => {\n return this.renderMenuItem(child, item);\n })}\n </div>`;\n }\n return this.renderMenuItem(item);\n })}\n </div>`\n );\n }\n });\n\n const menu = html`<div\n class=\"${getClasses({\n root: true,\n 'fully-collapsed': this.collapsed,\n })}\"\n >\n ${levels}\n </div>`;\n return html`${menu}`;\n }\n}\n"]}
@@ -330,7 +330,6 @@ describe('temba-compose chatbox no text and attachments with files', () => {
330
330
  await updateComponent(compose, null, getSuccessFiles(), getFailFiles());
331
331
  await assertScreenshot('compose/chatbox-no-text-attachments-with-all-files', getClip(compose));
332
332
  });
333
- // todo fix this test - button should be enabled
334
333
  it('chatbox no text, attachments with success uploaded files, and click send', async () => {
335
334
  const compose = await getCompose({
336
335
  chatbox: true,
@@ -1 +1 @@
1
- {"version":3,"file":"temba-compose.test.js","sourceRoot":"","sources":["../../test/temba-compose.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, expect, fixture } from '@open-wc/testing';\nimport { Attachment, Compose, upload_endpoint } from '../src/compose/Compose';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\nimport { Button } from '../src/button/Button';\nimport { Completion } from '../src/completion/Completion';\n\nconst TAG = 'temba-compose';\nconst getCompose = async (attrs: any = {}, width = 500, height = 500) => {\n const compose = (await getComponent(\n TAG,\n attrs,\n '',\n width,\n height,\n 'display:flex;flex-direction:column;flex-grow:1;'\n )) as Compose;\n return compose;\n};\n\nexport const updateComponent = async (\n compose: Compose,\n text?: string,\n attachments?: Attachment[],\n errorAttachments?: Attachment[]\n): Promise<void> => {\n compose.currentChat = text ? text : '';\n compose.values = attachments ? attachments : [];\n compose.errorValues = errorAttachments ? errorAttachments : [];\n await compose.updateComplete;\n};\nexport const getSuccessText = () => {\n return 'sà-wàd-dee!';\n};\nexport const getFailText = () => {\n // for a server limit of 640 chars, return a string that is 640+ chars\n return \"p}h<r0P<?SCIbV1+pwW1Hj8g^J&=Sm2f)K=5LjFFUZ№5@ybpoLZ7DJ(27qdWxQMaO)I1nB4(D%d3c(H)QXOF6F?4>&d{lhd5?0`Lio!yAGMO№*AxN5{z5s.IO*dy?tm}vXJ#Lf-HlD;xmNp}0<P42=w#ll9)B-e9>Q#'{~Vp<dl:xC9`T^lhh@TosCZ^:(H<Ji<E(~PojvYk^rPB+poYy^Ne~Su1:9?IgH'4S5Q9v0g№FEIUc~!{S7;746j'Sd@Nfu3=x?CsuR;YLP4j+AOzDARZG?0(Ji(NMg=r%n0Fq?R1?E%Yf`bcoVZAJ^bl0J'^@;lH>T.HmxYxwS;1?(bfrh?pRdd73:iMxrfx5luQ(}<dCD1b3g'G0CtkB№;8KkbL=>krG{RO%Va4wwr%P>jE*+n(E11}Ju9#<.f^)<MTH09^b{RQv7~H`#@Hda6{MV&H@xdyEKq#M@nZng8WTU66!F@*!)w*EpQ+65XKuQCaESgq=PHmtqi@l;F?PHvl^g@Z:+}}Xyr`IC2=3?20^I'qSU*tkyinM^JF.ZI>}~XzRQJn№v3o-w?Vy&gC:c.l(&9{`M#-'N}{T#7lw8(4:iY621'>C^.&hVZn:R!G}Ek){D#'KkiJWawq#7~GLBN*?V!ncw)d%&(tXj\";\n};\n\nexport const getSuccessFiles = (numFiles = 2): Attachment[] => {\n const attachments = [];\n let index = 1;\n while (index <= numFiles) {\n const s = 's' + index;\n const attachment = {\n uuid: s,\n content_type: 'image/png',\n type: 'image/png',\n filename: 'name_' + s,\n url: 'url_' + s,\n size: 1024,\n error: null,\n } as Attachment;\n attachments.push(attachment);\n index++;\n }\n return attachments;\n};\nexport const getFailFiles = (): Attachment[] => {\n const f1 = 'f1';\n const fail1 = {\n uuid: f1,\n content_type: 'image/png',\n type: 'image/png',\n filename: 'name_' + f1,\n url: 'url_' + f1,\n size: 26624,\n error: 'Limit for file uploads is 25.0 MB',\n } as Attachment;\n const f2 = 'f2';\n const fail2 = {\n uuid: f2,\n content_type: 'application/octet-stream',\n type: 'application/octet-stream',\n filename: 'name_' + f2,\n url: 'url_' + f2,\n size: 1024,\n error: 'Unsupported file type',\n } as Attachment;\n\n return [fail1, fail2];\n};\n\nconst getLongTextWithSpaces = () => {\n // for a test width of 500, return a string that is 60+ chars with spaces\n return 'bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb ';\n};\nconst getLongTextWithNoSpaces = () => {\n // for a test width of 500, return a string that is 60+ chars with no spaces\n return 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';\n};\nconst getLongTextWithUrl = () => {\n // for a test width of 500, return a url that is 60+ chars with no spaces\n return 'http://www.yourmomyourmomyourmomyourmomyourmomyourmomyourmomyourmomyourmomyourmomyourmom.com';\n};\n\ndescribe('temba-compose chatbox', () => {\n it('can be created', async () => {\n const compose: Compose = await getCompose();\n assert.instanceOf(compose, Compose);\n expect(compose.endpoint).equals(upload_endpoint);\n });\n\n it('cannot be created with a different endpoint', async () => {\n const compose: Compose = await getCompose({\n endpoint: '/schmsgmedia/schmupload/',\n });\n assert.instanceOf(compose, Compose);\n expect(compose.endpoint).equals(upload_endpoint);\n });\n\n it('chatbox no counter no send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n });\n await assertScreenshot(\n 'compose/chatbox-no-counter-no-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox no counter and send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n button: true,\n });\n await assertScreenshot(\n 'compose/chatbox-no-counter-and-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox counter no send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n });\n await assertScreenshot(\n 'compose/chatbox-counter-no-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox counter and send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await assertScreenshot(\n 'compose/chatbox-counter-and-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox with text', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText());\n await assertScreenshot('compose/chatbox-with-text', getClip(compose));\n });\n\n it('chatbox with text and spaces', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getLongTextWithSpaces());\n await assertScreenshot(\n 'compose/chatbox-with-text-and-spaces',\n getClip(compose)\n );\n });\n\n it('chatbox with text and no spaces', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getLongTextWithNoSpaces());\n await assertScreenshot(\n 'compose/chatbox-with-text-no-spaces',\n getClip(compose)\n );\n });\n\n it('chatbox with text and url', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getLongTextWithUrl());\n await assertScreenshot(\n 'compose/chatbox-with-text-and-url',\n getClip(compose)\n );\n });\n\n it('chatbox with text and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-with-text-and-click-send',\n getClip(compose)\n );\n });\n\n it('chatbox with text and hit enter', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText());\n const completion = compose.shadowRoot.querySelector(\n 'temba-completion'\n ) as Completion;\n completion.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));\n await assertScreenshot(\n 'compose/chatbox-with-text-and-hit-enter',\n getClip(compose)\n );\n });\n});\n\ndescribe('temba-compose attachments', () => {\n it('attachments no send button', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n });\n await assertScreenshot(\n 'compose/attachments-no-send-button',\n getClip(compose)\n );\n });\n\n it('attachments and send button', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await assertScreenshot(\n 'compose/attachments-and-send-button',\n getClip(compose)\n );\n });\n\n it('attachments with success uploaded files', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles());\n await assertScreenshot(\n 'compose/attachments-with-success-files',\n getClip(compose)\n );\n });\n\n it('attachments with failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, null, getFailFiles());\n await assertScreenshot(\n 'compose/attachments-with-failure-files',\n getClip(compose)\n );\n });\n\n it('attachments with success and failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles(), getFailFiles());\n await assertScreenshot(\n 'compose/attachments-with-all-files',\n getClip(compose)\n );\n });\n\n it('attachments with success uploaded files and click send', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/attachments-with-success-files-and-click-send',\n getClip(compose)\n );\n });\n\n it('attachments with success and failure uploaded files and click send', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles(), getFailFiles());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/attachments-with-all-files-and-click-send',\n getClip(compose)\n );\n });\n});\n\ndescribe('temba-compose chatbox and attachments', () => {\n it('chatbox and attachments no counter no send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n });\n await assertScreenshot(\n 'compose/chatbox-attachments-no-counter-no-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox and attachments no counter and send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await assertScreenshot(\n 'compose/chatbox-attachments-no-counter-and-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox and attachments counter no send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n counter: true,\n });\n await assertScreenshot(\n 'compose/chatbox-attachments-counter-no-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox and attachments counter and send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n counter: true,\n button: true,\n });\n await assertScreenshot(\n 'compose/chatbox-attachments-counter-and-send-button',\n getClip(compose)\n );\n });\n});\n\ndescribe('temba-compose chatbox with text and attachments no files', () => {\n it('chatbox with text, attachments no files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n counter: true,\n button: true,\n });\n compose.currentChat = 'sà-wàd-dee!';\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-no-files',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments no files, and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n counter: true,\n button: true,\n });\n compose.currentChat = 'sà-wàd-dee!';\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-no-files-and-click-send',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments no files, and hit enter', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText());\n const completion = compose.shadowRoot.querySelector(\n 'temba-completion'\n ) as Completion;\n completion.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-no-files-and-hit-enter',\n getClip(compose)\n );\n });\n});\n\ndescribe('temba-compose chatbox no text and attachments with files', () => {\n it('chatbox no text, attachments with success uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles());\n await assertScreenshot(\n 'compose/chatbox-no-text-attachments-with-success-files',\n getClip(compose)\n );\n });\n\n it('chatbox no text, attachments with failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, null, getFailFiles());\n await assertScreenshot(\n 'compose/chatbox-no-text-attachments-with-failure-files',\n getClip(compose)\n );\n });\n\n it('chatbox no text, attachments with success and failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles(), getFailFiles());\n await assertScreenshot(\n 'compose/chatbox-no-text-attachments-with-all-files',\n getClip(compose)\n );\n });\n\n // todo fix this test - button should be enabled\n it('chatbox no text, attachments with success uploaded files, and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-no-text-attachments-with-success-files-and-click-send',\n getClip(compose)\n );\n });\n\n it('chatbox no text, attachments with success and failure uploaded files, and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles(), getFailFiles());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-no-text-attachments-with-all-files-and-click-send',\n getClip(compose)\n );\n });\n});\n\ndescribe('temba-compose chatbox with text and attachments with files', () => {\n it('chatbox with text, attachments with success uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText(), getSuccessFiles());\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-success-files',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText(), null, getFailFiles());\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-failure-files',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with success and failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(\n compose,\n getSuccessText(),\n getSuccessFiles(),\n getFailFiles()\n );\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-all-files',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with success uploaded files, and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText(), getSuccessFiles());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-success-files-and-click-send',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with success and failure uploaded files, and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(\n compose,\n getSuccessText(),\n getSuccessFiles(),\n getFailFiles()\n );\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-all-files-and-click-send',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with success uploaded files, and hit enter', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText(), getSuccessFiles());\n const completion = compose.shadowRoot.querySelector(\n 'temba-completion'\n ) as Completion;\n completion.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-success-files-and-hit-enter',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with success and failure uploaded files, and hit enter', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(\n compose,\n getSuccessText(),\n getSuccessFiles(),\n getFailFiles()\n );\n const completion = compose.shadowRoot.querySelector(\n 'temba-completion'\n ) as Completion;\n completion.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));\n const newClip = getClip(compose);\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-all-files-and-hit-enter',\n newClip\n );\n });\n});\n"]}
1
+ {"version":3,"file":"temba-compose.test.js","sourceRoot":"","sources":["../../test/temba-compose.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, expect, fixture } from '@open-wc/testing';\nimport { Attachment, Compose, upload_endpoint } from '../src/compose/Compose';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\nimport { Button } from '../src/button/Button';\nimport { Completion } from '../src/completion/Completion';\n\nconst TAG = 'temba-compose';\nconst getCompose = async (attrs: any = {}, width = 500, height = 500) => {\n const compose = (await getComponent(\n TAG,\n attrs,\n '',\n width,\n height,\n 'display:flex;flex-direction:column;flex-grow:1;'\n )) as Compose;\n return compose;\n};\n\nexport const updateComponent = async (\n compose: Compose,\n text?: string,\n attachments?: Attachment[],\n errorAttachments?: Attachment[]\n): Promise<void> => {\n compose.currentChat = text ? text : '';\n compose.values = attachments ? attachments : [];\n compose.errorValues = errorAttachments ? errorAttachments : [];\n await compose.updateComplete;\n};\nexport const getSuccessText = () => {\n return 'sà-wàd-dee!';\n};\nexport const getFailText = () => {\n // for a server limit of 640 chars, return a string that is 640+ chars\n return \"p}h<r0P<?SCIbV1+pwW1Hj8g^J&=Sm2f)K=5LjFFUZ№5@ybpoLZ7DJ(27qdWxQMaO)I1nB4(D%d3c(H)QXOF6F?4>&d{lhd5?0`Lio!yAGMO№*AxN5{z5s.IO*dy?tm}vXJ#Lf-HlD;xmNp}0<P42=w#ll9)B-e9>Q#'{~Vp<dl:xC9`T^lhh@TosCZ^:(H<Ji<E(~PojvYk^rPB+poYy^Ne~Su1:9?IgH'4S5Q9v0g№FEIUc~!{S7;746j'Sd@Nfu3=x?CsuR;YLP4j+AOzDARZG?0(Ji(NMg=r%n0Fq?R1?E%Yf`bcoVZAJ^bl0J'^@;lH>T.HmxYxwS;1?(bfrh?pRdd73:iMxrfx5luQ(}<dCD1b3g'G0CtkB№;8KkbL=>krG{RO%Va4wwr%P>jE*+n(E11}Ju9#<.f^)<MTH09^b{RQv7~H`#@Hda6{MV&H@xdyEKq#M@nZng8WTU66!F@*!)w*EpQ+65XKuQCaESgq=PHmtqi@l;F?PHvl^g@Z:+}}Xyr`IC2=3?20^I'qSU*tkyinM^JF.ZI>}~XzRQJn№v3o-w?Vy&gC:c.l(&9{`M#-'N}{T#7lw8(4:iY621'>C^.&hVZn:R!G}Ek){D#'KkiJWawq#7~GLBN*?V!ncw)d%&(tXj\";\n};\n\nexport const getSuccessFiles = (numFiles = 2): Attachment[] => {\n const attachments = [];\n let index = 1;\n while (index <= numFiles) {\n const s = 's' + index;\n const attachment = {\n uuid: s,\n content_type: 'image/png',\n type: 'image/png',\n filename: 'name_' + s,\n url: 'url_' + s,\n size: 1024,\n error: null,\n } as Attachment;\n attachments.push(attachment);\n index++;\n }\n return attachments;\n};\nexport const getFailFiles = (): Attachment[] => {\n const f1 = 'f1';\n const fail1 = {\n uuid: f1,\n content_type: 'image/png',\n type: 'image/png',\n filename: 'name_' + f1,\n url: 'url_' + f1,\n size: 26624,\n error: 'Limit for file uploads is 25.0 MB',\n } as Attachment;\n const f2 = 'f2';\n const fail2 = {\n uuid: f2,\n content_type: 'application/octet-stream',\n type: 'application/octet-stream',\n filename: 'name_' + f2,\n url: 'url_' + f2,\n size: 1024,\n error: 'Unsupported file type',\n } as Attachment;\n\n return [fail1, fail2];\n};\n\nconst getLongTextWithSpaces = () => {\n // for a test width of 500, return a string that is 60+ chars with spaces\n return 'bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb ';\n};\nconst getLongTextWithNoSpaces = () => {\n // for a test width of 500, return a string that is 60+ chars with no spaces\n return 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';\n};\nconst getLongTextWithUrl = () => {\n // for a test width of 500, return a url that is 60+ chars with no spaces\n return 'http://www.yourmomyourmomyourmomyourmomyourmomyourmomyourmomyourmomyourmomyourmomyourmom.com';\n};\n\ndescribe('temba-compose chatbox', () => {\n it('can be created', async () => {\n const compose: Compose = await getCompose();\n assert.instanceOf(compose, Compose);\n expect(compose.endpoint).equals(upload_endpoint);\n });\n\n it('cannot be created with a different endpoint', async () => {\n const compose: Compose = await getCompose({\n endpoint: '/schmsgmedia/schmupload/',\n });\n assert.instanceOf(compose, Compose);\n expect(compose.endpoint).equals(upload_endpoint);\n });\n\n it('chatbox no counter no send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n });\n await assertScreenshot(\n 'compose/chatbox-no-counter-no-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox no counter and send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n button: true,\n });\n await assertScreenshot(\n 'compose/chatbox-no-counter-and-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox counter no send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n });\n await assertScreenshot(\n 'compose/chatbox-counter-no-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox counter and send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await assertScreenshot(\n 'compose/chatbox-counter-and-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox with text', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText());\n await assertScreenshot('compose/chatbox-with-text', getClip(compose));\n });\n\n it('chatbox with text and spaces', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getLongTextWithSpaces());\n await assertScreenshot(\n 'compose/chatbox-with-text-and-spaces',\n getClip(compose)\n );\n });\n\n it('chatbox with text and no spaces', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getLongTextWithNoSpaces());\n await assertScreenshot(\n 'compose/chatbox-with-text-no-spaces',\n getClip(compose)\n );\n });\n\n it('chatbox with text and url', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getLongTextWithUrl());\n await assertScreenshot(\n 'compose/chatbox-with-text-and-url',\n getClip(compose)\n );\n });\n\n it('chatbox with text and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-with-text-and-click-send',\n getClip(compose)\n );\n });\n\n it('chatbox with text and hit enter', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText());\n const completion = compose.shadowRoot.querySelector(\n 'temba-completion'\n ) as Completion;\n completion.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));\n await assertScreenshot(\n 'compose/chatbox-with-text-and-hit-enter',\n getClip(compose)\n );\n });\n});\n\ndescribe('temba-compose attachments', () => {\n it('attachments no send button', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n });\n await assertScreenshot(\n 'compose/attachments-no-send-button',\n getClip(compose)\n );\n });\n\n it('attachments and send button', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await assertScreenshot(\n 'compose/attachments-and-send-button',\n getClip(compose)\n );\n });\n\n it('attachments with success uploaded files', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles());\n await assertScreenshot(\n 'compose/attachments-with-success-files',\n getClip(compose)\n );\n });\n\n it('attachments with failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, null, getFailFiles());\n await assertScreenshot(\n 'compose/attachments-with-failure-files',\n getClip(compose)\n );\n });\n\n it('attachments with success and failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles(), getFailFiles());\n await assertScreenshot(\n 'compose/attachments-with-all-files',\n getClip(compose)\n );\n });\n\n it('attachments with success uploaded files and click send', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/attachments-with-success-files-and-click-send',\n getClip(compose)\n );\n });\n\n it('attachments with success and failure uploaded files and click send', async () => {\n const compose: Compose = await getCompose({\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles(), getFailFiles());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/attachments-with-all-files-and-click-send',\n getClip(compose)\n );\n });\n});\n\ndescribe('temba-compose chatbox and attachments', () => {\n it('chatbox and attachments no counter no send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n });\n await assertScreenshot(\n 'compose/chatbox-attachments-no-counter-no-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox and attachments no counter and send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await assertScreenshot(\n 'compose/chatbox-attachments-no-counter-and-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox and attachments counter no send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n counter: true,\n });\n await assertScreenshot(\n 'compose/chatbox-attachments-counter-no-send-button',\n getClip(compose)\n );\n });\n\n it('chatbox and attachments counter and send button', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n counter: true,\n button: true,\n });\n await assertScreenshot(\n 'compose/chatbox-attachments-counter-and-send-button',\n getClip(compose)\n );\n });\n});\n\ndescribe('temba-compose chatbox with text and attachments no files', () => {\n it('chatbox with text, attachments no files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n counter: true,\n button: true,\n });\n compose.currentChat = 'sà-wàd-dee!';\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-no-files',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments no files, and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n counter: true,\n button: true,\n });\n compose.currentChat = 'sà-wàd-dee!';\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-no-files-and-click-send',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments no files, and hit enter', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n counter: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText());\n const completion = compose.shadowRoot.querySelector(\n 'temba-completion'\n ) as Completion;\n completion.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-no-files-and-hit-enter',\n getClip(compose)\n );\n });\n});\n\ndescribe('temba-compose chatbox no text and attachments with files', () => {\n it('chatbox no text, attachments with success uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles());\n await assertScreenshot(\n 'compose/chatbox-no-text-attachments-with-success-files',\n getClip(compose)\n );\n });\n\n it('chatbox no text, attachments with failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, null, getFailFiles());\n await assertScreenshot(\n 'compose/chatbox-no-text-attachments-with-failure-files',\n getClip(compose)\n );\n });\n\n it('chatbox no text, attachments with success and failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles(), getFailFiles());\n await assertScreenshot(\n 'compose/chatbox-no-text-attachments-with-all-files',\n getClip(compose)\n );\n });\n\n it('chatbox no text, attachments with success uploaded files, and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-no-text-attachments-with-success-files-and-click-send',\n getClip(compose)\n );\n });\n\n it('chatbox no text, attachments with success and failure uploaded files, and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, null, getSuccessFiles(), getFailFiles());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-no-text-attachments-with-all-files-and-click-send',\n getClip(compose)\n );\n });\n});\n\ndescribe('temba-compose chatbox with text and attachments with files', () => {\n it('chatbox with text, attachments with success uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText(), getSuccessFiles());\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-success-files',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText(), null, getFailFiles());\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-failure-files',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with success and failure uploaded files', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(\n compose,\n getSuccessText(),\n getSuccessFiles(),\n getFailFiles()\n );\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-all-files',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with success uploaded files, and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText(), getSuccessFiles());\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-success-files-and-click-send',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with success and failure uploaded files, and click send', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(\n compose,\n getSuccessText(),\n getSuccessFiles(),\n getFailFiles()\n );\n const send = compose.shadowRoot.querySelector(\n 'temba-button#send-button'\n ) as Button;\n send.click();\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-all-files-and-click-send',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with success uploaded files, and hit enter', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(compose, getSuccessText(), getSuccessFiles());\n const completion = compose.shadowRoot.querySelector(\n 'temba-completion'\n ) as Completion;\n completion.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-success-files-and-hit-enter',\n getClip(compose)\n );\n });\n\n it('chatbox with text, attachments with success and failure uploaded files, and hit enter', async () => {\n const compose: Compose = await getCompose({\n chatbox: true,\n attachments: true,\n button: true,\n });\n await updateComponent(\n compose,\n getSuccessText(),\n getSuccessFiles(),\n getFailFiles()\n );\n const completion = compose.shadowRoot.querySelector(\n 'temba-completion'\n ) as Completion;\n completion.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));\n const newClip = getClip(compose);\n await assertScreenshot(\n 'compose/chatbox-with-text-attachments-with-all-files-and-hit-enter',\n newClip\n );\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nyaruka/temba-components",
3
- "version": "0.43.1",
3
+ "version": "0.43.3",
4
4
  "description": "Web components to support rapidpro and related projects",
5
5
  "author": "Nyaruka <code@nyaruka.coim>",
6
6
  "main": "dist/index.js",