Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions apps/react-storybook/stories/htmleditor/HtmlEditor.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import React from 'react';
import { HtmlEditor, Toolbar, Item, IHtmlEditorOptions, IItemProps } from 'devextreme-react/html-editor';
import type { Meta, StoryObj } from '@storybook/react';
import { defaultToolbarItems, fullToolbarItems } from './data';
import { AIIntegration } from 'devextreme/artifacts/npm/devextreme/common/ai-integration';

const meta: Meta<typeof HtmlEditor> = {
title: 'Editors/HtmlEditor',
component: HtmlEditor,
};

export default meta;

type HtmlEditorRenderArgs = IHtmlEditorOptions & {
items: IItemProps[],
};

export const Overview: StoryObj<HtmlEditorRenderArgs> = {
argTypes: {
items: {
options: ['default', 'full'],
mapping: {
default: defaultToolbarItems,
full: fullToolbarItems,
},
control: {
type: 'select',
labels: {
default: 'Default Toolbar',
full: 'Full Toolbar',
},
},
},
rtlEnabled: { control: 'boolean' },
readOnly: { control: 'boolean' },
disabled: { control: 'boolean'},
height: { control: 'number' },
width: { control: 'text' },
},
args: {
items: defaultToolbarItems,
rtlEnabled: false,
readOnly: false,
disabled: false,
height: 500,
width: '100%',
},
render: ({ items, ...editorProps }: HtmlEditorRenderArgs) => (
<div style={{ width: '100%' }}>
<HtmlEditor {...editorProps} defaultValue="<p>Hello, world!</p>">
<Toolbar>
{items.map((item, index) => (
<Item key={index} {...item} />
))}
</Toolbar>
</HtmlEditor>
</div>
),
}

export const WithAI: StoryObj<HtmlEditorRenderArgs> = {
args: {
items: [
...defaultToolbarItems,
{ name: 'separator' },
{ name: 'ai' }
],
height: 500,
width: '100%',
},
render: ({ items, ...editorProps }: HtmlEditorRenderArgs) => (
<div style={{ width: '100%' }}>
<HtmlEditor
{...editorProps}
defaultValue="<p>What is the capital of France?</p>"
aiIntegration={{} as AIIntegration}
>
<Toolbar>
{items.map((item, index) => (
<Item key={index} {...item} />
))}
</Toolbar>
</HtmlEditor>
</div>
),
}

62 changes: 62 additions & 0 deletions apps/react-storybook/stories/htmleditor/data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
export const defaultToolbarItems = [
{ name: 'bold' },
{ name: 'italic' },
{ name: 'underline' },
{ name: 'separator' },
{ name: 'undo' },
{ name: 'redo' },
];

export const fullToolbarItems = [
{ name: 'undo' },
{ name: 'redo' },
{ name: 'separator' },
{
name: 'size',
acceptedValues: ['8pt', '10pt', '12pt', '14pt', '18pt', '24pt', '36pt'],
options: { placeholder: 'Font size' },
},
{
name: 'font',
acceptedValues: ['Arial', 'Courier New', 'Georgia', 'Impact', 'Lucida Console', 'Tahoma', 'Times New Roman', 'Verdana'],
options: { placeholder: 'Font' },
},
{ name: 'separator' },
{ name: 'bold' },
{ name: 'italic' },
{ name: 'strike' },
{ name: 'underline' },
{ name: 'separator' },
{ name: 'alignLeft' },
{ name: 'alignCenter' },
{ name: 'alignRight' },
{ name: 'alignJustify' },
{ name: 'separator' },
{ name: 'orderedList' },
{ name: 'bulletList' },
{ name: 'separator' },
{
name: 'header',
acceptedValues: [false, 1, 2, 3, 4, 5],
options: { placeholder: 'Header' },
},
{ name: 'separator' },
{ name: 'color' },
{ name: 'background' },
{ name: 'separator' },
{ name: 'link' },
{ name: 'image' },
{ name: 'separator' },
{ name: 'clear' },
{ name: 'codeBlock' },
{ name: 'blockquote' },
{ name: 'separator' },
{ name: 'insertTable' },
{ name: 'deleteTable' },
{ name: 'insertRowAbove' },
{ name: 'insertRowBelow' },
{ name: 'deleteRow' },
{ name: 'insertColumnLeft' },
{ name: 'insertColumnRight' },
{ name: 'deleteColumn' },
];
3 changes: 0 additions & 3 deletions packages/devextreme-scss/scss/widgets/base/_htmlEditor.scss
Original file line number Diff line number Diff line change
Expand Up @@ -354,18 +354,15 @@ $transparent-border: 1px solid transparent;

