@foxy.io/elements 1.14.0-beta.5 → 1.14.0-beta.6

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 (67) hide show
  1. package/dist/cdn/foxy-access-recovery-form.js +1 -1
  2. package/dist/cdn/foxy-address-card.js +1 -1
  3. package/dist/cdn/foxy-address-form.js +1 -1
  4. package/dist/cdn/foxy-applied-tax-card.js +1 -1
  5. package/dist/cdn/foxy-attribute-card.js +1 -1
  6. package/dist/cdn/foxy-attribute-form.js +1 -1
  7. package/dist/cdn/foxy-cancellation-form.js +1 -1
  8. package/dist/cdn/foxy-collection-page.js +1 -1
  9. package/dist/cdn/foxy-collection-pages.js +1 -1
  10. package/dist/cdn/foxy-custom-field-card.js +1 -1
  11. package/dist/cdn/foxy-custom-field-form.js +1 -1
  12. package/dist/cdn/foxy-customer-card.js +1 -1
  13. package/dist/cdn/foxy-customer-form.js +1 -1
  14. package/dist/cdn/foxy-customer-portal-settings.js +1 -1
  15. package/dist/cdn/foxy-customer-portal.js +1 -1
  16. package/dist/cdn/foxy-customer.js +2 -2
  17. package/dist/cdn/foxy-customers-table.js +1 -1
  18. package/dist/cdn/foxy-discount-card.js +1 -1
  19. package/dist/cdn/foxy-donation.js +1 -1
  20. package/dist/cdn/foxy-email-template-form.js +1 -1
  21. package/dist/cdn/foxy-error-entry-card.js +1 -1
  22. package/dist/cdn/foxy-form-dialog.js +1 -1
  23. package/dist/cdn/foxy-i18n.js +1 -1
  24. package/dist/cdn/foxy-items-form.js +1 -1
  25. package/dist/cdn/foxy-payment-card.js +1 -1
  26. package/dist/cdn/foxy-payment-method-card.js +1 -1
  27. package/dist/cdn/foxy-query-builder.js +2 -2
  28. package/dist/cdn/foxy-sign-in-form.js +1 -1
  29. package/dist/cdn/foxy-spinner.js +1 -1
  30. package/dist/cdn/foxy-subscription-card.js +1 -1
  31. package/dist/cdn/foxy-subscription-form.js +1 -1
  32. package/dist/cdn/foxy-subscriptions-table.js +1 -1
  33. package/dist/cdn/foxy-table.js +1 -1
  34. package/dist/cdn/foxy-tax-card.js +1 -1
  35. package/dist/cdn/foxy-tax-form.js +1 -1
  36. package/dist/cdn/foxy-template-config-form.js +2 -2
  37. package/dist/cdn/foxy-template-form.js +1 -1
  38. package/dist/cdn/foxy-transaction-card.js +1 -1
  39. package/dist/cdn/foxy-transactions-table.js +1 -1
  40. package/dist/cdn/foxy-user-form.js +1 -1
  41. package/dist/cdn/foxy-users-table.js +1 -1
  42. package/dist/cdn/{shared-782bf922.js → shared-09feabf8.js} +1 -1
  43. package/dist/cdn/{shared-2174bcd4.js → shared-0ba88744.js} +1 -1
  44. package/dist/cdn/{shared-614e1a4e.js → shared-16e28f3b.js} +1 -1
  45. package/dist/cdn/{shared-87190eae.js → shared-1bafffd0.js} +1 -1
  46. package/dist/cdn/{shared-d94ffc2b.js → shared-3f35fa81.js} +1 -1
  47. package/dist/cdn/{shared-7a39a41f.js → shared-4d3c7828.js} +1 -1
  48. package/dist/cdn/{shared-10bdb6b9.js → shared-50c7a176.js} +5 -5
  49. package/dist/cdn/{shared-4a52d9b5.js → shared-691da586.js} +1 -1
  50. package/dist/cdn/{shared-1469c1c4.js → shared-6ecbc785.js} +1 -1
  51. package/dist/cdn/{shared-9d779f46.js → shared-6f7f752e.js} +1 -1
  52. package/dist/cdn/{shared-396320f9.js → shared-7629a1a5.js} +1 -1
  53. package/dist/cdn/{shared-166c44ae.js → shared-8edee4e1.js} +1 -1
  54. package/dist/cdn/{shared-3d868b17.js → shared-a6c047b1.js} +1 -1
  55. package/dist/cdn/{shared-75ce6e43.js → shared-ace85f1b.js} +1 -1
  56. package/dist/cdn/{shared-fb90e05c.js → shared-c66e9946.js} +1 -1
  57. package/dist/cdn/shared-d8852c42.js +1 -0
  58. package/dist/cdn/translations/shared/en.json +32 -1
  59. package/dist/elements/private/Checkbox/Checkbox.js +5 -1
  60. package/dist/elements/private/Checkbox/Checkbox.js.map +1 -1
  61. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.d.ts +5 -0
  62. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js +418 -1
  63. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js.map +1 -1
  64. package/dist/mixins/themeable.js +21 -0
  65. package/dist/mixins/themeable.js.map +1 -1
  66. package/package.json +1 -1
  67. package/dist/cdn/shared-1b7e65e4.js +0 -1
