|
|
|
@ -32,11 +32,12 @@ const populateElements = (
|
|
|
|
|
x?: number;
|
|
|
|
|
width?: number;
|
|
|
|
|
height?: number;
|
|
|
|
|
containerId?: string;
|
|
|
|
|
}[],
|
|
|
|
|
) => {
|
|
|
|
|
const selectedElementIds: any = {};
|
|
|
|
|
|
|
|
|
|
h.elements = elements.map(
|
|
|
|
|
const newElements = elements.map(
|
|
|
|
|
({
|
|
|
|
|
id,
|
|
|
|
|
isDeleted = false,
|
|
|
|
@ -46,9 +47,10 @@ const populateElements = (
|
|
|
|
|
x = 100,
|
|
|
|
|
width = 100,
|
|
|
|
|
height = 100,
|
|
|
|
|
containerId = null,
|
|
|
|
|
}) => {
|
|
|
|
|
const element = API.createElement({
|
|
|
|
|
type: "rectangle",
|
|
|
|
|
type: containerId ? "text" : "rectangle",
|
|
|
|
|
id,
|
|
|
|
|
isDeleted,
|
|
|
|
|
x,
|
|
|
|
@ -56,6 +58,7 @@ const populateElements = (
|
|
|
|
|
width,
|
|
|
|
|
height,
|
|
|
|
|
groupIds,
|
|
|
|
|
containerId,
|
|
|
|
|
});
|
|
|
|
|
if (isSelected) {
|
|
|
|
|
selectedElementIds[element.id] = true;
|
|
|
|
@ -64,6 +67,22 @@ const populateElements = (
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// initialize `boundElements` on containers, if applicable
|
|
|
|
|
h.elements = newElements.map((element, index, elements) => {
|
|
|
|
|
const nextElement = elements[index + 1];
|
|
|
|
|
if (
|
|
|
|
|
nextElement &&
|
|
|
|
|
"containerId" in nextElement &&
|
|
|
|
|
element.id === nextElement.containerId
|
|
|
|
|
) {
|
|
|
|
|
return {
|
|
|
|
|
...element,
|
|
|
|
|
boundElements: [{ type: "text", id: nextElement.id }],
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
return element;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
h.setState({
|
|
|
|
|
selectedElementIds,
|
|
|
|
|
});
|
|
|
|
@ -87,6 +106,7 @@ const assertZindex = ({
|
|
|
|
|
isDeleted?: true;
|
|
|
|
|
isSelected?: true;
|
|
|
|
|
groupIds?: string[];
|
|
|
|
|
containerId?: string;
|
|
|
|
|
}[];
|
|
|
|
|
appState?: Partial<AppState>;
|
|
|
|
|
operations: [Actions, string[]][];
|
|
|
|
@ -1051,4 +1071,73 @@ describe("z-index manipulation", () => {
|
|
|
|
|
"C_copy",
|
|
|
|
|
]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("text-container binding should be atomic", () => {
|
|
|
|
|
assertZindex({
|
|
|
|
|
elements: [
|
|
|
|
|
{ id: "A", isSelected: true },
|
|
|
|
|
{ id: "B" },
|
|
|
|
|
{ id: "C", containerId: "B" },
|
|
|
|
|
],
|
|
|
|
|
operations: [
|
|
|
|
|
[actionBringForward, ["B", "C", "A"]],
|
|
|
|
|
[actionSendBackward, ["A", "B", "C"]],
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
assertZindex({
|
|
|
|
|
elements: [
|
|
|
|
|
{ id: "A" },
|
|
|
|
|
{ id: "B", isSelected: true },
|
|
|
|
|
{ id: "C", containerId: "B" },
|
|
|
|
|
],
|
|
|
|
|
operations: [
|
|
|
|
|
[actionSendBackward, ["B", "C", "A"]],
|
|
|
|
|
[actionBringForward, ["A", "B", "C"]],
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
assertZindex({
|
|
|
|
|
elements: [
|
|
|
|
|
{ id: "A", isSelected: true, groupIds: ["g1"] },
|
|
|
|
|
{ id: "B", groupIds: ["g1"] },
|
|
|
|
|
{ id: "C", containerId: "B", groupIds: ["g1"] },
|
|
|
|
|
],
|
|
|
|
|
appState: {
|
|
|
|
|
editingGroupId: "g1",
|
|
|
|
|
},
|
|
|
|
|
operations: [
|
|
|
|
|
[actionBringForward, ["B", "C", "A"]],
|
|
|
|
|
[actionSendBackward, ["A", "B", "C"]],
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
assertZindex({
|
|
|
|
|
elements: [
|
|
|
|
|
{ id: "A", groupIds: ["g1"] },
|
|
|
|
|
{ id: "B", groupIds: ["g1"], isSelected: true },
|
|
|
|
|
{ id: "C", containerId: "B", groupIds: ["g1"] },
|
|
|
|
|
],
|
|
|
|
|
appState: {
|
|
|
|
|
editingGroupId: "g1",
|
|
|
|
|
},
|
|
|
|
|
operations: [
|
|
|
|
|
[actionSendBackward, ["B", "C", "A"]],
|
|
|
|
|
[actionBringForward, ["A", "B", "C"]],
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
assertZindex({
|
|
|
|
|
elements: [
|
|
|
|
|
{ id: "A", groupIds: ["g1"] },
|
|
|
|
|
{ id: "B", isSelected: true, groupIds: ["g1"] },
|
|
|
|
|
{ id: "C" },
|
|
|
|
|
{ id: "D", containerId: "C" },
|
|
|
|
|
],
|
|
|
|
|
appState: {
|
|
|
|
|
editingGroupId: "g1",
|
|
|
|
|
},
|
|
|
|
|
operations: [[actionBringForward, ["A", "B", "C", "D"]]],
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|