您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Renders Markdown style toggleable checkboxes in Jira Server issue descriptions
当前为
- // ==UserScript==
- // @name Jira Server: toggleable checkboxes in issue descriptions
- // @description Renders Markdown style toggleable checkboxes in Jira Server issue descriptions
- // @author Antti Kaihola
- // @namespace https://github.com/akaihola
- // @version 0.1
- // @license MIT
- // @match https://*/*/RapidBoard.jspa*
- // @match https://jira.*/browse/*-*
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- const slugify = text => text.toLowerCase().replace(/\W+/g, '-').replace(/^-+|-+$/g, '');
- let lastSeenDescription = '';
- function handleCheckboxes() {
- const description = jQuery('#description-val > div');
- description.off('click').on('click', 'input[type="checkbox"]', function() {
- const checkbox = jQuery(this);
- const li = checkbox.closest('li');
- const checked = checkbox.prop('checked');
- const content = li.contents().filter(function () {return this.nodeType === 3;}).first().text();
- jQuery('#description-val > span[role="button"]').click();
- const waitForEditor = setInterval(() => {
- const textarea = jQuery('textarea#description');
- if (textarea.length) {
- clearInterval(waitForEditor);
- const lines = textarea.val().split('\n');
- const updatedLines = lines.map(line => {
- const match = line.match(/^(\s*)-\s*\[([ \u2002xX])\]\s*(.+)/);
- return match && slugify(match[3]) === slugify(content)
- ? `${match[1]}- [${checked ? 'x' : '\u2002'}] ${match[3]}`
- : line;
- });
- textarea.val(updatedLines.join('\n'));
- jQuery('#description-form > div.save-options button.submit').click();
- }
- }, 50);
- });
- description.find('li').each(function() {
- const li = jQuery(this);
- const textNode = li.contents().filter(function () {return this.nodeType === 3;}).first();
- if (!textNode.length) return;
- const firstChild = li.children().first();
- let content = textNode.text().trim();
- let checked;
- if (firstChild.is("span") && firstChild.text().trim().match(/^\[[xX]]/)) {
- firstChild.remove();
- checked = " checked";
- } else {
- const match = content.match(/^\[([ \u2002xX])\]\s*(.+)/);
- if (!match) return;
- content = match[2];
- textNode[0].nodeValue = match[2];
- checked = match[1].toLowerCase() === 'x' ? " checked" : "";
- }
- li.attr('id', slugify(content)).css('list-style-type', 'none');
- const checkbox = jQuery(`<input type="checkbox" style="margin-left: -1.5em"${checked}>`);
- li.prepend(checkbox);
- });
- }
- setInterval(() => {
- const description = document.querySelector('#description-val > div');
- if (description) {
- if (description.innerHTML !== lastSeenDescription) {
- handleCheckboxes();
- lastSeenDescription = description.innerHTML;
- }
- }
- }, 200);
- })();