// // Copyright (C) Stanislaw Adaszewski, 2020 // Contact: s.adaszewski@gmail.com // Website: https://adared.ch/wba // License: GNU Affero General Public License, Version 3 // import { h, Component } from 'preact'; import makeArvadosRequest from 'make-arvados-request'; import WBTable from 'wb-table'; import WBPagination from 'wb-pagination'; import WBNameAndUuid from 'wb-name-and-uuid'; import wbFetchObjects from 'wb-fetch-objects'; import wbFormatDate from 'wb-format-date'; import urlForObject from 'url-for-object'; import arvadosObjectName from 'arvados-object-name'; class WBWorkflowListing extends Component { constructor(...args) { super(...args); this.state.rows = []; this.state.numPages = 0; } componentDidMount() { this.fetchItems(); } prepareRows(items, ownerLookup) { const { renderRenameLink, renderDeleteButton, renderSelectionCell, renderSharingButton, renderEditDescription } = this.props; return items.map(item => [ renderSelectionCell(item), (
{ arvadosObjectName(item) } { renderRenameLink(item, () => this.fetchItems()) }
{ item.uuid }
), (
{ item.description } { renderEditDescription(item, () => this.fetchItems()) }
), ( ), wbFormatDate(item.created_at), (
{ renderDeleteButton(item, () => this.fetchItems()) } { renderSharingButton(item) }
) ]); } fetchItems() { const { arvHost, arvToken } = this.props.app.state; const { page, itemsPerPage, ownerUuid, textSearch } = this.props; const filters = []; if (ownerUuid) filters.push([ 'owner_uuid', '=', ownerUuid ]); if (textSearch) filters.push([ 'any', 'ilike', '%' + textSearch + '%' ]); const select = ['uuid', 'name', 'description', 'owner_uuid', 'created_at']; let prom = makeArvadosRequest(arvHost, arvToken, '/arvados/v1/workflows?filters=' + encodeURIComponent(JSON.stringify(filters)) + '&select=' + encodeURIComponent(JSON.stringify(select)) + '&limit=' + encodeURIComponent(itemsPerPage) + '&offset=' + encodeURIComponent(itemsPerPage * page)); let workflowResp; prom = prom.then(xhr => (workflowResp = xhr.response)); prom = prom.then(() => wbFetchObjects(arvHost, arvToken, workflowResp.items.map(it => it.owner_uuid))); let ownerLookup; prom = prom.then(lookup => (ownerLookup = lookup)); prom = prom.then(() => this.setState({ 'numPages': Math.ceil(workflowResp['items_available'] / workflowResp['limit']), 'rows': this.prepareRows(workflowResp.items, ownerLookup) })); } componentWillReceiveProps(nextProps, nextState) { this.props = nextProps; this.fetchItems(); } render({ app, ownerUuid, page, getPageUrl }, { rows, numPages }) { return (
); } } WBWorkflowListing.defaultProps = { 'itemsPerPage': 100, 'ownerUuid': null, 'renderSharingButton': () => null, 'renderEditDescription': () => null }; export default WBWorkflowListing;