mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-08-24 00:48:36 +00:00
fix(ui): activity feed settings page ui updates (#7227)
This commit is contained in:
parent
9be3df4a1e
commit
d6d18886d2
@ -264,21 +264,25 @@ export const AuthProvider = ({
|
|||||||
* It will try for max 3 times if it's not succeed then it will proceed for logout
|
* It will try for max 3 times if it's not succeed then it will proceed for logout
|
||||||
*/
|
*/
|
||||||
const trySilentSignIn = () => {
|
const trySilentSignIn = () => {
|
||||||
// Try to renew token
|
const pathName = location.pathname;
|
||||||
silentSignInRetries < 3
|
// Do not try silent sign in for SignIn or SignUp route
|
||||||
? renewIdToken()
|
if ([ROUTES.SIGNIN, ROUTES.SIGNUP].indexOf(pathName) === -1) {
|
||||||
.then(() => {
|
// Try to renew token
|
||||||
silentSignInRetries = 0;
|
silentSignInRetries < 3
|
||||||
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
? renewIdToken()
|
||||||
startTokenExpiryTimer();
|
.then(() => {
|
||||||
})
|
silentSignInRetries = 0;
|
||||||
.catch((err) => {
|
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
||||||
// eslint-disable-next-line no-console
|
startTokenExpiryTimer();
|
||||||
console.error('Error while attempting for silent signIn. ', err);
|
})
|
||||||
silentSignInRetries += 1;
|
.catch((err) => {
|
||||||
trySilentSignIn();
|
// eslint-disable-next-line no-console
|
||||||
})
|
console.error('Error while attempting for silent signIn. ', err);
|
||||||
: onLogoutHandler(); // Logout if we reaches max silent signIn limit;
|
silentSignInRetries += 1;
|
||||||
|
trySilentSignIn();
|
||||||
|
})
|
||||||
|
: onLogoutHandler(); // Logout if we reaches max silent signIn limit;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -22,7 +22,7 @@ import React, {
|
|||||||
useMemo,
|
useMemo,
|
||||||
} from 'react';
|
} from 'react';
|
||||||
import { Callback, makeAuthenticator, makeUserManager } from 'react-oidc';
|
import { Callback, makeAuthenticator, makeUserManager } from 'react-oidc';
|
||||||
import { Redirect, Route, Switch } from 'react-router-dom';
|
import { Redirect, Route, Switch, useHistory } from 'react-router-dom';
|
||||||
import AppState from '../../AppState';
|
import AppState from '../../AppState';
|
||||||
import Loader from '../../components/Loader/Loader';
|
import Loader from '../../components/Loader/Loader';
|
||||||
import { oidcTokenKey, ROUTES } from '../../constants/constants';
|
import { oidcTokenKey, ROUTES } from '../../constants/constants';
|
||||||
@ -74,6 +74,7 @@ const OidcAuthenticator = forwardRef<AuthenticatorRef, Props>(
|
|||||||
setIsSigningIn,
|
setIsSigningIn,
|
||||||
setLoadingIndicator,
|
setLoadingIndicator,
|
||||||
} = useAuthContext();
|
} = useAuthContext();
|
||||||
|
const history = useHistory();
|
||||||
const { userDetails, newUser } = AppState;
|
const { userDetails, newUser } = AppState;
|
||||||
const userManager = useMemo(
|
const userManager = useMemo(
|
||||||
() => makeUserManager(userConfig),
|
() => makeUserManager(userConfig),
|
||||||
@ -148,6 +149,12 @@ const OidcAuthenticator = forwardRef<AuthenticatorRef, Props>(
|
|||||||
<>
|
<>
|
||||||
<Callback
|
<Callback
|
||||||
userManager={userManager}
|
userManager={userManager}
|
||||||
|
onError={(error) => {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(error);
|
||||||
|
|
||||||
|
history.push(ROUTES.SIGNIN);
|
||||||
|
}}
|
||||||
onSuccess={(user) => {
|
onSuccess={(user) => {
|
||||||
localStorage.setItem(oidcTokenKey, user.id_token);
|
localStorage.setItem(oidcTokenKey, user.id_token);
|
||||||
}}
|
}}
|
||||||
|
@ -23,7 +23,6 @@ export type OperationPermission = {
|
|||||||
|
|
||||||
export enum ResourceEntity {
|
export enum ResourceEntity {
|
||||||
ALL = 'all',
|
ALL = 'all',
|
||||||
ACTIVITY_FEED = 'activityFeed',
|
|
||||||
BOT = 'bot',
|
BOT = 'bot',
|
||||||
CHART = 'chart',
|
CHART = 'chart',
|
||||||
DASHBOARD = 'dashboard',
|
DASHBOARD = 'dashboard',
|
||||||
|
@ -2,15 +2,18 @@
|
|||||||
.ant-tree-list-holder-inner {
|
.ant-tree-list-holder-inner {
|
||||||
margin-left: -16px;
|
margin-left: -16px;
|
||||||
}
|
}
|
||||||
.ant-tree-list-holder {
|
|
||||||
padding: 0.5rem;
|
|
||||||
}
|
|
||||||
.ant-tree-switcher.ant-tree-switcher_open {
|
.ant-tree-switcher.ant-tree-switcher_open {
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ant-tree-node-content-wrapper {
|
.ant-tree-node-content-wrapper {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
margin-left: -8px;
|
.ant-divider.ant-divider-horizontal {
|
||||||
|
margin: 16px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-page-card-container {
|
||||||
|
box-shadow: 1px 1px 3px 0px rgb(0 0 0 / 12%);
|
||||||
|
border: 1px #dde3ea solid;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,15 @@
|
|||||||
/* eslint-disable @typescript-eslint/camelcase */
|
/* eslint-disable @typescript-eslint/camelcase */
|
||||||
import { Button, Card, Col, Divider, Row, Space, Tree, Typography } from 'antd';
|
import {
|
||||||
|
Button,
|
||||||
|
Card,
|
||||||
|
Col,
|
||||||
|
Divider,
|
||||||
|
Row,
|
||||||
|
Space,
|
||||||
|
Tooltip,
|
||||||
|
Tree,
|
||||||
|
Typography,
|
||||||
|
} from 'antd';
|
||||||
import { AxiosError } from 'axios';
|
import { AxiosError } from 'axios';
|
||||||
import { cloneDeep, isUndefined, map, startCase } from 'lodash';
|
import { cloneDeep, isUndefined, map, startCase } from 'lodash';
|
||||||
import React, { Key, useEffect, useState } from 'react';
|
import React, { Key, useEffect, useState } from 'react';
|
||||||
@ -11,13 +21,18 @@ import {
|
|||||||
} from '../../axiosAPIs/eventFiltersAPI';
|
} from '../../axiosAPIs/eventFiltersAPI';
|
||||||
import ErrorPlaceHolder from '../../components/common/error-with-placeholder/ErrorPlaceHolder';
|
import ErrorPlaceHolder from '../../components/common/error-with-placeholder/ErrorPlaceHolder';
|
||||||
import Loader from '../../components/Loader/Loader';
|
import Loader from '../../components/Loader/Loader';
|
||||||
|
import { usePermissionProvider } from '../../components/PermissionProvider/PermissionProvider';
|
||||||
|
import { ResourceEntity } from '../../components/PermissionProvider/PermissionProvider.interface';
|
||||||
import { TERM_ALL } from '../../constants/constants';
|
import { TERM_ALL } from '../../constants/constants';
|
||||||
|
import { NO_PERMISSION_FOR_ACTION } from '../../constants/HelperTextUtil';
|
||||||
|
import { Operation } from '../../generated/entity/policies/policy';
|
||||||
import {
|
import {
|
||||||
EventFilter,
|
EventFilter,
|
||||||
Filters,
|
Filters,
|
||||||
SettingType,
|
SettingType,
|
||||||
} from '../../generated/settings/settings';
|
} from '../../generated/settings/settings';
|
||||||
import jsonData from '../../jsons/en';
|
import jsonData from '../../jsons/en';
|
||||||
|
import { checkPermission } from '../../utils/PermissionsUtils';
|
||||||
import { showErrorToast, showSuccessToast } from '../../utils/ToastUtils';
|
import { showErrorToast, showSuccessToast } from '../../utils/ToastUtils';
|
||||||
import './ActivityFeedSettingsPage.style.less';
|
import './ActivityFeedSettingsPage.style.less';
|
||||||
import { getEventFilterFromTree } from './ActivityFeedSettingsPage.utils';
|
import { getEventFilterFromTree } from './ActivityFeedSettingsPage.utils';
|
||||||
@ -69,7 +84,9 @@ const ActivityFeedSettingsPage: React.FC = () => {
|
|||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
key: entityType,
|
key: entityType,
|
||||||
title: <strong>{startCase(entityType)}</strong>,
|
title: (
|
||||||
|
<Typography.Text strong>{startCase(entityType)}</Typography.Text>
|
||||||
|
),
|
||||||
data: true,
|
data: true,
|
||||||
children:
|
children:
|
||||||
data?.map(({ eventType, include, exclude }) => {
|
data?.map(({ eventType, include, exclude }) => {
|
||||||
@ -164,6 +181,19 @@ const ActivityFeedSettingsPage: React.FC = () => {
|
|||||||
setCheckedKeys(checkKeys);
|
setCheckedKeys(checkKeys);
|
||||||
}, [eventFilters, updatedTree, selectedKey]);
|
}, [eventFilters, updatedTree, selectedKey]);
|
||||||
|
|
||||||
|
const { permissions } = usePermissionProvider();
|
||||||
|
|
||||||
|
const editPermission = checkPermission(
|
||||||
|
Operation.EditAll,
|
||||||
|
ResourceEntity.FEED,
|
||||||
|
permissions
|
||||||
|
);
|
||||||
|
const createPermission = checkPermission(
|
||||||
|
Operation.Create,
|
||||||
|
ResourceEntity.FEED,
|
||||||
|
permissions
|
||||||
|
);
|
||||||
|
|
||||||
const handleResetClick = async () => {
|
const handleResetClick = async () => {
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
@ -193,21 +223,25 @@ const ActivityFeedSettingsPage: React.FC = () => {
|
|||||||
<>
|
<>
|
||||||
<Row gutter={[16, 16]}>
|
<Row gutter={[16, 16]}>
|
||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<Typography.Title level={5} type="secondary">
|
<Typography.Title
|
||||||
|
level={5}
|
||||||
|
style={{ margin: 0 }}
|
||||||
|
type="secondary">
|
||||||
Activity Feed
|
Activity Feed
|
||||||
</Typography.Title>
|
</Typography.Title>
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<Card size="small">
|
<Card className="settings-page-card-container" size="small">
|
||||||
{eventFilters &&
|
{eventFilters &&
|
||||||
map(eventFilters, ({ entityType, filters }, index) => (
|
map(eventFilters, ({ entityType, filters }, index) => (
|
||||||
<>
|
<>
|
||||||
{entityType !== TERM_ALL ? (
|
{entityType !== TERM_ALL ? (
|
||||||
<div className="tw-rounded-border" key={entityType}>
|
<div
|
||||||
|
className="activity-feed-settings-tree"
|
||||||
|
key={entityType}>
|
||||||
<Tree
|
<Tree
|
||||||
checkable
|
checkable
|
||||||
defaultExpandAll
|
defaultExpandAll
|
||||||
className="activity-feed-settings-tree"
|
|
||||||
defaultCheckedKeys={checkedKeys}
|
defaultCheckedKeys={checkedKeys}
|
||||||
icon={null}
|
icon={null}
|
||||||
key={entityType}
|
key={entityType}
|
||||||
@ -225,12 +259,28 @@ const ActivityFeedSettingsPage: React.FC = () => {
|
|||||||
</Col>
|
</Col>
|
||||||
<Col>
|
<Col>
|
||||||
<Space direction="horizontal" size={16}>
|
<Space direction="horizontal" size={16}>
|
||||||
<Button type="primary" onClick={onSave}>
|
<Tooltip
|
||||||
Save
|
title={
|
||||||
</Button>
|
editPermission || createPermission
|
||||||
<Button type="text" onClick={handleResetClick}>
|
? ''
|
||||||
Reset all
|
: NO_PERMISSION_FOR_ACTION
|
||||||
</Button>
|
}>
|
||||||
|
<Button
|
||||||
|
disabled={!(editPermission || createPermission)}
|
||||||
|
type="primary"
|
||||||
|
onClick={onSave}>
|
||||||
|
Save
|
||||||
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
|
<Tooltip
|
||||||
|
title={createPermission ? '' : NO_PERMISSION_FOR_ACTION}>
|
||||||
|
<Button
|
||||||
|
disabled={!createPermission}
|
||||||
|
type="text"
|
||||||
|
onClick={handleResetClick}>
|
||||||
|
Reset all
|
||||||
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
</Space>
|
</Space>
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={24} />
|
<Col span={24} />
|
||||||
|
@ -234,8 +234,12 @@ const GlobalSettingRouter = () => {
|
|||||||
exact
|
exact
|
||||||
// Currently we don't have any permission related to ActivityFeed settings page
|
// Currently we don't have any permission related to ActivityFeed settings page
|
||||||
// update below once we have it
|
// update below once we have it
|
||||||
hasPermission
|
|
||||||
component={ActivityFeedSettingsPage}
|
component={ActivityFeedSettingsPage}
|
||||||
|
hasPermission={checkPermission(
|
||||||
|
Operation.ViewAll,
|
||||||
|
ResourceEntity.FEED,
|
||||||
|
permissions
|
||||||
|
)}
|
||||||
path={getSettingPath(
|
path={getSettingPath(
|
||||||
GlobalSettingsMenuCategory.COLLABORATION,
|
GlobalSettingsMenuCategory.COLLABORATION,
|
||||||
GlobalSettingOptions.ACTIVITY_FEED
|
GlobalSettingOptions.ACTIVITY_FEED
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);
|
0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);
|
||||||
@table-header-bg: #fff;
|
@table-header-bg: #fff;
|
||||||
@border-radius-base: 4px;
|
@border-radius-base: 4px;
|
||||||
|
@checkbox-size: 14px;
|
||||||
|
|
||||||
@import url('./components/table.less');
|
@import url('./components/table.less');
|
||||||
@import url('./components/toggle-switch.less');
|
@import url('./components/toggle-switch.less');
|
||||||
|
@ -176,8 +176,8 @@ export const getGlobalSettingsMenuWithPermission = (
|
|||||||
{
|
{
|
||||||
label: 'Activity Feed',
|
label: 'Activity Feed',
|
||||||
isProtected: checkPermission(
|
isProtected: checkPermission(
|
||||||
Operation.EditAll,
|
Operation.ViewAll,
|
||||||
ResourceEntity.ACTIVITY_FEED,
|
ResourceEntity.FEED,
|
||||||
permissions
|
permissions
|
||||||
),
|
),
|
||||||
icon: <AllActivityIcon className="side-panel-icons" />,
|
icon: <AllActivityIcon className="side-panel-icons" />,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user