Create a new segment from import screen
[MAILPOET-1809]
This commit is contained in:
@@ -41,122 +41,6 @@ jQuery(document).ready(() => {
|
||||
nextStepButton.addClass(disabled);
|
||||
}
|
||||
|
||||
// hide previous statistics/import results
|
||||
jQuery('#subscribers_data_parse_results:visible').html('');
|
||||
jQuery('#subscribers_data_import_results:visible').hide();
|
||||
|
||||
|
||||
// show available segments
|
||||
if (window.mailpoetSegments.length) {
|
||||
jQuery('.mailpoet_segments').show();
|
||||
} else {
|
||||
jQuery('.mailpoet_no_segments').show();
|
||||
}
|
||||
|
||||
function enableSegmentSelection(segments) {
|
||||
if (segmentSelectElement.data('select2')) {
|
||||
segmentSelectElement
|
||||
.html('')
|
||||
.select2('destroy');
|
||||
toggleNextStepButton('off');
|
||||
}
|
||||
segmentSelectElement
|
||||
.select2({
|
||||
data: segments,
|
||||
width: '20em',
|
||||
templateResult(item) {
|
||||
const i = item;
|
||||
i.subscriberCount = parseInt(i.subscriberCount, 10);
|
||||
return `${i.name} (${i.subscriberCount.toLocaleString()})`;
|
||||
},
|
||||
templateSelection(item) {
|
||||
const i = item;
|
||||
i.subscriberCount = parseInt(i.subscriberCount, 10);
|
||||
return `${i.name} (${i.subscriberCount.toLocaleString()})`;
|
||||
},
|
||||
})
|
||||
.change((event) => {
|
||||
const segmentSelectionNotice = jQuery('[data-id="notice_segmentSelection"]');
|
||||
if (!event.currentTarget.value) {
|
||||
if (!segmentSelectionNotice.length) {
|
||||
MailPoet.Notice.error(MailPoet.I18n.t('segmentSelectionRequired'), {
|
||||
static: true,
|
||||
scroll: true,
|
||||
id: 'notice_segmentSelection',
|
||||
hideClose: true,
|
||||
});
|
||||
}
|
||||
toggleNextStepButton('off');
|
||||
} else {
|
||||
jQuery('[data-id="notice_segmentSelection"]').remove();
|
||||
if (!jQuery('.mailpoet_notice.error:visible').length) {
|
||||
toggleNextStepButton('on');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
jQuery('.mailpoet_create_segment').click(() => {
|
||||
MailPoet.Modal.popup({
|
||||
title: MailPoet.I18n.t('addNewList'),
|
||||
template: jQuery('#new_segment_template').html(),
|
||||
});
|
||||
jQuery('#new_segment_name').keypress((e) => {
|
||||
if (e.which === 13) {
|
||||
jQuery('#new_segment_process').click();
|
||||
}
|
||||
});
|
||||
jQuery('#new_segment_process').click(() => {
|
||||
const segmentName = jQuery('#new_segment_name').val().trim();
|
||||
const segmentDescription = jQuery('#new_segment_description').val().trim();
|
||||
|
||||
MailPoet.Ajax.post({
|
||||
api_version: window.mailpoet_api_version,
|
||||
endpoint: 'ImportExport',
|
||||
action: 'addSegment',
|
||||
data: {
|
||||
name: segmentName,
|
||||
description: segmentDescription,
|
||||
},
|
||||
}).done((response) => {
|
||||
let selectedValues;
|
||||
window.mailpoetSegments.push({
|
||||
id: response.data.id,
|
||||
name: response.data.name,
|
||||
subscriberCount: 0,
|
||||
});
|
||||
|
||||
selectedValues = segmentSelectElement.val();
|
||||
if (selectedValues === null) {
|
||||
selectedValues = [response.data.id];
|
||||
} else {
|
||||
selectedValues.push(response.data.id);
|
||||
}
|
||||
|
||||
enableSegmentSelection(window.mailpoetSegments);
|
||||
segmentSelectElement.val(selectedValues).trigger('change');
|
||||
jQuery('.mailpoet_segments:hidden').show();
|
||||
jQuery('.mailpoet_no_segments:visible').hide();
|
||||
MailPoet.Modal.close();
|
||||
}).fail((response) => {
|
||||
if (response.errors.length > 0) {
|
||||
MailPoet.Notice.hide();
|
||||
MailPoet.Notice.error(
|
||||
response.errors.map(error => error.message),
|
||||
{ positionAfter: '#new_segment_name' }
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
jQuery('#new_segment_cancel').click(() => {
|
||||
MailPoet.Modal.close();
|
||||
});
|
||||
});
|
||||
|
||||
// sanitize unsafe data
|
||||
Handlebars.registerHelper('sanitize_data', data => ((data instanceof Handlebars.SafeString)
|
||||
? data
|
||||
: new Handlebars.SafeString(Handlebars.Utils.escapeExpression(data))));
|
||||
|
||||
|
||||
nextStepButton.off().on('click', (event) => {
|
||||
|
@@ -0,0 +1,48 @@
|
||||
import jQuery from 'jquery';
|
||||
import MailPoet from 'mailpoet';
|
||||
|
||||
|
||||
export default (onCreateSegment) => {
|
||||
MailPoet.Modal.popup({
|
||||
title: MailPoet.I18n.t('addNewList'),
|
||||
template: jQuery('#new_segment_template').html(),
|
||||
});
|
||||
jQuery('#new_segment_name').keypress((e) => {
|
||||
if (e.which === 13) {
|
||||
jQuery('#new_segment_process').click();
|
||||
}
|
||||
});
|
||||
jQuery('#new_segment_process').click(() => {
|
||||
const segmentName = jQuery('#new_segment_name').val().trim();
|
||||
const segmentDescription = jQuery('#new_segment_description').val().trim();
|
||||
|
||||
MailPoet.Ajax.post({
|
||||
api_version: window.mailpoet_api_version,
|
||||
endpoint: 'ImportExport',
|
||||
action: 'addSegment',
|
||||
data: {
|
||||
name: segmentName,
|
||||
description: segmentDescription,
|
||||
},
|
||||
}).done((response) => {
|
||||
onCreateSegment({
|
||||
id: response.data.id,
|
||||
name: response.data.name,
|
||||
subscriberCount: 0,
|
||||
});
|
||||
|
||||
MailPoet.Modal.close();
|
||||
}).fail((response) => {
|
||||
if (response.errors.length > 0) {
|
||||
MailPoet.Notice.hide();
|
||||
MailPoet.Notice.error(
|
||||
response.errors.map(error => error.message),
|
||||
{ positionAfter: '#new_segment_name' }
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
jQuery('#new_segment_cancel').click(() => {
|
||||
MailPoet.Modal.close();
|
||||
});
|
||||
};
|
@@ -46,7 +46,13 @@ export function destroySelection() {
|
||||
const segmentSelectElement = jQuery('select#mailpoet_segments_select');
|
||||
if (segmentSelectElement.data('select2')) {
|
||||
segmentSelectElement
|
||||
.html('')
|
||||
.select2('destroy');
|
||||
segmentSelectElement
|
||||
.find('option')
|
||||
.remove();
|
||||
segmentSelectElement
|
||||
.off('select2:unselecting')
|
||||
.off('change')
|
||||
.off('select2:opening');
|
||||
}
|
||||
}
|
||||
|
@@ -1,19 +1,27 @@
|
||||
import React, { useLayoutEffect, useContext } from 'react';
|
||||
import React, { useLayoutEffect, useContext, useState } from 'react';
|
||||
import MailPoet from 'mailpoet';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import ImportContext from '../context.jsx';
|
||||
|
||||
import { createSelection } from './generate_segment_selection.jsx';
|
||||
import { createSelection, destroySelection } from './generate_segment_selection.jsx';
|
||||
import createNewSegment from './create_new_segment.jsx';
|
||||
|
||||
function SelectSegment({ setSelectedSegments }) {
|
||||
const { segments: originalSegments } = useContext(ImportContext);
|
||||
const [selectionSegments, setSelectionSegments] = useState(originalSegments);
|
||||
|
||||
useLayoutEffect(() => {
|
||||
createSelection(originalSegments, (segments) => {
|
||||
createSelection(selectionSegments, (segments) => {
|
||||
setSelectedSegments(segments);
|
||||
});
|
||||
});
|
||||
}, [selectionSegments]);
|
||||
|
||||
const onCreateNewSegment = (segment) => {
|
||||
destroySelection();
|
||||
setSelectedSegments([]);
|
||||
setSelectionSegments([...selectionSegments, segment]);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -30,7 +38,21 @@ function SelectSegment({ setSelectedSegments }) {
|
||||
<option />
|
||||
</select>
|
||||
</label>
|
||||
<a className="mailpoet_create_segment">{MailPoet.I18n.t('createANewList')}</a>
|
||||
<a
|
||||
className="mailpoet_create_segment"
|
||||
onClick={() => createNewSegment(onCreateNewSegment)}
|
||||
role="button"
|
||||
tabIndex={0}
|
||||
onKeyDown={(event) => {
|
||||
if ((['keydown', 'keypress'].includes(event.type) && ['Enter', ' '].includes(event.key))
|
||||
) {
|
||||
event.preventDefault();
|
||||
createNewSegment(onCreateNewSegment);
|
||||
}
|
||||
}}
|
||||
>
|
||||
{MailPoet.I18n.t('createANewList')}
|
||||
</a>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
Reference in New Issue
Block a user