Skip to content
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 43 additions & 14 deletions portals/admin/src/main/webapp/site/public/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -348,26 +348,55 @@
"Application.Name": "Application Name",
"Application.Owner": "Application Owner",
"Application.organization": "Application Organization",
"Applications.Listing.ApplicationTableHead.actions": "Actions",
"Applications.Listing.ApplicationTableHead.name": "Name",
"Applications.Listing.ApplicationTableHead.owner": "Owner",
"ApplicationSettings.ChangeAppOwner.applications.list.rows.more.than.label": "more than {to}",
"ApplicationSettings.ChangeAppOwner.applications.list.rows.range.label": "{from}-{to} of {count}",
"ApplicationSettings.ChangeAppOwner.applications.list.rows.show.label": "Show",
"ApplicationSettings.ChangeAppOwner.applications.list.title": "Change Application Owner",
"ApplicationSettings.ChangeAppOwner.applications.search": "Search",
"ApplicationSettings.ChangeAppOwner.applications.searching": "Searching",
"ApplicationSettings.ChangeAppOwner.clear.search": "Clear Search",
"ApplicationSettings.ChangeAppOwner.column.actions": "Actions",
"ApplicationSettings.ChangeAppOwner.column.name": "Name",
"ApplicationSettings.ChangeAppOwner.column.owner": "Owner",
"ApplicationSettings.ChangeAppOwner.empty.message": "No Data to Display",
"ApplicationSettings.ChangeAppOwner.search.placeholder": "Search Application by Name/Owner",
"ApplicationSettings.ListApplications.change.app.owner.tab.title": "Owner",
"ApplicationSettings.ListApplications.change.app.owner.title": "Change Application Owner",
"ApplicationSettings.ListApplications.change.app.settings.title": "Change Application Settings",
"ApplicationSettings.ListApplications.learn.more.link": "Learn More…",
"ApplicationSettings.ListApplications.opaque.token.warning": "You have one or more legacy applications that are using opaque access tokens. Support for opaque tokens has been deprecated. Please upgrade these applications to use JWT-based access tokens.",
"ApplicationSettings.ListApplications.upgrade.legacy.app.tab.title": "Legacy Applications",
"ApplicationSettings.UpgradeToJWTDialog.app.upgrade.error": "Error while upgrading application {appName} to JWT",
"ApplicationSettings.UpgradeToJWTDialog.app.upgrade.successful": "Application {appName} upgraded to JWT successfully",
"ApplicationSettings.UpgradeToJWTDialog.button.cancel": "Cancel",
"ApplicationSettings.UpgradeToJWTDialog.button.open": "Upgrade to JWT",
"ApplicationSettings.UpgradeToJWTDialog.button.upgrade": "Upgrade",
"ApplicationSettings.UpgradeToJWTDialog.dialog.body1": "You are about to upgrade the application {appName} to use JWT-based access tokens.",
"ApplicationSettings.UpgradeToJWTDialog.dialog.body2": "This change will permanently switch the format of the newly generated access tokens from opaque to JWT.",
"ApplicationSettings.UpgradeToJWTDialog.dialog.confirmation": "Do you want to proceed with the upgrade?",
"ApplicationSettings.UpgradeToJWTDialog.dialog.important": "Important",
"ApplicationSettings.UpgradeToJWTDialog.dialog.title": "Upgrade Application to JWT",
"ApplicationSettings.UpgradeToJWTDialog.dialog.warning1": "This action cannot be undone",
"ApplicationSettings.UpgradeToJWTDialog.dialog.warning2": "Existing opaque tokens will still be supported",
"ApplicationSettings.UpgradeTokenType.applications.list.rows.more.than.label": "more than {to}",
"ApplicationSettings.UpgradeTokenType.applications.list.rows.range.label": "{from}-{to} of {count}",
"ApplicationSettings.UpgradeTokenType.applications.list.rows.show.label": "Show",
"ApplicationSettings.UpgradeTokenType.applications.search": "Search",
"ApplicationSettings.UpgradeTokenType.applications.searching": "Searching",
"ApplicationSettings.UpgradeTokenType.clear.search": "Clear Search",
"ApplicationSettings.UpgradeTokenType.column.actions": "Actions",
"ApplicationSettings.UpgradeTokenType.column.createdTime": "Created Date",
"ApplicationSettings.UpgradeTokenType.column.name": "Name",
"ApplicationSettings.UpgradeTokenType.column.owner": "Owner",
"ApplicationSettings.UpgradeTokenType.empty.message": "No Data to Display",
"ApplicationSettings.UpgradeTokenType.search.placeholder": "Search Application by Name/Owner",
"Applications.Listing.Listing.applications.edit.error.already.exist": "{owner} already has an application with name: {name}",
"Applications.Listing.Listing.applications.edit.error.default": "Something went wrong when validating user",
"Applications.Listing.Listing.applications.edit.error.owner.invalid": "{owner} is not a valid Subscriber",
"Applications.Listing.Listing.applications.edit.error.subscriber.invalid": "Error while updating ownership to {owner}",
"Applications.Listing.Listing.applications.edit.error.unknown": "Something went wrong when updating owner",
"Applications.Listing.Listing.applications.edit.owner.label": "Owner",
"Applications.Listing.Listing.applications.edit.save.btn": "Save",
"Applications.Listing.Listing.applications.list.rows.more.than.label": "more than {to}",
"Applications.Listing.Listing.applications.list.rows.range.label": "{from}-{to} of {count}",
"Applications.Listing.Listing.applications.list.rows.show.label": "Show",
"Applications.Listing.Listing.applications.list.title": "Change Application Owner",
"Applications.Listing.Listing.applications.search": "Search",
"Applications.Listing.Listing.applications.searching": "Searching",
"Applications.Listing.Listing.clear.search": "Clear Search",
"Applications.Listing.Listing.empty.message": "No Data to Display",
"Applications.Listing.Listing.search.placeholder": "Search Application by Name/Owner",
"Applications.Listing.Listing.title": "Change Application Owner",
"Applications.Listing.apis.list.rows.more.than.label": "more than {to}",
"Applications.Listing.apis.list.rows.range.label": "{from}-{to} of {count}",
"Applications.Listing.apis.list.rows.show.label": "Show",
Expand Down Expand Up @@ -396,7 +425,7 @@
"Base.RouteMenuMapping.application.reg": "Application Registration",
"Base.RouteMenuMapping.application.throttling.policies": "Application Policies",
"Base.RouteMenuMapping.application.update": "Application Update",
"Base.RouteMenuMapping.applications": "Change Application Owner",
"Base.RouteMenuMapping.applications": "Change Application Settings",
"Base.RouteMenuMapping.blacklisted.items": "Deny Policies",
"Base.RouteMenuMapping.compliance": "Compliance",
"Base.RouteMenuMapping.custom.throttling.policies": "Custom Policies",
Expand Down
57 changes: 43 additions & 14 deletions portals/admin/src/main/webapp/site/public/locales/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -348,26 +348,55 @@
"Application.Name": "Application Name",
"Application.Owner": "Application Owner",
"Application.organization": "Application Organization",
"Applications.Listing.ApplicationTableHead.actions": "Actions",
"Applications.Listing.ApplicationTableHead.name": "Name",
"Applications.Listing.ApplicationTableHead.owner": "Owner",
"ApplicationSettings.ChangeAppOwner.applications.list.rows.more.than.label": "more than {to}",
"ApplicationSettings.ChangeAppOwner.applications.list.rows.range.label": "{from}-{to} of {count}",
"ApplicationSettings.ChangeAppOwner.applications.list.rows.show.label": "Show",
"ApplicationSettings.ChangeAppOwner.applications.list.title": "Change Application Owner",
"ApplicationSettings.ChangeAppOwner.applications.search": "Search",
"ApplicationSettings.ChangeAppOwner.applications.searching": "Searching",
"ApplicationSettings.ChangeAppOwner.clear.search": "Clear Search",
"ApplicationSettings.ChangeAppOwner.column.actions": "Actions",
"ApplicationSettings.ChangeAppOwner.column.name": "Name",
"ApplicationSettings.ChangeAppOwner.column.owner": "Owner",
"ApplicationSettings.ChangeAppOwner.empty.message": "No Data to Display",
"ApplicationSettings.ChangeAppOwner.search.placeholder": "Search Application by Name/Owner",
"ApplicationSettings.ListApplications.change.app.owner.tab.title": "Owner",
"ApplicationSettings.ListApplications.change.app.owner.title": "Change Application Owner",
"ApplicationSettings.ListApplications.change.app.settings.title": "Change Application Settings",
"ApplicationSettings.ListApplications.learn.more.link": "Learn More…",
"ApplicationSettings.ListApplications.opaque.token.warning": "You have one or more legacy applications that are using opaque access tokens. Support for opaque tokens has been deprecated. Please upgrade these applications to use JWT-based access tokens.",
"ApplicationSettings.ListApplications.upgrade.legacy.app.tab.title": "Legacy Applications",
"ApplicationSettings.UpgradeToJWTDialog.app.upgrade.error": "Error while upgrading application {appName} to JWT",
"ApplicationSettings.UpgradeToJWTDialog.app.upgrade.successful": "Application {appName} upgraded to JWT successfully",
"ApplicationSettings.UpgradeToJWTDialog.button.cancel": "Cancel",
"ApplicationSettings.UpgradeToJWTDialog.button.open": "Upgrade to JWT",
"ApplicationSettings.UpgradeToJWTDialog.button.upgrade": "Upgrade",
"ApplicationSettings.UpgradeToJWTDialog.dialog.body1": "You are about to upgrade the application {appName} to use JWT-based access tokens.",
"ApplicationSettings.UpgradeToJWTDialog.dialog.body2": "This change will permanently switch the format of the newly generated access tokens from opaque to JWT.",
"ApplicationSettings.UpgradeToJWTDialog.dialog.confirmation": "Do you want to proceed with the upgrade?",
"ApplicationSettings.UpgradeToJWTDialog.dialog.important": "Important",
"ApplicationSettings.UpgradeToJWTDialog.dialog.title": "Upgrade Application to JWT",
"ApplicationSettings.UpgradeToJWTDialog.dialog.warning1": "This action cannot be undone",
"ApplicationSettings.UpgradeToJWTDialog.dialog.warning2": "Existing opaque tokens will still be supported",
"ApplicationSettings.UpgradeTokenType.applications.list.rows.more.than.label": "more than {to}",
"ApplicationSettings.UpgradeTokenType.applications.list.rows.range.label": "{from}-{to} of {count}",
"ApplicationSettings.UpgradeTokenType.applications.list.rows.show.label": "Show",
"ApplicationSettings.UpgradeTokenType.applications.search": "Search",
"ApplicationSettings.UpgradeTokenType.applications.searching": "Searching",
"ApplicationSettings.UpgradeTokenType.clear.search": "Clear Search",
"ApplicationSettings.UpgradeTokenType.column.actions": "Actions",
"ApplicationSettings.UpgradeTokenType.column.createdTime": "Created Date",
"ApplicationSettings.UpgradeTokenType.column.name": "Name",
"ApplicationSettings.UpgradeTokenType.column.owner": "Owner",
"ApplicationSettings.UpgradeTokenType.empty.message": "No Data to Display",
"ApplicationSettings.UpgradeTokenType.search.placeholder": "Search Application by Name/Owner",
"Applications.Listing.Listing.applications.edit.error.already.exist": "{owner} already has an application with name: {name}",
"Applications.Listing.Listing.applications.edit.error.default": "Something went wrong when validating user",
"Applications.Listing.Listing.applications.edit.error.owner.invalid": "{owner} is not a valid Subscriber",
"Applications.Listing.Listing.applications.edit.error.subscriber.invalid": "Error while updating ownership to {owner}",
"Applications.Listing.Listing.applications.edit.error.unknown": "Something went wrong when updating owner",
"Applications.Listing.Listing.applications.edit.owner.label": "Owner",
"Applications.Listing.Listing.applications.edit.save.btn": "Save",
"Applications.Listing.Listing.applications.list.rows.more.than.label": "more than {to}",
"Applications.Listing.Listing.applications.list.rows.range.label": "{from}-{to} of {count}",
"Applications.Listing.Listing.applications.list.rows.show.label": "Show",
"Applications.Listing.Listing.applications.list.title": "Change Application Owner",
"Applications.Listing.Listing.applications.search": "Search",
"Applications.Listing.Listing.applications.searching": "Searching",
"Applications.Listing.Listing.clear.search": "Clear Search",
"Applications.Listing.Listing.empty.message": "No Data to Display",
"Applications.Listing.Listing.search.placeholder": "Search Application by Name/Owner",
"Applications.Listing.Listing.title": "Change Application Owner",
"Applications.Listing.apis.list.rows.more.than.label": "more than {to}",
"Applications.Listing.apis.list.rows.range.label": "{from}-{to} of {count}",
"Applications.Listing.apis.list.rows.show.label": "Show",
Expand Down Expand Up @@ -396,7 +425,7 @@
"Base.RouteMenuMapping.application.reg": "Application Registration",
"Base.RouteMenuMapping.application.throttling.policies": "Application Policies",
"Base.RouteMenuMapping.application.update": "Application Update",
"Base.RouteMenuMapping.applications": "Change Application Owner",
"Base.RouteMenuMapping.applications": "Change Application Settings",
"Base.RouteMenuMapping.blacklisted.items": "Deny Policies",
"Base.RouteMenuMapping.compliance": "Compliance",
"Base.RouteMenuMapping.custom.throttling.policies": "Custom Policies",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import React from 'react';
import { styled } from '@mui/material/styles';
import PropTypes from 'prop-types';
import Toolbar from '@mui/material/Toolbar';
import Alert from '@mui/material/Alert';
import Typography from '@mui/material/Typography';
import Paper from '@mui/material/Paper';
import Box from '@mui/material/Box';
Expand All @@ -43,7 +44,7 @@ const Root = styled('div')({
*/
function ContentBase(props) {
const {
title, pageDescription, children, help, width, pageStyle, PaperProps, paperLess,
title, pageDescription, children, help, width, pageStyle, PaperProps, paperLess, warning,
} = props;
let size = 8;// default half/medium
if ([width, pageStyle].includes('small')) {
Expand Down Expand Up @@ -82,6 +83,17 @@ function ContentBase(props) {
</Grid>
</Toolbar>
</Grid>
{warning && (
<Grid item xs={11} sm={size}>
<Box sx={{ mt: 4 }}>
<Alert severity='warning' sx={{ textAlign: 'center' }}>
<Typography variant='subtitle2'>
{warning}
</Typography>
</Alert>
</Box>
</Grid>
)}
<Grid item xs={11} sm={size}>
<Box py={6} position='relative'>
{pageStyle === 'paperLess' || paperLess ? children : (
Expand All @@ -102,11 +114,13 @@ ContentBase.defaultProps = {
pageStyle: 'half',
paperLess: false,
pageDescription: null,
warning: null,
};
ContentBase.propTypes = {
help: PropTypes.element.isRequired,
title: PropTypes.string.isRequired,
pageDescription: PropTypes.string,
warning: PropTypes.node,
children: PropTypes.element.isRequired,
width: PropTypes.oneOf(['medium', 'full', 'small']),
pageStyle: PropTypes.oneOf(['half', 'full', 'small']), // @deprecated
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
/*
* Copyright (c) 2026, WSO2 LLC. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import Grid from '@mui/material/Grid';
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import Box from '@mui/material/Box';
import ContentBase from 'AppComponents/AdminPages/Addons/ContentBase';

/**
* This is a wrapper component around ContentBase used for displaying a tabbed structure.
* @param {object} props - The component props.
* @returns {JSX.Element} The rendered tabbed content component.
*/
function TabbedContentBase(props) {
const {
title,
help,
pageDescription,
tabs,
warning,
} = props;

const [value, setValue] = useState(0);

const handleChange = (event, newValue) => {
setValue(newValue);
};

return (
<ContentBase
title={title}
help={help}
pageDescription={pageDescription}
warning={value === 1 ? warning : null}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like when the user switches tabs, the warning message appears above the tabs and causes both the tabs and the table to shift. Wouldn’t it be better to always display the warning banner in this page if there's a warning?

cc: @Induwara04

>
<Grid container>

<Grid item xs={12}>
<Tabs
variant='standard'
indicatorColor='primary'
textColor='primary'
value={value}
onChange={handleChange}
sx={{
minHeight: 48,
backgroundColor: 'grey.200',
ml: 0,
pl: 0,
borderBottom: 'none',
'& .MuiTab-root': {
minHeight: 48,
margin: 0,
px: 6,
textTransform: 'none',
borderTop: 1,
borderLeft: 1,
borderRight: 1,
borderBottom: 1,
borderColor: 'divider',
borderBottomColor: 'divider',
borderTopLeftRadius: 8,
borderTopRightRadius: 8,
backgroundColor: 'grey.200',
color: 'text.secondary',
'&.Mui-selected': {
backgroundColor: 'background.paper',
color: 'primary.main',
fontWeight: 600,
borderBottom: 'none',
},
'&:hover': {
backgroundColor: 'background.paper',
},
},
}}
>
{tabs.map((tab, index) => (
<Tab
key={tab.id ?? index}
label={tab.label}
/>
))}
</Tabs>
</Grid>
<Grid item xs={12}>
<Box sx={{ mt: 0 }}>
{tabs[value]?.content}
</Box>
</Grid>

</Grid>
</ContentBase>
);
}

TabbedContentBase.propTypes = {
title: PropTypes.string.isRequired,
help: PropTypes.element.isRequired,
pageDescription: PropTypes.string,
tabs: PropTypes.arrayOf(
PropTypes.shape({
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
label: PropTypes.node.isRequired,
content: PropTypes.element.isRequired,
}),
).isRequired,
warning: PropTypes.node,
};

TabbedContentBase.defaultProps = {
pageDescription: null,
warning: null,
};

export default TabbedContentBase;
Loading
Loading