diff --git a/api/src/controllers/projects.contentMapper.controller.ts b/api/src/controllers/projects.contentMapper.controller.ts index 797d5a9bf..6a22299c4 100644 --- a/api/src/controllers/projects.contentMapper.controller.ts +++ b/api/src/controllers/projects.contentMapper.controller.ts @@ -37,6 +37,11 @@ const resetContentType = async (req: Request, res: Response): Promise => { // res.status(200).json(resp); // }; +const removeContentMapper = async (req: Request, res: Response): Promise => { + const resp = await contentMapperService.removeContentMapper(req); + res.status(200).json(resp); +} + const getSingleContentTypes = async ( req: Request, res: Response @@ -53,5 +58,6 @@ export const contentMapperController = { putContentTypeFields, resetContentType, // removeMapping, - getSingleContentTypes + getSingleContentTypes, + removeContentMapper }; diff --git a/api/src/models/contentTypesMapper-lowdb.ts b/api/src/models/contentTypesMapper-lowdb.ts index 3846c998e..f28d4ad44 100644 --- a/api/src/models/contentTypesMapper-lowdb.ts +++ b/api/src/models/contentTypesMapper-lowdb.ts @@ -1,7 +1,7 @@ import { JSONFile } from "lowdb/node"; import LowWithLodash from "../utils/lowdb-lodash.utils.js"; -interface ContentTypesMapper { +export interface ContentTypesMapper { id: string; otherCmsTitle: string; otherCmsUid: string; diff --git a/api/src/routes/contentMapper.routes.ts b/api/src/routes/contentMapper.routes.ts index 1fc8ba35c..0fed1c01a 100644 --- a/api/src/routes/contentMapper.routes.ts +++ b/api/src/routes/contentMapper.routes.ts @@ -41,6 +41,11 @@ router.get( "/:projectId/:contentTypeUid", asyncRouter(contentMapperController.getSingleContentTypes) ); +//remove content mapper +router.get( + "/:orgId/:projectId/content-mapper", + asyncRouter(contentMapperController.removeContentMapper) +); export default router; diff --git a/api/src/services/contentMapper.service.ts b/api/src/services/contentMapper.service.ts index c21772457..bd0118c7c 100644 --- a/api/src/services/contentMapper.service.ts +++ b/api/src/services/contentMapper.service.ts @@ -21,6 +21,7 @@ import ProjectModelLowdb from "../models/project-lowdb.js"; import FieldMapperModel from "../models/FieldMapper.js"; import { v4 as uuidv4 } from "uuid"; import ContentTypesMapperModelLowdb from "../models/contentTypesMapper-lowdb.js"; +import { ContentTypesMapper } from "../models/contentTypesMapper-lowdb.js"; // Developer service to create dummy contentmapping data const putTestData = async (req: Request) => { @@ -524,7 +525,7 @@ const resetAllContentTypesMapping = async (projectId: string) => { try { const contentTypes = cData; for (const contentType of contentTypes) { - if (!isEmpty(contentType.fieldMapping)) { + if (contentType && !isEmpty(contentType.fieldMapping)) { for (const field of contentType.fieldMapping) { await FieldMapperModel.read(); const fieldData = FieldMapperModel.chain @@ -561,8 +562,10 @@ const resetAllContentTypesMapping = async (projectId: string) => { }); } } + } + return projectDetails; } catch (error: any) { logger.error( @@ -610,7 +613,7 @@ const removeMapping = async (projectId: string) => { //TODO: remove fieldMapping ids in ContentTypesMapperModel for each content types for (const contentType of contentTypes) { - if (!isEmpty(contentType.fieldMapping)) { + if (contentType && !isEmpty(contentType.fieldMapping)) { for (const field of contentType.fieldMapping) { await FieldMapperModel.read(); const fieldIndex = FieldMapperModel.chain @@ -706,6 +709,93 @@ const getSingleContentTypes = async (req: Request) => { schema: res?.data?.content_type?.schema, }; }; +const removeContentMapper = async (req: Request) => { + const projectId = req?.params?.projectId; + const srcFunc = "removeMapping"; + await ProjectModelLowdb.read(); + const projectDetails = ProjectModelLowdb.chain + .get("projects") + .find({ id: projectId }) + .value(); + + if (isEmpty(projectDetails)) { + logger.error( + getLogMessage( + srcFunc, + `${HTTP_TEXTS.PROJECT_NOT_FOUND} projectId: ${projectId}` + ) + ); + throw new BadRequestError(HTTP_TEXTS.PROJECT_NOT_FOUND); + } + await ContentTypesMapperModelLowdb.read(); + const cData: ContentTypesMapper[] = projectDetails?.content_mapper.map((cId: string) => { + const contentTypeData: ContentTypesMapper = ContentTypesMapperModelLowdb.chain + .get("ContentTypesMappers") + .find({ id: cId }) + .value(); + return contentTypeData; + }); + + try { + const contentTypes: ContentTypesMapper[] = cData; + //TODO: remove fieldMapping ids in ContentTypesMapperModel for each content types + + for (const contentType of contentTypes) { + if (contentType && !isEmpty(contentType.fieldMapping)) { + for (const field of contentType.fieldMapping) { + await FieldMapperModel.read(); + const fieldIndex = FieldMapperModel.chain + .get("field_mapper") + .findIndex({ id: field }) + .value(); + if (fieldIndex > -1) { + await FieldMapperModel.update((fData: any) => { + delete fData.field_mapper[fieldIndex]; + }); + } + } + } + await ContentTypesMapperModelLowdb.read(); + if (!isEmpty(contentType?.id)) { + const cIndex = ContentTypesMapperModelLowdb.chain + .get("ContentTypesMappers") + .findIndex({ id: contentType?.id }) + .value(); + if (cIndex > -1) { + await ContentTypesMapperModelLowdb.update((data: any) => { + delete data.ContentTypesMappers[cIndex]; + }); + } + } + } + + await ProjectModelLowdb.read(); + const projectIndex = ProjectModelLowdb.chain + .get("projects") + .findIndex({ id: projectId }) + .value(); + + if (projectIndex > -1) { + ProjectModelLowdb.update((data: any) => { + data.projects[projectIndex].content_mapper = []; + }); + } + return projectDetails; + } catch (error: any) { + logger.error( + getLogMessage( + srcFunc, + `Error occurred while removing the content mapping for the Project [Id: ${projectId}]`, + {}, + error + ) + ); + throw new ExceptionFunction( + error?.message || HTTP_TEXTS.INTERNAL_ERROR, + error?.statusCode || error?.status || HTTP_CODES.SERVER_ERROR + ); + } +}; export const contentMapperService = { putTestData, @@ -715,6 +805,7 @@ export const contentMapperService = { updateContentType, resetToInitialMapping, resetAllContentTypesMapping, + removeContentMapper, removeMapping, getSingleContentTypes }; diff --git a/api/src/services/projects.service.ts b/api/src/services/projects.service.ts index 337f05fa9..d4ce46625 100644 --- a/api/src/services/projects.service.ts +++ b/api/src/services/projects.service.ts @@ -25,9 +25,10 @@ import { v4 as uuidv4 } from "uuid"; const getAllProjects = async (req: Request) => { const orgId = req?.params?.orgId; - const decodedToken = req.body.token_payload; - const { user_id = "", region = "" } = decodedToken; + const decodedToken = req.body.token_payload; + const { user_id = "", region = "" } = decodedToken; + await ProjectModelLowdb.read(); const projects = ProjectModelLowdb.chain .get("projects") diff --git a/ui/package-lock.json b/ui/package-lock.json index d5e165910..d2cab51b3 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@contentstack/json-rte-serializer": "^2.0.5", - "@contentstack/venus-components": "1.5.1", + "@contentstack/venus-components": "^2.2.4", "@reduxjs/toolkit": "^2.2.5", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", @@ -2035,15 +2035,18 @@ } }, "node_modules/@contentstack/venus-components": { - "version": "1.5.1", - "resolved": "https://npm.pkg.github.com/download/@contentstack/venus-components/1.5.1/463c96c30d838f3fe4c5c9b47cd152527f0bd367", - "integrity": "sha512-wLZPaokr/Q3DHuRGOU1AC9tPrTDitvjDGpcOWuzeexFmWFXE8RRwy8IPLXhDUm7ofYCoi8FD7sDGdJ2bU/eGyA==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@contentstack/venus-components/-/venus-components-2.2.4.tgz", + "integrity": "sha512-/Dijz5LDSR/UMxJtT0e7AWZnLXFuRBe6JamksOGXHOQQaEKYvye0oaQfSQq8Mjmb+D9WAN5BXOfMRBhzZA+aQQ==", "dependencies": { "@emotion/css": "^11.1.3", + "@testing-library/react-hooks": "^8.0.1", "@tippyjs/react": "^4.1.0", "array-move": "^3.0.1", "axios": "0.25.0", "browser-detect": "^0.2.28", + "cache": "^3.0.0", + "clean": "^4.0.2", "collapse-whitespace": "^1.1.7", "detect-browser": "^5.3.0", "dompurify": "^2.4.1", @@ -2060,11 +2063,12 @@ "react-ace": "^9.1.4", "react-beautiful-dnd": "^13.0.0", "react-color": "^2.19.3", - "react-datepicker": "^3.3.0", - "react-dnd": "^11.1.3", + "react-datepicker": "^4.25.0", + "react-dnd-11": "npm:react-dnd@^11.1.3", "react-dnd-html5-backend": "^11.1.3", "react-dropzone": "^11.2.4", "react-infinite-scroll-component": "^6.1.0", + "react-input-mask": "^3.0.0-alpha.2", "react-mentions": "^4.4.7", "react-modal": "^3.11.2", "react-redux": "^7.2.1", @@ -2078,6 +2082,7 @@ "react-tiktok": "^1.0.0", "react-toastify": "6.1.0", "react-treebeard": "^3.2.4", + "react-virtualized": "^9.22.5", "react-virtualized-auto-sizer": "1.0.5", "react-window": "^1.8.5", "react-window-infinite-loader": "^1.0.5", @@ -2092,6 +2097,7 @@ "slate-react": "^0.77.4", "storybook-addon-whats-new": "^1.0.3", "systemjs": "^6.10.2", + "user-event": "^4.0.0", "uuid": "^8.3.2" }, "peerDependencies": { @@ -2152,6 +2158,54 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, + "node_modules/@contentstack/venus-components/node_modules/@testing-library/react-hooks": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz", + "integrity": "sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "react-error-boundary": "^3.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0", + "react": "^16.9.0 || ^17.0.0", + "react-dom": "^16.9.0 || ^17.0.0", + "react-test-renderer": "^16.9.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-test-renderer": { + "optional": true + } + } + }, + "node_modules/@contentstack/venus-components/node_modules/@types/react": { + "version": "17.0.80", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.80.tgz", + "integrity": "sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA==", + "optional": true, + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "^0.16", + "csstype": "^3.0.2" + } + }, + "node_modules/@contentstack/venus-components/node_modules/@types/react/node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "optional": true, + "peer": true + }, "node_modules/@contentstack/venus-components/node_modules/axios": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", @@ -2165,25 +2219,6 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" }, - "node_modules/@contentstack/venus-components/node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@contentstack/venus-components/node_modules/react-ace": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-9.5.0.tgz", @@ -2200,39 +2235,6 @@ "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@contentstack/venus-components/node_modules/react-datepicker": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-3.8.0.tgz", - "integrity": "sha512-iFVNEp8DJoX5yEvEiciM7sJKmLGrvE70U38KhpG13XrulNSijeHw1RZkhd/0UmuXR71dcZB/kdfjiidifstZjw==", - "dependencies": { - "classnames": "^2.2.6", - "date-fns": "^2.0.1", - "prop-types": "^15.7.2", - "react-onclickoutside": "^6.10.0", - "react-popper": "^1.3.8" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17", - "react-dom": "^16.9.0 || ^17" - } - }, - "node_modules/@contentstack/venus-components/node_modules/react-datepicker/node_modules/react-popper": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", - "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "@hypnosphi/create-react-context": "^0.3.1", - "deep-equal": "^1.1.1", - "popper.js": "^1.14.4", - "prop-types": "^15.6.1", - "typed-styles": "^0.0.7", - "warning": "^4.0.2" - }, - "peerDependencies": { - "react": "0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, "node_modules/@contentstack/venus-components/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -3133,19 +3135,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" }, - "node_modules/@hypnosphi/create-react-context": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", - "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", - "dependencies": { - "gud": "^1.0.0", - "warning": "^4.0.3" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": ">=0.14.0" - } - }, "node_modules/@icons/material": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", @@ -8040,6 +8029,14 @@ "node": ">= 0.8" } }, + "node_modules/cache": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cache/-/cache-3.0.0.tgz", + "integrity": "sha512-sNoM5jithfalxIceo/uFFm5bOlGjux2y8jEvjNb0F/cACWQaMmWuEPTLl6GzLHdFcNsbWBBdqkBd9NyefZ5UQQ==", + "dependencies": { + "ds": "^1.4.2" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -8213,6 +8210,17 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, + "node_modules/clean": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/clean/-/clean-4.0.2.tgz", + "integrity": "sha512-2LGVh4dNtI16L4UzqDHO6Hbl74YjG1vWvEUU78dgLO4kuyqJZFMNMPBx+EGtYKTFb14e24p+gWXgkabqxc1EUw==", + "dependencies": { + "async": "^0.9.0", + "minimist": "^1.1.0", + "mix2": "^1.0.0", + "skema": "^1.0.0" + } + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -8232,6 +8240,11 @@ "node": ">=0.10.0" } }, + "node_modules/clean/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==" + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -9643,6 +9656,11 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, + "node_modules/ds": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/ds/-/ds-1.4.2.tgz", + "integrity": "sha512-d5nMCjfod+srvE/1Bnt/u+L++6N8KJx3ZAi95AGp0g6RtfuGDNlGciWL/iiwKHsFVBVnA3/HEFUq5SW1NgTQ3Q==" + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -11709,11 +11727,6 @@ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, - "node_modules/gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -17126,6 +17139,14 @@ "sourcemap-codec": "^1.4.8" } }, + "node_modules/make-array": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/make-array/-/make-array-0.1.2.tgz", + "integrity": "sha512-bcFmxgZ+OTaMYJp/w6eifElKTcfum7Gi5H7vQ8KzAf9X6swdxkVuilCaG3ZjXr/qJsQT4JJ2Rq9SDYScWEdu9Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -17389,6 +17410,14 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mix2": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mix2/-/mix2-1.0.5.tgz", + "integrity": "sha512-ybWz7nY+WHBBIyliND5eYaJKzkoa+qXRYNTmVqAxSLlFtL/umT2iv+pmyTu1oU7WNkrirwheqR8d9EaKVz0e5g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -18098,16 +18127,6 @@ "node": ">=4" } }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/postcss": { "version": "8.4.33", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", @@ -19758,6 +19777,23 @@ "react": "*" } }, + "node_modules/react-datepicker": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.25.0.tgz", + "integrity": "sha512-zB7CSi44SJ0sqo8hUQ3BF1saE/knn7u25qEMTO1CQGofY1VAKahO8k9drZtp0cfW1DMfoYLR3uSY1/uMvbEzbg==", + "dependencies": { + "@popperjs/core": "^2.11.8", + "classnames": "^2.2.6", + "date-fns": "^2.30.0", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.13.0", + "react-popper": "^2.3.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18", + "react-dom": "^16.9.0 || ^17 || ^18" + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -19875,7 +19911,8 @@ "node": ">=8" } }, - "node_modules/react-dnd": { + "node_modules/react-dnd-11": { + "name": "react-dnd", "version": "11.1.3", "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-11.1.3.tgz", "integrity": "sha512-8rtzzT8iwHgdSC89VktwhqdKKtfXaAyC4wiqp0SywpHG12TTLvfOoL6xNEIUWXwIEWu+CFfDn4GZJyynCEuHIQ==", @@ -19926,6 +19963,21 @@ "react": ">= 16.8" } }, + "node_modules/react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, "node_modules/react-error-overlay": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", @@ -19977,6 +20029,20 @@ "react": ">=16.0.0" } }, + "node_modules/react-input-mask": { + "version": "3.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/react-input-mask/-/react-input-mask-3.0.0-alpha.2.tgz", + "integrity": "sha512-9U7qL+mvDMOJcbOFPdt6Vj+zzmCMNnBjhhjGDrL8BGQmymgvMVKhu/oOVfAkl+5VWOsLr+G3EhZOmae5fBcAkA==", + "dependencies": { + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -20034,9 +20100,9 @@ } }, "node_modules/react-onclickoutside": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz", - "integrity": "sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.1.tgz", + "integrity": "sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w==", "funding": { "type": "individual", "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" @@ -20046,6 +20112,20 @@ "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" } }, + "node_modules/react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.2.tgz", @@ -20412,6 +20492,23 @@ "react-dom": "^15.3.0 || ^16.0.0" } }, + "node_modules/react-virtualized": { + "version": "9.22.5", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz", + "integrity": "sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-window": { "version": "1.8.10", "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.10.tgz", @@ -21443,6 +21540,21 @@ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, + "node_modules/skema": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/skema/-/skema-1.0.2.tgz", + "integrity": "sha512-5LWfF2RSW2B3xfOaY6j49X8aNwsnj9cRVrM5QMF7it+cZvpv5ufiOUT13ps2U52sIbAzs11bdRP6mi5qyg75VQ==", + "dependencies": { + "async": "^0.9.0", + "make-array": "^0.1.2", + "mix2": "^1.0.0" + } + }, + "node_modules/skema/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==" + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -22784,11 +22896,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typed-styles": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", - "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" - }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -22972,6 +23079,12 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/user-event": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/user-event/-/user-event-4.0.0.tgz", + "integrity": "sha512-M2at0vzLqzrwZNBmtPDRyd+1BaRwU9UTG7sc+MrUZmGviR/Ws8tmXxVvfRvuv7TWWIDsLqbrMvoF1sF7DW4y5w==", + "deprecated": "user-event has moved to @testing-library/user-event. Please uninstall user-event and install @testing-library/user-event instead, or use an older version of user-event. Learn more about this change here: https://github.com/testing-library/dom-testing-library/issues/260 Thanks! :)" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/ui/src/common/assets/icons.tsx b/ui/src/common/assets/icons.tsx index ac841d3e9..179668e2e 100644 --- a/ui/src/common/assets/icons.tsx +++ b/ui/src/common/assets/icons.tsx @@ -763,3 +763,11 @@ export const SEARCH_ICON = ( /> ); + +export const LOG_OUT = ( + + + + + +); \ No newline at end of file diff --git a/ui/src/components/Common/AddStack/addStack.tsx b/ui/src/components/Common/AddStack/addStack.tsx index cb842f5e6..0c44f7865 100644 --- a/ui/src/components/Common/AddStack/addStack.tsx +++ b/ui/src/components/Common/AddStack/addStack.tsx @@ -19,30 +19,32 @@ import { // Services import { getCMSDataFromFile } from '../../../cmsData/cmsSelector'; -import { getAllLocales } from '../../../services/api/user.service'; - // Utilities import { CS_ENTRIES } from '../../../utilities/constants'; -import { validateObject } from '../../../utilities/functions'; - // Interface -import { AddStackCMSData, defaultAddStackCMSData, AddStackProps, StackData, Response, Stack, Errors } from './addStack.interface'; -import { IDropDown } from '../../../context/app/app.interface'; - +import { AddStackCMSData, defaultAddStackCMSData } from './addStack.interface'; // Styles import './addStack.scss'; +import { getAllLocales } from '../../../services/api/user.service'; +import { validateObject } from '../../../utilities/functions'; +import { IDropDown } from '../../../context/app/app.interface'; +export interface Stack { + name: string; + description: string; + locale: string; +} -const AddStack = (props: AddStackProps): JSX.Element => { +const AddStack = (props: any): JSX.Element => { const [isProcessing, setIsProcessing] = useState(false); const [isLoading, setIsLoading] = useState(true); const [allLocales, setAllLocales] = useState([]); const [addStackCMSData, setAddStackCMSData] = useState(defaultAddStackCMSData); - const onSubmit = async (formData: StackData) => { + const onSubmit = async (formData: any) => { setIsProcessing(true); - const resp = props?.onSubmit({ + const resp = await props?.onSubmit({ name: formData?.name || props?.defaultValues?.name, description: formData?.description || props?.defaultValues?.description, locale: formData?.locale?.value || props?.defaultValues?.locale @@ -74,14 +76,14 @@ const AddStack = (props: AddStackProps): JSX.Element => { setAddStackCMSData(data); setIsLoading(false); }) - .catch((err: string) => { + .catch((err: any) => { console.error(err); setIsLoading(false); }); //fetch all locales getAllLocales(props?.selectedOrganisation) - .then((response: Response) => { + .then((response: any) => { const rawMappedLocalesMapped = validateObject(response?.data) && response?.data?.locales ? Object?.keys(response?.data?.locales)?.map((key) => ({ @@ -95,7 +97,7 @@ const AddStack = (props: AddStackProps): JSX.Element => { : []; setAllLocales(rawMappedLocalesMapped); }) - .catch((err: string) => { + .catch((err: any) => { console.error(err); }); //org id will always be there @@ -112,16 +114,12 @@ const AddStack = (props: AddStackProps): JSX.Element => { { - const errors: Errors = { - name: '', - description: '', - locale: '' - }; - if (!values?.name || values?.name?.trim().length < 1) { + validate={(values): any => { + const errors: any = {}; + if (!values?.name || values?.name?.trim().lenght < 1) { errors.name = 'Stack name required'; } - if (!values?.locale) { + if (!values?.locale || values?.locale === '') { errors.locale = 'Required'; } return errors; @@ -154,7 +152,7 @@ const AddStack = (props: AddStackProps): JSX.Element => { testId="cs-stack-create-title-input" version="v2" {...input} - onChange={(event: React.ChangeEvent) => { + onChange={(event: any): any => { input?.onChange(event); }} name="name" @@ -178,7 +176,7 @@ const AddStack = (props: AddStackProps): JSX.Element => { - {({ input }) => { + {({ input }): any => { return (
@@ -195,10 +193,11 @@ const AddStack = (props: AddStackProps): JSX.Element => { className="Description-field" {...input} name="description" - onChange={(event: React.ChangeEvent) => { + onChange={(event: any): any => { input?.onChange(event); - } } - placeholder={addStackCMSData?.stack_description_placeholder} /> + }} + placeholder={addStackCMSData?.stack_description_placeholder} + />
); @@ -207,7 +206,7 @@ const AddStack = (props: AddStackProps): JSX.Element => {
- {({ input, meta }) => { + {({ input, meta }): any => { return ( <> {