NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Trello card details
// @namespace almaceleste
// @version 0.3.0
// @description this code adds the creation date and the creator name and account link to the Trello card
// @description:ru этот код добавляет дату создания и имя создателя и ссылку на его профиль на карту Trello
// @author (ɔ) Paola Captanovska
// @license AGPL-3.0-or-later; http://www.gnu.org/licenses/agpl.txt
// @icon https://a.trellocdn.com/prgb/dist/images/pinned-tab-icon.225c8d1cf8bbf74add43.svg
// @icon64 https://a.trellocdn.com/prgb/dist/images/pinned-tab-icon.225c8d1cf8bbf74add43.svg
// @homepageURL https://greasyfork.org/en/users/174037-almaceleste
// @homepageURL https://openuserjs.org/users/almaceleste
// @homepageURL https://github.com/almaceleste/userscripts
// @supportURL https://github.com/almaceleste/userscripts/issues
// @updateURL https://github.com/almaceleste/userscripts/raw/master/src/Trello_card_details.meta.js
// @downloadURL https://github.com/almaceleste/userscripts/raw/master/src/Trello_card_details.user.js
// @downloadURL https://openuserjs.org/install/almaceleste/Trello_card_details.user.js
// @require https://code.jquery.com/jquery-3.3.1.js
// @require https://raw.githubusercontent.com/uzairfarooq/arrive/master/minified/arrive.min.js
// @require https://openuserjs.org/src/libs/sizzle/GM_config.js
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_registerMenuCommand
// @match https://trello.com/b/*
// @match https://trello.com/c/*
// ==/UserScript==
// ==OpenUserJS==
// @author almaceleste
// ==/OpenUserJS==
const cardwindow = 'div.window-wrapper';
const cardheader = 'div.window-header';
const attachments = 'div.js-attachment-list';
const attachmentlink = 'a.attachment-thumbnail-preview';
const attachmentdetails = 'p.attachment-thumbnail-details';
const options = { day: 'numeric', month: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric' };
const windowcss = '#trellocardDetailsCfg {background-color: lightblue;} #trellocardDetailsCfg .reset_holder {float: left; position: relative; bottom: -1em;} #trellocardDetailsCfg .saveclose_buttons {margin: .7em;}';
const iframecss = 'height: 18.5em; width: 30em; border: 1px solid; border-radius: 3px; position: fixed; z-index: 999;';
GM_registerMenuCommand('Trello card details Settings', opencfg);
function opencfg()
{
GM_config.open();
trellocardDetailsCfg.style = iframecss;
}
GM_config.init(
{
id: 'trellocardDetailsCfg',
title: 'Trello card details',
fields:
{
creationDate:
{
section: ['Card creation details', 'Choose details to show on Trello card'],
label: 'creation date',
labelPos: 'right',
type: 'checkbox',
default: true,
},
locale:
{
label: 'creation date locale',
labelPos: 'left',
type: 'select',
options: ['de', 'en', 'es', 'fr', 'ja', 'ru', 'sv'],
default: 'en',
},
creatorName:
{
label: 'creator name',
labelPos: 'right',
type: 'checkbox',
default: true,
},
creatorAccount:
{
label: 'creator account',
labelPos: 'right',
type: 'checkbox',
default: true,
},
attachment:
{
label: 'add these details to the attachments',
labelPos: 'right',
type: 'checkbox',
default: true,
},
},
css: windowcss,
events:
{
save: function() {
GM_config.close();
}
},
});
function get(url, callback, header) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
callback(xhr.responseText, header);
}
};
xhr.send(null);
}
function doThings(json, header){
const card = JSON.parse(json);
card.actions.forEach(action => {
if (action.type == 'createCard'){
if ($('#card-creator').length == 0){
const details = $('<div></div>').attr('id', 'card-creator').attr('style', 'float: right');
var content = '<span>created ';
if (GM_config.get('creationDate')){
const date = new Date(action.date);
const locale = GM_config.get('locale');
const creationDate = date.toLocaleDateString(locale, options);
content = content + creationDate + ', ';
}
content = content + '</span>';
if (GM_config.get('creatorName')){
content = content + '<span>by ' + action.memberCreator.fullName + ' </span>';
}
if (GM_config.get('creatorAccount')){
const username = action.memberCreator.username;
content = content + '(<a href="/' + username + '">@' + username + '</a>)';
}
details.append(content);
header.append(details);
}
}
});
function addAttachmentDetails(item){
const attachment = $(item);
const href = attachment.attr('href');
card.actions.forEach(action => {
if (action.type == 'addAttachmentToCard'){
if (href == action.data.attachment.url){
const details = $('<div></div>').addClass('attachment-creator').attr('style', 'float: right');
var content = '<span>by ';
if (GM_config.get('creatorName')){
content = content + action.memberCreator.fullName + ' </span>';
}
if (GM_config.get('creatorAccount')){
const username = action.memberCreator.username;
content = content + '(<a href="/' + username + '">@' + username + '</a>)';
}
details.append(content);
attachment.parent().children(attachmentdetails).append(details);
}
}
})
}
if (GM_config.get('attachment')){
addAttachmentDetails($(attachments).find(attachmentlink));
$(attachments).arrive(attachmentlink, addAttachmentDetails);
}
}
function addCardDetails(item){
const header = $(item);
const jsonUrl = window.location.href + '.json';
get(jsonUrl, doThings, header);
fetch(jsonUrl)
.then(response => console.log(response.json));
}
(function() {
'use strict';
$(cardwindow).arrive(cardheader, addCardDetails);
})();