Skip to content

Commit 5cb032a

Browse files
authored
Gantt: restore Task Edit dialog state after Resource dialog closed (T1305943 )(2025.1) (#31123)
1 parent 8ee11bb commit 5cb032a

File tree

2 files changed

+89
-4
lines changed

2 files changed

+89
-4
lines changed

packages/devextreme/js/ui/gantt/ui.gantt.dialogs.js

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export class GanttDialog {
3434
return;
3535
}
3636
const isRefresh = this._popupInstance._isVisible() && this._dialogInfo && this._dialogInfo instanceof this.infoMap[name];
37-
this._dialogInfo = new this.infoMap[name](parameters, this._apply.bind(this), this.hide.bind(this), editingOptions);
37+
this._dialogInfo = new this.infoMap[name](parameters, this._apply.bind(this), this.hide.bind(this), editingOptions, this);
3838
this._popupInstance.option({
3939
showTitle: !!this._dialogInfo.getTitle(),
4040
title: this._dialogInfo.getTitle(),
@@ -51,19 +51,23 @@ export class GanttDialog {
5151
}
5252
}
5353
hide() {
54-
this._popupInstance.hide();
54+
if(this._dialogInfo.shouldHidePopup()) {
55+
this._popupInstance.hide();
56+
}
57+
5558
if(this._afterClosing) {
5659
this._afterClosing();
5760
}
5861
}
5962
}
6063

6164
class DialogInfoBase {
62-
constructor(parameters, applyAction, hideAction, editingOptions) {
65+
constructor(parameters, applyAction, hideAction, editingOptions, owner) {
6366
this._parameters = parameters;
6467
this._applyAction = applyAction;
6568
this._hideAction = hideAction;
6669
this._editingOptions = editingOptions;
70+
this._owner = owner;
6771
}
6872

6973
_getFormItems() { return {}; }
@@ -124,6 +128,9 @@ class DialogInfoBase {
124128
isValidated() {
125129
return true;
126130
}
131+
shouldHidePopup() {
132+
return true;
133+
}
127134
}
128135

129136
class TaskEditDialogInfo extends DialogInfoBase {
@@ -221,14 +228,36 @@ class TaskEditDialogInfo extends DialogInfoBase {
221228
text: '...',
222229
hint: messageLocalization.format('dxGantt-dialogEditResourceListHint'),
223230
onClick: () => {
224-
const showTaskEditDialogCallback = () => { this._parameters.showTaskEditDialogCommand.execute(); };
231+
const formData = this.getFormData();
232+
233+
const showTaskEditDialogCallback = () => {
234+
this._parameters.showTaskEditDialogCommand.execute();
235+
236+
this._restoreFormData(formData);
237+
};
238+
225239
this._parameters.showResourcesDialogCommand.execute(showTaskEditDialogCallback);
226240
}
227241
}
228242
}]
229243
}
230244
}];
231245
}
246+
_restoreFormData(formData) {
247+
const newForm = this._owner._dialogInfo._form;
248+
249+
const titleEdit = newForm.getEditor('title');
250+
const assignedEdit = newForm.getEditor('assigned.items');
251+
const startEdit = newForm.getEditor('start');
252+
const endEdit = newForm.getEditor('end');
253+
const progressEdit = newForm.getEditor('progress');
254+
255+
titleEdit.option('value', formData.title);
256+
assignedEdit.option('value', formData.assigned.items);
257+
startEdit.option('value', formData.start);
258+
endEdit.option('value', formData.end);
259+
progressEdit.option('value', formData.progress);
260+
}
232261
_getValidationMessage(isStartDependencies, correctDate) {
233262
if(isStartDependencies) {
234263
return messageLocalization.format('dxGantt-dialogStartDateValidation', this._getFormattedDateText(correctDate));
@@ -313,6 +342,9 @@ class ResourcesEditDialogInfo extends DialogInfoBase {
313342
}
314343
}];
315344
}
345+
shouldHidePopup() {
346+
return false;
347+
}
316348
}
317349

