// ==UserScript== // @name Trello Collapsible Lists // @description written by @alexkli // @match https://trello.com/b/* // ==/UserScript== const boardId = window.location.pathname.replace(/^\/b\/([^\/]+).*$/, '$1'); function getListKey(list) { const listName = list.querySelector('.list-header-name-assist').textContent; return `list-collapsed-${boardId}-${listName}`; } function toggleList(collapseButton) { const list = collapseButton.parentNode.parentNode; const listContent = list.querySelector('.list-cards'); const listKey = getListKey(list); if (listContent.toggleAttribute('hidden')) { // hidden collapseButton.innerText = '▶︎'; list.querySelector('.card-composer-container').style.display = 'none'; localStorage.setItem(listKey, 'true'); } else { // visible collapseButton.innerText = '▼'; list.querySelector('.card-composer-container').style.display = 'flex'; localStorage.removeItem(listKey); } } function init() { // list: .list // header: .list-header // list content: .list-cards document.querySelectorAll('.list').forEach((list) => { const listKey = getListKey(list); const listHeader = list.querySelector('.list-header'); const collapseButton = document.createElement('div'); collapseButton.className = 'list-collapse-button'; collapseButton.innerText = '▼'; collapseButton.style.position = 'absolute'; collapseButton.style.width = '8px'; collapseButton.style.cursor = 'pointer'; collapseButton.addEventListener("click", (event) => { toggleList(event.target); }); listHeader.insertBefore(collapseButton, listHeader.firstChild); const listHeaderTarget = list.querySelector('.list-header-target'); listHeaderTarget.style.left = '25px'; const listTitle = list.querySelector('.list-header-name'); listTitle.style['margin-left'] = '10px'; if (localStorage.getItem(listKey)) { toggleList(collapseButton); } }); } function onDocumentReady() { // wait until we have .list elements present in the DOM const observer = new MutationObserver((mutationList) => { if (document.querySelector('.list')) { observer.disconnect(); init(); } }); observer.observe(document, { childList: true, subtree: true }); } if (document.readyState !== "loading") { onDocumentReady(); } else { window.addEventListener("DOMContentLoaded", onDocumentReady); }