@@ -1,3 +1,4 @@
1
+ import * as logos from "../PaymentMethodCard/logos.js";
1
2
  import { ChoiceChangeEvent } from "../../private/events.js";
2
3
  import { ScopedElementsMixin } from '@open-wc/scoped-elements';
3
4
  import { html } from 'lit-html';
@@ -60,11 +61,16 @@ export class TemplateConfigForm extends Base {
60
61
  ${hidden.matches('foxycomplete', true) ? '' : this.__renderFoxycomplete(json)}
61
62
  ${hidden.matches('locations', true) ? '' : this.__renderLocations(json)}
62
63
  ${hidden.matches('hidden-fields', true) ? '' : this.__renderHiddenFields(json)}
64
+ ${hidden.matches('cards', true) ? '' : this.__renderCards(json)}
65
+ ${hidden.matches('checkout-type', true) ? '' : this.__renderCheckoutType(json)}
66
+ ${hidden.matches('consent', true) ? '' : this.__renderConsent(json)}
67
+ ${hidden.matches('fields', true) ? '' : this.__renderFields(json)}
63
68
  ${hidden.matches('google-analytics', true) ? '' : this.__renderGoogleAnalytics(json)}
64
69
  ${hidden.matches('segment-io', true) ? '' : this.__renderSegmentIo(json)}
65
70
  ${hidden.matches('troubleshooting', true) ? '' : this.__renderTroubleshooting(json)}
66
71
  ${hidden.matches('custom-config', true) ? '' : this.__renderCustomConfig(json)}
67
72
  ${hidden.matches('header', true) ? '' : this.__renderHeader(json)}
73
+ ${hidden.matches('custom-fields', true) ? '' : this.__renderCustomFields(json)}
68
74
  ${hidden.matches('footer', true) ? '' : this.__renderFooter(json)}
69
75
  </div>
70
76
 
@@ -149,7 +155,8 @@ export class TemplateConfigForm extends Base {
149
155
  this.edit({ json: JSON.stringify({ ...json, foxycomplete: newConfig }) });
150
156
  }}
151
157
  >
152
- <foxy-i18n lang=${lang} key="show_country_flags" ns=${ns}></foxy-i18n>
158
+ <foxy-i18n class="leading-s block" lang=${lang} key="show_country_flags" ns=${ns}>
159
+ </foxy-i18n>
153
160
  </x-checkbox>
154
161
  `;
155
162
  return html `
