feat: Add ability to display card ages

This commit is contained in:
Maksim Eltyshev
2026-03-18 09:42:20 +01:00
parent 95e479cd3a
commit c342d2edd7
42 changed files with 113 additions and 15 deletions
@@ -43,6 +43,14 @@ const Others = React.memo(() => {
className={styles.radio} className={styles.radio}
onChange={handleChange} onChange={handleChange}
/> />
<Radio
toggle
name="displayCardAges"
checked={board.displayCardAges}
label={t('common.displayCardAges')}
className={styles.radio}
onChange={handleChange}
/>
<Radio <Radio
toggle toggle
name="expandTaskListsByDefault" name="expandTaskListsByDefault"
@@ -17,6 +17,7 @@ import { BoardMembershipRoles, BoardViews } from '../../../constants/Enums';
import TaskList from './TaskList'; import TaskList from './TaskList';
import DueDateChip from '../DueDateChip'; import DueDateChip from '../DueDateChip';
import StopwatchChip from '../StopwatchChip'; import StopwatchChip from '../StopwatchChip';
import TimeAgo from '../../common/TimeAgo';
import UserAvatar from '../../users/UserAvatar'; import UserAvatar from '../../users/UserAvatar';
import LabelChip from '../../labels/LabelChip'; import LabelChip from '../../labels/LabelChip';
import CustomFieldValueChip from '../../custom-field-values/CustomFieldValueChip'; import CustomFieldValueChip from '../../custom-field-values/CustomFieldValueChip';
@@ -75,12 +76,13 @@ const ProjectContent = React.memo(({ cardId }) => {
return attachment && attachment.data.thumbnailUrls.outside360; return attachment && attachment.data.thumbnailUrls.outside360;
}); });
const { listName, withCreator } = useSelector((state) => { const { listName, withCreator, withAge } = useSelector((state) => {
const board = selectors.selectCurrentBoard(state); const board = selectors.selectCurrentBoard(state);
return { return {
listName: list.name && (board.view === BoardViews.KANBAN ? null : list.name), listName: list.name && (board.view === BoardViews.KANBAN ? null : list.name),
withCreator: board.alwaysDisplayCardCreator, withCreator: board.alwaysDisplayCardCreator,
withAge: board.displayCardAges,
}; };
}, shallowEqual); }, shallowEqual);
@@ -115,6 +117,7 @@ const ProjectContent = React.memo(({ cardId }) => {
card.dueDate || card.dueDate ||
card.stopwatch || card.stopwatch ||
card.commentsTotal > 0 || card.commentsTotal > 0 ||
withAge ||
attachmentsTotal > 0 || attachmentsTotal > 0 ||
notificationsTotal > 0 || notificationsTotal > 0 ||
listName; listName;
@@ -236,6 +239,14 @@ const ProjectContent = React.memo(({ cardId }) => {
</span> </span>
</span> </span>
)} )}
{withAge && card.createdAt && (
<span className={classNames(styles.attachment, styles.attachmentLeft)}>
<span className={styles.attachmentContent}>
<Icon name="history" />
<TimeAgo date={card.createdAt} />
</span>
</span>
)}
</span> </span>
)} )}
{!isCompact && usersNode} {!isCompact && usersNode}
@@ -6,12 +6,13 @@
import React, { useMemo } from 'react'; import React, { useMemo } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import { useSelector } from 'react-redux'; import { shallowEqual, useSelector } from 'react-redux';
import { Icon } from 'semantic-ui-react'; import { Icon } from 'semantic-ui-react';
import selectors from '../../../selectors'; import selectors from '../../../selectors';
import markdownToText from '../../../utils/markdown-to-text'; import markdownToText from '../../../utils/markdown-to-text';
import { BoardViews } from '../../../constants/Enums'; import { BoardViews } from '../../../constants/Enums';
import TimeAgo from '../../common/TimeAgo';
import LabelChip from '../../labels/LabelChip'; import LabelChip from '../../labels/LabelChip';
import CustomFieldValueChip from '../../custom-field-values/CustomFieldValueChip'; import CustomFieldValueChip from '../../custom-field-values/CustomFieldValueChip';
@@ -52,19 +53,14 @@ const StoryContent = React.memo(({ cardId }) => {
selectNotificationsTotalByCardId(state, cardId), selectNotificationsTotalByCardId(state, cardId),
); );
const listName = useSelector((state) => { const { listName, withAge } = useSelector((state) => {
if (!list.name) { const board = selectors.selectCurrentBoard(state);
return null;
}
const { view } = selectors.selectCurrentBoard(state); return {
listName: list.name && (board.view === BoardViews.KANBAN ? null : list.name),
if (view === BoardViews.KANBAN) { withAge: board.displayCardAges,
return null; };
} }, shallowEqual);
return list.name;
});
const coverUrl = useSelector((state) => { const coverUrl = useSelector((state) => {
const attachment = selectAttachmentById(state, card.coverAttachmentId); const attachment = selectAttachmentById(state, card.coverAttachmentId);
@@ -109,7 +105,7 @@ const StoryContent = React.memo(({ cardId }) => {
{card.name} {card.name}
</div> </div>
{card.description && <div className={styles.descriptionText}>{descriptionText}</div>} {card.description && <div className={styles.descriptionText}>{descriptionText}</div>}
{(attachmentsTotal > 0 || notificationsTotal > 0 || listName) && ( {(withAge || attachmentsTotal > 0 || notificationsTotal > 0 || listName) && (
<span className={styles.attachments}> <span className={styles.attachments}>
{notificationsTotal > 0 && ( {notificationsTotal > 0 && (
<span <span
@@ -138,6 +134,14 @@ const StoryContent = React.memo(({ cardId }) => {
</span> </span>
</span> </span>
)} )}
{withAge && card.createdAt && (
<span className={classNames(styles.attachment, styles.attachmentLeft)}>
<span className={styles.attachmentContent}>
<Icon name="history" />
<TimeAgo date={card.createdAt} />
</span>
</span>
)}
</span> </span>
)} )}
</div> </div>
+1
View File
@@ -166,6 +166,7 @@ export default {
deletedUser_title: 'مستخدم محذوف', deletedUser_title: 'مستخدم محذوف',
description: 'الوصف', description: 'الوصف',
display: 'عرض', display: 'عرض',
displayCardAges: 'عرض أعمار البطاقات',
dropFileToUpload: 'أفلت الملف لرفعه', dropFileToUpload: 'أفلت الملف لرفعه',
dueDate_title: 'تاريخ الاستحقاق', dueDate_title: 'تاريخ الاستحقاق',
dynamicAndUnevenlySpacedLayout: 'تخطيط ديناميكي وغير متساوي المسافات.', dynamicAndUnevenlySpacedLayout: 'تخطيط ديناميكي وغير متساوي المسافات.',
+1
View File
@@ -178,6 +178,7 @@ export default {
deletedUser_title: 'Изтрит потребител', deletedUser_title: 'Изтрит потребител',
description: 'Описание', description: 'Описание',
display: 'Показване', display: 'Показване',
displayCardAges: 'Показвай възрастта на картите',
dropFileToUpload: 'Пуснете файл за качване', dropFileToUpload: 'Пуснете файл за качване',
dueDate_title: 'Краен срок', dueDate_title: 'Краен срок',
dynamicAndUnevenlySpacedLayout: 'Динамично и неравномерно разположение.', dynamicAndUnevenlySpacedLayout: 'Динамично и неравномерно разположение.',
+1
View File
@@ -177,6 +177,7 @@ export default {
deletedUser_title: 'Usuari eliminat', deletedUser_title: 'Usuari eliminat',
description: 'Descripció', description: 'Descripció',
display: 'Mostrar', display: 'Mostrar',
displayCardAges: "Mostrar l'antiguitat de les targetes",
dropFileToUpload: 'Arrossega fitxer per pujar-lo', dropFileToUpload: 'Arrossega fitxer per pujar-lo',
dueDate_title: 'Data de venciment', dueDate_title: 'Data de venciment',
dynamicAndUnevenlySpacedLayout: 'Disseny dinàmic i amb espaiat irregular.', dynamicAndUnevenlySpacedLayout: 'Disseny dinàmic i amb espaiat irregular.',
+1
View File
@@ -169,6 +169,7 @@ export default {
deletedUser_title: 'Smazaný uživatel', deletedUser_title: 'Smazaný uživatel',
description: 'Popis', description: 'Popis',
display: 'Zobrazit', display: 'Zobrazit',
displayCardAges: 'Zobrazit stáří karet',
dropFileToUpload: 'Přetažením nahrát soubor', dropFileToUpload: 'Přetažením nahrát soubor',
dueDate_title: 'Termín', dueDate_title: 'Termín',
dynamicAndUnevenlySpacedLayout: 'Dynamické a nerovnoměrné rozložení.', dynamicAndUnevenlySpacedLayout: 'Dynamické a nerovnoměrné rozložení.',
+1
View File
@@ -173,6 +173,7 @@ export default {
deletedUser_title: 'Slettet bruger', deletedUser_title: 'Slettet bruger',
description: 'Beskrivelse', description: 'Beskrivelse',
display: 'Vis', display: 'Vis',
displayCardAges: 'Vis kortalder',
dropFileToUpload: 'Slip fil for at uploade', dropFileToUpload: 'Slip fil for at uploade',
dueDate_title: 'Frist', dueDate_title: 'Frist',
dynamicAndUnevenlySpacedLayout: 'Dynamisk og ujævnt fordelt layout.', dynamicAndUnevenlySpacedLayout: 'Dynamisk og ujævnt fordelt layout.',
+1
View File
@@ -188,6 +188,7 @@ export default {
deletedUser_title: 'Gelöschter Benutzer', deletedUser_title: 'Gelöschter Benutzer',
description: 'Beschreibung', description: 'Beschreibung',
display: 'Anzeige', display: 'Anzeige',
displayCardAges: 'Kartenalter anzeigen',
dropFileToUpload: 'Datei für Upload ablegen', dropFileToUpload: 'Datei für Upload ablegen',
dueDate_title: 'Fälligkeitsdatum', dueDate_title: 'Fälligkeitsdatum',
dynamicAndUnevenlySpacedLayout: 'Dynamisches und ungleichmäßig verteiltes Layout.', dynamicAndUnevenlySpacedLayout: 'Dynamisches und ungleichmäßig verteiltes Layout.',
+1
View File
@@ -186,6 +186,7 @@ export default {
deletedUser_title: 'Διαγραμμένος χρήστης', deletedUser_title: 'Διαγραμμένος χρήστης',
description: 'Περιγραφή', description: 'Περιγραφή',
display: 'Εμφάνιση', display: 'Εμφάνιση',
displayCardAges: 'Εμφάνιση ηλικίας καρτών',
dropFileToUpload: 'Σύρετε το αρχείο για μεταφόρτωση', dropFileToUpload: 'Σύρετε το αρχείο για μεταφόρτωση',
dueDate_title: 'Ημερομηνία λήξης', dueDate_title: 'Ημερομηνία λήξης',
dynamicAndUnevenlySpacedLayout: 'Δυναμική και άνισα κατανεμημένη διάταξη.', dynamicAndUnevenlySpacedLayout: 'Δυναμική και άνισα κατανεμημένη διάταξη.',
+1
View File
@@ -172,6 +172,7 @@ export default {
deletedUser_title: 'Deleted User', deletedUser_title: 'Deleted User',
description: 'Description', description: 'Description',
display: 'Display', display: 'Display',
displayCardAges: 'Display card ages',
dropFileToUpload: 'Drop file to upload', dropFileToUpload: 'Drop file to upload',
dueDate_title: 'Due Date', dueDate_title: 'Due Date',
dynamicAndUnevenlySpacedLayout: 'Dynamic and unevenly spaced layout.', dynamicAndUnevenlySpacedLayout: 'Dynamic and unevenly spaced layout.',
+1
View File
@@ -167,6 +167,7 @@ export default {
deletedUser_title: 'Deleted User', deletedUser_title: 'Deleted User',
description: 'Description', description: 'Description',
display: 'Display', display: 'Display',
displayCardAges: 'Display card ages',
dropFileToUpload: 'Drop file to upload', dropFileToUpload: 'Drop file to upload',
dueDate_title: 'Due Date', dueDate_title: 'Due Date',
dynamicAndUnevenlySpacedLayout: 'Dynamic and unevenly spaced layout.', dynamicAndUnevenlySpacedLayout: 'Dynamic and unevenly spaced layout.',
+1
View File
@@ -178,6 +178,7 @@ export default {
deletedUser_title: 'Usuario eliminado', deletedUser_title: 'Usuario eliminado',
description: 'Descripción', description: 'Descripción',
display: 'Mostrar', display: 'Mostrar',
displayCardAges: 'Mostrar antigüedad de las tarjetas',
dropFileToUpload: 'Arrastra archivo para subir', dropFileToUpload: 'Arrastra archivo para subir',
dueDate_title: 'Fecha de vencimiento', dueDate_title: 'Fecha de vencimiento',
dynamicAndUnevenlySpacedLayout: 'Diseño dinámico y con espaciado irregular.', dynamicAndUnevenlySpacedLayout: 'Diseño dinámico y con espaciado irregular.',
+1
View File
@@ -173,6 +173,7 @@ export default {
deletedUser_title: 'Kustutatud kasutaja', deletedUser_title: 'Kustutatud kasutaja',
description: 'Kirjeldus', description: 'Kirjeldus',
display: 'Kuva', display: 'Kuva',
displayCardAges: 'Näita kaartide vanust',
dropFileToUpload: 'Lase faili üleslaadida', dropFileToUpload: 'Lase faili üleslaadida',
dueDate_title: 'Tähtaeg', dueDate_title: 'Tähtaeg',
dynamicAndUnevenlySpacedLayout: 'Dünaamiline ja eirastega kujundus.', dynamicAndUnevenlySpacedLayout: 'Dünaamiline ja eirastega kujundus.',
+1
View File
@@ -176,6 +176,7 @@ export default {
deletedUser_title: 'کاربر حذف شده', deletedUser_title: 'کاربر حذف شده',
description: 'توضیحات', description: 'توضیحات',
display: 'نمایش', display: 'نمایش',
displayCardAges: 'نمایش سن کارت‌ها',
dropFileToUpload: 'فایل را برای آپلود بکشید', dropFileToUpload: 'فایل را برای آپلود بکشید',
dueDate_title: 'تاریخ سررسید', dueDate_title: 'تاریخ سررسید',
dynamicAndUnevenlySpacedLayout: 'طرح‌بندی پویا و نامتقارن.', dynamicAndUnevenlySpacedLayout: 'طرح‌بندی پویا و نامتقارن.',
+1
View File
@@ -169,6 +169,7 @@ export default {
deletedUser_title: 'Poistettu käyttäjä', deletedUser_title: 'Poistettu käyttäjä',
description: 'Kuvaus', description: 'Kuvaus',
display: 'Näyttö', display: 'Näyttö',
displayCardAges: 'Näytä korttien ikä',
dropFileToUpload: 'Pudota tiedosto ladattavaksi', dropFileToUpload: 'Pudota tiedosto ladattavaksi',
dueDate_title: 'Määräpäivä', dueDate_title: 'Määräpäivä',
dynamicAndUnevenlySpacedLayout: 'Dynaaminen ja epätasaisesti jaettu asettelu.', dynamicAndUnevenlySpacedLayout: 'Dynaaminen ja epätasaisesti jaettu asettelu.',
+1
View File
@@ -177,6 +177,7 @@ export default {
deletedUser_title: 'Utilisateur supprimé', deletedUser_title: 'Utilisateur supprimé',
description: 'Description', description: 'Description',
display: 'Affichage', display: 'Affichage',
displayCardAges: "Afficher l'âge des cartes",
dropFileToUpload: 'Déposer le fichier à télécharger', dropFileToUpload: 'Déposer le fichier à télécharger',
dueDate_title: "Date d'échéance", dueDate_title: "Date d'échéance",
dynamicAndUnevenlySpacedLayout: 'Mise en page dynamique et inégalement espacée.', dynamicAndUnevenlySpacedLayout: 'Mise en page dynamique et inégalement espacée.',
+1
View File
@@ -167,6 +167,7 @@ export default {
deletedUser_title: 'Törölt felhasználó', deletedUser_title: 'Törölt felhasználó',
description: 'Leírás', description: 'Leírás',
display: 'Megjelenítés', display: 'Megjelenítés',
displayCardAges: 'Kártyák korának megjelenítése',
dropFileToUpload: 'Dobja ide a fájlt a feltöltéshez', dropFileToUpload: 'Dobja ide a fájlt a feltöltéshez',
dueDate_title: 'Esedékesség dátuma', dueDate_title: 'Esedékesség dátuma',
dynamicAndUnevenlySpacedLayout: 'Dinamikus és asszimetrikus kiosztás.', dynamicAndUnevenlySpacedLayout: 'Dinamikus és asszimetrikus kiosztás.',
+1
View File
@@ -174,6 +174,7 @@ export default {
deletedUser_title: 'Pengguna yang dihapus', deletedUser_title: 'Pengguna yang dihapus',
description: 'Deskripsi', description: 'Deskripsi',
display: 'Tampilan', display: 'Tampilan',
displayCardAges: 'Tampilkan usia kartu',
dropFileToUpload: 'Tarik berkas untuk menggungah', dropFileToUpload: 'Tarik berkas untuk menggungah',
dueDate_title: 'Tenggat waktu', dueDate_title: 'Tenggat waktu',
dynamicAndUnevenlySpacedLayout: 'Tata letak dinamis dan tidak merata.', dynamicAndUnevenlySpacedLayout: 'Tata letak dinamis dan tidak merata.',
+1
View File
@@ -174,6 +174,7 @@ export default {
deletedUser_title: 'Utente eliminato', deletedUser_title: 'Utente eliminato',
description: 'Descrizione', description: 'Descrizione',
display: 'Mostra', display: 'Mostra',
displayCardAges: 'Mostra età delle schede',
dropFileToUpload: 'Trascina il file da caricare', dropFileToUpload: 'Trascina il file da caricare',
dueDate_title: 'Data di scadenza', dueDate_title: 'Data di scadenza',
dynamicAndUnevenlySpacedLayout: 'Layout dinamico e irregolarmente distribuito.', dynamicAndUnevenlySpacedLayout: 'Layout dinamico e irregolarmente distribuito.',
+1
View File
@@ -170,6 +170,7 @@ export default {
deletedUser_title: '削除されたユーザー', deletedUser_title: '削除されたユーザー',
description: '説明', description: '説明',
display: '表示', display: '表示',
displayCardAges: 'カードの経過時間を表示',
dropFileToUpload: 'ファイルをドロップしてアップロード', dropFileToUpload: 'ファイルをドロップしてアップロード',
dueDate_title: '期限', dueDate_title: '期限',
dynamicAndUnevenlySpacedLayout: '動的で不均等な間隔のレイアウト。', dynamicAndUnevenlySpacedLayout: '動的で不均等な間隔のレイアウト。',
+1
View File
@@ -164,6 +164,7 @@ export default {
deletedUser_title: '삭제된 사용자', deletedUser_title: '삭제된 사용자',
description: '설명', description: '설명',
display: '표시', display: '표시',
displayCardAges: '카드 경과 시간 표시',
dropFileToUpload: '업로드할 파일을 드롭하세요', dropFileToUpload: '업로드할 파일을 드롭하세요',
dueDate_title: '마감일', dueDate_title: '마감일',
dynamicAndUnevenlySpacedLayout: '동적이고 불균등한 간격의 레이아웃.', dynamicAndUnevenlySpacedLayout: '동적이고 불균등한 간격의 레이아웃.',
+1
View File
@@ -173,6 +173,7 @@ export default {
deletedUser_title: 'Verwijderde gebruiker', deletedUser_title: 'Verwijderde gebruiker',
description: 'Beschrijving', description: 'Beschrijving',
display: 'Weergave', display: 'Weergave',
displayCardAges: 'Kaartleeftijd weergeven',
dropFileToUpload: 'Sleep bestand om te uploaden', dropFileToUpload: 'Sleep bestand om te uploaden',
dueDate_title: 'Vervaldatum', dueDate_title: 'Vervaldatum',
dynamicAndUnevenlySpacedLayout: 'Dynamische en ongelijk verdeelde indeling.', dynamicAndUnevenlySpacedLayout: 'Dynamische en ongelijk verdeelde indeling.',
+1
View File
@@ -172,6 +172,7 @@ export default {
deletedUser_title: 'Usunięty użytkownik', deletedUser_title: 'Usunięty użytkownik',
description: 'Opis', description: 'Opis',
display: 'Wyświetlanie', display: 'Wyświetlanie',
displayCardAges: 'Pokazuj wiek kart',
dropFileToUpload: 'Upuść plik aby wgrać', dropFileToUpload: 'Upuść plik aby wgrać',
dueDate_title: 'Termin', dueDate_title: 'Termin',
dynamicAndUnevenlySpacedLayout: 'Dynamiczny i nierówny układ.', dynamicAndUnevenlySpacedLayout: 'Dynamiczny i nierówny układ.',
+1
View File
@@ -175,6 +175,7 @@ export default {
deletedUser_title: 'Usuário excluído', deletedUser_title: 'Usuário excluído',
description: 'Descrição', description: 'Descrição',
display: 'Exibir', display: 'Exibir',
displayCardAges: 'Exibir idade dos cartões',
dropFileToUpload: 'Solte o arquivo para enviar', dropFileToUpload: 'Solte o arquivo para enviar',
dueDate_title: 'Data de vencimento', dueDate_title: 'Data de vencimento',
dynamicAndUnevenlySpacedLayout: 'Layout dinâmico e desigualmente espaçado.', dynamicAndUnevenlySpacedLayout: 'Layout dinâmico e desigualmente espaçado.',
+1
View File
@@ -177,6 +177,7 @@ export default {
deletedUser_title: 'Utilizador eliminado', deletedUser_title: 'Utilizador eliminado',
description: 'Descrição', description: 'Descrição',
display: 'Exibir', display: 'Exibir',
displayCardAges: 'Mostrar idade dos cartões',
dropFileToUpload: 'Largue o ficheiro para carregar', dropFileToUpload: 'Largue o ficheiro para carregar',
dueDate_title: 'Data de vencimento', dueDate_title: 'Data de vencimento',
dynamicAndUnevenlySpacedLayout: 'Layout dinâmico e espaçamento irregular.', dynamicAndUnevenlySpacedLayout: 'Layout dinâmico e espaçamento irregular.',
+1
View File
@@ -171,6 +171,7 @@ export default {
deletedUser_title: 'Utilizator șters', deletedUser_title: 'Utilizator șters',
description: 'Descriere', description: 'Descriere',
display: 'Afișare', display: 'Afișare',
displayCardAges: 'Afișează vârsta cardurilor',
dropFileToUpload: 'Aruncă fișierul pentru a încărca', dropFileToUpload: 'Aruncă fișierul pentru a încărca',
dueDate_title: 'Data scadentă', dueDate_title: 'Data scadentă',
dynamicAndUnevenlySpacedLayout: 'Aspect dinamic și spațiat neuniform.', dynamicAndUnevenlySpacedLayout: 'Aspect dinamic și spațiat neuniform.',
+1
View File
@@ -174,6 +174,7 @@ export default {
deletedUser_title: 'Удалённый пользователь', deletedUser_title: 'Удалённый пользователь',
description: 'Описание', description: 'Описание',
display: 'Отображение', display: 'Отображение',
displayCardAges: 'Отображать возраст карточек',
dropFileToUpload: 'Перетяните файл, чтобы загрузить', dropFileToUpload: 'Перетяните файл, чтобы загрузить',
dueDate_title: 'Срок исполнения', dueDate_title: 'Срок исполнения',
dynamicAndUnevenlySpacedLayout: 'Динамичное и неравномерно распределённое расположение.', dynamicAndUnevenlySpacedLayout: 'Динамичное и неравномерно распределённое расположение.',
+1
View File
@@ -168,6 +168,7 @@ export default {
deletedUser_title: 'Zmazaný používateľ', deletedUser_title: 'Zmazaný používateľ',
description: 'Popis', description: 'Popis',
display: 'Zobraziť', display: 'Zobraziť',
displayCardAges: 'Zobraziť vek kariet',
dropFileToUpload: 'Potiahnutím nahraj súbor', dropFileToUpload: 'Potiahnutím nahraj súbor',
dueDate_title: 'Termín do', dueDate_title: 'Termín do',
dynamicAndUnevenlySpacedLayout: 'Dynamické a nerovnomerne rozložené usporiadanie.', dynamicAndUnevenlySpacedLayout: 'Dynamické a nerovnomerne rozložené usporiadanie.',
+1
View File
@@ -171,6 +171,7 @@ export default {
deletedUser_title: 'Обрисан корисник', deletedUser_title: 'Обрисан корисник',
description: 'Опис', description: 'Опис',
display: 'Приказ', display: 'Приказ',
displayCardAges: 'Прикажи старост картица',
dropFileToUpload: 'Превуци датотеку за слање', dropFileToUpload: 'Превуци датотеку за слање',
dueDate_title: 'Рок', dueDate_title: 'Рок',
dynamicAndUnevenlySpacedLayout: 'Динамички и неравномерно распоређен изглед.', dynamicAndUnevenlySpacedLayout: 'Динамички и неравномерно распоређен изглед.',
+1
View File
@@ -172,6 +172,7 @@ export default {
deletedUser_title: 'Obrisan korisnik', deletedUser_title: 'Obrisan korisnik',
description: 'Opis', description: 'Opis',
display: 'Prikaz', display: 'Prikaz',
displayCardAges: 'Prikaži starost kartica',
dropFileToUpload: 'Prevuci datoteku za slanje', dropFileToUpload: 'Prevuci datoteku za slanje',
dueDate_title: 'Rok', dueDate_title: 'Rok',
dynamicAndUnevenlySpacedLayout: 'Dinamički i neravnomerno raspoređen izgled.', dynamicAndUnevenlySpacedLayout: 'Dinamički i neravnomerno raspoređen izgled.',
+1
View File
@@ -178,6 +178,7 @@ export default {
deletedUser_title: 'Borttagen användare', deletedUser_title: 'Borttagen användare',
description: 'Beskrivning', description: 'Beskrivning',
display: 'Visa', display: 'Visa',
displayCardAges: 'Visa kortålder',
dropFileToUpload: 'Släpp en fil för att ladda upp', dropFileToUpload: 'Släpp en fil för att ladda upp',
dueDate_title: 'Förfallodatum', dueDate_title: 'Förfallodatum',
dynamicAndUnevenlySpacedLayout: 'Dynamisk och ojämnt fördelad layout.', dynamicAndUnevenlySpacedLayout: 'Dynamisk och ojämnt fördelad layout.',
+1
View File
@@ -174,6 +174,7 @@ export default {
deletedUser_title: 'Silinmiş kullanıcı', deletedUser_title: 'Silinmiş kullanıcı',
description: 'açıklama', description: 'açıklama',
display: 'Görüntüle', display: 'Görüntüle',
displayCardAges: 'Kart yaşlarını göster',
dropFileToUpload: 'Yüklenecek dosyayı buraya bırakın', dropFileToUpload: 'Yüklenecek dosyayı buraya bırakın',
dueDate_title: 'Termin tarihi', dueDate_title: 'Termin tarihi',
dynamicAndUnevenlySpacedLayout: 'Dinamik ve düzensiz aralıklı düzen.', dynamicAndUnevenlySpacedLayout: 'Dinamik ve düzensiz aralıklı düzen.',
+1
View File
@@ -173,6 +173,7 @@ export default {
deletedUser_title: 'Видалений користувач', deletedUser_title: 'Видалений користувач',
description: 'Опис', description: 'Опис',
display: 'Дисплей', display: 'Дисплей',
displayCardAges: 'Відображати вік карток',
dropFileToUpload: 'Перетягніть файл для завантаження', dropFileToUpload: 'Перетягніть файл для завантаження',
dueDate_title: 'Крайній термін', dueDate_title: 'Крайній термін',
dynamicAndUnevenlySpacedLayout: 'Динамічна та нерівномірна верстка.', dynamicAndUnevenlySpacedLayout: 'Динамічна та нерівномірна верстка.',
+1
View File
@@ -169,6 +169,7 @@ export default {
deletedUser_title: "O'chirilgan foydalanuvchi", deletedUser_title: "O'chirilgan foydalanuvchi",
description: 'Tavsif', description: 'Tavsif',
display: "Ko'rsatish", display: "Ko'rsatish",
displayCardAges: "Kartalar yoshini ko'rsatish",
dropFileToUpload: 'Faylni yuklash uchun qoldiring', dropFileToUpload: 'Faylni yuklash uchun qoldiring',
dueDate_title: 'Muddati', dueDate_title: 'Muddati',
dynamicAndUnevenlySpacedLayout: 'Dinamik va notekis joylashtirilgan tartib.', dynamicAndUnevenlySpacedLayout: 'Dinamik va notekis joylashtirilgan tartib.',
+1
View File
@@ -173,6 +173,7 @@ export default {
deletedUser_title: 'Người dùng đã bị xóa', deletedUser_title: 'Người dùng đã bị xóa',
description: 'Mô tả', description: 'Mô tả',
display: 'Hiển thị', display: 'Hiển thị',
displayCardAges: 'Hiển thị tuổi thẻ',
dropFileToUpload: 'Thả tệp vào đây để tải lên', dropFileToUpload: 'Thả tệp vào đây để tải lên',
dueDate_title: 'Hạn chót', dueDate_title: 'Hạn chót',
dynamicAndUnevenlySpacedLayout: 'Bố cục động và khoảng cách không đều.', dynamicAndUnevenlySpacedLayout: 'Bố cục động và khoảng cách không đều.',
+1
View File
@@ -153,6 +153,7 @@ export default {
deletedUser_title: '已删除用户', deletedUser_title: '已删除用户',
description: '描述', description: '描述',
display: '显示', display: '显示',
displayCardAges: '显示卡片创建时间',
dropFileToUpload: '拖放文件以上传', dropFileToUpload: '拖放文件以上传',
dueDate_title: '截止日期', dueDate_title: '截止日期',
dynamicAndUnevenlySpacedLayout: '动态非均匀间隔布局。', dynamicAndUnevenlySpacedLayout: '动态非均匀间隔布局。',
+1
View File
@@ -153,6 +153,7 @@ export default {
deletedUser_title: '已刪除的使用者', deletedUser_title: '已刪除的使用者',
description: '描述', description: '描述',
display: '顯示', display: '顯示',
displayCardAges: '顯示卡片建立時間',
dropFileToUpload: '拖放文件以上傳', dropFileToUpload: '拖放文件以上傳',
dueDate_title: '截止日期', dueDate_title: '截止日期',
dynamicAndUnevenlySpacedLayout: '動態不均勻間距佈局。', dynamicAndUnevenlySpacedLayout: '動態不均勻間距佈局。',
+1
View File
@@ -31,6 +31,7 @@ export default class extends BaseModel {
defaultCardType: attr(), defaultCardType: attr(),
limitCardTypesToDefaultOne: attr(), limitCardTypesToDefaultOne: attr(),
alwaysDisplayCardCreator: attr(), alwaysDisplayCardCreator: attr(),
displayCardAges: attr(),
expandTaskListsByDefault: attr(), expandTaskListsByDefault: attr(),
context: attr(), context: attr(),
view: attr(), view: attr(),
+9
View File
@@ -55,6 +55,10 @@
* type: boolean * type: boolean
* description: Whether to always display card creators * description: Whether to always display card creators
* example: false * example: false
* displayCardAges:
* type: boolean
* description: Whether to display card ages
* example: false
* expandTaskListsByDefault: * expandTaskListsByDefault:
* type: boolean * type: boolean
* description: Whether to expand task lists by default * description: Whether to expand task lists by default
@@ -120,6 +124,9 @@ module.exports = {
alwaysDisplayCardCreator: { alwaysDisplayCardCreator: {
type: 'boolean', type: 'boolean',
}, },
displayCardAges: {
type: 'boolean',
},
expandTaskListsByDefault: { expandTaskListsByDefault: {
type: 'boolean', type: 'boolean',
}, },
@@ -160,6 +167,7 @@ module.exports = {
'defaultCardType', 'defaultCardType',
'limitCardTypesToDefaultOne', 'limitCardTypesToDefaultOne',
'alwaysDisplayCardCreator', 'alwaysDisplayCardCreator',
'displayCardAges',
'expandTaskListsByDefault', 'expandTaskListsByDefault',
); );
} }
@@ -178,6 +186,7 @@ module.exports = {
'defaultCardType', 'defaultCardType',
'limitCardTypesToDefaultOne', 'limitCardTypesToDefaultOne',
'alwaysDisplayCardCreator', 'alwaysDisplayCardCreator',
'displayCardAges',
'expandTaskListsByDefault', 'expandTaskListsByDefault',
'isSubscribed', 'isSubscribed',
]); ]);
+11
View File
@@ -25,6 +25,7 @@
* - defaultCardType * - defaultCardType
* - limitCardTypesToDefaultOne * - limitCardTypesToDefaultOne
* - alwaysDisplayCardCreator * - alwaysDisplayCardCreator
* - displayCardAges
* - expandTaskListsByDefault * - expandTaskListsByDefault
* - createdAt * - createdAt
* - updatedAt * - updatedAt
@@ -67,6 +68,11 @@
* default: false * default: false
* description: Whether to always display the card creator * description: Whether to always display the card creator
* example: false * example: false
* displayCardAges:
* type: boolean
* default: false
* description: Whether to display card ages
* example: false
* expandTaskListsByDefault: * expandTaskListsByDefault:
* type: boolean * type: boolean
* default: false * default: false
@@ -137,6 +143,11 @@ module.exports = {
defaultsTo: false, defaultsTo: false,
columnName: 'always_display_card_creator', columnName: 'always_display_card_creator',
}, },
displayCardAges: {
type: 'boolean',
defaultsTo: false,
columnName: 'display_card_ages',
},
expandTaskListsByDefault: { expandTaskListsByDefault: {
type: 'boolean', type: 'boolean',
defaultsTo: false, defaultsTo: false,
@@ -0,0 +1,19 @@
/*!
* Copyright (c) 2024 PLANKA Software GmbH
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
*/
module.exports.up = async (knex) => {
await knex.schema.alterTable('board', (table) => {
table.boolean('display_card_ages').notNullable().defaultTo(false);
});
return knex.schema.alterTable('board', (table) => {
table.boolean('display_card_ages').notNullable().alter();
});
};
module.exports.down = (knex) =>
knex.schema.alterTable('board', (table) => {
table.dropColumn('display_card_ages');
});