@@ -1,11 +1,72 @@ | |||||
import { h, Component } from 'preact'; | import { h, Component } from 'preact'; | ||||
import WBTable from 'wb-table'; | |||||
import WBPagination from 'wb-pagination'; | |||||
import makeArvadosRequest from 'make-arvados-request'; | |||||
class WBBrowseDialogCollectionList extends Component { | class WBBrowseDialogCollectionList extends Component { | ||||
render() { | |||||
constructor(...args) { | |||||
super(...args); | |||||
this.state.rows = []; | |||||
} | |||||
componentDidMount() { | |||||
this.fetchRows(); | |||||
} | |||||
componentWillReceiveProps(nextProps) { | |||||
this.props = nextProps; | |||||
this.fetchRows(); | |||||
} | |||||
prepareRows(items) { | |||||
const { navigate, selectWhat, makeSelectionCell } = this.props; | |||||
return items.map(it => (selectWhat === 'directory' ? [ | |||||
makeSelectionCell(it.uuid) | |||||
] : []).concat([ | |||||
( | |||||
<a href="#" onclick={ e => { e.preventDefault(); | |||||
navigate('/browse-dialog/content/' + it.uuid); } }>{ it.name }</a> | |||||
), | |||||
it.uuid | |||||
])); | |||||
} | |||||
fetchRows() { | |||||
const { arvHost, arvToken } = this.props.app.state; | |||||
const { ownerUuid, textSearch, page, itemsPerPage } = this.props; | |||||
const filters = []; | |||||
if (ownerUuid) | |||||
filters.push(['owner_uuid', '=', ownerUuid]); | |||||
if (textSearch) | |||||
filters.push(['name', 'ilike', '%' + textSearch + '%']); | |||||
let prom = makeArvadosRequest(arvHost, arvToken, | |||||
'/arvados/v1/collections?filters=' + | |||||
encodeURIComponent(JSON.stringify(filters)) + | |||||
'&limit=' + itemsPerPage + | |||||
'&offset=' + (itemsPerPage * page)); | |||||
prom = prom.then(xhr => this.setState({ | |||||
'rows': this.prepareRows(xhr.response.items), | |||||
'numPages': Math.ceil(xhr.response.items_available / itemsPerPage) | |||||
})); | |||||
return prom; | |||||
} | |||||
render({ selectWhat, page, navigate }, { rows, numPages }) { | |||||
return ( | return ( | ||||
<div>WBBrowseDialogCollectionList</div> | |||||
<div> | |||||
<WBTable columns={ (selectWhat === 'directory' ? [''] : []).concat(['Name', 'UUID']) } | |||||
headerClasses={ selectWhat === 'directory' ? ['col-sm-1', 'col-sm-4', 'col-sm-4'] : [] } | |||||
rows={ rows } /> | |||||
<WBPagination activePage={ page } numPages={ numPages } | |||||
onPageChanged={ i => navigate({ 'bottomPage': i }) } /> | |||||
</div> | |||||
); | ); | ||||
} | } | ||||
} | } | ||||
WBBrowseDialogCollectionList.defaultProps = { | |||||
'itemsPerPage': 20 | |||||
}; | |||||
export default WBBrowseDialogCollectionList; | export default WBBrowseDialogCollectionList; |
@@ -20,8 +20,8 @@ class WBBrowseDialogProjectList extends Component { | |||||
} | } | ||||
prepareRows(items) { | prepareRows(items) { | ||||
const { navigate } = this.props; | |||||
return items.map(it => [ | |||||
const { navigate, selectWhat, makeSelectionCell } = this.props; | |||||
return items.map(it => (selectWhat === 'owner' ? [ makeSelectionCell(it.uuid, 'project') ] : []).concat([ | |||||
( | ( | ||||
<a href="#" onclick={ e => { | <a href="#" onclick={ e => { | ||||
e.preventDefault(); | e.preventDefault(); | ||||
@@ -29,7 +29,7 @@ class WBBrowseDialogProjectList extends Component { | |||||
} }>{ it.name }</a> | } }>{ it.name }</a> | ||||
), | ), | ||||
it.uuid | it.uuid | ||||
]); | |||||
])); | |||||
} | } | ||||
fetchSharedWithMe() { | fetchSharedWithMe() { | ||||
@@ -83,10 +83,11 @@ class WBBrowseDialogProjectList extends Component { | |||||
return prom; | return prom; | ||||
} | } | ||||
render({ app, navigate, page }, { numPages, rows }) { | |||||
render({ app, navigate, page, selectWhat }, { numPages, rows }) { | |||||
return ( | return ( | ||||
<div> | <div> | ||||
<WBTable columns={ ['Name', 'UUID'] } | |||||
<WBTable columns={ (selectWhat === 'owner' ? [''] : []).concat(['Name', 'UUID']) } | |||||
headerClasses={ selectWhat === 'owner' ? ['col-sm-1', 'col-sm-4', 'col-sm-4'] : [] } | |||||
rows={ rows } /> | rows={ rows } /> | ||||
<WBPagination numPages={ numPages } activePage={ page } | <WBPagination numPages={ numPages } activePage={ page } | ||||
@@ -41,6 +41,8 @@ class WBBrowseDialogUserList extends Component { | |||||
let prom = makeArvadosRequest(arvHost, arvToken, | let prom = makeArvadosRequest(arvHost, arvToken, | ||||
'/arvados/v1/users?order=' + | '/arvados/v1/users?order=' + | ||||
encodeURIComponent(JSON.stringify(order)) + | encodeURIComponent(JSON.stringify(order)) + | ||||
'&filters=' + | |||||
encodeURIComponent(JSON.stringify(filters)) + | |||||
'&limit=' + itemsPerPage + | '&limit=' + itemsPerPage + | ||||
'&offset=' + (itemsPerPage * page)); | '&offset=' + (itemsPerPage * page)); | ||||
prom = prom.then(xhr => this.setState({ | prom = prom.then(xhr => this.setState({ | ||||
@@ -105,6 +105,31 @@ class WBBrowseDialog extends Component { | |||||
}); | }); | ||||
} | } | ||||
makeSelectionCell(uuid) { | |||||
const { selectMany, id, accept } = this.props; | |||||
const { selected } = this.state; | |||||
return selectMany ? ( | |||||
<div> | |||||
<input type="checkbox" checked={ (uuid in selected) } | |||||
onChange={ e => { | |||||
if (e.target.value === 'on') | |||||
this.select(uuid); | |||||
else | |||||
this.deselect(uuid); | |||||
} } /> { '\u00A0' } | |||||
</div> | |||||
) : ( | |||||
<button class="btn btn-outline-primary" title="Use" | |||||
onclick={ () => { | |||||
$('#' + id).modal('hide'); | |||||
accept(uuid); | |||||
} }> | |||||
<i class="fas fa-hand-pointer"></i> | |||||
</button> | |||||
); | |||||
} | |||||
render({ app, id, selectMany, selectWhat }, { history, currentUrl, mode, uuid, topPage, bottomPage, textSearch }) { | render({ app, id, selectMany, selectWhat }, { history, currentUrl, mode, uuid, topPage, bottomPage, textSearch }) { | ||||
return ( | return ( | ||||
<div class="modal" id={ id } tabindex="-1" role="dialog"> | <div class="modal" id={ id } tabindex="-1" role="dialog"> | ||||
@@ -141,7 +166,7 @@ class WBBrowseDialog extends Component { | |||||
<div class="input-group mb-3"> | <div class="input-group mb-3"> | ||||
<input type="text" class="form-control" placeholder="Search" | <input type="text" class="form-control" placeholder="Search" | ||||
aria-label="Search" value={ textSearch } | aria-label="Search" value={ textSearch } | ||||
onChange={ e => this.setState({ | |||||
onChange={ e => this.navigate({ | |||||
'textSearch': e.target.value, | 'textSearch': e.target.value, | ||||
'topPage': 0, | 'topPage': 0, | ||||
'bottomPage': 0}) } /> | 'bottomPage': 0}) } /> | ||||
@@ -157,7 +182,9 @@ class WBBrowseDialog extends Component { | |||||
<WBBrowseDialogProjectList app={ app } | <WBBrowseDialogProjectList app={ app } | ||||
navigate={ url => this.navigate(url) } | navigate={ url => this.navigate(url) } | ||||
mode={ mode } ownerUuid={ uuid } | mode={ mode } ownerUuid={ uuid } | ||||
page={ topPage } textSearch={ textSearch } /> | |||||
page={ topPage } textSearch={ textSearch } | |||||
selectWhat={ selectWhat } | |||||
makeSelectionCell={ uuid => this.makeSelectionCell(uuid) } /> | |||||
</div> | </div> | ||||
) : null } | ) : null } | ||||
@@ -174,11 +201,14 @@ class WBBrowseDialog extends Component { | |||||
selectMany={ selectMany } selectWhat={ selectWhat }/> | selectMany={ selectMany } selectWhat={ selectWhat }/> | ||||
</div> | </div> | ||||
) : (mode === 'browse' || mode === 'shared-with-me') ? ( | |||||
) : (selectWhat !== 'owner' && mode === 'browse') ? ( | |||||
<div> | <div> | ||||
<h5>Collections</h5> | <h5>Collections</h5> | ||||
<WBBrowseDialogCollectionList app={ app } parent={ this } | |||||
selectMany={ selectMany } selectWhat={ selectWhat } /> | |||||
<WBBrowseDialogCollectionList app={ app } | |||||
page={ bottomPage } textSearch={ textSearch } | |||||
navigate={ url => this.navigate(url) } | |||||
ownerUuid={ uuid } selectWhat={ selectWhat } | |||||
makeSelectionCell={ uuid => this.makeSelectionCell(uuid) } /> | |||||
</div> | </div> | ||||
) : null } | ) : null } | ||||
</div> | </div> | ||||
@@ -194,4 +224,8 @@ class WBBrowseDialog extends Component { | |||||
} | } | ||||
} | } | ||||
WBBrowseDialog.defaultProps = { | |||||
'accept': () => {} | |||||
}; | |||||
export default WBBrowseDialog; | export default WBBrowseDialog; |
@@ -110,7 +110,8 @@ class WBLaunchWorkflowPage extends Component { | |||||
items={ app.state.toolboxItems } selectMany={ true } | items={ app.state.toolboxItems } selectMany={ true } | ||||
onAccepted={ values => alert(values) } /> | onAccepted={ values => alert(values) } /> | ||||
<WBBrowseDialog app={ app } id={ realBrowseDialogId } /> | |||||
<WBBrowseDialog app={ app } id={ realBrowseDialogId } | |||||
selectWhat="directory" /> | |||||
{ workflow ? | { workflow ? | ||||
(<form class="container-fluid"> | (<form class="container-fluid"> | ||||