.dx-aidialog-controls {
display: flex;
gap: 8px;

.dx-selectbox {
flex: 1 0 0;
max-width: calc(50% - 4px);
}
}

.dx-aidialog-content {
display: flex;
flex-direction: column;
gap: 12px;
}

.dx-aidialog-title {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -302,3 +302,16 @@
.dx-formdialog.dx-dropdowneditor-overlay.dx-popup-wrapper .dx-overlay-content {
box-shadow: $fluent-popup-content-shadow;
}

.dx-aidialog-controls {
gap: $fluent-aidialog-selects-gap;

.dx-selectbox {
max-width: calc(50% - $fluent-aidialog-selects-gap * 0.5);
}
}

.dx-aidialog-content {
padding: $fluent-aidialog-content-padding;
gap: $fluent-aidialog-content-gap;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,19 @@ $fluent-html-editor-toolbar-menu-separator-margin: 4px !default;
$fluent-html-editor-fileuploader-input-wrapper-border-radius: 8px !default;
$fluent-html-editor-fileuploader-input-wrapper-border-size: 1.5px !default;
$fluent-html-editor-add-image-dialog-tabs-padding: null !default;
$fluent-aidialog-selects-gap: null !default;
$fluent-aidialog-content-gap: null !default;
$fluent-aidialog-content-padding: null !default;

@if $size == "default" {
$fluent-toolbar-size-editor-width: 120px !default;
$fluent-html-editor-vertical-padding: 16px !default;
$fluent-html-editor-horizontal-padding: 16px !default;
$fluent-html-editor-add-image-dialog-fileuploader-padding: 48px 0 24px;
$fluent-html-editor-add-image-dialog-tabs-padding: 14px !default;
$fluent-aidialog-selects-gap: 8px;
$fluent-aidialog-content-gap: 16px;
$fluent-aidialog-content-padding: 16px 24px;
}

@else if $size == "compact" {
Expand All @@ -26,6 +32,9 @@ $fluent-html-editor-add-image-dialog-tabs-padding: null !default;
$fluent-html-editor-horizontal-padding: 12px !default;
$fluent-html-editor-add-image-dialog-fileuploader-padding: 40px 0 18px;
$fluent-html-editor-add-image-dialog-tabs-padding: 8px !default;
$fluent-aidialog-selects-gap: 4px;
$fluent-aidialog-content-gap: 12px;
$fluent-aidialog-content-padding: 12px 16px;
}

$fluent-htmleditor-toolbar-padding: $fluent-html-editor-horizontal-padding !default;
Original file line number Diff line number Diff line change
Expand Up @@ -298,3 +298,22 @@
background-color: $htmleditor-cells-separator-bg;
}
}

.dx-aidialog {
.dx-aidialog-controls {
gap: $generic-aidialog-selects-gap;

.dx-selectbox {
max-width: calc(50% - $generic-aidialog-selects-gap * 0.5);
}
}

.dx-aidialog-content {
padding: $generic-aidialog-content-padding;
gap: $generic-aidialog-content-gap;
}

.dx-button {
min-width: auto;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,22 @@
$generic-toolbar-size-editor-width: null !default;
$generic-html-editor-add-image-dialog-base-padding: 5px !default;
$generic-html-editor-add-image-dialog-fileuploader-padding: null !default;
$generic-aidialog-selects-gap: null !default;
$generic-aidialog-content-gap: null !default;
$generic-aidialog-content-padding: null !default;

@if $size == "default" {
$generic-toolbar-size-editor-width: 105px !default;
$generic-html-editor-add-image-dialog-fileuploader-padding: 60px 20px !default;
$generic-aidialog-selects-gap: 10px;
$generic-aidialog-content-gap: 20px;
$generic-aidialog-content-padding: 20px;
}

@else if $size == "compact" {
$generic-toolbar-size-editor-width: 80px !default;
$generic-html-editor-add-image-dialog-fileuploader-padding: 40px 20px !default;
$generic-aidialog-selects-gap: 5px;
$generic-aidialog-content-gap: 10px;
$generic-aidialog-content-padding: 10px;
}
Original file line number Diff line number Diff line change
Expand Up @@ -342,3 +342,28 @@
box-shadow: $material-popup-overlay-content-shadow;
}
}

