相关修复
This commit is contained in:
parent
08872009e1
commit
feefcba3c8
@ -400,6 +400,8 @@ export function useResourceListPage() {
|
|||||||
const [form, setForm] = useState(emptyResourceForm);
|
const [form, setForm] = useState(emptyResourceForm);
|
||||||
const [selectedResource, setSelectedResource] = useState(null);
|
const [selectedResource, setSelectedResource] = useState(null);
|
||||||
const [loadingAction, setLoadingAction] = useState("");
|
const [loadingAction, setLoadingAction] = useState("");
|
||||||
|
const [resourceRowPatches, setResourceRowPatches] = useState({});
|
||||||
|
const [hiddenResourceIds, setHiddenResourceIds] = useState([]);
|
||||||
const filters = useMemo(
|
const filters = useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
keyword: query,
|
keyword: query,
|
||||||
@ -416,6 +418,53 @@ export function useResourceListPage() {
|
|||||||
pageSize,
|
pageSize,
|
||||||
queryKey: ["resources", filters, page],
|
queryKey: ["resources", filters, page],
|
||||||
});
|
});
|
||||||
|
const hiddenResourceIdSet = useMemo(() => new Set(hiddenResourceIds), [hiddenResourceIds]);
|
||||||
|
const resourceData = useMemo(() => {
|
||||||
|
const source = result.data || emptyData;
|
||||||
|
const sourceItems = Array.isArray(source.items) ? source.items : [];
|
||||||
|
const patchedItems = sourceItems
|
||||||
|
.map((item) => ({
|
||||||
|
...item,
|
||||||
|
...(resourceRowPatches[item.resourceId] || {}),
|
||||||
|
}))
|
||||||
|
.filter((item) => !hiddenResourceIdSet.has(item.resourceId));
|
||||||
|
return {
|
||||||
|
...source,
|
||||||
|
items: patchedItems,
|
||||||
|
};
|
||||||
|
}, [hiddenResourceIdSet, resourceRowPatches, result.data]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setResourceRowPatches({});
|
||||||
|
setHiddenResourceIds([]);
|
||||||
|
}, [filters]);
|
||||||
|
|
||||||
|
const patchResourceRow = (resourceId, patch) => {
|
||||||
|
if (!resourceId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setHiddenResourceIds((current) => current.filter((hiddenId) => hiddenId !== resourceId));
|
||||||
|
setResourceRowPatches((current) => ({
|
||||||
|
...current,
|
||||||
|
[resourceId]: {
|
||||||
|
...(current[resourceId] || {}),
|
||||||
|
...patch,
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
const hideResourceRow = (resourceId) => {
|
||||||
|
if (!resourceId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setHiddenResourceIds((current) => (current.includes(resourceId) ? current : [...current, resourceId]));
|
||||||
|
};
|
||||||
|
|
||||||
|
const reloadResources = async () => {
|
||||||
|
setResourceRowPatches({});
|
||||||
|
setHiddenResourceIds([]);
|
||||||
|
return result.reload();
|
||||||
|
};
|
||||||
|
|
||||||
const openCreateResource = () => {
|
const openCreateResource = () => {
|
||||||
setForm(emptyResourceForm());
|
setForm(emptyResourceForm());
|
||||||
@ -469,12 +518,21 @@ export function useResourceListPage() {
|
|||||||
`resource-status-${resource.resourceId}`,
|
`resource-status-${resource.resourceId}`,
|
||||||
nextEnabled ? "资源已启用" : "资源已禁用",
|
nextEnabled ? "资源已启用" : "资源已禁用",
|
||||||
async () => {
|
async () => {
|
||||||
|
let updatedResource;
|
||||||
if (nextStatus === "active") {
|
if (nextStatus === "active") {
|
||||||
await enableResource(resource.resourceId);
|
updatedResource = await enableResource(resource.resourceId);
|
||||||
} else {
|
} else {
|
||||||
await disableResource(resource.resourceId);
|
updatedResource = await disableResource(resource.resourceId);
|
||||||
|
}
|
||||||
|
if (status && nextStatus !== status) {
|
||||||
|
hideResourceRow(resource.resourceId);
|
||||||
|
} else {
|
||||||
|
patchResourceRow(resource.resourceId, {
|
||||||
|
...(updatedResource || {}),
|
||||||
|
status: updatedResource?.status || nextStatus,
|
||||||
|
updatedAtMs: updatedResource?.updatedAtMs ?? Date.now(),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
await result.reload();
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@ -494,8 +552,12 @@ export function useResourceListPage() {
|
|||||||
...emptyResourceForm(resource),
|
...emptyResourceForm(resource),
|
||||||
managerGrantEnabled: nextEnabled,
|
managerGrantEnabled: nextEnabled,
|
||||||
});
|
});
|
||||||
await updateResource(resource.resourceId, buildResourcePayload(formValue));
|
const updatedResource = await updateResource(resource.resourceId, buildResourcePayload(formValue));
|
||||||
await result.reload();
|
patchResourceRow(resource.resourceId, {
|
||||||
|
...(updatedResource || {}),
|
||||||
|
managerGrantEnabled: updatedResource?.managerGrantEnabled ?? nextEnabled,
|
||||||
|
updatedAtMs: updatedResource?.updatedAtMs ?? Date.now(),
|
||||||
|
});
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@ -520,7 +582,7 @@ export function useResourceListPage() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...sharedPageState({ page, query, result, setPage, setQuery }),
|
...sharedPageState({ data: resourceData, page, query, reload: reloadResources, result, setPage, setQuery }),
|
||||||
abilities,
|
abilities,
|
||||||
activeAction,
|
activeAction,
|
||||||
changeResourceType: resetSetter(setResourceType, setPage),
|
changeResourceType: resetSetter(setResourceType, setPage),
|
||||||
@ -1883,14 +1945,14 @@ export function useResourceGrantListPage() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function sharedPageState({ page, query, result, setPage, setQuery }) {
|
function sharedPageState({ data, page, query, reload, result, setPage, setQuery }) {
|
||||||
return {
|
return {
|
||||||
data: result.data || emptyData,
|
data: data || result.data || emptyData,
|
||||||
error: result.error,
|
error: result.error,
|
||||||
loading: result.loading,
|
loading: result.loading,
|
||||||
page,
|
page,
|
||||||
query,
|
query,
|
||||||
reload: result.reload,
|
reload: reload || result.reload,
|
||||||
setPage,
|
setPage,
|
||||||
changeQuery: resetSetter(setQuery, setPage),
|
changeQuery: resetSetter(setQuery, setPage),
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user