Skip to content

Commit 719a634

Browse files
authored
Merge pull request #142 from TinkoffCreditSystems/feature/106
[#106] Editing personal WIP-limit
2 parents a9ab90b + da2506f commit 719a634

File tree

2 files changed

+93
-18
lines changed

2 files changed

+93
-18
lines changed

src/person-limits/personLimitsModal.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ <h2 class="aui-dialog2-header-main">Person limits</h2>
2222
<td>
2323
<div class="field-group columns" style="display: flex">
2424
<label>Columns</label>
25-
<select class="select2" multiple style="margin: 0 12px; width: 195px;" size="4"></select>
25+
<select id="column-select" class="select2" multiple style="margin: 0 12px; width: 195px;" size="4"></select>
2626
<button id="apply-columns" class="aui-button aui-button-link">Apply columns<br/>for selected users</button>
2727
</div>
2828

2929
<div class="field-group swimlanes" style="display: flex">
3030
<label>Swimlanes</label>
31-
<select class="select2" multiple style="margin: 0 12px; width: 195px;" size="5"></select>
31+
<select id="swimlanes-select" class="select2" multiple style="margin: 0 12px; width: 195px;" size="5"></select>
3232
<button id="apply-swimlanes" class="aui-button aui-button-link">Apply swimlanes<br/>for selected users</button>
3333
</div>
3434
</td>
@@ -39,6 +39,7 @@ <h2 class="aui-dialog2-header-main">Person limits</h2>
3939
<div class="buttons-container">
4040
<div class="buttons">
4141
<button class="aui-button aui-button-primary" type="submit" id="person-limit-save-button">Add limit</button>
42+
<button class="aui-button aui-button-primary" type="submit" disabled id="person-limit-edit-button">Edit limit</button>
4243
</div>
4344
</div>
4445
</td>

src/person-limits/personLimitsModal.js

Lines changed: 90 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { extensionApiService } from '../shared/ExtensionApiService';
33
import { getUser } from '../shared/jiraApi';
44
import { 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

2736
export 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

Comments
 (0)