// // 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, createRef } from 'preact'; import { route } from 'preact-router'; import WBNavbarCommon from 'wb-navbar-common'; import WBProjectListing from 'wb-project-listing'; import WBInlineSearch from 'wb-inline-search'; import WBArvadosCrumbs from 'wb-arvados-crumbs'; import WBTabs from 'wb-tabs'; import WBProcessListing from 'wb-process-listing'; import WBCollectionListing from 'wb-collection-listing'; import WBWorkflowListing from 'wb-workflow-listing'; import WBRenameDialog from 'wb-rename-dialog'; import WBDeleteDialog from 'wb-delete-dialog'; import WBNewProjectDialog from 'wb-new-project-dialog'; import WBEditDescriptionDialog from 'wb-edit-description-dialog'; import wbMoveObject from 'wb-move-object'; import wbCopyCollection from 'wb-copy-collection'; import arvadosTypeName from 'arvados-type-name'; class WBBrowseProjectTabs extends Component { render({ ownerUuid, selected, newProjectDialogRef, projectListingRef, moveHere, copyHere }) { return ( New Project ), 'onClick': () => newProjectDialogRef.current.show(ownerUuid, () => projectListingRef.current.fetchItems() ) } : null, ( ownerUuid && Object.keys(selected).length > 0 ) ? { 'name': ( Move Here ), 'onClick': moveHere } : null, ( ownerUuid && (uuids => uuids.length > 0 && uuids.length === uuids.map(arvadosTypeName).filter(a => (a === 'collection')).length )(Object.keys(selected)) ) ? { 'name': ( Copy Here ), 'onClick': copyHere } : null ] } /> ); } } class WBBrowse extends Component { constructor(...args) { super(...args); this.renameDialogRef = createRef(); this.deleteDialogRef = createRef(); this.newProjectDialogRef = createRef(); this.projectListingRef = createRef(); this.projectTabsRef = createRef(); this.editDescriptionDialogRef = createRef(); this.state.selected = {}; } getUrl(params) { const mode = ('mode' in params ? params.mode : this.props.mode); if (mode === 'shared-with-me') return '/shared-with-me/' + ('activePage' in params ? params.activePage : (this.props.activePage || '')) + '/' + ('textSearch' in params ? params.textSearch : (this.props.textSearch || '')); let res = '/browse/' + ('ownerUuid' in params ? params.ownerUuid : (this.props.ownerUuid || '')) + '/' + ('activePage' in params ? params.activePage : (this.props.activePage || '')) + '/' + ('objTypeTab' in params ? params.objTypeTab : (this.props.objTypeTab || '')) + '/' + ('collectionPage' in params ? params.collectionPage : (this.props.collectionPage || '')) + '/' + ('processPage' in params ? params.processPage : (this.props.processPage || '')) + '/' + ('workflowPage' in params ? params.workflowPage : (this.props.workflowPage || '')) + '/' + encodeURIComponent('textSearch' in params ? params.textSearch : (this.props.textSearch || '')); return res; } route(params) { route(this.getUrl(params)); } renameDialog(item, callback) { // throw Error('Not implemented'); this.renameDialogRef.current.show(item, callback); } renderRenameLink(item, callback) { return ( { e.preventDefault(); this.renameDialog(item, callback); } }> ); } renderEditDescription(item, callback) { return ( { e.preventDefault(); this.editDescriptionDialogRef.current.show(item, callback); } }> ); } renderDeleteButton(item, callback) { return ( ); } renderSelectionCell(item) { const { selected } = this.state; const { uuid } = item; return (
{ if (e.target.checked) selected[uuid] = true; else delete selected[uuid]; this.projectTabsRef.current.setState({}); } } /> { '\u00A0' }
); } renderSharingButton(item) { return ( ); } moveOrCopyOp(op) { const { ownerUuid, app } = this.props; const { selected } = this.state; const { arvHost, arvToken } = app.state; let prom = new Promise(accept => accept()); const uuids = Object.keys(selected); for (let i = 0; i < uuids.length; i++) { prom = prom.then(() => op(arvHost, arvToken, uuids[i], ownerUuid)); prom = prom.then(() => ( delete selected[uuids[i]] )); prom = prom.catch(() => {}); } prom = prom.then(() => this.setState({})); } moveHere() { this.moveOrCopyOp(wbMoveObject); } copyHere() { this.moveOrCopyOp(wbCopyCollection); } render({ mode, ownerUuid, activePage, app, objTypeTab, collectionPage, processPage, workflowPage, textSearch }, { selected }) { const commonProps = { renderRenameLink: (it, cb) => this.renderRenameLink(it, cb), renderEditDescription: (it, cb) => this.renderEditDescription(it, cb), renderDeleteButton: (it, cb) => this.renderDeleteButton(it, cb), renderSelectionCell: it => this.renderSelectionCell(it), renderSharingButton: it => this.renderSharingButton(it), textSearch, app, appState: app.state, arvHost: app.state.arvHost, arvToken: app.state.arvToken, ownerUuid }; const { currentUser } = app.state; const noDefaultTab = (!ownerUuid || ownerUuid === currentUser.uuid); return (
route(this.getUrl({ textSearch, activePage: 0, collectionPage: 0, processPage: 0, workflowPage: 0 })) } /> this.moveHere() } copyHere={ () => this.copyHere() } /> this.getUrl({ 'activePage': i }) } { ...commonProps } /> { (mode !== 'browse') ? null : ( this.route({ 'objTypeTab': tab['id'] }) } /> ) } { (mode !== 'browse') ? null : ((!objTypeTab && !noDefaultTab) || objTypeTab === 'collection') ? ( this.getUrl({ 'collectionPage': i }) } { ...commonProps } /> ) : (objTypeTab === 'process') ? ( this.route({ 'processPage': i }) } { ...commonProps } /> ) : (objTypeTab === 'workflow') ? ( this.getUrl({ 'workflowPage': i }) } { ...commonProps } /> ) : null }
); } } export default WBBrowse;