@contrail/document-table 1.0.17 → 1.0.19-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './table-border-ranges';
2
2
  export * from './table-constants';
3
3
  export * from './table-copy.service';
4
+ export * from './table-member-paste.service';
4
5
  export * from './table-merge.service';
5
6
  export * from './table-paste.service';
6
7
  export * from './table-rotate.service';
package/lib/index.js CHANGED
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./table-border-ranges"), exports);
18
18
  __exportStar(require("./table-constants"), exports);
19
19
  __exportStar(require("./table-copy.service"), exports);
20
+ __exportStar(require("./table-member-paste.service"), exports);
20
21
  __exportStar(require("./table-merge.service"), exports);
21
22
  __exportStar(require("./table-paste.service"), exports);
22
23
  __exportStar(require("./table-rotate.service"), exports);
@@ -8,3 +8,4 @@ export declare const DEFAULT_TEXT_FONT_FAMILY = "Roboto";
8
8
  export declare const DEFAULT_TEXT_FONT_SIZE = 11;
9
9
  export declare const TEXT_VALIGN = "top";
10
10
  export declare const TEXT_ALIGN = "left";
11
+ export declare const TABLE_STRUCTURE_TYPES: string[];
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TEXT_ALIGN = exports.TEXT_VALIGN = exports.DEFAULT_TEXT_FONT_SIZE = exports.DEFAULT_TEXT_FONT_FAMILY = exports.TRANSPARENT_COLOR = exports.TABLE_TEXT_PADDING = exports.TABLE_CELL_HEIGHT = exports.TABLE_CELL_WIDTH = exports.TABLE_COLUMN_MIN_WIDTH = exports.TABLE_ROW_MIN_HEIGHT = void 0;
3
+ exports.TABLE_STRUCTURE_TYPES = exports.TEXT_ALIGN = exports.TEXT_VALIGN = exports.DEFAULT_TEXT_FONT_SIZE = exports.DEFAULT_TEXT_FONT_FAMILY = exports.TRANSPARENT_COLOR = exports.TABLE_TEXT_PADDING = exports.TABLE_CELL_HEIGHT = exports.TABLE_CELL_WIDTH = exports.TABLE_COLUMN_MIN_WIDTH = exports.TABLE_ROW_MIN_HEIGHT = void 0;
4
4
  exports.TABLE_ROW_MIN_HEIGHT = 28;
5
5
  exports.TABLE_COLUMN_MIN_WIDTH = 28;
6
6
  exports.TABLE_CELL_WIDTH = 200;
@@ -11,3 +11,4 @@ exports.DEFAULT_TEXT_FONT_FAMILY = 'Roboto';
11
11
  exports.DEFAULT_TEXT_FONT_SIZE = 11;
12
12
  exports.TEXT_VALIGN = 'top';
13
13
  exports.TEXT_ALIGN = 'left';
14
+ exports.TABLE_STRUCTURE_TYPES = ['table', 'column', 'row', 'cell'];
@@ -6,12 +6,13 @@ const util_1 = require("@contrail/util");
6
6
  const nanoid_1 = require("nanoid");
7
7
  const table_constants_1 = require("./table-constants");
8
8
  const table_service_1 = require("./table.service");
