diff --git a/apps/OpenSign/src/routes/GenerateToken.js b/apps/OpenSign/src/routes/GenerateToken.js index a507d29aa..ce74313d4 100644 --- a/apps/OpenSign/src/routes/GenerateToken.js +++ b/apps/OpenSign/src/routes/GenerateToken.js @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; import Title from "../components/Title"; import axios from "axios"; +import Alert from "../primitives/Alert"; function GenerateToken() { const [parseBaseUrl] = useState(localStorage.getItem("baseUrl")); @@ -8,6 +9,8 @@ function GenerateToken() { const [apiToken, SetApiToken] = useState(""); const [isLoader, setIsLoader] = useState(true); const [copied, setCopied] = useState(false); + const [isGenerate, setIsGenerate] = useState(false); + const [isErr, setIsErr] = useState(false); useEffect(() => { fetchToken(); @@ -47,17 +50,27 @@ function GenerateToken() { if (res) { SetApiToken(res.data.result.token); // localStorage.setItem("apiToken", res.data.result.token); - alert("Token generated successfully!"); + setIsGenerate(true); + setTimeout(() => { + setIsGenerate(false); + }, 1500); setIsLoader(false); } else { - alert("Something went wrong!"); console.error("Error while generating Token"); setIsLoader(false); + setIsErr(true); + setTimeout(() => { + setIsErr(false); + }, 1500); } }); } catch (error) { setIsLoader(false); - alert("Something went wrong!"); + setIsErr(true); + setTimeout(() => { + setIsErr(false); + }, 1500); + console.log("err", error); } }; @@ -72,11 +85,11 @@ function GenerateToken() { return ( - {copied && ( - <div className={`alert alert-success alertBox`} role="alert"> - Copied - </div> + {isGenerate && ( + <Alert type="success">Token generated successfully!</Alert> )} + {copied && <Alert type="success">Copied</Alert>} + {isErr && <Alert type="danger">Something went wrong!</Alert>} {isLoader ? ( <div style={{ diff --git a/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js b/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js index ba6340f9b..84418f549 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/apiV1.js @@ -45,7 +45,7 @@ app.delete('/contact/:contact_id', deleteContact); app.get('/contactlist', getContactList); // create Document -app.post('/createdocument', createDocument); +app.post('/createdocument', upload.array('file', 1), createDocument); // get Document on the basis of id app.get('/document/:document_id', getDocument); @@ -60,7 +60,7 @@ app.delete('/document/:document_id', deleteDocument); app.get('/documentlist/:doctype', getDocumentList); // create Template -app.post('/createtemplate', createTemplate); +app.post('/createtemplate',upload.array('file', 1), createTemplate); // get template on the basis of id app.get('/template/:template_id', getTemplate); @@ -74,43 +74,3 @@ app.delete('/template/:template_id', deletedTemplate); // get all types of documents on the basis of doctype app.get('/templatelist', getTemplatetList); -app.post('/tempupload', upload.single('file'), async (req, res) => { - const name = req.body.name; - const note = req.body.note; - const description = req.body.description; - const fileFormat = req.body.fileFormat; // 'binary' or 'base64' - const filePath = req.body.filePath; // Path to the file - - let fileData; - - if (fileFormat === 'binary') { - // Read file content if the file is in binary format - fileData = fs.readFileSync(filePath); - } else if (fileFormat === 'base64') { - // Convert base64 data to binary - fileData = req.file ? req.file.buffer : null; - } else { - return res.status(400).json({ error: 'Invalid file format' }); - } - - // Create a Parse.File object - const file = new Parse.File('myfile', { base64: fileData.toString('base64') }); - - // Save the file to Parse Server - try { - await file.save(); - } catch (error) { - console.error('Error saving file to Parse Server:', error); - return res.status(500).json({ error: 'Internal Server Error' }); - } - - // Perform any desired processing with the received data - - // Respond to the client with the file URL - res.json({ - name: name, - note: note, - description: description, - fileUrl: file.url(), - }); -}); diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocument.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocument.js index af2deae8b..0c7b190c8 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocument.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocument.js @@ -1,13 +1,20 @@ +const randomId = () => Math.floor(1000 + Math.random() * 9000); export default async function createDocument(request, response) { - const name = request.body.name; - const note = request.body.note; - const description = request.body.description; - const signers = request.body.signer; - const folderId = request.body.folderId; - const file = request.body.file; + const name = request.body.Title; + const note = request.body.Note; + const description = request.body.Description; + const signers = request.body.Signers; + const folderId = request.body.FolderId; + // const file = request.body.file; const url = process.env.SERVER_URL; - + const fileData = request.files[0] ? request.files[0].buffer : null; try { + const file = new Parse.File(request.files[0].originalname, { + base64: fileData.toString('base64'), + }); + await file.save({ useMasterKey: true }); + const fileUrl = file.url(); + const reqToken = request.headers['x-api-token']; if (!reqToken) { return response.status(400).json({ error: 'Please Provide API Token' }); @@ -35,15 +42,30 @@ export default async function createDocument(request, response) { if (description) { object.set('Description', description); } - object.set('URL', file); + object.set('URL', fileUrl); object.set('CreatedBy', userId); object.set('ExtUserPtr', extUserPtr); if (signers) { - object.set('Signers', signers); + const placeholders = signers.map(x => ({ + email: x, + Id: randomId(), + Role: '', + blockColor: '', + signerObjId: '', + signerPtr: {}, + placeHolder: [], + })); + object.set('Placeholders', placeholders); } if (folderId) { object.set('Folder', folderPtr); } + const newACL = new Parse.ACL(); + newACL.setPublicReadAccess(false); + newACL.setPublicWriteAccess(false); + newACL.setReadAccess(id, true); + newACL.setWriteAccess(id, true); + object.setACL(newACL); const res = await object.save(null, { useMasterKey: true }); return response.json({ objectId: res.id, url: url }); } else { diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js index 381e85489..ab8b70596 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js @@ -1,12 +1,18 @@ export default async function createTemplate(request, response) { - const name = request.body.name; - const note = request.body.note; - const description = request.body.description; - const signers = request.body.signer; - const folderId = request.body.folderId; - const file = request.body.file; + const name = request.body.Title; + const note = request.body.Note; + const description = request.body.Description; + const signers = request.body.Signers; + const folderId = request.body.FolderId; + // const file = request.body.file; const url = process.env.SERVER_URL; + const fileData = request.files[0] ? request.files[0].buffer : null; try { + const file = new Parse.File(request.files[0].originalname, { + base64: fileData.toString('base64'), + }); + await file.save({ useMasterKey: true }); + const fileUrl = file.url(); const reqToken = request.headers['x-api-token']; if (!reqToken) { return response.status(400).json({ error: 'Please Provide API Token' }); @@ -34,15 +40,30 @@ export default async function createTemplate(request, response) { if (description) { object.set('Description', description); } - object.set('URL', file); + object.set('URL', fileUrl); object.set('CreatedBy', userId); object.set('ExtUserPtr', extUserPtr); if (signers) { - object.set('Signers', signers); + const placeholders = signers.map(x => ({ + email: x, + Id: randomId(), + Role: '', + blockColor: '', + signerObjId: '', + signerPtr: {}, + placeHolder: [], + })); + object.set('Placeholders', placeholders); } if (folderId) { object.set('Folder', folderPtr); } + const newACL = new Parse.ACL(); + newACL.setPublicReadAccess(false); + newACL.setPublicWriteAccess(false); + newACL.setReadAccess(id, true); + newACL.setWriteAccess(id, true); + object.setACL(newACL); const res = await object.save(null, { useMasterKey: true }); return response.json({ objectId: res.id, url: url }); } else { diff --git a/apps/OpenSignServer/cloud/parsefunction/DocumentAftersave.js b/apps/OpenSignServer/cloud/parsefunction/DocumentAftersave.js index 3fd3ad125..cd9964640 100644 --- a/apps/OpenSignServer/cloud/parsefunction/DocumentAftersave.js +++ b/apps/OpenSignServer/cloud/parsefunction/DocumentAftersave.js @@ -43,7 +43,9 @@ async function DocumentAftersave(request) { if (signers && signers.length > 0) { await updateAclDoc(request.object.id); } else { - await updateSelfDoc(request.object.id); + if (request?.object?.id) { + await updateSelfDoc(request.object.id); + } } } else { if (request.user) { @@ -51,7 +53,9 @@ async function DocumentAftersave(request) { if (signers && signers.length > 0) { await updateAclDoc(request.object.id); } else { - await updateSelfDoc(request.object.id); + if (request?.object?.id) { + await updateSelfDoc(request.object.id); + } } } } diff --git a/apps/OpenSignServer/databases/migrations/20240116170302-add_generatetoken_menu_cjs.cjs b/apps/OpenSignServer/databases/migrations/20240116170302-add_generatetoken_menu_cjs.cjs new file mode 100644 index 000000000..0059b0a6a --- /dev/null +++ b/apps/OpenSignServer/databases/migrations/20240116170302-add_generatetoken_menu_cjs.cjs @@ -0,0 +1,652 @@ +/** + * + * @param {Parse} Parse + */ +exports.up = async Parse => { + const className = 'w_menu'; + const userMenu = new Parse.Query(className); + const updateUserMenu = await userMenu.get('H9vRfEYKhT'); + updateUserMenu.set('menuItems', [ + { + icon: 'fas fa-tachometer-alt', + title: 'Dashboard', + target: '', + pageType: 'dashboard', + description: '', + objectId: '35KBoSgoAK', + }, + { + icon: 'far fa-newspaper', + title: 'New Document', + target: '_self', + pageType: null, + description: null, + objectId: null, + children: [ + { + icon: 'fas fa-pen-nib', + title: 'Sign yourself', + target: '_self', + pageType: 'form', + description: '', + objectId: 'sHAnZphf69', + }, + { + icon: 'fa-solid fa-paper-plane', + title: 'Request signatures', + target: '_self', + pageType: 'form', + description: '', + objectId: '8mZzFxbG1z', + }, + { + icon: 'fas fa-file-signature', + title: 'New template', + target: '_self', + pageType: 'form', + description: '', + objectId: 'template', + }, + ], + }, + { + icon: 'fa-solid fa-file-contract', + title: 'Templates', + target: '_self', + pageType: 'report', + description: '', + objectId: '6TeaPr321t', + }, + { + icon: 'fas fa-folder', + title: 'OpenSign™ Drive', + target: '_self', + pageType: 'mf', + description: '', + objectId: + 'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/legadrive', + }, + { + icon: 'fas fa-address-card', + title: 'Reports', + target: '_self', + pageType: null, + description: '', + objectId: null, + children: [ + { + icon: 'fas fa-signature', + title: 'Need your sign', + target: '_self', + pageType: 'report', + description: '', + objectId: '4Hhwbp482K', + }, + { + icon: 'fas fa-tasks', + title: 'In Progress', + target: '_self', + pageType: 'report', + description: '', + objectId: '1MwEuxLEkF', + }, + { + icon: 'fas fa-check-circle', + title: 'Completed', + target: '_self', + pageType: 'report', + description: '', + objectId: 'kQUoW4hUXz', + }, + { + icon: 'fas fa-edit', + title: 'Drafts', + target: '_self', + pageType: 'report', + description: '', + objectId: 'ByHuevtCFY', + }, + { + icon: 'fas fa-times-circle', + title: 'Declined', + target: '_self', + pageType: 'report', + description: '', + objectId: 'UPr2Fm5WY3', + }, + { + icon: 'fas fa-hourglass-end', + title: 'Expired', + target: '_self', + pageType: 'report', + description: '', + objectId: 'zNqBHXHsYH', + }, + { + icon: 'fa-solid fa-address-book', + title: 'Contactbook', + target: '_self', + pageType: 'report', + description: '', + objectId: '5KhaPr482K', + }, + ], + }, + { + icon: 'fas fa-cog', + title: 'Settings', + target: '_self', + pageType: null, + description: '', + objectId: null, + children: [ + { + icon: 'fas fa-pen-fancy', + title: 'My Signature', + target: '_self', + pageType: 'mf', + description: '', + objectId: + 'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/managesign', + }, + { + icon: 'fa-solid fa-key', + title: 'Generate token', + target: '_self', + pageType: 'generatetoken', + description: '', + objectId: '', + }, + ], + }, + ]); + + const AdminMenu = new Parse.Query(className); + const updateAdminMenu = await AdminMenu.get('VPh91h0ZHk'); + updateAdminMenu.set('menuItems', [ + { + icon: 'fas fa-tachometer-alt', + title: 'Dashboard', + target: '', + pageType: 'dashboard', + description: '', + objectId: '35KBoSgoAK', + }, + { + icon: 'far fa-newspaper', + title: 'New Document', + target: '_self', + pageType: null, + description: null, + objectId: null, + children: [ + { + icon: 'fas fa-pen-nib', + title: 'Sign yourself', + target: '_self', + pageType: 'form', + description: '', + objectId: 'sHAnZphf69', + }, + { + icon: 'fa-solid fa-paper-plane', + title: 'Request signatures', + target: '_self', + pageType: 'form', + description: '', + objectId: '8mZzFxbG1z', + }, + { + icon: 'fas fa-file-signature', + title: 'New template', + target: '_self', + pageType: 'form', + description: '', + objectId: 'template', + }, + ], + }, + { + icon: 'fa-solid fa-file-contract', + title: 'Templates', + target: '_self', + pageType: 'report', + description: '', + objectId: '6TeaPr321t', + }, + { + icon: 'fas fa-folder', + title: 'OpenSign™ Drive', + target: '_self', + pageType: 'mf', + description: '', + objectId: + 'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/legadrive', + }, + { + icon: 'fas fa-address-card', + title: 'Reports', + target: '_self', + pageType: null, + description: '', + objectId: null, + children: [ + { + icon: 'fas fa-signature', + title: 'Need your sign', + target: '_self', + pageType: 'report', + description: '', + objectId: '4Hhwbp482K', + }, + { + icon: 'fas fa-tasks', + title: 'In Progress', + target: '_self', + pageType: 'report', + description: '', + objectId: '1MwEuxLEkF', + }, + { + icon: 'fas fa-check-circle', + title: 'Completed', + target: '_self', + pageType: 'report', + description: '', + objectId: 'kQUoW4hUXz', + }, + { + icon: 'fas fa-edit', + title: 'Drafts', + target: '_self', + pageType: 'report', + description: '', + objectId: 'ByHuevtCFY', + }, + { + icon: 'fas fa-times-circle', + title: 'Declined', + target: '_self', + pageType: 'report', + description: '', + objectId: 'UPr2Fm5WY3', + }, + { + icon: 'fas fa-hourglass-end', + title: 'Expired', + target: '_self', + pageType: 'report', + description: '', + objectId: 'zNqBHXHsYH', + }, + { + icon: 'fa-solid fa-address-book', + title: 'Contactbook', + target: '_self', + pageType: 'report', + description: '', + objectId: '5KhaPr482K', + }, + ], + }, + { + icon: 'fas fa-cog', + title: 'Settings', + target: '_self', + pageType: null, + description: '', + objectId: null, + children: [ + { + icon: 'fas fa-pen-fancy', + title: 'My Signature', + target: '_self', + pageType: 'mf', + description: '', + objectId: + 'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/managesign', + }, + { + icon: 'far fa-user', + title: 'Add User', + target: '_self', + pageType: 'form', + description: '', + objectId: 'lM0xRnM3iE', + }, + { + icon: 'fa-solid fa-key', + title: 'Generate token', + target: '_self', + pageType: 'generatetoken', + description: '', + objectId: '', + }, + ], + }, + ]); + // TODO: Set the schema here + // Example: + // schema.addString('name').addNumber('cash'); + const batch = [updateUserMenu, updateAdminMenu]; + return Parse.Object.saveAll(batch, { useMasterKey: true }); +}; + +/** + * + * @param {Parse} Parse + */ +exports.down = async Parse => { + // TODO: set className here + const className = 'w_menu'; + const userMenu = new Parse.Query(className); + const revertUserMenu = await userMenu.get('H9vRfEYKhT'); + revertUserMenu.set('menuItems', [ + { + icon: 'fas fa-tachometer-alt', + title: 'Dashboard', + target: '', + pageType: 'dashboard', + description: '', + objectId: '35KBoSgoAK', + }, + { + icon: 'far fa-newspaper', + title: 'New Document', + target: '_self', + pageType: null, + description: null, + objectId: null, + children: [ + { + icon: 'fas fa-pen-nib', + title: 'Sign yourself', + target: '_self', + pageType: 'form', + description: '', + objectId: 'sHAnZphf69', + }, + { + icon: 'fa-solid fa-paper-plane', + title: 'Request signatures', + target: '_self', + pageType: 'form', + description: '', + objectId: '8mZzFxbG1z', + }, + { + icon: 'fas fa-file-signature', + title: 'New template', + target: '_self', + pageType: 'form', + description: '', + objectId: 'template', + }, + ], + }, + { + icon: 'fa-solid fa-file-contract', + title: 'Templates', + target: '_self', + pageType: 'report', + description: '', + objectId: '6TeaPr321t', + }, + { + icon: 'fas fa-folder', + title: 'OpenSign™ Drive', + target: '_self', + pageType: 'mf', + description: '', + objectId: + 'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/legadrive', + }, + { + icon: 'fas fa-address-card', + title: 'Reports', + target: '_self', + pageType: null, + description: '', + objectId: null, + children: [ + { + icon: 'fas fa-signature', + title: 'Need your sign', + target: '_self', + pageType: 'report', + description: '', + objectId: '4Hhwbp482K', + }, + { + icon: 'fas fa-tasks', + title: 'In Progress', + target: '_self', + pageType: 'report', + description: '', + objectId: '1MwEuxLEkF', + }, + { + icon: 'fas fa-check-circle', + title: 'Completed', + target: '_self', + pageType: 'report', + description: '', + objectId: 'kQUoW4hUXz', + }, + { + icon: 'fas fa-edit', + title: 'Drafts', + target: '_self', + pageType: 'report', + description: '', + objectId: 'ByHuevtCFY', + }, + { + icon: 'fas fa-times-circle', + title: 'Declined', + target: '_self', + pageType: 'report', + description: '', + objectId: 'UPr2Fm5WY3', + }, + { + icon: 'fas fa-hourglass-end', + title: 'Expired', + target: '_self', + pageType: 'report', + description: '', + objectId: 'zNqBHXHsYH', + }, + { + icon: 'fa-solid fa-address-book', + title: 'Contactbook', + target: '_self', + pageType: 'report', + description: '', + objectId: '5KhaPr482K', + }, + ], + }, + { + icon: 'fas fa-cog', + title: 'Settings', + target: '_self', + pageType: null, + description: '', + objectId: null, + children: [ + { + icon: 'fas fa-pen-fancy', + title: 'My Signature', + target: '_self', + pageType: 'mf', + description: '', + objectId: + 'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/managesign', + }, + ], + }, + ]); + + const adminMenu = new Parse.Query(className); + const revertAdminMenu = await adminMenu.get('VPh91h0ZHk'); + revertAdminMenu.set('menuItems', [ + { + icon: 'fas fa-tachometer-alt', + title: 'Dashboard', + target: '', + pageType: 'dashboard', + description: '', + objectId: '35KBoSgoAK', + }, + { + icon: 'far fa-newspaper', + title: 'New Document', + target: '_self', + pageType: null, + description: null, + objectId: null, + children: [ + { + icon: 'fas fa-pen-nib', + title: 'Sign yourself', + target: '_self', + pageType: 'form', + description: '', + objectId: 'sHAnZphf69', + }, + { + icon: 'fa-solid fa-paper-plane', + title: 'Request signatures', + target: '_self', + pageType: 'form', + description: '', + objectId: '8mZzFxbG1z', + }, + { + icon: 'fas fa-file-signature', + title: 'New template', + target: '_self', + pageType: 'form', + description: '', + objectId: 'template', + }, + ], + }, + { + icon: 'fa-solid fa-file-contract', + title: 'Templates', + target: '_self', + pageType: 'report', + description: '', + objectId: '6TeaPr321t', + }, + { + icon: 'fas fa-folder', + title: 'OpenSign™ Drive', + target: '_self', + pageType: 'mf', + description: '', + objectId: + 'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/legadrive', + }, + { + icon: 'fas fa-address-card', + title: 'Reports', + target: '_self', + pageType: null, + description: '', + objectId: null, + children: [ + { + icon: 'fas fa-signature', + title: 'Need your sign', + target: '_self', + pageType: 'report', + description: '', + objectId: '4Hhwbp482K', + }, + { + icon: 'fas fa-tasks', + title: 'In Progress', + target: '_self', + pageType: 'report', + description: '', + objectId: '1MwEuxLEkF', + }, + { + icon: 'fas fa-check-circle', + title: 'Completed', + target: '_self', + pageType: 'report', + description: '', + objectId: 'kQUoW4hUXz', + }, + { + icon: 'fas fa-edit', + title: 'Drafts', + target: '_self', + pageType: 'report', + description: '', + objectId: 'ByHuevtCFY', + }, + { + icon: 'fas fa-times-circle', + title: 'Declined', + target: '_self', + pageType: 'report', + description: '', + objectId: 'UPr2Fm5WY3', + }, + { + icon: 'fas fa-hourglass-end', + title: 'Expired', + target: '_self', + pageType: 'report', + description: '', + objectId: 'zNqBHXHsYH', + }, + { + icon: 'fa-solid fa-address-book', + title: 'Contactbook', + target: '_self', + pageType: 'report', + description: '', + objectId: '5KhaPr482K', + }, + ], + }, + { + icon: 'fas fa-cog', + title: 'Settings', + target: '_self', + pageType: null, + description: '', + objectId: null, + children: [ + { + icon: 'fas fa-pen-fancy', + title: 'My Signature', + target: '_self', + pageType: 'mf', + description: '', + objectId: + 'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/managesign', + }, + { + icon: 'far fa-user', + title: 'Add User', + target: '_self', + pageType: 'form', + description: '', + objectId: 'lM0xRnM3iE', + }, + ], + }, + ]); + // TODO: Set the schema here + // Example: + // schema.addString('name').addNumber('cash'); + const batch = [revertUserMenu, revertAdminMenu]; + return Parse.Object.saveAll(batch, { useMasterKey: true }); +};