Redmine: Add notes directly at the bottom

Make it easy to add notes without the need to click a button.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Redmine: Add notes directly at the bottom
// @namespace    im.outv.redmine.addnotes.redmine
// @version      2024.1
// @description  Make it easy to add notes without the need to click a button.
// @author       Outvi V
// @license      MIT
// @match        https://www.redmine.org/issues/*
// @grant        none
// ==/UserScript==

const HIDE_CLASS_NAME = 'addnotes-hide'

function addCss(css) {
  var block = document.createElement('style')
  block.innerText = css
  document.head.appendChild(block)
  return block
}

function isToShow(fieldset) {
    // As of Redmine 6.0.2
    if (['add_notes', 'add_attachments'].includes(fieldset.id)) {
        return true;
    }

    // redmine.org
    if (["Notes", "Files"].includes(fieldset.querySelector("legend")?.innerText)) {
        fieldset.classList.remove("addnotes-hide")
        return true;
    }

    return false;
}

;(function () {
  'use strict'

  const hiddenCss = addCss(`
    .${HIDE_CLASS_NAME} { display: none; }
    `)

  const dUpdate = document.querySelector('#update')
  dUpdate.style = ''

  const dEditAreas = [...dUpdate.querySelectorAll('form div.box > fieldset')]

  for (const fieldset of dEditAreas) {
    if (!isToShow(fieldset)) {
      fieldset.classList.add(HIDE_CLASS_NAME)
    }
  }

  const _showAndScrollTo = window.showAndScrollTo
  window.showAndScrollTo = function (id, focus, ...args) {
    if (id === 'update' && focus === 'issue_notes') {
      hiddenCss.innerText = ''
    }
    _showAndScrollTo(id, focus, ...args)
  }
})()