Skip to content

Commit dec97ae

Browse files
authored
Merge pull request #612 from TechnologyEnhancedLearning/CI
CI to Content Referencing V2 Branch
2 parents 5a5231d + 339add6 commit dec97ae

File tree

40 files changed

+1663
-355
lines changed

40 files changed

+1663
-355
lines changed

AdminUI/LearningHub.Nhs.AdminUI/Controllers/api/HierarchyController.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
using LearningHub.Nhs.AdminUI.Configuration;
77
using LearningHub.Nhs.AdminUI.Controllers.Api;
88
using LearningHub.Nhs.AdminUI.Interfaces;
9-
using LearningHub.Nhs.Models.Common;
109
using LearningHub.Nhs.Models.Hierarchy;
1110
using LearningHub.Nhs.WebUI.Models.Contribute;
1211
using Microsoft.AspNetCore.Mvc;
@@ -439,5 +438,29 @@ public async Task<IActionResult> RemoveReferenceNode(int hierarchyEditDetailId)
439438
var apiResponse = await this.hierarchyService.RemoveReferenceNodeAsync(hierarchyEditDetailId);
440439
return this.Ok(apiResponse.ValidationResult);
441440
}
441+
442+
/// <summary>
443+
/// The DeleteNodeReferenceDetails.
444+
/// </summary>
445+
/// <param name="hierarchyEditDetailId">The hierarchyEditDetailId<see cref="hierarchyEditDetailId"/>.</param>
446+
/// <returns>IActionResult.</returns>
447+
[Route("DeleteNodeReferenceDetails/{hierarchyEditDetailId}")]
448+
public async Task<IActionResult> DeleteNodeReferenceDetails(int hierarchyEditDetailId)
449+
{
450+
var apiResponse = await this.hierarchyService.DeleteNodeReferenceDetailsAsync(hierarchyEditDetailId);
451+
return this.Ok(apiResponse.ValidationResult);
452+
}
453+
454+
/// <summary>
455+
/// Deletes the resource reference details for a hierarchy edit.
456+
/// </summary>
457+
/// <param name="hierarchyEditDetailId">The hierarchy edit detail id.</param>
458+
/// <returns>The <see cref="IActionResult"/>.</returns>
459+
[Route("DeleteResourceReferenceDetails/{hierarchyEditDetailId}")]
460+
public async Task<IActionResult> DeleteResourceReferenceDetails(int hierarchyEditDetailId)
461+
{
462+
var apiResponse = await this.hierarchyService.DeleteResourceReferenceDetailsAsync(hierarchyEditDetailId);
463+
return this.Ok(apiResponse.ValidationResult);
464+
}
442465
}
443466
}

AdminUI/LearningHub.Nhs.AdminUI/Interfaces/IHierarchyService.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,5 +198,19 @@ public interface IHierarchyService
198198
/// <param name="hierarchyEditDetailId">The hierarchy Edit Detail Id.</param>
199199
/// <returns>The <see cref="Task"/>.</returns>
200200
Task<ApiResponse> RemoveReferenceNodeAsync(int hierarchyEditDetailId);
201+
202+
/// <summary>
203+
/// Deletes the node reference details.
204+
/// </summary>
205+
/// <param name="hierarchyEditDetailId">The hierarchy Edit Detail Id.</param>
206+
/// <returns>The <see cref="Task"/>.</returns>
207+
Task<ApiResponse> DeleteNodeReferenceDetailsAsync(int hierarchyEditDetailId);
208+
209+
/// <summary>
210+
/// Deletes the resource reference details.
211+
/// </summary>
212+
/// <param name="hierarchyEditDetailId">The hierarchy Edit Detail Id.</param>
213+
/// <returns>The <see cref="Task"/>.</returns>
214+
Task<ApiResponse> DeleteResourceReferenceDetailsAsync(int hierarchyEditDetailId);
201215
}
202216
}

AdminUI/LearningHub.Nhs.AdminUI/Scripts/vuesrc/content-structure/contentStructure.vue

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,13 @@
110110
<input type="button" class="btn btn-custom-green mr-3" @click="onSaveFolderReferenceEdit()" v-bind:class="{disabled: !canSaveFolderReferenceEdit}" v-bind:disabled="!canSaveFolderReferenceEdit" value="Save changes" />
111111
<input type="button" class="btn btn-admin btn-cancel" @click="onCancelFolderReferenceEdit()" value="Cancel" />
112112

