fix(parcel-sync): fix ArcGIS 1000 server cap pagination + scan improvements
- eterra-client: detect server maxRecordCount cap in fetchAllLayerByWhere When server returns exactly 1000 (or other round cap) but we asked for 2000, recognize this as a server limit, adjust pageSize, and CONTINUE paginating. Previously: 1000 < 2000 -> break (lost all data beyond page 1). - no-geom-sync: count layers first, pass total to fetchAllLayer Belt-and-suspenders: even if cap detection misses, known total prevents early termination. Also use pageSize 1000 to match typical server cap. Clădiri count uses countLayer instead of fetching all OBJECTIDs. - UI: add include-no-geom checkbox in background sync section Users can toggle it independently of scan status. Shows '(scanare in curs)' hint when scan is still running.
This commit is contained in:
@@ -223,36 +223,53 @@ export async function scanNoGeometryParcels(
|
||||
|
||||
// 2. Fetch remote GIS cadastral refs (lightweight — no geometry)
|
||||
// This is the source of truth for "has geometry" regardless of local DB state.
|
||||
// ~4 pages for 8k features with outFields only = very fast.
|
||||
// Count first so pagination knows the total and doesn't stop early.
|
||||
const terenuriLayer = {
|
||||
id: "TERENURI_ACTIVE",
|
||||
name: "TERENURI_ACTIVE",
|
||||
endpoint: "aut" as const,
|
||||
whereTemplate: "{{adminField}}={{siruta}} AND IS_ACTIVE=1",
|
||||
};
|
||||
const [terenuriCount, cladiriCount] = await Promise.all([
|
||||
client.countLayer(terenuriLayer, siruta).catch(() => 0),
|
||||
client
|
||||
.countLayer(
|
||||
{
|
||||
id: "CLADIRI_ACTIVE",
|
||||
name: "CLADIRI_ACTIVE",
|
||||
endpoint: "aut" as const,
|
||||
whereTemplate: "{{adminField}}={{siruta}} AND IS_ACTIVE=1",
|
||||
},
|
||||
siruta,
|
||||
)
|
||||
.catch(() => 0),
|
||||
]);
|
||||
const remoteFeatures = await client.fetchAllLayer(terenuriLayer, siruta, {
|
||||
returnGeometry: false,
|
||||
outFields: "OBJECTID,NATIONAL_CADASTRAL_REFERENCE,IMMOVABLE_ID",
|
||||
pageSize: 2000,
|
||||
pageSize: 1000,
|
||||
total: terenuriCount > 0 ? terenuriCount : undefined,
|
||||
});
|
||||
|
||||
// 2b. Also fetch CLADIRI_ACTIVE count (lightweight, just OBJECTID)
|
||||
// 2b. Also fetch CLADIRI_ACTIVE features (lightweight, just OBJECTID)
|
||||
const cladiriLayer = {
|
||||
id: "CLADIRI_ACTIVE",
|
||||
name: "CLADIRI_ACTIVE",
|
||||
endpoint: "aut" as const,
|
||||
whereTemplate: "{{adminField}}={{siruta}} AND IS_ACTIVE=1",
|
||||
};
|
||||
let remoteCladiriCount = 0;
|
||||
try {
|
||||
const cladiriFeatures = await client.fetchAllLayer(cladiriLayer, siruta, {
|
||||
returnGeometry: false,
|
||||
outFields: "OBJECTID",
|
||||
pageSize: 2000,
|
||||
});
|
||||
remoteCladiriCount = cladiriFeatures.length;
|
||||
} catch {
|
||||
// Non-fatal — just won't show clădiri count
|
||||
let remoteCladiriCount = cladiriCount;
|
||||
if (remoteCladiriCount === 0) {
|
||||
try {
|
||||
const cladiriFeatures = await client.fetchAllLayer(cladiriLayer, siruta, {
|
||||
returnGeometry: false,
|
||||
outFields: "OBJECTID",
|
||||
pageSize: 1000,
|
||||
});
|
||||
remoteCladiriCount = cladiriFeatures.length;
|
||||
} catch {
|
||||
// Non-fatal — just won't show clădiri count
|
||||
}
|
||||
}
|
||||
|
||||
const remoteCadRefs = new Set<string>();
|
||||
|
||||
Reference in New Issue
Block a user