@@ -3,7 +3,7 @@ import { extensionApiService } from '../shared/ExtensionApiService';
33import { getUser } from '../shared/jiraApi' ;
44import { BOARD_PROPERTIES } from '../shared/constants' ;
55
6- const renderRow = ( { id, person, limit, columns, swimlanes } , deleteLimit ) => {
6+ const renderRow = ( { id, person, limit, columns, swimlanes } , deleteLimit , onEdit ) => {
77 document . querySelector ( '#persons-limit-body' ) . insertAdjacentHTML (
88 'beforeend' ,
99 `
@@ -13,7 +13,7 @@ const renderRow = ({ id, person, limit, columns, swimlanes }, deleteLimit) => {
1313 <td>${ limit } </td>
1414 <td>${ columns . map ( c => c . name ) . join ( ', ' ) } </td>
1515 <td>${ swimlanes . map ( s => s . name ) . join ( ', ' ) } </td>
16- <td><button class="aui-button" id="delete-${ id } ">Delete</button></td>
16+ <td><div>< button class="aui-button" id="delete-${ id } ">Delete</button></div><hr><div><button class="aui-button" id="edit- ${ id } ">Edit</button></div ></td>
1717 </tr>
1818 `
1919 ) ;
@@ -22,6 +22,15 @@ const renderRow = ({ id, person, limit, columns, swimlanes }, deleteLimit) => {
2222 await deleteLimit ( id ) ;
2323 document . querySelector ( `#row-${ id } ` ) . remove ( ) ;
2424 } ) ;
25+
26+ document . querySelector ( `#edit-${ id } ` ) . addEventListener ( 'click' , async ( ) => {
27+ await onEdit ( id ) ;
28+ } ) ;
29+ } ;
30+
31+ const renderAllRow = ( { modal, personLimits, deleteLimit, onEdit } ) => {
32+ modal . querySelectorAll ( '.person-row' ) . forEach ( row => row . remove ( ) ) ;
33+ personLimits . limits . forEach ( personLimit => renderRow ( personLimit , deleteLimit , onEdit ) ) ;
2534} ;
2635
2736export const openPersonLimitsModal = async ( modification , boardData , personLimits ) => {
@@ -30,6 +39,34 @@ export const openPersonLimitsModal = async (modification, boardData, personLimit
3039 await modification . updateBoardProperty ( BOARD_PROPERTIES . PERSON_LIMITS , personLimits ) ;
3140 } ;
3241
42+ const onEdit = async id => {
43+ const personalWIPLimit = personLimits . limits . find ( limit => limit . id === id ) ;
44+
45+ document . querySelector ( '#limit' ) . value = personalWIPLimit . limit ;
46+ document . querySelector ( '#person-name' ) . value = personalWIPLimit . person . name ;
47+
48+ const columns = document . querySelector ( '#column-select' ) ;
49+ const selectedColumnsIds = personalWIPLimit . columns . map ( c => c . id ) ;
50+
51+ columns . options . forEach ( option => {
52+ option . selected = selectedColumnsIds . indexOf ( option . value ) > - 1 ;
53+ } ) ;
54+
55+ const swimlanes = document . querySelector ( '#swimlanes-select' ) ;
56+ const selectedSwimlanesIds = personalWIPLimit . swimlanes . map ( c => c . id ) ;
57+
58+ swimlanes . options . forEach ( option => {
59+ option . selected = selectedSwimlanesIds . indexOf ( option . value ) > - 1 ;
60+ } ) ;
61+
62+ const editBtn = document . querySelector ( '#person-limit-edit-button' ) ;
63+ editBtn . disabled = false ;
64+ editBtn . setAttribute ( 'person-id' , id ) ;
65+ document . querySelector ( `#row-${ id } ` ) . style . background = '#ffd989c2' ;
66+
67+ await modification . updateBoardProperty ( BOARD_PROPERTIES . PERSON_LIMITS , personLimits ) ;
68+ } ;
69+
3370 const modal = modification . insertHTML ( document . body , 'beforeend' , personLimitsModal ) ;
3471
3572 const columnsSelect = modal . querySelector ( '.columns select' ) ;
@@ -50,15 +87,54 @@ export const openPersonLimitsModal = async (modification, boardData, personLimit
5087 swimlanesSelect . appendChild ( option ) ;
5188 } ) ;
5289
53- modal . querySelector ( '#person-limit-save-button' ) . addEventListener ( 'click' , async e => {
54- e . preventDefault ( ) ;
55-
56- const person = modal . querySelector ( '#person-name' ) . value ;
90+ const getDataForm = ( ) => {
91+ const name = modal . querySelector ( '#person-name' ) . value ;
5792 const limit = modal . querySelector ( '#limit' ) . valueAsNumber ;
5893 const columns = [ ...columnsSelect . selectedOptions ] . map ( option => ( { id : option . value , name : option . text } ) ) ;
5994 const swimlanes = [ ...swimlanesSelect . selectedOptions ] . map ( option => ( { id : option . value , name : option . text } ) ) ;
6095
61- const fullPerson = await getUser ( person ) ;
96+ return {
97+ person : {
98+ name,
99+ } ,
100+ limit,
101+ columns,
102+ swimlanes,
103+ } ;
104+ } ;
105+
106+ modal . querySelector ( '#person-limit-edit-button' ) . addEventListener ( 'click' , async e => {
107+ e . preventDefault ( ) ;
108+ const personId = parseInt ( e . target . getAttribute ( 'person-id' ) , 10 ) ;
109+ e . target . disabled = true ;
110+
111+ if ( ! personId ) return ;
112+
113+ const index = personLimits . limits . findIndex ( pl => pl . id === personId ) ;
114+
115+ if ( index === - 1 ) return ;
116+
117+ const data = getDataForm ( ) ;
118+
119+ personLimits . limits [ index ] = {
120+ ...personLimits . limits [ index ] ,
121+ ...data ,
122+ person : {
123+ ...data . person ,
124+ ...personLimits . limits [ index ] . person ,
125+ } ,
126+ } ;
127+
128+ await modification . updateBoardProperty ( BOARD_PROPERTIES . PERSON_LIMITS , personLimits ) ;
129+
130+ renderAllRow ( { modal, personLimits, deleteLimit, onEdit } ) ;
131+ } ) ;
132+
133+ modal . querySelector ( '#person-limit-save-button' ) . addEventListener ( 'click' , async e => {
134+ e . preventDefault ( ) ;
135+
136+ const data = getDataForm ( ) ;
137+ const fullPerson = await getUser ( data . person . name ) ;
62138
63139 const personLimit = {
64140 id : Date . now ( ) ,
@@ -68,16 +144,16 @@ export const openPersonLimitsModal = async (modification, boardData, personLimit
68144 self : fullPerson . self ,
69145 avatar : fullPerson . avatarUrls [ '32x32' ] ,
70146 } ,
71- limit,
72- columns,
73- swimlanes,
147+ limit : data . limit ,
148+ columns : data . columns ,
149+ swimlanes : data . swimlanes ,
74150 } ;
75151
76152 personLimits . limits . push ( personLimit ) ;
77153
78154 await modification . updateBoardProperty ( BOARD_PROPERTIES . PERSON_LIMITS , personLimits ) ;
79155
80- renderRow ( personLimit , deleteLimit ) ;
156+ renderRow ( personLimit , deleteLimit , onEdit ) ;
81157 } ) ;
82158
83159 modal . querySelector ( '#apply-columns' ) . addEventListener ( 'click' , async e => {
@@ -96,9 +172,7 @@ export const openPersonLimitsModal = async (modification, boardData, personLimit
96172 ) ;
97173
98174 await modification . updateBoardProperty ( BOARD_PROPERTIES . PERSON_LIMITS , personLimits ) ;
99-
100- modal . querySelectorAll ( '.person-row' ) . forEach ( row => row . remove ( ) ) ;
101- personLimits . limits . forEach ( personLimit => renderRow ( personLimit , deleteLimit ) ) ;
175+ renderAllRow ( { modal, personLimits, deleteLimit, onEdit } ) ;
102176 } ) ;
103177
104178 modal . querySelector ( '#apply-swimlanes' ) . addEventListener ( 'click' , async e => {
@@ -119,10 +193,10 @@ export const openPersonLimitsModal = async (modification, boardData, personLimit
119193 await modification . updateBoardProperty ( BOARD_PROPERTIES . PERSON_LIMITS , personLimits ) ;
120194
121195 modal . querySelectorAll ( '.person-row' ) . forEach ( row => row . remove ( ) ) ;
122- personLimits . limits . forEach ( personLimit => renderRow ( personLimit , deleteLimit ) ) ;
196+ personLimits . limits . forEach ( personLimit => renderRow ( personLimit , deleteLimit , onEdit ) ) ;
123197 } ) ;
124198
125- personLimits . limits . forEach ( personLimit => renderRow ( personLimit , deleteLimit ) ) ;
199+ personLimits . limits . forEach ( personLimit => renderRow ( personLimit , deleteLimit , onEdit ) ) ;
126200
127201 // window.AJS is not available here
128202 const script = document . createElement ( 'script' ) ;
0 commit comments