diff --git a/client/src/components/boards/BoardSettingsModal/PreferencesPane/Others.jsx b/client/src/components/boards/BoardSettingsModal/PreferencesPane/Others.jsx index 6b68bfea..0d4d334e 100644 --- a/client/src/components/boards/BoardSettingsModal/PreferencesPane/Others.jsx +++ b/client/src/components/boards/BoardSettingsModal/PreferencesPane/Others.jsx @@ -43,6 +43,14 @@ const Others = React.memo(() => { className={styles.radio} onChange={handleChange} /> + ); }); diff --git a/client/src/components/cards/Card/TaskList/TaskList.jsx b/client/src/components/cards/Card/TaskList/TaskList.jsx index f39a94fb..86929889 100644 --- a/client/src/components/cards/Card/TaskList/TaskList.jsx +++ b/client/src/components/cards/Card/TaskList/TaskList.jsx @@ -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), diff --git a/client/src/locales/ar-YE/core.js b/client/src/locales/ar-YE/core.js index c56086f6..3c1c1970 100644 --- a/client/src/locales/ar-YE/core.js +++ b/client/src/locales/ar-YE/core.js @@ -171,6 +171,7 @@ export default { enterTaskDescription: 'أدخل وصف المهمة...', events: null, excludedEvents: null, + expandTaskListsByDefault: null, filterByLabels_title: 'تصفية حسب الملصقات', filterByMembers_title: 'تصفية حسب الأعضاء', forPersonalProjects: null, diff --git a/client/src/locales/bg-BG/core.js b/client/src/locales/bg-BG/core.js index ef11c811..f73a6d43 100644 --- a/client/src/locales/bg-BG/core.js +++ b/client/src/locales/bg-BG/core.js @@ -175,6 +175,7 @@ export default { enterTaskDescription: 'Въведете описание на задачата...', events: null, excludedEvents: null, + expandTaskListsByDefault: null, filterByLabels_title: 'Филтриране по етикети', filterByMembers_title: 'Филтриране по членове', forPersonalProjects: null, diff --git a/client/src/locales/cs-CZ/core.js b/client/src/locales/cs-CZ/core.js index e36be86c..5c19aae3 100644 --- a/client/src/locales/cs-CZ/core.js +++ b/client/src/locales/cs-CZ/core.js @@ -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.', diff --git a/client/src/locales/da-DK/core.js b/client/src/locales/da-DK/core.js index 72fdbb95..fce02de7 100644 --- a/client/src/locales/da-DK/core.js +++ b/client/src/locales/da-DK/core.js @@ -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.', diff --git a/client/src/locales/de-DE/core.js b/client/src/locales/de-DE/core.js index 35d4628a..bcabd8f4 100644 --- a/client/src/locales/de-DE/core.js +++ b/client/src/locales/de-DE/core.js @@ -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.', diff --git a/client/src/locales/el-GR/core.js b/client/src/locales/el-GR/core.js index ea74b1a3..77766ead 100644 --- a/client/src/locales/el-GR/core.js +++ b/client/src/locales/el-GR/core.js @@ -200,6 +200,7 @@ export default { enterTaskDescription: 'Εισάγετε περιγραφή εργασίας...', events: null, excludedEvents: null, + expandTaskListsByDefault: null, filterByLabels_title: 'Φιλτράρισμα κατά ετικέτες', filterByMembers_title: 'Φιλτράρισμα κατά μέλη', forPersonalProjects: 'Για προσωπικά έργα.', diff --git a/client/src/locales/en-GB/core.js b/client/src/locales/en-GB/core.js index 6a626afe..fbd9c1ce 100644 --- a/client/src/locales/en-GB/core.js +++ b/client/src/locales/en-GB/core.js @@ -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.', diff --git a/client/src/locales/en-US/core.js b/client/src/locales/en-US/core.js index c22b14d1..4953f5cb 100644 --- a/client/src/locales/en-US/core.js +++ b/client/src/locales/en-US/core.js @@ -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.', diff --git a/client/src/locales/es-ES/core.js b/client/src/locales/es-ES/core.js index 357ab375..17a6ba97 100644 --- a/client/src/locales/es-ES/core.js +++ b/client/src/locales/es-ES/core.js @@ -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', diff --git a/client/src/locales/et-EE/core.js b/client/src/locales/et-EE/core.js index 7d9f67d5..79634ef3 100644 --- a/client/src/locales/et-EE/core.js +++ b/client/src/locales/et-EE/core.js @@ -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.', diff --git a/client/src/locales/fa-IR/core.js b/client/src/locales/fa-IR/core.js index 9ea3333a..0265000a 100644 --- a/client/src/locales/fa-IR/core.js +++ b/client/src/locales/fa-IR/core.js @@ -172,6 +172,7 @@ export default { enterTaskDescription: 'توضیحات وظیفه را وارد کنید...', events: null, excludedEvents: null, + expandTaskListsByDefault: null, filterByLabels_title: 'فیلتر بر اساس برچسب‌ها', filterByMembers_title: 'فیلتر بر اساس اعضا', forPersonalProjects: null, diff --git a/client/src/locales/fi-FI/core.js b/client/src/locales/fi-FI/core.js index 95246dd9..40b5d16a 100644 --- a/client/src/locales/fi-FI/core.js +++ b/client/src/locales/fi-FI/core.js @@ -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.', diff --git a/client/src/locales/fr-FR/core.js b/client/src/locales/fr-FR/core.js index a5941479..b1c426a4 100644 --- a/client/src/locales/fr-FR/core.js +++ b/client/src/locales/fr-FR/core.js @@ -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', diff --git a/client/src/locales/hu-HU/core.js b/client/src/locales/hu-HU/core.js index 8d7c15b8..58dd674e 100644 --- a/client/src/locales/hu-HU/core.js +++ b/client/src/locales/hu-HU/core.js @@ -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.', diff --git a/client/src/locales/id-ID/core.js b/client/src/locales/id-ID/core.js index 58afb85e..8c0cd38b 100644 --- a/client/src/locales/id-ID/core.js +++ b/client/src/locales/id-ID/core.js @@ -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, diff --git a/client/src/locales/it-IT/core.js b/client/src/locales/it-IT/core.js index 74488736..f6636d6a 100644 --- a/client/src/locales/it-IT/core.js +++ b/client/src/locales/it-IT/core.js @@ -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', diff --git a/client/src/locales/ja-JP/core.js b/client/src/locales/ja-JP/core.js index 2a25075f..354cd6c3 100644 --- a/client/src/locales/ja-JP/core.js +++ b/client/src/locales/ja-JP/core.js @@ -174,6 +174,7 @@ export default { enterTaskDescription: 'タスクの説明を入力…', events: null, excludedEvents: null, + expandTaskListsByDefault: null, filterByLabels_title: 'ラベルで絞り込む', filterByMembers_title: 'メンバーで絞り込む', forPersonalProjects: null, diff --git a/client/src/locales/ko-KR/core.js b/client/src/locales/ko-KR/core.js index 081108db..b88fddde 100644 --- a/client/src/locales/ko-KR/core.js +++ b/client/src/locales/ko-KR/core.js @@ -172,6 +172,7 @@ export default { enterTaskDescription: '작업 설명 입력...', events: null, excludedEvents: null, + expandTaskListsByDefault: null, filterByLabels_title: '라벨별 필터링', filterByMembers_title: '멤버별 필터링', forPersonalProjects: null, diff --git a/client/src/locales/nl-NL/core.js b/client/src/locales/nl-NL/core.js index 5d149452..a304039e 100644 --- a/client/src/locales/nl-NL/core.js +++ b/client/src/locales/nl-NL/core.js @@ -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, diff --git a/client/src/locales/pl-PL/core.js b/client/src/locales/pl-PL/core.js index fa79a0f0..79db2651 100644 --- a/client/src/locales/pl-PL/core.js +++ b/client/src/locales/pl-PL/core.js @@ -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.', diff --git a/client/src/locales/pt-BR/core.js b/client/src/locales/pt-BR/core.js index 99ca769b..daeb7379 100644 --- a/client/src/locales/pt-BR/core.js +++ b/client/src/locales/pt-BR/core.js @@ -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.', diff --git a/client/src/locales/pt-PT/core.js b/client/src/locales/pt-PT/core.js index 98e9d471..80859f50 100644 --- a/client/src/locales/pt-PT/core.js +++ b/client/src/locales/pt-PT/core.js @@ -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, diff --git a/client/src/locales/ro-RO/core.js b/client/src/locales/ro-RO/core.js index 3c0d1b4e..4d8213f1 100644 --- a/client/src/locales/ro-RO/core.js +++ b/client/src/locales/ro-RO/core.js @@ -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, diff --git a/client/src/locales/ru-RU/core.js b/client/src/locales/ru-RU/core.js index e46de1df..01e25dfe 100644 --- a/client/src/locales/ru-RU/core.js +++ b/client/src/locales/ru-RU/core.js @@ -188,6 +188,7 @@ export default { enterTaskDescription: 'Введите описание задачи...', events: null, excludedEvents: null, + expandTaskListsByDefault: null, filterByLabels_title: 'Фильтр по меткам', filterByMembers_title: 'Фильтр по участникам', forPersonalProjects: 'Для личных проектов', diff --git a/client/src/locales/sk-SK/core.js b/client/src/locales/sk-SK/core.js index e30dfd8e..0fab1f5b 100644 --- a/client/src/locales/sk-SK/core.js +++ b/client/src/locales/sk-SK/core.js @@ -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, diff --git a/client/src/locales/sr-Cyrl-RS/core.js b/client/src/locales/sr-Cyrl-RS/core.js index b0e1bc39..c5544ad7 100644 --- a/client/src/locales/sr-Cyrl-RS/core.js +++ b/client/src/locales/sr-Cyrl-RS/core.js @@ -174,6 +174,7 @@ export default { enterTaskDescription: 'Унеси опис задатка...', events: null, excludedEvents: null, + expandTaskListsByDefault: null, filterByLabels_title: 'Филтрирај према ознакама', filterByMembers_title: 'Филтрирај према члановима', forPersonalProjects: null, diff --git a/client/src/locales/sr-Latn-RS/core.js b/client/src/locales/sr-Latn-RS/core.js index 4be00134..81e21469 100644 --- a/client/src/locales/sr-Latn-RS/core.js +++ b/client/src/locales/sr-Latn-RS/core.js @@ -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, diff --git a/client/src/locales/sv-SE/core.js b/client/src/locales/sv-SE/core.js index 5c3763a9..cf207e67 100644 --- a/client/src/locales/sv-SE/core.js +++ b/client/src/locales/sv-SE/core.js @@ -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, diff --git a/client/src/locales/tr-TR/core.js b/client/src/locales/tr-TR/core.js index 81d29cac..df740bfa 100644 --- a/client/src/locales/tr-TR/core.js +++ b/client/src/locales/tr-TR/core.js @@ -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, diff --git a/client/src/locales/uk-UA/core.js b/client/src/locales/uk-UA/core.js index 9e551f86..f7ab3d8b 100644 --- a/client/src/locales/uk-UA/core.js +++ b/client/src/locales/uk-UA/core.js @@ -186,6 +186,7 @@ export default { enterTaskDescription: 'Введіть опис завдання...', events: 'Події', excludedEvents: 'Виключені події', + expandTaskListsByDefault: null, filterByLabels_title: 'Фільтрувати за Мітками', filterByMembers_title: 'Фільтрувати за Учасниками', forPersonalProjects: 'Для особистих проектів.', diff --git a/client/src/locales/uz-UZ/core.js b/client/src/locales/uz-UZ/core.js index 81555989..1310660e 100644 --- a/client/src/locales/uz-UZ/core.js +++ b/client/src/locales/uz-UZ/core.js @@ -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, diff --git a/client/src/locales/zh-CN/core.js b/client/src/locales/zh-CN/core.js index 7511e17f..d946f916 100644 --- a/client/src/locales/zh-CN/core.js +++ b/client/src/locales/zh-CN/core.js @@ -171,6 +171,7 @@ export default { enterTaskDescription: '输入任务描述...', events: '事件', excludedEvents: '排除事件', + expandTaskListsByDefault: null, filterByLabels_title: '通过标签筛选', filterByMembers_title: '通过成员筛选', forPersonalProjects: '用于个人项目', diff --git a/client/src/locales/zh-TW/core.js b/client/src/locales/zh-TW/core.js index dd25a23c..3e78e243 100644 --- a/client/src/locales/zh-TW/core.js +++ b/client/src/locales/zh-TW/core.js @@ -168,6 +168,7 @@ export default { enterTaskDescription: '輸入任務描述...', events: null, excludedEvents: null, + expandTaskListsByDefault: null, filterByLabels_title: '通過標籤篩選', filterByMembers_title: '通過成員篩選', forPersonalProjects: null, diff --git a/client/src/models/Board.js b/client/src/models/Board.js index 6055214d..06a70c28 100755 --- a/client/src/models/Board.js +++ b/client/src/models/Board.js @@ -31,6 +31,7 @@ export default class extends BaseModel { defaultCardType: attr(), limitCardTypesToDefaultOne: attr(), alwaysDisplayCardCreator: attr(), + expandTaskListsByDefault: attr(), context: attr(), view: attr(), search: attr(), diff --git a/server/api/controllers/boards/update.js b/server/api/controllers/boards/update.js index 6b221238..86c4971a 100755 --- a/server/api/controllers/boards/update.js +++ b/server/api/controllers/boards/update.js @@ -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', ]); diff --git a/server/api/models/Board.js b/server/api/models/Board.js index 347ed8c6..bf51c278 100755 --- a/server/api/models/Board.js +++ b/server/api/models/Board.js @@ -61,6 +61,11 @@ module.exports = { defaultsTo: false, columnName: 'always_display_card_creator', }, + expandTaskListsByDefault: { + type: 'boolean', + defaultsTo: false, + columnName: 'expand_task_lists_by_default', + }, // ╔═╗╔╦╗╔╗ ╔═╗╔╦╗╔═╗ // ║╣ ║║║╠╩╗║╣ ║║╚═╗ diff --git a/server/db/migrations/20250905205438_add_board_setting_to_expand_task_lists_by_default.js b/server/db/migrations/20250905205438_add_board_setting_to_expand_task_lists_by_default.js new file mode 100644 index 00000000..bd8490ac --- /dev/null +++ b/server/db/migrations/20250905205438_add_board_setting_to_expand_task_lists_by_default.js @@ -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'); + });