113-
<span class="ml-auto mt-3">
114-
<a class="delete-folder-link" @click.prevent="onEditFolderReferenceDeleteFolder" href="#">
115-
Delete this folder reference <i class="fa-solid fa-trash-can delete-folder ml-2"></i>
113+
<span class="ml-auto mt-3" v-if="editingFolderNodeReference.nodePathDisplayVersionId>0">
114+
<a class="delete-folder-link" @click.prevent="onEditFolderReferenceDetailsDeleteFolder" href="#">
115+
Delete folder reference details <i class="fa-solid fa-trash-can delete-folder ml-2"></i>
116116
</a>
117117
</span>
118118
</div>
119119
</div>
120-
121120
<div v-if="editMode === EditModeEnum.ResourceReference" id="editResourceReference">
122121
<div class="col-12">
123122
<label class="control-label">Resource location</label>
@@ -148,18 +147,16 @@
148147
<input type="button" class="btn btn-custom-green mr-3" @click="onSaveResourceReferenceEdit()" v-bind:class="{disabled: !canSaveResourceReferenceEdit}" v-bind:disabled="!canSaveResourceReferenceEdit" value="Save changes" />
149148
<input type="button" class="btn btn-admin btn-cancel" @click="onCancelResourceReferenceEdit()" value="Cancel" />
150149

151-
<span class="ml-auto mt-3">
150+
<span class="ml-auto mt-3" v-if="editingResourceNodeReference.resourceReferenceDisplayVersionId>0">
152151
<a class="delete-folder-link" @click.prevent="onEditResourceReferenceDeleteFolder" href="#">
153-
Delete this resource reference <i class="fa-solid fa-trash-can delete-folder ml-2"></i>
152+
Delete resource reference details <i class="fa-solid fa-trash-can delete-folder ml-2"></i>
154153
</a>
155154
</span>
156155
</div>
157156
</div>
158-
159157
<div v-if="editMode === EditModeEnum.ReferenceExternalContent" id="referenceExternalContentContainer">
160158
<content-search :editingCatalogueNodePathId="catalogue.rootNodePathId"></content-search>
161159
</div>
162-
163160
<div id="deleteFolderModal" class="modal" tabindex="-1" role="dialog" data-backdrop="static" data-keyboad="false">
164161
<div class="modal-dialog modal-dialog-centered modal-md" role="document">
165162
<div class="modal-content">
@@ -182,53 +179,50 @@
182179
</div>
183180
</div>
184181
</div>
185-
186-
<div id="deleteFolderReferenceModal" class="modal" tabindex="-1" role="dialog" data-backdrop="static" data-keyboad="false">
182+
<div id="deleteFolderReferenceDetailsModal" class="modal" tabindex="-1" role="dialog" data-backdrop="static" data-keyboad="false">
187183
<div class="modal-dialog modal-dialog-centered modal-md" role="document">
188184
<div class="modal-content">
189185
<div class="modal-header alert-modal-header text-center">
190-
<h2 class="heading-lg w-100"><i class="delete-folder-warning-triangle fas fa-exclamation-triangle pr-3"></i>Delete folder reference</h2>
186+
<h2 class="heading-lg w-100"><i class="delete-folder-warning-triangle fas fa-exclamation-triangle pr-3"></i>Delete folder reference details</h2>
191187
</div>
192188

193189
<div class="modal-body alert-modal-body">
194-
<div class="mt-3">You have chosen to delete the folder reference <span id="deleteFolderReferenceName">{{ deleteFolderReferenceName}}</span>. The folder will display using the default folder properties.</div>
190+
<div class="mt-3">You have chosen to delete the folder reference details <span id="deleteFolderReferenceName">{{ deleteFolderReferenceName}}</span>. The folder will display using the default folder properties.</div>
195191
</div>
196192

