Skip to content

Commit 84b219b

Browse files
authored
Merge pull request #337 from TechnologyEnhancedLearning/RC
Merge Latest RC changes to LHScorpius
2 parents 37e9e28 + 976b8ae commit 84b219b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1013
-242
lines changed

AdminUI/LearningHub.Nhs.AdminUI/Views/Catalogue/Edit.cshtml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@
138138
<div class="col-12">
139139
<label for="Description">Description</label>
140140
<textarea asp-for="Description" class="form-control"></textarea>
141+
<small id="with-hint-info" class="pt-2">Only the first 3,000 characters of the description will be used by search</small>
141142
<span asp-validation-for="Description"></span>
142143
</div>
143144
</div>

LearningHub.Nhs.WebUI/Controllers/Api/ContributeController.cs

Lines changed: 269 additions & 2 deletions
Large diffs are not rendered by default.

LearningHub.Nhs.WebUI/Controllers/Api/ScormController.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -230,11 +230,6 @@ private async Task<bool> Commit(SCO scoObject)
230230
try
231231
{
232232
var activeContent = this.userService.GetActiveContentAsync().Result;
233-
////if (activeContent.Count == 0)
234-
////{
235-
//// return false;
236-
////}
237-
238233
if (!activeContent.Any(ac => ac.ScormActivityId == scoObject.InstanceId))
239234
{
240235
throw new Exception($"User does not have ActiveContent for ScormActivityId={scoObject.InstanceId}");
@@ -265,10 +260,6 @@ private async Task<bool> Commit(SCO scoObject)
265260

266261
// Persist update.
267262
await this.activityService.UpdateScormActivityAsync(scoObject);
268-
////if (scoObject.LessonStatusId == ScormLessionStatus.ActivityStatusId(ScormLessionStatus.Completed) || scoObject.LessonStatusId == ScormLessionStatus.ActivityStatusId(ScormLessionStatus.Passed))
269-
////{
270-
//// await this.activityService.CompleteScormActivity(scoObject);
271-
////}
272263

273264
return true;
274265
}

LearningHub.Nhs.WebUI/Helpers/ViewActivityHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ public static string GetActivityStatusText(this ActivityDetailedItemViewModel ac
226226
/// <returns>The <see cref="bool"/>.</returns>
227227
public static bool CanShowScore(this ActivityDetailedItemViewModel activityDetailedItemViewModel)
228228
{
229-
if ((activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Scorm && (activityDetailedItemViewModel.MasteryScore > 0 || activityDetailedItemViewModel.MasteryScore == null) && ((activityDetailedItemViewModel.ScorePercentage > 0 && activityDetailedItemViewModel.ActivityStatus == ActivityStatusEnum.Passed) || activityDetailedItemViewModel.ActivityStatus == ActivityStatusEnum.Failed)) || ((activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Assessment || activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Case) && activityDetailedItemViewModel.Complete))
229+
if ((activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Scorm && (activityDetailedItemViewModel.MasteryScore > 0 || activityDetailedItemViewModel.MasteryScore == null) && ((activityDetailedItemViewModel.ScorePercentage > 0 && activityDetailedItemViewModel.ActivityStatus == ActivityStatusEnum.Passed) || activityDetailedItemViewModel.ActivityStatus == ActivityStatusEnum.Failed)) || (activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Assessment && (activityDetailedItemViewModel.ActivityStatus == ActivityStatusEnum.Completed || activityDetailedItemViewModel.ActivityStatus == ActivityStatusEnum.Passed || activityDetailedItemViewModel.ActivityStatus == ActivityStatusEnum.Failed)) || (activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Case && activityDetailedItemViewModel.Complete))
230230
{
231231
return true;
232232
}
@@ -241,7 +241,7 @@ public static bool CanShowScore(this ActivityDetailedItemViewModel activityDetai
241241
/// <returns>The <see cref="bool"/>bool.</returns>
242242
public static bool CanViewPercentage(this ActivityDetailedItemViewModel activityDetailedItemViewModel)
243243
{
244-
if (((activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Video || activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Audio) && activityDetailedItemViewModel.ActivityStatus == ActivityStatusEnum.InProgress) || (activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Assessment && activityDetailedItemViewModel.Complete == false))
244+
if (((activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Video || activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Audio) && activityDetailedItemViewModel.ActivityStatus == ActivityStatusEnum.InProgress) || (activityDetailedItemViewModel.ResourceType == ResourceTypeEnum.Assessment && activityDetailedItemViewModel.ActivityStatus == ActivityStatusEnum.InProgress))
245245
{
246246
return true;
247247
}

LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute-resource/ContributeBlock.vue

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
:characterLimit="60"
3131
:isH3="true"></EditSaveFieldWithCharacterCount>
3232
<h3 class="my-0"
33-
v-else>{{ block.title }}</h3>
33+
v-else>
34+
{{ block.title }}
35+
</h3>
3436
<Tick :complete="block.isReadyToPublish()"
3537
class="pl-10"></Tick>
3638
</div>
@@ -50,7 +52,8 @@
5052
ariaLabel="Move section down"
5153
class="contribute-block-component-button"></IconButton>
5254
</div>
53-
<IconButton v-if="!canBeDuplicated"
55+
<IconButton v-if="!canBeDuplicated && !contributeResourceAVFlag && block.blockType === BlockTypeEnum.Media"></IconButton>
56+
<IconButton v-else
5457
@click="duplicateBlock"
5558
iconClasses="fa-regular fa-clone"
5659
ariaLabel="Duplicate section"
@@ -131,6 +134,7 @@
131134
import ContributeImageCarouselBlock from "./ContributeImageCarouselBlock.vue";
132135
import { QuestionBlockModel } from "../models/contribute-resource/blocks/questionBlockModel";
133136
import { EventBus } from './contributeResourceEvents';
137+
import { resourceData } from '../data/resource';
134138
135139
export default Vue.extend({
136140
components: {
@@ -162,10 +166,12 @@
162166
discardBlockModalOpen: false,
163167
BlockTypeEnum: BlockTypeEnum,
164168
isOpen: true,
169+
contributeResourceAVFlag: true
165170
};
166171
},
167172
created() {
168173
this.isOpen = true;
174+
this.getContributeResAVResourceFlag();
169175
},
170176
watch: {
171177
isOpen(newVal, oldVal) {
@@ -180,6 +186,11 @@
180186
event.target.blur();
181187
event.target.parentElement.blur();
182188
this.$emit('duplicate');
189+
},
190+
getContributeResAVResourceFlag() {
191+
resourceData.getContributeAVResourceFlag().then(response => {
192+
this.contributeResourceAVFlag = response;
193+
});
183194
}
184195
}
185196
});

LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute-resource/ContributeCaseOrAssessmentContent.vue

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
<div class="contribute-case-component lh-padding-fluid">
33
<div class="lh-container-xl py-15">
44
<div class="py-10 text-center placeholder-text"
5-
v-if="!hasContentOnPage">You have not added any content to this page yet
5+
v-if="!hasContentOnPage">
6+
You have not added any content to this page yet
67
</div>
78
<template v-else>
8-
<FilteredBlockCollectionView
9-
:resourceType="resourceType"
10-
:blockCollection="blockCollection"
11-
:selection="blockCollection => blockCollection.getBlocksByPage(page).filter(block => block.blockType !== BlockTypeEnum.Question)"
12-
:can-be-duplicated="duplicatingBlocks"
13-
:blocksToDuplicate="blocksToDuplicate"
14-
@annotateWholeSlideImage="showSlideWithAnnotations"
15-
@duplicateBlock="blockId => $emit('duplicateBlock', blockId)"/>
9+
<FilteredBlockCollectionView :resourceType="resourceType"
10+
:blockCollection="blockCollection"
11+
:selection="blockCollection => blockCollection.getBlocksByPage(page).filter(block => block.blockType !== BlockTypeEnum.Question)"
12+
:can-be-duplicated="duplicatingBlocks"
13+
:blocksToDuplicate="blocksToDuplicate"
14+
@annotateWholeSlideImage="showSlideWithAnnotations"
15+
@duplicateBlock="blockId => $emit('duplicateBlock', blockId)" />
1616
</template>
1717

1818
<ContributeAddContentBlock @add="choosingNewContentBlock = true"></ContributeAddContentBlock>
@@ -25,13 +25,19 @@
2525
ref="addMediaInput"
2626
multiple
2727
@change="uploadNewMediaFiles"
28-
class="visually-hidden"/>
28+
class="visually-hidden" />
29+
30+
<Modal v-if="avUnavailableMessage">
31+
<div v-html="audioVideoUnavailableView"></div>
32+
<button type="button" class="nhsuk-button nhsuk-button--secondary mt-2 col-4 col-sm-3 col-md-2" @click="cancelAVUnavailModal">Cancel</button>
33+
</Modal>
2934
</div>
3035
</div>
3136
</template>
3237

3338
<script lang="ts">
3439
import Vue, { PropOptions } from 'vue';
40+
import { resourceData } from '../data/resource';
3541
import ContributeBlock from './ContributeBlock.vue';
3642
import ContributeAddContentBlock from './ContributeAddContentBlock.vue';
3743
import ContributeChooseContentBlockType from './ContributeChooseContentBlockType.vue';
@@ -40,11 +46,14 @@
4046
import {
4147
FileUploadType,
4248
getAllowedFileExtensionsInAcceptFormat,
43-
startUploadsFromFileElement
49+
startUploadsFromFileElement,
50+
getMediaTypeFromFileExtension
4451
} from '../helpers/fileUpload';
4552
import FilteredBlockCollectionView from './components/questions/FilteredBlockCollectionView.vue';
4653
import { WholeSlideImageModel } from "../models/contribute-resource/blocks/wholeSlideImageModel";
4754
import { ResourceType } from "../constants";
55+
import { MediaTypeEnum } from '../models/contribute-resource/blocks/mediaTypeEnum';
56+
import Modal from '../globalcomponents/Modal.vue';
4857
4958
export default Vue.extend({
5059
props: {
@@ -59,16 +68,25 @@
5968
ContributeAddContentBlock,
6069
ContributeChooseContentBlockType,
6170
FilteredBlockCollectionView,
71+
Modal,
6272
},
6373
data() {
6474
return {
6575
choosingNewContentBlock: false,
6676
BlockTypeEnum,
77+
contributeResourceAVFlag: true,
78+
avUnavailableMessage: false
6779
};
6880
},
81+
created() {
82+
this.getContributeResAVResourceFlag();
83+
},
6984
computed: {
7085
hasContentOnPage(): boolean {
7186
return this.blockCollection?.getBlocksByPage(this.page)?.filter(block => block.blockType !== BlockTypeEnum.Question).length > 0;
87+
},
88+
audioVideoUnavailableView(): string {
89+
return this.$store.state.getAVUnavailableView;
7290
}
7391
},
7492
methods: {
@@ -90,14 +108,42 @@
90108
}
91109
},
92110
async uploadNewMediaFiles(event: any): Promise<void> {
93-
startUploadsFromFileElement(
94-
event.target as HTMLInputElement,
95-
(fileId, mediaType) => this.blockCollection.addMediaBlock(fileId, mediaType, this.page)
96-
);
111+
var targetItem = event.target as HTMLInputElement;
112+
var startUpload = true;
113+
114+
if (targetItem.value !== '') {
115+
for (let i = 0; i < targetItem.files.length; i++) {
116+
const file = targetItem.files[i] as File;
117+
const fileExtension = file.name.split('.').pop();
118+
const mediaType = getMediaTypeFromFileExtension(`.${fileExtension}`);
119+
120+
if (!this.contributeResourceAVFlag && (mediaType === MediaTypeEnum.Video)) {
121+
startUpload = false;
122+
this.avUnavailableMessage = true;
123+
}
124+
else { startUpload = true; }
125+
}
126+
}
127+
128+
if (startUpload) {
129+
startUploadsFromFileElement(
130+
event.target as HTMLInputElement,
131+
(fileId, mediaType) => this.blockCollection.addMediaBlock(fileId, mediaType, this.page)
132+
);
133+
}
134+
targetItem.value = '';
97135
},
98136
showSlideWithAnnotations(wholeSlideImageToShow: WholeSlideImageModel) {
99137
this.$emit('annotateWholeSlideImage', wholeSlideImageToShow, false);
100138
},
139+
cancelAVUnavailModal() {
140+
this.avUnavailableMessage = false;
141+
},
142+
getContributeResAVResourceFlag() {
143+
resourceData.getContributeAVResourceFlag().then(response => {
144+
this.contributeResourceAVFlag = response;
145+
});
146+
}
101147
},
102148
});
103149
</script>

LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute-resource/SelectResourceType.vue

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,19 @@
66
<div class="mx-5">
77
<h3 class="nhsuk-heading-l nhsuk-u-margin-bottom-2">{{title}}</h3>
88
<div>{{description}}</div>
9-
<div v-if="!contributeResourceAVFlag && title === 'File' && !isSelected" class="align-self-center">
10-
<div v-html="audioVideoUnavailableView"></div>
11-
</div>
12-
</div>
13-
<div v-if="isSelected" class="align-self-center select_resource_type_component_tick_wrapper">
14-
<Tick class="select_resource_type_component_tick" complete></Tick>
159
</div>
1610
<div v-if="!isSelected" class="align-self-center">
1711
<Button v-on:click="onSelectClick">Select</Button>
1812
</div>
13+
<div v-if="isSelected" class="align-self-center select_resource_type_component_tick_wrapper">
14+
<Tick class="select_resource_type_component_tick" complete></Tick>
15+
</div>
1916
</div>
2017
</template>
2118

2219
<script lang="ts">
2320
import Vue, { PropOptions } from 'vue';
2421
import { commonlib } from '../common';
25-
import { resourceData } from '../data/resource';
2622
import Button from '../globalcomponents/Button.vue';
2723
import Tick from '../globalcomponents/Tick.vue';
2824
import { ResourceType } from '../constants';
@@ -37,14 +33,6 @@
3733
resourceType: { type: Number } as PropOptions<ResourceType>,
3834
resourceDetails: { type: Object } as PropOptions<ContributeResourceDetailModel>,
3935
},
40-
data() {
41-
return {
42-
contributeResourceAVFlag: true
43-
};
44-
},
45-
created() {
46-
this.getContributeResAVResourceFlag();
47-
},
4836
computed: {
4937
title(): String {
5038
return commonlib.getResourceTypeText(this.resourceType);
@@ -57,17 +45,9 @@
5745
},
5846
isSelected(): boolean {
5947
return this.resourceDetails.resourceType === this.resourceType;
60-
},
61-
audioVideoUnavailableView(): string {
62-
return this.$store.state.getAVUnavailableView;
6348
}
6449
},
6550
methods: {
66-
getContributeResAVResourceFlag() {
67-
resourceData.getContributeAVResourceFlag().then(response => {
68-
this.contributeResourceAVFlag = response;
69-
});
70-
},
7151
getResourceTypeDescription(resourceType: ResourceType): string {
7252
switch (resourceType) {
7353
case ResourceType.ARTICLE:

LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute-resource/SelectResourceTypeContainer.vue

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
<div class="lh-padding-fluid">
33
<div class="lh-container-xl">
44
<h2 id="title-label" class="nhsuk-heading-l">Select a resource type</h2>
5+
<div v-if="!contributeResourceAVFlag" class="align-self-center">
6+
<div v-html="audioVideoUnavailableView"></div>
7+
</div>
58
<SelectResourceType :resourceType="resourceType.GENERICFILE" v-bind:resourceDetails="resourceDetails"></SelectResourceType>
69
<SelectResourceType :resourceType="resourceType.WEBLINK" v-bind:resourceDetails="resourceDetails"></SelectResourceType>
710
<SelectResourceType :resourceType="resourceType.ARTICLE" v-bind:resourceDetails="resourceDetails"></SelectResourceType>
@@ -18,6 +21,7 @@
1821
import SelectResourceType from './SelectResourceType.vue';
1922
import { ResourceType } from '../constants';
2023
import { ContributeResourceDetailModel } from '../models/contribute/contributeResourceModel';
24+
import { resourceData } from '../data/resource';
2125
2226
export default Vue.extend({
2327
props: {
@@ -28,8 +32,24 @@
2832
},
2933
data() {
3034
return {
31-
resourceType: ResourceType
35+
resourceType: ResourceType,
36+
contributeResourceAVFlag: true
3237
}
38+
},
39+
created() {
40+
this.getContributeResAVResourceFlag();
41+
},
42+
computed: {
43+
audioVideoUnavailableView(): string {
44+
return this.$store.state.getAVUnavailableView;
45+
}
46+
},
47+
methods: {
48+
getContributeResAVResourceFlag() {
49+
resourceData.getContributeAVResourceFlag().then(response => {
50+
this.contributeResourceAVFlag = response;
51+
});
52+
},
3353
}
3454
});
3555
</script>

LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute-resource/components/content-tab/ChooseContentBlockOption.vue

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
<template>
22
<div class="contribute-add-content-block-component-option">
33
<div class="contribute-add-content-block-component-option--icon">
4-
<img v-bind:src="imgSrc" class="flexible-image"/>
4+
<img v-bind:src="imgSrc" class="flexible-image" />
55
</div>
66
<div class="contribute-add-content-block-component-option--description">
77
<h5>{{blockTypeName}}</h5>
88
<p>{{blockDescription}}</p>
9+
<div v-if="!contributeResourceAVFlag && blockTypeName === 'Media'">
10+
<div v-html="audioVideoUnavailableView"></div>
11+
</div>
912
</div>
1013
<Button v-on:click="$emit('choose')">Select</Button>
1114
</div>
1215
</template>
1316

1417
<script lang="ts">
1518
import Vue, { PropOptions } from 'vue';
19+
import { resourceData } from '../../../data/resource';
1620
1721
import Button from "../../../globalcomponents/Button.vue";
1822
@@ -27,6 +31,26 @@
2731
blockTypeName: String,
2832
blockDescription: String,
2933
},
34+
data() {
35+
return {
36+
contributeResourceAVFlag: true
37+
}
38+
},
39+
created() {
40+
this.getContributeResAVResourceFlag();
41+
},
42+
computed: {
43+
audioVideoUnavailableView(): string {
44+
return this.$store.state.getAVUnavailableView;
45+
},
46+
},
47+
methods: {
48+
getContributeResAVResourceFlag() {
49+
resourceData.getContributeAVResourceFlag().then(response => {
50+
this.contributeResourceAVFlag = response;
51+
});
52+
}
53+
}
3054
})
3155
</script>
3256

0 commit comments

Comments
 (0)