@nylas/web-elements 0.0.0-canary-20250120165013 → 0.0.0-canary-20250122221254

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/cdn/checkbox-component/checkbox-component.es.js +14 -18
  2. package/dist/cdn/nylas-booking-form/nylas-booking-form.es.js +275 -278
  3. package/dist/cdn/nylas-cancel-booking-form/nylas-cancel-booking-form.es.js +2 -1
  4. package/dist/cdn/nylas-confirmation-email/nylas-confirmation-email.es.js +2 -1
  5. package/dist/cdn/nylas-customize-booking-settings/nylas-customize-booking-settings.es.js +3 -7
  6. package/dist/cdn/nylas-editor-tabs/nylas-editor-tabs.es.js +301 -296
  7. package/dist/cdn/nylas-feedback-form/nylas-feedback-form.es.js +2 -1
  8. package/dist/cdn/nylas-scheduler-editor/nylas-scheduler-editor.es.js +23 -18
  9. package/dist/cdn/nylas-scheduling/nylas-scheduling.es.js +18 -13
  10. package/dist/cdn/textarea-component/textarea-component.es.js +147 -146
  11. package/dist/cjs/checkbox-component_3.cjs.entry.js +2 -3
  12. package/dist/cjs/checkbox-component_3.cjs.entry.js.map +1 -1
  13. package/dist/cjs/google-logo-icon_4.cjs.entry.js +12 -4
  14. package/dist/cjs/google-logo-icon_4.cjs.entry.js.map +1 -1
  15. package/dist/cjs/nylas-scheduling.cjs.entry.js +10 -2
  16. package/dist/cjs/nylas-scheduling.cjs.entry.js.map +1 -1
  17. package/dist/cjs/textarea-component.cjs.entry.js +2 -1
  18. package/dist/cjs/textarea-component.cjs.entry.js.map +1 -1
  19. package/dist/collection/components/design-system/checkbox-component/checkbox-component.css +4 -0
  20. package/dist/collection/components/design-system/checkbox-component/checkbox-component.js +1 -2
  21. package/dist/collection/components/design-system/checkbox-component/checkbox-component.js.map +1 -1
  22. package/dist/collection/components/design-system/textarea-component/textarea-component.js +2 -1
  23. package/dist/collection/components/design-system/textarea-component/textarea-component.js.map +1 -1
  24. package/dist/collection/components/scheduler/nylas-booking-form/test/nylas-booking-form.spec.js +25 -1
  25. package/dist/collection/components/scheduler/nylas-booking-form/test/nylas-booking-form.spec.js.map +1 -1
  26. package/dist/collection/components/scheduler/nylas-scheduling/nylas-scheduling.js +10 -2
  27. package/dist/collection/components/scheduler/nylas-scheduling/nylas-scheduling.js.map +1 -1
  28. package/dist/collection/components/scheduler-editor/nylas-editor-tabs/nylas-editor-tabs.js +12 -4
  29. package/dist/collection/components/scheduler-editor/nylas-editor-tabs/nylas-editor-tabs.js.map +1 -1
  30. package/dist/components/checkbox-component2.js +2 -3
  31. package/dist/components/checkbox-component2.js.map +1 -1
  32. package/dist/components/nylas-editor-tabs2.js +12 -4
  33. package/dist/components/nylas-editor-tabs2.js.map +1 -1
  34. package/dist/components/nylas-scheduling.js +10 -2
  35. package/dist/components/nylas-scheduling.js.map +1 -1
  36. package/dist/components/textarea-component2.js +2 -1
  37. package/dist/components/textarea-component2.js.map +1 -1
  38. package/dist/esm/checkbox-component_3.entry.js +2 -3
  39. package/dist/esm/checkbox-component_3.entry.js.map +1 -1
  40. package/dist/esm/google-logo-icon_4.entry.js +12 -4
  41. package/dist/esm/google-logo-icon_4.entry.js.map +1 -1
  42. package/dist/esm/nylas-scheduling.entry.js +10 -2
  43. package/dist/esm/nylas-scheduling.entry.js.map +1 -1
  44. package/dist/esm/textarea-component.entry.js +2 -1
  45. package/dist/esm/textarea-component.entry.js.map +1 -1
  46. package/dist/nylas-web-elements/nylas-web-elements.esm.js +1 -1
  47. package/dist/nylas-web-elements/{p-a4b25253.entry.js → p-1d12e7e7.entry.js} +2 -2
  48. package/dist/nylas-web-elements/{p-a4b25253.entry.js.map → p-1d12e7e7.entry.js.map} +1 -1
  49. package/dist/nylas-web-elements/p-748f9af9.entry.js +2 -0
  50. package/dist/nylas-web-elements/p-748f9af9.entry.js.map +1 -0
  51. package/dist/nylas-web-elements/p-ea91e5b3.entry.js +2 -0
  52. package/dist/nylas-web-elements/p-ea91e5b3.entry.js.map +1 -0
  53. package/dist/nylas-web-elements/{p-dd830dcc.entry.js → p-f7bd80de.entry.js} +2 -2
  54. package/dist/nylas-web-elements/{p-dd830dcc.entry.js.map → p-f7bd80de.entry.js.map} +1 -1
  55. package/package.json +3 -3
  56. package/dist/nylas-web-elements/p-02488442.entry.js +0 -2
  57. package/dist/nylas-web-elements/p-02488442.entry.js.map +0 -1
  58. package/dist/nylas-web-elements/p-b61dfe09.entry.js +0 -2
  59. package/dist/nylas-web-elements/p-b61dfe09.entry.js.map +0 -1
@@ -31,6 +31,7 @@ export class TextareaComponent {
31
31
  }
32
32
  }
