diff --git a/package.json b/package.json index 9b659aa..ffd2048 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "web-scraper-chrome-extension", - "version": "0.4.6", + "version": "0.4.7", "description": "Web data extraction tool implemented as chrome extension", "scripts": { "lint": "eslint --ext .js src", diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 0579347..e1421cc 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -324,7 +324,7 @@ "message": "Are you sure you want to delete sitemap ?" }, "modal_confirm_action_message_delete_selector": { - "message": "The selector that is being deleted has child selectors ( obj), which will be deleted" + "message": "The following selectors will be removed ( obj):" }, "modal_confirm_action_submit_delete_selector": { "message": "Confirm" }, "modal_confirm_action_cancel_delete_selector": { "message": "Cancel" }, diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index 2a1b0b2..8d5ea8d 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -360,7 +360,7 @@ "message": "Вы действительно хотите удалить карту обхода ?" }, "modal_confirm_action_message_delete_selector": { - "message": "У удаляемого селектора имеются дочерние ( шт.), которые будут удалены" + "message": "Будут удалены следующие селекторы ( шт.):" }, "modal_confirm_action_submit_delete_selector": { "message": "Подтвердить" }, "modal_confirm_action_cancel_delete_selector": { "message": "Отмена" }, diff --git a/src/scripts/Controller.js b/src/scripts/Controller.js index 06a0b9a..670efa4 100644 --- a/src/scripts/Controller.js +++ b/src/scripts/Controller.js @@ -1499,11 +1499,23 @@ export default class SitemapController { async deleteSelector(button) { const selector = $(button).closest('tr').data('selector'); const sitemap = this.state.currentSitemap; - const childCount = sitemap.getDirectChildSelectors(selector.uuid).length; + const clearSelectorList = sitemap.createRemainingSelectorsList(selector); + const filteredChildren = sitemap.selectors + .filter(selector => !clearSelectorList.includes(selector)) + .map(selector => { + return { uuid: selector.uuid, id: selector.id }; + }); + const childCount = filteredChildren.length; this.initConfirmActionPanel({ action: 'delete_selector' }); $('#modal-selector-id').text(selector.id); if (childCount) { $('#modal-child-count').text(childCount); + $('#modal-message').after(''); + filteredChildren.forEach(child => { + const $child = $('
  • '); + $child.text(`#${child.uuid} ${child.id}`); + $('#list-deleted-children').append($child); + }); $('#modal-message').show(); } this.state.currentSelector = selector; diff --git a/src/scripts/Sitemap.js b/src/scripts/Sitemap.js index 9ef516f..db58385 100644 --- a/src/scripts/Sitemap.js +++ b/src/scripts/Sitemap.js @@ -174,24 +174,41 @@ export default class Sitemap { } } - deleteSelector(selectorToDelete) { - this.selectors.forEach( - function (selector) { - if (selector.hasParentSelector(selectorToDelete.uuid)) { - selector.removeParentSelector(selectorToDelete.uuid); - if (selector.parentSelectors.length === 0) { - this.deleteSelector(selector); - } - } - }.bind(this) - ); + cleanRedundantParents(selectorsList) { + const currentUuidList = selectorsList.map(selector => selector.uuid); + currentUuidList.push(this.rootSelector.uuid); + selectorsList.forEach(selector => { + selector.parentSelectors = selector.parentSelectors.filter(uuid => + currentUuidList.includes(uuid) + ); + }); + return selectorsList; + } - for (const i in this.selectors) { - if (this.selectors[i].uuid === selectorToDelete.uuid) { - this.selectors.splice(i, 1); - break; - } + createRemainingSelectorsList(selectorToDelete) { + const newList = []; + const selectorsQueue = [this.rootSelector]; + while (selectorsQueue.length > 0) { + const currentSelector = selectorsQueue.shift(); + const selectorChildren = this.selectors.filter(selector => + selector.parentSelectors.includes(currentSelector.uuid) + ); + + selectorChildren.forEach(child => { + if (child.uuid !== selectorToDelete.uuid && !newList.includes(child)) { + selectorsQueue.push(child); + newList.push(child); + } + }); } + return newList; + } + + deleteSelector(selectorToDelete) { + const newListSelectors = this.cleanRedundantParents( + this.createRemainingSelectorsList(selectorToDelete) + ); + this.selectors = new SelectorList(newListSelectors); } getDataTableId() {