197193
<div class="modal-footer alert-modal-footer">
198194
<div class="form-group col-12 p-0 m-0">
199195
<div class="d-flex">
200196
<input type="button" class="btn btn-action-cancel" data-dismiss="modal" value="Cancel" />
201-
<input type="button" class="btn btn-action-red ml-auto" @click="onDeleteFolderReference()" value="Continue" />
197+
<input type="button" class="btn btn-action-red ml-auto" @click="onDeleteFolderReferenceDetails()" value="Continue" />
202198
</div>
203199
</div>
204200
</div>
205201
</div>
206202
</div>
207203
</div>
208-
209204
<div id="deleteResourceReferenceModal" class="modal" tabindex="-1" role="dialog" data-backdrop="static" data-keyboad="false">
210205
<div class="modal-dialog modal-dialog-centered modal-md" role="document">
211206
<div class="modal-content">
212207
<div class="modal-header alert-modal-header text-center">
213-
<h2 class="heading-lg w-100"><i class="delete-folder-warning-triangle fas fa-exclamation-triangle pr-3"></i>Delete resource reference</h2>
208+
<h2 class="heading-lg w-100"><i class="delete-folder-warning-triangle fas fa-exclamation-triangle pr-3"></i>Delete resource reference details</h2>
214209
</div>
215210

216211
<div class="modal-body alert-modal-body">
217-
<div class="mt-3">You have chosen to delete the resource reference <span id="deleteResourceReferenceName">{{ deleteResourceReferenceName}}</span>. The resource will display using the default resource properties.</div>
212+
<div class="mt-3">You have chosen to delete the resource reference details <span id="deleteResourceReferenceName">{{ deleteResourceReferenceName}}</span>. The resource will display using the default resource properties.</div>
218213
</div>
219214

