Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
dcc3290
TD-483 Adds model, data service methods and controller for select com…
kevwhitt-hee Jun 4, 2025
8e2920b
TD-483 Begins to implement interface and redirect to add competencies…
kevwhitt-hee Jun 5, 2025
caacce6
TD-483 Begins implementation of add competencies functionality
kevwhitt-hee Jun 20, 2025
d456967
TD-483 Begins to implement the select framework page
kevwhitt-hee Jun 20, 2025
052a0b0
TD-483 Begins to implement add competencies MVC view
kevwhitt-hee Jun 23, 2025
dfbaebe
TD-483 Wires up the choose framework post and begins to wire up the a…
kevwhitt-hee Jun 25, 2025
6ae3e59
TD-483 Adds select linked framework source form validation
kevwhitt-hee Jun 26, 2025
daad7ed
Continues progress with loading data into select competencies views
kevwhitt-hee Jul 3, 2025
87c4db7
Applies design based on Framework developer structure interface
kevwhitt-hee Jul 7, 2025
1569e57
Implements frameworks summary to view selected competencies and selec…
kevwhitt-hee Jul 14, 2025
a317639
begins to implement post method
kevwhitt-hee Jul 28, 2025
87fdb14
Merge branch 'master' into Develop/Features/TD-483-AddComptenciesToAs…
kevwhitt-hee Jul 28, 2025
6f2e711
Remove unused using directives
kevwhitt-hee Jul 28, 2025
badab53
More prep work on posting the add competencies page
kevwhitt-hee Jul 30, 2025
b805ae6
Merge pull request #3336 from TechnologyEnhancedLearning/DLS-Release-…
rshrirohit Jul 30, 2025
f1a555e
Includes only competencies that are not already added to the assessme…
kevwhitt-hee Jul 31, 2025
42f12df
Merge branch 'master' into Develop/Features/TD-483-AddComptenciesToAs…
kevwhitt-hee Aug 1, 2025
b5d1f4c
Fixes loading of data into add competencies from framework view and u…
kevwhitt-hee Aug 5, 2025
d55f09d
Begins to implement remove competency from assessment functionality
kevwhitt-hee Aug 6, 2025
324f869
Migrations for move competency and competency groups stored procedure
kevwhitt-hee Aug 18, 2025
1983c15
Reworks the reordering groups sproc to include a RenumberSelfAssessme…
kevwhitt-hee Aug 18, 2025
846b784
Improves group moving and adds url anchors for scrolling to moved com…
kevwhitt-hee Aug 19, 2025
7f085e9
Implements conditional logic for move up and move down buttons
kevwhitt-hee Aug 20, 2025
5523551
Adds update status checkbox and wiring
kevwhitt-hee Aug 20, 2025
762467a
Fixes linked framework labelling
kevwhitt-hee Aug 21, 2025
c06bf2e
Adds select and deselect all buttons to competency groups in add comp…
kevwhitt-hee Aug 22, 2025
dbe0d3c
Update AddCompetenciesSelectFramework.cshtml
kevwhitt-hee Aug 22, 2025
0edfa30
Update AddCompetenciesSelectFramework.cshtml
kevwhitt-hee Aug 22, 2025
788fe39
Merge branch 'DLS-Release-v1.3.0' into Develop/Features/TD-483-AddCom…
kevwhitt-hee Aug 22, 2025
a0bc0ee
Fix build error relating to unclosed node in resources.resx
kevwhitt-hee Aug 26, 2025
e181cfe
Fixes build error relating to renamed class
kevwhitt-hee Aug 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
namespace DigitalLearningSolutions.Data.Migrations
{
using FluentMigrator;
[Migration(202508181154)]
public class CreateOrAlterMoveCompetenciesAndGroups : Migration
{
public override void Up()
{
Execute.Sql(Properties.Resources.TD_483_uspMoveCompetencyInSelfAssessmentCreateOrAlter_UP);
Execute.Sql(Properties.Resources.TD_483_uspMoveCompetencyGroupInSelfAssessmentCreateOrAlter_UP);
}
public override void Down()
{
Execute.Sql("DROP PROCEDURE IF EXISTS [dbo].[usp_MoveCompetencyGroupInSelfAssessment]");
Execute.Sql("DROP PROCEDURE IF EXISTS [dbo].[usp_MoveCompetencyInSelfAssessment]");
Execute.Sql("DROP PROCEDURE IF EXISTS [dbo].[usp_RenumberSelfAssessmentStructure]");
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,12 @@
<data name="TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF-Fix_UP" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Scripts\TD-5759_CreateOrAlterSelfAssessmentReportSPandTVF-Fix_UP.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="TD-483-uspMoveCompetencyInSelfAssessmentCreateOrAlter_UP" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Scripts\TD-483-uspMoveCompetencyInSelfAssessmentCreateOrAlter_UP.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="TD-483-uspMoveCompetencyGroupInSelfAssessmentCreateOrAlter_UP" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Scripts\TD-483-uspMoveCompetencyGroupInSelfAssessmentCreateOrAlter_UP.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="TD_5535_Alter_GetActivitiesForDelegateEnrolment_Down" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Scripts\TD-5535-Alter_GetActivitiesForDelegateEnrolment_Down.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@

CREATE OR ALTER PROCEDURE usp_RenumberSelfAssessmentStructure
@SelfAssessmentID INT
AS
BEGIN
SET NOCOUNT ON;

/*
Step 1: Build an ordered list of groups
- Each group is ranked by its current Min(Ordering)
- Ungrouped competencies (NULL CompetencyGroupID) are treated as their own "pseudo group"
*/
;WITH GroupRanks AS (
SELECT
CompetencyGroupID,
ROW_NUMBER() OVER (ORDER BY MIN(Ordering)) AS GroupRank
FROM SelfAssessmentStructure
WHERE SelfAssessmentID = @SelfAssessmentID
GROUP BY CompetencyGroupID
)
/*
Step 2: Renumber groups and competencies
- Groups get ranked (1,2,3…)
- Within each group, competencies are ordered by their current Ordering and renumbered (1,2,3…)
*/
UPDATE sas
SET sas.Ordering = rn.NewOrdering
FROM SelfAssessmentStructure sas
INNER JOIN (
SELECT
s.ID,
-- new group position * 1000 + row within group
-- gives room between groups and avoids clashes
(g.GroupRank * 1000) +
ROW_NUMBER() OVER (PARTITION BY s.CompetencyGroupID, g.GroupRank ORDER BY s.Ordering, s.ID) AS NewOrdering
FROM SelfAssessmentStructure s
INNER JOIN GroupRanks g
ON g.CompetencyGroupID = s.CompetencyGroupID
WHERE s.SelfAssessmentID = @SelfAssessmentID
) rn ON sas.ID = rn.ID;

END

GO

CREATE OR ALTER PROCEDURE usp_MoveCompetencyGroupInSelfAssessment
@SelfAssessmentID INT,
@GroupID INT,
@Direction NVARCHAR(10) -- 'up' or 'down'
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;

BEGIN TRY
BEGIN TRAN;

/* 1) Rank groups by current Min(Ordering) (NULL groups excluded here; include if desired). */
;WITH GroupRanks AS (
SELECT
CompetencyGroupID,
MIN(Ordering) AS MinOrder,
ROW_NUMBER() OVER (
ORDER BY MIN(Ordering), MIN(CompetencyGroupID)
) AS RankPos
FROM SelfAssessmentStructure
WHERE SelfAssessmentID = @SelfAssessmentID
AND CompetencyGroupID IS NOT NULL
GROUP BY CompetencyGroupID
)
SELECT *
INTO #Groups
FROM GroupRanks;

DECLARE @CurRank INT, @SwapRank INT, @SwapGroupID INT;

SELECT @CurRank = RankPos
FROM #Groups
WHERE CompetencyGroupID = @GroupID;

IF @CurRank IS NULL
BEGIN
DROP TABLE #Groups;
COMMIT TRAN; RETURN; -- nothing to do
END

IF LOWER(@Direction) = 'up'
SET @SwapRank = @CurRank - 1;
ELSE IF LOWER(@Direction) = 'down'
SET @SwapRank = @CurRank + 1;
ELSE
BEGIN
DROP TABLE #Groups;
ROLLBACK TRAN; THROW 50000, 'Direction must be ''up'' or ''down''.', 1;
END

SELECT @SwapGroupID = CompetencyGroupID
FROM #Groups
WHERE RankPos = @SwapRank;

IF @SwapGroupID IS NULL
BEGIN
DROP TABLE #Groups;
COMMIT TRAN; RETURN; -- already at top/bottom
END

/* 2) Build a mapping where ONLY the two groups swap ranks; others keep theirs. */
SELECT
g.CompetencyGroupID,
CASE
WHEN g.CompetencyGroupID = @GroupID THEN @SwapRank
WHEN g.CompetencyGroupID = @SwapGroupID THEN @CurRank
ELSE g.RankPos
END AS NewRank
INTO #RankMap
FROM #Groups g;

/* 3) Choose a block size big enough to keep groups separated when we recompute.
Using count(rows in this self assessment) + 10 is a safe dynamic choice. */
DECLARE @Block INT =
(SELECT COUNT(*) FROM SelfAssessmentStructure WHERE SelfAssessmentID = @SelfAssessmentID) + 10;

/* 4) Recompute EVERY row’s Ordering from the rank map (this sets the new global order).
We preserve within-group relative order using the existing Ordering (and ID as tiebreak). */
;WITH NewOrders AS (
SELECT
s.ID,
(m.NewRank * @Block)
+ ROW_NUMBER() OVER (
PARTITION BY s.CompetencyGroupID
ORDER BY s.Ordering, s.ID
) AS NewOrdering
FROM SelfAssessmentStructure s
JOIN #RankMap m
ON m.CompetencyGroupID = s.CompetencyGroupID
WHERE s.SelfAssessmentID = @SelfAssessmentID
)
UPDATE s
SET s.Ordering = n.NewOrdering
FROM SelfAssessmentStructure s
JOIN NewOrders n ON n.ID = s.ID;

/* 5) (Optional) Compress to 1..N while keeping the just-established relative order. */
;WITH Ordered AS (
SELECT ID,
ROW_NUMBER() OVER (ORDER BY Ordering, ID) AS Seq
FROM SelfAssessmentStructure
WHERE SelfAssessmentID = @SelfAssessmentID
)
UPDATE s
SET s.Ordering = o.Seq
FROM SelfAssessmentStructure s
JOIN Ordered o ON o.ID = s.ID;

DROP TABLE #Groups;
DROP TABLE #RankMap;

COMMIT TRAN;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRAN;
THROW;
END CATCH
END;
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
CREATE OR ALTER PROCEDURE usp_MoveCompetencyInSelfAssessment
@SelfAssessmentID INT,
@CompetencyID INT,
@Direction NVARCHAR(10)
AS
BEGIN
SET NOCOUNT ON;

DECLARE @GroupID INT, @CurrentOrder INT;

SELECT
@GroupID = CompetencyGroupID,
@CurrentOrder = Ordering
FROM SelfAssessmentStructure
WHERE SelfAssessmentID = @SelfAssessmentID AND CompetencyID = @CompetencyID;

IF @GroupID IS NULL
BEGIN
-- Can't reorder ungrouped competencies via group-based logic
RETURN;
END

DECLARE @TargetCompetencyID INT, @TargetOrder INT;

IF @Direction = 'up'
BEGIN
SELECT TOP 1
@TargetCompetencyID = CompetencyID,
@TargetOrder = Ordering
FROM SelfAssessmentStructure
WHERE SelfAssessmentID = @SelfAssessmentID
AND CompetencyGroupID = @GroupID
AND Ordering < @CurrentOrder
ORDER BY Ordering DESC;
END
ELSE IF @Direction = 'down'
BEGIN
SELECT TOP 1
@TargetCompetencyID = CompetencyID,
@TargetOrder = Ordering
FROM SelfAssessmentStructure
WHERE SelfAssessmentID = @SelfAssessmentID
AND CompetencyGroupID = @GroupID
AND Ordering > @CurrentOrder
ORDER BY Ordering ASC;
END

IF @TargetCompetencyID IS NOT NULL
BEGIN
-- Swap the orderings
UPDATE SelfAssessmentStructure
SET Ordering = @TargetOrder
WHERE SelfAssessmentID = @SelfAssessmentID AND CompetencyID = @CompetencyID;

UPDATE SelfAssessmentStructure
SET Ordering = @CurrentOrder
WHERE SelfAssessmentID = @SelfAssessmentID AND CompetencyID = @TargetCompetencyID;
END
END
Loading
Loading