@nyaruka/temba-components 0.86.1 → 0.88.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +3 -3
- package/.prettierrc +6 -0
- package/.storybook/main.js +3 -3
- package/.storybook/preview.js +2 -2
- package/CHANGELOG.md +24 -24
- package/CreateIncludesPlugin.js +2 -2
- package/demo/index.html +1 -0
- package/dist/locales/es.js +1 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fr.js +1 -1
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/pt.js +1 -1
- package/dist/locales/pt.js.map +1 -1
- package/dist/temba-components.js +647 -535
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/RapidElement.js +3 -3
- package/out-tsc/src/RapidElement.js.map +1 -1
- package/out-tsc/src/ResizeElement.js +2 -2
- package/out-tsc/src/ResizeElement.js.map +1 -1
- package/out-tsc/src/aliaseditor/AliasEditor.js +1 -1
- package/out-tsc/src/aliaseditor/AliasEditor.js.map +1 -1
- package/out-tsc/src/button/Button.js +1 -1
- package/out-tsc/src/button/Button.js.map +1 -1
- package/out-tsc/src/charcount/helpers.js +1 -1
- package/out-tsc/src/charcount/helpers.js.map +1 -1
- package/out-tsc/src/colorpicker/ColorPicker.js +4 -4
- package/out-tsc/src/colorpicker/ColorPicker.js.map +1 -1
- package/out-tsc/src/completion/Completion.js +2 -2
- package/out-tsc/src/completion/Completion.js.map +1 -1
- package/out-tsc/src/completion/ExcellentParser.js +1 -1
- package/out-tsc/src/completion/ExcellentParser.js.map +1 -1
- package/out-tsc/src/completion/helpers.js +8 -8
- package/out-tsc/src/completion/helpers.js.map +1 -1
- package/out-tsc/src/compose/Compose.js +14 -14
- package/out-tsc/src/compose/Compose.js.map +1 -1
- package/out-tsc/src/contacts/ContactBadges.js +2 -2
- package/out-tsc/src/contacts/ContactBadges.js.map +1 -1
- package/out-tsc/src/contacts/ContactChat.js +4 -4
- package/out-tsc/src/contacts/ContactChat.js.map +1 -1
- package/out-tsc/src/contacts/ContactDetails.js +4 -4
- package/out-tsc/src/contacts/ContactDetails.js.map +1 -1
- package/out-tsc/src/contacts/ContactFieldEditor.js +3 -3
- package/out-tsc/src/contacts/ContactFieldEditor.js.map +1 -1
- package/out-tsc/src/contacts/ContactFields.js +2 -2
- package/out-tsc/src/contacts/ContactFields.js.map +1 -1
- package/out-tsc/src/contacts/ContactHistory.js +21 -19
- package/out-tsc/src/contacts/ContactHistory.js.map +1 -1
- package/out-tsc/src/contacts/ContactPending.js +4 -4
- package/out-tsc/src/contacts/ContactPending.js.map +1 -1
- package/out-tsc/src/contacts/ContactTickets.js +8 -8
- package/out-tsc/src/contacts/ContactTickets.js.map +1 -1
- package/out-tsc/src/contacts/events.js +2 -2
- package/out-tsc/src/contacts/events.js.map +1 -1
- package/out-tsc/src/contacts/helpers.js +2 -2
- package/out-tsc/src/contacts/helpers.js.map +1 -1
- package/out-tsc/src/contactsearch/ContactSearch.js +7 -7
- package/out-tsc/src/contactsearch/ContactSearch.js.map +1 -1
- package/out-tsc/src/date/TembaDate.js +1 -1
- package/out-tsc/src/date/TembaDate.js.map +1 -1
- package/out-tsc/src/datepicker/DatePicker.js +1 -1
- package/out-tsc/src/datepicker/DatePicker.js.map +1 -1
- package/out-tsc/src/dialog/Dialog.js +5 -5
- package/out-tsc/src/dialog/Dialog.js.map +1 -1
- package/out-tsc/src/dialog/Modax.js +8 -8
- package/out-tsc/src/dialog/Modax.js.map +1 -1
- package/out-tsc/src/dropdown/Dropdown.js +1 -1
- package/out-tsc/src/dropdown/Dropdown.js.map +1 -1
- package/out-tsc/src/fields/FieldManager.js +6 -6
- package/out-tsc/src/fields/FieldManager.js.map +1 -1
- package/out-tsc/src/imagepicker/ImagePicker.js +4 -4
- package/out-tsc/src/imagepicker/ImagePicker.js.map +1 -1
- package/out-tsc/src/interfaces.js.map +1 -1
- package/out-tsc/src/label/Label.js +1 -1
- package/out-tsc/src/label/Label.js.map +1 -1
- package/out-tsc/src/leafletmap/LeafletMap.js +6 -6
- package/out-tsc/src/leafletmap/LeafletMap.js.map +1 -1
- package/out-tsc/src/leafletmap/helpers.js +2 -2
- package/out-tsc/src/leafletmap/helpers.js.map +1 -1
- package/out-tsc/src/lightbox/Lightbox.js +2 -2
- package/out-tsc/src/lightbox/Lightbox.js.map +1 -1
- package/out-tsc/src/list/ContentMenu.js +8 -8
- package/out-tsc/src/list/ContentMenu.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/SortableList.js +6 -6
- package/out-tsc/src/list/SortableList.js.map +1 -1
- package/out-tsc/src/list/TembaList.js +9 -7
- package/out-tsc/src/list/TembaList.js.map +1 -1
- package/out-tsc/src/list/TembaMenu.js +22 -22
- package/out-tsc/src/list/TembaMenu.js.map +1 -1
- package/out-tsc/src/loading/Loading.js +1 -1
- package/out-tsc/src/loading/Loading.js.map +1 -1
- package/out-tsc/src/locales/es.js +1 -1
- package/out-tsc/src/locales/es.js.map +1 -1
- package/out-tsc/src/locales/fr.js +1 -1
- package/out-tsc/src/locales/fr.js.map +1 -1
- package/out-tsc/src/locales/pt.js +1 -1
- package/out-tsc/src/locales/pt.js.map +1 -1
- package/out-tsc/src/omnibox/Omnibox.js +1 -1
- package/out-tsc/src/omnibox/Omnibox.js.map +1 -1
- package/out-tsc/src/options/Options.js +9 -9
- package/out-tsc/src/options/Options.js.map +1 -1
- package/out-tsc/src/remote/Remote.js +1 -1
- package/out-tsc/src/remote/Remote.js.map +1 -1
- package/out-tsc/src/select/Select.js +18 -18
- package/out-tsc/src/select/Select.js.map +1 -1
- package/out-tsc/src/sms/gsmsplitter.js +8 -8
- package/out-tsc/src/sms/gsmsplitter.js.map +1 -1
- package/out-tsc/src/sms/gsmvalidator.js +1 -1
- package/out-tsc/src/sms/gsmvalidator.js.map +1 -1
- package/out-tsc/src/sms/index.js +2 -2
- package/out-tsc/src/sms/index.js.map +1 -1
- package/out-tsc/src/sms/unicodesplitter.js +8 -8
- package/out-tsc/src/sms/unicodesplitter.js.map +1 -1
- package/out-tsc/src/store/Store.js +10 -10
- package/out-tsc/src/store/Store.js.map +1 -1
- package/out-tsc/src/store/StoreElement.js +2 -2
- package/out-tsc/src/store/StoreElement.js.map +1 -1
- package/out-tsc/src/tabpane/TabPane.js +4 -4
- package/out-tsc/src/tabpane/TabPane.js.map +1 -1
- package/out-tsc/src/templates/TemplateEditor.js +9 -9
- package/out-tsc/src/templates/TemplateEditor.js.map +1 -1
- package/out-tsc/src/textinput/TextInput.js +1 -1
- package/out-tsc/src/textinput/TextInput.js.map +1 -1
- package/out-tsc/src/thumbnail/Thumbnail.js +5 -5
- package/out-tsc/src/thumbnail/Thumbnail.js.map +1 -1
- package/out-tsc/src/tip/Tip.js +3 -3
- package/out-tsc/src/tip/Tip.js.map +1 -1
- package/out-tsc/src/toast/Toast.js +199 -0
- package/out-tsc/src/toast/Toast.js.map +1 -0
- package/out-tsc/src/utils/index.js +28 -21
- package/out-tsc/src/utils/index.js.map +1 -1
- package/out-tsc/src/vectoricon/VectorIcon.js +2 -2
- package/out-tsc/src/vectoricon/VectorIcon.js.map +1 -1
- package/out-tsc/src/vectoricon/index.js +1 -0
- package/out-tsc/src/vectoricon/index.js.map +1 -1
- package/out-tsc/src/webchat/WebChat.js +234 -81
- package/out-tsc/src/webchat/WebChat.js.map +1 -1
- package/out-tsc/src/webchat/assets.js +2 -0
- package/out-tsc/src/webchat/assets.js.map +1 -0
- package/out-tsc/src/webchat/index.js.map +1 -1
- package/out-tsc/temba-modules.js +2 -0
- package/out-tsc/temba-modules.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-checkbox.test.js.map +1 -1
- package/out-tsc/test/temba-color-picker.test.js +4 -4
- package/out-tsc/test/temba-color-picker.test.js.map +1 -1
- package/out-tsc/test/temba-compose.test.js +50 -54
- package/out-tsc/test/temba-compose.test.js.map +1 -1
- package/out-tsc/test/temba-contact-badges.test.js +2 -2
- package/out-tsc/test/temba-contact-badges.test.js.map +1 -1
- package/out-tsc/test/temba-contact-chat.test.js +25 -38
- package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
- package/out-tsc/test/temba-contact-details.test.js +2 -2
- package/out-tsc/test/temba-contact-details.test.js.map +1 -1
- package/out-tsc/test/temba-contact-fields.test.js +4 -4
- package/out-tsc/test/temba-contact-fields.test.js.map +1 -1
- package/out-tsc/test/temba-contact-history.test.js +3 -3
- package/out-tsc/test/temba-contact-history.test.js.map +1 -1
- package/out-tsc/test/temba-contact-search.test.js +7 -7
- package/out-tsc/test/temba-contact-search.test.js.map +1 -1
- package/out-tsc/test/temba-contact-tickets.test.js +3 -3
- package/out-tsc/test/temba-contact-tickets.test.js.map +1 -1
- package/out-tsc/test/temba-content-menu.test.js +7 -7
- package/out-tsc/test/temba-content-menu.test.js.map +1 -1
- package/out-tsc/test/temba-date.test.js +3 -3
- 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-field-manager.test.js +1 -3
- package/out-tsc/test/temba-field-manager.test.js.map +1 -1
- package/out-tsc/test/temba-label.test.js +6 -6
- package/out-tsc/test/temba-label.test.js.map +1 -1
- package/out-tsc/test/temba-lightbox.test.js +2 -2
- package/out-tsc/test/temba-lightbox.test.js.map +1 -1
- package/out-tsc/test/temba-list.test.js +6 -6
- package/out-tsc/test/temba-list.test.js.map +1 -1
- package/out-tsc/test/temba-menu.test.js +4 -5
- package/out-tsc/test/temba-menu.test.js.map +1 -1
- package/out-tsc/test/temba-modax.test.js +3 -3
- package/out-tsc/test/temba-modax.test.js.map +1 -1
- package/out-tsc/test/temba-options.test.js +1 -1
- package/out-tsc/test/temba-options.test.js.map +1 -1
- package/out-tsc/test/temba-select.test.js +17 -17
- package/out-tsc/test/temba-select.test.js.map +1 -1
- package/out-tsc/test/temba-sortable-list.test.js +1 -1
- package/out-tsc/test/temba-sortable-list.test.js.map +1 -1
- package/out-tsc/test/temba-textinput.test.js +2 -2
- package/out-tsc/test/temba-textinput.test.js.map +1 -1
- package/out-tsc/test/temba-tip.test.js +4 -4
- package/out-tsc/test/temba-tip.test.js.map +1 -1
- package/out-tsc/test/utils.test.js +8 -8
- package/out-tsc/test/utils.test.js.map +1 -1
- package/package.json +6 -15
- package/src/RapidElement.ts +3 -3
- package/src/ResizeElement.ts +2 -2
- package/src/aliaseditor/AliasEditor.ts +1 -2
- package/src/button/Button.ts +1 -1
- package/src/charcount/helpers.ts +1 -1
- package/src/colorpicker/ColorPicker.ts +4 -4
- package/src/completion/Completion.ts +2 -2
- package/src/completion/ExcellentParser.ts +1 -1
- package/src/completion/helpers.ts +9 -9
- package/src/compose/Compose.ts +18 -16
- package/src/contacts/ContactBadges.ts +2 -2
- package/src/contacts/ContactChat.ts +4 -4
- package/src/contacts/ContactDetails.ts +4 -4
- package/src/contacts/ContactFieldEditor.ts +4 -4
- package/src/contacts/ContactFields.ts +2 -2
- package/src/contacts/ContactHistory.ts +25 -22
- package/src/contacts/ContactPending.ts +4 -4
- package/src/contacts/ContactTickets.ts +9 -9
- package/src/contacts/events.ts +3 -3
- package/src/contacts/helpers.ts +2 -2
- package/src/contactsearch/ContactSearch.ts +9 -9
- package/src/date/TembaDate.ts +1 -1
- package/src/datepicker/DatePicker.ts +1 -1
- package/src/dialog/Dialog.ts +6 -6
- package/src/dialog/Modax.ts +8 -8
- package/src/dropdown/Dropdown.ts +1 -2
- package/src/emojis.json +1882 -1
- package/src/fields/FieldManager.ts +6 -7
- package/src/imagepicker/ImagePicker.ts +4 -4
- package/src/interfaces.ts +4 -4
- package/src/label/Label.ts +1 -1
- package/src/leafletmap/LeafletMap.ts +6 -6
- package/src/leafletmap/helpers.ts +2 -2
- package/src/lightbox/Lightbox.ts +2 -2
- package/src/list/ContentMenu.ts +9 -9
- package/src/list/RunList.ts +1 -1
- package/src/list/SortableList.ts +6 -6
- package/src/list/TembaList.ts +9 -7
- package/src/list/TembaMenu.ts +23 -23
- package/src/loading/Loading.ts +1 -1
- package/src/locales/es.ts +1 -1
- package/src/locales/fr.ts +1 -1
- package/src/locales/pt.ts +1 -1
- package/src/omnibox/Omnibox.ts +2 -2
- package/src/options/Options.ts +9 -9
- package/src/remote/Remote.ts +1 -1
- package/src/select/Select.ts +19 -19
- package/src/sms/gsmsplitter.ts +8 -8
- package/src/sms/gsmvalidator.ts +1 -1
- package/src/sms/index.ts +2 -2
- package/src/sms/unicodesplitter.ts +8 -8
- package/src/store/Store.ts +10 -10
- package/src/store/StoreElement.ts +2 -2
- package/src/tabpane/TabPane.ts +4 -4
- package/src/templates/TemplateEditor.ts +9 -9
- package/src/textinput/TextInput.ts +2 -2
- package/src/thumbnail/Thumbnail.ts +5 -5
- package/src/tip/Tip.ts +3 -3
- package/src/toast/Toast.ts +224 -0
- package/src/utils/index.ts +33 -24
- package/src/vectoricon/VectorIcon.ts +2 -2
- package/src/vectoricon/index.ts +2 -1
- package/src/webchat/WebChat.ts +272 -87
- package/src/webchat/assets.ts +2 -0
- package/src/webchat/index.ts +1 -1
- package/svg.js +28 -29
- package/temba-modules.ts +2 -0
- package/test/temba-alert.test.ts +1 -1
- package/test/temba-checkbox.test.ts +1 -1
- package/test/temba-color-picker.test.ts +4 -4
- package/test/temba-compose.test.ts +50 -55
- package/test/temba-contact-badges.test.ts +2 -2
- package/test/temba-contact-chat.test.ts +26 -46
- package/test/temba-contact-details.test.ts +2 -8
- package/test/temba-contact-fields.test.ts +4 -11
- package/test/temba-contact-history.test.ts +3 -3
- package/test/temba-contact-search.test.ts +7 -13
- package/test/temba-contact-tickets.test.ts +3 -3
- package/test/temba-content-menu.test.ts +7 -7
- package/test/temba-date.test.ts +3 -3
- package/test/temba-datepicker.test.ts +1 -1
- package/test/temba-field-manager.test.ts +1 -4
- package/test/temba-label.test.ts +6 -6
- package/test/temba-lightbox.test.ts +2 -2
- package/test/temba-list.test.ts +6 -6
- package/test/temba-menu.test.ts +4 -5
- package/test/temba-modax.test.ts +3 -3
- package/test/temba-options.test.ts +1 -1
- package/test/temba-select.test.ts +17 -17
- package/test/temba-sortable-list.test.ts +1 -1
- package/test/temba-textinput.test.ts +2 -2
- package/test/temba-tip.test.ts +5 -5
- package/test/utils.test.ts +8 -9
|
@@ -36,7 +36,7 @@ export class Thumbnail extends RapidElement {
|
|
|
36
36
|
}
|
|
37
37
|
`;
|
|
38
38
|
}
|
|
39
|
-
handleClick(
|
|
39
|
+
handleClick() {
|
|
40
40
|
window.setTimeout(() => {
|
|
41
41
|
const lightbox = document.querySelector('temba-lightbox');
|
|
42
42
|
lightbox.showElement(this);
|
|
@@ -50,7 +50,7 @@ export class Thumbnail extends RapidElement {
|
|
|
50
50
|
style=${styleMap({
|
|
51
51
|
background: 'red',
|
|
52
52
|
borderRadius: '0',
|
|
53
|
-
boxShadow: 'var(--widget-box-shadow)'
|
|
53
|
+
boxShadow: 'var(--widget-box-shadow)'
|
|
54
54
|
})}
|
|
55
55
|
>
|
|
56
56
|
<div
|
|
@@ -68,7 +68,7 @@ export class Thumbnail extends RapidElement {
|
|
|
68
68
|
alignItems: 'center',
|
|
69
69
|
justifyContent: 'center',
|
|
70
70
|
fontWeight: '400',
|
|
71
|
-
color: '#bbb'
|
|
71
|
+
color: '#bbb'
|
|
72
72
|
})}
|
|
73
73
|
>
|
|
74
74
|
${this.label}
|
|
@@ -82,7 +82,7 @@ export class Thumbnail extends RapidElement {
|
|
|
82
82
|
padding: 'var(--thumb-padding, 0.4em)',
|
|
83
83
|
background: '#fff',
|
|
84
84
|
borderRadius: 'var(--curvature)',
|
|
85
|
-
boxShadow: 'var(--widget-box-shadow)'
|
|
85
|
+
boxShadow: 'var(--widget-box-shadow)'
|
|
86
86
|
})}">
|
|
87
87
|
|
|
88
88
|
<div class="thumb" style=${styleMap({
|
|
@@ -97,7 +97,7 @@ export class Thumbnail extends RapidElement {
|
|
|
97
97
|
alignItems: 'center',
|
|
98
98
|
justifyContent: 'center',
|
|
99
99
|
fontWeight: '400',
|
|
100
|
-
color: '#bbb'
|
|
100
|
+
color: '#bbb'
|
|
101
101
|
})}>
|
|
102
102
|
${this.label}
|
|
103
103
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Thumbnail.js","sourceRoot":"","sources":["../../../src/thumbnail/Thumbnail.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAE5D,MAAM,OAAO,SAAU,SAAQ,YAAY;IAA3C;;QAmCE,SAAI,GAAG,IAAI,CAAC;QAGZ,YAAO,GAAG,KAAK,CAAC;IAyElB,CAAC;IA9GC,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;KAuBT,CAAC;IACJ,CAAC;IAcM,WAAW
|
|
1
|
+
{"version":3,"file":"Thumbnail.js","sourceRoot":"","sources":["../../../src/thumbnail/Thumbnail.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAE5D,MAAM,OAAO,SAAU,SAAQ,YAAY;IAA3C;;QAmCE,SAAI,GAAG,IAAI,CAAC;QAGZ,YAAO,GAAG,KAAK,CAAC;IAyElB,CAAC;IA9GC,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;KAuBT,CAAC;IACJ,CAAC;IAcM,WAAW;QAChB,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACrB,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAa,CAAC;YACtE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAEM,MAAM;QACX,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;;mBAEE,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;kBAC9B,QAAQ,CAAC;gBACf,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,GAAG;gBACjB,SAAS,EAAE,0BAA0B;aACtC,CAAC;;;;oBAIQ,QAAQ,CAAC;gBACf,eAAe,EAAE,OAAO,IAAI,CAAC,GAAG,GAAG;gBACnC,cAAc,EAAE,SAAS;gBACzB,kBAAkB,EAAE,QAAQ;gBAC5B,gBAAgB,EAAE,WAAW;gBAC7B,SAAS,EAAE,wBAAwB;gBACnC,MAAM,EAAE,wBAAwB;gBAChC,KAAK,EAAE,wBAAwB;gBAC/B,YAAY,EAAE,GAAG;gBAEjB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;gBACxB,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,MAAM;aACd,CAAC;;cAEA,IAAI,CAAC,KAAK;;;OAGjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAA;oBACG,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,WAAW,QAAQ,CAAC;gBAC7D,OAAO,EAAE,6BAA6B;gBACtC,UAAU,EAAE,MAAM;gBAClB,YAAY,EAAE,kBAAkB;gBAChC,SAAS,EAAE,0BAA0B;aACtC,CAAC;;qCAE6B,QAAQ,CAAC;gBAClC,eAAe,EAAE,OAAO,IAAI,CAAC,GAAG,GAAG;gBACnC,cAAc,EAAE,OAAO;gBACvB,kBAAkB,EAAE,QAAQ;gBAC5B,SAAS,EAAE,wBAAwB;gBACnC,MAAM,EAAE,wBAAwB;gBAChC,KAAK,EAAE,wBAAwB;gBAC/B,YAAY,EAAE,kBAAkB;gBAEhC,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;gBACxB,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,MAAM;aACd,CAAC;cACE,IAAI,CAAC,KAAK;;;KAGnB,CAAC;QACF,CAAC;IACH,CAAC;CACF;AAlFC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sCACf;AAGZ;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCACb;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;uCAChB;AAGZ;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;0CACZ","sourcesContent":["import { css, html } from 'lit';\nimport { RapidElement } from '../RapidElement';\nimport { property } from 'lit/decorators.js';\nimport { getClasses } from '../utils';\nimport { Lightbox } from '../lightbox/Lightbox';\nimport { styleMap } from 'lit-html/directives/style-map.js';\n\nexport class Thumbnail extends RapidElement {\n static get styles() {\n return css`\n :host {\n display: inline-block;\n }\n\n .zooming.wrapper {\n padding: 0 !important;\n border-radius: 0;\n }\n\n .zooming .thumb {\n border-radius: 0;\n }\n\n .wrapper {\n padding: var(--thumb-padding, 0.4em);\n background: #fff;\n border-radius: var(--curvature);\n box-shadow: var(--widget-box-shadow);\n }\n\n .thumb {\n }\n `;\n }\n\n @property({ type: String })\n url: string;\n\n @property({ type: String })\n label: string;\n\n @property({ type: Boolean })\n zoom = true;\n\n @property({ type: Boolean })\n zooming = false;\n\n public handleClick() {\n window.setTimeout(() => {\n const lightbox = document.querySelector('temba-lightbox') as Lightbox;\n lightbox.showElement(this);\n }, 0);\n }\n\n public render() {\n if (this.zooming) {\n return html`\n <div\n class=\"${getClasses({ wrapper: true })}\"\n style=${styleMap({\n background: 'red',\n borderRadius: '0',\n boxShadow: 'var(--widget-box-shadow)'\n })}\n >\n <div\n class=\"thumb\"\n style=${styleMap({\n backgroundImage: `url(${this.url})`,\n backgroundSize: 'contain',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n maxHeight: 'var(--thumb-size, 4em)',\n height: 'var(--thumb-size, 4em)',\n width: 'var(--thumb-size, 4em)',\n borderRadius: '0',\n\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: '400',\n color: '#bbb'\n })}\n >\n ${this.label}\n </div>\n </div>\n `;\n } else {\n return html`\n <div class=\"${getClasses({ wrapper: true })}\" style=${styleMap({\n padding: 'var(--thumb-padding, 0.4em)',\n background: '#fff',\n borderRadius: 'var(--curvature)',\n boxShadow: 'var(--widget-box-shadow)'\n })}\">\n\n <div class=\"thumb\" style=${styleMap({\n backgroundImage: `url(${this.url})`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n maxHeight: 'var(--thumb-size, 4em)',\n height: 'var(--thumb-size, 4em)',\n width: 'var(--thumb-size, 4em)',\n borderRadius: 'var(--curvature)',\n\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: '400',\n color: '#bbb'\n })}>\n ${this.label}\n </div>\n </div>\n `;\n }\n }\n}\n"]}
|
package/out-tsc/src/tip/Tip.js
CHANGED
|
@@ -134,11 +134,11 @@ export class Tip extends RapidElement {
|
|
|
134
134
|
render() {
|
|
135
135
|
const tipStyle = {
|
|
136
136
|
top: this.top ? `${this.top}px` : '0px',
|
|
137
|
-
left: this.left ? `${this.left}px` : '0px'
|
|
137
|
+
left: this.left ? `${this.left}px` : '0px'
|
|
138
138
|
};
|
|
139
139
|
const arrowStyle = {
|
|
140
140
|
top: this.arrowTop ? `${this.arrowTop}px` : '0px',
|
|
141
|
-
left: this.arrowLeft ? `${this.arrowLeft}px` : '0px'
|
|
141
|
+
left: this.arrowLeft ? `${this.arrowLeft}px` : '0px'
|
|
142
142
|
};
|
|
143
143
|
if (this.width) {
|
|
144
144
|
tipStyle.width = `${this.width}px`;
|
|
@@ -147,7 +147,7 @@ export class Tip extends RapidElement {
|
|
|
147
147
|
tip: true,
|
|
148
148
|
show: this.visible,
|
|
149
149
|
top: this.poppedTop,
|
|
150
|
-
'hide-on-change': this.hideOnChange
|
|
150
|
+
'hide-on-change': this.hideOnChange
|
|
151
151
|
});
|
|
152
152
|
return html `
|
|
153
153
|
<div
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tip.js","sourceRoot":"","sources":["../../../src/tip/Tip.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { styleMap } from 'lit-html/directives/style-map.js';\nimport { RapidElement } from '../RapidElement';\nimport { getClasses } from '../utils';\nimport { getCenter, getMiddle } from './helpers';\n\nexport class Tip extends RapidElement {\n static get styles() {\n return css`\n .tip {\n transition: opacity 200ms ease-in-out;\n margin: 0px;\n position: fixed;\n opacity: 0;\n background: #fff;\n padding: 4px 8px;\n pointer-events: none;\n border-radius: var(--curvature-widget);\n box-shadow: 0 1px 10px 10px rgba(0, 0, 0, 0.035),\n 0 1px 3px 0px rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n font-size: 14px;\n z-index: 10000;\n color: #333;\n }\n\n .tip.hide-on-change {\n transition: none;\n }\n\n .show {\n opacity: 1;\n }\n\n .slot {\n display: flex;\n flex-direction: column;\n }\n\n .arrow {\n position: absolute;\n color: #fff;\n font-size: 10px;\n line-height: 0px;\n }\n\n .◀ {\n text-shadow: -1px 2px 2px rgba(0, 0, 0, 0.1);\n }\n\n .▶ {\n text-shadow: 1px 2px 2px rgba(0, 0, 0, 0.1);\n }\n\n .▼ {\n text-shadow: 0px 3px 3px rgba(0, 0, 0, 0.1);\n }\n\n .▲ {\n text-shadow: 0px -1px 1px rgba(0, 0, 0, 0.1);\n }\n `;\n }\n\n @property({ type: String })\n text: string;\n\n @property({ type: Boolean })\n visible = false;\n\n @property({ type: String })\n position = 'auto';\n\n @property({ type: Boolean })\n hideOnChange: boolean;\n\n @property({ type: Number, attribute: false })\n top: number;\n\n @property({ type: Number, attribute: false })\n left: number;\n\n @property({ type: Number, attribute: false })\n width: number;\n\n @property({ type: Boolean, attribute: false })\n poppedTop: boolean;\n\n arrow: string;\n arrowTop: number;\n arrowLeft: number;\n arrowDirection: string;\n\n lastEnter = 0;\n failSafe = 0;\n\n public updated(changed: Map<string, any>) {\n if ((changed.has('visible') || changed.has('text')) && this.visible) {\n this.calculatePosition();\n }\n\n if (changed.has('text') && this.hideOnChange) {\n this.visible = false;\n }\n }\n\n private calculatePosition() {\n if (this.visible) {\n const tipBounds = this.getDiv('.tip').getBoundingClientRect();\n const anchorBounds = this.getDiv('.slot').getBoundingClientRect();\n\n // TODO: pick a direction automatically\n let tipSide = this.position;\n if (tipSide === 'auto') {\n tipSide = 'left';\n }\n\n this.arrowLeft = 0;\n this.arrowTop = 0;\n\n if (tipSide === 'left') {\n this.left = anchorBounds.left - tipBounds.width - 16;\n this.top = getMiddle(anchorBounds, tipBounds);\n\n // position our arrow\n this.arrowTop = tipBounds.height / 2;\n this.arrowLeft = tipBounds.width - 1;\n this.arrow = '▶';\n } else if (tipSide === 'right') {\n this.left = anchorBounds.right + 12;\n this.top = getMiddle(anchorBounds, tipBounds);\n\n this.arrowTop = tipBounds.height / 2;\n this.arrowLeft = -8;\n this.arrow = '◀';\n } else if (tipSide === 'top') {\n this.top = anchorBounds.top - tipBounds.height - 12;\n this.left = getCenter(anchorBounds, tipBounds);\n\n this.arrowTop = tipBounds.height + 2;\n this.arrowLeft = tipBounds.width / 2 - 4;\n this.arrow = '▼';\n } else if (tipSide === 'bottom') {\n this.top = anchorBounds.bottom + 10;\n this.left = getCenter(anchorBounds, tipBounds);\n\n this.arrowTop = -2;\n this.arrowLeft = tipBounds.width / 2 - 3;\n this.arrow = '▲';\n }\n }\n }\n\n private handleMouseEnter() {\n this.lastEnter = window.setTimeout(() => {\n this.visible = true;\n this.failSafe = window.setTimeout(() => {\n this.visible = false;\n }, 2000);\n }, 600);\n }\n\n private handleMouseLeave() {\n window.clearTimeout(this.lastEnter);\n window.clearTimeout(this.failSafe);\n this.visible = false;\n }\n\n public render(): TemplateResult {\n const tipStyle: any = {\n top: this.top ? `${this.top}px` : '0px',\n left: this.left ? `${this.left}px` : '0px'
|
|
1
|
+
{"version":3,"file":"Tip.js","sourceRoot":"","sources":["../../../src/tip/Tip.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { styleMap } from 'lit-html/directives/style-map.js';\nimport { RapidElement } from '../RapidElement';\nimport { getClasses } from '../utils';\nimport { getCenter, getMiddle } from './helpers';\n\nexport class Tip extends RapidElement {\n static get styles() {\n return css`\n .tip {\n transition: opacity 200ms ease-in-out;\n margin: 0px;\n position: fixed;\n opacity: 0;\n background: #fff;\n padding: 4px 8px;\n pointer-events: none;\n border-radius: var(--curvature-widget);\n box-shadow: 0 1px 10px 10px rgba(0, 0, 0, 0.035),\n 0 1px 3px 0px rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n font-size: 14px;\n z-index: 10000;\n color: #333;\n }\n\n .tip.hide-on-change {\n transition: none;\n }\n\n .show {\n opacity: 1;\n }\n\n .slot {\n display: flex;\n flex-direction: column;\n }\n\n .arrow {\n position: absolute;\n color: #fff;\n font-size: 10px;\n line-height: 0px;\n }\n\n .◀ {\n text-shadow: -1px 2px 2px rgba(0, 0, 0, 0.1);\n }\n\n .▶ {\n text-shadow: 1px 2px 2px rgba(0, 0, 0, 0.1);\n }\n\n .▼ {\n text-shadow: 0px 3px 3px rgba(0, 0, 0, 0.1);\n }\n\n .▲ {\n text-shadow: 0px -1px 1px rgba(0, 0, 0, 0.1);\n }\n `;\n }\n\n @property({ type: String })\n text: string;\n\n @property({ type: Boolean })\n visible = false;\n\n @property({ type: String })\n position = 'auto';\n\n @property({ type: Boolean })\n hideOnChange: boolean;\n\n @property({ type: Number, attribute: false })\n top: number;\n\n @property({ type: Number, attribute: false })\n left: number;\n\n @property({ type: Number, attribute: false })\n width: number;\n\n @property({ type: Boolean, attribute: false })\n poppedTop: boolean;\n\n arrow: string;\n arrowTop: number;\n arrowLeft: number;\n arrowDirection: string;\n\n lastEnter = 0;\n failSafe = 0;\n\n public updated(changed: Map<string, any>) {\n if ((changed.has('visible') || changed.has('text')) && this.visible) {\n this.calculatePosition();\n }\n\n if (changed.has('text') && this.hideOnChange) {\n this.visible = false;\n }\n }\n\n private calculatePosition() {\n if (this.visible) {\n const tipBounds = this.getDiv('.tip').getBoundingClientRect();\n const anchorBounds = this.getDiv('.slot').getBoundingClientRect();\n\n // TODO: pick a direction automatically\n let tipSide = this.position;\n if (tipSide === 'auto') {\n tipSide = 'left';\n }\n\n this.arrowLeft = 0;\n this.arrowTop = 0;\n\n if (tipSide === 'left') {\n this.left = anchorBounds.left - tipBounds.width - 16;\n this.top = getMiddle(anchorBounds, tipBounds);\n\n // position our arrow\n this.arrowTop = tipBounds.height / 2;\n this.arrowLeft = tipBounds.width - 1;\n this.arrow = '▶';\n } else if (tipSide === 'right') {\n this.left = anchorBounds.right + 12;\n this.top = getMiddle(anchorBounds, tipBounds);\n\n this.arrowTop = tipBounds.height / 2;\n this.arrowLeft = -8;\n this.arrow = '◀';\n } else if (tipSide === 'top') {\n this.top = anchorBounds.top - tipBounds.height - 12;\n this.left = getCenter(anchorBounds, tipBounds);\n\n this.arrowTop = tipBounds.height + 2;\n this.arrowLeft = tipBounds.width / 2 - 4;\n this.arrow = '▼';\n } else if (tipSide === 'bottom') {\n this.top = anchorBounds.bottom + 10;\n this.left = getCenter(anchorBounds, tipBounds);\n\n this.arrowTop = -2;\n this.arrowLeft = tipBounds.width / 2 - 3;\n this.arrow = '▲';\n }\n }\n }\n\n private handleMouseEnter() {\n this.lastEnter = window.setTimeout(() => {\n this.visible = true;\n this.failSafe = window.setTimeout(() => {\n this.visible = false;\n }, 2000);\n }, 600);\n }\n\n private handleMouseLeave() {\n window.clearTimeout(this.lastEnter);\n window.clearTimeout(this.failSafe);\n this.visible = false;\n }\n\n public render(): TemplateResult {\n const tipStyle: any = {\n top: this.top ? `${this.top}px` : '0px',\n left: this.left ? `${this.left}px` : '0px'\n };\n\n const arrowStyle: any = {\n top: this.arrowTop ? `${this.arrowTop}px` : '0px',\n left: this.arrowLeft ? `${this.arrowLeft}px` : '0px'\n };\n\n if (this.width) {\n tipStyle.width = `${this.width}px`;\n }\n\n const classes = getClasses({\n tip: true,\n show: this.visible,\n top: this.poppedTop,\n 'hide-on-change': this.hideOnChange\n });\n\n return html`\n <div\n class=\"slot\"\n @click=${this.handleMouseLeave}\n @mouseenter=${this.handleMouseEnter}\n @mouseleave=${this.handleMouseLeave}\n >\n <slot></slot>\n </div>\n <div class=\"${classes}\" style=${styleMap(tipStyle)}>\n ${this.text}\n <div class=\"arrow ${this.arrow}\" style=${styleMap(arrowStyle)}>\n ${this.arrow}\n </div>\n </div>\n `;\n }\n}\n"]}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { css, html } from 'lit';
|
|
3
|
+
import { RapidElement } from '../RapidElement';
|
|
4
|
+
import { property } from 'lit/decorators.js';
|
|
5
|
+
import { repeat } from 'lit/directives/repeat.js';
|
|
6
|
+
export class Toast extends RapidElement {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(...arguments);
|
|
9
|
+
this.messages = [];
|
|
10
|
+
this.staleDuration = 5000;
|
|
11
|
+
this.animationDuration = 200;
|
|
12
|
+
this.errorSticky = false;
|
|
13
|
+
this.warningSticky = false;
|
|
14
|
+
this.infoSticky = false;
|
|
15
|
+
this.messageId = 0;
|
|
16
|
+
}
|
|
17
|
+
checkForStaleMessages() {
|
|
18
|
+
const now = new Date();
|
|
19
|
+
// ignore sticky messages
|
|
20
|
+
const staleMessages = this.messages.filter((message) => {
|
|
21
|
+
if (message.level === 'error' && this.errorSticky) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (message.level === 'warning' && this.warningSticky) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (message.level === 'info' && this.infoSticky) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
});
|
|
32
|
+
staleMessages.forEach((message) => {
|
|
33
|
+
// error messages do not remove themselves
|
|
34
|
+
if (now.getTime() - message.time.getTime() > this.staleDuration) {
|
|
35
|
+
this.removeMessage(message);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
if (this.messages.length === 0 && this.checker) {
|
|
39
|
+
window.clearInterval(this.checker);
|
|
40
|
+
this.checker = 0;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
addMessages(messages) {
|
|
44
|
+
messages.forEach((message) => {
|
|
45
|
+
this.addMessage(message.text, message.level);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
addMessage(text, level) {
|
|
49
|
+
const message = {
|
|
50
|
+
id: ++this.messageId,
|
|
51
|
+
text,
|
|
52
|
+
level,
|
|
53
|
+
time: new Date()
|
|
54
|
+
};
|
|
55
|
+
this.messages.push(message);
|
|
56
|
+
window.setTimeout(() => {
|
|
57
|
+
message.visible = true;
|
|
58
|
+
this.requestUpdate('messages');
|
|
59
|
+
}, 100);
|
|
60
|
+
this.requestUpdate('messages');
|
|
61
|
+
if (this.checker) {
|
|
62
|
+
window.clearInterval(this.checker);
|
|
63
|
+
this.checker = 0;
|
|
64
|
+
}
|
|
65
|
+
this.checker = window.setInterval(this.checkForStaleMessages.bind(this), 1000);
|
|
66
|
+
}
|
|
67
|
+
info(message) {
|
|
68
|
+
this.addMessage(message, 'info');
|
|
69
|
+
}
|
|
70
|
+
warning(message) {
|
|
71
|
+
this.addMessage(message, 'warning');
|
|
72
|
+
}
|
|
73
|
+
error(message) {
|
|
74
|
+
this.addMessage(message, 'error');
|
|
75
|
+
}
|
|
76
|
+
removeMessage(message) {
|
|
77
|
+
message.removeTime = new Date();
|
|
78
|
+
window.setTimeout(() => {
|
|
79
|
+
this.messages = this.messages.filter((m) => m !== message);
|
|
80
|
+
this.requestUpdate('messages');
|
|
81
|
+
}, this.animationDuration);
|
|
82
|
+
this.requestUpdate('messages');
|
|
83
|
+
}
|
|
84
|
+
handleMessageClicked(e) {
|
|
85
|
+
const ele = e.target;
|
|
86
|
+
const id = parseInt(ele.getAttribute('message_id'));
|
|
87
|
+
const message = this.messages.find((m) => m.id === id);
|
|
88
|
+
if (message) {
|
|
89
|
+
this.removeMessage(message);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
render() {
|
|
93
|
+
return html `
|
|
94
|
+
${repeat(this.messages, (message) => message.id, (message) => html `
|
|
95
|
+
<div
|
|
96
|
+
style="transition-duration: ${this.animationDuration}ms"
|
|
97
|
+
class="message ${message.level} ${message.visible
|
|
98
|
+
? 'visible'
|
|
99
|
+
: ''} ${message.removeTime ? 'removing' : ''}"
|
|
100
|
+
>
|
|
101
|
+
<div class="text">${message.text}</div>
|
|
102
|
+
<temba-icon
|
|
103
|
+
name="close"
|
|
104
|
+
size="1.3"
|
|
105
|
+
message_id="${message.id}"
|
|
106
|
+
@click=${this.handleMessageClicked}
|
|
107
|
+
></temba-icon>
|
|
108
|
+
</div>
|
|
109
|
+
`)}
|
|
110
|
+
`;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
Toast.styles = css `
|
|
114
|
+
:host {
|
|
115
|
+
position: fixed;
|
|
116
|
+
width: 400px;
|
|
117
|
+
z-index: 10000;
|
|
118
|
+
right: 0;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.message {
|
|
122
|
+
background-color: rgba(50, 50, 50, 0.85);
|
|
123
|
+
background-color: rgba(255, 255, 255, 0.97);
|
|
124
|
+
color: rgba(0, 0, 0, 0.85);
|
|
125
|
+
padding: 0.5em 1em;
|
|
126
|
+
margin: 0.75em;
|
|
127
|
+
border-radius: 0.5em;
|
|
128
|
+
display: flex;
|
|
129
|
+
transition-property: transform, opacity;
|
|
130
|
+
transition-timing-function: ease-in-out;
|
|
131
|
+
transform: translateY(-100%);
|
|
132
|
+
opacity: 0;
|
|
133
|
+
box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 3em 2px;
|
|
134
|
+
border: 2px solid rgba(0, 0, 0, 0.3);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.message.visible {
|
|
138
|
+
transform: translateY(0);
|
|
139
|
+
opacity: 1;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.message.info {
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.message.warning {
|
|
146
|
+
color: rgba(255, 167, 0, 0.9);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.message.error {
|
|
150
|
+
border-color: var(--color-error);
|
|
151
|
+
color: var(--color-error);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.message.removing {
|
|
155
|
+
opacity: 0;
|
|
156
|
+
transform: translateY(-100%);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
temba-icon {
|
|
160
|
+
cursor: pointer;
|
|
161
|
+
padding-left: 1em;
|
|
162
|
+
opacity: 0;
|
|
163
|
+
transition: all 200ms ease-in-out;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.message:hover temba-icon {
|
|
167
|
+
opacity: 1;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
temba-icon:hover {
|
|
171
|
+
transform: scale(1.3) translateX(-0.1em);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.message .text {
|
|
175
|
+
flex-grow: 1;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.info {
|
|
179
|
+
}
|
|
180
|
+
`;
|
|
181
|
+
__decorate([
|
|
182
|
+
property({ type: Array })
|
|
183
|
+
], Toast.prototype, "messages", void 0);
|
|
184
|
+
__decorate([
|
|
185
|
+
property({ type: Number, attribute: 'duration' })
|
|
186
|
+
], Toast.prototype, "staleDuration", void 0);
|
|
187
|
+
__decorate([
|
|
188
|
+
property({ type: Number, attribute: 'animation' })
|
|
189
|
+
], Toast.prototype, "animationDuration", void 0);
|
|
190
|
+
__decorate([
|
|
191
|
+
property({ type: Boolean, attribute: 'error-sticky' })
|
|
192
|
+
], Toast.prototype, "errorSticky", void 0);
|
|
193
|
+
__decorate([
|
|
194
|
+
property({ type: Boolean, attribute: 'warning-sticky' })
|
|
195
|
+
], Toast.prototype, "warningSticky", void 0);
|
|
196
|
+
__decorate([
|
|
197
|
+
property({ type: Boolean, attribute: 'info-sticky' })
|
|
198
|
+
], Toast.prototype, "infoSticky", void 0);
|
|
199
|
+
//# sourceMappingURL=Toast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../../src/toast/Toast.ts"],"names":[],"mappings":"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","sourcesContent":["import { TemplateResult, css, html } from 'lit';\nimport { RapidElement } from '../RapidElement';\nimport { property } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\n\ninterface ToastMessage {\n id: number;\n text: string;\n level: 'info' | 'warning' | 'error';\n visible?: boolean;\n time: Date;\n removeTime?: Date;\n}\n\nexport class Toast extends RapidElement {\n @property({ type: Array })\n messages: ToastMessage[] = [];\n\n @property({ type: Number, attribute: 'duration' })\n staleDuration = 5000;\n\n @property({ type: Number, attribute: 'animation' })\n animationDuration = 200;\n\n @property({ type: Boolean, attribute: 'error-sticky' })\n errorSticky = false;\n\n @property({ type: Boolean, attribute: 'warning-sticky' })\n warningSticky = false;\n\n @property({ type: Boolean, attribute: 'info-sticky' })\n infoSticky = false;\n\n static styles = css`\n :host {\n position: fixed;\n width: 400px;\n z-index: 10000;\n right: 0;\n }\n\n .message {\n background-color: rgba(50, 50, 50, 0.85);\n background-color: rgba(255, 255, 255, 0.97);\n color: rgba(0, 0, 0, 0.85);\n padding: 0.5em 1em;\n margin: 0.75em;\n border-radius: 0.5em;\n display: flex;\n transition-property: transform, opacity;\n transition-timing-function: ease-in-out;\n transform: translateY(-100%);\n opacity: 0;\n box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 3em 2px;\n border: 2px solid rgba(0, 0, 0, 0.3);\n }\n\n .message.visible {\n transform: translateY(0);\n opacity: 1;\n }\n\n .message.info {\n }\n\n .message.warning {\n color: rgba(255, 167, 0, 0.9);\n }\n\n .message.error {\n border-color: var(--color-error);\n color: var(--color-error);\n }\n\n .message.removing {\n opacity: 0;\n transform: translateY(-100%);\n }\n\n temba-icon {\n cursor: pointer;\n padding-left: 1em;\n opacity: 0;\n transition: all 200ms ease-in-out;\n }\n\n .message:hover temba-icon {\n opacity: 1;\n }\n\n temba-icon:hover {\n transform: scale(1.3) translateX(-0.1em);\n }\n\n .message .text {\n flex-grow: 1;\n }\n\n .info {\n }\n `;\n\n public checkForStaleMessages() {\n const now = new Date();\n\n // ignore sticky messages\n const staleMessages = this.messages.filter((message) => {\n if (message.level === 'error' && this.errorSticky) {\n return false;\n }\n if (message.level === 'warning' && this.warningSticky) {\n return false;\n }\n if (message.level === 'info' && this.infoSticky) {\n return false;\n }\n return true;\n });\n\n staleMessages.forEach((message) => {\n // error messages do not remove themselves\n if (now.getTime() - message.time.getTime() > this.staleDuration) {\n this.removeMessage(message);\n }\n });\n\n if (this.messages.length === 0 && this.checker) {\n window.clearInterval(this.checker);\n this.checker = 0;\n }\n }\n\n private checker: number;\n private messageId: number = 0;\n\n public addMessages(messages: ToastMessage[]) {\n messages.forEach((message) => {\n this.addMessage(message.text, message.level);\n });\n }\n\n public addMessage(text: string, level: 'info' | 'warning' | 'error') {\n const message: ToastMessage = {\n id: ++this.messageId,\n text,\n level,\n time: new Date()\n };\n this.messages.push(message);\n\n window.setTimeout(() => {\n message.visible = true;\n this.requestUpdate('messages');\n }, 100);\n\n this.requestUpdate('messages');\n\n if (this.checker) {\n window.clearInterval(this.checker);\n this.checker = 0;\n }\n\n this.checker = window.setInterval(\n this.checkForStaleMessages.bind(this),\n 1000\n );\n }\n\n public info(message: string) {\n this.addMessage(message, 'info');\n }\n\n public warning(message: string) {\n this.addMessage(message, 'warning');\n }\n\n public error(message: string) {\n this.addMessage(message, 'error');\n }\n\n public removeMessage(message: ToastMessage) {\n message.removeTime = new Date();\n window.setTimeout(() => {\n this.messages = this.messages.filter((m) => m !== message);\n this.requestUpdate('messages');\n }, this.animationDuration);\n\n this.requestUpdate('messages');\n }\n\n private handleMessageClicked(e: MouseEvent) {\n const ele = e.target as HTMLElement;\n const id = parseInt(ele.getAttribute('message_id'));\n const message = this.messages.find((m) => m.id === id);\n if (message) {\n this.removeMessage(message);\n }\n }\n\n public render(): TemplateResult {\n return html`\n ${repeat(\n this.messages,\n (message) => message.id,\n (message) => html`\n <div\n style=\"transition-duration: ${this.animationDuration}ms\"\n class=\"message ${message.level} ${message.visible\n ? 'visible'\n : ''} ${message.removeTime ? 'removing' : ''}\"\n >\n <div class=\"text\">${message.text}</div>\n <temba-icon\n name=\"close\"\n size=\"1.3\"\n message_id=\"${message.id}\"\n @click=${this.handleMessageClicked}\n ></temba-icon>\n </div>\n `\n )}\n `;\n }\n}\n"]}
|
|
@@ -42,7 +42,7 @@ export const getHeaders = (headers = {}) => {
|
|
|
42
42
|
const fetchHeaders = csrf ? { 'X-CSRFToken': csrf } : {};
|
|
43
43
|
// mark us as ajax
|
|
44
44
|
fetchHeaders['X-Requested-With'] = 'XMLHttpRequest';
|
|
45
|
-
Object.keys(headers).forEach(key => {
|
|
45
|
+
Object.keys(headers).forEach((key) => {
|
|
46
46
|
fetchHeaders[key] = headers[key];
|
|
47
47
|
});
|
|
48
48
|
return fetchHeaders;
|
|
@@ -51,13 +51,13 @@ export const getUrl = (url, controller = null, headers = {}) => {
|
|
|
51
51
|
return new Promise((resolve, reject) => {
|
|
52
52
|
const options = {
|
|
53
53
|
method: 'GET',
|
|
54
|
-
headers: getHeaders(headers)
|
|
54
|
+
headers: getHeaders(headers)
|
|
55
55
|
};
|
|
56
56
|
if (controller) {
|
|
57
57
|
options['signal'] = controller.signal;
|
|
58
58
|
}
|
|
59
59
|
fetch(url, options)
|
|
60
|
-
.then(response => {
|
|
60
|
+
.then((response) => {
|
|
61
61
|
response.text().then((body) => {
|
|
62
62
|
let json = {};
|
|
63
63
|
try {
|
|
@@ -71,11 +71,11 @@ export const getUrl = (url, controller = null, headers = {}) => {
|
|
|
71
71
|
json,
|
|
72
72
|
url: response.url,
|
|
73
73
|
headers: response.headers,
|
|
74
|
-
status: response.status
|
|
74
|
+
status: response.status
|
|
75
75
|
});
|
|
76
76
|
});
|
|
77
77
|
})
|
|
78
|
-
.catch(error => {
|
|
78
|
+
.catch((error) => {
|
|
79
79
|
reject(error);
|
|
80
80
|
});
|
|
81
81
|
});
|
|
@@ -99,15 +99,15 @@ export const fetchResultsPage = (url, controller = null) => {
|
|
|
99
99
|
.then((response) => {
|
|
100
100
|
resolve({
|
|
101
101
|
results: response.json.results,
|
|
102
|
-
next: response.json.next
|
|
102
|
+
next: response.json.next
|
|
103
103
|
});
|
|
104
104
|
})
|
|
105
|
-
.catch(error => reject(error));
|
|
105
|
+
.catch((error) => reject(error));
|
|
106
106
|
});
|
|
107
107
|
};
|
|
108
108
|
export const fetchResults = async (url) => {
|
|
109
109
|
if (!url) {
|
|
110
|
-
return new Promise(resolve => resolve([]));
|
|
110
|
+
return new Promise((resolve) => resolve([]));
|
|
111
111
|
}
|
|
112
112
|
let results = [];
|
|
113
113
|
let pageUrl = url;
|
|
@@ -127,19 +127,19 @@ export const getAssetPage = (url) => {
|
|
|
127
127
|
if (response.status >= 200 && response.status < 300) {
|
|
128
128
|
resolve({
|
|
129
129
|
assets: response.json.results,
|
|
130
|
-
next: response.json.next
|
|
130
|
+
next: response.json.next
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
133
|
else {
|
|
134
134
|
reject(response);
|
|
135
135
|
}
|
|
136
136
|
})
|
|
137
|
-
.catch(error => reject(error));
|
|
137
|
+
.catch((error) => reject(error));
|
|
138
138
|
});
|
|
139
139
|
};
|
|
140
140
|
export const getAssets = async (url) => {
|
|
141
141
|
if (!url) {
|
|
142
|
-
return new Promise(resolve => resolve([]));
|
|
142
|
+
return new Promise((resolve) => resolve([]));
|
|
143
143
|
}
|
|
144
144
|
let assets = [];
|
|
145
145
|
let pageUrl = url;
|
|
@@ -163,7 +163,7 @@ export const postUrl = (url, payload, headers = {}, contentType = null) => {
|
|
|
163
163
|
const options = {
|
|
164
164
|
method: 'POST',
|
|
165
165
|
headers: fetchHeaders,
|
|
166
|
-
body: payload
|
|
166
|
+
body: payload
|
|
167
167
|
};
|
|
168
168
|
return new Promise((resolve, reject) => {
|
|
169
169
|
fetch(url, options)
|
|
@@ -172,6 +172,13 @@ export const postUrl = (url, payload, headers = {}, contentType = null) => {
|
|
|
172
172
|
reject(response);
|
|
173
173
|
return;
|
|
174
174
|
}
|
|
175
|
+
const toasts = response.headers.get('x-temba-toasts');
|
|
176
|
+
if (toasts) {
|
|
177
|
+
const toastEle = document.querySelector('temba-toast');
|
|
178
|
+
if (toastEle) {
|
|
179
|
+
toastEle.addMessages(JSON.parse(toasts));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
175
182
|
response.text().then((body) => {
|
|
176
183
|
let json = {};
|
|
177
184
|
try {
|
|
@@ -185,11 +192,11 @@ export const postUrl = (url, payload, headers = {}, contentType = null) => {
|
|
|
185
192
|
headers: response.headers,
|
|
186
193
|
status: response.status,
|
|
187
194
|
redirected: response.redirected,
|
|
188
|
-
url: response.url
|
|
195
|
+
url: response.url
|
|
189
196
|
});
|
|
190
197
|
});
|
|
191
198
|
})
|
|
192
|
-
.catch(error => {
|
|
199
|
+
.catch((error) => {
|
|
193
200
|
reject(error);
|
|
194
201
|
});
|
|
195
202
|
});
|
|
@@ -200,7 +207,7 @@ export const postJSON = (url, payload) => {
|
|
|
200
207
|
export const postFormData = (url, formData, headers = {}) => {
|
|
201
208
|
return new Promise((resolve, reject) => {
|
|
202
209
|
postUrl(url, formData, headers)
|
|
203
|
-
.then(response => {
|
|
210
|
+
.then((response) => {
|
|
204
211
|
if (response.status >= 200 && response.status < 400) {
|
|
205
212
|
resolve(response);
|
|
206
213
|
}
|
|
@@ -213,7 +220,7 @@ export const postFormData = (url, formData, headers = {}) => {
|
|
|
213
220
|
}
|
|
214
221
|
}
|
|
215
222
|
})
|
|
216
|
-
.catch(err => {
|
|
223
|
+
.catch((err) => {
|
|
217
224
|
console.error(err);
|
|
218
225
|
reject(err);
|
|
219
226
|
});
|
|
@@ -237,7 +244,7 @@ export const hexToRgb = (hex) => {
|
|
|
237
244
|
? {
|
|
238
245
|
r: parseInt(result[1], 16),
|
|
239
246
|
g: parseInt(result[2], 16),
|
|
240
|
-
b: parseInt(result[3], 16)
|
|
247
|
+
b: parseInt(result[3], 16)
|
|
241
248
|
}
|
|
242
249
|
: null;
|
|
243
250
|
};
|
|
@@ -251,7 +258,7 @@ export const getElementOffset = (ele) => {
|
|
|
251
258
|
bottom: rect.top + rect.height,
|
|
252
259
|
right: rect.left + rect.width,
|
|
253
260
|
width: rect.width,
|
|
254
|
-
height: rect.height
|
|
261
|
+
height: rect.height
|
|
255
262
|
};
|
|
256
263
|
};
|
|
257
264
|
export const plural = (count, singular, plural) => {
|
|
@@ -348,7 +355,7 @@ export class Stubbable {
|
|
|
348
355
|
}
|
|
349
356
|
export const stubbable = new Stubbable();
|
|
350
357
|
export const timeSince = (date, options = {
|
|
351
|
-
suffix: ''
|
|
358
|
+
suffix: ''
|
|
352
359
|
}) => {
|
|
353
360
|
const { compareDate, hideRecentText, suffix } = options;
|
|
354
361
|
const now = compareDate || stubbable.getCurrentDate();
|
|
@@ -547,7 +554,7 @@ export const extractInitials = (text) => {
|
|
|
547
554
|
return words[0].substring(0, 2).toUpperCase();
|
|
548
555
|
}
|
|
549
556
|
// use initial letters of words with preference to first word and capital letters
|
|
550
|
-
const firstLetters = words.map(w => w.substring(0, 1));
|
|
557
|
+
const firstLetters = words.map((w) => w.substring(0, 1));
|
|
551
558
|
const firstCapitals = firstLetters.filter((l, index) => l == l.toUpperCase() || index == 0);
|
|
552
559
|
if (firstCapitals.length >= 2) {
|
|
553
560
|
return (firstCapitals[0] + firstCapitals[1]).toUpperCase();
|
|
@@ -559,7 +566,7 @@ export const extractInitials = (text) => {
|
|
|
559
566
|
export const hslToHex = (h, s, l) => {
|
|
560
567
|
l /= 100;
|
|
561
568
|
const a = (s * Math.min(l, 1 - l)) / 100;
|
|
562
|
-
const f = n => {
|
|
569
|
+
const f = (n) => {
|
|
563
570
|
const k = (n + h / 30) % 12;
|
|
564
571
|
const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
|
|
565
572
|
return Math.round(255 * color)
|