@nylas/web-elements 1.1.0-canary.7 → 1.1.0-canary.8
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/dist/cjs/add-circle-icon_22.cjs.entry.js +22 -11
- package/dist/cjs/add-circle-icon_22.cjs.entry.js.map +1 -1
- package/dist/cjs/forward-icon_6.cjs.entry.js +2 -2
- package/dist/cjs/google-logo-icon_4.cjs.entry.js +2 -2
- package/dist/cjs/index-7af03e3f.js +158 -1
- package/dist/cjs/index-c14ea8f5.js +362 -1
- package/dist/cjs/index.cjs.js +2 -2
- package/dist/cjs/{index.es-b12b7df1.js → index.es-4a7d8d3f.js} +2 -2
- package/dist/cjs/{index.es-b12b7df1.js.map → index.es-4a7d8d3f.js.map} +1 -1
- package/dist/cjs/{index.es-0a0f2d87.js → index.es-b2cce060.js} +2 -2
- package/dist/cjs/{index.es-0a0f2d87.js.map → index.es-b2cce060.js.map} +1 -1
- package/dist/cjs/{mailbox-store-05fa3bec.js → mailbox-store-a2f858b7.js} +3 -3
- package/dist/cjs/{mailbox-store-05fa3bec.js.map → mailbox-store-a2f858b7.js.map} +1 -1
- package/dist/cjs/{mailbox-store-14531fd4.js → mailbox-store-ecceb918.js} +3 -3
- package/dist/cjs/{mailbox-store-14531fd4.js.map → mailbox-store-ecceb918.js.map} +1 -1
- package/dist/cjs/multi-select-dropdown.cjs.entry.js +1 -1
- package/dist/cjs/nylas-additional-participants.cjs.entry.js +2 -2
- package/dist/cjs/{nylas-api-request-27c25287.js → nylas-api-request-28b4576a.js} +2 -2
- package/dist/cjs/{nylas-api-request-27c25287.js.map → nylas-api-request-28b4576a.js.map} +1 -1
- package/dist/cjs/{nylas-api-request-abdb8dd8.js → nylas-api-request-c9e0e347.js} +2 -2
- package/dist/cjs/{nylas-api-request-abdb8dd8.js.map → nylas-api-request-c9e0e347.js.map} +1 -1
- package/dist/cjs/nylas-availability-picker.cjs.entry.js +2 -2
- package/dist/cjs/nylas-booked-event-card.cjs.entry.js +2 -2
- package/dist/cjs/nylas-booked-event-card_10.cjs.entry.js +2 -2
- package/dist/cjs/nylas-booking-calendar-picker.cjs.entry.js +2 -2
- package/dist/cjs/nylas-booking-form.cjs.entry.js +2 -2
- package/dist/cjs/nylas-buffer-time.cjs.entry.js +2 -2
- package/dist/cjs/nylas-calendar-picker.cjs.entry.js +2 -2
- package/dist/cjs/nylas-cancel-booking-form.cjs.entry.js +2 -2
- package/dist/cjs/nylas-cancelled-event-card.cjs.entry.js +2 -2
- package/dist/cjs/nylas-composer.cjs.entry.js +1 -1
- package/dist/cjs/nylas-custom-booking-flow.cjs.entry.js +2 -2
- package/dist/cjs/nylas-date-picker.cjs.entry.js +2 -2
- package/dist/cjs/nylas-editor-tabs.cjs.entry.js +2 -2
- package/dist/cjs/nylas-event-description.cjs.entry.js +2 -2
- package/dist/cjs/nylas-event-duration.cjs.entry.js +2 -2
- package/dist/cjs/nylas-event-info.cjs.entry.js +2 -2
- package/dist/cjs/nylas-event-limits.cjs.entry.js +2 -2
- package/dist/cjs/nylas-event-title.cjs.entry.js +22 -11
- package/dist/cjs/nylas-event-title.cjs.entry.js.map +1 -1
- package/dist/cjs/nylas-form-card.cjs.entry.js +2 -2
- package/dist/cjs/nylas-if-state.cjs.entry.js +2 -2
- package/dist/cjs/nylas-limit-future-bookings.cjs.entry.js +2 -2
- package/dist/cjs/nylas-list-configurations.cjs.entry.js +2 -2
- package/dist/cjs/nylas-list-folders.cjs.entry.js +2 -2
- package/dist/cjs/nylas-list-threads.cjs.entry.js +2 -2
- package/dist/cjs/nylas-locale-switch.cjs.entry.js +2 -2
- package/dist/cjs/nylas-location-component.cjs.entry.js +2 -2
- package/dist/cjs/nylas-login.cjs.entry.js +2 -2
- package/dist/cjs/nylas-mailbox-pagination.cjs.entry.js +2 -2
- package/dist/cjs/nylas-mailbox-toolbar-button.cjs.entry.js +2 -2
- package/dist/cjs/nylas-mailbox.cjs.entry.js +3 -3
- package/dist/cjs/nylas-min-cancellation-notice.cjs.entry.js +2 -2
- package/dist/cjs/nylas-notification.cjs.entry.js +1 -1
- package/dist/cjs/nylas-provider.cjs.entry.js +4 -4
- package/dist/cjs/nylas-scheduler-editor.cjs.entry.js +3 -3
- package/dist/cjs/nylas-scheduling.cjs.entry.js +3 -3
- package/dist/cjs/nylas-selected-event-card.cjs.entry.js +2 -2
- package/dist/cjs/nylas-summarize-message-button.cjs.entry.js +2 -2
- package/dist/cjs/nylas-threads-refresh.cjs.entry.js +2 -2
- package/dist/cjs/nylas-threads-search.cjs.entry.js +2 -2
- package/dist/cjs/nylas-time-window-picker.cjs.entry.js +1 -1
- package/dist/cjs/nylas-timeslot-picker.cjs.entry.js +2 -2
- package/dist/cjs/nylas-view-email.cjs.entry.js +1 -1
- package/dist/cjs/nylas-view-thread.cjs.entry.js +2 -2
- package/dist/cjs/{register-component-c8b6e907.js → register-component-7ecacf90.js} +2 -2
- package/dist/cjs/{register-component-09ebdf31.js.map → register-component-7ecacf90.js.map} +1 -1
- package/dist/cjs/{register-component-09ebdf31.js → register-component-98ab6f54.js} +2 -2
- package/dist/cjs/{register-component-c8b6e907.js.map → register-component-98ab6f54.js.map} +1 -1
- package/dist/cjs/{scheduler-store-67dc1986.js → scheduler-store-22103c86.js} +2 -2
- package/dist/cjs/{scheduler-store-0081970d.js.map → scheduler-store-22103c86.js.map} +1 -1
- package/dist/cjs/{scheduler-store-0081970d.js → scheduler-store-fad9ed7a.js} +2 -2
- package/dist/cjs/{scheduler-store-67dc1986.js.map → scheduler-store-fad9ed7a.js.map} +1 -1
- package/dist/cjs/time-period-selector.cjs.entry.js +1 -1
- package/dist/cjs/{utils-20663d54.js → utils-9fc33c77.js} +46 -1
- package/dist/cjs/utils-9fc33c77.js.map +1 -0
- package/dist/cjs/{utils-2c7f0895.js → utils-d8cfc3be.js} +46 -1
- package/dist/cjs/{utils-2c7f0895.js.map → utils-d8cfc3be.js.map} +1 -1
- package/dist/collection/components/scheduler-editor/nylas-event-title/nylas-event-title.js +21 -10
- package/dist/collection/components/scheduler-editor/nylas-event-title/nylas-event-title.js.map +1 -1
- package/dist/collection/utils/utils.js +44 -0
- package/dist/collection/utils/utils.js.map +1 -1
- package/dist/components/index.es.js +1 -1
- package/dist/components/nylas-event-title2.js +21 -10
- package/dist/components/nylas-event-title2.js.map +1 -1
- package/dist/components/nylas-list-folders.js +1 -1
- package/dist/components/nylas-list-threads.js +1 -1
- package/dist/components/nylas-summarize-message-button2.js +1 -1
- package/dist/components/nylas-view-email2.js +1 -1
- package/dist/components/nylas-view-thread.js +1 -1
- package/dist/components/utils.js +45 -1
- package/dist/components/utils.js.map +1 -1
- package/dist/esm/add-circle-icon_22.entry.js +22 -11
- package/dist/esm/add-circle-icon_22.entry.js.map +1 -1
- package/dist/esm/forward-icon_6.entry.js +2 -2
- package/dist/esm/google-logo-icon_4.entry.js +2 -2
- package/dist/esm/index-7cb0dd3d.js +158 -1
- package/dist/esm/index-8362ce5c.js +362 -1
- package/dist/esm/{index.es-f57e612a.js → index.es-df564f87.js} +2 -2
- package/dist/esm/{index.es-f57e612a.js.map → index.es-df564f87.js.map} +1 -1
- package/dist/{nylas-web-elements/index.es-2842f8c8.js → esm/index.es-e4f027a2.js} +2 -2
- package/dist/esm/{index.es-2842f8c8.js.map → index.es-e4f027a2.js.map} +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/{nylas-web-elements/mailbox-store-d48269de.js → esm/mailbox-store-5075f820.js} +3 -3
- package/dist/{nylas-web-elements/mailbox-store-d48269de.js.map → esm/mailbox-store-5075f820.js.map} +1 -1
- package/dist/esm/{mailbox-store-47fc8a1a.js → mailbox-store-69c5c5f6.js} +3 -3
- package/dist/esm/{mailbox-store-47fc8a1a.js.map → mailbox-store-69c5c5f6.js.map} +1 -1
- package/dist/esm/multi-select-dropdown.entry.js +1 -1
- package/dist/esm/nylas-additional-participants.entry.js +2 -2
- package/dist/{nylas-web-elements/nylas-api-request-b085294d.js → esm/nylas-api-request-6a19db25.js} +2 -2
- package/dist/esm/{nylas-api-request-b085294d.js.map → nylas-api-request-6a19db25.js.map} +1 -1
- package/dist/esm/{nylas-api-request-8932547a.js → nylas-api-request-b49b1da6.js} +2 -2
- package/dist/esm/{nylas-api-request-8932547a.js.map → nylas-api-request-b49b1da6.js.map} +1 -1
- package/dist/esm/nylas-availability-picker.entry.js +2 -2
- package/dist/esm/nylas-booked-event-card.entry.js +2 -2
- package/dist/esm/nylas-booked-event-card_10.entry.js +2 -2
- package/dist/esm/nylas-booking-calendar-picker.entry.js +2 -2
- package/dist/esm/nylas-booking-form.entry.js +2 -2
- package/dist/esm/nylas-buffer-time.entry.js +2 -2
- package/dist/esm/nylas-calendar-picker.entry.js +2 -2
- package/dist/esm/nylas-cancel-booking-form.entry.js +2 -2
- package/dist/esm/nylas-cancelled-event-card.entry.js +2 -2
- package/dist/esm/nylas-composer.entry.js +1 -1
- package/dist/esm/nylas-custom-booking-flow.entry.js +2 -2
- package/dist/esm/nylas-date-picker.entry.js +2 -2
- package/dist/esm/nylas-editor-tabs.entry.js +2 -2
- package/dist/esm/nylas-event-description.entry.js +2 -2
- package/dist/esm/nylas-event-duration.entry.js +2 -2
- package/dist/esm/nylas-event-info.entry.js +2 -2
- package/dist/esm/nylas-event-limits.entry.js +2 -2
- package/dist/esm/nylas-event-title.entry.js +22 -11
- package/dist/esm/nylas-event-title.entry.js.map +1 -1
- package/dist/esm/nylas-form-card.entry.js +2 -2
- package/dist/esm/nylas-if-state.entry.js +2 -2
- package/dist/esm/nylas-limit-future-bookings.entry.js +2 -2
- package/dist/esm/nylas-list-configurations.entry.js +2 -2
- package/dist/esm/nylas-list-folders.entry.js +2 -2
- package/dist/esm/nylas-list-threads.entry.js +2 -2
- package/dist/esm/nylas-locale-switch.entry.js +2 -2
- package/dist/esm/nylas-location-component.entry.js +2 -2
- package/dist/esm/nylas-login.entry.js +2 -2
- package/dist/esm/nylas-mailbox-pagination.entry.js +2 -2
- package/dist/esm/nylas-mailbox-toolbar-button.entry.js +2 -2
- package/dist/esm/nylas-mailbox.entry.js +3 -3
- package/dist/esm/nylas-min-cancellation-notice.entry.js +2 -2
- package/dist/esm/nylas-notification.entry.js +1 -1
- package/dist/esm/nylas-provider.entry.js +4 -4
- package/dist/esm/nylas-scheduler-editor.entry.js +3 -3
- package/dist/esm/nylas-scheduling.entry.js +3 -3
- package/dist/esm/nylas-selected-event-card.entry.js +2 -2
- package/dist/esm/nylas-summarize-message-button.entry.js +2 -2
- package/dist/esm/nylas-threads-refresh.entry.js +2 -2
- package/dist/esm/nylas-threads-search.entry.js +2 -2
- package/dist/esm/nylas-time-window-picker.entry.js +1 -1
- package/dist/esm/nylas-timeslot-picker.entry.js +2 -2
- package/dist/esm/nylas-view-email.entry.js +1 -1
- package/dist/esm/nylas-view-thread.entry.js +2 -2
- package/dist/esm/{register-component-cf5c8420.js → register-component-b9cfcbaf.js} +2 -2
- package/dist/esm/{register-component-cf5c8420.js.map → register-component-b9cfcbaf.js.map} +1 -1
- package/dist/{nylas-web-elements/register-component-e5afe237.js → esm/register-component-ff6f5df4.js} +2 -2
- package/dist/esm/{register-component-e5afe237.js.map → register-component-ff6f5df4.js.map} +1 -1
- package/dist/esm/{scheduler-store-a175fc3e.js → scheduler-store-24fd0e91.js} +2 -2
- package/dist/{nylas-web-elements/scheduler-store-66c2168c.js.map → esm/scheduler-store-24fd0e91.js.map} +1 -1
- package/dist/esm/{scheduler-store-66c2168c.js → scheduler-store-e62b2146.js} +2 -2
- package/dist/esm/{scheduler-store-66c2168c.js.map → scheduler-store-e62b2146.js.map} +1 -1
- package/dist/esm/time-period-selector.entry.js +1 -1
- package/dist/{nylas-web-elements/utils-73d8a928.js → esm/utils-3e18e0b2.js} +46 -2
- package/dist/esm/{utils-73d8a928.js.map → utils-3e18e0b2.js.map} +1 -1
- package/dist/esm/{utils-d6204242.js → utils-db11d29c.js} +46 -2
- package/dist/esm/utils-db11d29c.js.map +1 -0
- package/dist/{esm/index.es-2842f8c8.js → nylas-web-elements/index.es-e4f027a2.js} +2 -2
- package/dist/nylas-web-elements/{index.es-2842f8c8.js.map → index.es-e4f027a2.js.map} +1 -1
- package/dist/nylas-web-elements/index.esm.js +2 -2
- package/dist/{esm/mailbox-store-d48269de.js → nylas-web-elements/mailbox-store-5075f820.js} +3 -3
- package/dist/{esm/mailbox-store-d48269de.js.map → nylas-web-elements/mailbox-store-5075f820.js.map} +1 -1
- package/dist/nylas-web-elements/multi-select-dropdown.entry.js +1 -1
- package/dist/nylas-web-elements/nylas-additional-participants.entry.js +2 -2
- package/dist/{esm/nylas-api-request-b085294d.js → nylas-web-elements/nylas-api-request-6a19db25.js} +2 -2
- package/dist/nylas-web-elements/{nylas-api-request-b085294d.js.map → nylas-api-request-6a19db25.js.map} +1 -1
- package/dist/nylas-web-elements/nylas-availability-picker.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-booked-event-card.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-booking-calendar-picker.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-booking-form.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-buffer-time.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-calendar-picker.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-cancel-booking-form.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-cancelled-event-card.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-composer.entry.js +1 -1
- package/dist/nylas-web-elements/nylas-custom-booking-flow.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-date-picker.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-editor-tabs.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-event-description.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-event-duration.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-event-info.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-event-limits.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-event-title.entry.js +22 -11
- package/dist/nylas-web-elements/nylas-event-title.entry.js.map +1 -1
- package/dist/nylas-web-elements/nylas-form-card.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-if-state.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-limit-future-bookings.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-list-configurations.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-list-folders.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-list-threads.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-locale-switch.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-location-component.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-login.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-mailbox-pagination.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-mailbox-toolbar-button.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-mailbox.entry.js +3 -3
- package/dist/nylas-web-elements/nylas-min-cancellation-notice.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-notification.entry.js +1 -1
- package/dist/nylas-web-elements/nylas-provider.entry.js +4 -4
- package/dist/nylas-web-elements/nylas-scheduler-editor.entry.js +3 -3
- package/dist/nylas-web-elements/nylas-scheduling.entry.js +3 -3
- package/dist/nylas-web-elements/nylas-selected-event-card.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-summarize-message-button.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-threads-refresh.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-threads-search.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-time-window-picker.entry.js +1 -1
- package/dist/nylas-web-elements/nylas-timeslot-picker.entry.js +2 -2
- package/dist/nylas-web-elements/nylas-view-email.entry.js +1 -1
- package/dist/nylas-web-elements/nylas-view-thread.entry.js +2 -2
- package/dist/nylas-web-elements/{p-30784693.entry.js → p-074919b0.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-f154a362.entry.js → p-21c3dcad.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-42791515.entry.js → p-22531c3d.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-7c55dfa0.entry.js → p-2d151de9.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-3909ec3f.entry.js → p-349f07e3.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-e03b2592.entry.js → p-4154e97e.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-bbf9aff2.entry.js → p-434fcde2.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-e22aa0b0.js → p-47b99cf5.js} +2 -2
- package/dist/nylas-web-elements/{p-22e5436c.js → p-4c12e1e9.js} +2 -2
- package/dist/nylas-web-elements/{p-80d6175c.entry.js → p-5caa0f36.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-df6d54c7.entry.js → p-7614e31e.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-1d25ca06.entry.js → p-7687925d.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-75a8d077.entry.js → p-828165d3.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-cc674b3b.entry.js → p-980c32d9.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-ad64c2b8.entry.js → p-a17f542c.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-a628eaeb.js → p-a3b1a98c.js} +2 -2
- package/dist/nylas-web-elements/{p-41dc0d93.js → p-ad7cf473.js} +2 -2
- package/dist/nylas-web-elements/p-ad7cf473.js.map +1 -0
- package/dist/nylas-web-elements/{p-343b8684.entry.js → p-bb89e973.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-1a91cce5.entry.js → p-c529dced.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-33b940fb.entry.js → p-d5375409.entry.js} +2 -2
- package/dist/nylas-web-elements/p-da74ec1c.entry.js +2 -0
- package/dist/nylas-web-elements/p-da74ec1c.entry.js.map +1 -0
- package/dist/nylas-web-elements/{p-9ea458c3.js → p-f0250b7d.js} +2 -2
- package/dist/nylas-web-elements/{p-eaa9151b.js → p-f0f3f350.js} +2 -2
- package/dist/nylas-web-elements/{p-6110351b.entry.js → p-f3974e14.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-f1f8f745.entry.js → p-f47163ac.entry.js} +2 -2
- package/dist/nylas-web-elements/{p-665ef10b.entry.js → p-f5d17746.entry.js} +2 -2
- package/dist/{esm/register-component-e5afe237.js → nylas-web-elements/register-component-ff6f5df4.js} +2 -2
- package/dist/nylas-web-elements/{register-component-e5afe237.js.map → register-component-ff6f5df4.js.map} +1 -1
- package/dist/nylas-web-elements/{scheduler-store-66c2168c.js → scheduler-store-e62b2146.js} +2 -2
- package/dist/{esm/scheduler-store-a175fc3e.js.map → nylas-web-elements/scheduler-store-e62b2146.js.map} +1 -1
- package/dist/nylas-web-elements/time-period-selector.entry.js +1 -1
- package/dist/{esm/utils-73d8a928.js → nylas-web-elements/utils-3e18e0b2.js} +46 -2
- package/dist/nylas-web-elements/{utils-73d8a928.js.map → utils-3e18e0b2.js.map} +1 -1
- package/dist/types/components/scheduler-editor/nylas-event-title/nylas-event-title.d.ts +1 -0
- package/dist/types/utils/utils.d.ts +1 -0
- package/package.json +1 -1
- package/dist/cjs/utils-20663d54.js.map +0 -1
- package/dist/esm/utils-d6204242.js.map +0 -1
- package/dist/nylas-web-elements/p-2b636359.entry.js +0 -2
- package/dist/nylas-web-elements/p-2b636359.entry.js.map +0 -1
- package/dist/nylas-web-elements/p-41dc0d93.js.map +0 -1
- /package/dist/nylas-web-elements/{p-30784693.entry.js.map → p-074919b0.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-f154a362.entry.js.map → p-21c3dcad.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-42791515.entry.js.map → p-22531c3d.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-7c55dfa0.entry.js.map → p-2d151de9.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-3909ec3f.entry.js.map → p-349f07e3.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-e03b2592.entry.js.map → p-4154e97e.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-bbf9aff2.entry.js.map → p-434fcde2.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-e22aa0b0.js.map → p-47b99cf5.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-22e5436c.js.map → p-4c12e1e9.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-80d6175c.entry.js.map → p-5caa0f36.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-df6d54c7.entry.js.map → p-7614e31e.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-1d25ca06.entry.js.map → p-7687925d.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-75a8d077.entry.js.map → p-828165d3.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-cc674b3b.entry.js.map → p-980c32d9.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-ad64c2b8.entry.js.map → p-a17f542c.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-a628eaeb.js.map → p-a3b1a98c.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-343b8684.entry.js.map → p-bb89e973.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-1a91cce5.entry.js.map → p-c529dced.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-33b940fb.entry.js.map → p-d5375409.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-9ea458c3.js.map → p-f0250b7d.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-eaa9151b.js.map → p-f0f3f350.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-6110351b.entry.js.map → p-f3974e14.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-f1f8f745.entry.js.map → p-f47163ac.entry.js.map} +0 -0
- /package/dist/nylas-web-elements/{p-665ef10b.entry.js.map → p-f5d17746.entry.js.map} +0 -0
|
@@ -13,7 +13,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
13
13
|
return Reflect.metadata(k, v);
|
|
14
14
|
};
|
|
15
15
|
import { RegisterComponent } from "../../../common/register-component";
|
|
16
|
-
import { debug, getBrowser } from "../../../utils/utils";
|
|
16
|
+
import { debug, getBrowser, isNonPrintableKey } from "../../../utils/utils";
|
|
17
17
|
import { Host, h } from "@stencil/core";
|
|
18
18
|
import { EVENT_TITLE_TOKENS as eventTitleTokens } from "../../../common/constants";
|
|
19
19
|
export class NylasEventTitle {
|
|
@@ -101,7 +101,7 @@ export class NylasEventTitle {
|
|
|
101
101
|
return outputHtml;
|
|
102
102
|
}
|
|
103
103
|
getCurrentSelectionForBrowser() {
|
|
104
|
-
const getSelectionTextData = (nodeValue, offset, node) => {
|
|
104
|
+
const getSelectionTextData = (nodeValue, offset, node, allSelected) => {
|
|
105
105
|
const text = nodeValue.replace(/[\u200B-\u200D\uFEFF]/g, '');
|
|
106
106
|
const dollarIndex = text.lastIndexOf('$');
|
|
107
107
|
const lastWord = text.substring(dollarIndex).split(' ')[0];
|
|
@@ -111,24 +111,29 @@ export class NylasEventTitle {
|
|
|
111
111
|
lastWord,
|
|
112
112
|
currentText: text,
|
|
113
113
|
node,
|
|
114
|
+
allSelected,
|
|
114
115
|
};
|
|
115
116
|
};
|
|
117
|
+
const isAllSelected = (selection) => selection.anchorOffset === 0 && selection.focusOffset === selection.focusNode?.nodeValue?.length;
|
|
116
118
|
const currentBrowser = getBrowser();
|
|
117
119
|
switch (currentBrowser) {
|
|
118
120
|
case 'Chrome':
|
|
119
121
|
const shadowRootSelection = this.host.shadowRoot?.getSelection();
|
|
120
122
|
const focusNode = shadowRootSelection?.focusNode;
|
|
121
123
|
const focusNodeValue = focusNode?.nodeValue || '';
|
|
122
|
-
|
|
124
|
+
const allSelected = shadowRootSelection && isAllSelected(shadowRootSelection);
|
|
125
|
+
return getSelectionTextData(focusNodeValue, shadowRootSelection?.focusOffset || -1, focusNode, allSelected);
|
|
123
126
|
case 'Firefox':
|
|
124
127
|
const selection = document.getSelection();
|
|
125
128
|
const anchorNodeValue = selection?.anchorNode?.nodeValue || '';
|
|
126
|
-
|
|
129
|
+
const allSelectedFirefox = selection && isAllSelected(selection);
|
|
130
|
+
return getSelectionTextData(anchorNodeValue, selection?.focusOffset || -1, selection?.anchorNode, allSelectedFirefox);
|
|
127
131
|
case 'Safari':
|
|
128
132
|
const windowSelection = window.getSelection();
|
|
129
133
|
const anchorNode = windowSelection?.getComposedRanges(this.host.shadowRoot)[0];
|
|
130
134
|
const currentText = anchorNode?.startContainer?.nodeValue || '';
|
|
131
|
-
|
|
135
|
+
const allSelectedSafari = windowSelection && isAllSelected(windowSelection);
|
|
136
|
+
return getSelectionTextData(currentText, anchorNode?.endOffset || -1, anchorNode?.startContainer, allSelectedSafari);
|
|
132
137
|
default:
|
|
133
138
|
console.warn('Browser not supported');
|
|
134
139
|
return null;
|
|
@@ -164,6 +169,10 @@ export class NylasEventTitle {
|
|
|
164
169
|
this.updateEventTitle(textContent);
|
|
165
170
|
}
|
|
166
171
|
handleInputKeyDown(event) {
|
|
172
|
+
const selection = this.getCurrentSelectionForBrowser();
|
|
173
|
+
if (selection?.allSelected && !isNonPrintableKey(event)) {
|
|
174
|
+
this.titleRef.innerHTML = '';
|
|
175
|
+
}
|
|
167
176
|
if (event.key === 'Enter') {
|
|
168
177
|
event.preventDefault();
|
|
169
178
|
const activeOption = this.host.shadowRoot?.getElementById(this.ariaActivedescendant);
|
|
@@ -209,10 +218,12 @@ export class NylasEventTitle {
|
|
|
209
218
|
this.resetDropdown();
|
|
210
219
|
}
|
|
211
220
|
else if (event.key === 'Backspace' || event.key === 'Delete') {
|
|
212
|
-
const selection = this.getCurrentSelectionForBrowser();
|
|
213
221
|
if (selection?.currentText.startsWith('${')) {
|
|
214
222
|
selection?.node?.parentNode && selection.node.parentNode.removeChild(selection.node);
|
|
215
223
|
}
|
|
224
|
+
if (this.titleRef.textContent === '' || selection?.currentText === '' || selection?.allSelected) {
|
|
225
|
+
this.titleRef.innerHTML = '';
|
|
226
|
+
}
|
|
216
227
|
}
|
|
217
228
|
}
|
|
218
229
|
selectOption(e, option) {
|
|
@@ -247,12 +258,12 @@ export class NylasEventTitle {
|
|
|
247
258
|
const newTextNodeAfter = document.createTextNode(textAfter);
|
|
248
259
|
if (textAfter !== '') {
|
|
249
260
|
textNode.replaceWith(newTextNode, tagSpan, newTextNodeAfter);
|
|
250
|
-
newRange.setStart(newTextNodeAfter,
|
|
261
|
+
newRange.setStart(newTextNodeAfter, 1);
|
|
251
262
|
}
|
|
252
263
|
else {
|
|
253
264
|
const afterNode = document.createTextNode('\u200B');
|
|
254
265
|
textNode.replaceWith(newTextNode, tagSpan, afterNode);
|
|
255
|
-
newRange.setStart(afterNode,
|
|
266
|
+
newRange.setStart(afterNode, 1);
|
|
256
267
|
}
|
|
257
268
|
this.resetDropdown();
|
|
258
269
|
this.titleRef.focus();
|
|
@@ -291,10 +302,10 @@ export class NylasEventTitle {
|
|
|
291
302
|
return (h("div", { class: "token-label" }, h("span", { class: "token" }, token.token), h("span", { class: "description" }, token.description)));
|
|
292
303
|
}
|
|
293
304
|
render() {
|
|
294
|
-
return (h(Host, { key: '
|
|
305
|
+
return (h(Host, { key: 'e0ddf6c13a5a0c0d2e0db9188365418fb7484dcf' }, h("div", { key: 'a3b8e594c8d9632709e777891f04df0aaaf7c5c3', class: "nylas-event-title", part: "net" }, h("label", { key: 'e5794d2cd8be0b1666bfa67c3ea657da5dc8d45d', htmlFor: "title" }, "Event title", h("span", { key: '1210caceb7bf824f01559460e1c5e572cb2dad92', class: "required" }, "*"), h("span", { key: '4280ec285221e6db76ca08723fe3888a1d2643e3', class: "label-icon" }, h("tooltip-component", { key: 'd6c05fb79cf39656af7589a2e9de9ef832d7a2f8' }, h("info-icon", { key: 'a4659d97d60d00dfcc2c993e70da5cfd05904f78', slot: "tooltip-icon" }), h("span", { key: '738bfa669eec42b417be02fbad0584af34044c83', slot: "tooltip-content" }, "Enter a title for your event.")))), h("div", { key: 'df102dc899f8de91154689d9cdaae28465380622', class: {
|
|
295
306
|
title: true,
|
|
296
307
|
error: this.validationError !== '',
|
|
297
|
-
}, part: "net__title", ref: el => (this.titleRef = el), contentEditable: "true", onInput: e => this.handleChange(e), onKeyDown: event => this.handleInputKeyDown(event) }), this.showTokens && this.filteredTokens?.length > 0 && (h("div", { class: "token-options", part: "net__dropdown-content" }, h("ul", { tabindex: "-1", role: "listbox", "aria-label": this.name, "aria-activedescendant": this.ariaActivedescendant }, this.filteredTokens.map(option => (h("li", { tabindex: "0", key: option.label, id: option.label, class: { active: this.ariaActivedescendant === option.label }, onClick: e => this.selectOption(e, option), role: "option" }, this.getLabelHTML(option.labelHTML))))))), h("span", { key: '
|
|
308
|
+
}, part: "net__title", ref: el => (this.titleRef = el), contentEditable: "true", onInput: e => this.handleChange(e), onKeyDown: event => this.handleInputKeyDown(event) }), this.showTokens && this.filteredTokens?.length > 0 && (h("div", { class: "token-options", part: "net__dropdown-content" }, h("ul", { tabindex: "-1", role: "listbox", "aria-label": this.name, "aria-activedescendant": this.ariaActivedescendant }, this.filteredTokens.map(option => (h("li", { tabindex: "0", key: option.label, id: option.label, class: { active: this.ariaActivedescendant === option.label }, onClick: e => this.selectOption(e, option), role: "option" }, this.getLabelHTML(option.labelHTML))))))), h("span", { key: 'ec769eea7e2e3ff6d64bef0f5099540c93ba80ab', class: "help-text" }, "Create a dynamic templated event title by typing $. Learn more"), this.validationError != '' && h("span", { class: "error-message" }, this.validationError))));
|
|
298
309
|
}
|
|
299
310
|
static get is() { return "nylas-event-title"; }
|
|
300
311
|
static get encapsulation() { return "shadow"; }
|
package/dist/collection/components/scheduler-editor/nylas-event-title/nylas-event-title.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nylas-event-title.js","sourceRoot":"","sources":["../../../../src/components/scheduler-editor/nylas-event-title/nylas-event-title.tsx"],"names":[],"mappings":"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","sourcesContent":["import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, getBrowser } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter, Listen } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { EVENT_TITLE_TOKENS as eventTitleTokens } from '@/common/constants';\nimport { Configuration } from '@nylas/core';\n\ninterface CustomShadowRoot extends ShadowRoot {\n getSelection: () => Selection | null;\n}\n\ntype Token = {\n token: string;\n value: string;\n description: string;\n};\n\n/**\n * The `nylas-event-title` component is a form input for the title of an event.\n * @part net - The event title container\n * @part net__title - The event title input\n * @part net__dropdown-content - The token options container\n */\n@Component({\n tag: 'nylas-event-title',\n styleUrl: 'nylas-event-title.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasEventTitle {\n @Element() host!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n // Properties\n /**\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * The title of the event from the cofiguration.\n */\n @Prop() eventTitle?: string = this.selectedConfiguration?.event_booking?.title;\n /**\n * The name attribute of this component.\n */\n @Prop() name: string = 'title';\n\n // State variables\n /**\n * Whether to show the tokens dropdown.\n */\n @State() showTokens: boolean = false;\n /**\n * The available token options for the dropdown.\n */\n @State() availableTokens: { label: string; value: string; labelHTML: Token }[] = eventTitleTokens.map(token => ({\n label: token.token,\n value: token.value,\n labelHTML: token,\n }));\n /**\n * The filtered token options for the dropdown based on the current query.\n */\n @State() filteredTokens: { label: string; value: string; labelHTML: Token }[] = this.availableTokens;\n /**\n * The aria-activedescendant attribute value. This is used to indicate the\n * currently active descendant in the tokens dropdown.\n */\n @State() ariaActivedescendant: string = '';\n /**\n * Stores the reference to the current word being typed.\n * This is used to update the event title with the selected token tag when\n * an option is selected from the dropdown by clicking on it.\n */\n @State() currentWord: {\n $value: string;\n fullText: string;\n index: number;\n focusOffset: number;\n } = { $value: '', fullText: '', index: -1, focusOffset: -1 };\n\n @State() validationError: string = '';\n\n // Reference to the title div element\n private titleRef!: HTMLDivElement;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-event-title', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('ariaActivedescendant')\n ariaActivedescendantChangedHandler(newValue: string) {\n debug('nylas-event-title', 'ariaActivedescendantChangedHandler', newValue);\n if (newValue !== '') {\n const activeOption = this.host.shadowRoot?.getElementById(newValue);\n activeOption?.classList.add('active');\n } else {\n const options = this.host.shadowRoot?.querySelectorAll('.token-options li.active');\n options?.forEach(option => option.classList.remove('active'));\n }\n }\n\n @Watch('selectedConfiguration')\n configChangedHandler(newVal) {\n const title = newVal?.event_booking?.title;\n if (title) {\n this.updateEventTitleFromProp(title);\n }\n }\n\n // Events\n /**\n * This event is fired when the value of the event title changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-event-title', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-event-title', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-event-title', 'componentDidLoad');\n this.updateEventTitleFromProp(this.eventTitle || '');\n }\n\n disconnectedCallback() {\n debug('nylas-event-title', 'disconnectedCallback');\n }\n\n @Listen('formSubmitted', { target: 'window' })\n formSubmittedHandler(event: CustomEvent) {\n debug('nylas-event-title', 'formSubmittedHandler', event);\n if (!this.internals?.validity?.valid) {\n this.validationError = 'Event title is required';\n } else {\n this.validationError = '';\n }\n }\n\n updateEventTitleFromProp(newValue: string) {\n debug('nylas-event-title', 'eventTitleChangedHandler', newValue);\n if (this.titleRef) {\n this.titleRef.innerHTML = this.highlightTokens(newValue);\n this.titleRef.focus();\n if (typeof this.internals.setValidity === 'function') {\n if (newValue === '') {\n this.internals?.setValidity({ customError: true }, `Event title is required`, this.titleRef);\n } else {\n this.internals?.setValidity({ customError: false });\n }\n }\n }\n }\n\n highlightTokens(title: string) {\n let outputHtml = title;\n\n eventTitleTokens.forEach(tokenObj => {\n const token = tokenObj.value;\n // Create a regular expression that matches the token as a whole word\n const regex = new RegExp(`(\\\\${token})(?!\\\\w)`, 'g');\n // Replace the token with a span element\n outputHtml = outputHtml.replace(regex, '<span class=\"highlighted-tag\">$1</span>');\n });\n return outputHtml;\n }\n\n getCurrentSelectionForBrowser() {\n const getSelectionTextData = (nodeValue, offset, node) => {\n // Remove zero-width space characters from the text, because they are not visible and cause issues with the selection\n const text = nodeValue.replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n const dollarIndex = text.lastIndexOf('$');\n const lastWord = text.substring(dollarIndex).split(' ')[0];\n return {\n focusOffset: offset,\n dollarIndex,\n lastWord,\n currentText: text,\n node,\n };\n };\n\n const currentBrowser = getBrowser();\n switch (currentBrowser) {\n case 'Chrome':\n const shadowRootSelection = (this.host.shadowRoot as CustomShadowRoot)?.getSelection();\n const focusNode = shadowRootSelection?.focusNode;\n const focusNodeValue = focusNode?.nodeValue || '';\n return getSelectionTextData(focusNodeValue, shadowRootSelection?.focusOffset || -1, focusNode);\n case 'Firefox':\n const selection = document.getSelection();\n const anchorNodeValue = selection?.anchorNode?.nodeValue || '';\n return getSelectionTextData(anchorNodeValue, selection?.focusOffset || -1, selection?.anchorNode);\n case 'Safari':\n const windowSelection = window.getSelection();\n const anchorNode = (windowSelection as any)?.getComposedRanges(this.host.shadowRoot as CustomShadowRoot)[0];\n const currentText = anchorNode?.startContainer?.nodeValue || '';\n return getSelectionTextData(currentText, anchorNode?.endOffset || -1, anchorNode?.startContainer);\n default:\n console.warn('Browser not supported');\n return null;\n }\n }\n\n handleChange(event: Event) {\n const textContent = (event.target as HTMLDivElement).textContent || '';\n // All browsers handle Selection within Shadow DOM differently, so get the current selection based on the browser\n const currentSelection = this.getCurrentSelectionForBrowser();\n if (!currentSelection) {\n this.updateEventTitle(textContent);\n this.resetDropdown();\n return;\n }\n const { focusOffset, dollarIndex, lastWord, currentText } = currentSelection;\n\n if (dollarIndex === -1 || focusOffset < dollarIndex) {\n this.updateEventTitle(textContent);\n this.resetDropdown();\n return;\n }\n if (lastWord.startsWith('$')) {\n this.showTokens = true;\n // Update the current word being typed, we need this reference to update the event title with the selected token\n // because the user can select an option from the dropdown by clicking on it, which will not trigger the input event.\n this.currentWord = {\n $value: lastWord,\n fullText: currentText,\n index: dollarIndex,\n focusOffset,\n };\n this.populateSuggestionsDropdown(lastWord);\n } else {\n this.resetDropdown();\n }\n this.updateEventTitle(textContent);\n }\n\n handleInputKeyDown(event) {\n if (event.key === 'Enter') {\n event.preventDefault();\n const activeOption = this.host.shadowRoot?.getElementById(this.ariaActivedescendant);\n if (activeOption) {\n activeOption.click();\n this.ariaActivedescendant = '';\n }\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n const activeOption = this.host.shadowRoot?.getElementById(this.ariaActivedescendant);\n if (activeOption) {\n const nextOption = activeOption.nextElementSibling;\n if (nextOption) {\n this.ariaActivedescendant = nextOption.id;\n } else {\n this.ariaActivedescendant = this.filteredTokens[0].label;\n }\n } else {\n this.ariaActivedescendant = this.filteredTokens[0].label;\n }\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n const activeOption = this.host.shadowRoot?.getElementById(this.ariaActivedescendant);\n if (activeOption) {\n const prevOption = activeOption.previousElementSibling;\n if (prevOption) {\n this.ariaActivedescendant = prevOption.id;\n } else {\n this.ariaActivedescendant = this.filteredTokens[this.filteredTokens.length - 1].label;\n }\n } else {\n this.ariaActivedescendant = this.filteredTokens[this.filteredTokens.length - 1].label;\n }\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.resetDropdown();\n } else if (event.key === 'Backspace' || event.key === 'Delete') {\n const selection = this.getCurrentSelectionForBrowser();\n if (selection?.currentText.startsWith('${')) {\n selection?.node?.parentNode && selection.node.parentNode.removeChild(selection.node);\n }\n }\n }\n\n selectOption(e: Event, option: { label: string; value: string; labelHTML: Token }) {\n e.preventDefault();\n const word = this.currentWord.fullText;\n const dollarWord = this.currentWord.$value;\n\n // Traverse the DOM to find the text node that contains the current word fullText\n let currentNode = this.titleRef.firstChild;\n let textNode: ChildNode | null = null;\n\n while (currentNode) {\n if (currentNode.nodeType === 3) {\n const currentNodeText = currentNode.textContent?.replace(/[\\u200B-\\u200D\\uFEFF]/g, '') || '';\n const wordText = word.replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n if (currentNodeText.includes(wordText)) {\n textNode = currentNode;\n break;\n }\n }\n currentNode = currentNode.nextSibling;\n }\n\n if (!textNode) {\n return;\n }\n // Split the text node into three parts: text before the token, the token, and text after the token\n const text = textNode.textContent || '';\n const index = text.indexOf(dollarWord);\n const textBefore = text.substring(0, index);\n const textAfter = text.substring(index + dollarWord.length);\n const newTextNode = document.createTextNode(textBefore);\n const newRange = document.createRange();\n\n // Create a new span element to replace the text node\n const tagSpan = document.createElement('span');\n tagSpan.classList.add('highlighted-tag');\n tagSpan.textContent = `${option.value}`;\n const newTextNodeAfter = document.createTextNode(textAfter);\n\n if (textAfter !== '') {\n // If there is text after the token, add it to the new span element\n textNode.replaceWith(newTextNode, tagSpan, newTextNodeAfter);\n newRange.setStart(newTextNodeAfter, 0);\n } else {\n // If there is no text after the token, add a zero-width space character (Without this, the cursor will not move outside the highlighted span element)\n const afterNode = document.createTextNode('\\u200B');\n textNode.replaceWith(newTextNode, tagSpan, afterNode);\n newRange.setStart(afterNode, 0);\n }\n\n // Hide the dropdown\n this.resetDropdown();\n this.titleRef.focus();\n\n // Set the focus to the new span element\n const sel = window.getSelection();\n newRange.collapse(true);\n sel?.removeAllRanges();\n sel?.addRange(newRange);\n\n // Update the event title with the selected token\n this.updateEventTitle(this.titleRef.textContent || '');\n }\n\n populateSuggestionsDropdown(query: string = '') {\n this.filteredTokens = this.availableTokens.filter(obj => {\n return obj.label.startsWith(query.toString()) || obj.value.startsWith(query.toString());\n });\n\n // Set the first option as the active descendant\n if (this.filteredTokens.length > 0) {\n this.ariaActivedescendant = this.filteredTokens[0].label;\n }\n }\n\n updateEventTitle(text: string) {\n const value = text.replace(/ +/g, ' ');\n if (value === '') {\n this.internals?.setValidity({ customError: true }, `Event title is required`, this.titleRef);\n this.validationError = 'Event title is required';\n } else {\n this.internals?.setValidity({ customError: false });\n this.validationError = '';\n }\n this.internals?.setFormValue(value, this.name);\n this.valueChanged.emit({ value: value, name: this.name });\n }\n\n resetDropdown() {\n this.showTokens = false;\n this.ariaActivedescendant = '';\n }\n\n getLabelHTML(token: { token: string; description: string }) {\n return (\n <div class=\"token-label\">\n <span class=\"token\">{token.token}</span>\n <span class=\"description\">{token.description}</span>\n </div>\n );\n }\n\n @RegisterComponent<NylasEventTitle, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-event-title',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-event-title\" part=\"net\">\n <label htmlFor=\"title\">\n Event title<span class=\"required\">*</span>\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">Enter a title for your event.</span>\n </tooltip-component>\n </span>\n </label>\n <div\n class={{\n title: true,\n error: this.validationError !== '',\n }}\n part=\"net__title\"\n ref={el => (this.titleRef = el as HTMLDivElement)}\n contentEditable=\"true\"\n onInput={e => this.handleChange(e)}\n onKeyDown={event => this.handleInputKeyDown(event)}\n ></div>\n {this.showTokens && this.filteredTokens?.length > 0 && (\n <div class=\"token-options\" part=\"net__dropdown-content\">\n <ul tabindex=\"-1\" role=\"listbox\" aria-label={this.name} aria-activedescendant={this.ariaActivedescendant}>\n {this.filteredTokens.map(option => (\n <li\n tabindex=\"0\"\n key={option.label}\n id={option.label}\n class={{ active: this.ariaActivedescendant === option.label }}\n onClick={e => this.selectOption(e, option)}\n role=\"option\"\n >\n {this.getLabelHTML(option.labelHTML)}\n </li>\n ))}\n </ul>\n </div>\n )}\n <span class=\"help-text\">Create a dynamic templated event title by typing $. Learn more</span>\n {this.validationError != '' && <span class=\"error-message\">{this.validationError}</span>}\n </div>\n </Host>\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"nylas-event-title.js","sourceRoot":"","sources":["../../../../src/components/scheduler-editor/nylas-event-title/nylas-event-title.tsx"],"names":[],"mappings":"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","sourcesContent":["import { RegisterComponent } from '@/common/register-component';\nimport { NylasSchedulerConfigConnector } from '@/connector/nylas-scheduler-config-connector';\nimport { debug, getBrowser, isNonPrintableKey } from '@/utils/utils';\nimport { AttachInternals, Component, Host, State, h, Element, Prop, Watch, Event, EventEmitter, Listen } from '@stencil/core';\nimport { NylasSchedulerEditor } from '../nylas-scheduler-editor/nylas-scheduler-editor';\nimport { EVENT_TITLE_TOKENS as eventTitleTokens } from '@/common/constants';\nimport { Configuration } from '@nylas/core';\n\ninterface CustomShadowRoot extends ShadowRoot {\n getSelection: () => Selection | null;\n}\n\ntype Token = {\n token: string;\n value: string;\n description: string;\n};\n\n/**\n * The `nylas-event-title` component is a form input for the title of an event.\n * @part net - The event title container\n * @part net__title - The event title input\n * @part net__dropdown-content - The token options container\n */\n@Component({\n tag: 'nylas-event-title',\n styleUrl: 'nylas-event-title.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class NylasEventTitle {\n @Element() host!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n // Properties\n /**\n * The selected config\n */\n @Prop() selectedConfiguration?: Configuration;\n /**\n * The title of the event from the cofiguration.\n */\n @Prop() eventTitle?: string = this.selectedConfiguration?.event_booking?.title;\n /**\n * The name attribute of this component.\n */\n @Prop() name: string = 'title';\n\n // State variables\n /**\n * Whether to show the tokens dropdown.\n */\n @State() showTokens: boolean = false;\n /**\n * The available token options for the dropdown.\n */\n @State() availableTokens: { label: string; value: string; labelHTML: Token }[] = eventTitleTokens.map(token => ({\n label: token.token,\n value: token.value,\n labelHTML: token,\n }));\n /**\n * The filtered token options for the dropdown based on the current query.\n */\n @State() filteredTokens: { label: string; value: string; labelHTML: Token }[] = this.availableTokens;\n /**\n * The aria-activedescendant attribute value. This is used to indicate the\n * currently active descendant in the tokens dropdown.\n */\n @State() ariaActivedescendant: string = '';\n /**\n * Stores the reference to the current word being typed.\n * This is used to update the event title with the selected token tag when\n * an option is selected from the dropdown by clicking on it.\n */\n @State() currentWord: {\n $value: string;\n fullText: string;\n index: number;\n focusOffset: number;\n } = { $value: '', fullText: '', index: -1, focusOffset: -1 };\n\n @State() validationError: string = '';\n\n // Reference to the title div element\n private titleRef!: HTMLDivElement;\n\n /**\n * When a name prop is passed, stencil does not automatically set the name attribute on the host element.\n * Since this component is form-associated, the name attribute is required for form submission.\n * This is a workaround to ensure that the name attribute is set on the host element.\n */\n @Watch('name')\n elementNameChangedHandler(newValue: string) {\n debug('nylas-event-title', 'elementNameChangedHandler', newValue);\n this.host.setAttribute('name', newValue);\n }\n\n @Watch('ariaActivedescendant')\n ariaActivedescendantChangedHandler(newValue: string) {\n debug('nylas-event-title', 'ariaActivedescendantChangedHandler', newValue);\n if (newValue !== '') {\n const activeOption = this.host.shadowRoot?.getElementById(newValue);\n activeOption?.classList.add('active');\n } else {\n const options = this.host.shadowRoot?.querySelectorAll('.token-options li.active');\n options?.forEach(option => option.classList.remove('active'));\n }\n }\n\n @Watch('selectedConfiguration')\n configChangedHandler(newVal) {\n const title = newVal?.event_booking?.title;\n if (title) {\n this.updateEventTitleFromProp(title);\n }\n }\n\n // Events\n /**\n * This event is fired when the value of the event title changes.\n */\n @Event() valueChanged!: EventEmitter<{\n value: string;\n name: string;\n }>;\n\n // Lifecycle methods\n connectedCallback() {\n debug('nylas-event-title', 'connectedCallback');\n }\n\n componentWillLoad() {\n debug('nylas-event-title', 'componentWillLoad');\n this.host.setAttribute('name', this.name);\n }\n\n componentDidLoad() {\n debug('nylas-event-title', 'componentDidLoad');\n this.updateEventTitleFromProp(this.eventTitle || '');\n }\n\n disconnectedCallback() {\n debug('nylas-event-title', 'disconnectedCallback');\n }\n\n @Listen('formSubmitted', { target: 'window' })\n formSubmittedHandler(event: CustomEvent) {\n debug('nylas-event-title', 'formSubmittedHandler', event);\n if (!this.internals?.validity?.valid) {\n this.validationError = 'Event title is required';\n } else {\n this.validationError = '';\n }\n }\n\n updateEventTitleFromProp(newValue: string) {\n debug('nylas-event-title', 'eventTitleChangedHandler', newValue);\n if (this.titleRef) {\n this.titleRef.innerHTML = this.highlightTokens(newValue);\n this.titleRef.focus();\n if (typeof this.internals.setValidity === 'function') {\n if (newValue === '') {\n this.internals?.setValidity({ customError: true }, `Event title is required`, this.titleRef);\n } else {\n this.internals?.setValidity({ customError: false });\n }\n }\n }\n }\n\n highlightTokens(title: string) {\n let outputHtml = title;\n\n eventTitleTokens.forEach(tokenObj => {\n const token = tokenObj.value;\n // Create a regular expression that matches the token as a whole word\n const regex = new RegExp(`(\\\\${token})(?!\\\\w)`, 'g');\n // Replace the token with a span element\n outputHtml = outputHtml.replace(regex, '<span class=\"highlighted-tag\">$1</span>');\n });\n return outputHtml;\n }\n\n getCurrentSelectionForBrowser() {\n const getSelectionTextData = (nodeValue, offset, node, allSelected) => {\n // Remove zero-width space characters from the text, because they are not visible and cause issues with the selection\n const text = nodeValue.replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n const dollarIndex = text.lastIndexOf('$');\n const lastWord = text.substring(dollarIndex).split(' ')[0];\n return {\n focusOffset: offset,\n dollarIndex,\n lastWord,\n currentText: text,\n node,\n allSelected,\n };\n };\n\n // Check if the selection has selected all the text in the node, we need this to handle the case where the user selects all the text and then types or deletes\n const isAllSelected = (selection: Selection) => selection.anchorOffset === 0 && selection.focusOffset === selection.focusNode?.nodeValue?.length;\n\n const currentBrowser = getBrowser();\n switch (currentBrowser) {\n case 'Chrome':\n const shadowRootSelection = (this.host.shadowRoot as CustomShadowRoot)?.getSelection();\n const focusNode = shadowRootSelection?.focusNode;\n const focusNodeValue = focusNode?.nodeValue || '';\n const allSelected = shadowRootSelection && isAllSelected(shadowRootSelection);\n return getSelectionTextData(focusNodeValue, shadowRootSelection?.focusOffset || -1, focusNode, allSelected);\n case 'Firefox':\n const selection = document.getSelection();\n const anchorNodeValue = selection?.anchorNode?.nodeValue || '';\n const allSelectedFirefox = selection && isAllSelected(selection);\n return getSelectionTextData(anchorNodeValue, selection?.focusOffset || -1, selection?.anchorNode, allSelectedFirefox);\n case 'Safari':\n const windowSelection = window.getSelection();\n const anchorNode = (windowSelection as any)?.getComposedRanges(this.host.shadowRoot as CustomShadowRoot)[0];\n const currentText = anchorNode?.startContainer?.nodeValue || '';\n const allSelectedSafari = windowSelection && isAllSelected(windowSelection);\n return getSelectionTextData(currentText, anchorNode?.endOffset || -1, anchorNode?.startContainer, allSelectedSafari);\n default:\n console.warn('Browser not supported');\n return null;\n }\n }\n\n handleChange(event: Event) {\n const textContent = (event.target as HTMLDivElement).textContent || '';\n // All browsers handle Selection within Shadow DOM differently, so get the current selection based on the browser\n const currentSelection = this.getCurrentSelectionForBrowser();\n if (!currentSelection) {\n this.updateEventTitle(textContent);\n this.resetDropdown();\n return;\n }\n const { focusOffset, dollarIndex, lastWord, currentText } = currentSelection;\n\n if (dollarIndex === -1 || focusOffset < dollarIndex) {\n this.updateEventTitle(textContent);\n this.resetDropdown();\n return;\n }\n if (lastWord.startsWith('$')) {\n this.showTokens = true;\n // Update the current word being typed, we need this reference to update the event title with the selected token\n // because the user can select an option from the dropdown by clicking on it, which will not trigger the input event.\n this.currentWord = {\n $value: lastWord,\n fullText: currentText,\n index: dollarIndex,\n focusOffset,\n };\n this.populateSuggestionsDropdown(lastWord);\n } else {\n this.resetDropdown();\n }\n this.updateEventTitle(textContent);\n }\n\n handleInputKeyDown(event) {\n const selection = this.getCurrentSelectionForBrowser();\n\n // If no text is remaining in the title, reset the title to an empty string\n if (selection?.allSelected && !isNonPrintableKey(event)) {\n this.titleRef.innerHTML = '';\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n const activeOption = this.host.shadowRoot?.getElementById(this.ariaActivedescendant);\n if (activeOption) {\n activeOption.click();\n this.ariaActivedescendant = '';\n }\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n const activeOption = this.host.shadowRoot?.getElementById(this.ariaActivedescendant);\n if (activeOption) {\n const nextOption = activeOption.nextElementSibling;\n if (nextOption) {\n this.ariaActivedescendant = nextOption.id;\n } else {\n this.ariaActivedescendant = this.filteredTokens[0].label;\n }\n } else {\n this.ariaActivedescendant = this.filteredTokens[0].label;\n }\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n const activeOption = this.host.shadowRoot?.getElementById(this.ariaActivedescendant);\n if (activeOption) {\n const prevOption = activeOption.previousElementSibling;\n if (prevOption) {\n this.ariaActivedescendant = prevOption.id;\n } else {\n this.ariaActivedescendant = this.filteredTokens[this.filteredTokens.length - 1].label;\n }\n } else {\n this.ariaActivedescendant = this.filteredTokens[this.filteredTokens.length - 1].label;\n }\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.resetDropdown();\n } else if (event.key === 'Backspace' || event.key === 'Delete') {\n if (selection?.currentText.startsWith('${')) {\n selection?.node?.parentNode && selection.node.parentNode.removeChild(selection.node);\n }\n if (this.titleRef.textContent === '' || selection?.currentText === '' || selection?.allSelected) {\n this.titleRef.innerHTML = '';\n }\n }\n }\n\n selectOption(e: Event, option: { label: string; value: string; labelHTML: Token }) {\n e.preventDefault();\n const word = this.currentWord.fullText;\n const dollarWord = this.currentWord.$value;\n\n // Traverse the DOM to find the text node that contains the current word fullText\n let currentNode = this.titleRef.firstChild;\n let textNode: ChildNode | null = null;\n\n while (currentNode) {\n if (currentNode.nodeType === 3) {\n const currentNodeText = currentNode.textContent?.replace(/[\\u200B-\\u200D\\uFEFF]/g, '') || '';\n const wordText = word.replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n if (currentNodeText.includes(wordText)) {\n textNode = currentNode;\n break;\n }\n }\n currentNode = currentNode.nextSibling;\n }\n\n if (!textNode) {\n return;\n }\n // Split the text node into three parts: text before the token, the token, and text after the token\n const text = textNode.textContent || '';\n const index = text.indexOf(dollarWord);\n const textBefore = text.substring(0, index);\n const textAfter = text.substring(index + dollarWord.length);\n const newTextNode = document.createTextNode(textBefore);\n const newRange = document.createRange();\n\n // Create a new span element to replace the text node\n const tagSpan = document.createElement('span');\n tagSpan.classList.add('highlighted-tag');\n tagSpan.textContent = `${option.value}`;\n const newTextNodeAfter = document.createTextNode(textAfter);\n\n if (textAfter !== '') {\n // If there is text after the token, add it to the new span element\n textNode.replaceWith(newTextNode, tagSpan, newTextNodeAfter);\n newRange.setStart(newTextNodeAfter, 1);\n } else {\n // If there is no text after the token, add a zero-width space character (Without this, the cursor will not move outside the highlighted span element)\n const afterNode = document.createTextNode('\\u200B');\n textNode.replaceWith(newTextNode, tagSpan, afterNode);\n newRange.setStart(afterNode, 1);\n }\n\n // Hide the dropdown\n this.resetDropdown();\n this.titleRef.focus();\n\n // Set the focus to the new span element\n const sel = window.getSelection();\n newRange.collapse(true);\n sel?.removeAllRanges();\n sel?.addRange(newRange);\n\n // Update the event title with the selected token\n this.updateEventTitle(this.titleRef.textContent || '');\n }\n\n populateSuggestionsDropdown(query: string = '') {\n this.filteredTokens = this.availableTokens.filter(obj => {\n return obj.label.startsWith(query.toString()) || obj.value.startsWith(query.toString());\n });\n\n // Set the first option as the active descendant\n if (this.filteredTokens.length > 0) {\n this.ariaActivedescendant = this.filteredTokens[0].label;\n }\n }\n\n updateEventTitle(text: string) {\n const value = text.replace(/ +/g, ' ');\n if (value === '') {\n this.internals?.setValidity({ customError: true }, `Event title is required`, this.titleRef);\n this.validationError = 'Event title is required';\n } else {\n this.internals?.setValidity({ customError: false });\n this.validationError = '';\n }\n this.internals?.setFormValue(value, this.name);\n this.valueChanged.emit({ value: value, name: this.name });\n }\n\n resetDropdown() {\n this.showTokens = false;\n this.ariaActivedescendant = '';\n }\n\n getLabelHTML(token: { token: string; description: string }) {\n return (\n <div class=\"token-label\">\n <span class=\"token\">{token.token}</span>\n <span class=\"description\">{token.description}</span>\n </div>\n );\n }\n\n @RegisterComponent<NylasEventTitle, NylasSchedulerConfigConnector, Exclude<NylasSchedulerEditor['stores'], undefined>>({\n name: 'nylas-event-title',\n stateToProps: new Map([['schedulerConfig.selectedConfiguration', 'selectedConfiguration']]),\n eventToProps: {},\n fireRegisterEvent: true,\n })\n render() {\n return (\n <Host>\n <div class=\"nylas-event-title\" part=\"net\">\n <label htmlFor=\"title\">\n Event title<span class=\"required\">*</span>\n <span class=\"label-icon\">\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">Enter a title for your event.</span>\n </tooltip-component>\n </span>\n </label>\n <div\n class={{\n title: true,\n error: this.validationError !== '',\n }}\n part=\"net__title\"\n ref={el => (this.titleRef = el as HTMLDivElement)}\n contentEditable=\"true\"\n onInput={e => this.handleChange(e)}\n onKeyDown={event => this.handleInputKeyDown(event)}\n ></div>\n {this.showTokens && this.filteredTokens?.length > 0 && (\n <div class=\"token-options\" part=\"net__dropdown-content\">\n <ul tabindex=\"-1\" role=\"listbox\" aria-label={this.name} aria-activedescendant={this.ariaActivedescendant}>\n {this.filteredTokens.map(option => (\n <li\n tabindex=\"0\"\n key={option.label}\n id={option.label}\n class={{ active: this.ariaActivedescendant === option.label }}\n onClick={e => this.selectOption(e, option)}\n role=\"option\"\n >\n {this.getLabelHTML(option.labelHTML)}\n </li>\n ))}\n </ul>\n </div>\n )}\n <span class=\"help-text\">Create a dynamic templated event title by typing $. Learn more</span>\n {this.validationError != '' && <span class=\"error-message\">{this.validationError}</span>}\n </div>\n </Host>\n );\n }\n}\n"]}
|
|
@@ -305,4 +305,48 @@ export function parsePreviewLink(link, config) {
|
|
|
305
305
|
});
|
|
306
306
|
return link;
|
|
307
307
|
}
|
|
308
|
+
export function isNonPrintableKey(event) {
|
|
309
|
+
if (event.keyCode < 48 ||
|
|
310
|
+
(event.keyCode > 90 && event.keyCode < 96) ||
|
|
311
|
+
(event.keyCode > 111 && event.keyCode < 186) ||
|
|
312
|
+
event.keyCode > 222 ||
|
|
313
|
+
event.keyCode === 32 ||
|
|
314
|
+
event.keyCode === 91 ||
|
|
315
|
+
event.keyCode === 92 ||
|
|
316
|
+
event.keyCode === 93 ||
|
|
317
|
+
(event.keyCode >= 112 && event.keyCode <= 123) ||
|
|
318
|
+
(event.keyCode >= 37 && event.keyCode <= 40)) {
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
if (event.ctrlKey || event.altKey || event.metaKey) {
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
const shiftSpecialChars = [
|
|
325
|
+
48,
|
|
326
|
+
49,
|
|
327
|
+
50,
|
|
328
|
+
51,
|
|
329
|
+
52,
|
|
330
|
+
53,
|
|
331
|
+
54,
|
|
332
|
+
55,
|
|
333
|
+
56,
|
|
334
|
+
57,
|
|
335
|
+
186,
|
|
336
|
+
187,
|
|
337
|
+
188,
|
|
338
|
+
189,
|
|
339
|
+
190,
|
|
340
|
+
191,
|
|
341
|
+
192,
|
|
342
|
+
219,
|
|
343
|
+
220,
|
|
344
|
+
221,
|
|
345
|
+
222,
|
|
346
|
+
];
|
|
347
|
+
if (event.shiftKey && shiftSpecialChars.includes(event.keyCode)) {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
308
352
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,MAAc,EAAE,IAAY;IAChE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACjF,CAAC;AAGD,MAAM,UAAU,eAAe,CAAC,GAAQ;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAA2B,EAAE,GAAG,EAAE,EAAE;QAClE,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAG,IAAW;IAClC,IAAI,MAAM,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAG,IAAW;IAClC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAMD,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;QAElB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE;YACnD,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QAGN,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE;YACnD,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;SACf,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAoB;IAClD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC;AACrF,CAAC;AAGD,MAAM,UAAU,kBAAkB,CAAC,YAAyB,EAAE,UAAkB,EAAE,EAAE,eAAuB,CAAC,EAAE,MAAc,CAAC;IAC3H,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1F,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,MAAM,YAAY,GAAG,MAAM;SACxB,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACb,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC;SAC3B,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,CAAC;SAAM,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,YAAY,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;IACvE,CAAC;SAAM,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,EAAE,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,YAAY,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;IACtG,CAAC;AACH,CAAC;AAGD,MAAM,SAAS,GAGV;IACH,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/B,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/B,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;IAC7B,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;IAC3B,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;IAClC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC9B,EAAE,MAAM,EAAE,MAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE;CACpD,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAU,EAAE,EAAE;IAC1C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE;QACvD,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAEvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACzC,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC;QACD,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAU;IAC1C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAU;IAC3C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAU;IAC1C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAW,EAAE,KAAW;IAChD,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;AACrI,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAW,EAAE,KAAW;IAClD,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,OAAO,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,KAAK,GAAG,UAAU,CAAC;IACzB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,WAAW,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3F,MAAM,kBAAkB,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAGzG,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,OAAO,CAAC,IAAI,IAAI,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3E,MAAM,iBAAiB,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,SAAS,MAAM,CAAC,CAAC;IAC7E,IAAI,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAGtC,MAAM,KAAK,GAAG,8BAA8B,CAAC;IAC7C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IAElD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/D,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAU;IAC1C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAU;IACxC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAGD,MAAM,UAAU,aAAa,CAAC,IAAU;IACtC,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,UAAe,EAAiB,EAAE;IACnE,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC;AAC/C,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,EAAE;IAC5C,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,YAAY,GAAG,oEAAoE,CAAC;IAC1F,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC,EAAE;IAC7C,MAAM,KAAK,GAAG,wCAAwC,CAAC;IACvD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,OAA2B,IAAI;IACrE,IAAI,WAAW,GAAG,KAAK,EAAE,CAAC;IAC1B,IAAI,IAAI,EAAE,CAAC;QACT,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IAGD,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;IAElD,IAAI,WAAW,CAAC;IAEhB,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;QAE1B,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,eAAe,EAAE,QAAQ,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QAEN,WAAW,GAAG,WAAW,CAAC;IAC5B,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAK;IAC1C,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAE5B,IAAI,aAAa,GAAG,EAAE,CAAC;IAGvB,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE1D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,aAAa,IAAI,GAAG,GAAG,SAAS,CAAC;IACnC,CAAC;SAAM,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,aAAa,IAAI,SAAS,CAAC;IAC7B,CAAC;IAED,aAAa,IAAI,GAAG,CAAC;IAGrB,IAAI,mBAAmB,KAAK,SAAS,IAAI,mBAAmB,IAAI,EAAE,EAAE,CAAC;QACnE,aAAa,IAAI,IAAI,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,aAAa,IAAI,mBAAmB,GAAG,GAAG,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,aAAa,IAAI,mBAAmB,CAAC;QACvC,CAAC;IACH,CAAC;IAGD,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9C,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC;QAC1B,aAAa,IAAI,GAAG,CAAC;IACvB,CAAC;IACD,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC;QAC1B,aAAa,IAAI,GAAG,CAAC;IACvB,CAAC;IAGD,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACpC,IAAI,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YACxC,aAAa,IAAI,IAAI,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,aAAa,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IAEnD,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACjF,IAAI,KAAK,GAAG,YAAY,CAAC;IAGzB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAGvC,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;IACnB,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAG3B,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAG7D,OAAO,GAAG,cAAc,IAAI,gBAAgB,GAAG,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9E,IAAI,KAAK,GAAG,YAAY,CAAC;IAEzB,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QAClD,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;SAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QAC3D,KAAK,GAAG,CAAC,CAAC;IACZ,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAI;IAChC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE;QAAE,OAAO,IAAI,EAAE,GAAG,EAAE,CAAC;IACxE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,IAAI,EAAE,GAAG,EAAE,CAAC;IAC1E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAO;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC;IACvB,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC;IAG/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAG1E,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAG9E,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAGrC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAGhC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAGrC,MAAM,cAAc,GAAG,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElD,IAAI,cAAc;QAAE,OAAO,iBAAiB,CAAC;IAC7C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,IAAI;QAAE,OAAO,mBAAmB,CAAC;IACrC,IAAI,YAAY;QAAE,OAAO,eAAe,CAAC;IAEzC,OAAO,SAAS,CAAC;AACnB,CAAC;AAOD,MAAM,UAAU,YAAY,CAAU,IAAO,EAAE,QAAkC,IAAI;IACnF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACtB,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAA+B;IAE5E,MAAM,YAAY,GAAG;QACnB,WAAW,EAAE,MAAM,EAAE,EAAE;QACvB,IAAI,EAAE,MAAM,EAAE,EAAE;KACjB,CAAC;IAGF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACtC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { DataResponseError, DataResponseReturnType } from '@/common/types';\nimport { Configuration, EmailName, Message } from '@nylas/core';\nimport dayjs from 'dayjs';\nimport { RRule } from 'rrule';\n\nexport function format(first: string, middle: string, last: string): string {\n return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');\n}\n\n// Utility function to remove undefined values from an object\nexport function removeUndefined(obj: any) {\n return Object.keys(obj).reduce((acc: { [key: string]: any }, key) => {\n if (obj[key] !== undefined) {\n acc[key] = obj[key];\n }\n return acc;\n }, {});\n}\n\nexport function debug(...args: any[]) {\n if (window && window.localStorage && window.localStorage.getItem('debug')) {\n console.debug(...args);\n }\n}\n\nexport function error(...args: any[]) {\n console.error(...args);\n}\n\nexport function uniqueID() {\n return Math.random().toString(36).substr(2, 9);\n}\n\nexport function formatEventName(propKey: string) {\n return propKey.toString().replace(/^on/, '');\n}\n\n// Utility function to format a date as a time if it is today, or a short\n// date format if it is not toda, using the new Intl API. For example:\n// If the date is today, it will return \"12:00 PM\"\n// If the date is not today, it will return \"Jan 4, 23\"\nexport function formatDateTime(dateTimestamp: number) {\n const date = new Date(dateTimestamp * 1000);\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n if (date >= today) {\n // If the day is not today, we return the month and day (e.g. Jan 4)\n const formatter = new Intl.DateTimeFormat('default', {\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n });\n return formatter.format(date);\n } else {\n // If the day is today, we only return the time (e.g. 12:00 PM) without\n // the month and day\n const formatter = new Intl.DateTimeFormat('default', {\n month: 'short',\n day: 'numeric',\n });\n return formatter.format(date);\n }\n}\n\nexport function formatRecipient(recipient: EmailName) {\n return recipient.name ? `${recipient.name} - ${recipient.email}` : recipient.email;\n}\n\n// Formats the particpants of a thread into a string\nexport function formatParticipants(participants: EmailName[], meEmail: string = '', messageCount: number = 1, max: number = 3) {\n const me = participants.find(p => p.email?.toLowerCase() === meEmail.toLowerCase());\n const others = participants.filter(p => p.email?.toLowerCase() !== meEmail.toLowerCase());\n const othersCount = others.length;\n const othersString = others\n .slice(0, max)\n .map(r => r.name || r.email)\n .join(', ');\n if (othersCount === 0) {\n return me ? 'me' : '';\n } else if (othersCount === 1) {\n return me && messageCount > 1 ? `me, ${othersString}` : othersString;\n } else if (othersCount === 2) {\n return me ? `me, ${othersString}` : `${othersString}`;\n } else {\n return me ? `me, ${othersString}, +${othersCount - max}` : `${othersString}, +${othersCount - max}`;\n }\n}\n\n// https://blog.webdevsimplified.com/2020-07/relative-time-format/\nconst DIVISIONS: Array<{\n amount: number;\n name: Intl.RelativeTimeFormatUnit;\n}> = [\n { amount: 60, name: 'seconds' },\n { amount: 60, name: 'minutes' },\n { amount: 24, name: 'hours' },\n { amount: 7, name: 'days' },\n { amount: 4.34524, name: 'weeks' },\n { amount: 12, name: 'months' },\n { amount: Number.POSITIVE_INFINITY, name: 'years' },\n];\n\nexport const formatTimeAgo = (date: Date) => {\n const formatter = new Intl.RelativeTimeFormat(undefined, {\n numeric: 'auto',\n });\n const now = new Date();\n let duration = (date.getTime() - now.getTime()) / 1000;\n\n for (let i = 0; i <= DIVISIONS.length; i++) {\n const division = DIVISIONS[i];\n if (Math.abs(duration) < division.amount) {\n return formatter.format(Math.round(duration), division.name);\n }\n duration /= division.amount;\n }\n};\n\nexport function getLastDayOfMonth(date: Date) {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n}\n\nexport function getFirstDayOfMonth(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\nexport function getFirstHourOfDay(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0);\n}\n\nexport function isSameDay(date1: Date, date2: Date) {\n return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() === date2.getDate();\n}\n\nexport function isSameMonth(date1: Date, date2: Date) {\n return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth();\n}\n\nexport function toTitleCase(str: string) {\n return str.replace(/\\w\\S*/g, txt => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase());\n}\n\nexport function formatFolderName(folderName: string) {\n return folderName.replace('CATEGORY_', '').replace(/_/g, ' ');\n}\n\nexport function detectHTMLOrPlainText(html: string) {\n const regex = /<[^>]*>/g;\n return regex.test(html) ? 'html' : 'plain';\n}\n\nexport function detectIfMessageIsHTML(message: Message) {\n const headers = message.headers;\n const contentType = (headers && headers.find(h => h.name === 'Content-Type')?.value) || '';\n const contentDisposition = (headers && headers.find(h => h.name === 'Content-Disposition')?.value) || '';\n\n // If the content type is HTML, then we know it's HTML\n if (contentType.includes('text/html')) {\n return true;\n }\n\n // If the content disposition is inline, then we know it's HTML\n if (contentDisposition.includes('inline')) {\n return true;\n }\n\n // If the body is HTML, then we know it's HTML\n if (message.body && detectHTMLOrPlainText(message.body) === 'html') {\n return true;\n }\n\n // Otherwise, we assume it's plain text\n return false;\n}\n\nexport function parsePlainTextToHTML(text: string) {\n const paragraphs = text.split('\\n').filter(line => line.trim().length > 0);\n const wrappedParagraphs = paragraphs.map(paragraph => `<p>${paragraph}</p>`);\n let body = wrappedParagraphs.join('');\n\n // Replace links with anchor tags\n const regex = /((?:https?|ftp):\\/\\/[^\\s]+)/g;\n body = body.replace(regex, '<a href=\"$1\">$1</a>');\n\n return body;\n}\n\nexport function htmlToPlainText(html: string) {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n}\n\nexport function getStartHourOfDay(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0);\n}\n\nexport function getEndHourOfDay(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23);\n}\n\n// Zero pad a number to two digits\nexport function get24HourTime(date: Date) {\n return `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;\n}\n\nexport function getUserTimezone() {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport const getEventRecurrence = (recurrence: any): string | null => {\n if (recurrence.includes('RRULE:')) {\n recurrence = recurrence.replace('RRULE:', '');\n return RRule.fromString(recurrence).toText();\n }\n return RRule.fromString(recurrence).toText();\n};\n\n// Validate time format part\nexport const validateTimeFormatInput = text => {\n if (text === '') {\n return true;\n }\n const regexPattern = /^(0[0-9]|1[0-2]|^[0-9])(:[0-5][0-9][ap]m?|:[0-5][0-9]|:[0-5]|:)?$/i;\n return regexPattern.test(text);\n};\n// Validate exact time format\nexport const validateExactTimeFormat = input => {\n const regex = /^(0[1-9]|1[0-2]):([0-5][0-9])(am|pm)$/i;\n return regex.test(input);\n};\n\nexport function roundToNearest15Minutes(time: dayjs.Dayjs | null = null) {\n let currentTime = dayjs(); // Get the current time\n if (time) {\n currentTime = time;\n }\n\n // Calculate the remainder when dividing the minutes by 15\n const minuteRemainder = currentTime.minute() % 15;\n\n let roundedTime;\n\n if (minuteRemainder !== 0) {\n // Round up to the next 15-minute interval\n roundedTime = currentTime.add(15 - minuteRemainder, 'minute');\n } else {\n // Keep the current time as it is\n roundedTime = currentTime;\n }\n\n return roundedTime;\n}\n\nexport function autocompleteTimeFormat(input) {\n const currentTime = dayjs(); // Get the current time\n\n let completedTime = '';\n\n // Extract the hour and minute components\n const [inputHour, inputMinuteWithAmPm] = input.split(':');\n // Autocomplete the hour component\n if (inputHour.length === 1) {\n completedTime += '0' + inputHour;\n } else if (inputHour.length === 2) {\n completedTime += inputHour;\n }\n\n completedTime += ':';\n\n // Autocomplete the minute component\n if (inputMinuteWithAmPm === undefined || inputMinuteWithAmPm == '') {\n completedTime += '00';\n } else {\n if (inputMinuteWithAmPm.length === 1) {\n completedTime += inputMinuteWithAmPm + '0';\n } else {\n completedTime += inputMinuteWithAmPm;\n }\n }\n\n // Set the am/pm indicator based on the provided input\n const amPmIndicator = completedTime.slice(-1); // Extract the am/pm indicator from input\n\n if (amPmIndicator === 'a') {\n completedTime += 'm';\n }\n if (amPmIndicator === 'p') {\n completedTime += 'm';\n }\n\n // Set the am/pm indicator based on the current time if no indecator present inside input\n if (completedTime.slice(-1) !== 'm') {\n if (completedTime.split(':')[0] == '00') {\n completedTime += 'am';\n } else {\n completedTime += currentTime.format('a');\n }\n }\n\n return completedTime;\n}\n\nexport function formatTime(time: string) {\n return dayjs(time, 'hh:mma');\n}\n\nexport function convertTo12HourFormat(timeStr: string) {\n // Split the time into hours and minutes\n const [hoursInitial, minutes] = timeStr.split(':').map(num => parseInt(num, 10));\n let hours = hoursInitial;\n\n // Determine AM or PM\n const ampm = hours >= 12 ? 'pm' : 'am';\n\n // Convert hours from 24-hour to 12-hour format\n hours = hours % 12;\n hours = hours ? hours : 12; // the hour '0' should be '12'\n\n // Format hours and minutes to ensure two digits\n const formattedHours = hours.toString().padStart(2, '0');\n const formattedMinutes = minutes.toString().padStart(2, '0');\n\n // Construct the 12-hour format time string\n return `${formattedHours}:${formattedMinutes}${ampm}`;\n}\n\nexport function convertTo24HourFormat(timeStr: string) {\n const [time, modifier] = timeStr.split(/(am|pm)/i);\n const [hoursInitial, minutes] = time.split(':').map(num => parseInt(num, 10));\n let hours = hoursInitial;\n\n if (modifier.toLowerCase() === 'pm' && hours < 12) {\n hours += 12;\n } else if (modifier.toLowerCase() === 'am' && hours === 12) {\n hours = 0;\n }\n\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n}\n\nexport function timeToMinutes(time) {\n const [hours, minutesPart] = time.match(/(\\d+):(\\d+)(am|pm)/).slice(1);\n let minutes = parseInt(hours, 10) * 60 + parseInt(minutesPart, 10);\n if (time.includes('pm') && parseInt(hours, 10) < 12) minutes += 12 * 60;\n if (time.includes('am') && parseInt(hours, 10) === 12) minutes -= 12 * 60;\n return minutes;\n}\n\nexport function minutesToTime(minutes) {\n const h = Math.floor(minutes / 60);\n const m = minutes % 60;\n return `${h}:${m < 10 ? '0' : ''}${m}`;\n}\n\nexport function getBrowser() {\n const ua = navigator.userAgent;\n\n // Check for Chrome (also in Edge and Opera)\n const isChrome = /Chrome/.test(ua) && /Google Inc/.test(navigator.vendor);\n\n // Check for Safari (also in Chrome and Opera)\n const isSafari = /Safari/.test(ua) && /Apple Computer/.test(navigator.vendor);\n\n // Check for Firefox\n const isFirefox = /Firefox/.test(ua);\n\n // Check for Internet Explorer\n const isIE = /Trident/.test(ua);\n\n // Check for Edge (the legacy version)\n const isEdgeLegacy = /Edge/.test(ua);\n\n // Check for Edge (the Chromium-based version)\n const isEdgeChromium = isChrome && /Edg/.test(ua);\n\n if (isEdgeChromium) return 'Edge (Chromium)';\n if (isChrome) return 'Chrome';\n if (isSafari) return 'Safari';\n if (isFirefox) return 'Firefox';\n if (isIE) return 'Internet Explorer';\n if (isEdgeLegacy) return 'Edge (Legacy)';\n\n return 'Unknown';\n}\n\n/**\n * Utility function to create a response object with data and error.\n * @param data any The data to return.\n * @param error DataResponseError The error to return.\n */\nexport function dataResponse<T = any>(data: T, error: DataResponseError | null = null): DataResponseReturnType<T> {\n if (error) {\n return [null, error];\n }\n return [data, null];\n}\n\n/**\n * Utility function to parse a preview link with placeholders.\n * @param link string A preview link with placeholders.\n * @param config Partial<Configuration> The configuration object to use to replace the placeholders.\n * @returns string The preview link with the placeholders replaced.\n */\nexport function parsePreviewLink(link: string, config?: Partial<Configuration>) {\n // Replacements\n const replacements = {\n 'config.id': config?.id,\n 'id': config?.id,\n };\n\n // Replace the placeholders with the actual values\n Object.keys(replacements).forEach(key => {\n link = link.replace(`{${key}}`, replacements[key]);\n });\n\n return link;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataResponseError, DataResponseReturnType } from '@/common/types';\nimport { Configuration, EmailName, Message } from '@nylas/core';\nimport dayjs from 'dayjs';\nimport { RRule } from 'rrule';\n\nexport function format(first: string, middle: string, last: string): string {\n return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');\n}\n\n// Utility function to remove undefined values from an object\nexport function removeUndefined(obj: any) {\n return Object.keys(obj).reduce((acc: { [key: string]: any }, key) => {\n if (obj[key] !== undefined) {\n acc[key] = obj[key];\n }\n return acc;\n }, {});\n}\n\nexport function debug(...args: any[]) {\n if (window && window.localStorage && window.localStorage.getItem('debug')) {\n console.debug(...args);\n }\n}\n\nexport function error(...args: any[]) {\n console.error(...args);\n}\n\nexport function uniqueID() {\n return Math.random().toString(36).substr(2, 9);\n}\n\nexport function formatEventName(propKey: string) {\n return propKey.toString().replace(/^on/, '');\n}\n\n// Utility function to format a date as a time if it is today, or a short\n// date format if it is not toda, using the new Intl API. For example:\n// If the date is today, it will return \"12:00 PM\"\n// If the date is not today, it will return \"Jan 4, 23\"\nexport function formatDateTime(dateTimestamp: number) {\n const date = new Date(dateTimestamp * 1000);\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n if (date >= today) {\n // If the day is not today, we return the month and day (e.g. Jan 4)\n const formatter = new Intl.DateTimeFormat('default', {\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n });\n return formatter.format(date);\n } else {\n // If the day is today, we only return the time (e.g. 12:00 PM) without\n // the month and day\n const formatter = new Intl.DateTimeFormat('default', {\n month: 'short',\n day: 'numeric',\n });\n return formatter.format(date);\n }\n}\n\nexport function formatRecipient(recipient: EmailName) {\n return recipient.name ? `${recipient.name} - ${recipient.email}` : recipient.email;\n}\n\n// Formats the particpants of a thread into a string\nexport function formatParticipants(participants: EmailName[], meEmail: string = '', messageCount: number = 1, max: number = 3) {\n const me = participants.find(p => p.email?.toLowerCase() === meEmail.toLowerCase());\n const others = participants.filter(p => p.email?.toLowerCase() !== meEmail.toLowerCase());\n const othersCount = others.length;\n const othersString = others\n .slice(0, max)\n .map(r => r.name || r.email)\n .join(', ');\n if (othersCount === 0) {\n return me ? 'me' : '';\n } else if (othersCount === 1) {\n return me && messageCount > 1 ? `me, ${othersString}` : othersString;\n } else if (othersCount === 2) {\n return me ? `me, ${othersString}` : `${othersString}`;\n } else {\n return me ? `me, ${othersString}, +${othersCount - max}` : `${othersString}, +${othersCount - max}`;\n }\n}\n\n// https://blog.webdevsimplified.com/2020-07/relative-time-format/\nconst DIVISIONS: Array<{\n amount: number;\n name: Intl.RelativeTimeFormatUnit;\n}> = [\n { amount: 60, name: 'seconds' },\n { amount: 60, name: 'minutes' },\n { amount: 24, name: 'hours' },\n { amount: 7, name: 'days' },\n { amount: 4.34524, name: 'weeks' },\n { amount: 12, name: 'months' },\n { amount: Number.POSITIVE_INFINITY, name: 'years' },\n];\n\nexport const formatTimeAgo = (date: Date) => {\n const formatter = new Intl.RelativeTimeFormat(undefined, {\n numeric: 'auto',\n });\n const now = new Date();\n let duration = (date.getTime() - now.getTime()) / 1000;\n\n for (let i = 0; i <= DIVISIONS.length; i++) {\n const division = DIVISIONS[i];\n if (Math.abs(duration) < division.amount) {\n return formatter.format(Math.round(duration), division.name);\n }\n duration /= division.amount;\n }\n};\n\nexport function getLastDayOfMonth(date: Date) {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n}\n\nexport function getFirstDayOfMonth(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\nexport function getFirstHourOfDay(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0);\n}\n\nexport function isSameDay(date1: Date, date2: Date) {\n return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() === date2.getDate();\n}\n\nexport function isSameMonth(date1: Date, date2: Date) {\n return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth();\n}\n\nexport function toTitleCase(str: string) {\n return str.replace(/\\w\\S*/g, txt => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase());\n}\n\nexport function formatFolderName(folderName: string) {\n return folderName.replace('CATEGORY_', '').replace(/_/g, ' ');\n}\n\nexport function detectHTMLOrPlainText(html: string) {\n const regex = /<[^>]*>/g;\n return regex.test(html) ? 'html' : 'plain';\n}\n\nexport function detectIfMessageIsHTML(message: Message) {\n const headers = message.headers;\n const contentType = (headers && headers.find(h => h.name === 'Content-Type')?.value) || '';\n const contentDisposition = (headers && headers.find(h => h.name === 'Content-Disposition')?.value) || '';\n\n // If the content type is HTML, then we know it's HTML\n if (contentType.includes('text/html')) {\n return true;\n }\n\n // If the content disposition is inline, then we know it's HTML\n if (contentDisposition.includes('inline')) {\n return true;\n }\n\n // If the body is HTML, then we know it's HTML\n if (message.body && detectHTMLOrPlainText(message.body) === 'html') {\n return true;\n }\n\n // Otherwise, we assume it's plain text\n return false;\n}\n\nexport function parsePlainTextToHTML(text: string) {\n const paragraphs = text.split('\\n').filter(line => line.trim().length > 0);\n const wrappedParagraphs = paragraphs.map(paragraph => `<p>${paragraph}</p>`);\n let body = wrappedParagraphs.join('');\n\n // Replace links with anchor tags\n const regex = /((?:https?|ftp):\\/\\/[^\\s]+)/g;\n body = body.replace(regex, '<a href=\"$1\">$1</a>');\n\n return body;\n}\n\nexport function htmlToPlainText(html: string) {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n}\n\nexport function getStartHourOfDay(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0);\n}\n\nexport function getEndHourOfDay(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23);\n}\n\n// Zero pad a number to two digits\nexport function get24HourTime(date: Date) {\n return `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;\n}\n\nexport function getUserTimezone() {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport const getEventRecurrence = (recurrence: any): string | null => {\n if (recurrence.includes('RRULE:')) {\n recurrence = recurrence.replace('RRULE:', '');\n return RRule.fromString(recurrence).toText();\n }\n return RRule.fromString(recurrence).toText();\n};\n\n// Validate time format part\nexport const validateTimeFormatInput = text => {\n if (text === '') {\n return true;\n }\n const regexPattern = /^(0[0-9]|1[0-2]|^[0-9])(:[0-5][0-9][ap]m?|:[0-5][0-9]|:[0-5]|:)?$/i;\n return regexPattern.test(text);\n};\n// Validate exact time format\nexport const validateExactTimeFormat = input => {\n const regex = /^(0[1-9]|1[0-2]):([0-5][0-9])(am|pm)$/i;\n return regex.test(input);\n};\n\nexport function roundToNearest15Minutes(time: dayjs.Dayjs | null = null) {\n let currentTime = dayjs(); // Get the current time\n if (time) {\n currentTime = time;\n }\n\n // Calculate the remainder when dividing the minutes by 15\n const minuteRemainder = currentTime.minute() % 15;\n\n let roundedTime;\n\n if (minuteRemainder !== 0) {\n // Round up to the next 15-minute interval\n roundedTime = currentTime.add(15 - minuteRemainder, 'minute');\n } else {\n // Keep the current time as it is\n roundedTime = currentTime;\n }\n\n return roundedTime;\n}\n\nexport function autocompleteTimeFormat(input) {\n const currentTime = dayjs(); // Get the current time\n\n let completedTime = '';\n\n // Extract the hour and minute components\n const [inputHour, inputMinuteWithAmPm] = input.split(':');\n // Autocomplete the hour component\n if (inputHour.length === 1) {\n completedTime += '0' + inputHour;\n } else if (inputHour.length === 2) {\n completedTime += inputHour;\n }\n\n completedTime += ':';\n\n // Autocomplete the minute component\n if (inputMinuteWithAmPm === undefined || inputMinuteWithAmPm == '') {\n completedTime += '00';\n } else {\n if (inputMinuteWithAmPm.length === 1) {\n completedTime += inputMinuteWithAmPm + '0';\n } else {\n completedTime += inputMinuteWithAmPm;\n }\n }\n\n // Set the am/pm indicator based on the provided input\n const amPmIndicator = completedTime.slice(-1); // Extract the am/pm indicator from input\n\n if (amPmIndicator === 'a') {\n completedTime += 'm';\n }\n if (amPmIndicator === 'p') {\n completedTime += 'm';\n }\n\n // Set the am/pm indicator based on the current time if no indecator present inside input\n if (completedTime.slice(-1) !== 'm') {\n if (completedTime.split(':')[0] == '00') {\n completedTime += 'am';\n } else {\n completedTime += currentTime.format('a');\n }\n }\n\n return completedTime;\n}\n\nexport function formatTime(time: string) {\n return dayjs(time, 'hh:mma');\n}\n\nexport function convertTo12HourFormat(timeStr: string) {\n // Split the time into hours and minutes\n const [hoursInitial, minutes] = timeStr.split(':').map(num => parseInt(num, 10));\n let hours = hoursInitial;\n\n // Determine AM or PM\n const ampm = hours >= 12 ? 'pm' : 'am';\n\n // Convert hours from 24-hour to 12-hour format\n hours = hours % 12;\n hours = hours ? hours : 12; // the hour '0' should be '12'\n\n // Format hours and minutes to ensure two digits\n const formattedHours = hours.toString().padStart(2, '0');\n const formattedMinutes = minutes.toString().padStart(2, '0');\n\n // Construct the 12-hour format time string\n return `${formattedHours}:${formattedMinutes}${ampm}`;\n}\n\nexport function convertTo24HourFormat(timeStr: string) {\n const [time, modifier] = timeStr.split(/(am|pm)/i);\n const [hoursInitial, minutes] = time.split(':').map(num => parseInt(num, 10));\n let hours = hoursInitial;\n\n if (modifier.toLowerCase() === 'pm' && hours < 12) {\n hours += 12;\n } else if (modifier.toLowerCase() === 'am' && hours === 12) {\n hours = 0;\n }\n\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n}\n\nexport function timeToMinutes(time) {\n const [hours, minutesPart] = time.match(/(\\d+):(\\d+)(am|pm)/).slice(1);\n let minutes = parseInt(hours, 10) * 60 + parseInt(minutesPart, 10);\n if (time.includes('pm') && parseInt(hours, 10) < 12) minutes += 12 * 60;\n if (time.includes('am') && parseInt(hours, 10) === 12) minutes -= 12 * 60;\n return minutes;\n}\n\nexport function minutesToTime(minutes) {\n const h = Math.floor(minutes / 60);\n const m = minutes % 60;\n return `${h}:${m < 10 ? '0' : ''}${m}`;\n}\n\nexport function getBrowser() {\n const ua = navigator.userAgent;\n\n // Check for Chrome (also in Edge and Opera)\n const isChrome = /Chrome/.test(ua) && /Google Inc/.test(navigator.vendor);\n\n // Check for Safari (also in Chrome and Opera)\n const isSafari = /Safari/.test(ua) && /Apple Computer/.test(navigator.vendor);\n\n // Check for Firefox\n const isFirefox = /Firefox/.test(ua);\n\n // Check for Internet Explorer\n const isIE = /Trident/.test(ua);\n\n // Check for Edge (the legacy version)\n const isEdgeLegacy = /Edge/.test(ua);\n\n // Check for Edge (the Chromium-based version)\n const isEdgeChromium = isChrome && /Edg/.test(ua);\n\n if (isEdgeChromium) return 'Edge (Chromium)';\n if (isChrome) return 'Chrome';\n if (isSafari) return 'Safari';\n if (isFirefox) return 'Firefox';\n if (isIE) return 'Internet Explorer';\n if (isEdgeLegacy) return 'Edge (Legacy)';\n\n return 'Unknown';\n}\n\n/**\n * Utility function to create a response object with data and error.\n * @param data any The data to return.\n * @param error DataResponseError The error to return.\n */\nexport function dataResponse<T = any>(data: T, error: DataResponseError | null = null): DataResponseReturnType<T> {\n if (error) {\n return [null, error];\n }\n return [data, null];\n}\n\n/**\n * Utility function to parse a preview link with placeholders.\n * @param link string A preview link with placeholders.\n * @param config Partial<Configuration> The configuration object to use to replace the placeholders.\n * @returns string The preview link with the placeholders replaced.\n */\nexport function parsePreviewLink(link: string, config?: Partial<Configuration>) {\n // Replacements\n const replacements = {\n 'config.id': config?.id,\n 'id': config?.id,\n };\n\n // Replace the placeholders with the actual values\n Object.keys(replacements).forEach(key => {\n link = link.replace(`{${key}}`, replacements[key]);\n });\n\n return link;\n}\n\nexport function isNonPrintableKey(event) {\n // Check for special keys like backspace, enter, escape, arrow keys, function keys, etc.\n if (\n event.keyCode < 48 || // Before 0\n (event.keyCode > 90 && event.keyCode < 96) || // Between Z and numpad 0\n (event.keyCode > 111 && event.keyCode < 186) || // Between numpad 9 and semi-colon (;)\n event.keyCode > 222 || // After single quote (')\n event.keyCode === 32 || // Spacebar\n event.keyCode === 91 || // Left Window key or left ⌘ key\n event.keyCode === 92 || // Right Window key or right ⌘ key\n event.keyCode === 93 || // Select key / Menu key or right ⌘ key\n (event.keyCode >= 112 && event.keyCode <= 123) || // Function (F1-F12) keys\n (event.keyCode >= 37 && event.keyCode <= 40) // Arrow keys\n ) {\n return true;\n }\n\n // Check for Ctrl, Alt, Shift, CapsLock, etc., by ignoring if any of these are pressed\n if (event.ctrlKey || event.altKey || event.metaKey) {\n return true;\n }\n\n // Check if Shift is combined with a number or special character\n const shiftSpecialChars = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 55,\n 56,\n 57, // Numbers (0-9)\n 186,\n 187,\n 188,\n 189,\n 190,\n 191,\n 192,\n 219,\n 220,\n 221,\n 222, // Special characters (;=,-./` and []\\')\n ];\n\n if (event.shiftKey && shiftSpecialChars.includes(event.keyCode)) {\n return false;\n }\n\n // If none of the above, it's a character, number, or special character typed without shift\n return false;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as debug,
|
|
1
|
+
import { a as debug, z as uniqueID, A as formatEventName } from './utils.js';
|
|
2
2
|
|
|
3
3
|
class NylasAbstractProvider {
|
|
4
4
|
constructor(host, stores, automaticComponentRegistration = true, eventOverrides) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
|
|
2
2
|
import { R as RegisterComponent } from './register-component.js';
|
|
3
|
-
import { a as debug, q as getBrowser } from './utils.js';
|
|
3
|
+
import { a as debug, q as getBrowser, s as isNonPrintableKey } from './utils.js';
|
|
4
4
|
import { E as EVENT_TITLE_TOKENS } from './constants.js';
|
|
5
5
|
import { d as defineCustomElement$2 } from './info.js';
|
|
6
6
|
import { d as defineCustomElement$1 } from './toolitp-component.js';
|
|
@@ -111,7 +111,7 @@ const NylasEventTitle = proxyCustomElement(class NylasEventTitle extends HTMLEle
|
|
|
111
111
|
return outputHtml;
|
|
112
112
|
}
|
|
113
113
|
getCurrentSelectionForBrowser() {
|
|
114
|
-
const getSelectionTextData = (nodeValue, offset, node) => {
|
|
114
|
+
const getSelectionTextData = (nodeValue, offset, node, allSelected) => {
|
|
115
115
|
const text = nodeValue.replace(/[\u200B-\u200D\uFEFF]/g, '');
|
|
116
116
|
const dollarIndex = text.lastIndexOf('$');
|
|
117
117
|
const lastWord = text.substring(dollarIndex).split(' ')[0];
|
|
@@ -121,24 +121,29 @@ const NylasEventTitle = proxyCustomElement(class NylasEventTitle extends HTMLEle
|
|
|
121
121
|
lastWord,
|
|
122
122
|
currentText: text,
|
|
123
123
|
node,
|
|
124
|
+
allSelected,
|
|
124
125
|
};
|
|
125
126
|
};
|
|
127
|
+
const isAllSelected = (selection) => selection.anchorOffset === 0 && selection.focusOffset === selection.focusNode?.nodeValue?.length;
|
|
126
128
|
const currentBrowser = getBrowser();
|
|
127
129
|
switch (currentBrowser) {
|
|
128
130
|
case 'Chrome':
|
|
129
131
|
const shadowRootSelection = this.host.shadowRoot?.getSelection();
|
|
130
132
|
const focusNode = shadowRootSelection?.focusNode;
|
|
131
133
|
const focusNodeValue = focusNode?.nodeValue || '';
|
|
132
|
-
|
|
134
|
+
const allSelected = shadowRootSelection && isAllSelected(shadowRootSelection);
|
|
135
|
+
return getSelectionTextData(focusNodeValue, shadowRootSelection?.focusOffset || -1, focusNode, allSelected);
|
|
133
136
|
case 'Firefox':
|
|
134
137
|
const selection = document.getSelection();
|
|
135
138
|
const anchorNodeValue = selection?.anchorNode?.nodeValue || '';
|
|
136
|
-
|
|
139
|
+
const allSelectedFirefox = selection && isAllSelected(selection);
|
|
140
|
+
return getSelectionTextData(anchorNodeValue, selection?.focusOffset || -1, selection?.anchorNode, allSelectedFirefox);
|
|
137
141
|
case 'Safari':
|
|
138
142
|
const windowSelection = window.getSelection();
|
|
139
143
|
const anchorNode = windowSelection?.getComposedRanges(this.host.shadowRoot)[0];
|
|
140
144
|
const currentText = anchorNode?.startContainer?.nodeValue || '';
|
|
141
|
-
|
|
145
|
+
const allSelectedSafari = windowSelection && isAllSelected(windowSelection);
|
|
146
|
+
return getSelectionTextData(currentText, anchorNode?.endOffset || -1, anchorNode?.startContainer, allSelectedSafari);
|
|
142
147
|
default:
|
|
143
148
|
console.warn('Browser not supported');
|
|
144
149
|
return null;
|
|
@@ -174,6 +179,10 @@ const NylasEventTitle = proxyCustomElement(class NylasEventTitle extends HTMLEle
|
|
|
174
179
|
this.updateEventTitle(textContent);
|
|
175
180
|
}
|
|
176
181
|
handleInputKeyDown(event) {
|
|
182
|
+
const selection = this.getCurrentSelectionForBrowser();
|
|
183
|
+
if (selection?.allSelected && !isNonPrintableKey(event)) {
|
|
184
|
+
this.titleRef.innerHTML = '';
|
|
185
|
+
}
|
|
177
186
|
if (event.key === 'Enter') {
|
|
178
187
|
event.preventDefault();
|
|
179
188
|
const activeOption = this.host.shadowRoot?.getElementById(this.ariaActivedescendant);
|
|
@@ -219,10 +228,12 @@ const NylasEventTitle = proxyCustomElement(class NylasEventTitle extends HTMLEle
|
|
|
219
228
|
this.resetDropdown();
|
|
220
229
|
}
|
|
221
230
|
else if (event.key === 'Backspace' || event.key === 'Delete') {
|
|
222
|
-
const selection = this.getCurrentSelectionForBrowser();
|
|
223
231
|
if (selection?.currentText.startsWith('${')) {
|
|
224
232
|
selection?.node?.parentNode && selection.node.parentNode.removeChild(selection.node);
|
|
225
233
|
}
|
|
234
|
+
if (this.titleRef.textContent === '' || selection?.currentText === '' || selection?.allSelected) {
|
|
235
|
+
this.titleRef.innerHTML = '';
|
|
236
|
+
}
|
|
226
237
|
}
|
|
227
238
|
}
|
|
228
239
|
selectOption(e, option) {
|
|
@@ -257,12 +268,12 @@ const NylasEventTitle = proxyCustomElement(class NylasEventTitle extends HTMLEle
|
|
|
257
268
|
const newTextNodeAfter = document.createTextNode(textAfter);
|
|
258
269
|
if (textAfter !== '') {
|
|
259
270
|
textNode.replaceWith(newTextNode, tagSpan, newTextNodeAfter);
|
|
260
|
-
newRange.setStart(newTextNodeAfter,
|
|
271
|
+
newRange.setStart(newTextNodeAfter, 1);
|
|
261
272
|
}
|
|
262
273
|
else {
|
|
263
274
|
const afterNode = document.createTextNode('\u200B');
|
|
264
275
|
textNode.replaceWith(newTextNode, tagSpan, afterNode);
|
|
265
|
-
newRange.setStart(afterNode,
|
|
276
|
+
newRange.setStart(afterNode, 1);
|
|
266
277
|
}
|
|
267
278
|
this.resetDropdown();
|
|
268
279
|
this.titleRef.focus();
|
|
@@ -301,10 +312,10 @@ const NylasEventTitle = proxyCustomElement(class NylasEventTitle extends HTMLEle
|
|
|
301
312
|
return (h("div", { class: "token-label" }, h("span", { class: "token" }, token.token), h("span", { class: "description" }, token.description)));
|
|
302
313
|
}
|
|
303
314
|
render() {
|
|
304
|
-
return (h(Host, { key: '
|
|
315
|
+
return (h(Host, { key: 'e0ddf6c13a5a0c0d2e0db9188365418fb7484dcf' }, h("div", { key: 'a3b8e594c8d9632709e777891f04df0aaaf7c5c3', class: "nylas-event-title", part: "net" }, h("label", { key: 'e5794d2cd8be0b1666bfa67c3ea657da5dc8d45d', htmlFor: "title" }, "Event title", h("span", { key: '1210caceb7bf824f01559460e1c5e572cb2dad92', class: "required" }, "*"), h("span", { key: '4280ec285221e6db76ca08723fe3888a1d2643e3', class: "label-icon" }, h("tooltip-component", { key: 'd6c05fb79cf39656af7589a2e9de9ef832d7a2f8' }, h("info-icon", { key: 'a4659d97d60d00dfcc2c993e70da5cfd05904f78', slot: "tooltip-icon" }), h("span", { key: '738bfa669eec42b417be02fbad0584af34044c83', slot: "tooltip-content" }, "Enter a title for your event.")))), h("div", { key: 'df102dc899f8de91154689d9cdaae28465380622', class: {
|
|
305
316
|
title: true,
|
|
306
317
|
error: this.validationError !== '',
|
|
307
|
-
}, part: "net__title", ref: el => (this.titleRef = el), contentEditable: "true", onInput: e => this.handleChange(e), onKeyDown: event => this.handleInputKeyDown(event) }), this.showTokens && this.filteredTokens?.length > 0 && (h("div", { class: "token-options", part: "net__dropdown-content" }, h("ul", { tabindex: "-1", role: "listbox", "aria-label": this.name, "aria-activedescendant": this.ariaActivedescendant }, this.filteredTokens.map(option => (h("li", { tabindex: "0", key: option.label, id: option.label, class: { active: this.ariaActivedescendant === option.label }, onClick: e => this.selectOption(e, option), role: "option" }, this.getLabelHTML(option.labelHTML))))))), h("span", { key: '
|
|
318
|
+
}, part: "net__title", ref: el => (this.titleRef = el), contentEditable: "true", onInput: e => this.handleChange(e), onKeyDown: event => this.handleInputKeyDown(event) }), this.showTokens && this.filteredTokens?.length > 0 && (h("div", { class: "token-options", part: "net__dropdown-content" }, h("ul", { tabindex: "-1", role: "listbox", "aria-label": this.name, "aria-activedescendant": this.ariaActivedescendant }, this.filteredTokens.map(option => (h("li", { tabindex: "0", key: option.label, id: option.label, class: { active: this.ariaActivedescendant === option.label }, onClick: e => this.selectOption(e, option), role: "option" }, this.getLabelHTML(option.labelHTML))))))), h("span", { key: 'ec769eea7e2e3ff6d64bef0f5099540c93ba80ab', class: "help-text" }, "Create a dynamic templated event title by typing $. Learn more"), this.validationError != '' && h("span", { class: "error-message" }, this.validationError))));
|
|
308
319
|
}
|
|
309
320
|
static get formAssociated() { return true; }
|
|
310
321
|
get host() { return this; }
|