@@ -2,14 +2,38 @@ import React from "react";
2
2
import { AbstractListViewItem , ListViewTagProps } from "./AbstractListViewItem" ;
3
3
import { ShortcutResponse , Subject , ViewingContext } from "../../../../IsaacAppTypes" ;
4
4
import { determineAudienceViews } from "../../../services/userViewingContext" ;
5
- import { DOCUMENT_TYPE , SEARCH_RESULT_TYPE , TAG_ID , TAG_LEVEL , tags } from "../../../services" ;
5
+ import { DOCUMENT_TYPE , documentTypePathPrefix , SEARCH_RESULT_TYPE , TAG_ID , TAG_LEVEL , tags } from "../../../services" ;
6
6
import { Col , ListGroup , Row } from "reactstrap" ;
7
7
import { TitleIconProps } from "../PageTitle" ;
8
+ import { AffixButton } from "../AffixButton" ;
9
+ import { QuizSummaryDTO } from "../../../../IsaacApiTypes" ;
10
+ import { Link } from "react-router-dom" ;
11
+ import { showQuizSettingModal , useAppDispatch } from "../../../state" ;
12
+
13
+ export interface ListViewCardProps {
14
+ item : ShortcutResponse ;
15
+ icon : TitleIconProps ;
16
+ subject ?: Subject ;
17
+ tagList ?: ListViewTagProps [ ] ;
18
+ }
19
+
20
+ export const ListViewCard = ( { item, icon, subject, tagList, ...rest } : ListViewCardProps ) => {
21
+ return < AbstractListViewItem
22
+ icon = { icon }
23
+ title = { item . title ?? "" }
24
+ subject = { subject }
25
+ subtitle = { item . subtitle }
26
+ tags = { tagList }
27
+ isCard
28
+ { ...rest }
29
+ /> ;
30
+ } ;
8
31
9
32
export const QuestionListViewItem = ( { item, ...rest } : { item : ShortcutResponse } ) => {
10
33
const breadcrumb = tags . getByIdsAsHierarchy ( ( item . tags || [ ] ) as TAG_ID [ ] ) . map ( tag => tag . title ) ;
11
34
const audienceViews : ViewingContext [ ] = determineAudienceViews ( item . audience ) ;
12
35
const itemSubject = tags . getSpecifiedTag ( TAG_LEVEL . subject , item . tags as TAG_ID [ ] ) ?. id as Subject ;
36
+ const url = `/${ documentTypePathPrefix [ DOCUMENT_TYPE . QUESTION ] } /${ item . id } ` ;
13
37
14
38
return < AbstractListViewItem
15
39
icon = { { type : "hex" , icon : "list-icon-question" , size : "sm" } }
@@ -18,7 +42,7 @@ export const QuestionListViewItem = ({item, ...rest} : {item: ShortcutResponse})
18
42
subtitle = { item . subtitle }
19
43
breadcrumb = { breadcrumb }
20
44
status = { item . state }
21
- url = { item . url }
45
+ url = { url }
22
46
audienceViews = { audienceViews }
23
47
{ ...rest }
24
48
/> ;
@@ -41,7 +65,7 @@ export const EventListViewItem = ({item, ...rest}: {item: ShortcutResponse}) =>
41
65
const itemSubject = tags . getSpecifiedTag ( TAG_LEVEL . subject , item . tags as TAG_ID [ ] ) ?. id as Subject ;
42
66
43
67
return < AbstractListViewItem
44
- icon = { { type : "hex" , icon : "list-icon-concept " , size : "sm" } }
68
+ icon = { { type : "hex" , icon : "list-icon-events " , size : "sm" } }
45
69
title = { item . title ?? "" }
46
70
subject = { itemSubject }
47
71
subtitle = { item . subtitle }
@@ -50,21 +74,23 @@ export const EventListViewItem = ({item, ...rest}: {item: ShortcutResponse}) =>
50
74
/> ;
51
75
} ;
52
76
53
- export interface ListViewCardProps {
54
- item : ShortcutResponse ;
55
- icon : TitleIconProps ;
56
- subject ?: Subject ;
57
- tagList ?: ListViewTagProps [ ] ;
58
- }
77
+ export const QuizListViewItem = ( { item, isQuizSetter, ...rest } : { item : QuizSummaryDTO , isQuizSetter ?: boolean } ) => {
78
+ const dispatch = useAppDispatch ( ) ;
79
+ const itemSubject = tags . getSpecifiedTag ( TAG_LEVEL . subject , item . tags as TAG_ID [ ] ) ?. id as Subject ;
80
+ const quizButton = isQuizSetter ?
81
+ < AffixButton size = "md" color = "solid" onClick = { ( ) => ( dispatch ( showQuizSettingModal ( item ) ) ) } affix = { { affix : "icon-right" , position : "suffix" , type : "icon" } } >
82
+ Set test
83
+ </ AffixButton > :
84
+ < AffixButton size = "md" color = "solid" to = { item . url } tag = { Link } affix = { { affix : "icon-right" , position : "suffix" , type : "icon" } } >
85
+ Take the test
86
+ </ AffixButton > ;
59
87
60
- export const ListViewCard = ( { item, icon, subject, tagList, ...rest } : ListViewCardProps ) => {
61
- return < AbstractListViewItem
62
- icon = { icon }
88
+ return < AbstractListViewItem
89
+ icon = { { type : "hex" , icon : "list-icon-lessons" , size : "sm" } }
63
90
title = { item . title ?? "" }
64
- subject = { subject }
65
- subtitle = { item . subtitle }
66
- tags = { tagList }
67
- isCard
91
+ subject = { itemSubject }
92
+ previewQuizUrl = { `/test/preview/${ item . id } ` }
93
+ quizButton = { quizButton }
68
94
{ ...rest }
69
95
/> ;
70
96
} ;
@@ -89,16 +115,14 @@ export const ListViewCards = ({cards}: {cards: ListViewCardProps[]}) => {
89
115
</ div > ;
90
116
} ;
91
117
92
-
93
- export const ListView = ( { items, ...rest } : { items : ShortcutResponse [ ] , fullWidth ?: boolean } ) => {
118
+ export const ListView = ( { items, ...rest } : { items : ShortcutResponse [ ] , fullWidth ?: boolean , isQuizSetter ?: boolean } ) => {
94
119
95
120
// Cards (e.g. the subjects on the homepage) Xxxx
96
121
// Questions X
97
122
// Question Packs
98
123
// Quick Quizzes
99
124
// Concepts
100
- // Tests
101
-
125
+ // Tests x
102
126
103
127
return < ListGroup className = "link-list list-group-links" >
104
128
{ items . map ( ( item , index ) => {
@@ -113,9 +137,11 @@ export const ListView = ({items, ...rest}: {items: ShortcutResponse[], fullWidth
113
137
case ( DOCUMENT_TYPE . EVENT ) :
114
138
return < EventListViewItem key = { index } item = { item } { ...rest } /> ;
115
139
case ( DOCUMENT_TYPE . TOPIC_SUMMARY ) :
116
- return < QuestionListViewItem key = { index } item = { item } { ...rest } /> ;
140
+ return < ConceptListViewItem key = { index } item = { item } { ...rest } /> ;
117
141
case ( DOCUMENT_TYPE . GENERIC ) :
118
142
return < QuestionListViewItem key = { index } item = { item } { ...rest } /> ;
143
+ case ( DOCUMENT_TYPE . QUIZ ) :
144
+ return < QuizListViewItem key = { index } item = { item } { ...rest } /> ;
119
145
default :
120
146
// Do not render this item if there is no matching DOCUMENT_TYPE
121
147
console . error ( "Not able to display item as a ListViewItem: " , item ) ;
0 commit comments