|
@@ -508,6 +508,7 @@ Boards.helpers({
|
|
|
copy() {
|
|
|
const oldId = this._id;
|
|
|
delete this._id;
|
|
|
+ delete this.slug;
|
|
|
const _id = Boards.insert(this);
|
|
|
|
|
|
// Copy all swimlanes in board
|
|
@@ -537,7 +538,52 @@ Boards.helpers({
|
|
|
},
|
|
|
});
|
|
|
});
|
|
|
+
|
|
|
+ // copy rules, actions, and triggers
|
|
|
+ const actionsMap = {};
|
|
|
+ Actions.find({ boardId: oldId }).forEach(action => {
|
|
|
+ const id = action._id;
|
|
|
+ delete action._id;
|
|
|
+ action.boardId = _id;
|
|
|
+ actionsMap[id] = Actions.insert(action);
|
|
|
+ });
|
|
|
+ const triggersMap = {};
|
|
|
+ Triggers.find({ boardId: oldId }).forEach(trigger => {
|
|
|
+ const id = trigger._id;
|
|
|
+ delete trigger._id;
|
|
|
+ trigger.boardId = _id;
|
|
|
+ triggersMap[id] = Triggers.insert(trigger);
|
|
|
+ });
|
|
|
+ Rules.find({ boardId: oldId }).forEach(rule => {
|
|
|
+ delete rule._id;
|
|
|
+ rule.boardId = _id;
|
|
|
+ rule.actionId = actionsMap[rule.actionId];
|
|
|
+ rule.triggerId = triggersMap[rule.triggerId];
|
|
|
+ Rules.insert(rule);
|
|
|
+ });
|
|
|
},
|
|
|
+ /**
|
|
|
+ * Return a unique title based on the current title
|
|
|
+ *
|
|
|
+ * @returns {string|null}
|
|
|
+ */
|
|
|
+ copyTitle() {
|
|
|
+ const m = this.title.match(/^(?<title>.*?)\s*(\[(?<num>\d+)]\s*$|\s*$)/);
|
|
|
+ const title = m.groups.title;
|
|
|
+ let num = 0;
|
|
|
+ Boards.find({ title: new RegExp(`^${title}\\s*\\[\\d+]\\s*$`) }).forEach(
|
|
|
+ board => {
|
|
|
+ const m = board.title.match(/^(?<title>.*?)\s*\[(?<num>\d+)]\s*$/);
|
|
|
+ if (m) {
|
|
|
+ const n = parseInt(m.groups.num, 10);
|
|
|
+ num = num < n ? n : num;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
+ return `${title} [${num + 1}]`;
|
|
|
+ },
|
|
|
+
|
|
|
/**
|
|
|
* Is supplied user authorized to view this board?
|
|
|
*/
|