Toggl-Button YouTrack

Toggle button for YouTrack

  1. // ==UserScript==
  2. // @name Toggl-Button YouTrack
  3. // @namespace https://gitlab.paragon-es.de/toggl-button
  4. // @version 1.4
  5. // @include http*://youtrack.*/*
  6. // @include http*://*/youtrack/*
  7. // @grant GM_xmlhttpRequest
  8. // @grant GM_addStyle
  9. // @grant GM_getResourceText
  10. // @grant GM_getValue
  11. // @grant GM_setValue
  12. // @grant GM_info
  13. // @grant GM_registerMenuCommand
  14. // @require https://greasyfork.org/scripts/2670-toggllibrary/code/TogglLibrary.js
  15. // @resource togglStyle https://gitlab.paragon-es.de/toggl-button/core/raw/master/TogglLibrary.css
  16. // @description Toggle button for YouTrack
  17. // ==/UserScript==
  18.  
  19. new TogglButtonGM('.fsi-layout.container .content_fsi', function (elem) {
  20. var description, projectIds = [],
  21. numElem = elem.querySelector('.issueId', elem),
  22. titleElem = elem.querySelector('.issue-summary', elem),
  23. projectElem = document.querySelector('.fsi-properties .fsi-property .regCC a'),
  24. linkElem = document.querySelector('.issueContainer .links-panel .links .link'),
  25. stopCallback = null;
  26.  
  27. description = titleElem.textContent.trim();
  28. if (numElem !== null) {
  29. description = numElem.textContent.trim() + " " + description;
  30. stopCallback = function(date, duration) {
  31. var parts = numElem.textContent.trim().split('-');
  32. GM_xmlhttpRequest({
  33. method: "GET",
  34. url: document.location.origin + "/rest/admin/project/" + parts[0] + "/timetracking",
  35. onload: function (result) {
  36. if (result.status === 200) {
  37. if (result.responseText.indexOf('<settings enabled="true">') > 0) {
  38. GM_xmlhttpRequest({
  39. method: "POST",
  40. url: document.location.origin + "/rest/issue/" + numElem.textContent.trim() + "/timetracking/workitem",
  41. headers: {
  42. "Content-Type": "application/xml"
  43. },
  44. dataType: 'xml',
  45. data: '<workItem><date>'+date+'</date><duration>'+Math.floor(duration / 60)+'</duration><description>automatic</description></workItem>'
  46. });
  47. }
  48. }
  49. }
  50. });
  51. }
  52. }
  53.  
  54. if (projectElem !== null) {
  55. projectIds.push(projectElem.textContent.trim());
  56. }
  57. if (linkElem !== null) {
  58. projectIds.push(linkElem.textContent.trim());
  59. }
  60.  
  61. return {
  62. className: 'youtrack',
  63. description: description,
  64. projectIds: projectIds,
  65. stopCallback: stopCallback
  66. };
  67. });