9
+ const table_state_service_1 = require("./table-state.service");
9
10
  class TableCopyService {
10
11
  constructor() { }
11
12
  static copy(tableElement, childElements) {
12
13
  const copiedChildElementIds = new Map();
13
14
  const childElementsMap = new Map();
14
- childElements.forEach((element) => {
15
+ childElements.forEach(element => {
15
16
  childElementsMap.set(element.id, element);
16
17
  });
17
18
  const rowIds = [];
@@ -55,16 +56,16 @@ class TableCopyService {
55
56
  columnIds.push(newElement.id);
56
57
  newChildElements.push(newElement);
57
58
  }
58
- const cellElements = childElements.filter((e) => e.type === 'cell');
59
+ const cellElements = childElements.filter(e => e.type === 'cell');
59
60
  if (cellElements.length < tableElement.rowIds.length * tableElement.columnIds.length) {
60
61
  for (let i = 0; i < tableElement.rowIds.length; i++) {
61
62
  for (let j = 0; j < tableElement.columnIds.length; j++) {
62
63
  const rowId = tableElement.rowIds[i];
63
64
  const columnId = tableElement.columnIds[j];
64
- const cellElement = cellElements.find((e) => e.type === 'cell' && e.rowId === rowId && e.columnId === columnId);
65
+ const cellElement = cellElements.find(e => e.type === 'cell' && e.rowId === rowId && e.columnId === columnId);
65
66
  if (!cellElement) {
66
- const row = childElements.find((e) => e.id === rowId);
67
- const column = childElements.find((e) => e.id === columnId);
67
+ const row = childElements.find(e => e.id === rowId);
68
+ const column = childElements.find(e => e.id === columnId);
68
69
  cellElements.push((0, table_service_1.createCell)({
69
70
  rowId,
70
71
  columnId,
@@ -101,6 +102,7 @@ class TableCopyService {
101
102
  return [newTableElement, ...newChildElements];
102
103
  }
103
104
  static createTableFromCells(element, rows, columns, cells) {
105
+ var _a, _b, _c, _d;
104
106
  const rowElements = [];
105
107
  const rowIds = new Map();
106
108
  const columnElements = [];
@@ -110,7 +112,7 @@ class TableCopyService {
110
112
  const tableId = (0, nanoid_1.nanoid)(16);
111
113
  let width = 0, height = 0;
112
114
  let startRow, endRow, startColumn, endColumn;
113
- cells.forEach((cell) => {
115
+ cells.forEach(cell => {
114
116
  const rowIndex = element.rowIds.indexOf(cell.rowId);
115
117
  const columnIndex = element.columnIds.indexOf(cell.columnId);
116
118
  const isNotSet = startRow == undefined;
@@ -124,8 +126,8 @@ class TableCopyService {
124
126
  endColumn = columnIndex;
125
127
  existingCellsMap.set(`${rowIndex}_${columnIndex}`, cell);
126
128
  });
127
- const skipRows = Array.from({ length: endRow - startRow + 1 }, (value, index) => startRow + index).filter((i) => !Array.from(existingCellsMap.keys()).find((v) => v.startsWith(`${i}_`)));
128
- const skipColumns = Array.from({ length: endColumn - startColumn + 1 }, (value, index) => startColumn + index).filter((j) => !Array.from(existingCellsMap.keys()).find((v) => v.endsWith(`_${j}`)));
129
+ const skipRows = Array.from({ length: endRow - startRow + 1 }, (value, index) => startRow + index).filter(i => !Array.from(existingCellsMap.keys()).find(v => v.startsWith(`${i}_`)));
130
+ const skipColumns = Array.from({ length: endColumn - startColumn + 1 }, (value, index) => startColumn + index).filter(j => !Array.from(existingCellsMap.keys()).find(v => v.endsWith(`_${j}`)));
129
131
  for (let i = startRow; i <= endRow; i++) {
130
132
  if (skipRows.indexOf(i) !== -1)
131
133
  continue;
@@ -195,10 +197,14 @@ class TableCopyService {
195
197
  }
196
198
  }
197
199
  }
200
+ const { columns: existingColumns, rows: existingRows } = table_state_service_1.TableStateService.buildChildElementsState(element, new Map([...columns, ...rows].map(e => [e.id, e])), []);
198
201
  const tableElement = {
199
202
  type: 'table',
200
203
  id: tableId,
201
- position: Object.assign({}, element.position),
204
+ position: {
205
+ x: element.position.x + existingColumns.get(columns[startColumn].id).x * ((_b = (_a = element === null || element === void 0 ? void 0 : element.scale) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : 1),
206
+ y: element.position.y + existingRows.get(rows[startRow].id).y * ((_d = (_c = element === null || element === void 0 ? void 0 : element.scale) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : 1),
207
+ },
202
208
  scale: Object.assign({}, element.scale),
203
209
  size: {
204
210
  width,
@@ -276,7 +282,8 @@ class TableCopyService {
276
282
  var _a, _b, _c, _d, _e, _f;
277
283
  const fontFamily = `${(_c = (_b = (_a = cellElement.style) === null || _a === void 0 ? void 0 : _a.font) === null || _b === void 0 ? void 0 : _b.family) !== null && _c !== void 0 ? _c : table_constants_1.DEFAULT_TEXT_FONT_FAMILY}`;
278
284
  const fontSize = `${(_f = (_e = (_d = cellElement.style) === null || _d === void 0 ? void 0 : _d.font) === null || _e === void 0 ? void 0 : _e.size) !== null && _f !== void 0 ? _f : table_constants_1.DEFAULT_TEXT_FONT_SIZE}pt`;
279
- const size = table_service_1.TableService.getSize(cellElement.text, `width: ${cellElement.size.width - table_constants_1.TABLE_TEXT_PADDING * 2}px; height: auto; font-family: ${fontFamily}; font-size: ${fontSize};`);
285
+ const size = table_service_1.TableService.getSize(cellElement.text, `width: ${cellElement.size.width -
286
+ table_constants_1.TABLE_TEXT_PADDING * 2}px; height: auto; font-family: ${fontFamily}; font-size: ${fontSize};`);
280
287
  const documentElement = {
281
288
  isTextTool: true,
282
289
  text: cellElement.text,
@@ -0,0 +1,14 @@
1
+ import { DocumentElement } from '@contrail/documents';
2
+ interface MembershipEntry {
3
+ gridRow: number;
4
+ gridCol: number;
5
+ offsetX: number;
6
+ offsetY: number;
7
+ lineDx?: number;
8
+ lineDy?: number;
9
+ }
10
+ export declare class TableMemberPasteService {
11
+ static detectMemberships(tableEl: DocumentElement, structureEls: DocumentElement[], memberCandidates: DocumentElement[]): Map<string, MembershipEntry>;
12
+ static resolveMemberPositions(memberships: Map<string, MembershipEntry>, memberElements: DocumentElement[], targetTableEl: DocumentElement, targetChildEls: DocumentElement[], targetRow: number, targetCol: number): DocumentElement[];
13
+ }
14
+ export {};
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TableMemberPasteService = void 0;
4
+ const table_merge_service_1 = require("./table-merge.service");
5
+ const table_state_service_1 = require("./table-state.service");
6
+ const util_1 = require("@contrail/util");
7
+ const nanoid_1 = require("nanoid");
8
+ class TableMemberPasteService {
9
+ static detectMemberships(tableEl, structureEls, memberCandidates) {
10
+ var _a, _b, _c, _d, _e, _f, _g, _h;
11
+ const result = new Map();
12
+ if (!tableEl || !memberCandidates.length)
13
+ return result;
14
+ const childElementsMap = table_state_service_1.TableStateService.getTableElementsMap(tableEl, structureEls);
15
+ const nonTableEls = structureEls.filter((e) => e.type !== 'table');
16
+ const mergedRanges = table_merge_service_1.TableMergeService.getMergedRanges(tableEl, nonTableEls);
17
+ const { cells } = table_state_service_1.TableStateService.buildChildElementsState(tableEl, childElementsMap, mergedRanges);
18
+ const scale = (_b = (_a = tableEl.scale) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : 1;
19
+ const tableX = (_d = (_c = tableEl.position) === null || _c === void 0 ? void 0 : _c.x) !== null && _d !== void 0 ? _d : 0;
20
+ const tableY = (_f = (_e = tableEl.position) === null || _e === void 0 ? void 0 : _e.y) !== null && _f !== void 0 ? _f : 0;
21
+ const rowIds = (_g = tableEl.rowIds) !== null && _g !== void 0 ? _g : [];
22
+ const columnIds = (_h = tableEl.columnIds) !== null && _h !== void 0 ? _h : [];
23
+ for (const member of memberCandidates) {
24
+ const isLine = member.type === 'line';
25
+ let cx;
26
+ let cy;
27
+ let anchorX;
28
+ let anchorY;
29
+ if (isLine && member.lineDefinition) {
30
+ const { x1, y1, x2, y2 } = member.lineDefinition;
31
+ cx = (x1 + x2) / 2;
32
+ cy = (y1 + y2) / 2;
33
+ anchorX = x1;
34
+ anchorY = y1;
35
+ }
36
+ else if (member.position && member.size) {
37
+ cx = member.position.x + member.size.width / 2;
38
+ cy = member.position.y + member.size.height / 2;
39
+ anchorX = member.position.x;
40
+ anchorY = member.position.y;
41
+ }
42
+ else {
43
+ continue;
44
+ }
45
+ for (const [cellId, cellState] of cells) {
46
+ if (cellState.isMerged)
47
+ continue;
48
+ const cellLeft = tableX + cellState.x * scale;
49
+ const cellRight = cellLeft + cellState.width * scale;
50
+ const cellTop = tableY + cellState.y * scale;
51
+ const cellBottom = cellTop + cellState.height * scale;
52
+ const inBox = cx > cellLeft && cx < cellRight && cy > cellTop && cy < cellBottom;
53
+ if (!inBox)
54
+ continue;
55
+ const cellEl = childElementsMap.get(cellId);
56
+ if (!cellEl)
57
+ break;
58
+ const gridRow = rowIds.indexOf(cellEl.rowId);
59
+ const gridCol = columnIds.indexOf(cellEl.columnId);
60
+ if (gridRow === -1 || gridCol === -1)
61
+ break;
62
+ const unscaledAnchorX = (anchorX - tableX) / scale;
63
+ const unscaledAnchorY = (anchorY - tableY) / scale;
64
+ const offsetX = unscaledAnchorX - cellState.x;
65
+ const offsetY = unscaledAnchorY - cellState.y;
66
+ const entry = { gridRow, gridCol, offsetX, offsetY };
67
+ if (isLine && member.lineDefinition) {
68
+ entry.lineDx = member.lineDefinition.x2 - member.lineDefinition.x1;
69
+ entry.lineDy = member.lineDefinition.y2 - member.lineDefinition.y1;
70
+ }
71
+ result.set(member.id, entry);
72
+ break;
73
+ }
74
+ }
75
+ return result;
76
+ }
77
+ static resolveMemberPositions(memberships, memberElements, targetTableEl, targetChildEls, targetRow, targetCol) {
78
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
79
+ const newElements = [];
80
+ if (!memberships.size)
81
+ return newElements;
82
+ const childElementsMap = table_state_service_1.TableStateService.getTableElementsMap(targetTableEl, targetChildEls);
83
+ const nonTableEls = targetChildEls.filter((e) => e.type !== 'table');
84
+ const mergedRanges = table_merge_service_1.TableMergeService.getMergedRanges(targetTableEl, nonTableEls);
85
+ const { cells } = table_state_service_1.TableStateService.buildChildElementsState(targetTableEl, childElementsMap, mergedRanges);
86
+ const scale = (_b = (_a = targetTableEl.scale) === null || _a === void 0 ? void 0 : _a.x) !== null && _b !== void 0 ? _b : 1;
87
+ const tableX = (_d = (_c = targetTableEl.position) === null || _c === void 0 ? void 0 : _c.x) !== null && _d !== void 0 ? _d : 0;
88
+ const tableY = (_f = (_e = targetTableEl.position) === null || _e === void 0 ? void 0 : _e.y) !== null && _f !== void 0 ? _f : 0;
89
+ const rowIds = (_g = targetTableEl.rowIds) !== null && _g !== void 0 ? _g : [];
90
+ const columnIds = (_h = targetTableEl.columnIds) !== null && _h !== void 0 ? _h : [];
91
+ const cellByRowCol = new Map();
92
+ for (const el of targetChildEls) {
93
+ if (el.type === 'cell' && el.rowId && el.columnId) {
94
+ cellByRowCol.set(`${el.rowId}-${el.columnId}`, el);
95
+ }
96
+ }
97
+ for (const member of memberElements) {
98
+ const entry = memberships.get(member.id);
99
+ if (!entry)
100
+ continue;
101
+ const { gridRow, gridCol, offsetX, offsetY } = entry;
102
+ const targetRowId = rowIds[targetRow + gridRow];
103
+ const targetColId = columnIds[targetCol + gridCol];
104
+ if (!targetRowId || !targetColId)
105
+ continue;
106
+ const targetCellEl = cellByRowCol.get(`${targetRowId}-${targetColId}`);
107
+ if (!targetCellEl)
108
+ continue;
109
+ const targetCellState = cells.get(targetCellEl.id);
110
+ if (!targetCellState)
111
+ continue;
112
+ const newEl = util_1.ObjectUtil.cloneDeep(member);
113
+ newEl.id = (0, nanoid_1.nanoid)(16);
114
+ const isLine = member.type === 'line';
115
+ if (isLine && member.lineDefinition) {
116
+ const newX1 = tableX + (targetCellState.x + offsetX) * scale;
117
+ const newY1 = tableY + (targetCellState.y + offsetY) * scale;
118
+ const newX2 = newX1 + ((_j = entry.lineDx) !== null && _j !== void 0 ? _j : 0);
119
+ const newY2 = newY1 + ((_k = entry.lineDy) !== null && _k !== void 0 ? _k : 0);
120
+ newEl.lineDefinition = Object.assign(Object.assign({}, newEl.lineDefinition), { x1: newX1, y1: newY1, x2: newX2, y2: newY2 });
121
+ if ((_l = newEl.points) === null || _l === void 0 ? void 0 : _l.length) {
122
+ const oldX1 = member.lineDefinition.x1;
123
+ const oldY1 = member.lineDefinition.y1;
124
+ const dx = newX1 - oldX1;
125
+ const dy = newY1 - oldY1;
126
+ newEl.points = newEl.points.map((p) => [p[0] + dx, p[1] + dy]);
127
+ }
128
+ }
129
+ else {
130
+ const newX = tableX + (targetCellState.x + offsetX) * scale;
131
+ const newY = tableY + (targetCellState.y + offsetY) * scale;
132
+ if (((_m = newEl.points) === null || _m === void 0 ? void 0 : _m.length) && member.position) {
133
+ const dx = newX - member.position.x;
134
+ const dy = newY - member.position.y;
135
+ newEl.points = newEl.points.map((p) => [p[0] + dx, p[1] + dy]);
136
+ }
137
+ newEl.position = { x: newX, y: newY };
138
+ }
139
+ newElements.push(newEl);
140
+ }
141
+ return newElements;
142
+ }
143
+ }
144
+ exports.TableMemberPasteService = TableMemberPasteService;
@@ -3,9 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TablePasteService = void 0;
4
4
  const documents_1 = require("@contrail/documents");
5
5
  const util_1 = require("@contrail/util");
6
+ const table_member_paste_service_1 = require("./table-member-paste.service");
6
7
  const table_merge_service_1 = require("./table-merge.service");
7
8
  const table_service_1 = require("./table.service");
8
9
  const table_range_1 = require("./table-range");
10
+ const table_state_service_1 = require("./table-state.service");
11
+ const table_constants_1 = require("./table-constants");
9
12
  class TablePasteService {
10
13
  constructor() { }
11
14
  static log(...message) {
@@ -13,15 +16,15 @@ class TablePasteService {
13
16
  }
14
17
  static pasteRowsAndColumns(tableElement, childElements, elementsToPaste, targetRow, targetColumn) {
15
18
  var _a, _b, _c;
16
- const tableToPaste = elementsToPaste.find((e) => e.type === 'table');
17
- const rowsToPaste = elementsToPaste.filter((e) => e.type === 'row');
18
- const columnsToPaste = elementsToPaste.filter((e) => e.type === 'column');
19
- const cellsToPaste = elementsToPaste.filter((e) => e.type === 'cell');
19
+ const tableToPaste = elementsToPaste.find(e => e.type === 'table');
20
+ const rowsToPaste = elementsToPaste.filter(e => e.type === 'row');
21
+ const columnsToPaste = elementsToPaste.filter(e => e.type === 'column');
22
+ const cellsToPaste = elementsToPaste.filter(e => e.type === 'cell');
20
23
  const startRow = targetRow;
21
24
  const endRow = startRow + tableToPaste.rowIds.length - 1;
22
25
  const startColumn = targetColumn;
23
26
  const endColumn = startColumn + tableToPaste.columnIds.length - 1;
24
- const existingCells = childElements.filter((e) => e.type === 'cell');
27
+ const existingCells = childElements.filter(e => e.type === 'cell');
25
28
  const elementsToCreate = [];
26
29
  const elementsToUpdate = [];
27
30
  const columnWidthsToUpdate = new Map();
@@ -30,8 +33,8 @@ class TablePasteService {
30
33
  for (let rowIndex = startRow; rowIndex <= endRow; rowIndex++) {
31
34
  const rowToPaste = rowsToPaste[rowIndex - targetRow];
32
35
  let existingRowId = tableElement.rowIds[rowIndex];
33
- let existingRow = childElements.find((e) => e.type === 'row' && e.id === existingRowId) ||
34
- elementsToCreate.find((e) => e.type === 'row' && e.id === existingRowId);
36
+ let existingRow = childElements.find(e => e.type === 'row' && e.id === existingRowId) ||
37
+ elementsToCreate.find(e => e.type === 'row' && e.id === existingRowId);
35
38
  this.log('current row', rowIndex, existingRowId, existingRow);
36
39
  if (!existingRowId) {
37
40
  const [newRow, ...newRowCells] = (_a = table_service_1.TableService.addRow(tableElement, [...existingCells, ...elementsToCreate], rowIndex, rowToPaste.size.height)) === null || _a === void 0 ? void 0 : _a.elementsToCreate;
@@ -47,8 +50,8 @@ class TablePasteService {
47
50
  for (let columnIndex = startColumn; columnIndex <= endColumn; columnIndex++) {
48
51
  const columnToPaste = columnsToPaste[columnIndex - targetColumn];
49
52
  let existingColumnId = tableElement.columnIds[columnIndex];
50
- let existingColumn = childElements.find((e) => e.type === 'column' && e.id === existingColumnId) ||
51
- elementsToCreate.find((e) => e.type === 'column' && e.id === existingColumnId);
53
+ let existingColumn = childElements.find(e => e.type === 'column' && e.id === existingColumnId) ||
54
+ elementsToCreate.find(e => e.type === 'column' && e.id === existingColumnId);
52
55
  this.log('current column', columnIndex, existingColumnId, existingColumn);
53
56
  if (!tableElement.columnIds[columnIndex]) {
54
57
  const [newColumn, ...newColumnCells] = (_b = table_service_1.TableService.addColumn(tableElement, [...existingCells, ...elementsToCreate], columnIndex, columnToPaste.size.width)) === null || _b === void 0 ? void 0 : _b.elementsToCreate;
@@ -62,14 +65,14 @@ class TablePasteService {
62
65
  columnWidthsToUpdate.get(existingColumnId) < columnToPaste.size.width)) {
63
66
  columnWidthsToUpdate.set(existingColumnId, columnToPaste.size.width);
64
67
  }
65
- const cellToPaste = cellsToPaste.find((e) => e.rowId === rowToPaste.id && e.columnId === columnToPaste.id);
68
+ const cellToPaste = cellsToPaste.find(e => e.rowId === rowToPaste.id && e.columnId === columnToPaste.id);
66
69
  if (!cellToPaste)
67
70
  continue;
68
71
  const cellRange = new table_range_1.TableRange(rowIndex, rowIndex, columnIndex, columnIndex);
69
- const mergedRange = existingMergedRanges.find((range) => range.intersects(cellRange));
72
+ const mergedRange = existingMergedRanges.find(range => range.intersects(cellRange));
70
73
  const mergedRangeOther = mergedRange && !cellRange.equals(mergedRange.start());
71
74
  if (mergedRange) {
72
- existingMergedRanges = existingMergedRanges.filter((r) => !r.equals(mergedRange));
75
+ existingMergedRanges = existingMergedRanges.filter(r => !r.equals(mergedRange));
73
76
  }
74
77
  if (mergedRangeOther) {
75
78
  const [updatedTable, ...unmergedCellAndRow] = (_c = table_merge_service_1.TableMergeService.unmerge(tableElement, childElements, mergedRange)) === null || _c === void 0 ? void 0 : _c.elementsToUpdate;
@@ -97,33 +100,34 @@ class TablePasteService {
97
100
  return { elementsToCreate, elementsToUpdate };
98
101
  }
99
102
  static pasteTableCells(tableElement, childElements, elementsToPaste, targetRow, targetColumn) {
100
- const tableToPaste = elementsToPaste.find((e) => e.type === 'table');
101
- const rowsToPaste = elementsToPaste.filter((e) => e.type === 'row');
102
- const columnsToPaste = elementsToPaste.filter((e) => e.type === 'column');
103
- const cellsToPaste = elementsToPaste.filter((e) => e.type === 'cell');
104
- this.log(elementsToPaste);
103
+ const memberCandidates = elementsToPaste.filter(e => table_state_service_1.TableStateService.isValidTableMember(e));
104
+ const structureElements = elementsToPaste.filter(e => !table_state_service_1.TableStateService.isValidTableMember(e));
105
+ const tableToPaste = structureElements.find(e => e.type === 'table');
106
+ const rowsToPaste = structureElements.filter(e => e.type === 'row');
107
+ const columnsToPaste = structureElements.filter(e => e.type === 'column');
108
+ const cellsToPaste = structureElements.filter(e => e.type === 'cell');
105
109
  const startRow = targetRow;
106
110
  const endRow = startRow + tableToPaste.rowIds.length - 1;
107
111
  const startColumn = targetColumn;
108
112
  const endColumn = startColumn + tableToPaste.columnIds.length - 1;
109
- const existingCells = childElements.filter((e) => e.type === 'cell');
113
+ const existingCells = childElements.filter(e => e.type === 'cell');
110
114
  const tableUndo = util_1.ObjectUtil.cloneDeep(tableElement);
111
- const { elementsToUpdate, elementsToCreate } = TablePasteService.pasteRowsAndColumns(tableElement, childElements, elementsToPaste, targetRow, targetColumn);
115
+ const { elementsToUpdate, elementsToCreate } = TablePasteService.pasteRowsAndColumns(tableElement, childElements, structureElements, targetRow, targetColumn);
112
116
  for (let rowIndex = startRow; rowIndex <= endRow; rowIndex++) {
113
117
  const rowToPaste = rowsToPaste[rowIndex - targetRow];
114
118
  const existingRowId = tableElement.rowIds[rowIndex];
115
- const existingRow = childElements.find((e) => e.type === 'row' && e.id === existingRowId) ||
116
- elementsToCreate.find((e) => e.type === 'row' && e.id === existingRowId);
119
+ const existingRow = childElements.find(e => e.type === 'row' && e.id === existingRowId) ||
120
+ elementsToCreate.find(e => e.type === 'row' && e.id === existingRowId);
117
121
  for (let columnIndex = startColumn; columnIndex <= endColumn; columnIndex++) {
118
122
  const columnToPaste = columnsToPaste[columnIndex - targetColumn];
119
123
  const existingColumnId = tableElement.columnIds[columnIndex];
120
- const existingColumn = childElements.find((e) => e.type === 'column' && e.id === existingColumnId) ||
121
- elementsToCreate.find((e) => e.type === 'column' && e.id === existingColumnId);
122
- const cellToPaste = cellsToPaste.find((e) => e.rowId === rowToPaste.id && e.columnId === columnToPaste.id);
124
+ const existingColumn = childElements.find(e => e.type === 'column' && e.id === existingColumnId) ||
125
+ elementsToCreate.find(e => e.type === 'column' && e.id === existingColumnId);
126
+ const cellToPaste = cellsToPaste.find(e => e.rowId === rowToPaste.id && e.columnId === columnToPaste.id);
123
127
  if (!cellToPaste)
124
128
  continue;
125
- const createdCell = elementsToCreate.find((e) => e.type === 'cell' && e.rowId === existingRowId && e.columnId === existingColumnId);
126
- const existingCell = existingCells.find((e) => e.rowId === existingRowId && e.columnId === existingColumnId);
129
+ const createdCell = elementsToCreate.find(e => e.type === 'cell' && e.rowId === existingRowId && e.columnId === existingColumnId);
130
+ const existingCell = existingCells.find(e => e.rowId === existingRowId && e.columnId === existingColumnId);
127
131
  const cell = createdCell !== null && createdCell !== void 0 ? createdCell : existingCell;
128
132
  const cellUndo = util_1.ObjectUtil.cloneDeep(cell);
129
133
  this.log('cell to paste', cellToPaste);
@@ -163,6 +167,17 @@ class TablePasteService {
163
167
  change: tableElement,
164
168
  undo: tableUndo,
165
169
  });
170
+ if (memberCandidates.length > 0) {
171
+ const memberships = table_member_paste_service_1.TableMemberPasteService.detectMemberships(tableToPaste, structureElements, memberCandidates);
172
+ if (memberships.size > 0) {
173
+ const allTargetChildren = [
174
+ ...childElements,
175
+ ...elementsToCreate.filter(e => table_constants_1.TABLE_STRUCTURE_TYPES.includes(e.type)),
176
+ ];
177
+ const newMembers = table_member_paste_service_1.TableMemberPasteService.resolveMemberPositions(memberships, memberCandidates, tableElement, allTargetChildren, targetRow, targetColumn);
178
+ elementsToCreate.push(...newMembers);
179
+ }
180
+ }
166
181
  return {
167
182
  elementsToUpdate,
168
183
  elementsToCreate,
@@ -74,7 +74,7 @@ export declare class TableStateService {
74
74
  }): Map<string, TableMemberState>;
75
75
  static getTableMembersToDelete(tableElement: DocumentElement, childElements: DocumentElement[], tableMembersToUpdate: Map<string, TableMemberToUpdate>): Map<string, TableMemberToUpdate>;
76
76
  static adjustTableMemberPositions(tableElement: DocumentElement, childElements: DocumentElement[], tableMembersToUpdate: Map<string, TableMemberToUpdate>): Map<string, TableMemberToUpdate>;
77
- static updatePositionWithDelta(element: DocumentElement, position: PositionDefinition, deltaX: number, deltaY: number): void;
77
+ static updatePositionWithDelta(startingElement: DocumentElement, startingPosition: PositionDefinition, deltaX: number, deltaY: number): void;
78
78
  static getElementPositionChange(element: DocumentElement, startingElement: DocumentElement): {
79
79
  change: DocumentElement;
80
80
  undo: DocumentElement;
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TableStateService = void 0;
4
- const documents_1 = require("@contrail/documents");
5
4
  const document_table_1 = require("@contrail/document-table");
6
5
  const util_1 = require("@contrail/util");
7
6
  class TableStateService {
@@ -48,7 +47,7 @@ class TableStateService {
48
47
  }
49
48
  if (cell && column && row) {
50
49
  const cellRange = new document_table_1.TableRange(rowIndex, rowIndex, columnIndex, columnIndex);
51
- const mergedRange = mergedRanges.find(range => cellRange.within(range));
50
+ const mergedRange = mergedRanges.find((range) => cellRange.within(range));
52
51
  const mergedRangeStart = mergedRange && cellRange.equals(mergedRange.start());
53
52
  const mergedRangeOther = mergedRange && !cellRange.equals(mergedRange.start());
54
53
  const width = mergedRangeStart
@@ -93,9 +92,9 @@ class TableStateService {
93
92
  }
94
93
  static getMemberIdsForCellIds(table, cellIds) {
95
94
  const memberIds = new Set();
96
- cellIds.forEach(cellId => {
95
+ cellIds.forEach((cellId) => {
97
96
  var _a, _b;
98
- (_b = (_a = table.cellToMembers) === null || _a === void 0 ? void 0 : _a.get(cellId)) === null || _b === void 0 ? void 0 : _b.forEach(elementId => {
97
+ (_b = (_a = table.cellToMembers) === null || _a === void 0 ? void 0 : _a.get(cellId)) === null || _b === void 0 ? void 0 : _b.forEach((elementId) => {
99
98
  memberIds.add(elementId);
100
99
  });
101
100
  });
@@ -118,7 +117,7 @@ class TableStateService {
118
117
  const cellMembers = (_e = table.cellToMembers) === null || _e === void 0 ? void 0 : _e.get(cell.id);
119
118
  if ((cellMembers === null || cellMembers === void 0 ? void 0 : cellMembers.size) > 0 &&
120
119
  (includeAll || (rowIndexes === null || rowIndexes === void 0 ? void 0 : rowIndexes.includes(rowIndex)) || (columnIndexes === null || columnIndexes === void 0 ? void 0 : columnIndexes.includes(columnIndex)))) {
121
- cellMembers.forEach(memberId => {
120
+ cellMembers.forEach((memberId) => {
122
121
  tableMembers.set(memberId, {
123
122
  memberId,
124
123
  rowId,
@@ -168,26 +167,19 @@ class TableStateService {
168
167
  }
169
168
  return affectedTableMembers;
170
169
  }
171
- static updatePositionWithDelta(element, position, deltaX, deltaY) {
172
- var _a, _b, _c;
173
- if (element.type === 'line') {
174
- if (element.lineDefinition) {
175
- element.lineDefinition = Object.assign(Object.assign({}, util_1.ObjectUtil.cloneDeep(element.lineDefinition)), { x1: element.lineDefinition.x1 + deltaX, y1: element.lineDefinition.y1 + deltaY, x2: element.lineDefinition.x2 + deltaX, y2: element.lineDefinition.y2 + deltaY });
170
+ static updatePositionWithDelta(startingElement, startingPosition, deltaX, deltaY) {
171
+ var _a;
172
+ if (startingElement.type === 'line') {
173
+ if (startingElement.lineDefinition) {
174
+ startingElement.lineDefinition = Object.assign(Object.assign({}, util_1.ObjectUtil.cloneDeep(startingElement.lineDefinition)), { x1: startingElement.lineDefinition.x1 + deltaX, y1: startingElement.lineDefinition.y1 + deltaY, x2: startingElement.lineDefinition.x2 + deltaX, y2: startingElement.lineDefinition.y2 + deltaY });
176
175
  }
177
176
  }
178
177
  else {
179
- const isThumbnailOnlyComponent = documents_1.ItemComponentService.isThumbnailOnlyComponent(element);
180
- let pr = 0;
181
- let pt = 0;
182
- if (documents_1.ItemComponentService.isItemComponent(element) && !isThumbnailOnlyComponent) {
183
- pr = 8;
184
- pt = 18;
185
- }
186
- element.position = Object.assign(Object.assign({}, element.position), { x: ((isThumbnailOnlyComponent ? (_a = element.position) === null || _a === void 0 ? void 0 : _a.x : position === null || position === void 0 ? void 0 : position.x) || 0) + deltaX + pr, y: ((isThumbnailOnlyComponent ? (_b = element.position) === null || _b === void 0 ? void 0 : _b.y : position === null || position === void 0 ? void 0 : position.y) || 0) + deltaY + pt });
178
+ startingElement.position = Object.assign(Object.assign({}, startingElement.position), { x: ((startingPosition === null || startingPosition === void 0 ? void 0 : startingPosition.x) || 0) + deltaX, y: ((startingPosition === null || startingPosition === void 0 ? void 0 : startingPosition.y) || 0) + deltaY });
187
179
  }
188
- if (['callout', 'line'].indexOf(element.type) !== -1 && ((_c = element.points) === null || _c === void 0 ? void 0 : _c.length) > 0) {
189
- const points = element.points.map(([x, y]) => [x + deltaX, y + deltaY]);
190
- element.points = points;
180
+ if (['callout', 'line'].indexOf(startingElement.type) !== -1 && ((_a = startingElement.points) === null || _a === void 0 ? void 0 : _a.length) > 0) {
181
+ const points = startingElement.points.map(([x, y]) => [x + deltaX, y + deltaY]);
182
+ startingElement.points = points;
191
183
  }
192
184
  }
193
185
  static getElementPositionChange(element, startingElement) {
@@ -215,20 +207,20 @@ class TableStateService {
215
207
  }
216
208
  static getTableElementsMap(tableElement, tableChildElements) {
217
209
  var _a;
218
- const childElementsMap = new Map(tableChildElements.map(el => [el.id, el]));
210
+ const childElementsMap = new Map(tableChildElements.map((el) => [el.id, el]));
219
211
  const tableState = new Map();
220
- (_a = tableElement.rowIds) === null || _a === void 0 ? void 0 : _a.forEach(rowId => {
212
+ (_a = tableElement.rowIds) === null || _a === void 0 ? void 0 : _a.forEach((rowId) => {
221
213
  var _a;
222
214
  const row = childElementsMap.get(rowId);
223
215
  if (row) {
224
216
  tableState.set(rowId, row);
225
217
  }
226
- (_a = tableElement.columnIds) === null || _a === void 0 ? void 0 : _a.forEach(columnId => {
218
+ (_a = tableElement.columnIds) === null || _a === void 0 ? void 0 : _a.forEach((columnId) => {
227
219
  const column = childElementsMap.get(columnId);
228
220
  if (column) {
229
221
  tableState.set(columnId, column);
230
222
  }
231
- const cell = tableChildElements.find(el => el.rowId === rowId && el.columnId === columnId);
223
+ const cell = tableChildElements.find((el) => el.rowId === rowId && el.columnId === columnId);
232
224
  if (cell) {
233
225
  const compositeId = `${rowId}-${columnId}`;
234
226
  tableState.set(cell.id, cell);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contrail/document-table",
3
- "version": "1.0.17",
3
+ "version": "1.0.19-beta.0",
4
4
  "description": "Library for document tables",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",