')
- .dxButton({
- icon: 'copy',
- stylingMode: 'text',
- hint: 'Copy',
- onClick: ({ component }) => {
- navigator.clipboard.writeText($textElement.text());
- component.option({ icon: 'check' });
- setTimeout(() => {
- component.option({ icon: 'copy' });
- }, 2500);
- },
- })
- .appendTo($buttonContainer);
-
- $('
')
- .dxButton({
- icon: 'refresh',
- stylingMode: 'text',
- hint: 'Regenerate',
- onClick: () => {
- updateLastMessage();
- regenerate();
- },
- })
- .appendTo($buttonContainer);
-
- $buttonContainer.appendTo(element);
+ renderMessageContent(message, element);
},
}).dxChat('instance');
});
diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/styles.css b/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/styles.css
index 4d6ace3854f6..52d39eaa6e2c 100644
--- a/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/styles.css
+++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/jQuery/styles.css
@@ -58,3 +58,8 @@
font-size: revert;
font-weight: revert;
}
+
+.dx-chat-disabled .dx-chat-messagebox {
+ opacity: 0.5;
+ pointer-events: none;
+}
diff --git a/apps/demos/Demos/Chat/Customization/Angular/app/app.component.css b/apps/demos/Demos/Chat/Customization/Angular/app/app.component.css
new file mode 100644
index 000000000000..9c2d96ac5b00
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/Angular/app/app.component.css
@@ -0,0 +1,38 @@
+.demo-container {
+ min-width: 720px;
+ display: flex;
+ gap: 20px;
+}
+
+::ng-deep .chat-container {
+ display: flex;
+ flex-grow: 1;
+ align-items: center;
+ justify-content: center;
+}
+
+::ng-deep .options {
+ padding: 20px;
+ display: flex;
+ flex-direction: column;
+ min-width: 280px;
+ background-color: rgba(191, 191, 191, 0.15);
+ gap: 16px;
+}
+
+::ng-deep .dx-chat {
+ max-width: 480px;
+}
+
+::ng-deep .caption {
+ font-size: var(--dx-font-size-sm);
+ font-weight: 500;
+}
+
+::ng-deep .option-separator {
+ border-bottom: 1px solid var(--dx-color-border);
+}
+
+::ng-deep .dx-avatar {
+ border: 1px solid var(--dx-color-border);
+}
diff --git a/apps/demos/Demos/Chat/Customization/Angular/app/app.component.html b/apps/demos/Demos/Chat/Customization/Angular/app/app.component.html
new file mode 100644
index 000000000000..f56f172747d3
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/Angular/app/app.component.html
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
Options
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Day Header Format:
+
+
+
+
+
+
+
+
+
+
+ Message Timestamp Format:
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/demos/Demos/Chat/Customization/Angular/app/app.component.ts b/apps/demos/Demos/Chat/Customization/Angular/app/app.component.ts
new file mode 100644
index 000000000000..4761f32429ad
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/Angular/app/app.component.ts
@@ -0,0 +1,63 @@
+import { NgModule, Component, enableProdMode } from '@angular/core';
+import { BrowserModule } from '@angular/platform-browser';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { DxChatModule, DxCheckBoxModule, DxSelectBoxModule } from 'devextreme-angular';
+import { User, Message, MessageEnteredEvent } from 'devextreme/ui/chat';
+import { Observable } from 'rxjs';
+import { AppService } from './app.service';
+
+if (!/localhost/.test(document.location.host)) {
+ enableProdMode();
+}
+
+let modulePrefix = '';
+// @ts-ignore
+if (window && window.config.packageConfigPaths) {
+ modulePrefix = '/app';
+}
+
+@Component({
+ selector: 'demo-app',
+ templateUrl: `.${modulePrefix}/app.component.html`,
+ styleUrls: [`.${modulePrefix}/app.component.css`],
+})
+export class AppComponent {
+ currentUser: User;
+
+ supportAgent: User;
+
+ messages$: Observable
;
+
+ dayHeaderFormats = this.appService.dayHeaderFormats;
+
+ messageTimestampFormats = this.appService.messageTimestampFormats;
+
+ dayHeaderLabel = this.appService.dayHeaderLabel;
+
+ messageTimestampLabel = this.appService.messageTimestampLabel;
+
+ constructor(private readonly appService: AppService) {
+ [this.currentUser, this.supportAgent] = this.appService.getUsers();
+ this.messages$ = this.appService.messages$;
+ }
+
+ onMessageEntered(event: MessageEnteredEvent) {
+ this.appService.onMessageEntered(event);
+ }
+}
+
+@NgModule({
+ imports: [
+ BrowserModule,
+ DxChatModule,
+ DxCheckBoxModule,
+ DxSelectBoxModule,
+ ],
+ declarations: [AppComponent],
+ bootstrap: [AppComponent],
+ providers: [AppService],
+})
+export class AppModule { }
+
+platformBrowserDynamic().bootstrapModule(AppModule);
diff --git a/apps/demos/Demos/Chat/Customization/Angular/app/app.service.ts b/apps/demos/Demos/Chat/Customization/Angular/app/app.service.ts
new file mode 100644
index 000000000000..76090483287b
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/Angular/app/app.service.ts
@@ -0,0 +1,90 @@
+import { Injectable } from '@angular/core';
+import { Observable, BehaviorSubject } from 'rxjs';
+import { User, Message, MessageEnteredEvent } from 'devextreme/ui/chat';
+
+@Injectable({
+ providedIn: 'root',
+})
+export class AppService {
+ date: Date;
+
+ currentUser: User = {
+ id: 'c94c0e76-fb49-4b9b-8f07-9f93ed93b4f3',
+ name: 'John Doe',
+ };
+
+ supportAgent: User = {
+ id: 'd16d1a4c-5c67-4e20-b70e-2991c22747c3',
+ name: 'Support Agent',
+ avatarUrl: '../../../../images/petersmith.png',
+ };
+
+ dayHeaderFormats = ['dd/MM/yyyy', 'dd.MM.yyyy', 'MMMM dd, yyyy', 'EEEE, MMMM dd'];
+
+ messageTimestampFormats = ['hh:mm a', 'hh:mm:ss a', 'HH:mm', 'HH:mm:ss'];
+
+ messageTimestampLabel = { 'aria-label': 'Message Timestamp Format' };
+
+ dayHeaderLabel = { 'aria-label': 'Day Header Format' };
+
+ messages: Message[] = [];
+
+ messagesSubject: BehaviorSubject = new BehaviorSubject([]);
+
+ constructor() {
+ this.date = new Date();
+ this.date.setHours(0, 0, 0, 0);
+
+ this.messages = [
+ {
+ timestamp: this.getTimestamp(this.date, -9),
+ author: this.supportAgent,
+ text: 'Hello, John!\nHow can I assist you today?',
+ },
+ {
+ timestamp: this.getTimestamp(this.date, -7),
+ author: this.currentUser,
+ text: 'Hi, I\'m having trouble accessing my account.',
+ },
+ {
+ timestamp: this.getTimestamp(this.date, -7),
+ author: this.currentUser,
+ text: 'It says my password is incorrect.',
+ },
+ {
+ timestamp: this.getTimestamp(this.date, -7),
+ author: this.supportAgent,
+ text: 'I can help you with that. Can you please confirm your UserID for security purposes?',
+ },
+ {
+ timestamp: this.getTimestamp(this.date, 1),
+ author: this.currentUser,
+ text: 'john.doe1357',
+ },
+ {
+ timestamp: this.getTimestamp(this.date, 1),
+ author: this.supportAgent,
+ text: '✅ Instructions to restore access have been sent to the email address associated with your account.',
+ },
+ ];
+
+ this.messagesSubject.next(this.messages);
+ }
+
+ get messages$(): Observable {
+ return this.messagesSubject.asObservable();
+ }
+
+ getUsers(): User[] {
+ return [this.currentUser, this.supportAgent];
+ }
+
+ getTimestamp(date: Date, offsetMinutes = 0): number {
+ return date.getTime() + offsetMinutes * 60000;
+ }
+
+ onMessageEntered(event: MessageEnteredEvent) {
+ this.messages = [...this.messages, event.message];
+ this.messagesSubject.next(this.messages);
+ }
+}
diff --git a/apps/demos/Demos/Chat/Customization/Angular/index.html b/apps/demos/Demos/Chat/Customization/Angular/index.html
new file mode 100644
index 000000000000..1ab1fb54a1df
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/Angular/index.html
@@ -0,0 +1,26 @@
+
+
+
+ DevExtreme Demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Loading...
+
+
+
diff --git a/apps/demos/Demos/Chat/Customization/React/App.tsx b/apps/demos/Demos/Chat/Customization/React/App.tsx
new file mode 100644
index 000000000000..0702563c2342
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/React/App.tsx
@@ -0,0 +1,119 @@
+import React, { useState, useCallback } from 'react';
+import Chat, { ChatTypes } from 'devextreme-react/chat';
+import { MessageEnteredEvent } from 'devextreme/ui/chat';
+import SelectBox from 'devextreme-react/select-box';
+import CheckBox from 'devextreme-react/check-box';
+
+import {
+ currentUser,
+ messages as initialMessages,
+ dayHeaderFormats as headerFormats,
+ messageTimestampFormats as messageTimestamps,
+ messageTimestampLabel,
+ dayHeaderLabel,
+} from './data.ts';
+
+export default function App() {
+ const [messages, setMessages] = useState(initialMessages);
+ const [showAvatar, setShowAvatar] = useState(true);
+ const [showUsername, setShowUsername] = useState(true);
+ const [showDayHeaders, setDayHeaders] = useState(true);
+ const [dayHeaderFormat, setDayHeaderFormat] = useState(headerFormats[0]);
+ const [showMessageTimestamp, setMessageTimestamp] = useState(true);
+ const [messageTimestampFormat, setMessageTimestampFormat] = useState(messageTimestamps[0]);
+ const [isDisabled, setDisabled] = useState(false);
+
+ const onMessageEntered = useCallback(({ message }: MessageEnteredEvent) => {
+ setMessages((prevMessages) => [...prevMessages, message]);
+ }, []);
+
+ return (
+
+
+
+
+
+
+
Options
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Day Header Format:
+
+
+
+
+
+
+
+
+
+
+ Message Timestamp Format:
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/demos/Demos/Chat/Customization/React/data.ts b/apps/demos/Demos/Chat/Customization/React/data.ts
new file mode 100644
index 000000000000..de004f28c98f
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/React/data.ts
@@ -0,0 +1,57 @@
+import { ChatTypes } from 'devextreme-react/chat';
+
+function getTimestamp(date, offsetMinutes = 0) {
+ return date.getTime() + offsetMinutes * 60000;
+}
+
+const date = new Date();
+date.setHours(0, 0, 0, 0);
+
+export const currentUser: ChatTypes.User = {
+ id: 'c94c0e76-fb49-4b9b-8f07-9f93ed93b4f3',
+ name: 'John Doe',
+};
+
+export const supportAgent: ChatTypes.User = {
+ id: 'd16d1a4c-5c67-4e20-b70e-2991c22747c3',
+ name: 'Support Agent',
+ avatarUrl: '../../../../images/petersmith.png',
+};
+
+export const messages = [
+ {
+ timestamp: getTimestamp(date, -9),
+ author: supportAgent,
+ text: 'Hello, John!\nHow can I assist you today?',
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: currentUser,
+ text: 'Hi, I\'m having trouble accessing my account.',
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: currentUser,
+ text: 'It says my password is incorrect.',
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: supportAgent,
+ text: 'I can help you with that. Can you please confirm your UserID for security purposes?',
+ },
+ {
+ timestamp: getTimestamp(date, 1),
+ author: currentUser,
+ text: 'john.doe1357',
+ },
+ {
+ timestamp: getTimestamp(date, 1),
+ author: supportAgent,
+ text: '✅ Instructions to restore access have been sent to the email address associated with your account.',
+ },
+];
+
+export const dayHeaderFormats = ['dd/MM/yyyy', 'dd.MM.yyyy', 'MMMM dd, yyyy', 'EEEE, MMMM dd'];
+export const messageTimestampFormats = ['hh:mm a', 'hh:mm:ss a', 'HH:mm', 'HH:mm:ss'];
+export const messageTimestampLabel = { 'aria-label': 'Message Timestamp Format' };
+export const dayHeaderLabel = { 'aria-label': 'Day Header Format' };
diff --git a/apps/demos/Demos/Chat/Customization/React/index.html b/apps/demos/Demos/Chat/Customization/React/index.html
new file mode 100644
index 000000000000..e90d25ad8798
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/React/index.html
@@ -0,0 +1,24 @@
+
+
+
+ DevExtreme Demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/demos/Demos/Pagination/Overview/React/index.js b/apps/demos/Demos/Chat/Customization/React/index.tsx
similarity index 81%
rename from apps/demos/Demos/Pagination/Overview/React/index.js
rename to apps/demos/Demos/Chat/Customization/React/index.tsx
index d9d7442ce766..8acbec4b6179 100644
--- a/apps/demos/Demos/Pagination/Overview/React/index.js
+++ b/apps/demos/Demos/Chat/Customization/React/index.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import ReactDOM from 'react-dom';
-import App from './App.js';
+import App from './App.tsx';
ReactDOM.render(
,
diff --git a/apps/demos/Demos/Chat/Customization/React/styles.css b/apps/demos/Demos/Chat/Customization/React/styles.css
new file mode 100644
index 000000000000..7a5b25461dbc
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/React/styles.css
@@ -0,0 +1,38 @@
+#app {
+ min-width: 720px;
+ display: flex;
+ gap: 20px;
+}
+
+.chat-container {
+ display: flex;
+ flex-grow: 1;
+ align-items: center;
+ justify-content: center;
+}
+
+.options {
+ padding: 20px;
+ display: flex;
+ flex-direction: column;
+ min-width: 280px;
+ background-color: rgba(191, 191, 191, 0.15);
+ gap: 16px;
+}
+
+.dx-chat {
+ max-width: 480px;
+}
+
+.caption {
+ font-size: var(--dx-font-size-sm);
+ font-weight: 500;
+}
+
+.option-separator {
+ border-bottom: 1px solid var(--dx-color-border);
+}
+
+.dx-avatar {
+ border: 1px solid var(--dx-color-border);
+}
diff --git a/apps/demos/Demos/Chat/Customization/ReactJs/App.js b/apps/demos/Demos/Chat/Customization/ReactJs/App.js
new file mode 100644
index 000000000000..92f10777d681
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/ReactJs/App.js
@@ -0,0 +1,115 @@
+import React, { useState, useCallback } from 'react';
+import Chat from 'devextreme-react/chat';
+import SelectBox from 'devextreme-react/select-box';
+import CheckBox from 'devextreme-react/check-box';
+import {
+ currentUser,
+ messages as initialMessages,
+ dayHeaderFormats as headerFormats,
+ messageTimestampFormats as messageTimestamps,
+ messageTimestampLabel,
+ dayHeaderLabel,
+} from './data.js';
+
+export default function App() {
+ const [messages, setMessages] = useState(initialMessages);
+ const [showAvatar, setShowAvatar] = useState(true);
+ const [showUsername, setShowUsername] = useState(true);
+ const [showDayHeaders, setDayHeaders] = useState(true);
+ const [dayHeaderFormat, setDayHeaderFormat] = useState(headerFormats[0]);
+ const [showMessageTimestamp, setMessageTimestamp] = useState(true);
+ const [messageTimestampFormat, setMessageTimestampFormat] = useState(messageTimestamps[0]);
+ const [isDisabled, setDisabled] = useState(false);
+ const onMessageEntered = useCallback(({ message }) => {
+ setMessages((prevMessages) => [...prevMessages, message]);
+ }, []);
+ return (
+
+
+
+
+
+
+
Options
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Day Header Format:
+
+
+
+
+
+
+
+
+
+
+ Message Timestamp Format:
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/demos/Demos/Chat/Customization/ReactJs/data.js b/apps/demos/Demos/Chat/Customization/ReactJs/data.js
new file mode 100644
index 000000000000..40b37bf56ffc
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/ReactJs/data.js
@@ -0,0 +1,50 @@
+function getTimestamp(date, offsetMinutes = 0) {
+ return date.getTime() + offsetMinutes * 60000;
+}
+const date = new Date();
+date.setHours(0, 0, 0, 0);
+export const currentUser = {
+ id: 'c94c0e76-fb49-4b9b-8f07-9f93ed93b4f3',
+ name: 'John Doe',
+};
+export const supportAgent = {
+ id: 'd16d1a4c-5c67-4e20-b70e-2991c22747c3',
+ name: 'Support Agent',
+ avatarUrl: '../../../../images/petersmith.png',
+};
+export const messages = [
+ {
+ timestamp: getTimestamp(date, -9),
+ author: supportAgent,
+ text: 'Hello, John!\nHow can I assist you today?',
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: currentUser,
+ text: "Hi, I'm having trouble accessing my account.",
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: currentUser,
+ text: 'It says my password is incorrect.',
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: supportAgent,
+ text: 'I can help you with that. Can you please confirm your UserID for security purposes?',
+ },
+ {
+ timestamp: getTimestamp(date, 1),
+ author: currentUser,
+ text: 'john.doe1357',
+ },
+ {
+ timestamp: getTimestamp(date, 1),
+ author: supportAgent,
+ text: '✅ Instructions to restore access have been sent to the email address associated with your account.',
+ },
+];
+export const dayHeaderFormats = ['dd/MM/yyyy', 'dd.MM.yyyy', 'MMMM dd, yyyy', 'EEEE, MMMM dd'];
+export const messageTimestampFormats = ['hh:mm a', 'hh:mm:ss a', 'HH:mm', 'HH:mm:ss'];
+export const messageTimestampLabel = { 'aria-label': 'Message Timestamp Format' };
+export const dayHeaderLabel = { 'aria-label': 'Day Header Format' };
diff --git a/apps/demos/Demos/Chat/Customization/ReactJs/index.html b/apps/demos/Demos/Chat/Customization/ReactJs/index.html
new file mode 100644
index 000000000000..c9ee055d50a5
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/ReactJs/index.html
@@ -0,0 +1,44 @@
+
+
+
+ DevExtreme Demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/demos/Demos/Chat/Customization/ReactJs/index.js b/apps/demos/Demos/Chat/Customization/ReactJs/index.js
new file mode 100644
index 000000000000..b853e0be8242
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/ReactJs/index.js
@@ -0,0 +1,5 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import App from './App.js';
+
+ReactDOM.render(, document.getElementById('app'));
diff --git a/apps/demos/Demos/Chat/Customization/ReactJs/styles.css b/apps/demos/Demos/Chat/Customization/ReactJs/styles.css
new file mode 100644
index 000000000000..7a5b25461dbc
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/ReactJs/styles.css
@@ -0,0 +1,38 @@
+#app {
+ min-width: 720px;
+ display: flex;
+ gap: 20px;
+}
+
+.chat-container {
+ display: flex;
+ flex-grow: 1;
+ align-items: center;
+ justify-content: center;
+}
+
+.options {
+ padding: 20px;
+ display: flex;
+ flex-direction: column;
+ min-width: 280px;
+ background-color: rgba(191, 191, 191, 0.15);
+ gap: 16px;
+}
+
+.dx-chat {
+ max-width: 480px;
+}
+
+.caption {
+ font-size: var(--dx-font-size-sm);
+ font-weight: 500;
+}
+
+.option-separator {
+ border-bottom: 1px solid var(--dx-color-border);
+}
+
+.dx-avatar {
+ border: 1px solid var(--dx-color-border);
+}
diff --git a/apps/demos/Demos/Chat/Customization/Vue/App.vue b/apps/demos/Demos/Chat/Customization/Vue/App.vue
new file mode 100644
index 000000000000..2299a9350d15
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/Vue/App.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
Options
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Day Header Format:
+
+
+
+
+
+
+
+
+
+
+ Message Timestamp Format:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/demos/Demos/Chat/Customization/Vue/data.ts b/apps/demos/Demos/Chat/Customization/Vue/data.ts
new file mode 100644
index 000000000000..de0ab54cf1e5
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/Vue/data.ts
@@ -0,0 +1,55 @@
+const date = new Date();
+date.setHours(0, 0, 0, 0);
+
+function getTimestamp(date, offsetMinutes = 0) {
+ return date.getTime() + offsetMinutes * 60000;
+}
+
+export const currentUser = {
+ id: 'c94c0e76-fb49-4b9b-8f07-9f93ed93b4f3',
+ name: 'John Doe',
+};
+
+export const supportAgent = {
+ id: 'd16d1a4c-5c67-4e20-b7v0e-2991c22747c3',
+ name: 'Support Agent',
+ avatarUrl: '../../../../images/petersmith.png',
+};
+
+export const messages = [
+ {
+ timestamp: getTimestamp(date, -9),
+ author: supportAgent,
+ text: 'Hello, John!\nHow can I assist you today?',
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: currentUser,
+ text: 'Hi, I\'m having trouble accessing my account.',
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: currentUser,
+ text: 'It says my password is incorrect.',
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: supportAgent,
+ text: 'I can help you with that. Can you please confirm your UserID for security purposes?',
+ },
+ {
+ timestamp: getTimestamp(date, 1),
+ author: currentUser,
+ text: 'john.doe1357',
+ },
+ {
+ timestamp: getTimestamp(date, 1),
+ author: supportAgent,
+ text: '✅ Instructions to restore access have been sent to the email address associated with your account.',
+ },
+];
+
+export const dayHeaderFormats = ['dd/MM/yyyy', 'dd.MM.yyyy', 'MMMM dd, yyyy', 'EEEE, MMMM dd'];
+export const messageTimestampFormats = ['hh:mm a', 'hh:mm:ss a', 'HH:mm', 'HH:mm:ss'];
+export const messageTimestampLabel = { 'aria-label': 'Message Timestamp Format' };
+export const dayHeaderLabel = { 'aria-label': 'Day Header Format' };
diff --git a/apps/demos/Demos/Chat/Customization/Vue/index.html b/apps/demos/Demos/Chat/Customization/Vue/index.html
new file mode 100644
index 000000000000..2413f2254bf1
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/Vue/index.html
@@ -0,0 +1,29 @@
+
+
+
+ DevExtreme Demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/demos/Demos/Pagination/Overview/Vue/index.js b/apps/demos/Demos/Chat/Customization/Vue/index.ts
similarity index 100%
rename from apps/demos/Demos/Pagination/Overview/Vue/index.js
rename to apps/demos/Demos/Chat/Customization/Vue/index.ts
diff --git a/apps/demos/Demos/Chat/Customization/description.md b/apps/demos/Demos/Chat/Customization/description.md
new file mode 100644
index 000000000000..d2a48de2bfb3
--- /dev/null
+++ b/apps/demos/Demos/Chat/Customization/description.md
@@ -0,0 +1,14 @@
+Use the following properties to customize the Chat component:
+
+- To display/hide Chat UI elements:
+ - [showAvatar](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#showAvatar)
+ - [showUserName](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#showUserName)
+ - [showDayHeaders](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#showDayHeaders)
+ - [showMessageTimestamp](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#showMessageTimestamp)
+
+- To modify date/time formats:
+ - [dayHeaderFormat](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#dayHeaderFormat)
+ - [messageTimestampFormat](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#messageTimestampFormat)
+
+- To deactivate Chat, use the [disabled](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#disabled) property.
+
\ No newline at end of file
diff --git a/apps/demos/Demos/Chat/Customization/jQuery/data.js b/apps/demos/Demos/Chat/Customization/jQuery/data.js
index d08b0148f923..a1fac597078e 100644
--- a/apps/demos/Demos/Chat/Customization/jQuery/data.js
+++ b/apps/demos/Demos/Chat/Customization/jQuery/data.js
@@ -49,5 +49,5 @@ const messages = [
},
];
-const dayHeaderFormat = ['dd/MM/yyyy', 'dd.MM.yyyy', 'MMMM dd, yyyy', 'EEEE, MMMM dd'];
-const messageTimestampFormat = ['hh:mm a', 'hh:mm:ss a', 'HH:mm', 'HH:mm:ss'];
+const dayHeaderFormats = ['dd/MM/yyyy', 'dd.MM.yyyy', 'MMMM dd, yyyy', 'EEEE, MMMM dd'];
+const messageTimestampFormats = ['hh:mm a', 'hh:mm:ss a', 'HH:mm', 'HH:mm:ss'];
diff --git a/apps/demos/Demos/Chat/Customization/jQuery/index.html b/apps/demos/Demos/Chat/Customization/jQuery/index.html
index 982e6920c309..3e7795ca02bb 100644
--- a/apps/demos/Demos/Chat/Customization/jQuery/index.html
+++ b/apps/demos/Demos/Chat/Customization/jQuery/index.html
@@ -36,8 +36,8 @@
- Day Headers Format:
-
+ Day Header Format:
+
diff --git a/apps/demos/Demos/Chat/Customization/jQuery/index.js b/apps/demos/Demos/Chat/Customization/jQuery/index.js
index 47de3344c96f..60d457efe704 100644
--- a/apps/demos/Demos/Chat/Customization/jQuery/index.js
+++ b/apps/demos/Demos/Chat/Customization/jQuery/index.js
@@ -3,68 +3,68 @@ $(() => {
height: 710,
items: messages,
user: currentUser,
- dayHeaderFormat: dayHeaderFormat[0],
+ dayHeaderFormat: dayHeaderFormats[0],
+ messageTimestampFormat: messageTimestampFormats[0],
onMessageEntered({ component, message }) {
component.renderMessage(message);
},
- messageTimestampFormat: messageTimestampFormat[0],
}).dxChat('instance');
- $('#chat-disabled').dxCheckBox({
- value: false,
- text: 'Disable Chat',
+ $('#show-avatar').dxCheckBox({
+ value: true,
+ text: 'Avatar',
onValueChanged(data) {
- chat.option('disabled', data.value);
+ chat.option('showAvatar', data.value);
},
});
- $('#show-day-headers').dxCheckBox({
+ $('#show-user-name').dxCheckBox({
value: true,
- text: 'Show Day Headers',
+ text: 'User Name',
onValueChanged(data) {
- chat.option('showDayHeaders', data.value);
+ chat.option('showUserName', data.value);
},
});
- $('#show-message-timestamp').dxCheckBox({
+ $('#show-day-headers').dxCheckBox({
value: true,
- text: 'Show Message Timestamp',
+ text: 'Day Headers',
onValueChanged(data) {
- chat.option('showMessageTimestamp', data.value);
+ chat.option('showDayHeaders', data.value);
},
});
- $('#show-avatar').dxCheckBox({
- value: true,
- text: 'Show Avatar',
+ $('#day-header-format').dxSelectBox({
+ items: dayHeaderFormats,
+ value: dayHeaderFormats[0],
+ inputAttr: { 'aria-label': 'Day Header Format' },
onValueChanged(data) {
- chat.option('showAvatar', data.value);
+ chat.option('dayHeaderFormat', data.value);
},
});
- $('#show-user-name').dxCheckBox({
+ $('#show-message-timestamp').dxCheckBox({
value: true,
- text: 'Show User Name',
+ text: 'Message Timestamp',
onValueChanged(data) {
- chat.option('showUserName', data.value);
+ chat.option('showMessageTimestamp', data.value);
},
});
- $('#day-headers-format').dxSelectBox({
- items: dayHeaderFormat,
- value: dayHeaderFormat[0],
- inputAttr: { 'aria-label': 'Day Headers Format' },
+ $('#message-timestamp-format').dxSelectBox({
+ items: messageTimestampFormats,
+ value: messageTimestampFormats[0],
+ inputAttr: { 'aria-label': 'Message Timestamp Format' },
onValueChanged(data) {
- chat.option('dayHeaderFormat', data.value);
+ chat.option('messageTimestampFormat', data.value);
},
});
- $('#message-timestamp-format').dxSelectBox({
- items: messageTimestampFormat,
- value: messageTimestampFormat[0],
- inputAttr: { 'aria-label': 'Message Timestamp Format' },
+ $('#chat-disabled').dxCheckBox({
+ value: false,
+ text: 'Disable Chat',
onValueChanged(data) {
- chat.option('messageTimestampFormat', data.value);
+ chat.option('disabled', data.value);
},
});
});
diff --git a/apps/demos/Demos/Chat/Overview/Angular/app/app.component.ts b/apps/demos/Demos/Chat/Overview/Angular/app/app.component.ts
index d7524f752deb..441a9da8424a 100644
--- a/apps/demos/Demos/Chat/Overview/Angular/app/app.component.ts
+++ b/apps/demos/Demos/Chat/Overview/Angular/app/app.component.ts
@@ -4,8 +4,8 @@ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { DxChatModule } from 'devextreme-angular';
import { User, Message, MessageEnteredEvent } from 'devextreme/ui/chat';
-import { AppService } from './app.service';
import { Observable } from 'rxjs';
+import { AppService } from './app.service';
if (!/localhost/.test(document.location.host)) {
enableProdMode();
@@ -24,12 +24,16 @@ if (window && window.config.packageConfigPaths) {
})
export class AppComponent {
currentUser: User;
+
supportAgent: User;
+
messages$: Observable
;
+
userChatTypingUsers$: Observable;
+
supportChatTypingUsers$: Observable;
- constructor(private appService: AppService) {
+ constructor(private readonly appService: AppService) {
[this.currentUser, this.supportAgent] = this.appService.getUsers();
this.messages$ = this.appService.messages$;
this.userChatTypingUsers$ = this.appService.userChatTypingUsers$;
diff --git a/apps/demos/Demos/Chat/Overview/Angular/app/app.service.ts b/apps/demos/Demos/Chat/Overview/Angular/app/app.service.ts
index 890f1fd173f5..2c8860931443 100644
--- a/apps/demos/Demos/Chat/Overview/Angular/app/app.service.ts
+++ b/apps/demos/Demos/Chat/Overview/Angular/app/app.service.ts
@@ -23,6 +23,7 @@ export class AppService {
messages: Message[] = [];
userChatTypingUsersSubject: BehaviorSubject = new BehaviorSubject([]);
+
supportChatTypingUsersSubject: BehaviorSubject = new BehaviorSubject([]);
messagesSubject: BehaviorSubject = new BehaviorSubject([]);
@@ -35,32 +36,32 @@ export class AppService {
{
timestamp: this.getTimestamp(this.date, -9),
author: this.supportAgent,
- text: 'Hello, John!\nHow can I assist you today?'
+ text: 'Hello, John!\nHow can I assist you today?',
},
{
timestamp: this.getTimestamp(this.date, -7),
author: this.currentUser,
- text: 'Hi, I\'m having trouble accessing my account.'
+ text: 'Hi, I\'m having trouble accessing my account.',
},
{
timestamp: this.getTimestamp(this.date, -7),
author: this.currentUser,
- text: 'It says my password is incorrect.'
+ text: 'It says my password is incorrect.',
},
{
timestamp: this.getTimestamp(this.date, -7),
author: this.supportAgent,
- text: 'I can help you with that. Can you please confirm your UserID for security purposes?'
+ text: 'I can help you with that. Can you please confirm your UserID for security purposes?',
},
{
timestamp: this.getTimestamp(this.date, 1),
author: this.currentUser,
- text: 'john.doe1357'
+ text: 'john.doe1357',
},
{
timestamp: this.getTimestamp(this.date, 1),
author: this.supportAgent,
- text: '✅ Instructions to restore access have been sent to the email address associated with your account.'
+ text: '✅ Instructions to restore access have been sent to the email address associated with your account.',
},
];
@@ -85,7 +86,7 @@ export class AppService {
return [this.currentUser, this.supportAgent];
}
- getTimestamp(date: Date, offsetMinutes: number = 0): number {
+ getTimestamp(date: Date, offsetMinutes = 0): number {
return date.getTime() + offsetMinutes * 60000;
}
diff --git a/apps/demos/Demos/Chat/Overview/React/App.tsx b/apps/demos/Demos/Chat/Overview/React/App.tsx
index 57cba74af15e..4fc1a0f2e8a2 100644
--- a/apps/demos/Demos/Chat/Overview/React/App.tsx
+++ b/apps/demos/Demos/Chat/Overview/React/App.tsx
@@ -11,7 +11,7 @@ export default function App() {
const [messages, setMessages] = useState(initialMessages);
function onMessageEntered({ message }: MessageEnteredEvent) {
- setMessages(prevMessages => [...prevMessages, message]);
+ setMessages((prevMessages) => [...prevMessages, message]);
}
function typingStart({ user }: TypingStartEvent) {
diff --git a/apps/demos/Demos/Chat/Overview/React/data.ts b/apps/demos/Demos/Chat/Overview/React/data.ts
index 45bc06d30ea7..7d233683b19f 100644
--- a/apps/demos/Demos/Chat/Overview/React/data.ts
+++ b/apps/demos/Demos/Chat/Overview/React/data.ts
@@ -22,31 +22,31 @@ export const initialMessages = [
{
timestamp: getTimestamp(date, -9),
author: supportAgent,
- text: 'Hello, John!\nHow can I assist you today?'
+ text: 'Hello, John!\nHow can I assist you today?',
},
{
timestamp: getTimestamp(date, -7),
author: currentUser,
- text: 'Hi, I\'m having trouble accessing my account.'
+ text: 'Hi, I\'m having trouble accessing my account.',
},
{
timestamp: getTimestamp(date, -7),
author: currentUser,
- text: 'It says my password is incorrect.'
+ text: 'It says my password is incorrect.',
},
{
timestamp: getTimestamp(date, -7),
author: supportAgent,
- text: 'I can help you with that. Can you please confirm your UserID for security purposes?'
+ text: 'I can help you with that. Can you please confirm your UserID for security purposes?',
},
{
timestamp: getTimestamp(date, 1),
author: currentUser,
- text: 'john.doe1357'
+ text: 'john.doe1357',
},
{
timestamp: getTimestamp(date, 1),
author: supportAgent,
- text: '✅ Instructions to restore access have been sent to the email address associated with your account.'
+ text: '✅ Instructions to restore access have been sent to the email address associated with your account.',
},
];
diff --git a/apps/demos/Demos/Chat/Overview/Vue/App.vue b/apps/demos/Demos/Chat/Overview/Vue/App.vue
index e39b85502c55..3fcf8fe9a28d 100644
--- a/apps/demos/Demos/Chat/Overview/Vue/App.vue
+++ b/apps/demos/Demos/Chat/Overview/Vue/App.vue
@@ -1,62 +1,63 @@
-
-
+
+
-
-
+
+
diff --git a/apps/demos/Demos/Chat/Overview/Vue/data.ts b/apps/demos/Demos/Chat/Overview/Vue/data.ts
index 00420df767bc..c1305ea47dc5 100644
--- a/apps/demos/Demos/Chat/Overview/Vue/data.ts
+++ b/apps/demos/Demos/Chat/Overview/Vue/data.ts
@@ -2,49 +2,49 @@ const date = new Date();
date.setHours(0, 0, 0, 0);
function getTimestamp(date, offsetMinutes = 0) {
- return date.getTime() + offsetMinutes * 60000;
+ return date.getTime() + offsetMinutes * 60000;
}
export const currentUser = {
- id: "c94c0e76-fb49-4b9b-8f07-9f93ed93b4f3",
- name: "John Doe",
+ id: 'c94c0e76-fb49-4b9b-8f07-9f93ed93b4f3',
+ name: 'John Doe',
};
export const supportAgent = {
- id: "d16d1a4c-5c67-4e20-b7v0e-2991c22747c3",
- name: "Support Agent",
- avatarUrl: "../../../../images/petersmith.png",
+ id: 'd16d1a4c-5c67-4e20-b7v0e-2991c22747c3',
+ name: 'Support Agent',
+ avatarUrl: '../../../../images/petersmith.png',
};
export const messages = [
- {
- timestamp: getTimestamp(date, -9),
- author: supportAgent,
- text: "Hello, John!\nHow can I assist you today?"
- },
- {
- timestamp: getTimestamp(date, -7),
- author: currentUser,
- text: "Hi, I'm having trouble accessing my account."
- },
- {
- timestamp: getTimestamp(date, -7),
- author: currentUser,
- text: "It says my password is incorrect."
- },
- {
- timestamp: getTimestamp(date, -7),
- author: supportAgent,
- text: "I can help you with that. Can you please confirm your UserID for security purposes?"
- },
- {
- timestamp: getTimestamp(date, 1),
- author: currentUser,
- text: "john.doe1357"
- },
- {
- timestamp: getTimestamp(date, 1),
- author: supportAgent,
- text: "✅ Instructions to restore access have been sent to the email address associated with your account."
- },
+ {
+ timestamp: getTimestamp(date, -9),
+ author: supportAgent,
+ text: 'Hello, John!\nHow can I assist you today?',
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: currentUser,
+ text: 'Hi, I\'m having trouble accessing my account.',
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: currentUser,
+ text: 'It says my password is incorrect.',
+ },
+ {
+ timestamp: getTimestamp(date, -7),
+ author: supportAgent,
+ text: 'I can help you with that. Can you please confirm your UserID for security purposes?',
+ },
+ {
+ timestamp: getTimestamp(date, 1),
+ author: currentUser,
+ text: 'john.doe1357',
+ },
+ {
+ timestamp: getTimestamp(date, 1),
+ author: supportAgent,
+ text: '✅ Instructions to restore access have been sent to the email address associated with your account.',
+ },
];
diff --git a/apps/demos/Demos/Localization/UsingGlobalize/Angular/app/app.component.ts b/apps/demos/Demos/Localization/UsingGlobalize/Angular/app/app.component.ts
index ecce89fabec9..8e3d25d17e7d 100644
--- a/apps/demos/Demos/Localization/UsingGlobalize/Angular/app/app.component.ts
+++ b/apps/demos/Demos/Localization/UsingGlobalize/Angular/app/app.component.ts
@@ -8,8 +8,8 @@ import 'devextreme/localization/globalize/date';
import 'devextreme/localization/globalize/currency';
import 'devextreme/localization/globalize/message';
-import deMessages from 'npm:devextreme/localization/messages/de.json!json';
-import ruMessages from 'npm:devextreme/localization/messages/ru.json!json';
+import deMessages from 'npm:devextreme/common/core/localization/messages/de.json!json';
+import ruMessages from 'npm:devextreme/common/core/localization/messages/ru.json!json';
import deCldrData from 'npm:devextreme-cldr-data/de.json!json';
import ruCldrData from 'npm:devextreme-cldr-data/ru.json!json';
diff --git a/apps/demos/Demos/Localization/UsingGlobalize/React/App.tsx b/apps/demos/Demos/Localization/UsingGlobalize/React/App.tsx
index b8c231be96b3..724a2794ad7d 100644
--- a/apps/demos/Demos/Localization/UsingGlobalize/React/App.tsx
+++ b/apps/demos/Demos/Localization/UsingGlobalize/React/App.tsx
@@ -9,8 +9,8 @@ import 'devextreme/localization/globalize/date';
import 'devextreme/localization/globalize/currency';
import 'devextreme/localization/globalize/message';
-import deMessages from 'devextreme/localization/messages/de.json';
-import ruMessages from 'devextreme/localization/messages/ru.json';
+import deMessages from 'devextreme/common/core/localization/messages/de.json';
+import ruMessages from 'devextreme/common/core/localization/messages/ru.json';
import deCldrData from 'devextreme-cldr-data/de.json';
import ruCldrData from 'devextreme-cldr-data/ru.json';
diff --git a/apps/demos/Demos/Localization/UsingGlobalize/ReactJs/App.js b/apps/demos/Demos/Localization/UsingGlobalize/ReactJs/App.js
index 2ebd1e15d128..79660350cfd1 100644
--- a/apps/demos/Demos/Localization/UsingGlobalize/ReactJs/App.js
+++ b/apps/demos/Demos/Localization/UsingGlobalize/ReactJs/App.js
@@ -7,8 +7,8 @@ import 'devextreme/localization/globalize/number';
import 'devextreme/localization/globalize/date';
import 'devextreme/localization/globalize/currency';
import 'devextreme/localization/globalize/message';
-import deMessages from 'devextreme/localization/messages/de.json';
-import ruMessages from 'devextreme/localization/messages/ru.json';
+import deMessages from 'devextreme/common/core/localization/messages/de.json';
+import ruMessages from 'devextreme/common/core/localization/messages/ru.json';
import deCldrData from 'devextreme-cldr-data/de.json';
import ruCldrData from 'devextreme-cldr-data/ru.json';
import supplementalCldrData from 'devextreme-cldr-data/supplemental.json';
diff --git a/apps/demos/Demos/Localization/UsingGlobalize/Vue/App.vue b/apps/demos/Demos/Localization/UsingGlobalize/Vue/App.vue
index cb5add991431..7361909f8c1d 100644
--- a/apps/demos/Demos/Localization/UsingGlobalize/Vue/App.vue
+++ b/apps/demos/Demos/Localization/UsingGlobalize/Vue/App.vue
@@ -69,8 +69,8 @@ import 'devextreme/localization/globalize/currency';
import 'devextreme/localization/globalize/message';
/* eslint-disable import/no-unresolved */
/* eslint-disable import/no-webpack-loader-syntax */
-import * as deMessages from 'npm:devextreme/localization/messages/de.json!json';
-import * as ruMessages from 'npm:devextreme/localization/messages/ru.json!json';
+import * as deMessages from 'npm:devextreme/common/core/localization/messages/de.json!json';
+import * as ruMessages from 'npm:devextreme/common/core/localization/messages/ru.json!json';
import * as deCldrData from 'npm:devextreme-cldr-data/de.json!json';
import * as ruCldrData from 'npm:devextreme-cldr-data/ru.json!json';
import * as supplementalCldrData from 'npm:devextreme-cldr-data/supplemental.json!json';
diff --git a/apps/demos/Demos/Localization/UsingIntl/Angular/app/app.component.ts b/apps/demos/Demos/Localization/UsingIntl/Angular/app/app.component.ts
index cc7aa5448a6d..f90ed845c760 100644
--- a/apps/demos/Demos/Localization/UsingIntl/Angular/app/app.component.ts
+++ b/apps/demos/Demos/Localization/UsingIntl/Angular/app/app.component.ts
@@ -5,8 +5,8 @@ import { DxSelectBoxModule, DxDataGridModule } from 'devextreme-angular';
import { locale, loadMessages, formatMessage } from 'devextreme/localization';
-import deMessages from 'npm:devextreme/localization/messages/de.json!json';
-import ruMessages from 'npm:devextreme/localization/messages/ru.json!json';
+import deMessages from 'npm:devextreme/common/core/localization/messages/de.json!json';
+import ruMessages from 'npm:devextreme/common/core/localization/messages/ru.json!json';
import { Locale, Payment, Service } from './app.service';
if (!/localhost/.test(document.location.host)) {
diff --git a/apps/demos/Demos/Localization/UsingIntl/React/App.tsx b/apps/demos/Demos/Localization/UsingIntl/React/App.tsx
index c3033eafd311..db018e87c73b 100644
--- a/apps/demos/Demos/Localization/UsingIntl/React/App.tsx
+++ b/apps/demos/Demos/Localization/UsingIntl/React/App.tsx
@@ -4,8 +4,8 @@ import React, { useState } from 'react';
import DataGrid, { Column, Editing, FilterRow } from 'devextreme-react/data-grid';
import SelectBox, { SelectBoxTypes } from 'devextreme-react/select-box';
-import deMessages from 'devextreme/localization/messages/de.json';
-import ruMessages from 'devextreme/localization/messages/ru.json';
+import deMessages from 'devextreme/common/core/localization/messages/de.json';
+import ruMessages from 'devextreme/common/core/localization/messages/ru.json';
import { locale, loadMessages, formatMessage } from 'devextreme/localization';
import service from './data.ts';
diff --git a/apps/demos/Demos/Localization/UsingIntl/ReactJs/App.js b/apps/demos/Demos/Localization/UsingIntl/ReactJs/App.js
index 7e8d2f742bce..15a5a303cf11 100644
--- a/apps/demos/Demos/Localization/UsingIntl/ReactJs/App.js
+++ b/apps/demos/Demos/Localization/UsingIntl/ReactJs/App.js
@@ -3,8 +3,8 @@
import React, { useState } from 'react';
import DataGrid, { Column, Editing, FilterRow } from 'devextreme-react/data-grid';
import SelectBox from 'devextreme-react/select-box';
-import deMessages from 'devextreme/localization/messages/de.json';
-import ruMessages from 'devextreme/localization/messages/ru.json';
+import deMessages from 'devextreme/common/core/localization/messages/de.json';
+import ruMessages from 'devextreme/common/core/localization/messages/ru.json';
import { locale, loadMessages, formatMessage } from 'devextreme/localization';
import service from './data.js';
diff --git a/apps/demos/Demos/Localization/UsingIntl/Vue/App.vue b/apps/demos/Demos/Localization/UsingIntl/Vue/App.vue
index bb1cfb9efc0a..dbd7d9b810ed 100644
--- a/apps/demos/Demos/Localization/UsingIntl/Vue/App.vue
+++ b/apps/demos/Demos/Localization/UsingIntl/Vue/App.vue
@@ -65,8 +65,8 @@ import {
import DxSelectBox, { DxSelectBoxTypes } from 'devextreme-vue/select-box';
/* eslint-disable import/no-unresolved */
/* eslint-disable import/no-webpack-loader-syntax */
-import * as deMessages from 'npm:devextreme/localization/messages/de.json!json';
-import * as ruMessages from 'npm:devextreme/localization/messages/ru.json!json';
+import * as deMessages from 'npm:devextreme/common/core/localization/messages/de.json!json';
+import * as ruMessages from 'npm:devextreme/common/core/localization/messages/ru.json!json';
import { locale as dxLocale, loadMessages, formatMessage as dxFormatMessage } from 'devextreme/localization';
import service from './data.ts';
diff --git a/apps/demos/Demos/Pagination/Overview/Angular/app/app.component.css b/apps/demos/Demos/Pagination/Overview/Angular/app/app.component.css
new file mode 100644
index 000000000000..f65579fc60ad
--- /dev/null
+++ b/apps/demos/Demos/Pagination/Overview/Angular/app/app.component.css
@@ -0,0 +1,100 @@
+body {
+ overflow-x: hidden;
+}
+
+.demo-container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.container {
+ min-width: 720px;
+ width: 100%;
+}
+
+::ng-deep .employees {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+ min-height: 644px;
+ padding-bottom: 24px;
+}
+
+::ng-deep employee-card {
+ width: 100%;
+ max-height: 312px;
+ align-self: stretch;
+ overflow: hidden;
+ border: var(--dx-border-width) solid var(--dx-color-border);
+ border-radius: var(--dx-border-radius);
+ background-color: var(--dx-component-color-bg);
+}
+
+::ng-deep .employees.employees--forth employee-card {
+ min-width: 250px;
+ width: 390px;
+ flex-basis: calc(50% - 10px);
+}
+
+::ng-deep .employees.employees--six employee-card {
+ flex-basis: calc(33.3% - 12.5px);
+}
+
+::ng-deep .employees__img-wrapper {
+ height: 180px;
+ position: relative;
+ overflow: hidden;
+ border-bottom: var(--dx-border-width) solid var(--dx-color-border);
+ background-color: #fff;
+}
+
+::ng-deep .employees__img {
+ display: block;
+ height: 220px;
+ position: absolute;
+ content: "";
+ left: 50%;
+ top: 0;
+ transform: translateX(-50%);
+}
+
+::ng-deep .employees__info {
+ padding: 24px;
+}
+
+::ng-deep .employees__info-row {
+ margin-bottom: 8px;
+ text-wrap: nowrap;
+}
+
+::ng-deep .employees__info-label {
+ display: inline-block;
+ font-weight: 600;
+ vertical-align: middle;
+}
+
+::ng-deep .employees.employees--forth .employees__info-label {
+ width: 160px;
+}
+
+::ng-deep .employees.employees--six .employees__info-label {
+ width: 80px;
+}
+
+::ng-deep .employees__info-value {
+ display: inline-block;
+ text-wrap: nowrap;
+ text-overflow: ellipsis;
+ vertical-align: middle;
+ overflow: hidden;
+ white-space:nowrap
+}
+
+::ng-deep .employees.employees--forth .employees__info-value {
+ max-width: 180px;
+}
+
+::ng-deep .employees.employees--six .employees__info-value {
+ max-width: 120px;
+}
diff --git a/apps/demos/Demos/Pagination/Overview/Angular/app/app.component.html b/apps/demos/Demos/Pagination/Overview/Angular/app/app.component.html
index ddc4ed8f5862..175a0142f5e6 100644
--- a/apps/demos/Demos/Pagination/Overview/Angular/app/app.component.html
+++ b/apps/demos/Demos/Pagination/Overview/Angular/app/app.component.html
@@ -1,7 +1,22 @@
-
-
+
+
+ @for (employee of pageEmployees; track employee.ID) {
+
+ }
+
+
+
+
+
diff --git a/apps/demos/Demos/Pagination/Overview/Angular/app/app.component.ts b/apps/demos/Demos/Pagination/Overview/Angular/app/app.component.ts
index 7ea2d957c548..125f11487eca 100644
--- a/apps/demos/Demos/Pagination/Overview/Angular/app/app.component.ts
+++ b/apps/demos/Demos/Pagination/Overview/Angular/app/app.component.ts
@@ -1,8 +1,9 @@
import { NgModule, Component, enableProdMode } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
-import { DxDataGridModule } from 'devextreme-angular';
-import { Customer, Service } from './app.service';
+import { DxPaginationModule } from 'devextreme-angular';
+import { Employee, Service } from './app.service';
+import { EmployeeCard } from './employee-card/employee-card.component';
if (!/localhost/.test(document.location.host)) {
enableProdMode();
@@ -17,22 +18,53 @@ if (window && window.config.packageConfigPaths) {
@Component({
selector: 'demo-app',
templateUrl: `.${modulePrefix}/app.component.html`,
+ styleUrls: [`.${modulePrefix}/app.component.css`],
providers: [Service],
})
export class AppComponent {
- customers: Customer[];
+ employees: Employee[];
+
+ pageEmployees: Employee[];
+
+ itemCount: number;
+
+ readonly allowedPageSizes = [4, 6];
+
+ showInfo = true;
+
+ showNavigationButtons = true;
+
+ pageIndex = 1;
+
+ pageSize = 4;
+
+ onPageIndexChange(val) {
+ this.pageIndex = val;
+ this.setPageEmployees();
+ }
+
+ onPageSizeChange(val) {
+ this.pageSize = val;
+ this.setPageEmployees();
+ }
+
+ setPageEmployees() {
+ this.pageEmployees = this.employees.slice((this.pageIndex - 1) * this.pageSize, this.pageIndex * this.pageSize);
+ }
constructor(service: Service) {
- this.customers = service.getCustomers();
+ this.employees = service.getEmployees();
+ this.itemCount = this.employees.length;
+ this.setPageEmployees();
}
}
@NgModule({
imports: [
BrowserModule,
- DxDataGridModule,
+ DxPaginationModule,
],
- declarations: [AppComponent],
+ declarations: [AppComponent, EmployeeCard],
bootstrap: [AppComponent],
})
export class AppModule { }
diff --git a/apps/demos/Demos/Pagination/Overview/Angular/app/app.service.ts b/apps/demos/Demos/Pagination/Overview/Angular/app/app.service.ts
index db238661893a..32d2a4fbb35d 100644
--- a/apps/demos/Demos/Pagination/Overview/Angular/app/app.service.ts
+++ b/apps/demos/Demos/Pagination/Overview/Angular/app/app.service.ts
@@ -1,150 +1,434 @@
import { Injectable } from '@angular/core';
-export class Customer {
+export class Employee {
ID: number;
- CompanyName: string;
+ FullName: string;
- Address: string;
+ Title: string;
- City: string;
+ Employee_Picture: string;
- State: string;
+ Picture: string;
- Zipcode: number;
+ MobilePhone: string;
- Phone: string;
-
- Fax: string;
-
- Website: string;
}
-let customers: Customer[] = [{
- ID: 1,
- CompanyName: 'Super Mart of the West',
- Address: '702 SW 8th Street',
- City: 'Bentonville',
- State: 'Arkansas',
- Zipcode: 72716,
- Phone: '(800) 555-2797',
- Fax: '(800) 555-2171',
- Website: 'http://www.nowebsitesupermart.dx',
-}, {
- ID: 2,
- CompanyName: 'Electronics Depot',
- Address: '2455 Paces Ferry Road NW',
- City: 'Atlanta',
- State: 'Georgia',
- Zipcode: 30339,
- Phone: '(800) 595-3232',
- Fax: '(800) 595-3231',
- Website: 'http://www.nowebsitedepot.dx',
-}, {
- ID: 3,
- CompanyName: 'K&S Music',
- Address: '1000 Nicllet Mall',
- City: 'Minneapolis',
- State: 'Minnesota',
- Zipcode: 55403,
- Phone: '(612) 304-6073',
- Fax: '(612) 304-6074',
- Website: 'http://www.nowebsitemusic.dx',
-}, {
- ID: 4,
- CompanyName: "Tom's Club",
- Address: '999 Lake Drive',
- City: 'Issaquah',
- State: 'Washington',
- Zipcode: 98027,
- Phone: '(800) 955-2292',
- Fax: '(800) 955-2293',
- Website: 'http://www.nowebsitetomsclub.dx',
-}, {
- ID: 5,
- CompanyName: 'E-Mart',
- Address: '3333 Beverly Rd',
- City: 'Hoffman Estates',
- State: 'Illinois',
- Zipcode: 60179,
- Phone: '(847) 286-2500',
- Fax: '(847) 286-2501',
- Website: 'http://www.nowebsiteemart.dx',
-}, {
- ID: 6,
- CompanyName: 'Walters',
- Address: '200 Wilmot Rd',
- City: 'Deerfield',
- State: 'Illinois',
- Zipcode: 60015,
- Phone: '(847) 940-2500',
- Fax: '(847) 940-2501',
- Website: 'http://www.nowebsitewalters.dx',
-}, {
- ID: 7,
- CompanyName: 'StereoShack',
- Address: '400 Commerce S',
- City: 'Fort Worth',
- State: 'Texas',
- Zipcode: 76102,
- Phone: '(817) 820-0741',
- Fax: '(817) 820-0742',
- Website: 'http://www.nowebsiteshack.dx',
-}, {
- ID: 8,
- CompanyName: 'Circuit Town',
- Address: '2200 Kensington Court',
- City: 'Oak Brook',
- State: 'Illinois',
- Zipcode: 60523,
- Phone: '(800) 955-2929',
- Fax: '(800) 955-9392',
- Website: 'http://www.nowebsitecircuittown.dx',
-}, {
- ID: 9,
- CompanyName: 'Premier Buy',
- Address: '7601 Penn Avenue South',
- City: 'Richfield',
- State: 'Minnesota',
- Zipcode: 55423,
- Phone: '(612) 291-1000',
- Fax: '(612) 291-2001',
- Website: 'http://www.nowebsitepremierbuy.dx',
-}, {
- ID: 10,
- CompanyName: 'ElectrixMax',
- Address: '263 Shuman Blvd',
- City: 'Naperville',
- State: 'Illinois',
- Zipcode: 60563,
- Phone: '(630) 438-7800',
- Fax: '(630) 438-7801',
- Website: 'http://www.nowebsiteelectrixmax.dx',
-}, {
- ID: 11,
- CompanyName: 'Video Emporium',
- Address: '1201 Elm Street',
- City: 'Dallas',
- State: 'Texas',
- Zipcode: 75270,
- Phone: '(214) 854-3000',
- Fax: '(214) 854-3001',
- Website: 'http://www.nowebsitevideoemporium.dx',
-}, {
- ID: 12,
- CompanyName: 'Screen Shop',
- Address: '1000 Lowes Blvd',
- City: 'Mooresville',
- State: 'North Carolina',
- Zipcode: 28117,
- Phone: '(800) 445-6937',
- Fax: '(800) 445-6938',
- Website: 'http://www.nowebsitescreenshop.dx',
-}];
+const employees: Employee[] = [
+ {
+ ID: 1,
+ FullName: 'John Heart',
+ Title: 'CEO',
+ Employee_Picture: '01.png',
+ Picture: '../../../../images/employees/01.png',
+ MobilePhone: '2135559392',
+ },
+ {
+ ID: 2,
+ FullName: 'Samantha Bright',
+ Title: 'COO',
+ Employee_Picture: '30.png',
+ Picture: '../../../../images/employees/30.png',
+ MobilePhone: '2135552858',
+ },
+ {
+ ID: 3,
+ FullName: 'Arthur Miller',
+ Title: 'CTO',
+ Employee_Picture: '10.png',
+ Picture: '../../../../images/employees/10.png',
+ MobilePhone: '3105558583',
+ },
+ {
+ ID: 4,
+ FullName: 'Robert Reagan',
+ Title: 'CMO',
+ Employee_Picture: '03.png',
+ Picture: '../../../../images/employees/03.png',
+ MobilePhone: '8185552387',
+ },
+ {
+ ID: 5,
+ FullName: 'Greta Sims',
+ Title: 'HR Manager',
+ Employee_Picture: '04.png',
+ Picture: '../../../../images/employees/04.png',
+ MobilePhone: '8185556546',
+ },
+ {
+ ID: 6,
+ FullName: 'Brett Wade',
+ Title: 'IT Manager',
+ Employee_Picture: '05.png',
+ Picture: '../../../../images/employees/05.png',
+ MobilePhone: '6265550358',
+ },
+ {
+ ID: 7,
+ FullName: 'Sandra Johnson',
+ Title: 'Controller',
+ Employee_Picture: '06.png',
+ Picture: '../../../../images/employees/06.png',
+ MobilePhone: '5625552082',
+ },
+ {
+ ID: 8,
+ FullName: 'Ed Holmes',
+ Title: 'Sales Manager',
+ Employee_Picture: '11.png',
+ Picture: '../../../../images/employees/11.png',
+ MobilePhone: '3105551288',
+ },
+ {
+ ID: 9,
+ FullName: 'Barb Banks',
+ Title: 'Support Manager',
+ Employee_Picture: '20.png',
+ Picture: '../../../../images/employees/20.png',
+ MobilePhone: '3105553355',
+ },
+ {
+ ID: 10,
+ FullName: 'Kevin Carter',
+ Title: 'Shipping Manager',
+ Employee_Picture: '07.png',
+ Picture: '../../../../images/employees/07.png',
+ MobilePhone: '2135552840',
+ },
+ {
+ ID: 11,
+ FullName: 'Cindy Stanwick',
+ Title: 'HR Assistant',
+ Employee_Picture: '08.png',
+ Picture: '../../../../images/employees/08.png',
+ MobilePhone: '8185556655',
+ },
+ {
+ ID: 12,
+ FullName: 'Sammy Hill',
+ Title: 'Sales Assistant',
+ Employee_Picture: '12.png',
+ Picture: '../../../../images/employees/12.png',
+ MobilePhone: '6265557292',
+ },
+ {
+ ID: 13,
+ FullName: 'Davey Jones',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '13.png',
+ Picture: '../../../../images/employees/13.png',
+ MobilePhone: '6265550281',
+ },
+ {
+ ID: 14,
+ FullName: 'Victor Norris',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '14.png',
+ Picture: '../../../../images/employees/14.png',
+ MobilePhone: '2135559278',
+ },
+ {
+ ID: 15,
+ FullName: 'Mary Stern',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '15.png',
+ Picture: '../../../../images/employees/15.png',
+ MobilePhone: '8185557857',
+ },
+ {
+ ID: 16,
+ FullName: 'Robin Cosworth',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '16.png',
+ Picture: '../../../../images/employees/16.png',
+ MobilePhone: '8185550942',
+ },
+ {
+ ID: 17,
+ FullName: 'Kelly Rodriguez',
+ Title: 'Support Assistant',
+ Employee_Picture: '17.png',
+ Picture: '../../../../images/employees/17.png',
+ MobilePhone: '8185559248',
+ },
+ {
+ ID: 18,
+ FullName: 'James Anderson',
+ Title: 'Support Assistant',
+ Employee_Picture: '18.png',
+ Picture: '../../../../images/employees/18.png',
+ MobilePhone: '3235554702',
+ },
+ {
+ ID: 19,
+ FullName: 'Antony Remmen',
+ Title: 'Support Assistant',
+ Employee_Picture: '19.png',
+ Picture: '../../../../images/employees/19.png',
+ MobilePhone: '3105556625',
+ },
+ {
+ ID: 20,
+ FullName: 'Olivia Peyton',
+ Title: 'Sales Assistant',
+ Employee_Picture: '09.png',
+ Picture: '../../../../images/employees/09.png',
+ MobilePhone: '3105552728',
+ },
+ {
+ ID: 21,
+ FullName: 'Taylor Riley',
+ Title: 'Network Admin',
+ Employee_Picture: '21.png',
+ Picture: '../../../../images/employees/21.png',
+ MobilePhone: '3105557276',
+ },
+ {
+ ID: 22,
+ FullName: 'Amelia Harper',
+ Title: 'Network Admin',
+ Employee_Picture: '22.png',
+ Picture: '../../../../images/employees/22.png',
+ MobilePhone: '2135554276',
+ },
+ {
+ ID: 23,
+ FullName: 'Wally Hobbs',
+ Title: 'Programmer',
+ Employee_Picture: '23.png',
+ Picture: '../../../../images/employees/23.png',
+ MobilePhone: '8185558872',
+ },
+ {
+ ID: 24,
+ FullName: 'Brad Jameson',
+ Title: 'Programmer',
+ Employee_Picture: '24.png',
+ Picture: '../../../../images/employees/24.png',
+ MobilePhone: '8185554646',
+ },
+ {
+ ID: 25,
+ FullName: 'Karen Goodson',
+ Title: 'Programmer',
+ Employee_Picture: '25.png',
+ Picture: '../../../../images/employees/25.png',
+ MobilePhone: '6265550908',
+ },
+ {
+ ID: 26,
+ FullName: 'Marcus Orbison',
+ Title: 'Travel Coordinator',
+ Employee_Picture: '26.png',
+ Picture: '../../../../images/employees/26.png',
+ MobilePhone: '2135557098',
+ },
+ {
+ ID: 27,
+ FullName: 'Sandy Bright',
+ Title: 'Benefits Coordinator',
+ Employee_Picture: '27.png',
+ Picture: '../../../../images/employees/27.png',
+ MobilePhone: '8185550524',
+ },
+ {
+ ID: 28,
+ FullName: 'Morgan Kennedy',
+ Title: 'Graphic Designer',
+ Employee_Picture: '28.png',
+ Picture: '../../../../images/employees/28.png',
+ MobilePhone: '8185558238',
+ },
+ {
+ ID: 29,
+ FullName: 'Violet Bailey',
+ Title: 'Jr Graphic Designer',
+ Employee_Picture: '29.png',
+ Picture: '../../../../images/employees/29.png',
+ MobilePhone: '8185552478',
+ },
+ {
+ ID: 30,
+ FullName: 'Ken Samuelson',
+ Title: 'Ombudsman',
+ Employee_Picture: '02.png',
+ Picture: '../../../../images/employees/02.png',
+ MobilePhone: '5625559282',
+ },
+ {
+ ID: 31,
+ FullName: 'Nat Maguiree',
+ Title: 'Trainer',
+ Employee_Picture: '31.png',
+ Picture: '../../../../images/employees/31.png',
+ MobilePhone: '5625558377',
+ },
+ {
+ ID: 32,
+ FullName: 'Bart Arnaz',
+ Title: 'Director of Engineering',
+ Employee_Picture: '32.png',
+ Picture: '../../../../images/employees/32.png',
+ MobilePhone: '7145552000',
+ },
+ {
+ ID: 33,
+ FullName: 'Leah Simpson',
+ Title: 'Test Coordinator',
+ Employee_Picture: '33.png',
+ Picture: '../../../../images/employees/33.png',
+ MobilePhone: '5625595830',
+ },
+ {
+ ID: 34,
+ FullName: 'Arnie Schwartz',
+ Title: 'Engineer',
+ Employee_Picture: '34.png',
+ Picture: '../../../../images/employees/34.png',
+ MobilePhone: '7145558882',
+ },
+ {
+ ID: 35,
+ FullName: 'Billy Zimmer',
+ Title: 'Engineer',
+ Employee_Picture: '51.png',
+ Picture: '../../../../images/employees/51.png',
+ MobilePhone: '9095556939',
+ },
+ {
+ ID: 36,
+ FullName: 'Samantha Piper',
+ Title: 'Engineer',
+ Employee_Picture: '35.png',
+ Picture: '../../../../images/employees/35.png',
+ MobilePhone: '3235554512',
+ },
+ {
+ ID: 37,
+ FullName: 'Maggie Boxter',
+ Title: 'Engineer',
+ Employee_Picture: '36.png',
+ Picture: '../../../../images/employees/36.png',
+ MobilePhone: '7145557239',
+ },
+ {
+ ID: 38,
+ FullName: 'Terry Bradley',
+ Title: 'QA Engineer',
+ Employee_Picture: '37.png',
+ Picture: '../../../../images/employees/37.png',
+ MobilePhone: '8055552788',
+ },
+ {
+ ID: 39,
+ FullName: 'Gabe Jones',
+ Title: 'Retail Coordinator',
+ Employee_Picture: '38.png',
+ Picture: '../../../../images/employees/38.png',
+ MobilePhone: '3105555395',
+ },
+ {
+ ID: 40,
+ FullName: 'Lucy Ball',
+ Title: 'Sales Assistant',
+ Employee_Picture: '39.png',
+ Picture: '../../../../images/employees/39.png',
+ MobilePhone: '3105553357',
+ },
+ {
+ ID: 41,
+ FullName: 'Jim Packard',
+ Title: 'Retail Sales Manager',
+ Employee_Picture: '40.png',
+ Picture: '../../../../images/employees/40.png',
+ MobilePhone: '6615558224',
+ },
+ {
+ ID: 42,
+ FullName: 'Hannah Brookly',
+ Title: 'Online Sales Manager',
+ Employee_Picture: '41.png',
+ Picture: '../../../../images/employees/41.png',
+ MobilePhone: '8055553627',
+ },
+ {
+ ID: 43,
+ FullName: 'Harv Mudd',
+ Title: 'Retail Sales Manager',
+ Employee_Picture: '42.png',
+ Picture: '../../../../images/employees/42.png',
+ MobilePhone: '8315553895',
+ },
+ {
+ ID: 44,
+ FullName: 'Clark Morgan',
+ Title: 'Retail Sales Manager',
+ Employee_Picture: '43.png',
+ Picture: '../../../../images/employees/43.png',
+ MobilePhone: '9255552525',
+ },
+ {
+ ID: 45,
+ FullName: 'Todd Hoffman',
+ Title: 'Retail Sales Manager',
+ Employee_Picture: '44.png',
+ Picture: '../../../../images/employees/44.png',
+ MobilePhone: '9255553579',
+ },
+ {
+ ID: 46,
+ FullName: 'Jackie Garmin',
+ Title: 'Support Assistant',
+ Employee_Picture: '45.png',
+ Picture: '../../../../images/employees/45.png',
+ MobilePhone: '2135551824',
+ },
+ {
+ ID: 47,
+ FullName: 'Lincoln Bartlett',
+ Title: 'Sales Assistant',
+ Employee_Picture: '46.png',
+ Picture: '../../../../images/employees/46.png',
+ MobilePhone: '2135558272',
+ },
+ {
+ ID: 48,
+ FullName: 'Brad Farkus',
+ Title: 'Engineer',
+ Employee_Picture: '47.png',
+ Picture: '../../../../images/employees/47.png',
+ MobilePhone: '2135553626',
+ },
+ {
+ ID: 49,
+ FullName: 'Jenny Hobbs',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '48.png',
+ Picture: '../../../../images/employees/48.png',
+ MobilePhone: '3105552668',
+ },
+ {
+ ID: 50,
+ FullName: 'Dallas Lou',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '49.png',
+ Picture: '../../../../images/employees/49.png',
+ MobilePhone: '2135558357',
+ },
+ {
+ ID: 51,
+ FullName: 'Stu Pizaro',
+ Title: 'Engineer',
+ Employee_Picture: '50.png',
+ Picture: '../../../../images/employees/50.png',
+ MobilePhone: '2135552552',
+ },
+];
@Injectable()
export class Service {
- getCustomers() {
- return customers;
+ getEmployees() {
+ return employees;
}
}
diff --git a/apps/demos/Demos/Pagination/Overview/Angular/app/employee-card/employee-card.component.html b/apps/demos/Demos/Pagination/Overview/Angular/app/employee-card/employee-card.component.html
new file mode 100644
index 000000000000..436ef5afdbfc
--- /dev/null
+++ b/apps/demos/Demos/Pagination/Overview/Angular/app/employee-card/employee-card.component.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+ Full Name:
+ {{ employee.FullName }}
+
+
+ Position:
+ {{ employee.Title }}
+
+
+ Phone:
+ {{ employee.MobilePhone }}
+
+
diff --git a/apps/demos/Demos/Pagination/Overview/Angular/app/employee-card/employee-card.component.ts b/apps/demos/Demos/Pagination/Overview/Angular/app/employee-card/employee-card.component.ts
new file mode 100644
index 000000000000..7f112f55fbdb
--- /dev/null
+++ b/apps/demos/Demos/Pagination/Overview/Angular/app/employee-card/employee-card.component.ts
@@ -0,0 +1,16 @@
+import { Component, Input } from '@angular/core';
+import { Employee } from '../app.service';
+
+let modulePrefix = '';
+// @ts-ignore
+if (window && window.config.packageConfigPaths) {
+ modulePrefix = '/app';
+}
+
+@Component({
+ selector: 'employee-card',
+ templateUrl: `.${modulePrefix}/employee-card/employee-card.component.html`,
+})
+export class EmployeeCard {
+ @Input() employee: Employee;
+}
diff --git a/apps/demos/Demos/Pagination/Overview/Angular/index.html b/apps/demos/Demos/Pagination/Overview/Angular/index.html
index 3bb93e38968b..d6cce972f42b 100644
--- a/apps/demos/Demos/Pagination/Overview/Angular/index.html
+++ b/apps/demos/Demos/Pagination/Overview/Angular/index.html
@@ -8,7 +8,7 @@
-
+
diff --git a/apps/demos/Demos/Pagination/Overview/React/App.js b/apps/demos/Demos/Pagination/Overview/React/App.js
deleted file mode 100644
index 81cf17b7a8a0..000000000000
--- a/apps/demos/Demos/Pagination/Overview/React/App.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from "react";
-import Text from "./Text.js";
-import Pagination from "devextreme-react/pagination";
-import { customers } from "./data.js";
-
-const columns = ["CompanyName", "City", "State", "Phone", "Fax"];
-
-const App = () => {
- return (
- <>
-
-
- >
- );
-};
-
-export default App;
diff --git a/apps/demos/Demos/Pagination/Overview/React/App.tsx b/apps/demos/Demos/Pagination/Overview/React/App.tsx
new file mode 100644
index 000000000000..43ffc99aae3b
--- /dev/null
+++ b/apps/demos/Demos/Pagination/Overview/React/App.tsx
@@ -0,0 +1,34 @@
+import React, { useState } from 'react';
+import Pagination from 'devextreme-react/pagination';
+import EmployeeGallery from './EmployeesGallery.tsx';
+
+import { employees } from './data.ts';
+
+const PAGE_SIZES = [4, 6];
+
+const App = () => {
+ const [pageSize, setPageSize] = useState(4);
+ const [pageIndex, setPageIndex] = useState(1);
+
+ return (
+ <>
+
+
+ >
+ );
+};
+
+export default App;
diff --git a/apps/demos/Demos/Pagination/Overview/React/EmployeeCard.tsx b/apps/demos/Demos/Pagination/Overview/React/EmployeeCard.tsx
new file mode 100644
index 000000000000..cf450dd52775
--- /dev/null
+++ b/apps/demos/Demos/Pagination/Overview/React/EmployeeCard.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { Employee } from './data';
+
+interface EmployeeCardProps {
+ employee: Employee;
+}
+
+const EmployeeCard = ({ employee }: EmployeeCardProps) => {
+ return (
+
+
+
+
+
+
+ Full Name:
+ {employee.FullName}
+
+
+
+ Position:
+ {employee.Title}
+
+
+
+ Phone:
+ {employee.MobilePhone}
+
+
+
+ );
+};
+
+export default EmployeeCard;
diff --git a/apps/demos/Demos/Pagination/Overview/React/EmployeesGallery.tsx b/apps/demos/Demos/Pagination/Overview/React/EmployeesGallery.tsx
new file mode 100644
index 000000000000..c8667c9b344f
--- /dev/null
+++ b/apps/demos/Demos/Pagination/Overview/React/EmployeesGallery.tsx
@@ -0,0 +1,27 @@
+import React from 'react';
+import EmployeeCard from './EmployeeCard.tsx';
+import { Employee } from './data';
+
+interface EmployeeGalleryProps {
+ employees: Employee[];
+ pageSize: number;
+ pageIndex: number;
+}
+
+const EmployeeGallery = ({ employees, pageSize, pageIndex }: EmployeeGalleryProps) => {
+ const cardsNumber = pageSize === 4 ? 'employees--forth' : 'employees--six';
+ const pageEmployees = employees.slice((pageIndex - 1) * pageSize, pageIndex * pageSize);
+
+ return (
+
+ {pageEmployees.map((employee) => (
+
+ ))}
+
+ );
+};
+
+export default EmployeeGallery;
diff --git a/apps/demos/Demos/Pagination/Overview/React/Text.js b/apps/demos/Demos/Pagination/Overview/React/Text.js
deleted file mode 100644
index f1cc30aefb20..000000000000
--- a/apps/demos/Demos/Pagination/Overview/React/Text.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from "react";
-
-const Text = () => {
- return "test text";
-};
-
-export default Text;
diff --git a/apps/demos/Demos/Pagination/Overview/React/data.js b/apps/demos/Demos/Pagination/Overview/React/data.js
deleted file mode 100644
index 6380157422df..000000000000
--- a/apps/demos/Demos/Pagination/Overview/React/data.js
+++ /dev/null
@@ -1,121 +0,0 @@
-export const customers = [{
- ID: 1,
- CompanyName: 'Super Mart of the West',
- Address: '702 SW 8th Street',
- City: 'Bentonville',
- State: 'Arkansas',
- Zipcode: 72716,
- Phone: '(800) 555-2797',
- Fax: '(800) 555-2171',
- Website: 'http://www.nowebsitesupermart.dx',
-}, {
- ID: 2,
- CompanyName: 'Electronics Depot',
- Address: '2455 Paces Ferry Road NW',
- City: 'Atlanta',
- State: 'Georgia',
- Zipcode: 30339,
- Phone: '(800) 595-3232',
- Fax: '(800) 595-3231',
- Website: 'http://www.nowebsitedepot.dx',
-}, {
- ID: 3,
- CompanyName: 'K&S Music',
- Address: '1000 Nicllet Mall',
- City: 'Minneapolis',
- State: 'Minnesota',
- Zipcode: 55403,
- Phone: '(612) 304-6073',
- Fax: '(612) 304-6074',
- Website: 'http://www.nowebsitemusic.dx',
-}, {
- ID: 4,
- CompanyName: "Tom's Club",
- Address: '999 Lake Drive',
- City: 'Issaquah',
- State: 'Washington',
- Zipcode: 98027,
- Phone: '(800) 955-2292',
- Fax: '(800) 955-2293',
- Website: 'http://www.nowebsitetomsclub.dx',
-}, {
- ID: 5,
- CompanyName: 'E-Mart',
- Address: '3333 Beverly Rd',
- City: 'Hoffman Estates',
- State: 'Illinois',
- Zipcode: 60179,
- Phone: '(847) 286-2500',
- Fax: '(847) 286-2501',
- Website: 'http://www.nowebsiteemart.dx',
-}, {
- ID: 6,
- CompanyName: 'Walters',
- Address: '200 Wilmot Rd',
- City: 'Deerfield',
- State: 'Illinois',
- Zipcode: 60015,
- Phone: '(847) 940-2500',
- Fax: '(847) 940-2501',
- Website: 'http://www.nowebsitewalters.dx',
-}, {
- ID: 7,
- CompanyName: 'StereoShack',
- Address: '400 Commerce S',
- City: 'Fort Worth',
- State: 'Texas',
- Zipcode: 76102,
- Phone: '(817) 820-0741',
- Fax: '(817) 820-0742',
- Website: 'http://www.nowebsiteshack.dx',
-}, {
- ID: 8,
- CompanyName: 'Circuit Town',
- Address: '2200 Kensington Court',
- City: 'Oak Brook',
- State: 'Illinois',
- Zipcode: 60523,
- Phone: '(800) 955-2929',
- Fax: '(800) 955-9392',
- Website: 'http://www.nowebsitecircuittown.dx',
-}, {
- ID: 9,
- CompanyName: 'Premier Buy',
- Address: '7601 Penn Avenue South',
- City: 'Richfield',
- State: 'Minnesota',
- Zipcode: 55423,
- Phone: '(612) 291-1000',
- Fax: '(612) 291-2001',
- Website: 'http://www.nowebsitepremierbuy.dx',
-}, {
- ID: 10,
- CompanyName: 'ElectrixMax',
- Address: '263 Shuman Blvd',
- City: 'Naperville',
- State: 'Illinois',
- Zipcode: 60563,
- Phone: '(630) 438-7800',
- Fax: '(630) 438-7801',
- Website: 'http://www.nowebsiteelectrixmax.dx',
-}, {
- ID: 11,
- CompanyName: 'Video Emporium',
- Address: '1201 Elm Street',
- City: 'Dallas',
- State: 'Texas',
- Zipcode: 75270,
- Phone: '(214) 854-3000',
- Fax: '(214) 854-3001',
- Website: 'http://www.nowebsitevideoemporium.dx',
-}, {
- ID: 12,
- CompanyName: 'Screen Shop',
- Address: '1000 Lowes Blvd',
- City: 'Mooresville',
- State: 'North Carolina',
- Zipcode: 28117,
- Phone: '(800) 445-6937',
- Fax: '(800) 445-6938',
- Website: 'http://www.nowebsitescreenshop.dx',
-}];
diff --git a/apps/demos/Demos/Pagination/Overview/React/data.ts b/apps/demos/Demos/Pagination/Overview/React/data.ts
new file mode 100644
index 000000000000..bd2e43e18ba2
--- /dev/null
+++ b/apps/demos/Demos/Pagination/Overview/React/data.ts
@@ -0,0 +1,419 @@
+export interface Employee {
+ ID: number;
+ FullName: string;
+ Title: string;
+ Employee_Picture: string;
+ Picture: string;
+ MobilePhone: string;
+}
+
+export const employees: Employee[] = [
+ {
+ ID: 1,
+ FullName: 'John Heart',
+ Title: 'CEO',
+ Employee_Picture: '01.png',
+ Picture: '../../../../images/employees/01.png',
+ MobilePhone: '2135559392',
+ },
+ {
+ ID: 2,
+ FullName: 'Samantha Bright',
+ Title: 'COO',
+ Employee_Picture: '30.png',
+ Picture: '../../../../images/employees/30.png',
+ MobilePhone: '2135552858',
+ },
+ {
+ ID: 3,
+ FullName: 'Arthur Miller',
+ Title: 'CTO',
+ Employee_Picture: '10.png',
+ Picture: '../../../../images/employees/10.png',
+ MobilePhone: '3105558583',
+ },
+ {
+ ID: 4,
+ FullName: 'Robert Reagan',
+ Title: 'CMO',
+ Employee_Picture: '03.png',
+ Picture: '../../../../images/employees/03.png',
+ MobilePhone: '8185552387',
+ },
+ {
+ ID: 5,
+ FullName: 'Greta Sims',
+ Title: 'HR Manager',
+ Employee_Picture: '04.png',
+ Picture: '../../../../images/employees/04.png',
+ MobilePhone: '8185556546',
+ },
+ {
+ ID: 6,
+ FullName: 'Brett Wade',
+ Title: 'IT Manager',
+ Employee_Picture: '05.png',
+ Picture: '../../../../images/employees/05.png',
+ MobilePhone: '6265550358',
+ },
+ {
+ ID: 7,
+ FullName: 'Sandra Johnson',
+ Title: 'Controller',
+ Employee_Picture: '06.png',
+ Picture: '../../../../images/employees/06.png',
+ MobilePhone: '5625552082',
+ },
+ {
+ ID: 8,
+ FullName: 'Ed Holmes',
+ Title: 'Sales Manager',
+ Employee_Picture: '11.png',
+ Picture: '../../../../images/employees/11.png',
+ MobilePhone: '3105551288',
+ },
+ {
+ ID: 9,
+ FullName: 'Barb Banks',
+ Title: 'Support Manager',
+ Employee_Picture: '20.png',
+ Picture: '../../../../images/employees/20.png',
+ MobilePhone: '3105553355',
+ },
+ {
+ ID: 10,
+ FullName: 'Kevin Carter',
+ Title: 'Shipping Manager',
+ Employee_Picture: '07.png',
+ Picture: '../../../../images/employees/07.png',
+ MobilePhone: '2135552840',
+ },
+ {
+ ID: 11,
+ FullName: 'Cindy Stanwick',
+ Title: 'HR Assistant',
+ Employee_Picture: '08.png',
+ Picture: '../../../../images/employees/08.png',
+ MobilePhone: '8185556655',
+ },
+ {
+ ID: 12,
+ FullName: 'Sammy Hill',
+ Title: 'Sales Assistant',
+ Employee_Picture: '12.png',
+ Picture: '../../../../images/employees/12.png',
+ MobilePhone: '6265557292',
+ },
+ {
+ ID: 13,
+ FullName: 'Davey Jones',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '13.png',
+ Picture: '../../../../images/employees/13.png',
+ MobilePhone: '6265550281',
+ },
+ {
+ ID: 14,
+ FullName: 'Victor Norris',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '14.png',
+ Picture: '../../../../images/employees/14.png',
+ MobilePhone: '2135559278',
+ },
+ {
+ ID: 15,
+ FullName: 'Mary Stern',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '15.png',
+ Picture: '../../../../images/employees/15.png',
+ MobilePhone: '8185557857',
+ },
+ {
+ ID: 16,
+ FullName: 'Robin Cosworth',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '16.png',
+ Picture: '../../../../images/employees/16.png',
+ MobilePhone: '8185550942',
+ },
+ {
+ ID: 17,
+ FullName: 'Kelly Rodriguez',
+ Title: 'Support Assistant',
+ Employee_Picture: '17.png',
+ Picture: '../../../../images/employees/17.png',
+ MobilePhone: '8185559248',
+ },
+ {
+ ID: 18,
+ FullName: 'James Anderson',
+ Title: 'Support Assistant',
+ Employee_Picture: '18.png',
+ Picture: '../../../../images/employees/18.png',
+ MobilePhone: '3235554702',
+ },
+ {
+ ID: 19,
+ FullName: 'Antony Remmen',
+ Title: 'Support Assistant',
+ Employee_Picture: '19.png',
+ Picture: '../../../../images/employees/19.png',
+ MobilePhone: '3105556625',
+ },
+ {
+ ID: 20,
+ FullName: 'Olivia Peyton',
+ Title: 'Sales Assistant',
+ Employee_Picture: '09.png',
+ Picture: '../../../../images/employees/09.png',
+ MobilePhone: '3105552728',
+ },
+ {
+ ID: 21,
+ FullName: 'Taylor Riley',
+ Title: 'Network Admin',
+ Employee_Picture: '21.png',
+ Picture: '../../../../images/employees/21.png',
+ MobilePhone: '3105557276',
+ },
+ {
+ ID: 22,
+ FullName: 'Amelia Harper',
+ Title: 'Network Admin',
+ Employee_Picture: '22.png',
+ Picture: '../../../../images/employees/22.png',
+ MobilePhone: '2135554276',
+ },
+ {
+ ID: 23,
+ FullName: 'Wally Hobbs',
+ Title: 'Programmer',
+ Employee_Picture: '23.png',
+ Picture: '../../../../images/employees/23.png',
+ MobilePhone: '8185558872',
+ },
+ {
+ ID: 24,
+ FullName: 'Brad Jameson',
+ Title: 'Programmer',
+ Employee_Picture: '24.png',
+ Picture: '../../../../images/employees/24.png',
+ MobilePhone: '8185554646',
+ },
+ {
+ ID: 25,
+ FullName: 'Karen Goodson',
+ Title: 'Programmer',
+ Employee_Picture: '25.png',
+ Picture: '../../../../images/employees/25.png',
+ MobilePhone: '6265550908',
+ },
+ {
+ ID: 26,
+ FullName: 'Marcus Orbison',
+ Title: 'Travel Coordinator',
+ Employee_Picture: '26.png',
+ Picture: '../../../../images/employees/26.png',
+ MobilePhone: '2135557098',
+ },
+ {
+ ID: 27,
+ FullName: 'Sandy Bright',
+ Title: 'Benefits Coordinator',
+ Employee_Picture: '27.png',
+ Picture: '../../../../images/employees/27.png',
+ MobilePhone: '8185550524',
+ },
+ {
+ ID: 28,
+ FullName: 'Morgan Kennedy',
+ Title: 'Graphic Designer',
+ Employee_Picture: '28.png',
+ Picture: '../../../../images/employees/28.png',
+ MobilePhone: '8185558238',
+ },
+ {
+ ID: 29,
+ FullName: 'Violet Bailey',
+ Title: 'Jr Graphic Designer',
+ Employee_Picture: '29.png',
+ Picture: '../../../../images/employees/29.png',
+ MobilePhone: '8185552478',
+ },
+ {
+ ID: 30,
+ FullName: 'Ken Samuelson',
+ Title: 'Ombudsman',
+ Employee_Picture: '02.png',
+ Picture: '../../../../images/employees/02.png',
+ MobilePhone: '5625559282',
+ },
+ {
+ ID: 31,
+ FullName: 'Nat Maguiree',
+ Title: 'Trainer',
+ Employee_Picture: '31.png',
+ Picture: '../../../../images/employees/31.png',
+ MobilePhone: '5625558377',
+ },
+ {
+ ID: 32,
+ FullName: 'Bart Arnaz',
+ Title: 'Director of Engineering',
+ Employee_Picture: '32.png',
+ Picture: '../../../../images/employees/32.png',
+ MobilePhone: '7145552000',
+ },
+ {
+ ID: 33,
+ FullName: 'Leah Simpson',
+ Title: 'Test Coordinator',
+ Employee_Picture: '33.png',
+ Picture: '../../../../images/employees/33.png',
+ MobilePhone: '5625595830',
+ },
+ {
+ ID: 34,
+ FullName: 'Arnie Schwartz',
+ Title: 'Engineer',
+ Employee_Picture: '34.png',
+ Picture: '../../../../images/employees/34.png',
+ MobilePhone: '7145558882',
+ },
+ {
+ ID: 35,
+ FullName: 'Billy Zimmer',
+ Title: 'Engineer',
+ Employee_Picture: '51.png',
+ Picture: '../../../../images/employees/51.png',
+ MobilePhone: '9095556939',
+ },
+ {
+ ID: 36,
+ FullName: 'Samantha Piper',
+ Title: 'Engineer',
+ Employee_Picture: '35.png',
+ Picture: '../../../../images/employees/35.png',
+ MobilePhone: '3235554512',
+ },
+ {
+ ID: 37,
+ FullName: 'Maggie Boxter',
+ Title: 'Engineer',
+ Employee_Picture: '36.png',
+ Picture: '../../../../images/employees/36.png',
+ MobilePhone: '7145557239',
+ },
+ {
+ ID: 38,
+ FullName: 'Terry Bradley',
+ Title: 'QA Engineer',
+ Employee_Picture: '37.png',
+ Picture: '../../../../images/employees/37.png',
+ MobilePhone: '8055552788',
+ },
+ {
+ ID: 39,
+ FullName: 'Gabe Jones',
+ Title: 'Retail Coordinator',
+ Employee_Picture: '38.png',
+ Picture: '../../../../images/employees/38.png',
+ MobilePhone: '3105555395',
+ },
+ {
+ ID: 40,
+ FullName: 'Lucy Ball',
+ Title: 'Sales Assistant',
+ Employee_Picture: '39.png',
+ Picture: '../../../../images/employees/39.png',
+ MobilePhone: '3105553357',
+ },
+ {
+ ID: 41,
+ FullName: 'Jim Packard',
+ Title: 'Retail Sales Manager',
+ Employee_Picture: '40.png',
+ Picture: '../../../../images/employees/40.png',
+ MobilePhone: '6615558224',
+ },
+ {
+ ID: 42,
+ FullName: 'Hannah Brookly',
+ Title: 'Online Sales Manager',
+ Employee_Picture: '41.png',
+ Picture: '../../../../images/employees/41.png',
+ MobilePhone: '8055553627',
+ },
+ {
+ ID: 43,
+ FullName: 'Harv Mudd',
+ Title: 'Retail Sales Manager',
+ Employee_Picture: '42.png',
+ Picture: '../../../../images/employees/42.png',
+ MobilePhone: '8315553895',
+ },
+ {
+ ID: 44,
+ FullName: 'Clark Morgan',
+ Title: 'Retail Sales Manager',
+ Employee_Picture: '43.png',
+ Picture: '../../../../images/employees/43.png',
+ MobilePhone: '9255552525',
+ },
+ {
+ ID: 45,
+ FullName: 'Todd Hoffman',
+ Title: 'Retail Sales Manager',
+ Employee_Picture: '44.png',
+ Picture: '../../../../images/employees/44.png',
+ MobilePhone: '9255553579',
+ },
+ {
+ ID: 46,
+ FullName: 'Jackie Garmin',
+ Title: 'Support Assistant',
+ Employee_Picture: '45.png',
+ Picture: '../../../../images/employees/45.png',
+ MobilePhone: '2135551824',
+ },
+ {
+ ID: 47,
+ FullName: 'Lincoln Bartlett',
+ Title: 'Sales Assistant',
+ Employee_Picture: '46.png',
+ Picture: '../../../../images/employees/46.png',
+ MobilePhone: '2135558272',
+ },
+ {
+ ID: 48,
+ FullName: 'Brad Farkus',
+ Title: 'Engineer',
+ Employee_Picture: '47.png',
+ Picture: '../../../../images/employees/47.png',
+ MobilePhone: '2135553626',
+ },
+ {
+ ID: 49,
+ FullName: 'Jenny Hobbs',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '48.png',
+ Picture: '../../../../images/employees/48.png',
+ MobilePhone: '3105552668',
+ },
+ {
+ ID: 50,
+ FullName: 'Dallas Lou',
+ Title: 'Shipping Assistant',
+ Employee_Picture: '49.png',
+ Picture: '../../../../images/employees/49.png',
+ MobilePhone: '2135558357',
+ },
+ {
+ ID: 51,
+ FullName: 'Stu Pizaro',
+ Title: 'Engineer',
+ Employee_Picture: '50.png',
+ Picture: '../../../../images/employees/50.png',
+ MobilePhone: '2135552552',
+ },
+];
\ No newline at end of file
diff --git a/apps/demos/Demos/Pagination/Overview/React/index.html b/apps/demos/Demos/Pagination/Overview/React/index.html
index b9f3a9764b01..637762a048ae 100644
--- a/apps/demos/Demos/Pagination/Overview/React/index.html
+++ b/apps/demos/Demos/Pagination/Overview/React/index.html
@@ -6,18 +6,19 @@
+