33
33
  handleInput(e) {
34
+ this.error = '';
34
35
  const inputElement = e.target;
35
36
  this.value = sanitize(inputElement.value);
36
37
  this.nylasFormInputChanged.emit({
@@ -53,7 +54,7 @@ export class TextareaComponent {
53
54
  }
54
55
  }
55
56
  render() {
56
- return (h("label", { key: '383001bd48b1178b4c9126f812175701f570931e', part: "tc__label", class: { error: !!this.error } }, h("p", { key: '17dad29e1c19d24bfb5e1736630c6d43651f1616' }, h("span", { key: 'd1077d0eab18709b12e714650a20057b17720ebd', class: "label" }, this.label), this.required && h("span", { class: "required" }, "*"), this.tooltip && (h("tooltip-component", null, h("info-icon", { slot: "tooltip-icon" }), h("span", { slot: "tooltip-content" }, this.tooltip)))), h("textarea", { key: 'b35934b9027ac4c7d27a1720c471d698905e5f62', name: this.name, title: this.readOnly ? 'read-only field' : undefined, placeholder: this.placeholder, readOnly: this.readOnly, autoFocus: this.autoFocus, value: this.value, maxLength: this.maxLength, onInput: e => this.handleInput(e), class: { error: !!this.error }, part: "tc__textarea" }), this.error && h("span", { class: "error help-text" }, this.error)));
57
+ return (h("label", { key: '3b3dd5b1c594e2c3b3594826b1f0379925dd14e9', part: "tc__label", class: { error: !!this.error } }, h("p", { key: '0a544d90a3b087c3479412078b1a454261bf20db' }, h("span", { key: 'c37a9e870a3ebe502b2db7fbf0968178fc7cc519', class: "label" }, this.label), this.required && h("span", { class: "required" }, "*"), this.tooltip && (h("tooltip-component", null, h("info-icon", { slot: "tooltip-icon" }), h("span", { slot: "tooltip-content" }, this.tooltip)))), h("textarea", { key: '1be0e90961ebd6110bffd347a930884768429037', name: this.name, title: this.readOnly ? 'read-only field' : undefined, placeholder: this.placeholder, readOnly: this.readOnly, autoFocus: this.autoFocus, value: this.value, maxLength: this.maxLength, onInput: e => this.handleInput(e), class: { error: !!this.error }, part: "tc__textarea" }), this.error && h("span", { class: "error help-text" }, this.error)));
57
58
  }
58
59
  static get is() { return "textarea-component"; }
59
60
  static get encapsulation() { return "shadow"; }
@@ -1 +1 @@
1
- {"version":3,"file":"textarea-component.js","sourceRoot":"","sources":["../../../../src/components/design-system/textarea-component/textarea-component.tsx"],"names":[],"mappings":"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","sourcesContent":["import { sanitize } from '@/utils/utils';\nimport { Component, h, Prop, State, Event, EventEmitter, Listen } from '@stencil/core';\n\n/**\n * `textarea-component` allows users to enter multiline text.\n * It is ideal for larger inputs like comments or messages in a form.\n * This component is used in the scheduling form to input multiline text.\n *\n * @part tc__label - The label for the textarea.\n * @part tc__textarea - The textarea element.\n */\n@Component({\n tag: 'textarea-component',\n styleUrl: 'textarea-component.scss',\n shadow: true,\n})\nexport class TextareaComponent {\n /**\n * The name of the textarea, important for form submissions.\n */\n @Prop() name: string = 'textarea';\n\n /**\n * The default value of the textarea, appearing when the component first renders.\n */\n @Prop() defaultValue?: string;\n\n /**\n * The label for the textarea, displayed above it.\n */\n @Prop() label: string = '';\n\n /**\n * Placeholder text shown in the textarea when it is empty.\n */\n @Prop() placeholder: string = '';\n\n /**\n * Specifies if the textarea is required for form submission.\n * If true, an error message shows if left empty.\n */\n @Prop() required: boolean = false;\n\n /**\n * If true, the textarea cannot be edited by the user.\n */\n @Prop() readOnly: boolean = false;\n\n /**\n * Automatically focus the textarea when the component loads.\n */\n @Prop() autoFocus: boolean = false;\n\n /**\n * The maximum number of characters allowed in the textarea.\n */\n @Prop() maxLength: number = 255;\n\n /**\n * The type\n */\n @Prop() type: string = 'multi_line_text';\n\n /**\n * The content of the label's tooltip\n */\n @Prop() tooltip: string = '';\n\n /**\n * State for the current value of the textarea.\n */\n @State() value: string = '';\n\n /**\n * State for managing the display of any error messages.\n */\n @State() error: string = '';\n\n /**\n * Event emitted when the value of the textarea changes.\n * Useful for parent components to capture user input.\n */\n @Event() nylasFormInputChanged!: EventEmitter<{ value: string; name: string; error: string; label: string; type: string }>;\n\n /**\n * Lifecycle method that runs before the component loads.\n * It sets the initial value and cleans it using sanitize-html.\n */\n componentDidLoad() {\n this.value = sanitize(this.defaultValue || '');\n }\n\n // Event listeners\n /**\n * Listen for the bookingFormSubmitted event to validate the input value when the form is submitted.\n */\n @Listen('bookingFormSubmitted', { target: 'document' })\n handleBookingFormSubmitted(event: CustomEvent) {\n this.validate(this.value);\n if (this.error) {\n event.preventDefault();\n }\n }\n\n @Listen('triggerValidation', { target: 'document' })\n handletriggerValidation(event: CustomEvent) {\n this.validate(this.value);\n if (this.error) {\n event.preventDefault();\n }\n }\n\n /**\n * Handles user input in the textarea, updating the value and emitting an event.\n */\n handleInput(e: Event) {\n const inputElement = e.target as HTMLTextAreaElement;\n this.value = sanitize(inputElement.value);\n this.nylasFormInputChanged.emit({\n value: this.value,\n name: this.name,\n error: this.error,\n label: this.label,\n type: this.type,\n });\n }\n\n /**\n * Validates the textarea value based on the required prop and maxLength.\n * If the value is invalid, an error message is displayed.\n */\n validate(value: string) {\n if (this.required && !value) {\n this.error = `${this.label} is required.`;\n } else if (value.length > this.maxLength) {\n this.error = `${this.label} cannot exceed ${this.maxLength} characters.`;\n } else {\n this.error = '';\n }\n }\n\n /**\n * Renders the component UI including the label, textarea, and any error messages.\n */\n render() {\n return (\n <label part=\"tc__label\" class={{ error: !!this.error }}>\n <p>\n <span class=\"label\">{this.label}</span>\n {this.required && <span class=\"required\">*</span>}\n {this.tooltip && (\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{this.tooltip}</span>\n </tooltip-component>\n )}\n </p>\n <textarea\n name={this.name}\n title={this.readOnly ? 'read-only field' : undefined}\n placeholder={this.placeholder}\n readOnly={this.readOnly}\n autoFocus={this.autoFocus}\n value={this.value}\n maxLength={this.maxLength}\n onInput={e => this.handleInput(e)}\n class={{ error: !!this.error }}\n part=\"tc__textarea\"\n />\n {this.error && <span class=\"error help-text\">{this.error}</span>}\n </label>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"textarea-component.js","sourceRoot":"","sources":["../../../../src/components/design-system/textarea-component/textarea-component.tsx"],"names":[],"mappings":"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","sourcesContent":["import { sanitize } from '@/utils/utils';\nimport { Component, h, Prop, State, Event, EventEmitter, Listen } from '@stencil/core';\n\n/**\n * `textarea-component` allows users to enter multiline text.\n * It is ideal for larger inputs like comments or messages in a form.\n * This component is used in the scheduling form to input multiline text.\n *\n * @part tc__label - The label for the textarea.\n * @part tc__textarea - The textarea element.\n */\n@Component({\n tag: 'textarea-component',\n styleUrl: 'textarea-component.scss',\n shadow: true,\n})\nexport class TextareaComponent {\n /**\n * The name of the textarea, important for form submissions.\n */\n @Prop() name: string = 'textarea';\n\n /**\n * The default value of the textarea, appearing when the component first renders.\n */\n @Prop() defaultValue?: string;\n\n /**\n * The label for the textarea, displayed above it.\n */\n @Prop() label: string = '';\n\n /**\n * Placeholder text shown in the textarea when it is empty.\n */\n @Prop() placeholder: string = '';\n\n /**\n * Specifies if the textarea is required for form submission.\n * If true, an error message shows if left empty.\n */\n @Prop() required: boolean = false;\n\n /**\n * If true, the textarea cannot be edited by the user.\n */\n @Prop() readOnly: boolean = false;\n\n /**\n * Automatically focus the textarea when the component loads.\n */\n @Prop() autoFocus: boolean = false;\n\n /**\n * The maximum number of characters allowed in the textarea.\n */\n @Prop() maxLength: number = 255;\n\n /**\n * The type\n */\n @Prop() type: string = 'multi_line_text';\n\n /**\n * The content of the label's tooltip\n */\n @Prop() tooltip: string = '';\n\n /**\n * State for the current value of the textarea.\n */\n @State() value: string = '';\n\n /**\n * State for managing the display of any error messages.\n */\n @State() error: string = '';\n\n /**\n * Event emitted when the value of the textarea changes.\n * Useful for parent components to capture user input.\n */\n @Event() nylasFormInputChanged!: EventEmitter<{ value: string; name: string; error: string; label: string; type: string }>;\n\n /**\n * Lifecycle method that runs before the component loads.\n * It sets the initial value and cleans it using sanitize-html.\n */\n componentDidLoad() {\n this.value = sanitize(this.defaultValue || '');\n }\n\n // Event listeners\n /**\n * Listen for the bookingFormSubmitted event to validate the input value when the form is submitted.\n */\n @Listen('bookingFormSubmitted', { target: 'document' })\n handleBookingFormSubmitted(event: CustomEvent) {\n this.validate(this.value);\n if (this.error) {\n event.preventDefault();\n }\n }\n\n @Listen('triggerValidation', { target: 'document' })\n handletriggerValidation(event: CustomEvent) {\n this.validate(this.value);\n if (this.error) {\n event.preventDefault();\n }\n }\n\n /**\n * Handles user input in the textarea, updating the value and emitting an event.\n */\n handleInput(e: Event) {\n this.error = '';\n const inputElement = e.target as HTMLTextAreaElement;\n this.value = sanitize(inputElement.value);\n this.nylasFormInputChanged.emit({\n value: this.value,\n name: this.name,\n error: this.error,\n label: this.label,\n type: this.type,\n });\n }\n\n /**\n * Validates the textarea value based on the required prop and maxLength.\n * If the value is invalid, an error message is displayed.\n */\n validate(value: string) {\n if (this.required && !value) {\n this.error = `${this.label} is required.`;\n } else if (value.length > this.maxLength) {\n this.error = `${this.label} cannot exceed ${this.maxLength} characters.`;\n } else {\n this.error = '';\n }\n }\n\n /**\n * Renders the component UI including the label, textarea, and any error messages.\n */\n render() {\n return (\n <label part=\"tc__label\" class={{ error: !!this.error }}>\n <p>\n <span class=\"label\">{this.label}</span>\n {this.required && <span class=\"required\">*</span>}\n {this.tooltip && (\n <tooltip-component>\n <info-icon slot=\"tooltip-icon\" />\n <span slot=\"tooltip-content\">{this.tooltip}</span>\n </tooltip-component>\n )}\n </p>\n <textarea\n name={this.name}\n title={this.readOnly ? 'read-only field' : undefined}\n placeholder={this.placeholder}\n readOnly={this.readOnly}\n autoFocus={this.autoFocus}\n value={this.value}\n maxLength={this.maxLength}\n onInput={e => this.handleInput(e)}\n class={{ error: !!this.error }}\n part=\"tc__textarea\"\n />\n {this.error && <span class=\"error help-text\">{this.error}</span>}\n </label>\n );\n }\n}\n"]}
@@ -473,6 +473,12 @@ describe('nylas-booking-form', () => {
473
473
  type: 'multi_select',
474
474
  options: ['orange', 'apple', 'banana', 'kiwi'],
475
475
  },
476
+ 'multi_line_text_Long-text-Label_1': {
477
+ label: 'Long text Label',
478
+ type: 'multi_line_text',
479
+ required: true,
480
+ order: 4,
481
+ },
476
482
  },
477
483
  email_template: {
478
484
  logo: '',
@@ -544,7 +550,7 @@ describe('nylas-booking-form', () => {
544
550
  appearance: null,
545
551
  };
546
552
  const page = await newSpecPage({
547
- components: [NylasBookingForm, InputComponent],
553
+ components: [NylasBookingForm, InputComponent, TextareaComponent],
548
554
  template: () => h("nylas-booking-form", { configSettings: rescheduleConfigSettings }),
549
555
  });
550
556
  await page.waitForChanges();
@@ -558,12 +564,30 @@ describe('nylas-booking-form', () => {
558
564
  const form = page?.root?.shadowRoot?.querySelector('form');
559
565
  form.dispatchEvent(new Event('submit'));
560
566
  await page.waitForChanges();
567
+ const textAreaComponent = page?.root?.shadowRoot?.querySelector('textarea-component#multi_line_text_Long-text-Label_1');
568
+ const textArea = textAreaComponent.shadowRoot?.querySelector('textarea');
569
+ console.log('###textAreaComponent:', textArea);
570
+ textArea.value = 'This is a long text';
571
+ textArea.dispatchEvent(new Event('input'));
572
+ const event = new CustomEvent('nylasFormInputChanged', {
573
+ detail: {
574
+ value: textArea.value,
575
+ name: 'multi_line_text_Long-text-Label_1',
576
+ error: '',
577
+ label: 'Long text Label',
578
+ },
579
+ });
580
+ page.rootInstance.nylasFormInputChangedHandler(event);
581
+ await page.waitForChanges();
582
+ form.dispatchEvent(new Event('submit'));
583
+ await page.waitForChanges();
561
584
  expect(spyEvent).toHaveBeenCalled();
562
585
  const obj = {
563
586
  additionalFields: {
564
587
  'metadata_Metadata-Label_1': 'xyz',
565
588
  'phone_number_Phone-Number-Label_1': '1234567890',
566
589
  'multi-select': 'orange',
590
+ 'multi_line_text_Long-text-Label_1': 'This is a long text',
567
591
  },
568
592
  guests: [
569
593
  {
@@ -1 +1 @@
1
- {"version":3,"file":"nylas-booking-form.spec.js","sourceRoot":"","sources":["../../../../../src/components/scheduler/nylas-booking-form/test/nylas-booking-form.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["import { newSpecPage } from '@stencil/core/testing';\nimport { NylasBookingForm } from '../nylas-booking-form';\nimport { InputComponent } from '../../../design-system/input-component/input-component';\nimport { h } from '@stencil/core';\nimport { RadioButtonGroup } from '../../../design-system/radio-button-group/radio-button-group';\nimport { CheckboxComponent } from '../../../design-system/checkbox-component/checkbox-component';\nimport { TextareaComponent } from '../../../design-system/textarea-component/textarea-component';\nimport { SelectDropdown } from '../../../design-system/select-dropdown/select-dropdown';\n\nconst configSettings = {\n scheduler: {\n available_days_in_future: 30,\n min_cancellation_notice: 0,\n min_booking_notice: 60,\n hide_rescheduling_options: false,\n hide_cancellation_options: false,\n hide_additional_guests: false,\n additional_fields: {\n additional_email: {\n label: 'Additional email',\n type: 'email',\n required: false,\n order: 2,\n default: 'additional_email@example.com',\n },\n checkbox: {\n label: 'Checkbox Label',\n type: 'checkbox',\n required: false,\n order: 6,\n },\n dropdown: {\n label: 'Dropdown Label',\n type: 'dropdown',\n required: false,\n order: 3,\n options: ['Yes', 'No'],\n },\n long_text: {\n label: 'Long text Label',\n type: 'multi_line_text',\n required: false,\n order: 5,\n },\n phone_number: {\n label: 'Phone Number',\n type: 'phone_number',\n required: false,\n order: 1,\n },\n radio_button: {\n label: 'Radio Button Label',\n type: 'radio_button',\n required: false,\n order: 7,\n options: ['Yes', 'No'],\n },\n short_text: {\n label: 'Short Text Label',\n type: 'text',\n required: false,\n order: 4,\n },\n },\n email_template: {\n booking_confirmed: {},\n },\n },\n organizer: {\n email: 'test@nylas.com',\n name: 'Test User',\n },\n};\n\ndescribe('nylas-booking-form', () => {\n beforeEach(() => {\n // Clear and reset the mock before each test if needed\n jest.clearAllMocks();\n });\n let consoleErrorSpy;\n\n beforeEach(() => {\n // Spy on console.error before each test\n consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});\n });\n\n afterEach(() => {\n // Restore the original console.error after each test\n consoleErrorSpy.mockRestore();\n });\n\n it('renders correctly with initial props', async () => {\n const bookingInfo = {\n primaryParticipant: {\n name: 'John Doe',\n email: 'john.doe@example.com',\n },\n };\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n if (!page.root) {\n throw new Error('Component did not render.');\n }\n\n page.root.bookingInfo = bookingInfo;\n await page.waitForChanges();\n expect(page.rootInstance.name).toEqual('John Doe');\n expect(page.rootInstance.email).toEqual('john.doe@example.com');\n expect(page.root).toMatchSnapshot();\n });\n\n it('renders an email error message when email is invalid', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n nameInput.value = 'John Doe';\n nameInput.dispatchEvent(new Event('input'));\n\n const emailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n emailInput.value = 'invalid-email';\n emailInput.dispatchEvent(new Event('input'));\n\n // Submit the form to trigger validation\n const form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n\n await page.waitForChanges();\n\n const errorMessage = page?.root?.shadowRoot\n ?.querySelector('.input-wrapper:nth-child(2) [part=\"nbf__input-textfield\"][id=\"email\"]')\n ?.shadowRoot?.querySelector('.help-text') as HTMLSpanElement;\n console.debug(errorMessage.className);\n expect(errorMessage.textContent).toBe('Email has invalid format.');\n });\n\n it('renders correctly with additional fields from the config', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n if (!page.root) {\n throw new Error('Component did not render.');\n }\n\n page.root.configSettings = configSettings;\n await page.waitForChanges();\n expect(page.root).toMatchSnapshot();\n const additionalEmailInputComponent = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"additional_email\"]') as HTMLInputElement;\n const additionalEmailInput = additionalEmailInputComponent.shadowRoot?.querySelector('input') as HTMLInputElement;\n\n expect(additionalEmailInput.value).not.toBeNull();\n expect(additionalEmailInput.value).toEqual('additional_email@example.com');\n additionalEmailInputComponent.value = 'abcd@gmail.com';\n\n page.root?.dispatchEvent(\n new CustomEvent('nylasFormInputChanged', {\n detail: {\n value: additionalEmailInputComponent.value,\n name: 'additional_email',\n error: '',\n label: 'Additional email',\n },\n }),\n );\n\n const checkboxInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__checkbox-component\"][id=\"checkbox\"]') as HTMLInputElement;\n checkboxInput.checked = true;\n\n page.root?.dispatchEvent(\n new CustomEvent('nylasFormCheckboxToggled', {\n detail: {\n checked: checkboxInput.checked,\n name: 'checkbox',\n error: '',\n label: 'Checkbox Label',\n },\n }),\n );\n\n await page.waitForChanges();\n expect(page.rootInstance.additionalFields).toEqual({ additional_email: 'abcd@gmail.com', checkbox: 'true' });\n });\n\n it('renders the values passed in the booking info by overriding the defaults', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n if (!page.root) {\n throw new Error('Component did not render.');\n }\n\n page.root.configSettings = configSettings;\n page.root.bookingInfo = {\n primaryParticipant: {\n name: 'John Doe',\n email: 'johndoe@example.com',\n },\n additionalFields: {\n additional_email: {\n value: 'xyz@example.com',\n type: 'email',\n },\n },\n };\n\n await page.waitForChanges();\n expect(page.root).toMatchSnapshot();\n const additionalEmailInputComponent = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"additional_email\"]') as HTMLInputElement;\n const additionalEmailInput = additionalEmailInputComponent.shadowRoot?.querySelector('input') as HTMLInputElement;\n\n expect(additionalEmailInput.value).not.toBeNull();\n expect(additionalEmailInput.value).toEqual('xyz@example.com');\n\n await page.waitForChanges();\n });\n\n it('renders the fields as read only if bookingInfo passes readOnly additional fields', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent, RadioButtonGroup, CheckboxComponent, TextareaComponent, SelectDropdown],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n if (!page.root) {\n throw new Error('Component did not render.');\n }\n\n page.root.configSettings = configSettings;\n page.root.bookingInfo = {\n primaryParticipant: {\n name: 'John Doe',\n email: 'johndoe@example.com',\n nameReadOnly: true,\n emailReadOnly: true,\n },\n additionalFields: {\n additional_email: {\n value: 'xyz@example.com',\n type: 'email',\n readOnly: true,\n },\n checkbox: {\n value: 'true',\n type: 'checkbox',\n readOnly: true,\n },\n dropdown: {\n value: 'No',\n type: 'dropdown',\n readOnly: true,\n },\n long_text: {\n value: 'Long text Label',\n type: 'multi_line_text',\n readOnly: true,\n },\n radio_button: {\n value: 'No',\n type: 'radio_button',\n readOnly: true,\n },\n },\n };\n\n await page.waitForChanges();\n expect(page.root).toMatchSnapshot();\n const nameInputComponent = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]') as HTMLInputElement;\n const nameInput = nameInputComponent.shadowRoot?.querySelector('input') as HTMLInputElement;\n expect(nameInput.value).not.toBeNull();\n expect(nameInput.value).toEqual('John Doe');\n expect(nameInput).toHaveAttribute('readOnly');\n\n const emailInputComponent = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]') as HTMLInputElement;\n const emailInput = emailInputComponent.shadowRoot?.querySelector('input') as HTMLInputElement;\n expect(emailInput.value).not.toBeNull();\n expect(emailInput.value).toEqual('johndoe@example.com');\n expect(emailInput).toHaveAttribute('readOnly');\n\n const additionalEmailInputComponent = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"additional_email\"]') as HTMLInputElement;\n const additionalEmailInput = additionalEmailInputComponent.shadowRoot?.querySelector('input') as HTMLInputElement;\n\n expect(additionalEmailInput.value).not.toBeNull();\n expect(additionalEmailInput.value).toEqual('xyz@example.com');\n expect(additionalEmailInput).toHaveAttribute('readOnly');\n\n const dropdown = page?.root?.shadowRoot?.querySelector('select-dropdown') as HTMLSelectDropdownElement;\n const dropdownButton = dropdown.shadowRoot?.querySelector('button') as HTMLButtonElement;\n expect(dropdownButton).toHaveAttribute('disabled');\n\n const checkbox = page?.root?.shadowRoot?.querySelector('checkbox-component') as HTMLCheckboxComponentElement;\n const checkboxInput = checkbox.shadowRoot?.querySelector('input') as HTMLInputElement;\n expect(checkboxInput).toHaveAttribute('disabled');\n expect(checkboxInput).toHaveAttribute('checked');\n\n const radioGroup = page?.root?.shadowRoot?.querySelector('radio-button-group') as HTMLRadioButtonGroupElement;\n const radioInput = radioGroup.shadowRoot?.querySelector('input') as HTMLInputElement;\n expect(radioInput).toHaveAttribute('disabled');\n\n const textarea = page?.root?.shadowRoot?.querySelector('textarea-component') as HTMLTextareaComponentElement;\n const textareaInput = textarea.shadowRoot?.querySelector('textarea') as HTMLTextAreaElement;\n expect(textareaInput).toHaveAttribute('readonly');\n });\n\n xit('renders guest email input on add guest button click', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const addGuestButton = page?.root?.shadowRoot?.querySelector('.add-guest') as HTMLButtonElement;\n addGuestButton.click();\n\n await page.waitForChanges();\n\n const guestEmailInputs = page?.root?.shadowRoot?.querySelectorAll('[part=\"nbf__input-textfield\"][id^=\"guest-email-\"]') as NodeListOf<HTMLInputElement>;\n expect(guestEmailInputs.length).toEqual(1);\n });\n\n xit('allows multiple guest emails to be added', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n // Simulate clicking the 'Add Guest' button twice\n const addGuestButton = page?.root?.shadowRoot?.querySelector('.add-guest') as HTMLButtonElement;\n addGuestButton.click();\n addGuestButton.click();\n await page.waitForChanges();\n\n // Check if two guest email inputs are present\n const guestEmailInputs = page?.root?.shadowRoot?.querySelectorAll('[id^=\"guest-email-\"]') as NodeListOf<HTMLInputElement>;\n expect(guestEmailInputs.length).toBe(2);\n });\n\n xit('removes a guest email input on remove button click', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n // Add two guests then remove one\n const addGuestButton = page?.root?.shadowRoot?.querySelector('.add-guest') as HTMLButtonElement;\n addGuestButton.click();\n addGuestButton.click();\n await page.waitForChanges();\n\n const removeGuestButton = page?.root?.shadowRoot?.querySelector('.remove-guest') as HTMLButtonElement;\n removeGuestButton.click();\n await page.waitForChanges();\n\n // Check if one guest email input remains\n const guestEmailInputs = page?.root?.shadowRoot?.querySelectorAll('[id^=\"guest-email-\"]') as NodeListOf<HTMLInputElement>;\n expect(guestEmailInputs.length).toBe(1);\n });\n\n it('emits nameChanged and emailChanged events on input change', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const nameChangedSpy = jest.fn();\n const emailChangedSpy = jest.fn();\n\n page.win.addEventListener('nameChanged', nameChangedSpy);\n page.win.addEventListener('emailChanged', emailChangedSpy);\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('label input') as HTMLInputElement;\n nameInput.value = 'John Doe';\n\n page.root?.dispatchEvent(\n new CustomEvent('nylasFormInputChanged', {\n detail: {\n value: nameInput.value,\n name: 'name',\n error: '',\n },\n }),\n );\n\n const emailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]')?.shadowRoot?.querySelector('label input') as HTMLInputElement;\n emailInput.value = 'john.doe@example.com';\n\n page.root?.dispatchEvent(\n new CustomEvent('nylasFormInputChanged', {\n detail: {\n value: emailInput.value,\n name: 'email',\n error: '',\n },\n }),\n );\n\n await page.waitForChanges();\n\n expect(nameChangedSpy.mock.calls[0][0].detail).toEqual('John Doe');\n expect(emailChangedSpy.mock.calls[0][0].detail).toEqual('john.doe@example.com');\n });\n\n it('emits backButtonClicked event on back button click', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const backButton = page?.root?.shadowRoot?.querySelector('.back') as HTMLButtonElement;\n const backButtonClickedSpy = jest.fn();\n page.win.addEventListener('backButtonClicked', backButtonClickedSpy);\n backButton.click();\n await page.waitForChanges();\n expect(backButtonClickedSpy).toHaveBeenCalled();\n });\n\n it('on entering name input and focusing on email input there are no errors', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n // Simulate actions\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n const emailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n\n nameInput.focus();\n nameInput.value = 'text';\n emailInput.focus();\n await page.waitForChanges();\n\n expect(consoleErrorSpy).not.toHaveBeenCalled();\n });\n\n it('validates name input correctly', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n // Simulate entering a valid name\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n nameInput.value = 'John Doe';\n nameInput.dispatchEvent(new Event('input'));\n const form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n await page.waitForChanges();\n\n // Assert no validation error message for name\n let errorMessage = page?.root?.shadowRoot?.querySelector('.input-wrapper [part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('.help-text') as HTMLSpanElement;\n expect(errorMessage).toBeNull();\n\n // Simulate clearing the name, triggering validation error\n nameInput.value = '';\n nameInput.dispatchEvent(new Event('input'));\n\n form.dispatchEvent(new Event('submit'));\n await page.waitForChanges();\n\n // Assert validation error message is shown for name\n errorMessage = page?.root?.shadowRoot?.querySelector('.input-wrapper [part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('.help-text') as HTMLSpanElement;\n expect(errorMessage.textContent).toBe('Name is required.');\n });\n\n it('validates email input correctly', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('label input[name=\"name\"]') as HTMLInputElement;\n nameInput.value = 'John Doe';\n nameInput.dispatchEvent(new Event('input'));\n\n // Simulate entering a valid email\n const emailInput = page?.root?.shadowRoot\n ?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]')\n ?.shadowRoot?.querySelector('label input[name=\"email\"]') as HTMLInputElement;\n emailInput.value = 'john.doe@example.com';\n emailInput.dispatchEvent(new Event('input'));\n\n let form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n await page.waitForChanges();\n\n // Assert no validation error message for email\n let errorMessage = page?.root?.shadowRoot\n ?.querySelector('.input-wrapper:nth-child(2) [part=\"nbf__input-textfield\"][id=\"email\"]')\n ?.shadowRoot?.querySelector('.help-text') as HTMLSpanElement;\n await page.waitForChanges();\n\n expect(errorMessage).toBeNull();\n\n // Simulate clearing the email, triggering validation error\n emailInput.value = '';\n emailInput.dispatchEvent(new Event('input'));\n await page.waitForChanges();\n form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n await page.waitForChanges();\n\n // Assert validation error message is shown for empty email\n errorMessage = page?.root?.shadowRoot\n ?.querySelector('.input-wrapper:nth-child(2) [part=\"nbf__input-textfield\"][id=\"email\"]')\n ?.shadowRoot?.querySelector('.help-text') as HTMLSpanElement;\n expect(errorMessage.textContent).toBe('Email is required.');\n });\n\n xit('validates guest email inputs correctly', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n nameInput.value = 'John Doe';\n nameInput.dispatchEvent(new Event('input'));\n\n const emailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n emailInput.value = 'john.doe@example.com';\n emailInput.dispatchEvent(new Event('input'));\n\n // Simulate adding a guest\n const addGuestButton = page?.root?.shadowRoot?.querySelector('.add-guest') as HTMLButtonElement;\n addGuestButton.click();\n await page.waitForChanges();\n\n const guestEmailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id^=\"guest-email-0\"]') as HTMLInputElement;\n\n // Simulate on blur event to trigger validation\n guestEmailInput.dispatchEvent(new Event('blur'));\n await page.waitForChanges();\n\n // Assert validation error message is shown for empty guest email\n let errorMessage = page?.root?.shadowRoot?.querySelector('.input-wrapper:nth-child(3) .button-wrapper .help-text') as HTMLParagraphElement;\n expect(errorMessage.textContent).toBe('Email is required.');\n\n // Simulate entering an ivalid guest email\n guestEmailInput.value = 'invalid-email';\n guestEmailInput.dispatchEvent(new Event('input'));\n let form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n await page.waitForChanges();\n\n // Assert validation error message is shown for invalid guest email\n expect(errorMessage.textContent).toBe('Invalid format. ');\n });\n\n it('prefills rescheduling form with the correct data', async () => {\n const rescheduleConfigSettings = {\n name: '',\n configuration_id: '4115ac80-d606-4b64-98b8-9c0420c8f318',\n scheduler: {\n available_days_in_future: 58,\n min_cancellation_notice: 0,\n min_booking_notice: 60,\n rescheduling_url: 'https://book.nylas.com/reschedule/:booking_ref',\n cancellation_url: 'https://book.nylas.com/cancel/:booking_ref',\n organizer_confirmation_url: 'https://book.nylas.com/confirm/:booking_ref',\n confirmation_redirect_url: '',\n hide_rescheduling_options: false,\n hide_cancellation_options: false,\n hide_additional_guests: false,\n cancellation_policy: '',\n additional_fields: {\n 'metadata_Metadata-Label_1': {\n label: 'Metadata Label',\n type: 'metadata',\n required: false,\n default: 'xyz',\n order: 1,\n },\n 'phone_number_Phone-Number-Label_1': {\n label: 'Phone Number Label',\n type: 'phone_number',\n required: false,\n default: '9964646442',\n order: 2,\n },\n 'multi-select': {\n default: 'orange',\n label: 'Select favorite fruits',\n order: 3,\n required: true,\n type: 'multi_select',\n options: ['orange', 'apple', 'banana', 'kiwi'],\n },\n },\n email_template: {\n logo: '',\n booking_confirmed: {},\n },\n },\n organizer: {\n email: 'test@nylas.com',\n name: 'Test User',\n },\n booking_type: 'booking',\n booking: {\n participants: [\n {\n email: 'test@nylas.com',\n is_organizer: true,\n name: 'Test User',\n availability: {\n calendar_ids: ['test@nylas.com'],\n },\n booking: {\n calendar_id: 'test@nylas.com',\n },\n timezone: 'America/Toronto',\n },\n ],\n guest: {\n name: 'Dalmia Fanning',\n email: 'dalmia@company.com',\n },\n timezone: 'America/Toronto',\n email_language: 'en',\n cancellation_reason: '',\n additional_guests: [\n {\n email: 'dale@fur.com',\n name: 'Dale Fur',\n },\n ],\n additional_fields: {\n 'metadata_Metadata-Label_1': 'xyz',\n 'phone_number_Phone-Number-Label_1': '1234567890',\n },\n booking_ref: 'test-booking-ref',\n booking_ref_salt: '',\n event_data: {\n when: {\n start_timezone: 'America/Toronto',\n end_timezone: 'America/Toronto',\n object: 'timespan',\n start_time: 1730952000,\n end_time: 1730953800,\n },\n location: '',\n },\n event_organizer: {\n email: 'test@nylas.com',\n is_organizer: true,\n name: 'Test User',\n availability: {\n calendar_ids: ['test@nylas.com'],\n },\n booking: {\n calendar_id: 'test@nylas.com',\n },\n timezone: 'America/Toronto',\n },\n },\n appearance: null,\n };\n\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n template: () => <nylas-booking-form configSettings={rescheduleConfigSettings} />,\n });\n\n await page.waitForChanges();\n expect(page.root).toMatchSnapshot();\n\n const guestEmailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"guest-email-0\"]') as HTMLInputElement;\n expect(guestEmailInput.value).toEqual('dale@fur.com');\n\n const inputComponent = page?.root?.shadowRoot?.querySelector('input-component#phone_number_Phone-Number-Label_1')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n expect(inputComponent.value).toEqual('1234567890');\n\n const spyEvent = jest.fn();\n page.win.addEventListener('detailsConfirmed', spyEvent);\n\n const form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n\n await page.waitForChanges();\n\n expect(spyEvent).toHaveBeenCalled();\n const obj = {\n additionalFields: {\n 'metadata_Metadata-Label_1': 'xyz',\n 'phone_number_Phone-Number-Label_1': '1234567890',\n 'multi-select': 'orange',\n },\n guests: [\n {\n email: 'dale@fur.com',\n name: 'dale@fur.com',\n },\n ],\n primaryParticipant: {\n email: 'dalmia@company.com',\n name: 'Dalmia Fanning',\n },\n };\n expect(spyEvent.mock.calls[0][0].detail).toEqual(obj);\n });\n});\n"]}
1
+ {"version":3,"file":"nylas-booking-form.spec.js","sourceRoot":"","sources":["../../../../../src/components/scheduler/nylas-booking-form/test/nylas-booking-form.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["import { newSpecPage } from '@stencil/core/testing';\nimport { NylasBookingForm } from '../nylas-booking-form';\nimport { InputComponent } from '../../../design-system/input-component/input-component';\nimport { h } from '@stencil/core';\nimport { RadioButtonGroup } from '../../../design-system/radio-button-group/radio-button-group';\nimport { CheckboxComponent } from '../../../design-system/checkbox-component/checkbox-component';\nimport { TextareaComponent } from '../../../design-system/textarea-component/textarea-component';\nimport { SelectDropdown } from '../../../design-system/select-dropdown/select-dropdown';\n\nconst configSettings = {\n scheduler: {\n available_days_in_future: 30,\n min_cancellation_notice: 0,\n min_booking_notice: 60,\n hide_rescheduling_options: false,\n hide_cancellation_options: false,\n hide_additional_guests: false,\n additional_fields: {\n additional_email: {\n label: 'Additional email',\n type: 'email',\n required: false,\n order: 2,\n default: 'additional_email@example.com',\n },\n checkbox: {\n label: 'Checkbox Label',\n type: 'checkbox',\n required: false,\n order: 6,\n },\n dropdown: {\n label: 'Dropdown Label',\n type: 'dropdown',\n required: false,\n order: 3,\n options: ['Yes', 'No'],\n },\n long_text: {\n label: 'Long text Label',\n type: 'multi_line_text',\n required: false,\n order: 5,\n },\n phone_number: {\n label: 'Phone Number',\n type: 'phone_number',\n required: false,\n order: 1,\n },\n radio_button: {\n label: 'Radio Button Label',\n type: 'radio_button',\n required: false,\n order: 7,\n options: ['Yes', 'No'],\n },\n short_text: {\n label: 'Short Text Label',\n type: 'text',\n required: false,\n order: 4,\n },\n },\n email_template: {\n booking_confirmed: {},\n },\n },\n organizer: {\n email: 'test@nylas.com',\n name: 'Test User',\n },\n};\n\ndescribe('nylas-booking-form', () => {\n beforeEach(() => {\n // Clear and reset the mock before each test if needed\n jest.clearAllMocks();\n });\n let consoleErrorSpy;\n\n beforeEach(() => {\n // Spy on console.error before each test\n consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});\n });\n\n afterEach(() => {\n // Restore the original console.error after each test\n consoleErrorSpy.mockRestore();\n });\n\n it('renders correctly with initial props', async () => {\n const bookingInfo = {\n primaryParticipant: {\n name: 'John Doe',\n email: 'john.doe@example.com',\n },\n };\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n if (!page.root) {\n throw new Error('Component did not render.');\n }\n\n page.root.bookingInfo = bookingInfo;\n await page.waitForChanges();\n expect(page.rootInstance.name).toEqual('John Doe');\n expect(page.rootInstance.email).toEqual('john.doe@example.com');\n expect(page.root).toMatchSnapshot();\n });\n\n it('renders an email error message when email is invalid', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n nameInput.value = 'John Doe';\n nameInput.dispatchEvent(new Event('input'));\n\n const emailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n emailInput.value = 'invalid-email';\n emailInput.dispatchEvent(new Event('input'));\n\n // Submit the form to trigger validation\n const form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n\n await page.waitForChanges();\n\n const errorMessage = page?.root?.shadowRoot\n ?.querySelector('.input-wrapper:nth-child(2) [part=\"nbf__input-textfield\"][id=\"email\"]')\n ?.shadowRoot?.querySelector('.help-text') as HTMLSpanElement;\n console.debug(errorMessage.className);\n expect(errorMessage.textContent).toBe('Email has invalid format.');\n });\n\n it('renders correctly with additional fields from the config', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n if (!page.root) {\n throw new Error('Component did not render.');\n }\n\n page.root.configSettings = configSettings;\n await page.waitForChanges();\n expect(page.root).toMatchSnapshot();\n const additionalEmailInputComponent = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"additional_email\"]') as HTMLInputElement;\n const additionalEmailInput = additionalEmailInputComponent.shadowRoot?.querySelector('input') as HTMLInputElement;\n\n expect(additionalEmailInput.value).not.toBeNull();\n expect(additionalEmailInput.value).toEqual('additional_email@example.com');\n additionalEmailInputComponent.value = 'abcd@gmail.com';\n\n page.root?.dispatchEvent(\n new CustomEvent('nylasFormInputChanged', {\n detail: {\n value: additionalEmailInputComponent.value,\n name: 'additional_email',\n error: '',\n label: 'Additional email',\n },\n }),\n );\n\n const checkboxInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__checkbox-component\"][id=\"checkbox\"]') as HTMLInputElement;\n checkboxInput.checked = true;\n\n page.root?.dispatchEvent(\n new CustomEvent('nylasFormCheckboxToggled', {\n detail: {\n checked: checkboxInput.checked,\n name: 'checkbox',\n error: '',\n label: 'Checkbox Label',\n },\n }),\n );\n\n await page.waitForChanges();\n expect(page.rootInstance.additionalFields).toEqual({ additional_email: 'abcd@gmail.com', checkbox: 'true' });\n });\n\n it('renders the values passed in the booking info by overriding the defaults', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n if (!page.root) {\n throw new Error('Component did not render.');\n }\n\n page.root.configSettings = configSettings;\n page.root.bookingInfo = {\n primaryParticipant: {\n name: 'John Doe',\n email: 'johndoe@example.com',\n },\n additionalFields: {\n additional_email: {\n value: 'xyz@example.com',\n type: 'email',\n },\n },\n };\n\n await page.waitForChanges();\n expect(page.root).toMatchSnapshot();\n const additionalEmailInputComponent = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"additional_email\"]') as HTMLInputElement;\n const additionalEmailInput = additionalEmailInputComponent.shadowRoot?.querySelector('input') as HTMLInputElement;\n\n expect(additionalEmailInput.value).not.toBeNull();\n expect(additionalEmailInput.value).toEqual('xyz@example.com');\n\n await page.waitForChanges();\n });\n\n it('renders the fields as read only if bookingInfo passes readOnly additional fields', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent, RadioButtonGroup, CheckboxComponent, TextareaComponent, SelectDropdown],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n if (!page.root) {\n throw new Error('Component did not render.');\n }\n\n page.root.configSettings = configSettings;\n page.root.bookingInfo = {\n primaryParticipant: {\n name: 'John Doe',\n email: 'johndoe@example.com',\n nameReadOnly: true,\n emailReadOnly: true,\n },\n additionalFields: {\n additional_email: {\n value: 'xyz@example.com',\n type: 'email',\n readOnly: true,\n },\n checkbox: {\n value: 'true',\n type: 'checkbox',\n readOnly: true,\n },\n dropdown: {\n value: 'No',\n type: 'dropdown',\n readOnly: true,\n },\n long_text: {\n value: 'Long text Label',\n type: 'multi_line_text',\n readOnly: true,\n },\n radio_button: {\n value: 'No',\n type: 'radio_button',\n readOnly: true,\n },\n },\n };\n\n await page.waitForChanges();\n expect(page.root).toMatchSnapshot();\n const nameInputComponent = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]') as HTMLInputElement;\n const nameInput = nameInputComponent.shadowRoot?.querySelector('input') as HTMLInputElement;\n expect(nameInput.value).not.toBeNull();\n expect(nameInput.value).toEqual('John Doe');\n expect(nameInput).toHaveAttribute('readOnly');\n\n const emailInputComponent = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]') as HTMLInputElement;\n const emailInput = emailInputComponent.shadowRoot?.querySelector('input') as HTMLInputElement;\n expect(emailInput.value).not.toBeNull();\n expect(emailInput.value).toEqual('johndoe@example.com');\n expect(emailInput).toHaveAttribute('readOnly');\n\n const additionalEmailInputComponent = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"additional_email\"]') as HTMLInputElement;\n const additionalEmailInput = additionalEmailInputComponent.shadowRoot?.querySelector('input') as HTMLInputElement;\n\n expect(additionalEmailInput.value).not.toBeNull();\n expect(additionalEmailInput.value).toEqual('xyz@example.com');\n expect(additionalEmailInput).toHaveAttribute('readOnly');\n\n const dropdown = page?.root?.shadowRoot?.querySelector('select-dropdown') as HTMLSelectDropdownElement;\n const dropdownButton = dropdown.shadowRoot?.querySelector('button') as HTMLButtonElement;\n expect(dropdownButton).toHaveAttribute('disabled');\n\n const checkbox = page?.root?.shadowRoot?.querySelector('checkbox-component') as HTMLCheckboxComponentElement;\n const checkboxInput = checkbox.shadowRoot?.querySelector('input') as HTMLInputElement;\n expect(checkboxInput).toHaveAttribute('disabled');\n expect(checkboxInput).toHaveAttribute('checked');\n\n const radioGroup = page?.root?.shadowRoot?.querySelector('radio-button-group') as HTMLRadioButtonGroupElement;\n const radioInput = radioGroup.shadowRoot?.querySelector('input') as HTMLInputElement;\n expect(radioInput).toHaveAttribute('disabled');\n\n const textarea = page?.root?.shadowRoot?.querySelector('textarea-component') as HTMLTextareaComponentElement;\n const textareaInput = textarea.shadowRoot?.querySelector('textarea') as HTMLTextAreaElement;\n expect(textareaInput).toHaveAttribute('readonly');\n });\n\n xit('renders guest email input on add guest button click', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const addGuestButton = page?.root?.shadowRoot?.querySelector('.add-guest') as HTMLButtonElement;\n addGuestButton.click();\n\n await page.waitForChanges();\n\n const guestEmailInputs = page?.root?.shadowRoot?.querySelectorAll('[part=\"nbf__input-textfield\"][id^=\"guest-email-\"]') as NodeListOf<HTMLInputElement>;\n expect(guestEmailInputs.length).toEqual(1);\n });\n\n xit('allows multiple guest emails to be added', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n // Simulate clicking the 'Add Guest' button twice\n const addGuestButton = page?.root?.shadowRoot?.querySelector('.add-guest') as HTMLButtonElement;\n addGuestButton.click();\n addGuestButton.click();\n await page.waitForChanges();\n\n // Check if two guest email inputs are present\n const guestEmailInputs = page?.root?.shadowRoot?.querySelectorAll('[id^=\"guest-email-\"]') as NodeListOf<HTMLInputElement>;\n expect(guestEmailInputs.length).toBe(2);\n });\n\n xit('removes a guest email input on remove button click', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n // Add two guests then remove one\n const addGuestButton = page?.root?.shadowRoot?.querySelector('.add-guest') as HTMLButtonElement;\n addGuestButton.click();\n addGuestButton.click();\n await page.waitForChanges();\n\n const removeGuestButton = page?.root?.shadowRoot?.querySelector('.remove-guest') as HTMLButtonElement;\n removeGuestButton.click();\n await page.waitForChanges();\n\n // Check if one guest email input remains\n const guestEmailInputs = page?.root?.shadowRoot?.querySelectorAll('[id^=\"guest-email-\"]') as NodeListOf<HTMLInputElement>;\n expect(guestEmailInputs.length).toBe(1);\n });\n\n it('emits nameChanged and emailChanged events on input change', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const nameChangedSpy = jest.fn();\n const emailChangedSpy = jest.fn();\n\n page.win.addEventListener('nameChanged', nameChangedSpy);\n page.win.addEventListener('emailChanged', emailChangedSpy);\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('label input') as HTMLInputElement;\n nameInput.value = 'John Doe';\n\n page.root?.dispatchEvent(\n new CustomEvent('nylasFormInputChanged', {\n detail: {\n value: nameInput.value,\n name: 'name',\n error: '',\n },\n }),\n );\n\n const emailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]')?.shadowRoot?.querySelector('label input') as HTMLInputElement;\n emailInput.value = 'john.doe@example.com';\n\n page.root?.dispatchEvent(\n new CustomEvent('nylasFormInputChanged', {\n detail: {\n value: emailInput.value,\n name: 'email',\n error: '',\n },\n }),\n );\n\n await page.waitForChanges();\n\n expect(nameChangedSpy.mock.calls[0][0].detail).toEqual('John Doe');\n expect(emailChangedSpy.mock.calls[0][0].detail).toEqual('john.doe@example.com');\n });\n\n it('emits backButtonClicked event on back button click', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const backButton = page?.root?.shadowRoot?.querySelector('.back') as HTMLButtonElement;\n const backButtonClickedSpy = jest.fn();\n page.win.addEventListener('backButtonClicked', backButtonClickedSpy);\n backButton.click();\n await page.waitForChanges();\n expect(backButtonClickedSpy).toHaveBeenCalled();\n });\n\n it('on entering name input and focusing on email input there are no errors', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n // Simulate actions\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n const emailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n\n nameInput.focus();\n nameInput.value = 'text';\n emailInput.focus();\n await page.waitForChanges();\n\n expect(consoleErrorSpy).not.toHaveBeenCalled();\n });\n\n it('validates name input correctly', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n // Simulate entering a valid name\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n nameInput.value = 'John Doe';\n nameInput.dispatchEvent(new Event('input'));\n const form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n await page.waitForChanges();\n\n // Assert no validation error message for name\n let errorMessage = page?.root?.shadowRoot?.querySelector('.input-wrapper [part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('.help-text') as HTMLSpanElement;\n expect(errorMessage).toBeNull();\n\n // Simulate clearing the name, triggering validation error\n nameInput.value = '';\n nameInput.dispatchEvent(new Event('input'));\n\n form.dispatchEvent(new Event('submit'));\n await page.waitForChanges();\n\n // Assert validation error message is shown for name\n errorMessage = page?.root?.shadowRoot?.querySelector('.input-wrapper [part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('.help-text') as HTMLSpanElement;\n expect(errorMessage.textContent).toBe('Name is required.');\n });\n\n it('validates email input correctly', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('label input[name=\"name\"]') as HTMLInputElement;\n nameInput.value = 'John Doe';\n nameInput.dispatchEvent(new Event('input'));\n\n // Simulate entering a valid email\n const emailInput = page?.root?.shadowRoot\n ?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]')\n ?.shadowRoot?.querySelector('label input[name=\"email\"]') as HTMLInputElement;\n emailInput.value = 'john.doe@example.com';\n emailInput.dispatchEvent(new Event('input'));\n\n let form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n await page.waitForChanges();\n\n // Assert no validation error message for email\n let errorMessage = page?.root?.shadowRoot\n ?.querySelector('.input-wrapper:nth-child(2) [part=\"nbf__input-textfield\"][id=\"email\"]')\n ?.shadowRoot?.querySelector('.help-text') as HTMLSpanElement;\n await page.waitForChanges();\n\n expect(errorMessage).toBeNull();\n\n // Simulate clearing the email, triggering validation error\n emailInput.value = '';\n emailInput.dispatchEvent(new Event('input'));\n await page.waitForChanges();\n form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n await page.waitForChanges();\n\n // Assert validation error message is shown for empty email\n errorMessage = page?.root?.shadowRoot\n ?.querySelector('.input-wrapper:nth-child(2) [part=\"nbf__input-textfield\"][id=\"email\"]')\n ?.shadowRoot?.querySelector('.help-text') as HTMLSpanElement;\n expect(errorMessage.textContent).toBe('Email is required.');\n });\n\n xit('validates guest email inputs correctly', async () => {\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent],\n html: `<nylas-booking-form></nylas-booking-form>`,\n });\n\n const nameInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"name\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n nameInput.value = 'John Doe';\n nameInput.dispatchEvent(new Event('input'));\n\n const emailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"email\"]')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n emailInput.value = 'john.doe@example.com';\n emailInput.dispatchEvent(new Event('input'));\n\n // Simulate adding a guest\n const addGuestButton = page?.root?.shadowRoot?.querySelector('.add-guest') as HTMLButtonElement;\n addGuestButton.click();\n await page.waitForChanges();\n\n const guestEmailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id^=\"guest-email-0\"]') as HTMLInputElement;\n\n // Simulate on blur event to trigger validation\n guestEmailInput.dispatchEvent(new Event('blur'));\n await page.waitForChanges();\n\n // Assert validation error message is shown for empty guest email\n let errorMessage = page?.root?.shadowRoot?.querySelector('.input-wrapper:nth-child(3) .button-wrapper .help-text') as HTMLParagraphElement;\n expect(errorMessage.textContent).toBe('Email is required.');\n\n // Simulate entering an ivalid guest email\n guestEmailInput.value = 'invalid-email';\n guestEmailInput.dispatchEvent(new Event('input'));\n let form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n await page.waitForChanges();\n\n // Assert validation error message is shown for invalid guest email\n expect(errorMessage.textContent).toBe('Invalid format. ');\n });\n\n it('prefills rescheduling form with the correct data', async () => {\n const rescheduleConfigSettings = {\n name: '',\n configuration_id: '4115ac80-d606-4b64-98b8-9c0420c8f318',\n scheduler: {\n available_days_in_future: 58,\n min_cancellation_notice: 0,\n min_booking_notice: 60,\n rescheduling_url: 'https://book.nylas.com/reschedule/:booking_ref',\n cancellation_url: 'https://book.nylas.com/cancel/:booking_ref',\n organizer_confirmation_url: 'https://book.nylas.com/confirm/:booking_ref',\n confirmation_redirect_url: '',\n hide_rescheduling_options: false,\n hide_cancellation_options: false,\n hide_additional_guests: false,\n cancellation_policy: '',\n additional_fields: {\n 'metadata_Metadata-Label_1': {\n label: 'Metadata Label',\n type: 'metadata',\n required: false,\n default: 'xyz',\n order: 1,\n },\n 'phone_number_Phone-Number-Label_1': {\n label: 'Phone Number Label',\n type: 'phone_number',\n required: false,\n default: '9964646442',\n order: 2,\n },\n 'multi-select': {\n default: 'orange',\n label: 'Select favorite fruits',\n order: 3,\n required: true,\n type: 'multi_select',\n options: ['orange', 'apple', 'banana', 'kiwi'],\n },\n 'multi_line_text_Long-text-Label_1': {\n label: 'Long text Label',\n type: 'multi_line_text',\n required: true,\n order: 4,\n },\n },\n email_template: {\n logo: '',\n booking_confirmed: {},\n },\n },\n organizer: {\n email: 'test@nylas.com',\n name: 'Test User',\n },\n booking_type: 'booking',\n booking: {\n participants: [\n {\n email: 'test@nylas.com',\n is_organizer: true,\n name: 'Test User',\n availability: {\n calendar_ids: ['test@nylas.com'],\n },\n booking: {\n calendar_id: 'test@nylas.com',\n },\n timezone: 'America/Toronto',\n },\n ],\n guest: {\n name: 'Dalmia Fanning',\n email: 'dalmia@company.com',\n },\n timezone: 'America/Toronto',\n email_language: 'en',\n cancellation_reason: '',\n additional_guests: [\n {\n email: 'dale@fur.com',\n name: 'Dale Fur',\n },\n ],\n additional_fields: {\n 'metadata_Metadata-Label_1': 'xyz',\n 'phone_number_Phone-Number-Label_1': '1234567890',\n },\n booking_ref: 'test-booking-ref',\n booking_ref_salt: '',\n event_data: {\n when: {\n start_timezone: 'America/Toronto',\n end_timezone: 'America/Toronto',\n object: 'timespan',\n start_time: 1730952000,\n end_time: 1730953800,\n },\n location: '',\n },\n event_organizer: {\n email: 'test@nylas.com',\n is_organizer: true,\n name: 'Test User',\n availability: {\n calendar_ids: ['test@nylas.com'],\n },\n booking: {\n calendar_id: 'test@nylas.com',\n },\n timezone: 'America/Toronto',\n },\n },\n appearance: null,\n };\n\n const page = await newSpecPage({\n components: [NylasBookingForm, InputComponent, TextareaComponent],\n template: () => <nylas-booking-form configSettings={rescheduleConfigSettings} />,\n });\n\n await page.waitForChanges();\n expect(page.root).toMatchSnapshot();\n\n const guestEmailInput = page?.root?.shadowRoot?.querySelector('[part=\"nbf__input-textfield\"][id=\"guest-email-0\"]') as HTMLInputElement;\n expect(guestEmailInput.value).toEqual('dale@fur.com');\n\n const inputComponent = page?.root?.shadowRoot?.querySelector('input-component#phone_number_Phone-Number-Label_1')?.shadowRoot?.querySelector('input') as HTMLInputElement;\n expect(inputComponent.value).toEqual('1234567890');\n\n const spyEvent = jest.fn();\n page.win.addEventListener('detailsConfirmed', spyEvent);\n\n const form = page?.root?.shadowRoot?.querySelector('form') as HTMLFormElement;\n form.dispatchEvent(new Event('submit'));\n\n await page.waitForChanges();\n\n const textAreaComponent = page?.root?.shadowRoot?.querySelector('textarea-component#multi_line_text_Long-text-Label_1') as HTMLTextareaComponentElement;\n const textArea = textAreaComponent.shadowRoot?.querySelector('textarea') as HTMLTextAreaElement;\n console.log('###textAreaComponent:', textArea);\n\n textArea.value = 'This is a long text';\n textArea.dispatchEvent(new Event('input'));\n\n const event = new CustomEvent('nylasFormInputChanged', {\n detail: {\n value: textArea.value,\n name: 'multi_line_text_Long-text-Label_1',\n error: '',\n label: 'Long text Label',\n },\n });\n (page.rootInstance as unknown as NylasBookingForm).nylasFormInputChangedHandler(event);\n await page.waitForChanges();\n\n form.dispatchEvent(new Event('submit'));\n\n await page.waitForChanges();\n\n expect(spyEvent).toHaveBeenCalled();\n const obj = {\n additionalFields: {\n 'metadata_Metadata-Label_1': 'xyz',\n 'phone_number_Phone-Number-Label_1': '1234567890',\n 'multi-select': 'orange',\n 'multi_line_text_Long-text-Label_1': 'This is a long text',\n },\n guests: [\n {\n email: 'dale@fur.com',\n name: 'dale@fur.com',\n },\n ],\n primaryParticipant: {\n email: 'dalmia@company.com',\n name: 'Dalmia Fanning',\n },\n };\n expect(spyEvent.mock.calls[0][0].detail).toEqual(obj);\n });\n});\n"]}
@@ -341,7 +341,12 @@ export class NylasScheduling {
341
341
  this.showFeedbackModal = false;
342
342
  }
343
343
  feedbackSubmittedHandler(event) {
344
- const eventId = Sentry.captureMessage('Scheduling Page User Feedback');
344
+ const eventId = Sentry.captureMessage('Scheduling Page User Feedback', {
345
+ extra: {
346
+ configId: this.configurationId,
347
+ slug: this.slug,
348
+ },
349
+ });
345
350
  const feedback = {
346
351
  eventId: eventId,
347
352
  message: event.detail.feedback,
@@ -350,8 +355,11 @@ export class NylasScheduling {
350
355
  includeReplay: true,
351
356
  captureContext: {
352
357
  tags: {
353
- 'nylas-web-element': 'nylas-schduling',
358
+ 'nylas-web-element': 'nylas-scheduling',
354
359
  'nylas-web-element-version': process.env.PACKAGE_VERSION,
360
+ 'nylas-config-id': this.configurationId,
361
+ 'nylas-slug': this.slug,
362
+ 'host-url': window.location.href,
355
363
  },
356
364
  extra: {
357
365
  configId: this.configurationId,