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.

134 lines
4.3KB

  1. import { h, Component } from 'preact';
  2. import { route } from 'preact-router';
  3. import makeArvadosRequest from 'make-arvados-request';
  4. import WBTable from 'wb-table';
  5. import WBPagination from 'wb-pagination';
  6. import WBCheckboxes from 'wb-checkboxes';
  7. import wbFormatDate from 'wb-format-date';
  8. import wbFetchObjects from 'wb-fetch-objects';
  9. import WBNameAndUuid from 'wb-name-and-uuid';
  10. import WBProcessState from 'wb-process-state';
  11. function maskRows(rows) {
  12. return rows.map(r => r.map(c => '-'));
  13. }
  14. class WBProcessListing extends Component {
  15. constructor(...args) {
  16. super(...args);
  17. this.state.rows = [];
  18. this.state.numPages = 0;
  19. this.state.requestStates = [ 'Uncommitted', 'Committed', 'Final' ];
  20. this.state.reqStateMask = [ true, true, true ];
  21. }
  22. componentDidMount() {
  23. this.fetchItems();
  24. }
  25. prepareRows(requests, containerLookup, ownerLookup, outputLookup) {
  26. const { app, renderRenameLink, renderDeleteButton,
  27. renderSelectionCell, renderSharingButton,
  28. renderEditDescription } = this.props;
  29. return requests.map(item => {
  30. return ( [
  31. renderSelectionCell(item),
  32. (<div>
  33. <div>
  34. <a href={ '/process/' + item['uuid'] }>
  35. { item['name'] }
  36. </a> { renderRenameLink(item, () => this.fetchItems()) }
  37. </div>
  38. <div>{ item['uuid'] }</div>
  39. <div class="mt-2">
  40. { item.description } { renderEditDescription(item, () => this.fetchItems()) }
  41. </div>
  42. </div>),
  43. ( <WBProcessState app={ app } process={ item } /> ),
  44. ( <WBNameAndUuid app={ app } uuid={ item['owner_uuid'] } /> ),
  45. wbFormatDate(item['created_at']),
  46. ( <WBNameAndUuid app={ app } uuid={ item['output_uuid'] } /> ),
  47. (<div>
  48. { renderDeleteButton(item, () => this.fetchItems()) }
  49. { renderSharingButton(item) }
  50. </div>)
  51. ] );
  52. });
  53. }
  54. fetchItems() {
  55. const { arvHost, arvToken } = this.props.appState;
  56. const { requestStates, reqStateMask } = this.state;
  57. const { activePage, itemsPerPage, ownerUuid,
  58. requestingContainerUuid, waitForNextProps,
  59. textSearch } = this.props;
  60. if (waitForNextProps)
  61. return;
  62. const filters = [
  63. [ 'requesting_container_uuid', '=', requestingContainerUuid ]
  64. ];
  65. if (!reqStateMask.reduce((a, b) => a & b))
  66. filters.push([ 'state', 'in', requestStates.filter((_, idx) => reqStateMask[idx]) ]);
  67. if (ownerUuid)
  68. filters.push([ 'owner_uuid', '=', ownerUuid ]);
  69. if (textSearch)
  70. filters.push([ 'any', 'ilike', '%' + textSearch + '%' ])
  71. let prom = makeArvadosRequest(arvHost, arvToken,
  72. '/arvados/v1/container_requests?filters=' + encodeURIComponent(JSON.stringify(filters)) +
  73. '&limit=' + itemsPerPage +
  74. '&offset=' + (itemsPerPage * activePage));
  75. prom = prom.then(xhr =>
  76. this.setState({
  77. 'numPages': Math.ceil(xhr.response['items_available'] / xhr.response['limit']),
  78. 'rows': this.prepareRows(xhr.response.items)
  79. }));
  80. }
  81. componentWillReceiveProps(nextProps, nextState) {
  82. this.props = nextProps;
  83. this.setState({ 'rows': maskRows(this.state.rows) });
  84. this.fetchItems();
  85. }
  86. render({ appState, ownerUuid, activePage, onPageChanged, getPageUrl },
  87. { rows, numPages, requestStates, containerStates,
  88. reqStateMask, contStateMask }) {
  89. return (
  90. <div>
  91. <WBCheckboxes items={ requestStates } checked={ reqStateMask }
  92. cssClass="float-left mx-2 my-2" title="Request State: "
  93. onChange={ () => this.fetchItems() } />
  94. <WBTable columns={ [ '', 'Name', 'Status', 'Owner', 'Created At', 'Output', 'Actions' ] }
  95. headerClasses={ [ 'w-1' ] }
  96. rows={ rows } />
  97. <WBPagination numPages={ numPages }
  98. activePage={ activePage }
  99. getPageUrl={ getPageUrl }
  100. onPageChanged={ onPageChanged } />
  101. </div>
  102. );
  103. }
  104. }
  105. WBProcessListing.defaultProps = {
  106. itemsPerPage: 100,
  107. ownerUuid: null,
  108. requestingContainerUuid: null,
  109. renderRenameLink: () => null,
  110. renderDeleteButton: () => null,
  111. renderSelectionCell: () => null,
  112. renderSharingButton: () => null,
  113. renderEditDescription: () => null
  114. };
  115. export default WBProcessListing;