feat: filter market export by selected creators

This commit is contained in:
2026-04-23 18:58:59 +08:00
parent 96e93628bd
commit 7da1bcf255
3 changed files with 232 additions and 8 deletions
+46 -8
View File
@@ -142,7 +142,9 @@ export function createMarketController(options: CreateMarketControllerOptions) {
setToolbarBusyState(toolbar, true);
try {
const records = await exportRecords(exportTarget.target);
const records = filterRecordsBySelection(
await exportRecords(exportTarget.target)
);
options.onCsvReady?.(buildCsv(records));
setToolbarExportStatus(toolbar, "");
} catch (error) {
@@ -173,7 +175,9 @@ export function createMarketController(options: CreateMarketControllerOptions) {
setToolbarBusyState(toolbar, true);
try {
const records = await exportRecords(exportTarget.target, "提交中");
const records = filterRecordsBySelection(
await exportRecords(exportTarget.target, "提交中")
);
const authState = await getAuthState();
if (!authState.isAuthenticated) {
throw new Error("请先登录插件");
@@ -492,6 +496,17 @@ export function createMarketController(options: CreateMarketControllerOptions) {
return exportRangeController.exportRecords(target);
}
function filterRecordsBySelection(records: MarketRecord[]): MarketRecord[] {
if (selectedAuthorIds.size === 0) {
return records;
}
const selectedRecords = records.filter((record) =>
selectedAuthorIds.has(record.authorId)
);
return selectedRecords.length > 0 ? selectedRecords : records;
}
async function prepareCurrentPageForExport(): Promise<void> {
await runSyncCycle();
await harvestCurrentPageForExport();
@@ -499,7 +514,13 @@ export function createMarketController(options: CreateMarketControllerOptions) {
}
async function harvestCurrentPageForExport(): Promise<void> {
await collectCurrentPageSnapshotsUntilSettled();
let hydrationSnapshot = await collectCurrentPageSnapshotsUntilSettled();
if (
hydrationSnapshot.missingDefaultFieldCount === 0 &&
hydrationSnapshot.blankExportFieldCount === 0
) {
return;
}
const table = syncMarketTable(options.document);
const scrollContainer = findCurrentPageScrollContainer(table);
@@ -523,7 +544,13 @@ export function createMarketController(options: CreateMarketControllerOptions) {
nextScrollTop = Math.min(nextScrollTop + step, maxScrollTop)
) {
setScrollTop(scrollContainer, nextScrollTop);
await collectCurrentPageSnapshotsUntilSettled();
hydrationSnapshot = await collectCurrentPageSnapshotsUntilSettled();
if (
hydrationSnapshot.missingDefaultFieldCount === 0 &&
hydrationSnapshot.blankExportFieldCount === 0
) {
break;
}
if (nextScrollTop === maxScrollTop) {
break;
@@ -532,7 +559,6 @@ export function createMarketController(options: CreateMarketControllerOptions) {
if (scrollContainer.scrollTop !== originalScrollTop) {
setScrollTop(scrollContainer, originalScrollTop);
await collectCurrentPageSnapshotsUntilSettled();
}
}
@@ -648,10 +674,19 @@ export function createMarketController(options: CreateMarketControllerOptions) {
await Promise.resolve();
}
async function collectCurrentPageSnapshotsUntilSettled(): Promise<void> {
async function collectCurrentPageSnapshotsUntilSettled(): Promise<{
blankExportFieldCount: number;
fingerprint: string;
missingDefaultFieldCount: number;
}> {
let previousFingerprint = "";
let stablePassCount = 0;
let fingerprintStableSince = 0;
let lastSnapshot = {
blankExportFieldCount: 0,
fingerprint: "",
missingDefaultFieldCount: 0
};
for (let attempt = 0; attempt < 16; attempt += 1) {
await waitForDomSettled();
@@ -667,6 +702,7 @@ export function createMarketController(options: CreateMarketControllerOptions) {
collectCurrentPageSnapshots();
const hydrationSnapshot = readVisibleRowHydrationSnapshot();
lastSnapshot = hydrationSnapshot;
if (!hydrationSnapshot.fingerprint) {
stablePassCount = 0;
previousFingerprint = "";
@@ -687,7 +723,7 @@ export function createMarketController(options: CreateMarketControllerOptions) {
hydrationSnapshot.blankExportFieldCount === 0 &&
stablePassCount >= 2
) {
return;
return hydrationSnapshot;
}
if (
@@ -696,9 +732,11 @@ export function createMarketController(options: CreateMarketControllerOptions) {
stablePassCount >= 2 &&
stableForMs >= 500
) {
return;
return hydrationSnapshot;
}
}
return lastSnapshot;
}
function readVisibleRowHydrationSnapshot(): {