| @@ -0,0 +1,34 @@ | |||
| import { h, Component } from 'preact'; | |||
| import WBBreadcrumbs from 'wb-breadcrumbs'; | |||
| import fetchProjectParents from 'fetch-project-parents'; | |||
| class WBProjectCrumbs extends Component { | |||
| constructor(...args) { | |||
| super(...args); | |||
| this.state.items = []; | |||
| } | |||
| fetchCrumbs() { | |||
| let { arvHost, arvToken } = this.props.appState; | |||
| let prom = fetchProjectParents(arvHost, arvToken, this.props.uuid); | |||
| prom = prom.then(parents => this.setState({ 'items': parents })); | |||
| } | |||
| componentDidMount() { | |||
| this.fetchCrumbs(); | |||
| } | |||
| componentWillReceiveProps(nextProps) { | |||
| this.props = nextProps; | |||
| this.fetchCrumbs(); | |||
| } | |||
| render({ onItemClicked }, { items }) { | |||
| return ( | |||
| <WBBreadcrumbs items={ items } | |||
| onItemClicked={ onItemClicked } /> | |||
| ); | |||
| } | |||
| } | |||
| export default WBProjectCrumbs; | |||
| @@ -0,0 +1,43 @@ | |||
| import makeArvadosRequest from 'make-arvados-request'; | |||
| function fetchProjectParents(arvHost, arvToken, uuid) { | |||
| let parents = []; | |||
| let cb = xhr => { | |||
| let objectType = xhr.response['uuid'].split('-')[1]; | |||
| if (objectType === 'tpzed') { | |||
| let name = xhr.response['first_name'] + ' ' + xhr.response['last_name']; | |||
| parents.push({ 'name': name, 'uuid': xhr.response['uuid'] }); | |||
| } else { | |||
| parents.push({ 'name': xhr.response['name'], | |||
| 'uuid': xhr.response['uuid'] }); | |||
| } | |||
| if (!xhr.response['owner_uuid'] || | |||
| xhr.response['owner_uuid'].endsWith('-tpzed-000000000000000')) { | |||
| return parents.reverse(); | |||
| } | |||
| objectType = xhr.response['owner_uuid'].split('-')[1]; | |||
| if (objectType === 'tpzed') { | |||
| return makeArvadosRequest(arvHost, arvToken, | |||
| '/arvados/v1/users/' + xhr.response['owner_uuid']).then(cb); | |||
| } else { | |||
| return makeArvadosRequest(arvHost, arvToken, | |||
| '/arvados/v1/groups/' + xhr.response['owner_uuid']).then(cb); | |||
| } | |||
| }; | |||
| let objectType = uuid.split('-')[1]; | |||
| let prom = makeArvadosRequest(arvHost, arvToken, | |||
| '/arvados/v1/' + (objectType === 'tpzed' ? 'users' : 'groups') + '/' + uuid); | |||
| prom = prom.then(cb); | |||
| return prom; | |||
| } | |||
| export default fetchProjectParents; | |||
| @@ -12,6 +12,10 @@ class WBApp extends Component { | |||
| this.appCallbacks = { | |||
| 'navbarItemClicked': this.navbarItemClicked | |||
| }; | |||
| this.appState = { | |||
| 'arvHost': this.state.arvHost, | |||
| 'arvToken': this.state.arvToken | |||
| }; | |||
| } | |||
| navbarItemClicked(item) { | |||
| @@ -23,14 +27,16 @@ class WBApp extends Component { | |||
| } | |||
| } | |||
| render({}, { activePage, arvHost, arvToken }) { | |||
| render() { | |||
| return ( | |||
| <Router> | |||
| <WBLandingPage path="/" /> | |||
| <WBSignIn path="/sign-in" /> | |||
| <WBBrowse path="/browse/:ownerUuid?/:activePage?" appCallbacks={ this.appCallbacks } /> | |||
| <WBBrowse path="/browse/:ownerUuid?/:activePage?" | |||
| appCallbacks={ this.appCallbacks } | |||
| appState={ this.appState } /> | |||
| </Router> | |||
| ); | |||
| } | |||
| @@ -3,9 +3,10 @@ import { route } from 'preact-router'; | |||
| import WBNavbar from 'wb-navbar'; | |||
| import WBProjectListing from 'wb-project-listing'; | |||
| import WBInlineSearch from 'wb-inline-search'; | |||
| import WBProjectCrumbs from 'wb-project-crumbs'; | |||
| class WBBrowse extends Component { | |||
| render({ ownerUuid, activePage, appCallbacks }) { | |||
| render({ ownerUuid, activePage, appCallbacks, appState }) { | |||
| return ( | |||
| <div> | |||
| <WBNavbar items={ [ | |||
| @@ -15,8 +16,11 @@ class WBBrowse extends Component { | |||
| <WBInlineSearch /> | |||
| ) } onItemClicked={ appCallbacks.navbarItemClicked } /> | |||
| <WBProjectListing arvHost="api.arkau.roche.com" | |||
| arvToken="v2/arkau-gj3su-uf4hnu2o2qkvm8j/15kla38mafzq6b31d5t74ynhk6iuy32v1ticslodr0obvvhde9" | |||
| <WBProjectCrumbs uuid={ ownerUuid } appState={ appState } | |||
| onItemClicked={ item => route('/browse/' + item['uuid']) } /> | |||
| <WBProjectListing arvHost={ appState.arvHost } | |||
| arvToken={ appState.arvToken } | |||
| ownerUuid={ ownerUuid } | |||
| itemsPerPage="5" | |||
| activePage={ Number(activePage || 0) } | |||
| @@ -0,0 +1,31 @@ | |||
| import { h, Component } from 'preact'; | |||
| class WBBreadcrumbs extends Component { | |||
| render({ items, onItemClicked }) { | |||
| return ( | |||
| <nav aria-label="breadcrumb"> | |||
| <ol class="breadcrumb"> | |||
| { items.map((item, idx) => ( | |||
| <li class={ 'breadcrumb-item' + | |||
| (idx == items.length - 1 ? ' active' : '') }> | |||
| { | |||
| (idx < items.length - 1) ? ( | |||
| <a href="#" onclick={ e => { e.preventDefault(); | |||
| onItemClicked(item); } }>{ typeof(item) === 'string' ? item : item['name'] }</a> | |||
| ) : ( | |||
| typeof(item) === 'string' ? item : item['name'] | |||
| ) | |||
| } | |||
| </li> | |||
| )) } | |||
| </ol> | |||
| </nav> | |||
| ); | |||
| } | |||
| } | |||
| WBBreadcrumbs.defaultProps = { | |||
| 'onItemClicked': () => {} | |||
| } | |||
| export default WBBreadcrumbs; | |||