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!
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

242 líneas
9.5KB

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