Merge pull request #4177 from dpalou/MOBILE-4638
MOBILE-4638 question: Update correctness icons to match last LMS changesmain
commit
90a356f852
|
@ -19,9 +19,9 @@
|
|||
{{ row.accessibilityLabel }}
|
||||
</label>
|
||||
</div>
|
||||
<ion-icon *ngIf="row.isCorrect === 1" class="core-correct-icon" name="fas-check" color="success" slot="start"
|
||||
<ion-icon *ngIf="row.isCorrect === 1" class="core-correct-icon" [name]="correctIcon" color="success" slot="start"
|
||||
[attr.aria-label]="'core.question.correct' | translate" />
|
||||
<ion-icon *ngIf="row.isCorrect === 0" class="core-correct-icon" name="fas-xmark" color="danger" slot="start"
|
||||
<ion-icon *ngIf="row.isCorrect === 0" class="core-correct-icon" [name]="incorrectIcon" color="danger" slot="start"
|
||||
[attr.aria-label]="'core.question.incorrect' | translate" />
|
||||
<ion-select-option *ngFor="let option of row.options" [value]="option.value">
|
||||
{{option.label}}
|
||||
|
|
|
@ -25,9 +25,9 @@
|
|||
[contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
|
||||
</div>
|
||||
</div>
|
||||
<ion-icon *ngIf="option.isCorrect === 1" class="core-correct-icon" name="fas-check" color="success"
|
||||
<ion-icon *ngIf="option.isCorrect === 1" class="core-correct-icon" [name]="correctIcon" color="success"
|
||||
[attr.aria-label]="'core.question.correct' | translate" />
|
||||
<ion-icon *ngIf="option.isCorrect === 0" class="core-correct-icon" name="fas-xmark" color="danger"
|
||||
<ion-icon *ngIf="option.isCorrect === 0" class="core-correct-icon" [name]="incorrectIcon" color="danger"
|
||||
[attr.aria-label]="'core.question.incorrect' | translate" />
|
||||
</ion-checkbox>
|
||||
<div *ngIf="option.feedback" class="specificfeedback">
|
||||
|
@ -53,9 +53,9 @@
|
|||
[contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
|
||||
</div>
|
||||
</div>
|
||||
<ion-icon *ngIf="option.isCorrect === 1" class="core-correct-icon" name="fas-check" color="success"
|
||||
<ion-icon *ngIf="option.isCorrect === 1" class="core-correct-icon" [name]="correctIcon" color="success"
|
||||
[attr.aria-label]="'core.question.correct' | translate" />
|
||||
<ion-icon *ngIf="option.isCorrect === 0" class="core-correct-icon" name="fas-xmark" color="danger"
|
||||
<ion-icon *ngIf="option.isCorrect === 0" class="core-correct-icon" [name]="incorrectIcon" color="danger"
|
||||
[attr.aria-label]="'core.question.incorrect' | translate" />
|
||||
</ion-radio>
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
@if (item.correctClass === 'correct') {
|
||||
<ion-icon [name]="correctIcon" slot="start" [ariaLabel]="'core.question.correct' | translate" color="success" />
|
||||
} @else if (item.correctClass === 'incorrect') {
|
||||
<ion-icon name="fas-xmark" slot="start" [ariaLabel]="'core.question.incorrect' | translate" color="danger" />
|
||||
<ion-icon [name]="incorrectIcon" slot="start" [ariaLabel]="'core.question.incorrect' | translate" color="danger" />
|
||||
} @else if (item.correctClass.startsWith('partial')) {
|
||||
<ion-icon [name]="partialCorrectIcon" slot="start" [ariaLabel]="'core.question.partiallycorrect' | translate"
|
||||
color="warning" />
|
||||
|
|
|
@ -39,9 +39,6 @@ export class AddonQtypeOrderingComponent extends CoreQuestionBaseComponent<Addon
|
|||
value: '',
|
||||
};
|
||||
|
||||
correctIcon = '';
|
||||
partialCorrectIcon = '';
|
||||
|
||||
constructor(elementRef: ElementRef) {
|
||||
super('AddonQtypeOrderingComponent', elementRef);
|
||||
}
|
||||
|
@ -59,9 +56,6 @@ export class AddonQtypeOrderingComponent extends CoreQuestionBaseComponent<Addon
|
|||
return;
|
||||
}
|
||||
|
||||
this.correctIcon = CoreQuestionHelper.getCorrectIcon();
|
||||
this.partialCorrectIcon = CoreQuestionHelper.getPartiallyCorrectIcon();
|
||||
|
||||
// Replace Moodle's feedback classes with our own.
|
||||
CoreQuestionHelper.replaceFeedbackClasses(questionElement);
|
||||
|
||||
|
@ -81,7 +75,8 @@ export class AddonQtypeOrderingComponent extends CoreQuestionBaseComponent<Addon
|
|||
// Remove correctness icons from the content.
|
||||
const itemContentEl = element.querySelector<HTMLElement>('[data-itemcontent]');
|
||||
itemContentEl?.querySelector(
|
||||
'.icon.fa-check, .icon.fa-remove, .icon.fa-check-square, .icon.fa-check-double, .icon.fa-xmark',
|
||||
'.icon.fa-check, .icon.fa-remove, .icon.fa-check-square, .icon.fa-circle-check, .icon.fa-xmark, ' +
|
||||
'.icon.fa-circle-xmark, .icon.fa-square-check, .icon.circle-half-stroke',
|
||||
)?.remove();
|
||||
|
||||
return {
|
||||
|
|
|
@ -48,6 +48,10 @@ export class CoreQuestionBaseComponent<T extends AddonModQuizQuestion = AddonMod
|
|||
@Output() buttonClicked = new EventEmitter<CoreQuestionBehaviourButton>(); // Will emit when a behaviour button is clicked.
|
||||
@Output() onAbort = new EventEmitter<void>(); // Should emit an event if the question should be aborted.
|
||||
|
||||
correctIcon = '';
|
||||
incorrectIcon = '';
|
||||
partialCorrectIcon = '';
|
||||
|
||||
protected logger: CoreLogger;
|
||||
protected hostElement: HTMLElement;
|
||||
|
||||
|
@ -60,6 +64,10 @@ export class CoreQuestionBaseComponent<T extends AddonModQuizQuestion = AddonMod
|
|||
* @inheritdoc
|
||||
*/
|
||||
ngOnInit(): void {
|
||||
this.correctIcon = CoreQuestionHelper.getCorrectIcon().fullName;
|
||||
this.incorrectIcon = CoreQuestionHelper.getIncorrectIcon().fullName;
|
||||
this.partialCorrectIcon = CoreQuestionHelper.getPartiallyCorrectIcon().fullName;
|
||||
|
||||
if (!this.question) {
|
||||
this.logger.warn('Aborting because of no question received.');
|
||||
|
||||
|
@ -492,17 +500,17 @@ export class CoreQuestionBaseComponent<T extends AddonModQuizQuestion = AddonMod
|
|||
// Check if question is marked as correct.
|
||||
if (input.classList.contains('incorrect')) {
|
||||
question.input.correctClass = 'core-question-incorrect';
|
||||
question.input.correctIcon = 'fas-xmark';
|
||||
question.input.correctIcon = this.incorrectIcon;
|
||||
question.input.correctIconColor = CoreIonicColorNames.DANGER;
|
||||
question.input.correctIconLabel = 'core.question.incorrect';
|
||||
} else if (input.classList.contains('correct')) {
|
||||
question.input.correctClass = 'core-question-correct';
|
||||
question.input.correctIcon = CoreQuestionHelper.getCorrectIcon();
|
||||
question.input.correctIcon = this.correctIcon;
|
||||
question.input.correctIconColor = CoreIonicColorNames.SUCCESS;
|
||||
question.input.correctIconLabel = 'core.question.correct';
|
||||
} else if (input.classList.contains('partiallycorrect')) {
|
||||
question.input.correctClass = 'core-question-partiallycorrect';
|
||||
question.input.correctIcon = CoreQuestionHelper.getPartiallyCorrectIcon();
|
||||
question.input.correctIcon = this.partialCorrectIcon;
|
||||
question.input.correctIconColor = CoreIonicColorNames.WARNING;
|
||||
question.input.correctIconLabel = 'core.question.partiallycorrect';
|
||||
} else {
|
||||
|
|
|
@ -799,30 +799,71 @@ export class CoreQuestionHelperProvider {
|
|||
* Returns correct icon based on the LMS version.
|
||||
* In LMS 4.4 and older, fa-check means correct. In 4.5+, fa-check means partially correct.
|
||||
*
|
||||
* @param withPrefix Whether to include the prefix in the icon name.
|
||||
* @returns Icon name.
|
||||
* @returns Icon data.
|
||||
*/
|
||||
getCorrectIcon(withPrefix = true): string {
|
||||
const icon = CoreSites.getRequiredCurrentSite().isVersionGreaterEqualThan('4.5')
|
||||
? 'check-double'
|
||||
: 'check';
|
||||
getCorrectIcon(): IconData {
|
||||
if (CoreSites.getCurrentSite()?.isVersionGreaterEqualThan('4.5')) {
|
||||
return {
|
||||
name: 'circle-check',
|
||||
prefix: 'far',
|
||||
library: 'regular',
|
||||
fullName: 'far-circle-check',
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
name: 'check',
|
||||
prefix: 'fas',
|
||||
library: 'solid',
|
||||
fullName: 'fas-check',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return withPrefix ? `fas-${icon}` : icon;
|
||||
/**
|
||||
* Returns incorrect correct icon based on the LMS version.
|
||||
*
|
||||
* @returns Icon data.
|
||||
*/
|
||||
getIncorrectIcon(): IconData {
|
||||
if (CoreSites.getCurrentSite()?.isVersionGreaterEqualThan('4.5')) {
|
||||
return {
|
||||
name: 'circle-xmark',
|
||||
prefix: 'far',
|
||||
library: 'regular',
|
||||
fullName: 'far-circle-xmark',
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
name: 'xmark',
|
||||
prefix: 'fas',
|
||||
library: 'solid',
|
||||
fullName: 'fas-xmark',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns partially correct icon based on the LMS version.
|
||||
* In LMS 4.4 and older, fa-check means correct. In 4.5+, fa-check means partially correct.
|
||||
*
|
||||
* @param withPrefix Whether to include the prefix in the icon name.
|
||||
* @returns Icon name.
|
||||
* @returns Icon data.
|
||||
*/
|
||||
getPartiallyCorrectIcon(withPrefix = true): string {
|
||||
const icon = CoreSites.getRequiredCurrentSite().isVersionGreaterEqualThan('4.5')
|
||||
? 'check'
|
||||
: 'square-check';
|
||||
|
||||
return withPrefix ? `fas-${icon}` : icon;
|
||||
getPartiallyCorrectIcon(): IconData {
|
||||
if (CoreSites.getCurrentSite()?.isVersionGreaterEqualThan('4.5')) {
|
||||
return {
|
||||
name: 'circle-half-stroke',
|
||||
prefix: 'fas',
|
||||
library: 'solid',
|
||||
fullName: 'fas-circle-half-stroke',
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
name: 'square-check',
|
||||
prefix: 'fas',
|
||||
library: 'solid',
|
||||
fullName: 'fas-square-check',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -833,41 +874,42 @@ export class CoreQuestionHelperProvider {
|
|||
treatCorrectnessIcons(element: HTMLElement): void {
|
||||
const icons = <HTMLElement[]> Array.from(element.querySelectorAll('img.icon, img.questioncorrectnessicon, i.icon'));
|
||||
icons.forEach((icon) => {
|
||||
let iconName: string | undefined;
|
||||
let iconData: IconData | undefined;
|
||||
let color: string | undefined;
|
||||
|
||||
const correctIcon = this.getCorrectIcon(false);
|
||||
const partiallyCorrectIcon = this.getCorrectIcon(false);
|
||||
const correctIcon = this.getCorrectIcon();
|
||||
const incorrectIcon = this.getIncorrectIcon();
|
||||
const partiallyCorrectIcon = this.getPartiallyCorrectIcon();
|
||||
if ('src' in icon) {
|
||||
if ((icon as HTMLImageElement).src.indexOf('correct') >= 0) {
|
||||
iconName = correctIcon;
|
||||
iconData = correctIcon;
|
||||
color = CoreIonicColorNames.SUCCESS;
|
||||
} else if ((icon as HTMLImageElement).src.indexOf('incorrect') >= 0 ) {
|
||||
iconName = 'xmark';
|
||||
iconData = incorrectIcon;
|
||||
color = CoreIonicColorNames.DANGER;
|
||||
}
|
||||
} else {
|
||||
if (icon.classList.contains(`fa-${partiallyCorrectIcon}`)) {
|
||||
iconName = partiallyCorrectIcon;
|
||||
if (icon.classList.contains(`fa-${partiallyCorrectIcon.name}`)) {
|
||||
iconData = partiallyCorrectIcon;
|
||||
color = CoreIonicColorNames.WARNING;
|
||||
} else if (icon.classList.contains(`fa-${correctIcon}`)) {
|
||||
iconName = correctIcon;
|
||||
} else if (icon.classList.contains(`fa-${correctIcon.name}`)) {
|
||||
iconData = correctIcon;
|
||||
color = CoreIonicColorNames.SUCCESS;
|
||||
} else if (icon.classList.contains('fa-xmark') || icon.classList.contains('fa-remove')) {
|
||||
iconName = 'xmark';
|
||||
} else if (icon.classList.contains(`fa-${incorrectIcon.name}`) || icon.classList.contains('fa-remove')) {
|
||||
iconData = incorrectIcon;
|
||||
color = CoreIonicColorNames.DANGER;
|
||||
}
|
||||
}
|
||||
|
||||
if (!iconName) {
|
||||
if (!iconData) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Replace the icon with the font version.
|
||||
const newIcon: HTMLIonIconElement = document.createElement('ion-icon');
|
||||
|
||||
newIcon.setAttribute('name', `fas-${iconName}`);
|
||||
newIcon.setAttribute('src', CoreIcons.getIconSrc('font-awesome', 'solid', iconName));
|
||||
newIcon.setAttribute('name', iconData.fullName);
|
||||
newIcon.setAttribute('src', CoreIcons.getIconSrc('font-awesome', iconData.library, iconData.name));
|
||||
newIcon.className = `core-correct-icon ion-color ion-color-${color} questioncorrectnessicon`;
|
||||
newIcon.title = icon.title;
|
||||
newIcon.setAttribute('aria-label', icon.title);
|
||||
|
@ -997,3 +1039,13 @@ export type CoreQuestionBehaviourButton = {
|
|||
export type CoreQuestionBehaviourCertaintyOption = CoreQuestionBehaviourButton & {
|
||||
text: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* Data about a font-awesome icon.
|
||||
*/
|
||||
type IconData = {
|
||||
name: string;
|
||||
prefix: string;
|
||||
library: string;
|
||||
fullName: string;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue