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.

113 lines
3.1KB

  1. //
  2. // Copyright (C) Stanislaw Adaszewski, 2020
  3. // Contact: s.adaszewski@gmail.com
  4. // Website: https://adared.ch/wba
  5. // License: GNU Affero General Public License, Version 3
  6. //
  7. import { h, Component } from 'preact';
  8. import WBTable from 'wb-table';
  9. import makeArvadosRequest from 'make-arvados-request';
  10. import WBAccordion from 'wb-accordion';
  11. import WBJsonViewer from 'wb-json-viewer';
  12. class WBWorkflowFields extends Component {
  13. componentDidMount() {
  14. this.prepareRows();
  15. }
  16. componentWillReceiveProps(nextProps) {
  17. this.props = nextProps;
  18. this.prepareRows();
  19. }
  20. prepareRows() {
  21. let { uuid, app } = this.props;
  22. let { arvHost, arvToken } = app.state;
  23. let prom = makeArvadosRequest(arvHost, arvToken,
  24. '/arvados/v1/workflows/' + uuid);
  25. prom = prom.then(xhr => {
  26. const item = xhr.response;
  27. let definition;
  28. try {
  29. definition = JSON.parse(item.definition);
  30. } catch (_) {
  31. definition = jsyaml.load(item.definition);
  32. }
  33. const graph = definition['$graph'];
  34. let rows = [
  35. [ 'Name', item.name ],
  36. [ 'Description', item.description || (<i>{ String(item.description) }</i>) ],
  37. [ 'CWL Version', definition.cwlVersion ],
  38. ];
  39. let keys = graph.map(it => it.id);
  40. keys.sort();
  41. keys = keys.splice(keys.indexOf('#main'), 1).concat(keys);
  42. keys.map(k => {
  43. const it = graph.find(it => (it.id === k));
  44. rows.push([
  45. it.id, (
  46. <div>
  47. <div>Class: { it['class'] }</div>
  48. { it.label ? <div>Label: { it.label }</div> : null }
  49. { it.doc ? <div>Doc: { it.doc }</div> : null }
  50. <WBAccordion names={ [ 'Inputs', 'Outputs', 'Rest' ] }
  51. cardHeaderClass="card-header-sm">
  52. <WBJsonViewer app={ app } value={ it.inputs } />
  53. <WBJsonViewer app={ app } value={ it.outputs } />
  54. { (() => {
  55. delete it['inputs'];
  56. delete it['outputs'];
  57. delete it['class'];
  58. delete it['label'];
  59. delete it['doc'];
  60. delete it['id'];
  61. return (
  62. <WBJsonViewer app={ app } value={ it } />
  63. );
  64. })() }
  65. </WBAccordion>
  66. </div>
  67. )]);
  68. });
  69. /* [ 'Graph', (
  70. <WBAccordion names={ graph.map(it => it.id) }
  71. cardHeaderClass="card-header-sm">
  72. { graph.map(it => (
  73. <WBJsonViewer app={ app } value={ it } />
  74. )) }
  75. </WBAccordion>
  76. ) ]
  77. ];*/
  78. this.setState({ 'rows': rows });
  79. });
  80. }
  81. render({}, { rows }) {
  82. return (
  83. rows ? (
  84. <WBTable columns={ [ "Name", "Value" ] }
  85. headerClasses={ [ "col-sm-2", "col-sm-4" ] }
  86. rows={ rows }
  87. verticalHeader={ true } />
  88. ) : (
  89. <div>Loading...</div>
  90. )
  91. );
  92. }
  93. }
  94. export default WBWorkflowFields;