@nocobase/flow-engine
Version:
A standalone flow engine for NocoBase, managing workflows, models, and actions.
303 lines (301 loc) • 11.9 kB
JavaScript
/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var moveBlock_exports = {};
__export(moveBlock_exports, {
findModelUidPosition: () => findModelUidPosition,
moveBlock: () => moveBlock,
positionToDirection: () => positionToDirection
});
module.exports = __toCommonJS(moveBlock_exports);
var import_shared = require("@formily/shared");
var import_lodash = __toESM(require("lodash"));
var import_getMousePositionOnElement = require("./getMousePositionOnElement");
const findModelUidPosition = /* @__PURE__ */ __name((uid2, rows) => {
let result = null;
for (const [rowId, columns] of Object.entries(rows)) {
for (let columnIndex = 0; columnIndex < columns.length; columnIndex++) {
const column = columns[columnIndex];
for (let itemIndex = 0; itemIndex < column.length; itemIndex++) {
if (column[itemIndex] === uid2) {
result = { rowId, columnIndex, itemIndex };
}
}
}
}
return result;
}, "findModelUidPosition");
const moveBlock = /* @__PURE__ */ __name(({
sourceUid,
targetUid,
direction,
layoutData
}) => {
var _a;
const { rows, sizes } = layoutData;
const newSizes = import_lodash.default.cloneDeep(sizes);
let newRows = import_lodash.default.cloneDeep(rows);
let sourcePosition = null;
let targetPosition = null;
for (const [rowId, columns] of Object.entries(newRows)) {
for (let columnIndex = 0; columnIndex < columns.length; columnIndex++) {
const column = columns[columnIndex];
for (let itemIndex = 0; itemIndex < column.length; itemIndex++) {
if (column[itemIndex] === sourceUid) {
sourcePosition = { rowId, columnIndex, itemIndex };
}
if (column[itemIndex] === targetUid) {
targetPosition = { rowId, columnIndex, itemIndex };
}
}
}
}
if (!sourcePosition || !targetPosition) {
return layoutData;
}
const removeOldSourceUid = /* @__PURE__ */ __name(() => {
var _a2, _b;
newRows[sourcePosition.rowId][sourcePosition.columnIndex].splice(sourcePosition.itemIndex, 1);
if (newRows[sourcePosition.rowId][sourcePosition.columnIndex].length === 0) {
(_a2 = newRows[sourcePosition.rowId]) == null ? void 0 : _a2.splice(sourcePosition.columnIndex, 1);
(_b = newSizes[sourcePosition.rowId]) == null ? void 0 : _b.splice(sourcePosition.columnIndex, 1);
}
if (newRows[sourcePosition.rowId].length === 0) {
delete newRows[sourcePosition.rowId];
delete newSizes[sourcePosition.rowId];
}
for (const [rowId, columns] of Object.entries(newRows)) {
for (let columnIndex = 0; columnIndex < columns.length; columnIndex++) {
const column = columns[columnIndex];
for (let itemIndex = 0; itemIndex < column.length; itemIndex++) {
if (column[itemIndex] === sourceUid) {
sourcePosition = { rowId, columnIndex, itemIndex };
}
if (column[itemIndex] === targetUid) {
targetPosition = { rowId, columnIndex, itemIndex };
}
}
}
}
}, "removeOldSourceUid");
switch (direction) {
case "insert-row-above": {
if (targetPosition.itemIndex > 0) {
return layoutData;
}
removeOldSourceUid();
const newRowId = (0, import_shared.uid)();
newRows = insertKey({
obj: newRows,
newKey: newRowId,
newValue: [[sourceUid]],
referenceKey: targetPosition.rowId,
position: "before"
});
newSizes[newRowId] = [24];
break;
}
case "insert-row-below": {
const nextRowKey = getNextKey(newRows, targetPosition.rowId);
if (nextRowKey === sourcePosition.rowId && newRows[nextRowKey].length === 1) {
return layoutData;
}
removeOldSourceUid();
const newRowId = (0, import_shared.uid)();
newRows = insertKey({
obj: newRows,
newKey: newRowId,
newValue: [[sourceUid]],
referenceKey: targetPosition.rowId,
position: "after"
});
newSizes[newRowId] = [24];
break;
}
case "insert-same-column-above": {
removeOldSourceUid();
const column = newRows[targetPosition.rowId][targetPosition.columnIndex];
if (column[targetPosition.itemIndex - 1] === sourceUid) {
return layoutData;
}
column.splice(targetPosition.itemIndex, 0, sourceUid);
break;
}
case "insert-same-column-below": {
removeOldSourceUid();
const column = newRows[targetPosition.rowId][targetPosition.columnIndex];
if (column[targetPosition.itemIndex + 1] === sourceUid) {
return layoutData;
}
column.splice(targetPosition.itemIndex + 1, 0, sourceUid);
break;
}
case "insert-column-left": {
removeOldSourceUid();
newRows[targetPosition.rowId].splice(targetPosition.columnIndex, 0, [sourceUid]);
const currentSizes = newSizes[targetPosition.rowId] || [];
const columnCount = newRows[targetPosition.rowId].length || 0;
const newColumnWidth = Math.floor(24 / columnCount);
const remainingWidth = 24 - newColumnWidth;
const totalOldWidth = currentSizes.reduce((sum, size) => sum + size, 0);
const adjustedSizes = currentSizes.map((size) => Math.floor(size / totalOldWidth * remainingWidth));
adjustedSizes.splice(targetPosition.columnIndex, 0, newColumnWidth);
const totalNewWidth = adjustedSizes.reduce((sum, size) => sum + size, 0);
if (totalNewWidth < 24) {
adjustedSizes[adjustedSizes.length - 1] += 24 - totalNewWidth;
}
newSizes[targetPosition.rowId] = adjustedSizes;
break;
}
case "insert-column-right": {
removeOldSourceUid();
newRows[targetPosition.rowId].splice(targetPosition.columnIndex + 1, 0, [sourceUid]);
const currentSizes = newSizes[targetPosition.rowId] || [];
const columnCount = ((_a = newRows[targetPosition.rowId]) == null ? void 0 : _a.length) || 0;
const newColumnWidth = Math.floor(24 / columnCount);
const remainingWidth = 24 - newColumnWidth;
const totalOldWidth = currentSizes.reduce((sum, size) => sum + size, 0);
const adjustedSizes = currentSizes.map((size) => Math.floor(size / totalOldWidth * remainingWidth));
adjustedSizes.splice(targetPosition.columnIndex + 1, 0, newColumnWidth);
const totalNewWidth = adjustedSizes.reduce((sum, size) => sum + size, 0);
if (totalNewWidth < 24) {
adjustedSizes[adjustedSizes.length - 1] += 24 - totalNewWidth;
}
newSizes[targetPosition.rowId] = adjustedSizes;
break;
}
}
return recalculateAllRowSizesWithProportion({ rows: newRows, sizes: newSizes });
}, "moveBlock");
const positionToDirection = /* @__PURE__ */ __name((position) => {
switch (position) {
case import_getMousePositionOnElement.ElementPosition.TOP:
return "insert-same-column-above";
case import_getMousePositionOnElement.ElementPosition.BOTTOM:
return "insert-same-column-below";
case import_getMousePositionOnElement.ElementPosition.LEFT:
return "insert-column-left";
case import_getMousePositionOnElement.ElementPosition.RIGHT:
return "insert-column-right";
case import_getMousePositionOnElement.ElementPosition.TOP_EDGE:
return "insert-row-above";
case import_getMousePositionOnElement.ElementPosition.BOTTOM_EDGE:
return "insert-row-below";
case import_getMousePositionOnElement.ElementPosition.LEFT_EDGE:
return "insert-column-left";
case import_getMousePositionOnElement.ElementPosition.RIGHT_EDGE:
return "insert-column-right";
default:
throw new Error(`Unsupported position: ${position}`);
}
}, "positionToDirection");
function insertKey({
obj,
newKey,
newValue,
referenceKey,
position
}) {
const result = {};
for (const [key, value] of Object.entries(obj)) {
if (position === "before" && key === referenceKey) {
result[newKey] = newValue;
}
result[key] = value;
if (position === "after" && key === referenceKey) {
result[newKey] = newValue;
}
}
return result;
}
__name(insertKey, "insertKey");
function getNextKey(obj, currentKey) {
const keys = Object.keys(obj);
const index = keys.indexOf(currentKey);
return index >= 0 && index < keys.length - 1 ? keys[index + 1] : null;
}
__name(getNextKey, "getNextKey");
function recalculateAllRowSizesWithProportion(layoutData) {
const { rows, sizes } = layoutData;
const newSizes = import_lodash.default.cloneDeep(sizes);
for (const [rowId, columns] of Object.entries(rows)) {
const columnCount = columns.length;
const currentSizes = sizes[rowId] || [];
if (columnCount === 0) {
continue;
}
if (currentSizes.length !== columnCount || currentSizes.every((size) => size === 0)) {
const baseWidth = Math.floor(24 / columnCount);
const remainder = 24 % columnCount;
const newRowSizes = new Array(columnCount).fill(baseWidth);
for (let i = 0; i < remainder; i++) {
newRowSizes[i] += 1;
}
newSizes[rowId] = newRowSizes;
continue;
}
const currentTotal = currentSizes.reduce((sum, size) => sum + size, 0);
if (currentTotal === 0) {
const baseWidth = Math.floor(24 / columnCount);
const remainder = 24 % columnCount;
const newRowSizes = new Array(columnCount).fill(baseWidth);
for (let i = 0; i < remainder; i++) {
newRowSizes[i] += 1;
}
newSizes[rowId] = newRowSizes;
} else {
const newRowSizes = currentSizes.map((size) => Math.floor(size / currentTotal * 24));
const actualTotal = newRowSizes.reduce((sum, size) => sum + size, 0);
const diff = 24 - actualTotal;
for (let i = newRowSizes.length - 1; i >= 0 && diff > 0; i--) {
const add = Math.min(diff, 1);
newRowSizes[i] += add;
}
newSizes[rowId] = newRowSizes;
}
}
return {
rows,
sizes: newSizes
};
}
__name(recalculateAllRowSizesWithProportion, "recalculateAllRowSizesWithProportion");
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
findModelUidPosition,
moveBlock,
positionToDirection
});