diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 2e9b6c07c..7faf127aa 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -1,4 +1,5 @@ { + "unreferencedAV": "未引用的数据库", "includeSubDocs": "包含子文档", "includeSubDocsTip": "启用后将在导出时包含当前文档的所有子文档", "includeRelatedDocs": "包含关联文档", diff --git a/app/src/config/image.ts b/app/src/config/image.ts index b37a736c0..d0e23dae5 100644 --- a/app/src/config/image.ts +++ b/app/src/config/image.ts @@ -6,6 +6,7 @@ import {hasClosestByClassName} from "../protyle/util/hasClosest"; import {fetchPost} from "../util/fetch"; /// #if !MOBILE import {getAllModels} from "../layout/getAll"; +import * as path from "path"; /// #endif import {openBy} from "../editor/util"; import {renderAssetsPreview} from "../asset/renderAssets"; @@ -22,6 +23,11 @@ export const image = { ${window.siyuan.languages.unreferencedAssets} +
+ + ${window.siyuan.languages.unreferencedAV} + +
${window.siyuan.languages.missingAssets} @@ -44,6 +50,21 @@ export const image = {
+
+
+
+
+ +
+
+ +
+
`; }, bindEvent: () => { - const assetsListElement = image.element.querySelector(".config-assets__list"); + const assetsListElement = image.element.querySelector('.config-assets[data-type="remove"] .config-assets__list'); + const avListElement = image.element.querySelector('.config-assets[data-type="removeAV"] .config-assets__list'); image.element.addEventListener("click", (event) => { let target = event.target as HTMLElement; while (target && !target.isEqualNode(image.element)) { @@ -71,7 +93,14 @@ export const image = { }); /// #endif assetsListElement.innerHTML = `
  • ${window.siyuan.languages.emptyContent}
  • `; - image.element.querySelector(".config-assets__preview").innerHTML = ""; + assetsListElement.nextElementSibling.innerHTML = ""; + }); + }, undefined, true); + } else if (target.id === "removeAVAll") { + confirmDialog(window.siyuan.languages.deleteOpConfirm, `${window.siyuan.languages.clearAll}`, () => { + fetchPost("/api/asset/removeUnusedAttributeViews", {}, () => { + avListElement.innerHTML = `
  • ${window.siyuan.languages.emptyContent}
  • `; + avListElement.nextElementSibling.innerHTML = ""; }); }, undefined, true); } else if (target.classList.contains("item") && !target.classList.contains("item--focus")) { @@ -81,9 +110,15 @@ export const image = { if (type === item.getAttribute("data-type")) { item.classList.remove("fn__none"); if (!item.getAttribute("data-init")) { - fetchPost("/api/asset/getMissingAssets", {}, response => { - image._renderList(response.data.missingAssets, item.querySelector(".config-assets__list"), false); - }); + if (type === "removeAV") { + fetchPost("/api/av/getUnusedAttributeViews", {}, response => { + image._renderList(response.data.unusedAttributeViews, avListElement, "unRefAV"); + }); + } else { + fetchPost("/api/asset/getMissingAssets", {}, response => { + image._renderList(response.data.missingAssets, item.querySelector(".config-assets__list"), "lostAssets"); + }); + } item.setAttribute("data-init", "true"); } } else { @@ -94,7 +129,11 @@ export const image = { event.stopPropagation(); break; } else if (type === "copy") { - writeText(target.parentElement.querySelector(".b3-list-item__text").textContent.trim().replace("assets/", "")); + if (target.parentElement.getAttribute("data-tab-type") === "unRefAV") { + writeText(`
    `); + } else { + writeText(target.parentElement.querySelector(".b3-list-item__text").textContent.trim().replace("assets/", "")); + } } else if (type === "open") { /// #if !BROWSER openBy(target.parentElement.getAttribute("data-path"), "folder"); @@ -102,24 +141,38 @@ export const image = { } else if (type === "clear") { const pathString = target.parentElement.getAttribute("data-path"); confirmDialog(window.siyuan.languages.deleteOpConfirm, `${window.siyuan.languages.delete} ${pathPosix().basename(pathString)}`, () => { - fetchPost("/api/asset/removeUnusedAsset", { - path: pathString, - }, response => { - /// #if !MOBILE - getAllModels().asset.forEach(item => { - if (response.data.path === item.path) { - item.parent.parent.removeTab(item.parent.id); - } - }); - /// #endif + if (target.parentElement.getAttribute("data-tab-type") === "unRefAV") { const liElement = target.parentElement; - if (liElement.parentElement.querySelectorAll("li").length === 1) { - liElement.parentElement.innerHTML = `
  • ${window.siyuan.languages.emptyContent}
  • `; - } else { - liElement.remove(); - } - image.element.querySelector(".config-assets__preview").innerHTML = ""; - }); + fetchPost("/api/asset/removeUnusedAttributeView", { + id: liElement.querySelector(".b3-list-item__text").textContent, + }, () => { + if (liElement.parentElement.querySelectorAll("li").length === 1) { + liElement.parentElement.innerHTML = `
  • ${window.siyuan.languages.emptyContent}
  • `; + } else { + liElement.remove(); + } + avListElement.nextElementSibling.innerHTML = ""; + }); + } else { + fetchPost("/api/asset/removeUnusedAsset", { + path: pathString, + }, response => { + /// #if !MOBILE + getAllModels().asset.forEach(item => { + if (response.data.path === item.path) { + item.parent.parent.removeTab(item.parent.id); + } + }); + /// #endif + const liElement = target.parentElement; + if (liElement.parentElement.querySelectorAll("li").length === 1) { + liElement.parentElement.innerHTML = `
  • ${window.siyuan.languages.emptyContent}
  • `; + } else { + liElement.remove(); + } + assetsListElement.nextElementSibling.innerHTML = ""; + }); + } }, undefined, true); event.preventDefault(); event.stopPropagation(); @@ -138,19 +191,19 @@ export const image = { } }); fetchPost("/api/asset/getUnusedAssets", {}, response => { - image._renderList(response.data.unusedAssets, assetsListElement); + image._renderList(response.data.unusedAssets, assetsListElement, "unrefAssets"); }); }, - _renderList: (data: string[], element: Element, action = true) => { + _renderList: (data: string[], element: Element, type: "unRefAV" | "unrefAssets" | "lostAssets") => { let html = ""; let boxOpenHTML = ""; - if (!isBrowser() && action) { + if (!isBrowser() && type !== "lostAssets") { boxOpenHTML = ` `; } let boxClearHTML = ""; - if (action) { + if (type !== "lostAssets") { boxClearHTML = ` `; @@ -158,8 +211,8 @@ export const image = { const isM = isMobile(); data.forEach((item) => { const idx = item.indexOf("assets/"); - const dataPath = item.substr(idx); - html += `
  • + const dataPath = type === "unRefAV" ? path.join(window.siyuan.config.system.dataDir, "storage", "av", item) + ".json" : item.substr(idx); + html += `
  • ${escapeHtml(item)}