318350
class ConfirmDialogInfo extends DialogInfoBase {

packages/devextreme/testing/tests/DevExpress.ui.widgets/ganttParts/dialogs.tests.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,59 @@ QUnit.module('Dialogs', moduleConfig, () => {
8383
// Enabled boolean attributes return '' in jQuery 4+ and their name ('readonly') in jQuery 3
8484
assert.ok(readOnlyAttr === '' || readOnlyAttr === 'readonly', 'all inputs is readOnly');
8585
});
86+
87+
test('task editing then show resource dialog and restore task state', function(assert) {
88+
this.createInstance(options.allSourcesOptions);
89+
this.instance.option('editing.enabled', true);
90+
this.instance.option('selectedRowKey', 1);
91+
this.clock.tick(10);
92+
showTaskEditDialog(this.instance);
93+
this.clock.tick(10);
94+
let $dialog = $('body').find(Consts.POPUP_SELECTOR);
95+
assert.equal($dialog.length, 1, 'dialog is shown');
96+
97+
const $inputs = $dialog.find(Consts.INPUT_TEXT_EDITOR_SELECTOR);
98+
assert.equal($inputs.eq(0).val(), data.tasks[0].title, 'title text is shown');
99+
assert.equal((new Date($inputs.eq(1).val())).getTime(), data.tasks[0].start.getTime(), 'start task text is shown');
100+
assert.equal((new Date($inputs.eq(2).val())).getTime(), data.tasks[0].end.getTime(), 'end task text is shown');
101+
assert.equal($inputs.eq(3).val(), data.tasks[0].progress + '%', 'progress text is shown');
102+
const testTitle = 'text';
103+
const testProgress = 0.99;
104+
const testDate = new Date();
105+
106+
let titleTextBox = $dialog.find('.dx-textbox').eq(0).dxTextBox('instance');
107+
let progressTextBox = $dialog.find('.dx-numberbox').eq(0).dxNumberBox('instance');
108+
let startTextBox = $dialog.find('.dx-datebox').eq(0).dxDateBox('instance');
109+
let endTextBox = $dialog.find('.dx-datebox').eq(1).dxDateBox('instance');
110+
111+
titleTextBox.option('value', testTitle);
112+
progressTextBox.option('value', testProgress);
113+
startTextBox.option('value', testDate);
114+
endTextBox.option('value', testDate);
115+
116+
const $showResourceDialogButton = $dialog.find('.dx-popup-content').find('.dx-button').eq(0);
117+
$showResourceDialogButton.trigger('dxclick');
118+
this.clock.tick(10);
119+
120+
const $closeResourceDialogButton = $dialog.find('.dx-popup-bottom').find('.dx-button').eq(0);
121+
$closeResourceDialogButton.trigger('dxclick');
122+
this.clock.tick(10);
123+
124+
$dialog = $('body').find(Consts.POPUP_SELECTOR);
125+
126+
// Restore editors after closing resource dialog
127+
titleTextBox = $dialog.find('.dx-textbox').eq(0).dxTextBox('instance');
128+
progressTextBox = $dialog.find('.dx-numberbox').eq(0).dxNumberBox('instance');
129+
startTextBox = $dialog.find('.dx-datebox').eq(0).dxDateBox('instance');
130+
endTextBox = $dialog.find('.dx-datebox').eq(1).dxDateBox('instance');
131+
132+
assert.equal(titleTextBox.option('value'), testTitle, 'title is restored');
133+
assert.equal(progressTextBox.option('value'), testProgress, 'progress is restored');
134+
assert.equal(new Date(startTextBox.option('value')).getTime(), testDate.getTime(), 'start date is restored');
135+
assert.equal(new Date(endTextBox.option('value')).getTime(), testDate.getTime(), 'end date is restored');
136+
});
137+
138+
86139
test('showTaskDetailsDialog', function(assert) {
87140
this.createInstance(options.allSourcesOptions);
88141
this.instance.option('editing.enabled', true);

0 commit comments

Comments
 (0)