Compare commits
No commits in common. "62ba89c599f169b1fef90c477c38d5b7188deb81" and "105b3778e1fe8a37b7b3115787965dde99653d89" have entirely different histories.
62ba89c599
...
105b3778e1
@ -38,7 +38,6 @@ class Team(SQLModel, table=True):
|
|||||||
name: str
|
name: str
|
||||||
location: str | None
|
location: str | None
|
||||||
country: str | None
|
country: str | None
|
||||||
mixed: bool = False
|
|
||||||
players: list["Player"] | None = Relationship(
|
players: list["Player"] | None = Relationship(
|
||||||
back_populates="teams", link_model=PlayerTeamLink
|
back_populates="teams", link_model=PlayerTeamLink
|
||||||
)
|
)
|
||||||
|
14
src/App.css
14
src/App.css
@ -515,6 +515,12 @@ button {
|
|||||||
&.disable-player {
|
&.disable-player {
|
||||||
background-color: #e338;
|
background-color: #e338;
|
||||||
}
|
}
|
||||||
|
&.mmp {
|
||||||
|
background-color: lightskyblue;
|
||||||
|
}
|
||||||
|
&.fmp {
|
||||||
|
background-color: salmon;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.new-player-inputs {
|
.new-player-inputs {
|
||||||
@ -545,14 +551,6 @@ button {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.mmp {
|
|
||||||
background-color: lightskyblue;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fmp {
|
|
||||||
background-color: salmon;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes blink {
|
@keyframes blink {
|
||||||
0% {
|
0% {
|
||||||
background-color: #8888;
|
background-color: #8888;
|
||||||
|
@ -7,11 +7,9 @@ import TabController from "./TabController";
|
|||||||
|
|
||||||
type PlayerListProps = Partial<ReactSortableProps<any>> & {
|
type PlayerListProps = Partial<ReactSortableProps<any>> & {
|
||||||
orderedList?: boolean;
|
orderedList?: boolean;
|
||||||
gender?: boolean;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function PlayerList(props: PlayerListProps) {
|
function PlayerList(props: PlayerListProps) {
|
||||||
const fmps = props.list?.filter((item) => item.gender === "fmp").length;
|
|
||||||
return (
|
return (
|
||||||
<ReactSortable
|
<ReactSortable
|
||||||
{...props}
|
{...props}
|
||||||
@ -19,23 +17,13 @@ function PlayerList(props: PlayerListProps) {
|
|||||||
swapThreshold={0.2}
|
swapThreshold={0.2}
|
||||||
style={{ minHeight: props.list && props.list?.length < 1 ? 64 : 32 }}
|
style={{ minHeight: props.list && props.list?.length < 1 ? 64 : 32 }}
|
||||||
>
|
>
|
||||||
{props.list &&
|
{props.list?.map((item, index) => (
|
||||||
props.list.map((item, index) => (
|
<div key={item.id} className="item">
|
||||||
<div
|
{props.orderedList
|
||||||
key={item.id}
|
? index + 1 + ". " + item.display_name
|
||||||
className={"item " + (props.gender ? item.gender : "")}
|
: item.display_name}
|
||||||
>
|
</div>
|
||||||
{props.orderedList
|
))}
|
||||||
? props.gender
|
|
||||||
? index +
|
|
||||||
1 -
|
|
||||||
(item.gender !== "fmp" ? fmps! : 0) +
|
|
||||||
". " +
|
|
||||||
item.display_name
|
|
||||||
: index + 1 + ". " + item.display_name
|
|
||||||
: item.display_name}
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</ReactSortable>
|
</ReactSortable>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -337,11 +325,8 @@ function MVPDnD({ user, teams, players }: PlayerInfoProps) {
|
|||||||
const [availablePlayers, setAvailablePlayers] = useState<User[]>(players);
|
const [availablePlayers, setAvailablePlayers] = useState<User[]>(players);
|
||||||
const [rankedPlayers, setRankedPlayers] = useState<User[]>([]);
|
const [rankedPlayers, setRankedPlayers] = useState<User[]>([]);
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [mixed, setMixed] = useState(false);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const activeTeam = teams.teams.find((team) => team.id == teams.activeTeam);
|
|
||||||
activeTeam && setMixed(activeTeam.mixed);
|
|
||||||
handleGet();
|
handleGet();
|
||||||
}, [players]);
|
}, [players]);
|
||||||
|
|
||||||
@ -397,9 +382,11 @@ function MVPDnD({ user, teams, players }: PlayerInfoProps) {
|
|||||||
setList={setAvailablePlayers}
|
setList={setAvailablePlayers}
|
||||||
group={{
|
group={{
|
||||||
name: "mvp-shared",
|
name: "mvp-shared",
|
||||||
|
pull: function (to) {
|
||||||
|
return to.el.classList.contains("putclone") ? "clone" : true;
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
className="dragbox"
|
className="dragbox"
|
||||||
gender={mixed}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="box two">
|
<div className="box two">
|
||||||
@ -412,23 +399,15 @@ function MVPDnD({ user, teams, players }: PlayerInfoProps) {
|
|||||||
)}
|
)}
|
||||||
<PlayerList
|
<PlayerList
|
||||||
list={rankedPlayers}
|
list={rankedPlayers}
|
||||||
setList={(newList) =>
|
setList={setRankedPlayers}
|
||||||
mixed
|
|
||||||
? setRankedPlayers(
|
|
||||||
newList.sort((a, b) =>
|
|
||||||
a.gender && b.gender
|
|
||||||
? a.gender.localeCompare(b.gender)
|
|
||||||
: -1
|
|
||||||
)
|
|
||||||
)
|
|
||||||
: setRankedPlayers(newList)
|
|
||||||
}
|
|
||||||
group={{
|
group={{
|
||||||
name: "mvp-shared",
|
name: "mvp-shared",
|
||||||
|
pull: function (to) {
|
||||||
|
return to.el.classList.contains("putclone") ? "clone" : true;
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
className="dragbox"
|
className="dragbox"
|
||||||
orderedList
|
orderedList
|
||||||
gender={mixed}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { jwtDecode, JwtPayload } from "jwt-decode";
|
import { jwtDecode, JwtPayload } from "jwt-decode";
|
||||||
import { ReactNode, useEffect, useState } from "react";
|
import { ReactNode, useEffect, useState } from "react";
|
||||||
import { apiAuth, baseUrl, Gender, User } from "./api";
|
import { apiAuth, baseUrl, User } from "./api";
|
||||||
import { useNavigate } from "react-router";
|
import { useNavigate } from "react-router";
|
||||||
import { Eye, EyeSlash } from "./Icons";
|
import { Eye, EyeSlash } from "./Icons";
|
||||||
import { useSession } from "./Session";
|
import { useSession } from "./Session";
|
||||||
@ -237,21 +237,6 @@ export const SetPassword = () => {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<label>gender</label>
|
|
||||||
<select
|
|
||||||
name="gender"
|
|
||||||
required
|
|
||||||
value={player.gender}
|
|
||||||
onChange={(e) => {
|
|
||||||
setPlayer({ ...player, gender: e.target.value as Gender });
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<option value={undefined}></option>
|
|
||||||
<option value="fmp">FMP</option>
|
|
||||||
<option value="mmp">MMP</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
<label>number (optional)</label>
|
<label>number (optional)</label>
|
||||||
<input
|
<input
|
||||||
|
@ -155,6 +155,7 @@ const TeamPanel = () => {
|
|||||||
<label>gender</label>
|
<label>gender</label>
|
||||||
<select
|
<select
|
||||||
name="gender"
|
name="gender"
|
||||||
|
required
|
||||||
value={player.gender}
|
value={player.gender}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
setPlayer({ ...player, gender: e.target.value as Gender });
|
setPlayer({ ...player, gender: e.target.value as Gender });
|
||||||
|
@ -46,7 +46,6 @@ export interface Team {
|
|||||||
name: string;
|
name: string;
|
||||||
location: string;
|
location: string;
|
||||||
country: string;
|
country: string;
|
||||||
mixed: boolean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ErrorState = {
|
export type ErrorState = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user