@@ -0,0 +1,39 @@ | |||
import { h, Component } from 'preact'; | |||
import WBBreadcrumbs from 'wb-breadcrumbs'; | |||
import fetchObjectParents from 'fetch-object-parents'; | |||
class WBArvadosCrumbs extends Component { | |||
constructor(...args) { | |||
super(...args); | |||
this.state.items = [ { 'name': 'All Projects' } ]; | |||
} | |||
fetchCrumbs() { | |||
if (!this.props.uuid) { | |||
this.setState({ 'items': [ { 'name': 'All Projects' } ] }); | |||
return; | |||
} | |||
let { arvHost, arvToken } = this.props.app.state; | |||
let prom = fetchObjectParents(arvHost, arvToken, this.props.uuid); | |||
prom = prom.then(parents => this.setState({ 'items': parents })); | |||
} | |||
componentDidMount() { | |||
this.fetchCrumbs(); | |||
} | |||
componentWillReceiveProps(nextProps) { | |||
this.props = nextProps; | |||
this.fetchCrumbs(); | |||
} | |||
render({ app }, { items }) { | |||
return ( | |||
<WBBreadcrumbs items={ items } | |||
onItemClicked={ item => app.breadcrumbClicked(item) } /> | |||
); | |||
} | |||
} | |||
export default WBArvadosCrumbs; |
@@ -0,0 +1,24 @@ | |||
import { h, Component } from 'preact'; | |||
import WBNavbar from 'wb-navbar'; | |||
import WBInlineSearch from 'wb-inline-search'; | |||
class WBNavbarCommon extends Component { | |||
render({ app, items, activeItem }) { | |||
return ( | |||
<WBNavbar items={ [ | |||
{ 'name': 'Home', 'id': 'home' }, | |||
{ 'name': 'All Projects', 'id': 'all-projects' }, | |||
{ 'name': 'User', 'dropdown': [ { 'id': 'sign-out', 'name': 'Sign Out' } ]} | |||
].concat(items) } rhs={ ( | |||
<WBInlineSearch /> | |||
) } onItemClicked={ item => app.navbarItemClicked(item) } | |||
activeItem={ activeItem } /> | |||
); | |||
} | |||
} | |||
WBNavbarCommon.defaultProps = { | |||
'items': [] | |||
}; | |||
export default WBNavbarCommon; |
@@ -0,0 +1,13 @@ | |||
const typeIdToName = { | |||
'tpzed': 'user', | |||
'j7d0g': 'group', | |||
'xvhdp': 'container_request', | |||
'dz642': 'container', | |||
'7fd4e': 'workflow' | |||
}; | |||
function arvadosTypeName(id) { | |||
return typeIdToName[id]; | |||
} | |||
export default arvadosTypeName; |
@@ -0,0 +1,49 @@ | |||
import makeArvadosRequest from 'make-arvados-request'; | |||
import arvadosTypeName from 'arvados-type-name'; | |||
function fetchObjectParents(arvHost, arvToken, uuid) { | |||
let parents = []; | |||
let cb = xhr => { | |||
let objectType = arvadosTypeName(xhr.response['uuid'].split('-')[1]); | |||
let item = { | |||
'uuid': xhr.response['uuid'] | |||
}; | |||
if (objectType === 'user') { | |||
item['name'] = xhr.response['first_name'] + ' ' + xhr.response['last_name']; | |||
} else { | |||
item['name'] = xhr.response['name']; | |||
} | |||
if (objectType === 'group') { | |||
item['group_class'] = xhr.response['group_class']; | |||
} | |||
parents.push(item); | |||
if (!xhr.response['owner_uuid'] || | |||
xhr.response['owner_uuid'].endsWith('-tpzed-000000000000000')) { | |||
return parents.reverse(); | |||
} | |||
objectType = arvadosTypeName(xhr.response['owner_uuid'].split('-')[1]); | |||
return makeArvadosRequest(arvHost, arvToken, | |||
'/arvados/v1/' + objectType + 's' + | |||
'/' + xhr.response['owner_uuid']).then(cb); | |||
}; | |||
let objectType = arvadosTypeName(uuid.split('-')[1]); | |||
let prom = makeArvadosRequest(arvHost, arvToken, | |||
'/arvados/v1/' + objectType + 's' + | |||
'/' + uuid); | |||
prom = prom.then(cb); | |||
return prom; | |||
} | |||
export default fetchObjectParents; |
@@ -3,6 +3,8 @@ import { Router, route } from 'preact-router'; | |||
import WBBrowse from 'wb-browse'; | |||
import WBSignIn from 'wb-sign-in'; | |||
import WBLandingPage from 'wb-landing-page'; | |||
import WBProcessView from 'wb-process-view'; | |||
import arvadosTypeName from 'arvados-type-name'; | |||
class WBApp extends Component { | |||
constructor(...args) { | |||
@@ -37,6 +39,16 @@ class WBApp extends Component { | |||
} | |||
} | |||
breadcrumbClicked(item) { | |||
let objectType = arvadosTypeName(item.uuid.split('-')[1]); | |||
if (objectType === 'user') | |||
route('/browse/' + item.uuid) | |||
else if (objectType === 'group' && item.group_class === 'project') | |||
route('/browse/' + item.uuid); | |||
else if (objectType === 'container_request') | |||
route('/process/' + item.uuid) | |||
} | |||
render() { | |||
return ( | |||
<Router> | |||
@@ -47,6 +59,8 @@ class WBApp extends Component { | |||
<WBBrowse path="/browse/:ownerUuid?/:activePage?/:objTypeTab?/:collectionPage?/:processPage?/:workflowPage?" | |||
appCallbacks={ this.appCallbacks } | |||
appState={ this.appState } /> | |||
<WBProcessView path="/process/:uuid" app={ this } /> | |||
</Router> | |||
); | |||
} | |||
@@ -0,0 +1,19 @@ | |||
import { h, Component } from 'preact'; | |||
import WBNavbarCommon from 'wb-navbar-common'; | |||
import WBArvadosCrumbs from 'wb-arvados-crumbs'; | |||
class WBProcessView extends Component { | |||
render({ app, uuid }) { | |||
return ( | |||
<div> | |||
<WBNavbarCommon app={ app } /> | |||
<WBArvadosCrumbs app={ app } uuid={ uuid } /> | |||
<div class="my-2">This is the process view for { uuid }</div> | |||
</div> | |||
); | |||
} | |||
} | |||
export default WBProcessView; |
@@ -1,7 +1,7 @@ | |||
import { h, Component } from 'preact'; | |||
class WBNavbar extends Component { | |||
render({ title, items, rhs, onItemClicked, onTitleClicked }) { | |||
render({ title, items, rhs, onItemClicked, onTitleClicked, activeItem }) { | |||
return ( | |||
<nav class="navbar navbar-expand-lg navbar-light bg-light"> | |||
<a class="navbar-brand" href="#" onclick={ e => { e.preventDefault(); onTitleClicked(); } }>{ title }</a> | |||
@@ -23,7 +23,7 @@ class WBNavbar extends Component { | |||
else if (typeof(i) === 'object') | |||
var li_cls = ['nav-item']; | |||
if (i['active']) | |||
if (i['active'] || activeItem === i['id']) | |||
li_cls.push('active'); | |||
var a_cls = ['nav-link']; | |||
if (i['disabled']) | |||
@@ -87,7 +87,8 @@ WBNavbar.defaultProps = { | |||
'items': [], | |||
'form': null, | |||
'onItemClicked': () => {}, | |||
'onTitleClicked': () => {} | |||
'onTitleClicked': () => {}, | |||
'activeItem': null | |||
} | |||
export default WBNavbar; |