parent
97180ab263
commit
146d627534
web/src/app
@ -1,4 +1,4 @@
|
|||||||
import type { SubmissionInfo } from "@/app/ts/Submission";
|
import type { MapfixInfo } from "@/app/ts/Mapfix";
|
||||||
import { Button } from "@mui/material"
|
import { Button } from "@mui/material"
|
||||||
import Window from "./_window";
|
import Window from "./_window";
|
||||||
import SendIcon from '@mui/icons-material/Send';
|
import SendIcon from '@mui/icons-material/Send';
|
||||||
@ -9,10 +9,10 @@ interface CommentersProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface CreatorAndReviewStatus {
|
interface CreatorAndReviewStatus {
|
||||||
asset_id: SubmissionInfo["AssetID"],
|
asset_id: MapfixInfo["AssetID"],
|
||||||
creator: SubmissionInfo["DisplayName"],
|
creator: MapfixInfo["DisplayName"],
|
||||||
review: SubmissionInfo["StatusID"],
|
review: MapfixInfo["StatusID"],
|
||||||
status_message: SubmissionInfo["StatusMessage"],
|
status_message: MapfixInfo["StatusMessage"],
|
||||||
comments: Comment[],
|
comments: Comment[],
|
||||||
name: string
|
name: string
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { SubmissionInfo } from "@/app/ts/Submission"
|
import { MapfixInfo } from "@/app/ts/Mapfix"
|
||||||
|
|
||||||
interface AssetID {
|
interface AssetID {
|
||||||
id: SubmissionInfo["AssetID"]
|
id: MapfixInfo["AssetID"]
|
||||||
}
|
}
|
||||||
|
|
||||||
function MapImage() {
|
function MapImage() {
|
||||||
|
@ -7,17 +7,17 @@ type Review = Actions | "Accept" | "Validate" | "Upload" | "Reset Uploading
|
|||||||
interface ReviewButton {
|
interface ReviewButton {
|
||||||
name: Review,
|
name: Review,
|
||||||
action: ApiActions,
|
action: ApiActions,
|
||||||
submissionId: string,
|
mapfixId: string,
|
||||||
color: ButtonOwnProps["color"]
|
color: ButtonOwnProps["color"]
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ReviewId {
|
interface ReviewId {
|
||||||
submissionId: string
|
mapfixId: string
|
||||||
}
|
}
|
||||||
|
|
||||||
async function ReviewButtonClicked(action: ApiActions, submissionId: string) {
|
async function ReviewButtonClicked(action: ApiActions, mapfixId: string) {
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`/api/submissions/${submissionId}/status/${action}`, {
|
const response = await fetch(`/api/mapfixes/${mapfixId}/status/${action}`, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-type": "application/json",
|
"Content-type": "application/json",
|
||||||
@ -33,7 +33,7 @@ async function ReviewButtonClicked(action: ApiActions, submissionId: string) {
|
|||||||
|
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error updating submission status:", error);
|
console.error("Error updating mapfix status:", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,11 +41,11 @@ function ReviewButton(props: ReviewButton) {
|
|||||||
return <Button
|
return <Button
|
||||||
color={props.color}
|
color={props.color}
|
||||||
variant="contained"
|
variant="contained"
|
||||||
onClick={() => { ReviewButtonClicked(props.action, props.submissionId) }}>{props.name}</Button>
|
onClick={() => { ReviewButtonClicked(props.action, props.mapfixId) }}>{props.name}</Button>
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function ReviewButtons(props: ReviewId) {
|
export default function ReviewButtons(props: ReviewId) {
|
||||||
const submissionId = props.submissionId
|
const mapfixId = props.mapfixId
|
||||||
// When is each button visible?
|
// When is each button visible?
|
||||||
// Multiple buttons can be visible at once.
|
// Multiple buttons can be visible at once.
|
||||||
// Action | Role | When Current Status is One of:
|
// Action | Role | When Current Status is One of:
|
||||||
@ -61,14 +61,14 @@ export default function ReviewButtons(props: ReviewId) {
|
|||||||
// ResetUploading | MapAdmin | Uploading
|
// ResetUploading | MapAdmin | Uploading
|
||||||
return (
|
return (
|
||||||
<section className="review-set">
|
<section className="review-set">
|
||||||
<ReviewButton color="info" name="Submit" action="submit" submissionId={submissionId}/>
|
<ReviewButton color="info" name="Submit" action="submit" mapfixId={mapfixId}/>
|
||||||
<ReviewButton color="info" name="Revoke" action="revoke" submissionId={submissionId}/>
|
<ReviewButton color="info" name="Revoke" action="revoke" mapfixId={mapfixId}/>
|
||||||
<ReviewButton color="info" name="Accept" action="trigger-validate" submissionId={submissionId}/>
|
<ReviewButton color="info" name="Accept" action="trigger-validate" mapfixId={mapfixId}/>
|
||||||
<ReviewButton color="info" name="Validate" action="retry-validate" submissionId={submissionId}/>
|
<ReviewButton color="info" name="Validate" action="retry-validate" mapfixId={mapfixId}/>
|
||||||
<ReviewButton color="error" name="Reject" action="reject" submissionId={submissionId}/>
|
<ReviewButton color="error" name="Reject" action="reject" mapfixId={mapfixId}/>
|
||||||
<ReviewButton color="info" name="Upload" action="trigger-upload" submissionId={submissionId}/>
|
<ReviewButton color="info" name="Upload" action="trigger-upload" mapfixId={mapfixId}/>
|
||||||
<ReviewButton color="error" name="Reset Uploading (fix softlocked status)" action="reset-uploading" submissionId={submissionId}/>
|
<ReviewButton color="error" name="Reset Uploading (fix softlocked status)" action="reset-uploading" mapfixId={mapfixId}/>
|
||||||
<ReviewButton color="error" name="Reset Validating (fix softlocked status)" action="reset-validating" submissionId={submissionId}/>
|
<ReviewButton color="error" name="Reset Validating (fix softlocked status)" action="reset-validating" mapfixId={mapfixId}/>
|
||||||
</section>
|
</section>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import { SubmissionInfo, SubmissionStatusToString } from "@/app/ts/Submission";
|
import { MapfixInfo, MapfixStatusToString } from "@/app/ts/Mapfix";
|
||||||
import type { CreatorAndReviewStatus } from "./_comments";
|
import type { CreatorAndReviewStatus } from "./_comments";
|
||||||
import { MapImage } from "./_map";
|
import { MapImage } from "./_map";
|
||||||
import { useParams } from "next/navigation";
|
import { useParams } from "next/navigation";
|
||||||
@ -15,7 +15,7 @@ import { useState, useEffect } from "react";
|
|||||||
import "./(styles)/page.scss";
|
import "./(styles)/page.scss";
|
||||||
|
|
||||||
interface ReviewId {
|
interface ReviewId {
|
||||||
submissionId: string
|
mapfixId: string
|
||||||
}
|
}
|
||||||
|
|
||||||
function Ratings() {
|
function Ratings() {
|
||||||
@ -39,20 +39,20 @@ function Ratings() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function RatingArea(submission: ReviewId) {
|
function RatingArea(mapfix: ReviewId) {
|
||||||
return (
|
return (
|
||||||
<aside className="review-area">
|
<aside className="review-area">
|
||||||
<section className="map-image-area">
|
<section className="map-image-area">
|
||||||
<MapImage/>
|
<MapImage/>
|
||||||
</section>
|
</section>
|
||||||
<Ratings/>
|
<Ratings/>
|
||||||
<ReviewButtons submissionId={submission.submissionId}/>
|
<ReviewButtons mapfixId={mapfix.mapfixId}/>
|
||||||
</aside>
|
</aside>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function TitleAndComments(stats: CreatorAndReviewStatus) {
|
function TitleAndComments(stats: CreatorAndReviewStatus) {
|
||||||
const Review = SubmissionStatusToString(stats.review)
|
const Review = MapfixStatusToString(stats.review)
|
||||||
|
|
||||||
// TODO: hide status message when status is not "Accepted"
|
// TODO: hide status message when status is not "Accepted"
|
||||||
return (
|
return (
|
||||||
@ -72,22 +72,22 @@ function TitleAndComments(stats: CreatorAndReviewStatus) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function SubmissionInfoPage() {
|
export default function MapfixInfoPage() {
|
||||||
const dynamicId = useParams<{submissionId: string}>()
|
const dynamicId = useParams<{mapfixId: string}>()
|
||||||
|
|
||||||
const [submission, setSubmission] = useState<SubmissionInfo | null>(null)
|
const [mapfix, setMapfix] = useState<MapfixInfo | null>(null)
|
||||||
|
|
||||||
useEffect(() => { // needs to be client sided since server doesn't have a session, nextjs got mad at me for exporting an async function: (https://nextjs.org/docs/messages/no-async-client-component)
|
useEffect(() => { // needs to be client sided since server doesn't have a session, nextjs got mad at me for exporting an async function: (https://nextjs.org/docs/messages/no-async-client-component)
|
||||||
async function getSubmission() {
|
async function getMapfix() {
|
||||||
const res = await fetch(`/api/submissions/${dynamicId.submissionId}`)
|
const res = await fetch(`/api/mapfixes/${dynamicId.mapfixId}`)
|
||||||
if (res.ok) {
|
if (res.ok) {
|
||||||
setSubmission(await res.json())
|
setMapfix(await res.json())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getSubmission()
|
getMapfix()
|
||||||
}, [dynamicId.submissionId])
|
}, [dynamicId.mapfixId])
|
||||||
|
|
||||||
if (!submission) {
|
if (!mapfix) {
|
||||||
return <Webpage>
|
return <Webpage>
|
||||||
{/* TODO: Add skeleton loading thingy ? Maybe ? (https://mui.com/material-ui/react-skeleton/) */}
|
{/* TODO: Add skeleton loading thingy ? Maybe ? (https://mui.com/material-ui/react-skeleton/) */}
|
||||||
</Webpage>
|
</Webpage>
|
||||||
@ -96,8 +96,8 @@ export default function SubmissionInfoPage() {
|
|||||||
<Webpage>
|
<Webpage>
|
||||||
<main className="map-page-main">
|
<main className="map-page-main">
|
||||||
<section className="review-section">
|
<section className="review-section">
|
||||||
<RatingArea submissionId={dynamicId.submissionId}/>
|
<RatingArea mapfixId={dynamicId.mapfixId}/>
|
||||||
<TitleAndComments name={submission.DisplayName} creator={submission.Creator} review={submission.StatusID} status_message={submission.StatusMessage} asset_id={submission.AssetID} comments={[]}/>
|
<TitleAndComments name={mapfix.DisplayName} creator={mapfix.Creator} review={mapfix.StatusID} status_message={mapfix.StatusMessage} asset_id={mapfix.AssetID} comments={[]}/>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
</Webpage>
|
</Webpage>
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import React, { useState, useEffect } from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
import { SubmissionInfo } from "../ts/Submission";
|
import { MapfixInfo } from "../ts/Mapfix";
|
||||||
import SubmissionCard from "./_card";
|
import MapfixCard from "./_card";
|
||||||
import Webpage from "@/app/_components/webpage";
|
import Webpage from "@/app/_components/webpage";
|
||||||
|
|
||||||
import "./(styles)/page.scss";
|
import "./(styles)/page.scss";
|
||||||
|
|
||||||
export default function SubmissionInfoPage() {
|
export default function MapfixInfoPage() {
|
||||||
const [submissions, setSubmissions] = useState<SubmissionInfo[]>([])
|
const [mapfixes, setMapfixes] = useState<MapfixInfo[]>([])
|
||||||
const [currentPage, setCurrentPage] = useState(0);
|
const [currentPage, setCurrentPage] = useState(0);
|
||||||
const cardsPerPage = 24; // built to fit on a 1920x1080 monitor
|
const cardsPerPage = 24; // built to fit on a 1920x1080 monitor
|
||||||
|
|
||||||
const totalPages = Math.ceil(submissions.length / cardsPerPage);
|
const totalPages = Math.ceil(mapfixes.length / cardsPerPage);
|
||||||
|
|
||||||
const currentCards = submissions.slice(
|
const currentCards = mapfixes.slice(
|
||||||
currentPage * cardsPerPage,
|
currentPage * cardsPerPage,
|
||||||
(currentPage + 1) * cardsPerPage
|
(currentPage + 1) * cardsPerPage
|
||||||
);
|
);
|
||||||
@ -32,19 +32,19 @@ export default function SubmissionInfoPage() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
async function fetchSubmissions() {
|
async function fetchMapfixes() {
|
||||||
const res = await fetch('/api/submissions?Page=1&Limit=100')
|
const res = await fetch('/api/mapfixes?Page=1&Limit=100')
|
||||||
if (res.ok) {
|
if (res.ok) {
|
||||||
setSubmissions(await res.json())
|
setMapfixes(await res.json())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
fetchSubmissions()
|
fetchMapfixes()
|
||||||
}, 50);
|
}, 50);
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
if (!submissions) {
|
if (!mapfixes) {
|
||||||
return <Webpage>
|
return <Webpage>
|
||||||
<main>
|
<main>
|
||||||
Loading...
|
Loading...
|
||||||
@ -52,10 +52,10 @@ export default function SubmissionInfoPage() {
|
|||||||
</Webpage>
|
</Webpage>
|
||||||
}
|
}
|
||||||
|
|
||||||
if (submissions && submissions.length == 0) {
|
if (mapfixes && mapfixes.length == 0) {
|
||||||
return <Webpage>
|
return <Webpage>
|
||||||
<main>
|
<main>
|
||||||
Submissions list is empty.
|
Mapfixes list is empty.
|
||||||
</main>
|
</main>
|
||||||
</Webpage>
|
</Webpage>
|
||||||
}
|
}
|
||||||
@ -93,14 +93,14 @@ export default function SubmissionInfoPage() {
|
|||||||
<button onClick={nextPage} disabled={currentPage === totalPages - 1}>></button>
|
<button onClick={nextPage} disabled={currentPage === totalPages - 1}>></button>
|
||||||
</div>
|
</div>
|
||||||
<div className="grid">
|
<div className="grid">
|
||||||
{currentCards.map((submission) => (
|
{currentCards.map((mapfix) => (
|
||||||
<SubmissionCard
|
<MapfixCard
|
||||||
key={submission.ID}
|
key={mapfix.ID}
|
||||||
id={submission.ID}
|
id={mapfix.ID}
|
||||||
assetId={submission.AssetID}
|
assetId={mapfix.AssetID}
|
||||||
displayName={submission.DisplayName}
|
displayName={mapfix.DisplayName}
|
||||||
author={submission.Creator}
|
author={mapfix.Creator}
|
||||||
rating={submission.StatusID}
|
rating={mapfix.StatusID}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
@ -27,8 +27,8 @@ interface MapfixInfo {
|
|||||||
readonly StatusMessage: string,
|
readonly StatusMessage: string,
|
||||||
}
|
}
|
||||||
|
|
||||||
function MapfixStatusToString(submission_status: MapfixStatus): string {
|
function MapfixStatusToString(mapfix_status: MapfixStatus): string {
|
||||||
switch (submission_status) {
|
switch (mapfix_status) {
|
||||||
case MapfixStatus.Rejected:
|
case MapfixStatus.Rejected:
|
||||||
return "REJECTED"
|
return "REJECTED"
|
||||||
case MapfixStatus.Uploading:
|
case MapfixStatus.Uploading:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user