feat: Add board setting to expand task lists by default

Closes #683, closes #1333
This commit is contained in:
Maksim Eltyshev
2025-09-05 23:21:08 +02:00
parent b47a337a4f
commit 984b789e2e
39 changed files with 78 additions and 3 deletions

View File

@@ -43,6 +43,14 @@ const Others = React.memo(() => {
className={styles.radio}
onChange={handleChange}
/>
<Radio
toggle
name="expandTaskListsByDefault"
checked={board.expandTaskListsByDefault}
label={t('common.expandTaskListsByDefault')}
className={styles.radio}
onChange={handleChange}
/>
</Segment>
);
});

View File

@@ -22,7 +22,11 @@ const TaskList = React.memo(({ id }) => {
const taskLists = useSelector((state) => selectTaskListById(state, id));
const tasks = useSelector((state) => selectTasksByTaskListId(state, id));
const [isOpened, toggleOpened] = useToggle();
const defaultIsOpened = useSelector(
(state) => selectors.selectCurrentBoard(state).expandTaskListsByDefault,
);
const [isOpened, toggleOpened] = useToggle(defaultIsOpened);
const filteredTasks = useMemo(
() => (taskLists.hideCompletedTasks ? tasks.filter((task) => !task.isCompleted) : tasks),

View File

@@ -171,6 +171,7 @@ export default {
enterTaskDescription: 'أدخل وصف المهمة...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'تصفية حسب الملصقات',
filterByMembers_title: 'تصفية حسب الأعضاء',
forPersonalProjects: null,

View File

@@ -175,6 +175,7 @@ export default {
enterTaskDescription: 'Въведете описание на задачата...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Филтриране по етикети',
filterByMembers_title: 'Филтриране по членове',
forPersonalProjects: null,

View File

@@ -185,6 +185,7 @@ export default {
enterTaskDescription: 'Vlož popis úkolu...',
events: 'Události',
excludedEvents: 'Vyloučené události',
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtrovat podle štítku',
filterByMembers_title: 'Filtrovat podle člena',
forPersonalProjects: 'Pro osobní projekty.',

View File

@@ -190,6 +190,7 @@ export default {
enterTaskDescription: 'Angiv opgavens beskrivelse...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtrer labels',
filterByMembers_title: 'Filtrer medlemmer',
forPersonalProjects: 'For personlige projekter.',

View File

@@ -199,6 +199,7 @@ export default {
enterTaskDescription: 'Aufgabenbeschreibung eingeben...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Nach Label filtern',
filterByMembers_title: 'Nach Mitgliedern filtern',
forPersonalProjects: 'Für persönliche Projekte.',

View File

@@ -200,6 +200,7 @@ export default {
enterTaskDescription: 'Εισάγετε περιγραφή εργασίας...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Φιλτράρισμα κατά ετικέτες',
filterByMembers_title: 'Φιλτράρισμα κατά μέλη',
forPersonalProjects: 'Για προσωπικά έργα.',

View File

@@ -189,6 +189,7 @@ export default {
enterTaskDescription: 'Enter task description...',
events: 'Events',
excludedEvents: 'Excluded events',
expandTaskListsByDefault: 'Expand task lists by default',
filterByLabels_title: 'Filter By Labels',
filterByMembers_title: 'Filter By Members',
forPersonalProjects: 'For personal projects.',

View File

@@ -184,6 +184,7 @@ export default {
enterTaskDescription: 'Enter task description...',
events: 'Events',
excludedEvents: 'Excluded events',
expandTaskListsByDefault: 'Expand task lists by default',
filterByLabels_title: 'Filter By Labels',
filterByMembers_title: 'Filter By Members',
forPersonalProjects: 'For personal projects.',

View File

@@ -190,6 +190,7 @@ export default {
enterTaskDescription: 'Escribe la descripción de la tarea...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtrar por Etiquetas',
filterByMembers_title: 'Filtrar por Miembros',
forPersonalProjects: 'Para proyectos personales',

View File

@@ -189,6 +189,7 @@ export default {
enterTaskDescription: 'Sisestage ülesande kirjeldus...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtreeri siltide järgi',
filterByMembers_title: 'Filtreeri liikmete järgi',
forPersonalProjects: 'Inimlikuks projektideks.',

View File

@@ -172,6 +172,7 @@ export default {
enterTaskDescription: 'توضیحات وظیفه را وارد کنید...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'فیلتر بر اساس برچسب‌ها',
filterByMembers_title: 'فیلتر بر اساس اعضا',
forPersonalProjects: null,

View File

@@ -185,6 +185,7 @@ export default {
enterTaskDescription: 'Syötä tehtävän kuvaus...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Suodata tunnisteiden mukaan',
filterByMembers_title: 'Suodata jäsenten mukaan',
forPersonalProjects: 'Henkilökohtaisiin projekteihin.',

View File

@@ -193,6 +193,7 @@ export default {
enterTaskDescription: 'Saisir la description de la tâche...',
events: 'Événements',
excludedEvents: 'Événements exclus',
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtrer par étiquettes',
filterByMembers_title: 'Filtrer par membres',
forPersonalProjects: 'Pour les projets personnels',

View File

@@ -182,6 +182,7 @@ export default {
enterTaskDescription: 'Adja meg a feladat leírását...',
events: 'Események',
excludedEvents: 'Kizárt események',
expandTaskListsByDefault: null,
filterByLabels_title: 'Szűrés címkék alapján',
filterByMembers_title: 'Szűrés tagok alapján',
forPersonalProjects: 'Személyes projektekhez.',

View File

@@ -174,6 +174,7 @@ export default {
enterTaskDescription: 'Masukkan deskripsi tugas...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Saring berdasarkan Label',
filterByMembers_title: 'Saring berdasarkan Anggota',
forPersonalProjects: null,

View File

@@ -191,6 +191,7 @@ export default {
enterTaskDescription: 'Inserire descrizione della task...',
events: 'Eventi',
excludedEvents: 'Eventi esclusi',
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtra per etichetta',
filterByMembers_title: 'Filtra per membro',
forPersonalProjects: 'Per progetti personali',

View File

@@ -174,6 +174,7 @@ export default {
enterTaskDescription: 'タスクの説明を入力…',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'ラベルで絞り込む',
filterByMembers_title: 'メンバーで絞り込む',
forPersonalProjects: null,

View File

@@ -172,6 +172,7 @@ export default {
enterTaskDescription: '작업 설명 입력...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: '라벨별 필터링',
filterByMembers_title: '멤버별 필터링',
forPersonalProjects: null,

View File

@@ -174,6 +174,7 @@ export default {
enterTaskDescription: 'Taakbeschrijving invoeren...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Filteren op labels',
filterByMembers_title: 'Filteren op leden',
forPersonalProjects: null,

View File

@@ -181,6 +181,7 @@ export default {
enterTaskDescription: 'Podaj opis zadania...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtruj Po Oznaczeniach',
filterByMembers_title: 'Filtruj Po Członkach',
forPersonalProjects: 'Dla projektów osobistych.',

View File

@@ -191,6 +191,7 @@ export default {
enterTaskDescription: 'Digite a descrição da tarefa...',
events: 'Eventos',
excludedEvents: 'Eventos Excluídos',
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtrar por Rótulos',
filterByMembers_title: 'Filtrar por Membros',
forPersonalProjects: 'Para projetos pessoais.',

View File

@@ -175,6 +175,7 @@ export default {
enterTaskDescription: 'Introduza a descrição da tarefa...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtrar por Etiquetas',
filterByMembers_title: 'Filtrar por Membros',
forPersonalProjects: null,

View File

@@ -174,6 +174,7 @@ export default {
enterTaskDescription: 'Introduceți descrierea sarcinii...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtrați după etichete',
filterByMembers_title: 'Filtrați după membri',
forPersonalProjects: null,

View File

@@ -188,6 +188,7 @@ export default {
enterTaskDescription: 'Введите описание задачи...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Фильтр по меткам',
filterByMembers_title: 'Фильтр по участникам',
forPersonalProjects: 'Для личных проектов',

View File

@@ -174,6 +174,7 @@ export default {
enterTaskDescription: 'Vlož popis úlohy...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtruj podľa štítku',
filterByMembers_title: 'Filtruj podľa člena',
forPersonalProjects: null,

View File

@@ -174,6 +174,7 @@ export default {
enterTaskDescription: 'Унеси опис задатка...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Филтрирај према ознакама',
filterByMembers_title: 'Филтрирај према члановима',
forPersonalProjects: null,

View File

@@ -171,6 +171,7 @@ export default {
enterTaskDescription: 'Unesi opis zadatka...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtriraj prema oznakama',
filterByMembers_title: 'Filtriraj prema članovima',
forPersonalProjects: null,

View File

@@ -173,6 +173,7 @@ export default {
enterTaskDescription: 'Ange uppgiftsbeskrivning...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Filtrera efter etiketter',
filterByMembers_title: 'Filtrera efter medlemmar',
forPersonalProjects: null,

View File

@@ -171,6 +171,7 @@ export default {
enterTaskDescription: 'Görev açıklamasını girin...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: 'Etikete Göre Filtrele',
filterByMembers_title: 'Üyelere göre filtrele',
forPersonalProjects: null,

View File

@@ -186,6 +186,7 @@ export default {
enterTaskDescription: 'Введіть опис завдання...',
events: 'Події',
excludedEvents: 'Виключені події',
expandTaskListsByDefault: null,
filterByLabels_title: 'Фільтрувати за Мітками',
filterByMembers_title: 'Фільтрувати за Учасниками',
forPersonalProjects: 'Для особистих проектів.',

View File

@@ -170,6 +170,7 @@ export default {
enterTaskDescription: 'Topshiriq sarlavhasini kiriting...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: "Yorliq bo'yicha filter",
filterByMembers_title: "A'zolar bo'yicha filter",
forPersonalProjects: null,

View File

@@ -171,6 +171,7 @@ export default {
enterTaskDescription: '输入任务描述...',
events: '事件',
excludedEvents: '排除事件',
expandTaskListsByDefault: null,
filterByLabels_title: '通过标签筛选',
filterByMembers_title: '通过成员筛选',
forPersonalProjects: '用于个人项目',

View File

@@ -168,6 +168,7 @@ export default {
enterTaskDescription: '輸入任務描述...',
events: null,
excludedEvents: null,
expandTaskListsByDefault: null,
filterByLabels_title: '通過標籤篩選',
filterByMembers_title: '通過成員篩選',
forPersonalProjects: null,

View File

@@ -31,6 +31,7 @@ export default class extends BaseModel {
defaultCardType: attr(),
limitCardTypesToDefaultOne: attr(),
alwaysDisplayCardCreator: attr(),
expandTaskListsByDefault: attr(),
context: attr(),
view: attr(),
search: attr(),

View File

@@ -33,15 +33,16 @@ module.exports = {
defaultCardType: {
type: 'string',
isIn: Object.values(Card.Types),
allowNull: true,
},
limitCardTypesToDefaultOne: {
type: 'boolean',
allowNull: true,
},
alwaysDisplayCardCreator: {
type: 'boolean',
},
expandTaskListsByDefault: {
type: 'boolean',
},
isSubscribed: {
type: 'boolean',
},
@@ -79,6 +80,7 @@ module.exports = {
'defaultCardType',
'limitCardTypesToDefaultOne',
'alwaysDisplayCardCreator',
'expandTaskListsByDefault',
);
}
if (isBoardMember) {
@@ -96,6 +98,7 @@ module.exports = {
'defaultCardType',
'limitCardTypesToDefaultOne',
'alwaysDisplayCardCreator',
'expandTaskListsByDefault',
'isSubscribed',
]);

View File

@@ -61,6 +61,11 @@ module.exports = {
defaultsTo: false,
columnName: 'always_display_card_creator',
},
expandTaskListsByDefault: {
type: 'boolean',
defaultsTo: false,
columnName: 'expand_task_lists_by_default',
},
// ╔═╗╔╦╗╔╗ ╔═╗╔╦╗╔═╗
// ║╣ ║║║╠╩╗║╣ ║║╚═╗

View File

@@ -0,0 +1,21 @@
/*!
* Copyright (c) 2024 PLANKA Software GmbH
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
*/
exports.up = async (knex) => {
await knex.schema.alterTable('board', (table) => {
/* Columns */
table.boolean('expand_task_lists_by_default').notNullable().defaultTo(false);
});
return knex.schema.alterTable('board', (table) => {
table.boolean('expand_task_lists_by_default').notNullable().alter();
});
};
exports.down = (knex) =>
knex.schema.table('board', (table) => {
table.dropColumn('expand_task_lists_by_default');
});