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.

142 lines
4.5KB

  1. import { h, Component } from 'preact';
  2. import WBNavbarCommon from 'wb-navbar-common';
  3. import WBArvadosCrumbs from 'wb-arvados-crumbs';
  4. import makeArvadosRequest from 'make-arvados-request';
  5. import detectUuids from 'detect-uuids';
  6. import arvadosTypeName from 'arvados-type-name';
  7. import urlForObject from 'url-for-object';
  8. import detectHashes from 'detect-hashes';
  9. import WBCommonFields from 'wb-common-fields';
  10. import WBContainerRequestFields from 'wb-container-request-fields';
  11. import WBProcessListing from 'wb-process-listing';
  12. class WBProcessView extends Component {
  13. constructor(...args) {
  14. super(...args);
  15. this.state.objectUrls = [];
  16. }
  17. getUrl(props) {
  18. const page = ('page' in props ? props.page : this.props.page);
  19. return ('/process/' + this.props.uuid +
  20. (page ? '/' + page : ''));
  21. }
  22. fetchData() {
  23. let { arvHost, arvToken } = this.props.app.state;
  24. let prom = makeArvadosRequest(arvHost, arvToken,
  25. '/arvados/v1/container_requests/' + this.props.uuid);
  26. let req;
  27. let cont;
  28. prom = prom.then(xhr => {
  29. req = xhr.response;
  30. if (req.container_uuid) {
  31. let prom_1 = makeArvadosRequest(arvHost, arvToken,
  32. '/arvados/v1/containers/' + req.container_uuid);
  33. prom_1 = prom_1.then(xhr => (cont = xhr.response));
  34. return prom_1;
  35. }
  36. });
  37. //prom = prom.then(xhr => (cont = xhr.response));
  38. prom = prom.then(() => {
  39. let hashes = detectHashes([ req, cont ]);
  40. let filters = [
  41. [ 'portable_data_hash', 'in', hashes ]
  42. ];
  43. return makeArvadosRequest(arvHost, arvToken,
  44. '/arvados/v1/collections?filters=' +
  45. encodeURIComponent(JSON.stringify(filters)));
  46. });
  47. prom = prom.then(xhr => {
  48. let colUuids = xhr.response['items'].map(item => item.uuid);
  49. let uuids = detectUuids([ req, cont ]);
  50. let dict = {};
  51. colUuids.map(u => (dict[u] = true));
  52. uuids.map(u => (dict[u] = true));
  53. return Object.keys(dict);
  54. });
  55. prom = prom.then(uuids => {
  56. // let uuids = detectUuids([ req, cont ]);
  57. let objectTypes = uuids.map(u => arvadosTypeName(u.split('-')[1]) + 's');
  58. let objQueries = {};
  59. objectTypes.map(t => (objQueries[t] = []));
  60. uuids.map((u, idx) => (objQueries[objectTypes[idx]].push(u)));
  61. let prom_1 = new Promise(accept => accept());
  62. let objects = [];
  63. // delete objQueries['users'];
  64. delete objQueries['api_clients'];
  65. for (let k in objQueries) {
  66. let filters = [
  67. ['uuid', 'in', objQueries[k]]
  68. ];
  69. prom_1 = prom_1.then(() => makeArvadosRequest(arvHost, arvToken,
  70. '/arvados/v1/' + k + '?filters=' +
  71. encodeURIComponent(JSON.stringify(filters))));
  72. prom_1 = prom_1.then(xhr => (objects = objects.concat(xhr.response['items'])));
  73. }
  74. prom_1 = prom_1.then(() => objects);
  75. return prom_1;
  76. });
  77. prom = prom.then(objects => {
  78. let objDict = {};
  79. objects.map(o => (objDict[o['uuid']] = o));
  80. let urls = objects.map(o => urlForObject(o));
  81. this.setState({
  82. 'objectUrls': urls,
  83. 'request': req,
  84. 'container': cont
  85. });
  86. });
  87. }
  88. componentDidMount() {
  89. this.fetchData();
  90. }
  91. componentWillReceiveProps(nextProps) {
  92. this.props = nextProps;
  93. this.setState({ 'objectUrls': [], 'request': null, 'container': null });
  94. this.fetchData();
  95. }
  96. render({ app, uuid, page }, { objectUrls, container }) {
  97. return (
  98. <div>
  99. <WBNavbarCommon app={ app } />
  100. <WBArvadosCrumbs app={ app } uuid={ uuid } />
  101. <div class="my-2">
  102. This is the process view for { uuid }
  103. </div>
  104. <h2>Common Fields</h2>
  105. <WBCommonFields app={ app } uuid={ uuid } />
  106. <h2>Container Request Fields</h2>
  107. <WBContainerRequestFields app={ app } uuid={ uuid } />
  108. { container ? ([
  109. <h2>Children</h2>,
  110. <WBProcessListing appState={ app.state }
  111. requestingContainerUuid={ container.uuid }
  112. itemsPerPage="20"
  113. activePage={ Number(page || 0) }
  114. getPageUrl={ page => this.getUrl({ page }) } />
  115. ]) : null }
  116. <div>
  117. <a href="/browse">Click here</a>
  118. </div>
  119. <ul>
  120. { objectUrls.map(url => (
  121. <li><a href={ url }>{ url }</a></li>
  122. )) }
  123. </ul>
  124. </div>
  125. );
  126. }
  127. }
  128. export default WBProcessView;