@@ -10,21 +10,18 @@ import { Assignment, InvolvementLevel, TeamMember } from 'colab-rest-client';
1010import * as React from 'react' ;
1111import * as API from '../../API/api' ;
1212import useTranslations from '../../i18n/I18nContext' ;
13- import { useAppDispatch , useAppSelector } from '../../store/hooks' ;
14- import { useAssignmentForCardAndMember } from '../../store/selectors/assignmentSelector' ;
13+ import { useAppDispatch } from '../../store/hooks' ;
1514import {
16- useTeamMembersHavingAssignment ,
17- useTeamMembersWithoutAssignment ,
18- } from '../../store/selectors/teamMemberSelector' ;
15+ useAssignmentForCardAndMember ,
16+ useAssignmentsForCard ,
17+ } from '../../store/selectors/assignmentSelector' ;
18+ import { useTeamMembers } from '../../store/selectors/teamMemberSelector' ;
1919import { useLoadUsersForCurrentProject } from '../../store/selectors/userSelector' ;
2020import { AvailabilityStatus } from '../../store/store' ;
21- import { space_lg , space_sm , space_xl , space_xs , th_sm } from '../../styling/style' ;
21+ import { th_sm } from '../../styling/style' ;
2222import AvailabilityStatusIndicator from '../common/element/AvailabilityStatusIndicator' ;
23- import Button from '../common/element/Button' ;
2423import IconButton from '../common/element/IconButton' ;
25- import SelectInput from '../common/element/SelectInput' ;
26- import Flex from '../common/layout/Flex' ;
27- import UserName , { getUserName } from './UserName' ;
24+ import UserName from './UserName' ;
2825
2926// -------------------------------------------------------------------------------------------------
3027// Assignments options
@@ -61,7 +58,6 @@ function TeamAssignmentHeaderColumns(): JSX.Element {
6158 < PrettyPrint involvementLevel = { involvementLevel } />
6259 </ th >
6360 ) ) }
64- < th > { /* for delete action */ } </ th >
6561 </ tr >
6662 </ thead >
6763 ) ;
@@ -78,17 +74,8 @@ interface TeamAssignmentRowProps {
7874}
7975
8076function TeamAssignmentRow ( { cardId, member, readOnly } : TeamAssignmentRowProps ) : JSX . Element {
81- const dispatch = useAppDispatch ( ) ;
82- const i18n = useTranslations ( ) ;
83-
8477 const { status, assignment } = useAssignmentForCardAndMember ( cardId , member . id ) ;
8578
86- const onDeleteRow = React . useCallback ( ( ) => {
87- if ( member . id != null && cardId != null ) {
88- dispatch ( API . deleteAssignments ( { memberId : member . id , cardId } ) ) ;
89- }
90- } , [ cardId , member . id , dispatch ] ) ;
91-
9279 return (
9380 < tr >
9481 < td >
@@ -106,16 +93,6 @@ function TeamAssignmentRow({ cardId, member, readOnly }: TeamAssignmentRowProps)
10693 />
10794 </ td >
10895 ) ) }
109- < td >
110- { ! readOnly && (
111- < IconButton
112- icon = "delete"
113- title = { i18n . team . assignment . actions . clickToRemoveAssignment }
114- onClick = { onDeleteRow }
115- className = { 'hoverButton ' + css ( { visibility : 'hidden' , padding : space_xs } ) }
116- />
117- ) }
118- </ td >
11996 </ tr >
12097 ) ;
12198}
@@ -183,70 +160,6 @@ function IconCheckBox({
183160 ) ;
184161}
185162
186- // -------------------------------------------------------------------------------------------------
187- // Add button
188- // -------------------------------------------------------------------------------------------------
189-
190- interface TeamMemberAssignmentCreatorProps {
191- cardId : number ;
192- }
193-
194- function TeamMemberAssignmentCreator ( { cardId } : TeamMemberAssignmentCreatorProps ) : JSX . Element {
195- const dispatch = useAppDispatch ( ) ;
196- const i18n = useTranslations ( ) ;
197-
198- const { members : membersWithoutAssignment } = useTeamMembersWithoutAssignment ( cardId ) ;
199-
200- const membersToSelect = useAppSelector ( state => {
201- return membersWithoutAssignment . map ( m => ( {
202- label : getUserName ( state , i18n , m ) ,
203- value : m . id || 0 ,
204- } ) ) ;
205- } ) ;
206-
207- const [ isAdding , setIsAdding ] = React . useState < boolean > ( false ) ;
208-
209- const [ newMembers , setNewMembers ] = React . useState < number [ ] > ( [ ] ) ;
210-
211- return (
212- < Flex gap = { space_sm } align = "center" >
213- { isAdding && (
214- < >
215- < SelectInput
216- value = { undefined } // see if ok
217- isClearable = { true }
218- isMulti = { true }
219- options = { membersToSelect }
220- onChange = { ( selected : number [ ] | null ) => {
221- setNewMembers ( selected || [ ] ) ;
222- } }
223- />
224- </ >
225- ) }
226- < Button
227- icon = "add"
228- kind = { isAdding ? 'outline' : 'solid' }
229- onClick = { ( ) => {
230- if ( isAdding ) {
231- newMembers . forEach ( mId => {
232- dispatch (
233- API . createAssignment ( {
234- cardId,
235- memberId : mId ,
236- } ) ,
237- ) ;
238- } ) ;
239- }
240- setNewMembers ( [ ] ) ;
241- setIsAdding ( e => ! e ) ;
242- } }
243- >
244- { i18n . common . add }
245- </ Button >
246- </ Flex >
247- ) ;
248- }
249-
250163// -------------------------------------------------------------------------------------------------
251164// Panel
252165// -------------------------------------------------------------------------------------------------
@@ -260,9 +173,10 @@ export default function CardAssignmentsPanel({
260173 cardId,
261174 readOnly,
262175} : CardAssignmentsPanelProps ) : JSX . Element {
263- const { status : statusMembers , members : membersWithAssignment } =
264- useTeamMembersHavingAssignment ( cardId ) ;
265- // Note : Assignments are loaded when fetching the members having Assignments
176+ const { status : statusMembers , members } = useTeamMembers ( ) ;
177+
178+ // just to load assignments once for the card
179+ useAssignmentsForCard ( cardId ) ;
266180
267181 // usefull for team members' display name, load all users at once
268182 const statusUsers = useLoadUsersForCurrentProject ( ) ;
@@ -279,9 +193,6 @@ export default function CardAssignmentsPanel({
279193 < >
280194 < table
281195 className = { css ( {
282- marginBottom : space_xl ,
283- paddingBottom : space_lg ,
284- borderBottom : '1px solid var(--divider-main)' ,
285196 'tbody tr:hover' : {
286197 backgroundColor : 'var(--gray-100)' ,
287198 } ,
@@ -294,7 +205,7 @@ export default function CardAssignmentsPanel({
294205 { /* titles row */ }
295206 < TeamAssignmentHeaderColumns />
296207 < tbody >
297- { membersWithAssignment . map ( member => {
208+ { members . map ( member => {
298209 return (
299210 < TeamAssignmentRow
300211 key = { member . id }
@@ -306,12 +217,6 @@ export default function CardAssignmentsPanel({
306217 } ) }
307218 </ tbody >
308219 </ table >
309-
310- { ! readOnly && (
311- < Flex >
312- < TeamMemberAssignmentCreator cardId = { cardId } />
313- </ Flex >
314- ) }
315220 </ >
316221 ) ;
317222}
0 commit comments