fix: 修正全系統側邊欄捲軸重置問題

在所有報表與管理頁面的 router.get 調用中加入 preserveScroll: true。
受影響模組包括:
- 財務管理 (會計報表、公用事業費)
- 庫存管理 (庫存查詢、倉庫管理、進貨、調整、調撥)
- 生產管理 (工單管理、配方管理)
- 採購管理 (採購單)
- 銷售與發貨管理 (銷售單、發貨單、匯入管理)
- 系統管理 (使用者、角色、操作紀錄)
This commit is contained in:
2026-02-25 14:04:22 +08:00
parent 5668e17e61
commit 299cf37054
17 changed files with 32 additions and 30 deletions

View File

@@ -92,7 +92,7 @@ export default function AccountingReport({ records, summary, filters }: PageProp
date_end: dateEnd,
per_page: perPage,
},
{ preserveState: true }
{ preserveState: true, preserveScroll: true }
);
};
@@ -105,7 +105,7 @@ export default function AccountingReport({ records, summary, filters }: PageProp
date_end: dateEnd,
per_page: value,
},
{ preserveState: true }
{ preserveState: true, preserveScroll: true }
);
};

View File

@@ -81,7 +81,7 @@ export default function ActivityLogIndex({ activities, filters, subject_types, u
causer_id: causer === 'all' ? undefined : causer,
page: 1 // Reset to first page on filter
},
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
};
@@ -97,7 +97,7 @@ export default function ActivityLogIndex({ activities, filters, subject_types, u
router.get(
route('activity-logs.index'),
{ per_page: perPage, sort_by: filters.sort_by, sort_order: filters.sort_order },
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
};
@@ -131,7 +131,7 @@ export default function ActivityLogIndex({ activities, filters, subject_types, u
router.get(
route('activity-logs.index'),
{ ...filters, sort_by: newSortBy, sort_order: newSortOrder },
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
};

View File

@@ -96,7 +96,7 @@ export default function RoleIndex({ roles, filters = {} }: Props) {
router.get(
route('roles.index'),
{ ...filters, sort_by: newSortBy, sort_order: newSortOrder },
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
};

View File

@@ -164,7 +164,7 @@ export default function UserIndex({ users, roles, filters }: Props) {
router.get(
route('users.index'),
{ ...filters, sort_by: newSortBy, sort_order: newSortOrder },
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
};

View File

@@ -109,7 +109,7 @@ export default function SalesOrderIndex({ orders, filters }: Props) {
router.get(
route("integration.sales-orders.index"),
{ ...filters, search, page: 1 },
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
};
@@ -118,7 +118,7 @@ export default function SalesOrderIndex({ orders, filters }: Props) {
router.get(
route("integration.sales-orders.index"),
{ ...filters, per_page: value, page: 1 },
{ preserveState: false, replace: true }
{ preserveState: false, replace: true, preserveScroll: true }
);
};
@@ -159,7 +159,7 @@ export default function SalesOrderIndex({ orders, filters }: Props) {
router.get(
route("integration.sales-orders.index"),
{ ...filters, source: v || undefined, page: 1 },
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
)
}
options={sourceOptions}

View File

@@ -102,6 +102,7 @@ export default function Index({ docs, warehouses, filters }: { docs: DocsPaginat
router.get(route('inventory.adjust.index'), params as any, {
preserveState: true,
replace: true,
preserveScroll: true,
});
}, 300),
[]

View File

@@ -69,7 +69,7 @@ export default function GoodsReceiptIndex({ receipts, filters, warehouses }: Pro
date_start: dateStart || undefined,
date_end: dateEnd || undefined,
per_page: perPage,
}, { preserveState: true, replace: true });
}, { preserveState: true, replace: true, preserveScroll: true });
};
const handleReset = () => {
@@ -80,7 +80,7 @@ export default function GoodsReceiptIndex({ receipts, filters, warehouses }: Pro
setDateEnd('');
setDateRangeType('custom');
setPerPage('10');
router.get(route('goods-receipts.index'), {}, { preserveState: false });
router.get(route('goods-receipts.index'), {}, { preserveState: false, preserveScroll: true });
};
const handleDateRangeChange = (type: string) => {

View File

@@ -139,6 +139,7 @@ export default function StockQueryIndex({
router.get(route("inventory.stock-query.index"), cleaned, {
preserveState: true,
replace: true,
preserveScroll: true,
});
};

View File

@@ -71,6 +71,7 @@ export default function Index({ warehouses, orders, filters }: any) {
router.get(route('inventory.transfer.index'), params, {
preserveState: true,
replace: true,
preserveScroll: true,
});
}, 500),
[]

View File

@@ -82,12 +82,11 @@ export default function ProductionIndex({ productionOrders, filters }: Props) {
status: status === 'all' ? undefined : status,
per_page: perPage,
},
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
};
const handlePerPageChange = (value: string) => {
setPerPage(value);
router.get(
@@ -135,7 +134,7 @@ export default function ProductionIndex({ productionOrders, filters }: Props) {
<button
onClick={() => {
setSearch("");
router.get(route('production-orders.index'), { ...filters, search: "" }, { preserveState: true, replace: true });
router.get(route('production-orders.index'), { ...filters, search: "" }, { preserveState: true, replace: true, preserveScroll: true });
}}
className="absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600"
>
@@ -152,7 +151,7 @@ export default function ProductionIndex({ productionOrders, filters }: Props) {
router.get(
route('production-orders.index'),
{ ...filters, status: val === 'all' ? undefined : val },
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
}}
>

View File

@@ -78,12 +78,11 @@ export default function RecipeIndex({ recipes, filters }: Props) {
search,
per_page: perPage,
},
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
};
const handlePerPageChange = (value: string) => {
setPerPage(value);
router.get(
@@ -95,7 +94,7 @@ export default function RecipeIndex({ recipes, filters }: Props) {
const handleDelete = (id: number) => {
if (confirm("確定要刪除此配方嗎?")) {
router.delete(route('recipes.destroy', id));
router.delete(route('recipes.destroy', id), { preserveScroll: true });
}
};
@@ -147,7 +146,7 @@ export default function RecipeIndex({ recipes, filters }: Props) {
<button
onClick={() => {
setSearch("");
router.get(route('recipes.index'), { ...filters, search: "" }, { preserveState: true, replace: true });
router.get(route('recipes.index'), { ...filters, search: "" }, { preserveState: true, replace: true, preserveScroll: true });
}}
className="absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600"
>

View File

@@ -82,7 +82,7 @@ export default function PurchaseOrderIndex({ orders, filters, warehouses }: Prop
sort_field: filters.sort_field,
sort_direction: filters.sort_direction,
},
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
};
@@ -94,7 +94,7 @@ export default function PurchaseOrderIndex({ orders, filters, warehouses }: Prop
setDateEnd("");
setDateRangeType("custom");
router.get(route('purchase-orders.index'));
router.get(route('purchase-orders.index'), {}, { preserveScroll: true });
};
const handleDateRangeChange = (type: string) => {

View File

@@ -74,7 +74,7 @@ export default function SalesImportIndex({ batches, filters = {} }: Props) {
per_page: perPage,
search: search
},
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
};
@@ -126,7 +126,7 @@ export default function SalesImportIndex({ batches, filters = {} }: Props) {
<button
onClick={() => {
setSearch("");
router.get(route('sales-imports.index'), { ...filters, search: "" }, { preserveState: true, replace: true });
router.get(route('sales-imports.index'), { ...filters, search: "" }, { preserveState: true, replace: true, preserveScroll: true });
}}
className="absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600"
>

View File

@@ -41,14 +41,14 @@ export default function ShippingOrderIndex({ orders, filters, warehouses }: Prop
search,
status: status === 'all' ? undefined : status,
},
{ preserveState: true, replace: true }
{ preserveState: true, replace: true, preserveScroll: true }
);
};
const handleReset = () => {
setSearch("");
setStatus("all");
router.get(route('delivery-notes.index'));
router.get(route('delivery-notes.index'), {}, { preserveScroll: true });
};
const getStatusBadge = (status: string) => {

View File

@@ -86,6 +86,7 @@ export default function Index({
router.get(route("store-requisitions.index"), params, {
preserveState: true,
replace: true,
preserveScroll: true,
});
}, 300),
[]

View File

@@ -106,7 +106,7 @@ export default function UtilityFeeIndex({ fees, availableCategories, filters }:
sort_direction: sortDirection,
per_page: perPage,
},
{ preserveState: true }
{ preserveState: true, preserveScroll: true }
);
};
@@ -133,7 +133,7 @@ export default function UtilityFeeIndex({ fees, availableCategories, filters }:
setDateStart("");
setDateEnd("");
setDateRangeType("custom");
router.get(route("utility-fees.index"), { per_page: perPage }, { preserveState: false });
router.get(route("utility-fees.index"), { per_page: perPage }, { preserveState: false, preserveScroll: true });
};
const handleSort = (field: string) => {
@@ -163,7 +163,7 @@ export default function UtilityFeeIndex({ fees, availableCategories, filters }:
sort_direction: newDirection,
per_page: perPage,
},
{ preserveState: true }
{ preserveState: true, preserveScroll: true }
);
};

View File

@@ -86,7 +86,7 @@ export default function WarehouseIndex({ warehouses, totals, transitWarehouses,
// 導航處理
const handleViewInventory = (warehouseId: string | number) => {
router.get(`/warehouses/${warehouseId}/inventory`);
router.get(`/warehouses/${warehouseId}/inventory`, {}, { preserveScroll: true });
};
// 倉庫操作處理函式