import $ from "jquery"; import _ from "underscore"; import { Toast } from "@/composables/toast"; import _l from "@/utils/localization"; import Modal from "@/utils/modal"; import mod_library_model from "./library-model"; let progress = 0; let items_total = 0; let progressStep = 0; const chain_call_control = {}; const modal = new Modal(); /** * Delete the selected items. Atomic. One by one. */ export function deleteSelectedItems(checkedRows, onRemove, refreshTable, refreshTableContent) { var dataset_ids = []; var folder_ids = []; if (checkedRows.length === 0) { Toast.info("您必须至少选择一个项目才能删除。"); } else { var template = templateDeletingItemsProgressBar(); modal.show({ closing_events: true, title: _l("Deleting selected items"), body: template({}), buttons: { Close: () => { modal.hide(); }, }, }); // init the control counters chain_call_control.total_number = 0; chain_call_control.failed_number = 0; checkedRows.forEach((row) => { const row_id = row.id; if (row_id !== undefined) { if (row_id.substring(0, 1) == "F") { folder_ids.push(row_id); } else { dataset_ids.push(row_id); } } }); // init the progress bar items_total = dataset_ids.length + folder_ids.length; progressStep = 100 / items_total; progress = 0; // prepare the dataset items to be added var items_to_delete = []; for (let i = dataset_ids.length - 1; i >= 0; i--) { var dataset = new mod_library_model.Item({ id: dataset_ids[i], }); items_to_delete.push(dataset); } for (let i = folder_ids.length - 1; i >= 0; i--) { var folder = new mod_library_model.FolderAsModel({ id: folder_ids[i], }); items_to_delete.push(folder); } chain_call_control.total_number = items_total; // call the recursive function to call ajax one after each other (request FIFO queue) chainCallDeletingItems(items_to_delete, onRemove, refreshTable, refreshTableContent); } } function templateDeletingItemsProgressBar() { return _.template( `
完成 0%
`, ); } /** * Take the array of lddas, create request for each and * call them in chain. Update progress bar in between each. */ function chainCallDeletingItems(items_to_delete, onRemove, refreshTable, refreshTableContent) { const modal = new Modal(); const deleted_items = new mod_library_model.Folder(); var item_to_delete = items_to_delete.pop(); if (typeof item_to_delete === "undefined") { if (chain_call_control.failed_number === 0) { refreshTableContent(); Toast.success("所选项目已删除。"); } else if (chain_call_control.failed_number === chain_call_control.total_number) { Toast.error( "发生错误,没有任何项目被删除。请确保您拥有足够的权限。", ); } else if (chain_call_control.failed_number < chain_call_control.total_number) { Toast.warning("部分项目无法删除。请确保您拥有足够的权限。"); } modal.hide(); return deleted_items; } item_to_delete .destroy() .done((item) => { onRemove(item); // TODO remove stuff from table content // Galaxy.libraries.folderListView.collection.remove(item_to_delete.id); updateProgress(); // add the deleted item to collection, triggers rendering // TODO add to deleted chainCallDeletingItems(items_to_delete, onRemove, refreshTable, refreshTableContent); }) .fail(() => { chain_call_control.failed_number += 1; updateProgress(); chainCallDeletingItems(items_to_delete, onRemove, refreshTable, refreshTableContent); }); refreshTable(); } /** * Update progress bar in modal. */ export function updateProgress() { progress += progressStep; $(".progress-bar-import").width(`${Math.round(progress)}%`); var txt_representation = `完成 ${Math.round(progress)}%`; $(".completion_span").text(txt_representation); }