diff --git a/resources/js/components/shared/ellipsisMenuActions.js b/resources/js/components/shared/ellipsisMenuActions.js
index 723b9af3ff..33e7139e11 100644
--- a/resources/js/components/shared/ellipsisMenuActions.js
+++ b/resources/js/components/shared/ellipsisMenuActions.js
@@ -269,6 +269,15 @@ export default {
"view-additional-asset-actions",
],
},
+ {
+ value: "copy-item",
+ content: "Copy",
+ icon: "fas fa-copy",
+ permission: [
+ "create-flow_genies",
+ "view-additional-asset-actions",
+ ],
+ },
{
value: "add-to-project",
content: "Add to Project",
diff --git a/resources/js/components/shared/flowGenieNavigation.js b/resources/js/components/shared/flowGenieNavigation.js
index fa2ec3b728..2e5e8af223 100644
--- a/resources/js/components/shared/flowGenieNavigation.js
+++ b/resources/js/components/shared/flowGenieNavigation.js
@@ -9,20 +9,32 @@ export default {
* navigation for flow genies actions
*/
onFlowGenieNavigate(action, data) {
+ const name = data.name || data.title;
switch (action.value) {
case "edit-item":
this.editFlowGenie(data);
- break;
- case 'add-to-project':
- this.showAddToProjectModal(data.title, data.id);
+ break;
+ case "copy-item":
+ this.doDuplicateFlowGenie(data);
+ break;
+ case "add-to-project":
+ this.showAddToProjectModal(name, data.id);
break;
case "remove-item":
this.doDeleteFlowGenie(data);
break;
+ default:
+ break;
}
},
/**
- * go to edit decision table
+ * Open the copy Flow Genie modal.
+ */
+ doDuplicateFlowGenie(data) {
+ this.showFlowGenieCopyModal(data);
+ },
+ /**
+ * go to edit flow genie
*/
editFlowGenie(row) {
window.location.href = `/designer/flow-genies/${row.id}/edit`;
diff --git a/resources/js/processes/designer/CopyFlowGenieModal.vue b/resources/js/processes/designer/CopyFlowGenieModal.vue
new file mode 100644
index 0000000000..90e2bd3e2a
--- /dev/null
+++ b/resources/js/processes/designer/CopyFlowGenieModal.vue
@@ -0,0 +1,241 @@
+
+
+
+
+
diff --git a/resources/js/processes/designer/RecentAssetsList.vue b/resources/js/processes/designer/RecentAssetsList.vue
index 5e0b26bee4..452ab9c34a 100644
--- a/resources/js/processes/designer/RecentAssetsList.vue
+++ b/resources/js/processes/designer/RecentAssetsList.vue
@@ -124,6 +124,13 @@
+
@@ -147,6 +154,7 @@ import CreatePmBlockModal from "../../components/pm-blocks/CreatePmBlockModal.vu
import EllipsisMenu from "../../components/shared/EllipsisMenu.vue";
import AddToBundle from "../../components/shared/AddToBundle.vue";
import CategorySelect from "../categories/components/CategorySelect.vue";
+import CopyFlowGenieModal from "./CopyFlowGenieModal.vue";
const uniqIdsMixin = createUniqIdsMixin();
@@ -158,6 +166,7 @@ export default {
EllipsisMenu,
AddToBundle,
CategorySelect,
+ CopyFlowGenieModal,
},
mixins: [
datatableMixin,
@@ -208,6 +217,8 @@ export default {
processTemplateName: "",
pmBlockName: "",
bundleAssetType: "ProcessMaker\\Models\\Process",
+ flowGenieName: "",
+ flowGenieData: {},
};
},
methods: {
@@ -267,7 +278,7 @@ export default {
case "Decision Table":
return this.addBundleAction(this.decisionTableActions, 2);
case "Flow Genie":
- return this.addBundleAction(this.flowGenieActions, 2);
+ return this.addBundleAction(this.flowGenieActions, 3);
default:
return []; // Handle unknown asset types as needed
}
@@ -424,6 +435,16 @@ export default {
}
});
},
+ /**
+ * Open the copy Flow Genie modal
+ */
+ showFlowGenieCopyModal(data) {
+ this.flowGenieName = data.name || data.title || "";
+ this.flowGenieData = data;
+ this.$nextTick(() => {
+ this.$refs["copy-flow-genie-modal"].show();
+ });
+ },
},
};