@@ -0,0 +1,82 @@ | |||
import { h, Component } from 'preact'; | |||
import makeArvadosRequest from 'make-arvados-request'; | |||
import WBPagination from 'wb-pagination'; | |||
import WBTable from 'wb-table'; | |||
class WBBrowseDialogProjectList extends Component { | |||
constructor(...args) { | |||
super(...args); | |||
this.state.rows = []; | |||
} | |||
componentDidMount() { | |||
this.fetchRows(); | |||
} | |||
componentWillReceiveProps(nextProps) { | |||
this.props = nextProps; | |||
this.setState({ | |||
'page': 0 | |||
}); | |||
this.fetchRows(); | |||
} | |||
changePage(page) { | |||
this.setState({ | |||
'page': page | |||
}); | |||
this.fetchRows(); | |||
} | |||
prepareRows(items) { | |||
return items.map(it => [ | |||
it.name, | |||
it.file_count, | |||
it.file_size_total | |||
]); | |||
} | |||
fetchRows() { | |||
const { arvHost, arvToken } = this.props.app.state; | |||
const { textSearch, itemsPerPage } = this.props; | |||
const ownerUuid = ('ownerUuid' in this.state ? | |||
this.state.ownerUuid : this.props.ownerUuid); | |||
const { page } = this.state; | |||
const filters = [ | |||
['group_class', '=', 'project'] | |||
]; | |||
if (ownerUuid) | |||
filters.push(['owner_uuid', '=', ownerUuid]); | |||
if (textSearch) | |||
filters.push(['name', 'ilike', '%' + textSearch + '%']); | |||
let prom = makeArvadosRequest(arvHost, arvToken, | |||
'/arvados/v1/groups?filters=' + | |||
encodeURIComponent(JSON.stringify(filters)) + | |||
'&limit=' + itemsPerPage + | |||
'&offset=' + (page * itemsPerPage)); | |||
prom = prom.then(xhr => { | |||
this.setState({ | |||
'rows': this.prepareRows(xhr.response.items), | |||
'numPages': xhr.response.items_available / itemsPerPage | |||
}); | |||
}); | |||
} | |||
render({ app }, { ownerUuid, textSearch, page, numPages, rows }) { | |||
return ( | |||
<div> | |||
<WBTable columns={ ['Name', 'File Count', 'Size'] } | |||
rows={ rows } /> | |||
<WBPagination numPages={ numPages } activePage={ page } | |||
onPageChanged={ i => this.changePage(i) } /> | |||
</div> | |||
); | |||
} | |||
} | |||
WBBrowseDialogProjectList.defaultProps = { | |||
'itemsPerPage': 5 | |||
}; | |||
export default WBBrowseDialogProjectList; |
@@ -0,0 +1,60 @@ | |||
import { h, Component } from 'preact'; | |||
import WBBrowseDialogProjectList from 'wb-browse-dialog-project-list'; | |||
import WBBrowseDialogCollectionList from 'wb-browse-dialog-project-list'; | |||
class WBBrowseDialog extends Component { | |||
render({ app, id }, { mode }) { | |||
return ( | |||
<div class="modal" id={ id } tabindex="-1" role="dialog"> | |||
<div class="modal-dialog modal-lg" role="document"> | |||
<div class="modal-content"> | |||
<div class="modal-header"> | |||
<h5 class="modal-title">Browse</h5> | |||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> | |||
<span aria-hidden="true">×</span> | |||
</button> | |||
</div> | |||
<div class="modal-body"> | |||
<button class="btn btn-sm btn-outline-primary">Back</button> | |||
<input class="form-control" type="search" placeholder="Search" /> | |||
<div class="input-group mb-3"> | |||
<div class="input-group-prepend"> | |||
<button class="btn btn-outline-secondary" type="button">Back</button> | |||
</div> | |||
<input type="text" class="form-control" placeholder="Search" | |||
aria-label="Search" /> | |||
<div class="input-group-append"> | |||
<button class="btn btn-outline-primary" type="button">Search</button> | |||
</div> | |||
</div> | |||
<h5>Projects</h5> | |||
<WBBrowseDialogProjectList app={ app } /> | |||
{ mode === 'collection-content' ? ( | |||
<h5>Content</h5> | |||
) : ( | |||
<div> | |||
<h5>Collections</h5> | |||
<WBBrowseDialogCollectionList app={ app } /> | |||
</div> | |||
) } | |||
</div> | |||
<div class="modal-footer"> | |||
<button type="button" class="btn btn-primary">Accept</button> | |||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
); | |||
} | |||
} | |||
export default WBBrowseDialog; |
@@ -2,6 +2,7 @@ import { h, Component, createRef } from 'preact'; | |||
import WBNavbarCommon from 'wb-navbar-common'; | |||
import WBArvadosCrumbs from 'wb-arvados-crumbs'; | |||
import WBToolboxDialog from 'wb-toolbox-dialog'; | |||
import WBBrowseDialog from 'wb-browse-dialog'; | |||
import makeArvadosRequest from 'make-arvados-request'; | |||
import linkState from 'linkstate'; | |||
@@ -58,6 +59,7 @@ class WBLaunchWorkflowPage extends Component { | |||
this.state.browseDialogId = uuid.v4(); | |||
this.state.insertDialogId = uuid.v4(); | |||
this.state.insertManyDialogId = uuid.v4(); | |||
this.state.realBrowseDialogId = uuid.v4(); | |||
this.inputsTextArea = createRef(); | |||
} | |||
@@ -82,7 +84,7 @@ class WBLaunchWorkflowPage extends Component { | |||
defaultProcessName, defaultProcessDescription, | |||
inputsFunctionText, browseDialogId, | |||
insertDialogId, insertManyDialogId, | |||
inputsPreview }) { | |||
realBrowseDialogId, inputsPreview }) { | |||
return ( | |||
<div> | |||
@@ -108,6 +110,8 @@ class WBLaunchWorkflowPage extends Component { | |||
items={ app.state.toolboxItems } selectMany={ true } | |||
onAccepted={ values => alert(values) } /> | |||
<WBBrowseDialog app={ app } id={ realBrowseDialogId } /> | |||
{ workflow ? | |||
(<form class="container-fluid"> | |||
<h1>Launch Workflow</h1> | |||
@@ -171,6 +175,11 @@ class WBLaunchWorkflowPage extends Component { | |||
e.preventDefault(); | |||
$('#' + insertManyDialogId).modal(); | |||
} }>Insert Many</button> | |||
<button class="btn btn-primary mr-2" onclick={ e => { | |||
e.preventDefault(); | |||
$('#' + realBrowseDialogId).modal(); | |||
} }>Insert Browse</button> | |||
</div> | |||
<textarea class="form-control" ref={ this.inputsTextArea } id="inputs" | |||