| 
									
										
										
										
											2018-08-01 18:23:16 +02:00
										 |  |  | //@flow
 | 
					
						
							|  |  |  | import React from "react"; | 
					
						
							| 
									
										
										
										
											2018-08-03 09:34:39 +02:00
										 |  |  | import { | 
					
						
							| 
									
										
										
										
											2018-08-06 10:08:28 +02:00
										 |  |  |   deleteRepo, | 
					
						
							| 
									
										
										
										
											2018-08-03 09:34:39 +02:00
										 |  |  |   fetchRepo, | 
					
						
							|  |  |  |   getFetchRepoFailure, | 
					
						
							|  |  |  |   getRepository, | 
					
						
							|  |  |  |   isFetchRepoPending | 
					
						
							|  |  |  | } from "../modules/repos"; | 
					
						
							| 
									
										
										
										
											2018-08-01 18:23:16 +02:00
										 |  |  | import { connect } from "react-redux"; | 
					
						
							| 
									
										
										
										
											2018-08-03 09:34:39 +02:00
										 |  |  | import { Route } from "react-router-dom"; | 
					
						
							| 
									
										
										
										
											2018-09-05 14:32:49 +02:00
										 |  |  | import type { Repository } from "@scm-manager/ui-types"; | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   Page, | 
					
						
							|  |  |  |   Loading, | 
					
						
							|  |  |  |   ErrorPage, | 
					
						
							|  |  |  |   Navigation, | 
					
						
							|  |  |  |   NavLink, | 
					
						
							|  |  |  |   Section | 
					
						
							|  |  |  | } from "@scm-manager/ui-components"; | 
					
						
							| 
									
										
										
										
											2018-08-01 18:23:16 +02:00
										 |  |  | import { translate } from "react-i18next"; | 
					
						
							| 
									
										
										
										
											2018-08-03 09:34:39 +02:00
										 |  |  | import RepositoryDetails from "../components/RepositoryDetails"; | 
					
						
							| 
									
										
										
										
											2018-08-06 10:08:28 +02:00
										 |  |  | import DeleteNavAction from "../components/DeleteNavAction"; | 
					
						
							| 
									
										
										
										
											2018-08-06 15:41:20 +02:00
										 |  |  | import Edit from "../containers/Edit"; | 
					
						
							| 
									
										
										
										
											2018-09-11 16:00:15 +02:00
										 |  |  | import Permissions from "../permissions/containers/Permissions"; | 
					
						
							| 
									
										
										
										
											2018-08-06 10:08:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import type { History } from "history"; | 
					
						
							| 
									
										
										
										
											2018-08-06 15:41:20 +02:00
										 |  |  | import EditNavLink from "../components/EditNavLink"; | 
					
						
							| 
									
										
										
										
											2018-08-23 09:10:38 +02:00
										 |  |  | import PermissionsNavLink from "../components/PermissionsNavLink"; | 
					
						
							| 
									
										
										
										
											2018-09-28 14:30:26 +02:00
										 |  |  | import ScmDiff from "./ScmDiff"; | 
					
						
							| 
									
										
										
										
											2018-08-01 18:23:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | type Props = { | 
					
						
							|  |  |  |   namespace: string, | 
					
						
							|  |  |  |   name: string, | 
					
						
							|  |  |  |   repository: Repository, | 
					
						
							|  |  |  |   loading: boolean, | 
					
						
							|  |  |  |   error: Error, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // dispatch functions
 | 
					
						
							|  |  |  |   fetchRepo: (namespace: string, name: string) => void, | 
					
						
							| 
									
										
										
										
											2018-08-06 10:08:28 +02:00
										 |  |  |   deleteRepo: (repository: Repository, () => void) => void, | 
					
						
							| 
									
										
										
										
											2018-08-01 18:23:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // context props
 | 
					
						
							|  |  |  |   t: string => string, | 
					
						
							| 
									
										
										
										
											2018-08-06 10:08:28 +02:00
										 |  |  |   history: History, | 
					
						
							| 
									
										
										
										
											2018-08-01 18:23:16 +02:00
										 |  |  |   match: any | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RepositoryRoot extends React.Component<Props> { | 
					
						
							|  |  |  |   componentDidMount() { | 
					
						
							|  |  |  |     const { fetchRepo, namespace, name } = this.props; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fetchRepo(namespace, name); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   stripEndingSlash = (url: string) => { | 
					
						
							|  |  |  |     if (url.endsWith("/")) { | 
					
						
							|  |  |  |       return url.substring(0, url.length - 2); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return url; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   matchedUrl = () => { | 
					
						
							|  |  |  |     return this.stripEndingSlash(this.props.match.url); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-06 10:08:28 +02:00
										 |  |  |   deleted = () => { | 
					
						
							|  |  |  |     this.props.history.push("/repos"); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   delete = (repository: Repository) => { | 
					
						
							|  |  |  |     this.props.deleteRepo(repository, this.deleted); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-01 18:23:16 +02:00
										 |  |  |   render() { | 
					
						
							|  |  |  |     const { loading, error, repository, t } = this.props; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (error) { | 
					
						
							|  |  |  |       return ( | 
					
						
							|  |  |  |         <ErrorPage | 
					
						
							|  |  |  |           title={t("repository-root.error-title")} | 
					
						
							|  |  |  |           subtitle={t("repository-root.error-subtitle")} | 
					
						
							|  |  |  |           error={error} | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!repository || loading) { | 
					
						
							| 
									
										
										
										
											2018-08-03 09:34:39 +02:00
										 |  |  |       return <Loading />; | 
					
						
							| 
									
										
										
										
											2018-08-01 18:23:16 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const url = this.matchedUrl(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-03 09:34:39 +02:00
										 |  |  |     return ( | 
					
						
							|  |  |  |       <Page title={repository.namespace + "/" + repository.name}> | 
					
						
							|  |  |  |         <div className="columns"> | 
					
						
							|  |  |  |           <div className="column is-three-quarters"> | 
					
						
							|  |  |  |             <Route | 
					
						
							|  |  |  |               path={url} | 
					
						
							|  |  |  |               exact | 
					
						
							|  |  |  |               component={() => <RepositoryDetails repository={repository} />} | 
					
						
							|  |  |  |             /> | 
					
						
							| 
									
										
										
										
											2018-08-06 15:41:20 +02:00
										 |  |  |             <Route | 
					
						
							|  |  |  |               path={`${url}/edit`} | 
					
						
							|  |  |  |               component={() => <Edit repository={repository} />} | 
					
						
							|  |  |  |             /> | 
					
						
							| 
									
										
										
										
											2018-09-28 14:30:26 +02:00
										 |  |  |             <Route | 
					
						
							|  |  |  |               path={`${url}/diff`} | 
					
						
							|  |  |  |               component={() => ( | 
					
						
							|  |  |  |                 <ScmDiff | 
					
						
							|  |  |  |                   namespace={"scmadmin"} | 
					
						
							|  |  |  |                   name={"foo"} | 
					
						
							|  |  |  |                   revision={"4c18735d4c3bd89242284ed3eac52592637024b6"} | 
					
						
							|  |  |  |                 /> | 
					
						
							|  |  |  |               )} | 
					
						
							|  |  |  |             /> | 
					
						
							| 
									
										
										
										
											2018-08-21 15:37:45 +02:00
										 |  |  |             <Route | 
					
						
							|  |  |  |               path={`${url}/permissions`} | 
					
						
							| 
									
										
										
										
											2018-09-03 16:00:47 +02:00
										 |  |  |               render={props => ( | 
					
						
							| 
									
										
										
										
											2018-08-23 11:00:14 +02:00
										 |  |  |                 <Permissions | 
					
						
							| 
									
										
										
										
											2018-09-03 16:00:47 +02:00
										 |  |  |                   namespace={this.props.repository.namespace} | 
					
						
							|  |  |  |                   repoName={this.props.repository.name} | 
					
						
							| 
									
										
										
										
											2018-08-23 11:00:14 +02:00
										 |  |  |                 /> | 
					
						
							|  |  |  |               )} | 
					
						
							| 
									
										
										
										
											2018-08-21 15:37:45 +02:00
										 |  |  |             /> | 
					
						
							| 
									
										
										
										
											2018-08-03 09:34:39 +02:00
										 |  |  |           </div> | 
					
						
							|  |  |  |           <div className="column"> | 
					
						
							|  |  |  |             <Navigation> | 
					
						
							| 
									
										
										
										
											2018-08-07 15:08:44 +02:00
										 |  |  |               <Section label={t("repository-root.navigation-label")}> | 
					
						
							|  |  |  |                 <NavLink to={url} label={t("repository-root.information")} /> | 
					
						
							| 
									
										
										
										
											2018-08-23 09:10:38 +02:00
										 |  |  |                 <PermissionsNavLink | 
					
						
							|  |  |  |                   permissionUrl={`${url}/permissions`} | 
					
						
							|  |  |  |                   repository={repository} | 
					
						
							|  |  |  |                 /> | 
					
						
							| 
									
										
										
										
											2018-08-06 15:41:20 +02:00
										 |  |  |                 <EditNavLink repository={repository} editUrl={`${url}/edit`} /> | 
					
						
							| 
									
										
										
										
											2018-08-07 15:08:44 +02:00
										 |  |  |               </Section> | 
					
						
							|  |  |  |               <Section label={t("repository-root.actions-label")}> | 
					
						
							| 
									
										
										
										
											2018-08-06 10:08:28 +02:00
										 |  |  |                 <DeleteNavAction repository={repository} delete={this.delete} /> | 
					
						
							| 
									
										
										
										
											2018-08-03 09:34:39 +02:00
										 |  |  |                 <NavLink to="/repos" label={t("repository-root.back-label")} /> | 
					
						
							|  |  |  |               </Section> | 
					
						
							| 
									
										
										
										
											2018-09-28 14:30:26 +02:00
										 |  |  |               <Section label="Diff"> | 
					
						
							|  |  |  |                 <NavLink to={`${url}/diff`} label="Diff" /> | 
					
						
							|  |  |  |               </Section> | 
					
						
							| 
									
										
										
										
											2018-08-03 09:34:39 +02:00
										 |  |  |             </Navigation> | 
					
						
							|  |  |  |           </div> | 
					
						
							| 
									
										
										
										
											2018-08-01 18:23:16 +02:00
										 |  |  |         </div> | 
					
						
							| 
									
										
										
										
											2018-08-03 09:34:39 +02:00
										 |  |  |       </Page> | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2018-08-01 18:23:16 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const mapStateToProps = (state, ownProps) => { | 
					
						
							|  |  |  |   const { namespace, name } = ownProps.match.params; | 
					
						
							|  |  |  |   const repository = getRepository(state, namespace, name); | 
					
						
							|  |  |  |   const loading = isFetchRepoPending(state, namespace, name); | 
					
						
							|  |  |  |   const error = getFetchRepoFailure(state, namespace, name); | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     namespace, | 
					
						
							|  |  |  |     name, | 
					
						
							|  |  |  |     repository, | 
					
						
							|  |  |  |     loading, | 
					
						
							|  |  |  |     error | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const mapDispatchToProps = dispatch => { | 
					
						
							|  |  |  |   return { | 
					
						
							| 
									
										
										
										
											2018-08-03 09:34:39 +02:00
										 |  |  |     fetchRepo: (namespace: string, name: string) => { | 
					
						
							|  |  |  |       dispatch(fetchRepo(namespace, name)); | 
					
						
							| 
									
										
										
										
											2018-08-06 10:08:28 +02:00
										 |  |  |     }, | 
					
						
							|  |  |  |     deleteRepo: (repository: Repository, callback: () => void) => { | 
					
						
							|  |  |  |       dispatch(deleteRepo(repository, callback)); | 
					
						
							| 
									
										
										
										
											2018-08-01 18:23:16 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default connect( | 
					
						
							|  |  |  |   mapStateToProps, | 
					
						
							|  |  |  |   mapDispatchToProps | 
					
						
							|  |  |  | )(translate("repos")(RepositoryRoot)); |