mirror of
https://github.com/rjNemo/ticket_manager
synced 2026-06-12 11:46:40 +00:00
FInished NewTicketForm layout
This commit is contained in:
parent
9e89955b1c
commit
d11ed699a0
11 changed files with 170 additions and 39 deletions
50
client/src/components/MemberList.tsx
Normal file
50
client/src/components/MemberList.tsx
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
import React, { FC, useState, ChangeEvent, MouseEvent } from "react";
|
||||||
|
import { TabRouterHeader } from "./TabRouterHeader";
|
||||||
|
import { TicketList } from "./TicketList";
|
||||||
|
import { FileList } from "./AppFileList";
|
||||||
|
import { Ticket } from "../types/Ticket";
|
||||||
|
import { AppFile } from "../types/AppFile";
|
||||||
|
import { Route, useRouteMatch, Redirect } from "react-router-dom";
|
||||||
|
import { ActivityList } from "./ActivityList";
|
||||||
|
import { Activity } from "../types/Activity";
|
||||||
|
import { NewTicketModal } from "./NewTicketModal";
|
||||||
|
import { User } from "../types/User";
|
||||||
|
import { UsersModalEntry } from "./UsersModalEntry";
|
||||||
|
import { FilterBar } from "./FilterBar";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
users: User[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const MemberList: FC<IProps> = ({ users }) => {
|
||||||
|
const [members, setMembers] = useState<User[]>([]);
|
||||||
|
const [filterText, setFilterText] = useState<string>("");
|
||||||
|
const clearFilterText: (e: MouseEvent) => void = (e: MouseEvent) => {
|
||||||
|
setFilterText("");
|
||||||
|
};
|
||||||
|
const handleChange: (e: ChangeEvent<HTMLInputElement>) => void = (
|
||||||
|
e: ChangeEvent<HTMLInputElement>
|
||||||
|
) => {
|
||||||
|
setFilterText(e.target.value);
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<FilterBar
|
||||||
|
filterText={filterText}
|
||||||
|
clearFilterText={clearFilterText}
|
||||||
|
handleChange={handleChange}
|
||||||
|
/>
|
||||||
|
<ul>
|
||||||
|
{users.map((u: User) => (
|
||||||
|
<li key={u.id}>
|
||||||
|
<UsersModalEntry
|
||||||
|
user={u}
|
||||||
|
members={members}
|
||||||
|
setMembers={setMembers}
|
||||||
|
/>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
43
client/src/components/NewTicketForm.tsx
Normal file
43
client/src/components/NewTicketForm.tsx
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
import React, { FC } from "react";
|
||||||
|
|
||||||
|
interface IProps {}
|
||||||
|
|
||||||
|
export const NewTicketForm: FC<IProps> = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="row">
|
||||||
|
<div className="input-field">
|
||||||
|
<i className="material-icons prefix">note_add</i>
|
||||||
|
<input id="title" type="text" className="validate" />
|
||||||
|
<label htmlFor="title">Title</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="input-field">
|
||||||
|
<i className="material-icons prefix">mode_edit</i>
|
||||||
|
<textarea
|
||||||
|
id="description"
|
||||||
|
className="materialize-textarea validate"
|
||||||
|
></textarea>
|
||||||
|
<label htmlFor="description">Description</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="input-field">
|
||||||
|
<i className="material-icons prefix">date_range</i>
|
||||||
|
<input id="Due Date" type="text" className="datepicker" />
|
||||||
|
<label htmlFor="Due Date">Due Date</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="input-field">
|
||||||
|
<select id="project" className="browser-default">
|
||||||
|
<option value="" disabled selected>
|
||||||
|
Project
|
||||||
|
</option>
|
||||||
|
<option value="1">Option 1</option>
|
||||||
|
<option value="2">Option 2</option>
|
||||||
|
<option value="3">Option 3</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
@ -9,19 +9,20 @@ import { Constants } from "../utils/Constants";
|
||||||
import { UsersModalEntry } from "./UsersModalEntry";
|
import { UsersModalEntry } from "./UsersModalEntry";
|
||||||
import { useParams } from "react-router-dom";
|
import { useParams } from "react-router-dom";
|
||||||
import _ from "underscore";
|
import _ from "underscore";
|
||||||
|
import { NewTicketTabRouter } from "./NewTicketTabRouter";
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
show: boolean;
|
show: boolean;
|
||||||
handleClose(): void;
|
handleClose(): void;
|
||||||
// users: User[];
|
// users: User[];
|
||||||
// allUsers: User[];
|
allUsers: User[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const NewTicketModal: FC<IProps> = ({
|
export const NewTicketModal: FC<IProps> = ({
|
||||||
show,
|
show,
|
||||||
handleClose
|
handleClose,
|
||||||
// users,
|
// users,
|
||||||
// allUsers
|
allUsers
|
||||||
}) => {
|
}) => {
|
||||||
const [filterText, setFilterText] = useState<string>("");
|
const [filterText, setFilterText] = useState<string>("");
|
||||||
// const [members, setMembers] = useState<User[]>(users);
|
// const [members, setMembers] = useState<User[]>(users);
|
||||||
|
|
@ -48,26 +49,24 @@ export const NewTicketModal: FC<IProps> = ({
|
||||||
useEffect(() => {});
|
useEffect(() => {});
|
||||||
return (
|
return (
|
||||||
<Modal show={show} handleClose={handleClose}>
|
<Modal show={show} handleClose={handleClose}>
|
||||||
<div className="row valign-wrapper blue">
|
<div className="row valign-wrapper indigo">
|
||||||
<div className="col s10">
|
<div className="col s10">
|
||||||
<h4 className="white-text">New Ticket</h4>
|
<h4 className="white-text">New Ticket</h4>
|
||||||
</div>
|
</div>
|
||||||
<div className="col s2">
|
<div className="col s2">
|
||||||
<i
|
<i
|
||||||
className="right material-icons blue lighten-3 circle"
|
className="right material-icons indigo lighten-3 circle"
|
||||||
onClick={handleClose}
|
onClick={handleClose}
|
||||||
>
|
>
|
||||||
close
|
close
|
||||||
</i>
|
</i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="center">
|
<div className="row">
|
||||||
{/* <AvatarList users={users} /> */}
|
<NewTicketTabRouter
|
||||||
{/* <FilterBar
|
tabNames={["Details", "Members"]}
|
||||||
filterText={filterText}
|
users={allUsers}
|
||||||
clearFilterText={() => setFilterText("")}
|
/>
|
||||||
handleChange={handleChange}
|
|
||||||
/> */}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit}>
|
||||||
|
|
@ -82,11 +81,11 @@ export const NewTicketModal: FC<IProps> = ({
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul> */}
|
</ul> */}
|
||||||
<div className="modal-footer">
|
<div className="modal-footer grey lighten-3">
|
||||||
<input
|
<input
|
||||||
type="submit"
|
type="submit"
|
||||||
className="modal-close waves-effect waves-green btn"
|
className="modal-close waves-effect waves-green btn indigo"
|
||||||
value="Done"
|
value="Create Task"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
||||||
34
client/src/components/NewTicketTabRouter.tsx
Normal file
34
client/src/components/NewTicketTabRouter.tsx
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
import React, { FC } from "react";
|
||||||
|
import { Route, useRouteMatch, Redirect } from "react-router-dom";
|
||||||
|
import { TabRouterHeader } from "./TabRouterHeader";
|
||||||
|
import { NewTicketForm } from "./NewTicketForm";
|
||||||
|
import { MemberList } from "./MemberList";
|
||||||
|
import { User } from "../types/User";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
tabNames: string[];
|
||||||
|
users: User[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const NewTicketTabRouter: FC<IProps> = ({ tabNames, users }) => {
|
||||||
|
const { url } = useRouteMatch();
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="row">
|
||||||
|
<TabRouterHeader tabNames={tabNames} />
|
||||||
|
|
||||||
|
<Redirect from={url} to={`${url}/details`} />
|
||||||
|
|
||||||
|
<form onSubmit={() => {}}>
|
||||||
|
<Route path={`${url}/details`}>
|
||||||
|
<NewTicketForm />
|
||||||
|
</Route>
|
||||||
|
|
||||||
|
<Route path={`${url}/members`}>
|
||||||
|
<MemberList users={users} />
|
||||||
|
</Route>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
@ -4,9 +4,8 @@ import { FloatingButton } from "./FloatingButton";
|
||||||
import { HorizontalCard } from "./HorizontalCard";
|
import { HorizontalCard } from "./HorizontalCard";
|
||||||
import { FilterBar } from "./FilterBar";
|
import { FilterBar } from "./FilterBar";
|
||||||
import { put } from "../utils/http";
|
import { put } from "../utils/http";
|
||||||
import { HttpResponse } from "../types/HttpResponse";
|
|
||||||
import { Constants } from "../utils/Constants";
|
import { Constants } from "../utils/Constants";
|
||||||
import { NewTicketModal } from "./NewTicketModal";
|
import { HttpResponse } from "../types/HttpResponse";
|
||||||
import { Project } from "../types/Project";
|
import { Project } from "../types/Project";
|
||||||
|
|
||||||
type IProps = {
|
type IProps = {
|
||||||
|
|
@ -39,12 +38,13 @@ export const ProjectList: FC<IProps> = ({ projects }) => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="row valign-wrapper">
|
<div className="row valign-wrapper">
|
||||||
<NewTicketModal
|
{/* <NewTicketModal
|
||||||
handleClose={() => {
|
handleClose={() => {
|
||||||
setShowNew(false);
|
setShowNew(false);
|
||||||
}}
|
}}
|
||||||
show={showNew}
|
show={showNew}
|
||||||
/>
|
allUsers={users}
|
||||||
|
/> */}
|
||||||
<h3>Projects</h3>
|
<h3>Projects</h3>
|
||||||
<FloatingButton
|
<FloatingButton
|
||||||
color="indigo lighten-1"
|
color="indigo lighten-1"
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import { Route, useRouteMatch, Redirect } from "react-router-dom";
|
||||||
import { ActivityList } from "./ActivityList";
|
import { ActivityList } from "./ActivityList";
|
||||||
import { Activity } from "../types/Activity";
|
import { Activity } from "../types/Activity";
|
||||||
import { NewTicketModal } from "./NewTicketModal";
|
import { NewTicketModal } from "./NewTicketModal";
|
||||||
|
import { User } from "../types/User";
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
tickets: Ticket[];
|
tickets: Ticket[];
|
||||||
|
|
@ -15,13 +16,15 @@ interface IProps {
|
||||||
tabNames: string[];
|
tabNames: string[];
|
||||||
files: AppFile[];
|
files: AppFile[];
|
||||||
activities: Activity[];
|
activities: Activity[];
|
||||||
|
allUsers: User[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const TabRouter: FC<IProps> = ({
|
export const TabRouter: FC<IProps> = ({
|
||||||
tickets,
|
tickets,
|
||||||
tabNames,
|
tabNames,
|
||||||
files,
|
files,
|
||||||
activities
|
activities,
|
||||||
|
allUsers
|
||||||
}) => {
|
}) => {
|
||||||
const { url } = useRouteMatch();
|
const { url } = useRouteMatch();
|
||||||
|
|
||||||
|
|
@ -33,7 +36,7 @@ export const TabRouter: FC<IProps> = ({
|
||||||
<Redirect from={url} to={`${url}/tickets`} />
|
<Redirect from={url} to={`${url}/tickets`} />
|
||||||
|
|
||||||
<Route path={`${url}/tickets`}>
|
<Route path={`${url}/tickets`}>
|
||||||
<TicketList tickets={tickets} />
|
<TicketList tickets={tickets} users={allUsers} />
|
||||||
</Route>
|
</Route>
|
||||||
|
|
||||||
<Route path={`${url}/files`}>
|
<Route path={`${url}/files`}>
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,12 @@ interface IProps {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const TabRouterHeader: FC<IProps> = ({
|
export const TabRouterHeader: FC<IProps> = ({
|
||||||
tabClass = "tab col s4",
|
tabNames,
|
||||||
tabNames
|
tabClass = `tab col s${12 / tabNames.length}`
|
||||||
}) => {
|
}) => {
|
||||||
const [isActive, setIsActive] = useState(0);
|
const [isActive, setIsActive] = useState(0);
|
||||||
const nTabs = tabNames.length;
|
const nTabs = tabNames.length;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<ul className="tabs">
|
<ul className="tabs">
|
||||||
|
|
|
||||||
|
|
@ -3,16 +3,18 @@ import { Ticket } from "../types/Ticket";
|
||||||
import { FloatingButton } from "./FloatingButton";
|
import { FloatingButton } from "./FloatingButton";
|
||||||
import { HorizontalCard } from "./HorizontalCard";
|
import { HorizontalCard } from "./HorizontalCard";
|
||||||
import { FilterBar } from "./FilterBar";
|
import { FilterBar } from "./FilterBar";
|
||||||
import { put } from "../utils/http";
|
import { User } from "../types/User";
|
||||||
import { HttpResponse } from "../types/HttpResponse";
|
import { HttpResponse } from "../types/HttpResponse";
|
||||||
|
import { put } from "../utils/http";
|
||||||
import { Constants } from "../utils/Constants";
|
import { Constants } from "../utils/Constants";
|
||||||
import { NewTicketModal } from "./NewTicketModal";
|
import { NewTicketModal } from "./NewTicketModal";
|
||||||
|
|
||||||
type TicketListProps = {
|
type TicketListProps = {
|
||||||
tickets: Ticket[];
|
tickets: Ticket[];
|
||||||
|
users: User[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export const TicketList: FC<TicketListProps> = ({ tickets }) => {
|
export const TicketList: FC<TicketListProps> = ({ tickets, users }) => {
|
||||||
const [filterText, setFilterText] = useState<string>("");
|
const [filterText, setFilterText] = useState<string>("");
|
||||||
const clearFilterText: (e: MouseEvent) => void = (e: MouseEvent) => {
|
const clearFilterText: (e: MouseEvent) => void = (e: MouseEvent) => {
|
||||||
setFilterText("");
|
setFilterText("");
|
||||||
|
|
@ -43,10 +45,11 @@ export const TicketList: FC<TicketListProps> = ({ tickets }) => {
|
||||||
setShowNew(false);
|
setShowNew(false);
|
||||||
}}
|
}}
|
||||||
show={showNew}
|
show={showNew}
|
||||||
|
allUsers={users}
|
||||||
/>
|
/>
|
||||||
<h3>Tickets</h3>
|
<h3>Tickets</h3>
|
||||||
<FloatingButton
|
<FloatingButton
|
||||||
color="indigo lighten-1"
|
color="indigo lighten-3"
|
||||||
size="small"
|
size="small"
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,10 @@
|
||||||
import React, { FC } from "react";
|
import React, { FC } from "react";
|
||||||
|
import { Route, useRouteMatch, Redirect } from "react-router-dom";
|
||||||
import { TabRouterHeader } from "./TabRouterHeader";
|
import { TabRouterHeader } from "./TabRouterHeader";
|
||||||
import { TicketList } from "./TicketList";
|
import { TicketList } from "./TicketList";
|
||||||
|
|
||||||
import { Ticket } from "../types/Ticket";
|
|
||||||
|
|
||||||
import { Route, useRouteMatch, Redirect } from "react-router-dom";
|
|
||||||
|
|
||||||
import { Project } from "../types/Project";
|
|
||||||
import { ProjectList } from "./ProjectList";
|
import { ProjectList } from "./ProjectList";
|
||||||
|
import { Ticket } from "../types/Ticket";
|
||||||
|
import { Project } from "../types/Project";
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
tabNames: string[];
|
tabNames: string[];
|
||||||
|
|
@ -29,9 +26,9 @@ export const UserTabRouter: FC<IProps> = ({ tickets, tabNames, projects }) => {
|
||||||
<ProjectList projects={projects} />
|
<ProjectList projects={projects} />
|
||||||
</Route>
|
</Route>
|
||||||
|
|
||||||
<Route path={`${url}/tickets`}>
|
{/* <Route path={`${url}/tickets`}>
|
||||||
<TicketList tickets={tickets} />
|
<TicketList tickets={tickets} />
|
||||||
</Route>
|
</Route> */}
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -45,13 +45,13 @@ export const UsersModal: FC<IProps> = ({
|
||||||
useEffect(() => {});
|
useEffect(() => {});
|
||||||
return (
|
return (
|
||||||
<Modal show={show} handleClose={handleClose}>
|
<Modal show={show} handleClose={handleClose}>
|
||||||
<div className="row valign-wrapper blue">
|
<div className="row valign-wrapper indigo">
|
||||||
<div className="col s10">
|
<div className="col s10">
|
||||||
<h4 className="white-text">Manage users</h4>
|
<h4 className="white-text">Manage users</h4>
|
||||||
</div>
|
</div>
|
||||||
<div className="col s2">
|
<div className="col s2">
|
||||||
<i
|
<i
|
||||||
className="right material-icons blue lighten-3 circle"
|
className="right material-icons indigo lighten-3 circle"
|
||||||
onClick={handleClose}
|
onClick={handleClose}
|
||||||
>
|
>
|
||||||
close
|
close
|
||||||
|
|
@ -79,10 +79,10 @@ export const UsersModal: FC<IProps> = ({
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
<div className="modal-footer">
|
<div className="modal-footer grey lighten-3">
|
||||||
<input
|
<input
|
||||||
type="submit"
|
type="submit"
|
||||||
className="modal-close waves-effect waves-green btn"
|
className="modal-close waves-effect waves-green btn indigo"
|
||||||
value="Done"
|
value="Done"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ export const ProjectPage: FC<IProps> = ({ viewModel }) => {
|
||||||
<AvatarList users={users} />
|
<AvatarList users={users} />
|
||||||
<FloatingButton
|
<FloatingButton
|
||||||
icon="add"
|
icon="add"
|
||||||
color="indigo lighten-1"
|
color="indigo lighten-3"
|
||||||
size="small"
|
size="small"
|
||||||
onClick={() => setShowModal(true)}
|
onClick={() => setShowModal(true)}
|
||||||
/>
|
/>
|
||||||
|
|
@ -59,6 +59,7 @@ export const ProjectPage: FC<IProps> = ({ viewModel }) => {
|
||||||
tickets={tickets}
|
tickets={tickets}
|
||||||
files={files}
|
files={files}
|
||||||
activities={activities}
|
activities={activities}
|
||||||
|
allUsers={allUsers}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue