From 242b1bce27ce05d6b7ed6210d2e5c10bb00f1395 Mon Sep 17 00:00:00 2001 From: ivan-pelly Date: Sat, 14 Mar 2026 18:54:28 -0700 Subject: [PATCH] Added short name to benchmarks --- api/src/Controllers/StudentController.cs | 2 +- .../DataTransferObjects/CreateBenchmarkDto.cs | 1 + .../DataTransferObjects/UpdateBenchmarkDto.cs | 1 + .../DatabaseObjects/dbStudentBenchmarkRow.cs | 1 + .../Repositories/StudentRepository.cs | 10 +- .../ResponseTypes/StudentBenchmarkItem.cs | 1 + db/Migrations/add_benchmark_short_name.sql | 94 +++++++++++++++++++ .../sp_Benchmark_GetByStudentId.sql | 1 + db/Objects/procedures/sp_Benchmark_Insert.sql | 6 +- db/Objects/procedures/sp_Benchmark_Update.sql | 4 +- db/Objects/tables/benchmark.sql | 1 + db/Objects/views/v_student_card.sql | 8 +- .../benchmark-card-full.html | 8 +- .../benchmark-card-full.ts | 26 ++++- .../progress-edit/progress-edit.html | 1 + .../progress-edit/progress-edit.scss | 0 .../progress-edit/progress-edit.spec.ts | 23 +++++ .../components/progress-edit/progress-edit.ts | 11 +++ .../src/app/desktop/pages/home/home.ts | 29 +++++- .../src/app/shared/classes/benchmark.dto.ts | 1 + .../app/shared/services/student.service.ts | 20 +++- 21 files changed, 227 insertions(+), 22 deletions(-) create mode 100644 db/Migrations/add_benchmark_short_name.sql create mode 100644 ui/winstudentgoaltracker/src/app/desktop/components/progress-edit/progress-edit.html create mode 100644 ui/winstudentgoaltracker/src/app/desktop/components/progress-edit/progress-edit.scss create mode 100644 ui/winstudentgoaltracker/src/app/desktop/components/progress-edit/progress-edit.spec.ts create mode 100644 ui/winstudentgoaltracker/src/app/desktop/components/progress-edit/progress-edit.ts diff --git a/api/src/Controllers/StudentController.cs b/api/src/Controllers/StudentController.cs index 0bfd9ca..2964d37 100644 --- a/api/src/Controllers/StudentController.cs +++ b/api/src/Controllers/StudentController.cs @@ -551,7 +551,7 @@ public class StudentController : BaseController }); } - var updated = await _studentRepository.UpdateBenchmarkAsync(idBenchmark, dto.Benchmark); + var updated = await _studentRepository.UpdateBenchmarkAsync(idBenchmark, dto); return Ok(new ResponseResult { diff --git a/api/src/DataAccess/Models/DataTransferObjects/CreateBenchmarkDto.cs b/api/src/DataAccess/Models/DataTransferObjects/CreateBenchmarkDto.cs index 236f035..8f58e00 100644 --- a/api/src/DataAccess/Models/DataTransferObjects/CreateBenchmarkDto.cs +++ b/api/src/DataAccess/Models/DataTransferObjects/CreateBenchmarkDto.cs @@ -4,4 +4,5 @@ public class CreateBenchmarkDto { public Guid GoalId { get; set; } public string Benchmark { get; set; } = string.Empty; + public string? ShortName { get; set; } } diff --git a/api/src/DataAccess/Models/DataTransferObjects/UpdateBenchmarkDto.cs b/api/src/DataAccess/Models/DataTransferObjects/UpdateBenchmarkDto.cs index ed3543a..19d8c0b 100644 --- a/api/src/DataAccess/Models/DataTransferObjects/UpdateBenchmarkDto.cs +++ b/api/src/DataAccess/Models/DataTransferObjects/UpdateBenchmarkDto.cs @@ -3,4 +3,5 @@ namespace WinStudentGoalTracker.DataAccess; public class UpdateBenchmarkDto { public string Benchmark { get; set; } = string.Empty; + public string? ShortName { get; set; } } diff --git a/api/src/DataAccess/Models/DatabaseObjects/dbStudentBenchmarkRow.cs b/api/src/DataAccess/Models/DatabaseObjects/dbStudentBenchmarkRow.cs index 5860aa2..6806917 100644 --- a/api/src/DataAccess/Models/DatabaseObjects/dbStudentBenchmarkRow.cs +++ b/api/src/DataAccess/Models/DatabaseObjects/dbStudentBenchmarkRow.cs @@ -7,6 +7,7 @@ public class dbStudentBenchmarkRow public required Guid GoalId { get; set; } public string? GoalCategory { get; set; } public string? Benchmark { get; set; } + public string? ShortName { get; set; } public string? CreatedByName { get; set; } public DateTime CreatedAt { get; set; } public DateTime? UpdatedAt { get; set; } diff --git a/api/src/DataAccess/Repositories/StudentRepository.cs b/api/src/DataAccess/Repositories/StudentRepository.cs index a5043b1..6fea84d 100644 --- a/api/src/DataAccess/Repositories/StudentRepository.cs +++ b/api/src/DataAccess/Repositories/StudentRepository.cs @@ -256,6 +256,7 @@ public class StudentRepository GoalId = r.GoalId, GoalCategory = r.GoalCategory, Benchmark = r.Benchmark, + ShortName = r.ShortName, CreatedByName = r.CreatedByName, CreatedAt = r.CreatedAt, UpdatedAt = r.UpdatedAt @@ -277,7 +278,8 @@ public class StudentRepository p_id_benchmark = newId.ToString(), p_id_goal = goalId.ToString(), p_id_user_created = userId.ToString(), - p_benchmark = dto.Benchmark + p_benchmark = dto.Benchmark, + p_short_name = dto.ShortName }, commandType: CommandType.StoredProcedure); @@ -288,6 +290,7 @@ public class StudentRepository BenchmarkId = newId, GoalId = goalId, Benchmark = dto.Benchmark, + ShortName = dto.ShortName, CreatedAt = DateTime.UtcNow }; } @@ -295,7 +298,7 @@ public class StudentRepository // ***************************************************************** // Updates a benchmark's text and returns whether rows were affected. // ***************************************************************** - public async Task UpdateBenchmarkAsync(Guid benchmarkId, string benchmarkText) + public async Task UpdateBenchmarkAsync(Guid benchmarkId, UpdateBenchmarkDto dto) { using var db = Connection; var rowsAffected = await db.ExecuteScalarAsync( @@ -303,7 +306,8 @@ public class StudentRepository new { p_id_benchmark = benchmarkId.ToString(), - p_benchmark = benchmarkText + p_benchmark = dto.Benchmark, + p_short_name = dto.ShortName }, commandType: CommandType.StoredProcedure); return rowsAffected > 0; diff --git a/api/src/Models/ResponseTypes/StudentBenchmarkItem.cs b/api/src/Models/ResponseTypes/StudentBenchmarkItem.cs index c6cc3b9..676e347 100644 --- a/api/src/Models/ResponseTypes/StudentBenchmarkItem.cs +++ b/api/src/Models/ResponseTypes/StudentBenchmarkItem.cs @@ -6,6 +6,7 @@ public class StudentBenchmarkItem public Guid GoalId { get; set; } public string? GoalCategory { get; set; } public string? Benchmark { get; set; } + public string? ShortName { get; set; } public string? CreatedByName { get; set; } public DateTime CreatedAt { get; set; } public DateTime? UpdatedAt { get; set; } diff --git a/db/Migrations/add_benchmark_short_name.sql b/db/Migrations/add_benchmark_short_name.sql new file mode 100644 index 0000000..a3945da --- /dev/null +++ b/db/Migrations/add_benchmark_short_name.sql @@ -0,0 +1,94 @@ +-- ===================================================================== +-- Migration: Add short_name column to benchmark table and update +-- all benchmark stored procedures to support it. +-- Run in TablePlus against MySQL. +-- ===================================================================== + +-- 1. Add the column +ALTER TABLE `benchmark` +ADD COLUMN `short_name` VARCHAR(50) DEFAULT NULL AFTER `benchmark`; + + +-- 2. Recreate sp_Benchmark_GetByStudentId +DROP PROCEDURE IF EXISTS `sp_Benchmark_GetByStudentId`; +CREATE PROCEDURE `sp_Benchmark_GetByStudentId`(IN p_id_student CHAR(36)) +BEGIN + SELECT + s.`identifier` AS `studentIdentifier`, + b.`id_benchmark` AS `benchmarkId`, + b.`id_goal` AS `goalId`, + g.`category` AS `goalCategory`, + b.`benchmark` AS `benchmark`, + b.`short_name` AS `shortName`, + u.`name` AS `createdByName`, + b.`created_at` AS `createdAt`, + b.`updated_at` AS `updatedAt` + FROM `benchmark` b + INNER JOIN `goal` g ON g.`id_goal` = b.`id_goal` + INNER JOIN `student` s ON s.`id_student` = g.`id_student` + LEFT JOIN `user` u ON u.`id_user` = b.`id_user_created` + WHERE g.`id_student` = p_id_student + ORDER BY b.`created_at` DESC; +END; + + +-- 3. Recreate sp_Benchmark_Insert +DROP PROCEDURE IF EXISTS `sp_Benchmark_Insert`; +CREATE PROCEDURE `sp_Benchmark_Insert`( + IN p_id_benchmark CHAR(36), + IN p_id_goal CHAR(36), + IN p_id_user_created CHAR(36), + IN p_benchmark TEXT, + IN p_short_name VARCHAR(50) +) +BEGIN + INSERT INTO benchmark + ( + id_benchmark, + id_goal, + id_user_created, + benchmark, + short_name, + created_at, + updated_at + ) + VALUES + ( + p_id_benchmark, + p_id_goal, + p_id_user_created, + p_benchmark, + p_short_name, + UTC_TIMESTAMP(), + NULL + ); + SELECT + id_benchmark, + id_goal, + id_user_created, + benchmark, + short_name, + created_at, + updated_at + FROM benchmark + WHERE id_benchmark = p_id_benchmark + LIMIT 1; +END; + + +-- 4. Recreate sp_Benchmark_Update +DROP PROCEDURE IF EXISTS `sp_Benchmark_Update`; +CREATE PROCEDURE `sp_Benchmark_Update`( + IN p_id_benchmark CHAR(36), + IN p_benchmark TEXT, + IN p_short_name VARCHAR(50) +) +BEGIN + UPDATE benchmark + SET + benchmark = p_benchmark, + short_name = p_short_name, + updated_at = UTC_TIMESTAMP() + WHERE id_benchmark = p_id_benchmark; + SELECT ROW_COUNT() AS rowsAffected; +END; diff --git a/db/Objects/procedures/sp_Benchmark_GetByStudentId.sql b/db/Objects/procedures/sp_Benchmark_GetByStudentId.sql index 222266b..7a8c93d 100644 --- a/db/Objects/procedures/sp_Benchmark_GetByStudentId.sql +++ b/db/Objects/procedures/sp_Benchmark_GetByStudentId.sql @@ -7,6 +7,7 @@ BEGIN b.`id_goal` AS `goalId`, g.`category` AS `goalCategory`, b.`benchmark` AS `benchmark`, + b.`short_name` AS `shortName`, u.`name` AS `createdByName`, b.`created_at` AS `createdAt`, b.`updated_at` AS `updatedAt` diff --git a/db/Objects/procedures/sp_Benchmark_Insert.sql b/db/Objects/procedures/sp_Benchmark_Insert.sql index ad77528..8305a8f 100644 --- a/db/Objects/procedures/sp_Benchmark_Insert.sql +++ b/db/Objects/procedures/sp_Benchmark_Insert.sql @@ -3,7 +3,8 @@ CREATE DEFINER=`root`@`%` PROCEDURE `sp_Benchmark_Insert`( IN p_id_benchmark CHAR(36), IN p_id_goal CHAR(36), IN p_id_user_created CHAR(36), - IN p_benchmark TEXT + IN p_benchmark TEXT, + IN p_short_name VARCHAR(50) ) BEGIN INSERT INTO benchmark @@ -12,6 +13,7 @@ BEGIN id_goal, id_user_created, benchmark, + short_name, created_at, updated_at ) @@ -21,6 +23,7 @@ BEGIN p_id_goal, p_id_user_created, p_benchmark, + p_short_name, UTC_TIMESTAMP(), NULL ); @@ -29,6 +32,7 @@ BEGIN id_goal, id_user_created, benchmark, + short_name, created_at, updated_at FROM benchmark diff --git a/db/Objects/procedures/sp_Benchmark_Update.sql b/db/Objects/procedures/sp_Benchmark_Update.sql index d4e6807..f3282cf 100644 --- a/db/Objects/procedures/sp_Benchmark_Update.sql +++ b/db/Objects/procedures/sp_Benchmark_Update.sql @@ -1,12 +1,14 @@ DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `sp_Benchmark_Update`( IN p_id_benchmark CHAR(36), - IN p_benchmark TEXT + IN p_benchmark TEXT, + IN p_short_name VARCHAR(50) ) BEGIN UPDATE benchmark SET benchmark = p_benchmark, + short_name = p_short_name, updated_at = UTC_TIMESTAMP() WHERE id_benchmark = p_id_benchmark; SELECT ROW_COUNT() AS rowsAffected; diff --git a/db/Objects/tables/benchmark.sql b/db/Objects/tables/benchmark.sql index 9c01e9e..b8a4b6f 100644 --- a/db/Objects/tables/benchmark.sql +++ b/db/Objects/tables/benchmark.sql @@ -3,6 +3,7 @@ CREATE TABLE `benchmark` ( `id_goal` char(36) NOT NULL, `id_user_created` char(36) NOT NULL, `benchmark` text NOT NULL, + `short_name` varchar(50) DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime DEFAULT NULL, PRIMARY KEY (`id_benchmark`) diff --git a/db/Objects/views/v_student_card.sql b/db/Objects/views/v_student_card.sql index 1a686b5..be5cd81 100644 --- a/db/Objects/views/v_student_card.sql +++ b/db/Objects/views/v_student_card.sql @@ -1,7 +1,9 @@ CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `winstudentgoaltracker`.`v_student_card` AS -select `s`.`id_student` AS `studentId`,`s`.`identifier` AS `identifier`,`s`.`next_iep_date` AS `nextIepDate`,max(`pe`.`created_at`) AS `lastEntryDate`,count(distinct `g`.`id_goal`) AS `goalCount`,count(distinct `pe`.`id_progress_event`) AS `progressEventCount` -from ((`winstudentgoaltracker`.`student` `s` +select `s`.`id_student` AS `studentId`,`s`.`identifier` AS `identifier`,`s`.`next_iep_date` AS `nextIepDate`,max(`pe`.`created_at`) AS `lastEntryDate`,count(distinct `g`.`id_goal`) AS `goalCount`,count(distinct `pe`.`id_progress_event`) AS `progressEventCount`,count(distinct `b`.`id_benchmark`) AS `benchmarkCount` +from (((`winstudentgoaltracker`.`student` `s` left join `winstudentgoaltracker`.`goal` `g` on((`g`.`id_student` = `s`.`id_student`))) left -join `winstudentgoaltracker`.`progress_event` `pe` on((`pe`.`id_goal` = `g`.`id_goal`))) group by `s`.`id_student`,`s`.`identifier`,`s`.`next_iep_date`; +join `winstudentgoaltracker`.`progress_event` `pe` on((`pe`.`id_goal` = `g`.`id_goal`))) +left +join `winstudentgoaltracker`.`benchmark` `b` on((`b`.`id_goal` = `g`.`id_goal`))) group by `s`.`id_student`,`s`.`identifier`,`s`.`next_iep_date`; diff --git a/ui/winstudentgoaltracker/src/app/desktop/components/benchmark-card-full/benchmark-card-full.html b/ui/winstudentgoaltracker/src/app/desktop/components/benchmark-card-full/benchmark-card-full.html index a69376e..27956ec 100644 --- a/ui/winstudentgoaltracker/src/app/desktop/components/benchmark-card-full/benchmark-card-full.html +++ b/ui/winstudentgoaltracker/src/app/desktop/components/benchmark-card-full/benchmark-card-full.html @@ -15,14 +15,18 @@ @if (loaded()) {
- Goal - {{ goalCategory }} + Goal: {{ goalCategory }}
+
+ + +
@if (!isNew()) {