diff --git a/assets/js/src/form/fields/date.jsx b/assets/js/src/form/fields/date.jsx index 890071ae92..a8699742f8 100644 --- a/assets/js/src/form/fields/date.jsx +++ b/assets/js/src/form/fields/date.jsx @@ -1,8 +1,7 @@ import React from 'react'; import moment from 'moment'; import PropTypes from 'prop-types'; -import classnames from 'classnames'; -import Select from "../../common/form/select/select"; +import Select from '../../common/form/select/select'; function FormFieldDateYear(props) { const yearsRange = 100; diff --git a/assets/js/src/form/fields/selection.jsx b/assets/js/src/form/fields/selection.jsx index daddce700c..d8d7fb3ead 100644 --- a/assets/js/src/form/fields/selection.jsx +++ b/assets/js/src/form/fields/selection.jsx @@ -2,7 +2,7 @@ import React from 'react'; import jQuery from 'jquery'; import _ from 'underscore'; import 'react-dom'; -import 'select2'; +import 'select2/dist/js/select2.full'; import PropTypes from 'prop-types'; class Selection extends React.Component { @@ -99,10 +99,35 @@ class Selection extends React.Component { return item.id; }; + getCount = (item) => { + if (this.props.field.getCount !== undefined) { + return this.props.field.getCount(item, this.props.item); + } + return null; + }; + + getTag = (item) => { + if (this.props.field.getTag !== undefined) { + return this.props.field.getTag(item, this.props.item); + } + return null; + }; + setupSelect2 = () => { if (this.isSelect2Initialized()) { return; } + const templateRendered = (option) => { + let tpl = ''; + if (option.tag) { + tpl += `${option.tag}`; + } + tpl += `${option.text}`; + if (option.count) { + tpl += `${option.count}`; + } + return tpl; + }; let select2Options = { disabled: this.props.disabled || false, @@ -111,15 +136,10 @@ class Selection extends React.Component { id: '', // the value of the option text: this.props.field.placeholder, }, - templateResult: function templateResult(item) { - if (item.element && item.element.selected) { - return null; - } - if (item.title) { - return item.title; - } - return item.text; - }, + dropdownCssClass: 'mailpoet-form-select2-dropdown', + escapeMarkup: (markup) => markup, + templateResult: templateRendered, + templateSelection: templateRendered, }; const remoteQuery = this.props.field.remoteQuery || null; @@ -158,6 +178,20 @@ class Selection extends React.Component { }, minimumInputLength: remoteQuery.minimumInputLength || 2, }); + } else { + const items = this.getItems(this.props.field); + const selectedValues = this.getSelectedValues() || []; + const data = items.map((item) => { + const id = this.getValue(item); + return { + id, + tag: this.getTag(item), + text: this.getLabel(item), + count: this.getCount(item), + selected: selectedValues.indexOf(id) > -1, + }; + }); + select2Options = Object.assign(select2Options, { data }); } if (this.props.field.extendSelect2Options !== undefined) { @@ -252,38 +286,21 @@ class Selection extends React.Component { }; render() { - const items = this.getItems(this.props.field); const selectedValues = this.getSelectedValues(); - const options = items.map((item) => { - const label = this.getLabel(item); - const searchLabel = this.getSearchLabel(item); - const value = this.getValue(item); - - return ( - - ); - }); - return ( - +