Toggl-Button TeamWork

Toggle button for TeamWork

  1. // ==UserScript==
  2. // @name Toggl-Button TeamWork
  3. // @namespace https://gitlab.paragon-es.de/toggl-button
  4. // @version 1.2
  5. // @include http*://*.teamwork.com/*
  6. // @grant GM_xmlhttpRequest
  7. // @grant GM_addStyle
  8. // @grant GM_getResourceText
  9. // @grant GM_getValue
  10. // @grant GM_setValue
  11. // @grant GM_info
  12. // @grant GM_registerMenuCommand
  13. // @require https://gf.qytechs.cn/scripts/2670-toggllibrary/code/TogglLibrary.js
  14. // @resource togglStyle https://gitlab.paragon-es.de/toggl-button/core/raw/master/TogglLibrary.css
  15. // @description Toggle button for TeamWork
  16. // ==/UserScript==
  17.  
  18. var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,
  19. target = document.querySelector('#mainContent'),
  20. bodyTarget = document.querySelector('body'),
  21. stopTB, stopProcessed,
  22. config = { attributes: true, childList: true, characterData: true },
  23. observer = new MutationObserver(function(mutations) {
  24. mutations.forEach(function(mutation) {
  25. if (mutation.type === 'childList') {
  26. // TODO: if none of the mutations is a task, then remove the toggle element if visible.
  27. var task = document.querySelector('#Task');
  28. if (task !== null) {
  29. var tb = new TogglButtonGM('#Task', function (elem) {
  30. var taskDetail = document.querySelector('.taskDetailHolder');
  31. if (taskDetail !== null) {
  32. var taskID = taskDetail.id.substr(13),
  33. taskDetailTarget = taskDetail.querySelector('div'),
  34. taskDetailProcessed = false,
  35. innerObserver = new MutationObserver(function (mutations) {
  36. mutations.forEach(function (mutation) {
  37. if (mutation.type === 'childList' && !taskDetailProcessed) {
  38. var titleElem = document.querySelector('.taskDetailsName span');
  39. if (titleElem !== null) {
  40. innerObserver.disconnect();
  41. taskDetailProcessed = true;
  42. var tb = new TogglButtonGM('#Task', function (elem) {
  43. var description, projectIds = [],
  44. projectElem = document.querySelector('#projectName'),
  45. linkElem = document.querySelector('#ViewTaskSidebar .blue2.ql');
  46.  
  47. description = taskID + " " + titleElem.textContent.trim();
  48.  
  49. if (projectElem !== null) {
  50. projectIds.push(projectElem.textContent.trim());
  51. }
  52. if (linkElem !== null) {
  53. projectIds.push(linkElem.textContent.trim());
  54. }
  55.  
  56. return {
  57. className: 'teamwork',
  58. description: description,
  59. projectIds: projectIds
  60. };
  61. });
  62.  
  63. document.querySelector('.startTimer button').addEventListener('click', function () {
  64. tb.clickLinks();
  65. });
  66. }
  67. }
  68. });
  69. });
  70. innerObserver.observe(taskDetailTarget, config);
  71. }
  72. });
  73. }
  74. }
  75. });
  76. }),
  77. bodyObserver = new MutationObserver(function (mutations) {
  78. if (stopTB == null) {
  79. stopTB = new TogglButtonGM();
  80. stopProcessed = false;
  81. }
  82. mutations.forEach(function (mutation) {
  83. if (mutation.type === 'childList') {
  84. var stopElem = document.querySelector('#timerBar');
  85. if (stopElem !== null && !stopProcessed) {
  86. stopProcessed = true;
  87. stopElem.querySelector('.timer-log-time, .timer-body .btn-success').addEventListener('click', function () {
  88. stopTB.stopTimeEntry();
  89. });
  90. }
  91. }
  92. });
  93. });
  94.  
  95. observer.observe(target, config);
  96. bodyObserver.observe(bodyTarget, config);

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址