mirror of
https://github.com/ToolJet/ToolJet
synced 2026-05-23 08:58:26 +00:00
update/refactor: new event flow for builder events
This commit is contained in:
parent
683fe331e4
commit
4eb9742d3e
15 changed files with 319 additions and 132 deletions
|
|
@ -67,6 +67,7 @@ import _ from 'lodash';
|
|||
import { EditorContext } from '@/Editor/Context/EditorContextWrapper';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { useCurrentState } from '@/_stores/currentStateStore';
|
||||
import { useAppInfo } from '@/_stores/appDataStore';
|
||||
|
||||
const AllComponents = {
|
||||
Button,
|
||||
|
|
@ -163,6 +164,8 @@ export const Box = function Box({
|
|||
};
|
||||
}
|
||||
|
||||
const { events } = useAppInfo();
|
||||
|
||||
const componentMeta = useMemo(() => {
|
||||
return componentTypes.find((comp) => component.component === comp.component);
|
||||
}, [component]);
|
||||
|
|
@ -258,7 +261,10 @@ export const Box = function Box({
|
|||
if (mode === 'edit' && eventName === 'onClick') {
|
||||
onComponentClick(id, component);
|
||||
}
|
||||
onEvent(eventName, { ...options, customVariables: { ...customResolvables }, component });
|
||||
|
||||
const componentEvents = events.filter((event) => event.sourceId === id);
|
||||
|
||||
onEvent(eventName, componentEvents, { ...options, customVariables: { ...customResolvables } });
|
||||
};
|
||||
const validate = (value) =>
|
||||
validateWidget({
|
||||
|
|
|
|||
|
|
@ -494,7 +494,7 @@ const EditorComponent = (props) => {
|
|||
};
|
||||
|
||||
//! Needs attention
|
||||
const handleEvent = (eventName, options) => onEvent(editorRef, eventName, options, 'edit');
|
||||
const handleEvent = (eventName, event, options) => onEvent(editorRef, eventName, event, options, 'edit');
|
||||
|
||||
const handleRunQuery = (queryId, queryName) => runQuery(editorRef, queryId, queryName);
|
||||
|
||||
|
|
@ -649,6 +649,7 @@ const EditorComponent = (props) => {
|
|||
userId: data?.user_id,
|
||||
appId: data?.id,
|
||||
events: data.events,
|
||||
currentVersionId: data?.editing_version?.id,
|
||||
});
|
||||
|
||||
await fetchDataSources(data.editing_version?.id);
|
||||
|
|
|
|||
|
|
@ -98,8 +98,9 @@ export const baseComponentProperties = (
|
|||
isOpen: true,
|
||||
children: (
|
||||
<EventManager
|
||||
component={component}
|
||||
componentMeta={componentMeta}
|
||||
sourceId={component?.id}
|
||||
eventSourceType="component"
|
||||
eventMetaDefinition={componentMeta}
|
||||
currentState={currentState}
|
||||
dataQueries={dataQueries}
|
||||
components={allComponents}
|
||||
|
|
|
|||
|
|
@ -94,8 +94,9 @@ export const baseComponentProperties = (
|
|||
isOpen: true,
|
||||
children: (
|
||||
<EventManager
|
||||
component={component}
|
||||
componentMeta={componentMeta}
|
||||
sourceId={component?.id}
|
||||
eventSourceType="component"
|
||||
eventMetaDefinition={componentMeta}
|
||||
currentState={currentState}
|
||||
dataQueries={dataQueries}
|
||||
components={allComponents}
|
||||
|
|
|
|||
|
|
@ -139,8 +139,9 @@ export function Icon({ componentMeta, darkMode, ...restProps }) {
|
|||
isOpen: false,
|
||||
children: (
|
||||
<EventManager
|
||||
component={component}
|
||||
componentMeta={componentMeta}
|
||||
sourceId={component?.id}
|
||||
eventSourceType="component"
|
||||
eventMetaDefinition={componentMeta}
|
||||
currentState={currentState}
|
||||
dataQueries={dataQueries}
|
||||
components={allComponents}
|
||||
|
|
|
|||
|
|
@ -430,6 +430,7 @@ class TableComponent extends React.Component {
|
|||
/>
|
||||
</div>
|
||||
<EventManager
|
||||
//!have to check
|
||||
component={{
|
||||
component: {
|
||||
definition: {
|
||||
|
|
@ -437,8 +438,10 @@ class TableComponent extends React.Component {
|
|||
},
|
||||
},
|
||||
}}
|
||||
sourceId={this.props?.component?.id}
|
||||
eventSourceType="component"
|
||||
hideEmptyEventsAlert={true}
|
||||
componentMeta={{ events: { onChange: { displayName: 'On change' } } }}
|
||||
eventMetaDefinition={{ events: { onChange: { displayName: 'On change' } } }}
|
||||
currentState={this.props.currentState}
|
||||
dataQueries={this.props.dataQueries}
|
||||
components={this.props.components}
|
||||
|
|
@ -796,8 +799,11 @@ class TableComponent extends React.Component {
|
|||
paramType="properties"
|
||||
/>
|
||||
<EventManager
|
||||
//!have to check
|
||||
component={dummyComponentForActionButton}
|
||||
componentMeta={{ events: { onClick: { displayName: 'On click' } } }}
|
||||
sourceId={this.props?.component?.id}
|
||||
eventSourceType="component"
|
||||
eventMetaDefinition={{ events: { onClick: { displayName: 'On click' } } }}
|
||||
currentState={this.state.currentState}
|
||||
dataQueries={this.props.dataQueries}
|
||||
components={this.props.components}
|
||||
|
|
@ -1143,8 +1149,11 @@ class TableComponent extends React.Component {
|
|||
isOpen: true,
|
||||
children: (
|
||||
<EventManager
|
||||
//!have to check
|
||||
component={component}
|
||||
componentMeta={componentMeta}
|
||||
sourceId={this.props?.component?.id}
|
||||
eventSourceType="component"
|
||||
eventMetaDefinition={componentMeta}
|
||||
currentState={currentState}
|
||||
dataQueries={dataQueries}
|
||||
components={components}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import React, { useState, useEffect } from 'react';
|
||||
import React, { useState, useEffect, useMemo } from 'react';
|
||||
import { ActionTypes } from '../ActionTypes';
|
||||
import OverlayTrigger from 'react-bootstrap/OverlayTrigger';
|
||||
import Popover from 'react-bootstrap/Popover';
|
||||
|
|
@ -18,13 +18,16 @@ import AddRectangle from '@/_ui/Icon/bulkIcons/AddRectangle';
|
|||
import { Tooltip } from 'react-tooltip';
|
||||
import { ButtonSolid } from '@/_ui/AppButton/AppButton';
|
||||
import RunjsParameters from './ActionConfigurationPanels/RunjsParamters';
|
||||
import { useAppInfo } from '@/_stores/appDataStore';
|
||||
import { useAppDataActions, useAppInfo } from '@/_stores/appDataStore';
|
||||
import { isQueryRunnable } from '@/_helpers/utils';
|
||||
import { shallow } from 'zustand/shallow';
|
||||
// eslint-disable-next-line import/no-unresolved
|
||||
import { diff } from 'deep-object-diff';
|
||||
|
||||
export const EventManager = ({
|
||||
component,
|
||||
componentMeta,
|
||||
sourceId,
|
||||
eventSourceType,
|
||||
eventMetaDefinition,
|
||||
components,
|
||||
eventsChanged,
|
||||
excludeEvents,
|
||||
|
|
@ -41,15 +44,25 @@ export const EventManager = ({
|
|||
}
|
||||
return dataQueries;
|
||||
}, shallow);
|
||||
const { apps, appId } = useAppInfo();
|
||||
const { apps, appId, events: allAppEvents } = useAppInfo();
|
||||
|
||||
const [events, setEvents] = useState(() => component.component.definition.events || []);
|
||||
const { updateAppVersionEventHandlers, createAppVersionEventHandlers, deleteAppVersionEventHandler } =
|
||||
useAppDataActions();
|
||||
|
||||
const currentEvents = allAppEvents.filter((event) => event.sourceId === sourceId);
|
||||
console.log('----arpit currentEvents ', { currentEvents });
|
||||
|
||||
const [events, setEvents] = useState([]);
|
||||
const [focusedEventIndex, setFocusedEventIndex] = useState(null);
|
||||
const { t } = useTranslation();
|
||||
|
||||
useEffect(() => {
|
||||
setEvents(component.component.definition.events || []);
|
||||
}, [component?.component?.definition?.events]);
|
||||
console.log('----arpit current events changed ', { currentEvents, events });
|
||||
if (_.isEqual(currentEvents, events)) return;
|
||||
|
||||
setEvents(currentEvents || []);
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [JSON.stringify(currentEvents)]);
|
||||
|
||||
let actionOptions = ActionTypes.map((action) => {
|
||||
return { name: action.name, value: action.id };
|
||||
|
|
@ -102,11 +115,11 @@ export const EventManager = ({
|
|||
excludeEvents = excludeEvents || [];
|
||||
|
||||
/* Filter events based on excludesEvents ( a list of event ids to exclude ) */
|
||||
let possibleEvents = Object.keys(componentMeta.events)
|
||||
let possibleEvents = Object.keys(eventMetaDefinition.events)
|
||||
.filter((eventId) => !excludeEvents.includes(eventId))
|
||||
.map((eventId) => {
|
||||
return {
|
||||
name: componentMeta.events[eventId].displayName,
|
||||
name: eventMetaDefinition?.events[eventId]?.displayName,
|
||||
value: eventId,
|
||||
};
|
||||
});
|
||||
|
|
@ -153,7 +166,7 @@ export const EventManager = ({
|
|||
const actions = targetComponentMeta.actions;
|
||||
|
||||
const options = actions.map((action) => ({
|
||||
name: action.displayName,
|
||||
name: action?.displayName,
|
||||
value: action.handle,
|
||||
}));
|
||||
|
||||
|
|
@ -202,36 +215,53 @@ export const EventManager = ({
|
|||
}
|
||||
|
||||
function handlerChanged(index, param, value) {
|
||||
let newEvents = [...events];
|
||||
let newEvents = _.cloneDeep(events);
|
||||
|
||||
let updatedEvent = newEvents[index];
|
||||
updatedEvent[param] = value;
|
||||
updatedEvent.event[param] = value;
|
||||
|
||||
newEvents[index] = updatedEvent;
|
||||
|
||||
const diffPatches = diff(currentEvents[index], updatedEvent);
|
||||
const isDeepEqual = _.isEqual(currentEvents[index], updatedEvent);
|
||||
setEvents(newEvents);
|
||||
eventsChanged(newEvents);
|
||||
|
||||
console.log('----moh handler changed-arpit ', { diffPatches, isDeepEqual });
|
||||
|
||||
updateAppVersionEventHandlers(
|
||||
[
|
||||
{
|
||||
event_id: updatedEvent.id,
|
||||
diff: diffPatches,
|
||||
},
|
||||
],
|
||||
'update'
|
||||
);
|
||||
}
|
||||
|
||||
function removeHandler(index) {
|
||||
let newEvents = component.component.definition.events;
|
||||
newEvents.splice(index, 1);
|
||||
setEvents(newEvents);
|
||||
eventsChanged(newEvents);
|
||||
const eventsHandler = _.cloneDeep(events);
|
||||
|
||||
const eventId = eventsHandler[index].id;
|
||||
|
||||
deleteAppVersionEventHandler(eventId);
|
||||
}
|
||||
|
||||
function addHandler() {
|
||||
let newEvents = component.component.definition.events;
|
||||
let newEvents = events;
|
||||
const eventIndex = newEvents.length;
|
||||
newEvents.push({
|
||||
eventId: Object.keys(componentMeta.events)[0],
|
||||
actionId: 'show-alert',
|
||||
message: 'Hello world!',
|
||||
alertType: 'info',
|
||||
eventIndex: eventIndex,
|
||||
|
||||
createAppVersionEventHandlers({
|
||||
event: {
|
||||
eventId: Object.keys(eventMetaDefinition?.events)[0],
|
||||
actionId: 'show-alert',
|
||||
message: 'Hello world!',
|
||||
alertType: 'info',
|
||||
eventIndex: eventIndex,
|
||||
},
|
||||
eventType: eventSourceType,
|
||||
attachedTo: sourceId,
|
||||
});
|
||||
setEvents(newEvents);
|
||||
eventsChanged(newEvents, false, true);
|
||||
}
|
||||
|
||||
//following two are functions responsible for on change and value for the control specific actions
|
||||
|
|
@ -722,8 +752,8 @@ export const EventManager = ({
|
|||
event?.componentSpecificActionHandle &&
|
||||
(getAction(event?.componentId, event?.componentSpecificActionHandle).params ?? []).map((param) => (
|
||||
<div className="row mt-2" key={param.handle}>
|
||||
<div className="col-3 p-1" data-cy={`action-options-${param.displayName}-field-label`}>
|
||||
{param.displayName}
|
||||
<div className="col-3 p-1" data-cy={`action-options-${param?.displayName}-field-label`}>
|
||||
{param?.displayName}
|
||||
</div>
|
||||
{param.type === 'select' ? (
|
||||
<div className="col-9" data-cy="action-options-action-selection-field">
|
||||
|
|
@ -758,7 +788,7 @@ export const EventManager = ({
|
|||
enablePreview={true}
|
||||
type={param?.type}
|
||||
fieldMeta={{ options: param?.options }}
|
||||
cyLabel={param.displayName}
|
||||
cyLabel={param?.displayName}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
|
@ -784,7 +814,7 @@ export const EventManager = ({
|
|||
}
|
||||
|
||||
const reorderEvents = (startIndex, endIndex) => {
|
||||
const result = [...component.component.definition.events];
|
||||
const result = _.cloneDeep(events);
|
||||
const [removed] = result.splice(startIndex, 1);
|
||||
result.splice(endIndex, 0, removed);
|
||||
setEvents(result);
|
||||
|
|
@ -812,7 +842,8 @@ export const EventManager = ({
|
|||
{({ innerRef, droppableProps, placeholder }) => (
|
||||
<div {...droppableProps} ref={innerRef}>
|
||||
{events.map((event, index) => {
|
||||
const actionMeta = ActionTypes.find((action) => action.id === event.actionId);
|
||||
const actionMeta = ActionTypes.find((action) => action.id === event.event.actionId);
|
||||
|
||||
const rowClassName = `card-body p-0 ${focusedEventIndex === index ? ' bg-azure-lt' : ''}`;
|
||||
return (
|
||||
<Draggable key={index} draggableId={`${event.eventId}-${index}`} index={index}>
|
||||
|
|
@ -826,7 +857,7 @@ export const EventManager = ({
|
|||
trigger="click"
|
||||
placement={popoverPlacement || 'left'}
|
||||
rootClose={true}
|
||||
overlay={eventPopover(event, index)}
|
||||
overlay={eventPopover(event.event, index)}
|
||||
onHide={() => setFocusedEventIndex(null)}
|
||||
onToggle={(showing) => {
|
||||
if (showing) {
|
||||
|
|
@ -888,7 +919,7 @@ export const EventManager = ({
|
|||
</svg>
|
||||
</div>
|
||||
<div className="col text-truncate" data-cy="event-handler">
|
||||
{componentMeta.events[event.eventId]['displayName']}
|
||||
{eventMetaDefinition?.events[event.event.eventId]?.displayName}
|
||||
</div>
|
||||
<div className="col text-truncate color-slate11" data-cy="event-name">
|
||||
<small className="event-action font-weight-light text-truncate">
|
||||
|
|
@ -956,7 +987,7 @@ export const EventManager = ({
|
|||
);
|
||||
};
|
||||
|
||||
const componentName = componentMeta.name ? componentMeta.name : 'query';
|
||||
const componentName = eventMetaDefinition?.name ? eventMetaDefinition.name : 'query';
|
||||
|
||||
if (events.length === 0) {
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -196,49 +196,49 @@ export const Inspector = ({
|
|||
}
|
||||
}
|
||||
|
||||
function eventUpdated(event, actionId) {
|
||||
let newDefinition = JSON.parse(JSON.stringify(component.component.definition));
|
||||
newDefinition.events[event.name] = { actionId };
|
||||
// function eventUpdated(event, actionId) {
|
||||
// let newDefinition = JSON.parse(JSON.stringify(component.component.definition));
|
||||
// newDefinition.events[event.name] = { actionId };
|
||||
|
||||
let newComponent = {
|
||||
...component,
|
||||
};
|
||||
// let newComponent = {
|
||||
// ...component,
|
||||
// };
|
||||
|
||||
componentDefinitionChanged(newComponent, { eventUpdated: true });
|
||||
}
|
||||
// // componentDefinitionChanged(newComponent, { eventUpdated: true });
|
||||
// }
|
||||
|
||||
function eventsChanged(newEvents, isReordered = false, isNew = false) {
|
||||
let newComponent = JSON.parse(JSON.stringify(component));
|
||||
let newDefinition = JSON.parse(JSON.stringify(newComponent.component.definition));
|
||||
// function eventsChanged(newEvents, isReordered = false, isNew = false) {
|
||||
// let newComponent = JSON.parse(JSON.stringify(component));
|
||||
// let newDefinition = JSON.parse(JSON.stringify(newComponent.component.definition));
|
||||
|
||||
newDefinition.events = newEvents;
|
||||
// newDefinition.events = newEvents;
|
||||
|
||||
newComponent.component.definition = newDefinition;
|
||||
// newComponent.component.definition = newDefinition;
|
||||
|
||||
const opts = {
|
||||
componentsEventsChanged: true,
|
||||
};
|
||||
// // const opts = {
|
||||
// // componentsEventsChanged: true,
|
||||
// // };
|
||||
|
||||
if (isReordered) opts.eventsReOrdered = true;
|
||||
if (isNew) opts.newEvent = true;
|
||||
// // if (isReordered) opts.eventsReOrdered = true;
|
||||
// // if (isNew) opts.newEvent = true;
|
||||
|
||||
componentDefinitionChanged(newComponent, opts);
|
||||
}
|
||||
// // componentDefinitionChanged(newComponent, opts);
|
||||
// }
|
||||
|
||||
function eventOptionUpdated(event, option, value) {
|
||||
console.log('eventOptionUpdated', event, option, value);
|
||||
// function eventOptionUpdated(event, option, value) {
|
||||
// console.log('eventOptionUpdated--moh', event, option, value);
|
||||
|
||||
let newDefinition = JSON.parse(JSON.stringify(component.component.definition));
|
||||
let eventDefinition = newDefinition.events[event.name] || { options: {} };
|
||||
// let newDefinition = JSON.parse(JSON.stringify(component.component.definition));
|
||||
// let eventDefinition = newDefinition.events[event.name] || { options: {} };
|
||||
|
||||
newDefinition.events[event.name] = { ...eventDefinition, options: { ...eventDefinition.options, [option]: value } };
|
||||
// newDefinition.events[event.name] = { ...eventDefinition, options: { ...eventDefinition.options, [option]: value } };
|
||||
|
||||
let newComponent = {
|
||||
...component,
|
||||
};
|
||||
// let newComponent = {
|
||||
// ...component,
|
||||
// };
|
||||
|
||||
componentDefinitionChanged(newComponent, { eventOptionUpdated: true });
|
||||
}
|
||||
// componentDefinitionChanged(newComponent, { eventOptionUpdated: true });
|
||||
// }
|
||||
|
||||
const buildGeneralStyle = () => {
|
||||
const items = [];
|
||||
|
|
@ -273,12 +273,12 @@ export const Inspector = ({
|
|||
paramUpdated={paramUpdated}
|
||||
dataQueries={dataQueries}
|
||||
componentMeta={componentMeta}
|
||||
eventUpdated={eventUpdated}
|
||||
eventOptionUpdated={eventOptionUpdated}
|
||||
// eventUpdated={eventUpdated}
|
||||
// eventOptionUpdated={eventOptionUpdated}
|
||||
components={allComponents}
|
||||
currentState={currentState}
|
||||
darkMode={darkMode}
|
||||
eventsChanged={eventsChanged}
|
||||
// eventsChanged={eventsChanged}
|
||||
pages={pages}
|
||||
allComponents={allComponents}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ export const SettingsModal = ({
|
|||
<Modal.Body onClick={() => pinPagesPopover(true)}>
|
||||
<b data-cy={'page-events-labe'}>Events</b>
|
||||
<EventManager
|
||||
//!page
|
||||
component={{
|
||||
component: {
|
||||
definition: {
|
||||
|
|
@ -62,7 +63,9 @@ export const SettingsModal = ({
|
|||
},
|
||||
},
|
||||
}}
|
||||
componentMeta={{ events: { onPageLoad: { displayName: 'On page load' } }, name: 'page' }}
|
||||
sourceId={page?.id}
|
||||
eventSourceType="page"
|
||||
eventMetaDefinition={{ events: { onPageLoad: { displayName: 'On page load' } }, name: 'page' }}
|
||||
components={components}
|
||||
apps={apps}
|
||||
pages={allpages}
|
||||
|
|
|
|||
|
|
@ -186,9 +186,12 @@ export const QueryManagerBody = ({
|
|||
<div className={`form-label`}>{t('editor.queryManager.eventsHandler', 'Events')}</div>
|
||||
<div className="query-manager-events pb-4 flex-grow-1">
|
||||
<EventManager
|
||||
//!Query events
|
||||
eventsChanged={eventsChanged}
|
||||
component={queryComponent.component}
|
||||
componentMeta={queryComponent.componentMeta}
|
||||
sourceId={selectedQuery?.id}
|
||||
eventSourceType="data_query"
|
||||
eventMetaDefinition={queryComponent.componentMeta}
|
||||
currentState={currentState}
|
||||
components={allComponents}
|
||||
callerQueryId={selectedQueryId}
|
||||
|
|
|
|||
|
|
@ -314,12 +314,11 @@ export async function runTransformation(
|
|||
}
|
||||
}
|
||||
|
||||
export async function executeActionsForEventId(_ref, eventId, component, mode, customVariables) {
|
||||
const events = component?.definition?.events || [];
|
||||
const filteredEvents = events.filter((event) => event.eventId === eventId);
|
||||
export async function executeActionsForEventId(_ref, eventId, events = [], mode, customVariables) {
|
||||
const filteredEvents = events.filter((event) => event?.event.eventId === eventId);
|
||||
|
||||
for (const event of filteredEvents) {
|
||||
await executeAction(_ref, event, mode, customVariables); // skipcq: JS-0032
|
||||
await executeAction(_ref, event.event, mode, customVariables); // skipcq: JS-0032
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -584,12 +583,12 @@ function executeActionWithDebounce(_ref, event, mode, customVariables) {
|
|||
}
|
||||
}
|
||||
|
||||
export async function onEvent(_ref, eventName, options, mode = 'edit') {
|
||||
export async function onEvent(_ref, eventName, events, options = {}, mode = 'edit') {
|
||||
let _self = _ref;
|
||||
|
||||
const { customVariables } = options;
|
||||
if (eventName === 'onPageLoad') {
|
||||
await executeActionsForEventId(_ref, 'onPageLoad', { definition: { events: [options] } }, mode, customVariables);
|
||||
await executeActionsForEventId(_ref, 'onPageLoad', events, mode, customVariables);
|
||||
}
|
||||
|
||||
if (eventName === 'onTrigger') {
|
||||
|
|
@ -616,7 +615,7 @@ export async function onEvent(_ref, eventName, options, mode = 'edit') {
|
|||
},
|
||||
},
|
||||
});
|
||||
executeActionsForEventId(_ref, 'onCalendarEventSelect', component, mode, customVariables);
|
||||
executeActionsForEventId(_ref, 'onCalendarEventSelect', events, mode, customVariables);
|
||||
}
|
||||
|
||||
if (eventName === 'onCalendarSlotSelect') {
|
||||
|
|
@ -630,7 +629,7 @@ export async function onEvent(_ref, eventName, options, mode = 'edit') {
|
|||
},
|
||||
},
|
||||
});
|
||||
executeActionsForEventId(_ref, 'onCalendarSlotSelect', component, mode, customVariables);
|
||||
executeActionsForEventId(_ref, 'onCalendarSlotSelect', events, mode, customVariables);
|
||||
}
|
||||
|
||||
if (eventName === 'onTableActionButtonClicked') {
|
||||
|
|
@ -734,18 +733,15 @@ export async function onEvent(_ref, eventName, options, mode = 'edit') {
|
|||
'onNewRowsAdded',
|
||||
].includes(eventName)
|
||||
) {
|
||||
const { component } = options;
|
||||
executeActionsForEventId(_ref, eventName, component, mode, customVariables);
|
||||
executeActionsForEventId(_ref, eventName, events, mode, customVariables);
|
||||
}
|
||||
|
||||
if (eventName === 'onBulkUpdate') {
|
||||
onComponentOptionChanged(options.component, 'isSavingChanges', true);
|
||||
await executeActionsForEventId(_self, eventName, options.component, mode, customVariables);
|
||||
onComponentOptionChanged(options.component, 'isSavingChanges', false);
|
||||
await executeActionsForEventId(_self, eventName, events, mode, customVariables);
|
||||
}
|
||||
|
||||
if (['onDataQuerySuccess', 'onDataQueryFailure'].includes(eventName)) {
|
||||
await executeActionsForEventId(_self, eventName, options, mode, customVariables);
|
||||
await executeActionsForEventId(_self, eventName, events, mode, customVariables);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1007,9 +1003,7 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode =
|
|||
},
|
||||
});
|
||||
resolve(data);
|
||||
onEvent(_self, 'onDataQueryFailure', {
|
||||
definition: { events: dataQuery.options.events },
|
||||
});
|
||||
onEvent(_self, 'onDataQueryFailure', dataQuery.options.events);
|
||||
if (mode !== 'view') {
|
||||
const err = query.kind == 'tooljetdb' ? data?.error || data : _.isEmpty(data.data) ? data : data.data;
|
||||
toast.error(err?.message);
|
||||
|
|
@ -1047,9 +1041,7 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode =
|
|||
},
|
||||
});
|
||||
resolve(finalData);
|
||||
onEvent(_self, 'onDataQueryFailure', {
|
||||
definition: { events: dataQuery.options.events },
|
||||
});
|
||||
onEvent(_self, 'onDataQueryFailure', dataQuery.options.events);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -1088,7 +1080,7 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode =
|
|||
},
|
||||
});
|
||||
resolve({ status: 'ok', data: finalData });
|
||||
onEvent(_self, 'onDataQuerySuccess', { definition: { events: dataQuery.options.events } }, mode);
|
||||
onEvent(_self, 'onDataQuerySuccess', dataQuery.options.events, mode);
|
||||
}
|
||||
})
|
||||
.catch(({ error }) => {
|
||||
|
|
|
|||
|
|
@ -8,6 +8,9 @@ export const appVersionService = {
|
|||
del,
|
||||
save,
|
||||
autoSaveApp,
|
||||
saveAppVersionEventHandlers,
|
||||
createAppVersionEventHandler,
|
||||
deleteAppVersionEventHandler,
|
||||
};
|
||||
|
||||
function getAll(appId) {
|
||||
|
|
@ -99,3 +102,42 @@ function autoSaveApp(appId, versionId, diff, type, pageId, operation, isUserSwit
|
|||
|
||||
return fetch(url, requestOptions).then(handleResponse);
|
||||
}
|
||||
|
||||
function saveAppVersionEventHandlers(appId, versionId, events) {
|
||||
const body = {
|
||||
events,
|
||||
};
|
||||
|
||||
const requestOptions = {
|
||||
method: 'PUT',
|
||||
headers: authHeader(),
|
||||
credentials: 'include',
|
||||
body: JSON.stringify(body),
|
||||
};
|
||||
return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/events`, requestOptions).then(handleResponse);
|
||||
}
|
||||
|
||||
function createAppVersionEventHandler(appId, versionId, event) {
|
||||
const body = {
|
||||
event,
|
||||
};
|
||||
|
||||
const requestOptions = {
|
||||
method: 'POST',
|
||||
headers: authHeader(),
|
||||
credentials: 'include',
|
||||
body: JSON.stringify(body),
|
||||
};
|
||||
return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/events`, requestOptions).then(handleResponse);
|
||||
}
|
||||
|
||||
function deleteAppVersionEventHandler(appId, versionId, eventId) {
|
||||
const requestOptions = {
|
||||
method: 'DELETE',
|
||||
headers: authHeader(),
|
||||
credentials: 'include',
|
||||
};
|
||||
return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/events/${eventId}`, requestOptions).then(
|
||||
handleResponse
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ const initialState = {
|
|||
|
||||
export const useAppDataStore = create(
|
||||
zustandDevTools(
|
||||
(set) => ({
|
||||
(set, get) => ({
|
||||
...initialState,
|
||||
actions: {
|
||||
updateEditingVersion: (version) => set(() => ({ editingVersion: version })),
|
||||
|
|
@ -44,6 +44,54 @@ export const useAppDataStore = create(
|
|||
isUserSwitchedVersion
|
||||
);
|
||||
},
|
||||
updateAppVersionEventHandlers: async (events) => {
|
||||
const appId = get().appId;
|
||||
const versionId = get().currentVersionId;
|
||||
|
||||
const response = await appVersionService.saveAppVersionEventHandlers(appId, versionId, events);
|
||||
|
||||
const updatedEvents = get().events;
|
||||
|
||||
updatedEvents.forEach((e, index) => {
|
||||
if (e.id === response[index].id) {
|
||||
updatedEvents[index] = response[index];
|
||||
}
|
||||
});
|
||||
|
||||
console.log('----arpit should update events store', { updatedEvents, response });
|
||||
|
||||
set(() => ({ events: updatedEvents }));
|
||||
},
|
||||
|
||||
createAppVersionEventHandlers: async (event) => {
|
||||
const appId = get().appId;
|
||||
const versionId = get().currentVersionId;
|
||||
|
||||
const updatedEvents = get().events;
|
||||
const response = await appVersionService.createAppVersionEventHandler(appId, versionId, event);
|
||||
updatedEvents.push(response);
|
||||
|
||||
set(() => ({ events: updatedEvents }));
|
||||
},
|
||||
|
||||
deleteAppVersionEventHandler: async (eventId) => {
|
||||
const appId = get().appId;
|
||||
const versionId = get().currentVersionId;
|
||||
|
||||
const updatedEvents = get().events;
|
||||
|
||||
const response = await appVersionService.deleteAppVersionEventHandler(appId, versionId, eventId);
|
||||
|
||||
if (response?.affected === 1) {
|
||||
updatedEvents.splice(
|
||||
updatedEvents.findIndex((e) => e.id === eventId),
|
||||
1
|
||||
);
|
||||
|
||||
set(() => ({ events: updatedEvents }));
|
||||
}
|
||||
},
|
||||
|
||||
setIsSaving: (isSaving) => set(() => ({ isSaving })),
|
||||
setAppId: (appId) => set(() => ({ appId })),
|
||||
},
|
||||
|
|
@ -58,3 +106,9 @@ export const useUpdateEditingVersion = () => useAppDataStore((state) => state.ac
|
|||
export const useCurrentUser = () => useAppDataStore((state) => state.currentUser);
|
||||
export const useAppInfo = () => useAppDataStore((state) => state);
|
||||
export const useAppDataActions = () => useAppDataStore((state) => state.actions);
|
||||
|
||||
// if (operation === 'delete') {
|
||||
// const response = await appVersionService.deleteAppVersionEventHandler(appId, versionId, eventId);
|
||||
// const updatedEvents = get().events.filter((e) => e.id !== response.id);
|
||||
// set(() => ({ events: updatedEvents }));
|
||||
// }
|
||||
|
|
|
|||
|
|
@ -327,7 +327,9 @@ export class AppsControllerV2 {
|
|||
throw new ForbiddenException('You do not have permissions to perform this action');
|
||||
}
|
||||
|
||||
return this.eventService.createEvent(body, versionId);
|
||||
const { event } = body;
|
||||
|
||||
return this.eventService.createEvent(event, versionId);
|
||||
}
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@UseInterceptors(ValidAppInterceptor)
|
||||
|
|
@ -345,8 +347,25 @@ export class AppsControllerV2 {
|
|||
throw new ForbiddenException('You do not have permissions to perform this action');
|
||||
}
|
||||
|
||||
console.log('-----arpit update events', { body });
|
||||
return await this.eventService.updateEvent(body?.events);
|
||||
}
|
||||
|
||||
// return await this.eventService.updateEvent(body, versionId);
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@UseInterceptors(ValidAppInterceptor)
|
||||
@Delete(':id/versions/:versionId/events/:eventId')
|
||||
async deleteEvents(@User() user, @Param('id') id, @Param('versionId') versionId, @Param('eventId') eventId) {
|
||||
const version = await this.appsService.findVersion(versionId);
|
||||
const app = version.app;
|
||||
|
||||
if (app.id !== id) {
|
||||
throw new BadRequestException();
|
||||
}
|
||||
const ability = await this.appsAbilityFactory.appsActions(user, id);
|
||||
|
||||
if (!ability.can('updateVersions', app)) {
|
||||
throw new ForbiddenException('You do not have permissions to perform this action');
|
||||
}
|
||||
|
||||
return await this.eventService.deleteEvent(eventId);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { BadRequestException, Injectable } from '@nestjs/common';
|
||||
import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { EntityManager, Repository } from 'typeorm';
|
||||
import { Component } from 'src/entities/component.entity';
|
||||
|
|
@ -42,46 +42,70 @@ export class EventsService {
|
|||
});
|
||||
}
|
||||
|
||||
async createEvent(options, versionId) {
|
||||
if (Object.keys(options).length === 0) {
|
||||
async createEvent(eventObj, versionId) {
|
||||
if (Object.keys(eventObj).length === 0) {
|
||||
return new BadRequestException('No event found');
|
||||
}
|
||||
|
||||
const newEvent = {
|
||||
name: options.event.eventId,
|
||||
sourceId: options.attachedTo,
|
||||
target: options.eventType,
|
||||
event: options.event,
|
||||
name: eventObj.event.eventId,
|
||||
sourceId: eventObj.attachedTo,
|
||||
target: eventObj.eventType,
|
||||
event: eventObj.event,
|
||||
appVersionId: versionId,
|
||||
};
|
||||
|
||||
console.log('---arpit || create events', { newEvent });
|
||||
|
||||
return await dbTransactionWrap(async (manager: EntityManager) => {
|
||||
const event = await manager.save(EventHandler, newEvent);
|
||||
return event;
|
||||
});
|
||||
}
|
||||
|
||||
async updateEvent(options = [], versionId: string) {
|
||||
const eventHandlers = [];
|
||||
async updateEvent(events: []) {
|
||||
return await dbTransactionWrap(async (manager: EntityManager) => {
|
||||
return await Promise.all(
|
||||
events.map(async (event) => {
|
||||
const { event_id, diff } = event as any;
|
||||
|
||||
options.forEach((option) => {
|
||||
eventHandlers.push({
|
||||
event: option.event,
|
||||
name: option.event.eventId,
|
||||
sourceId: option.attachedTo,
|
||||
target: option.eventType,
|
||||
});
|
||||
const eventDiff = diff?.event;
|
||||
const eventToUpdate = await manager.findOne(EventHandler, {
|
||||
where: { id: event_id },
|
||||
});
|
||||
|
||||
if (!eventToUpdate) {
|
||||
return new BadRequestException('No event found');
|
||||
}
|
||||
|
||||
const updatedEvent = {
|
||||
...eventToUpdate,
|
||||
event: {
|
||||
...eventToUpdate.event,
|
||||
...eventDiff,
|
||||
},
|
||||
};
|
||||
|
||||
return await manager.save(EventHandler, updatedEvent);
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
console.log('---arpit || createOrUpdateEvent', { eventHandlers });
|
||||
|
||||
return {
|
||||
status: 'success',
|
||||
data: eventHandlers,
|
||||
};
|
||||
}
|
||||
|
||||
// utitlity functions
|
||||
async deleteEvent(eventId: string) {
|
||||
return await dbTransactionWrap(async (manager: EntityManager) => {
|
||||
const event = await manager.findOne(EventHandler, {
|
||||
where: { id: eventId },
|
||||
});
|
||||
|
||||
if (!event) {
|
||||
return new BadRequestException('No event found');
|
||||
}
|
||||
|
||||
const deleteResponse = await manager.delete(EventHandler, event.id);
|
||||
|
||||
if (!deleteResponse?.affected) {
|
||||
throw new NotFoundException();
|
||||
}
|
||||
return deleteResponse;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue