Files
MajoorWaldi-ComfyUI-Majoor-…/ui/vue/grid/useGridDisplayAssets.ts
T

67 lines
2.2 KiB
TypeScript

import { getFilenameKey } from "../../features/grid/AssetCardRenderer.js";
export function getDisplayGroupKey(asset: Record<string, any> | null | undefined): string {
const filenameKey = getFilenameKey(asset?.filename);
if (!filenameKey) return "";
const source = String(asset?.source || asset?.type || "").trim().toLowerCase();
const rootId = String(asset?.root_id || asset?.custom_root_id || "").trim().toLowerCase();
const subfolder = String(asset?.subfolder || "").trim().toLowerCase();
return `${source}|${rootId}|${subfolder}|${filenameKey}`;
}
export function isRenderableAsset(asset: any): boolean {
return !!asset;
}
export function buildDisplayAssets(assets: any[]): Record<string, any>[] {
const list = Array.isArray(assets) ? assets : [];
const buckets = new Map();
const output: any[] = [];
for (const asset of list) {
if (!asset) continue;
const filenameKey = getDisplayGroupKey(asset);
if (!filenameKey) {
asset._mjrNameCollision = false;
delete asset._mjrNameCollisionCount;
delete asset._mjrNameCollisionPaths;
asset._mjrDupStack = false;
asset._mjrDupMembers = null;
asset._mjrDupCount = 0;
output.push(asset);
continue;
}
let bucket = buckets.get(filenameKey);
if (!bucket) {
bucket = [];
buckets.set(filenameKey, bucket);
output.push(asset);
}
bucket.push(asset);
}
for (const bucket of buckets.values()) {
for (const member of bucket) {
member._mjrNameCollision = false;
delete member._mjrNameCollisionCount;
delete member._mjrNameCollisionPaths;
member._mjrDupStack = false;
member._mjrDupMembers = null;
member._mjrDupCount = 0;
}
if (bucket.length >= 2) {
const rep = bucket[0];
rep._mjrDupStack = true;
rep._mjrDupMembers = bucket.slice();
rep._mjrDupCount = bucket.length;
}
}
return output;
}
export function getRenderableAssets(assets: unknown[]): Record<string, any>[] {
return buildDisplayAssets(assets).filter(isRenderableAsset);
}