Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/dev/nginx.conf
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ http {
# Disable buffering if you have large payloads
proxy_request_buffering off;

proxy_pass https://userapp.chtcdev.chtc.io;
proxy_pass http://host.docker.internal:8080/;
}

location / {
Expand Down
6 changes: 3 additions & 3 deletions src/app/email/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { AuthGuard } from "@/src/components/AuthGuard";
import { apiFetch } from "@/src/components/AuthProvider";
import ProjectAutocomplete from "@/src/components/ProjectAutocomplete/ProjectAutocomplete";
import SubmitNodeAutocomplete from "@/src/components/SubmitNodeAutocomplete/SubmitNodeAutocomplete";
import type { JoinedProjectView, Project, SubmitNode, User } from "@/types";
import type { Group, JoinedProjectView, Project, User } from "@/types";
import CheckIcon from "@mui/icons-material/Check";
import ContentCopyIcon from "@mui/icons-material/ContentCopy";
import PlayArrowIcon from "@mui/icons-material/PlayArrow";
Expand Down Expand Up @@ -83,7 +83,7 @@ async function fetchEmails(filters: CommittedFilters): Promise<string[]> {
if (!res.ok) throw new Error(await res.text());

const data: User[] = await res.json();
const users = data.filter((u) => u.submit_nodes?.some((sn) => sn.submit_node_id === submitNodeId));
const users = data.filter((u) => u.groups?.some((g) => g.group_id === submitNodeId));
return toEmails(users);
}

Expand All @@ -101,7 +101,7 @@ function Page() {
const [status, setStatus] = useState<StatusFilter>("all");
const [role, setRole] = useState<RoleFilter>("any");
const [selectedProject, setSelectedProject] = useState<Project | null>(null);
const [selectedSubmitNode, setSelectedSubmitNode] = useState<SubmitNode | null>(null);
const [selectedSubmitNode, setSelectedSubmitNode] = useState<Group | null>(null);
const [committedFilters, setCommittedFilters] = useState<CommittedFilters | null>(null);
const [copied, setCopied] = useState(false);

Expand Down
4 changes: 3 additions & 1 deletion src/app/groups/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import GenericTableView from "@/src/components/GenericTableView/GenericTableView";
import { createCellRenderer } from "@/src/utils/cellRenderers";

const headers = ["id", "Group Name", "Point of Contact", "GID", "Has Group Directory?"];
const headers = ["id", "Group Name", "Type", "Point of Contact", "GID", "Has Group Directory?"];
const cellRenderer = createCellRenderer({ editPath: "/groups/edit" });

function Page() {
Expand All @@ -14,6 +14,7 @@ function Page() {
cellRenderer={cellRenderer}
sortableColumns={{
"Group Name": "name",
"Type": "type",
"Point of Contact": "point_of_contact",
GID: "unix_gid",
}}
Expand All @@ -27,6 +28,7 @@ function Page() {
const data = result.data.map((group) => [
group.id,
group.name,
group.type ?? "",
group.point_of_contact?.name ?? group.point_of_contact?.email1 ?? "",
group.unix_gid ?? "",
group.has_groupdir ? "Yes" : "No",
Expand Down
13 changes: 0 additions & 13 deletions src/components/AuthProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import type {
Project,
ProjectCreateUpdate,
RouteGet,
SubmitNode,
TokenGet,
TokenGetFull,
TokenPost,
Expand Down Expand Up @@ -72,9 +71,6 @@ export type ApiClient = {
// PI Projects
getPiProjects: (params?: PaginationParams) => Promise<PaginatedResponse<PiProjectView[]>>;

// Submit Nodes
getSubmitNodes: (params?: PaginationParams) => Promise<PaginatedResponse<SubmitNode[]>>;

// Tokens
getTokens: (params?: PaginationParams) => Promise<PaginatedResponse<TokenGet[]>>;
getToken: (tokenId: number) => Promise<TokenGetFull>;
Expand Down Expand Up @@ -387,15 +383,6 @@ export function AuthClientProvider({ children }: { children: React.ReactNode })
return { data, totalCount };
}, []),

// Submit Nodes
getSubmitNodes: useCallback(async (params?: PaginationParams): Promise<PaginatedResponse<SubmitNode[]>> => {
const response = await apiFetch(`/submit_nodes${buildQuery(params)}`);
if (!response.ok) throw new Error(`Failed to get submit nodes: ${response.statusText}`);
const totalCount = parseInt(response.headers.get("X-Total-Count") || "0", 10);
const data = await response.json();
return { data, totalCount };
}, []),

// Tokens
getTokens: useCallback(async (params?: PaginationParams): Promise<PaginatedResponse<TokenGet[]>> => {
const response = await apiFetch(`/tokens${buildQuery(params)}`);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type { ApiError } from "@/src/components/Forms/UserForm/UserForm";
import ProjectAutocomplete from "@/src/components/ProjectAutocomplete/ProjectAutocomplete";
import SubmitNodeAutocomplete from "@/src/components/SubmitNodeAutocomplete/SubmitNodeAutocomplete";
import { apiFetch } from "@/src/components/AuthProvider";
import type { FormStatusEnum, PositionEnum, Project, SubmitNode, User, UserForm, UserFormPatch } from "@/types";
import type { FormStatusEnum, Group, PositionEnum, Project, User, UserForm, UserFormPatch } from "@/types";
import {
Alert, AlertTitle,
Box,
Expand Down Expand Up @@ -75,8 +75,8 @@ export function UserApplicationEditForm({
const [step, setStep] = useState<Step>("initial");
const [project, setProject] = useState<Project | null>(null);
const [userPosition, setUserPosition] = useState<PositionEnum | "">(initialValues?.position ?? "");
const [selectedSubmitNode, setSelectedSubmitNode] = useState<SubmitNode | null>(null);
const [submitNodes, setSubmitNodes] = useState<SubmitNode[]>([]);
const [selectedSubmitNodeGroup, setSelectedSubmitNodeGroup] = useState<Group | null>(null);
const [submitNodeGroups, setSubmitNodeGroups] = useState<Group[]>([]);
const [email, setEmail] = useState<string>(initialValues?.email ?? "");
const content = initialValues?.content;
const piDisplay = initialValues?.pi_name ?? `User ID ${initialValues?.pi_id ?? "-"}`;
Expand All @@ -90,18 +90,17 @@ export function UserApplicationEditForm({
const userWasPreviouslyActive = useMemo(() => {
return Boolean(
(applicant?.groups?.length ?? 0) ||
(applicant?.projects?.length ?? 0) ||
(applicant?.submit_nodes?.length ?? 0)
(applicant?.projects?.length ?? 0)
);
}, [applicant]);

const validationMessage = useMemo(() => {
if (needsEmail && !email.trim()) return "Enter the user's email address before approving.";
if (!project) return "Select a project before approving.";
if (userPosition === "") return "Choose a project position before approving.";
if (submitNodes.length === 0) return "Add at least one submit node before approving.";
if (submitNodeGroups.length === 0) return "Add at least one submit node before approving.";
return null;
}, [needsEmail, email, project, userPosition, submitNodes.length]);
}, [needsEmail, email, project, userPosition, submitNodeGroups.length]);

const handleDeny = async () => {
await onSubmit({ status: "DENIED" });
Expand All @@ -124,15 +123,15 @@ export function UserApplicationEditForm({
};

const handleAddSubmitNode = () => {
if (!selectedSubmitNode || submitNodes.some((node) => node.id === selectedSubmitNode.id)) {
if (!selectedSubmitNodeGroup || submitNodeGroups.some((node) => node.id === selectedSubmitNodeGroup.id)) {
return;
}
setSubmitNodes((current) => [...current, selectedSubmitNode]);
setSelectedSubmitNode(null);
setSubmitNodeGroups((current) => [...current, selectedSubmitNodeGroup]);
setSelectedSubmitNodeGroup(null);
};

const handleRemoveSubmitNode = (id: number) => {
setSubmitNodes((current) => current.filter((node) => node.id !== id));
setSubmitNodeGroups((current) => current.filter((node) => node.id !== id));
};

const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
Expand All @@ -144,7 +143,7 @@ export function UserApplicationEditForm({
email: needsEmail ? email.trim() || undefined : undefined,
project_id: project?.id ?? 0,
user_position: userPosition as PositionEnum,
submit_nodes: submitNodes.map((node) => ({ submit_node_id: node.id })),
submit_node_group_ids: submitNodeGroups.map((group) => (group.id)),
});
};

Expand Down Expand Up @@ -325,22 +324,22 @@ export function UserApplicationEditForm({

<Stack spacing={2}>
<SubmitNodeAutocomplete
value={selectedSubmitNode ?? undefined}
onSelect={setSelectedSubmitNode}
value={selectedSubmitNodeGroup ?? undefined}
onSelect={setSelectedSubmitNodeGroup}
disabled={isSubmitting}
/>
<Box>
<Button
type="button"
variant="outlined"
onClick={handleAddSubmitNode}
disabled={!selectedSubmitNode || isSubmitting}
disabled={!selectedSubmitNodeGroup || isSubmitting}
>
Add Submit Node
</Button>
</Box>
<Stack direction="row" spacing={1} flexWrap="wrap" useFlexGap>
{submitNodes.map((node) => (
{submitNodeGroups.map((node) => (
<Chip
key={node.id}
label={node.name}
Expand Down
Loading