.dx-aidialog {
.dx-toolbar.dx-popup-bottom {
padding: $material-aidialog-toolbar-padding;
}

.dx-formdialog.dx-dropdowneditor-overlay.dx-popup-wrapper {
.dx-overlay-content {
box-shadow: $material-popup-overlay-content-shadow;
}
}

.dx-aidialog-controls {
gap: $material-aidialog-selects-gap;

.dx-selectbox {
max-width: calc(50% - $material-aidialog-selects-gap * 0.5);
}
}

.dx-aidialog-content {
padding: $material-aidialog-content-padding;
gap: $material-aidialog-content-gap;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,27 @@
$material-toolbar-size-editor-width: null !default;
$material-htmleditor-toolbar-padding: null !default;
$material-html-editor-add-image-dialog-fileuploader-padding: null !default;
$material-aidialog-selects-gap: null !default;
$material-aidialog-content-gap: null !default;
$material-aidialog-content-padding: null !default;
$material-aidialog-toolbar-padding: null !default;

@if $size == "default" {
$material-toolbar-size-editor-width: 120px !default;
$material-htmleditor-toolbar-padding: 16px !default;
$material-html-editor-add-image-dialog-fileuploader-padding: 50px 40px;
$material-aidialog-selects-gap: 8px;
$material-aidialog-content-gap: 24px;
$material-aidialog-content-padding: 24px;
$material-aidialog-toolbar-padding: 16px 24px;
}

@else if $size == "compact" {
$material-toolbar-size-editor-width: 90px !default;
$material-htmleditor-toolbar-padding: 11px !default;
$material-html-editor-add-image-dialog-fileuploader-padding: 40px 30px;
$material-aidialog-selects-gap: 8px;
$material-aidialog-content-gap: 16px;
$material-aidialog-content-padding: 16px;
$material-aidialog-toolbar-padding: 8px 16px;
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export const dependencies: FlatStylesDependencies = {
gallery: [],
toolbar: ['validation', 'button', 'loadindicator', 'loadpanel', 'scrollview', 'popup'],
contextmenu: ['validation', 'button', 'loadindicator', 'textbox'],
htmleditor: ['validation', 'button', 'loadindicator', 'loadpanel', 'scrollview', 'popup', 'toolbar', 'textbox', 'list', 'checkbox', 'selectbox', 'numberbox', 'multiview', 'tabs', 'tabpanel', 'box', 'responsivebox', 'calendar', 'datebox', 'form', 'buttongroup', 'colorbox', 'progressbar', 'fileuploader', 'contextmenu', 'textarea'],
htmleditor: ['validation', 'button', 'loadindicator', 'loadpanel', 'scrollview', 'popup', 'toolbar', 'textbox', 'list', 'checkbox', 'selectbox', 'numberbox', 'multiview', 'tabs', 'tabpanel', 'box', 'responsivebox', 'calendar', 'datebox', 'form', 'buttongroup', 'colorbox', 'progressbar', 'fileuploader', 'contextmenu', 'textarea', 'menu', 'dropdownbutton', 'treeview'],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

treeview?

sortable: [],
lookup: ['validation', 'button', 'loadindicator', 'textbox', 'popup', 'loadpanel', 'scrollview', 'list', 'popover'],
map: [],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import '@js/ui/select_box';
import '@ts/ui/color_box/m_color_view';
import '@js/ui/number_box';
import '@js/ui/menu';

import eventsEngine from '@js/common/core/events/core/events_engine';
import { addNamespace } from '@js/common/core/events/utils/index';
Expand Down Expand Up @@ -451,6 +452,7 @@ if (Quill) {

this._formatHandlers[name](aiDialogOptions);
},
disabled: !dataSource[0].items?.length,
};

return extend(true, {
Expand Down
Loading
Loading