diff --git a/TODO.md b/TODO.md
index e7cf9be..09e80bd 100644
--- a/TODO.md
+++ b/TODO.md
@@ -21,7 +21,7 @@
- [x] **EditModal task couleur calendrier** - Problème de couleur en ajout de taches dans tous les icones calendriers; colmler au thème
- [x] **Weekly deux boutons actualiser** - Corriger la duplication des boutons d'actualisation
- [x] **Solarized ne doit pas être un soleil** - Corriger l'icône du thème Solarized
-- [ ] **Emoji interdit dans UI** - Vérifier et supprimer toutes les emojis dans l'interface, remplacer par lucide-react
+- [x] **Emoji interdit dans UI** - Vérifier et supprimer toutes les emojis dans l'interface, remplacer par lucide-react
- [ ] **Settings intégration : icônes** - Problème avec les icônes "Arrêté" et "Actif" : doivent etre les memes
- [ ] **Settings backup UI** - Revoir l'UI pour coller au style des intégrations
- [ ] **AlertBanner : hover et bug** - Corriger les problèmes de hover et bugs
diff --git a/package-lock.json b/package-lock.json
index 24e5566..9261b87 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,10 +11,13 @@
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
+ "@emoji-mart/data": "^1.2.1",
+ "@emoji-mart/react": "^1.1.1",
"@prisma/client": "^6.16.1",
"bcryptjs": "^3.0.2",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
+ "emoji-mart": "^5.6.0",
"emoji-regex": "^10.5.0",
"lucide-react": "^0.544.0",
"next": "15.5.3",
@@ -23,7 +26,8 @@
"react": "19.1.0",
"react-dom": "19.1.0",
"recharts": "^3.2.1",
- "tailwind-merge": "^3.3.1"
+ "tailwind-merge": "^3.3.1",
+ "twemoji": "^14.0.2"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
@@ -147,6 +151,22 @@
"tslib": "^2.4.0"
}
},
+ "node_modules/@emoji-mart/data": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.2.1.tgz",
+ "integrity": "sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==",
+ "license": "MIT"
+ },
+ "node_modules/@emoji-mart/react": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@emoji-mart/react/-/react-1.1.1.tgz",
+ "integrity": "sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==",
+ "license": "MIT",
+ "peerDependencies": {
+ "emoji-mart": "^5.2",
+ "react": "^16.8 || ^17 || ^18"
+ }
+ },
"node_modules/@esbuild/aix-ppc64": {
"version": "0.25.10",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz",
@@ -2301,7 +2321,7 @@
"version": "19.1.13",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz",
"integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"dependencies": {
"csstype": "^3.0.2"
@@ -3465,7 +3485,7 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "devOptional": true,
+ "dev": true,
"license": "MIT"
},
"node_modules/d3-array": {
@@ -3808,6 +3828,12 @@
"fast-check": "^3.23.1"
}
},
+ "node_modules/emoji-mart": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz",
+ "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==",
+ "license": "MIT"
+ },
"node_modules/emoji-regex": {
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz",
@@ -4713,6 +4739,29 @@
"node": ">=18.3.0"
}
},
+ "node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/fs-extra/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -4916,7 +4965,6 @@
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true,
"license": "ISC"
},
"node_modules/graphemer": {
@@ -5603,6 +5651,18 @@
"json5": "lib/cli.js"
}
},
+ "node_modules/jsonfile": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz",
+ "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^0.1.2"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
"node_modules/jsx-ast-utils": {
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
@@ -6858,6 +6918,7 @@
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/react-redux": {
@@ -7800,6 +7861,24 @@
"fsevents": "~2.3.3"
}
},
+ "node_modules/twemoji": {
+ "version": "14.0.2",
+ "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.2.tgz",
+ "integrity": "sha512-BzOoXIe1QVdmsUmZ54xbEH+8AgtOKUiG53zO5vVP2iUu6h5u9lN15NcuS6te4OY96qx0H7JK9vjjl9WQbkTRuA==",
+ "license": "MIT",
+ "dependencies": {
+ "fs-extra": "^8.0.1",
+ "jsonfile": "^5.0.0",
+ "twemoji-parser": "14.0.0",
+ "universalify": "^0.1.2"
+ }
+ },
+ "node_modules/twemoji-parser": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-14.0.0.tgz",
+ "integrity": "sha512-9DUOTGLOWs0pFWnh1p6NF+C3CkQ96PWmEFwhOVmT3WbecRC+68AIqpsnJXygfkFcp4aXbOp8Dwbhh/HQgvoRxA==",
+ "license": "MIT"
+ },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -7895,7 +7974,7 @@
"version": "5.9.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
"integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
- "devOptional": true,
+ "dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
@@ -7931,6 +8010,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
"node_modules/unrs-resolver": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
diff --git a/package.json b/package.json
index 0b0198b..ff19b86 100644
--- a/package.json
+++ b/package.json
@@ -25,10 +25,13 @@
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
+ "@emoji-mart/data": "^1.2.1",
+ "@emoji-mart/react": "^1.1.1",
"@prisma/client": "^6.16.1",
"bcryptjs": "^3.0.2",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
+ "emoji-mart": "^5.6.0",
"emoji-regex": "^10.5.0",
"lucide-react": "^0.544.0",
"next": "15.5.3",
@@ -37,7 +40,8 @@
"react": "19.1.0",
"react-dom": "19.1.0",
"recharts": "^3.2.1",
- "tailwind-merge": "^3.3.1"
+ "tailwind-merge": "^3.3.1",
+ "twemoji": "^14.0.2"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
diff --git a/src/app/daily/DailyPageClient.tsx b/src/app/daily/DailyPageClient.tsx
index 41a214c..919a33b 100644
--- a/src/app/daily/DailyPageClient.tsx
+++ b/src/app/daily/DailyPageClient.tsx
@@ -13,8 +13,9 @@ import { DailySection } from '@/components/daily/DailySection';
import { PendingTasksSection } from '@/components/daily/PendingTasksSection';
import { dailyClient } from '@/clients/daily-client';
import { Header } from '@/components/ui/Header';
-import { getPreviousWorkday, formatDateLong, isToday, generateDateTitle, formatDateShort, isYesterday } from '@/lib/date-utils';
+import { getPreviousWorkday, formatDateLong, isToday, generateDateTitle } from '@/lib/date-utils';
import { useGlobalKeyboardShortcuts } from '@/hooks/useGlobalKeyboardShortcuts';
+import { Emoji } from '@/components/ui/Emoji';
interface DailyPageClientProps {
initialDailyView?: DailyView;
@@ -142,15 +143,14 @@ export function DailyPageClient({
};
const getTodayTitle = () => {
- return generateDateTitle(currentDate, '🎯');
+ const { emoji, text } = generateDateTitle(currentDate, '🎯');
+ return <>
@@ -139,7 +140,7 @@ export function JiraDashboardPageClient({ initialJiraConfig, initialAnalytics }:
@@ -184,7 +185,7 @@ export function JiraDashboardPageClient({ initialJiraConfig, initialAnalytics }:
@@ -226,7 +227,7 @@ export function JiraDashboardPageClient({ initialJiraConfig, initialAnalytics }:
variant="ghost"
className="text-xs px-2 py-1 h-auto"
>
- {isExporting ? '⏳' : '📊'} CSV
+ {isExporting ?
- {stats.changePercent > 20 ? 'Excellente progression ! 🚀' :
- stats.changePercent > 0 ? 'Bonne progression 👍' :
- stats.changePercent === 0 ? 'Performance stable 📊' :
- stats.changePercent > -20 ? 'Légère baisse, restez motivé 💪' :
- 'Focus sur la productivité cette semaine 🎯'}
+ {stats.changePercent > 20 ? <>
{formatPeriod()}
{summary.narrative.weekHighlight}
{summary.narrative.mainChallenges}
{summary.narrative.nextWeekFocus}
{summary.keyAccomplishments.length} accomplissements significatifs • {summary.metrics.totalTasksCompleted} tâches • {summary.metrics.totalCheckboxesCompleted} todos complétés
@@ -220,7 +221,7 @@ export default function ManagerWeeklySummary({ initialSummary }: ManagerWeeklySu borderColor: 'color-mix(in srgb, var(--muted) 40%, var(--border))', color: 'var(--muted-foreground)' }}> -Aucun accomplissement significatif trouvé cette semaine.
Ajoutez des tâches avec priorité haute/medium ou des meetings.
{summary.upcomingChallenges.length} défis identifiés • {summary.upcomingChallenges.filter(c => c.priority === 'high').length} priorité haute • {summary.upcomingChallenges.filter(c => c.blockers.length > 0).length} avec blockers
@@ -258,7 +259,7 @@ export default function ManagerWeeklySummary({ initialSummary }: ManagerWeeklySu borderColor: 'color-mix(in srgb, var(--muted) 40%, var(--border))', color: 'var(--muted-foreground)' }}> -Aucun enjeu prioritaire trouvé.
Ajoutez des tâches non complétées avec priorité haute/medium.
- ❌ Erreur lors du chargement des métriques
+
{metricsError || trendsError}
{formatPeriod()}