Skip to content

Commit 7355aff

Browse files
authored
Merge pull request #180 from Tinkoff/106_p2_edit_wip_limit_fields
#106 new function — "edit" field WIP-limits
2 parents 99279cb + 1e1b0b8 commit 7355aff

File tree

5 files changed

+105
-26
lines changed

5 files changed

+105
-26
lines changed

.eslintrc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"ecmaFeatures": {
1313
"modules": true,
1414
"experimentalObjectRestSpread": true
15-
},
15+
}
1616
},
1717
"rules": {
1818
"no-console": "error",
@@ -22,7 +22,7 @@
2222
"import/prefer-default-export": "off",
2323
"quotes": ["error", "single"],
2424
"import/no-unresolved": [2, { "caseSensitive": false }],
25-
"prettier/prettier": "error",
25+
"prettier/prettier": ["error", { "endOfLine": "auto" }],
2626
"no-restricted-syntax": ["error", "ForInStatement", "LabeledStatement", "WithStatement"],
2727
"no-plusplus": ["error", { "allowForLoopAfterthoughts": true }],
2828
"class-methods-use-this": "off",

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ node_modules
1010
dist
1111
.gitconfig
1212
coverage
13+
.history

src/field-limits/SettingsPage/htmlTemplates.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export const fieldLimitsTableTemplate = ({
88
tableId,
99
tableBodyId,
1010
addLimitBtnId,
11+
editLimitBtnId,
1112
fieldValueInputId,
1213
visualNameInputId,
1314
columnsSelectId,
@@ -20,7 +21,7 @@ export const fieldLimitsTableTemplate = ({
2021
swimlaneOptions = [],
2122
columnOptions = [],
2223
}) => `
23-
<form class="aui">
24+
<form class="aui" onsubmit="return false;">
2425
<fieldset>
2526
<table>
2627
<tr>
@@ -76,6 +77,9 @@ export const fieldLimitsTableTemplate = ({
7677
<button class="aui-button aui-button-primary ${
7778
style.addFieldLimitBtn
7879
}" type="button" id="${addLimitBtnId}">Add limit</button>
80+
<button class="aui-button aui-button-primary ${
81+
style.editFieldLimitBtn
82+
}" type="submit" disabled id="${editLimitBtnId}">Edit limit</button>
7983
</div>
8084
</div>
8185
</td>
@@ -103,7 +107,7 @@ export const fieldLimitsTableTemplate = ({
103107
`;
104108

105109
export const fieldRowTemplate = ({
106-
id,
110+
limitKey,
107111
fieldId,
108112
fieldName,
109113
fieldValue,
@@ -112,17 +116,21 @@ export const fieldRowTemplate = ({
112116
limit,
113117
columns = [],
114118
swimlanes = [],
119+
editClassBtn,
115120
deleteClassBtn,
116121
}) => `
117-
<tr data-field-project-row="${id}">
118-
<td><input type="checkbox" class="checkbox" data-id="${id}"></td>
122+
<tr data-field-project-row="${limitKey}">
123+
<td><input type="checkbox" class="checkbox" data-id="${limitKey}"></td>
119124
<td data-type="field-name" data-value="${fieldId}">${fieldName}</td>
120125
<td data-type="field-value">${fieldValue}</td>
121-
<td data-type="visual-name"><div colorpicker-data-id="${id}"
126+
<td data-type="visual-name"><div colorpicker-data-id="${limitKey}"
122127
class="${style.visualName}" style="background-color:${bkgColor || 'none'}">${visualValue}</div></td>
123128
<td data-type="field-limit">${limit}</td>
124129
<td data-type="field-columns">${columns.map(c => c.name).join(', ')}</td>
125130
<td data-type="field-swimlanes">${swimlanes.map(s => s.name).join(', ')}</td>
126-
<td><button class="aui-button ${deleteClassBtn}">Delete</button></td>
131+
<td>
132+
<button class="aui-button ${editClassBtn} ${style.jhControlRowBtn}">Edit</button></br>
133+
<button class="aui-button ${deleteClassBtn} ${style.jhControlRowBtn}">Delete</button>
134+
</td>
127135
</tr>
128136
`;

src/field-limits/SettingsPage/index.js

Lines changed: 75 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export default class FieldLimitsSettingsPage extends PageModification {
1919
popupTable: 'jh-field-limits-table',
2020
popupTableBody: 'jh-field-limits-tbody',
2121
popupTableAddLimitRow: 'jh-field-limits-add-btn',
22+
popupTableEditLimitRow: 'jh-field-limits-edit-btn',
2223
inputFieldValue: 'jh-input-field-value',
2324
visualNameInput: 'jh-input-visual-name',
2425
columnsSelectId: 'jh-columns-select',
@@ -30,9 +31,12 @@ export default class FieldLimitsSettingsPage extends PageModification {
3031
};
3132

3233
static classes = {
34+
editRowBtn: 'jh-edit-row-btn',
3335
deleteRowBtn: 'jh-delete-row-btn',
3436
};
3537

38+
static limitKeyOfEditable = undefined;
39+
3640
async shouldApply() {
3741
return (await getSettingsTab()) === 'cardLayout';
3842
}
@@ -132,6 +136,7 @@ export default class FieldLimitsSettingsPage extends PageModification {
132136
tableId: FieldLimitsSettingsPage.ids.popupTable,
133137
tableBodyId: FieldLimitsSettingsPage.ids.popupTableBody,
134138
addLimitBtnId: FieldLimitsSettingsPage.ids.popupTableAddLimitRow,
139+
editLimitBtnId: FieldLimitsSettingsPage.ids.popupTableEditLimitRow,
135140
fieldValueInputId: FieldLimitsSettingsPage.ids.inputFieldValue,
136141
visualNameInputId: FieldLimitsSettingsPage.ids.visualNameInput,
137142
columnsSelectId: FieldLimitsSettingsPage.ids.columnsSelectId,
@@ -167,10 +172,10 @@ export default class FieldLimitsSettingsPage extends PageModification {
167172
const isSelected = row.querySelector('input[type="checkbox"]:checked');
168173
if (!isSelected) return;
169174

170-
const id = row.getAttribute('data-field-project-row');
175+
const limitKey = row.getAttribute('data-field-project-row');
171176

172-
this.settings.limits[id] = {
173-
...this.settings.limits[id],
177+
this.settings.limits[limitKey] = {
178+
...this.settings.limits[limitKey],
174179
...mergedRowObj,
175180
};
176181
});
@@ -188,14 +193,22 @@ export default class FieldLimitsSettingsPage extends PageModification {
188193
});
189194
}
190195

191-
handleAddFieldLimitRowClick() {
192-
this.addEventListener(document.getElementById(FieldLimitsSettingsPage.ids.popupTableAddLimitRow), 'click', () => {
196+
handleButtonsFieldLimitRowClick() {
197+
const btnAdd = document.getElementById(FieldLimitsSettingsPage.ids.popupTableAddLimitRow);
198+
const btnEdit = document.getElementById(FieldLimitsSettingsPage.ids.popupTableEditLimitRow);
199+
200+
const setValuesToTable = limitKey => {
193201
const { fieldId, fieldValue, visualValue, limit } = this.getInputValues();
194202
const { columns, swimlanes } = this.getSelectedSwimlanesAndColumnsOptions();
195-
const id = limitsKey.encode(fieldValue, fieldId);
203+
const isEdit = limitKey != null;
196204

197-
if (!this.settings.limits[id]) {
198-
this.settings.limits[id] = {
205+
if (!isEdit) {
206+
limitKey = limitsKey.encode(fieldValue, fieldId);
207+
}
208+
209+
if (!this.settings.limits[limitKey] || isEdit) {
210+
this.settings.limits[limitKey] = {
211+
...this.settings.limits[limitKey],
199212
visualValue,
200213
fieldValue,
201214
fieldId,
@@ -206,6 +219,20 @@ export default class FieldLimitsSettingsPage extends PageModification {
206219
}
207220

208221
this.renderRows();
222+
btnEdit.disabled = true;
223+
this.limitKeyOfEditable = undefined;
224+
};
225+
226+
this.addEventListener(btnAdd, 'click', () => {
227+
setValuesToTable(null);
228+
});
229+
230+
this.addEventListener(btnEdit, 'click', () => {
231+
if (this.limitKeyOfEditable == null) {
232+
btnEdit.disabled = true;
233+
return;
234+
}
235+
setValuesToTable(this.limitKeyOfEditable);
209236
});
210237
}
211238

@@ -231,7 +258,7 @@ export default class FieldLimitsSettingsPage extends PageModification {
231258
const { limit, columns, swimlanes, fieldId, fieldValue, visualValue, bkgColor } = this.settings.limits[limitKey];
232259

233260
this.renderLimitRow({
234-
id: limitKey,
261+
limitKey,
235262
fieldValue,
236263
visualValue,
237264
bkgColor,
@@ -242,19 +269,19 @@ export default class FieldLimitsSettingsPage extends PageModification {
242269
});
243270
});
244271

245-
this.handleAddFieldLimitRowClick();
272+
this.handleButtonsFieldLimitRowClick();
246273
this.handleAppliesLimitsToRows();
247274
}
248275

249-
renderLimitRow({ id, fieldValue, visualValue, bkgColor, fieldId, limit, columns, swimlanes }) {
276+
renderLimitRow({ limitKey, fieldValue, visualValue, bkgColor, fieldId, limit, columns, swimlanes }) {
250277
const nzFieldIdSettings = this.normalizedFields.byId[fieldId];
251278

252279
const fieldName = nzFieldIdSettings ? nzFieldIdSettings.name : `[${fieldId}]`;
253280
const row = this.insertHTML(
254281
document.getElementById(FieldLimitsSettingsPage.ids.popupTableBody),
255282
'beforeend',
256283
fieldRowTemplate({
257-
id,
284+
limitKey,
258285
fieldValue,
259286
visualValue,
260287
bkgColor,
@@ -263,13 +290,22 @@ export default class FieldLimitsSettingsPage extends PageModification {
263290
limit,
264291
columns: columns.map(columnId => this.normalizedColumns.byId[columnId] || `column [${fieldId}]`),
265292
swimlanes: swimlanes.map(swimlaneId => this.normalizedSwimlanes.byId[swimlaneId] || `swimlane [${fieldId}]`),
293+
editClassBtn: FieldLimitsSettingsPage.classes.editRowBtn,
266294
deleteClassBtn: FieldLimitsSettingsPage.classes.deleteRowBtn,
267295
})
268296
);
269297

270-
this.addEventListener(row.querySelector(`.${FieldLimitsSettingsPage.classes.deleteRowBtn}`), 'click', () => {
271-
delete this.settings.limits[id];
298+
this.addEventListener(row.querySelector(`.${FieldLimitsSettingsPage.classes.editRowBtn}`), 'click', event => {
299+
this.setInputValues(limitKey);
300+
event.stopPropagation();
301+
event.stopPropagation();
302+
});
303+
304+
this.addEventListener(row.querySelector(`.${FieldLimitsSettingsPage.classes.deleteRowBtn}`), 'click', event => {
305+
delete this.settings.limits[limitKey];
272306
row.remove();
307+
event.stopPropagation();
308+
event.stopPropagation();
273309
});
274310
}
275311

@@ -289,6 +325,31 @@ export default class FieldLimitsSettingsPage extends PageModification {
289325
};
290326
}
291327

328+
setInputValues(limitKey) {
329+
const { fieldValue, visualValue, limit, fieldId, columns, swimlanes } = this.settings.limits[limitKey];
330+
331+
this.limitKeyOfEditable = limitKey;
332+
document.getElementById(FieldLimitsSettingsPage.ids.popupTableEditLimitRow).disabled = false;
333+
334+
document.getElementById(FieldLimitsSettingsPage.ids.inputFieldValue).value = fieldValue;
335+
document.getElementById(FieldLimitsSettingsPage.ids.visualNameInput).value = visualValue;
336+
document.getElementById(FieldLimitsSettingsPage.ids.wipLimitInputId).value = limit;
337+
document.getElementById(FieldLimitsSettingsPage.ids.fieldSelectId).value = fieldId;
338+
this.setSelectedSwimlanesAndColumnsOptions(columns, swimlanes);
339+
}
340+
341+
setSelectedSwimlanesAndColumnsOptions(columns, swimlanes) {
342+
const columnsOptions = document.getElementById(FieldLimitsSettingsPage.ids.columnsSelectId).options;
343+
const swimlaneOptions = document.getElementById(FieldLimitsSettingsPage.ids.swimlanesSelectId).options;
344+
345+
columnsOptions.forEach(option => {
346+
option.selected = columns.includes(option.value);
347+
});
348+
swimlaneOptions.forEach(option => {
349+
option.selected = swimlanes.includes(option.value);
350+
});
351+
}
352+
292353
getSelectedSwimlanesAndColumnsOptions() {
293354
const columnsOptions = document.getElementById(FieldLimitsSettingsPage.ids.columnsSelectId).selectedOptions;
294355
const swimlaneOptions = document.getElementById(FieldLimitsSettingsPage.ids.swimlanesSelectId).selectedOptions;

src/field-limits/SettingsPage/styles.css

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
.addFieldLimitTable {
2-
width: 100%;
2+
width: 100%;
3+
}
4+
5+
.jhControlRowBtn {
6+
margin-left: 0px !important;
7+
margin-bottom: 2px !important;
8+
}
9+
10+
.editFieldLimitBtn {
11+
margin-top: 1rem !important;
312
}
413

514
.addFieldLimitBtn {
6-
margin-top: 1rem !important;
15+
margin-top: 1rem !important;
716
}
817

918
.settingsEditBtn {
10-
margin-top: 1rem;
19+
margin-top: 1rem !important;
1120
}
1221

1322
.visualName {
@@ -22,4 +31,4 @@
2231
line-height: 32px;
2332
overflow: hidden;
2433
cursor: pointer;
25-
}
34+
}

0 commit comments

Comments
 (0)