67 lines
2.2 KiB
TypeScript
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);
|
|
}
|