IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
6.6KB

  1. import { h, Component, createRef } from 'preact';
  2. import { route } from 'preact-router';
  3. import WBNavbarCommon from 'wb-navbar-common';
  4. import WBProjectListing from 'wb-project-listing';
  5. import WBInlineSearch from 'wb-inline-search';
  6. import WBArvadosCrumbs from 'wb-arvados-crumbs';
  7. import WBTabs from 'wb-tabs';
  8. import WBProcessListing from 'wb-process-listing';
  9. import WBCollectionListing from 'wb-collection-listing';
  10. import WBWorkflowListing from 'wb-workflow-listing';
  11. import WBRenameDialog from 'wb-rename-dialog';
  12. import WBDeleteDialog from 'wb-delete-dialog';
  13. import WBNewProjectDialog from 'wb-new-project-dialog';
  14. class WBBrowse extends Component {
  15. constructor(...args) {
  16. super(...args);
  17. this.renameDialogRef = createRef();
  18. this.deleteDialogRef = createRef();
  19. this.newProjectDialogRef = createRef();
  20. this.projectListingRef = createRef();
  21. this.state.selected = {};
  22. }
  23. getUrl(params) {
  24. const mode = ('mode' in params ? params.mode : this.props.mode);
  25. if (mode === 'shared-with-me')
  26. return '/shared-with-me/' + ('activePage' in params ? params.activePage :
  27. (this.props.activePage || ''));
  28. let res = '/browse/' +
  29. ('ownerUuid' in params ? params.ownerUuid : (this.props.ownerUuid || '')) + '/' +
  30. ('activePage' in params ? params.activePage : (this.props.activePage || '')) + '/' +
  31. ('objTypeTab' in params ? params.objTypeTab : (this.props.objTypeTab || '')) + '/' +
  32. ('collectionPage' in params ? params.collectionPage : (this.props.collectionPage || '')) + '/' +
  33. ('processPage' in params ? params.processPage : (this.props.processPage || '')) + '/' +
  34. ('workflowPage' in params ? params.workflowPage : (this.props.workflowPage || ''));
  35. return res;
  36. }
  37. route(params) {
  38. route(this.getUrl(params));
  39. }
  40. renameDialog(item, callback) {
  41. // throw Error('Not implemented');
  42. this.renameDialogRef.current.show(item, callback);
  43. }
  44. renderRenameLink(item, callback) {
  45. return (
  46. <a href="#" title="Rename" onclick={ e => { e.preventDefault(); this.renameDialog(item, callback); } }>
  47. <i class="fas fa-edit text-secondary"></i>
  48. </a>
  49. );
  50. }
  51. renderDeleteButton(item, callback) {
  52. return (
  53. <button class="btn btn-outline-danger m-1" title="Delete"
  54. onclick={ () => this.deleteDialogRef.current.show(item, callback) }>
  55. <i class="fas fa-trash"></i>
  56. </button>
  57. );
  58. }
  59. renderSelectionCell(item) {
  60. const { selected } = this.state;
  61. const { uuid } = item;
  62. return (
  63. <div>
  64. <input type="checkbox" checked={ (uuid in selected) }
  65. onChange={ e => {
  66. if (e.target.value === 'on')
  67. selected[uuid] = true;
  68. else
  69. delete selected[uuid];
  70. } } /> { '\u00A0' }
  71. </div>
  72. );
  73. }
  74. render({ mode, ownerUuid, activePage, app,
  75. objTypeTab, collectionPage, processPage, workflowPage }) {
  76. return (
  77. <div>
  78. <WBRenameDialog app={ app } ref={ this.renameDialogRef } />
  79. <WBDeleteDialog app={ app } ref={ this.deleteDialogRef } />
  80. <WBNewProjectDialog app={ app } ref={ this.newProjectDialogRef } />
  81. <WBNavbarCommon app={ app } activeItem={ mode === 'shared-with-me' ? 'shared-with-me' :
  82. (!ownerUuid) ? 'all-projects' :
  83. (ownerUuid === app.state.currentUser.uuid) ? 'home' : null } />
  84. <WBArvadosCrumbs mode={ mode } uuid={ ownerUuid } app={ app } />
  85. <WBTabs tabs={ [
  86. { 'name': 'Projects', 'isActive': true },
  87. ownerUuid ? { 'name': ( <span><i class="fas fa-plus-square text-success"></i> New Project</span> ),
  88. 'onClick': () => this.newProjectDialogRef.current.show(ownerUuid,
  89. () => this.projectListingRef.current.fetchItems() ) } : null
  90. ] } />
  91. <WBProjectListing ref={ this.projectListingRef }
  92. app={ app }
  93. arvHost={ app.state.arvHost }
  94. arvToken={ app.state.arvToken }
  95. mode={ mode }
  96. ownerUuid={ ownerUuid }
  97. itemsPerPage="5"
  98. activePage={ Number(activePage || 0) }
  99. getPageUrl={ i => this.getUrl({ 'activePage': i }) }
  100. renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
  101. renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
  102. renderSelectionCell={ it => this.renderSelectionCell(it) } />
  103. { (mode !== 'browse') ? null : (
  104. <WBTabs tabs={ [
  105. { 'id': 'collection', 'name': 'Collections', 'isActive': (!objTypeTab || objTypeTab === 'collection') },
  106. { 'id': 'process', 'name': 'Processes', 'isActive': (objTypeTab === 'process') },
  107. { 'id': 'workflow', 'name': 'Workflows', 'isActive': (objTypeTab === 'workflow') } ] }
  108. onTabChanged={ tab => this.route({ 'objTypeTab': tab['id'] }) } />
  109. ) }
  110. {
  111. (mode !== 'browse') ? null :
  112. (!objTypeTab || objTypeTab === 'collection') ? (
  113. <WBCollectionListing app={ app }
  114. ownerUuid={ ownerUuid }
  115. itemsPerPage="20"
  116. activePage={ Number(collectionPage || 0) }
  117. getPageUrl={ i => this.getUrl({ 'collectionPage': i }) }
  118. renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
  119. renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
  120. renderSelectionCell={ it => this.renderSelectionCell(it) } />
  121. ) : (objTypeTab === 'process') ? (
  122. <WBProcessListing app={ app }
  123. appState={ app.state }
  124. ownerUuid={ ownerUuid }
  125. itemsPerPage="20"
  126. activePage={ Number(processPage || 0) }
  127. onPageChanged={ i => this.route({ 'processPage': i }) }
  128. renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
  129. renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
  130. renderSelectionCell={ it => this.renderSelectionCell(it) } />
  131. ) : (objTypeTab === 'workflow') ? (
  132. <WBWorkflowListing app={ app }
  133. ownerUuid={ ownerUuid }
  134. itemsPerPage="20"
  135. page={ Number(workflowPage || 0) }
  136. getPageUrl={ i => this.getUrl({ 'workflowPage': i }) }
  137. renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
  138. renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
  139. renderSelectionCell={ it => this.renderSelectionCell(it) } />
  140. ) : null
  141. }
  142. </div>
  143. );
  144. }
  145. }
  146. export default WBBrowse;