diff --git a/.cspell.json b/.cspell.json
index c16829d..663d592 100644
--- a/.cspell.json
+++ b/.cspell.json
@@ -15,6 +15,7 @@
"words": [
"azat",
"browserslistrc",
+ "chartjs",
"chrono",
"combak",
"dicebear",
@@ -27,6 +28,7 @@
"hexdigit",
"lightningcss",
"mockall",
+ "registerables",
"replacen",
"ropey",
"serde",
diff --git a/package.json b/package.json
index 1cba6c9..0a758a1 100644
--- a/package.json
+++ b/package.json
@@ -45,6 +45,7 @@
"@typescript-eslint/parser": "^8.9.0",
"browserslist": "^4.24.0",
"changelogen": "^0.5.7",
+ "chart.js": "^4.4.5",
"clean-publish": "^5.0.0",
"cspell": "^8.15.2",
"date-fns": "^4.1.0",
@@ -72,6 +73,7 @@
"stylelint-order": "^6.0.4",
"stylelint-plugin-logical-css": "^1.2.1",
"svelte": "5.0.0-next.264",
+ "svelte-chartjs": "^3.1.5",
"svelte-check": "^4.0.5",
"svelte-eslint-parser": "^0.41.1",
"svelte-preprocess": "^6.0.3",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8ce37c2..57e512e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -56,6 +56,9 @@ importers:
changelogen:
specifier: ^0.5.7
version: 0.5.7(magicast@0.3.5)
+ chart.js:
+ specifier: ^4.4.5
+ version: 4.4.5
clean-publish:
specifier: ^5.0.0
version: 5.0.0
@@ -137,6 +140,9 @@ importers:
svelte:
specifier: 5.0.0-next.264
version: 5.0.0-next.264
+ svelte-chartjs:
+ specifier: ^3.1.5
+ version: 3.1.5(chart.js@4.4.5)(svelte@5.0.0-next.264)
svelte-check:
specifier: ^4.0.5
version: 4.0.5(picomatch@4.0.2)(svelte@5.0.0-next.264)(typescript@5.6.3)
@@ -1510,6 +1516,9 @@ packages:
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+ '@kurkle/color@0.3.2':
+ resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==}
+
'@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
@@ -2019,6 +2028,10 @@ packages:
resolution: {integrity: sha512-cTZXBcJMl3pudE40WENOakXkcVtrbBpbkmSkM20NdRiUqa4+VYRdXdEsgQ0BNQ6JBE2YymTNWtPKVF7UCTN5+g==}
hasBin: true
+ chart.js@4.4.5:
+ resolution: {integrity: sha512-CVVjg1RYTJV9OCC8WeJPMx8gsV8K6WIyIEQUE3ui4AR9Hfgls9URri6Ja3hyMVBbTF8Q2KFa19PE815gWcWhng==}
+ engines: {pnpm: '>=8'}
+
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
@@ -4069,6 +4082,12 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
+ svelte-chartjs@3.1.5:
+ resolution: {integrity: sha512-ka2zh7v5FiwfAX1oMflZ0HkNkgjHjFqANgRyC+vNYXfxtx2ku68Zo+2KgbKeBH2nS1ThDqkIACPzGxy4T0UaoA==}
+ peerDependencies:
+ chart.js: ^3.5.0 || ^4.0.0
+ svelte: ^4.0.0
+
svelte-check@4.0.5:
resolution: {integrity: sha512-icBTBZ3ibBaywbXUat3cK6hB5Du+Kq9Z8CRuyLmm64XIe2/r+lQcbuBx/IQgsbrC+kT2jQ0weVpZSSRIPwB6jQ==}
engines: {node: '>= 18.0.0'}
@@ -5868,6 +5887,8 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
+ '@kurkle/color@0.3.2': {}
+
'@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
dependencies:
eslint-scope: 5.1.1
@@ -6451,6 +6472,10 @@ snapshots:
transitivePeerDependencies:
- magicast
+ chart.js@4.4.5:
+ dependencies:
+ '@kurkle/color': 0.3.2
+
chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
@@ -8755,6 +8780,11 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
+ svelte-chartjs@3.1.5(chart.js@4.4.5)(svelte@5.0.0-next.264):
+ dependencies:
+ chart.js: 4.4.5
+ svelte: 5.0.0-next.264
+
svelte-check@4.0.5(picomatch@4.0.2)(svelte@5.0.0-next.264)(typescript@5.6.3):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
diff --git a/preview/blocks/header.svelte b/preview/blocks/header.svelte
index 09b7cc5..e2599d3 100644
--- a/preview/blocks/header.svelte
+++ b/preview/blocks/header.svelte
@@ -42,7 +42,7 @@
diff --git a/preview/blocks/list.svelte b/preview/blocks/list.svelte
index 5d94a79..9cf4115 100644
--- a/preview/blocks/list.svelte
+++ b/preview/blocks/list.svelte
@@ -4,6 +4,7 @@
import { renderComponent } from '@tanstack/svelte-table'
import TableComment from '~/elements/table-comment.svelte'
+ import Typography from '~/elements/typography.svelte'
import TableCode from '~/elements/table-code.svelte'
import TableUser from '~/elements/table-user.svelte'
import TablePath from '~/elements/table-path.svelte'
@@ -89,6 +90,7 @@
diff --git a/preview/elements/chart-doughnut.svelte b/preview/elements/chart-doughnut.svelte
new file mode 100644
index 0000000..92f3c15
--- /dev/null
+++ b/preview/elements/chart-doughnut.svelte
@@ -0,0 +1,44 @@
+
+
+
diff --git a/preview/elements/chart.svelte b/preview/elements/chart.svelte
new file mode 100644
index 0000000..d470376
--- /dev/null
+++ b/preview/elements/chart.svelte
@@ -0,0 +1,52 @@
+
+
+
diff --git a/preview/mock/api.mock.ts b/preview/mock/api.mock.ts
index 019f37b..bfc2430 100644
--- a/preview/mock/api.mock.ts
+++ b/preview/mock/api.mock.ts
@@ -15,6 +15,7 @@ export default defineMock({
},
comment: 'TODO: Add integration with external lab result APIs',
path: 'src/modules/labResults/labResults.ts',
+ kind: 'TODO',
line: 45,
},
{
@@ -28,6 +29,7 @@ export default defineMock({
comment:
'TODO: Add test coverage for edge cases in prescription reminders',
path: 'src/services/reminders/prescriptionReminders.ts',
+ kind: 'TODO',
line: 59,
},
{
@@ -40,6 +42,7 @@ export default defineMock({
},
path: 'src/modules/patientData/exportPatientData.ts',
comment: 'TODO: Implement secure PDF export',
+ kind: 'TODO',
line: 67,
},
{
@@ -52,6 +55,7 @@ export default defineMock({
},
comment: 'TODO: Implement backup codes for 2FA',
path: 'src/modules/auth/twoFactorAuth.ts',
+ kind: 'TODO',
line: 65,
},
{
@@ -64,6 +68,7 @@ export default defineMock({
},
comment: 'TODO: Refactor appointment notifications to support SMS',
path: 'src/services/appointments/bookingFlow.ts',
+ kind: 'TODO',
line: 47,
},
{
@@ -76,6 +81,7 @@ export default defineMock({
},
comment: 'TODO: Update payment methods to include Apple Pay',
path: 'src/services/billing/billingSystem.ts',
+ kind: 'TODO',
line: 89,
},
{
@@ -88,6 +94,7 @@ export default defineMock({
},
comment: 'TODO: Add priority levels for urgent notifications',
path: 'src/services/notifications/appointmentReminders.ts',
+ kind: 'TODO',
line: 49,
},
{
@@ -100,6 +107,7 @@ export default defineMock({
},
comment: 'TODO: Add screen reader support for calendar view',
path: 'src/components/appointments/calendarView.ts',
+ kind: 'TODO',
line: 39,
},
{
@@ -112,6 +120,7 @@ export default defineMock({
},
comment: 'TODO: Ensure patient history is encrypted before storage',
path: 'src/modules/patientData/patientHistory.ts',
+ kind: 'TODO',
line: 34,
},
{
@@ -124,6 +133,7 @@ export default defineMock({
},
comment: 'TODO: Add customizable metrics for patient health stats',
path: 'src/components/analytics/doctorDashboard.ts',
+ kind: 'TODO',
line: 128,
},
{
@@ -136,6 +146,7 @@ export default defineMock({
},
comment: 'TODO: Improve responsive design for mobile devices',
path: 'src/components/dashboard/patientDashboard.ts',
+ kind: 'TODO',
line: 102,
},
{
@@ -148,6 +159,7 @@ export default defineMock({
},
comment: 'TODO: Support video call recording for patient consultations',
path: 'src/modules/telemedicine/videoConsultation.ts',
+ kind: 'TODO',
line: 95,
},
{
@@ -158,8 +170,9 @@ export default defineMock({
author: 'Sarah Lee',
commit: 'b9c8d7e',
},
- comment: 'TODO: Add additional checks for drug interactions',
+ comment: 'FIXME: Add additional checks for drug interactions',
path: 'src/modules/prescriptions/validatePrescription.ts',
+ kind: 'FIXME',
line: 90,
},
{
@@ -172,6 +185,7 @@ export default defineMock({
},
comment: 'TODO: Add notification system for upcoming vaccines',
path: 'src/modules/vaccineTracking/vaccineReminder.ts',
+ kind: 'TODO',
line: 120,
},
{
@@ -184,6 +198,7 @@ export default defineMock({
},
comment: 'TODO: Implement backup codes for 2FA',
path: 'src/modules/auth/twoFactorAuth.ts',
+ kind: 'TODO',
line: 65,
},
{
@@ -197,6 +212,7 @@ export default defineMock({
comment:
'TODO: Ensure encrypted backups for sensitive patient information',
path: 'src/modules/dataBackup/dataBackup.ts',
+ kind: 'TODO',
line: 78,
},
{
@@ -207,8 +223,9 @@ export default defineMock({
author: 'Daniel Davis',
commit: 't1r2y3a',
},
- comment: 'TODO: Optimize database queries for large datasets',
+ comment: 'FIXME: Optimize database queries for large datasets',
path: 'src/services/patientHistory/patientDataLoader.ts',
+ kind: 'FIXME',
line: 155,
},
{
@@ -221,6 +238,7 @@ export default defineMock({
},
comment: 'TODO: Add support for fuzzy search in patient database',
path: 'src/services/search/patientSearch.ts',
+ kind: 'TODO',
line: 150,
},
{
@@ -231,8 +249,9 @@ export default defineMock({
author: 'Emily Smith',
commit: 'i1t2g5h',
},
- comment: 'TODO: Validate insurance details before submission',
+ comment: 'FIXME: Validate insurance details before submission',
path: 'src/services/insurance/insuranceProvider.ts',
+ kind: 'FIXME',
line: 97,
},
{
@@ -244,8 +263,9 @@ export default defineMock({
commit: 'a8f9d1k',
},
comment:
- 'TODO: Ensure encrypted backups for sensitive patient information',
+ 'DEPRECATED: Ensure encrypted backups for sensitive patient information',
path: 'src/modules/dataBackup/dataBackup.ts',
+ kind: 'DEPRECATED',
line: 78,
},
],
diff --git a/preview/styles/colors.css b/preview/styles/colors.css
index bd761ed..5d2b43e 100644
--- a/preview/styles/colors.css
+++ b/preview/styles/colors.css
@@ -11,8 +11,16 @@
--color-border-brand: oklch(48% 0.15 150);
--color-border-primary: oklch(60% 0.01 196);
+ --color-border-secondary: oklch(35% 0.01 155);
--color-overlay-brand: oklch(48% 0.15 150 / 30%);
+
+ --color-additional-primary: oklch(72% 0.15 150);
+ --color-additional-secondary: oklch(72% 0.15 180);
+ --color-additional-tertiary: oklch(72% 0.15 210);
+ --color-additional-quaternary: oklch(72% 0.15 240);
+ --color-additional-quinary: oklch(72% 0.15 270);
+ --color-additional-senary: oklch(72% 0.15 300);
}
:root[data-theme='dark'] {
@@ -28,6 +36,14 @@
--color-border-brand: oklch(78% 0.15 150);
--color-border-primary: oklch(40% 0.01 196);
+ --color-border-secondary: oklch(35% 0.01 155);
--color-overlay-brand: oklch(78% 0.15 150 / 30%);
+
+ --color-additional-primary: oklch(78% 0.15 150);
+ --color-additional-secondary: oklch(78% 0.15 180);
+ --color-additional-tertiary: oklch(78% 0.15 210);
+ --color-additional-quaternary: oklch(78% 0.15 240);
+ --color-additional-quinary: oklch(78% 0.15 270);
+ --color-additional-senary: oklch(78% 0.15 300);
}
diff --git a/preview/typings/index.d.ts b/preview/typings/index.d.ts
index 9861a38..fb3d715 100644
--- a/preview/typings/index.d.ts
+++ b/preview/typings/index.d.ts
@@ -9,6 +9,7 @@ export interface DataItem {
comment: string
line: number
path: string
+ kind: string
}
export interface Data {
diff --git a/preview/view/app.svelte b/preview/view/app.svelte
index 169da57..3a79a71 100644
--- a/preview/view/app.svelte
+++ b/preview/view/app.svelte
@@ -1,6 +1,7 @@
+
diff --git a/src/identify_todo_comment.rs b/src/identify_todo_comment.rs
index 5733ca3..167d2db 100644
--- a/src/identify_todo_comment.rs
+++ b/src/identify_todo_comment.rs
@@ -1,7 +1,11 @@
use crate::todo_keywords::TODO_KEYWORDS;
-pub fn identify_todo_comment(comment_text: &str) -> bool {
- TODO_KEYWORDS
- .iter()
- .any(|keyword| comment_text.trim().to_uppercase().starts_with(keyword))
+pub fn identify_todo_comment(comment_text: &str) -> Option {
+ let trimmed_text = comment_text.trim().to_uppercase();
+ for keyword in TODO_KEYWORDS.iter() {
+ if trimmed_text.starts_with(keyword) {
+ return Some(keyword.to_string());
+ }
+ }
+ None
}
diff --git a/src/main.rs b/src/main.rs
index fc45edb..2efd5e8 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -38,6 +38,7 @@ pub struct TodoData {
pub struct TodoWithBlame {
pub blame: PreparedBlameData,
pub comment: String,
+ pub kind: String,
pub path: String,
pub line: u32,
}
@@ -76,13 +77,18 @@ async fn main() {
let comments = get_comments(&source, &source_file_name);
comments
.into_iter()
- .filter(|comment| identify_todo_comment(&comment.text))
- .map(move |comment| TodoData {
- path: source_file_name.clone(),
- comment: comment.text.clone(),
- start: comment.start,
- end: comment.end,
- kind: format!("{:?}", comment.kind),
+ .filter_map(|comment| {
+ if let Some(comment_kind) = identify_todo_comment(&comment.text) {
+ Some(TodoData {
+ path: source_file_name.clone(),
+ comment: comment.text.clone(),
+ start: comment.start,
+ kind: comment_kind,
+ end: comment.end,
+ })
+ } else {
+ None
+ }
})
.collect::>()
}
@@ -114,6 +120,7 @@ async fn main() {
comment: todo.comment.trim().to_string(),
path: todo.path.clone(),
blame: prepared_blame,
+ kind: todo.kind,
line,
});
}