ApplicationsPage.js.map 18 KB

1
  1. {"version":3,"sources":["../../../src/app/content/applications-page/ApplicationsPage.tsx"],"names":["React","DataList","DataListItem","DataListItemRow","DataListCell","DataListToggle","DataListContent","DataListItemCells","Grid","GridItem","Button","InfoAltIcon","CheckIcon","ExternalLinkAltIcon","ContentPage","ContinueCancelModal","AccountServiceContext","Msg","ApplicationsPage","Component","constructor","props","context","clientId","doDelete","then","fetchApplications","row","newIsRowOpen","state","isRowOpen","setState","applications","doGet","response","data","Array","length","fill","elementId","item","application","render","localize","visibility","map","appIndex","onToggle","window","open","effectiveUrl","clientName","userConsentRequired","offlineAccess","inUse","description","split","consent","grantedScopes","scope","scopeIndex","name","tosUri","policyUri","Intl","DateTimeFormat","locale","year","month","day","hour","minute","second","format","createDate","logoUri","removeConsent"],"mappings":"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","sourcesContent":["/*\n * Copyright 2018 Red Hat, Inc. and/or its affiliates.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as React from 'react';\n\nimport {\n DataList,\n DataListItem,\n DataListItemRow,\n DataListCell,\n DataListToggle,\n DataListContent,\n DataListItemCells,\n Grid,\n GridItem,\n Button,\n} from '@patternfly/react-core';\n\nimport { InfoAltIcon, CheckIcon, BuilderImageIcon, ExternalLinkAltIcon } from '@patternfly/react-icons';\nimport { ContentPage } from '../ContentPage';\nimport { ContinueCancelModal } from '../../widgets/ContinueCancelModal';\nimport { HttpResponse } from '../../account-service/account.service';\nimport { AccountServiceContext } from '../../account-service/AccountServiceContext';\nimport { Msg } from '../../widgets/Msg';\n\ndeclare const locale: string;\n\nexport interface ApplicationsPageProps {\n}\n\nexport interface ApplicationsPageState {\n isRowOpen: boolean[];\n applications: Application[];\n}\n\nexport interface GrantedScope {\n displayTest: string;\n id: string;\n name: string;\n}\n\nexport interface Consent {\n createDate: number;\n grantedScopes: GrantedScope[];\n lastUpdatedDate: number;\n}\n\ninterface Application {\n effectiveUrl: string;\n clientId: string;\n clientName: string;\n consent: Consent;\n description: string;\n inUse: boolean;\n offlineAccess: boolean;\n userConsentRequired: boolean;\n scope: string[];\n logoUri: string;\n policyUri: string;\n tosUri: string;\n}\n\nexport class ApplicationsPage extends React.Component<ApplicationsPageProps, ApplicationsPageState> {\n static contextType = AccountServiceContext;\n context: React.ContextType<typeof AccountServiceContext>;\n\n public constructor(props: ApplicationsPageProps, context: React.ContextType<typeof AccountServiceContext>) {\n super(props);\n this.context = context;\n this.state = {\n isRowOpen: [],\n applications: []\n };\n\n this.fetchApplications();\n }\n\n private removeConsent = (clientId: string) => {\n this.context!.doDelete(\"/applications/\" + clientId + \"/consent\")\n .then(() => {\n this.fetchApplications();\n });\n }\n\n private onToggle = (row: number): void => {\n const newIsRowOpen: boolean[] = this.state.isRowOpen;\n newIsRowOpen[row] = !newIsRowOpen[row];\n this.setState({ isRowOpen: newIsRowOpen });\n };\n\n private fetchApplications(): void {\n this.context!.doGet<Application[]>(\"/applications\")\n .then((response: HttpResponse<Application[]>) => {\n const applications = response.data || [];\n this.setState({\n isRowOpen: new Array(applications.length).fill(false),\n applications: applications\n });\n });\n }\n\n private elementId(item: string, application: Application): string {\n return `application-${item}-${application.clientId}`;\n }\n\n public render(): React.ReactNode {\n return (\n <ContentPage title={Msg.localize('applicationsPageTitle')}>\n <DataList id=\"applications-list\" aria-label={Msg.localize('applicationsPageTitle')} isCompact>\n <DataListItem id=\"applications-list-header\" aria-labelledby=\"Columns names\">\n <DataListItemRow>\n // invisible toggle allows headings to line up properly\n <span style={{ visibility: 'hidden' }}>\n <DataListToggle\n isExpanded={false}\n id='applications-list-header-invisible-toggle'\n aria-controls=\"hidden\"\n />\n </span>\n <DataListItemCells\n dataListCells={[\n <DataListCell key='applications-list-client-id-header' width={2}>\n <strong><Msg msgKey='applicationName' /></strong>\n </DataListCell>,\n <DataListCell key='applications-list-app-type-header' width={2}>\n <strong><Msg msgKey='applicationType' /></strong>\n </DataListCell>,\n <DataListCell key='applications-list-status' width={2}>\n <strong><Msg msgKey='status' /></strong>\n </DataListCell>,\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n {this.state.applications.map((application: Application, appIndex: number) => {\n return (\n <DataListItem id={this.elementId(\"client-id\", application)} key={'application-' + appIndex} aria-labelledby=\"applications-list\" isExpanded={this.state.isRowOpen[appIndex]}>\n <DataListItemRow>\n <DataListToggle\n onClick={() => this.onToggle(appIndex)}\n isExpanded={this.state.isRowOpen[appIndex]}\n id={this.elementId('toggle', application)}\n aria-controls={this.elementId(\"expandable\", application)}\n />\n <DataListItemCells\n dataListCells={[\n <DataListCell id={this.elementId('name', application)} width={2} key={'app-' + appIndex}>\n <Button component=\"a\" variant=\"link\" onClick={() => window.open(application.effectiveUrl)}>\n {application.clientName || application.clientId} <ExternalLinkAltIcon/>\n </Button>\n </DataListCell>,\n <DataListCell id={this.elementId('internal', application)} width={2} key={'internal-' + appIndex}>\n {application.userConsentRequired ? Msg.localize('thirdPartyApp') : Msg.localize('internalApp')}\n {application.offlineAccess ? ', ' + Msg.localize('offlineAccess') : ''}\n </DataListCell>,\n <DataListCell id={this.elementId('status', application)} width={2} key={'status-' + appIndex}>\n {application.inUse ? Msg.localize('inUse') : Msg.localize('notInUse')}\n </DataListCell>\n ]}\n />\n </DataListItemRow>\n <DataListContent\n noPadding={false}\n aria-label={Msg.localize('applicationDetails')}\n id={this.elementId(\"expandable\", application)}\n isHidden={!this.state.isRowOpen[appIndex]}\n >\n <Grid sm={6} md={6} lg={6}>\n <div className='pf-c-content'>\n <GridItem><strong>{Msg.localize('client') + ': '}</strong> {application.clientId}</GridItem>\n {application.description &&\n <GridItem><strong>{Msg.localize('description') + ': '}</strong> {application.description}</GridItem>\n }\n {application.effectiveUrl &&\n <GridItem><strong>URL: </strong> <span id={this.elementId('effectiveurl', application)}>{application.effectiveUrl.split('\"')}</span></GridItem>\n }\n {application.consent &&\n <React.Fragment>\n <GridItem span={12}>\n <strong>Has access to:</strong>\n </GridItem>\n {application.consent.grantedScopes.map((scope: GrantedScope, scopeIndex: number) => {\n return (\n <React.Fragment key={'scope-' + scopeIndex} >\n <GridItem offset={1}><CheckIcon /> {scope.name}</GridItem>\n </React.Fragment>\n )\n })}\n {application.tosUri && <GridItem><strong>{Msg.localize('termsOfService') + ': '}</strong>{application.tosUri}</GridItem>}\n {application.policyUri && <GridItem><strong>{Msg.localize('policy') + ': '}</strong>{application.policyUri}</GridItem>}\n <GridItem><strong>{Msg.localize('accessGrantedOn') + ': '}</strong>\n {new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric'\n }).format(application.consent.createDate)}\n </GridItem>\n </React.Fragment>\n }\n </div>\n {application.logoUri && <div className='pf-c-content'><img src={application.logoUri} /></div> }\n </Grid>\n {(application.consent || application.offlineAccess) &&\n <Grid gutter='sm'>\n <hr />\n <GridItem>\n <React.Fragment>\n <ContinueCancelModal\n buttonTitle={Msg.localize('removeButton')} // required\n buttonVariant='secondary' // defaults to 'primary'\n modalTitle={Msg.localize('removeModalTitle')} // required\n modalMessage={Msg.localize('removeModalMessage', [application.clientId])}\n modalContinueButtonLabel={Msg.localize('confirmButton')} // defaults to 'Continue'\n onContinue={() => this.removeConsent(application.clientId)} // required\n />\n </React.Fragment>\n </GridItem>\n <GridItem><InfoAltIcon /> {Msg.localize('infoMessage')}</GridItem>\n </Grid>\n }\n </DataListContent>\n </DataListItem>\n )\n })}\n </DataList>\n </ContentPage>\n );\n }\n};\n"],"file":"ApplicationsPage.js"}