').text(value));
table.find('tbody').append(tr);
});
box.append(table);
return box;
}
// Select all.
$('.adt-feed-migration-select-all').on('change', function (this: HTMLInputElement) {
$(this).closest('.adt-feed-migration-source').find('.adt-feed-migration-feed').prop('checked', this.checked);
});
// Step 1: review the selected feeds.
$('.adt-feed-migration-review-button').on('click', function (this: HTMLElement) {
const button = $(this);
const row = button.closest('.adt-feed-migration-source');
const feedIds = row
.find('.adt-feed-migration-feed:checked')
.map(function (this: HTMLInputElement) {
return this.value;
})
.get();
if (!feedIds.length) {
toastr.error(__('Select at least one feed.', 'woo-product-feed-pro'));
return;
}
request(row, 'review', feedIds, button, function (data: { feeds: ReviewFeed[] }) {
const review = row.find('.adt-feed-migration-review').empty();
review.append(
$('').text(
__(
'Check how each feed maps before you import it. Items in the warning lists are not imported as they are.',
'woo-product-feed-pro'
)
)
);
data.feeds.forEach((feed) => review.append(renderFeedReview(feed)));
const actions = $('');
const importButton = $(
''
).text(
sprintf(
/* translators: %d: number of feeds. */
_n('Import %d feed', 'Import %d feeds', data.feeds.length, 'woo-product-feed-pro'),
data.feeds.length
)
);
const backButton = $('').text(
__('Back', 'woo-product-feed-pro')
);
actions.append(importButton, backButton, $(''));
review.append(actions);
row.find('.adt-feed-migration-select').prop('hidden', true);
review.prop('hidden', false).attr('tabindex', '-1').trigger('focus');
backButton.on('click', function () {
review.prop('hidden', true).empty();
row.find('.adt-feed-migration-select').prop('hidden', false);
row.find('.adt-feed-migration-review-button').trigger('focus');
});
/**
* Show the import result in place of the review.
*/
function showResult(result: { feeds: ImportedFeed[]; failed: string[] }) {
const box = row.find('.adt-feed-migration-result').empty();
if (result.failed.length) {
const failed = $('
');
result.failed.forEach((title) => failed.append($('').text(title)));
box.append(
$('').text(
__('These feeds could not be imported. Try again.', 'woo-product-feed-pro')
),
failed
);
}
box.append(
$('').text(
sprintf(
/* translators: %d: number of imported feeds. */
_n(
'%d feed was imported as a draft. Open it, check the settings, and activate it.',
'%d feeds were imported as drafts. Open each one, check the settings, and activate it.',
result.feeds.length,
'woo-product-feed-pro'
),
result.feeds.length
)
)
);
const list = $('
');
result.feeds.forEach((feed) => {
list.append($('').append($('').attr('href', feed.edit_url).text(feed.title)));
});
box.append(list);
review.prop('hidden', true).empty();
box.prop('hidden', false).attr('tabindex', '-1').trigger('focus');
if (result.feeds.length) {
toastr.success(__('Feeds imported.', 'woo-product-feed-pro'));
}
}
// Step 2: import. One request per feed, so that a server timeout stops at most one feed.
importButton.on('click', function () {
const result = { feeds: [] as ImportedFeed[], failed: [] as string[] };
const importNext = (index: number) => {
if (index >= data.feeds.length) {
showResult(result);
return;
}
request(
row,
'import',
[data.feeds[index].id],
importButton,
function (feedResult: { feeds: ImportedFeed[]; failed: string[] }) {
result.feeds.push(...feedResult.feeds);
result.failed.push(...feedResult.failed);
importNext(index + 1);
},
function () {
// The request failed, so this feed and the ones after it were not imported.
data.feeds.slice(index).forEach((feed) => result.failed.push(feed.title));
showResult(result);
}
);
};
importNext(0);
});
});
});
});
})(window as any, jQuery);