diff --git a/packages/devextreme-angular/src/ui/chat/index.ts b/packages/devextreme-angular/src/ui/chat/index.ts index 7bcf6a339055..01c951c04130 100644 --- a/packages/devextreme-angular/src/ui/chat/index.ts +++ b/packages/devextreme-angular/src/ui/chat/index.ts @@ -22,7 +22,7 @@ import { } from '@angular/core'; -import type { default as dxChat, Alert, Message, AttachmentDownloadClickEvent, DisposingEvent, InitializedEvent, InputFieldTextChangedEvent, MessageDeletedEvent, MessageDeletingEvent, MessageEditCanceledEvent, MessageEditingStartEvent, MessageEnteredEvent, MessageUpdatedEvent, MessageUpdatingEvent, OptionChangedEvent, TypingEndEvent, TypingStartEvent, User } from 'devextreme/ui/chat'; +import type { default as dxChat, Alert, Message, AttachmentDownloadClickEvent, DisposingEvent, InitializedEvent, InputFieldTextChangedEvent, MessageDeletedEvent, MessageDeletingEvent, MessageEditCanceledEvent, MessageEditingStartEvent, MessageEnteredEvent, MessageUpdatedEvent, MessageUpdatingEvent, OptionChangedEvent, TypingEndEvent, TypingStartEvent, SendButtonProperties, User } from 'devextreme/ui/chat'; import type { default as DataSource, DataSourceOptions } from 'devextreme/data/data_source'; import type { Store } from 'devextreme/data/store'; import type { Format } from 'devextreme/common/core/localization'; @@ -61,6 +61,7 @@ import { DxoChatEditingModule } from 'devextreme-angular/ui/chat/nested'; import { DxoChatFileUploaderOptionsModule } from 'devextreme-angular/ui/chat/nested'; import { DxiChatItemModule } from 'devextreme-angular/ui/chat/nested'; import { DxoChatMessageTimestampFormatModule } from 'devextreme-angular/ui/chat/nested'; +import { DxoChatSendButtonOptionsModule } from 'devextreme-angular/ui/chat/nested'; import { DxoChatSpeechRecognitionConfigModule } from 'devextreme-angular/ui/chat/nested'; import { DxoChatSpeechToTextOptionsModule } from 'devextreme-angular/ui/chat/nested'; import { DxiChatTypingUserModule } from 'devextreme-angular/ui/chat/nested'; @@ -368,6 +369,16 @@ export class DxChatComponent extends DxComponent implements OnDestroy, OnChanges } + + @Input() + get sendButtonOptions(): SendButtonProperties { + return this._getOption('sendButtonOptions'); + } + set sendButtonOptions(value: SendButtonProperties) { + this._setOption('sendButtonOptions', value); + } + + /** * [descr:dxChatOptions.showAvatar] @@ -746,6 +757,13 @@ export class DxChatComponent extends DxComponent implements OnDestroy, OnChanges */ @Output() rtlEnabledChange: EventEmitter; + /** + + * This member supports the internal infrastructure and is not intended to be used directly from your code. + + */ + @Output() sendButtonOptionsChange: EventEmitter; + /** * This member supports the internal infrastructure and is not intended to be used directly from your code. @@ -863,6 +881,7 @@ export class DxChatComponent extends DxComponent implements OnDestroy, OnChanges { emit: 'messageTimestampFormatChange' }, { emit: 'reloadOnChangeChange' }, { emit: 'rtlEnabledChange' }, + { emit: 'sendButtonOptionsChange' }, { emit: 'showAvatarChange' }, { emit: 'showDayHeadersChange' }, { emit: 'showMessageTimestampChange' }, @@ -943,6 +962,7 @@ export class DxChatComponent extends DxComponent implements OnDestroy, OnChanges DxoChatFileUploaderOptionsModule, DxiChatItemModule, DxoChatMessageTimestampFormatModule, + DxoChatSendButtonOptionsModule, DxoChatSpeechRecognitionConfigModule, DxoChatSpeechToTextOptionsModule, DxiChatTypingUserModule, @@ -969,6 +989,7 @@ export class DxChatComponent extends DxComponent implements OnDestroy, OnChanges DxoChatFileUploaderOptionsModule, DxiChatItemModule, DxoChatMessageTimestampFormatModule, + DxoChatSendButtonOptionsModule, DxoChatSpeechRecognitionConfigModule, DxoChatSpeechToTextOptionsModule, DxiChatTypingUserModule, diff --git a/packages/devextreme-angular/src/ui/chat/nested/index.ts b/packages/devextreme-angular/src/ui/chat/nested/index.ts index 90da87825498..3dc191bfbd5c 100644 --- a/packages/devextreme-angular/src/ui/chat/nested/index.ts +++ b/packages/devextreme-angular/src/ui/chat/nested/index.ts @@ -7,6 +7,7 @@ export * from './editing'; export * from './file-uploader-options'; export * from './item-dxi'; export * from './message-timestamp-format'; +export * from './send-button-options'; export * from './speech-recognition-config'; export * from './speech-to-text-options'; export * from './typing-user-dxi'; diff --git a/packages/devextreme-angular/src/ui/chat/nested/send-button-options.ts b/packages/devextreme-angular/src/ui/chat/nested/send-button-options.ts new file mode 100644 index 000000000000..af78da8f0f26 --- /dev/null +++ b/packages/devextreme-angular/src/ui/chat/nested/send-button-options.ts @@ -0,0 +1,92 @@ +/* tslint:disable:max-line-length */ + + +import { + Component, + OnInit, + OnDestroy, + NgModule, + Host, + SkipSelf, + Input +} from '@angular/core'; + + + + +import type { SendButtonAction, SendButtonClickEvent } from 'devextreme/ui/chat'; + +import { + DxIntegrationModule, + NestedOptionHost, +} from 'devextreme-angular/core'; +import { NestedOption } from 'devextreme-angular/core'; + + +@Component({ + selector: 'dxo-chat-send-button-options', + standalone: true, + template: '', + styles: [''], + imports: [ DxIntegrationModule ], + providers: [NestedOptionHost] +}) +export class DxoChatSendButtonOptionsComponent extends NestedOption implements OnDestroy, OnInit { + @Input() + get action(): SendButtonAction { + return this._getOption('action'); + } + set action(value: SendButtonAction) { + this._setOption('action', value); + } + + @Input() + get icon(): string { + return this._getOption('icon'); + } + set icon(value: string) { + this._setOption('icon', value); + } + + @Input() + get onClick(): ((e: SendButtonClickEvent) => void) { + return this._getOption('onClick'); + } + set onClick(value: ((e: SendButtonClickEvent) => void)) { + this._setOption('onClick', value); + } + + + protected get _optionPath() { + return 'sendButtonOptions'; + } + + + constructor(@SkipSelf() @Host() parentOptionHost: NestedOptionHost, + @Host() optionHost: NestedOptionHost) { + super(); + parentOptionHost.setNestedOption(this); + optionHost.setHost(this, this._fullOptionPath.bind(this)); + } + + + ngOnInit() { + this._addRecreatedComponent(); + } + + ngOnDestroy() { + this._addRemovedOption(this._getOptionPath()); + } + + +} + +@NgModule({ + imports: [ + DxoChatSendButtonOptionsComponent + ], + exports: [ + DxoChatSendButtonOptionsComponent + ], +}) +export class DxoChatSendButtonOptionsModule { } diff --git a/packages/devextreme-metadata/make-angular-metadata.ts b/packages/devextreme-metadata/make-angular-metadata.ts index 659868b65b53..8754150e81dc 100644 --- a/packages/devextreme-metadata/make-angular-metadata.ts +++ b/packages/devextreme-metadata/make-angular-metadata.ts @@ -51,7 +51,7 @@ Ng.makeMetadata({ removeMembers(/\/card_view:/), removeMembers(/\/chat:TextMessage.attachments/), removeMembers( - /\/chat:dxChatOptions\.(fileUploaderOptions|inputFieldText|onAttachmentDownloadClick|speechToTextOptions)/, + /\/chat:dxChatOptions\.(fileUploaderOptions|inputFieldText|sendButtonOptions|speechToTextOptions|onAttachmentDownloadClick)/, ), removeMembers(/\/form:dxFormOptions\.(aiIntegration|onSmartPasting|onSmartPasted|smartPaste)/), removeMembers(/\/form:dxFormSimpleItem\.aiOptions/), diff --git a/packages/devextreme-react/src/chat.ts b/packages/devextreme-react/src/chat.ts index 6df640011bc2..e3c1d230ed2f 100644 --- a/packages/devextreme-react/src/chat.ts +++ b/packages/devextreme-react/src/chat.ts @@ -8,7 +8,7 @@ import dxChat, { import { Component as BaseComponent, IHtmlOptions, ComponentRef, NestedComponentMeta } from "./core/component"; import NestedOption from "./core/nested-option"; -import type { Message, AttachmentDownloadClickEvent, DisposingEvent, InitializedEvent, MessageDeletedEvent, MessageDeletingEvent, MessageEditCanceledEvent, MessageEditingStartEvent, MessageEnteredEvent, MessageUpdatedEvent, MessageUpdatingEvent, TypingEndEvent, TypingStartEvent, Attachment as ChatAttachment, User as ChatUser } from "devextreme/ui/chat"; +import type { Message, AttachmentDownloadClickEvent, DisposingEvent, InitializedEvent, MessageDeletedEvent, MessageDeletingEvent, MessageEditCanceledEvent, MessageEditingStartEvent, MessageEnteredEvent, MessageUpdatedEvent, MessageUpdatingEvent, TypingEndEvent, TypingStartEvent, Attachment as ChatAttachment, User as ChatUser, SendButtonAction, SendButtonClickEvent } from "devextreme/ui/chat"; import type { DisposingEvent as FileUploaderDisposingEvent, InitializedEvent as FileUploaderInitializedEvent, BeforeSendEvent, ContentReadyEvent, DropZoneEnterEvent, DropZoneLeaveEvent, FilesUploadedEvent, OptionChangedEvent, ProgressEvent, UploadAbortedEvent, UploadedEvent, UploadErrorEvent, UploadStartedEvent, ValueChangedEvent, UploadHttpMethod, FileUploadMode } from "devextreme/ui/file_uploader"; import type { DisposingEvent as SpeechToTextDisposingEvent, InitializedEvent as SpeechToTextInitializedEvent, ContentReadyEvent as SpeechToTextContentReadyEvent, OptionChangedEvent as SpeechToTextOptionChangedEvent, CustomSpeechRecognizer as SpeechToTextCustomSpeechRecognizer, EndEvent, ErrorEvent, ResultEvent, StartClickEvent, StopClickEvent, SpeechRecognitionConfig as SpeechToTextSpeechRecognitionConfig } from "devextreme/ui/speech_to_text"; import type { Format, ValidationStatus, ButtonStyle, ButtonType } from "devextreme/common"; @@ -74,6 +74,7 @@ const Chat = memo( fileUploaderOptions: { optionName: "fileUploaderOptions", isCollectionItem: false }, item: { optionName: "items", isCollectionItem: true }, messageTimestampFormat: { optionName: "messageTimestampFormat", isCollectionItem: false }, + sendButtonOptions: { optionName: "sendButtonOptions", isCollectionItem: false }, speechToTextOptions: { optionName: "speechToTextOptions", isCollectionItem: false }, typingUser: { optionName: "typingUsers", isCollectionItem: true }, user: { optionName: "user", isCollectionItem: false } @@ -372,6 +373,26 @@ const MessageTimestampFormat = Object.assign void); +}> +const _componentSendButtonOptions = (props: ISendButtonOptionsProps) => { + return React.createElement(NestedOption, { + ...props, + elementDescriptor: { + OptionName: "sendButtonOptions", + }, + }); +}; + +const SendButtonOptions = Object.assign(_componentSendButtonOptions, { + componentType: "option", +}); + // owners: // SpeechToTextOptions type ISpeechRecognitionConfigProps = React.PropsWithChildren<{ @@ -510,6 +531,8 @@ export { IItemProps, MessageTimestampFormat, IMessageTimestampFormatProps, + SendButtonOptions, + ISendButtonOptionsProps, SpeechRecognitionConfig, ISpeechRecognitionConfigProps, SpeechToTextOptions, diff --git a/packages/devextreme-vue/src/chat.ts b/packages/devextreme-vue/src/chat.ts index bf2b6fe7dc2b..3475c1be04bf 100644 --- a/packages/devextreme-vue/src/chat.ts +++ b/packages/devextreme-vue/src/chat.ts @@ -22,8 +22,11 @@ import { OptionChangedEvent, TypingEndEvent, TypingStartEvent, + SendButtonProperties, User, Attachment, + SendButtonAction, + SendButtonClickEvent, } from "devextreme/ui/chat"; import { DataSourceOptions, @@ -110,6 +113,7 @@ type AccessibleOptions = Pick void)>, reloadOnChange: Boolean, rtlEnabled: Boolean, + sendButtonOptions: Object as PropType>, showAvatar: Boolean, showDayHeaders: Boolean, showMessageTimestamp: Boolean, @@ -210,6 +215,7 @@ const componentConfig = { "update:onTypingStart": null, "update:reloadOnChange": null, "update:rtlEnabled": null, + "update:sendButtonOptions": null, "update:showAvatar": null, "update:showDayHeaders": null, "update:showMessageTimestamp": null, @@ -236,6 +242,7 @@ const componentConfig = { fileUploaderOptions: { isCollectionItem: false, optionName: "fileUploaderOptions" }, item: { isCollectionItem: true, optionName: "items" }, messageTimestampFormat: { isCollectionItem: false, optionName: "messageTimestampFormat" }, + sendButtonOptions: { isCollectionItem: false, optionName: "sendButtonOptions" }, speechToTextOptions: { isCollectionItem: false, optionName: "speechToTextOptions" }, typingUser: { isCollectionItem: true, optionName: "typingUsers" }, user: { isCollectionItem: false, optionName: "user" } @@ -586,6 +593,27 @@ const DxMessageTimestampFormat = defineComponent(DxMessageTimestampFormatConfig) (DxMessageTimestampFormat as any).$_optionName = "messageTimestampFormat"; +const DxSendButtonOptionsConfig = { + emits: { + "update:isActive": null, + "update:hoveredElement": null, + "update:action": null, + "update:icon": null, + "update:onClick": null, + }, + props: { + action: String as PropType, + icon: String, + onClick: Function as PropType<((e: SendButtonClickEvent) => void)> + } +}; + +prepareConfigurationComponentConfig(DxSendButtonOptionsConfig); + +const DxSendButtonOptions = defineComponent(DxSendButtonOptionsConfig); + +(DxSendButtonOptions as any).$_optionName = "sendButtonOptions"; + const DxSpeechRecognitionConfigConfig = { emits: { "update:isActive": null, @@ -747,6 +775,7 @@ export { DxFileUploaderOptions, DxItem, DxMessageTimestampFormat, + DxSendButtonOptions, DxSpeechRecognitionConfig, DxSpeechToTextOptions, DxTypingUser, diff --git a/packages/devextreme/js/ui/chat.d.ts b/packages/devextreme/js/ui/chat.d.ts index 0ae1d65d657e..101af800253b 100644 --- a/packages/devextreme/js/ui/chat.d.ts +++ b/packages/devextreme/js/ui/chat.d.ts @@ -16,6 +16,7 @@ import { Properties as SpeechToTextProperties } from './speech_to_text'; import { Properties as TextAreaProperties } from './text_area'; import { ValueChangedInfo } from './editor/editor'; import Widget, { WidgetOptions } from './widget/ui.widget'; +import dxButton from './button'; import { EventInfo, NativeEventInfo, @@ -51,6 +52,14 @@ export type InitializedEvent = InitializedEventInfo; */ export type OptionChangedEvent = EventInfo & ChangedOptionInfo; +/** + * @docid _ui_chat_SendButtonClickEvent + * @public + * @type object + * @inherits NativeEventInfo + */ +export type SendButtonClickEvent = NativeEventInfo; + /** * @docid _ui_chat_MessageEnteredEvent * @public @@ -346,49 +355,67 @@ export type EmptyViewTemplateData = { }; }; +/** @public */ +export type SendButtonAction = 'send' | 'custom'; + /** - * @deprecated use Properties instead - * @namespace DevExpress.ui - * @public * @docid + * @namespace DevExpress.ui.dxChat + * @public */ -export interface dxChatOptions extends WidgetOptions { +export type SendButtonProperties = { /** * @docid - * @default true * @public + * @default 'send' */ - activeStateEnabled?: boolean; + action?: SendButtonAction; /** * @docid - * @type dxFileUploaderOptions * @public + * @default 'arrowright' */ - fileUploaderOptions?: Omit; + icon?: string; /** * @docid - * @default true + * @type_function_param1 e:{ui/chat:SendButtonClickEvent} * @public */ - focusStateEnabled?: boolean; + onClick?: ((e: SendButtonClickEvent) => void); +}; + +/** + * @deprecated use Properties instead + * @namespace DevExpress.ui + * @public + * @docid + */ +export interface dxChatOptions extends WidgetOptions { /** * @docid * @default true * @public */ - hoverStateEnabled?: boolean; + activeStateEnabled?: boolean; /** * @docid - * @default { id: new Guid().toString() } + * @default [] * @public */ - user?: User; + alerts?: Array; /** * @docid - * @fires dxChatOptions.onOptionChanged + * @type string | Array | Store | DataSource | DataSourceOptions | null + * @default null * @public */ - items?: Array; + dataSource?: DataSourceLike | null; + /** + * @docid + * @default 'shortdate' + * @public + */ + dayHeaderFormat?: Format; /** * @docid * @public @@ -399,13 +426,13 @@ export interface dxChatOptions extends WidgetOptions { * @default false * @public */ - allowUpdating?: boolean | ((options: { component?: dxChat; message?: Message }) => boolean); + allowDeleting?: boolean | ((options: { component?: dxChat; message?: Message }) => boolean); /** * @docid * @default false * @public */ - allowDeleting?: boolean | ((options: { component?: dxChat; message?: Message }) => boolean); + allowUpdating?: boolean | ((options: { component?: dxChat; message?: Message }) => boolean); }; /** * @docid @@ -416,36 +443,35 @@ export interface dxChatOptions extends WidgetOptions { emptyViewTemplate?: template | null | ((data: EmptyViewTemplateData, itemElement: DxElement) => string | UserDefinedElement); /** * @docid - * @type string | Array | Store | DataSource | DataSourceOptions | null - * @default null + * @type dxFileUploaderOptions * @public */ - dataSource?: DataSourceLike | null; + fileUploaderOptions?: Omit; /** * @docid - * @default 'shortdate' + * @default true * @public */ - dayHeaderFormat?: Format; + focusStateEnabled?: boolean; /** * @docid * @default true * @public */ - reloadOnChange?: boolean; + hoverStateEnabled?: boolean; /** * @docid - * @default [] + * @default "" + * @type string|undefined * @public */ - alerts?: Array; + inputFieldText?: TextAreaProperties['value']; /** * @docid - * @default "" - * @type string|undefined + * @fires dxChatOptions.onOptionChanged * @public */ - inputFieldText?: TextAreaProperties['value']; + items?: Array; /** * @docid * @default null @@ -461,34 +487,39 @@ export interface dxChatOptions extends WidgetOptions { messageTimestampFormat?: Format; /** * @docid - * @default [] + * @default true * @public */ - typingUsers?: Array; + reloadOnChange?: boolean; /** * @docid - * @default true * @public */ - showDayHeaders?: boolean; + sendButtonOptions?: SendButtonProperties; /** * @docid * @default true * @public */ - showUserName?: boolean; + showAvatar?: boolean; /** * @docid * @default true * @public */ - showAvatar?: boolean; + showDayHeaders?: boolean; /** * @docid * @default true * @public */ showMessageTimestamp?: boolean; + /** + * @docid + * @default true + * @public + */ + showUserName?: boolean; /** * @docid * @default false @@ -501,6 +532,18 @@ export interface dxChatOptions extends WidgetOptions { * @public */ speechToTextOptions?: Omit; + /** + * @docid + * @default [] + * @public + */ + typingUsers?: Array; + /** + * @docid + * @default { id: new Guid().toString() } + * @public + */ + user?: User; /** * @docid * @default undefined @@ -520,75 +563,75 @@ export interface dxChatOptions extends WidgetOptions { /** * @docid * @default undefined - * @type_function_param1 e:{ui/chat:MessageEnteredEvent} + * @type_function_param1 e:{ui/chat:MessageDeletedEvent} * @action * @public */ - onMessageEntered?: ((e: MessageEnteredEvent) => void) | undefined; + onMessageDeleted?: ((e: MessageDeletedEvent) => void) | undefined; /** * @docid * @default undefined - * @type_function_param1 e:{ui/chat:TypingStartEvent} + * @type_function_param1 e:{ui/chat:MessageDeletingEvent} * @action * @public */ - onTypingStart?: ((e: TypingStartEvent) => void) | undefined; + onMessageDeleting?: ((e: MessageDeletingEvent) => void) | undefined; /** * @docid * @default undefined - * @type_function_param1 e:{ui/chat:TypingEndEvent} + * @type_function_param1 e:{ui/chat:MessageEditCanceledEvent} * @action * @public */ - onTypingEnd?: ((e: TypingEndEvent) => void) | undefined; + onMessageEditCanceled?: ((e: MessageEditCanceledEvent) => void) | undefined; /** * @docid * @default undefined - * @type_function_param1 e:{ui/chat:MessageDeletingEvent} + * @type_function_param1 e:{ui/chat:MessageEditingStartEvent} * @action * @public */ - onMessageDeleting?: ((e: MessageDeletingEvent) => void) | undefined; + onMessageEditingStart?: ((e: MessageEditingStartEvent) => void) | undefined; /** * @docid * @default undefined - * @type_function_param1 e:{ui/chat:MessageDeletedEvent} + * @type_function_param1 e:{ui/chat:MessageEnteredEvent} * @action * @public */ - onMessageDeleted?: ((e: MessageDeletedEvent) => void) | undefined; + onMessageEntered?: ((e: MessageEnteredEvent) => void) | undefined; /** * @docid * @default undefined - * @type_function_param1 e:{ui/chat:MessageEditingStartEvent} + * @type_function_param1 e:{ui/chat:MessageUpdatedEvent} * @action * @public */ - onMessageEditingStart?: ((e: MessageEditingStartEvent) => void) | undefined; + onMessageUpdated?: ((e: MessageUpdatedEvent) => void) | undefined; /** * @docid * @default undefined - * @type_function_param1 e:{ui/chat:MessageEditCanceledEvent} + * @type_function_param1 e:{ui/chat:MessageUpdatingEvent} * @action * @public */ - onMessageEditCanceled?: ((e: MessageEditCanceledEvent) => void) | undefined; + onMessageUpdating?: ((e: MessageUpdatingEvent) => void) | undefined; /** * @docid * @default undefined - * @type_function_param1 e:{ui/chat:MessageUpdatingEvent} + * @type_function_param1 e:{ui/chat:TypingEndEvent} * @action * @public */ - onMessageUpdating?: ((e: MessageUpdatingEvent) => void) | undefined; + onTypingEnd?: ((e: TypingEndEvent) => void) | undefined; /** * @docid * @default undefined - * @type_function_param1 e:{ui/chat:MessageUpdatedEvent} + * @type_function_param1 e:{ui/chat:TypingStartEvent} * @action * @public */ - onMessageUpdated?: ((e: MessageUpdatedEvent) => void) | undefined; + onTypingStart?: ((e: TypingStartEvent) => void) | undefined; } /** diff --git a/packages/devextreme/js/ui/chat_types.d.ts b/packages/devextreme/js/ui/chat_types.d.ts index 23ad3fd6a0f4..88c3313be507 100644 --- a/packages/devextreme/js/ui/chat_types.d.ts +++ b/packages/devextreme/js/ui/chat_types.d.ts @@ -2,6 +2,7 @@ export { DisposingEvent, InitializedEvent, OptionChangedEvent, + SendButtonClickEvent, MessageEnteredEvent, TypingStartEvent, TypingEndEvent, @@ -21,6 +22,8 @@ export { Message, MessageTemplateData, EmptyViewTemplateData, + SendButtonAction, + SendButtonProperties, dxChatOptions, Properties, } from './chat'; diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index e69e30db6bc2..a425272839cb 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -11333,6 +11333,15 @@ declare module DevExpress.ui { DevExpress.common.core.events.EventInfo & DevExpress.common.core.events.ChangedOptionInfo; export type Properties = dxChatOptions; + export type SendButtonAction = 'send' | 'custom'; + /** + * [descr:_ui_chat_SendButtonClickEvent] + */ + export type SendButtonClickEvent = + DevExpress.common.core.events.NativeEventInfo< + dxButton, + DevExpress.events.InteractionEvent + >; /** * [descr:_ui_chat_TypingEndEvent] */ @@ -11367,45 +11376,34 @@ declare module DevExpress.ui { */ activeStateEnabled?: boolean; /** - * [descr:dxChatOptions.fileUploaderOptions] - */ - fileUploaderOptions?: Omit< - DevExpress.ui.dxFileUploader.Properties, - 'dialogTrigger' | 'showFileList' | 'uploadMode' | 'value' - >; - /** - * [descr:dxChatOptions.focusStateEnabled] - */ - focusStateEnabled?: boolean; - /** - * [descr:dxChatOptions.hoverStateEnabled] + * [descr:dxChatOptions.alerts] */ - hoverStateEnabled?: boolean; + alerts?: Array; /** - * [descr:dxChatOptions.user] + * [descr:dxChatOptions.dataSource] */ - user?: DevExpress.ui.dxChat.User; + dataSource?: DevExpress.data.DataSourceLike | null; /** - * [descr:dxChatOptions.items] + * [descr:dxChatOptions.dayHeaderFormat] */ - items?: Array; + dayHeaderFormat?: DevExpress.common.core.localization.Format; /** * [descr:dxChatOptions.editing] */ editing?: { /** - * [descr:dxChatOptions.editing.allowUpdating] + * [descr:dxChatOptions.editing.allowDeleting] */ - allowUpdating?: + allowDeleting?: | boolean | ((options: { component?: dxChat; message?: DevExpress.ui.dxChat.Message; }) => boolean); /** - * [descr:dxChatOptions.editing.allowDeleting] + * [descr:dxChatOptions.editing.allowUpdating] */ - allowDeleting?: + allowUpdating?: | boolean | ((options: { component?: dxChat; @@ -11423,25 +11421,28 @@ declare module DevExpress.ui { itemElement: DevExpress.core.DxElement ) => string | DevExpress.core.UserDefinedElement); /** - * [descr:dxChatOptions.dataSource] - */ - dataSource?: DevExpress.data.DataSourceLike | null; - /** - * [descr:dxChatOptions.dayHeaderFormat] + * [descr:dxChatOptions.fileUploaderOptions] */ - dayHeaderFormat?: DevExpress.common.core.localization.Format; + fileUploaderOptions?: Omit< + DevExpress.ui.dxFileUploader.Properties, + 'dialogTrigger' | 'showFileList' | 'uploadMode' | 'value' + >; /** - * [descr:dxChatOptions.reloadOnChange] + * [descr:dxChatOptions.focusStateEnabled] */ - reloadOnChange?: boolean; + focusStateEnabled?: boolean; /** - * [descr:dxChatOptions.alerts] + * [descr:dxChatOptions.hoverStateEnabled] */ - alerts?: Array; + hoverStateEnabled?: boolean; /** * [descr:dxChatOptions.inputFieldText] */ inputFieldText?: DevExpress.ui.dxTextArea.Properties['value']; + /** + * [descr:dxChatOptions.items] + */ + items?: Array; /** * [descr:dxChatOptions.messageTemplate] */ @@ -11457,25 +11458,29 @@ declare module DevExpress.ui { */ messageTimestampFormat?: DevExpress.common.core.localization.Format; /** - * [descr:dxChatOptions.typingUsers] - */ - typingUsers?: Array; - /** - * [descr:dxChatOptions.showDayHeaders] + * [descr:dxChatOptions.reloadOnChange] */ - showDayHeaders?: boolean; + reloadOnChange?: boolean; /** - * [descr:dxChatOptions.showUserName] + * [descr:dxChatOptions.sendButtonOptions] */ - showUserName?: boolean; + sendButtonOptions?: DevExpress.ui.dxChat.SendButtonProperties; /** * [descr:dxChatOptions.showAvatar] */ showAvatar?: boolean; + /** + * [descr:dxChatOptions.showDayHeaders] + */ + showDayHeaders?: boolean; /** * [descr:dxChatOptions.showMessageTimestamp] */ showMessageTimestamp?: boolean; + /** + * [descr:dxChatOptions.showUserName] + */ + showUserName?: boolean; /** * [descr:dxChatOptions.speechToTextEnabled] */ @@ -11487,6 +11492,14 @@ declare module DevExpress.ui { DevExpress.ui.dxSpeechToText.Properties, 'stylingMode' | 'type' >; + /** + * [descr:dxChatOptions.typingUsers] + */ + typingUsers?: Array; + /** + * [descr:dxChatOptions.user] + */ + user?: DevExpress.ui.dxChat.User; /** * [descr:dxChatOptions.onAttachmentDownloadClick] */ @@ -11500,22 +11513,10 @@ declare module DevExpress.ui { | ((e: DevExpress.ui.dxChat.InputFieldTextChangedEvent) => void) | undefined; /** - * [descr:dxChatOptions.onMessageEntered] - */ - onMessageEntered?: - | ((e: DevExpress.ui.dxChat.MessageEnteredEvent) => void) - | undefined; - /** - * [descr:dxChatOptions.onTypingStart] - */ - onTypingStart?: - | ((e: DevExpress.ui.dxChat.TypingStartEvent) => void) - | undefined; - /** - * [descr:dxChatOptions.onTypingEnd] + * [descr:dxChatOptions.onMessageDeleted] */ - onTypingEnd?: - | ((e: DevExpress.ui.dxChat.TypingEndEvent) => void) + onMessageDeleted?: + | ((e: DevExpress.ui.dxChat.MessageDeletedEvent) => void) | undefined; /** * [descr:dxChatOptions.onMessageDeleting] @@ -11524,10 +11525,10 @@ declare module DevExpress.ui { | ((e: DevExpress.ui.dxChat.MessageDeletingEvent) => void) | undefined; /** - * [descr:dxChatOptions.onMessageDeleted] + * [descr:dxChatOptions.onMessageEditCanceled] */ - onMessageDeleted?: - | ((e: DevExpress.ui.dxChat.MessageDeletedEvent) => void) + onMessageEditCanceled?: + | ((e: DevExpress.ui.dxChat.MessageEditCanceledEvent) => void) | undefined; /** * [descr:dxChatOptions.onMessageEditingStart] @@ -11536,10 +11537,16 @@ declare module DevExpress.ui { | ((e: DevExpress.ui.dxChat.MessageEditingStartEvent) => void) | undefined; /** - * [descr:dxChatOptions.onMessageEditCanceled] + * [descr:dxChatOptions.onMessageEntered] */ - onMessageEditCanceled?: - | ((e: DevExpress.ui.dxChat.MessageEditCanceledEvent) => void) + onMessageEntered?: + | ((e: DevExpress.ui.dxChat.MessageEnteredEvent) => void) + | undefined; + /** + * [descr:dxChatOptions.onMessageUpdated] + */ + onMessageUpdated?: + | ((e: DevExpress.ui.dxChat.MessageUpdatedEvent) => void) | undefined; /** * [descr:dxChatOptions.onMessageUpdating] @@ -11548,10 +11555,16 @@ declare module DevExpress.ui { | ((e: DevExpress.ui.dxChat.MessageUpdatingEvent) => void) | undefined; /** - * [descr:dxChatOptions.onMessageUpdated] + * [descr:dxChatOptions.onTypingEnd] */ - onMessageUpdated?: - | ((e: DevExpress.ui.dxChat.MessageUpdatedEvent) => void) + onTypingEnd?: + | ((e: DevExpress.ui.dxChat.TypingEndEvent) => void) + | undefined; + /** + * [descr:dxChatOptions.onTypingStart] + */ + onTypingStart?: + | ((e: DevExpress.ui.dxChat.TypingStartEvent) => void) | undefined; } /** @@ -34166,6 +34179,23 @@ declare module DevExpress.ui.dxChat { [key: string]: any; }; + /** + * [descr:SendButtonProperties] + */ + export type SendButtonProperties = { + /** + * [descr:SendButtonProperties.action] + */ + action?: SendButtonAction; + /** + * [descr:SendButtonProperties.icon] + */ + icon?: string; + /** + * [descr:SendButtonProperties.onClick] + */ + onClick?: (e: SendButtonClickEvent) => void; + }; /** * [descr:TextMessage] */