1
- import { Button , Card , Elevation , Icon , IconName , Intent , Text } from '@blueprintjs/core' ;
1
+ import {
2
+ Button ,
3
+ Card ,
4
+ Classes ,
5
+ Dialog ,
6
+ Elevation ,
7
+ Icon ,
8
+ IconName ,
9
+ Intent ,
10
+ MenuItem ,
11
+ Text
12
+ } from '@blueprintjs/core' ;
2
13
import { IconNames } from '@blueprintjs/icons' ;
14
+ import { ItemRenderer , Select } from '@blueprintjs/select' ;
3
15
import * as React from 'react' ;
4
16
import { NavLink } from 'react-router-dom' ;
5
17
import Textarea from 'react-textarea-autosize' ;
@@ -9,7 +21,11 @@ import { getPrettyDate } from '../../utils/dateHelpers';
9
21
import { assessmentCategoryLink } from '../../utils/paramParseHelpers' ;
10
22
import { exportXml } from '../../utils/xmlParser' ;
11
23
12
- import { IAssessmentOverview } from '../assessment/assessmentShape' ;
24
+ import {
25
+ AssessmentCategories ,
26
+ AssessmentCategory ,
27
+ IAssessmentOverview
28
+ } from '../assessment/assessmentShape' ;
13
29
import { controlButton } from '../commons' ;
14
30
import Markdown from '../commons/Markdown' ;
15
31
@@ -24,19 +40,26 @@ type Props = {
24
40
interface IState {
25
41
editingOverviewField : string ;
26
42
fieldValue : any ;
43
+ showOptionsOverlay : boolean ;
27
44
}
28
45
29
46
export class EditingOverviewCard extends React . Component < Props , IState > {
30
47
public constructor ( props : Props ) {
31
48
super ( props ) ;
32
49
this . state = {
33
50
editingOverviewField : '' ,
34
- fieldValue : ''
51
+ fieldValue : '' ,
52
+ showOptionsOverlay : false
35
53
} ;
36
54
}
37
55
38
56
public render ( ) {
39
- return < div > { this . makeEditingOverviewCard ( this . props . overview ) } </ div > ;
57
+ return (
58
+ < div >
59
+ { this . optionsOverlay ( ) }
60
+ { this . makeEditingOverviewCard ( this . props . overview ) }
61
+ </ div >
62
+ ) ;
40
63
}
41
64
42
65
private saveEditOverview = ( field : keyof IAssessmentOverview ) => ( e : any ) => {
@@ -67,7 +90,13 @@ export class EditingOverviewCard extends React.Component<Props, IState> {
67
90
}
68
91
} ;
69
92
70
- private handleExportXml = ( ) => ( e : any ) => {
93
+ private toggleOptionsOverlay = ( ) => {
94
+ this . setState ( {
95
+ showOptionsOverlay : ! this . state . showOptionsOverlay
96
+ } ) ;
97
+ } ;
98
+
99
+ private handleExportXml = ( e : any ) => {
71
100
exportXml ( ) ;
72
101
} ;
73
102
@@ -127,6 +156,7 @@ export class EditingOverviewCard extends React.Component<Props, IState> {
127
156
: `${ getPrettyDate ( overview . closeAt ) } ` }
128
157
</ div >
129
158
</ Text >
159
+ { this . makeOptionsButton ( ) }
130
160
{ makeOverviewCardButton ( overview , this . props . listingPath ) }
131
161
</ div >
132
162
</ div >
@@ -149,22 +179,66 @@ export class EditingOverviewCard extends React.Component<Props, IState> {
149
179
150
180
private makeExportButton = ( overview : IAssessmentOverview ) => (
151
181
< Button
152
- // disabled={overview.status !== AssessmentStatuses.attempted}
153
182
icon = { IconNames . EXPORT }
154
183
intent = { Intent . DANGER }
155
184
minimal = { true }
156
185
// intentional: each menu renders own version of onClick
157
186
// tslint:disable-next-line:jsx-no-lambda
158
- onClick = { this . handleExportXml ( ) }
187
+ onClick = { this . handleExportXml }
159
188
>
160
189
Export XML
161
190
</ Button >
162
191
) ;
192
+
193
+ private makeOptionsButton = ( ) => (
194
+ < Button icon = { IconNames . WRENCH } minimal = { true } onClick = { this . toggleOptionsOverlay } >
195
+ Other Options
196
+ </ Button >
197
+ ) ;
198
+
199
+ private saveCategory = ( i : AssessmentCategory , e : any ) => {
200
+ const overview = {
201
+ ...this . props . overview ,
202
+ category : i
203
+ } ;
204
+ localStorage . setItem ( 'MissionEditingOverviewSA' , JSON . stringify ( overview ) ) ;
205
+ this . props . updateEditingOverview ( overview ) ;
206
+ } ;
207
+
208
+ private optionsOverlay = ( ) => (
209
+ < Dialog
210
+ canOutsideClickClose = { false }
211
+ className = "assessment-reset"
212
+ icon = { IconNames . WRENCH }
213
+ isCloseButtonShown = { true }
214
+ isOpen = { this . state . showOptionsOverlay }
215
+ onClose = { this . toggleOptionsOverlay }
216
+ title = "Other options"
217
+ >
218
+ < div className = { Classes . DIALOG_BODY } >
219
+ < h3 > Category</ h3 >
220
+ { categorySelect ( this . props . overview . category , this . saveCategory ) }
221
+ < h3 > Story</ h3 >
222
+ < div onClick = { this . toggleEditField ( 'story' ) } >
223
+ { this . state . editingOverviewField === 'story'
224
+ ? this . makeEditingOverviewTextarea ( 'story' )
225
+ : createPlaceholder ( this . props . overview . story || '' ) }
226
+ </ div >
227
+ < br />
228
+ < h3 > Filename</ h3 >
229
+ < div onClick = { this . toggleEditField ( 'fileName' ) } >
230
+ { this . state . editingOverviewField === 'fileName'
231
+ ? this . makeEditingOverviewTextarea ( 'fileName' )
232
+ : createPlaceholder ( this . props . overview . fileName || '' ) }
233
+ </ div >
234
+ </ div >
235
+ </ Dialog >
236
+ ) ;
163
237
}
164
238
165
239
const createPlaceholder = ( str : string ) : string => {
166
240
if ( str . match ( '^(\n| )*$' ) ) {
167
- return 'Enter Value Here. ' ;
241
+ return 'Enter Value Here (If Applicable) ' ;
168
242
} else {
169
243
return str ;
170
244
}
@@ -180,3 +254,32 @@ const makeOverviewCardButton = (overview: IAssessmentOverview, listingPath: stri
180
254
</ NavLink >
181
255
) ;
182
256
} ;
257
+
258
+ const assessmentCategoriesArr = [
259
+ AssessmentCategories . Mission ,
260
+ AssessmentCategories . Path ,
261
+ AssessmentCategories . Sidequest ,
262
+ AssessmentCategories . Contest
263
+ ] ;
264
+
265
+ const categorySelect = (
266
+ category : AssessmentCategory ,
267
+ handleSelect = ( i : AssessmentCategory , e : React . ChangeEvent < HTMLSelectElement > ) => { }
268
+ ) => (
269
+ < CategorySelectComponent
270
+ className = "pt-minimal"
271
+ items = { assessmentCategoriesArr }
272
+ onItemSelect = { handleSelect }
273
+ itemRenderer = { categoryRenderer }
274
+ filterable = { false }
275
+ >
276
+ < Button className = "pt-minimal" text = { category } rightIcon = "double-caret-vertical" />
277
+ </ CategorySelectComponent >
278
+ ) ;
279
+
280
+ const CategorySelectComponent = Select . ofType < AssessmentCategory > ( ) ;
281
+
282
+ const categoryRenderer : ItemRenderer < AssessmentCategory > = (
283
+ category ,
284
+ { handleClick, modifiers, query }
285
+ ) => < MenuItem active = { false } key = { category } onClick = { handleClick } text = { category } /> ;
0 commit comments