commit
c09d3e0e01
|
@ -1,11 +1,22 @@
|
||||||
name: Release
|
name: Release
|
||||||
|
|
||||||
on: workflow_dispatch
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
release_type:
|
||||||
|
description: 'Final release or beta'
|
||||||
|
required: true
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- final
|
||||||
|
- beta
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
if: github.repository == 'moodlemobile/moodleapp'
|
if: github.repository == 'moodlemobile/moodleapp'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
RELEASE_TYPE: ${{ github.event.inputs.release_type || 'final' }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
@ -20,4 +31,4 @@ jobs:
|
||||||
- name: Create release tags
|
- name: Create release tags
|
||||||
env:
|
env:
|
||||||
GIT_TOKEN: ${{ secrets.GIT_TOKEN }}
|
GIT_TOKEN: ${{ secrets.GIT_TOKEN }}
|
||||||
run: ./.github/scripts/release.sh
|
run: ./.github/scripts/release.sh $RELEASE_TYPE
|
||||||
|
|
|
@ -13,15 +13,15 @@
|
||||||
[hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()">
|
[hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()">
|
||||||
</core-course-module-info>
|
</core-course-module-info>
|
||||||
|
|
||||||
<ion-card *ngIf="phases">
|
<ion-card *ngIf="phases && workshop">
|
||||||
<ion-item button (click)="viewPhaseInfo()" detail="true">
|
<ion-item button (click)="viewPhaseInfo()" detail="true">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2 class="ion-text-wrap">{{ phases[workshop!.phase].title }}</h2>
|
<h2 class="ion-text-wrap">{{ phases[workshop.phase].title }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ng-container *ngIf="phases && phases[workshop!.phase] && phases[workshop!.phase].tasks &&
|
<ng-container *ngIf="phases && phases[workshop.phase] && phases[workshop.phase].tasks &&
|
||||||
phases[workshop!.phase].tasks.length">
|
phases[workshop.phase].tasks.length">
|
||||||
<ion-item button class="ion-text-wrap" *ngFor="let task of phases[workshop!.phase].tasks"
|
<ion-item button class="ion-text-wrap" *ngFor="let task of phases[workshop.phase].tasks"
|
||||||
[class.item-dimmed]="task.code == 'submit' && !showSubmit" (click)="runTask(task)" detail="false">
|
[class.item-dimmed]="task.code == 'submit' && !showSubmit" (click)="runTask(task)" detail="false">
|
||||||
<ion-icon slot="start" name="far-circle" *ngIf="task.completed == null"
|
<ion-icon slot="start" name="far-circle" *ngIf="task.completed == null"
|
||||||
[attr.aria-label]="'addon.mod_workshop.tasktodo' | translate"></ion-icon>
|
[attr.aria-label]="'addon.mod_workshop.tasktodo' | translate"></ion-icon>
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<!-- Description (setup phase only) -->
|
<!-- Description (setup phase only) -->
|
||||||
<ion-card *ngIf="description && workshop && workshop!.phase == PHASE_SETUP">
|
<ion-card *ngIf="description && workshop && workshop.phase == PHASE_SETUP">
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h3 class="item-heading">{{ 'core.description' | translate }}</h3>
|
<h3 class="item-heading">{{ 'core.description' | translate }}</h3>
|
||||||
|
@ -56,14 +56,14 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<div *ngIf="access && workshop && workshop!.phase >= PHASE_SUBMISSION">
|
<div *ngIf="access && workshop && workshop.phase >= PHASE_SUBMISSION">
|
||||||
<!-- CLOSED PHASE -->
|
<!-- CLOSED PHASE -->
|
||||||
<ng-container *ngIf="workshop!.phase >= PHASE_CLOSED">
|
<ng-container *ngIf="workshop.phase >= PHASE_CLOSED">
|
||||||
<ion-card *ngIf="workshop!.conclusion">
|
<ion-card *ngIf="workshop.conclusion">
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h3 class="item-heading">{{ 'addon.mod_workshop.conclusion' | translate }}</h3>
|
<h3 class="item-heading">{{ 'addon.mod_workshop.conclusion' | translate }}</h3>
|
||||||
<core-format-text collapsible-item [component]="component" [componentId]="module.id" [text]="workshop!.conclusion"
|
<core-format-text collapsible-item [component]="component" [componentId]="module.id" [text]="workshop.conclusion"
|
||||||
contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -92,11 +92,11 @@
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- SUBMISSION PHASE -->
|
<!-- SUBMISSION PHASE -->
|
||||||
<ion-card *ngIf="workshop!.phase == PHASE_SUBMISSION && workshop!.instructauthors">
|
<ion-card *ngIf="workshop.phase == PHASE_SUBMISSION && workshop.instructauthors">
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h3 class="item-heading">{{ 'addon.mod_workshop.areainstructauthors' | translate }}</h3>
|
<h3 class="item-heading">{{ 'addon.mod_workshop.areainstructauthors' | translate }}</h3>
|
||||||
<core-format-text collapsible-item [component]="component" [componentId]="module.id" [text]="workshop!.instructauthors"
|
<core-format-text collapsible-item [component]="component" [componentId]="module.id" [text]="workshop.instructauthors"
|
||||||
contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -106,10 +106,10 @@
|
||||||
<ion-card *ngIf="canSubmit">
|
<ion-card *ngIf="canSubmit">
|
||||||
<ion-item-divider class="ion-text-wrap">
|
<ion-item-divider class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h3 class="item-heading" *ngIf="workshop!.phase != PHASE_CLOSED || !submission">
|
<h3 class="item-heading" *ngIf="workshop.phase != PHASE_CLOSED || !submission">
|
||||||
{{ 'addon.mod_workshop.yoursubmission' | translate }}
|
{{ 'addon.mod_workshop.yoursubmission' | translate }}
|
||||||
</h3>
|
</h3>
|
||||||
<h3 class="item-heading" *ngIf="workshop!.phase == PHASE_CLOSED && submission">
|
<h3 class="item-heading" *ngIf="workshop.phase == PHASE_CLOSED && submission">
|
||||||
{{ 'addon.mod_workshop.yoursubmissionwithassessments' | translate }}
|
{{ 'addon.mod_workshop.yoursubmissionwithassessments' | translate }}
|
||||||
</h3>
|
</h3>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -119,13 +119,13 @@
|
||||||
<p *ngIf="!submission">{{ 'addon.mod_workshop.noyoursubmission' | translate }}</p>
|
<p *ngIf="!submission">{{ 'addon.mod_workshop.noyoursubmission' | translate }}</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<addon-mod-workshop-submission *ngIf="submission" [submission]="submission" [courseId]="workshop!.course" [module]="module"
|
<addon-mod-workshop-submission *ngIf="submission" [submission]="submission" [courseId]="workshop.course" [module]="module"
|
||||||
[workshop]="workshop" [access]="access">
|
[workshop]="workshop" [access]="access">
|
||||||
</addon-mod-workshop-submission>
|
</addon-mod-workshop-submission>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
|
|
||||||
<ng-container *ngIf="workshop!.phase >= PHASE_CLOSED">
|
<ng-container *ngIf="workshop.phase >= PHASE_CLOSED">
|
||||||
<ion-card *ngIf="publishedSubmissions && publishedSubmissions.length">
|
<ion-card *ngIf="publishedSubmissions && publishedSubmissions.length">
|
||||||
<ion-item-divider class="ion-text-wrap">
|
<ion-item-divider class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
@ -133,7 +133,7 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ng-container *ngFor="let submission of publishedSubmissions">
|
<ng-container *ngFor="let submission of publishedSubmissions">
|
||||||
<addon-mod-workshop-submission [submission]="submission" [courseId]="workshop!.course" [module]="module"
|
<addon-mod-workshop-submission [submission]="submission" [courseId]="workshop.course" [module]="module"
|
||||||
[workshop]="workshop" [access]="access" summary="true" class="core-as-item">
|
[workshop]="workshop" [access]="access" summary="true" class="core-as-item">
|
||||||
</addon-mod-workshop-submission>
|
</addon-mod-workshop-submission>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@ -141,14 +141,13 @@
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- ASSESSMENT PHASE -->
|
<!-- ASSESSMENT PHASE -->
|
||||||
<ng-container *ngIf="workshop!.phase >= PHASE_ASSESSMENT">
|
<ng-container *ngIf="workshop.phase >= PHASE_ASSESSMENT">
|
||||||
<ion-card *ngIf="workshop!.phase == PHASE_ASSESSMENT && workshop!.instructreviewers">
|
<ion-card *ngIf="workshop.phase == PHASE_ASSESSMENT && workshop.instructreviewers">
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h3 class="item-heading">{{ 'addon.mod_workshop.areainstructreviewers' | translate }}</h3>
|
<h3 class="item-heading">{{ 'addon.mod_workshop.areainstructreviewers' | translate }}</h3>
|
||||||
<core-format-text collapsible-item [component]="component" [componentId]="module.id"
|
<core-format-text collapsible-item [component]="component" [componentId]="module.id"
|
||||||
[text]="workshop!.instructreviewers" contextLevel="module" [contextInstanceId]="module.id"
|
[text]="workshop.instructreviewers" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -167,7 +166,7 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ng-container *ngFor="let assessment of (assessments || [])">
|
<ng-container *ngFor="let assessment of (assessments || [])">
|
||||||
<addon-mod-workshop-submission [submission]="assessment.submission" [assessment]="assessment"
|
<addon-mod-workshop-submission [submission]="assessment.submission" [assessment]="assessment"
|
||||||
[courseId]="workshop!.course" [module]="module" [workshop]="workshop" [access]="access" summary="true"
|
[courseId]="workshop.course" [module]="module" [workshop]="workshop" [access]="access" summary="true"
|
||||||
class="core-as-item">
|
class="core-as-item">
|
||||||
</addon-mod-workshop-submission>
|
</addon-mod-workshop-submission>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@ -175,13 +174,13 @@
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- MULTIPLE PHASES SUBMISSION OR GREATER only teachers -->
|
<!-- MULTIPLE PHASES SUBMISSION OR GREATER only teachers -->
|
||||||
<ion-card *ngIf="access.canviewallsubmissions && workshop!.phase >= PHASE_SUBMISSION &&
|
<ion-card *ngIf="access.canviewallsubmissions && workshop.phase >= PHASE_SUBMISSION &&
|
||||||
((grades && grades.length) || (groupInfo && (groupInfo.separateGroups || groupInfo.visibleGroups)))">
|
((grades && grades.length) || (groupInfo && (groupInfo.separateGroups || groupInfo.visibleGroups)))">
|
||||||
<ion-item-divider class="ion-text-wrap">
|
<ion-item-divider class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h3 class="item-heading" *ngIf="workshop!.phase == PHASE_SUBMISSION">{{ 'addon.mod_workshop.submissionsreport' |
|
<h3 class="item-heading" *ngIf="workshop.phase == PHASE_SUBMISSION">{{ 'addon.mod_workshop.submissionsreport' |
|
||||||
translate }}</h3>
|
translate }}</h3>
|
||||||
<h3 class="item-heading" *ngIf="workshop!.phase > PHASE_SUBMISSION">{{ 'addon.mod_workshop.gradesreport' | translate }}
|
<h3 class="item-heading" *ngIf="workshop.phase > PHASE_SUBMISSION">{{ 'addon.mod_workshop.gradesreport' | translate }}
|
||||||
</h3>
|
</h3>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
|
@ -189,7 +188,7 @@
|
||||||
</core-group-selector>
|
</core-group-selector>
|
||||||
|
|
||||||
<ng-container *ngFor="let submission of grades">
|
<ng-container *ngFor="let submission of grades">
|
||||||
<addon-mod-workshop-submission [submission]="submission" [courseId]="workshop!.course" [module]="module"
|
<addon-mod-workshop-submission [submission]="submission" [courseId]="workshop.course" [module]="module"
|
||||||
[workshop]="workshop" [access]="access" summary="true" class="core-as-item">
|
[workshop]="workshop" [access]="access" summary="true" class="core-as-item">
|
||||||
</addon-mod-workshop-submission>
|
</addon-mod-workshop-submission>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@ -197,13 +196,13 @@
|
||||||
<ion-grid *ngIf="page > 0 || hasNextPage">
|
<ion-grid *ngIf="page > 0 || hasNextPage">
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col *ngIf="page > 0">
|
<ion-col *ngIf="page > 0">
|
||||||
<ion-button expand="block" fill="outline" (click)="gotoSubmissionsPage(page! -1)">
|
<ion-button expand="block" fill="outline" (click)="gotoSubmissionsPage(page -1)">
|
||||||
<ion-icon name="fas-chevron-left" slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-chevron-left" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'core.previous' | translate }}
|
{{ 'core.previous' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col *ngIf="hasNextPage">
|
<ion-col *ngIf="hasNextPage">
|
||||||
<ion-button expand="block" (click)="gotoSubmissionsPage(page! + 1)">
|
<ion-button expand="block" (click)="gotoSubmissionsPage(page + 1)">
|
||||||
{{ 'core.next' | translate }}
|
{{ 'core.next' | translate }}
|
||||||
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
|
@ -291,13 +291,13 @@ export class AddonModWorkshopIndexComponent extends CoreCourseModuleMainActivity
|
||||||
|
|
||||||
await Promise.all(grades.map(async (grade) => {
|
await Promise.all(grades.map(async (grade) => {
|
||||||
const submission: AddonModWorkshopSubmissionDataWithOfflineData = {
|
const submission: AddonModWorkshopSubmissionDataWithOfflineData = {
|
||||||
id: grade.submissionid,
|
id: grade.submissionid || 0,
|
||||||
workshopid: workshop.id,
|
workshopid: workshop.id,
|
||||||
example: false,
|
example: false,
|
||||||
authorid: grade.userid,
|
authorid: grade.userid,
|
||||||
timecreated: grade.submissionmodified,
|
timecreated: grade.submissionmodified || 0,
|
||||||
timemodified: grade.submissionmodified,
|
timemodified: grade.submissionmodified || 0,
|
||||||
title: grade.submissiontitle,
|
title: grade.submissiontitle || '',
|
||||||
content: '',
|
content: '',
|
||||||
contenttrust: 0,
|
contenttrust: 0,
|
||||||
attachment: 0,
|
attachment: 0,
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<core-user-avatar [user]="profile" [courseId]="courseId" [userId]="profile?.id" slot="start">
|
<core-user-avatar [user]="profile" [courseId]="courseId" [userId]="profile?.id" slot="start">
|
||||||
</core-user-avatar>
|
</core-user-avatar>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>
|
<h2 *ngIf="submission.title">
|
||||||
<core-format-text [text]="submission.title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
<core-format-text [text]="submission.title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h2>
|
</h2>
|
||||||
|
@ -68,7 +68,7 @@
|
||||||
<core-user-avatar [user]="profile" slot="start" [courseId]="courseId" [userId]="profile?.id">
|
<core-user-avatar [user]="profile" slot="start" [courseId]="courseId" [userId]="profile?.id">
|
||||||
</core-user-avatar>
|
</core-user-avatar>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>
|
<h2 *ngIf="submission.title">
|
||||||
<core-format-text [text]="submission.title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
<core-format-text [text]="submission.title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h2>
|
</h2>
|
||||||
|
|
|
@ -1766,9 +1766,9 @@ export type AddonModWorkshoGradesReportData = {
|
||||||
|
|
||||||
export type AddonModWorkshopGradesData = {
|
export type AddonModWorkshopGradesData = {
|
||||||
userid: number; // The id of the user being displayed in the report.
|
userid: number; // The id of the user being displayed in the report.
|
||||||
submissionid: number; // Submission id.
|
submissionid?: number; // Submission id.
|
||||||
submissiontitle: string; // Submission title.
|
submissiontitle?: string; // Submission title.
|
||||||
submissionmodified: number; // Timestamp submission was updated.
|
submissionmodified?: number; // Timestamp submission was updated.
|
||||||
submissiongrade?: number; // Aggregated grade for the submission.
|
submissiongrade?: number; // Aggregated grade for the submission.
|
||||||
gradinggrade?: number; // Computed grade for the assessment.
|
gradinggrade?: number; // Computed grade for the assessment.
|
||||||
submissiongradeover?: number; // Grade for the assessment overrided by the teacher.
|
submissiongradeover?: number; // Grade for the assessment overrided by the teacher.
|
||||||
|
|
|
@ -26,13 +26,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.other {
|
|
||||||
img {
|
|
||||||
filter: var(--filter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
img {
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<ion-content class="limited-width">
|
<ion-content class="limited-width">
|
||||||
<core-loading [hideUntil]="loaded">
|
<core-loading [hideUntil]="loaded">
|
||||||
<ion-searchbar [(ngModel)]="textFilter" (ionInput)="filterChanged($event.target)" (ionCancel)="filterChanged($event.target)"
|
<ion-searchbar [(ngModel)]="textFilter" (ionInput)="filterChanged($event.target)" (ionCancel)="filterChanged($event.target)"
|
||||||
[placeholder]="'core.filter' | translate">
|
[placeholder]="'core.filter' | translate" class="ion-margin-top">
|
||||||
</ion-searchbar>
|
</ion-searchbar>
|
||||||
<ion-list>
|
<ion-list>
|
||||||
<ion-item button *ngIf="error" class="ion-text-wrap" [href]="licensesUrl" core-link auto-login="no" detail="false">
|
<ion-item button *ngIf="error" class="ion-text-wrap" [href]="licensesUrl" core-link auto-login="no" detail="false">
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
:host {
|
:host {
|
||||||
.core-user-profile-maininfo::part(native) {
|
.core-user-profile-maininfo {
|
||||||
flex-direction: column;
|
padding-top: 16px;
|
||||||
|
&::part(native) {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
core-user-avatar {
|
core-user-avatar {
|
||||||
--core-avatar-size: var(--core-large-avatar-size);
|
--core-avatar-size: var(--core-large-avatar-size);
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
@ -800,7 +800,7 @@ body.core-iframe-fullscreen ion-router-outlet {
|
||||||
|
|
||||||
.item.item-file {
|
.item.item-file {
|
||||||
ion-thumbnail {
|
ion-thumbnail {
|
||||||
--size: 24px;
|
--size: 32px;
|
||||||
width: var(--size);
|
width: var(--size);
|
||||||
height: var(--size);
|
height: var(--size);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue