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.

67 lines
2.3KB

  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 makeArvadosRequest from 'make-arvados-request';
  9. import WBIdTools from 'wb-id-tools';
  10. import urlForObject from 'url-for-object';
  11. import arvadosObjectName from 'arvados-object-name';
  12. class WBLazyInlineName extends Component {
  13. componentWillReceiveProps(nextProps) {
  14. if (nextProps.identifier === this.props.identifier)
  15. return;
  16. this.setState({ item: null });
  17. }
  18. fetchData() {
  19. const { app, identifier } = this.props;
  20. const { arvHost, arvToken } = app.state;
  21. const typeName = WBIdTools.typeName(identifier);
  22. if (WBIdTools.isPDH(identifier)) {
  23. const filters = [
  24. [ 'portable_data_hash', '=', identifier ]
  25. ];
  26. let prom = makeArvadosRequest(arvHost, arvToken,
  27. '/arvados/v1/collections?filters=' + encodeURIComponent(JSON.stringify(filters)));
  28. prom = prom.then(xhr => this.setState({ item: {
  29. uuid: xhr.response.items.length > 0 ? xhr.response.items[0].uuid : '',
  30. name: xhr.response.items.length > 0 ? xhr.response.items[0].name : 'Not Found' +
  31. ( xhr.response.items_available > 1 ? ' (+' + (xhr.response.items_available - 1) + ' others)' : '' )
  32. }}));
  33. return;
  34. }
  35. let prom = makeArvadosRequest(arvHost, arvToken,
  36. '/arvados/v1/' + typeName + 's/' + identifier);
  37. prom = prom.then(xhr => this.setState({ item: xhr.response }));
  38. prom = prom.catch(() => this.setState({ item: { name: 'Not Found' }}));
  39. }
  40. render({ identifier }, { item }) {
  41. if (item) {
  42. return (
  43. <a href={ urlForObject(item) }>{ arvadosObjectName(item) }</a>
  44. );
  45. }
  46. const typeName = WBIdTools.typeName(identifier);
  47. const url = (typeName === 'group' ? '/browse/' + identifier :
  48. typeName === 'collection' ? '/collection-browse/' + identifier :
  49. urlForObject({ uuid: identifier }));
  50. return (
  51. <span>
  52. <a href={ url }>{ identifier }</a> <a href="#" title="Look up"
  53. onclick={ e => { e.preventDefault(); this.fetchData(); } }>
  54. <i class="fas fa-search"></i>
  55. </a>
  56. </span>
  57. );
  58. }
  59. }
  60. export default WBLazyInlineName;