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, date_end: dateEnd,
per_page: perPage, per_page: perPage,
}, },
{ preserveState: true } { preserveState: true, preserveScroll: true }
); );
}; };
@@ -105,7 +105,7 @@ export default function AccountingReport({ records, summary, filters }: PageProp
date_end: dateEnd, date_end: dateEnd,
per_page: value, 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, causer_id: causer === 'all' ? undefined : causer,
page: 1 // Reset to first page on filter 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( router.get(
route('activity-logs.index'), route('activity-logs.index'),
{ per_page: perPage, sort_by: filters.sort_by, sort_order: filters.sort_order }, { 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( router.get(
route('activity-logs.index'), route('activity-logs.index'),
{ ...filters, sort_by: newSortBy, sort_order: newSortOrder }, { ...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( router.get(
route('roles.index'), route('roles.index'),
{ ...filters, sort_by: newSortBy, sort_order: newSortOrder }, { ...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( router.get(
route('users.index'), route('users.index'),
{ ...filters, sort_by: newSortBy, sort_order: newSortOrder }, { ...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( router.get(
route("integration.sales-orders.index"), route("integration.sales-orders.index"),
{ ...filters, search, page: 1 }, { ...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( router.get(
route("integration.sales-orders.index"), route("integration.sales-orders.index"),
{ ...filters, per_page: value, page: 1 }, { ...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( router.get(
route("integration.sales-orders.index"), route("integration.sales-orders.index"),
{ ...filters, source: v || undefined, page: 1 }, { ...filters, source: v || undefined, page: 1 },
{ preserveState: true, replace: true } { preserveState: true, replace: true, preserveScroll: true }
) )
} }
options={sourceOptions} 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, { router.get(route('inventory.adjust.index'), params as any, {
preserveState: true, preserveState: true,
replace: true, replace: true,
preserveScroll: true,
}); });
}, 300), }, 300),
[] []

View File

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

View File

@@ -139,6 +139,7 @@ export default function StockQueryIndex({
router.get(route("inventory.stock-query.index"), cleaned, { router.get(route("inventory.stock-query.index"), cleaned, {
preserveState: true, preserveState: true,
replace: 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, { router.get(route('inventory.transfer.index'), params, {
preserveState: true, preserveState: true,
replace: true, replace: true,
preserveScroll: true,
}); });
}, 500), }, 500),
[] []

View File

@@ -82,12 +82,11 @@ export default function ProductionIndex({ productionOrders, filters }: Props) {
status: status === 'all' ? undefined : status, status: status === 'all' ? undefined : status,
per_page: perPage, per_page: perPage,
}, },
{ preserveState: true, replace: true } { preserveState: true, replace: true, preserveScroll: true }
); );
}; };
const handlePerPageChange = (value: string) => { const handlePerPageChange = (value: string) => {
setPerPage(value); setPerPage(value);
router.get( router.get(
@@ -135,7 +134,7 @@ export default function ProductionIndex({ productionOrders, filters }: Props) {
<button <button
onClick={() => { onClick={() => {
setSearch(""); 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" 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( router.get(
route('production-orders.index'), route('production-orders.index'),
{ ...filters, status: val === 'all' ? undefined : val }, { ...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, search,
per_page: perPage, per_page: perPage,
}, },
{ preserveState: true, replace: true } { preserveState: true, replace: true, preserveScroll: true }
); );
}; };
const handlePerPageChange = (value: string) => { const handlePerPageChange = (value: string) => {
setPerPage(value); setPerPage(value);
router.get( router.get(
@@ -95,7 +94,7 @@ export default function RecipeIndex({ recipes, filters }: Props) {
const handleDelete = (id: number) => { const handleDelete = (id: number) => {
if (confirm("確定要刪除此配方嗎?")) { 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 <button
onClick={() => { onClick={() => {
setSearch(""); 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" 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_field: filters.sort_field,
sort_direction: filters.sort_direction, 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(""); setDateEnd("");
setDateRangeType("custom"); setDateRangeType("custom");
router.get(route('purchase-orders.index')); router.get(route('purchase-orders.index'), {}, { preserveScroll: true });
}; };
const handleDateRangeChange = (type: string) => { const handleDateRangeChange = (type: string) => {

View File

@@ -74,7 +74,7 @@ export default function SalesImportIndex({ batches, filters = {} }: Props) {
per_page: perPage, per_page: perPage,
search: search search: search
}, },
{ preserveState: true, replace: true } { preserveState: true, replace: true, preserveScroll: true }
); );
}; };
@@ -126,7 +126,7 @@ export default function SalesImportIndex({ batches, filters = {} }: Props) {
<button <button
onClick={() => { onClick={() => {
setSearch(""); 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" 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, search,
status: status === 'all' ? undefined : status, status: status === 'all' ? undefined : status,
}, },
{ preserveState: true, replace: true } { preserveState: true, replace: true, preserveScroll: true }
); );
}; };
const handleReset = () => { const handleReset = () => {
setSearch(""); setSearch("");
setStatus("all"); setStatus("all");
router.get(route('delivery-notes.index')); router.get(route('delivery-notes.index'), {}, { preserveScroll: true });
}; };
const getStatusBadge = (status: string) => { const getStatusBadge = (status: string) => {

View File

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

View File

@@ -106,7 +106,7 @@ export default function UtilityFeeIndex({ fees, availableCategories, filters }:
sort_direction: sortDirection, sort_direction: sortDirection,
per_page: perPage, per_page: perPage,
}, },
{ preserveState: true } { preserveState: true, preserveScroll: true }
); );
}; };
@@ -133,7 +133,7 @@ export default function UtilityFeeIndex({ fees, availableCategories, filters }:
setDateStart(""); setDateStart("");
setDateEnd(""); setDateEnd("");
setDateRangeType("custom"); 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) => { const handleSort = (field: string) => {
@@ -163,7 +163,7 @@ export default function UtilityFeeIndex({ fees, availableCategories, filters }:
sort_direction: newDirection, sort_direction: newDirection,
per_page: perPage, 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) => { const handleViewInventory = (warehouseId: string | number) => {
router.get(`/warehouses/${warehouseId}/inventory`); router.get(`/warehouses/${warehouseId}/inventory`, {}, { preserveScroll: true });
}; };
// 倉庫操作處理函式 // 倉庫操作處理函式