diff --git a/frontend/src/lib/layout/DashboardCustomizationSidebar.svelte b/frontend/src/lib/layout/DashboardCustomizationSidebar.svelte
index ff7095c5a..331d573e6 100644
--- a/frontend/src/lib/layout/DashboardCustomizationSidebar.svelte
+++ b/frontend/src/lib/layout/DashboardCustomizationSidebar.svelte
@@ -11,6 +11,7 @@
Briefcase,
Grip,
ListChecks,
+ PenLine,
Search,
} from '@lucide/svelte';
import {
@@ -34,6 +35,7 @@
Briefcase,
Grip,
ListChecks,
+ PenLine,
Search,
};
diff --git a/frontend/src/lib/locales/ar/dashboard.js b/frontend/src/lib/locales/ar/dashboard.js
index c0be31775..934e7f55c 100644
--- a/frontend/src/lib/locales/ar/dashboard.js
+++ b/frontend/src/lib/locales/ar/dashboard.js
@@ -43,6 +43,10 @@ export default {
name: 'مسند إليّ',
description: 'العناصر المفتوحة المسندة إليك في جميع مساحات العمل',
},
+ createdByMe: {
+ name: 'أنشأتها',
+ description: 'العناصر المفتوحة التي أنشأتها في جميع مساحات العمل',
+ },
watchedItems: {
name: 'العناصر المراقبة',
description: 'العناصر التي تتابعها',
@@ -106,6 +110,8 @@ export default {
states: {
assignedLoadError: 'تعذر تحميل العناصر المسندة إليك',
assignedEmpty: 'لا يوجد شيء مسند إليك حالياً',
+ createdLoadError: 'تعذر تحميل العناصر التي أنشأتها',
+ createdEmpty: 'لم تنشئ أي عناصر مفتوحة',
personalTasksLoadError: 'تعذر تحميل مهامك الشخصية',
personalTasksEmpty: 'قائمة مهامك الشخصية فارغة',
supportMetricsLoadError: 'تعذر تحميل مقاييس الدعم',
diff --git a/frontend/src/lib/locales/de/dashboard.js b/frontend/src/lib/locales/de/dashboard.js
index 8ecd5e56f..cadbf2321 100644
--- a/frontend/src/lib/locales/de/dashboard.js
+++ b/frontend/src/lib/locales/de/dashboard.js
@@ -43,6 +43,10 @@ export default {
name: 'Mir zugewiesen',
description: 'Ihnen zugewiesene offene Einträge aus allen Arbeitsbereichen',
},
+ createdByMe: {
+ name: 'Von mir erstellt',
+ description: 'Von Ihnen erstellte offene Einträge aus allen Arbeitsbereichen',
+ },
watchedItems: {
name: 'Beobachtete Einträge',
description: 'Einträge, denen Sie folgen',
@@ -106,6 +110,8 @@ export default {
states: {
assignedLoadError: 'Die Ihnen zugewiesenen Einträge konnten nicht geladen werden',
assignedEmpty: 'Ihnen ist derzeit nichts zugewiesen',
+ createdLoadError: 'Die von Ihnen erstellten Einträge konnten nicht geladen werden',
+ createdEmpty: 'Sie haben keine offenen Einträge erstellt',
personalTasksLoadError: 'Ihre persönlichen Aufgaben konnten nicht geladen werden',
personalTasksEmpty: 'Ihre persönliche Aufgabenliste ist leer',
supportMetricsLoadError: 'Support-Kennzahlen konnten nicht geladen werden',
diff --git a/frontend/src/lib/locales/en/dashboard.js b/frontend/src/lib/locales/en/dashboard.js
index ad60ed73c..88da06329 100644
--- a/frontend/src/lib/locales/en/dashboard.js
+++ b/frontend/src/lib/locales/en/dashboard.js
@@ -43,6 +43,10 @@ export default {
name: 'Assigned to Me',
description: 'Open items assigned to you across all workspaces',
},
+ createdByMe: {
+ name: 'Created by Me',
+ description: 'Open items you created across all workspaces',
+ },
watchedItems: {
name: 'Watched Items',
description: 'Items you are following',
@@ -106,6 +110,8 @@ export default {
states: {
assignedLoadError: "Couldn't load your assigned items",
assignedEmpty: 'Nothing assigned to you right now',
+ createdLoadError: "Couldn't load the items you created",
+ createdEmpty: "You haven't created any open items",
storyPointsLoadError: "Couldn't load the story points summary",
storyPointsEmpty: 'No open story points assigned yet',
personalTasksLoadError: "Couldn't load your personal tasks",
diff --git a/frontend/src/lib/locales/es/dashboard.js b/frontend/src/lib/locales/es/dashboard.js
index 43ce24e4a..7464022c9 100644
--- a/frontend/src/lib/locales/es/dashboard.js
+++ b/frontend/src/lib/locales/es/dashboard.js
@@ -43,6 +43,10 @@ export default {
name: 'Asignados a mí',
description: 'Elementos abiertos que tienes asignados en todos los espacios de trabajo',
},
+ createdByMe: {
+ name: 'Creados por mí',
+ description: 'Elementos abiertos que creaste en todos los espacios de trabajo',
+ },
watchedItems: {
name: 'Elementos observados',
description: 'Elementos que sigues',
@@ -106,6 +110,8 @@ export default {
states: {
assignedLoadError: 'No se pudieron cargar los elementos que tienes asignados',
assignedEmpty: 'No tienes nada asignado en este momento',
+ createdLoadError: 'No se pudieron cargar los elementos que creaste',
+ createdEmpty: 'No has creado ningún elemento abierto',
personalTasksLoadError: 'No se pudieron cargar tus tareas personales',
personalTasksEmpty: 'Tu lista personal de tareas está vacía',
supportMetricsLoadError: 'No se pudieron cargar las métricas de soporte',
diff --git a/frontend/src/lib/locales/fr/dashboard.js b/frontend/src/lib/locales/fr/dashboard.js
index 2da30b796..123263657 100644
--- a/frontend/src/lib/locales/fr/dashboard.js
+++ b/frontend/src/lib/locales/fr/dashboard.js
@@ -43,6 +43,10 @@ export default {
name: 'Mes éléments attribués',
description: 'Éléments ouverts qui vous sont attribués dans tous les espaces de travail',
},
+ createdByMe: {
+ name: 'Créés par moi',
+ description: 'Éléments ouverts que vous avez créés dans tous les espaces de travail',
+ },
watchedItems: {
name: 'Éléments suivis',
description: 'Éléments que vous suivez',
@@ -106,6 +110,8 @@ export default {
states: {
assignedLoadError: 'Impossible de charger les éléments qui vous sont attribués',
assignedEmpty: 'Rien ne vous est attribué pour le moment',
+ createdLoadError: 'Impossible de charger les éléments que vous avez créés',
+ createdEmpty: "Vous n'avez créé aucun élément ouvert",
personalTasksLoadError: 'Impossible de charger vos tâches personnelles',
personalTasksEmpty: 'Votre liste de tâches personnelles est vide',
supportMetricsLoadError: 'Impossible de charger les métriques d’assistance',
diff --git a/frontend/src/lib/locales/ko/dashboard.js b/frontend/src/lib/locales/ko/dashboard.js
index 36115f530..641e9dec6 100644
--- a/frontend/src/lib/locales/ko/dashboard.js
+++ b/frontend/src/lib/locales/ko/dashboard.js
@@ -44,6 +44,10 @@ export default {
"name": "내 담당 작업",
"description": "전체 워크스페이스에서 나에게 배정된 미완료 작업"
},
+ "createdByMe": {
+ "name": "내가 만든 작업",
+ "description": "전체 워크스페이스에서 내가 만든 미완료 작업"
+ },
"watchedItems": {
"name": "관찰 중인 작업",
"description": "내가 지켜보는 작업"
@@ -107,6 +111,8 @@ export default {
"states": {
"assignedLoadError": "내 담당 작업을 불러오지 못했습니다",
"assignedEmpty": "현재 나에게 배정된 작업이 없습니다",
+ "createdLoadError": "내가 만든 작업을 불러오지 못했습니다",
+ "createdEmpty": "내가 만든 미완료 작업이 없습니다",
"storyPointsLoadError": "스토리 포인트 요약을 불러오지 못했습니다",
"storyPointsEmpty": "아직 배정된 미완료 스토리 포인트가 없습니다",
"personalTasksLoadError": "개인 작업을 불러오지 못했습니다",
diff --git a/frontend/src/lib/locales/pt-BR/dashboard.js b/frontend/src/lib/locales/pt-BR/dashboard.js
index 30a14f6e2..0c7a32a62 100644
--- a/frontend/src/lib/locales/pt-BR/dashboard.js
+++ b/frontend/src/lib/locales/pt-BR/dashboard.js
@@ -43,6 +43,10 @@ export default {
name: 'Atribuídos a mim',
description: 'Itens abertos atribuídos a você em todos os espaços de trabalho',
},
+ createdByMe: {
+ name: 'Criados por mim',
+ description: 'Itens abertos criados por você em todos os espaços de trabalho',
+ },
watchedItems: {
name: 'Itens observados',
description: 'Itens que você acompanha',
@@ -106,6 +110,8 @@ export default {
states: {
assignedLoadError: 'Não foi possível carregar os itens atribuídos a você',
assignedEmpty: 'Nada foi atribuído a você no momento',
+ createdLoadError: 'Não foi possível carregar os itens criados por você',
+ createdEmpty: 'Você não criou nenhum item em aberto',
personalTasksLoadError: 'Não foi possível carregar suas tarefas pessoais',
personalTasksEmpty: 'Sua lista pessoal de tarefas está vazia',
supportMetricsLoadError: 'Não foi possível carregar as métricas de suporte',
diff --git a/frontend/src/lib/locales/ru/dashboard.js b/frontend/src/lib/locales/ru/dashboard.js
index b82fb5c7f..34629b303 100644
--- a/frontend/src/lib/locales/ru/dashboard.js
+++ b/frontend/src/lib/locales/ru/dashboard.js
@@ -43,6 +43,10 @@ export default {
name: 'Назначено мне',
description: 'Открытые элементы, назначенные вам во всех рабочих пространствах',
},
+ createdByMe: {
+ name: 'Созданные мной',
+ description: 'Открытые элементы, созданные вами, во всех рабочих пространствах',
+ },
watchedItems: {
name: 'Отслеживаемые элементы',
description: 'Элементы, за которыми вы следите',
@@ -106,6 +110,8 @@ export default {
states: {
assignedLoadError: 'Не удалось загрузить назначенные вам элементы',
assignedEmpty: 'Сейчас вам ничего не назначено',
+ createdLoadError: 'Не удалось загрузить созданные вами элементы',
+ createdEmpty: 'У вас нет открытых элементов, созданных вами',
storyPointsLoadError: 'Не удалось загрузить сводку стори-поинтов',
storyPointsEmpty: 'Открытых стори-поинтов пока не назначено',
personalTasksLoadError: 'Не удалось загрузить личные задачи',
diff --git a/frontend/src/lib/locales/zh-CN/dashboard.js b/frontend/src/lib/locales/zh-CN/dashboard.js
index 154eb297c..1d5c947cb 100644
--- a/frontend/src/lib/locales/zh-CN/dashboard.js
+++ b/frontend/src/lib/locales/zh-CN/dashboard.js
@@ -43,6 +43,10 @@ export default {
name: '分配给我的',
description: '所有工作区中分配给你的未完成事项',
},
+ createdByMe: {
+ name: '我创建的',
+ description: '所有工作区中你创建的未完成事项',
+ },
watchedItems: {
name: '关注的事项',
description: '你正在关注的事项',
@@ -106,6 +110,8 @@ export default {
states: {
assignedLoadError: '无法加载分配给你的事项',
assignedEmpty: '目前没有分配给你的事项',
+ createdLoadError: '无法加载你创建的事项',
+ createdEmpty: '你没有创建任何未完成的事项',
personalTasksLoadError: '无法加载你的个人任务',
personalTasksEmpty: '你的个人待办列表为空',
supportMetricsLoadError: '无法加载支持指标',
diff --git a/frontend/src/lib/pages/Homepage.svelte b/frontend/src/lib/pages/Homepage.svelte
index ca13d96b7..808e5944e 100644
--- a/frontend/src/lib/pages/Homepage.svelte
+++ b/frontend/src/lib/pages/Homepage.svelte
@@ -38,6 +38,7 @@
import WatchedItemsWidget from '../widgets/dashboard/WatchedItemsWidget.svelte';
import RecentWorkspacesWidget from '../widgets/dashboard/RecentWorkspacesWidget.svelte';
import AssignedToMeWidget from '../widgets/dashboard/AssignedToMeWidget.svelte';
+ import CreatedByMeWidget from '../widgets/dashboard/CreatedByMeWidget.svelte';
import PersonalTasksWidget from '../widgets/dashboard/PersonalTasksWidget.svelte';
import SupportOverviewWidget from '../widgets/SupportOverviewWidget.svelte';
import SavedSearchWidget from '../widgets/dashboard/SavedSearchWidget.svelte';
@@ -524,6 +525,8 @@
{:else if widget.type === 'assigned-to-me'}
+ {:else if widget.type === 'created-by-me'}
+
{:else if widget.type === 'personal-tasks'}
{:else if widget.type === 'support-overview'}
diff --git a/frontend/src/lib/services/dashboardWidgetRegistry.js b/frontend/src/lib/services/dashboardWidgetRegistry.js
index 6785d148b..cbbc08ace 100644
--- a/frontend/src/lib/services/dashboardWidgetRegistry.js
+++ b/frontend/src/lib/services/dashboardWidgetRegistry.js
@@ -69,6 +69,15 @@ export const dashboardWidgetRegistry = [
defaultWidth: 6,
minWidth: 3,
},
+ {
+ type: 'created-by-me',
+ nameKey: 'dashboard.widgetCatalog.createdByMe.name',
+ descriptionKey: 'dashboard.widgetCatalog.createdByMe.description',
+ category: dashboardWidgetCategories.WORK,
+ icon: 'PenLine',
+ defaultWidth: 6,
+ minWidth: 3,
+ },
{
type: 'watched-items',
nameKey: 'dashboard.widgetCatalog.watchedItems.name',
@@ -201,7 +210,11 @@ export function buildDefaultDashboardLayout() {
'default-your-activity',
'default-whats-new',
]),
- section('default-work', 1, ['default-personal-tasks', 'default-assigned-to-me']),
+ section('default-work', 1, [
+ 'default-personal-tasks',
+ 'default-assigned-to-me',
+ 'default-created-by-me',
+ ]),
section('default-workspaces', 2, ['default-recent-workspaces', 'default-quick-access']),
];
@@ -220,6 +233,7 @@ export function buildDefaultDashboardLayout() {
widget('default-whats-new', 'whats-new', 'default-your-day', 2),
widget('default-personal-tasks', 'personal-tasks', 'default-work', 0, 6),
widget('default-assigned-to-me', 'assigned-to-me', 'default-work', 1, 6),
+ widget('default-created-by-me', 'created-by-me', 'default-work', 2, 6),
widget('default-recent-workspaces', 'recent-workspaces', 'default-workspaces', 0),
widget('default-quick-access', 'quick-access', 'default-workspaces', 1),
];
diff --git a/frontend/src/lib/widgets/dashboard/CreatedByMeWidget.svelte b/frontend/src/lib/widgets/dashboard/CreatedByMeWidget.svelte
new file mode 100644
index 000000000..832942732
--- /dev/null
+++ b/frontend/src/lib/widgets/dashboard/CreatedByMeWidget.svelte
@@ -0,0 +1,72 @@
+
+
+
diff --git a/frontend/src/lib/widgets/dashboard/taskWidgetState.js b/frontend/src/lib/widgets/dashboard/taskWidgetState.js
index c7f265303..8a9b47813 100644
--- a/frontend/src/lib/widgets/dashboard/taskWidgetState.js
+++ b/frontend/src/lib/widgets/dashboard/taskWidgetState.js
@@ -10,7 +10,12 @@ export const DEFAULT_DONE_RANGE_DAYS = 7;
/**
* Widget types that support the row-count / density controls.
*/
-export const ROW_COUNT_WIDGETS = new Set(['assigned-to-me', 'personal-tasks', 'saved-search']);
+export const ROW_COUNT_WIDGETS = new Set([
+ 'assigned-to-me',
+ 'created-by-me',
+ 'personal-tasks',
+ 'saved-search',
+]);
/**
* Row count options offered in the widget menu.
@@ -95,6 +100,20 @@ export function assignedToMeQuery(userId, limit = 30) {
};
}
+/**
+ * Query params for "items I created and not yet completed", newest first.
+ * Counterpart to assignedToMeQuery for the created-by-me widget.
+ * @param {number|string} userId
+ * @param {number} [limit]
+ */
+export function createdByMeQuery(userId, limit = 30) {
+ return {
+ ql: `creator_id = ${userId} AND status_completed = false`,
+ limit,
+ order_by: 'updated_at',
+ };
+}
+
/**
* @param {unknown} response
* @param {number | 'all'} [maxItems]
diff --git a/internal/handlers/user_dashboard_layout.go b/internal/handlers/user_dashboard_layout.go
index f22a37004..fe43ff2a9 100644
--- a/internal/handlers/user_dashboard_layout.go
+++ b/internal/handlers/user_dashboard_layout.go
@@ -47,6 +47,7 @@ var validDashboardWidgetTypes = map[string]bool{
"watched-items": true,
"recent-workspaces": true,
"assigned-to-me": true,
+ "created-by-me": true,
"personal-tasks": true,
"saved-search": true,
"support-overview": true,