@nyaruka/temba-components 0.142.1 → 0.142.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/CHANGELOG.md +19 -0
- package/dist/temba-components.js +953 -708
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/Icons.js +1 -0
- package/out-tsc/src/Icons.js.map +1 -1
- package/out-tsc/src/flow/CanvasMenu.js +38 -38
- package/out-tsc/src/flow/CanvasMenu.js.map +1 -1
- package/out-tsc/src/flow/CanvasNode.js +171 -17
- package/out-tsc/src/flow/CanvasNode.js.map +1 -1
- package/out-tsc/src/flow/Editor.js +491 -22
- package/out-tsc/src/flow/Editor.js.map +1 -1
- package/out-tsc/src/flow/NodeEditor.js +346 -10
- package/out-tsc/src/flow/NodeEditor.js.map +1 -1
- package/out-tsc/src/flow/NodeTypeSelector.js +2 -0
- package/out-tsc/src/flow/NodeTypeSelector.js.map +1 -1
- package/out-tsc/src/flow/Plumber.js +92 -28
- package/out-tsc/src/flow/Plumber.js.map +1 -1
- package/out-tsc/src/flow/StickyNote.js +63 -3
- package/out-tsc/src/flow/StickyNote.js.map +1 -1
- package/out-tsc/src/flow/actions/add_contact_urn.js +2 -6
- package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -1
- package/out-tsc/src/flow/actions/enter_flow.js +2 -2
- package/out-tsc/src/flow/actions/enter_flow.js.map +1 -1
- package/out-tsc/src/flow/actions/say_msg.js +2 -1
- package/out-tsc/src/flow/actions/say_msg.js.map +1 -1
- package/out-tsc/src/flow/actions/send_broadcast.js +2 -6
- package/out-tsc/src/flow/actions/send_broadcast.js.map +1 -1
- package/out-tsc/src/flow/actions/send_email.js +2 -6
- package/out-tsc/src/flow/actions/send_email.js.map +1 -1
- package/out-tsc/src/flow/actions/send_msg.js +55 -35
- package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_channel.js +2 -1
- package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_field.js +4 -5
- package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_language.js +3 -3
- package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_name.js +2 -1
- package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -1
- package/out-tsc/src/flow/actions/set_contact_status.js +2 -1
- package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
- package/out-tsc/src/flow/actions/set_run_result.js +3 -3
- package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
- package/out-tsc/src/flow/actions/start_session.js +2 -2
- package/out-tsc/src/flow/actions/start_session.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_llm.js +4 -5
- package/out-tsc/src/flow/nodes/split_by_llm.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_resthook.js +3 -8
- package/out-tsc/src/flow/nodes/split_by_resthook.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_subflow.js +4 -2
- package/out-tsc/src/flow/nodes/split_by_subflow.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_webhook.js +25 -33
- package/out-tsc/src/flow/nodes/split_by_webhook.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_response.js +1 -0
- package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
- package/out-tsc/src/flow/types.js.map +1 -1
- package/out-tsc/src/flow/utils.js +66 -0
- package/out-tsc/src/flow/utils.js.map +1 -1
- package/out-tsc/src/form/FieldRenderer.js +17 -2
- package/out-tsc/src/form/FieldRenderer.js.map +1 -1
- package/out-tsc/src/interfaces.js +1 -0
- package/out-tsc/src/interfaces.js.map +1 -1
- package/out-tsc/src/list/SortableList.js +104 -43
- package/out-tsc/src/list/SortableList.js.map +1 -1
- package/out-tsc/src/simulator/Simulator.js +6 -2
- package/out-tsc/src/simulator/Simulator.js.map +1 -1
- package/out-tsc/test/temba-canvas-menu.test.js +13 -9
- package/out-tsc/test/temba-canvas-menu.test.js.map +1 -1
- package/out-tsc/test/temba-flow-reflow.test.js.map +1 -1
- package/out-tsc/test/temba-node-editor.test.js +9 -10
- package/out-tsc/test/temba-node-editor.test.js.map +1 -1
- package/out-tsc/test/temba-node-type-selector.test.js +3 -3
- package/out-tsc/test/temba-node-type-selector.test.js.map +1 -1
- package/out-tsc/test/temba-simulator.test.js +2 -2
- package/out-tsc/test/temba-simulator.test.js.map +1 -1
- package/package.json +1 -1
- package/screenshots/truth/actions/enter_flow/render/basic-flow.png +0 -0
- package/screenshots/truth/actions/enter_flow/render/long-flow-name.png +0 -0
- package/screenshots/truth/actions/send_email/render/long-subject.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/start_session/render/contact-query.png +0 -0
- package/screenshots/truth/actions/start_session/render/contacts-only.png +0 -0
- package/screenshots/truth/actions/start_session/render/create-contact.png +0 -0
- package/screenshots/truth/actions/start_session/render/groups-and-contacts.png +0 -0
- package/screenshots/truth/actions/start_session/render/groups-only.png +0 -0
- package/screenshots/truth/actions/start_session/render/many-recipients.png +0 -0
- package/screenshots/truth/canvas-menu/open.png +0 -0
- package/screenshots/truth/node-type-selector/action-mode.png +0 -0
- package/screenshots/truth/node-type-selector/split-mode.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/information-extraction.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/render/sentiment-analysis.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
- package/src/Icons.ts +1 -0
- package/src/flow/CanvasMenu.ts +50 -43
- package/src/flow/CanvasNode.ts +201 -17
- package/src/flow/Editor.ts +585 -25
- package/src/flow/NodeEditor.ts +373 -10
- package/src/flow/NodeTypeSelector.ts +2 -0
- package/src/flow/Plumber.ts +104 -37
- package/src/flow/StickyNote.ts +76 -4
- package/src/flow/actions/add_contact_urn.ts +5 -6
- package/src/flow/actions/enter_flow.ts +2 -2
- package/src/flow/actions/say_msg.ts +2 -1
- package/src/flow/actions/send_broadcast.ts +2 -6
- package/src/flow/actions/send_email.ts +2 -6
- package/src/flow/actions/send_msg.ts +59 -38
- package/src/flow/actions/set_contact_channel.ts +5 -1
- package/src/flow/actions/set_contact_field.ts +10 -5
- package/src/flow/actions/set_contact_language.ts +6 -3
- package/src/flow/actions/set_contact_name.ts +5 -1
- package/src/flow/actions/set_contact_status.ts +5 -1
- package/src/flow/actions/set_run_result.ts +6 -3
- package/src/flow/actions/start_session.ts +2 -2
- package/src/flow/nodes/split_by_llm.ts +5 -5
- package/src/flow/nodes/split_by_resthook.ts +3 -8
- package/src/flow/nodes/split_by_subflow.ts +4 -2
- package/src/flow/nodes/split_by_webhook.ts +26 -34
- package/src/flow/nodes/wait_for_response.ts +1 -0
- package/src/flow/types.ts +25 -2
- package/src/flow/utils.ts +79 -1
- package/src/form/FieldRenderer.ts +32 -3
- package/src/interfaces.ts +1 -0
- package/src/list/SortableList.ts +117 -47
- package/src/simulator/Simulator.ts +6 -2
- package/test/temba-canvas-menu.test.ts +13 -9
- package/test/temba-flow-reflow.test.ts +4 -2
- package/test/temba-node-editor.test.ts +9 -10
- package/test/temba-node-type-selector.test.ts +3 -3
- package/test/temba-simulator.test.ts +2 -2
package/out-tsc/src/Icons.js
CHANGED
|
@@ -127,6 +127,7 @@ export var Icon;
|
|
|
127
127
|
Icon["overview"] = "pie-chart-01";
|
|
128
128
|
Icon["prometheus"] = "prometheus";
|
|
129
129
|
Icon["progress_spinner"] = "refresh-cw-04";
|
|
130
|
+
Icon["refresh"] = "refresh-cw-05";
|
|
130
131
|
Icon["featured"] = "star-01";
|
|
131
132
|
Icon["quick_replies"] = "dotpoints-01";
|
|
132
133
|
Icon["recording"] = "microphone-01";
|
package/out-tsc/src/Icons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Icons.js","sourceRoot":"","sources":["../../src/Icons.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-duplicate-enum-values */\n// for cache busting we dynamically generate a fingerprint, use yarn svg to update\nexport const SVG_FINGERPRINT = 'de580a861152b5d164592ae63b65e5aa';\n\n// only icons below are included in the sprite sheet\nexport enum Icon {\n ai = 'beaker-02',\n alert_warning = 'alert-square',\n account = 'user-01',\n action = 'lightning-02',\n active = 'play',\n add = 'plus',\n add_note = 'file-02',\n airtime = 'bank-note-01',\n analytics = 'bar-chart-01',\n archive = 'archive',\n arrow_up = 'chevron-up',\n arrow_down = 'chevron-down',\n arrow_left = 'chevron-left',\n arrow_right = 'chevron-right',\n attachment = 'paperclip',\n attachment_audio = 'volume-min',\n attachment_document = 'file-06',\n attachment_image = 'image-01',\n attachment_location = 'marker-pin-01',\n attachment_video = 'video-recorder',\n branding = 'brush-02',\n branding_hostname = 'server-05',\n branding_notifications = 'mail-01',\n branding_styling = 'palette',\n branding_raw = 'pencil-01',\n broadcast = 'announcement-01',\n call = 'phone-call-01',\n call_missed = 'phone-call-02',\n campaign = 'clock-refresh',\n campaign_active = 'play',\n campaign_archived = 'archive',\n campaigns = 'clock-refresh',\n channel = 'zap',\n children = 'git-branch-01',\n check = 'check',\n checkbox = 'square',\n checkbox_checked = 'check-square',\n checkbox_partial = 'stop-square',\n close = 'x',\n compose = 'send-01',\n contact = 'user-01',\n contact_archived = 'archive',\n contact_blocked = 'message-x-square',\n contact_export = 'download-cloud-01',\n contact_import = 'upload-cloud-01',\n contact_stopped = 'slash-octagon',\n contact_updated = 'user-edit',\n contacts = 'user-01',\n copy = 'copy-04',\n dashboard = 'pie-chart-01',\n definitions_export = 'download-cloud-01',\n delete = 'trash-03',\n delete_small = 'x',\n down = 'chevron-down',\n download = 'download-01',\n drag = 'dots-grid',\n edit = 'edit-02',\n email = 'mail-01',\n error = 'alert-circle',\n event = 'zap',\n export = 'download-cloud-01',\n expressions = 'at-sign',\n fields = 'user-edit',\n filter = 'filter-funnel-01',\n flow = 'flow',\n flow_background = 'layers-two-01',\n flow_interrupted = 'x-close',\n flow_ivr = 'phone',\n flow_message = 'message-square-02',\n flow_surveyor = 'tablet-01',\n flow_user = 'hard-drive',\n flows = 'flow',\n follow = 'route',\n global = 'at-sign',\n grid = 'dots-grid',\n group = 'users-01',\n group_exclude = 'users-x',\n group_include = 'users-check',\n group_smart = 'atom-01',\n help = 'help-circle',\n hide = 'eye-off',\n home = 'settings-02',\n image = 'image-01',\n import = 'upload-cloud-01',\n inbox = 'inbox-01',\n incidents = 'alert-square',\n incoming_call = 'phone-incoming-01',\n info = 'user-square',\n integrations = 'layers-three-01',\n invitations = 'user-plus-01',\n issue = 'alert-square',\n label = 'tag-01',\n language = 'translate-01',\n link = 'link-external-01',\n location = 'marker-pin-01',\n log = 'file-02',\n logout = 'log-out-04',\n menu = 'menu-01',\n menu_collapse = 'chevron-left-double',\n message = 'message-square-02',\n message_export = 'download-cloud-01',\n messages = 'message-square-02',\n missing = 'maximize-02',\n missed_call = 'phone-x',\n new = 'plus',\n next_schedule = 'alarm-clock',\n note = 'edit-03',\n notes = 'edit-03',\n notification = 'bell-01',\n number = 'hash-01',\n optin_requested = 'message-notification-circle',\n optin = 'message-check-circle',\n optout = 'message-x-circle',\n org_active = 'credit-card-02',\n org_anonymous = 'glasses-01',\n org_bulk = 'credit-card-plus',\n org_flagged = 'flag-01',\n org_new = 'stars-02',\n org_suspended = 'slash-circle-01',\n org_verified = 'check-verified-02',\n overview = 'pie-chart-01',\n prometheus = 'prometheus',\n progress_spinner = 'refresh-cw-04',\n featured = 'star-01',\n quick_replies = 'dotpoints-01',\n recording = 'microphone-01',\n resend = 'refresh-cw-05',\n reset = 'flip-backward',\n resthooks = 'share-07',\n restore = 'play',\n results_export = 'download-cloud-01',\n retry = 'refresh-cw-05',\n revisions = 'clock-rewind',\n rocketchat = 'rocketchat',\n runs = 'rows-03',\n schedule = 'calendar',\n search = 'search-refraction',\n select_open = 'chevron-down',\n select_clear = 'x',\n send = 'send-03',\n service = 'magic-wand-01',\n service_end = 'log-out-04',\n settings = 'settings-02',\n shortcut = 'zap-fast',\n show = 'eye',\n simulator = 'phone-02',\n split = 'flow',\n sort = 'chevron-selector-vertical',\n sort_down = 'sort-arrow-down',\n sort_up = 'sort-arrow-up',\n staff = 'hard-drive',\n submit = 'check',\n success = 'check',\n template_approved = 'check-circle',\n template_pending = 'hourglass-01',\n template_rejected = 'alert-circle',\n tickets = 'agent',\n tickets_all = 'archive',\n tickets_closed = 'check',\n tickets_mine = 'coffee',\n tickets_mine_done = 'coffee-empty',\n tickets_open = 'inbox-01',\n tickets_export = 'download-cloud-01',\n tickets_unassigned = 'inbox-01',\n topic = 'message-text-circle-02',\n two_factor_enabled = 'shield-02',\n two_factor_disabled = 'shield-01',\n trigger = 'signal-01',\n trigger_active = 'play',\n trigger_archived = 'archive',\n trigger_new = 'plus',\n trigger_keyword = 'message-check-square',\n trigger_catch_all = 'message-question-square',\n trigger_inbound_call = 'phone-incoming-01',\n trigger_missed_call = 'phone-hang-up',\n trigger_schedule = 'calendar',\n trigger_new_conversation = 'message-chat-square',\n trigger_referral = 'user-right-01',\n trigger_closed_ticket = 'agent',\n trigger_opt_in = 'message-check-circle',\n trigger_opt_out = 'message-x-circle',\n triggers = 'signal-01',\n updated = 'edit-02',\n up = 'chevron-up',\n upload = 'upload-cloud-01',\n upload_image = 'camera-01',\n usages = 'link-04',\n user = 'users-01',\n user_beta = 'shield-zap',\n user_token = 'key-01',\n users = 'users-01',\n video = 'video-recorder',\n webhook = 'link-external-01',\n workspace = 'folder',\n zoom_fit = 'maximize-02',\n zoom_in = 'expand-06',\n\n // channel types\n channel_a = 'channel-android',\n channel_ac = 'zap', // TODO https://www.arabiacell.com/\n channel_at = 'zap', // TODO https://africastalking.com/\n channel_bs = 'zap', // TODO https://burstsms.com/\n channel_bw = 'zap', // TODO https://www.bandwidth.com/\n channel_cs = 'zap', // TODO https://www.clicksend.com/\n channel_ct = 'channel-clickatell',\n channel_d3 = 'channel-whatsapp',\n channel_d3c = 'channel-whatsapp',\n channel_da = 'zap', // TODO https://dartmedia.co.id/\n channel_ds = 'channel-discord',\n channel_ex = 'zap',\n channel_fb = 'channel-facebook',\n channel_fba = 'channel-facebook',\n channel_fc = 'channel-freshchat',\n channel_fcm = 'channel-firebase',\n channel_hm = 'zap', // TODO https://hormuud.com/\n channel_ib = 'zap', // TODO https://www.infobip.com/\n channel_ig = 'channel-instagram',\n channel_jc = 'channel-jiochat',\n channel_kn = 'channel-kannel',\n channel_kwa = 'channel-whatsapp',\n channel_ln = 'channel-line',\n channel_mt = 'channel-mtarget',\n channel_mtn = 'zap', // TODO https://mtn.com/\n channel_nx = 'channel-vonage',\n channel_pl = 'channel-plivo',\n channel_rc = 'channel-rocketchat',\n channel_sl = 'channel-slack',\n channel_sq = 'zap', // TODO https://shaqodoon.org/\n channel_st = 'zap', // TODO https://bulk.startmobile.ua\n channel_sw = 'channel-signalwire',\n channel_t = 'channel-twilio',\n channel_tg = 'channel-telegram',\n channel_tms = 'channel-twilio',\n channel_tq = 'channel-thinq',\n channel_tw = 'zap', // TODO https://www.somleng.org/\n channel_twa = 'channel-whatsapp',\n channel_twc = 'zap', // TODO\n channel_twt = 'channel-twitter',\n channel_vk = 'channel-vk',\n channel_vp = 'channel-viber',\n channel_wa = 'channel-whatsapp',\n channel_wac = 'channel-whatsapp',\n channel_wc = 'channel-wechat',\n channel_yo = 'zap', // TODO https://www.yo.co.ug/\n channel_zvw = 'channel-whatsapp',\n\n // ai\n ai_openai = 'openai',\n ai_anthropic = 'anthropic',\n ai_google = 'gemini',\n ai_microsoft = 'azure',\n ai_deepseek = 'deepseek',\n\n // classifiers\n classifier_wit = 'classifier-wit',\n\n // other brands\n dtone = 'dtone',\n zapier = 'zapier',\n\n // demo\n default = 'list',\n datepicker = 'calendar',\n slider = 'sliders-02',\n select = 'browser',\n input = 'edit-05'\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Icons.js","sourceRoot":"","sources":["../../src/Icons.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-duplicate-enum-values */\n// for cache busting we dynamically generate a fingerprint, use yarn svg to update\nexport const SVG_FINGERPRINT = 'de580a861152b5d164592ae63b65e5aa';\n\n// only icons below are included in the sprite sheet\nexport enum Icon {\n ai = 'beaker-02',\n alert_warning = 'alert-square',\n account = 'user-01',\n action = 'lightning-02',\n active = 'play',\n add = 'plus',\n add_note = 'file-02',\n airtime = 'bank-note-01',\n analytics = 'bar-chart-01',\n archive = 'archive',\n arrow_up = 'chevron-up',\n arrow_down = 'chevron-down',\n arrow_left = 'chevron-left',\n arrow_right = 'chevron-right',\n attachment = 'paperclip',\n attachment_audio = 'volume-min',\n attachment_document = 'file-06',\n attachment_image = 'image-01',\n attachment_location = 'marker-pin-01',\n attachment_video = 'video-recorder',\n branding = 'brush-02',\n branding_hostname = 'server-05',\n branding_notifications = 'mail-01',\n branding_styling = 'palette',\n branding_raw = 'pencil-01',\n broadcast = 'announcement-01',\n call = 'phone-call-01',\n call_missed = 'phone-call-02',\n campaign = 'clock-refresh',\n campaign_active = 'play',\n campaign_archived = 'archive',\n campaigns = 'clock-refresh',\n channel = 'zap',\n children = 'git-branch-01',\n check = 'check',\n checkbox = 'square',\n checkbox_checked = 'check-square',\n checkbox_partial = 'stop-square',\n close = 'x',\n compose = 'send-01',\n contact = 'user-01',\n contact_archived = 'archive',\n contact_blocked = 'message-x-square',\n contact_export = 'download-cloud-01',\n contact_import = 'upload-cloud-01',\n contact_stopped = 'slash-octagon',\n contact_updated = 'user-edit',\n contacts = 'user-01',\n copy = 'copy-04',\n dashboard = 'pie-chart-01',\n definitions_export = 'download-cloud-01',\n delete = 'trash-03',\n delete_small = 'x',\n down = 'chevron-down',\n download = 'download-01',\n drag = 'dots-grid',\n edit = 'edit-02',\n email = 'mail-01',\n error = 'alert-circle',\n event = 'zap',\n export = 'download-cloud-01',\n expressions = 'at-sign',\n fields = 'user-edit',\n filter = 'filter-funnel-01',\n flow = 'flow',\n flow_background = 'layers-two-01',\n flow_interrupted = 'x-close',\n flow_ivr = 'phone',\n flow_message = 'message-square-02',\n flow_surveyor = 'tablet-01',\n flow_user = 'hard-drive',\n flows = 'flow',\n follow = 'route',\n global = 'at-sign',\n grid = 'dots-grid',\n group = 'users-01',\n group_exclude = 'users-x',\n group_include = 'users-check',\n group_smart = 'atom-01',\n help = 'help-circle',\n hide = 'eye-off',\n home = 'settings-02',\n image = 'image-01',\n import = 'upload-cloud-01',\n inbox = 'inbox-01',\n incidents = 'alert-square',\n incoming_call = 'phone-incoming-01',\n info = 'user-square',\n integrations = 'layers-three-01',\n invitations = 'user-plus-01',\n issue = 'alert-square',\n label = 'tag-01',\n language = 'translate-01',\n link = 'link-external-01',\n location = 'marker-pin-01',\n log = 'file-02',\n logout = 'log-out-04',\n menu = 'menu-01',\n menu_collapse = 'chevron-left-double',\n message = 'message-square-02',\n message_export = 'download-cloud-01',\n messages = 'message-square-02',\n missing = 'maximize-02',\n missed_call = 'phone-x',\n new = 'plus',\n next_schedule = 'alarm-clock',\n note = 'edit-03',\n notes = 'edit-03',\n notification = 'bell-01',\n number = 'hash-01',\n optin_requested = 'message-notification-circle',\n optin = 'message-check-circle',\n optout = 'message-x-circle',\n org_active = 'credit-card-02',\n org_anonymous = 'glasses-01',\n org_bulk = 'credit-card-plus',\n org_flagged = 'flag-01',\n org_new = 'stars-02',\n org_suspended = 'slash-circle-01',\n org_verified = 'check-verified-02',\n overview = 'pie-chart-01',\n prometheus = 'prometheus',\n progress_spinner = 'refresh-cw-04',\n refresh = 'refresh-cw-05',\n featured = 'star-01',\n quick_replies = 'dotpoints-01',\n recording = 'microphone-01',\n resend = 'refresh-cw-05',\n reset = 'flip-backward',\n resthooks = 'share-07',\n restore = 'play',\n results_export = 'download-cloud-01',\n retry = 'refresh-cw-05',\n revisions = 'clock-rewind',\n rocketchat = 'rocketchat',\n runs = 'rows-03',\n schedule = 'calendar',\n search = 'search-refraction',\n select_open = 'chevron-down',\n select_clear = 'x',\n send = 'send-03',\n service = 'magic-wand-01',\n service_end = 'log-out-04',\n settings = 'settings-02',\n shortcut = 'zap-fast',\n show = 'eye',\n simulator = 'phone-02',\n split = 'flow',\n sort = 'chevron-selector-vertical',\n sort_down = 'sort-arrow-down',\n sort_up = 'sort-arrow-up',\n staff = 'hard-drive',\n submit = 'check',\n success = 'check',\n template_approved = 'check-circle',\n template_pending = 'hourglass-01',\n template_rejected = 'alert-circle',\n tickets = 'agent',\n tickets_all = 'archive',\n tickets_closed = 'check',\n tickets_mine = 'coffee',\n tickets_mine_done = 'coffee-empty',\n tickets_open = 'inbox-01',\n tickets_export = 'download-cloud-01',\n tickets_unassigned = 'inbox-01',\n topic = 'message-text-circle-02',\n two_factor_enabled = 'shield-02',\n two_factor_disabled = 'shield-01',\n trigger = 'signal-01',\n trigger_active = 'play',\n trigger_archived = 'archive',\n trigger_new = 'plus',\n trigger_keyword = 'message-check-square',\n trigger_catch_all = 'message-question-square',\n trigger_inbound_call = 'phone-incoming-01',\n trigger_missed_call = 'phone-hang-up',\n trigger_schedule = 'calendar',\n trigger_new_conversation = 'message-chat-square',\n trigger_referral = 'user-right-01',\n trigger_closed_ticket = 'agent',\n trigger_opt_in = 'message-check-circle',\n trigger_opt_out = 'message-x-circle',\n triggers = 'signal-01',\n updated = 'edit-02',\n up = 'chevron-up',\n upload = 'upload-cloud-01',\n upload_image = 'camera-01',\n usages = 'link-04',\n user = 'users-01',\n user_beta = 'shield-zap',\n user_token = 'key-01',\n users = 'users-01',\n video = 'video-recorder',\n webhook = 'link-external-01',\n workspace = 'folder',\n zoom_fit = 'maximize-02',\n zoom_in = 'expand-06',\n\n // channel types\n channel_a = 'channel-android',\n channel_ac = 'zap', // TODO https://www.arabiacell.com/\n channel_at = 'zap', // TODO https://africastalking.com/\n channel_bs = 'zap', // TODO https://burstsms.com/\n channel_bw = 'zap', // TODO https://www.bandwidth.com/\n channel_cs = 'zap', // TODO https://www.clicksend.com/\n channel_ct = 'channel-clickatell',\n channel_d3 = 'channel-whatsapp',\n channel_d3c = 'channel-whatsapp',\n channel_da = 'zap', // TODO https://dartmedia.co.id/\n channel_ds = 'channel-discord',\n channel_ex = 'zap',\n channel_fb = 'channel-facebook',\n channel_fba = 'channel-facebook',\n channel_fc = 'channel-freshchat',\n channel_fcm = 'channel-firebase',\n channel_hm = 'zap', // TODO https://hormuud.com/\n channel_ib = 'zap', // TODO https://www.infobip.com/\n channel_ig = 'channel-instagram',\n channel_jc = 'channel-jiochat',\n channel_kn = 'channel-kannel',\n channel_kwa = 'channel-whatsapp',\n channel_ln = 'channel-line',\n channel_mt = 'channel-mtarget',\n channel_mtn = 'zap', // TODO https://mtn.com/\n channel_nx = 'channel-vonage',\n channel_pl = 'channel-plivo',\n channel_rc = 'channel-rocketchat',\n channel_sl = 'channel-slack',\n channel_sq = 'zap', // TODO https://shaqodoon.org/\n channel_st = 'zap', // TODO https://bulk.startmobile.ua\n channel_sw = 'channel-signalwire',\n channel_t = 'channel-twilio',\n channel_tg = 'channel-telegram',\n channel_tms = 'channel-twilio',\n channel_tq = 'channel-thinq',\n channel_tw = 'zap', // TODO https://www.somleng.org/\n channel_twa = 'channel-whatsapp',\n channel_twc = 'zap', // TODO\n channel_twt = 'channel-twitter',\n channel_vk = 'channel-vk',\n channel_vp = 'channel-viber',\n channel_wa = 'channel-whatsapp',\n channel_wac = 'channel-whatsapp',\n channel_wc = 'channel-wechat',\n channel_yo = 'zap', // TODO https://www.yo.co.ug/\n channel_zvw = 'channel-whatsapp',\n\n // ai\n ai_openai = 'openai',\n ai_anthropic = 'anthropic',\n ai_google = 'gemini',\n ai_microsoft = 'azure',\n ai_deepseek = 'deepseek',\n\n // classifiers\n classifier_wit = 'classifier-wit',\n\n // other brands\n dtone = 'dtone',\n zapier = 'zapier',\n\n // demo\n default = 'list',\n datepicker = 'calendar',\n slider = 'sliders-02',\n select = 'browser',\n input = 'edit-05'\n}\n"]}
|
|
@@ -14,6 +14,7 @@ export class CanvasMenu extends RapidElement {
|
|
|
14
14
|
this.y = 0;
|
|
15
15
|
this.open = false;
|
|
16
16
|
this.showStickyNote = true;
|
|
17
|
+
this.showWaitForResponse = true;
|
|
17
18
|
this.showReflow = false;
|
|
18
19
|
this.clickPosition = { x: 0, y: 0 };
|
|
19
20
|
}
|
|
@@ -51,13 +52,6 @@ export class CanvasMenu extends RapidElement {
|
|
|
51
52
|
|
|
52
53
|
.menu-item temba-icon {
|
|
53
54
|
--icon-color: var(--color-text);
|
|
54
|
-
margin-top: 0.15em;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
.menu-item-content {
|
|
58
|
-
display: flex;
|
|
59
|
-
flex-direction: column;
|
|
60
|
-
gap: 0.15em;
|
|
61
55
|
}
|
|
62
56
|
|
|
63
57
|
.menu-item-title {
|
|
@@ -66,11 +60,6 @@ export class CanvasMenu extends RapidElement {
|
|
|
66
60
|
color: var(--color-text-dark);
|
|
67
61
|
}
|
|
68
62
|
|
|
69
|
-
.menu-item-description {
|
|
70
|
-
font-size: 0.85rem;
|
|
71
|
-
color: var(--color-text);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
63
|
.divider {
|
|
75
64
|
height: 1px;
|
|
76
65
|
background: rgba(0, 0, 0, 0.1);
|
|
@@ -80,15 +69,19 @@ export class CanvasMenu extends RapidElement {
|
|
|
80
69
|
}
|
|
81
70
|
firstUpdated(_changedProperties) {
|
|
82
71
|
super.firstUpdated(_changedProperties);
|
|
83
|
-
// Close menu when clicking outside — use mousedown instead of
|
|
84
|
-
// to avoid being triggered by the click synthesized from a
|
|
85
|
-
// (mousedown on exit + mouseup on canvas = click on
|
|
72
|
+
// Close menu when clicking/tapping outside — use mousedown instead of
|
|
73
|
+
// click to avoid being triggered by the click synthesized from a
|
|
74
|
+
// drag-and-drop (mousedown on exit + mouseup on canvas = click on
|
|
75
|
+
// common ancestor). Also listen for touchstart for touch devices.
|
|
86
76
|
const handleClickOutside = (e) => {
|
|
87
77
|
if (this.open && !this.contains(e.target)) {
|
|
88
78
|
this.close();
|
|
89
79
|
}
|
|
90
80
|
};
|
|
91
81
|
document.addEventListener('mousedown', handleClickOutside);
|
|
82
|
+
document.addEventListener('touchstart', handleClickOutside, {
|
|
83
|
+
passive: true
|
|
84
|
+
});
|
|
92
85
|
// Store cleanup function
|
|
93
86
|
this._clickOutsideHandler = handleClickOutside;
|
|
94
87
|
}
|
|
@@ -96,14 +89,16 @@ export class CanvasMenu extends RapidElement {
|
|
|
96
89
|
super.disconnectedCallback();
|
|
97
90
|
if (this._clickOutsideHandler) {
|
|
98
91
|
document.removeEventListener('mousedown', this._clickOutsideHandler);
|
|
92
|
+
document.removeEventListener('touchstart', this._clickOutsideHandler);
|
|
99
93
|
}
|
|
100
94
|
}
|
|
101
|
-
show(x, y, clickPosition, showStickyNote = true, showReflow = false) {
|
|
95
|
+
show(x, y, clickPosition, showStickyNote = true, showReflow = false, showWaitForResponse = true) {
|
|
102
96
|
this.x = x;
|
|
103
97
|
this.y = y;
|
|
104
98
|
this.clickPosition = clickPosition;
|
|
105
99
|
this.showStickyNote = showStickyNote;
|
|
106
100
|
this.showReflow = showReflow;
|
|
101
|
+
this.showWaitForResponse = showWaitForResponse;
|
|
107
102
|
this.open = true;
|
|
108
103
|
// Adjust position after menu renders to ensure it fits on screen
|
|
109
104
|
requestAnimationFrame(() => {
|
|
@@ -158,17 +153,32 @@ export class CanvasMenu extends RapidElement {
|
|
|
158
153
|
}
|
|
159
154
|
return html `
|
|
160
155
|
<div class="menu" style="left: ${this.x}px; top: ${this.y}px;">
|
|
156
|
+
<div
|
|
157
|
+
class="menu-item"
|
|
158
|
+
@click=${() => this.handleMenuItemClick('send_msg')}
|
|
159
|
+
>
|
|
160
|
+
<temba-icon name="send" size="1.25"></temba-icon>
|
|
161
|
+
<div class="menu-item-title">Send Message</div>
|
|
162
|
+
</div>
|
|
163
|
+
|
|
164
|
+
${this.showWaitForResponse
|
|
165
|
+
? html `
|
|
166
|
+
<div
|
|
167
|
+
class="menu-item"
|
|
168
|
+
@click=${() => this.handleMenuItemClick('wait_for_response')}
|
|
169
|
+
>
|
|
170
|
+
<temba-icon name="message" size="1.25"></temba-icon>
|
|
171
|
+
<div class="menu-item-title">Wait for Response</div>
|
|
172
|
+
</div>
|
|
173
|
+
`
|
|
174
|
+
: ''}
|
|
175
|
+
|
|
161
176
|
<div
|
|
162
177
|
class="menu-item"
|
|
163
178
|
@click=${() => this.handleMenuItemClick('action')}
|
|
164
179
|
>
|
|
165
180
|
<temba-icon name="action" size="1.25"></temba-icon>
|
|
166
|
-
<div class="menu-item-
|
|
167
|
-
<div class="menu-item-title">Add Action</div>
|
|
168
|
-
<div class="menu-item-description">
|
|
169
|
-
Send messages, update contacts
|
|
170
|
-
</div>
|
|
171
|
-
</div>
|
|
181
|
+
<div class="menu-item-title">Add Action</div>
|
|
172
182
|
</div>
|
|
173
183
|
|
|
174
184
|
<div
|
|
@@ -176,10 +186,7 @@ export class CanvasMenu extends RapidElement {
|
|
|
176
186
|
@click=${() => this.handleMenuItemClick('split')}
|
|
177
187
|
>
|
|
178
188
|
<temba-icon name="split" size="1.25"></temba-icon>
|
|
179
|
-
<div class="menu-item-
|
|
180
|
-
<div class="menu-item-title">Add Split</div>
|
|
181
|
-
<div class="menu-item-description">Branch based on conditions</div>
|
|
182
|
-
</div>
|
|
189
|
+
<div class="menu-item-title">Add Split</div>
|
|
183
190
|
</div>
|
|
184
191
|
|
|
185
192
|
${this.showStickyNote
|
|
@@ -191,12 +198,7 @@ export class CanvasMenu extends RapidElement {
|
|
|
191
198
|
@click=${() => this.handleMenuItemClick('sticky')}
|
|
192
199
|
>
|
|
193
200
|
<temba-icon name="note" size="1.25"></temba-icon>
|
|
194
|
-
<div class="menu-item-
|
|
195
|
-
<div class="menu-item-title">Add Sticky Note</div>
|
|
196
|
-
<div class="menu-item-description">
|
|
197
|
-
Add a note to the canvas
|
|
198
|
-
</div>
|
|
199
|
-
</div>
|
|
201
|
+
<div class="menu-item-title">Add Sticky Note</div>
|
|
200
202
|
</div>
|
|
201
203
|
`
|
|
202
204
|
: ''}
|
|
@@ -209,12 +211,7 @@ export class CanvasMenu extends RapidElement {
|
|
|
209
211
|
@click=${() => this.handleMenuItemClick('reflow')}
|
|
210
212
|
>
|
|
211
213
|
<temba-icon name="flow" size="1.25"></temba-icon>
|
|
212
|
-
<div class="menu-item-
|
|
213
|
-
<div class="menu-item-title">Reflow</div>
|
|
214
|
-
<div class="menu-item-description">
|
|
215
|
-
Auto-arrange nodes in this flow
|
|
216
|
-
</div>
|
|
217
|
-
</div>
|
|
214
|
+
<div class="menu-item-title">Reflow</div>
|
|
218
215
|
</div>
|
|
219
216
|
`
|
|
220
217
|
: ''}
|
|
@@ -234,6 +231,9 @@ __decorate([
|
|
|
234
231
|
__decorate([
|
|
235
232
|
property({ type: Boolean })
|
|
236
233
|
], CanvasMenu.prototype, "showStickyNote", void 0);
|
|
234
|
+
__decorate([
|
|
235
|
+
property({ type: Boolean })
|
|
236
|
+
], CanvasMenu.prototype, "showWaitForResponse", void 0);
|
|
237
237
|
__decorate([
|
|
238
238
|
property({ type: Boolean })
|
|
239
239
|
], CanvasMenu.prototype, "showReflow", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasMenu.js","sourceRoot":"","sources":["../../../src/flow/CanvasMenu.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { RapidElement } from '../RapidElement';\nimport { CustomEventType } from '../interfaces';\n\n/**\n * Event detail for canvas menu selection\n */\nexport interface CanvasMenuSelection {\n action: 'sticky' | 'action' | 'split' | 'reflow';\n position: { x: number; y: number };\n}\n\n/**\n * CanvasMenu - A popup menu for adding items to the flow canvas\n * Displayed when double-clicking on empty canvas space\n */\nexport class CanvasMenu extends RapidElement {\n static get styles() {\n return css`\n :host {\n position: fixed;\n z-index: 10000;\n display: block;\n pointer-events: none;\n }\n\n .menu {\n position: fixed;\n background: white;\n border-radius: var(--curvature);\n box-shadow: var(--dropdown-shadow);\n padding: 0.5em 0;\n width: 265px;\n pointer-events: auto;\n }\n\n .menu-item {\n padding: 0.75em 1.5em;\n cursor: pointer;\n display: flex;\n align-items: flex-start;\n gap: 0.75em;\n transition: background-color 0.15s ease;\n }\n\n .menu-item:hover {\n background-color: rgba(0, 0, 0, 0.05);\n }\n\n .menu-item temba-icon {\n --icon-color: var(--color-text);\n margin-top: 0.15em;\n }\n\n .menu-item-content {\n display: flex;\n flex-direction: column;\n gap: 0.15em;\n }\n\n .menu-item-title {\n font-weight: 500;\n font-size: 1rem;\n color: var(--color-text-dark);\n }\n\n .menu-item-description {\n font-size: 0.85rem;\n color: var(--color-text);\n }\n\n .divider {\n height: 1px;\n background: rgba(0, 0, 0, 0.1);\n margin: 0.5em 0;\n }\n `;\n }\n\n @property({ type: Number })\n public x = 0;\n\n @property({ type: Number })\n public y = 0;\n\n @property({ type: Boolean })\n public open = false;\n\n @property({ type: Boolean })\n public showStickyNote = true;\n\n @property({ type: Boolean })\n public showReflow = false;\n\n @state()\n private clickPosition = { x: 0, y: 0 };\n\n protected firstUpdated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(_changedProperties);\n\n // Close menu when clicking outside — use mousedown instead of click\n // to avoid being triggered by the click synthesized from a drag-and-drop\n // (mousedown on exit + mouseup on canvas = click on common ancestor)\n const handleClickOutside = (e: MouseEvent) => {\n if (this.open && !this.contains(e.target as Node)) {\n this.close();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n\n // Store cleanup function\n (this as any)._clickOutsideHandler = handleClickOutside;\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if ((this as any)._clickOutsideHandler) {\n document.removeEventListener(\n 'mousedown',\n (this as any)._clickOutsideHandler\n );\n }\n }\n\n public show(\n x: number,\n y: number,\n clickPosition: { x: number; y: number },\n showStickyNote: boolean = true,\n showReflow: boolean = false\n ) {\n this.x = x;\n this.y = y;\n this.clickPosition = clickPosition;\n this.showStickyNote = showStickyNote;\n this.showReflow = showReflow;\n this.open = true;\n\n // Adjust position after menu renders to ensure it fits on screen\n requestAnimationFrame(() => {\n this.adjustPosition();\n });\n }\n\n private adjustPosition(): void {\n const menuElement = this.shadowRoot?.querySelector('.menu') as HTMLElement;\n if (!menuElement) return;\n\n const menuRect = menuElement.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const margin = 10; // margin from viewport edges\n\n let adjustedX = this.x;\n let adjustedY = this.y;\n\n // Check if menu goes off the right edge\n if (this.x + menuRect.width + margin > viewportWidth) {\n adjustedX = viewportWidth - menuRect.width - margin;\n }\n\n // Check if menu goes off the bottom edge\n if (this.y + menuRect.height + margin > viewportHeight) {\n adjustedY = viewportHeight - menuRect.height - margin;\n }\n\n // Update position if needed\n if (adjustedX !== this.x || adjustedY !== this.y) {\n this.x = adjustedX;\n this.y = adjustedY;\n }\n }\n\n public close(fireCanceledEvent: boolean = true) {\n if (this.open) {\n this.open = false;\n // Fire close event so parent can clean up, but only if not from a selection\n if (fireCanceledEvent) {\n this.fireCustomEvent(CustomEventType.Canceled, {});\n }\n }\n }\n\n private handleMenuItemClick(\n action: 'sticky' | 'action' | 'split' | 'reflow'\n ) {\n this.fireCustomEvent(CustomEventType.Selection, {\n action,\n position: this.clickPosition\n } as CanvasMenuSelection);\n // Close without firing canceled event since we made a selection\n this.close(false);\n }\n\n public render(): TemplateResult {\n if (!this.open) {\n return html``;\n }\n\n return html`\n <div class=\"menu\" style=\"left: ${this.x}px; top: ${this.y}px;\">\n <div\n class=\"menu-item\"\n @click=${() => this.handleMenuItemClick('action')}\n >\n <temba-icon name=\"action\" size=\"1.25\"></temba-icon>\n <div class=\"menu-item-content\">\n <div class=\"menu-item-title\">Add Action</div>\n <div class=\"menu-item-description\">\n Send messages, update contacts\n </div>\n </div>\n </div>\n\n <div\n class=\"menu-item\"\n @click=${() => this.handleMenuItemClick('split')}\n >\n <temba-icon name=\"split\" size=\"1.25\"></temba-icon>\n <div class=\"menu-item-content\">\n <div class=\"menu-item-title\">Add Split</div>\n <div class=\"menu-item-description\">Branch based on conditions</div>\n </div>\n </div>\n\n ${this.showStickyNote\n ? html`\n <div class=\"divider\"></div>\n\n <div\n class=\"menu-item\"\n @click=${() => this.handleMenuItemClick('sticky')}\n >\n <temba-icon name=\"note\" size=\"1.25\"></temba-icon>\n <div class=\"menu-item-content\">\n <div class=\"menu-item-title\">Add Sticky Note</div>\n <div class=\"menu-item-description\">\n Add a note to the canvas\n </div>\n </div>\n </div>\n `\n : ''}\n ${this.showReflow\n ? html`\n <div class=\"divider\"></div>\n\n <div\n class=\"menu-item\"\n @click=${() => this.handleMenuItemClick('reflow')}\n >\n <temba-icon name=\"flow\" size=\"1.25\"></temba-icon>\n <div class=\"menu-item-content\">\n <div class=\"menu-item-title\">Reflow</div>\n <div class=\"menu-item-description\">\n Auto-arrange nodes in this flow\n </div>\n </div>\n </div>\n `\n : ''}\n </div>\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CanvasMenu.js","sourceRoot":"","sources":["../../../src/flow/CanvasMenu.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { RapidElement } from '../RapidElement';\nimport { CustomEventType } from '../interfaces';\n\n/**\n * Event detail for canvas menu selection\n */\nexport interface CanvasMenuSelection {\n action:\n | 'sticky'\n | 'action'\n | 'split'\n | 'send_msg'\n | 'wait_for_response'\n | 'reflow';\n position: { x: number; y: number };\n}\n\n/**\n * CanvasMenu - A popup menu for adding items to the flow canvas\n * Displayed when double-clicking on empty canvas space\n */\nexport class CanvasMenu extends RapidElement {\n static get styles() {\n return css`\n :host {\n position: fixed;\n z-index: 10000;\n display: block;\n pointer-events: none;\n }\n\n .menu {\n position: fixed;\n background: white;\n border-radius: var(--curvature);\n box-shadow: var(--dropdown-shadow);\n padding: 0.5em 0;\n width: 265px;\n pointer-events: auto;\n }\n\n .menu-item {\n padding: 0.75em 1.5em;\n cursor: pointer;\n display: flex;\n align-items: flex-start;\n gap: 0.75em;\n transition: background-color 0.15s ease;\n }\n\n .menu-item:hover {\n background-color: rgba(0, 0, 0, 0.05);\n }\n\n .menu-item temba-icon {\n --icon-color: var(--color-text);\n }\n\n .menu-item-title {\n font-weight: 500;\n font-size: 1rem;\n color: var(--color-text-dark);\n }\n\n .divider {\n height: 1px;\n background: rgba(0, 0, 0, 0.1);\n margin: 0.5em 0;\n }\n `;\n }\n\n @property({ type: Number })\n public x = 0;\n\n @property({ type: Number })\n public y = 0;\n\n @property({ type: Boolean })\n public open = false;\n\n @property({ type: Boolean })\n public showStickyNote = true;\n\n @property({ type: Boolean })\n public showWaitForResponse = true;\n\n @property({ type: Boolean })\n public showReflow = false;\n\n @state()\n private clickPosition = { x: 0, y: 0 };\n\n protected firstUpdated(\n _changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(_changedProperties);\n\n // Close menu when clicking/tapping outside — use mousedown instead of\n // click to avoid being triggered by the click synthesized from a\n // drag-and-drop (mousedown on exit + mouseup on canvas = click on\n // common ancestor). Also listen for touchstart for touch devices.\n const handleClickOutside = (e: MouseEvent | TouchEvent) => {\n if (this.open && !this.contains(e.target as Node)) {\n this.close();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('touchstart', handleClickOutside, {\n passive: true\n });\n\n // Store cleanup function\n (this as any)._clickOutsideHandler = handleClickOutside;\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if ((this as any)._clickOutsideHandler) {\n document.removeEventListener(\n 'mousedown',\n (this as any)._clickOutsideHandler\n );\n document.removeEventListener(\n 'touchstart',\n (this as any)._clickOutsideHandler\n );\n }\n }\n\n public show(\n x: number,\n y: number,\n clickPosition: { x: number; y: number },\n showStickyNote: boolean = true,\n showReflow: boolean = false,\n showWaitForResponse: boolean = true\n ) {\n this.x = x;\n this.y = y;\n this.clickPosition = clickPosition;\n this.showStickyNote = showStickyNote;\n this.showReflow = showReflow;\n this.showWaitForResponse = showWaitForResponse;\n this.open = true;\n\n // Adjust position after menu renders to ensure it fits on screen\n requestAnimationFrame(() => {\n this.adjustPosition();\n });\n }\n\n private adjustPosition(): void {\n const menuElement = this.shadowRoot?.querySelector('.menu') as HTMLElement;\n if (!menuElement) return;\n\n const menuRect = menuElement.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const margin = 10; // margin from viewport edges\n\n let adjustedX = this.x;\n let adjustedY = this.y;\n\n // Check if menu goes off the right edge\n if (this.x + menuRect.width + margin > viewportWidth) {\n adjustedX = viewportWidth - menuRect.width - margin;\n }\n\n // Check if menu goes off the bottom edge\n if (this.y + menuRect.height + margin > viewportHeight) {\n adjustedY = viewportHeight - menuRect.height - margin;\n }\n\n // Update position if needed\n if (adjustedX !== this.x || adjustedY !== this.y) {\n this.x = adjustedX;\n this.y = adjustedY;\n }\n }\n\n public close(fireCanceledEvent: boolean = true) {\n if (this.open) {\n this.open = false;\n // Fire close event so parent can clean up, but only if not from a selection\n if (fireCanceledEvent) {\n this.fireCustomEvent(CustomEventType.Canceled, {});\n }\n }\n }\n\n private handleMenuItemClick(action: CanvasMenuSelection['action']) {\n this.fireCustomEvent(CustomEventType.Selection, {\n action,\n position: this.clickPosition\n } as CanvasMenuSelection);\n // Close without firing canceled event since we made a selection\n this.close(false);\n }\n\n public render(): TemplateResult {\n if (!this.open) {\n return html``;\n }\n\n return html`\n <div class=\"menu\" style=\"left: ${this.x}px; top: ${this.y}px;\">\n <div\n class=\"menu-item\"\n @click=${() => this.handleMenuItemClick('send_msg')}\n >\n <temba-icon name=\"send\" size=\"1.25\"></temba-icon>\n <div class=\"menu-item-title\">Send Message</div>\n </div>\n\n ${this.showWaitForResponse\n ? html`\n <div\n class=\"menu-item\"\n @click=${() => this.handleMenuItemClick('wait_for_response')}\n >\n <temba-icon name=\"message\" size=\"1.25\"></temba-icon>\n <div class=\"menu-item-title\">Wait for Response</div>\n </div>\n `\n : ''}\n\n <div\n class=\"menu-item\"\n @click=${() => this.handleMenuItemClick('action')}\n >\n <temba-icon name=\"action\" size=\"1.25\"></temba-icon>\n <div class=\"menu-item-title\">Add Action</div>\n </div>\n\n <div\n class=\"menu-item\"\n @click=${() => this.handleMenuItemClick('split')}\n >\n <temba-icon name=\"split\" size=\"1.25\"></temba-icon>\n <div class=\"menu-item-title\">Add Split</div>\n </div>\n\n ${this.showStickyNote\n ? html`\n <div class=\"divider\"></div>\n\n <div\n class=\"menu-item\"\n @click=${() => this.handleMenuItemClick('sticky')}\n >\n <temba-icon name=\"note\" size=\"1.25\"></temba-icon>\n <div class=\"menu-item-title\">Add Sticky Note</div>\n </div>\n `\n : ''}\n ${this.showReflow\n ? html`\n <div class=\"divider\"></div>\n\n <div\n class=\"menu-item\"\n @click=${() => this.handleMenuItemClick('reflow')}\n >\n <temba-icon name=\"flow\" size=\"1.25\"></temba-icon>\n <div class=\"menu-item-title\">Reflow</div>\n </div>\n `\n : ''}\n </div>\n `;\n }\n}\n"]}
|
|
@@ -6,7 +6,7 @@ import { ACTION_GROUP_METADATA, SPLIT_GROUP_METADATA } from './types';
|
|
|
6
6
|
import { property } from 'lit/decorators.js';
|
|
7
7
|
import { RapidElement } from '../RapidElement';
|
|
8
8
|
import { getClasses } from '../utils';
|
|
9
|
-
import { isRightClick } from './utils';
|
|
9
|
+
import { isRightClick, renderClamped } from './utils';
|
|
10
10
|
import { getStore } from '../store/Store';
|
|
11
11
|
import { CustomEventType } from '../interfaces';
|
|
12
12
|
import { fromStore, zustand } from '../store/AppState';
|
|
@@ -171,24 +171,20 @@ export class CanvasNode extends RapidElement {
|
|
|
171
171
|
}
|
|
172
172
|
.title-spacer {
|
|
173
173
|
width: 1.8em;
|
|
174
|
-
|
|
175
174
|
}
|
|
176
175
|
|
|
177
176
|
.action:hover .drag-handle {
|
|
178
177
|
visibility: visible;
|
|
179
178
|
opacity: 0.7;
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
strong {
|
|
185
|
-
font-weight: 500;
|
|
186
179
|
}
|
|
187
180
|
|
|
188
181
|
.action .drag-handle:hover {
|
|
189
182
|
visibility: visible;
|
|
190
183
|
opacity: 1;
|
|
191
|
-
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
strong {
|
|
187
|
+
font-weight: 500;
|
|
192
188
|
}
|
|
193
189
|
|
|
194
190
|
.action .cn-title,
|
|
@@ -215,6 +211,8 @@ export class CanvasNode extends RapidElement {
|
|
|
215
211
|
|
|
216
212
|
.quick-replies {
|
|
217
213
|
margin-top: 0.5em;
|
|
214
|
+
display: flex;
|
|
215
|
+
flex-wrap: wrap;
|
|
218
216
|
}
|
|
219
217
|
|
|
220
218
|
.quick-reply {
|
|
@@ -222,9 +220,14 @@ export class CanvasNode extends RapidElement {
|
|
|
222
220
|
border: 1px solid #e0e0e0;
|
|
223
221
|
border-radius: calc(var(--curvature) * 1.5);
|
|
224
222
|
padding: 0.2em 1em;
|
|
225
|
-
display: inline-block;
|
|
226
223
|
font-size: 0.8em;
|
|
227
224
|
margin: 0.2em;
|
|
225
|
+
flex: 0 1 auto;
|
|
226
|
+
min-width: 0;
|
|
227
|
+
max-width: 100%;
|
|
228
|
+
overflow: hidden;
|
|
229
|
+
text-overflow: ellipsis;
|
|
230
|
+
white-space: nowrap;
|
|
228
231
|
}
|
|
229
232
|
|
|
230
233
|
.router-section {
|
|
@@ -269,6 +272,7 @@ export class CanvasNode extends RapidElement {
|
|
|
269
272
|
|
|
270
273
|
.router .body {
|
|
271
274
|
padding: 0.75em;
|
|
275
|
+
max-width: 180px;
|
|
272
276
|
}
|
|
273
277
|
|
|
274
278
|
.result-name {
|
|
@@ -408,6 +412,22 @@ export class CanvasNode extends RapidElement {
|
|
|
408
412
|
color: #9ca3af;
|
|
409
413
|
font-size: 0.9em;
|
|
410
414
|
}
|
|
415
|
+
|
|
416
|
+
/* On touch devices, always show interactive controls.
|
|
417
|
+
The .touch-device class is added to the editor on first touch. */
|
|
418
|
+
.touch-device .remove-button {
|
|
419
|
+
visibility: visible !important;
|
|
420
|
+
opacity: 0.7;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
.touch-device .action .drag-handle {
|
|
424
|
+
visibility: visible !important;
|
|
425
|
+
opacity: 0.7;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.touch-device .add-action-button {
|
|
429
|
+
opacity: 0.8 !important;
|
|
430
|
+
}
|
|
411
431
|
}`;
|
|
412
432
|
}
|
|
413
433
|
constructor() {
|
|
@@ -789,10 +809,11 @@ export class CanvasNode extends RapidElement {
|
|
|
789
809
|
handleActionMouseDown(event, action) {
|
|
790
810
|
if (isRightClick(event))
|
|
791
811
|
return;
|
|
792
|
-
// Don't handle clicks on the remove button, drag handle, or when action is in removing state
|
|
812
|
+
// Don't handle clicks on the remove button, drag handle, linked elements, or when action is in removing state
|
|
793
813
|
const target = event.target;
|
|
794
814
|
if (target.closest('.remove-button') ||
|
|
795
815
|
target.closest('.drag-handle') ||
|
|
816
|
+
target.closest('.linked-name') ||
|
|
796
817
|
this.actionRemovingState.has(action.uuid)) {
|
|
797
818
|
return;
|
|
798
819
|
}
|
|
@@ -809,10 +830,11 @@ export class CanvasNode extends RapidElement {
|
|
|
809
830
|
this.pendingActionClick = null;
|
|
810
831
|
return;
|
|
811
832
|
}
|
|
812
|
-
// Don't handle clicks on the remove button, drag handle, or when action is in removing state
|
|
833
|
+
// Don't handle clicks on the remove button, drag handle, linked elements, or when action is in removing state
|
|
813
834
|
const target = event.target;
|
|
814
835
|
if (target.closest('.remove-button') ||
|
|
815
836
|
target.closest('.drag-handle') ||
|
|
837
|
+
target.closest('.linked-name') ||
|
|
816
838
|
this.actionRemovingState.has(action.uuid)) {
|
|
817
839
|
this.actionClickStartPos = null;
|
|
818
840
|
this.pendingActionClick = null;
|
|
@@ -847,6 +869,61 @@ export class CanvasNode extends RapidElement {
|
|
|
847
869
|
this.actionClickStartPos = null;
|
|
848
870
|
this.pendingActionClick = null;
|
|
849
871
|
}
|
|
872
|
+
/* c8 ignore start -- touch-only handlers untestable in headless Chromium */
|
|
873
|
+
handleActionTouchStart(event, action) {
|
|
874
|
+
const target = event.target;
|
|
875
|
+
if (target.closest('.remove-button') ||
|
|
876
|
+
target.closest('.drag-handle') ||
|
|
877
|
+
target.closest('.linked-name') ||
|
|
878
|
+
this.actionRemovingState.has(action.uuid)) {
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
881
|
+
const touch = event.touches[0];
|
|
882
|
+
if (!touch)
|
|
883
|
+
return;
|
|
884
|
+
this.actionClickStartPos = { x: touch.clientX, y: touch.clientY };
|
|
885
|
+
this.pendingActionClick = { action, event: event };
|
|
886
|
+
}
|
|
887
|
+
handleActionTouchEnd(event, action) {
|
|
888
|
+
if (!this.pendingActionClick ||
|
|
889
|
+
this.pendingActionClick.action.uuid !== action.uuid) {
|
|
890
|
+
this.actionClickStartPos = null;
|
|
891
|
+
this.pendingActionClick = null;
|
|
892
|
+
return;
|
|
893
|
+
}
|
|
894
|
+
const target = event.target;
|
|
895
|
+
if (target.closest('.remove-button') ||
|
|
896
|
+
target.closest('.drag-handle') ||
|
|
897
|
+
target.closest('.linked-name') ||
|
|
898
|
+
this.actionRemovingState.has(action.uuid)) {
|
|
899
|
+
this.actionClickStartPos = null;
|
|
900
|
+
this.pendingActionClick = null;
|
|
901
|
+
return;
|
|
902
|
+
}
|
|
903
|
+
const touch = event.changedTouches[0];
|
|
904
|
+
if (this.actionClickStartPos && touch) {
|
|
905
|
+
const deltaX = touch.clientX - this.actionClickStartPos.x;
|
|
906
|
+
const deltaY = touch.clientY - this.actionClickStartPos.y;
|
|
907
|
+
const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
|
|
908
|
+
const editor = this.closest('temba-flow-editor');
|
|
909
|
+
const editorWasDragging = editor === null || editor === void 0 ? void 0 : editor.dragging;
|
|
910
|
+
if (distance <= DRAG_THRESHOLD && (!editor || !editorWasDragging)) {
|
|
911
|
+
const actionEl = event.currentTarget;
|
|
912
|
+
const origin = actionEl
|
|
913
|
+
? this.getTopCenter(actionEl)
|
|
914
|
+
: { x: touch.clientX, y: touch.clientY };
|
|
915
|
+
this.fireCustomEvent(CustomEventType.ActionEditRequested, {
|
|
916
|
+
action,
|
|
917
|
+
nodeUuid: this.node.uuid,
|
|
918
|
+
originX: origin.x,
|
|
919
|
+
originY: origin.y
|
|
920
|
+
});
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
this.actionClickStartPos = null;
|
|
924
|
+
this.pendingActionClick = null;
|
|
925
|
+
}
|
|
926
|
+
/* c8 ignore stop */
|
|
850
927
|
handleActionClick(event, action) {
|
|
851
928
|
// This method is kept for backward compatibility but should not be used
|
|
852
929
|
// The new mousedown/mouseup approach handles click vs drag properly
|
|
@@ -894,12 +971,13 @@ export class CanvasNode extends RapidElement {
|
|
|
894
971
|
handleNodeMouseDown(event) {
|
|
895
972
|
if (isRightClick(event))
|
|
896
973
|
return;
|
|
897
|
-
// Don't handle clicks on the remove button, exits, drag handle, or when node is in removing state
|
|
974
|
+
// Don't handle clicks on the remove button, exits, drag handle, linked elements, or when node is in removing state
|
|
898
975
|
const target = event.target;
|
|
899
976
|
if (target.closest('.remove-button') ||
|
|
900
977
|
target.closest('.exit') ||
|
|
901
978
|
target.closest('.exit-wrapper') ||
|
|
902
979
|
target.closest('.drag-handle') ||
|
|
980
|
+
target.closest('.linked-name') ||
|
|
903
981
|
this.actionRemovingState.has(this.node.uuid)) {
|
|
904
982
|
return;
|
|
905
983
|
}
|
|
@@ -915,12 +993,13 @@ export class CanvasNode extends RapidElement {
|
|
|
915
993
|
this.pendingNodeClick = null;
|
|
916
994
|
return;
|
|
917
995
|
}
|
|
918
|
-
// Don't handle clicks on the remove button, exits, drag handle, or when node is in removing state
|
|
996
|
+
// Don't handle clicks on the remove button, exits, drag handle, linked elements, or when node is in removing state
|
|
919
997
|
const target = event.target;
|
|
920
998
|
if (target.closest('.remove-button') ||
|
|
921
999
|
target.closest('.exit') ||
|
|
922
1000
|
target.closest('.exit-wrapper') ||
|
|
923
1001
|
target.closest('.drag-handle') ||
|
|
1002
|
+
target.closest('.linked-name') ||
|
|
924
1003
|
this.actionRemovingState.has(this.node.uuid)) {
|
|
925
1004
|
this.nodeClickStartPos = null;
|
|
926
1005
|
this.pendingNodeClick = null;
|
|
@@ -967,6 +1046,73 @@ export class CanvasNode extends RapidElement {
|
|
|
967
1046
|
this.nodeClickStartPos = null;
|
|
968
1047
|
this.pendingNodeClick = null;
|
|
969
1048
|
}
|
|
1049
|
+
/* c8 ignore start -- touch-only handlers */
|
|
1050
|
+
handleNodeTouchStart(event) {
|
|
1051
|
+
const target = event.target;
|
|
1052
|
+
if (target.closest('.remove-button') ||
|
|
1053
|
+
target.closest('.exit') ||
|
|
1054
|
+
target.closest('.exit-wrapper') ||
|
|
1055
|
+
target.closest('.drag-handle') ||
|
|
1056
|
+
target.closest('.linked-name') ||
|
|
1057
|
+
this.actionRemovingState.has(this.node.uuid)) {
|
|
1058
|
+
return;
|
|
1059
|
+
}
|
|
1060
|
+
const touch = event.touches[0];
|
|
1061
|
+
if (!touch)
|
|
1062
|
+
return;
|
|
1063
|
+
this.nodeClickStartPos = { x: touch.clientX, y: touch.clientY };
|
|
1064
|
+
this.pendingNodeClick = { event: event };
|
|
1065
|
+
}
|
|
1066
|
+
handleNodeTouchEnd(event) {
|
|
1067
|
+
if (!this.pendingNodeClick) {
|
|
1068
|
+
this.nodeClickStartPos = null;
|
|
1069
|
+
this.pendingNodeClick = null;
|
|
1070
|
+
return;
|
|
1071
|
+
}
|
|
1072
|
+
const target = event.target;
|
|
1073
|
+
if (target.closest('.remove-button') ||
|
|
1074
|
+
target.closest('.exit') ||
|
|
1075
|
+
target.closest('.exit-wrapper') ||
|
|
1076
|
+
target.closest('.drag-handle') ||
|
|
1077
|
+
target.closest('.linked-name') ||
|
|
1078
|
+
this.actionRemovingState.has(this.node.uuid)) {
|
|
1079
|
+
this.nodeClickStartPos = null;
|
|
1080
|
+
this.pendingNodeClick = null;
|
|
1081
|
+
return;
|
|
1082
|
+
}
|
|
1083
|
+
const touch = event.changedTouches[0];
|
|
1084
|
+
if (this.nodeClickStartPos && touch) {
|
|
1085
|
+
const deltaX = touch.clientX - this.nodeClickStartPos.x;
|
|
1086
|
+
const deltaY = touch.clientY - this.nodeClickStartPos.y;
|
|
1087
|
+
const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
|
|
1088
|
+
const editor = this.closest('temba-flow-editor');
|
|
1089
|
+
const editorWasDragging = editor === null || editor === void 0 ? void 0 : editor.dragging;
|
|
1090
|
+
if (distance <= 5 && (!editor || !editorWasDragging)) {
|
|
1091
|
+
if (this.node.router) {
|
|
1092
|
+
const origin = this.getTopCenter(this);
|
|
1093
|
+
if (this.node.actions && this.node.actions.length === 1) {
|
|
1094
|
+
this.fireCustomEvent(CustomEventType.ActionEditRequested, {
|
|
1095
|
+
action: this.node.actions[0],
|
|
1096
|
+
nodeUuid: this.node.uuid,
|
|
1097
|
+
originX: origin.x,
|
|
1098
|
+
originY: origin.y
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
else {
|
|
1102
|
+
this.fireCustomEvent(CustomEventType.NodeEditRequested, {
|
|
1103
|
+
node: this.node,
|
|
1104
|
+
nodeUI: this.ui,
|
|
1105
|
+
originX: origin.x,
|
|
1106
|
+
originY: origin.y
|
|
1107
|
+
});
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
this.nodeClickStartPos = null;
|
|
1113
|
+
this.pendingNodeClick = null;
|
|
1114
|
+
}
|
|
1115
|
+
/* c8 ignore stop */
|
|
970
1116
|
handleAddActionClick(event) {
|
|
971
1117
|
event.preventDefault();
|
|
972
1118
|
event.stopPropagation();
|
|
@@ -1225,6 +1371,8 @@ export class CanvasNode extends RapidElement {
|
|
|
1225
1371
|
class="action-content ${hasIssues ? 'has-issues' : ''}"
|
|
1226
1372
|
@mousedown=${(e) => !isDisabled && this.handleActionMouseDown(e, action)}
|
|
1227
1373
|
@mouseup=${(e) => !isDisabled && this.handleActionMouseUp(e, action)}
|
|
1374
|
+
@touchstart=${(e) => !isDisabled && this.handleActionTouchStart(e, action)}
|
|
1375
|
+
@touchend=${(e) => !isDisabled && this.handleActionTouchEnd(e, action)}
|
|
1228
1376
|
style="cursor: ${isDisabled ? 'not-allowed' : 'pointer'}"
|
|
1229
1377
|
>
|
|
1230
1378
|
${this.renderTitle(config, action, index, isRemoving)}
|
|
@@ -1278,10 +1426,12 @@ export class CanvasNode extends RapidElement {
|
|
|
1278
1426
|
class="body"
|
|
1279
1427
|
@mousedown=${(e) => this.handleNodeMouseDown(e)}
|
|
1280
1428
|
@mouseup=${(e) => this.handleNodeMouseUp(e)}
|
|
1429
|
+
@touchstart=${(e) => this.handleNodeTouchStart(e)}
|
|
1430
|
+
@touchend=${(e) => this.handleNodeTouchEnd(e)}
|
|
1281
1431
|
style="cursor: pointer;"
|
|
1282
1432
|
>
|
|
1283
|
-
Save as
|
|
1284
|
-
|
|
1433
|
+
${renderClamped(html `Save as
|
|
1434
|
+
<span class="result-name">${router.result_name}</span>`, `Save as ${router.result_name}`)}
|
|
1285
1435
|
</div>`
|
|
1286
1436
|
: null}
|
|
1287
1437
|
</div>`;
|
|
@@ -1327,9 +1477,11 @@ export class CanvasNode extends RapidElement {
|
|
|
1327
1477
|
})}
|
|
1328
1478
|
@mousedown=${(e) => this.handleNodeMouseDown(e)}
|
|
1329
1479
|
@mouseup=${(e) => this.handleNodeMouseUp(e)}
|
|
1480
|
+
@touchstart=${(e) => this.handleNodeTouchStart(e)}
|
|
1481
|
+
@touchend=${(e) => this.handleNodeTouchEnd(e)}
|
|
1330
1482
|
style="cursor: pointer;"
|
|
1331
1483
|
>
|
|
1332
|
-
<div class="cn-title">${displayName}</div>
|
|
1484
|
+
<div class="cn-title" title="${displayName}">${displayName}</div>
|
|
1333
1485
|
${this.renderExit(exit)}
|
|
1334
1486
|
</div>`;
|
|
1335
1487
|
})}
|
|
@@ -1391,6 +1543,8 @@ export class CanvasNode extends RapidElement {
|
|
|
1391
1543
|
<div
|
|
1392
1544
|
@mousedown=${(e) => this.handleNodeMouseDown(e)}
|
|
1393
1545
|
@mouseup=${(e) => this.handleNodeMouseUp(e)}
|
|
1546
|
+
@touchstart=${(e) => this.handleNodeTouchStart(e)}
|
|
1547
|
+
@touchend=${(e) => this.handleNodeTouchEnd(e)}
|
|
1394
1548
|
style="cursor: pointer;"
|
|
1395
1549
|
>
|
|
1396
1550
|
${this.renderNodeTitle(nodeConfig, this.node, this.ui, this.actionRemovingState.has(this.node.uuid))}
|