PluginProbe
MailerLite – WooCommerce integration / 3.1.20
MailerLite – WooCommerce integration v3.1.20
3.1.25 3.1.26 3.1.24 3.1.23 3.1.22 3.1.21 3.1.20 3.1.19 3.1.18 3.1.17 3.1.16 3.1.15 1.8.7 1.8.8 2.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 All 147 releases
woo-mailerlite / admin / assets / js / components / Forms / SyncFields.js

SyncFields.js in MailerLite – WooCommerce integration 3.1.20, at admin/assets/js/components/Forms/SyncFields.js

111 lines 3.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 const template = `
2 <select v-model="setSyncFields" data-testid="sync-fields-select"/>
3 `;
4
5 const SyncFields = {
6 props: {
7 options: {
8 type: Array,
9 required: true,
10 },
11 placeholder: {
12 type: String,
13 default: '',
14 },
15 modelValue: {
16 type: [String, Number, Array],
17 default: null,
18 },
19 },
20 template,
21 mounted() {
22 this.defaultValues = this.options
23 .filter((opt) => opt.default)
24 .map((opt) => opt.value);
25 this.selectedSyncFields = [...new Set([...this.selectedSyncFields, ...this.defaultValues])];
26 if (this.modelValue) {
27 this.selectedSyncFields = [...new Set([...this.selectedSyncFields, ...this.modelValue])];
28 }
29 this.initSelect2();
30 },
31 computed: {
32 setSyncFields: {
33 set(value) {
34 this.$emit('update:modelValue', value);
35 },
36 },
37 },
38 data() {
39 return {
40 selectedSyncFields: [],
41 defaultValues: [],
42 }
43 },
44 methods: {
45
46 initSelect2() {
47
48 // Initialize select2 with the provided options and value
49 const vm = this;
50
51 jQuery(this.$el)
52 .select2({
53 theme: 'mailerlite',
54 closeOnSelect : false,
55 allowHtml: true,
56 allowClear: true,
57 tags: false,
58 data: this.options
59 .filter(opt => opt && opt.value && opt.text)
60 .map(opt => ({
61 id: opt.value,
62 text: opt.text,
63 default: opt.default || false
64 })),
65 placeholder: this.placeholder,
66 templateSelection : function (tag, container) {
67 let is_default = jQuery(tag.element).attr('ml-default');
68 if (typeof is_default !== 'undefined' && is_default !== false){
69 jQuery(container).addClass('ml-default-choice');
70 tag['ml-default'] = true;
71 }
72 return tag.text;
73 },
74 }).on('select2:selecting', function (e) {
75 if (e.params.args.data.element.value) {
76 if (!vm.selectedSyncFields.includes(e.params.args.data.element.value)) {
77 vm.selectedSyncFields.push(e.params.args.data.element.value)
78 vm.setSyncFields = vm.selectedSyncFields
79 }
80 }
81 }).on('select2:unselecting', function(e){
82 const unselectedOption = e.params.args.data;
83 const isDefault = vm.options.some(
84 (opt) => opt.value === unselectedOption.id && opt.default
85 );
86 if (isDefault) {
87 e.preventDefault();
88 }
89 vm.selectedSyncFields = vm.selectedSyncFields.filter(item => item !== e.params.args.data.element.value)
90 vm.setSyncFields = vm.selectedSyncFields
91 });
92 jQuery(this.$el).val(this.selectedSyncFields);
93 jQuery(this.$el).trigger('change');
94 },
95 },
96 watch: {
97 value(newValue) {
98 jQuery(this.$el).val(newValue).trigger('change');
99 },
100 options(newOptions) {
101 jQuery(this.$el).select2('destroy');
102 this.initSelect2();
103 },
104 },
105 destroyed() {
106 jQuery(this.$el).select2('destroy');
107 },
108 };
109
110 export default SyncFields;
111