commit
709070382e
11
.travis.yml
11
.travis.yml
|
@ -18,6 +18,7 @@ cache:
|
|||
- $HOME/.gradle/caches/
|
||||
- $HOME/.gradle/wrapper/
|
||||
- $HOME/.android/build-cache
|
||||
- $HOME/Library/Caches/Homebrew
|
||||
|
||||
before_install:
|
||||
- nvm install
|
||||
|
@ -34,8 +35,7 @@ script:
|
|||
|
||||
jobs:
|
||||
include:
|
||||
- stage: build
|
||||
name: "Build Android"
|
||||
- name: "Build Android"
|
||||
if: env(DEPLOY) = 1 OR (env(DEPLOY) = 2 AND tag IS NOT blank)
|
||||
language: android
|
||||
android:
|
||||
|
@ -63,13 +63,14 @@ jobs:
|
|||
- libsecret-1-dev
|
||||
- php5-cli
|
||||
- php5-common
|
||||
- stage: build
|
||||
name: "Build iOS"
|
||||
- name: "Build iOS"
|
||||
language: node_js
|
||||
if: env(BUILD_IOS) = 1 AND (env(DEPLOY) = 1 OR (env(DEPLOY) = 2 AND tag IS NOT blank))
|
||||
os: osx
|
||||
osx_image: xcode13.1
|
||||
osx_image: xcode14.2
|
||||
addons:
|
||||
homebrew:
|
||||
packages:
|
||||
- jq
|
||||
before_cache:
|
||||
- brew cleanup
|
||||
|
|
|
@ -764,7 +764,7 @@ class behat_app extends behat_app_helper {
|
|||
$result = $this->runtime_js("setField('$field', '$value')");
|
||||
|
||||
if ($result !== 'OK') {
|
||||
throw new DriverException('Error setting field - ' . $result);
|
||||
throw new DriverException('Error setting field "' . $field . '" - ' . $result);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
"sr-cr": "Српски",
|
||||
"sr-lt": "Srpski",
|
||||
"sv": "Svenska",
|
||||
"szl": "Ślōnski",
|
||||
"tg": "Тоҷикӣ",
|
||||
"tr": "Türkçe",
|
||||
"uk": "Українська",
|
||||
|
|
|
@ -1692,20 +1692,20 @@
|
|||
"core.downloading": "local_moodlemobileapp",
|
||||
"core.edit": "moodle",
|
||||
"core.editor.autosavesucceeded": "editor_atto",
|
||||
"core.editor.bold": "atto_bold/pluginname",
|
||||
"core.editor.bold": "editor",
|
||||
"core.editor.clear": "atto_clear/pluginname",
|
||||
"core.editor.h3": "atto_title",
|
||||
"core.editor.h4": "atto_title",
|
||||
"core.editor.h5": "atto_title",
|
||||
"core.editor.hidetoolbar": "local_moodlemobileapp",
|
||||
"core.editor.italic": "atto_italic/pluginname",
|
||||
"core.editor.orderedlist": "atto_orderedlist/pluginname",
|
||||
"core.editor.p": "atto_title",
|
||||
"core.editor.strike": "atto_strike/pluginname",
|
||||
"core.editor.italic": "editor",
|
||||
"core.editor.orderedlist": "editor",
|
||||
"core.editor.p": "editor_tinymce/advanced:paragraph",
|
||||
"core.editor.strikethrough": "editor",
|
||||
"core.editor.textrecovered": "editor_atto",
|
||||
"core.editor.toggle": "local_moodlemobileapp",
|
||||
"core.editor.underline": "atto_underline/pluginname",
|
||||
"core.editor.unorderedlist": "atto_unorderedlist/pluginname",
|
||||
"core.editor.underline": "editor",
|
||||
"core.editor.unorderedlist": "editor",
|
||||
"core.emptysplit": "local_moodlemobileapp",
|
||||
"core.endingtime": "local_moodlemobileapp",
|
||||
"core.endonesteptour": "tool_usertours",
|
||||
|
@ -2268,7 +2268,7 @@
|
|||
"core.reminders.atthetime": "local_moodlemobileapp",
|
||||
"core.reminders.custom": "local_moodlemobileapp",
|
||||
"core.reminders.customreminder": "local_moodlemobileapp",
|
||||
"core.reminders.delete": "moodle",
|
||||
"core.reminders.delete": "local_moodlemobileapp",
|
||||
"core.reminders.reminderset": "local_moodlemobileapp",
|
||||
"core.reminders.reminderunset": "local_moodlemobileapp",
|
||||
"core.reminders.setareminder": "local_moodlemobileapp",
|
||||
|
@ -2310,7 +2310,7 @@
|
|||
"core.selectagroup": "moodle",
|
||||
"core.send": "message",
|
||||
"core.sending": "chat",
|
||||
"core.serverconnection": "error",
|
||||
"core.serverconnection": "local_moodlemobileapp",
|
||||
"core.settings.about": "local_moodlemobileapp",
|
||||
"core.settings.accessstatement": "access",
|
||||
"core.settings.appsettings": "local_moodlemobileapp",
|
||||
|
|
|
@ -31,14 +31,6 @@
|
|||
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
||||
</ion-refresher>
|
||||
<core-loading [hideUntil]="eventLoaded">
|
||||
<!-- There is data to be synchronized -->
|
||||
<ion-card class="core-warning-card" *ngIf="hasOffline || (event && event.deleted)">
|
||||
<ion-item>
|
||||
<ion-icon name="fas-triangle-exclamation" slot="start" aria-hidden="true"></ion-icon>
|
||||
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'addon.calendar.calendarevent' | translate} }}</ion-label>
|
||||
</ion-item>
|
||||
</ion-card>
|
||||
|
||||
<ion-list *ngIf="event">
|
||||
<ion-item class="ion-text-wrap addon-calendar-event" collapsible [ngClass]="['addon-calendar-eventtype-'+event.eventtype]">
|
||||
<core-mod-icon *ngIf="event.moduleIcon" [modicon]="event.moduleIcon" [showAlt]="false" [modname]="event.modulename"
|
||||
|
@ -58,6 +50,13 @@
|
|||
</h1>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
<!-- There is data to be synchronized -->
|
||||
<ion-card class="core-warning-card" *ngIf="hasOffline || event.deleted">
|
||||
<ion-item>
|
||||
<ion-icon name="fas-triangle-exclamation" slot="start" aria-hidden="true"></ion-icon>
|
||||
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'addon.calendar.calendarevent' | translate} }}</ion-label>
|
||||
</ion-item>
|
||||
</ion-card>
|
||||
<ion-item class="ion-text-wrap">
|
||||
<ion-label>
|
||||
<p class="item-heading">{{ 'addon.calendar.when' | translate }}</p>
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
</ion-fab>
|
||||
</ion-content>
|
||||
<ion-footer class="footer-adjustable" *ngIf="loaded && (!conversationId || conversation)">
|
||||
<ion-toolbar [color]="footerType == 'message' ? 'contrast' : 'light'">
|
||||
<ion-toolbar [color]="footerType == 'message' ? null : 'light'">
|
||||
<p *ngIf="footerType == 'unable'" class="ion-text-center ion-margin-horizontal">
|
||||
{{ 'addon.messages.unabletomessage' | translate }}
|
||||
</p>
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
flex-shrink: 1;
|
||||
display: block;
|
||||
}
|
||||
|
||||
ion-icon {
|
||||
|
|
|
@ -10,12 +10,12 @@
|
|||
"view_groups_selection_warning": "There is a room for each group and you have access to more than one. Be sure to select the correct one.",
|
||||
"view_message_conference_in_progress": "The session is in progress.",
|
||||
"view_message_conference_room_ready": "This room is ready. You can join the session now.",
|
||||
"view_message_moderator": "moderator",
|
||||
"view_message_moderators": "moderators",
|
||||
"view_message_moderator": "Moderator",
|
||||
"view_message_moderators": "Moderators",
|
||||
"view_message_norecordings": "There are no recordings available.",
|
||||
"view_message_session_started_at": "This session started at",
|
||||
"view_message_viewer": "viewer",
|
||||
"view_message_viewers": "viewers",
|
||||
"view_message_session_started_at": "Session started at",
|
||||
"view_message_viewer": "Viewer",
|
||||
"view_message_viewers": "Viewers",
|
||||
"view_nojoin": "You do not have a role that is allowed to join this session.",
|
||||
"view_section_title_recordings": "Recordings"
|
||||
}
|
||||
|
|
|
@ -53,8 +53,8 @@ Feature: Test basic usage of BBB activity in app
|
|||
|
||||
Given I wait "10" seconds
|
||||
Then I should find "The session is in progress." in the app
|
||||
And I should find "1" near "viewer" in the app
|
||||
And I should find "0" near "moderator" in the app
|
||||
And I should find "1" near "Viewer" in the app
|
||||
And I should find "0" near "Moderator" in the app
|
||||
|
||||
Scenario: Join meeting (moderator)
|
||||
Given the following "activities" exist:
|
||||
|
@ -69,8 +69,8 @@ Feature: Test basic usage of BBB activity in app
|
|||
|
||||
Given I wait "10" seconds
|
||||
Then I should find "The session is in progress." in the app
|
||||
And I should find "1" near "moderator" in the app
|
||||
And I should find "0" near "viewer" in the app
|
||||
And I should find "1" near "Moderator" in the app
|
||||
And I should find "0" near "Viewer" in the app
|
||||
|
||||
Scenario: Wait for moderator
|
||||
Given the following "activities" exist:
|
||||
|
@ -91,8 +91,8 @@ Feature: Test basic usage of BBB activity in app
|
|||
And I press "Close" in the app
|
||||
And I pull to refresh in the app
|
||||
Then I should find "The session is in progress." in the app
|
||||
And I should find "1" near "moderator" in the app
|
||||
And I should find "0" near "viewer" in the app
|
||||
And I should find "1" near "Moderator" in the app
|
||||
And I should find "0" near "Viewer" in the app
|
||||
And I should be able to press "Join session" in the app
|
||||
|
||||
When I close all opened windows
|
||||
|
|
|
@ -93,7 +93,7 @@
|
|||
</core-loading>
|
||||
</ion-content>
|
||||
<ion-footer class="footer-adjustable">
|
||||
<ion-toolbar [color]="isOnline && polling && loaded ? 'contrast' : 'light'">
|
||||
<ion-toolbar [color]="isOnline && polling && loaded ? null : 'light'">
|
||||
<p class="ion-text-center" *ngIf="!isOnline">
|
||||
{{ 'addon.mod_chat.mustbeonlinetosendmessages' | translate }}
|
||||
</p>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
<ion-content>
|
||||
<ion-list>
|
||||
<ion-item button class="ion-text-wrap" (click)="onItemClick(item)" *ngFor="let item of items" detail="false"
|
||||
[attr.aria-label]="item.text | translate">
|
||||
|
@ -7,3 +8,5 @@
|
|||
<ion-icon [name]="item.icon" slot="end" aria-hidden="true"></ion-icon>
|
||||
</ion-item>
|
||||
</ion-list>
|
||||
|
||||
</ion-content>
|
||||
|
|
|
@ -13,14 +13,14 @@
|
|||
"disapprove": "Undo approval",
|
||||
"edittagsnotsupported": "Sorry, editing tags is not supported by the app.",
|
||||
"emptyaddform": "You did not fill out any fields!",
|
||||
"entrieslefttoadd": "You must add {{$a.entriesleft}} more entry/entries in order to complete this activity",
|
||||
"entrieslefttoadd": "You must add {{$a.entriesleft}} more entry/entries to complete this activity.",
|
||||
"entrieslefttoaddtoview": "You must add {{$a.entrieslefttoview}} more entry/entries before you can view other participants' entries.",
|
||||
"errorapproving": "Error approving or unapproving entry.",
|
||||
"errordeleting": "Error deleting entry.",
|
||||
"errormustsupplyvalue": "You must supply a value here.",
|
||||
"expired": "Sorry, this activity closed on {{$a}} and is no longer available",
|
||||
"fields": "Fields",
|
||||
"foundrecords": "Found records: {{$a.num}}/{{$a.max}} (<a href=\"{{$a.reseturl}}\">Reset filters</a>)",
|
||||
"foundrecords": "Found {{$a.num}} out of {{$a.max}} records. <a href=\"{{$a.reseturl}}\">Clear all</a>",
|
||||
"gettinglocation": "Getting location",
|
||||
"latlongboth": "Both latitude and longitude are required.",
|
||||
"locationnotenabled": "Location is not enabled",
|
||||
|
|
|
@ -334,15 +334,16 @@ export class AddonModFeedbackIndexComponent extends CoreCourseModuleMainActivity
|
|||
return label;
|
||||
});
|
||||
|
||||
item.chartData = parsedData.map((dataItem) => <number> dataItem.answercount);
|
||||
item.chartData = parsedData.map((dataItem) => Number(dataItem.answercount));
|
||||
|
||||
if (item.typ == 'multichoicerated') {
|
||||
if (item.typ === 'multichoicerated') {
|
||||
item.average = parsedData.reduce((prev, current) => prev + Number(current.avg), 0.0);
|
||||
}
|
||||
|
||||
const subtype = item.presentation.charAt(0);
|
||||
|
||||
const single = subtype != 'c';
|
||||
// Display bar chart if there are no answers to avoid division by 0 error.
|
||||
const single = subtype !== 'c' && item.chartData.some((count) => count > 0);
|
||||
item.chartType = single ? 'doughnut' : 'bar';
|
||||
item.templateName = 'chart';
|
||||
break;
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
<ion-content>
|
||||
<ion-list>
|
||||
<ion-item button class="ion-text-wrap" (click)="setLockState(true)" *ngIf="discussion.canlock && !discussion.locked" detail="false">
|
||||
<ion-icon name="fas-lock" slot="start" aria-hidden="true"></ion-icon>
|
||||
<ion-label>
|
||||
|
@ -36,3 +38,5 @@
|
|||
<p class="item-heading">{{ 'addon.mod_forum.removefromfavourites' | translate }}</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
</ion-list>
|
||||
</ion-content>
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
<ion-content>
|
||||
<core-loading [hideUntil]="loaded" [fullscreen]="false">
|
||||
<ion-list>
|
||||
<ion-item button class="ion-text-wrap" (click)="editPost()" *ngIf="offlinePost || canEdit" detail="false">
|
||||
<ion-icon name="fas-pen" slot="start" aria-hidden="true"></ion-icon>
|
||||
<ion-label>
|
||||
|
@ -12,10 +14,13 @@
|
|||
<p class="item-heading" *ngIf="offlinePost">{{ 'core.discard' | translate }}</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
<ion-item class="ion-text-wrap" [href]="url" *ngIf="url" core-link capture="false" button detail="false" [showBrowserWarning]="false">
|
||||
<ion-item class="ion-text-wrap" [href]="url" *ngIf="url" core-link capture="false" button detail="false"
|
||||
[showBrowserWarning]="false">
|
||||
<ion-icon name="fas-up-right-from-square" slot="start" aria-hidden="true"></ion-icon>
|
||||
<ion-label>
|
||||
<p class="item-heading">{{ 'core.openinbrowser' | translate }}</p>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
</ion-list>
|
||||
</core-loading>
|
||||
</ion-content>
|
||||
|
|
|
@ -49,11 +49,11 @@
|
|||
"pinupdated": "The pin option has been updated.",
|
||||
"postaddedsuccess": "Your post was successfully added.",
|
||||
"postingroup": "Posting in group \"{{groupname}}\".",
|
||||
"postisprivatereply": "This is a private reply. It is only visible to you and anyone with the capability to view private replies, such as teachers or managers.",
|
||||
"postisprivatereply": "This is a private reply. (Teachers and other users with the capability to view private replies can also see it.)",
|
||||
"posttoforum": "Post to forum",
|
||||
"posttomygroups": "Post a copy to all groups",
|
||||
"privatereply": "Reply privately",
|
||||
"qandanotify": "This is a question and answer forum. In order to see other responses to these questions, you must first post your answer",
|
||||
"qandanotify": "This is a question and answer forum. To see other replies, you must first post your reply.",
|
||||
"re": "Re:",
|
||||
"refreshposts": "Refresh posts",
|
||||
"removefromfavourites": "Unstar this discussion",
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
<ion-content>
|
||||
<ion-radio-group [(ngModel)]="selectedMode" (ionChange)="modePicked()">
|
||||
<ion-item class="ion-text-wrap" *ngFor="let mode of modes">
|
||||
<ion-label>{{ mode.langkey | translate }}</ion-label>
|
||||
<ion-radio slot="end" [value]="mode.key"></ion-radio>
|
||||
</ion-item>
|
||||
</ion-radio-group>
|
||||
</ion-content>
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
"clearchoice": "Clear my choice",
|
||||
"comment": "Comment",
|
||||
"completedon": "Completed on",
|
||||
"confirmclose": "Once you submit, you will no longer be able to change your answers for this attempt.",
|
||||
"confirmclose": "Once you submit your answers, you won’t be able to change them.",
|
||||
"confirmcontinueoffline": "This attempt has not been synchronised since {{$a}}. If you have continued this attempt in another device since then, you may lose data.",
|
||||
"confirmleavequizonerror": "An error occurred while saving the answers. Are you sure you want to leave the quiz?",
|
||||
"confirmstart": "Your attempt will have a time limit of {{$a}}. When you start, the timer will begin to count down and cannot be paused. You must finish your attempt before it expires. Are you sure you wish to start now?",
|
||||
|
|
|
@ -888,7 +888,7 @@ export class AddonModWikiIndexComponent extends CoreCourseModuleMainActivityComp
|
|||
await Promise.all(this.loadedSubwikis.map(async (subwiki) => {
|
||||
let groupLabel = '';
|
||||
|
||||
if (subwiki.groupid == 0 && subwiki.userid == 0) {
|
||||
if (subwiki.groupid === 0 && subwiki.userid === 0) {
|
||||
// Add 'All participants' subwiki if needed at the start.
|
||||
if (!allParticipants) {
|
||||
subwikiList.unshift({
|
||||
|
@ -902,7 +902,7 @@ export class AddonModWikiIndexComponent extends CoreCourseModuleMainActivityComp
|
|||
allParticipants = true;
|
||||
}
|
||||
} else {
|
||||
if (subwiki.groupid != 0 && userGroups.length > 0) {
|
||||
if (subwiki.groupid !== 0 && userGroups.length > 0) {
|
||||
// Get groupLabel if it has groupId.
|
||||
const group = userGroups.find(group => group.id == subwiki.groupid);
|
||||
groupLabel = group?.name ?? '';
|
||||
|
@ -910,7 +910,7 @@ export class AddonModWikiIndexComponent extends CoreCourseModuleMainActivityComp
|
|||
groupLabel = Translate.instant('addon.mod_wiki.notingroup');
|
||||
}
|
||||
|
||||
if (subwiki.userid != 0) {
|
||||
if (subwiki.userid !== 0) {
|
||||
if (!multiLevelList && subwiki.groupid != 0) {
|
||||
multiLevelList = true;
|
||||
}
|
||||
|
@ -956,8 +956,6 @@ export class AddonModWikiIndexComponent extends CoreCourseModuleMainActivityComp
|
|||
showMyGroupsLabel: boolean,
|
||||
multiLevelList: boolean,
|
||||
): void {
|
||||
subwikiList.sort((a, b) => a.groupid - b.groupid);
|
||||
|
||||
this.groupWiki = showMyGroupsLabel;
|
||||
this.subwikiData.count = subwikiList.length;
|
||||
|
||||
|
@ -1039,34 +1037,39 @@ export class AddonModWikiIndexComponent extends CoreCourseModuleMainActivityComp
|
|||
grouping.subwikis.push(subwiki);
|
||||
});
|
||||
} else if (showMyGroupsLabel) {
|
||||
const noGrouping: AddonModWikiSubwikiListGrouping = { label: '', subwikis: [] };
|
||||
const myGroupsGrouping: AddonModWikiSubwikiListGrouping = { label: Translate.instant('core.mygroups'), subwikis: [] };
|
||||
const otherGroupsGrouping: AddonModWikiSubwikiListGrouping = {
|
||||
label: Translate.instant('core.othergroups'),
|
||||
subwikis: [],
|
||||
};
|
||||
const noGroupSubwikis: AddonModWikiSubwikiListSubwiki[] = [];
|
||||
const myGroupsSubwikis: AddonModWikiSubwikiListSubwiki[] = [];
|
||||
const otherGroupsSubwikis: AddonModWikiSubwikiListSubwiki[] = [];
|
||||
|
||||
// As we loop over each subwiki, add it to the current group
|
||||
// As we loop over each subwiki, add it to the current group.
|
||||
subwikiList.forEach((subwiki) => {
|
||||
// Add the subwiki to the currently active grouping.
|
||||
if (subwiki.canedit === undefined) {
|
||||
noGrouping.subwikis.push(subwiki);
|
||||
if (subwiki.groupid === 0 && subwiki.userid === 0) {
|
||||
// All participants
|
||||
noGroupSubwikis.push(subwiki);
|
||||
} else if (subwiki.canedit) {
|
||||
myGroupsGrouping.subwikis.push(subwiki);
|
||||
myGroupsSubwikis.push(subwiki);
|
||||
} else {
|
||||
otherGroupsGrouping.subwikis.push(subwiki);
|
||||
otherGroupsSubwikis.push(subwiki);
|
||||
}
|
||||
});
|
||||
|
||||
// Add each grouping to the subwikis
|
||||
if (noGrouping.subwikis.length > 0) {
|
||||
this.subwikiData.subwikis.push(noGrouping);
|
||||
if (myGroupsSubwikis.length > 0 && otherGroupsSubwikis.length > 0) {
|
||||
// Add each grouping to the subwikis.
|
||||
if (noGroupSubwikis.length > 0) {
|
||||
this.subwikiData.subwikis.push({ label: '', subwikis: noGroupSubwikis });
|
||||
}
|
||||
if (myGroupsGrouping.subwikis.length > 0) {
|
||||
this.subwikiData.subwikis.push(myGroupsGrouping);
|
||||
|
||||
if (myGroupsSubwikis.length > 0) {
|
||||
this.subwikiData.subwikis.push({ label: Translate.instant('core.mygroups'), subwikis: myGroupsSubwikis });
|
||||
}
|
||||
if (otherGroupsGrouping.subwikis.length > 0) {
|
||||
this.subwikiData.subwikis.push(otherGroupsGrouping);
|
||||
|
||||
if (otherGroupsSubwikis.length > 0) {
|
||||
this.subwikiData.subwikis.push({ label: Translate.instant('core.othergroups'), subwikis: otherGroupsSubwikis });
|
||||
}
|
||||
} else {
|
||||
// Mix it again since it does not have groups and other groups.
|
||||
this.subwikiData.subwikis.push({ label: '', subwikis: subwikiList });
|
||||
}
|
||||
} else {
|
||||
this.subwikiData.subwikis.push({ label: '', subwikis: subwikiList });
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
<ion-content>
|
||||
<ion-list>
|
||||
<ng-container *ngFor="let group of subwikis">
|
||||
<ion-item-divider *ngIf="group.label">
|
||||
|
@ -17,3 +18,4 @@
|
|||
</ion-item>
|
||||
</ng-container>
|
||||
</ion-list>
|
||||
</ion-content>
|
||||
|
|
|
@ -38,10 +38,10 @@ export class AddonModWikiSubwikiPickerComponent {
|
|||
isSubwikiSelected(subwiki: AddonModWikiSubwiki): boolean {
|
||||
|
||||
if (subwiki.id > 0 && this.currentSubwiki.id > 0) {
|
||||
return subwiki.id == this.currentSubwiki.id;
|
||||
return subwiki.id === this.currentSubwiki.id;
|
||||
}
|
||||
|
||||
return subwiki.userid == this.currentSubwiki.userid && subwiki.groupid == this.currentSubwiki.groupid;
|
||||
return subwiki.userid === this.currentSubwiki.userid && subwiki.groupid === this.currentSubwiki.groupid;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
<ion-content>
|
||||
<ion-list [id]="uniqueId" role="menu">
|
||||
<ion-list-header *ngIf="title">
|
||||
<ion-label>{{title}}</ion-label>
|
||||
|
@ -17,7 +18,8 @@
|
|||
</ion-icon>
|
||||
<ion-spinner *ngIf="item.iconAction == 'spinner'" slot="end" [attr.aria-label]="'core.loading' | translate">
|
||||
</ion-spinner>
|
||||
<ion-toggle *ngIf="item.iconAction == 'toggle'" [(ngModel)]="item.toggle" (ionChange)="item.toggleChanged($event)" slot="end">
|
||||
<ion-toggle *ngIf="item.iconAction == 'toggle'" [(ngModel)]="item.toggle" (ionChange)="item.toggleChanged($event)"
|
||||
slot="end">
|
||||
</ion-toggle>
|
||||
</ng-container>
|
||||
<ion-badge class="{{item.badgeClass}}" slot="end" *ngIf="item.badge">
|
||||
|
@ -28,3 +30,4 @@
|
|||
</ion-badge>
|
||||
</ion-item>
|
||||
</ion-list>
|
||||
</ion-content>
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
</core-loading>
|
||||
</ion-content>
|
||||
<ion-footer class="footer-adjustable" *ngIf="commentsLoaded && canAddComments">
|
||||
<ion-toolbar color="contrast">
|
||||
<ion-toolbar>
|
||||
<core-send-message-form [sendDisabled]="sending" [message]="newComment" (onSubmit)="addComment($event)"
|
||||
[placeholder]="'core.comments.addcomment' | translate">
|
||||
</core-send-message-form>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
<ion-content>
|
||||
<ion-list>
|
||||
<ion-item button class="ion-text-wrap" (click)="action('download')" *ngIf="downloadCourseEnabled" detail="false">
|
||||
<ion-icon *ngIf="!prefetch.loading" [name]="prefetch.icon" slot="start" aria-hidden="true"></ion-icon>
|
||||
|
@ -38,3 +39,4 @@
|
|||
</ion-label>
|
||||
</ion-item>
|
||||
</ion-list>
|
||||
</ion-content>
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
</button>
|
||||
</ion-slide>
|
||||
<ion-slide>
|
||||
<button [disabled]="!rteEnabled" [attr.aria-pressed]="toolbarStyles.strike" [title]="'core.editor.strike' | translate"
|
||||
<button [disabled]="!rteEnabled" [attr.aria-pressed]="toolbarStyles.strike" [title]="'core.editor.strikethrough' | translate"
|
||||
(click)="buttonAction($event, 'strikethrough', 'strike')" (keyup)="buttonAction($event, 'strikethrough', 'strike')"
|
||||
(mousedown)="downAction($event)" (keydown)="downAction($event)" tabindex="0">
|
||||
<ion-icon name="fas-strikethrough" aria-hidden="true"></ion-icon>
|
||||
|
|
|
@ -7,11 +7,11 @@
|
|||
"h5": "Heading (small)",
|
||||
"hidetoolbar": "Hide toolbar",
|
||||
"italic": "Italic",
|
||||
"orderedlist": "Ordered list",
|
||||
"orderedlist": "Ordered List",
|
||||
"p": "Paragraph",
|
||||
"strike": "Strike through",
|
||||
"strikethrough": "Strikethrough",
|
||||
"textrecovered": "A draft version of this text was automatically restored.",
|
||||
"toggle": "Toggle editor",
|
||||
"underline": "Underline",
|
||||
"unorderedlist": "Unordered list"
|
||||
"unorderedlist": "Bulleted List"
|
||||
}
|
|
@ -19,7 +19,7 @@
|
|||
"credentialsdescription": "Please provide your username and password to log in.",
|
||||
"credentialshelp": "If you have problems logging in, try again later or contact your school or learning provider.",
|
||||
"credentialssupportsubject": "Need help logging in",
|
||||
"emailconfirmsent": "<p>An email should have been sent to your address at <b>{{$a}}</b></p><p>It contains easy instructions to complete your registration.</p>",
|
||||
"emailconfirmsent": "<p>An email should have been sent to your address at <b>{{$a}}</b></p>\n <p>It contains easy instructions to complete your registration.</p>\n <p>If you continue to have difficulty, contact the site administrator.</p>",
|
||||
"emailconfirmsentnoemail": "<p>An email should have been sent to your address.</p><p>It contains easy instructions to complete your registration.</p>",
|
||||
"emailconfirmsentsuccess": "Confirmation email sent successfully",
|
||||
"emailnotmatch": "Emails do not match",
|
||||
|
@ -71,7 +71,7 @@
|
|||
"loginsteps": "For full access to this site, you first need to create an account.",
|
||||
"missingemail": "Missing email address",
|
||||
"missingfirstname": "Missing given name",
|
||||
"missinglastname": "Missing surname",
|
||||
"missinglastname": "Missing last name",
|
||||
"mobileservicesnotenabled": "Mobile services are not enabled on the site.",
|
||||
"mustconfirm": "You need to confirm your account",
|
||||
"newaccount": "New account",
|
||||
|
|
|
@ -40,7 +40,7 @@ Feature: Test signup in app
|
|||
And I should find "Password required" in the app
|
||||
And I should find "Missing email address" in the app
|
||||
And I should find "Missing given name" in the app
|
||||
And I should find "Missing surname" in the app
|
||||
And I should find "Missing last name" in the app
|
||||
|
||||
When I set the following fields to these values in the app:
|
||||
| Username | u1 |
|
||||
|
@ -48,7 +48,7 @@ Feature: Test signup in app
|
|||
| Email address | u1@u1.com |
|
||||
| Email (again) | u2@u1.com |
|
||||
| First name | User |
|
||||
| Surname | Test |
|
||||
| Last name | Test |
|
||||
| City/town | Barcelona |
|
||||
| Country | Spain |
|
||||
Then I should find "Emails do not match" in the app
|
||||
|
@ -98,7 +98,7 @@ Feature: Test signup in app
|
|||
| Email address | u1@u1.com |
|
||||
| Email (again) | u1@u1.com |
|
||||
| First name | User |
|
||||
| Surname | Test |
|
||||
| Last name | Test |
|
||||
| City/town | Barcelona |
|
||||
| Country | Spain |
|
||||
And I press "Create my new account" in the app
|
||||
|
@ -147,7 +147,7 @@ Feature: Test signup in app
|
|||
| Email address | u1@u1.com |
|
||||
| Email (again) | u1@u1.com |
|
||||
| First name | User |
|
||||
| Surname | Test |
|
||||
| Last name | Test |
|
||||
| City/town | Barcelona |
|
||||
| Country | Spain |
|
||||
And I press "Create my new account" in the app
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
{
|
||||
"address": "Address",
|
||||
"useraccount": "User account",
|
||||
"city": "City/town",
|
||||
"completeprofile": "Complete profile",
|
||||
"completeprofilehelp": "If you have problems completing your profile, try again later or contact your school or learning provider.",
|
||||
|
@ -20,7 +19,7 @@
|
|||
"firstname": "First name",
|
||||
"interests": "Interests",
|
||||
"lastcourseaccess": "Last access to course",
|
||||
"lastname": "Surname",
|
||||
"lastname": "Last name",
|
||||
"manager": "Manager",
|
||||
"newpicture": "New picture",
|
||||
"noparticipants": "No participants found for this course",
|
||||
|
@ -35,6 +34,7 @@
|
|||
"supportmessagesent": "Your message has been sent.",
|
||||
"supportsubject": "[App] {{subject}}",
|
||||
"teacher": "Non-editing teacher",
|
||||
"useraccount": "User account",
|
||||
"userwithid": "User with ID {{id}}",
|
||||
"webpage": "Web page"
|
||||
}
|
||||
|
|
|
@ -174,8 +174,8 @@
|
|||
"minutes": "minutes",
|
||||
"misc": "Miscellaneous",
|
||||
"mod_assign": "Assignment",
|
||||
"mod_book": "Book",
|
||||
"mod_bigbluebuttonbn": "BigBlueButton",
|
||||
"mod_book": "Book",
|
||||
"mod_chat": "Chat",
|
||||
"mod_choice": "Choice",
|
||||
"mod_data": "Database",
|
||||
|
@ -187,7 +187,7 @@
|
|||
"mod_glossary": "Glossary",
|
||||
"mod_h5pactivity": "H5P",
|
||||
"mod_imscp": "IMS content package",
|
||||
"mod_label": "Text and media",
|
||||
"mod_label": "Text and media area",
|
||||
"mod_lesson": "Lesson",
|
||||
"mod_lti": "External tool",
|
||||
"mod_page": "Page",
|
||||
|
|
|
@ -538,7 +538,7 @@ export class CoreTextUtilsProvider {
|
|||
* @returns Error message, undefined if not found.
|
||||
*/
|
||||
getErrorMessageFromError(error?: CoreAnyError): string | undefined {
|
||||
if (typeof error == 'string') {
|
||||
if (typeof error === 'string') {
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
|
@ -253,10 +253,6 @@ ion-tabs.hide-header ion-header {
|
|||
display: none;
|
||||
}
|
||||
|
||||
ion-footer ion-toolbar.ion-color-contrast {
|
||||
background-color: var(--contrast-background);
|
||||
}
|
||||
|
||||
ion-footer {
|
||||
background-color: var(--contrast-background);
|
||||
}
|
||||
|
|
|
@ -228,6 +228,10 @@ html {
|
|||
}
|
||||
}
|
||||
|
||||
ion-popover.ios {
|
||||
--min-width: 250px;
|
||||
}
|
||||
|
||||
ion-toast {
|
||||
--color: var(--ion-color-step-50);
|
||||
--button-color: var(--primary);
|
||||
|
|
Loading…
Reference in New Issue