Skip to content

Commit deaea07

Browse files
authored
HtmlEditor: generate button should be disabled when askAi TextArea is empty
1 parent 5f99c01 commit deaea07

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

packages/devextreme/js/__internal/ui/html_editor/ui/aiDialog.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ const POPUP_MIN_WIDTH = 288;
5555
const POPUP_MAX_WIDTH = 460;
5656
const LOADINDICATOR_SIZE = 48;
5757

58+
const INPUT_EVENT = 'input';
59+
5860
export const TEXT_AREA_MIN_HEIGHT = 64;
5961
export const TEXT_AREA_MAX_HEIGHT = 128;
6062
export const REPLACE_DROPDOWN_WIDTH = 150;
@@ -236,8 +238,17 @@ export default class AIDialog extends BaseDialog<AIDialogResult> {
236238
placeholder: localizationMessage.format('dxHtmlEditor-aiAskPlaceholder'),
237239
_shouldAttachKeyboardEvents: true,
238240
onInitialized: this._addEscapeHandler.bind(this),
241+
valueChangeEvent: INPUT_EVENT,
239242
onValueChanged: (e): void => {
240243
this._askAIPrompt = e.value;
244+
245+
if (this._isAskAICommandSelected) {
246+
const shouldRefreshToolbarItems = !e.value || !e.previousValue;
247+
248+
if (shouldRefreshToolbarItems) {
249+
this._refreshToolbarItems();
250+
}
251+
}
241252
},
242253
};
243254

@@ -412,6 +423,9 @@ export default class AIDialog extends BaseDialog<AIDialogResult> {
412423

413424
protected _getGenerateButtonItem(): NamedToolbarItem {
414425
const width = getActionButtonWidth();
426+
const promptTextArea = this._promptTextArea;
427+
const disabled = !promptTextArea.option('value');
428+
415429
return {
416430
name: 'generate',
417431
toolbar: 'bottom',
@@ -421,6 +435,7 @@ export default class AIDialog extends BaseDialog<AIDialogResult> {
421435
type: 'default',
422436
text: localizationMessage.format('dxHtmlEditor-aiGenerate'),
423437
stylingMode: 'contained',
438+
disabled,
424439
width,
425440
onClick: () => this._executeAICommand(),
426441
onInitialized: this._addEscapeHandler.bind(this),

packages/devextreme/testing/helpers/aiDialog.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ export const findButtonByName = (popup, name) => {
141141
const $bottomToolbar = popup.bottomToolbar();
142142
return $($bottomToolbar.find(`.${BUTTON_CLASS}`).eq(buttonIndex));
143143
};
144+
export const getButtonInstance = ($button) => $button.dxButton('instance');
144145

145146
export const getCommandSelectBoxInstance = ($container) => getDialogSelectBoxes($container).eq(0).dxSelectBox('instance');
146147
export const getOptionSelectBoxInstance = ($container) => getDialogSelectBoxes($container).eq(1).dxSelectBox('instance');

packages/devextreme/testing/tests/DevExpress.ui.widgets.htmlEditor/htmlEditorParts/aiDialog.tests.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
clickActionButton,
3434
getBottomToolbarItems,
3535
findButtonByName,
36+
getButtonInstance,
3637
getCommandSelectBoxInstance,
3738
getItemByName,
3839
getLoadIndicator,
@@ -210,6 +211,11 @@ QUnit.module('AIDialog', () => {
210211
this.promise.then(() => {
211212
this.setDialogState(element.state);
212213

214+
if(element.name === 'generate button') {
215+
const promptTextAreaInstance = getPromptTextAreaInstance(this.$element);
216+
promptTextAreaInstance.option('value', 'some question');
217+
}
218+
213219
const $element = $(`.${element.domClass}`).eq(element.index);
214220
const instance = $element[element.class]('instance');
215221

@@ -410,6 +416,9 @@ QUnit.module('AIDialog', () => {
410416
},
411417
});
412418

419+
const promptTextAreaInstance = getPromptTextAreaInstance(this.$element);
420+
promptTextAreaInstance.option('value', 'some question');
421+
413422
const $generateButton = findButtonByName(this.aiDialogPopup, 'generate');
414423
$generateButton.trigger('dxclick');
415424

@@ -501,6 +510,28 @@ QUnit.module('AIDialog', () => {
501510
assert.strictEqual(bottomToolbarItems.length, 1, '1 button is rendered');
502511
assert.strictEqual(bottomToolbarItems[0].name, 'generate', 'generate button is shown');
503512
});
513+
514+
QUnit.test('generate button should be disabled when textArea is empty', function(assert) {
515+
showAIDialog(this, {
516+
config: { currentCommand: 'askAI' }
517+
});
518+
519+
let generateButton = getButtonInstance(findButtonByName(this.aiDialogPopup, 'generate'));
520+
521+
assert.strictEqual(generateButton.option('disabled'), true, 'generate button is disabled on init');
522+
523+
const promptTextAreaInstance = getPromptTextAreaInstance(this.$element);
524+
525+
promptTextAreaInstance.option('value', 'f');
526+
generateButton = getButtonInstance(findButtonByName(this.aiDialogPopup, 'generate'));
527+
528+
assert.strictEqual(generateButton.option('disabled'), false, 'generate button is enabled after input some text');
529+
530+
promptTextAreaInstance.option('value', '');
531+
generateButton = getButtonInstance(findButtonByName(this.aiDialogPopup, 'generate'));
532+
533+
assert.strictEqual(generateButton.option('disabled'), true, 'generate button is disabled after input is cleared');
534+
});
504535
});
505536

506537
QUnit.module('integration execution and parameter checks', integrationModuleConfig, () => {
@@ -804,6 +835,9 @@ QUnit.module('AIDialog', () => {
804835

805836
this.showDialog({ currentCommand: 'askAI' });
806837

838+
const promptTextAreaInstance = getPromptTextAreaInstance(this.$element);
839+
promptTextAreaInstance.option('value', 'some question');
840+
807841
const $generateButton = findButtonByName(this.aiDialogPopup, 'generate');
808842
$generateButton.trigger('dxclick');
809843

@@ -900,8 +934,9 @@ QUnit.module('AIDialog', () => {
900934
this.showDialog({ currentCommand: 'askAI' });
901935

902936
const promptTextAreaInstance = getPromptTextAreaInstance(this.$element);
903-
const generateButton = findButtonByName(this.aiDialogPopup, 'generate');
937+
promptTextAreaInstance.option('value', 'some question');
904938

939+
const generateButton = findButtonByName(this.aiDialogPopup, 'generate');
905940
generateButton.trigger('dxclick');
906941

907942
assert.strictEqual(promptTextAreaInstance.option('disabled'), true, 'disabled during generating');

0 commit comments

Comments
 (0)