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 = {
+
+
+
+
+
+
+
+
+ 
+
+
+
@@ -55,7 +76,8 @@ 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)}