220215
<div class="modal-footer alert-modal-footer">
221216
<div class="form-group col-12 p-0 m-0">
222217
<div class="d-flex">
223218
<input type="button" class="btn btn-action-cancel" data-dismiss="modal" value="Cancel" />
224-
<input type="button" class="btn btn-action-red ml-auto" @click="onDeleteResourceReference()" value="Continue" />
219+
<input type="button" class="btn btn-action-red ml-auto" @click="onDeleteResourceReferenceDetails()" value="Continue" />
225220
</div>
226221
</div>
227222
</div>
228223
</div>
229224
</div>
230225
</div>
231-
232226
<div id="cancelHierarchyEditModal" class="modal" tabindex="-1" role="dialog" data-backdrop="static" data-keyboad="false">
233227
<div class="modal-dialog modal-dialog-centered modal-md" role="document">
234228
<div class="modal-content">
@@ -272,7 +266,6 @@ import { ResourceReferenceDisplayVersionModel } from '../models/content-structur
272266
import { NodeType } from '../constants';
273267
import CKEditorToolbar from '../models/ckeditorToolbar';
274268
import ckeditorwithhint from '../ckeditorwithhint.vue';
275-
276269
export default Vue.extend({
277270
name: 'contentStructure',
278271
components: {
@@ -418,28 +411,28 @@ export default Vue.extend({
418411
},
419412
onEditFolderDeleteFolder() {
420413
this.deleteFolderName = this.editingFolderNode.name;
421-
$('#deleteFolderReferenceModal').modal('show');
414+
$('#deleteFolderModal').modal('show');
422415
},
423-
onEditFolderReferenceDeleteFolder() {
416+
onEditFolderReferenceDetailsDeleteFolder() {
424417
this.deleteFolderReferenceName = this.editingFolderNodeReference.name;
425-
$('#deleteFolderReferenceModal').modal('show');
418+
$('#deleteFolderReferenceDetailsModal').modal('show');
426419
},
427-
onEditResourceReferenceDeleteFolder() {
420+
onEditResourceReferenceDeleteFolder() {
428421
this.deleteResourceReferenceName = this.editingResourceNodeReference.name;
429422
$('#deleteResourceReferenceModal').modal('show');
430423
},
431424
onDeleteFolder() {
432425
this.$store.dispatch('contentStructureState/deleteFolder');
433426
$('#deleteFolderModal').modal('hide');
434427
},
435-
onDeleteFolderReference() {
436-
this.$store.dispatch('contentStructureState/deleteFolderReference');
437-
$('#deleteFolderReferenceModal').modal('hide');
428+
onDeleteFolderReferenceDetails() {
429+
this.$store.dispatch('contentStructureState/deleteFolderReferenceDetails');
430+
$('#deleteFolderReferenceDetailsModal').modal('hide');
438431
this.onCancelFolderEdit()
439432
},
440-
onDeleteResourceReference() {
441-
this.$store.dispatch('contentStructureState/deleteResourceReference');
442-
$('#deleteFolderModal').modal('hide');
433+
onDeleteResourceReferenceDetails() {
434+
this.$store.dispatch('contentStructureState/deleteResourceReferenceDetails');
435+
$('#deleteResourceReferenceModal').modal('hide');
443436
},
444437
onEdit() {
445438
this.editFolderStructureButtonDisabled = true;

AdminUI/LearningHub.Nhs.AdminUI/Scripts/vuesrc/content-structure/contentStructureState.ts

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ async function refreshNodeContents(node: NodeContentAdminModel, refreshParentPat
116116
existing.displayOrder = child.displayOrder;
117117
existing.name = child.name;
118118
existing.nodePathDisplayVersionId = child.nodePathDisplayVersionId;
119+
existing.resourceReferenceDisplayVersionId = child.resourceReferenceDisplayVersionId;
119120
existing.nodePaths = child.nodePaths;
120121
existing.isResource = child.nodeTypeId === NodeType.Resource;
121122
if (child.nodePaths) {
@@ -164,20 +165,22 @@ async function refreshNodeContents(node: NodeContentAdminModel, refreshParentPat
164165
state.lastErrorMessage = `Error refreshing Node contents of ${node.name}`;
165166
});
166167
}
167-
168-
async function refreshNodeIfMatchingNodeId(node: NodeContentAdminModel, nodeId: number, hierarchyEditDetailId: number) {
168+
async function refreshNodeIfMatchingNodeId(node: NodeContentAdminModel, nodeId: number, hierarchyEditDetailId: number, removeChildren?: boolean) {
169169
if (node.nodeId === nodeId && node.hierarchyEditDetailId != hierarchyEditDetailId) {
170+
if (removeChildren && node.parent) {
171+
node.parent.children = [];
172+
node.parent.childrenLoaded = false;
173+
}
170174
await refreshNodeContents(node.parent, false);
171175
}
172176
if (node.childrenLoaded) {
173177
if (node.children.filter(c => c.hierarchyEditDetailId === hierarchyEditDetailId).length == 0) {
174178
for (const child of node.children) {
175-
await refreshNodeIfMatchingNodeId(child, nodeId, hierarchyEditDetailId);
179+
await refreshNodeIfMatchingNodeId(child, nodeId, hierarchyEditDetailId, removeChildren);
176180
}
177181
}
178182
}
179183
}
180-
181184
async function processChildNodeContents(child: NodeContentAdminModel, parent: NodeContentAdminModel) {
182185
child.parent = parent;
183186
child.inEdit = child.parent.inEdit;
@@ -413,13 +416,34 @@ const actions = <ActionTree<State, any>>{
413416
state.lastErrorMessage = "Error deleting folder.";
414417
});
415418
},
416-
deleteFolderReference(context: ActionContext<State, State>) {
419+
deleteFolderReferenceDetails(context: ActionContext<State, State>) {
420+
state.inError = false;
421+
state.updatedNode = null;
422+
contentStructureData.deleteFolderReferenceDetails(state.editingTreeNode.hierarchyEditDetailId).then(async response => {
423+
if (response.isValid) {
424+
var parent = state.editingTreeNode.parent;
425+
await refreshNodeContents(parent, false);
426+
await refreshNodeIfMatchingNodeId(state.rootNode, state.editingTreeNode.nodeId, state.editingTreeNode.hierarchyEditDetailId, true);
427+
state.updatedNode = parent;
428+
context.commit("setEditMode", EditModeEnum.Structure);
429+
}
430+
else {
431+
state.inError = true;
432+
state.lastErrorMessage = "Error: " + response.details.join(",");
433+
}
434+
}).catch(e => {
435+
state.inError = true;
436+
state.lastErrorMessage = "Error deleting folder reference details.";
437+
});
438+
},
439+
deleteResourceReferenceDetails(context: ActionContext<State, State>) {
417440
state.inError = false;
418441
state.updatedNode = null;
419-
contentStructureData.deleteFolderReference(state.editingTreeNode.hierarchyEditDetailId).then(async response => {
442+
contentStructureData.deleteResourceReferenceDetails(state.editingTreeNode.hierarchyEditDetailId).then(async response => {
420443
if (response.isValid) {
421444
var parent = state.editingTreeNode.parent;
422445
await refreshNodeContents(parent, false);
446+
await refreshNodeIfMatchingNodeId(state.rootNode, state.editingTreeNode.nodeId, state.editingTreeNode.hierarchyEditDetailId, true);
423447
state.updatedNode = parent;
424448
context.commit("setEditMode", EditModeEnum.Structure);
425449
}
@@ -429,7 +453,7 @@ const actions = <ActionTree<State, any>>{
429453
}
430454
}).catch(e => {
431455
state.inError = true;
432-
state.lastErrorMessage = "Error deleting folder reference.";
456+
state.lastErrorMessage = "Error deleting resource reference details.";
433457
});
434458
},
435459
async moveNodeUp(context: ActionContext<State, State>, payload: { node: NodeContentAdminModel }) {
@@ -457,6 +481,7 @@ const actions = <ActionTree<State, any>>{
457481
await refreshNodeContents(payload.destinationNode, true).then(async x => {
458482
await refreshNodeContents(state.editingTreeNode.parent, true).then(y => {
459483
});
484+
refreshHierarchyEdit(state);
460485
state.rootNode.children.forEach(async (child) => {
461486
if (child.nodeId != null) {
462487
await refreshNodeContents(child, false);
@@ -514,6 +539,7 @@ const actions = <ActionTree<State, any>>{
514539
state.inError = false;
515540
contentStructureData.removeReferenceNode(payload.node.hierarchyEditDetailId).then(async response => {
516541
await refreshNodeContents(payload.node.parent, false);
542+
await refreshNodeIfMatchingNodeId(state.rootNode, payload.node.nodeId, payload.node.hierarchyEditDetailId, true);
517543
if (payload.node.parent.parent != null) {
518544
await refreshNodeContents(payload.node.parent.parent, false);
519545
}
@@ -527,7 +553,8 @@ const actions = <ActionTree<State, any>>{
527553
await refreshNodeContents(state.referencingResource.parent, true).then(async x => {
528554
await refreshNodeContents(payload.destinationNode, true);
529555
});
530-
556+
state.editingTreeNode.parent.childrenLoaded = false;
557+
await refreshNodeContents(state.editingTreeNode.parent, true);
531558
context.commit("setEditMode", EditModeEnum.Structure);
532559
}).catch(e => {
533560
state.inError = true;
@@ -562,6 +589,7 @@ const actions = <ActionTree<State, any>>{
562589
contentStructureData.updateNodePathDisplayVersion(state.editingFolderNodeReference).then(async response => {
563590
state.editingFolderNodeReference.nodePathDisplayVersionId = response.createdId;
564591
await refreshNodeContents(state.editingTreeNode.parent, false);
592+
await refreshNodeIfMatchingNodeId(state.rootNode, state.editingTreeNode.nodeId, state.editingTreeNode.hierarchyEditDetailId, true);
565593
}).catch(e => {
566594
state.inError = true;
567595
state.lastErrorMessage = "Error creating folder reference.";
@@ -572,9 +600,10 @@ const actions = <ActionTree<State, any>>{
572600
contentStructureData.updateResourceReferenceDisplayVersion(state.editingResourceNodeReference).then(async response => {
573601
state.editingResourceNodeReference.resourceReferenceDisplayVersionId = response.createdId;
574602
await refreshNodeContents(state.editingTreeNode.parent, false);
603+
await refreshNodeIfMatchingNodeId(state.rootNode, state.editingTreeNode.nodeId, state.editingTreeNode.hierarchyEditDetailId, true);
575604
}).catch(e => {
576605
state.inError = true;
577-
state.lastErrorMessage = "Error creating folder reference.";
606+
state.lastErrorMessage = "Error creating resource reference.";
578607
});
579608
context.commit("setEditMode", EditModeEnum.Structure);
580609
},

0 commit comments

Comments
 (0)