implement get mission gql query and replace TE Accordion with TW Material Accordion
This commit is contained in:
@@ -15,8 +15,6 @@ const AgentsPage = () => {
|
|||||||
|
|
||||||
const { loading, error, data } = useQuery(GET_AGENTS);
|
const { loading, error, data } = useQuery(GET_AGENTS);
|
||||||
|
|
||||||
console.log({ loading, error, data });
|
|
||||||
|
|
||||||
if (loading) {
|
if (loading) {
|
||||||
return (
|
return (
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@@ -3,15 +3,34 @@
|
|||||||
import MissionModal from "@/components/modals/mission_modal";
|
import MissionModal from "@/components/modals/mission_modal";
|
||||||
import { missions } from "@/data/data";
|
import { missions } from "@/data/data";
|
||||||
import { Mission } from "@/types/mission";
|
import { Mission } from "@/types/mission";
|
||||||
|
import { GET_MISSIONS } from "@/utils/graphql_queries";
|
||||||
|
import { useQuery } from "@apollo/client";
|
||||||
|
import { Button } from "@material-tailwind/react";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
|
||||||
const MissionsPage = () => {
|
const MissionsPage = () => {
|
||||||
const [showModal, setShowModal] = useState(false);
|
const [showModal, setShowModal] = useState(false);
|
||||||
|
|
||||||
const [selectedMission, setSelectedMission] = useState<Mission | null>(null);
|
const [selectedMission, setSelectedMission] = useState<Mission | null>(null);
|
||||||
|
|
||||||
|
const { loading, error, data } = useQuery(GET_MISSIONS);
|
||||||
|
|
||||||
|
if (loading) {
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
variant="text"
|
||||||
|
loading={true}
|
||||||
|
placeholder={"Loading"}
|
||||||
|
className="text-white"
|
||||||
|
>
|
||||||
|
Loading
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="container m-auto flex flex-wrap flex-col md:flex-row items-center justify-start p-2">
|
<div className="container m-auto flex flex-wrap flex-col md:flex-row items-center justify-start p-2">
|
||||||
{missions.map((mission, i) => (
|
{data?.missions.map((mission: Mission, i: number) => (
|
||||||
<div key={i} className=" w-full lg:w-1/2 p-3">
|
<div key={i} className=" w-full lg:w-1/2 p-3">
|
||||||
<div
|
<div
|
||||||
className="bg-indigo-600 text-white rounded shadow-xl p-3 cursor-pointer"
|
className="bg-indigo-600 text-white rounded shadow-xl p-3 cursor-pointer"
|
||||||
|
|||||||
@@ -12,14 +12,12 @@ import {
|
|||||||
TEModalBody,
|
TEModalBody,
|
||||||
TEModalFooter,
|
TEModalFooter,
|
||||||
TEInput,
|
TEInput,
|
||||||
TETextarea,
|
|
||||||
TESelect,
|
TESelect,
|
||||||
} from "tw-elements-react";
|
} from "tw-elements-react";
|
||||||
import Switch from "../inputs/switch";
|
import Switch from "../inputs/switch";
|
||||||
import { Mission } from "@/types/mission";
|
import { Mission } from "@/types/mission";
|
||||||
import { Collapse, initTE } from "tw-elements";
|
|
||||||
import AccordionItem from "../ui/accordion_item";
|
|
||||||
import MissionTaskEditor from "../inputs/mission_tasks_editor";
|
import MissionTaskEditor from "../inputs/mission_tasks_editor";
|
||||||
|
import { TasksAccordion } from "../ui/tasks_accordions";
|
||||||
|
|
||||||
export default function MissionModal(props: {
|
export default function MissionModal(props: {
|
||||||
mission: Mission | null;
|
mission: Mission | null;
|
||||||
@@ -36,10 +34,6 @@ export default function MissionModal(props: {
|
|||||||
setTempMission(mission);
|
setTempMission(mission);
|
||||||
}, [mission]);
|
}, [mission]);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
initTE({ Collapse });
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<TEModal show={showModal} setShow={setShowModal}>
|
<TEModal show={showModal} setShow={setShowModal}>
|
||||||
@@ -162,22 +156,7 @@ export default function MissionModal(props: {
|
|||||||
<div>
|
<div>
|
||||||
{mission?.tasks ? (
|
{mission?.tasks ? (
|
||||||
<div>
|
<div>
|
||||||
{mission.tasks.map((task, i) => (
|
<TasksAccordion tasks={mission.tasks} />
|
||||||
<AccordionItem
|
|
||||||
key={i}
|
|
||||||
id={`task${i}`}
|
|
||||||
title={task.name}
|
|
||||||
description={task.description}
|
|
||||||
moreInfo={
|
|
||||||
<div className="ml-3">
|
|
||||||
<strong>Agent: </strong>
|
|
||||||
<span className="bg-gray-200 text-gray-700 rounded-full px-3 py-1 text-sm font-semibold m-1 sm:w-1/2">
|
|
||||||
{task.agent?.role}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
|
|
||||||
export default function AccordionItem(props: {
|
|
||||||
key: any;
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
description: string;
|
|
||||||
moreInfo?: any;
|
|
||||||
}) {
|
|
||||||
const { key, id, title, description, moreInfo } = props;
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
key={key}
|
|
||||||
className="rounded-t-lg border border-neutral-200 bg-white dark:border-neutral-600 dark:bg-neutral-800"
|
|
||||||
>
|
|
||||||
<h2 className="mb-0" id="headingOne">
|
|
||||||
<button
|
|
||||||
className="group relative flex w-full items-center rounded-t-[15px] border-0 bg-white px-5 py-4 text-left text-base text-neutral-800 transition [overflow-anchor:none] hover:z-[2] focus:z-[3] focus:outline-none dark:bg-neutral-800 dark:text-white [&:not([data-te-collapse-collapsed])]:bg-white [&:not([data-te-collapse-collapsed])]:text-primary [&:not([data-te-collapse-collapsed])]:[box-shadow:inset_0_-1px_0_rgba(229,231,235)] dark:[&:not([data-te-collapse-collapsed])]:bg-neutral-800 dark:[&:not([data-te-collapse-collapsed])]:text-primary-400 dark:[&:not([data-te-collapse-collapsed])]:[box-shadow:inset_0_-1px_0_rgba(75,85,99)]"
|
|
||||||
type="button"
|
|
||||||
data-te-collapse-init
|
|
||||||
data-te-target={`#${id}`}
|
|
||||||
aria-expanded="true"
|
|
||||||
aria-controls={`id`}
|
|
||||||
>
|
|
||||||
{title}
|
|
||||||
<span className="ml-auto h-5 w-5 shrink-0 rotate-[-180deg] fill-[#336dec] transition-transform duration-200 ease-in-out group-[[data-te-collapse-collapsed]]:rotate-0 group-[[data-te-collapse-collapsed]]:fill-[#212529] motion-reduce:transition-none dark:fill-blue-300 dark:group-[[data-te-collapse-collapsed]]:fill-white"></span>
|
|
||||||
</button>
|
|
||||||
</h2>
|
|
||||||
<div id={id} className="!visible hidden my-1 py-1" data-te-collapse-item>
|
|
||||||
<div className="px-5 py-4">{description}</div>
|
|
||||||
{moreInfo ?? null}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
41
src/components/ui/tasks_accordions.tsx
Normal file
41
src/components/ui/tasks_accordions.tsx
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import React from "react";
|
||||||
|
import {
|
||||||
|
Accordion,
|
||||||
|
AccordionHeader,
|
||||||
|
AccordionBody,
|
||||||
|
} from "@material-tailwind/react";
|
||||||
|
import { Task } from "@/types/task";
|
||||||
|
|
||||||
|
export function TasksAccordion({ tasks }: { tasks: Array<Task> }) {
|
||||||
|
const [open, setOpen] = React.useState(0);
|
||||||
|
|
||||||
|
const handleOpen = (value: number) => setOpen(open === value ? 0 : value);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{tasks.map((task, i) => (
|
||||||
|
<Accordion
|
||||||
|
open={open === i}
|
||||||
|
className="mb-2 rounded-lg border border-blue-gray-100 px-4"
|
||||||
|
placeholder={undefined}
|
||||||
|
>
|
||||||
|
<AccordionHeader
|
||||||
|
onClick={() => handleOpen(i)}
|
||||||
|
className={`border-b-0 transition-colors ${open === i ? "text-blue-500 hover:!text-blue-700" : "text-gray-400 hover:!text-gray-300"}`}
|
||||||
|
placeholder={undefined}
|
||||||
|
>
|
||||||
|
{task.name}
|
||||||
|
</AccordionHeader>
|
||||||
|
<AccordionBody className="pt-0 text-base font-normal">
|
||||||
|
<div className="mb-3">
|
||||||
|
<span className="bg-gray-200 text-gray-700 rounded-full px-3 py-1 text-sm font-semibold m-1 sm:w-1/2">
|
||||||
|
{task.agent?.role}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div>{task.description}</div>
|
||||||
|
</AccordionBody>
|
||||||
|
</Accordion>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user