ToolJet/frontend/src/AppBuilder/RightSideBar/Inspector/Components/ModalV2.jsx
Nithin David Thomas 7b83acf48a feat: Revamps modal widget to ModalV2 with header and footer (#11963)
* feat: Exposes modal properties as CSAs

* Move CSA's to additional actions

* Adds additional actions and Data Modal.jsx

* Code cleanup

* feat: Exposes modal properties as CSAs

* Move CSA's to additional actions

* Adds additional actions and Data Modal.jsx

* Code cleanup

* Fix: Sets modal position within canvas viewport

* feat: Adds fullscreen size options for modals

* Hides height property if fullscreen

* feat: Adds fullscreen size options for modals

* feat: Adds header and footer for modal #11595

* Fixes canvas width issue for header

* fixes error with csa

* Adds migrations for modal

* Bug fixes for component movement across slots

* Fix resizing of modal trigger

* Set modal on body click

* Prevent modal drop event on modal backdrop

* Fixes canvas getting cut on full screen

* Review fixes

- Reorders inspector
- Removes border
- Moves header/footer height to props from styles
- Close button hover
- fxeditor to same line

* Adds modal as ModalV2

* Fixes widgets going out of modal canvas

* Fixes fullscreen canvas height issues

* Fix changes breaking old modal behaviour

* Review fixes

* Adding memo for header and footer

* Refactors dragEnd on canvas grid

* Delete server/migrations/1734422351569-UpdateModalHeaderTitle.ts

* Fixes edge cases
2025-03-05 17:36:04 +05:30

110 lines
3.1 KiB
JavaScript

import React from 'react';
import Accordion from '@/_ui/Accordion';
import { renderElement } from '../Utils';
import { baseComponentProperties } from './DefaultComponent';
import { resolveReferences } from '@/_helpers/utils';
const INDEX_OF_TRIGGER = 2;
export const ModalV2 = ({ componentMeta, darkMode, ...restProps }) => {
const {
layoutPropertyChanged,
component,
paramUpdated,
dataQueries,
currentState,
eventsChanged,
apps,
allComponents,
} = restProps;
let properties = [];
let additionalActions = [];
let dataProperties = [];
const events = Object.keys(componentMeta.events);
const validations = Object.keys(componentMeta.validation || {});
for (const [key] of Object.entries(componentMeta?.properties)) {
if (componentMeta?.properties[key]?.section === 'additionalActions') {
additionalActions.push(key);
} else if (componentMeta?.properties[key]?.accordian === 'Data') {
dataProperties.push(key);
} else {
properties.push(key);
}
}
const renderCustomElement = (param, paramType = 'properties') => {
return renderElement(component, componentMeta, paramUpdated, dataQueries, param, paramType, currentState);
};
const conditionalAccordionItems = (component) => {
const useDefaultButton = resolveReferences(
component.component.definition.properties.useDefaultButton?.value ?? false
);
const accordionItems = [];
let renderOptions = [];
const options = ['visibility', 'disabledTrigger', 'useDefaultButton'];
options.map((option) => renderOptions.push(renderCustomElement(option)));
const conditionalOptions = [{ name: 'triggerButtonLabel', condition: useDefaultButton }];
conditionalOptions.map(({ name, condition }) => {
if (condition) renderOptions.push(renderCustomElement(name));
});
accordionItems.push({
title: 'Trigger',
children: renderOptions,
});
return accordionItems;
};
if (component.component.definition.properties.size.value === 'fullscreen') {
component.component.properties.modalHeight = {
...component.component.properties.modalHeight,
isHidden: true,
};
}
if (component.component.definition.properties.showHeader.value === '{{false}}') {
component.component.properties.headerHeight = {
...component.component.properties.headerHeight,
isHidden: true,
};
}
if (component.component.definition.properties.showFooter.value === '{{false}}') {
component.component.properties.footerHeight = {
...component.component.properties.footerHeight,
isHidden: true,
};
}
const accordionItems = baseComponentProperties(
dataProperties,
events,
component,
componentMeta,
layoutPropertyChanged,
paramUpdated,
dataQueries,
currentState,
eventsChanged,
apps,
allComponents,
validations,
darkMode,
[],
additionalActions
);
const [optionsItems] = conditionalAccordionItems(component);
// Insert the Trigger option as the third item
accordionItems.splice(INDEX_OF_TRIGGER, 0, optionsItems);
return <Accordion items={accordionItems} />;
};