| @@ -22,7 +22,8 @@ class WBCollectionListing extends Component { | |||
| prepareRows(items, ownerLookup) { | |||
| let { app, renderRenameLink, renderDeleteButton, | |||
| renderSelectionCell, renderSharingButton } = this.props; | |||
| renderSelectionCell, renderSharingButton, | |||
| renderEditDescription } = this.props; | |||
| return items.map(item => [ | |||
| renderSelectionCell(item), | |||
| @@ -34,7 +35,9 @@ class WBCollectionListing extends Component { | |||
| </div> | |||
| <div>{ item['uuid'] }</div> | |||
| </div>), | |||
| item['description'], | |||
| (<div> | |||
| { item['description'] } { renderEditDescription(item, () => this.fetchItems()) } | |||
| </div>), | |||
| (<div> | |||
| <div> | |||
| { ownerLookup[item.owner_uuid] ? ( | |||
| @@ -153,7 +156,9 @@ class WBCollectionListing extends Component { | |||
| WBCollectionListing.defaultProps = { | |||
| 'itemsPerPage': 100, | |||
| 'ownerUuid': null | |||
| 'ownerUuid': null, | |||
| 'renderSharingButton': () => null, | |||
| 'renderEditDescription': () => null | |||
| }; | |||
| export default WBCollectionListing; | |||
| @@ -29,7 +29,9 @@ class WBProcessListing extends Component { | |||
| prepareRows(requests, containerLookup, ownerLookup, outputLookup) { | |||
| const { app, renderRenameLink, renderDeleteButton, | |||
| renderSelectionCell, renderSharingButton } = this.props; | |||
| renderSelectionCell, renderSharingButton, | |||
| renderEditDescription } = this.props; | |||
| return requests.map(item => { | |||
| return ( [ | |||
| renderSelectionCell(item), | |||
| @@ -40,6 +42,9 @@ class WBProcessListing extends Component { | |||
| </a> { renderRenameLink(item, () => this.fetchItems()) } | |||
| </div> | |||
| <div>{ item['uuid'] }</div> | |||
| <div class="mt-2"> | |||
| { item.description } { renderEditDescription(item, () => this.fetchItems()) } | |||
| </div> | |||
| </div>), | |||
| ( <WBProcessState app={ app } process={ item } /> ), | |||
| ( <WBNameAndUuid app={ app } uuid={ item['owner_uuid'] } /> ), | |||
| @@ -121,7 +126,8 @@ WBProcessListing.defaultProps = { | |||
| renderRenameLink: () => null, | |||
| renderDeleteButton: () => null, | |||
| renderSelectionCell: () => null, | |||
| renderSharingButton: () => null | |||
| renderSharingButton: () => null, | |||
| renderEditDescription: () => null | |||
| }; | |||
| export default WBProcessListing; | |||
| @@ -18,7 +18,8 @@ class WBProjectListing extends Component { | |||
| prepareRows(items) { | |||
| const { app, renderRenameLink, renderDeleteButton, | |||
| renderSelectionCell, renderSharingButton } = this.props; | |||
| renderSelectionCell, renderSharingButton, | |||
| renderEditDescription } = this.props; | |||
| return items.map(item => [ | |||
| renderSelectionCell(item), | |||
| @@ -30,7 +31,9 @@ class WBProjectListing extends Component { | |||
| </div> | |||
| <div>{ item['uuid'] }</div> | |||
| </div>), | |||
| item['description'], | |||
| (<div> | |||
| { item['description'] } { renderEditDescription(item, () => this.fetchItems()) } | |||
| </div>), | |||
| item['owner_uuid'], | |||
| (<div> | |||
| { renderDeleteButton(item, () => this.fetchItems()) } | |||
| @@ -87,7 +90,8 @@ WBProjectListing.defaultProps = { | |||
| 'ownerUuid': null, | |||
| 'renderRenameLink': () => null, | |||
| 'renderDeleteButton': () => null, | |||
| 'renderSelectionCell': () => null | |||
| 'renderSelectionCell': () => null, | |||
| 'renderEditDescription': () => null | |||
| }; | |||
| export default WBProjectListing; | |||
| @@ -22,7 +22,9 @@ class WBWorkflowListing extends Component { | |||
| prepareRows(items, ownerLookup) { | |||
| const { renderRenameLink, renderDeleteButton, | |||
| renderSelectionCell, renderSharingButton } = this.props; | |||
| renderSelectionCell, renderSharingButton, | |||
| renderEditDescription } = this.props; | |||
| return items.map(item => [ | |||
| renderSelectionCell(item), | |||
| ( | |||
| @@ -35,7 +37,9 @@ class WBWorkflowListing extends Component { | |||
| <div>{ item.uuid }</div> | |||
| </div> | |||
| ), | |||
| item.description, | |||
| (<div> | |||
| { item.description } { renderEditDescription(item, () => this.fetchItems()) } | |||
| </div>), | |||
| ( <WBNameAndUuid uuid={ item.owner_uuid } lookup={ ownerLookup } /> ), | |||
| wbFormatDate(item.created_at), | |||
| (<div> | |||
| @@ -97,7 +101,9 @@ class WBWorkflowListing extends Component { | |||
| WBWorkflowListing.defaultProps = { | |||
| 'itemsPerPage': 100, | |||
| 'ownerUuid': null | |||
| 'ownerUuid': null, | |||
| 'renderSharingButton': () => null, | |||
| 'renderEditDescription': () => null | |||
| }; | |||
| export default WBWorkflowListing; | |||
| @@ -0,0 +1,52 @@ | |||
| import { h, Component, createRef } from 'preact'; | |||
| import WBDialog from 'wb-dialog'; | |||
| import linkState from 'linkstate'; | |||
| import makeArvadosRequest from 'make-arvados-request'; | |||
| import arvadosTypeName from 'arvados-type-name'; | |||
| class WBEditDescriptionDialog extends Component { | |||
| constructor(...args) { | |||
| super(...args); | |||
| this.dialogRef = createRef(); | |||
| this.state.inputId = uuid.v4(); | |||
| } | |||
| show(item, callback) { | |||
| const { inputId } = this.state; | |||
| this.setState({ | |||
| 'item': item, | |||
| 'newDescription': null, | |||
| 'callback': callback || (() => {}) | |||
| }); | |||
| this.dialogRef.current.show(); | |||
| $('#' + inputId).focus(); | |||
| } | |||
| hide() { | |||
| this.dialogRef.current.hide(); | |||
| } | |||
| render({ app }, { item, newDescription, callback, inputId }) { | |||
| const { arvHost, arvToken } = app.state; | |||
| return ( | |||
| <WBDialog title="Edit Description" ref={ this.dialogRef } accept={ () => | |||
| makeArvadosRequest(arvHost, arvToken, | |||
| '/arvados/v1/' + arvadosTypeName(item.uuid) + | |||
| 's/' + item.uuid, { | |||
| method: 'PUT', | |||
| data: JSON.stringify({ | |||
| description: newDescription || null | |||
| }) | |||
| }).then(callback) | |||
| }> | |||
| <div> | |||
| <input type="text" class="form-control" id={ inputId } | |||
| placeholder={ (item && item.description) ? item.description : 'Type new description here' } | |||
| value={ newDescription } onChange={ linkState(this, 'newDescription') } /> | |||
| </div> | |||
| </WBDialog> | |||
| ); | |||
| } | |||
| } | |||
| export default WBEditDescriptionDialog; | |||
| @@ -11,6 +11,7 @@ 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'; | |||
| @@ -45,6 +46,7 @@ class WBBrowse extends Component { | |||
| this.newProjectDialogRef = createRef(); | |||
| this.projectListingRef = createRef(); | |||
| this.projectTabsRef = createRef(); | |||
| this.editDescriptionDialogRef = createRef(); | |||
| this.state.selected = {}; | |||
| } | |||
| @@ -85,6 +87,16 @@ class WBBrowse extends Component { | |||
| ); | |||
| } | |||
| renderEditDescription(item, callback) { | |||
| return ( | |||
| <a href="#" title="Edit description" onclick={ e => { e.preventDefault(); | |||
| this.editDescriptionDialogRef.current.show(item, callback); } }> | |||
| <i class="fas fa-edit text-secondary"></i> | |||
| </a> | |||
| ); | |||
| } | |||
| renderDeleteButton(item, callback) { | |||
| return ( | |||
| <button class="btn btn-outline-danger m-1" title="Delete" | |||
| @@ -148,6 +160,7 @@ class WBBrowse extends Component { | |||
| 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), | |||
| @@ -167,6 +180,8 @@ class WBBrowse extends Component { | |||
| <WBNewProjectDialog app={ app } ref={ this.newProjectDialogRef } /> | |||
| <WBEditDescriptionDialog app={ app } ref={ this.editDescriptionDialogRef } /> | |||
| <WBNavbarCommon app={ app } | |||
| activeItem={ mode === 'shared-with-me' ? 'shared-with-me' : | |||
| (!ownerUuid) ? 'all-projects' : | |||