diff --git a/client/src/campaigns/CUD.js b/client/src/campaigns/CUD.js
index c37a195f..a51139e5 100644
--- a/client/src/campaigns/CUD.js
+++ b/client/src/campaigns/CUD.js
@@ -25,7 +25,7 @@ import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling';
import {NamespaceSelect, validateNamespace} from '../lib/namespace';
import {DeleteModalDialog} from "../lib/modals";
import mailtrainConfig from 'mailtrainConfig';
-import {getTemplateTypes, getTypeForm, ResourceType} from '../templates/helpers';
+import {getTagLanguages, getTemplateTypes, getTypeForm, ResourceType} from '../templates/helpers';
import axios from '../lib/axios';
import styles from "../lib/styles.scss";
import campaignsStyles from "./styles.scss";
@@ -50,6 +50,8 @@ export default class CUD extends Component {
const t = props.t;
this.templateTypes = getTemplateTypes(props.t, 'data_sourceCustom_', ResourceType.CAMPAIGN);
+ this.tagLanguages = getTagLanguages(props.t);
+
this.mailerTypes = getMailerTypes(props.t);
const { campaignTypeLabels } = getCampaignLabels(t);
@@ -85,6 +87,11 @@ export default class CUD extends Component {
this.customTemplateTypeOptions.push({key, label: this.templateTypes[key].typeName});
}
+ this.customTemplateTagLanguageOptions = [];
+ for (const key of mailtrainConfig.tagLanguages) {
+ this.customTemplateTagLanguageOptions.push({key, label: this.tagLanguages[key].name});
+ }
+
this.state = {
sendConfiguration: null
};
@@ -120,6 +127,14 @@ export default class CUD extends Component {
}
}
+ if (key === undefined || key === 'data_sourceCustom_tag_language') {
+ if (newValue) {
+ const isEdit = !!this.props.entity;
+ const type = mutStateData.getIn(['data_sourceCustom_tag_language', 'value']);
+ this.templateTypes[type].afterTagLanguageChange(mutStateData, isEdit);
+ }
+ }
+
if (key === undefined || (match = key.match(/^(lists_[0-9]+_)list$/))) {
const prefix = match[1];
mutStateData.setIn([prefix + 'segment', 'value'], null);
@@ -202,6 +217,7 @@ export default class CUD extends Component {
data.data.sourceCustom = {
type: data.data_sourceCustom_type,
+ tag_language: data.data_sourceCustom_tag_language,
data: data.data_sourceCustom_data,
html: data.data_sourceCustom_html,
text: data.data_sourceCustom_text
@@ -257,7 +273,7 @@ export default class CUD extends Component {
if (this.props.entity.status === CampaignStatus.SENDING) {
this.disableForm();
}
-
+
} else {
const data = {};
for (const overridable of campaignOverridables) {
@@ -301,6 +317,7 @@ export default class CUD extends Component {
// This is for CampaignSource.CUSTOM
data_sourceCustom_type: mailtrainConfig.editors[0],
+ data_sourceCustom_tag_language: mailtrainConfig.tagLanguages[0],
data_sourceCustom_data: {},
data_sourceCustom_html: '',
data_sourceCustom_text: '',
@@ -362,6 +379,10 @@ export default class CUD extends Component {
state.setIn(['data_sourceCustom_type', 'error'], t('typeMustBeSelected'));
}
+ if (!state.getIn(['data_sourceCustom_tag_language', 'value'])) {
+ state.setIn(['data_sourceCustom_tag_language', 'error'], t('Tag language must be selected'));
+ }
+
if (customTemplateTypeKey) {
this.templateTypes[customTemplateTypeKey].validate(state);
}
@@ -654,8 +675,8 @@ export default class CUD extends Component {
{ data: 1, title: t('name') },
{ data: 2, title: t('description') },
{ data: 3, title: t('type'), render: data => this.templateTypes[data].typeName },
- { data: 4, title: t('created'), render: data => moment(data).fromNow() },
- { data: 5, title: t('namespace') },
+ { data: 5, title: t('created'), render: data => moment(data).fromNow() },
+ { data: 6, title: t('namespace') },
];
let help = null;
@@ -690,6 +711,8 @@ export default class CUD extends Component {
templateEdit =
+
+
{customTemplateTypeForm}
;
diff --git a/client/src/campaigns/Content.js b/client/src/campaigns/Content.js
index 0a2da44c..d7f91576 100644
--- a/client/src/campaigns/Content.js
+++ b/client/src/campaigns/Content.js
@@ -7,6 +7,7 @@ import {requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'
import {
Button,
ButtonRow,
+ Dropdown,
filterData,
Form,
FormSendMethod,
@@ -16,7 +17,7 @@ import {
} from '../lib/form';
import {withErrorHandling} from '../lib/error-handling';
import mailtrainConfig from 'mailtrainConfig';
-import {getEditForm, getTemplateTypes, getTypeForm, ResourceType} from '../templates/helpers';
+import {getEditForm, getTagLanguages, getTemplateTypes, getTypeForm, ResourceType} from '../templates/helpers';
import axios from '../lib/axios';
import styles from "../lib/styles.scss";
import {getUrl} from "../lib/urls";
@@ -39,12 +40,18 @@ export default class CustomContent extends Component {
const t = props.t;
this.templateTypes = getTemplateTypes(props.t, 'data_sourceCustom_', ResourceType.CAMPAIGN);
+ this.tagLanguages = getTagLanguages(props.t);
this.customTemplateTypeOptions = [];
for (const key of mailtrainConfig.editors) {
this.customTemplateTypeOptions.push({key, label: this.templateTypes[key].typeName});
}
+ this.customTemplateTagLanguageOptions = [];
+ for (const key of mailtrainConfig.tagLanguages) {
+ this.customTemplateTagLanguageOptions.push({key, label: this.tagLanguages[key].name});
+ }
+
this.state = {
showMergeTagReference: false,
elementInFullscreen: false,
@@ -56,6 +63,9 @@ export default class CustomContent extends Component {
this.initForm({
getPreSubmitUpdater: ::this.getPreSubmitFormValuesUpdater,
+ onChangeBeforeValidation: {
+ data_sourceCustom_tag_language: ::this.onTagLanguageChanged
+ }
});
this.sendModalGetDataHandler = ::this.sendModalGetData;
@@ -71,9 +81,16 @@ export default class CustomContent extends Component {
setPanelInFullScreen: PropTypes.func
}
+ onTagLanguageChanged(mutStateData, key, oldTagLanguage, tagLanguage) {
+ if (tagLanguage) {
+ const type = mutStateData.getIn(['data_sourceCustom_tag_language', 'value']);
+ this.tagLanguages[type].afterTagLanguageChange(mutStateData, true);
+ }
+ }
getFormValuesMutator(data) {
data.data_sourceCustom_type = data.data.sourceCustom.type;
+ data.data_sourceCustom_tag_language = data.data.sourceCustom.tag_language;
data.data_sourceCustom_data = data.data.sourceCustom.data;
data.data_sourceCustom_html = data.data.sourceCustom.html;
data.data_sourceCustom_text = data.data.sourceCustom.text;
@@ -86,6 +103,7 @@ export default class CustomContent extends Component {
data.data.sourceCustom = {
type: data.data_sourceCustom_type,
+ tag_language: data.data_sourceCustom_tag_language,
data: data.data_sourceCustom_data,
html: data.data_sourceCustom_html,
text: data.data_sourceCustom_text
@@ -112,6 +130,12 @@ export default class CustomContent extends Component {
localValidateFormValues(state) {
const t = this.props.t;
+ if (!state.getIn(['data_sourceCustom_tag_language', 'value'])) {
+ state.setIn(['data_sourceCustom_tag_language', 'error'], t('Tag language must be selected'));
+ } else {
+ state.setIn(['data_sourceCustom_tag_language', 'error'], null);
+ }
+
const customTemplateTypeKey = state.getIn(['data_sourceCustom_type', 'value']);
if (customTemplateTypeKey) {
@@ -229,8 +253,6 @@ export default class CustomContent extends Component {
const customTemplateTypeKey = this.getFormValue('data_sourceCustom_type');
- // FIXME - data_sourceCustom_type is initialized only after first render
-
return (
+
+
{customTemplateTypeKey && getTypeForm(this, customTemplateTypeKey, true)}
{customTemplateTypeKey && getEditForm(this, customTemplateTypeKey, 'data_sourceCustom_')}
diff --git a/client/src/lib/form.js b/client/src/lib/form.js
index 73c9baf0..c510c1db 100644
--- a/client/src/lib/form.js
+++ b/client/src/lib/form.js
@@ -712,7 +712,8 @@ class Dropdown extends Component {
help: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
options: PropTypes.array,
className: PropTypes.string,
- format: PropTypes.string
+ format: PropTypes.string,
+ disabled: PropTypes.bool
}
render() {
@@ -740,7 +741,7 @@ class Dropdown extends Component {
const className = owner.addFormValidationClass('form-control ' + (props.className || '') , id);
return wrapInput(id, htmlId, owner, props.format, '', props.label, props.help,
-