feat: filter market export by selected creators
This commit is contained in:
@@ -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(): {
|
||||
|
||||
Reference in New Issue
Block a user