diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/teams/index.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/teams/index.tsx
index 81c08ef75da..68ec3acb577 100644
--- a/openmetadata-ui/src/main/resources/ui/src/pages/teams/index.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/pages/teams/index.tsx
@@ -14,7 +14,9 @@
import { AxiosError, AxiosResponse } from 'axios';
import classNames from 'classnames';
import { compare } from 'fast-json-patch';
+import { isUndefined, toLower } from 'lodash';
import { observer } from 'mobx-react';
+import { FormErrorData } from 'Models';
import React, { useEffect, useState } from 'react';
import { Link, useHistory, useParams } from 'react-router-dom';
import AppState from '../../AppState';
@@ -40,6 +42,7 @@ import {
import { Team } from '../../generated/entity/teams/team';
import { User } from '../../generated/entity/teams/user';
import { useAuth } from '../../hooks/authHooks';
+import useToastContext from '../../hooks/useToastContext';
import { UserTeam } from '../../interface/team.interface';
import { getActiveCatClass, getCountBadge } from '../../utils/CommonUtils';
import AddUsersModal from './AddUsersModal';
@@ -59,6 +62,9 @@ const TeamsPage = () => {
const [isAddingTeam, setIsAddingTeam] = useState
(false);
const [isAddingUsers, setIsAddingUsers] = useState(false);
const [userList, setUserList] = useState>([]);
+ const [errorData, setErrorData] = useState();
+
+ const showToast = useToastContext();
const fetchTeams = () => {
setIsLoading(true);
@@ -100,16 +106,48 @@ const TeamsPage = () => {
}
};
+ const onNewDataChange = (data: Team, forceSet = false) => {
+ if (errorData || forceSet) {
+ const errData: { [key: string]: string } = {};
+ if (!data.name.trim()) {
+ errData['name'] = 'Name is required';
+ } else if (
+ !isUndefined(
+ teams.find((item) => toLower(item.name) === toLower(data.name))
+ )
+ ) {
+ errData['name'] = 'Name already exists';
+ }
+ if (!data.displayName?.trim()) {
+ errData['displayName'] = 'Display name is required';
+ }
+ setErrorData(errData);
+
+ return errData;
+ }
+
+ return {};
+ };
+
const createNewTeam = (data: Team) => {
- createTeam(data)
- .then((res: AxiosResponse) => {
- if (res.data) {
- fetchTeams();
- }
- })
- .finally(() => {
- setIsAddingTeam(false);
- });
+ const errData = onNewDataChange(data, true);
+ if (!Object.values(errData).length) {
+ createTeam(data)
+ .then((res: AxiosResponse) => {
+ if (res.data) {
+ fetchTeams();
+ }
+ })
+ .catch((error: AxiosError) => {
+ showToast({
+ variant: 'error',
+ body: error.message ?? 'Something went wrong!',
+ });
+ })
+ .finally(() => {
+ setIsAddingTeam(false);
+ });
+ }
};
const createUsers = (data: Array) => {
@@ -280,7 +318,10 @@ const TeamsPage = () => {
size="small"
theme="primary"
variant="contained"
- onClick={() => setIsAddingTeam(true)}>
+ onClick={() => {
+ setErrorData(undefined);
+ setIsAddingTeam(true);
+ }}>
@@ -440,6 +481,7 @@ const TeamsPage = () => {
{isAddingTeam && (
{
displayName: '',
}}
onCancel={() => setIsAddingTeam(false)}
+ onChange={(data) => onNewDataChange(data as Team)}
onSave={(data) => createNewTeam(data as Team)}
/>
)}
diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/CommonUtils.tsx b/openmetadata-ui/src/main/resources/ui/src/utils/CommonUtils.tsx
index 3e1581b82c7..1dce286091c 100644
--- a/openmetadata-ui/src/main/resources/ui/src/utils/CommonUtils.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/utils/CommonUtils.tsx
@@ -278,3 +278,11 @@ export const getOwnerIds = (
export const getActiveCatClass = (name: string, activeName = '') => {
return activeName === name ? 'activeCategory' : '';
};
+
+export const errorMsg = (value: string) => {
+ return (
+
+ {value}
+
+ );
+};