Skip to content

Commit c3df671

Browse files
Form: add default ButtonItems for names 'smart', 'reset', 'submit'
1 parent c1bcb39 commit c3df671

File tree

5 files changed

+777
-10
lines changed

5 files changed

+777
-10
lines changed

packages/devextreme/js/__internal/ui/form/components/button_item.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import type { HorizontalAlignment, VerticalAlignment } from '@js/ui/form';
77
import type Button from '@ts/ui/button/wrapper';
88
import type { TemplatesInfo } from '@ts/ui/form/form.layout_manager';
99

10-
const FIELD_BUTTON_ITEM_CLASS = 'dx-field-button-item';
10+
export const FIELD_BUTTON_ITEM_CLASS = 'dx-field-button-item';
1111

1212
type ButtonItemRenderInfo = TemplatesInfo & {
1313
validationGroup?: string;

packages/devextreme/js/__internal/ui/form/form.layout_manager.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { getCurrentScreenFactor, hasWindow } from '@js/core/utils/window';
2323
import type { EventInfo } from '@js/events';
2424
import type { Properties as ButtonProperties, Properties } from '@js/ui/button';
2525
import type {
26+
ButtonItem,
2627
FieldDataChangedEvent,
2728
FormItemComponent, Item, SimpleItem, TabbedItem,
2829
} from '@js/ui/form';
@@ -684,9 +685,61 @@ class LayoutManager extends Widget<LayoutManagerProperties> {
684685
return result;
685686
}
686687

688+
private _handleSmartPasteClick(): void {
689+
const form = this._getFormOrThis();
690+
// @ts-expect-error
691+
form?.smartPaste();
692+
}
693+
694+
private _handleResetClick(): void {
695+
const form = this._getFormOrThis();
696+
// @ts-expect-error
697+
form?.reset();
698+
}
699+
700+
private _configureDefaultButton(item: ButtonItem): void {
701+
if (!item.name) {
702+
return;
703+
}
704+
705+
const buttonConfigs = {
706+
smartPaste: {
707+
icon: 'sparkle',
708+
text: 'Smart Paste',
709+
type: 'default',
710+
onClick: (): void => {
711+
this._handleSmartPasteClick();
712+
},
713+
},
714+
reset: {
715+
icon: 'refresh',
716+
text: 'Reset',
717+
onClick: (): void => {
718+
this._handleResetClick();
719+
},
720+
},
721+
submit: {
722+
text: 'Submit',
723+
type: 'default',
724+
useSubmitBehavior: true,
725+
},
726+
};
727+
728+
const config = buttonConfigs[item.name];
729+
if (config) {
730+
item.buttonOptions = {
731+
...config,
732+
...item.buttonOptions ?? {},
733+
};
734+
}
735+
}
736+
687737
_renderButtonItem(info: TemplatesInfo): void {
688738
const { item, $parent, rootElementCssClassList } = info;
689739
const { validationGroup } = this.option();
740+
741+
this._configureDefaultButton(item);
742+
690743
const { $rootElement, buttonInstance } = renderButtonItem({
691744
item,
692745
$parent,
@@ -828,6 +881,7 @@ class LayoutManager extends Widget<LayoutManagerProperties> {
828881

829882
_getFormOrThis(): Form | LayoutManager {
830883
const { form } = this.option();
884+
831885
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
832886
return form || this;
833887
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1636,7 +1636,7 @@ class Form extends Widget<FormProperties> {
16361636
}
16371637

16381638
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1639-
reset(editorsData: Record<string, any>): void {
1639+
reset(editorsData?: Record<string, any>): void {
16401640
this.updateRunTimeInfoForEachEditor((editor) => {
16411641
const { name = '' } = editor.option();
16421642
if (editorsData && name in editorsData) {

0 commit comments

Comments
 (0)