Skip to content

Commit d765548

Browse files
Merge remote-tracking branch 'my/25_1_ng_nested_fix' into 25_1_ng_nested_fix
2 parents bf36e92 + f6f0f3c commit d765548

File tree

3 files changed

+52
-28
lines changed

3 files changed

+52
-28
lines changed

packages/devextreme/js/__internal/ui/file_uploader.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1747,20 +1747,16 @@ class FileUploader extends Editor<FileUploaderProperties> {
17471747

17481748
_getDropZoneElement(isCustomTarget: boolean, e: DxEvent): Element | undefined {
17491749
if (!e.currentTarget) {
1750-
return;
1750+
return undefined;
17511751
}
17521752

17531753
const { dropZone } = this.option();
17541754

1755-
// @ts-expect-error dropZone option public type: it can be an array of Elements or NodeList
1756-
const targetList = isCustomTarget ? Array.from(dropZone) : [this._$inputWrapper];
1757-
1758-
const targetListElements = targetList.map(
1759-
(element: dxElementWrapper | string) => $(element).get(0),
1760-
);
1755+
const targetList = isCustomTarget ? $(dropZone).toArray() : [this._$inputWrapper];
1756+
const targetListElements = targetList.map((element) => $(element).get(0));
1757+
const currentTargetIndex = targetListElements.indexOf(e.currentTarget);
17611758

1762-
// eslint-disable-next-line consistent-return
1763-
return targetListElements[targetListElements.indexOf(e.currentTarget)];
1759+
return targetListElements[currentTargetIndex];
17641760
}
17651761

17661762
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type, consistent-return

packages/devextreme/js/__internal/ui/m_load_panel.ts

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import type { DefaultOptionsRule } from '@js/core/options/utils';
44
import type { dxElementWrapper } from '@js/core/renderer';
55
import $ from '@js/core/renderer';
66
import { noop } from '@js/core/utils/common';
7+
import type { DeferredObj } from '@js/core/utils/deferred';
78
import { Deferred } from '@js/core/utils/deferred';
89
import LoadIndicator from '@js/ui/load_indicator';
910
import type { Properties } from '@js/ui/load_panel';
10-
import { isFluent, isMaterial } from '@js/ui/themes';
11+
import { current, isFluent, isMaterial } from '@js/ui/themes';
1112
import type { OptionChanged } from '@ts/core/widget/types';
1213
import type { SupportedKeys } from '@ts/core/widget/widget';
1314
import Overlay from '@ts/ui/overlay/overlay';
@@ -29,6 +30,7 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
2930

3031
_$loadPanelContentWrapper?: dxElementWrapper;
3132

33+
// eslint-disable-next-line no-restricted-globals -- needed for delayed panel show
3234
_showTimeout?: ReturnType<typeof setTimeout>;
3335

3436
_supportedKeys(): SupportedKeys {
@@ -44,7 +46,7 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
4446
message: messageLocalization.format('Loading'),
4547
width: 222,
4648
height: 90,
47-
// @ts-expect-error ts-error
49+
// @ts-expect-error 'null' is not assignable
4850
animation: null,
4951
showIndicator: true,
5052
indicatorSrc: '',
@@ -68,8 +70,7 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
6870
},
6971
{
7072
device(): boolean {
71-
// @ts-expect-error ts-error
72-
return isMaterial();
73+
return isMaterial(current());
7374
},
7475
options: {
7576
message: '',
@@ -81,8 +82,7 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
8182
},
8283
{
8384
device(): boolean {
84-
// @ts-expect-error ts-error
85-
return isFluent();
85+
return isFluent(current());
8686
},
8787
options: {
8888
width: 'auto',
@@ -93,8 +93,7 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
9393
}
9494

9595
_init(): void {
96-
// @ts-expect-error ts-error
97-
super._init.apply(this, arguments);
96+
super._init();
9897
}
9998

10099
_render(): void {
@@ -113,13 +112,15 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
113112
const showIndicator = this.option('showIndicator');
114113
if (!showIndicator) {
115114
const aria = this._getAriaAttributes();
116-
// @ts-expect-error ts-error
115+
116+
// @ts-expect-error attr should have overload
117117
this.$wrapper().attr(aria);
118118
}
119119
}
120120

121-
_getAriaAttributes() {
121+
_getAriaAttributes(): Record<string, string> {
122122
const { message } = this.option();
123+
123124
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
124125
const label = message || messageLocalization.format('Loading');
125126

@@ -131,9 +132,8 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
131132
return aria;
132133
}
133134

134-
// @ts-expect-error ts-error
135-
_renderContentImpl(): void {
136-
super._renderContentImpl();
135+
_renderContentImpl(): Promise<void> {
136+
const result = super._renderContentImpl();
137137

138138
this.$content().addClass(LOADPANEL_CONTENT_CLASS);
139139

@@ -145,9 +145,11 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
145145
this._cleanPreviousContent();
146146
this._renderLoadIndicator();
147147
this._renderMessage();
148+
149+
return result;
148150
}
149151

150-
_show() {
152+
_show(): DeferredObj<unknown> | Promise<unknown> {
151153
const { delay } = this.option();
152154

153155
if (!delay) {
@@ -158,8 +160,10 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
158160
const callBase = super._show.bind(this);
159161

160162
this._clearShowTimeout();
163+
164+
// eslint-disable-next-line no-restricted-globals -- needed for delayed panel show
161165
this._showTimeout = setTimeout(() => {
162-
// @ts-expect-error ts-error
166+
// @ts-expect-error done should be typed
163167
callBase().done(() => {
164168
deferred.resolve();
165169
});
@@ -168,8 +172,9 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
168172
return deferred.promise();
169173
}
170174

171-
_hide() {
175+
_hide(): DeferredObj<unknown> | Promise<unknown> {
172176
this._clearShowTimeout();
177+
173178
return super._hide();
174179
}
175180

@@ -184,9 +189,12 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
184189

185190
const { message } = this.option();
186191

187-
if (!message) return;
192+
if (!message) {
193+
return;
194+
}
188195

189-
const $message = $('<div>').addClass(LOADPANEL_MESSAGE_CLASS)
196+
const $message = $('<div>')
197+
.addClass(LOADPANEL_MESSAGE_CLASS)
190198
.text(message);
191199

192200
this._$loadPanelContentWrapper.append($message);
@@ -212,7 +220,8 @@ class LoadPanel extends Overlay<LoadPanelProperties> {
212220
_cleanPreviousContent(): void {
213221
this.$content().find(`.${LOADPANEL_MESSAGE_CLASS}`).remove();
214222
this.$content().find(`.${LOADPANEL_INDICATOR_CLASS}`).remove();
215-
delete this._$indicator;
223+
224+
this._$indicator = undefined;
216225
}
217226

218227
_togglePaneVisible(): void {

packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/fileUploader.tests.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3901,6 +3901,25 @@ QUnit.module('Drag and drop', moduleConfig, () => {
39013901
assert.notOk(onDropZoneLeaveSpy.called);
39023902
});
39033903

3904+
QUnit.test('dropZoneEnter should not cause an error if custom dropZone is specified as string', function(assert) {
3905+
const customDropZone = $('<div>').addClass('drop').appendTo('#qunit-fixture');
3906+
const onDropZoneEnterSpy = sinon.spy();
3907+
3908+
$('#fileuploader').dxFileUploader({
3909+
uploadMode: 'useButtons',
3910+
dropZone: '.drop',
3911+
onDropZoneEnter: onDropZoneEnterSpy
3912+
});
3913+
3914+
try {
3915+
triggerDragEvent(customDropZone, 'dragenter');
3916+
3917+
assert.ok(true, 'No error is thrown');
3918+
} catch(error) {
3919+
assert.ok(false, `Error is thrown: ${error}`);
3920+
}
3921+
});
3922+
39043923
QUnit.test('onValueChanged event should not fire if dragged item is not file', function(assert) {
39053924
const onValueChangedSpy = sinon.spy();
39063925

0 commit comments

Comments
 (0)