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 @@
+ List of commits 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, }); }