From 22c03628cece5c50924e87f82a3d0d40ca4e572e Mon Sep 17 00:00:00 2001 From: Martin Hradil Date: Wed, 27 Sep 2023 00:57:54 +0000 Subject: [PATCH] Roles and role namespaces - functional components, cleanup various changes that don't belong in #4283 No-Issue --- src/components/index.ts | 1 + .../legacy-namespace-item.tsx | 116 ++++++------ .../legacy-namespace-provider.tsx | 26 --- .../legacy-namespace-list/provider-link.tsx | 21 +++ .../legacy-role-list/legacy-role-item.tsx | 168 ++++++++---------- .../collection-dependencies.tsx | 1 - .../legacy-namespaces/legacy-namespace.tsx | 13 +- src/containers/legacy-roles/legacy-role.tsx | 127 ++++++------- src/containers/legacy-roles/legacy-roles.tsx | 2 - 9 files changed, 216 insertions(+), 259 deletions(-) delete mode 100644 src/components/legacy-namespace-list/legacy-namespace-provider.tsx create mode 100644 src/components/legacy-namespace-list/provider-link.tsx diff --git a/src/components/index.ts b/src/components/index.ts index 1200567df2..4ad8c65146 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -35,6 +35,7 @@ export { PartnerHeader } from './headers/partner-header'; export { HelperText } from './helper-text/helper-text'; export { ImportModal } from './import-modal/import-modal'; export { LegacyNamespaceListItem } from './legacy-namespace-list/legacy-namespace-item'; +export { ProviderLink } from './legacy-namespace-list/provider-link'; export { LegacyRoleListItem } from './legacy-role-list/legacy-role-item'; export { ListItemActions } from './list-item-actions/list-item-actions'; export { LoadingPageSpinner } from './loading/loading-page-spinner'; diff --git a/src/components/legacy-namespace-list/legacy-namespace-item.tsx b/src/components/legacy-namespace-list/legacy-namespace-item.tsx index d33f069f62..e02da00fe3 100644 --- a/src/components/legacy-namespace-list/legacy-namespace-item.tsx +++ b/src/components/legacy-namespace-list/legacy-namespace-item.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { Link } from 'react-router-dom'; import { LegacyNamespaceDetailType } from 'src/api'; import { Logo, StatefulDropdown } from 'src/components'; -import { AppContext } from 'src/loaders/app-context'; +import { useContext } from 'src/loaders/app-context'; import { Paths, formatPath } from 'src/paths'; import './legacy-namespace-item.scss'; @@ -19,72 +19,72 @@ interface LegacyNamespaceProps { openModal: (namespace) => void; } -export class LegacyNamespaceListItem extends React.Component { - render() { - const { namespace } = this.props; - const namespace_url = formatPath(Paths.legacyNamespace, { - namespaceid: namespace.id, - }); +export function LegacyNamespaceListItem({ + namespace, + openModal, +}: LegacyNamespaceProps) { + const { + featureFlags: { ai_deny_index }, + user: { username, is_superuser }, + } = useContext(); + const { id, avatar_url, name, summary_fields } = namespace; - const cells = []; + const namespace_url = formatPath(Paths.legacyNamespace, { + namespaceid: id, + }); - cells.push( - - - , - ); + const cells = []; - cells.push( - -
- {namespace.name} -
-
, - ); + cells.push( + + + , + ); - const { ai_deny_index } = this.context.featureFlags; - const summary_fields = namespace.summary_fields; - const userOwnsLegacyNamespace = summary_fields?.owners?.filter( - (n) => n.username == this.context.user.username, - ).length; + cells.push( + +
+ {name} +
+
, + ); - const showWisdom = - ai_deny_index && - (this.context.user.is_superuser || userOwnsLegacyNamespace); + const userOwnsLegacyNamespace = !!summary_fields.owners.find( + (n) => n.username == username, + ); - const dropdownItems = []; + const showWisdom = ai_deny_index && (is_superuser || userOwnsLegacyNamespace); - dropdownItems.push( - this.props.openModal(namespace)} - >{t`Ansible Lightspeed settings`}, - ); + const dropdownItems = []; - if (showWisdom) { - cells.push( - -
- -
-
, - ); - } + dropdownItems.push( + openModal(namespace)} + >{t`Ansible Lightspeed settings`}, + ); - return ( - - - - - + if (showWisdom) { + cells.push( + +
+ +
+
, ); } -} -LegacyNamespaceListItem.contextType = AppContext; + return ( + + + + + + ); +} diff --git a/src/components/legacy-namespace-list/legacy-namespace-provider.tsx b/src/components/legacy-namespace-list/legacy-namespace-provider.tsx deleted file mode 100644 index 6073792aab..0000000000 --- a/src/components/legacy-namespace-list/legacy-namespace-provider.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { Trans } from '@lingui/macro'; -import { Text, TextContent, TextVariants } from '@patternfly/react-core'; -import React from 'react'; -import { Link } from 'react-router-dom'; - -interface IProps { - id: number; - name: string; - url: string; -} - -export class ProviderLink extends React.Component { - render() { - const { name, url } = this.props; - - return ( - - - - Provided by {name} - - - - ); - } -} diff --git a/src/components/legacy-namespace-list/provider-link.tsx b/src/components/legacy-namespace-list/provider-link.tsx new file mode 100644 index 0000000000..65f2316358 --- /dev/null +++ b/src/components/legacy-namespace-list/provider-link.tsx @@ -0,0 +1,21 @@ +import { Trans } from '@lingui/macro'; +import { Text, TextContent, TextVariants } from '@patternfly/react-core'; +import React from 'react'; +import { Link } from 'react-router-dom'; + +interface IProps { + name: string; + url: string; +} + +export function ProviderLink({ name, url }: IProps) { + return ( + + + + Provided by {name} + + + + ); +} diff --git a/src/components/legacy-role-list/legacy-role-item.tsx b/src/components/legacy-role-list/legacy-role-item.tsx index e757a989ab..ec1421b2ea 100644 --- a/src/components/legacy-role-list/legacy-role-item.tsx +++ b/src/components/legacy-role-list/legacy-role-item.tsx @@ -9,11 +9,15 @@ import { import React from 'react'; import { Link } from 'react-router-dom'; import { LegacyRoleDetailType } from 'src/api'; -import { DateComponent, DownloadCount, Logo, Tag } from 'src/components'; -import { ProviderLink } from 'src/components/legacy-namespace-list/legacy-namespace-provider'; +import { + DateComponent, + DownloadCount, + Logo, + ProviderLink, + Tag, +} from 'src/components'; import { Paths, formatPath } from 'src/paths'; -import { chipGroupProps } from 'src/utilities'; -import { getProviderInfo } from 'src/utilities'; +import { chipGroupProps, getProviderInfo } from 'src/utilities'; import './legacy-role-item.scss'; interface LegacyRoleProps { @@ -21,101 +25,77 @@ interface LegacyRoleProps { show_thumbnail: boolean; } -export class LegacyRoleListItem extends React.Component { - render() { - const { role, show_thumbnail } = this.props; - const namespace = role.summary_fields.namespace; - const role_url = formatPath(Paths.legacyRole, { - username: role.github_user, - name: role.name, - }); - - let release_date = null; - let release_name = null; - const lv = role.summary_fields.versions[0]; - if (lv !== undefined && lv !== null) { - release_date = lv.release_date; - release_name = lv.name; - } - if ( - release_date === undefined || - release_date === null || - release_date === '' - ) { - release_date = role.modified; - } - if ( - release_name === undefined || - release_name === null || - release_name === '' - ) { - release_name = ''; - } - - const provider = getProviderInfo(role); - console.log('PROVIDER', provider); +export function LegacyRoleListItem({ role, show_thumbnail }: LegacyRoleProps) { + const { + description, + github_user, + modified, + name, + summary_fields: { namespace, versions, tags }, + } = role; + const latest = versions[0]; - const cells = []; - - if (show_thumbnail !== false) { - cells.push( - - - , - ); - } + const role_url = formatPath(Paths.legacyRole, { + username: github_user, + name, + }); + const release_date = latest?.release_date || modified; + const release_name = latest?.name || ''; + const provider = getProviderInfo(role); + const cells = []; + if (show_thumbnail !== false) { cells.push( - -
- - {namespace.name}.{role.name} - - - {provider.name} - -
-
{role.description}
-
- - {role.summary_fields.tags.map((tag, index) => ( - {tag} - ))} - -
+ + , ); + } - cells.push( - -
- - Updated - -
-
{release_name}
-
- -
-
, - ); + cells.push( + +
+ + {namespace.name}.{name} + + +
+
{description}
+
+ + {tags.map((tag, index) => ( + {tag} + ))} + +
+
, + ); - return ( - - - - - - ); - } + cells.push( + +
+ + Updated + +
+
{release_name}
+
+ +
+
, + ); + + return ( + + + + + + ); } diff --git a/src/containers/collection-detail/collection-dependencies.tsx b/src/containers/collection-detail/collection-dependencies.tsx index aa29bb72e6..23c9b556ab 100644 --- a/src/containers/collection-detail/collection-dependencies.tsx +++ b/src/containers/collection-detail/collection-dependencies.tsx @@ -258,7 +258,6 @@ class CollectionDependencies extends React.Component { }); }) .catch(({ response, message }) => { - // console.log(response, message); if (message !== 'request-canceled') { const { status, statusText } = response; this.setState({ diff --git a/src/containers/legacy-namespaces/legacy-namespace.tsx b/src/containers/legacy-namespaces/legacy-namespace.tsx index a1a8e67bee..d82ce2135e 100644 --- a/src/containers/legacy-namespaces/legacy-namespace.tsx +++ b/src/containers/legacy-namespaces/legacy-namespace.tsx @@ -24,15 +24,14 @@ import { LoadingPageSpinner, Logo, Pagination, + ProviderLink, StatefulDropdown, WisdomModal, closeAlertMixin, } from 'src/components'; -import { ProviderLink } from 'src/components/legacy-namespace-list/legacy-namespace-provider'; import { AppContext } from 'src/loaders/app-context'; import { Paths, formatPath } from 'src/paths'; -import { RouteProps, withRouter } from 'src/utilities'; -import { getProviderInfo } from 'src/utilities/legacy-namespace'; +import { RouteProps, getProviderInfo, withRouter } from 'src/utilities'; import './legacy-namespace.scss'; interface LegacyNamespaceRolesProps { @@ -258,13 +257,7 @@ class LegacyNamespace extends React.Component< width='90px' /> {this.state.namespace.name} - - {provider.name} - +
, ); diff --git a/src/containers/legacy-roles/legacy-role.tsx b/src/containers/legacy-roles/legacy-role.tsx index 400ccd798c..eed71c5426 100644 --- a/src/containers/legacy-roles/legacy-role.tsx +++ b/src/containers/legacy-roles/legacy-role.tsx @@ -167,7 +167,7 @@ class LegacyRoleVersions extends React.Component { {this.state.role_versions.reverse().map((rversion) => ( - + ))} @@ -268,94 +268,85 @@ class LegacyRole extends React.Component { release_name = ''; } - const header_cells = []; - if (this.state.role !== undefined && this.state.role !== null) { - header_cells.push( - - - {namespace.name} - , - ); - - header_cells.push( - -
- - - {namespace.name}.{this.state.role.name} - - -
-
{this.state.role.description}
-
- - {this.state.role.summary_fields.tags.map((tag, index) => ( - {tag} - ))} - -
-
, - ); - - header_cells.push( - -
- - Updated - -
- {release_name &&
{release_name}
} - -
- -
-
, - ); - } + const header_cells = [ + + + {namespace.name} + , + +
+ + + {namespace.name}.{role.name} + + +
+
{role.description}
+
+ + {role.summary_fields.tags.map((tag, index) => ( + {tag} + ))} + +
+
, + +
+ + Updated + +
+ {release_name &&
{release_name}
} + +
+ +
+
, + ]; const table = { - install: { title: 'Install' }, - documentation: { title: 'Documentation' }, - versions: { title: 'Versions' }, + install: { title: t`Install` }, + documentation: { title: t`Documentation` }, + versions: { title: t`Versions` }, }; const renderContent = () => { if (this.state.activeItem == 'install') { return ( ); } else if (this.state.activeItem === 'documentation') { return ( ); } else if (this.state.activeItem === 'versions') { return ( ); } else { @@ -365,7 +356,7 @@ class LegacyRole extends React.Component { const breadcrumbs = [ { - name: 'Legacy Roles', + name: t`Roles`, url: formatPath(Paths.legacyRoles), }, { @@ -382,7 +373,7 @@ class LegacyRole extends React.Component { ]; return ( - + <> {/* This renders a bit too small ...? */} @@ -418,7 +409,7 @@ class LegacyRole extends React.Component {
{renderContent()}
-
+ ); } } diff --git a/src/containers/legacy-roles/legacy-roles.tsx b/src/containers/legacy-roles/legacy-roles.tsx index 9d018aa3bd..75af3189f9 100644 --- a/src/containers/legacy-roles/legacy-roles.tsx +++ b/src/containers/legacy-roles/legacy-roles.tsx @@ -142,7 +142,6 @@ class LegacyRoles extends React.Component { this.updateParams(p)} updateParams={this.updateParams} count={this.state.count} /> @@ -160,7 +159,6 @@ class LegacyRoles extends React.Component { this.updateParams(p)} updateParams={this.updateParams} count={this.state.count} />