fix(ui): activity feed settings page ui updates (#7227)

This commit is contained in:
Chirag Madlani 2022-09-05 23:06:06 +05:30 committed by GitHub
parent 9be3df4a1e
commit d6d18886d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 105 additions and 37 deletions

View File

@ -264,6 +264,9 @@ 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 = () => {
const pathName = location.pathname;
// Do not try silent sign in for SignIn or SignUp route
if ([ROUTES.SIGNIN, ROUTES.SIGNUP].indexOf(pathName) === -1) {
// Try to renew token // Try to renew token
silentSignInRetries < 3 silentSignInRetries < 3
? renewIdToken() ? renewIdToken()
@ -279,6 +282,7 @@ export const AuthProvider = ({
trySilentSignIn(); trySilentSignIn();
}) })
: onLogoutHandler(); // Logout if we reaches max silent signIn limit; : onLogoutHandler(); // Logout if we reaches max silent signIn limit;
}
}; };
/** /**

View File

@ -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);
}} }}

View File

@ -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',

View File

@ -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;
} }

View File

@ -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
title={
editPermission || createPermission
? ''
: NO_PERMISSION_FOR_ACTION
}>
<Button
disabled={!(editPermission || createPermission)}
type="primary"
onClick={onSave}>
Save Save
</Button> </Button>
<Button type="text" onClick={handleResetClick}> </Tooltip>
<Tooltip
title={createPermission ? '' : NO_PERMISSION_FOR_ACTION}>
<Button
disabled={!createPermission}
type="text"
onClick={handleResetClick}>
Reset all Reset all
</Button> </Button>
</Tooltip>
</Space> </Space>
</Col> </Col>
<Col span={24} /> <Col span={24} />

View File

@ -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

View File

@ -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');

View File

@ -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" />,