@@ -475,6 +482,392 @@ export class TemplateConfigForm extends Base {
475
482
  </div>
476
483
  `;
477
484
  }
485
+ __renderCards(json) {
486
+ const { lang, ns } = this;
487
+ const isDisabled = this.disabledSelector.matches('cards', true);
488
+ const config = json.supported_payment_cards;
489
+ let skipForSaved;
490
+ let skipForSSO;
491
+ if (json.csc_requirements === 'all_cards') {
492
+ skipForSaved = false;
493
+ skipForSSO = false;
494
+ }
495
+ else if (json.csc_requirements === 'sso_only') {
496
+ skipForSaved = true;
497
+ skipForSSO = false;
498
+ }
499
+ else {
500
+ skipForSaved = true;
501
+ skipForSSO = true;
502
+ }
503
+ const typeToName = {
504
+ amex: 'American Express',
505
+ diners: 'Diners Club',
506
+ discover: 'Discover',
507
+ jcb: 'JCB',
508
+ maestro: 'Maestro',
509
+ mastercard: 'Mastercard',
510
+ unionpay: 'UnionPay',
511
+ visa: 'Visa',
512
+ };
513
+ return html `
514
+ <div>
515
+ ${this.renderTemplateOrSlot('cards:before')}
516
+
517
+ <div class="space-y-xs">
518
+ <x-group frame>
519
+ <foxy-i18n slot="header" lang=${lang} key="supported_cards" ns=${ns}></foxy-i18n>
520
+
521
+ <div class="flex flex-wrap m-xs p-s">
522
+ ${Object.entries(logos).map(([type, logo]) => {
523
+ if (!typeToName[type])
524
+ return;
525
+ const isChecked = config.includes(type);
526
+ return html `
527
+ <div
528
+ class=${classMap({
529
+ 'm-xs rounded': true,
530
+ 'opacity-50 cursor-default': isDisabled,
531
+ 'cursor-pointer ring-primary-50 focus-within-ring-2': !isDisabled,
532
+ })}
533
+ >
534
+ <label
535
+ class=${classMap({
536
+ 'overflow-hidden transition-colors flex rounded border': true,
537
+ 'border-primary bg-primary-10 text-primary': isChecked,
538
+ 'hover-text-body': isChecked && !isDisabled,
539
+ 'border-contrast-10': !isChecked,
540
+ 'hover-border-primary hover-text-primary': !isChecked && !isDisabled,
541
+ })}
542
+ >
543
+ <div class="h-s">${logo}</div>
544
+
545
+ <div class="text-s font-medium mx-s my-auto leading-none">
546
+ ${typeToName[type]}
547
+ </div>
548
+
549
+ <input
550
+ type="checkbox"
551
+ class="sr-only"
552
+ ?disabled=${isDisabled}
553
+ ?checked=${isChecked}
554
+ @change=${(evt) => {
555
+ evt.stopPropagation();
556
+ if (isChecked) {
557
+ config.splice(config.indexOf(type), 1);
558
+ }
559
+ else {
560
+ config.push(type);
561
+ }
562
+ this.edit({ json: JSON.stringify(json) });
563
+ }}
564
+ />
565
+ </label>
566
+ </div>
567
+ `;
568
+ })}
569
+ </div>
570
+
571
+ <div class="flex flex-wrap p-s border-t border-contrast-10">
572
+ <x-checkbox
573
+ class="m-s"
574
+ ?disabled=${isDisabled || json.csc_requirements === 'new_cards_only'}
575
+ ?checked=${skipForSaved}
576
+ @change=${(evt) => {
577
+ json.csc_requirements = evt.detail ? 'sso_only' : 'all_cards';
578
+ this.edit({ json: JSON.stringify(json) });
579
+ }}
580
+ >
581
+ <foxy-i18n class="leading-s block" lang=${lang} key="skip_csc_for_saved" ns=${ns}>
582
+ </foxy-i18n>
583
+ </x-checkbox>
584
+
585
+ <x-checkbox
586
+ class="m-s"
587
+ ?disabled=${isDisabled}
588
+ ?checked=${skipForSSO}
589
+ @change=${(evt) => {
590
+ json.csc_requirements = evt.detail
591
+ ? 'new_cards_only'
592
+ : skipForSaved
593
+ ? 'sso_only'
594
+ : 'all_cards';
595
+ this.edit({ json: JSON.stringify(json) });
596
+ }}
597
+ >
598
+ <foxy-i18n class="leading-s block" lang=${lang} key="skip_csc_for_sso" ns=${ns}>
599
+ </foxy-i18n>
600
+ </x-checkbox>
601
+ </div>
602
+ </x-group>
603
+
604
+ <foxy-i18n
605
+ class="text-xs text-secondary leading-s block"
606
+ lang=${lang}
607
+ key="supported_cards_disclaimer"
608
+ ns=${ns}
609
+ >
610
+ </foxy-i18n>
611
+ </div>
612
+
613
+ ${this.renderTemplateOrSlot('cards:after')}
614
+ </div>
615
+ `;
616
+ }
617
+ __renderCheckoutType(json) {
618
+ const { lang, ns } = this;
619
+ return html `
620
+ <div>
621
+ ${this.renderTemplateOrSlot('checkout-type:before')}
622
+
623
+ <div class="space-y-xs">
624
+ <x-group frame>
625
+ <foxy-i18n slot="header" lang=${lang} key="checkout_type" ns=${ns}></foxy-i18n>
626
+
627
+ <x-choice
628
+ ?disabled=${this.disabledSelector.matches('checkout-type', true)}
629
+ ?readonly=${this.readonlySelector.matches('checkout-type', true)}
630
+ .items=${['default_account', 'default_guest', 'guest_only', 'account_only']}
631
+ .value=${json.checkout_type}
632
+ .getText=${(item) => this.t(`checkout_type_${item}`)}
633
+ @change=${(evt) => {
634
+ json.checkout_type = evt.detail;
635
+ this.edit({ json: JSON.stringify(json) });
636
+ }}
637
+ >
638
+ </x-choice>
639
+ </x-group>
640
+
641
+ <foxy-i18n
642
+ class="text-secondary text-xs leading-s block"
643
+ lang=${lang}
644
+ key="checkout_type_helper_text"
645
+ ns=${ns}
646
+ >
647
+ </foxy-i18n>
648
+ </div>
649
+
650
+ ${this.renderTemplateOrSlot('checkout-type:after')}
651
+ </div>
652
+ `;
653
+ }
654
+ __renderConsent(json) {
655
+ const { lang, ns } = this;
656
+ const tosConfig = json.tos_checkbox_settings;
657
+ const mailConfig = json.newsletter_subscribe;
658
+ const sdtaConfig = json.eu_secure_data_transfer_consent;
659
+ const isDisabled = this.disabledSelector.matches('consent', true);
660
+ const isReadonly = this.readonlySelector.matches('consent', true);
661
+ const dividerStyle = 'margin-left: calc(1.125rem + (var(--lumo-space-m) * 2))';
662
+ return html `
663
+ <div>
664
+ ${this.renderTemplateOrSlot('consent:before')}
665
+
666
+ <x-group frame>
667
+ <foxy-i18n slot="header" lang=${lang} key="consent" ns=${ns}></foxy-i18n>
668
+
669
+ <x-checkbox
670
+ ?disabled=${isDisabled}
671
+ ?readonly=${isReadonly}
672
+ ?checked=${tosConfig.usage === 'required' || tosConfig.usage === 'optional'}
673
+ class="m-m"
674
+ @change=${(evt) => {
675
+ tosConfig.initial_state = evt.detail ? tosConfig.initial_state : 'unchecked';
676
+ tosConfig.is_hidden = false;
677
+ tosConfig.usage = evt.detail ? 'required' : 'none';
678
+ tosConfig.url = evt.detail ? tosConfig.url : '';
679
+ this.edit({ json: JSON.stringify(json) });
680
+ }}
681
+ >
682
+ <div class="flex flex-col">
683
+ <foxy-i18n lang=${lang} key="display_tos_link" ns=${ns}></foxy-i18n>
684
+ <foxy-i18n
685
+ class="text-xs leading-s text-secondary"
686
+ lang=${lang}
687
+ key="display_tos_link_explainer"
688
+ ns=${ns}
689
+ >
690
+ </foxy-i18n>
691
+ </div>
692
+
693
+ <div slot="content" ?hidden=${tosConfig.usage === 'none'}>
694
+ <vaadin-text-field
695
+ label=${this.t('location_url')}
696
+ class="w-full mt-m"
697
+ placeholder="https://example.com/path/to/tos"
698
+ clear-button-visible
699
+ ?disabled=${isDisabled}
700
+ ?readonly=${isReadonly}
701
+ .value=${tosConfig.url}
702
+ @input=${(evt) => {
703
+ tosConfig.url = evt.currentTarget.value;
704
+ this.edit({ json: JSON.stringify(json) });
705
+ }}
706
+ >
707
+ </vaadin-text-field>
708
+
709
+ <div class="flex flex-wrap -mx-s -mb-s mt-s">
710
+ <x-checkbox
711
+ class="m-s"
712
+ ?disabled=${isDisabled}
713
+ ?checked=${tosConfig.usage === 'required'}
714
+ @change=${(evt) => {
715
+ tosConfig.usage = evt.detail ? 'required' : 'optional';
716
+ this.edit({ json: JSON.stringify(json) });
717
+ }}
718
+ >
719
+ <foxy-i18n class="leading-s block" lang=${lang} key="require_consent" ns=${ns}>
720
+ </foxy-i18n>
721
+ </x-checkbox>
722
+
723
+ <x-checkbox
724
+ class="m-s"
725
+ ?disabled=${isDisabled}
726
+ ?checked=${tosConfig.initial_state === 'checked'}
727
+ @change=${(evt) => {
728
+ tosConfig.initial_state = evt.detail ? 'checked' : 'unchecked';
729
+ this.edit({ json: JSON.stringify(json) });
730
+ }}
731
+ >
732
+ <foxy-i18n class="leading-s block" lang=${lang} key="checked_by_default" ns=${ns}>
733
+ </foxy-i18n>
734
+ </x-checkbox>
735
+ </div>
736
+ </div>
737
+ </x-checkbox>
738
+
739
+ <div style=${dividerStyle} class="border-b border-contrast-10"></div>
740
+
741
+ <x-checkbox
742
+ ?disabled=${isDisabled}
743
+ ?readonly=${isReadonly}
744
+ ?checked=${mailConfig.usage === 'required'}
745
+ class="m-m"
746
+ @change=${(evt) => {
747
+ mailConfig.usage = evt.detail ? 'required' : 'none';
748
+ this.edit({ json: JSON.stringify(json) });
749
+ }}
750
+ >
751
+ <div class="flex flex-col">
752
+ <foxy-i18n lang=${lang} key="newsletter_subscribe" ns=${ns}></foxy-i18n>
753
+ <foxy-i18n
754
+ class="text-xs leading-s text-secondary"
755
+ lang=${lang}
756
+ key="newsletter_subscribe_explainer"
757
+ ns=${ns}
758
+ >
759
+ </foxy-i18n>
760
+ </div>
761
+ </x-checkbox>
762
+
763
+ <div style=${dividerStyle} class="border-b border-contrast-10"></div>
764
+
765
+ <x-checkbox
766
+ ?disabled=${isDisabled}
767
+ ?readonly=${isReadonly}
768
+ ?checked=${sdtaConfig.usage === 'required'}
769
+ class="m-m"
770
+ @change=${(evt) => {
771
+ sdtaConfig.usage = evt.detail ? 'required' : 'none';
772
+ this.edit({ json: JSON.stringify(json) });
773
+ }}
774
+ >
775
+ <div class="flex flex-col">
776
+ <foxy-i18n lang=${lang} key="display_sdta" ns=${ns}></foxy-i18n>
777
+ <foxy-i18n
778
+ class="text-xs leading-s text-secondary"
779
+ lang=${lang}
780
+ key="display_sdta_explainer"
781
+ ns=${ns}
782
+ >
783
+ </foxy-i18n>
784
+ </div>
785
+ </x-checkbox>
786
+ </x-group>
787
+
788
+ ${this.renderTemplateOrSlot('consent:before')}
789
+ </div>
790
+ `;
791
+ }
792
+ __renderFields(json) {
793
+ const { lang, ns } = this;
794
+ const isDisabled = this.disabledSelector.matches('fields', true);
795
+ const config = json.custom_checkout_field_requirements;
796
+ const options = {
797
+ cart_controls: ['enabled', 'disabled'],
798
+ coupon_entry: ['enabled', 'disabled'],
799
+ billing_first_name: ['default', 'optional', 'required', 'hidden'],
800
+ billing_last_name: ['default', 'optional', 'required', 'hidden'],
801
+ billing_company: ['default', 'optional', 'required', 'hidden'],
802
+ billing_tax_id: ['default', 'optional', 'required', 'hidden'],
803
+ billing_phone: ['default', 'optional', 'required', 'hidden'],
804
+ billing_address1: ['default', 'optional', 'required', 'hidden'],
805
+ billing_address2: ['default', 'optional', 'required', 'hidden'],
806
+ billing_city: ['default', 'optional', 'required', 'hidden'],
807
+ billing_region: ['default', 'optional', 'required', 'hidden'],
808
+ billing_postal_code: ['default', 'optional', 'required', 'hidden'],
809
+ billing_country: ['default', 'optional', 'required', 'hidden'],
810
+ };
811
+ return html `
812
+ <div>
813
+ ${this.renderTemplateOrSlot('fields:before')}
814
+
815
+ <x-group frame>
816
+ <foxy-i18n slot="header" lang=${lang} key="field_plural" ns=${ns}></foxy-i18n>
817
+
818
+ <div class="bg-contrast-10 grid grid-cols-1 md-grid-cols-2" style="gap: 1px">
819
+ ${Object.entries(options).map(([property, values]) => {
820
+ return html `
821
+ <label class="flex items-center pl-m bg-base">
822
+ <foxy-i18n
823
+ class="flex-1"
824
+ lang=${lang}
825
+ key=${property.replace('billing_', '')}
826
+ ns=${ns}
827
+ >
828
+ </foxy-i18n>
829
+
830
+ <div
831
+ class=${classMap({
832
+ 'px-s m-xs flex items-center cursor-pointer rounded leading-none': true,
833
+ 'ring-primary-50 ring-inset focus-within-ring-2': !isDisabled,
834
+ 'hover-text-primary': !isDisabled,
835
+ 'opacity-50': isDisabled,
836
+ })}
837
+ >
838
+ <select
839
+ class="h-s mr-xs text-right appearance-none bg-transparent cursor-pointer focus-outline-none font-medium"
840
+ >
841
+ ${values.map(value => {
842
+ return html `
843
+ <option
844
+ value=${value}
845
+ ?selected=${config[property] === value}
846
+ >
847
+ ${this.t(value)}
848
+ </option>
849
+ `;
850
+ })}
851
+ </select>
852
+
853
+ <iron-icon
854
+ class="pointer-events-none icon-inline text-xl"
855
+ icon="icons:expand-more"
856
+ >
857
+ </iron-icon>
858
+ </div>
859
+ </label>
860
+ `;
861
+ })}
862
+
863
+ <div class="bg-base hidden md-block"></div>
864
+ </div>
865
+ </x-group>
866
+
867
+ ${this.renderTemplateOrSlot('fields:after')}
868
+ </div>
869
+ `;
870
+ }
478
871
  __renderGoogleAnalytics(json) {
479
872
  const { lang, ns } = this;
480
873
  const config = json.analytics_config;
@@ -669,6 +1062,30 @@ export class TemplateConfigForm extends Base {
669
1062
  </div>
670
1063
  `;
671
1064
  }
1065
+ __renderCustomFields(json) {
1066
+ return html `
1067
+ <div>
1068
+ ${this.renderTemplateOrSlot('custom-fields:before')}
1069
+
1070
+ <vaadin-text-area
1071
+ class="w-full"
1072
+ label=${this.t('custom_fields')}
1073
+ helper-text=${this.t('custom_fields_helper_text')}
1074
+ .value=${json.custom_script_values.header}
1075
+ ?disabled=${this.disabledSelector.matches('header', true)}
1076
+ ?readonly=${this.readonlySelector.matches('header', true)}
1077
+ @input=${(evt) => {
1078
+ const newValue = evt.currentTarget.value;
1079
+ json.custom_script_values.checkout_fields = newValue;
1080
+ this.edit({ json: JSON.stringify(json) });
1081
+ }}
1082
+ >
1083
+ </vaadin-text-area>
1084
+
1085
+ ${this.renderTemplateOrSlot('custom-fields:after')}
1086
+ </div>
1087
+ `;
1088
+ }
672
1089
  __renderFooter(json) {
673
1090
  return html `
674
1091
  <div>