From 7baf8400ca370d523e74fa6406863432a2ff66f2 Mon Sep 17 00:00:00 2001 From: Youssef Khedher Date: Tue, 18 Jan 2022 14:35:50 +0100 Subject: [PATCH 1/5] feat: add create and edit screen for tag-types (NEW) (#603) * feat: add create and edit screen for tag-types * feat: update Edit and create component with permissions * refactor: add TagForm type to react FC * fix: routes * fix: add edit button * fix: update snapshot * fix: update permission * fix: permission Co-authored-by: Fredrik Oseberg --- .../__snapshots__/routes-test.jsx.snap | 9 -- frontend/src/component/menu/routes.js | 24 +---- .../providers/AccessProvider/permissions.ts | 1 - .../component/tag-types/TagType.module.scss | 4 + .../tag-types/TagTypeList/TagTypeList.jsx | 51 +++++++---- .../tag-type-list-component-test.js.snap | 38 +------- .../__tests__/tag-type-list-component-test.js | 65 +++++++------ .../tagTypes/CreateTagType/CreateTagType.tsx | 91 +++++++++++++++++++ .../tagTypes/EditTagType/EditTagType.tsx | 89 ++++++++++++++++++ .../TagTypeForm/TagTypeForm.styles.ts | 47 ++++++++++ .../tagTypes/TagTypeForm/TagTypeForm.tsx | 77 ++++++++++++++++ .../component/tagTypes/hooks/useTagForm.ts | 69 ++++++++++++++ .../src/component/tags/TagList/TagList.jsx | 7 +- .../actions/useTagTypesApi/useTagTypesApi.ts | 75 +++++++++++++++ .../api/getters/useTagType/useTagType.ts | 41 +++++++++ frontend/src/interfaces/tags.ts | 5 + frontend/tsconfig.json | 4 +- 17 files changed, 579 insertions(+), 118 deletions(-) create mode 100644 frontend/src/component/tagTypes/CreateTagType/CreateTagType.tsx create mode 100644 frontend/src/component/tagTypes/EditTagType/EditTagType.tsx create mode 100644 frontend/src/component/tagTypes/TagTypeForm/TagTypeForm.styles.ts create mode 100644 frontend/src/component/tagTypes/TagTypeForm/TagTypeForm.tsx create mode 100644 frontend/src/component/tagTypes/hooks/useTagForm.ts create mode 100644 frontend/src/hooks/api/actions/useTagTypesApi/useTagTypesApi.ts create mode 100644 frontend/src/hooks/api/getters/useTagType/useTagType.ts diff --git a/frontend/src/component/menu/__tests__/__snapshots__/routes-test.jsx.snap b/frontend/src/component/menu/__tests__/__snapshots__/routes-test.jsx.snap index 46d9dbc194..7cabf10fb7 100644 --- a/frontend/src/component/menu/__tests__/__snapshots__/routes-test.jsx.snap +++ b/frontend/src/component/menu/__tests__/__snapshots__/routes-test.jsx.snap @@ -263,15 +263,6 @@ Array [ "title": "Tag types", "type": "protected", }, - Object { - "component": [Function], - "layout": "main", - "menu": Object {}, - "parent": "/tags", - "path": "/tags/create", - "title": "Create", - "type": "protected", - }, Object { "component": [Function], "layout": "main", diff --git a/frontend/src/component/menu/routes.js b/frontend/src/component/menu/routes.js index ede9e30b5d..84e07aeb28 100644 --- a/frontend/src/component/menu/routes.js +++ b/frontend/src/component/menu/routes.js @@ -15,10 +15,6 @@ import CreateContextField from '../../page/context/create'; import EditContextField from '../../page/context/edit'; import CreateProject from '../../page/project/create'; import ListTagTypes from '../../page/tag-types'; -import CreateTagType from '../../page/tag-types/create'; -import EditTagType from '../../page/tag-types/edit'; -import ListTags from '../../page/tags'; -import CreateTag from '../../page/tags/create'; import Addons from '../../page/addons'; import AddonsCreate from '../../page/addons/create'; import AddonsEdit from '../../page/addons/edit'; @@ -48,6 +44,8 @@ import CreateApiToken from '../admin/api-token/CreateApiToken/CreateApiToken'; import CreateEnvironment from '../environments/CreateEnvironment/CreateEnvironment'; import EditEnvironment from '../environments/EditEnvironment/EditEnvironment'; +import EditTagType from '../tagTypes/EditTagType/EditTagType'; +import CreateTagType from '../tagTypes/CreateTagType/CreateTagType'; export const routes = [ // Project @@ -304,24 +302,6 @@ export const routes = [ layout: 'main', menu: { mobile: true, advanced: true }, }, - { - path: '/tags/create', - parent: '/tags', - title: 'Create', - component: CreateTag, - type: 'protected', - layout: 'main', - menu: {}, - }, - { - path: '/tags', - title: 'Tags', - component: ListTags, - hidden: true, - type: 'protected', - layout: 'main', - menu: {}, - }, // Addons { diff --git a/frontend/src/component/providers/AccessProvider/permissions.ts b/frontend/src/component/providers/AccessProvider/permissions.ts index 64e559d21e..6809c65369 100644 --- a/frontend/src/component/providers/AccessProvider/permissions.ts +++ b/frontend/src/component/providers/AccessProvider/permissions.ts @@ -13,7 +13,6 @@ export const DELETE_CONTEXT_FIELD = 'DELETE_CONTEXT_FIELD'; export const CREATE_PROJECT = 'CREATE_PROJECT'; export const UPDATE_PROJECT = 'UPDATE_PROJECT'; export const DELETE_PROJECT = 'DELETE_PROJECT'; -export const CREATE_TAG_TYPE = 'CREATE_TAG_TYPE'; export const DELETE_TAG_TYPE = 'DELETE_TAG_TYPE'; export const UPDATE_TAG_TYPE = 'UPDATE_TAG_TYPE'; export const CREATE_TAG = 'CREATE_TAG'; diff --git a/frontend/src/component/tag-types/TagType.module.scss b/frontend/src/component/tag-types/TagType.module.scss index a04d180a6d..d24001c135 100644 --- a/frontend/src/component/tag-types/TagType.module.scss +++ b/frontend/src/component/tag-types/TagType.module.scss @@ -2,6 +2,10 @@ min-width: 100px; } +.icon { + fill: #757575; +} + .textfield { margin-left: 15px; } diff --git a/frontend/src/component/tag-types/TagTypeList/TagTypeList.jsx b/frontend/src/component/tag-types/TagTypeList/TagTypeList.jsx index 46a984ee9e..e8e3cdce38 100644 --- a/frontend/src/component/tag-types/TagTypeList/TagTypeList.jsx +++ b/frontend/src/component/tag-types/TagTypeList/TagTypeList.jsx @@ -1,7 +1,6 @@ -import { useContext, useEffect, useState } from 'react'; +import { useContext, useState } from 'react'; import PropTypes from 'prop-types'; import { Link, useHistory } from 'react-router-dom'; - import { List, ListItem, @@ -11,38 +10,53 @@ import { Button, Tooltip, } from '@material-ui/core'; -import { Add, Delete, Label } from '@material-ui/icons'; - +import { Add, Delete, Edit, Label } from '@material-ui/icons'; import HeaderTitle from '../../common/HeaderTitle'; import PageContent from '../../common/PageContent/PageContent'; import ConditionallyRender from '../../common/ConditionallyRender/ConditionallyRender'; import { - CREATE_TAG_TYPE, DELETE_TAG_TYPE, + UPDATE_TAG_TYPE, } from '../../providers/AccessProvider/permissions'; import Dialogue from '../../common/Dialogue/Dialogue'; import useMediaQuery from '@material-ui/core/useMediaQuery'; - import styles from '../TagType.module.scss'; import AccessContext from '../../../contexts/AccessContext'; +import useTagTypesApi from '../../../hooks/api/actions/useTagTypesApi/useTagTypesApi'; +import useTagTypes from '../../../hooks/api/getters/useTagTypes/useTagTypes'; +import useToast from '../../../hooks/useToast'; +import PermissionIconButton from '../../common/PermissionIconButton/PermissionIconButton'; -const TagTypeList = ({ tagTypes, fetchTagTypes, removeTagType }) => { +const TagTypeList = () => { const { hasAccess } = useContext(AccessContext); const [deletion, setDeletion] = useState({ open: false }); const history = useHistory(); const smallScreen = useMediaQuery('(max-width:700px)'); + const { deleteTagType } = useTagTypesApi(); + const { tagTypes, refetch } = useTagTypes(); + const { setToastData, setToastApiError } = useToast(); - useEffect(() => { - fetchTagTypes(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + const deleteTag = async () => { + try { + await deleteTagType(deletion.name); + refetch(); + setDeletion({ open: false }); + setToastData({ + type: 'success', + show: true, + text: 'Successfully deleted tag type.', + }); + } catch (e) { + setToastApiError(e.toString()); + } + }; let header = ( { ); + return ( {