@@ -3,15 +3,16 @@ import { Col, ColProps, RowProps, Input, Label, Offcanvas, OffcanvasBody, Offcan
3
3
import partition from "lodash/partition" ;
4
4
import classNames from "classnames" ;
5
5
import { AssignmentDTO , ContentSummaryDTO , IsaacConceptPageDTO , QuestionDTO } from "../../../../IsaacApiTypes" ;
6
- import { above , AUDIENCE_DISPLAY_FIELDS , BoardCompletions , BoardCreators , BoardLimit , BoardViews , determineAudienceViews , filterAssignmentsByStatus , filterAudienceViewsByProperties , getDistinctAssignmentGroups , getDistinctAssignmentSetters , getThemeFromContextAndTags , isAda , isDefined , siteSpecific , stageLabelMap , useDeviceSize } from "../../../services" ;
6
+ import { above , AUDIENCE_DISPLAY_FIELDS , BOARD_ORDER_NAMES , BoardCompletions , BoardCreators , BoardLimit , BoardSubjects , BoardViews , determineAudienceViews , filterAssignmentsByStatus , filterAudienceViewsByProperties , getDistinctAssignmentGroups , getDistinctAssignmentSetters , getThemeFromContextAndTags , isAda , isDefined , siteSpecific , stageLabelMap , useDeviceSize } from "../../../services" ;
7
7
import { StageAndDifficultySummaryIcons } from "../StageAndDifficultySummaryIcons" ;
8
8
import { selectors , useAppSelector } from "../../../state" ;
9
9
import { Link } from "react-router-dom" ;
10
- import { Tag } from "../../../../IsaacAppTypes" ;
10
+ import { AssignmentBoardOrder , Tag } from "../../../../IsaacAppTypes" ;
11
11
import { AffixButton } from "../AffixButton" ;
12
12
import { getHumanContext } from "../../../services/pageContext" ;
13
13
import { AssignmentState } from "../../pages/MyAssignments" ;
14
14
import { ShowLoadingQuery } from "../../handlers/ShowLoadingQuery" ;
15
+ import { Spacer } from "../Spacer" ;
15
16
16
17
export const SidebarLayout = ( props : RowProps ) => {
17
18
const { className, ...rest } = props ;
@@ -418,14 +419,17 @@ export const MyGameboardsSidebar = (props: MyGameboardsSidebarProps) => {
418
419
onChange = { ( e : ChangeEvent < HTMLInputElement > ) => setBoardTitleFilter ( e . target . value ) }
419
420
/>
420
421
< div className = "section-divider" />
421
- < h5 className = "mb-4" > Display mode</ h5 >
422
- < Input type = "select" value = { displayMode } onChange = { e => setDisplayMode ( e . target . value as BoardViews ) } >
423
- { Object . values ( BoardViews ) . map ( view => < option key = { view } value = { view } > { view } </ option > ) }
424
- </ Input >
425
- < h5 className = "mt-4 mb-3" > Display limit</ h5 >
426
- < Input type = "select" value = { displayLimit } onChange = { e => setDisplayLimit ( e . target . value as BoardLimit ) } >
427
- { Object . values ( BoardLimit ) . map ( limit => < option key = { limit } value = { limit } > { limit } </ option > ) }
428
- </ Input >
422
+ < h5 className = "mb-4" > Display</ h5 >
423
+ < div className = "d-flex" >
424
+ < Input className = "w-auto" type = "select" value = { displayMode } onChange = { e => setDisplayMode ( e . target . value as BoardViews ) } >
425
+ { Object . values ( BoardViews ) . map ( view => < option key = { view } value = { view } > { view } </ option > ) }
426
+ </ Input >
427
+ < Spacer />
428
+ < div className = "select-pretext" > Limit:</ div >
429
+ < Input className = "w-auto" type = "select" value = { displayLimit } onChange = { e => setDisplayLimit ( e . target . value as BoardLimit ) } >
430
+ { Object . values ( BoardLimit ) . map ( limit => < option key = { limit } value = { limit } > { limit } </ option > ) }
431
+ </ Input >
432
+ </ div >
429
433
< h5 className = "mt-4 mb-3" > Filter by creator</ h5 >
430
434
< Input type = "select" value = { boardCreatorFilter } onChange = { e => setBoardCreatorFilter ( e . target . value as BoardCreators ) } >
431
435
{ Object . values ( BoardCreators ) . map ( creator => < option key = { creator } value = { creator } > { creator } </ option > ) }
@@ -436,10 +440,65 @@ export const MyGameboardsSidebar = (props: MyGameboardsSidebarProps) => {
436
440
</ Input >
437
441
</ ContentSidebar > ;
438
442
} ;
443
+ interface SetAssignmentsSidebarProps extends SidebarProps {
444
+ displayMode : BoardViews ;
445
+ setDisplayMode : React . Dispatch < React . SetStateAction < BoardViews > > ;
446
+ displayLimit : BoardLimit ;
447
+ setDisplayLimit : React . Dispatch < React . SetStateAction < BoardLimit > > ;
448
+ boardTitleFilter : string ;
449
+ setBoardTitleFilter : React . Dispatch < React . SetStateAction < string > > ;
450
+ sortOrder : AssignmentBoardOrder ;
451
+ setSortOrder : React . Dispatch < React . SetStateAction < AssignmentBoardOrder > > ;
452
+ boardSubject : BoardSubjects ;
453
+ setBoardSubject : React . Dispatch < React . SetStateAction < BoardSubjects > > ;
454
+ boardCreator : BoardCreators ;
455
+ setBoardCreator : React . Dispatch < React . SetStateAction < BoardCreators > > ;
456
+ sortDisabled ?: boolean ;
457
+ }
439
458
440
- export const SetAssignmentsSidebar = ( props : SidebarProps ) => {
441
- // TODO
442
- return < ContentSidebar { ...props } /> ;
459
+ export const SetAssignmentsSidebar = ( props : SetAssignmentsSidebarProps ) => {
460
+ const { displayMode, setDisplayMode, displayLimit, setDisplayLimit, boardTitleFilter, setBoardTitleFilter, sortOrder, setSortOrder, sortDisabled, boardSubject, setBoardSubject, boardCreator, setBoardCreator, ...rest } = props ;
461
+
462
+ return < ContentSidebar { ...rest } className = { classNames ( rest . className , "pt-0" ) } >
463
+ < div className = "section-divider" />
464
+ < h5 > Search gameboards</ h5 >
465
+ < Input
466
+ className = 'search--filter-input my-4'
467
+ type = "search" value = { boardTitleFilter || "" }
468
+ placeholder = "e.g. Forces"
469
+ onChange = { ( e : ChangeEvent < HTMLInputElement > ) => setBoardTitleFilter ( e . target . value ) }
470
+ />
471
+ < div className = "section-divider" />
472
+ < h5 className = "mb-4" > Display</ h5 >
473
+ < div className = "d-flex" >
474
+ < Input className = "w-auto" type = "select" value = { displayMode } onChange = { e => setDisplayMode ( e . target . value as BoardViews ) } >
475
+ { Object . values ( BoardViews ) . map ( view => < option key = { view } value = { view } > { view } </ option > ) }
476
+ </ Input >
477
+ < Spacer />
478
+ < div className = "select-pretext" > Limit:</ div >
479
+ < Input className = "w-auto" type = "select" value = { displayLimit } onChange = { e => setDisplayLimit ( e . target . value as BoardLimit ) } >
480
+ { Object . values ( BoardLimit ) . map ( limit => < option key = { limit } value = { limit } > { limit } </ option > ) }
481
+ </ Input >
482
+ </ div >
483
+ < h5 className = "mt-4 mb-3" > Sort by</ h5 >
484
+ < Input type = "select" className = "mb-3" value = { sortOrder } onChange = { e => setSortOrder ( e . target . value as AssignmentBoardOrder ) } disabled = { sortDisabled } >
485
+ { Object . values ( AssignmentBoardOrder ) . filter (
486
+ order => ! [ 'attempted' , '-attempted' , 'correct' , '-correct' ] . includes ( order )
487
+ ) . map ( order => < option key = { order } value = { order } > { BOARD_ORDER_NAMES [ order ] } </ option > ) }
488
+ </ Input >
489
+ { sortDisabled && < div className = "small text-muted mt-2" >
490
+ Sorting is disabled if some gameboards are hidden. Increase the display limit to show all gameboards.
491
+ </ div > }
492
+ < div className = "section-divider" />
493
+ < h5 className = "mb-3" > Filter by subject</ h5 >
494
+ < Input type = "select" value = { boardSubject } onChange = { e => setBoardSubject ( e . target . value as BoardSubjects ) } >
495
+ { Object . values ( BoardSubjects ) . map ( subject => < option key = { subject } value = { subject } > { subject } </ option > ) }
496
+ </ Input >
497
+ < h5 className = "mt-4 mb-3" > Filter by creator</ h5 >
498
+ < Input type = "select" value = { boardCreator } onChange = { e => setBoardCreator ( e . target . value as BoardCreators ) } >
499
+ { Object . values ( BoardCreators ) . map ( creator => < option key = { creator } value = { creator } > { creator } </ option > ) }
500
+ </ Input >
501
+ </ ContentSidebar > ;
443
502
} ;
444
503
445
504
export const MyAccountSidebar = ( props : SidebarProps ) => {
0 commit comments