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.

211 lines
8.1KB

  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. import wbMoveObject from 'wb-move-object';
  15. class WBBrowseProjectTabs extends Component {
  16. render({ ownerUuid, selected, newProjectDialogRef, projectListingRef,
  17. moveHere, copyHere }) {
  18. return (
  19. <WBTabs tabs={ [
  20. { 'name': 'Projects', 'isActive': true },
  21. ownerUuid ? { 'name': ( <span><i class="fas fa-plus-square text-success"></i> New Project</span> ),
  22. 'onClick': () => newProjectDialogRef.current.show(ownerUuid,
  23. () => projectListingRef.current.fetchItems() ) } : null,
  24. ( ownerUuid && Object.keys(selected).length > 0 ) ?
  25. { 'name': ( <span><i class="fas fa-compress-arrows-alt text-warning"></i> Move Here</span> ),
  26. 'onClick': moveHere } : null,
  27. ( ownerUuid && Object.keys(selected).length > 0 ) ?
  28. { 'name': ( <span><i class="fas fa-file-import text-warning"></i> Copy Here</span> ),
  29. 'onClick': copyHere } : null
  30. ] } />
  31. );
  32. }
  33. }
  34. class WBBrowse extends Component {
  35. constructor(...args) {
  36. super(...args);
  37. this.renameDialogRef = createRef();
  38. this.deleteDialogRef = createRef();
  39. this.newProjectDialogRef = createRef();
  40. this.projectListingRef = createRef();
  41. this.projectTabsRef = createRef();
  42. this.state.selected = {};
  43. }
  44. getUrl(params) {
  45. const mode = ('mode' in params ? params.mode : this.props.mode);
  46. if (mode === 'shared-with-me')
  47. return '/shared-with-me/' + ('activePage' in params ? params.activePage :
  48. (this.props.activePage || ''));
  49. let res = '/browse/' +
  50. ('ownerUuid' in params ? params.ownerUuid : (this.props.ownerUuid || '')) + '/' +
  51. ('activePage' in params ? params.activePage : (this.props.activePage || '')) + '/' +
  52. ('objTypeTab' in params ? params.objTypeTab : (this.props.objTypeTab || '')) + '/' +
  53. ('collectionPage' in params ? params.collectionPage : (this.props.collectionPage || '')) + '/' +
  54. ('processPage' in params ? params.processPage : (this.props.processPage || '')) + '/' +
  55. ('workflowPage' in params ? params.workflowPage : (this.props.workflowPage || ''));
  56. return res;
  57. }
  58. route(params) {
  59. route(this.getUrl(params));
  60. }
  61. renameDialog(item, callback) {
  62. // throw Error('Not implemented');
  63. this.renameDialogRef.current.show(item, callback);
  64. }
  65. renderRenameLink(item, callback) {
  66. return (
  67. <a href="#" title="Rename" onclick={ e => { e.preventDefault(); this.renameDialog(item, callback); } }>
  68. <i class="fas fa-edit text-secondary"></i>
  69. </a>
  70. );
  71. }
  72. renderDeleteButton(item, callback) {
  73. return (
  74. <button class="btn btn-outline-danger m-1" title="Delete"
  75. onclick={ () => this.deleteDialogRef.current.show(item, callback) }>
  76. <i class="fas fa-trash"></i>
  77. </button>
  78. );
  79. }
  80. renderSelectionCell(item) {
  81. const { selected } = this.state;
  82. const { uuid } = item;
  83. return (
  84. <div>
  85. <input type="checkbox" checked={ (uuid in selected) }
  86. onChange={ e => {
  87. if (e.target.checked)
  88. selected[uuid] = true;
  89. else
  90. delete selected[uuid];
  91. this.projectTabsRef.current.setState({});
  92. } } /> { '\u00A0' }
  93. </div>
  94. );
  95. }
  96. moveHere() {
  97. const { ownerUuid, app } = this.props;
  98. const { selected } = this.state;
  99. const { arvHost, arvToken } = app.state;
  100. let prom = new Promise(accept => accept());
  101. const uuids = Object.keys(selected);
  102. for (let i = 0; i < uuids.length; i++) {
  103. prom = prom.then(() => wbMoveObject(arvHost, arvToken, uuids[i], ownerUuid));
  104. prom = prom.then(() => ( delete selected[uuids[i]] ));
  105. prom = prom.catch(() => {});
  106. }
  107. prom = prom.then(() => this.setState({}));
  108. }
  109. copyHere() {
  110. }
  111. render({ mode, ownerUuid, activePage, app,
  112. objTypeTab, collectionPage, processPage, workflowPage }, { selected }) {
  113. return (
  114. <div>
  115. <WBRenameDialog app={ app } ref={ this.renameDialogRef } />
  116. <WBDeleteDialog app={ app } ref={ this.deleteDialogRef } />
  117. <WBNewProjectDialog app={ app } ref={ this.newProjectDialogRef } />
  118. <WBNavbarCommon app={ app } activeItem={ mode === 'shared-with-me' ? 'shared-with-me' :
  119. (!ownerUuid) ? 'all-projects' :
  120. (ownerUuid === app.state.currentUser.uuid) ? 'home' : null } />
  121. <WBArvadosCrumbs mode={ mode } uuid={ ownerUuid } app={ app } />
  122. <WBBrowseProjectTabs ref={ this.projectTabsRef } ownerUuid={ ownerUuid }
  123. selected={ selected } newProjectDialogRef={ this.newProjectDialogRef }
  124. projectListingRef={ this.projectListingRef } moveHere={ () => this.moveHere() }
  125. copyHere={ () => this.copyHere() } />
  126. <WBProjectListing ref={ this.projectListingRef }
  127. app={ app }
  128. arvHost={ app.state.arvHost }
  129. arvToken={ app.state.arvToken }
  130. mode={ mode }
  131. ownerUuid={ ownerUuid }
  132. itemsPerPage="5"
  133. activePage={ Number(activePage || 0) }
  134. getPageUrl={ i => this.getUrl({ 'activePage': i }) }
  135. renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
  136. renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
  137. renderSelectionCell={ it => this.renderSelectionCell(it) } />
  138. { (mode !== 'browse') ? null : (
  139. <WBTabs tabs={ [
  140. { 'id': 'collection', 'name': 'Collections', 'isActive': (!objTypeTab || objTypeTab === 'collection') },
  141. { 'id': 'process', 'name': 'Processes', 'isActive': (objTypeTab === 'process') },
  142. { 'id': 'workflow', 'name': 'Workflows', 'isActive': (objTypeTab === 'workflow') } ] }
  143. onTabChanged={ tab => this.route({ 'objTypeTab': tab['id'] }) } />
  144. ) }
  145. {
  146. (mode !== 'browse') ? null :
  147. (!objTypeTab || objTypeTab === 'collection') ? (
  148. <WBCollectionListing app={ app }
  149. ownerUuid={ ownerUuid }
  150. itemsPerPage="20"
  151. activePage={ Number(collectionPage || 0) }
  152. getPageUrl={ i => this.getUrl({ 'collectionPage': i }) }
  153. renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
  154. renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
  155. renderSelectionCell={ it => this.renderSelectionCell(it) } />
  156. ) : (objTypeTab === 'process') ? (
  157. <WBProcessListing app={ app }
  158. appState={ app.state }
  159. ownerUuid={ ownerUuid }
  160. itemsPerPage="20"
  161. activePage={ Number(processPage || 0) }
  162. onPageChanged={ i => this.route({ 'processPage': i }) }
  163. renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
  164. renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
  165. renderSelectionCell={ it => this.renderSelectionCell(it) } />
  166. ) : (objTypeTab === 'workflow') ? (
  167. <WBWorkflowListing app={ app }
  168. ownerUuid={ ownerUuid }
  169. itemsPerPage="20"
  170. page={ Number(workflowPage || 0) }
  171. getPageUrl={ i => this.getUrl({ 'workflowPage': i }) }
  172. renderRenameLink={ (it, cb) => this.renderRenameLink(it, cb) }
  173. renderDeleteButton={ (it, cb) => this.renderDeleteButton(it, cb) }
  174. renderSelectionCell={ it => this.renderSelectionCell(it) } />
  175. ) : null
  176. }
  177. </div>
  178. );
  179. }
  180. }
  181. export default WBBrowse;