Add filtering Classes and Courses by tag

This commit is contained in:
2022-01-28 07:47:25 +00:00
parent 14f3e46586
commit da510f2ab4
5 changed files with 134 additions and 28 deletions
+58 -2
View File
@@ -1,17 +1,35 @@
import React, { useState, useEffect } from 'react';
import { BrowserRouter as Router, Switch, Route, Link, useParams } from 'react-router-dom';
import './light.css';
import { Container, Divider, Dropdown, Form, Grid, Header, Icon, Image, Menu, Message, Segment, Table } from 'semantic-ui-react';
import { Button, Label, Container, Divider, Dropdown, Form, Grid, Header, Icon, Image, Menu, Message, Segment, Table } from 'semantic-ui-react';
import moment from 'moment-timezone';
import { isInstructor, getInstructor, requester } from './utils.js';
import { NotFound, PleaseLogin } from './Misc.js';
import { InstructorCourseList, InstructorCourseDetail } from './InstructorCourses.js';
import { InstructorClassList } from './InstructorClasses.js';
export const tags = {
Protospace: 'black',
Laser: 'red',
CNC: 'orange',
Niche: 'yellow',
//name: 'olive',
Electronics: 'green',
Computers: 'teal',
Metal: 'blue',
//name: 'violet',
Event: 'purple',
Outing: 'pink',
Wood: 'brown',
Misc: 'grey',
};
let courseCache = false;
let tagFilterCache = false;
export function Courses(props) {
const [courses, setCourses] = useState(courseCache);
const [tagFilter, setTagFilter] = useState(tagFilterCache);
const { token, user } = props;
useEffect(() => {
@@ -25,6 +43,8 @@ export function Courses(props) {
});
}, []);
const byTag = (x) => tagFilter ? x.tags.includes(tagFilter) : true;
return (
<Container>
<Header size='large'>Courses</Header>
@@ -33,6 +53,35 @@ export function Courses(props) {
<InstructorCourseList courses={courses} setCourses={setCourses} {...props} />
</Segment>}
<p>
Filter by tag:
<div className='coursetags'>
{Object.entries(tags).map(([name, color]) =>
<Label
onClick={() => {
setTagFilter(name);
tagFilterCache = name;
}}
as='a'
color={color}
tag
>
{name}
</Label>
)}
</div>
</p>
<p>
{tagFilter && <Button
onClick={() => {
setTagFilter(false);
tagFilterCache = false;
}}
>
Clear {tagFilter} filter
</Button>}
</p>
{courses ?
<Table basic='very'>
<Table.Header>
@@ -43,10 +92,17 @@ export function Courses(props) {
<Table.Body>
{courses.length ?
courses.map(x =>
courses.filter(byTag).map(x =>
<Table.Row key={x.id}>
<Table.Cell>
<Link to={'/courses/'+x.id}>{x.name}</Link>
<span style={{ marginLeft: '2rem' }}>
{!!x.tags && x.tags.split(',').map(name =>
<Label color={tags[name]} tag>
{name}
</Label>
)}
</span>
</Table.Cell>
</Table.Row>
)