@nyaruka/temba-components 0.129.1 → 0.129.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.
- package/.github/workflows/build.yml +6 -5
- package/.github/workflows/coverage.yml +80 -0
- package/CHANGELOG.md +32 -0
- package/README.md +6 -0
- package/check-coverage.js +133 -0
- package/demo/components/alert/example.html +71 -0
- package/demo/components/button/example.html +167 -0
- package/demo/{chart → components/chart}/example.html +3 -3
- package/demo/components/chart/horizontal-demo.html +160 -0
- package/demo/components/checkbox/example.html +68 -0
- package/demo/components/compose/example.html +69 -0
- package/demo/components/datepicker/example.html +3 -3
- package/demo/components/datepicker/range-picker-demo.html +2 -2
- package/demo/{dialog → components/dialog}/example.html +3 -3
- package/demo/components/dropdown/example.html +95 -0
- package/demo/{flow → components/flow}/example.html +1 -1
- package/demo/{misc → components/misc}/example.html +3 -3
- package/demo/components/progress/example.html +62 -0
- package/demo/components/select/drag-and-drop.html +162 -0
- package/demo/components/select/example.html +76 -0
- package/demo/components/select/multi.html +72 -0
- package/demo/components/slider/example.html +55 -0
- package/demo/{sortable-list → components/sortable-list}/example.html +3 -3
- package/demo/components/tabs/example.html +91 -0
- package/demo/{textinput → components/textinput}/completion.html +3 -3
- package/demo/components/textinput/example.html +141 -0
- package/demo/{webchat → components/webchat}/example.html +3 -3
- package/demo/data/flows/sample-flow.json +107 -100
- package/demo/index.html +21 -21
- package/demo/static/css/styles.css +253 -0
- package/demo/sticky-note-demo.html +88 -85
- package/demo/styles.css +24 -0
- package/dist/locales/es.js +5 -5
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fr.js +5 -5
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/locale-codes.js +2 -11
- package/dist/locales/locale-codes.js.map +1 -1
- package/dist/locales/pt.js +5 -5
- package/dist/locales/pt.js.map +1 -1
- package/dist/temba-components.js +893 -476
- package/dist/temba-components.js.map +1 -1
- package/generate-coverage-badge.sh +69 -0
- package/out-tsc/src/{vectoricon/index.js → Icons.js} +1 -1
- package/out-tsc/src/Icons.js.map +1 -0
- package/out-tsc/src/display/Alert.js.map +1 -0
- package/out-tsc/src/display/Anchor.js.map +1 -0
- package/out-tsc/src/display/Button.js.map +1 -0
- package/out-tsc/src/{charcount → display}/CharCount.js +159 -2
- package/out-tsc/src/display/CharCount.js.map +1 -0
- package/out-tsc/src/display/Chat.js.map +1 -0
- package/out-tsc/src/display/ContactName.js.map +1 -0
- package/out-tsc/src/display/ContactUrn.js.map +1 -0
- package/out-tsc/src/display/Dropdown.js.map +1 -0
- package/out-tsc/src/{vectoricon/VectorIcon.js → display/Icon.js} +2 -2
- package/out-tsc/src/display/Icon.js.map +1 -0
- package/out-tsc/src/display/Label.js.map +1 -0
- package/out-tsc/src/{leafletmap → display}/LeafletMap.js +16 -1
- package/out-tsc/src/display/LeafletMap.js.map +1 -0
- package/out-tsc/src/display/Lightbox.js.map +1 -0
- package/out-tsc/src/{loading → display}/Loading.js.map +1 -1
- package/out-tsc/src/{options → display}/Options.js.map +1 -1
- package/out-tsc/src/display/ProgressBar.js.map +1 -0
- package/out-tsc/src/display/TembaDate.js.map +1 -0
- package/out-tsc/src/display/TembaUser.js.map +1 -0
- package/out-tsc/src/display/Thumbnail.js.map +1 -0
- package/out-tsc/src/{tip → display}/Tip.js +1 -2
- package/out-tsc/src/display/Tip.js.map +1 -0
- package/out-tsc/src/display/Toast.js.map +1 -0
- package/out-tsc/src/display/sms/gsmsplitter.js.map +1 -0
- package/out-tsc/src/display/sms/gsmvalidator.js.map +1 -0
- package/out-tsc/src/display/sms/index.js.map +1 -0
- package/out-tsc/src/display/sms/unicodesplitter.js.map +1 -0
- package/out-tsc/src/events.js +2 -0
- package/out-tsc/src/events.js.map +1 -0
- package/out-tsc/src/excellent/ExcellentParser.js.map +1 -0
- package/out-tsc/src/excellent/helpers.js.map +1 -0
- package/out-tsc/src/flow/Editor.js +533 -140
- package/out-tsc/src/flow/Editor.js.map +1 -1
- package/out-tsc/src/flow/EditorNode.js +287 -20
- package/out-tsc/src/flow/EditorNode.js.map +1 -1
- package/out-tsc/src/flow/Plumber.js +154 -74
- package/out-tsc/src/flow/Plumber.js.map +1 -1
- package/out-tsc/src/flow/StickyNote.js +153 -9
- package/out-tsc/src/flow/StickyNote.js.map +1 -1
- package/out-tsc/src/flow/config.js +88 -18
- package/out-tsc/src/flow/config.js.map +1 -1
- package/out-tsc/src/flow/render.js +327 -10
- package/out-tsc/src/flow/render.js.map +1 -1
- package/out-tsc/src/{checkbox → form}/Checkbox.js +2 -2
- package/out-tsc/src/form/Checkbox.js.map +1 -0
- package/out-tsc/src/{colorpicker → form}/ColorPicker.js +1 -1
- package/out-tsc/src/form/ColorPicker.js.map +1 -0
- package/out-tsc/src/{completion → form}/Completion.js +2 -2
- package/out-tsc/src/form/Completion.js.map +1 -0
- package/out-tsc/src/{compose → form}/Compose.js +1 -1
- package/out-tsc/src/form/Compose.js.map +1 -0
- package/out-tsc/src/{contactsearch → form}/ContactSearch.js +2 -2
- package/out-tsc/src/form/ContactSearch.js.map +1 -0
- package/out-tsc/src/form/CroppieCSS.js.map +1 -0
- package/out-tsc/src/{datepicker → form}/DatePicker.js +1 -1
- package/out-tsc/src/form/DatePicker.js.map +1 -0
- package/out-tsc/src/{FormElement.js → form/FormElement.js} +1 -1
- package/out-tsc/src/form/FormElement.js.map +1 -0
- package/out-tsc/src/form/FormField.js.map +1 -0
- package/out-tsc/src/{imagepicker → form}/ImagePicker.js +2 -2
- package/out-tsc/src/form/ImagePicker.js.map +1 -0
- package/out-tsc/src/{mediapicker → form}/MediaPicker.js +1 -1
- package/out-tsc/src/form/MediaPicker.js.map +1 -0
- package/out-tsc/src/{datepicker → form}/RangePicker.js +3 -2
- package/out-tsc/src/form/RangePicker.js.map +1 -0
- package/out-tsc/src/{slider → form}/TembaSlider.js +1 -1
- package/out-tsc/src/form/TembaSlider.js.map +1 -0
- package/out-tsc/src/{templates → form}/TemplateEditor.js +1 -1
- package/out-tsc/src/form/TemplateEditor.js.map +1 -0
- package/out-tsc/src/{textinput → form}/TextInput.js +3 -3
- package/out-tsc/src/form/TextInput.js.map +1 -0
- package/out-tsc/src/{omnibox → form/select}/Omnibox.js +2 -2
- package/out-tsc/src/form/select/Omnibox.js.map +1 -0
- package/out-tsc/src/{select → form/select}/PopupSelect.js +1 -1
- package/out-tsc/src/form/select/PopupSelect.js.map +1 -0
- package/out-tsc/src/{select → form/select}/Select.js +86 -87
- package/out-tsc/src/form/select/Select.js.map +1 -0
- package/out-tsc/src/{select → form/select}/UserSelect.js +1 -1
- package/out-tsc/src/form/select/UserSelect.js.map +1 -0
- package/out-tsc/src/{select → form/select}/WorkspaceSelect.js +1 -1
- package/out-tsc/src/form/select/WorkspaceSelect.js.map +1 -0
- package/out-tsc/src/interfaces.js +1 -0
- package/out-tsc/src/interfaces.js.map +1 -1
- package/out-tsc/src/layout/Dialog.js.map +1 -0
- package/out-tsc/src/layout/Mask.js.map +1 -0
- package/out-tsc/src/{dialog → layout}/Modax.js.map +1 -1
- package/out-tsc/src/layout/Resizer.js.map +1 -0
- package/out-tsc/src/layout/Tab.js.map +1 -0
- package/out-tsc/src/layout/TabPane.js.map +1 -0
- package/out-tsc/src/list/NotificationList.js +1 -1
- package/out-tsc/src/list/NotificationList.js.map +1 -1
- package/out-tsc/src/list/RunList.js +1 -1
- package/out-tsc/src/list/RunList.js.map +1 -1
- package/out-tsc/src/list/ShortcutList.js.map +1 -1
- package/out-tsc/src/list/TembaMenu.js +1 -1
- package/out-tsc/src/list/TembaMenu.js.map +1 -1
- package/out-tsc/src/list/TicketList.js +1 -1
- package/out-tsc/src/list/TicketList.js.map +1 -1
- package/out-tsc/src/{aliaseditor → live}/AliasEditor.js +1 -1
- package/out-tsc/src/live/AliasEditor.js.map +1 -0
- package/out-tsc/src/{contacts → live}/ContactBadges.js +1 -1
- package/out-tsc/src/live/ContactBadges.js.map +1 -0
- package/out-tsc/src/{contacts → live}/ContactChat.js +79 -3
- package/out-tsc/src/live/ContactChat.js.map +1 -0
- package/out-tsc/src/{contacts → live}/ContactDetails.js +1 -1
- package/out-tsc/src/live/ContactDetails.js.map +1 -0
- package/out-tsc/src/{contacts → live}/ContactFieldEditor.js +2 -2
- package/out-tsc/src/live/ContactFieldEditor.js.map +1 -0
- package/out-tsc/src/live/ContactFields.js.map +1 -0
- package/out-tsc/src/live/ContactNameFetch.js.map +1 -0
- package/out-tsc/src/{contacts → live}/ContactNotepad.js +1 -1
- package/out-tsc/src/{contacts → live}/ContactNotepad.js.map +1 -1
- package/out-tsc/src/{contacts → live}/ContactPending.js +1 -1
- package/out-tsc/src/live/ContactPending.js.map +1 -0
- package/out-tsc/src/live/ContactStoreElement.js.map +1 -0
- package/out-tsc/src/live/FieldManager.js.map +1 -0
- package/out-tsc/src/live/StartProgress.js.map +1 -0
- package/out-tsc/src/{chart → live}/TembaChart.js +5 -1
- package/out-tsc/src/live/TembaChart.js.map +1 -0
- package/out-tsc/src/locales/es.js +5 -5
- package/out-tsc/src/locales/es.js.map +1 -1
- package/out-tsc/src/locales/fr.js +5 -5
- package/out-tsc/src/locales/fr.js.map +1 -1
- package/out-tsc/src/locales/locale-codes.js +2 -11
- package/out-tsc/src/locales/locale-codes.js.map +1 -1
- package/out-tsc/src/locales/pt.js +5 -5
- package/out-tsc/src/locales/pt.js.map +1 -1
- package/out-tsc/src/store/AppState.js +54 -24
- package/out-tsc/src/store/AppState.js.map +1 -1
- package/out-tsc/src/store/Store.js +1 -1
- package/out-tsc/src/store/Store.js.map +1 -1
- package/out-tsc/src/{utils/index.js → utils.js} +22 -1
- package/out-tsc/src/utils.js.map +1 -0
- package/out-tsc/src/webchat/WebChat.js +1 -1
- package/out-tsc/src/webchat/WebChat.js.map +1 -1
- package/out-tsc/temba-components.js +2 -2
- package/out-tsc/temba-components.js.map +1 -1
- package/out-tsc/temba-modules.js +54 -54
- package/out-tsc/temba-modules.js.map +1 -1
- package/out-tsc/temba-webchat.js +2 -2
- package/out-tsc/temba-webchat.js.map +1 -1
- package/out-tsc/test/temba-alert.test.js +1 -1
- package/out-tsc/test/temba-alert.test.js.map +1 -1
- package/out-tsc/test/temba-appstate-language.test.js +90 -0
- package/out-tsc/test/temba-appstate-language.test.js.map +1 -1
- package/out-tsc/test/temba-charcount.test.js.map +1 -1
- package/out-tsc/test/temba-chart.test.js +1 -1
- package/out-tsc/test/temba-chart.test.js.map +1 -1
- package/out-tsc/test/temba-checkbox.test.js.map +1 -1
- package/out-tsc/test/temba-color-picker.test.js +1 -1
- package/out-tsc/test/temba-color-picker.test.js.map +1 -1
- package/out-tsc/test/temba-completion.test.js +1 -1
- package/out-tsc/test/temba-completion.test.js.map +1 -1
- package/out-tsc/test/temba-compose.test.js +1 -1
- package/out-tsc/test/temba-compose.test.js.map +1 -1
- package/out-tsc/test/temba-contact-badges.test.js +1 -1
- package/out-tsc/test/temba-contact-badges.test.js.map +1 -1
- package/out-tsc/test/temba-contact-chat.test.js +3 -1
- package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
- package/out-tsc/test/temba-contact-details.test.js +1 -1
- package/out-tsc/test/temba-contact-details.test.js.map +1 -1
- package/out-tsc/test/temba-contact-fields.test.js +1 -1
- package/out-tsc/test/temba-contact-fields.test.js.map +1 -1
- package/out-tsc/test/temba-contact-search.test.js +1 -1
- package/out-tsc/test/temba-contact-search.test.js.map +1 -1
- package/out-tsc/test/temba-date.test.js +5 -1
- package/out-tsc/test/temba-date.test.js.map +1 -1
- package/out-tsc/test/temba-datepicker.test.js +1 -1
- package/out-tsc/test/temba-datepicker.test.js.map +1 -1
- package/out-tsc/test/temba-dialog.test.js +1 -1
- package/out-tsc/test/temba-dialog.test.js.map +1 -1
- package/out-tsc/test/temba-dropdown.test.js +1 -1
- package/out-tsc/test/temba-dropdown.test.js.map +1 -1
- package/out-tsc/test/temba-excellent-helpers.test.js +316 -0
- package/out-tsc/test/temba-excellent-helpers.test.js.map +1 -0
- package/out-tsc/test/temba-field-manager.test.js.map +1 -1
- package/out-tsc/test/temba-flow-editor-node.test.js +414 -1
- package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -1
- package/out-tsc/test/temba-flow-editor.test.js +185 -0
- package/out-tsc/test/temba-flow-editor.test.js.map +1 -1
- package/out-tsc/test/temba-flow-plumber-connections.test.js +113 -0
- package/out-tsc/test/temba-flow-plumber-connections.test.js.map +1 -0
- package/out-tsc/test/temba-flow-plumber.test.js +73 -93
- package/out-tsc/test/temba-flow-plumber.test.js.map +1 -1
- package/out-tsc/test/temba-flow-render.test.js +624 -1
- package/out-tsc/test/temba-flow-render.test.js.map +1 -1
- package/out-tsc/test/temba-flow-self-routing.test.js +172 -0
- package/out-tsc/test/temba-flow-self-routing.test.js.map +1 -0
- package/out-tsc/test/temba-formfield.test.js.map +1 -1
- package/out-tsc/test/temba-icon.test.js +1 -1
- package/out-tsc/test/temba-icon.test.js.map +1 -1
- package/out-tsc/test/temba-integration-markdown.test.js.map +1 -1
- package/out-tsc/test/temba-label.test.js +1 -1
- package/out-tsc/test/temba-label.test.js.map +1 -1
- package/out-tsc/test/temba-lightbox.test.js +1 -1
- package/out-tsc/test/temba-lightbox.test.js.map +1 -1
- package/out-tsc/test/temba-markdown.test.js +127 -0
- package/out-tsc/test/temba-markdown.test.js.map +1 -0
- package/out-tsc/test/temba-menu.test.js +1 -1
- package/out-tsc/test/temba-menu.test.js.map +1 -1
- package/out-tsc/test/temba-modax.test.js +1 -1
- package/out-tsc/test/temba-modax.test.js.map +1 -1
- package/out-tsc/test/temba-modules.test.js +47 -0
- package/out-tsc/test/temba-modules.test.js.map +1 -0
- package/out-tsc/test/temba-omnibox.test.js +1 -1
- package/out-tsc/test/temba-omnibox.test.js.map +1 -1
- package/out-tsc/test/temba-options.test.js.map +1 -1
- package/out-tsc/test/temba-range-picker.test.js +9 -2
- package/out-tsc/test/temba-range-picker.test.js.map +1 -1
- package/out-tsc/test/temba-rapid-element.test.js +273 -0
- package/out-tsc/test/temba-rapid-element.test.js.map +1 -0
- package/out-tsc/test/temba-resize-element.test.js +85 -0
- package/out-tsc/test/temba-resize-element.test.js.map +1 -0
- package/out-tsc/test/temba-select.test.js +2 -2
- package/out-tsc/test/temba-select.test.js.map +1 -1
- package/out-tsc/test/temba-slider.test.js.map +1 -1
- package/out-tsc/test/temba-sticky-note.test.js +194 -0
- package/out-tsc/test/temba-sticky-note.test.js.map +1 -0
- package/out-tsc/test/temba-template-editor.test.js.map +1 -1
- package/out-tsc/test/temba-textinput.test.js +1 -1
- package/out-tsc/test/temba-textinput.test.js.map +1 -1
- package/out-tsc/test/temba-tip.test.js +1 -1
- package/out-tsc/test/temba-tip.test.js.map +1 -1
- package/out-tsc/test/temba-toast.test.js +1 -1
- package/out-tsc/test/temba-toast.test.js.map +1 -1
- package/out-tsc/test/temba-utils-index.test.js +1 -1
- package/out-tsc/test/temba-utils-index.test.js.map +1 -1
- package/out-tsc/test/temba-utils-uuid.test.js +38 -0
- package/out-tsc/test/temba-utils-uuid.test.js.map +1 -0
- package/out-tsc/test/temba-webchat.test.js +28 -12
- package/out-tsc/test/temba-webchat.test.js.map +1 -1
- package/out-tsc/test/utils.test.js +2 -6
- package/out-tsc/test/utils.test.js.map +1 -1
- package/package.json +18 -9
- package/rollup.components.mjs +1 -1
- package/screenshots/truth/datepicker/range-picker-all.png +0 -0
- package/screenshots/truth/datepicker/range-picker-button-states.png +0 -0
- package/screenshots/truth/datepicker/range-picker-default.png +0 -0
- package/screenshots/truth/datepicker/range-picker-editing-start.png +0 -0
- package/screenshots/truth/datepicker/range-picker-initial-values.png +0 -0
- package/screenshots/truth/datepicker/range-picker-week.png +0 -0
- package/screenshots/truth/datepicker/range-picker-year.png +0 -0
- package/screenshots/truth/sticky-note/blue-color.png +0 -0
- package/screenshots/truth/sticky-note/blue.png +0 -0
- package/screenshots/truth/sticky-note/color-picker-expanded.png +0 -0
- package/screenshots/truth/sticky-note/default.png +0 -0
- package/screenshots/truth/sticky-note/gray-color.png +0 -0
- package/screenshots/truth/sticky-note/gray.png +0 -0
- package/screenshots/truth/sticky-note/green-color.png +0 -0
- package/screenshots/truth/sticky-note/green.png +0 -0
- package/screenshots/truth/sticky-note/pink-color.png +0 -0
- package/screenshots/truth/sticky-note/pink.png +0 -0
- package/screenshots/truth/sticky-note/yellow-color.png +0 -0
- package/screenshots/truth/sticky-note/yellow.png +0 -0
- package/src/{charcount → display}/CharCount.ts +164 -2
- package/src/{vectoricon/VectorIcon.ts → display/Icon.ts} +1 -1
- package/src/{leafletmap → display}/LeafletMap.ts +19 -1
- package/src/{thumbnail → display}/Thumbnail.ts +1 -1
- package/src/{tip → display}/Tip.ts +1 -2
- package/src/{contacts/events.ts → events.ts} +1 -64
- package/src/flow/Editor.ts +655 -165
- package/src/flow/EditorNode.ts +337 -22
- package/src/flow/Plumber.ts +186 -79
- package/src/flow/StickyNote.ts +165 -9
- package/src/flow/config.ts +114 -18
- package/src/flow/render.ts +398 -11
- package/src/{checkbox → form}/Checkbox.ts +2 -2
- package/src/{colorpicker → form}/ColorPicker.ts +2 -2
- package/src/{completion → form}/Completion.ts +3 -3
- package/src/{compose → form}/Compose.ts +7 -7
- package/src/{contactsearch → form}/ContactSearch.ts +6 -6
- package/src/{datepicker → form}/DatePicker.ts +1 -1
- package/src/{FormElement.ts → form/FormElement.ts} +1 -1
- package/src/{imagepicker → form}/ImagePicker.ts +2 -2
- package/src/{mediapicker → form}/MediaPicker.ts +1 -1
- package/src/{datepicker → form}/RangePicker.ts +3 -2
- package/src/{slider → form}/TembaSlider.ts +1 -1
- package/src/{templates → form}/TemplateEditor.ts +2 -2
- package/src/{textinput → form}/TextInput.ts +5 -5
- package/src/{omnibox → form/select}/Omnibox.ts +2 -2
- package/src/{select → form/select}/PopupSelect.ts +1 -1
- package/src/{select → form/select}/Select.ts +124 -126
- package/src/{select → form/select}/UserSelect.ts +1 -1
- package/src/{select → form/select}/WorkspaceSelect.ts +1 -1
- package/src/interfaces.ts +2 -1
- package/src/{dialog → layout}/Dialog.ts +1 -1
- package/src/list/NotificationList.ts +2 -2
- package/src/list/RunList.ts +3 -3
- package/src/list/ShortcutList.ts +1 -1
- package/src/list/TembaMenu.ts +2 -2
- package/src/list/TicketList.ts +1 -1
- package/src/{aliaseditor → live}/AliasEditor.ts +3 -3
- package/src/{contacts → live}/ContactBadges.ts +1 -1
- package/src/{contacts → live}/ContactChat.ts +118 -8
- package/src/{contacts → live}/ContactDetails.ts +1 -1
- package/src/{contacts → live}/ContactFieldEditor.ts +4 -4
- package/src/{contacts → live}/ContactFields.ts +1 -1
- package/src/{contacts → live}/ContactNotepad.ts +1 -1
- package/src/{contacts → live}/ContactPending.ts +1 -1
- package/src/{chart → live}/TembaChart.ts +5 -2
- package/src/locales/es.ts +13 -18
- package/src/locales/fr.ts +13 -18
- package/src/locales/locale-codes.ts +2 -11
- package/src/locales/pt.ts +13 -18
- package/src/store/AppState.ts +75 -29
- package/src/store/Store.ts +1 -1
- package/src/store/flow-definition.d.ts +125 -0
- package/src/{utils/index.ts → utils.ts} +26 -10
- package/src/webchat/WebChat.ts +1 -1
- package/static/css/temba-components.css +1 -0
- package/svg.js +1 -4
- package/temba-components.ts +2 -2
- package/temba-modules.ts +54 -54
- package/temba-webchat.ts +2 -2
- package/test/temba-alert.test.ts +1 -1
- package/test/temba-appstate-language.test.ts +108 -0
- package/test/temba-charcount.test.ts +1 -1
- package/test/temba-chart.test.ts +1 -1
- package/test/temba-checkbox.test.ts +1 -1
- package/test/temba-color-picker.test.ts +1 -1
- package/test/temba-completion.test.ts +1 -1
- package/test/temba-compose.test.ts +1 -1
- package/test/temba-contact-badges.test.ts +1 -1
- package/test/temba-contact-chat.test.ts +6 -4
- package/test/temba-contact-details.test.ts +1 -1
- package/test/temba-contact-fields.test.ts +1 -1
- package/test/temba-contact-search.test.ts +2 -2
- package/test/temba-date.test.ts +8 -3
- package/test/temba-datepicker.test.ts +1 -1
- package/test/temba-dialog.test.ts +1 -1
- package/test/temba-dropdown.test.ts +1 -1
- package/test/temba-excellent-helpers.test.ts +417 -0
- package/test/temba-field-manager.test.ts +2 -2
- package/test/temba-flow-editor-node.test.ts +536 -1
- package/test/temba-flow-editor.test.ts +224 -0
- package/test/temba-flow-editor.test.ts.backup +563 -0
- package/test/temba-flow-plumber-connections.test.ts +142 -0
- package/test/temba-flow-plumber.test.ts +83 -120
- package/test/temba-flow-render.test.ts +787 -4
- package/test/temba-flow-self-routing.test.ts +215 -0
- package/test/temba-formfield.test.ts +1 -1
- package/test/temba-icon.test.ts +1 -1
- package/test/temba-integration-markdown.test.ts +1 -1
- package/test/temba-label.test.ts +1 -1
- package/test/temba-lightbox.test.ts +1 -1
- package/test/temba-markdown.test.ts +162 -0
- package/test/temba-menu.test.ts +1 -1
- package/test/temba-modax.test.ts +2 -2
- package/test/temba-modules.test.ts +56 -0
- package/test/temba-omnibox.test.ts +1 -1
- package/test/temba-options.test.ts +1 -1
- package/test/temba-range-picker.test.ts +17 -2
- package/test/temba-rapid-element.test.ts +341 -0
- package/test/temba-resize-element.test.ts +104 -0
- package/test/temba-select.test.ts +2 -2
- package/test/temba-slider.test.ts +1 -1
- package/test/temba-sticky-note.test.ts +281 -0
- package/test/temba-template-editor.test.ts +1 -1
- package/test/temba-textinput.test.ts +1 -1
- package/test/temba-tip.test.ts +1 -1
- package/test/temba-toast.test.ts +1 -1
- package/test/temba-utils-index.test.ts +1 -1
- package/test/temba-utils-index.test.ts.backup +1737 -0
- package/test/temba-utils-uuid.test.ts +48 -0
- package/test/temba-webchat.test.ts +30 -12
- package/test/utils.test.ts +5 -9
- package/web-dev-server.config.mjs +1 -1
- package/demo/alert/example.html +0 -65
- package/demo/button/example.html +0 -71
- package/demo/chart/horizontal-demo.html +0 -81
- package/demo/checkbox/example.html +0 -72
- package/demo/compose/example.html +0 -72
- package/demo/dropdown/example.html +0 -99
- package/demo/progress/example.html +0 -59
- package/demo/select/drag-and-drop.html +0 -142
- package/demo/select/example.html +0 -82
- package/demo/select/multi.html +0 -73
- package/demo/slider/example.html +0 -59
- package/demo/tabs/example.html +0 -91
- package/demo/textinput/example.html +0 -61
- package/out-tsc/src/FormElement.js.map +0 -1
- package/out-tsc/src/alert/Alert.js.map +0 -1
- package/out-tsc/src/aliaseditor/AliasEditor.js.map +0 -1
- package/out-tsc/src/anchor/Anchor.js.map +0 -1
- package/out-tsc/src/button/Button.js.map +0 -1
- package/out-tsc/src/charcount/CharCount.js.map +0 -1
- package/out-tsc/src/charcount/helpers.js +0 -159
- package/out-tsc/src/charcount/helpers.js.map +0 -1
- package/out-tsc/src/chart/TembaChart.js.map +0 -1
- package/out-tsc/src/chat/Chat.js.map +0 -1
- package/out-tsc/src/checkbox/Checkbox.js.map +0 -1
- package/out-tsc/src/colorpicker/ColorPicker.js.map +0 -1
- package/out-tsc/src/completion/Completion.js.map +0 -1
- package/out-tsc/src/completion/ExcellentParser.js.map +0 -1
- package/out-tsc/src/completion/helpers.js.map +0 -1
- package/out-tsc/src/compose/Compose.js.map +0 -1
- package/out-tsc/src/contacts/ContactBadges.js.map +0 -1
- package/out-tsc/src/contacts/ContactChat.js.map +0 -1
- package/out-tsc/src/contacts/ContactDetails.js.map +0 -1
- package/out-tsc/src/contacts/ContactFieldEditor.js.map +0 -1
- package/out-tsc/src/contacts/ContactFields.js.map +0 -1
- package/out-tsc/src/contacts/ContactName.js.map +0 -1
- package/out-tsc/src/contacts/ContactNameFetch.js.map +0 -1
- package/out-tsc/src/contacts/ContactPending.js.map +0 -1
- package/out-tsc/src/contacts/ContactStoreElement.js.map +0 -1
- package/out-tsc/src/contacts/ContactUrn.js.map +0 -1
- package/out-tsc/src/contacts/events.js +0 -65
- package/out-tsc/src/contacts/events.js.map +0 -1
- package/out-tsc/src/contacts/helpers.js +0 -77
- package/out-tsc/src/contacts/helpers.js.map +0 -1
- package/out-tsc/src/contactsearch/ContactSearch.js.map +0 -1
- package/out-tsc/src/date/TembaDate.js.map +0 -1
- package/out-tsc/src/datepicker/DatePicker.js.map +0 -1
- package/out-tsc/src/datepicker/RangePicker.js.map +0 -1
- package/out-tsc/src/dialog/Dialog.js.map +0 -1
- package/out-tsc/src/dropdown/Dropdown.js.map +0 -1
- package/out-tsc/src/fields/FieldManager.js.map +0 -1
- package/out-tsc/src/formfield/FormField.js.map +0 -1
- package/out-tsc/src/imagepicker/CroppieCSS.js.map +0 -1
- package/out-tsc/src/imagepicker/ImagePicker.js.map +0 -1
- package/out-tsc/src/label/Label.js.map +0 -1
- package/out-tsc/src/leafletmap/LeafletMap.js.map +0 -1
- package/out-tsc/src/leafletmap/helpers.js +0 -17
- package/out-tsc/src/leafletmap/helpers.js.map +0 -1
- package/out-tsc/src/lightbox/Lightbox.js.map +0 -1
- package/out-tsc/src/mask/Mask.js.map +0 -1
- package/out-tsc/src/mediapicker/MediaPicker.js.map +0 -1
- package/out-tsc/src/omnibox/Omnibox.js.map +0 -1
- package/out-tsc/src/options/helpers.js +0 -28
- package/out-tsc/src/options/helpers.js.map +0 -1
- package/out-tsc/src/progress/ProgressBar.js.map +0 -1
- package/out-tsc/src/progress/StartProgress.js.map +0 -1
- package/out-tsc/src/resizer/Resizer.js.map +0 -1
- package/out-tsc/src/select/PopupSelect.js.map +0 -1
- package/out-tsc/src/select/Select.js.map +0 -1
- package/out-tsc/src/select/UserSelect.js.map +0 -1
- package/out-tsc/src/select/WorkspaceSelect.js.map +0 -1
- package/out-tsc/src/select/helpers.js +0 -1
- package/out-tsc/src/select/helpers.js.map +0 -1
- package/out-tsc/src/shadowless/Shadowless.js +0 -33
- package/out-tsc/src/shadowless/Shadowless.js.map +0 -1
- package/out-tsc/src/slider/TembaSlider.js.map +0 -1
- package/out-tsc/src/sms/gsmsplitter.js.map +0 -1
- package/out-tsc/src/sms/gsmvalidator.js.map +0 -1
- package/out-tsc/src/sms/index.js.map +0 -1
- package/out-tsc/src/sms/unicodesplitter.js.map +0 -1
- package/out-tsc/src/tabpane/Tab.js.map +0 -1
- package/out-tsc/src/tabpane/TabPane.js.map +0 -1
- package/out-tsc/src/templates/TemplateEditor.js.map +0 -1
- package/out-tsc/src/textinput/TextInput.js.map +0 -1
- package/out-tsc/src/textinput/helpers.js +0 -12
- package/out-tsc/src/textinput/helpers.js.map +0 -1
- package/out-tsc/src/thumbnail/Thumbnail.js.map +0 -1
- package/out-tsc/src/tip/Tip.js.map +0 -1
- package/out-tsc/src/tip/helpers.js +0 -7
- package/out-tsc/src/tip/helpers.js.map +0 -1
- package/out-tsc/src/toast/Toast.js.map +0 -1
- package/out-tsc/src/user/TembaUser.js.map +0 -1
- package/out-tsc/src/utils/index.js.map +0 -1
- package/out-tsc/src/vectoricon/VectorIcon.js.map +0 -1
- package/out-tsc/src/vectoricon/index.js.map +0 -1
- package/src/charcount/helpers.ts +0 -162
- package/src/contacts/helpers.ts +0 -103
- package/src/leafletmap/helpers.ts +0 -18
- package/src/options/helpers.ts +0 -37
- package/src/select/helpers.ts +0 -0
- package/src/shadowless/Shadowless.ts +0 -32
- package/src/textinput/helpers.ts +0 -11
- package/src/tip/helpers.ts +0 -7
- /package/out-tsc/src/{alert → display}/Alert.js +0 -0
- /package/out-tsc/src/{anchor → display}/Anchor.js +0 -0
- /package/out-tsc/src/{button → display}/Button.js +0 -0
- /package/out-tsc/src/{chat → display}/Chat.js +0 -0
- /package/out-tsc/src/{contacts → display}/ContactName.js +0 -0
- /package/out-tsc/src/{contacts → display}/ContactUrn.js +0 -0
- /package/out-tsc/src/{dropdown → display}/Dropdown.js +0 -0
- /package/out-tsc/src/{label → display}/Label.js +0 -0
- /package/out-tsc/src/{lightbox → display}/Lightbox.js +0 -0
- /package/out-tsc/src/{loading → display}/Loading.js +0 -0
- /package/out-tsc/src/{options → display}/Options.js +0 -0
- /package/out-tsc/src/{progress → display}/ProgressBar.js +0 -0
- /package/out-tsc/src/{date → display}/TembaDate.js +0 -0
- /package/out-tsc/src/{user → display}/TembaUser.js +0 -0
- /package/out-tsc/src/{thumbnail → display}/Thumbnail.js +0 -0
- /package/out-tsc/src/{toast → display}/Toast.js +0 -0
- /package/out-tsc/src/{sms → display/sms}/gsmsplitter.js +0 -0
- /package/out-tsc/src/{sms → display/sms}/gsmvalidator.js +0 -0
- /package/out-tsc/src/{sms → display/sms}/index.js +0 -0
- /package/out-tsc/src/{sms → display/sms}/unicodesplitter.js +0 -0
- /package/out-tsc/src/{completion → excellent}/ExcellentParser.js +0 -0
- /package/out-tsc/src/{completion → excellent}/helpers.js +0 -0
- /package/out-tsc/src/{imagepicker → form}/CroppieCSS.js +0 -0
- /package/out-tsc/src/{formfield → form}/FormField.js +0 -0
- /package/out-tsc/src/{dialog → layout}/Dialog.js +0 -0
- /package/out-tsc/src/{mask → layout}/Mask.js +0 -0
- /package/out-tsc/src/{dialog → layout}/Modax.js +0 -0
- /package/out-tsc/src/{resizer → layout}/Resizer.js +0 -0
- /package/out-tsc/src/{tabpane → layout}/Tab.js +0 -0
- /package/out-tsc/src/{tabpane → layout}/TabPane.js +0 -0
- /package/out-tsc/src/{contacts → live}/ContactFields.js +0 -0
- /package/out-tsc/src/{contacts → live}/ContactNameFetch.js +0 -0
- /package/out-tsc/src/{contacts → live}/ContactStoreElement.js +0 -0
- /package/out-tsc/src/{fields → live}/FieldManager.js +0 -0
- /package/out-tsc/src/{progress → live}/StartProgress.js +0 -0
- /package/src/{vectoricon/index.ts → Icons.ts} +0 -0
- /package/src/{alert → display}/Alert.ts +0 -0
- /package/src/{anchor → display}/Anchor.ts +0 -0
- /package/src/{button → display}/Button.ts +0 -0
- /package/src/{chat → display}/Chat.ts +0 -0
- /package/src/{contacts → display}/ContactName.ts +0 -0
- /package/src/{contacts → display}/ContactUrn.ts +0 -0
- /package/src/{dropdown → display}/Dropdown.ts +0 -0
- /package/src/{label → display}/Label.ts +0 -0
- /package/src/{lightbox → display}/Lightbox.ts +0 -0
- /package/src/{loading → display}/Loading.ts +0 -0
- /package/src/{options → display}/Options.ts +0 -0
- /package/src/{progress → display}/ProgressBar.ts +0 -0
- /package/src/{date → display}/TembaDate.ts +0 -0
- /package/src/{user → display}/TembaUser.ts +0 -0
- /package/src/{toast → display}/Toast.ts +0 -0
- /package/src/{sms → display/sms}/gsmsplitter.ts +0 -0
- /package/src/{sms → display/sms}/gsmvalidator.ts +0 -0
- /package/src/{sms → display/sms}/index.ts +0 -0
- /package/src/{sms → display/sms}/unicodesplitter.ts +0 -0
- /package/src/{completion → excellent}/ExcellentParser.ts +0 -0
- /package/src/{completion → excellent}/helpers.ts +0 -0
- /package/src/{imagepicker → form}/CroppieCSS.ts +0 -0
- /package/src/{formfield → form}/FormField.ts +0 -0
- /package/src/{mask → layout}/Mask.ts +0 -0
- /package/src/{dialog → layout}/Modax.ts +0 -0
- /package/src/{resizer → layout}/Resizer.ts +0 -0
- /package/src/{tabpane → layout}/Tab.ts +0 -0
- /package/src/{tabpane → layout}/TabPane.ts +0 -0
- /package/src/{contacts → live}/ContactNameFetch.ts +0 -0
- /package/src/{contacts → live}/ContactStoreElement.ts +0 -0
- /package/src/{fields → live}/FieldManager.ts +0 -0
- /package/src/{progress → live}/StartProgress.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temba-flow-render.test.js","sourceRoot":"","sources":["../../test/temba-flow-render.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport {\n renderSendMsg,\n renderSetContactName,\n renderSetRunResult,\n renderCallWebhook,\n renderAddToGroups\n} from '../src/flow/render';\nimport {\n Node,\n SendMsg,\n SetContactName,\n SetRunResult,\n CallWebhook,\n AddToGroup\n} from '../src/store/flow-definition.d';\n\ndescribe('Flow Render Functions', () => {\n const mockNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n exits: []\n };\n\n describe('renderSendMsg', () => {\n it('renders message text with line breaks', async () => {\n const action: SendMsg = {\n type: 'send_msg',\n uuid: 'action-uuid-1',\n text: 'Hello world\\nThis is a new line',\n quick_replies: []\n };\n\n const result = renderSendMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain(\n 'Hello world<br>This is a new line'\n );\n });\n\n it('renders quick replies when present', async () => {\n const action: SendMsg = {\n type: 'send_msg',\n uuid: 'action-uuid-2',\n text: 'Choose an option:',\n quick_replies: ['Yes', 'No', 'Maybe']\n };\n\n const result = renderSendMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('Choose an option:');\n expect(container.innerHTML).to.contain('quick-replies');\n expect(container.innerHTML).to.contain('Yes');\n expect(container.innerHTML).to.contain('No');\n expect(container.innerHTML).to.contain('Maybe');\n });\n\n it('renders without quick replies when none provided', async () => {\n const action: SendMsg = {\n type: 'send_msg',\n uuid: 'action-uuid-3',\n text: 'Simple message',\n quick_replies: []\n };\n\n const result = renderSendMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('Simple message');\n expect(container.innerHTML).to.not.contain('quick-replies');\n });\n });\n\n describe('renderSetContactName', () => {\n it('renders contact name setting', async () => {\n const action: SetContactName = {\n type: 'set_contact_name',\n uuid: 'action-uuid-4',\n name: 'John Doe'\n };\n\n const result = renderSetContactName(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Set contact name to');\n expect(container.textContent).to.contain('John Doe');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderSetRunResult', () => {\n it('renders run result setting', async () => {\n const action: SetRunResult = {\n type: 'set_run_result',\n uuid: 'action-uuid-5',\n category: 'success',\n name: 'favorite_color',\n value: 'blue'\n };\n\n const result = renderSetRunResult(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Save blue as');\n expect(container.textContent).to.contain('favorite_color');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderCallWebhook', () => {\n it('renders webhook URL', async () => {\n const action: CallWebhook = {\n type: 'call_webhook',\n uuid: 'action-uuid-6',\n url: 'https://example.com/webhook'\n };\n\n const result = renderCallWebhook(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('https://example.com/webhook');\n expect(container.querySelector('div')).to.have.style(\n 'word-break',\n 'break-all'\n );\n });\n });\n\n describe('renderAddToGroups', () => {\n it('renders groups with icons', async () => {\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-7',\n groups: [\n {\n uuid: 'group1',\n name: 'VIP Customers',\n status: 'active',\n system: false,\n query: '',\n count: 10\n },\n {\n uuid: 'group2',\n name: 'Newsletter Subscribers',\n status: 'active',\n system: false,\n query: '',\n count: 25\n }\n ]\n };\n\n const result = renderAddToGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('VIP Customers');\n expect(container.innerHTML).to.contain('Newsletter Subscribers');\n expect(container.querySelectorAll('temba-icon')).to.have.length(2);\n\n const icons = container.querySelectorAll('temba-icon');\n icons.forEach((icon) => {\n expect(icon.getAttribute('name')).to.equal('group');\n });\n });\n\n it('renders empty groups array', async () => {\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-8',\n groups: []\n };\n\n const result = renderAddToGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.querySelectorAll('temba-icon')).to.have.length(0);\n });\n\n it('renders groups without icons when undefined', async () => {\n // Test the renderNamedObjects function without an icon parameter\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-9',\n groups: [\n {\n uuid: 'group1',\n name: 'Test Group',\n status: 'active',\n system: false,\n query: '',\n count: 5\n }\n ]\n };\n\n // Create a test version that calls renderNamedObjects without icon\n // to cover the null case in the render.ts file\n const namedObjects = action.groups;\n\n // Create a test version that calls renderNamedObjects without icon\n const testRender = (assets: any[]) => {\n return assets.map((asset) => {\n return html`<div style=\"display:flex;items-align:center\">\n ${null /* This should trigger the null branch */}\n <div>${asset.name}</div>\n </div>`;\n });\n };\n\n const result = testRender(namedObjects);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('Test Group');\n expect(container.querySelectorAll('temba-icon')).to.have.length(0);\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"temba-flow-render.test.js","sourceRoot":"","sources":["../../test/temba-flow-render.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport {\n renderAddContactUrn,\n renderAddInputLabels,\n renderAddToGroups,\n renderCallClassifier,\n renderCallLLM,\n renderCallResthook,\n renderCallWebhook,\n renderEnterFlow,\n renderOpenTicket,\n renderPlayAudio,\n renderRemoveFromGroups,\n renderRequestOptin,\n renderSayMsg,\n renderSendBroadcast,\n renderSendEmail,\n renderSendMsg,\n renderSetContactChannel,\n renderSetContactField,\n renderSetContactLanguage,\n renderSetContactName,\n renderSetContactStatus,\n renderSetRunResult,\n renderStartSession,\n renderTransferAirtime,\n renderWaitForAudio,\n renderWaitForDigits,\n renderWaitForImage,\n renderWaitForLocation,\n renderWaitForMenu,\n renderWaitForResponse,\n renderWaitForVideo\n} from '../src/flow/render';\nimport {\n AddContactUrn,\n AddInputLabels,\n AddToGroup,\n CallClassifier,\n CallLLM,\n CallResthook,\n CallWebhook,\n EnterFlow,\n Node,\n OpenTicket,\n PlayAudio,\n RemoveFromGroup,\n RequestOptin,\n SayMsg,\n SendBroadcast,\n SendEmail,\n SendMsg,\n SetContactChannel,\n SetContactField,\n SetContactLanguage,\n SetContactName,\n SetContactStatus,\n SetRunResult,\n StartSession,\n TransferAirtime,\n WaitForAudio,\n WaitForDigits,\n WaitForImage,\n WaitForLocation,\n WaitForMenu,\n WaitForResponse,\n WaitForVideo\n} from '../src/store/flow-definition.d';\n\ndescribe('Flow Render Functions', () => {\n const mockNode: Node = {\n uuid: 'test-node-uuid',\n actions: [],\n exits: []\n };\n\n describe('renderSendMsg', () => {\n it('renders message text with line breaks', async () => {\n const action: SendMsg = {\n type: 'send_msg',\n uuid: 'action-uuid-1',\n text: 'Hello world\\nThis is a new line',\n quick_replies: []\n };\n\n const result = renderSendMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain(\n 'Hello world<br>This is a new line'\n );\n });\n\n it('renders quick replies when present', async () => {\n const action: SendMsg = {\n type: 'send_msg',\n uuid: 'action-uuid-2',\n text: 'Choose an option:',\n quick_replies: ['Yes', 'No', 'Maybe']\n };\n\n const result = renderSendMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('Choose an option:');\n expect(container.innerHTML).to.contain('quick-replies');\n expect(container.innerHTML).to.contain('Yes');\n expect(container.innerHTML).to.contain('No');\n expect(container.innerHTML).to.contain('Maybe');\n });\n\n it('renders without quick replies when none provided', async () => {\n const action: SendMsg = {\n type: 'send_msg',\n uuid: 'action-uuid-3',\n text: 'Simple message',\n quick_replies: []\n };\n\n const result = renderSendMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('Simple message');\n expect(container.innerHTML).to.not.contain('quick-replies');\n });\n });\n\n describe('renderSetContactName', () => {\n it('renders contact name setting', async () => {\n const action: SetContactName = {\n type: 'set_contact_name',\n uuid: 'action-uuid-4',\n name: 'John Doe'\n };\n\n const result = renderSetContactName(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Set contact name to');\n expect(container.textContent).to.contain('John Doe');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderSetRunResult', () => {\n it('renders run result setting', async () => {\n const action: SetRunResult = {\n type: 'set_run_result',\n uuid: 'action-uuid-5',\n category: 'success',\n name: 'favorite_color',\n value: 'blue'\n };\n\n const result = renderSetRunResult(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Save blue as');\n expect(container.textContent).to.contain('favorite_color');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderCallWebhook', () => {\n it('renders webhook URL', async () => {\n const action: CallWebhook = {\n type: 'call_webhook',\n uuid: 'action-uuid-6',\n url: 'https://example.com/webhook'\n };\n\n const result = renderCallWebhook(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('https://example.com/webhook');\n expect(container.querySelector('div')).to.have.style(\n 'word-break',\n 'break-all'\n );\n });\n });\n\n describe('renderAddToGroups', () => {\n it('renders groups with icons', async () => {\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-7',\n groups: [\n {\n uuid: 'group1',\n name: 'VIP Customers',\n status: 'active',\n system: false,\n query: '',\n count: 10\n },\n {\n uuid: 'group2',\n name: 'Newsletter Subscribers',\n status: 'active',\n system: false,\n query: '',\n count: 25\n }\n ]\n };\n\n const result = renderAddToGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('VIP Customers');\n expect(container.innerHTML).to.contain('Newsletter Subscribers');\n expect(container.querySelectorAll('temba-icon')).to.have.length(2);\n\n const icons = container.querySelectorAll('temba-icon');\n icons.forEach((icon) => {\n expect(icon.getAttribute('name')).to.equal('group');\n });\n });\n\n it('renders empty groups array', async () => {\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-8',\n groups: []\n };\n\n const result = renderAddToGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.querySelectorAll('temba-icon')).to.have.length(0);\n });\n\n it('renders groups without icons when undefined', async () => {\n // Test the renderNamedObjects function without an icon parameter\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-9',\n groups: [\n {\n uuid: 'group1',\n name: 'Test Group',\n status: 'active',\n system: false,\n query: '',\n count: 5\n }\n ]\n };\n\n // Create a test version that calls renderNamedObjects without icon\n // to cover the null case in the render.ts file\n const namedObjects = action.groups;\n\n // Create a test version that calls renderNamedObjects without icon\n const testRender = (assets: any[]) => {\n return assets.map((asset) => {\n return html`<div style=\"display:flex;items-align:center\">\n ${null /* This should trigger the null branch */}\n <div>${asset.name}</div>\n </div>`;\n });\n };\n\n const result = testRender(namedObjects);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('Test Group');\n expect(container.querySelectorAll('temba-icon')).to.have.length(0);\n });\n\n it('renders groups with limit - shows +X more for 5+ items', async () => {\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-9b',\n groups: [\n {\n uuid: 'group1',\n name: 'Group 1',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group2',\n name: 'Group 2',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group3',\n name: 'Group 3',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group4',\n name: 'Group 4',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group5',\n name: 'Group 5',\n status: 'active',\n system: false,\n query: '',\n count: 1\n }\n ]\n };\n\n const result = renderAddToGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Group 1');\n expect(container.textContent).to.contain('Group 2');\n expect(container.textContent).to.contain('Group 3');\n expect(container.textContent).to.contain('+2 more');\n expect(container.textContent).to.not.contain('Group 4');\n expect(container.textContent).to.not.contain('Group 5');\n });\n\n it('renders all 4 groups when exactly 4 items', async () => {\n const action: AddToGroup = {\n type: 'add_contact_groups',\n uuid: 'action-uuid-9c',\n groups: [\n {\n uuid: 'group1',\n name: 'Group 1',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group2',\n name: 'Group 2',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group3',\n name: 'Group 3',\n status: 'active',\n system: false,\n query: '',\n count: 1\n },\n {\n uuid: 'group4',\n name: 'Group 4',\n status: 'active',\n system: false,\n query: '',\n count: 1\n }\n ]\n };\n\n const result = renderAddToGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Group 1');\n expect(container.textContent).to.contain('Group 2');\n expect(container.textContent).to.contain('Group 3');\n expect(container.textContent).to.contain('Group 4');\n expect(container.textContent).to.not.contain('+');\n });\n });\n\n describe('renderRemoveFromGroups', () => {\n it('renders groups with icons for removal', async () => {\n const action: RemoveFromGroup = {\n type: 'remove_contact_groups',\n uuid: 'action-uuid-10',\n groups: [\n {\n uuid: 'group1',\n name: 'VIP Customers',\n status: 'active',\n system: false,\n query: '',\n count: 10\n }\n ]\n };\n\n const result = renderRemoveFromGroups(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('VIP Customers');\n expect(container.querySelectorAll('temba-icon')).to.have.length(1);\n const icon = container.querySelector('temba-icon');\n expect(icon?.getAttribute('name')).to.equal('group');\n });\n });\n\n describe('renderSetContactField', () => {\n it('renders contact field setting', async () => {\n const action: SetContactField = {\n type: 'set_contact_field',\n uuid: 'action-uuid-11',\n field: { uuid: 'field1', name: 'Favorite Color' },\n value: 'Blue'\n };\n\n const result = renderSetContactField(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Set');\n expect(container.textContent).to.contain('Favorite Color');\n expect(container.textContent).to.contain('to');\n expect(container.textContent).to.contain('Blue');\n expect(container.querySelectorAll('b')).to.have.length(2);\n });\n });\n\n describe('renderSetContactLanguage', () => {\n it('renders contact language setting', async () => {\n const action: SetContactLanguage = {\n type: 'set_contact_language',\n uuid: 'action-uuid-12',\n language: 'Spanish'\n };\n\n const result = renderSetContactLanguage(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Set contact language to');\n expect(container.textContent).to.contain('Spanish');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderSetContactStatus', () => {\n it('renders contact status setting', async () => {\n const action: SetContactStatus = {\n type: 'set_contact_status',\n uuid: 'action-uuid-13',\n status: 'blocked'\n };\n\n const result = renderSetContactStatus(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Set contact status to');\n expect(container.textContent).to.contain('blocked');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderAddContactUrn', () => {\n it('renders URN addition with friendly scheme names', async () => {\n const action: AddContactUrn = {\n type: 'add_contact_urn',\n uuid: 'action-uuid-14',\n scheme: 'tel',\n path: '+1234567890'\n };\n\n const result = renderAddContactUrn(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Add');\n expect(container.textContent).to.contain('Phone Number');\n expect(container.textContent).to.contain('+1234567890');\n // Only the phone number should be bold, not the scheme\n expect(container.querySelectorAll('b')).to.have.length(1);\n expect(container.querySelector('b')?.textContent).to.equal('+1234567890');\n });\n\n it('renders URN addition with unmapped scheme', async () => {\n const action: AddContactUrn = {\n type: 'add_contact_urn',\n uuid: 'action-uuid-14b',\n scheme: 'unknown',\n path: 'test123'\n };\n\n const result = renderAddContactUrn(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Add');\n expect(container.textContent).to.contain('unknown');\n expect(container.textContent).to.contain('test123');\n // Only the URN path should be bold\n expect(container.querySelectorAll('b')).to.have.length(1);\n expect(container.querySelector('b')?.textContent).to.equal('test123');\n });\n });\n\n describe('renderSendEmail', () => {\n it('renders email with subject and body', async () => {\n const action: SendEmail = {\n type: 'send_email',\n uuid: 'action-uuid-15',\n subject: 'Welcome!',\n body: 'Thanks for signing up',\n addresses: ['user@example.com', 'admin@example.com']\n };\n\n const result = renderSendEmail(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n // No longer expects \"Send email to\" prefix\n expect(container.textContent).to.contain(\n 'user@example.com, admin@example.com'\n );\n expect(container.textContent).to.contain('Welcome!');\n });\n });\n\n describe('renderSendBroadcast', () => {\n it('renders broadcast with groups and contacts', async () => {\n const action: SendBroadcast = {\n type: 'send_broadcast',\n uuid: 'action-uuid-16',\n text: 'Important announcement',\n groups: [\n {\n uuid: 'group1',\n name: 'VIP Customers',\n status: 'active',\n system: false,\n query: '',\n count: 10\n }\n ],\n contacts: [{ uuid: 'contact1', name: 'John Doe' }]\n };\n\n const result = renderSendBroadcast(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Important announcement');\n expect(container.textContent).to.contain('Groups:');\n expect(container.textContent).to.contain('VIP Customers');\n expect(container.textContent).to.contain('Contacts:');\n expect(container.textContent).to.contain('John Doe');\n });\n\n it('renders broadcast with text only', async () => {\n const action: SendBroadcast = {\n type: 'send_broadcast',\n uuid: 'action-uuid-17',\n text: 'Simple broadcast',\n groups: [],\n contacts: []\n };\n\n const result = renderSendBroadcast(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Simple broadcast');\n expect(container.textContent).to.not.contain('Groups:');\n expect(container.textContent).to.not.contain('Contacts:');\n });\n });\n\n describe('renderEnterFlow', () => {\n it('renders flow entry', async () => {\n const action: EnterFlow = {\n type: 'enter_flow',\n uuid: 'action-uuid-18',\n flow: { uuid: 'flow1', name: 'Registration Flow' }\n };\n\n const result = renderEnterFlow(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Enter flow');\n expect(container.textContent).to.contain('Registration Flow');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderStartSession', () => {\n it('renders session start with groups and contacts', async () => {\n const action: StartSession = {\n type: 'start_session',\n uuid: 'action-uuid-19',\n flow: { uuid: 'flow1', name: 'Survey Flow' },\n groups: [\n {\n uuid: 'group1',\n name: 'Subscribers',\n status: 'active',\n system: false,\n query: '',\n count: 50\n }\n ],\n contacts: [{ uuid: 'contact1', name: 'Jane Smith' }]\n };\n\n const result = renderStartSession(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Subscribers');\n expect(container.textContent).to.contain('Jane Smith');\n expect(container.textContent).to.contain('Survey Flow');\n });\n });\n\n describe('renderTransferAirtime', () => {\n it('renders airtime transfer', async () => {\n const action: TransferAirtime = {\n type: 'transfer_airtime',\n uuid: 'action-uuid-20',\n amounts: [100, 200, 500],\n result_name: 'airtime_result'\n };\n\n const result = renderTransferAirtime(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Transfer airtime amounts:');\n expect(container.textContent).to.contain('100, 200, 500');\n expect(container.textContent).to.contain('Save result as');\n expect(container.textContent).to.contain('airtime_result');\n });\n });\n\n describe('renderCallClassifier', () => {\n it('renders classifier call', async () => {\n const action: CallClassifier = {\n type: 'call_classifier',\n uuid: 'action-uuid-21',\n classifier: { uuid: 'classifier1', name: 'Intent Classifier' },\n input: 'User message text',\n result_name: 'intent_result'\n };\n\n const result = renderCallClassifier(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Call classifier');\n expect(container.textContent).to.contain('Intent Classifier');\n expect(container.textContent).to.contain('Input:');\n expect(container.textContent).to.contain('User message text');\n expect(container.textContent).to.contain('Save result as');\n expect(container.textContent).to.contain('intent_result');\n });\n });\n\n describe('renderCallResthook', () => {\n it('renders resthook call', async () => {\n const action: CallResthook = {\n type: 'call_resthook',\n uuid: 'action-uuid-22',\n resthook: 'survey-complete',\n result_name: 'webhook_result'\n };\n\n const result = renderCallResthook(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Call resthook');\n expect(container.textContent).to.contain('survey-complete');\n expect(container.textContent).to.contain('Save result as');\n expect(container.textContent).to.contain('webhook_result');\n });\n });\n\n describe('renderCallLLM', () => {\n it('renders LLM call', async () => {\n const action: CallLLM = {\n type: 'call_llm',\n uuid: 'action-uuid-23',\n llm: { uuid: 'llm1', name: 'GPT-4' },\n instructions: 'Analyze this text',\n result_name: 'ai_result'\n };\n\n const result = renderCallLLM(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n // No longer expects \"Call AI\" prefix\n expect(container.textContent).to.contain('GPT-4');\n expect(container.textContent).to.contain('Analyze this text');\n });\n });\n\n describe('renderOpenTicket', () => {\n it('renders ticket with assignee and topic', async () => {\n const action: OpenTicket = {\n type: 'open_ticket',\n uuid: 'action-uuid-24',\n subject: 'Support Request',\n body: 'Customer needs help',\n assignee: { uuid: 'user1', name: 'Support Agent' },\n topic: { uuid: 'topic1', name: 'Technical Support' }\n };\n\n const result = renderOpenTicket(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n // No longer expects subject\n expect(container.textContent).to.contain('Customer needs help');\n expect(container.textContent).to.contain('Support Agent');\n expect(container.textContent).to.contain('Technical Support');\n expect(container.querySelectorAll('temba-icon')).to.have.length(2);\n });\n\n it('renders ticket without assignee or topic', async () => {\n const action: OpenTicket = {\n type: 'open_ticket',\n uuid: 'action-uuid-25',\n subject: 'Basic Ticket',\n body: 'Simple ticket content'\n };\n\n const result = renderOpenTicket(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n // No longer expects subject\n expect(container.textContent).to.contain('Simple ticket content');\n expect(container.querySelectorAll('temba-icon')).to.have.length(0);\n });\n });\n\n describe('renderRequestOptin', () => {\n it('renders optin request', async () => {\n const action: RequestOptin = {\n type: 'request_optin',\n uuid: 'action-uuid-26',\n optin: { uuid: 'optin1', name: 'Newsletter Subscription' }\n };\n\n const result = renderRequestOptin(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Request opt-in for');\n expect(container.textContent).to.contain('Newsletter Subscription');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderAddInputLabels', () => {\n it('renders input labels', async () => {\n const action: AddInputLabels = {\n type: 'add_input_labels',\n uuid: 'action-uuid-27',\n labels: [\n { uuid: 'label1', name: 'Important' },\n { uuid: 'label2', name: 'Customer Service' }\n ]\n };\n\n const result = renderAddInputLabels(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n // No longer expects \"Add labels to input:\" prefix\n expect(container.textContent).to.contain('Important');\n expect(container.textContent).to.contain('Customer Service');\n expect(container.querySelectorAll('temba-icon')).to.have.length(2);\n });\n });\n\n describe('renderSayMsg', () => {\n it('renders voice message with audio URL', async () => {\n const action: SayMsg = {\n type: 'say_msg',\n uuid: 'action-uuid-28',\n text: 'Welcome to our service',\n audio_url: 'https://example.com/audio.mp3'\n };\n\n const result = renderSayMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Welcome to our service');\n expect(container.innerHTML).to.contain('https://example.com/audio.mp3');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('audio');\n });\n\n it('renders voice message without audio URL', async () => {\n const action: SayMsg = {\n type: 'say_msg',\n uuid: 'action-uuid-29',\n text: 'Text only message'\n };\n\n const result = renderSayMsg(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Text only message');\n expect(container.querySelector('temba-icon')).to.not.exist;\n });\n });\n\n describe('renderPlayAudio', () => {\n it('renders audio playback', async () => {\n const action: PlayAudio = {\n type: 'play_audio',\n uuid: 'action-uuid-30',\n audio_url: 'https://example.com/music.mp3'\n };\n\n const result = renderPlayAudio(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.innerHTML).to.contain('https://example.com/music.mp3');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('audio');\n });\n });\n\n describe('renderSetContactChannel', () => {\n it('renders contact channel setting', async () => {\n const action: SetContactChannel = {\n type: 'set_contact_channel',\n uuid: 'action-uuid-31',\n channel: { uuid: 'channel1', name: 'WhatsApp Channel' }\n };\n\n const result = renderSetContactChannel(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Set contact channel to');\n expect(container.textContent).to.contain('WhatsApp Channel');\n expect(container.querySelector('b')).to.exist;\n });\n });\n\n describe('renderWaitForResponse', () => {\n it('renders wait for response with timeout', async () => {\n const action: WaitForResponse = {\n type: 'wait_for_response',\n uuid: 'action-uuid-32',\n timeout: 300\n };\n\n const result = renderWaitForResponse(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for message response');\n expect(container.textContent).to.contain('Timeout after');\n expect(container.textContent).to.contain('300');\n expect(container.textContent).to.contain('seconds');\n });\n\n it('renders wait for response without timeout', async () => {\n const action: WaitForResponse = {\n type: 'wait_for_response',\n uuid: 'action-uuid-33'\n };\n\n const result = renderWaitForResponse(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for message response');\n expect(container.textContent).to.not.contain('Timeout');\n });\n });\n\n describe('renderWaitForMenu', () => {\n it('renders wait for menu with timeout', async () => {\n const action: WaitForMenu = {\n type: 'wait_for_menu',\n uuid: 'action-uuid-34',\n menu: { uuid: 'menu1', name: 'Main Menu' },\n timeout: 120\n };\n\n const result = renderWaitForMenu(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for menu selection:');\n expect(container.textContent).to.contain('Main Menu');\n expect(container.textContent).to.contain('Timeout after');\n expect(container.textContent).to.contain('120');\n });\n });\n\n describe('renderWaitForDigits', () => {\n it('renders wait for single digit', async () => {\n const action: WaitForDigits = {\n type: 'wait_for_digits',\n uuid: 'action-uuid-35',\n count: 1,\n timeout: 60\n };\n\n const result = renderWaitForDigits(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for');\n expect(container.textContent).to.contain('1');\n expect(container.textContent).to.contain('digit');\n expect(container.textContent).to.not.contain('digits');\n expect(container.textContent).to.contain('Timeout after 60');\n });\n\n it('renders wait for multiple digits', async () => {\n const action: WaitForDigits = {\n type: 'wait_for_digits',\n uuid: 'action-uuid-36',\n count: 4\n };\n\n const result = renderWaitForDigits(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for');\n expect(container.textContent).to.contain('4');\n expect(container.textContent).to.contain('digits');\n expect(container.textContent).to.not.contain('Timeout');\n });\n });\n\n describe('renderWaitForAudio', () => {\n it('renders wait for audio with icon', async () => {\n const action: WaitForAudio = {\n type: 'wait_for_audio',\n uuid: 'action-uuid-37',\n timeout: 180\n };\n\n const result = renderWaitForAudio(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for audio recording');\n expect(container.textContent).to.contain('Timeout after 180');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('audio');\n });\n });\n\n describe('renderWaitForVideo', () => {\n it('renders wait for video with icon', async () => {\n const action: WaitForVideo = {\n type: 'wait_for_video',\n uuid: 'action-uuid-38'\n };\n\n const result = renderWaitForVideo(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for video recording');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('video');\n });\n });\n\n describe('renderWaitForImage', () => {\n it('renders wait for image with icon', async () => {\n const action: WaitForImage = {\n type: 'wait_for_image',\n uuid: 'action-uuid-39',\n timeout: 240\n };\n\n const result = renderWaitForImage(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for image');\n expect(container.textContent).to.contain('Timeout after 240');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('image');\n });\n });\n\n describe('renderWaitForLocation', () => {\n it('renders wait for location with icon', async () => {\n const action: WaitForLocation = {\n type: 'wait_for_location',\n uuid: 'action-uuid-40'\n };\n\n const result = renderWaitForLocation(mockNode, action);\n const container = await fixture(html`<div>${result}</div>`);\n\n expect(container.textContent).to.contain('Wait for location');\n expect(container.querySelector('temba-icon')).to.exist;\n expect(\n container.querySelector('temba-icon')?.getAttribute('name')\n ).to.equal('location');\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { expect, fixture, html } from '@open-wc/testing';
|
|
2
|
+
import { stub, restore, useFakeTimers } from 'sinon';
|
|
3
|
+
import { Editor } from '../src/flow/Editor';
|
|
4
|
+
// Register the component
|
|
5
|
+
customElements.define('temba-flow-editor-test', Editor);
|
|
6
|
+
describe('Flow Editor Self-Routing Prevention', () => {
|
|
7
|
+
let editor;
|
|
8
|
+
let mockDefinition;
|
|
9
|
+
let clock;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
restore();
|
|
12
|
+
// Use fake timers to control any async operations
|
|
13
|
+
clock = useFakeTimers({
|
|
14
|
+
shouldAdvanceTime: true,
|
|
15
|
+
advanceTimeDelta: 10
|
|
16
|
+
});
|
|
17
|
+
// Create a mock flow definition with test nodes and exits
|
|
18
|
+
mockDefinition = {
|
|
19
|
+
uuid: 'test-flow',
|
|
20
|
+
name: 'Test Flow',
|
|
21
|
+
nodes: [
|
|
22
|
+
{
|
|
23
|
+
uuid: 'node-1',
|
|
24
|
+
actions: [],
|
|
25
|
+
exits: [
|
|
26
|
+
{ uuid: 'exit-1a', destination_uuid: undefined },
|
|
27
|
+
{ uuid: 'exit-1b', destination_uuid: 'node-2' }
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
uuid: 'node-2',
|
|
32
|
+
actions: [],
|
|
33
|
+
exits: [{ uuid: 'exit-2a', destination_uuid: undefined }]
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
localization: {},
|
|
37
|
+
language: 'eng',
|
|
38
|
+
type: 'messaging',
|
|
39
|
+
revision: 1,
|
|
40
|
+
spec_version: '13.1.0',
|
|
41
|
+
_ui: {
|
|
42
|
+
nodes: {
|
|
43
|
+
'node-1': { position: { left: 100, top: 100 } },
|
|
44
|
+
'node-2': { position: { left: 300, top: 100 } }
|
|
45
|
+
},
|
|
46
|
+
languages: []
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
afterEach(() => {
|
|
51
|
+
restore();
|
|
52
|
+
if (clock) {
|
|
53
|
+
clock.restore();
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
describe('connection dragging behavior', () => {
|
|
57
|
+
let mockPlumber;
|
|
58
|
+
beforeEach(async () => {
|
|
59
|
+
editor = (await fixture(html `<temba-flow-editor-test></temba-flow-editor-test>`));
|
|
60
|
+
// Wait for element to be fully initialized
|
|
61
|
+
await editor.updateComplete;
|
|
62
|
+
// Mock the plumber
|
|
63
|
+
mockPlumber = {
|
|
64
|
+
connectionDragging: false,
|
|
65
|
+
on: stub(),
|
|
66
|
+
connectIds: stub(),
|
|
67
|
+
repaintEverything: stub()
|
|
68
|
+
};
|
|
69
|
+
// Set up editor state
|
|
70
|
+
editor.plumber = mockPlumber;
|
|
71
|
+
editor.definition = mockDefinition;
|
|
72
|
+
});
|
|
73
|
+
it('prevents connection when targeting same node', () => {
|
|
74
|
+
// Set up connection drag state
|
|
75
|
+
editor.sourceId = 'exit-1a';
|
|
76
|
+
editor.sourceNodeId = 'node-1';
|
|
77
|
+
editor.targetId = 'node-1'; // Same node as source
|
|
78
|
+
editor.isValidTarget = false;
|
|
79
|
+
// Test the validation logic directly without makeConnection
|
|
80
|
+
const shouldConnect = editor.sourceId &&
|
|
81
|
+
editor.targetId &&
|
|
82
|
+
editor.isValidTarget;
|
|
83
|
+
expect(shouldConnect).to.be.false;
|
|
84
|
+
});
|
|
85
|
+
it('allows connection when targeting different node', () => {
|
|
86
|
+
// Set up connection drag state
|
|
87
|
+
editor.sourceId = 'exit-1a';
|
|
88
|
+
editor.sourceNodeId = 'node-1';
|
|
89
|
+
editor.targetId = 'node-2'; // Different node
|
|
90
|
+
editor.isValidTarget = true;
|
|
91
|
+
// Test the validation logic directly without makeConnection
|
|
92
|
+
const shouldConnect = editor.sourceId &&
|
|
93
|
+
editor.targetId &&
|
|
94
|
+
editor.isValidTarget;
|
|
95
|
+
expect(shouldConnect).to.be.true;
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('visual feedback during connection dragging', () => {
|
|
99
|
+
let mockTargetNode;
|
|
100
|
+
beforeEach(async () => {
|
|
101
|
+
editor = (await fixture(html `<temba-flow-editor-test></temba-flow-editor-test>`));
|
|
102
|
+
// Wait for element to be fully initialized
|
|
103
|
+
await editor.updateComplete;
|
|
104
|
+
// Create mock target node
|
|
105
|
+
mockTargetNode = document.createElement('temba-flow-node');
|
|
106
|
+
mockTargetNode.setAttribute('uuid', 'node-2');
|
|
107
|
+
document.body.appendChild(mockTargetNode);
|
|
108
|
+
// Mock querySelector to return our mock node
|
|
109
|
+
stub(document, 'querySelector')
|
|
110
|
+
.withArgs('temba-flow-node:hover')
|
|
111
|
+
.returns(mockTargetNode);
|
|
112
|
+
stub(document, 'querySelectorAll')
|
|
113
|
+
.withArgs('temba-flow-node')
|
|
114
|
+
.returns({
|
|
115
|
+
forEach: (callback) => callback(mockTargetNode)
|
|
116
|
+
});
|
|
117
|
+
// Set up editor state
|
|
118
|
+
editor.plumber = { connectionDragging: true };
|
|
119
|
+
editor.definition = mockDefinition;
|
|
120
|
+
editor.sourceId = 'exit-1a';
|
|
121
|
+
editor.sourceNodeId = 'node-1';
|
|
122
|
+
editor.dragFromNodeId = 'node-1'; // This is the key property used in validation
|
|
123
|
+
});
|
|
124
|
+
afterEach(() => {
|
|
125
|
+
if (document.body.contains(mockTargetNode)) {
|
|
126
|
+
document.body.removeChild(mockTargetNode);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
it('adds valid target class when hovering over different node', async () => {
|
|
130
|
+
// Make sure other properties on the editor are correctly set up
|
|
131
|
+
editor.targetId = 'node-2';
|
|
132
|
+
editor.isValidTarget = true;
|
|
133
|
+
// Simulate mouse move over different node
|
|
134
|
+
editor.handleMouseMove(new MouseEvent('mousemove'));
|
|
135
|
+
await editor.updateComplete;
|
|
136
|
+
// Allow time for DOM updates
|
|
137
|
+
clock.tick(50);
|
|
138
|
+
expect(mockTargetNode.classList.contains('connection-target-valid')).to.be
|
|
139
|
+
.true;
|
|
140
|
+
expect(mockTargetNode.classList.contains('connection-target-invalid')).to
|
|
141
|
+
.be.false;
|
|
142
|
+
});
|
|
143
|
+
it('adds invalid target class when hovering over same node', async () => {
|
|
144
|
+
// Change target to same node as source
|
|
145
|
+
mockTargetNode.setAttribute('uuid', 'node-1');
|
|
146
|
+
// Make sure other properties on the editor are correctly set up
|
|
147
|
+
editor.targetId = 'node-1';
|
|
148
|
+
editor.isValidTarget = false;
|
|
149
|
+
// Simulate mouse move over same node
|
|
150
|
+
editor.handleMouseMove(new MouseEvent('mousemove'));
|
|
151
|
+
await editor.updateComplete;
|
|
152
|
+
// Allow time for DOM updates
|
|
153
|
+
clock.tick(50);
|
|
154
|
+
expect(mockTargetNode.classList.contains('connection-target-invalid')).to
|
|
155
|
+
.be.true;
|
|
156
|
+
expect(mockTargetNode.classList.contains('connection-target-valid')).to.be
|
|
157
|
+
.false;
|
|
158
|
+
});
|
|
159
|
+
it('cleans up visual feedback after connection attempt', async () => {
|
|
160
|
+
// Add classes to simulate active state
|
|
161
|
+
mockTargetNode.classList.add('connection-target-valid');
|
|
162
|
+
// Make connection (which should clean up)
|
|
163
|
+
editor.makeConnection();
|
|
164
|
+
await editor.updateComplete;
|
|
165
|
+
expect(mockTargetNode.classList.contains('connection-target-valid')).to.be
|
|
166
|
+
.false;
|
|
167
|
+
expect(mockTargetNode.classList.contains('connection-target-invalid')).to
|
|
168
|
+
.be.false;
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
//# sourceMappingURL=temba-flow-self-routing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temba-flow-self-routing.test.js","sourceRoot":"","sources":["../../test/temba-flow-self-routing.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, html } from '@open-wc/testing';\nimport { stub, restore, useFakeTimers, SinonFakeTimers } from 'sinon';\nimport { Editor } from '../src/flow/Editor';\nimport { FlowDefinition } from '../src/store/flow-definition';\n\n// Register the component\ncustomElements.define('temba-flow-editor-test', Editor);\n\ndescribe('Flow Editor Self-Routing Prevention', () => {\n let editor: Editor;\n let mockDefinition: FlowDefinition;\n let clock: SinonFakeTimers;\n\n beforeEach(() => {\n restore();\n\n // Use fake timers to control any async operations\n clock = useFakeTimers({\n shouldAdvanceTime: true,\n advanceTimeDelta: 10\n });\n\n // Create a mock flow definition with test nodes and exits\n mockDefinition = {\n uuid: 'test-flow',\n name: 'Test Flow',\n nodes: [\n {\n uuid: 'node-1',\n actions: [],\n exits: [\n { uuid: 'exit-1a', destination_uuid: undefined },\n { uuid: 'exit-1b', destination_uuid: 'node-2' }\n ]\n },\n {\n uuid: 'node-2',\n actions: [],\n exits: [{ uuid: 'exit-2a', destination_uuid: undefined }]\n }\n ],\n localization: {},\n language: 'eng',\n type: 'messaging',\n revision: 1,\n spec_version: '13.1.0',\n _ui: {\n nodes: {\n 'node-1': { position: { left: 100, top: 100 } },\n 'node-2': { position: { left: 300, top: 100 } }\n },\n languages: []\n }\n };\n });\n\n afterEach(() => {\n restore();\n if (clock) {\n clock.restore();\n }\n });\n\n describe('connection dragging behavior', () => {\n let mockPlumber: any;\n\n beforeEach(async () => {\n editor = (await fixture(\n html`<temba-flow-editor-test></temba-flow-editor-test>`\n )) as Editor;\n\n // Wait for element to be fully initialized\n await editor.updateComplete;\n\n // Mock the plumber\n mockPlumber = {\n connectionDragging: false,\n on: stub(),\n connectIds: stub(),\n repaintEverything: stub()\n };\n\n // Set up editor state\n (editor as any).plumber = mockPlumber;\n (editor as any).definition = mockDefinition;\n });\n\n it('prevents connection when targeting same node', () => {\n // Set up connection drag state\n (editor as any).sourceId = 'exit-1a';\n (editor as any).sourceNodeId = 'node-1';\n (editor as any).targetId = 'node-1'; // Same node as source\n (editor as any).isValidTarget = false;\n\n // Test the validation logic directly without makeConnection\n const shouldConnect =\n (editor as any).sourceId &&\n (editor as any).targetId &&\n (editor as any).isValidTarget;\n\n expect(shouldConnect).to.be.false;\n });\n\n it('allows connection when targeting different node', () => {\n // Set up connection drag state\n (editor as any).sourceId = 'exit-1a';\n (editor as any).sourceNodeId = 'node-1';\n (editor as any).targetId = 'node-2'; // Different node\n (editor as any).isValidTarget = true;\n\n // Test the validation logic directly without makeConnection\n const shouldConnect =\n (editor as any).sourceId &&\n (editor as any).targetId &&\n (editor as any).isValidTarget;\n\n expect(shouldConnect).to.be.true;\n });\n });\n\n describe('visual feedback during connection dragging', () => {\n let mockTargetNode: HTMLElement;\n\n beforeEach(async () => {\n editor = (await fixture(\n html`<temba-flow-editor-test></temba-flow-editor-test>`\n )) as Editor;\n\n // Wait for element to be fully initialized\n await editor.updateComplete;\n\n // Create mock target node\n mockTargetNode = document.createElement('temba-flow-node');\n mockTargetNode.setAttribute('uuid', 'node-2');\n document.body.appendChild(mockTargetNode);\n\n // Mock querySelector to return our mock node\n stub(document, 'querySelector')\n .withArgs('temba-flow-node:hover')\n .returns(mockTargetNode);\n stub(document, 'querySelectorAll')\n .withArgs('temba-flow-node')\n .returns({\n forEach: (callback: (node: Element) => void) =>\n callback(mockTargetNode)\n } as any);\n\n // Set up editor state\n (editor as any).plumber = { connectionDragging: true };\n (editor as any).definition = mockDefinition;\n (editor as any).sourceId = 'exit-1a';\n (editor as any).sourceNodeId = 'node-1';\n (editor as any).dragFromNodeId = 'node-1'; // This is the key property used in validation\n });\n\n afterEach(() => {\n if (document.body.contains(mockTargetNode)) {\n document.body.removeChild(mockTargetNode);\n }\n });\n\n it('adds valid target class when hovering over different node', async () => {\n // Make sure other properties on the editor are correctly set up\n (editor as any).targetId = 'node-2';\n (editor as any).isValidTarget = true;\n\n // Simulate mouse move over different node\n (editor as any).handleMouseMove(new MouseEvent('mousemove'));\n await editor.updateComplete;\n\n // Allow time for DOM updates\n clock.tick(50);\n\n expect(mockTargetNode.classList.contains('connection-target-valid')).to.be\n .true;\n expect(mockTargetNode.classList.contains('connection-target-invalid')).to\n .be.false;\n });\n\n it('adds invalid target class when hovering over same node', async () => {\n // Change target to same node as source\n mockTargetNode.setAttribute('uuid', 'node-1');\n\n // Make sure other properties on the editor are correctly set up\n (editor as any).targetId = 'node-1';\n (editor as any).isValidTarget = false;\n\n // Simulate mouse move over same node\n (editor as any).handleMouseMove(new MouseEvent('mousemove'));\n await editor.updateComplete;\n\n // Allow time for DOM updates\n clock.tick(50);\n\n expect(mockTargetNode.classList.contains('connection-target-invalid')).to\n .be.true;\n expect(mockTargetNode.classList.contains('connection-target-valid')).to.be\n .false;\n });\n\n it('cleans up visual feedback after connection attempt', async () => {\n // Add classes to simulate active state\n mockTargetNode.classList.add('connection-target-valid');\n\n // Make connection (which should clean up)\n (editor as any).makeConnection();\n await editor.updateComplete;\n\n expect(mockTargetNode.classList.contains('connection-target-valid')).to.be\n .false;\n expect(mockTargetNode.classList.contains('connection-target-invalid')).to\n .be.false;\n });\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temba-formfield.test.js","sourceRoot":"","sources":["../../test/temba-formfield.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport { FormField } from '../src/
|
|
1
|
+
{"version":3,"file":"temba-formfield.test.js","sourceRoot":"","sources":["../../test/temba-formfield.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,SAAS,GAAc,MAAM,OAAO,CAAC,IAAI,CAAA;;;;kBAIjC,CAAC,4BAA4B,EAAE,uBAAuB,CAAC;;;;KAIpE,CAAC,CAAC;QAEH,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,iCAAiC;QACjC,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC5E,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAClD,4BAA4B,CAC7B,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAClD,uBAAuB,CACxB,CAAC;QAEF,MAAM,gBAAgB,CAAC,6BAA6B,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,SAAS,GAAc,MAAM,OAAO,CAAC,IAAI,CAAA;;;;kBAIjC;YACR,uBAAuB;YACvB,wCAAwC;YACxC,kEAAkE;SACnE;;;;KAIJ,CAAC,CAAC;QAEH,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,iCAAiC;QACjC,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC5E,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzC,oCAAoC;QACpC,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEjD,kCAAkC;QAClC,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzE,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEjD,sDAAsD;QACtD,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,gBAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,kBAAkB,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,gBAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACxC,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAC1C,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAExC,MAAM,gBAAgB,CAAC,2BAA2B,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,SAAS,GAAc,MAAM,OAAO,CAAC,IAAI,CAAA;;;;KAI9C,CAAC,CAAC;QAEH,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,oCAAoC;QACpC,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC5E,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,gBAAgB,CAAC,qBAAqB,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,SAAS,GAAc,MAAM,OAAO,CAAC,IAAI,CAAA;;;kBAGjC,CAAC,wDAAwD,CAAC;;;;KAIvE,CAAC,CAAC;QAEH,MAAM,SAAS,CAAC,cAAc,CAAC;QAE/B,mDAAmD;QACnD,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC5E,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAEnC,MAAM,gBAAgB,CACpB,uCAAuC,EACvC,OAAO,CAAC,SAAS,CAAC,CACnB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport { FormField } from '../src/form/FormField';\nimport { assertScreenshot, getClip } from './utils.test';\n\ndescribe('temba-field', () => {\n it('renders field with plain text errors', async () => {\n const formField: FormField = await fixture(html`\n <temba-field\n label=\"Test Field\"\n name=\"test\"\n .errors=${['This is a plain text error', 'Another error message']}\n >\n <input type=\"text\" />\n </temba-field>\n `);\n\n await formField.updateComplete;\n\n // Check that errors are rendered\n const errorElements = formField.shadowRoot.querySelectorAll('.alert-error');\n expect(errorElements.length).to.equal(2);\n expect(errorElements[0].textContent.trim()).to.equal(\n 'This is a plain text error'\n );\n expect(errorElements[1].textContent.trim()).to.equal(\n 'Another error message'\n );\n\n await assertScreenshot('formfield/plain-text-errors', getClip(formField));\n });\n\n it('renders field with markdown errors', async () => {\n const formField: FormField = await fixture(html`\n <temba-field\n label=\"Test Field\"\n name=\"test\"\n .errors=${[\n 'This is **bold** text',\n 'This has a [link](https://example.com)',\n 'This is *italic* and **bold** with a [link](https://example.com)'\n ]}\n >\n <input type=\"text\" />\n </temba-field>\n `);\n\n await formField.updateComplete;\n\n // Check that errors are rendered\n const errorElements = formField.shadowRoot.querySelectorAll('.alert-error');\n expect(errorElements.length).to.equal(3);\n\n // First error should have bold text\n const firstError = errorElements[0];\n const boldElement = firstError.querySelector('strong');\n expect(boldElement).to.not.be.null;\n expect(boldElement.textContent).to.equal('bold');\n\n // Second error should have a link\n const secondError = errorElements[1];\n const linkElement = secondError.querySelector('a');\n expect(linkElement).to.not.be.null;\n expect(linkElement.getAttribute('href')).to.equal('https://example.com');\n expect(linkElement.textContent).to.equal('link');\n\n // Third error should have both bold, italic, and link\n const thirdError = errorElements[2];\n const thirdBoldElement = thirdError.querySelector('strong');\n const thirdItalicElement = thirdError.querySelector('em');\n const thirdLinkElement = thirdError.querySelector('a');\n expect(thirdBoldElement).to.not.be.null;\n expect(thirdItalicElement).to.not.be.null;\n expect(thirdLinkElement).to.not.be.null;\n\n await assertScreenshot('formfield/markdown-errors', getClip(formField));\n });\n\n it('renders field without errors', async () => {\n const formField: FormField = await fixture(html`\n <temba-field label=\"Test Field\" name=\"test\">\n <input type=\"text\" />\n </temba-field>\n `);\n\n await formField.updateComplete;\n\n // Check that no errors are rendered\n const errorElements = formField.shadowRoot.querySelectorAll('.alert-error');\n expect(errorElements.length).to.equal(0);\n\n await assertScreenshot('formfield/no-errors', getClip(formField));\n });\n\n it('renders in widget-only mode with errors', async () => {\n const formField: FormField = await fixture(html`\n <temba-field\n widget_only\n .errors=${['Widget only **error** with [link](https://example.com)']}\n >\n <input type=\"text\" />\n </temba-field>\n `);\n\n await formField.updateComplete;\n\n // Check that error is rendered in widget-only mode\n const errorElements = formField.shadowRoot.querySelectorAll('.alert-error');\n expect(errorElements.length).to.equal(1);\n\n const errorElement = errorElements[0];\n const boldElement = errorElement.querySelector('strong');\n const linkElement = errorElement.querySelector('a');\n expect(boldElement).to.not.be.null;\n expect(linkElement).to.not.be.null;\n\n await assertScreenshot(\n 'formfield/widget-only-markdown-errors',\n getClip(formField)\n );\n });\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { assert } from '@open-wc/testing';
|
|
2
|
-
import { VectorIcon } from '../src/
|
|
2
|
+
import { VectorIcon } from '../src/display/Icon';
|
|
3
3
|
import { getComponent } from './utils.test';
|
|
4
4
|
const TAG = 'temba-icon';
|
|
5
5
|
const getIcon = async (attrs = {}) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temba-icon.test.js","sourceRoot":"","sources":["../../test/temba-icon.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"temba-icon.test.js","sourceRoot":"","sources":["../../test/temba-icon.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC;AACzB,MAAM,OAAO,GAAG,KAAK,EAAE,QAAa,EAAE,EAAE,EAAE;IACxC,OAAO,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAe,CAAC;AACxD,CAAC,CAAC;AAEF,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE;IACjB,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { assert } from '@open-wc/testing';\nimport { VectorIcon } from '../src/display/Icon';\nimport { getComponent } from './utils.test';\n\nconst TAG = 'temba-icon';\nconst getIcon = async (attrs: any = {}) => {\n return (await getComponent(TAG, attrs)) as VectorIcon;\n};\n\ndescribe(TAG, () => {\n it('can be created', async () => {\n const icon = await getIcon({ name: 'checkmark' });\n assert.instanceOf(icon, VectorIcon);\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temba-integration-markdown.test.js","sourceRoot":"","sources":["../../test/temba-integration-markdown.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,QAAQ,GAAa,MAAM,OAAO,CAAC,IAAI,CAAA;;;kBAG/B;YACR,8EAA8E;YAC9E,kCAAkC;SACnC;;KAEJ,CAAC,CAAC;QAEH,MAAM,QAAQ,CAAC,cAAc,CAAC;QAE9B,+CAA+C;QAC/C,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU;aACtC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aAClC,UAAU,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzC,6CAA6C;QAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEzE,uCAAuC;QACvC,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEvD,MAAM,gBAAgB,CACpB,sCAAsC,EACtC,OAAO,CAAC,QAAQ,CAAC,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport { Checkbox } from '../src/
|
|
1
|
+
{"version":3,"file":"temba-integration-markdown.test.js","sourceRoot":"","sources":["../../test/temba-integration-markdown.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,QAAQ,GAAa,MAAM,OAAO,CAAC,IAAI,CAAA;;;kBAG/B;YACR,8EAA8E;YAC9E,kCAAkC;SACnC;;KAEJ,CAAC,CAAC;QAEH,MAAM,QAAQ,CAAC,cAAc,CAAC;QAE9B,+CAA+C;QAC/C,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU;aACtC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aAClC,UAAU,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzC,6CAA6C;QAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEzE,uCAAuC;QACvC,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEvD,MAAM,gBAAgB,CACpB,sCAAsC,EACtC,OAAO,CAAC,QAAQ,CAAC,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport { Checkbox } from '../src/form/Checkbox';\nimport { assertScreenshot, getClip } from './utils.test';\n\ndescribe('FormElement markdown integration', () => {\n it('renders checkbox with markdown errors', async () => {\n const checkbox: Checkbox = await fixture(html`\n <temba-checkbox\n label=\"Accept Terms\"\n .errors=${[\n 'Please read the **terms and conditions** at [this link](https://example.com)',\n 'This field *requires* acceptance'\n ]}\n ></temba-checkbox>\n `);\n\n await checkbox.updateComplete;\n\n // Check that errors are rendered with markdown\n const errorElements = checkbox.shadowRoot\n .querySelectorAll('temba-field')[0]\n .shadowRoot.querySelectorAll('.alert-error');\n expect(errorElements.length).to.equal(2);\n\n // First error should have bold text and link\n const firstError = errorElements[0];\n const boldElement = firstError.querySelector('strong');\n const linkElement = firstError.querySelector('a');\n expect(boldElement).to.not.be.null;\n expect(boldElement.textContent).to.equal('terms and conditions');\n expect(linkElement).to.not.be.null;\n expect(linkElement.getAttribute('href')).to.equal('https://example.com');\n\n // Second error should have italic text\n const secondError = errorElements[1];\n const italicElement = secondError.querySelector('em');\n expect(italicElement).to.not.be.null;\n expect(italicElement.textContent).to.equal('requires');\n\n await assertScreenshot(\n 'integration/checkbox-markdown-errors',\n getClip(checkbox)\n );\n });\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { assert } from '@open-wc/testing';
|
|
2
|
-
import Label from '../src/
|
|
2
|
+
import Label from '../src/display/Label';
|
|
3
3
|
import { assertScreenshot, getClip, getComponent } from './utils.test';
|
|
4
4
|
const TAG = 'temba-label';
|
|
5
5
|
const getLabel = async (slot, attrs = {}) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temba-label.test.js","sourceRoot":"","sources":["../../test/temba-label.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"temba-label.test.js","sourceRoot":"","sources":["../../test/temba-label.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from '@open-wc/testing';\nimport Label from '../src/display/Label';\nimport { assertScreenshot, getClip, getComponent } from './utils.test';\n\nconst TAG = 'temba-label';\nconst getLabel = async (slot, attrs: any = {}) => {\n return (await getComponent(TAG, attrs, slot)) as Label;\n};\n\ndescribe('temba-label', () => {\n it('renders default', async () => {\n const label: Label = await getLabel('Default');\n assert.instanceOf(label, Label);\n await assertScreenshot('label/no-icon', getClip(label));\n });\n\n it('renders icon', async () => {\n const label: Label = await getLabel('Default', { icon: 'check' });\n await assertScreenshot('label/default-icon', getClip(label));\n });\n\n it('renders shadow', async () => {\n const label: Label = await getLabel('Shadow', {\n icon: 'check',\n shadow: true\n });\n await assertScreenshot('label/shadow', getClip(label));\n });\n\n it('renders primary', async () => {\n const label: Label = await getLabel('Primary', {\n icon: 'check',\n primary: true\n });\n await assertScreenshot('label/primary', getClip(label));\n });\n\n it('renders secondary', async () => {\n const label: Label = await getLabel('Secondary', {\n icon: 'check',\n secondary: true\n });\n await assertScreenshot('label/secondary', getClip(label));\n });\n\n it('renders tertiary', async () => {\n const label: Label = await getLabel('Tertiary', {\n icon: 'check',\n tertiary: true\n });\n await assertScreenshot('label/tertiary', getClip(label));\n });\n\n it('renders dark', async () => {\n const label: Label = await getLabel('Dark', { icon: 'check', dark: true });\n await assertScreenshot('label/dark', getClip(label));\n });\n\n it('renders danger', async () => {\n const label: Label = await getLabel('Danger', {\n icon: 'check',\n danger: true\n });\n await assertScreenshot('label/danger', getClip(label));\n });\n\n it('renders custom', async () => {\n const label: Label = await getLabel('Custom Orange', {\n icon: 'check',\n backgroundColor: 'rgb(240, 176, 29)',\n textColor: '#ffff'\n });\n await assertScreenshot('label/custom', getClip(label));\n });\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fixture, assert } from '@open-wc/testing';
|
|
2
|
-
import { Lightbox } from '../src/
|
|
2
|
+
import { Lightbox } from '../src/display/Lightbox';
|
|
3
3
|
import { assertScreenshot } from './utils.test';
|
|
4
4
|
export const getHTML = () => {
|
|
5
5
|
return `<temba-lightbox animationTime="0"></temba-lightbox>`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temba-lightbox.test.js","sourceRoot":"","sources":["../../test/temba-lightbox.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"temba-lightbox.test.js","sourceRoot":"","sources":["../../test/temba-lightbox.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE;IAC1B,OAAO,qDAAqD,CAAC;AAC/D,CAAC,CAAC;AAEF,kBAAkB;AAElB,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,QAAQ,GAAa,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,yEAAyE,CAC1E,CAAC;QAEF,MAAM,gBAAgB,CAAC,cAAc,EAAE;YACrC,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;YACJ,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;QAEH,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtC,QAAQ,CAAC,WAAW,CAAC,GAAkB,CAAC,CAAC;QAEzC,MAAM,gBAAgB,CAAC,qBAAqB,EAAE;YAC5C,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;YACJ,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { fixture, assert } from '@open-wc/testing';\nimport { Lightbox } from '../src/display/Lightbox';\nimport { assertScreenshot } from './utils.test';\n\nexport const getHTML = () => {\n return `<temba-lightbox animationTime=\"0\"></temba-lightbox>`;\n};\n\n// let clock: any;\n\ndescribe('temba-lightbox', () => {\n it('can be created', async () => {\n const lightbox: Lightbox = await fixture(getHTML());\n const img = await fixture(\n \"<img style='width:100px;height:auto' src='./test-assets/img/meow.jpg'/>\"\n );\n\n await assertScreenshot('lightbox/img', {\n x: 0,\n y: 0,\n width: 1024,\n height: 768\n });\n\n assert.instanceOf(lightbox, Lightbox);\n lightbox.showElement(img as HTMLElement);\n\n await assertScreenshot('lightbox/img-zoomed', {\n x: 0,\n y: 0,\n width: 1024,\n height: 768\n });\n });\n});\n"]}
|