Use built-in Table rowSelection
This commit is contained in:
parent
9d63c2028f
commit
ea657c78b5
@ -1,12 +1,11 @@
|
||||
"use client";
|
||||
|
||||
import { useState, useCallback, useMemo, useEffect } from "react";
|
||||
import { useState, useCallback, useMemo, useEffect, useRef } from "react";
|
||||
import {
|
||||
Modal,
|
||||
Steps,
|
||||
Button,
|
||||
Space,
|
||||
Checkbox,
|
||||
Table,
|
||||
Select,
|
||||
Row,
|
||||
@ -95,9 +94,8 @@ export function PublishModal({
|
||||
const [currentStep, setCurrentStep] = useState(0);
|
||||
|
||||
// Version selection
|
||||
const [selectedVersions, setSelectedVersions] = useState<Set<string>>(
|
||||
new Set(),
|
||||
);
|
||||
const [selectedModrinth, setSelectedModrinth] = useState<string[]>([]);
|
||||
const [selectedCurseforge, setSelectedCurseforge] = useState<string[]>([]);
|
||||
|
||||
// Publish settings
|
||||
const [changelog, setChangelog] = useState("");
|
||||
@ -202,21 +200,30 @@ export function PublishModal({
|
||||
[project, versionTmpl, versionNameTmpl, mrExplicitMap, cfExplicitMap, existingModrinth, existingCurseforge],
|
||||
);
|
||||
|
||||
// Auto-select all non-existing versions when data first loads
|
||||
const initRef = useRef(false);
|
||||
useEffect(() => {
|
||||
if (open) {
|
||||
initRef.current = false;
|
||||
}
|
||||
}, [open]);
|
||||
useEffect(() => {
|
||||
if (!loadingExisting && publishVersions.length > 0 && !initRef.current) {
|
||||
initRef.current = true;
|
||||
setSelectedModrinth(
|
||||
publishVersions.filter((v) => !v.existsModrinth).map((v) => v.key),
|
||||
);
|
||||
setSelectedCurseforge(
|
||||
publishVersions.filter((v) => !v.existsCurseforge).map((v) => v.key),
|
||||
);
|
||||
}
|
||||
}, [loadingExisting, publishVersions]);
|
||||
|
||||
// --------------- Steps handling ---------------
|
||||
|
||||
const handleNext = useCallback(() => {
|
||||
if (currentStep === 0) {
|
||||
// Init selection with all non-existing entries
|
||||
const preselected = new Set<string>();
|
||||
for (const v of publishVersions) {
|
||||
if (!v.existsModrinth || !v.existsCurseforge) {
|
||||
preselected.add(v.key);
|
||||
}
|
||||
}
|
||||
setSelectedVersions(preselected);
|
||||
}
|
||||
setCurrentStep((prev) => Math.min(prev + 1, 2));
|
||||
}, [currentStep, publishVersions]);
|
||||
}, []);
|
||||
|
||||
const handlePrev = useCallback(() => {
|
||||
setCurrentStep((prev) => Math.max(prev - 1, 0));
|
||||
@ -236,7 +243,8 @@ export function PublishModal({
|
||||
const handleClose = useCallback(() => {
|
||||
if (publishing) return;
|
||||
setCurrentStep(0);
|
||||
setSelectedVersions(new Set());
|
||||
setSelectedModrinth([]);
|
||||
setSelectedCurseforge([]);
|
||||
setChangelog("");
|
||||
setVersionType("release");
|
||||
setPublishResult(null);
|
||||
@ -265,25 +273,6 @@ export function PublishModal({
|
||||
dataIndex: "modrinthVersionName",
|
||||
key: "modrinthVersionName",
|
||||
},
|
||||
{
|
||||
title: "",
|
||||
key: "select",
|
||||
width: 50,
|
||||
render: (_: unknown, record: PublishVersion) => (
|
||||
<Checkbox
|
||||
disabled={record.existsModrinth}
|
||||
checked={
|
||||
record.existsModrinth || selectedVersions.has(record.key)
|
||||
}
|
||||
onChange={(e) => {
|
||||
const next = new Set(selectedVersions);
|
||||
if (e.target.checked) next.add(record.key);
|
||||
else next.delete(record.key);
|
||||
setSelectedVersions(next);
|
||||
}}
|
||||
/>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
const curseforgeColumns = [
|
||||
@ -306,25 +295,6 @@ export function PublishModal({
|
||||
key: "artifact",
|
||||
ellipsis: true,
|
||||
},
|
||||
{
|
||||
title: "",
|
||||
key: "select",
|
||||
width: 50,
|
||||
render: (_: unknown, record: PublishVersion) => (
|
||||
<Checkbox
|
||||
disabled={record.existsCurseforge}
|
||||
checked={
|
||||
record.existsCurseforge || selectedVersions.has(record.key)
|
||||
}
|
||||
onChange={(e) => {
|
||||
const next = new Set(selectedVersions);
|
||||
if (e.target.checked) next.add(record.key);
|
||||
else next.delete(record.key);
|
||||
setSelectedVersions(next);
|
||||
}}
|
||||
/>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
@ -360,6 +330,13 @@ export function PublishModal({
|
||||
<Table
|
||||
dataSource={publishVersions}
|
||||
columns={modrinthColumns}
|
||||
rowSelection={{
|
||||
selectedRowKeys: selectedModrinth,
|
||||
onChange: (keys) => setSelectedModrinth(keys as string[]),
|
||||
getCheckboxProps: (r: PublishVersion) => ({
|
||||
disabled: r.existsModrinth,
|
||||
}),
|
||||
}}
|
||||
pagination={false}
|
||||
size="small"
|
||||
bordered
|
||||
@ -376,6 +353,13 @@ export function PublishModal({
|
||||
<Table
|
||||
dataSource={publishVersions}
|
||||
columns={curseforgeColumns}
|
||||
rowSelection={{
|
||||
selectedRowKeys: selectedCurseforge,
|
||||
onChange: (keys) => setSelectedCurseforge(keys as string[]),
|
||||
getCheckboxProps: (r: PublishVersion) => ({
|
||||
disabled: r.existsCurseforge,
|
||||
}),
|
||||
}}
|
||||
pagination={false}
|
||||
size="small"
|
||||
bordered
|
||||
@ -436,16 +420,8 @@ export function PublishModal({
|
||||
// --------------- Render: Step 3 — Progress & Result ---------------
|
||||
|
||||
const renderStep3 = () => {
|
||||
const hasModrinth = publishVersions.some(
|
||||
(v) =>
|
||||
!v.existsModrinth &&
|
||||
(selectedVersions.has(v.key) || v.existsModrinth),
|
||||
);
|
||||
const hasCurseforge = publishVersions.some(
|
||||
(v) =>
|
||||
!v.existsCurseforge &&
|
||||
(selectedVersions.has(v.key) || v.existsCurseforge),
|
||||
);
|
||||
const hasModrinth = selectedModrinth.length > 0;
|
||||
const hasCurseforge = selectedCurseforge.length > 0;
|
||||
|
||||
return (
|
||||
<div>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user