Finished support for triggered campaigns. So far only smoke-tested for subscription trigger.

This commit is contained in:
Tomas Bures 2018-11-21 01:41:10 +03:00
parent 4f5b2d10e4
commit b37ad9863c
56 changed files with 416 additions and 213 deletions

View file

@ -190,6 +190,8 @@ class SendControls extends Component {
date.minute(time.minute());
date.second(0);
date.millisecond(0);
date.utcOffset(0, true); // TODO, process offset from user settings
await this.postAndMaskStateError(`rest/campaign-start-at/${this.props.entity.id}/${date.valueOf()}`);
@ -245,6 +247,7 @@ class SendControls extends Component {
<div>
<DatePicker id="date" label={t('date')} />
<InputField id="time" label={t('time')} help={t('enter24hourTimeInFormatHhmmEg1348')}/>
{/* TODO: Timezone selector */}
</div>
}
</Form>

View file

@ -65,7 +65,7 @@ export default class List extends Component {
});
}
if (perms.includes('manageTriggers')) {
if (this.props.campaign.permissions.includes('manageTriggers')) {
tableDeleteDialogAddDeleteButton(actions, this, null, data[0], data[1]);
}

View file

@ -95,14 +95,13 @@ export function getRuleHelpers(t, fields) {
}
};
// TODO: This generates strings that cannot be statically detected. It will require dynamic discovery of translatable strings.
function getRelativeDateTreeLabel(rule, textFragment) {
if (rule.value === 0) {
return t('dateInColumnColName' + textFragment + ' the current date', {colName: ruleHelpers.getColumnName(rule.column)})
return t(/*ignore*/'Date in column ' + textFragment + ' the current date', {colName: ruleHelpers.getColumnName(rule.column)})
} else if (rule.value > 0) {
return t('dateInColumnColName' + textFragment + ' {{value}}-th day after the current date', {colName: ruleHelpers.getColumnName(rule.column), value: rule.value});
return t(/*ignore*/'Date in column ' + textFragment + ' {{value}}-th day after the current date', {colName: ruleHelpers.getColumnName(rule.column), value: rule.value});
} else {
return t('dateInColumnColName' + textFragment + ' {{value}}-th day before the current date', {colName: ruleHelpers.getColumnName(rule.column), value: rule.value});
return t(/*ignore*/'Date in column ' + textFragment + ' {{value}}-th day before the current date', {colName: ruleHelpers.getColumnName(rule.column), value: rule.value});
}
}
@ -129,22 +128,47 @@ export function getRuleHelpers(t, fields) {
},
eqTodayPlusDays: {
dropdownLabel: t('onXthDayBeforeafterCurrentDate'),
/*
tMark('Date in column is the current date')
tMark('Date in column is {{value}}-th day after the current date')
tMark('Date in column is {{value}}-th day before the current date')
*/
treeLabel: rule => getRelativeDateTreeLabel(rule, 'is'),
},
ltTodayPlusDays: {
dropdownLabel: t('beforeXthDayBeforeafterCurrentDate'),
/*
tMark('Date in column is before the current date')
tMark('Date in column is before {{value}}-th day after the current date')
tMark('Date in column is before {{value}}-th day before the current date')
*/
treeLabel: rule => getRelativeDateTreeLabel(rule, 'is before'),
},
leTodayPlusDays: {
dropdownLabel: t('beforeOrOnXthDayBeforeafterCurrentDate'),
/*
tMark('Date in column is before or on the current date')
tMark('Date in column is before or on {{value}}-th day after the current date')
tMark('Date in column is before or on {{value}}-th day before the current date')
*/
treeLabel: rule => getRelativeDateTreeLabel(rule, 'is before or on'),
},
gtTodayPlusDays: {
dropdownLabel: t('afterXthDayBeforeafterCurrentDate'),
/*
tMark('Date in column is after the current date')
tMark('Date in column is after {{value}}-th day after the current date')
tMark('Date in column is after {{value}}-th day after the current date')
*/
treeLabel: rule => getRelativeDateTreeLabel(rule, 'is after'),
},
geTodayPlusDays: {
dropdownLabel: t('afterOrOnXthDayBeforeafterCurrentDate'),
/*
tMark('Date in column is after or on the current date')
tMark('Date in column is after or on {{value}}-th day after the current date')
tMark('Date in column is after or on {{value}}-th day after the current date')
*/
treeLabel: rule => getRelativeDateTreeLabel(rule, 'is after or on'),
}
};

View file

@ -87,10 +87,10 @@ export default class CUD extends Component {
' <table class="table table-bordered table-hover data-table display nowrap" width="100%" data-row-sort="1,1" data-paging="false">\n' +
' <thead>\n' +
' <th>\n' +
' {{#translate}}Email{{/translate}}\n' +
' Email\n' +
' </th>\n' +
' <th>\n' +
' {{#translate}}Tracker Count{{/translate}}\n' +
' Tracker Count\n' +
' </th>\n' +
' </thead>\n' +
' {{#if results}}\n' +
@ -146,16 +146,16 @@ export default class CUD extends Component {
' <table class="table table-bordered table-hover data-table display nowrap" width="100%" data-row-sort="1,1,1,1" data-paging="false">\n' +
' <thead>\n' +
' <th>\n' +
' {{#translate}}Country{{/translate}}\n' +
' Country\n' +
' </th>\n' +
' <th>\n' +
' {{#translate}}Opened{{/translate}}\n' +
' Opened\n' +
' </th>\n' +
' <th>\n' +
' {{#translate}}All{{/translate}}\n' +
' All\n' +
' </th>\n' +
' <th>\n' +
' {{#translate}}Percentage{{/translate}}\n' +
' Percentage\n' +
' </th>\n' +
' </thead>\n' +
' {{#if results}}\n' +