1- import { Button , MenuItem , NumericInput } from '@blueprintjs/core' ;
2- import { ItemRenderer , Select } from '@blueprintjs/select' ;
1+ import { Button , Checkbox , MenuItem , NumericInput } from '@blueprintjs/core' ;
2+ import { ItemPredicate , ItemRenderer , Select } from '@blueprintjs/select' ;
33import { useContext , useEffect , useState } from 'react' ;
44import { AchievementContext } from 'src/features/achievement/AchievementConstants' ;
55import {
@@ -8,7 +8,11 @@ import {
88 GoalProgress
99} from 'src/features/achievement/AchievementTypes' ;
1010
11+ import { showSuccessMessage , showWarningMessage } from '../utils/NotificationsHelper' ;
12+
1113type AchievementManualEditorProps = {
14+ hiddenState : [ boolean , any ] ;
15+ userState : [ AchievementUser | undefined , any ] ;
1216 studio : string ;
1317 users : AchievementUser [ ] ;
1418 getUsers : ( ) => void ;
@@ -19,9 +23,22 @@ const GoalSelect = Select.ofType<AchievementGoal>();
1923const goalRenderer : ItemRenderer < AchievementGoal > = ( goal , { handleClick } ) => (
2024 < MenuItem key = { goal . uuid } onClick = { handleClick } text = { goal . text } />
2125) ;
26+ const goalPredicate : ItemPredicate < AchievementGoal > = ( query , item ) =>
27+ item . text . toLowerCase ( ) . includes ( query . toLowerCase ( ) ) ;
28+
29+ const UserSelect = Select . ofType < AchievementUser > ( ) ;
30+ const userRenderer : ItemRenderer < AchievementUser > = ( user , { handleClick } ) => (
31+ < MenuItem key = { user . courseRegId } onClick = { handleClick } text = { user . name } />
32+ ) ;
33+ const userPredicate : ItemPredicate < AchievementUser > = ( query , item ) =>
34+ item . name . toLowerCase ( ) . includes ( query . toLowerCase ( ) ) ;
35+
36+ export function updateGoalProcessed ( ) {
37+ showSuccessMessage ( 'Goal updated' ) ;
38+ }
2239
2340function AchievementManualEditor ( props : AchievementManualEditorProps ) {
24- const { studio, getUsers, updateGoalProgress } = props ;
41+ const { userState , hiddenState , studio, getUsers, updateGoalProgress } = props ;
2542 const users =
2643 studio === 'Staff'
2744 ? // The name can be null for users who have yet to log in. We push these to the back of the array.
@@ -39,35 +56,36 @@ function AchievementManualEditor(props: AchievementManualEditorProps) {
3956 . getAllGoals ( )
4057 . filter ( goals => goals . meta . type === 'Manual' ) ;
4158
42- const [ goal , changeGoal ] = useState ( manualAchievements [ 0 ] ) ;
43- const [ selectedUser , changeSelectedUser ] = useState ( users [ 0 ] ) ;
44- const [ count , changeCount ] = useState ( 0 ) ;
45-
46- const UserSelect = Select . ofType < AchievementUser > ( ) ;
47- const userRenderer : ItemRenderer < AchievementUser > = ( user , { handleClick } ) => (
48- < MenuItem key = { user . courseRegId } onClick = { handleClick } text = { user . name } />
49- ) ;
59+ const [ goal , changeGoal ] = useState < AchievementGoal | undefined > ( undefined ) ;
60+ const [ selectedUser , changeSelectedUser ] = userState ;
61+ const [ count , changeCount ] = useState < number > ( 0 ) ;
62+ const [ viewHidden , changeViewHidden ] = hiddenState ;
5063
5164 const updateGoal = ( ) => {
52- if ( goal ) {
65+ if ( goal && selectedUser ) {
5366 const progress : GoalProgress = {
5467 uuid : goal . uuid ,
55- count : count ,
68+ count : count < 0 ? 0 : Math . floor ( count ) ,
5669 targetCount : goal . targetCount ,
5770 completed : count >= goal . targetCount
5871 } ;
5972 updateGoalProgress ( selectedUser . courseRegId , progress ) ;
73+ } else {
74+ ! goal && showWarningMessage ( 'Goal not selected' ) ;
75+ ! selectedUser && showWarningMessage ( 'User not selected' ) ;
6076 }
6177 } ;
6278
6379 return (
6480 < div className = "achievement-manual-editor" >
6581 < h3 > User: </ h3 >
6682 < UserSelect
67- filterable = { false }
83+ filterable = { true }
6884 items = { users }
6985 itemRenderer = { userRenderer }
86+ itemPredicate = { userPredicate }
7087 onItemSelect = { changeSelectedUser }
88+ noResults = { < MenuItem disabled = { true } text = "No matching user" /> }
7189 >
7290 < Button
7391 outlined = { true }
@@ -78,10 +96,12 @@ function AchievementManualEditor(props: AchievementManualEditorProps) {
7896
7997 < h3 > Goal: </ h3 >
8098 < GoalSelect
81- filterable = { false }
99+ filterable = { true }
82100 items = { manualAchievements }
83101 itemRenderer = { goalRenderer }
102+ itemPredicate = { goalPredicate }
84103 onItemSelect = { changeGoal }
104+ noResults = { < MenuItem disabled = { true } text = "No matching goal" /> }
85105 >
86106 < Button outlined = { true } text = { goal ? goal . text : 'No Goal Selected' } color = "White" />
87107 </ GoalSelect >
@@ -91,12 +111,20 @@ function AchievementManualEditor(props: AchievementManualEditorProps) {
91111 value = { count }
92112 min = { 0 }
93113 allowNumericCharactersOnly = { true }
114+ minorStepSize = { null }
94115 placeholder = "Count"
95116 onValueChange = { changeCount }
96117 />
97118
98119 < h3 > </ h3 >
99120 < Button outlined = { true } text = "Update Goal" onClick = { updateGoal } intent = "primary" />
121+
122+ < h3 > </ h3 >
123+ < Checkbox
124+ checked = { viewHidden }
125+ label = "View Hidden Achievements"
126+ onChange = { ( ) => changeViewHidden ( ! viewHidden ) }
127+ />
100128 </ div >
101129 ) ;
102130}
0 commit comments