mirror of
https://github.com/ToolJet/ToolJet
synced 2026-05-06 06:48:21 +00:00
* 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
110 lines
3.1 KiB
JavaScript
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} />;
|
|
};
|