commit
5c381e3623
|
@ -1,5 +1,5 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<widget android-versionCode="39100" id="com.moodle.moodlemobile" ios-CFBundleVersion="3.9.1.0" version="3.9.1" versionCode="39100" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
|
||||
<widget android-versionCode="39200" id="com.moodle.moodlemobile" ios-CFBundleVersion="3.9.2.0" version="3.9.2" versionCode="39200" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
|
||||
<name>Moodle</name>
|
||||
<description>Moodle official app</description>
|
||||
<author email="mobile@moodle.com" href="http://moodle.com">Moodle Mobile team</author>
|
||||
|
@ -241,7 +241,7 @@
|
|||
<true />
|
||||
</edit-config>
|
||||
<edit-config file="*-Info.plist" mode="merge" target="CFBundleShortVersionString">
|
||||
<string>3.9.1</string>
|
||||
<string>3.9.2</string>
|
||||
</edit-config>
|
||||
<config-file parent="FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED" target="*-Info.plist">
|
||||
<string>YES</string>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<Identity Name="3312ADB7.MoodleDesktop"
|
||||
ProcessorArchitecture="x64"
|
||||
Publisher="CN=33CDCDF6-1EB5-4827-9897-ED25C91A32F6"
|
||||
Version="3.9.1.0" />
|
||||
Version="3.9.2.0" />
|
||||
<Properties>
|
||||
<DisplayName>Moodle Desktop</DisplayName>
|
||||
<PublisherDisplayName>Moodle Pty Ltd.</PublisherDisplayName>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "moodlemobile",
|
||||
"version": "3.9.0",
|
||||
"version": "3.9.2",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
@ -6236,7 +6236,8 @@
|
|||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
|
||||
"optional": true
|
||||
},
|
||||
"aproba": {
|
||||
"version": "1.2.0",
|
||||
|
@ -6257,12 +6258,14 @@
|
|||
"balanced-match": {
|
||||
"version": "1.0.0",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
|
||||
"optional": true
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": false,
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
|
@ -6277,17 +6280,20 @@
|
|||
"code-point-at": {
|
||||
"version": "1.1.0",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
|
||||
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
|
||||
"optional": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
|
||||
"optional": true
|
||||
},
|
||||
"console-control-strings": {
|
||||
"version": "1.1.0",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
|
||||
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
|
||||
"optional": true
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
|
@ -6412,7 +6418,8 @@
|
|||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
|
||||
"optional": true
|
||||
},
|
||||
"ini": {
|
||||
"version": "1.3.5",
|
||||
|
@ -6424,6 +6431,7 @@
|
|||
"version": "1.0.0",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"number-is-nan": "^1.0.0"
|
||||
}
|
||||
|
@ -6438,6 +6446,7 @@
|
|||
"version": "3.0.4",
|
||||
"resolved": false,
|
||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
|
@ -6481,6 +6490,7 @@
|
|||
"version": "0.5.1",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
},
|
||||
|
@ -6488,7 +6498,8 @@
|
|||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -6587,7 +6598,8 @@
|
|||
"number-is-nan": {
|
||||
"version": "1.0.1",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
|
||||
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
|
||||
"optional": true
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
|
@ -6599,6 +6611,7 @@
|
|||
"version": "1.4.0",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
|
@ -6720,6 +6733,7 @@
|
|||
"version": "1.0.2",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"code-point-at": "^1.0.0",
|
||||
"is-fullwidth-code-point": "^1.0.0",
|
||||
|
@ -6739,6 +6753,7 @@
|
|||
"version": "3.0.1",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
}
|
||||
|
@ -6794,7 +6809,8 @@
|
|||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
||||
"optional": true
|
||||
},
|
||||
"yallist": {
|
||||
"version": "3.0.3",
|
||||
|
@ -7278,7 +7294,8 @@
|
|||
"version": "2.1.1",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"aproba": {
|
||||
"version": "1.2.0",
|
||||
|
@ -7302,13 +7319,15 @@
|
|||
"version": "1.0.0",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": false,
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
|
@ -7325,19 +7344,22 @@
|
|||
"version": "1.1.0",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"console-control-strings": {
|
||||
"version": "1.1.0",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
|
@ -7468,7 +7490,8 @@
|
|||
"version": "2.0.3",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"ini": {
|
||||
"version": "1.3.5",
|
||||
|
@ -7482,6 +7505,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"number-is-nan": "^1.0.0"
|
||||
}
|
||||
|
@ -7498,6 +7522,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
|
@ -7506,13 +7531,15 @@
|
|||
"version": "0.0.8",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"minipass": {
|
||||
"version": "2.3.5",
|
||||
"resolved": false,
|
||||
"integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"safe-buffer": "^5.1.2",
|
||||
"yallist": "^3.0.0"
|
||||
|
@ -7533,6 +7560,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
}
|
||||
|
@ -7621,7 +7649,8 @@
|
|||
"version": "1.0.1",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
|
@ -7635,6 +7664,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
|
@ -7730,7 +7760,8 @@
|
|||
"version": "5.1.2",
|
||||
"resolved": false,
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
|
@ -7772,6 +7803,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"code-point-at": "^1.0.0",
|
||||
"is-fullwidth-code-point": "^1.0.0",
|
||||
|
@ -7793,6 +7825,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
}
|
||||
|
@ -7841,13 +7874,15 @@
|
|||
"version": "1.0.2",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"yallist": {
|
||||
"version": "3.0.3",
|
||||
"resolved": false,
|
||||
"integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -14909,7 +14944,8 @@
|
|||
"version": "2.1.1",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"aproba": {
|
||||
"version": "1.2.0",
|
||||
|
@ -14933,13 +14969,15 @@
|
|||
"version": "1.0.0",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": false,
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
|
@ -14956,19 +14994,22 @@
|
|||
"version": "1.1.0",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"console-control-strings": {
|
||||
"version": "1.1.0",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
|
@ -15099,7 +15140,8 @@
|
|||
"version": "2.0.3",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"ini": {
|
||||
"version": "1.3.5",
|
||||
|
@ -15113,6 +15155,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"number-is-nan": "^1.0.0"
|
||||
}
|
||||
|
@ -15129,6 +15172,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
|
@ -15137,13 +15181,15 @@
|
|||
"version": "0.0.8",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"minipass": {
|
||||
"version": "2.3.5",
|
||||
"resolved": false,
|
||||
"integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"safe-buffer": "^5.1.2",
|
||||
"yallist": "^3.0.0"
|
||||
|
@ -15164,6 +15210,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
}
|
||||
|
@ -15252,7 +15299,8 @@
|
|||
"version": "1.0.1",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
|
@ -15266,6 +15314,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
|
@ -15361,7 +15410,8 @@
|
|||
"version": "5.1.2",
|
||||
"resolved": false,
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
|
@ -15403,6 +15453,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"code-point-at": "^1.0.0",
|
||||
"is-fullwidth-code-point": "^1.0.0",
|
||||
|
@ -15424,6 +15475,7 @@
|
|||
"resolved": false,
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
}
|
||||
|
@ -15472,13 +15524,15 @@
|
|||
"version": "1.0.2",
|
||||
"resolved": false,
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"yallist": {
|
||||
"version": "3.0.3",
|
||||
"resolved": false,
|
||||
"integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "moodlemobile",
|
||||
"version": "3.9.1",
|
||||
"version": "3.9.2",
|
||||
"description": "The official app for Moodle.",
|
||||
"author": {
|
||||
"name": "Moodle Pty Ltd.",
|
||||
|
@ -253,7 +253,7 @@
|
|||
"category": "public.app-category.education",
|
||||
"icon": "resources/desktop/icon.icns",
|
||||
"target": "mas",
|
||||
"bundleVersion": "3.9.1",
|
||||
"bundleVersion": "3.9.2",
|
||||
"extendInfo": {
|
||||
"ElectronTeamID": "2NU57U5PAW"
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#!/bin/bash
|
||||
|
||||
LANGPACKSFOLDER='../../moodle-langpacks'
|
||||
stepnumber=$1
|
||||
|
||||
function check_success_exit {
|
||||
if [ $? -ne 0 ]; then
|
||||
|
|
|
@ -186,7 +186,7 @@ function build_lang($lang, $keys) {
|
|||
$local = 0;
|
||||
|
||||
$langparts = explode('-', $lang, 2);
|
||||
$parentname = $langparts[0] ?? "";
|
||||
$parentname = $langparts[0] ? $langparts[0] : "";
|
||||
$parent = "";
|
||||
|
||||
echo "Processing $lang";
|
||||
|
@ -307,8 +307,6 @@ function detect_lang($lang, $keys) {
|
|||
$langname = $string['thislanguage'];
|
||||
$title .= " ".$langname." -D";
|
||||
|
||||
|
||||
|
||||
// Add the translation to the array.
|
||||
foreach ($keys as $key => $value) {
|
||||
$string = get_translation_strings($langfoldername, $value->file);
|
||||
|
|
|
@ -1557,6 +1557,7 @@
|
|||
"core.errorsomedatanotdownloaded": "local_moodlemobileapp",
|
||||
"core.errorsync": "local_moodlemobileapp",
|
||||
"core.errorsyncblocked": "local_moodlemobileapp",
|
||||
"core.errorurlschemeinvalidsite": "local_moodlemobileapp",
|
||||
"core.explanationdigitalminor": "moodle",
|
||||
"core.favourites": "moodle",
|
||||
"core.filename": "repository",
|
||||
|
@ -2096,6 +2097,7 @@
|
|||
"core.tag.errorareanotsupported": "local_moodlemobileapp",
|
||||
"core.tag.inalltagcoll": "tag",
|
||||
"core.tag.itemstaggedwith": "tag",
|
||||
"core.tag.noresultsfor": "tag",
|
||||
"core.tag.notagsfound": "tag",
|
||||
"core.tag.searchtags": "tag",
|
||||
"core.tag.showingfirsttags": "tag",
|
||||
|
|
|
@ -37,7 +37,7 @@ export class AddonBlockMyOverviewHandler extends CoreBlockBaseHandler {
|
|||
* @return Whether or not the handler is enabled on a site level.
|
||||
*/
|
||||
isEnabled(): boolean | Promise<boolean> {
|
||||
return this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.6') ||
|
||||
return (this.sitesProvider.getCurrentSite() && this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.6')) ||
|
||||
!this.coursesProvider.isMyCoursesDisabledInSite();
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,9 @@ export class AddonBlockTimelineHandler extends CoreBlockBaseHandler {
|
|||
*/
|
||||
isEnabled(): boolean | Promise<boolean> {
|
||||
return this.timelineProvider.isAvailable().then((enabled) => {
|
||||
return enabled && (this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.6') ||
|
||||
const currentSite = this.sitesProvider.getCurrentSite();
|
||||
|
||||
return enabled && ((currentSite && currentSite.isVersionGreaterEqualThan('3.6')) ||
|
||||
!this.coursesProvider.isMyCoursesDisabledInSite());
|
||||
});
|
||||
}
|
||||
|
|
|
@ -222,7 +222,7 @@ export class AddonCalendarCalendarComponent implements OnInit, OnChanges, DoChec
|
|||
let isPast = true;
|
||||
|
||||
this.weeks.forEach((week) => {
|
||||
week.days.some((day) => {
|
||||
week.days.forEach((day) => {
|
||||
day.istoday = day.mday == currentDay;
|
||||
day.ispast = isPast && !day.istoday;
|
||||
isPast = day.ispast;
|
||||
|
@ -231,11 +231,7 @@ export class AddonCalendarCalendarComponent implements OnInit, OnChanges, DoChec
|
|||
day.events.forEach((event) => {
|
||||
event.ispast = this.isEventPast(event);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return day.istoday;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -393,7 +393,7 @@ export class AddonCalendarProvider {
|
|||
site = site || this.sitesProvider.getCurrentSite();
|
||||
|
||||
// The WS to create/edit events requires a fix that was integrated in 3.7.1.
|
||||
return site.isVersionGreaterEqualThan('3.7.1');
|
||||
return site && site.isVersionGreaterEqualThan('3.7.1');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -83,6 +83,6 @@ export class AddonFilterMultilangHandler extends CoreFilterDefaultHandler {
|
|||
*/
|
||||
shouldBeApplied(options: CoreFilterFormatTextOptions, site?: CoreSite): boolean {
|
||||
// The filter should be applied if site is older than 3.7 or the WS didn't filter the text.
|
||||
return options.wsNotFiltered || !site.isVersionGreaterEqualThan('3.7');
|
||||
return options.wsNotFiltered || (site && !site.isVersionGreaterEqualThan('3.7'));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -207,9 +207,10 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
|
|||
|
||||
// Check if groupmode is enabled to avoid showing wrong numbers.
|
||||
return this.groupsProvider.getActivityGroupInfo(this.assign.cmid, false).then((groupInfo) => {
|
||||
const currentSite = this.sitesProvider.getCurrentSite();
|
||||
this.groupInfo = groupInfo;
|
||||
this.showNumbers = groupInfo.groups.length == 0 ||
|
||||
this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.5');
|
||||
(currentSite && currentSite.isVersionGreaterEqualThan('3.5'));
|
||||
|
||||
return this.setGroup(this.groupsProvider.validateGroupId(this.group, groupInfo));
|
||||
});
|
||||
|
@ -258,8 +259,10 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
|
|||
}
|
||||
}
|
||||
|
||||
const currentSite = this.sitesProvider.getCurrentSite();
|
||||
|
||||
this.needsGradingAvalaible = response.gradingsummary && response.gradingsummary.submissionsneedgradingcount > 0 &&
|
||||
this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.2');
|
||||
currentSite && currentSite.isVersionGreaterEqualThan('3.2');
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -225,7 +225,7 @@ export class AddonModAssignSubmissionOnlineTextHandler implements AddonModAssign
|
|||
// Bug was fixed in 3.1.1 minor release and in 3.2.
|
||||
const currentSite = this.sitesProvider.getCurrentSite();
|
||||
|
||||
return currentSite.isVersionGreaterEqualThan('3.1.1') || currentSite.checkIfAppUsesLocalMobile();
|
||||
return currentSite && (currentSite.isVersionGreaterEqualThan('3.1.1') || currentSite.checkIfAppUsesLocalMobile());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -291,7 +291,8 @@ export class AddonModForumProvider {
|
|||
* @return True if fixed, false otherwise.
|
||||
*/
|
||||
isAllParticipantsFixed(): boolean {
|
||||
return this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan(['3.1.5', '3.2.2']);
|
||||
return this.sitesProvider.getCurrentSite() &&
|
||||
this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan(['3.1.5', '3.2.2']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -543,7 +544,7 @@ export class AddonModForumProvider {
|
|||
isDiscussionListSortingAvailable(site?: CoreSite): boolean {
|
||||
site = site || this.sitesProvider.getCurrentSite();
|
||||
|
||||
return site.isVersionGreaterEqualThan('3.7');
|
||||
return site && site.isVersionGreaterEqualThan('3.7');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -87,7 +87,8 @@ export class AddonModForumPrefetchHandler extends CoreCourseActivityPrefetchHand
|
|||
*/
|
||||
protected getPostsFiles(posts: any[]): any[] {
|
||||
let files = [];
|
||||
const getInlineFiles = this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.2');
|
||||
const getInlineFiles = this.sitesProvider.getCurrentSite() &&
|
||||
this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.2');
|
||||
|
||||
posts.forEach((post) => {
|
||||
if (post.attachments && post.attachments.length) {
|
||||
|
|
|
@ -86,7 +86,8 @@ export class AddonModGlossaryPrefetchHandler extends CoreCourseActivityPrefetchH
|
|||
*/
|
||||
protected getFilesFromGlossaryAndEntries(module: any, glossary: any, entries: any[]): any[] {
|
||||
let files = this.getIntroFilesFromInstance(module, glossary);
|
||||
const getInlineFiles = this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.2');
|
||||
const getInlineFiles = this.sitesProvider.getCurrentSite() &&
|
||||
this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.2');
|
||||
|
||||
// Get entries files.
|
||||
entries.forEach((entry) => {
|
||||
|
|
|
@ -110,8 +110,9 @@ export class AddonModQuizPrefetchHandler extends CoreCourseActivityPrefetchHandl
|
|||
*/
|
||||
protected getAttemptsFeedbackFiles(quiz: any, attempts: any[]): Promise<any[]> {
|
||||
// We have quiz data, now we'll get specific data for each attempt.
|
||||
const promises = [],
|
||||
getInlineFiles = this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.2');
|
||||
const promises = [];
|
||||
const getInlineFiles = this.sitesProvider.getCurrentSite() &&
|
||||
this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.2');
|
||||
let files = [];
|
||||
|
||||
attempts.forEach((attempt) => {
|
||||
|
|
|
@ -104,8 +104,10 @@ export class AddonModResourceHelperProvider {
|
|||
* @return Whether the resource should be displayed embeded.
|
||||
*/
|
||||
isDisplayedEmbedded(module: any, display: number): boolean {
|
||||
const currentSite = this.sitesProvider.getCurrentSite();
|
||||
|
||||
if ((!module.contents.length && !module.contentsinfo) || !this.fileProvider.isAvailable() ||
|
||||
(!this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.7') && this.isNextcloudFile(module))) {
|
||||
(currentSite && !currentSite.isVersionGreaterEqualThan('3.7') && this.isNextcloudFile(module))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -147,7 +147,7 @@ export class AddonModResourcePrefetchHandler extends CoreCourseResourcePrefetchH
|
|||
* @return Promise resolved with true if downloadable, resolved with false otherwise.
|
||||
*/
|
||||
isDownloadable(module: any, courseId: number): Promise<boolean> {
|
||||
if (this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.7')) {
|
||||
if (this.sitesProvider.getCurrentSite() && this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.7')) {
|
||||
// Nextcloud files are downloadable from 3.7 onwards.
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<ion-content>
|
||||
<core-loading [hideUntil]="loaded">
|
||||
<core-navigation-bar [previous]="previousSco" [next]="nextSco" (action)="loadSco($event)"></core-navigation-bar>
|
||||
<core-iframe *ngIf="loaded && src" [src]="src" [iframeWidth]="scorm.popup ? scorm.width : undefined" [iframeHeight]="scorm.popup ? scorm.height : undefined"></core-iframe>
|
||||
<core-iframe *ngIf="loaded && src" [src]="src" [iframeWidth]="scormWidth" [iframeHeight]="scormHeight"></core-iframe>
|
||||
<p *ngIf="!src && errorMessage">{{ errorMessage | translate }}</p>
|
||||
</core-loading>
|
||||
</ion-content>
|
||||
|
|
|
@ -17,7 +17,7 @@ import { IonicPage, NavParams, ModalController } from 'ionic-angular';
|
|||
import { CoreEventsProvider } from '@providers/events';
|
||||
import { CoreSitesProvider } from '@providers/sites';
|
||||
import { CoreSyncProvider } from '@providers/sync';
|
||||
import { CoreDomUtilsProvider } from '@providers/utils/dom';
|
||||
import { CoreDomUtils } from '@providers/utils/dom';
|
||||
import { CoreTimeUtilsProvider } from '@providers/utils/time';
|
||||
import { CoreIonTabsComponent } from '@components/ion-tabs/ion-tabs';
|
||||
import { AddonModScormProvider, AddonModScormAttemptCountResult } from '../../providers/scorm';
|
||||
|
@ -46,6 +46,8 @@ export class AddonModScormPlayerPage implements OnInit, OnDestroy {
|
|||
src: string; // Iframe src.
|
||||
errorMessage: string; // Error message.
|
||||
accessInfo: any; // Access information.
|
||||
scormWidth: null; // Width applied to scorm iframe.
|
||||
scormHeight: null; // Height applied to scorm iframe.
|
||||
|
||||
protected siteId: string;
|
||||
protected mode: string; // Mode to play the SCORM.
|
||||
|
@ -65,11 +67,18 @@ export class AddonModScormPlayerPage implements OnInit, OnDestroy {
|
|||
protected launchPrevObserver: any;
|
||||
protected goOfflineObserver: any;
|
||||
|
||||
constructor(navParams: NavParams, protected modalCtrl: ModalController, protected eventsProvider: CoreEventsProvider,
|
||||
protected sitesProvider: CoreSitesProvider, protected syncProvider: CoreSyncProvider,
|
||||
protected domUtils: CoreDomUtilsProvider, protected timeUtils: CoreTimeUtilsProvider,
|
||||
protected scormProvider: AddonModScormProvider, protected scormHelper: AddonModScormHelperProvider,
|
||||
protected scormSyncProvider: AddonModScormSyncProvider, protected tabs: CoreIonTabsComponent) {
|
||||
constructor(
|
||||
navParams: NavParams,
|
||||
protected modalCtrl: ModalController,
|
||||
protected eventsProvider: CoreEventsProvider,
|
||||
protected sitesProvider: CoreSitesProvider,
|
||||
protected syncProvider: CoreSyncProvider,
|
||||
protected timeUtils: CoreTimeUtilsProvider,
|
||||
protected scormProvider: AddonModScormProvider,
|
||||
protected scormHelper: AddonModScormHelperProvider,
|
||||
protected scormSyncProvider: AddonModScormSyncProvider,
|
||||
protected tabs: CoreIonTabsComponent
|
||||
) {
|
||||
|
||||
this.scorm = navParams.get('scorm') || {};
|
||||
this.mode = navParams.get('mode') || AddonModScormProvider.MODENORMAL;
|
||||
|
@ -95,12 +104,14 @@ export class AddonModScormPlayerPage implements OnInit, OnDestroy {
|
|||
if (this.scorm.popup) {
|
||||
this.tabs.changeVisibility(false);
|
||||
|
||||
// If we receive a value <= 100 we need to assume it's a percentage.
|
||||
if (this.scorm.width <= 100) {
|
||||
this.scorm.width = this.scorm.width + '%';
|
||||
}
|
||||
if (this.scorm.height <= 100) {
|
||||
this.scorm.height = this.scorm.height + '%';
|
||||
// If we receive a value > 100 we assume it's a fixed pixel size.
|
||||
if (this.scorm.width > 100) {
|
||||
this.scormWidth = this.scorm.width;
|
||||
|
||||
// Only get fixed size on height if width is also fixed.
|
||||
if (this.scorm.height > 100) {
|
||||
this.scormHeight = this.scorm.height;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -111,7 +122,7 @@ export class AddonModScormPlayerPage implements OnInit, OnDestroy {
|
|||
const promise = this.newAttempt ? this.setStartTime(this.currentSco.id) : Promise.resolve();
|
||||
|
||||
return promise.catch((error) => {
|
||||
this.domUtils.showErrorModalDefault(error, 'addon.mod_scorm.errorgetscorm', true);
|
||||
CoreDomUtils.instance.showErrorModalDefault(error, 'addon.mod_scorm.errorgetscorm', true);
|
||||
}).finally(() => {
|
||||
// Load SCO.
|
||||
this.loadSco(this.currentSco);
|
||||
|
@ -152,7 +163,7 @@ export class AddonModScormPlayerPage implements OnInit, OnDestroy {
|
|||
// Wait a bit to prevent collisions between this store and SCORM API's store.
|
||||
setTimeout(() => {
|
||||
this.scormHelper.convertAttemptToOffline(this.scorm, this.attempt).catch((error) => {
|
||||
this.domUtils.showErrorModalDefault(error, 'core.error', true);
|
||||
CoreDomUtils.instance.showErrorModalDefault(error, 'core.error', true);
|
||||
}).then(() => {
|
||||
this.refreshToc();
|
||||
});
|
||||
|
@ -248,7 +259,7 @@ export class AddonModScormPlayerPage implements OnInit, OnDestroy {
|
|||
return Promise.all(promises);
|
||||
});
|
||||
}).catch((error) => {
|
||||
this.domUtils.showErrorModalDefault(error, 'addon.mod_scorm.errorgetscorm', true);
|
||||
CoreDomUtils.instance.showErrorModalDefault(error, 'addon.mod_scorm.errorgetscorm', true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -372,7 +383,7 @@ export class AddonModScormPlayerPage implements OnInit, OnDestroy {
|
|||
|
||||
return this.scormProvider.saveTracks(sco.id, this.attempt, tracks, this.scorm, true);
|
||||
}).catch((error) => {
|
||||
this.domUtils.showErrorModalDefault(error, 'core.error', true);
|
||||
CoreDomUtils.instance.showErrorModalDefault(error, 'core.error', true);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -432,7 +443,7 @@ export class AddonModScormPlayerPage implements OnInit, OnDestroy {
|
|||
}).then(() => {
|
||||
return this.fetchToc();
|
||||
}).catch((error) => {
|
||||
this.domUtils.showErrorModalDefault(error, 'addon.mod_scorm.errorgetscorm', true);
|
||||
CoreDomUtils.instance.showErrorModalDefault(error, 'addon.mod_scorm.errorgetscorm', true);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -112,7 +112,7 @@
|
|||
<h2>{{ 'addon.mod_workshop.publishedsubmissions' | translate }}</h2>
|
||||
</ion-item-divider>
|
||||
<ng-container *ngFor="let submission of publishedSubmissions">
|
||||
<addon-mod-workshop-submission [submission]="submission" [courseId]="workshop.course" [module]="module" [workshop]="workshop" [access]="access" summary="true"></addon-mod-workshop-submission>
|
||||
<addon-mod-workshop-submission [submission]="submission" [courseId]="workshop.course" [module]="module" [workshop]="workshop" [access]="access" summary="true" class="core-as-item"></addon-mod-workshop-submission>
|
||||
</ng-container>
|
||||
</ion-card>
|
||||
</ng-container>
|
||||
|
@ -134,7 +134,7 @@
|
|||
<p>{{ 'addon.mod_workshop.assignedassessmentsnone' | translate }}</p>
|
||||
</ion-item>
|
||||
<ng-container *ngFor="let assessment of (assessments || [])">
|
||||
<addon-mod-workshop-submission [submission]="assessment.submission" [assessment]="assessment" [courseId]="workshop.course" [module]="module" [workshop]="workshop" [access]="access" summary="true"></addon-mod-workshop-submission>
|
||||
<addon-mod-workshop-submission [submission]="assessment.submission" [assessment]="assessment" [courseId]="workshop.course" [module]="module" [workshop]="workshop" [access]="access" summary="true" class="core-as-item"></addon-mod-workshop-submission>
|
||||
</ng-container>
|
||||
</ion-card >
|
||||
</ng-container>
|
||||
|
@ -156,7 +156,7 @@
|
|||
</ion-item>
|
||||
|
||||
<ng-container *ngFor="let submission of grades">
|
||||
<addon-mod-workshop-submission [submission]="submission" [courseId]="workshop.course" [module]="module" [workshop]="workshop" [access]="access" summary="true"></addon-mod-workshop-submission>
|
||||
<addon-mod-workshop-submission [submission]="submission" [courseId]="workshop.course" [module]="module" [workshop]="workshop" [access]="access" summary="true" class="core-as-item"></addon-mod-workshop-submission>
|
||||
</ng-container>
|
||||
|
||||
<ion-grid *ngIf="page > 0 || hasNextPage">
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<core-loading [hideUntil]="loaded">
|
||||
<div *ngIf="!summary">
|
||||
<ion-list-header text-wrap>
|
||||
<ion-item text-wrap class="addon-workshop-submission-title">
|
||||
<ion-avatar core-user-avatar [user]="profile" [courseId]="courseId" [userId]="profile && profile.id" item-start></ion-avatar>
|
||||
<h2><core-format-text [text]="submission.title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"></core-format-text></h2>
|
||||
<p *ngIf="profile && profile.fullname">{{profile.fullname}}</p>
|
||||
|
@ -21,7 +21,7 @@
|
|||
<ng-container *ngIf="submission.offline"><ion-icon name="time"></ion-icon> {{ 'core.notsent' | translate }}</ng-container>
|
||||
<ng-container *ngIf="submission.deleted"><ion-icon name="trash"></ion-icon> {{ 'core.deletedoffline' | translate }}</ng-container>
|
||||
</ion-note>
|
||||
</ion-list-header>
|
||||
</ion-item>
|
||||
<ion-item text-wrap *ngIf="submission.content">
|
||||
<core-format-text [component]="component" [componentId]="componentId" [text]="submission.content" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"></core-format-text>
|
||||
</ion-item>
|
||||
|
|
|
@ -1,4 +1,13 @@
|
|||
ion-app.app-root addon-mod-workshop-submission,
|
||||
ion-app.app-root .card.with-borders addon-mod-workshop-submission {
|
||||
@include core-as-items();
|
||||
ion-app.app-root addon-mod-workshop-submission .addon-workshop-submission-title {
|
||||
|
||||
&.item-ios {
|
||||
border-bottom: $list-ios-header-border-bottom;
|
||||
}
|
||||
&.item-md {
|
||||
border-bottom: 1px solid $list-md-border-color;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
border: 0;
|
||||
}
|
||||
}
|
|
@ -113,8 +113,8 @@ ion-app.app-root {
|
|||
@include core-as-items();
|
||||
}
|
||||
|
||||
.card.with-borders .item,
|
||||
.list.with-borders .item {
|
||||
.card.with-borders > .item,
|
||||
.list.with-borders > .item {
|
||||
@include core-items();
|
||||
}
|
||||
|
||||
|
|
|
@ -2095,6 +2095,7 @@
|
|||
"core.tag.errorareanotsupported": "This tag area is not supported by the app.",
|
||||
"core.tag.inalltagcoll": "Everywhere",
|
||||
"core.tag.itemstaggedwith": "{{$a.tagarea}} tagged with \"{{$a.tag}}\"",
|
||||
"core.tag.noresultsfor": "No results for \"{{$a}}\"",
|
||||
"core.tag.notagsfound": "No tags matching \"{{$a}}\" found",
|
||||
"core.tag.searchtags": "Search tags",
|
||||
"core.tag.showingfirsttags": "Showing {{$a}} most popular tags",
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
ion-app.app-root core-iframe {
|
||||
|
||||
> div {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
iframe {
|
||||
border: 0;
|
||||
display: block;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div #originalTabs class="tabcontent">
|
||||
<div #originalTabs class="tabcontent" [class.tabshidden]="hidden">
|
||||
<ng-content></ng-content>
|
||||
</div>
|
||||
<div #portal tab-portal></div>
|
||||
|
|
|
@ -27,6 +27,9 @@ ion-app.app-root core-ion-tabs {
|
|||
.ion-page > ion-content > .scroll-content {
|
||||
margin-bottom: $navbar-md-height;
|
||||
}
|
||||
.tabshidden .ion-page > ion-content > .scroll-content {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&[tabsplacement="side"] {
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
"app_id": "com.moodle.moodlemobile",
|
||||
"appname": "Moodle Mobile",
|
||||
"desktopappname": "Moodle Desktop",
|
||||
"versioncode": 3910,
|
||||
"versionname": "3.9.1",
|
||||
"versioncode": 3920,
|
||||
"versionname": "3.9.2",
|
||||
"cache_update_frequency_usually": 420000,
|
||||
"cache_update_frequency_often": 1200000,
|
||||
"cache_update_frequency_sometimes": 3600000,
|
||||
|
|
|
@ -122,7 +122,7 @@ export class CoreCourseProvider {
|
|||
canGetCourseBlocks(site?: CoreSite): boolean {
|
||||
site = site || this.sitesProvider.getCurrentSite();
|
||||
|
||||
return site.isVersionGreaterEqualThan('3.7') && site.wsAvailable('core_block_get_course_blocks');
|
||||
return site && site.isVersionGreaterEqualThan('3.7') && site.wsAvailable('core_block_get_course_blocks');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -135,7 +135,7 @@ export class CoreCourseProvider {
|
|||
canRequestStealthModules(site?: CoreSite): boolean {
|
||||
site = site || this.sitesProvider.getCurrentSite();
|
||||
|
||||
return site.isVersionGreaterEqualThan(['3.4.6', '3.5.3']);
|
||||
return site && site.isVersionGreaterEqualThan(['3.4.6', '3.5.3']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -197,7 +197,9 @@ export class CoreCourseSyncProvider extends CoreSyncBaseProvider {
|
|||
if (result.updated) {
|
||||
// Update data.
|
||||
return this.courseProvider.invalidateSections(courseId, siteId).then(() => {
|
||||
if (this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.6')) {
|
||||
const currentSite = this.sitesProvider.getCurrentSite();
|
||||
|
||||
if (currentSite && currentSite.isVersionGreaterEqualThan('3.6')) {
|
||||
return this.courseProvider.getSections(courseId, false, true, undefined, siteId);
|
||||
} else {
|
||||
return this.courseProvider.getActivitiesCompletionStatus(courseId, siteId);
|
||||
|
|
|
@ -235,7 +235,7 @@ export class CoreCoursesCoursePreviewPage implements OnDestroy {
|
|||
});
|
||||
});
|
||||
}).finally(() => {
|
||||
if (!this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.7')) {
|
||||
if (this.sitesProvider.getCurrentSite() && !this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.7')) {
|
||||
return this.coursesProvider.isGetCoursesByFieldAvailableInSite().then((available) => {
|
||||
if (available) {
|
||||
return this.coursesProvider.getCourseByField('id', this.course.id).then((course) => {
|
||||
|
@ -402,7 +402,7 @@ export class CoreCoursesCoursePreviewPage implements OnDestroy {
|
|||
promises.push(this.coursesProvider.invalidateCourse(this.course.id));
|
||||
promises.push(this.coursesProvider.invalidateCourseEnrolmentMethods(this.course.id));
|
||||
promises.push(this.courseOptionsDelegate.clearAndInvalidateCoursesOptions(this.course.id));
|
||||
if (this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.7')) {
|
||||
if (this.sitesProvider.getCurrentSite() && !this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.7')) {
|
||||
promises.push(this.coursesProvider.invalidateCoursesByField('id', this.course.id));
|
||||
}
|
||||
if (this.guestInstanceId) {
|
||||
|
|
|
@ -114,7 +114,7 @@ export class CoreCoursesHelperProvider {
|
|||
promises = [],
|
||||
colors = [];
|
||||
|
||||
if (site.isVersionGreaterEqualThan('3.8')) {
|
||||
if (site && site.isVersionGreaterEqualThan('3.8')) {
|
||||
promises.push(site.getConfig().then((configs) => {
|
||||
for (let x = 0; x < 10; x++) {
|
||||
colors[x] = configs['core_admin_coursecolor' + (x + 1)] || null;
|
||||
|
|
|
@ -64,12 +64,10 @@ export class CoreFileUploaderFileHandler implements CoreFileUploaderHandler {
|
|||
* @return Data.
|
||||
*/
|
||||
getData(): CoreFileUploaderHandlerData {
|
||||
const isIOS = this.platform.is('ios');
|
||||
|
||||
const handler: CoreFileUploaderHandlerData = {
|
||||
title: isIOS ? 'core.fileuploader.more' : 'core.fileuploader.file',
|
||||
title: 'core.fileuploader.file',
|
||||
class: 'core-fileuploader-file-handler',
|
||||
icon: isIOS ? 'more' : 'folder',
|
||||
icon: 'folder',
|
||||
};
|
||||
|
||||
if (this.appProvider.isMobile()) {
|
||||
|
@ -98,7 +96,6 @@ export class CoreFileUploaderFileHandler implements CoreFileUploaderHandler {
|
|||
|
||||
input.addEventListener('change', (evt: Event) => {
|
||||
const file = input.files[0];
|
||||
let fileName;
|
||||
|
||||
input.value = ''; // Unset input.
|
||||
if (!file) {
|
||||
|
@ -113,17 +110,8 @@ export class CoreFileUploaderFileHandler implements CoreFileUploaderHandler {
|
|||
return;
|
||||
}
|
||||
|
||||
fileName = file.name;
|
||||
if (isIOS) {
|
||||
// Check the name of the file and add a timestamp if needed (take picture).
|
||||
const matches = fileName.match(/image\.(jpe?g|png)/);
|
||||
if (matches) {
|
||||
fileName = 'image_' + this.timeUtils.readableTimestamp() + '.' + matches[1];
|
||||
}
|
||||
}
|
||||
|
||||
// Upload the picked file.
|
||||
this.uploaderHelper.uploadFileObject(file, maxSize, upload, allowOffline, fileName).then((result) => {
|
||||
this.uploaderHelper.uploadFileObject(file, maxSize, upload, allowOffline, file.name).then((result) => {
|
||||
this.uploaderHelper.fileUploaded(result);
|
||||
}).catch((error) => {
|
||||
this.domUtils.showErrorModalDefault(error,
|
||||
|
|
|
@ -65,8 +65,12 @@ export class CoreFileUploaderHelperProvider {
|
|||
*/
|
||||
async chooseAndUploadFile(maxSize: number, upload?: boolean, allowOffline?: boolean, mimetypes?: string[]): Promise<any> {
|
||||
|
||||
const modal = this.domUtils.showModalLoading();
|
||||
|
||||
const result = await this.fileChooser.getFile(mimetypes ? mimetypes.join(',') : undefined);
|
||||
|
||||
modal.dismiss();
|
||||
|
||||
if (!result) {
|
||||
// User canceled.
|
||||
throw this.domUtils.createCanceledError();
|
||||
|
@ -87,10 +91,6 @@ export class CoreFileUploaderHelperProvider {
|
|||
const options = this.fileUploaderProvider.getFileUploadOptions(result.uri, result.name, result.mediaType, true);
|
||||
|
||||
if (upload) {
|
||||
const size = await this.fileProvider.getExternalFileSize(result.uri);
|
||||
|
||||
await this.confirmUploadFile(size, false, allowOffline);
|
||||
|
||||
return this.uploadFile(result.uri, maxSize, true, options);
|
||||
} else {
|
||||
return this.copyToTmpFolder(result.uri, false, maxSize, undefined, options);
|
||||
|
|
|
@ -249,6 +249,9 @@ export class CoreLoginCredentialsPage {
|
|||
this.loginHelper.treatUserTokenError(siteUrl, error, username, password);
|
||||
if (error.loggedout) {
|
||||
this.navCtrl.setRoot('CoreLoginSitesPage');
|
||||
} else if (error.errorcode == 'forcepasswordchangenotice') {
|
||||
// Reset password field.
|
||||
this.credForm.controls.password.reset();
|
||||
}
|
||||
}).finally(() => {
|
||||
modal.dismiss();
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
</ion-item>
|
||||
</div>
|
||||
<ion-item>
|
||||
<ion-input type="text" name="value" placeholder="{{ 'core.login.usernameoremail' | translate }}" formControlName="value" autocapitalize="none" autocorrect="off" [core-auto-focus]></ion-input>
|
||||
<ion-input type="text" name="value" placeholder="{{ 'core.login.usernameoremail' | translate }}" formControlName="value" autocapitalize="none" autocorrect="off" [core-auto-focus]="autoFocus"></ion-input>
|
||||
</ion-item>
|
||||
<ion-item>
|
||||
<button text-wrap ion-button block [disabled]="!myForm.valid">{{ 'core.courses.search' | translate }}</button>
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
// limitations under the License.
|
||||
|
||||
import { Component, ViewChild, ElementRef } from '@angular/core';
|
||||
import { IonicPage, NavController, NavParams } from 'ionic-angular';
|
||||
import { IonicPage, NavController, NavParams, Platform } from 'ionic-angular';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { CoreEventsProvider } from '@providers/events';
|
||||
import { CoreSitesProvider } from '@providers/sites';
|
||||
|
@ -35,10 +35,12 @@ export class CoreLoginForgottenPasswordPage {
|
|||
|
||||
myForm: FormGroup;
|
||||
siteUrl: string;
|
||||
autoFocus: boolean;
|
||||
|
||||
constructor(protected navCtrl: NavController,
|
||||
navParams: NavParams,
|
||||
fb: FormBuilder,
|
||||
platform: Platform,
|
||||
protected translate: TranslateService,
|
||||
protected loginHelper: CoreLoginHelperProvider,
|
||||
protected domUtils: CoreDomUtilsProvider,
|
||||
|
@ -46,6 +48,7 @@ export class CoreLoginForgottenPasswordPage {
|
|||
protected sitesProvider: CoreSitesProvider) {
|
||||
|
||||
this.siteUrl = navParams.get('siteUrl');
|
||||
this.autoFocus = platform.is('tablet');
|
||||
this.myForm = fb.group({
|
||||
field: ['username', Validators.required],
|
||||
value: [navParams.get('username') || '', Validators.required]
|
||||
|
|
|
@ -221,6 +221,9 @@ export class CoreLoginReconnectPage {
|
|||
|
||||
if (error.loggedout) {
|
||||
this.cancel();
|
||||
} else if (error.errorcode == 'forcepasswordchangenotice') {
|
||||
// Reset password field.
|
||||
this.credForm.controls.password.reset();
|
||||
}
|
||||
}).finally(() => {
|
||||
modal.dismiss();
|
||||
|
|
|
@ -20,13 +20,13 @@
|
|||
<ng-container *ngIf="siteSelector == 'url'">
|
||||
<ion-item>
|
||||
<ion-label stacked><h2>{{ 'core.login.siteaddress' | translate }}</h2></ion-label>
|
||||
<ion-input name="url" type="url" placeholder="https://campus.example.edu" formControlName="siteUrl" [core-auto-focus]="showKeyboard"></ion-input>
|
||||
<ion-input name="url" type="url" placeholder="https://campus.example.edu" formControlName="siteUrl" [core-auto-focus]="showKeyboard && !showScanQR"></ion-input>
|
||||
</ion-item>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="siteSelector != 'url'">
|
||||
<ion-item>
|
||||
<ion-label stacked><h2>{{ 'core.login.siteaddress' | translate }}</h2></ion-label>
|
||||
<ion-input name="url" placeholder="https://campus.example.edu" formControlName="siteUrl" [core-auto-focus]="showKeyboard" (ionChange)="searchSite($event, siteForm.value.siteUrl)"></ion-input>
|
||||
<ion-input name="url" placeholder="https://campus.example.edu" formControlName="siteUrl" [core-auto-focus]="showKeyboard && !showScanQR" (ionChange)="searchSite($event, siteForm.value.siteUrl)"></ion-input>
|
||||
</ion-item>
|
||||
|
||||
<ion-list [class.hidden]="!hasSites && !enteredSiteUrl" class="core-login-site-list">
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
"inalltagcoll": "Everywhere",
|
||||
"itemstaggedwith": "{{$a.tagarea}} tagged with \"{{$a.tag}}\"",
|
||||
"notagsfound": "No tags matching \"{{$a}}\" found",
|
||||
"noresultsfor": "No results for \"{{$a}}\"",
|
||||
"searchtags": "Search tags",
|
||||
"showingfirsttags": "Showing {{$a}} most popular tags",
|
||||
"tag": "Tag",
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
||||
</ion-refresher>
|
||||
<core-loading [hideUntil]="loaded">
|
||||
<ion-list>
|
||||
<ion-list *ngIf="hasUnsupportedAreas || areas">
|
||||
<ion-item text-wrap *ngIf="hasUnsupportedAreas" class="core-warning-item">
|
||||
<ion-icon item-start name="warning" color="warning"></ion-icon>
|
||||
{{ 'core.tag.warningareasnotsupported' | translate }}
|
||||
|
@ -19,6 +19,7 @@
|
|||
<ion-badge item-end *ngIf="area.badge">{{ area.badge }}</ion-badge>
|
||||
</a>
|
||||
</ion-list>
|
||||
<core-empty-box icon="fa-tag" *ngIf="!hasUnsupportedAreas && (!areas || !areas.length)" [message]="'core.tag.noresultsfor' | translate: { $a: tagName }"></core-empty-box>
|
||||
</core-loading>
|
||||
</ion-content>
|
||||
</core-split-view>
|
||||
|
|
|
@ -166,7 +166,7 @@ export class CoreTagProvider {
|
|||
|
||||
return Promise.reject(error);
|
||||
}).then((response) => {
|
||||
if (!response || !response.length) {
|
||||
if (!response) {
|
||||
return Promise.reject(null);
|
||||
}
|
||||
|
||||
|
|
|
@ -711,7 +711,7 @@ export class CoreFormatTextDirective implements OnChanges {
|
|||
}
|
||||
|
||||
// Width and height parameters are required in 3.6 and older sites.
|
||||
if (!site.isVersionGreaterEqualThan('3.7')) {
|
||||
if (site && !site.isVersionGreaterEqualThan('3.7')) {
|
||||
newUrl += '&width=' + width + '&height=' + height;
|
||||
}
|
||||
iframe.src = newUrl;
|
||||
|
|
|
@ -431,6 +431,8 @@ export class CoreSitesProvider {
|
|||
*/
|
||||
getDemoSiteData(name: string): any {
|
||||
const demoSites = CoreConfigConstants.demo_sites;
|
||||
name = name.toLowerCase();
|
||||
|
||||
if (typeof demoSites != 'undefined' && typeof demoSites[name] != 'undefined') {
|
||||
return demoSites[name];
|
||||
}
|
||||
|
|
|
@ -527,7 +527,7 @@ $core-dd-question-colors: $white, $blue-light, #DCDCDC, #D8BFD8, #87CEFA, #DAA52
|
|||
border-bottom: $hairlines-width solid $list-ios-border-color;
|
||||
}
|
||||
|
||||
&:last-child > .item-inner {
|
||||
&.item-block:last-child > .item-inner {
|
||||
border-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue