Basic import seems to work
This commit is contained in:
parent
16519c5353
commit
d74806dde3
21 changed files with 555 additions and 749 deletions
|
@ -175,7 +175,7 @@ export default class CUD extends Component {
|
|||
} else {
|
||||
const mappingType = Number.parseInt(state.getIn(['mapping_type', 'value']));
|
||||
|
||||
if (mappingType === MappingType.BASIC_SUBSCRIBE) {
|
||||
if (mappingType === MappingType.BASIC_SUBSCRIBE || mappingType === MappingType.BASIC_UNSUBSCRIBE) {
|
||||
if (!state.getIn(['mapping_fields_email_column', 'value'])) {
|
||||
state.setIn(['mapping_fields_email_column', 'error'], t('Email mapping has to be provided'));
|
||||
}
|
||||
|
@ -225,24 +225,33 @@ export default class CUD extends Component {
|
|||
|
||||
for (const field of this.props.fieldsGrouped) {
|
||||
if (field.column) {
|
||||
mapping.fields[field.column] = {
|
||||
column: data['mapping_fields_' + field.column + '_column']
|
||||
};
|
||||
const colMapping = data['mapping_fields_' + field.column + '_column'];
|
||||
if (colMapping) {
|
||||
mapping.fields[field.column] = {
|
||||
column: colMapping
|
||||
};
|
||||
}
|
||||
} else {
|
||||
for (const option of field.settings.options) {
|
||||
const col = field.groupedOptions[option.key].column;
|
||||
mapping.fields[col] = {
|
||||
column: data['mapping_fields_' + col + '_column']
|
||||
};
|
||||
const colMapping = data['mapping_fields_' + col + '_column'];
|
||||
if (colMapping) {
|
||||
mapping.fields[col] = {
|
||||
column: colMapping
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (data.mapping_type === MappingType.BASIC_SUBSCRIBE || data.mapping_type === MappingType.BASIC_UNSUBSCRIBE) {
|
||||
mapping.fields.email = {
|
||||
column: data.mapping_fields_email_column
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
data.mapping = mapping;
|
||||
}
|
||||
|
||||
|
@ -317,7 +326,7 @@ export default class CUD extends Component {
|
|||
let mappingSettings = null;
|
||||
const mappingType = Number.parseInt(this.getFormValue('mapping_type'));
|
||||
|
||||
if (mappingType === MappingType.BASIC_SUBSCRIBE) {
|
||||
if (mappingType === MappingType.BASIC_SUBSCRIBE || mappingType === MappingType.BASIC_UNSUBSCRIBE) {
|
||||
const sampleRow = this.getFormValue('sampleRow');
|
||||
const sourceOpts = [];
|
||||
sourceOpts.push({key: '', label: t('–– Select ––')});
|
||||
|
@ -332,28 +341,33 @@ export default class CUD extends Component {
|
|||
}
|
||||
}
|
||||
|
||||
const settingsRows = [];
|
||||
const mappingRows = [
|
||||
<Dropdown key="email" id="mapping_fields_email_column" label={t('Email')} options={sourceOpts}/>
|
||||
];
|
||||
|
||||
for (const field of this.props.fieldsGrouped) {
|
||||
if (field.column) {
|
||||
mappingRows.push(
|
||||
<Dropdown key={field.column} id={'mapping_fields_' + field.column + '_column'} label={field.name} options={sourceOpts}/>
|
||||
);
|
||||
} else {
|
||||
for (const option of field.settings.options) {
|
||||
const col = field.groupedOptions[option.key].column;
|
||||
if (mappingType === MappingType.BASIC_SUBSCRIBE) {
|
||||
settingsRows.push(<CheckBox key="checkEmails" id="mapping_settings_checkEmails" text={t('Check imported emails')}/>)
|
||||
|
||||
for (const field of this.props.fieldsGrouped) {
|
||||
if (field.column) {
|
||||
mappingRows.push(
|
||||
<Dropdown key={col} id={'mapping_fields_' + col + '_column'} label={field.groupedOptions[option.key].name} options={sourceOpts}/>
|
||||
<Dropdown key={field.column} id={'mapping_fields_' + field.column + '_column'} label={field.name} options={sourceOpts}/>
|
||||
);
|
||||
} else {
|
||||
for (const option of field.settings.options) {
|
||||
const col = field.groupedOptions[option.key].column;
|
||||
mappingRows.push(
|
||||
<Dropdown key={col} id={'mapping_fields_' + col + '_column'} label={field.groupedOptions[option.key].name} options={sourceOpts}/>
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mappingSettings = (
|
||||
<div>
|
||||
<CheckBox id="mapping_settings_checkEmails" text={t('Check imported emails')}/>
|
||||
{settingsRows}
|
||||
<Fieldset label={t('Mapping')} className={styles.mapping}>
|
||||
{mappingRows}
|
||||
</Fieldset>
|
||||
|
|
|
@ -18,6 +18,7 @@ import axios from "../../lib/axios";
|
|||
import {getUrl} from "../../lib/urls";
|
||||
import moment from "moment";
|
||||
import {runStatusInProgress} from "../../../../shared/imports";
|
||||
import {Table} from "../../lib/table";
|
||||
|
||||
@translate()
|
||||
@withPageHelpers
|
||||
|
@ -52,6 +53,10 @@ export default class Status extends Component {
|
|||
this.setState({
|
||||
entity: resp.data
|
||||
});
|
||||
|
||||
if (this.failedTableNode) {
|
||||
this.failedTableNode.refresh();
|
||||
}
|
||||
}
|
||||
|
||||
async periodicRefreshTask() {
|
||||
|
@ -77,7 +82,13 @@ export default class Status extends Component {
|
|||
const entity = this.state.entity;
|
||||
const imprt = this.props.imprt;
|
||||
|
||||
return (
|
||||
const columns = [
|
||||
{ data: 1, title: t('Row') },
|
||||
{ data: 2, title: t('Email') },
|
||||
{ data: 3, title: t('Reason') }
|
||||
];
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Title>{t('Import Run Status')}</Title>
|
||||
|
||||
|
@ -90,6 +101,11 @@ export default class Status extends Component {
|
|||
<AlignedRow label={t('New entries')}>{entity.new}</AlignedRow>
|
||||
<AlignedRow label={t('Failed entries')}>{entity.failed}</AlignedRow>
|
||||
{entity.error && <AlignedRow label={t('Error')}><pre>{entity.error}</pre></AlignedRow>}
|
||||
|
||||
<hr/>
|
||||
<h3>{t('Failed Rows')}</h3>
|
||||
<Table ref={node => this.failedTableNode = node} withHeader dataUrl={`rest/import-run-failed-table/${this.props.list.id}/${this.props.imprt.id}/${this.props.entity.id}`} columns={columns} />
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -97,7 +97,10 @@ export default class Status extends Component {
|
|||
}
|
||||
|
||||
await this.refreshEntity();
|
||||
this.runsTableNode.refresh();
|
||||
|
||||
if (this.runsTableNode) {
|
||||
this.runsTableNode.refresh();
|
||||
}
|
||||
}
|
||||
|
||||
async stopRunAsync() {
|
||||
|
@ -112,7 +115,10 @@ export default class Status extends Component {
|
|||
}
|
||||
|
||||
await this.refreshEntity();
|
||||
this.runsTableNode.refresh();
|
||||
|
||||
if (this.runsTableNode) {
|
||||
this.runsTableNode.refresh();
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
|
|
|
@ -27,7 +27,8 @@ export function getImportTypes(t) {
|
|||
[RunStatus.SCHEDULED]: t('Starting'),
|
||||
[RunStatus.RUNNING]: t('Running'),
|
||||
[RunStatus.STOPPING]: t('Stopping'),
|
||||
[RunStatus.FINISHED]: t('Finished')
|
||||
[RunStatus.FINISHED]: t('Finished'),
|
||||
[RunStatus.FAILED]: t('Failed')
|
||||
};
|
||||
|
||||
const mappingTypeLabels = {
|
||||
|
|
|
@ -86,6 +86,7 @@ export default class List extends Component {
|
|||
const segments = this.props.segments;
|
||||
|
||||
const columns = [
|
||||
{ data: 1, title: t('CID') },
|
||||
{ data: 2, title: t('Email') },
|
||||
{ data: 3, title: t('Status'), render: (data, display, rowData) => this.subscriptionStatusLabels[data] + (rowData[5] ? ', ' + t('Blacklisted') : '') },
|
||||
{ data: 4, title: t('Created'), render: data => data ? moment(data).fromNow() : '' }
|
||||
|
|
|
@ -4,7 +4,7 @@ import React from "react";
|
|||
import {SubscriptionStatus} from "../../../../shared/lists";
|
||||
import {ACEEditor, CheckBoxGroup, DatePicker, Dropdown, InputField, RadioGroup, TextArea} from "../../lib/form";
|
||||
import {formatBirthday, formatDate, parseBirthday, parseDate} from "../../../../shared/date";
|
||||
import {getFieldKey} from '../../../../shared/lists';
|
||||
import {getFieldColumn} from '../../../../shared/lists';
|
||||
import 'brace/mode/json';
|
||||
|
||||
export function getSubscriptionStatusLabels(t) {
|
||||
|
@ -24,13 +24,13 @@ export function getFieldTypes(t) {
|
|||
const groupedFieldTypes = {};
|
||||
|
||||
const stringFieldType = long => ({
|
||||
form: groupedField => long ? <TextArea key={getFieldKey(groupedField)} id={getFieldKey(groupedField)} label={groupedField.name}/> : <InputField key={getFieldKey(groupedField)} id={getFieldKey(groupedField)} label={groupedField.name}/>,
|
||||
form: groupedField => long ? <TextArea key={getFieldColumn(groupedField)} id={getFieldColumn(groupedField)} label={groupedField.name}/> : <InputField key={getFieldColumn(groupedField)} id={getFieldColumn(groupedField)} label={groupedField.name}/>,
|
||||
assignFormData: (groupedField, data) => {
|
||||
const value = data[getFieldKey(groupedField)];
|
||||
data[getFieldKey(groupedField)] = value || '';
|
||||
const value = data[getFieldColumn(groupedField)];
|
||||
data[getFieldColumn(groupedField)] = value || '';
|
||||
},
|
||||
initFormData: (groupedField, data) => {
|
||||
data[getFieldKey(groupedField)] = '';
|
||||
data[getFieldColumn(groupedField)] = '';
|
||||
},
|
||||
assignEntity: (groupedField, data) => {},
|
||||
validate: (groupedField, state) => {},
|
||||
|
@ -38,86 +38,86 @@ export function getFieldTypes(t) {
|
|||
});
|
||||
|
||||
const numberFieldType = {
|
||||
form: groupedField => <InputField key={getFieldKey(groupedField)} id={getFieldKey(groupedField)} label={groupedField.name}/>,
|
||||
form: groupedField => <InputField key={getFieldColumn(groupedField)} id={getFieldColumn(groupedField)} label={groupedField.name}/>,
|
||||
assignFormData: (groupedField, data) => {
|
||||
const value = data[getFieldKey(groupedField)];
|
||||
data[getFieldKey(groupedField)] = value ? value.toString() : '';
|
||||
const value = data[getFieldColumn(groupedField)];
|
||||
data[getFieldColumn(groupedField)] = value ? value.toString() : '';
|
||||
},
|
||||
initFormData: (groupedField, data) => {
|
||||
data[getFieldKey(groupedField)] = '';
|
||||
data[getFieldColumn(groupedField)] = '';
|
||||
},
|
||||
assignEntity: (groupedField, data) => {
|
||||
data[getFieldKey(groupedField)] = parseInt(data[getFieldKey(groupedField)]);
|
||||
data[getFieldColumn(groupedField)] = parseInt(data[getFieldColumn(groupedField)]);
|
||||
},
|
||||
validate: (groupedField, state) => {
|
||||
const value = state.getIn([getFieldKey(groupedField), 'value']).trim();
|
||||
const value = state.getIn([getFieldColumn(groupedField), 'value']).trim();
|
||||
if (value !== '' && isNaN(value)) {
|
||||
state.setIn([getFieldKey(groupedField), 'error'], t('Value must be a number'));
|
||||
state.setIn([getFieldColumn(groupedField), 'error'], t('Value must be a number'));
|
||||
} else {
|
||||
state.setIn([getFieldKey(groupedField), 'error'], null);
|
||||
state.setIn([getFieldColumn(groupedField), 'error'], null);
|
||||
}
|
||||
},
|
||||
indexable: true
|
||||
};
|
||||
|
||||
const dateFieldType = {
|
||||
form: groupedField => <DatePicker key={getFieldKey(groupedField)} id={getFieldKey(groupedField)} label={groupedField.name} dateFormat={groupedField.settings.dateFormat} />,
|
||||
form: groupedField => <DatePicker key={getFieldColumn(groupedField)} id={getFieldColumn(groupedField)} label={groupedField.name} dateFormat={groupedField.settings.dateFormat} />,
|
||||
assignFormData: (groupedField, data) => {
|
||||
const value = data[getFieldKey(groupedField)];
|
||||
data[getFieldKey(groupedField)] = value ? formatDate(groupedField.settings.dateFormat, value) : '';
|
||||
const value = data[getFieldColumn(groupedField)];
|
||||
data[getFieldColumn(groupedField)] = value ? formatDate(groupedField.settings.dateFormat, value) : '';
|
||||
},
|
||||
initFormData: (groupedField, data) => {
|
||||
data[getFieldKey(groupedField)] = '';
|
||||
data[getFieldColumn(groupedField)] = '';
|
||||
},
|
||||
assignEntity: (groupedField, data) => {
|
||||
const date = parseDate(groupedField.settings.dateFormat, data[getFieldKey(groupedField)]);
|
||||
data[getFieldKey(groupedField)] = date;
|
||||
const date = parseDate(groupedField.settings.dateFormat, data[getFieldColumn(groupedField)]);
|
||||
data[getFieldColumn(groupedField)] = date;
|
||||
},
|
||||
validate: (groupedField, state) => {
|
||||
const value = state.getIn([getFieldKey(groupedField), 'value']);
|
||||
const value = state.getIn([getFieldColumn(groupedField), 'value']);
|
||||
const date = parseDate(groupedField.settings.dateFormat, value);
|
||||
if (value !== '' && !date) {
|
||||
state.setIn([getFieldKey(groupedField), 'error'], t('Date is invalid'));
|
||||
state.setIn([getFieldColumn(groupedField), 'error'], t('Date is invalid'));
|
||||
} else {
|
||||
state.setIn([getFieldKey(groupedField), 'error'], null);
|
||||
state.setIn([getFieldColumn(groupedField), 'error'], null);
|
||||
}
|
||||
},
|
||||
indexable: true
|
||||
};
|
||||
|
||||
const birthdayFieldType = {
|
||||
form: groupedField => <DatePicker key={getFieldKey(groupedField)} id={getFieldKey(groupedField)} label={groupedField.name} dateFormat={groupedField.settings.dateFormat} birthday />,
|
||||
form: groupedField => <DatePicker key={getFieldColumn(groupedField)} id={getFieldColumn(groupedField)} label={groupedField.name} dateFormat={groupedField.settings.dateFormat} birthday />,
|
||||
assignFormData: (groupedField, data) => {
|
||||
const value = data[getFieldKey(groupedField)];
|
||||
data[getFieldKey(groupedField)] = value ? formatBirthday(groupedField.settings.dateFormat, value) : '';
|
||||
const value = data[getFieldColumn(groupedField)];
|
||||
data[getFieldColumn(groupedField)] = value ? formatBirthday(groupedField.settings.dateFormat, value) : '';
|
||||
},
|
||||
initFormData: (groupedField, data) => {
|
||||
data[getFieldKey(groupedField)] = '';
|
||||
data[getFieldColumn(groupedField)] = '';
|
||||
},
|
||||
assignEntity: (groupedField, data) => {
|
||||
const date = parseBirthday(groupedField.settings.dateFormat, data[getFieldKey(groupedField)]);
|
||||
data[getFieldKey(groupedField)] = date;
|
||||
const date = parseBirthday(groupedField.settings.dateFormat, data[getFieldColumn(groupedField)]);
|
||||
data[getFieldColumn(groupedField)] = date;
|
||||
},
|
||||
validate: (groupedField, state) => {
|
||||
const value = state.getIn([getFieldKey(groupedField), 'value']);
|
||||
const value = state.getIn([getFieldColumn(groupedField), 'value']);
|
||||
const date = parseBirthday(groupedField.settings.dateFormat, value);
|
||||
if (value !== '' && !date) {
|
||||
state.setIn([getFieldKey(groupedField), 'error'], t('Date is invalid'));
|
||||
state.setIn([getFieldColumn(groupedField), 'error'], t('Date is invalid'));
|
||||
} else {
|
||||
state.setIn([getFieldKey(groupedField), 'error'], null);
|
||||
state.setIn([getFieldColumn(groupedField), 'error'], null);
|
||||
}
|
||||
},
|
||||
indexable: true
|
||||
};
|
||||
|
||||
const jsonFieldType = {
|
||||
form: groupedField => <ACEEditor key={getFieldKey(groupedField)} id={getFieldKey(groupedField)} label={groupedField.name} mode="json" height="300px"/>,
|
||||
form: groupedField => <ACEEditor key={getFieldColumn(groupedField)} id={getFieldColumn(groupedField)} label={groupedField.name} mode="json" height="300px"/>,
|
||||
assignFormData: (groupedField, data) => {
|
||||
const value = data[getFieldKey(groupedField)];
|
||||
data[getFieldKey(groupedField)] = value || '';
|
||||
const value = data[getFieldColumn(groupedField)];
|
||||
data[getFieldColumn(groupedField)] = value || '';
|
||||
},
|
||||
initFormData: (groupedField, data) => {
|
||||
data[getFieldKey(groupedField)] = '';
|
||||
data[getFieldColumn(groupedField)] = '';
|
||||
},
|
||||
assignEntity: (groupedField, data) => {},
|
||||
validate: (groupedField, state) => {},
|
||||
|
@ -125,25 +125,25 @@ export function getFieldTypes(t) {
|
|||
};
|
||||
|
||||
const enumSingleFieldType = componentType => ({
|
||||
form: groupedField => React.createElement(componentType, { key: getFieldKey(groupedField), id: getFieldKey(groupedField), label: groupedField.name, options: groupedField.settings.options }, null),
|
||||
form: groupedField => React.createElement(componentType, { key: getFieldColumn(groupedField), id: getFieldColumn(groupedField), label: groupedField.name, options: groupedField.settings.options }, null),
|
||||
assignFormData: (groupedField, data) => {
|
||||
if (data[getFieldKey(groupedField)] === null) {
|
||||
if (data[getFieldColumn(groupedField)] === null) {
|
||||
if (groupedField.default_value) {
|
||||
data[getFieldKey(groupedField)] = groupedField.default_value;
|
||||
data[getFieldColumn(groupedField)] = groupedField.default_value;
|
||||
} else if (groupedField.settings.options.length > 0) {
|
||||
data[getFieldKey(groupedField)] = groupedField.settings.options[0].key;
|
||||
data[getFieldColumn(groupedField)] = groupedField.settings.options[0].key;
|
||||
} else {
|
||||
data[getFieldKey(groupedField)] = '';
|
||||
data[getFieldColumn(groupedField)] = '';
|
||||
}
|
||||
}
|
||||
},
|
||||
initFormData: (groupedField, data) => {
|
||||
if (groupedField.default_value) {
|
||||
data[getFieldKey(groupedField)] = groupedField.default_value;
|
||||
data[getFieldColumn(groupedField)] = groupedField.default_value;
|
||||
} else if (groupedField.settings.options.length > 0) {
|
||||
data[getFieldKey(groupedField)] = groupedField.settings.options[0].key;
|
||||
data[getFieldColumn(groupedField)] = groupedField.settings.options[0].key;
|
||||
} else {
|
||||
data[getFieldKey(groupedField)] = '';
|
||||
data[getFieldColumn(groupedField)] = '';
|
||||
}
|
||||
},
|
||||
assignEntity: (groupedField, data) => {
|
||||
|
@ -153,14 +153,14 @@ export function getFieldTypes(t) {
|
|||
});
|
||||
|
||||
const enumMultipleFieldType = componentType => ({
|
||||
form: groupedField => React.createElement(componentType, { key: getFieldKey(groupedField), id: getFieldKey(groupedField), label: groupedField.name, options: groupedField.settings.options }, null),
|
||||
form: groupedField => React.createElement(componentType, { key: getFieldColumn(groupedField), id: getFieldColumn(groupedField), label: groupedField.name, options: groupedField.settings.options }, null),
|
||||
assignFormData: (groupedField, data) => {
|
||||
if (data[getFieldKey(groupedField)] === null) {
|
||||
data[getFieldKey(groupedField)] = [];
|
||||
if (data[getFieldColumn(groupedField)] === null) {
|
||||
data[getFieldColumn(groupedField)] = [];
|
||||
}
|
||||
},
|
||||
initFormData: (groupedField, data) => {
|
||||
data[getFieldKey(groupedField)] = [];
|
||||
data[getFieldColumn(groupedField)] = [];
|
||||
},
|
||||
assignEntity: (groupedField, data) => {},
|
||||
validate: (groupedField, state) => {},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue