Merge pull request #2334 from moodlehq/integration

Integration
main
Juan Leyva 2020-04-03 13:30:46 +02:00 committed by GitHub
commit afd9d46a00
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 390 additions and 177 deletions

View File

@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<widget id="com.moodle.moodlemobile" version="3.8.1" 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 id="com.moodle.moodlemobile" version="3.8.2" 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> <name>Moodle</name>
<description>Moodle official app</description> <description>Moodle official app</description>
<author email="mobile@moodle.com" href="http://moodle.com">Moodle Mobile team</author> <author email="mobile@moodle.com" href="http://moodle.com">Moodle Mobile team</author>

View File

@ -6,7 +6,7 @@
<Identity Name="3312ADB7.MoodleDesktop" <Identity Name="3312ADB7.MoodleDesktop"
ProcessorArchitecture="x64" ProcessorArchitecture="x64"
Publisher="CN=33CDCDF6-1EB5-4827-9897-ED25C91A32F6" Publisher="CN=33CDCDF6-1EB5-4827-9897-ED25C91A32F6"
Version="3.8.1.0" /> Version="3.8.2.0" />
<Properties> <Properties>
<DisplayName>Moodle Desktop</DisplayName> <DisplayName>Moodle Desktop</DisplayName>
<PublisherDisplayName>Moodle Pty Ltd.</PublisherDisplayName> <PublisherDisplayName>Moodle Pty Ltd.</PublisherDisplayName>

View File

@ -1,6 +1,6 @@
{ {
"name": "moodlemobile", "name": "moodlemobile",
"version": "3.8.1", "version": "3.8.2",
"description": "The official app for Moodle.", "description": "The official app for Moodle.",
"author": { "author": {
"name": "Moodle Pty Ltd.", "name": "Moodle Pty Ltd.",
@ -225,7 +225,7 @@
"category": "public.app-category.education", "category": "public.app-category.education",
"icon": "resources/desktop/icon.icns", "icon": "resources/desktop/icon.icns",
"target": "mas", "target": "mas",
"bundleVersion": "3.8.1", "bundleVersion": "3.8.2",
"extendInfo": { "extendInfo": {
"ElectronTeamID": "2NU57U5PAW" "ElectronTeamID": "2NU57U5PAW"
} }

View File

@ -6,17 +6,17 @@
"3ds": {"type":"image/x-3ds"}, "3ds": {"type":"image/x-3ds"},
"3g2": {"type":"video/3gpp2"}, "3g2": {"type":"video/3gpp2"},
"3gp": {"type":"video/quicktime","icon":"quicktime","string":"video","groups":["video"]}, "3gp": {"type":"video/quicktime","icon":"quicktime","string":"video","groups":["video"]},
"7z": {"type":"application/x-7z-compressed","icon":"archive"}, "7z": {"type":"application/x-7z-compressed","icon":"archive","string":"archive","groups":["archive"]},
"a": {"type":"application/octet-stream"}, "a": {"type":"application/octet-stream"},
"aab": {"type":"application/x-authorware-bin"}, "aab": {"type":"application/x-authorware-bin"},
"aac": {"type":"audio/aac","icon":"audio","string":"audio","groups":["audio"]}, "aac": {"type":"audio/aac","icon":"audio","string":"audio","groups":["audio","html_audio","web_audio"]},
"aam": {"type":"application/x-authorware-map"}, "aam": {"type":"application/x-authorware-map"},
"aas": {"type":"application/x-authorware-seg"}, "aas": {"type":"application/x-authorware-seg"},
"abc": {"type":"text/vnd.abc"}, "abc": {"type":"text/vnd.abc"},
"abw": {"type":"application/x-abiword"}, "abw": {"type":"application/x-abiword"},
"ac": {"type":"application/pkix-attr-cert"}, "ac": {"type":"application/pkix-attr-cert"},
"acc": {"type":"application/vnd.americandynamics.acc"}, "acc": {"type":"application/vnd.americandynamics.acc"},
"accdb": {"type":"application/msaccess","icon":"database"}, "accdb": {"type":"application/msaccess","icon":"base"},
"ace": {"type":"application/x-ace-compressed","icon":"archive"}, "ace": {"type":"application/x-ace-compressed","icon":"archive"},
"acgi": {"type":"text/html"}, "acgi": {"type":"text/html"},
"acu": {"type":"application/vnd.acucobol"}, "acu": {"type":"application/vnd.acucobol"},
@ -77,6 +77,7 @@
"bcpio": {"type":"application/x-bcpio"}, "bcpio": {"type":"application/x-bcpio"},
"bdf": {"type":"application/x-font-bdf"}, "bdf": {"type":"application/x-font-bdf"},
"bdm": {"type":"application/vnd.syncml.dm+wbxml"}, "bdm": {"type":"application/vnd.syncml.dm+wbxml"},
"bdoc": {"type":"application/x-digidoc","icon":"document","groups":["archive"]},
"bed": {"type":"application/vnd.realvnc.bed"}, "bed": {"type":"application/vnd.realvnc.bed"},
"bh2": {"type":"application/vnd.fujitsu.oasysprs"}, "bh2": {"type":"application/vnd.fujitsu.oasysprs"},
"bin": {"type":"application/octet-stream"}, "bin": {"type":"application/octet-stream"},
@ -126,6 +127,7 @@
"cdmid": {"type":"application/cdmi-domain"}, "cdmid": {"type":"application/cdmi-domain"},
"cdmio": {"type":"application/cdmi-object"}, "cdmio": {"type":"application/cdmi-object"},
"cdmiq": {"type":"application/cdmi-queue"}, "cdmiq": {"type":"application/cdmi-queue"},
"cdoc": {"type":"application/x-digidoc","icon":"document","groups":["archive"]},
"cdx": {"type":"chemical/x-cdx"}, "cdx": {"type":"chemical/x-cdx"},
"cdxml": {"type":"application/vnd.chemdraw+xml"}, "cdxml": {"type":"application/vnd.chemdraw+xml"},
"cdy": {"type":"application/vnd.cinderella"}, "cdy": {"type":"application/vnd.cinderella"},
@ -188,6 +190,7 @@
"dcurl": {"type":"text/vnd.curl.dcurl"}, "dcurl": {"type":"text/vnd.curl.dcurl"},
"dd2": {"type":"application/vnd.oma.dd2+xml"}, "dd2": {"type":"application/vnd.oma.dd2+xml"},
"ddd": {"type":"application/vnd.fujixerox.ddd"}, "ddd": {"type":"application/vnd.fujixerox.ddd"},
"ddoc": {"type":"application/x-digidoc","icon":"document","groups":["archive"]},
"deb": {"type":"application/x-debian-package"}, "deb": {"type":"application/x-debian-package"},
"deepv": {"type":"application/x-deepv"}, "deepv": {"type":"application/x-deepv"},
"def": {"type":"text/plain"}, "def": {"type":"text/plain"},
@ -274,7 +277,7 @@
"fbs": {"type":"image/vnd.fastbidsheet"}, "fbs": {"type":"image/vnd.fastbidsheet"},
"fcdt": {"type":"application/vnd.adobe.formscentral.fcdt"}, "fcdt": {"type":"application/vnd.adobe.formscentral.fcdt"},
"fcs": {"type":"application/vnd.isac.fcs"}, "fcs": {"type":"application/vnd.isac.fcs"},
"fdf": {"type":"application/pdf","icon":"pdf"}, "fdf": {"type":"application/vnd.fdf","icon":"pdf"},
"fdk": {"type":"application/octet-stream"}, "fdk": {"type":"application/octet-stream"},
"fe_launch": {"type":"application/vnd.denovo.fcselayout-link"}, "fe_launch": {"type":"application/vnd.denovo.fcselayout-link"},
"fg5": {"type":"application/vnd.fujitsu.oasysgp"}, "fg5": {"type":"application/vnd.fujitsu.oasysgp"},
@ -286,7 +289,7 @@
"fhc": {"type":"image/x-freehand"}, "fhc": {"type":"image/x-freehand"},
"fif": {"type":"application/fractals"}, "fif": {"type":"application/fractals"},
"fig": {"type":"application/x-xfig"}, "fig": {"type":"application/x-xfig"},
"flac": {"type":"audio/x-flac","icon":"audio","string":"audio","groups":["audio","web_audio"]}, "flac": {"type":"audio/flac","icon":"audio","string":"audio","groups":["audio","html_audio","web_audio"]},
"fli": {"type":"video/x-fli"}, "fli": {"type":"video/x-fli"},
"flo": {"type":"application/vnd.micrografx.flo"}, "flo": {"type":"application/vnd.micrografx.flo"},
"flv": {"type":"video/x-flv","icon":"flash","string":"video","groups":["video","web_video"]}, "flv": {"type":"video/x-flv","icon":"flash","string":"video","groups":["video","web_video"]},
@ -295,6 +298,7 @@
"fly": {"type":"text/vnd.fly"}, "fly": {"type":"text/vnd.fly"},
"fm": {"type":"application/vnd.framemaker"}, "fm": {"type":"application/vnd.framemaker"},
"fmf": {"type":"video/x-atomic3d-feature"}, "fmf": {"type":"video/x-atomic3d-feature"},
"fmp4": {"type":"video/mp4","icon":"mpeg","string":"video","groups":["html_video","video","web_video"]},
"fnc": {"type":"application/vnd.frogans.fnc"}, "fnc": {"type":"application/vnd.frogans.fnc"},
"for": {"type":"text/x-fortran"}, "for": {"type":"text/x-fortran"},
"fpx": {"type":"image/vnd.fpx"}, "fpx": {"type":"image/vnd.fpx"},
@ -314,12 +318,15 @@
"g3": {"type":"image/g3fax"}, "g3": {"type":"image/g3fax"},
"g3w": {"type":"application/vnd.geospace"}, "g3w": {"type":"application/vnd.geospace"},
"gac": {"type":"application/vnd.groove-account"}, "gac": {"type":"application/vnd.groove-account"},
"gallery": {"type":"application/x-smarttech-notebook","icon":"archive"},
"gallerycollection": {"type":"application/x-smarttech-notebook","icon":"archive"},
"galleryitem": {"type":"application/x-smarttech-notebook","icon":"archive"},
"gam": {"type":"application/x-tads"}, "gam": {"type":"application/x-tads"},
"gbr": {"type":"application/rpki-ghostbusters"}, "gbr": {"type":"application/rpki-ghostbusters"},
"gca": {"type":"application/x-gca-compressed"}, "gca": {"type":"application/x-gca-compressed"},
"gdl": {"type":"model/vnd.gdl"}, "gdl": {"type":"model/vnd.gdl"},
"gdoc": {"type":"application/vnd.google-apps.document","icon":"document","groups":["document"]}, "gdoc": {"type":"application/vnd.google-apps.document","icon":"document","groups":["document"]},
"gdraw": {"type":"application/vnd.google-apps.drawing","icon":"draw"}, "gdraw": {"type":"application/vnd.google-apps.drawing","icon":"image","groups":["image"]},
"geo": {"type":"application/vnd.dynageo"}, "geo": {"type":"application/vnd.dynageo"},
"gex": {"type":"application/vnd.geometry-explorer"}, "gex": {"type":"application/vnd.geometry-explorer"},
"ggb": {"type":"application/vnd.geogebra.file","icon":"archive"}, "ggb": {"type":"application/vnd.geogebra.file","icon":"archive"},
@ -359,7 +366,7 @@
"h261": {"type":"video/h261"}, "h261": {"type":"video/h261"},
"h263": {"type":"video/h263"}, "h263": {"type":"video/h263"},
"h264": {"type":"video/h264"}, "h264": {"type":"video/h264"},
"h5p": {"type":"application/zip","icon":"archive","string":"archive","groups":["archive"]}, "h5p": {"type":"application/zip","icon":"h5p","string":"archive"},
"hal": {"type":"application/vnd.hal+xml"}, "hal": {"type":"application/vnd.hal+xml"},
"hbci": {"type":"application/vnd.hbci"}, "hbci": {"type":"application/vnd.hbci"},
"hdf": {"type":"application/x-hdf"}, "hdf": {"type":"application/x-hdf"},
@ -434,7 +441,7 @@
"ivy": {"type":"application/x-livescreen"}, "ivy": {"type":"application/x-livescreen"},
"jad": {"type":"text/vnd.sun.j2me.app-descriptor"}, "jad": {"type":"text/vnd.sun.j2me.app-descriptor"},
"jam": {"type":"application/vnd.jam"}, "jam": {"type":"application/vnd.jam"},
"jar": {"type":"application/java-archive"}, "jar": {"type":"application/java-archive","icon":"archive"},
"jav": {"type":"text/plain"}, "jav": {"type":"text/plain"},
"java": {"type":"text/plain","icon":"sourcecode"}, "java": {"type":"text/plain","icon":"sourcecode"},
"jcb": {"type":"text/xml","icon":"markup"}, "jcb": {"type":"text/xml","icon":"markup"},
@ -447,7 +454,7 @@
"jlt": {"type":"application/vnd.hp-jlyt"}, "jlt": {"type":"application/vnd.hp-jlyt"},
"jmt": {"type":"text/xml","icon":"markup"}, "jmt": {"type":"text/xml","icon":"markup"},
"jmx": {"type":"text/xml","icon":"markup"}, "jmx": {"type":"text/xml","icon":"markup"},
"jnlp": {"type":"application/x-java-jnlp-file"}, "jnlp": {"type":"application/x-java-jnlp-file","icon":"markup"},
"joda": {"type":"application/vnd.joost.joda-archive"}, "joda": {"type":"application/vnd.joost.joda-archive"},
"jpe": {"type":"image/jpeg","icon":"jpeg","string":"image","groups":["image","web_image"]}, "jpe": {"type":"image/jpeg","icon":"jpeg","string":"image","groups":["image","web_image"]},
"jpeg": {"type":"image/jpeg","icon":"jpeg","string":"image","groups":["image","web_image"]}, "jpeg": {"type":"image/jpeg","icon":"jpeg","string":"image","groups":["image","web_image"]},
@ -458,7 +465,7 @@
"jps": {"type":"image/x-jps"}, "jps": {"type":"image/x-jps"},
"jqz": {"type":"text/xml","icon":"markup"}, "jqz": {"type":"text/xml","icon":"markup"},
"js": {"type":"application/x-javascript","icon":"text","groups":["web_file"]}, "js": {"type":"application/x-javascript","icon":"text","groups":["web_file"]},
"json": {"type":"application/json"}, "json": {"type":"application/json","icon":"text"},
"jsonml": {"type":"application/jsonml+json"}, "jsonml": {"type":"application/jsonml+json"},
"jut": {"type":"image/jutvision"}, "jut": {"type":"image/jutvision"},
"kar": {"type":"audio/midi"}, "kar": {"type":"audio/midi"},
@ -521,10 +528,10 @@
"m2v": {"type":"video/mpeg"}, "m2v": {"type":"video/mpeg"},
"m3a": {"type":"audio/mpeg"}, "m3a": {"type":"audio/mpeg"},
"m3u": {"type":"audio/x-mpegurl","icon":"mp3","string":"audio","groups":["audio"]}, "m3u": {"type":"audio/x-mpegurl","icon":"mp3","string":"audio","groups":["audio"]},
"m3u8": {"type":"application/vnd.apple.mpegurl"}, "m3u8": {"type":"application/x-mpegURL","icon":"mpeg","groups":["media_source"]},
"m4a": {"type":"audio/mp4","icon":"audio","string":"audio","groups":["audio","web_audio"]}, "m4a": {"type":"audio/mp4","icon":"mp3","string":"audio","groups":["audio","html_audio","web_audio"]},
"m4u": {"type":"video/vnd.mpegurl"}, "m4u": {"type":"video/vnd.mpegurl"},
"m4v": {"type":"video/mp4","icon":"mpeg","string":"video","groups":["video","web_video"]}, "m4v": {"type":"video/mp4","icon":"mpeg","string":"video","groups":["html_video","video","web_video"]},
"ma": {"type":"application/mathematica","string":"math"}, "ma": {"type":"application/mathematica","string":"math"},
"mads": {"type":"application/mads+xml"}, "mads": {"type":"application/mads+xml"},
"mag": {"type":"application/vnd.ecowin.chart"}, "mag": {"type":"application/vnd.ecowin.chart"},
@ -544,7 +551,7 @@
"mcf": {"type":"image/vasa"}, "mcf": {"type":"image/vasa"},
"mcp": {"type":"application/netmc"}, "mcp": {"type":"application/netmc"},
"mcurl": {"type":"text/vnd.curl.mcurl"}, "mcurl": {"type":"text/vnd.curl.mcurl"},
"mdb": {"type":"application/x-msaccess","icon":"database"}, "mdb": {"type":"application/x-msaccess","icon":"base"},
"mdi": {"type":"image/vnd.ms-modi"}, "mdi": {"type":"image/vnd.ms-modi"},
"me": {"type":"text/troff"}, "me": {"type":"text/troff"},
"mesh": {"type":"model/mesh"}, "mesh": {"type":"model/mesh"},
@ -555,8 +562,8 @@
"mft": {"type":"application/rpki-manifest"}, "mft": {"type":"application/rpki-manifest"},
"mgp": {"type":"application/vnd.osgeo.mapguide.package"}, "mgp": {"type":"application/vnd.osgeo.mapguide.package"},
"mgz": {"type":"application/vnd.proteus.magazine"}, "mgz": {"type":"application/vnd.proteus.magazine"},
"mht": {"type":"message/rfc822"}, "mht": {"type":"message/rfc822","icon":"archive"},
"mhtml": {"type":"message/rfc822"}, "mhtml": {"type":"message/rfc822","icon":"archive"},
"mid": {"type":"audio/midi"}, "mid": {"type":"audio/midi"},
"midi": {"type":"audio/midi"}, "midi": {"type":"audio/midi"},
"mie": {"type":"application/x-mie"}, "mie": {"type":"application/x-mie"},
@ -582,18 +589,19 @@
"mod": {"type":"audio/mod"}, "mod": {"type":"audio/mod"},
"mods": {"type":"application/mods+xml"}, "mods": {"type":"application/mods+xml"},
"moov": {"type":"video/quicktime"}, "moov": {"type":"video/quicktime"},
"mov": {"type":"video/quicktime","icon":"quicktime","string":"video","groups":["video","web_video"]}, "mov": {"type":"video/quicktime","icon":"quicktime","string":"video","groups":["video","web_video","html_video"]},
"movie": {"type":"video/x-sgi-movie","icon":"quicktime","string":"video","groups":["video"]}, "movie": {"type":"video/x-sgi-movie","icon":"quicktime","string":"video","groups":["video"]},
"mp2": {"type":"audio/mpeg"}, "mp2": {"type":"audio/mpeg"},
"mp21": {"type":"application/mp21"}, "mp21": {"type":"application/mp21"},
"mp2a": {"type":"audio/mpeg"}, "mp2a": {"type":"audio/mpeg"},
"mp3": {"type":"audio/mp3","icon":"mp3","string":"audio","groups":["audio","web_audio"]}, "mp3": {"type":"audio/mp3","icon":"mp3","string":"audio","groups":["audio","html_audio","web_audio"]},
"mp4": {"type":"video/mp4","icon":"mpeg","string":"video","groups":["video","web_video"]}, "mp4": {"type":"video/mp4","icon":"mpeg","string":"video","groups":["html_video","video","web_video"]},
"mp4a": {"type":"audio/mp4","icon":"audio","string":"audio","groups":["audio","web_audio"]}, "mp4a": {"type":"audio/mp4","icon":"audio","string":"audio","groups":["audio","html_audio","web_audio"]},
"mp4s": {"type":"application/mp4"}, "mp4s": {"type":"application/mp4"},
"mp4v": {"type":"video/mp4","icon":"mpeg","string":"video","groups":["video","web_video"]}, "mp4v": {"type":"video/mp4","icon":"mpeg","string":"video","groups":["video","web_video"]},
"mpa": {"type":"audio/mpeg"}, "mpa": {"type":"audio/mpeg"},
"mpc": {"type":"application/vnd.mophun.certificate"}, "mpc": {"type":"application/vnd.mophun.certificate"},
"mpd": {"type":"application/dash+xml","icon":"mpeg","groups":["media_source"]},
"mpe": {"type":"video/mpeg","icon":"mpeg","string":"video","groups":["video","web_video"]}, "mpe": {"type":"video/mpeg","icon":"mpeg","string":"video","groups":["video","web_video"]},
"mpeg": {"type":"video/mpeg","icon":"mpeg","string":"video","groups":["video","web_video"]}, "mpeg": {"type":"video/mpeg","icon":"mpeg","string":"video","groups":["video","web_video"]},
"mpg": {"type":"video/mpeg","icon":"mpeg","string":"video","groups":["video","web_video"]}, "mpg": {"type":"video/mpeg","icon":"mpeg","string":"video","groups":["video","web_video"]},
@ -603,6 +611,7 @@
"mpm": {"type":"application/vnd.blueice.multipass"}, "mpm": {"type":"application/vnd.blueice.multipass"},
"mpn": {"type":"application/vnd.mophun.application"}, "mpn": {"type":"application/vnd.mophun.application"},
"mpp": {"type":"application/vnd.ms-project"}, "mpp": {"type":"application/vnd.ms-project"},
"mpr": {"type":"application/vnd.moodle.profiling","icon":"moodle"},
"mpt": {"type":"application/vnd.ms-project"}, "mpt": {"type":"application/vnd.ms-project"},
"mpv": {"type":"application/x-project"}, "mpv": {"type":"application/x-project"},
"mpx": {"type":"application/x-project"}, "mpx": {"type":"application/x-project"},
@ -624,7 +633,9 @@
"musicxml": {"type":"application/vnd.recordare.musicxml+xml"}, "musicxml": {"type":"application/vnd.recordare.musicxml+xml"},
"mv": {"type":"video/x-sgi-movie"}, "mv": {"type":"video/x-sgi-movie"},
"mvb": {"type":"application/x-msmediaview"}, "mvb": {"type":"application/x-msmediaview"},
"mw": {"type":"application/maple","icon":"math"},
"mwf": {"type":"application/vnd.mfer"}, "mwf": {"type":"application/vnd.mfer"},
"mws": {"type":"application/maple","icon":"math"},
"mxf": {"type":"application/mxf"}, "mxf": {"type":"application/mxf"},
"mxl": {"type":"application/vnd.recordare.musicxml"}, "mxl": {"type":"application/vnd.recordare.musicxml"},
"mxml": {"type":"application/xv+xml"}, "mxml": {"type":"application/xv+xml"},
@ -637,6 +648,7 @@
"nap": {"type":"image/naplps"}, "nap": {"type":"image/naplps"},
"naplps": {"type":"image/naplps"}, "naplps": {"type":"image/naplps"},
"nb": {"type":"application/mathematica","string":"math"}, "nb": {"type":"application/mathematica","string":"math"},
"nbk": {"type":"application/x-smarttech-notebook","icon":"archive"},
"nbp": {"type":"application/vnd.wolfram.player"}, "nbp": {"type":"application/vnd.wolfram.player"},
"nc": {"type":"application/x-netcdf"}, "nc": {"type":"application/x-netcdf"},
"ncm": {"type":"application/vnd.nokia.configuration-message"}, "ncm": {"type":"application/vnd.nokia.configuration-message"},
@ -652,6 +664,7 @@
"nnd": {"type":"application/vnd.noblenet-directory"}, "nnd": {"type":"application/vnd.noblenet-directory"},
"nns": {"type":"application/vnd.noblenet-sealer"}, "nns": {"type":"application/vnd.noblenet-sealer"},
"nnw": {"type":"application/vnd.noblenet-web"}, "nnw": {"type":"application/vnd.noblenet-web"},
"notebook": {"type":"application/x-smarttech-notebook","icon":"archive"},
"npx": {"type":"image/vnd.net-fpx"}, "npx": {"type":"image/vnd.net-fpx"},
"nsc": {"type":"application/x-conference"}, "nsc": {"type":"application/x-conference"},
"nsf": {"type":"application/vnd.lotus-notes"}, "nsf": {"type":"application/vnd.lotus-notes"},
@ -672,12 +685,12 @@
"odg": {"type":"application/vnd.oasis.opendocument.graphics","icon":"draw"}, "odg": {"type":"application/vnd.oasis.opendocument.graphics","icon":"draw"},
"odi": {"type":"application/vnd.oasis.opendocument.image","icon":"draw"}, "odi": {"type":"application/vnd.oasis.opendocument.image","icon":"draw"},
"odm": {"type":"application/vnd.oasis.opendocument.text-master","icon":"writer"}, "odm": {"type":"application/vnd.oasis.opendocument.text-master","icon":"writer"},
"odp": {"type":"application/vnd.oasis.opendocument.presentation","icon":"impress"}, "odp": {"type":"application/vnd.oasis.opendocument.presentation","icon":"impress","groups":["presentation"]},
"ods": {"type":"application/vnd.oasis.opendocument.spreadsheet","icon":"calc","groups":["spreadsheet"]}, "ods": {"type":"application/vnd.oasis.opendocument.spreadsheet","icon":"calc","groups":["spreadsheet"]},
"odt": {"type":"application/vnd.oasis.opendocument.text","icon":"writer","groups":["document"]}, "odt": {"type":"application/vnd.oasis.opendocument.text","icon":"writer","groups":["document"]},
"oga": {"type":"audio/ogg","icon":"audio","string":"audio","groups":["audio","web_audio"]}, "oga": {"type":"audio/ogg","icon":"audio","string":"audio","groups":["audio","html_audio","web_audio"]},
"ogg": {"type":"audio/ogg","icon":"audio","string":"audio","groups":["audio","web_audio"]}, "ogg": {"type":"audio/ogg","icon":"audio","string":"audio","groups":["audio","html_audio","web_audio"]},
"ogv": {"type":"video/ogg","icon":"video","string":"video","groups":["video","web_video"]}, "ogv": {"type":"video/ogg","icon":"video","string":"video","groups":["html_video","video","web_video"]},
"ogx": {"type":"application/ogg"}, "ogx": {"type":"application/ogg"},
"omc": {"type":"application/x-omc"}, "omc": {"type":"application/x-omc"},
"omcd": {"type":"application/x-omcdatamaker"}, "omcd": {"type":"application/x-omcdatamaker"},
@ -698,7 +711,7 @@
"otg": {"type":"application/vnd.oasis.opendocument.graphics-template","icon":"draw"}, "otg": {"type":"application/vnd.oasis.opendocument.graphics-template","icon":"draw"},
"oth": {"type":"application/vnd.oasis.opendocument.text-web","icon":"oth","groups":["document"]}, "oth": {"type":"application/vnd.oasis.opendocument.text-web","icon":"oth","groups":["document"]},
"oti": {"type":"application/vnd.oasis.opendocument.image-template"}, "oti": {"type":"application/vnd.oasis.opendocument.image-template"},
"otp": {"type":"application/vnd.oasis.opendocument.presentation-template","icon":"impress"}, "otp": {"type":"application/vnd.oasis.opendocument.presentation-template","icon":"impress","groups":["presentation"]},
"ots": {"type":"application/vnd.oasis.opendocument.spreadsheet-template","icon":"calc","groups":["spreadsheet"]}, "ots": {"type":"application/vnd.oasis.opendocument.spreadsheet-template","icon":"calc","groups":["spreadsheet"]},
"ott": {"type":"application/vnd.oasis.opendocument.text-template","icon":"writer","groups":["document"]}, "ott": {"type":"application/vnd.oasis.opendocument.text-template","icon":"writer","groups":["document"]},
"oxps": {"type":"application/oxps"}, "oxps": {"type":"application/oxps"},
@ -726,7 +739,7 @@
"pcurl": {"type":"application/vnd.curl.pcurl"}, "pcurl": {"type":"application/vnd.curl.pcurl"},
"pcx": {"type":"image/x-pcx"}, "pcx": {"type":"image/x-pcx"},
"pdb": {"type":"application/vnd.palm"}, "pdb": {"type":"application/vnd.palm"},
"pdf": {"type":"application/pdf","icon":"pdf"}, "pdf": {"type":"application/pdf","icon":"pdf","groups":["document"]},
"pem": {"type":"application/x-pem-file"}, "pem": {"type":"application/x-pem-file"},
"pfa": {"type":"application/x-font-type1"}, "pfa": {"type":"application/x-font-type1"},
"pfb": {"type":"application/x-font-type1"}, "pfb": {"type":"application/x-font-type1"},
@ -760,20 +773,20 @@
"png": {"type":"image/png","icon":"png","string":"image","groups":["image","web_image"]}, "png": {"type":"image/png","icon":"png","string":"image","groups":["image","web_image"]},
"pnm": {"type":"image/x-portable-anymap"}, "pnm": {"type":"image/x-portable-anymap"},
"portpkg": {"type":"application/vnd.macports.portpkg"}, "portpkg": {"type":"application/vnd.macports.portpkg"},
"pot": {"type":"application/vnd.ms-powerpoint","icon":"powerpoint"}, "pot": {"type":"application/vnd.ms-powerpoint","icon":"powerpoint","groups":["presentation"]},
"potm": {"type":"application/vnd.ms-powerpoint.template.macroenabled.12","icon":"powerpoint"}, "potm": {"type":"application/vnd.ms-powerpoint.template.macroenabled.12","icon":"powerpoint","groups":["presentation"]},
"potx": {"type":"application/vnd.openxmlformats-officedocument.presentationml.template","icon":"powerpoint"}, "potx": {"type":"application/vnd.openxmlformats-officedocument.presentationml.template","icon":"powerpoint","groups":["presentation"]},
"pov": {"type":"model/x-pov"}, "pov": {"type":"model/x-pov"},
"ppa": {"type":"application/vnd.ms-powerpoint","icon":"powerpoint"}, "ppa": {"type":"application/vnd.ms-powerpoint","icon":"powerpoint","groups":["presentation"]},
"ppam": {"type":"application/vnd.ms-powerpoint.addin.macroenabled.12","icon":"powerpoint"}, "ppam": {"type":"application/vnd.ms-powerpoint.addin.macroenabled.12","icon":"powerpoint","groups":["presentation"]},
"ppd": {"type":"application/vnd.cups-ppd"}, "ppd": {"type":"application/vnd.cups-ppd"},
"ppm": {"type":"image/x-portable-pixmap"}, "ppm": {"type":"image/x-portable-pixmap"},
"pps": {"type":"application/vnd.ms-powerpoint","icon":"powerpoint","groups":["presentation"]}, "pps": {"type":"application/vnd.ms-powerpoint","icon":"powerpoint","groups":["presentation"]},
"ppsm": {"type":"application/vnd.ms-powerpoint.slideshow.macroenabled.12","icon":"powerpoint"}, "ppsm": {"type":"application/vnd.ms-powerpoint.slideshow.macroenabled.12","icon":"powerpoint","groups":["presentation"]},
"ppsx": {"type":"application/vnd.openxmlformats-officedocument.presentationml.slideshow","icon":"powerpoint"}, "ppsx": {"type":"application/vnd.openxmlformats-officedocument.presentationml.slideshow","icon":"powerpoint","groups":["presentation"]},
"ppt": {"type":"application/vnd.ms-powerpoint","icon":"powerpoint","groups":["presentation"]}, "ppt": {"type":"application/vnd.ms-powerpoint","icon":"powerpoint","groups":["presentation"]},
"pptm": {"type":"application/vnd.ms-powerpoint.presentation.macroenabled.12","icon":"powerpoint"}, "pptm": {"type":"application/vnd.ms-powerpoint.presentation.macroenabled.12","icon":"powerpoint","groups":["presentation"]},
"pptx": {"type":"application/vnd.openxmlformats-officedocument.presentationml.presentation","icon":"powerpoint"}, "pptx": {"type":"application/vnd.openxmlformats-officedocument.presentationml.presentation","icon":"powerpoint","groups":["presentation"]},
"ppz": {"type":"application/mspowerpoint"}, "ppz": {"type":"application/mspowerpoint"},
"pqa": {"type":"application/vnd.palm"}, "pqa": {"type":"application/vnd.palm"},
"prc": {"type":"application/x-mobipocket-ebook"}, "prc": {"type":"application/x-mobipocket-ebook"},
@ -786,11 +799,11 @@
"psf": {"type":"application/x-font-linux-psf"}, "psf": {"type":"application/x-font-linux-psf"},
"pskcxml": {"type":"application/pskc+xml"}, "pskcxml": {"type":"application/pskc+xml"},
"ptid": {"type":"application/vnd.pvi.ptid1"}, "ptid": {"type":"application/vnd.pvi.ptid1"},
"pub": {"type":"application/x-mspublisher","icon":"publisher"}, "pub": {"type":"application/x-mspublisher","icon":"publisher","groups":["presentation"]},
"pvb": {"type":"application/vnd.3gpp.pic-bw-var"}, "pvb": {"type":"application/vnd.3gpp.pic-bw-var"},
"pvu": {"type":"paleovu/x-pv"}, "pvu": {"type":"paleovu/x-pv"},
"pwn": {"type":"application/vnd.3m.post-it-notes"}, "pwn": {"type":"application/vnd.3m.post-it-notes"},
"pwz": {"type":"application/vnd.ms-powerpoint","icon":"powerpoint"}, "pwz": {"type":"application/vnd.ms-powerpoint","icon":"powerpoint","groups":["presentation"]},
"py": {"type":"text/x-script.phyton"}, "py": {"type":"text/x-script.phyton"},
"pya": {"type":"audio/vnd.ms-playready.media.pya"}, "pya": {"type":"audio/vnd.ms-playready.media.pya"},
"pyc": {"type":"application/x-bytecode.python"}, "pyc": {"type":"application/x-bytecode.python"},
@ -815,7 +828,7 @@
"qxt": {"type":"application/vnd.quark.quarkxpress"}, "qxt": {"type":"application/vnd.quark.quarkxpress"},
"ra": {"type":"audio/x-realaudio-plugin","icon":"audio","string":"audio","groups":["audio","web_audio"]}, "ra": {"type":"audio/x-realaudio-plugin","icon":"audio","string":"audio","groups":["audio","web_audio"]},
"ram": {"type":"audio/x-pn-realaudio-plugin","icon":"audio","string":"audio","groups":["audio"]}, "ram": {"type":"audio/x-pn-realaudio-plugin","icon":"audio","string":"audio","groups":["audio"]},
"rar": {"type":"application/x-rar-compressed"}, "rar": {"type":"application/x-rar-compressed","icon":"archive","string":"archive","groups":["archive"]},
"ras": {"type":"image/x-cmu-raster"}, "ras": {"type":"image/x-cmu-raster"},
"rast": {"type":"image/cmu-raster"}, "rast": {"type":"image/cmu-raster"},
"rb": {"type":"text/plain"}, "rb": {"type":"text/plain"},
@ -872,7 +885,7 @@
"scm": {"type":"application/vnd.lotus-screencam"}, "scm": {"type":"application/vnd.lotus-screencam"},
"scq": {"type":"application/scvp-cv-request"}, "scq": {"type":"application/scvp-cv-request"},
"scs": {"type":"application/scvp-cv-response"}, "scs": {"type":"application/scvp-cv-response"},
"scss": {"type":"text/x-scss"}, "scss": {"type":"text/x-scss","icon":"text","groups":["web_file"]},
"scurl": {"type":"text/vnd.curl.scurl"}, "scurl": {"type":"text/vnd.curl.scurl"},
"sda": {"type":"application/vnd.stardivision.draw","icon":"draw"}, "sda": {"type":"application/vnd.stardivision.draw","icon":"draw"},
"sdc": {"type":"application/vnd.stardivision.calc","icon":"calc"}, "sdc": {"type":"application/vnd.stardivision.calc","icon":"calc"},
@ -917,7 +930,7 @@
"skp": {"type":"application/vnd.koan"}, "skp": {"type":"application/vnd.koan"},
"skt": {"type":"application/vnd.koan"}, "skt": {"type":"application/vnd.koan"},
"sl": {"type":"application/x-seelogo"}, "sl": {"type":"application/x-seelogo"},
"sldm": {"type":"application/vnd.ms-powerpoint.slide.macroenabled.12","icon":"powerpoint"}, "sldm": {"type":"application/vnd.ms-powerpoint.slide.macroenabled.12","icon":"powerpoint","groups":["presentation"]},
"sldx": {"type":"application/vnd.openxmlformats-officedocument.presentationml.slide"}, "sldx": {"type":"application/vnd.openxmlformats-officedocument.presentationml.slide"},
"slt": {"type":"application/vnd.epson.salt"}, "slt": {"type":"application/vnd.epson.salt"},
"sm": {"type":"application/vnd.stepmania.stepchart"}, "sm": {"type":"application/vnd.stepmania.stepchart"},
@ -957,7 +970,7 @@
"std": {"type":"application/vnd.sun.xml.draw.template","icon":"draw"}, "std": {"type":"application/vnd.sun.xml.draw.template","icon":"draw"},
"step": {"type":"application/step"}, "step": {"type":"application/step"},
"stf": {"type":"application/vnd.wt.stf"}, "stf": {"type":"application/vnd.wt.stf"},
"sti": {"type":"application/vnd.sun.xml.impress.template","icon":"impress"}, "sti": {"type":"application/vnd.sun.xml.impress.template","icon":"impress","groups":["presentation"]},
"stk": {"type":"application/hyperstudio"}, "stk": {"type":"application/hyperstudio"},
"stl": {"type":"application/vnd.ms-pki.stl"}, "stl": {"type":"application/vnd.ms-pki.stl"},
"stp": {"type":"application/step"}, "stp": {"type":"application/step"},
@ -982,7 +995,7 @@
"sxc": {"type":"application/vnd.sun.xml.calc","icon":"calc"}, "sxc": {"type":"application/vnd.sun.xml.calc","icon":"calc"},
"sxd": {"type":"application/vnd.sun.xml.draw","icon":"draw"}, "sxd": {"type":"application/vnd.sun.xml.draw","icon":"draw"},
"sxg": {"type":"application/vnd.sun.xml.writer.global","icon":"writer"}, "sxg": {"type":"application/vnd.sun.xml.writer.global","icon":"writer"},
"sxi": {"type":"application/vnd.sun.xml.impress","icon":"impress"}, "sxi": {"type":"application/vnd.sun.xml.impress","icon":"impress","groups":["presentation"]},
"sxm": {"type":"application/vnd.sun.xml.math","icon":"math"}, "sxm": {"type":"application/vnd.sun.xml.math","icon":"math"},
"sxw": {"type":"application/vnd.sun.xml.writer","icon":"writer"}, "sxw": {"type":"application/vnd.sun.xml.writer","icon":"writer"},
"t": {"type":"text/troff"}, "t": {"type":"text/troff"},
@ -1016,6 +1029,7 @@
"tr": {"type":"text/troff"}, "tr": {"type":"text/troff"},
"tra": {"type":"application/vnd.trueapp"}, "tra": {"type":"application/vnd.trueapp"},
"trm": {"type":"application/x-msterminal"}, "trm": {"type":"application/x-msterminal"},
"ts": {"type":"video/MP2T","icon":"mpeg","string":"video","groups":["video","web_video"]},
"tsd": {"type":"application/timestamped-data"}, "tsd": {"type":"application/timestamped-data"},
"tsi": {"type":"audio/tsp-audio"}, "tsi": {"type":"audio/tsp-audio"},
"tsp": {"type":"application/dsptype"}, "tsp": {"type":"application/dsptype"},
@ -1028,7 +1042,7 @@
"twds": {"type":"application/vnd.simtech-mindmapper"}, "twds": {"type":"application/vnd.simtech-mindmapper"},
"txd": {"type":"application/vnd.genomatix.tuxedo"}, "txd": {"type":"application/vnd.genomatix.tuxedo"},
"txf": {"type":"application/vnd.mobius.txf"}, "txf": {"type":"application/vnd.mobius.txf"},
"txt": {"type":"text/plain","icon":"text"}, "txt": {"type":"text/plain","icon":"text","defaulticon":true},
"udeb": {"type":"application/x-debian-package"}, "udeb": {"type":"application/x-debian-package"},
"ufd": {"type":"application/vnd.ufdl"}, "ufd": {"type":"application/vnd.ufdl"},
"ufdl": {"type":"application/vnd.ufdl"}, "ufdl": {"type":"application/vnd.ufdl"},
@ -1104,7 +1118,7 @@
"vss": {"type":"application/vnd.visio"}, "vss": {"type":"application/vnd.visio"},
"vst": {"type":"application/vnd.visio"}, "vst": {"type":"application/vnd.visio"},
"vsw": {"type":"application/vnd.visio"}, "vsw": {"type":"application/vnd.visio"},
"vtt": {"type":"text/vtt"}, "vtt": {"type":"text/vtt","icon":"text","groups":["html_track"]},
"vtu": {"type":"model/vnd.vtu"}, "vtu": {"type":"model/vnd.vtu"},
"vxml": {"type":"application/voicexml+xml"}, "vxml": {"type":"application/voicexml+xml"},
"w3d": {"type":"application/x-director"}, "w3d": {"type":"application/x-director"},
@ -1112,7 +1126,7 @@
"w61": {"type":"application/wordperfect6.1"}, "w61": {"type":"application/wordperfect6.1"},
"w6w": {"type":"application/msword"}, "w6w": {"type":"application/msword"},
"wad": {"type":"application/x-doom"}, "wad": {"type":"application/x-doom"},
"wav": {"type":"audio/wav","icon":"wav","string":"audio","groups":["audio","web_audio"]}, "wav": {"type":"audio/wav","icon":"wav","string":"audio","groups":["audio","html_audio","web_audio"]},
"wax": {"type":"audio/x-ms-wax"}, "wax": {"type":"audio/x-ms-wax"},
"wb1": {"type":"application/x-qpro"}, "wb1": {"type":"application/x-qpro"},
"wbmp": {"type":"image/vnd.wap.wbmp"}, "wbmp": {"type":"image/vnd.wap.wbmp"},
@ -1122,8 +1136,8 @@
"wdb": {"type":"application/vnd.ms-works"}, "wdb": {"type":"application/vnd.ms-works"},
"wdp": {"type":"image/vnd.ms-photo"}, "wdp": {"type":"image/vnd.ms-photo"},
"web": {"type":"application/vnd.xara"}, "web": {"type":"application/vnd.xara"},
"weba": {"type":"audio/webm","icon":"audio","string":"audio","groups":["audio","web_audio"]}, "weba": {"type":"audio/webm","icon":"audio","string":"audio","groups":["audio","html_audio","web_audio"]},
"webm": {"type":"video/webm","icon":"video","string":"video","groups":["video","web_video"]}, "webm": {"type":"video/webm","icon":"video","string":"video","groups":["html_video","video","web_video"]},
"webp": {"type":"image/webp"}, "webp": {"type":"image/webp"},
"wg": {"type":"application/vnd.pmi.widget"}, "wg": {"type":"application/vnd.pmi.widget"},
"wgt": {"type":"application/widget"}, "wgt": {"type":"application/widget"},
@ -1131,7 +1145,7 @@
"wk1": {"type":"application/x-123"}, "wk1": {"type":"application/x-123"},
"wks": {"type":"application/vnd.ms-works"}, "wks": {"type":"application/vnd.ms-works"},
"wm": {"type":"video/x-ms-wm"}, "wm": {"type":"video/x-ms-wm"},
"wma": {"type":"audio/x-ms-wma"}, "wma": {"type":"audio/x-ms-wma","icon":"audio","string":"audio","groups":["audio"]},
"wmd": {"type":"application/x-ms-wmd"}, "wmd": {"type":"application/x-ms-wmd"},
"wmf": {"type":"application/x-msmetafile"}, "wmf": {"type":"application/x-msmetafile"},
"wml": {"type":"text/vnd.wap.wml"}, "wml": {"type":"text/vnd.wap.wml"},
@ -1173,17 +1187,18 @@
"xar": {"type":"application/vnd.xara"}, "xar": {"type":"application/vnd.xara"},
"xbap": {"type":"application/x-ms-xbap"}, "xbap": {"type":"application/x-ms-xbap"},
"xbd": {"type":"application/vnd.fujixerox.docuworks.binder"}, "xbd": {"type":"application/vnd.fujixerox.docuworks.binder"},
"xbk": {"type":"application/x-smarttech-notebook","icon":"archive"},
"xbm": {"type":"image/x-xbitmap"}, "xbm": {"type":"image/x-xbitmap"},
"xdf": {"type":"application/xcap-diff+xml"}, "xdf": {"type":"application/xcap-diff+xml"},
"xdm": {"type":"application/vnd.syncml.dm+xml"}, "xdm": {"type":"application/vnd.syncml.dm+xml"},
"xdp": {"type":"application/pdf","icon":"pdf"}, "xdp": {"type":"application/vnd.adobe.xdp+xml","icon":"pdf"},
"xdr": {"type":"video/x-amt-demorun"}, "xdr": {"type":"video/x-amt-demorun"},
"xdssc": {"type":"application/dssc+xml"}, "xdssc": {"type":"application/dssc+xml"},
"xdw": {"type":"application/vnd.fujixerox.docuworks"}, "xdw": {"type":"application/vnd.fujixerox.docuworks"},
"xenc": {"type":"application/xenc+xml"}, "xenc": {"type":"application/xenc+xml"},
"xer": {"type":"application/patch-ops-error+xml"}, "xer": {"type":"application/patch-ops-error+xml"},
"xfd": {"type":"application/pdf","icon":"pdf"}, "xfd": {"type":"application/vnd.xfdl","icon":"pdf"},
"xfdf": {"type":"application/pdf","icon":"pdf"}, "xfdf": {"type":"application/vnd.adobe.xfdf","icon":"pdf"},
"xfdl": {"type":"application/vnd.xfdl"}, "xfdl": {"type":"application/vnd.xfdl"},
"xgz": {"type":"xgl/drawing"}, "xgz": {"type":"xgl/drawing"},
"xht": {"type":"application/xhtml+xml"}, "xht": {"type":"application/xhtml+xml"},
@ -1203,7 +1218,7 @@
"xls": {"type":"application/vnd.ms-excel","icon":"spreadsheet","groups":["spreadsheet"]}, "xls": {"type":"application/vnd.ms-excel","icon":"spreadsheet","groups":["spreadsheet"]},
"xlsb": {"type":"application/vnd.ms-excel.sheet.binary.macroenabled.12","icon":"spreadsheet"}, "xlsb": {"type":"application/vnd.ms-excel.sheet.binary.macroenabled.12","icon":"spreadsheet"},
"xlsm": {"type":"application/vnd.ms-excel.sheet.macroenabled.12","icon":"spreadsheet","groups":["spreadsheet"]}, "xlsm": {"type":"application/vnd.ms-excel.sheet.macroenabled.12","icon":"spreadsheet","groups":["spreadsheet"]},
"xlsx": {"type":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","icon":"spreadsheet"}, "xlsx": {"type":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","icon":"spreadsheet","groups":["spreadsheet"]},
"xlt": {"type":"application/vnd.ms-excel","icon":"spreadsheet"}, "xlt": {"type":"application/vnd.ms-excel","icon":"spreadsheet"},
"xltm": {"type":"application/vnd.ms-excel.template.macroenabled.12","icon":"spreadsheet"}, "xltm": {"type":"application/vnd.ms-excel.template.macroenabled.12","icon":"spreadsheet"},
"xltx": {"type":"application/vnd.openxmlformats-officedocument.spreadsheetml.template","icon":"spreadsheet"}, "xltx": {"type":"application/vnd.openxmlformats-officedocument.spreadsheetml.template","icon":"spreadsheet"},

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -1331,7 +1331,7 @@
"core.block.blocks": "Blocks", "core.block.blocks": "Blocks",
"core.browser": "Browser", "core.browser": "Browser",
"core.cancel": "Cancel", "core.cancel": "Cancel",
"core.cannotconnect": "Cannot connect: Verify that you have correctly typed the URL and that your site uses Moodle {{$a}} or later.", "core.cannotconnect": "<strong>Cannot connect</strong>: Verify that you have correctly typed your site address.",
"core.cannotdownloadfiles": "File downloading is disabled. Please contact your site administrator.", "core.cannotdownloadfiles": "File downloading is disabled. Please contact your site administrator.",
"core.captureaudio": "Record audio", "core.captureaudio": "Record audio",
"core.capturedimage": "Taken picture.", "core.capturedimage": "Taken picture.",
@ -1707,7 +1707,17 @@
"core.login.emailnotmatch": "Emails do not match", "core.login.emailnotmatch": "Emails do not match",
"core.login.erroraccesscontrolalloworigin": "The cross-origin call you're trying to perform has been rejected. Please check https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", "core.login.erroraccesscontrolalloworigin": "The cross-origin call you're trying to perform has been rejected. Please check https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium",
"core.login.errordeletesite": "An error occurred while deleting this site. Please try again.", "core.login.errordeletesite": "An error occurred while deleting this site. Please try again.",
"core.login.errorexampleurl": "The URL https://campus.example.edu is only an example URL, it's not a real site. <strong>Please use the URL of your school or organization's site.</strong>",
"core.login.errorupdatesite": "An error occurred while updating the site's token.", "core.login.errorupdatesite": "An error occurred while updating the site's token.",
"core.login.faqcannotconnectanswer": "Please, contact your site administrator.",
"core.login.faqcannotconnectquestion": "I typed my site address correctly but I still can't connect.",
"core.login.faqsetupsiteanswer": "Visit {{$link}} to check out the different options you have to create your own Moodle site.",
"core.login.faqsetupsitelinktitle": "Get started.",
"core.login.faqsetupsitequestion": "I want to set up my own Moodle site.",
"core.login.faqtestappanswer": "To test the app in a Moodle Demo Site, type \"teacher\" or \"student\" in the \"Your site address\" field and click the \"Connect!\" button.",
"core.login.faqtestappquestion": "I just want to test the app, what can I do?",
"core.login.faqwhatisurlanswer": "<p>Every organisation or school has their own custom address for their Moodle site.</p><p>To find the address of the Moodle site you want to connect to, do the following:</p><ol><li>Open a web browser and go to your school's or organisation's Moodle site login page</li><li>At the top of the page, on the address bar, you will see the URL of your Moodle site. E.g. \"campus.example.edu\".{{$image}}</li><li>Copy the address (do not copy the /login and what comes after), paste it into the Moodle App and click \"Connect!\"</li><li>Now you can log into your site, using your username and password</li>",
"core.login.faqwhatisurlquestion": "What is the URL of my Moodle site? How can I find my schools site?",
"core.login.findyoursite": "Find your site", "core.login.findyoursite": "Find your site",
"core.login.firsttime": "Is this your first time here?", "core.login.firsttime": "Is this your first time here?",
"core.login.forcepasswordchangenotice": "You must change your password to proceed.", "core.login.forcepasswordchangenotice": "You must change your password to proceed.",
@ -1736,7 +1746,6 @@
"core.login.mobileservicesnotenabled": "Mobile access is not enabled on your site. Please contact your site administrator if you think it should be enabled.", "core.login.mobileservicesnotenabled": "Mobile access is not enabled on your site. Please contact your site administrator if you think it should be enabled.",
"core.login.mustconfirm": "You need to confirm your account", "core.login.mustconfirm": "You need to confirm your account",
"core.login.newaccount": "New account", "core.login.newaccount": "New account",
"core.login.newsitedescription": "Please enter the URL of your Moodle site. Note that it might not be configured to work with this app.",
"core.login.notloggedin": "You need to be logged in.", "core.login.notloggedin": "You need to be logged in.",
"core.login.password": "Password", "core.login.password": "Password",
"core.login.passwordforgotten": "Forgotten password", "core.login.passwordforgotten": "Forgotten password",
@ -1762,7 +1771,7 @@
"core.login.selectacountry": "Select a country", "core.login.selectacountry": "Select a country",
"core.login.selectsite": "Please select your site:", "core.login.selectsite": "Please select your site:",
"core.login.signupplugindisabled": "{{$a}} is not enabled.", "core.login.signupplugindisabled": "{{$a}} is not enabled.",
"core.login.siteaddress": "Site address", "core.login.siteaddress": "Your site address",
"core.login.sitehasredirect": "Your site contains at least one HTTP redirect. The app cannot follow redirects, this could be the issue that's preventing the app from connecting to your site.", "core.login.sitehasredirect": "Your site contains at least one HTTP redirect. The app cannot follow redirects, this could be the issue that's preventing the app from connecting to your site.",
"core.login.siteinmaintenance": "Your site is in maintenance mode", "core.login.siteinmaintenance": "Your site is in maintenance mode",
"core.login.sitepolicynotagreederror": "Site policy not agreed.", "core.login.sitepolicynotagreederror": "Site policy not agreed.",
@ -1816,6 +1825,7 @@
"core.more": "more", "core.more": "more",
"core.mygroups": "My groups", "core.mygroups": "My groups",
"core.name": "Name", "core.name": "Name",
"core.needhelp": "Need help?",
"core.networkerroriframemsg": "This content is not available offline. Please connect to the internet and try again.", "core.networkerroriframemsg": "This content is not available offline. Please connect to the internet and try again.",
"core.networkerrormsg": "There was a problem connecting to the site. Please check your connection and try again.", "core.networkerrormsg": "There was a problem connecting to the site. Please check your connection and try again.",
"core.never": "Never", "core.never": "Never",
@ -2090,6 +2100,7 @@
"core.warningofflinedatadeleted": "Offline data from {{component}} '{{name}}' has been deleted. {{error}}", "core.warningofflinedatadeleted": "Offline data from {{component}} '{{name}}' has been deleted. {{error}}",
"core.whatisyourage": "What is your age?", "core.whatisyourage": "What is your age?",
"core.wheredoyoulive": "In which country do you live?", "core.wheredoyoulive": "In which country do you live?",
"core.whoissiteadmin": "\"Site Administrators\" are the people who manage the Moodle at your school/university/company or learning organisation. If you don't know how to contact them, please contact your teachers/trainers.",
"core.whoops": "Oops!", "core.whoops": "Oops!",
"core.whyisthishappening": "Why is this happening?", "core.whyisthishappening": "Why is this happening?",
"core.whyisthisrequired": "Why is this required?", "core.whyisthisrequired": "Why is this required?",

View File

@ -20,6 +20,7 @@
"application/clariscad": ["ccad"], "application/clariscad": ["ccad"],
"application/commonground": ["dp"], "application/commonground": ["dp"],
"application/cu-seeme": ["cu"], "application/cu-seeme": ["cu"],
"application/dash+xml": ["mpd"],
"application/davmount+xml": ["davmount"], "application/davmount+xml": ["davmount"],
"application/docbook+xml": ["dbk"], "application/docbook+xml": ["dbk"],
"application/drafting": ["drw"], "application/drafting": ["drw"],
@ -71,6 +72,7 @@
"application/mac-compactpro": ["cpt"], "application/mac-compactpro": ["cpt"],
"application/macbinary": ["bin"], "application/macbinary": ["bin"],
"application/mads+xml": ["mads"], "application/mads+xml": ["mads"],
"application/maple": ["mw","mws"],
"application/marc": ["mrc"], "application/marc": ["mrc"],
"application/marcxml+xml": ["mrcx"], "application/marcxml+xml": ["mrcx"],
"application/mathematica": ["ma","mb","nb"], "application/mathematica": ["ma","mb","nb"],
@ -355,6 +357,7 @@
"application/vnd.mobius.plc": ["plc"], "application/vnd.mobius.plc": ["plc"],
"application/vnd.mobius.txf": ["txf"], "application/vnd.mobius.txf": ["txf"],
"application/vnd.moodle.backup": ["mbz"], "application/vnd.moodle.backup": ["mbz"],
"application/vnd.moodle.profiling": ["mpr"],
"application/vnd.mophun.application": ["mpn"], "application/vnd.mophun.application": ["mpn"],
"application/vnd.mophun.certificate": ["mpc"], "application/vnd.mophun.certificate": ["mpc"],
"application/vnd.mozilla.xul+xml": ["xul"], "application/vnd.mozilla.xul+xml": ["xul"],
@ -520,7 +523,7 @@
"application/vnd.wqd": ["wqd"], "application/vnd.wqd": ["wqd"],
"application/vnd.wt.stf": ["stf"], "application/vnd.wt.stf": ["stf"],
"application/vnd.xara": ["xar","web"], "application/vnd.xara": ["xar","web"],
"application/vnd.xfdl": ["xfdl"], "application/vnd.xfdl": ["xfdl","xfd"],
"application/vnd.yamaha.hv-dic": ["hvd"], "application/vnd.yamaha.hv-dic": ["hvd"],
"application/vnd.yamaha.hv-script": ["hvs"], "application/vnd.yamaha.hv-script": ["hvs"],
"application/vnd.yamaha.hv-voice": ["hvp"], "application/vnd.yamaha.hv-voice": ["hvp"],
@ -579,6 +582,7 @@
"application/x-debian-package": ["deb","udeb"], "application/x-debian-package": ["deb","udeb"],
"application/x-deepv": ["deepv"], "application/x-deepv": ["deepv"],
"application/x-dgc-compressed": ["dgc"], "application/x-dgc-compressed": ["dgc"],
"application/x-digidoc": ["bdoc","cdoc","ddoc"],
"application/x-director": ["cct","cst","cxt","dcr","dir","dxr","fgd","swa","w3d"], "application/x-director": ["cct","cst","cxt","dcr","dir","dxr","fgd","swa","w3d"],
"application/x-doom": ["wad"], "application/x-doom": ["wad"],
"application/x-dtbncx+xml": ["ncx"], "application/x-dtbncx+xml": ["ncx"],
@ -709,6 +713,7 @@
"application/x-shockwave-flash": ["swf","swfl"], "application/x-shockwave-flash": ["swf","swfl"],
"application/x-silverlight-app": ["xap"], "application/x-silverlight-app": ["xap"],
"application/x-sit": ["sit"], "application/x-sit": ["sit"],
"application/x-smarttech-notebook": ["gallery","gallerycollection","galleryitem","nbk","notebook","xbk"],
"application/x-sprite": ["spr","sprite"], "application/x-sprite": ["spr","sprite"],
"application/x-sql": ["sql"], "application/x-sql": ["sql"],
"application/x-stuffit": ["sit"], "application/x-stuffit": ["sit"],
@ -762,13 +767,14 @@
"application/xv+xml": ["mxml","xhvml","xvm","xvml"], "application/xv+xml": ["mxml","xhvml","xvm","xvml"],
"application/yang": ["yang"], "application/yang": ["yang"],
"application/yin+xml": ["yin"], "application/yin+xml": ["yin"],
"application/zip": ["zip"], "application/zip": ["zip","h5p"],
"audio/aac": ["aac"], "audio/aac": ["aac"],
"audio/adpcm": ["adp"], "audio/adpcm": ["adp"],
"audio/aiff": ["aif","aifc","aiff"], "audio/aiff": ["aif","aifc","aiff"],
"audio/amr": ["amr"], "audio/amr": ["amr"],
"audio/au": ["au"], "audio/au": ["au"],
"audio/basic": ["au","snd"], "audio/basic": ["au","snd"],
"audio/flac": ["flac"],
"audio/it": ["it"], "audio/it": ["it"],
"audio/make": ["funk","my","pfunk"], "audio/make": ["funk","my","pfunk"],
"audio/make.my.funk": ["pfunk"], "audio/make.my.funk": ["pfunk"],
@ -816,7 +822,7 @@
"audio/x-mod": ["mod"], "audio/x-mod": ["mod"],
"audio/x-mpeg": ["mp2"], "audio/x-mpeg": ["mp2"],
"audio/x-mpeg-3": ["mp3"], "audio/x-mpeg-3": ["mp3"],
"audio/x-mpegurl": ["m3u"], "audio/x-mpegurl": ["m3u","m3u8"],
"audio/x-mpequrl": ["m3u"], "audio/x-mpequrl": ["m3u"],
"audio/x-ms-wax": ["wax"], "audio/x-ms-wax": ["wax"],
"audio/x-ms-wma": ["wma"], "audio/x-ms-wma": ["wma"],
@ -1026,8 +1032,9 @@
"video/jpeg": ["jpgv"], "video/jpeg": ["jpgv"],
"video/jpm": ["jpgm","jpm"], "video/jpm": ["jpgm","jpm"],
"video/mj2": ["mj2","mjp2"], "video/mj2": ["mj2","mjp2"],
"video/mp4": ["mp4","f4v","m4v","mp4v","mpg4"], "video/mp4": ["mp4","f4v","m4v","mp4v","mpg4","fmp4"],
"video/mpeg": ["mpeg","m1v","m2v","mp2","mp3","mpa","mpe","mpg"], "video/mpeg": ["mpeg","m1v","m2v","mp2","mp3","mpa","mpe","mpg"],
"video/MP2T": ["ts"],
"video/msvideo": ["avi"], "video/msvideo": ["avi"],
"video/ogg": ["ogv"], "video/ogg": ["ogv"],
"video/quicktime": ["mov","3gp","moov","qt"], "video/quicktime": ["mov","3gp","moov","qt"],

View File

@ -2,8 +2,8 @@
"app_id": "com.moodle.moodlemobile", "app_id": "com.moodle.moodlemobile",
"appname": "Moodle Mobile", "appname": "Moodle Mobile",
"desktopappname": "Moodle Desktop", "desktopappname": "Moodle Desktop",
"versioncode": 3810, "versioncode": 3820,
"versionname": "3.8.1-dev", "versionname": "3.8.2",
"cache_update_frequency_usually": 420000, "cache_update_frequency_usually": 420000,
"cache_update_frequency_often": 1200000, "cache_update_frequency_often": 1200000,
"cache_update_frequency_sometimes": 3600000, "cache_update_frequency_sometimes": 3600000,

View File

@ -39,6 +39,8 @@ import { CORE_SITEHOME_PROVIDERS } from '@core/sitehome/sitehome.module';
import { CORE_USER_PROVIDERS } from '@core/user/user.module'; import { CORE_USER_PROVIDERS } from '@core/user/user.module';
import { CORE_PUSHNOTIFICATIONS_PROVIDERS } from '@core/pushnotifications/pushnotifications.module'; import { CORE_PUSHNOTIFICATIONS_PROVIDERS } from '@core/pushnotifications/pushnotifications.module';
import { IONIC_NATIVE_PROVIDERS } from '@core/emulator/emulator.module'; import { IONIC_NATIVE_PROVIDERS } from '@core/emulator/emulator.module';
import { CORE_EDITOR_PROVIDERS } from '@core/editor/editor.module';
import { CORE_SEARCH_PROVIDERS } from '@core/search/search.module';
// Import only this provider to prevent circular dependencies. // Import only this provider to prevent circular dependencies.
import { CoreSitePluginsProvider } from '@core/siteplugins/providers/siteplugins'; import { CoreSitePluginsProvider } from '@core/siteplugins/providers/siteplugins';
@ -75,6 +77,8 @@ import { CoreSiteHomeComponentsModule } from '@core/sitehome/components/componen
import { CoreUserComponentsModule } from '@core/user/components/components.module'; import { CoreUserComponentsModule } from '@core/user/components/components.module';
import { CoreQuestionComponentsModule } from '@core/question/components/components.module'; import { CoreQuestionComponentsModule } from '@core/question/components/components.module';
import { CoreBlockComponentsModule } from '@core/block/components/components.module'; import { CoreBlockComponentsModule } from '@core/block/components/components.module';
import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
import { CoreSearchComponentsModule } from '@core/search/components/components.module';
// Import some components listed in entryComponents so they can be injected dynamically. // Import some components listed in entryComponents so they can be injected dynamically.
import { CoreCourseUnsupportedModuleComponent } from '@core/course/components/unsupported-module/unsupported-module'; import { CoreCourseUnsupportedModuleComponent } from '@core/course/components/unsupported-module/unsupported-module';
@ -144,7 +148,7 @@ export class CoreCompileProvider {
IonicModule, TranslateModule.forChild(), CoreComponentsModule, CoreDirectivesModule, CorePipesModule, IonicModule, TranslateModule.forChild(), CoreComponentsModule, CoreDirectivesModule, CorePipesModule,
CoreCourseComponentsModule, CoreCoursesComponentsModule, CoreSiteHomeComponentsModule, CoreUserComponentsModule, CoreCourseComponentsModule, CoreCoursesComponentsModule, CoreSiteHomeComponentsModule, CoreUserComponentsModule,
CoreCourseDirectivesModule, CoreSitePluginsDirectivesModule, CoreQuestionComponentsModule, AddonModAssignComponentsModule, CoreCourseDirectivesModule, CoreSitePluginsDirectivesModule, CoreQuestionComponentsModule, AddonModAssignComponentsModule,
AddonModWorkshopComponentsModule, CoreBlockComponentsModule AddonModWorkshopComponentsModule, CoreBlockComponentsModule, CoreEditorComponentsModule, CoreSearchComponentsModule
]; ];
constructor(protected injector: Injector, logger: CoreLoggerProvider, compilerFactory: JitCompilerFactory) { constructor(protected injector: Injector, logger: CoreLoggerProvider, compilerFactory: JitCompilerFactory) {
@ -237,7 +241,8 @@ export class CoreCompileProvider {
.concat(ADDON_MOD_SURVEY_PROVIDERS).concat(ADDON_MOD_URL_PROVIDERS).concat(ADDON_MOD_WIKI_PROVIDERS) .concat(ADDON_MOD_SURVEY_PROVIDERS).concat(ADDON_MOD_URL_PROVIDERS).concat(ADDON_MOD_WIKI_PROVIDERS)
.concat(ADDON_MOD_WORKSHOP_PROVIDERS).concat(ADDON_NOTES_PROVIDERS).concat(ADDON_NOTIFICATIONS_PROVIDERS) .concat(ADDON_MOD_WORKSHOP_PROVIDERS).concat(ADDON_NOTES_PROVIDERS).concat(ADDON_NOTIFICATIONS_PROVIDERS)
.concat(CORE_PUSHNOTIFICATIONS_PROVIDERS).concat(ADDON_REMOTETHEMES_PROVIDERS).concat(CORE_BLOCK_PROVIDERS) .concat(CORE_PUSHNOTIFICATIONS_PROVIDERS).concat(ADDON_REMOTETHEMES_PROVIDERS).concat(CORE_BLOCK_PROVIDERS)
.concat(CORE_FILTER_PROVIDERS).concat(CORE_H5P_PROVIDERS); .concat(CORE_FILTER_PROVIDERS).concat(CORE_H5P_PROVIDERS).concat(CORE_EDITOR_PROVIDERS)
.concat(CORE_SEARCH_PROVIDERS);
// We cannot inject anything to this constructor. Use the Injector to inject all the providers into the instance. // We cannot inject anything to this constructor. Use the Injector to inject all the providers into the instance.
for (const i in providers) { for (const i in providers) {

View File

@ -17,7 +17,7 @@ import { CoreEditorComponentsModule } from './components/components.module';
import { CoreEditorOfflineProvider } from './providers/editor-offline'; import { CoreEditorOfflineProvider } from './providers/editor-offline';
// List of providers (without handlers). // List of providers (without handlers).
export const CORE_GRADES_PROVIDERS: any[] = [ export const CORE_EDITOR_PROVIDERS: any[] = [
CoreEditorOfflineProvider, CoreEditorOfflineProvider,
]; ];

View File

@ -99,7 +99,7 @@ export class CoreEmulatorCaptureHelperProvider {
params.maxTime = options.duration * 1000; params.maxTime = options.duration * 1000;
} }
modal = this.modalCtrl.create('CoreEmulatorCaptureMediaPage', params); modal = this.modalCtrl.create('CoreEmulatorCaptureMediaPage', params, { cssClass: 'core-modal-fullscreen' });
modal.present(); modal.present();
modal.onDidDismiss((data: any, role: string) => { modal.onDidDismiss((data: any, role: string) => {
if (role == 'success') { if (role == 'success') {

View File

@ -298,12 +298,18 @@ export class CoreFileUploaderProvider {
* @return Undefined if file is valid, error message if file is invalid. * @return Undefined if file is valid, error message if file is invalid.
*/ */
isInvalidMimetype(mimetypes?: string[], path?: string, mimetype?: string): string { isInvalidMimetype(mimetypes?: string[], path?: string, mimetype?: string): string {
let extension; let extension: string;
if (mimetypes) { if (mimetypes) {
// Verify that the mimetype of the file is supported. // Verify that the mimetype of the file is supported.
if (mimetype) { if (mimetype) {
extension = this.mimeUtils.getExtension(mimetype); extension = this.mimeUtils.getExtension(mimetype);
if (mimetypes.indexOf(mimetype) == -1) {
// Get the "main" mimetype of the extension.
// It's possible that the list of accepted mimetypes only includes the "main" mimetypes.
mimetype = this.mimeUtils.getMimeType(extension);
}
} else { } else {
extension = this.mimeUtils.getFileExtension(path); extension = this.mimeUtils.getFileExtension(path);
mimetype = this.mimeUtils.getMimeType(extension); mimetype = this.mimeUtils.getMimeType(extension);

View File

@ -24,7 +24,17 @@
"emailnotmatch": "Emails do not match", "emailnotmatch": "Emails do not match",
"erroraccesscontrolalloworigin": "The cross-origin call you're trying to perform has been rejected. Please check https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", "erroraccesscontrolalloworigin": "The cross-origin call you're trying to perform has been rejected. Please check https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium",
"errordeletesite": "An error occurred while deleting this site. Please try again.", "errordeletesite": "An error occurred while deleting this site. Please try again.",
"errorexampleurl": "The URL https://campus.example.edu is only an example URL, it's not a real site. <strong>Please use the URL of your school or organization's site.</strong>",
"errorupdatesite": "An error occurred while updating the site's token.", "errorupdatesite": "An error occurred while updating the site's token.",
"faqcannotconnectanswer": "Please, contact your site administrator.",
"faqcannotconnectquestion": "I typed my site address correctly but I still can't connect.",
"faqsetupsiteanswer": "Visit {{$link}} to check out the different options you have to create your own Moodle site.",
"faqsetupsitelinktitle": "Get started.",
"faqsetupsitequestion": "I want to set up my own Moodle site.",
"faqtestappanswer": "To test the app in a Moodle Demo Site, type \"teacher\" or \"student\" in the \"Your site address\" field and click the \"Connect!\" button.",
"faqtestappquestion": "I just want to test the app, what can I do?",
"faqwhatisurlanswer": "<p>Every organisation or school has their own custom address for their Moodle site.</p><p>To find the address of the Moodle site you want to connect to, do the following:</p><ol><li>Open a web browser and go to your school's or organisation's Moodle site login page</li><li>At the top of the page, on the address bar, you will see the URL of your Moodle site. E.g. \"campus.example.edu\".{{$image}}</li><li>Copy the address (do not copy the /login and what comes after), paste it into the Moodle App and click \"Connect!\"</li><li>Now you can log into your site, using your username and password</li>",
"faqwhatisurlquestion": "What is the URL of my Moodle site? How can I find my schools site?",
"findyoursite": "Find your site", "findyoursite": "Find your site",
"firsttime": "Is this your first time here?", "firsttime": "Is this your first time here?",
"forcepasswordchangenotice": "You must change your password to proceed.", "forcepasswordchangenotice": "You must change your password to proceed.",
@ -53,7 +63,6 @@
"mobileservicesnotenabled": "Mobile access is not enabled on your site. Please contact your site administrator if you think it should be enabled.", "mobileservicesnotenabled": "Mobile access is not enabled on your site. Please contact your site administrator if you think it should be enabled.",
"mustconfirm": "You need to confirm your account", "mustconfirm": "You need to confirm your account",
"newaccount": "New account", "newaccount": "New account",
"newsitedescription": "Please enter the URL of your Moodle site. Note that it might not be configured to work with this app.",
"notloggedin": "You need to be logged in.", "notloggedin": "You need to be logged in.",
"password": "Password", "password": "Password",
"passwordforgotten": "Forgotten password", "passwordforgotten": "Forgotten password",
@ -79,7 +88,7 @@
"selectacountry": "Select a country", "selectacountry": "Select a country",
"selectsite": "Please select your site:", "selectsite": "Please select your site:",
"signupplugindisabled": "{{$a}} is not enabled.", "signupplugindisabled": "{{$a}} is not enabled.",
"siteaddress": "Site address", "siteaddress": "Your site address",
"sitehasredirect": "Your site contains at least one HTTP redirect. The app cannot follow redirects, this could be the issue that's preventing the app from connecting to your site.", "sitehasredirect": "Your site contains at least one HTTP redirect. The app cannot follow redirects, this could be the issue that's preventing the app from connecting to your site.",
"siteinmaintenance": "Your site is in maintenance mode", "siteinmaintenance": "Your site is in maintenance mode",
"sitepolicynotagreederror": "Site policy not agreed.", "sitepolicynotagreederror": "Site policy not agreed.",

View File

@ -91,16 +91,7 @@ export class CoreLoginInitPage {
}); });
} }
return this.sitesProvider.getCurrentSite().getPublicConfig().catch(() => {
return {};
}).then((config) => {
return this.sitesProvider.checkRequiredMinimumVersion(config).then(() => {
// User is logged in, go to site initial page.
return this.loginHelper.goToSiteInitialPage(); return this.loginHelper.goToSiteInitialPage();
}).catch(() => {
return this.loadPage();
});
});
} }
return this.navCtrl.setRoot('CoreLoginSitesPage'); return this.navCtrl.setRoot('CoreLoginSitesPage');

View File

@ -10,5 +10,31 @@
</ion-navbar> </ion-navbar>
</ion-header> </ion-header>
<ion-content padding> <ion-content padding>
<core-format-text [text]="'core.login.helpmelogin' | translate" [filter]="false"></core-format-text> <ion-list>
<ion-item text-wrap>
<h2><b>{{ 'core.login.faqwhatisurlquestion' | translate }}</b></h2>
</ion-item>
<ion-item text-wrap>
<div [innerHTML]="'core.login.faqwhatisurlanswer' | translate: {$image: urlImageHtml}">
</div>
</ion-item>
<ion-item text-wrap>
<h2><b>{{ 'core.login.faqcannotconnectquestion' | translate }}</b></h2>
</ion-item>
<ion-item text-wrap>
<p>{{ 'core.login.faqcannotconnectanswer' | translate }} {{ 'core.whoissiteadmin' | translate }}</p>
</ion-item>
<ion-item text-wrap>
<h2><b>{{ 'core.login.faqsetupsitequestion' | translate }}</b></h2>
</ion-item>
<ion-item text-wrap>
<p><core-format-text [text]="'core.login.faqsetupsiteanswer' | translate:{$link: setupLinkHtml}" [filter]="false"></core-format-text></p>
</ion-item>
<ion-item text-wrap>
<h2><b>{{ 'core.login.faqtestappquestion' | translate }}</b></h2>
</ion-item>
<ion-item text-wrap>
<p>{{ 'core.login.faqtestappanswer' | translate }}</p>
</ion-item>
</ion-list>
</ion-content> </ion-content>

View File

@ -0,0 +1,5 @@
page-core-login-site-help {
.content {
background-color: $white;
}
}

View File

@ -14,6 +14,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { IonicPage, ViewController } from 'ionic-angular'; import { IonicPage, ViewController } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core';
/** /**
* Component that displays some help regarding the CoreLoginSitePage. * Component that displays some help regarding the CoreLoginSitePage.
@ -24,7 +25,17 @@ import { IonicPage, ViewController } from 'ionic-angular';
templateUrl: 'site-help.html', templateUrl: 'site-help.html',
}) })
export class CoreLoginSiteHelpPage { export class CoreLoginSiteHelpPage {
constructor(private viewCtrl: ViewController) { }
urlImageHtml: string;
setupLinkHtml: string;
constructor(protected viewCtrl: ViewController,
protected translate: TranslateService) {
this.urlImageHtml = '<img src="assets/img/login/faq_url.png" role="presentation">';
this.setupLinkHtml = '<a href="https://moodle.com/getstarted/" title="' +
this.translate.instant('core.login.faqsetupsitelinktitle') + '">https://moodle.com/getstarted/</a>';
}
/** /**
* Close help modal. * Close help modal.

View File

@ -6,9 +6,6 @@
<button ion-button icon-only navPush="CoreAppSettingsPage" [attr.aria-label]="'core.settings.appsettings' | translate"> <button ion-button icon-only navPush="CoreAppSettingsPage" [attr.aria-label]="'core.settings.appsettings' | translate">
<core-icon name="fa-cogs"></core-icon> <core-icon name="fa-cogs"></core-icon>
</button> </button>
<button ion-button icon-only (click)="showHelp()" [attr.aria-label]="'core.help' | translate">
<ion-icon name="help-circle"></ion-icon>
</button>
</ion-buttons> </ion-buttons>
</ion-navbar> </ion-navbar>
</ion-header> </ion-header>
@ -20,9 +17,9 @@
<form ion-list [formGroup]="siteForm" (ngSubmit)="connect($event, siteForm.value.siteUrl)" *ngIf="!fixedSites || fixedDisplay == 'select'" #siteFormEl> <form ion-list [formGroup]="siteForm" (ngSubmit)="connect($event, siteForm.value.siteUrl)" *ngIf="!fixedSites || fixedDisplay == 'select'" #siteFormEl>
<!-- Form to input the site URL if there are no fixed sites. --> <!-- Form to input the site URL if there are no fixed sites. -->
<ng-container *ngIf="!fixedSites"> <ng-container *ngIf="!fixedSites">
<p padding>{{ 'core.login.newsitedescription' | translate }}</p>
<ion-item> <ion-item>
<ion-input type="url" name="url" placeholder="{{ 'core.login.siteaddress' | translate }}" formControlName="siteUrl" [core-auto-focus]="showKeyboard"></ion-input> <ion-label stacked><h2>{{ 'core.login.siteaddress' | translate }}</h2></ion-label>
<ion-input type="url" name="url" placeholder="https://campus.example.edu" formControlName="siteUrl" [core-auto-focus]="showKeyboard"></ion-input>
</ion-item> </ion-item>
</ng-container> </ng-container>
@ -50,5 +47,36 @@
<p class="padding no-padding-bottom">{{ 'core.login.selectsite' | translate }}</p> <p class="padding no-padding-bottom">{{ 'core.login.selectsite' | translate }}</p>
<a *ngFor="let site of fixedSites" ion-button block (click)="connect($event, site.url)" [title]="site.name" margin-bottom>{{site.name}}</a> <a *ngFor="let site of fixedSites" ion-button block (click)="connect($event, site.url)" [title]="site.name" margin-bottom>{{site.name}}</a>
</div> </div>
<!-- Error. -->
<div padding-top *ngIf="error" >
<ion-card class="core-site-error">
<ion-card-header>
{{ 'core.whoops' | translate }}
</ion-card-header>
<ion-card-content>
<p><core-format-text [text]="error.message" [filter]="false"></core-format-text></p>
<ng-container *ngIf="error.url">
<p>{{ 'core.login.problemconnectingerror' | translate }}</p>
<p padding><a [href]="error.fullUrl" core-link>{{ error.url }}</a></p>
<p><strong>{{ 'core.login.problemconnectingerrorcontinue' | translate }}</strong></p>
</ng-container>
</ion-card-content>
<ion-card-header>
{{ 'core.login.stillcantconnect' | translate }}
</ion-card-header>
<ion-card-content>
<p>{{ 'core.login.contactyouradministrator' | translate }}</p>
<p>{{ 'core.whoissiteadmin' | translate }}</p>
</ion-card-content>
</ion-card>
</div>
<!-- Help. -->
<ion-list no-lines>
<a ion-item text-center class="core-login-need-help" (click)="showHelp()" detail-none>
{{ 'core.needhelp' | translate }}
</a>
</ion-list>
</div> </div>
</ion-content> </ion-content>

View File

@ -10,4 +10,24 @@ ion-app.app-root page-core-login-site {
background-color: $searchbar-ios-toolbar-input-background; background-color: $searchbar-ios-toolbar-input-background;
} }
} }
.core-site-error {
background: $red-light;
margin-left: 0;
margin-right: 0;
width: 100%;
user-select: text;
p, ion-card-header {
color: $red-dark;
user-select: text;
}
ion-card-header {
font-weight: bold;
}
}
.core-login-need-help {
text-decoration: underline;
}
} }

View File

@ -18,10 +18,32 @@ import { CoreAppProvider } from '@providers/app';
import { CoreEventsProvider } from '@providers/events'; import { CoreEventsProvider } from '@providers/events';
import { CoreSitesProvider, CoreSiteCheckResponse } from '@providers/sites'; import { CoreSitesProvider, CoreSiteCheckResponse } from '@providers/sites';
import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreUrlUtilsProvider } from '@providers/utils/url';
import { CoreConfigConstants } from '../../../../configconstants'; import { CoreConfigConstants } from '../../../../configconstants';
import { CoreLoginHelperProvider } from '../../providers/helper'; import { CoreLoginHelperProvider } from '../../providers/helper';
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { CoreUrl } from '@classes/utils/url'; import { CoreUrl } from '@classes/utils/url';
import { TranslateService } from '@ngx-translate/core';
/**
* Data about an error when connecting to a site.
*/
type CoreLoginSiteError = {
/**
* The error message that ocurred.
*/
message: string;
/**
* URL the user entered.
*/
url?: string;
/**
* URL the user entered with protocol added if needed.
*/
fullUrl?: string;
};
/** /**
* Page to enter or select the site URL to connect to. * Page to enter or select the site URL to connect to.
@ -41,6 +63,7 @@ export class CoreLoginSitePage {
fixedDisplay = 'buttons'; fixedDisplay = 'buttons';
showKeyboard = false; showKeyboard = false;
filter = ''; filter = '';
error: CoreLoginSiteError;
constructor(navParams: NavParams, constructor(navParams: NavParams,
protected navCtrl: NavController, protected navCtrl: NavController,
@ -50,7 +73,9 @@ export class CoreLoginSitePage {
protected loginHelper: CoreLoginHelperProvider, protected loginHelper: CoreLoginHelperProvider,
protected modalCtrl: ModalController, protected modalCtrl: ModalController,
protected domUtils: CoreDomUtilsProvider, protected domUtils: CoreDomUtilsProvider,
protected eventsProvider: CoreEventsProvider) { protected eventsProvider: CoreEventsProvider,
protected translate: TranslateService,
protected urlUtils: CoreUrlUtilsProvider) {
this.showKeyboard = !!navParams.get('showKeyboard'); this.showKeyboard = !!navParams.get('showKeyboard');
@ -99,6 +124,14 @@ export class CoreLoginSitePage {
url = url.trim(); url = url.trim();
if (url.match(/^(https?:\/\/)?campus\.example\.edu/)) {
this.showLoginIssue(null, this.translate.instant('core.login.errorexampleurl'));
return;
}
this.hideLoginIssue();
const modal = this.domUtils.showModalLoading(), const modal = this.domUtils.showModalLoading(),
siteData = this.sitesProvider.getDemoSiteData(url); siteData = this.sitesProvider.getDemoSiteData(url);
@ -164,6 +197,13 @@ export class CoreLoginSitePage {
modal.present(); modal.present();
} }
/**
* Hide the login error.
*/
protected hideLoginIssue(): void {
this.error = null;
}
/** /**
* Show an error that aims people to solve the issue. * Show an error that aims people to solve the issue.
* *
@ -171,12 +211,14 @@ export class CoreLoginSitePage {
* @param error Error to display. * @param error Error to display.
*/ */
protected showLoginIssue(url: string, error: any): void { protected showLoginIssue(url: string, error: any): void {
const modal = this.modalCtrl.create('CoreLoginSiteErrorPage', { this.error = {
siteUrl: url, url: url,
issue: this.domUtils.getErrorMessage(error) message: this.domUtils.getErrorMessage(error),
}); };
modal.present(); if (url) {
this.error.fullUrl = this.urlUtils.isAbsoluteURL(url) ? url : 'https://' + url;
}
} }
/** /**

View File

@ -16,6 +16,11 @@ import { NgModule } from '@angular/core';
import { CoreSearchComponentsModule } from './components/components.module'; import { CoreSearchComponentsModule } from './components/components.module';
import { CoreSearchHistoryProvider } from './providers/search-history'; import { CoreSearchHistoryProvider } from './providers/search-history';
// List of providers (without handlers).
export const CORE_SEARCH_PROVIDERS: any[] = [
CoreSearchHistoryProvider,
];
@NgModule({ @NgModule({
declarations: [ declarations: [
], ],

View File

@ -221,7 +221,7 @@ export class CoreFormatTextDirective implements OnChanges {
anchor.addEventListener('click', (e: Event) => { anchor.addEventListener('click', (e: Event) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
this.domUtils.viewImage(imgSrc, img.getAttribute('alt'), this.component, this.componentId); this.domUtils.viewImage(imgSrc, img.getAttribute('alt'), this.component, this.componentId, true);
}); });
img.parentNode.appendChild(anchor); img.parentNode.appendChild(anchor);

View File

@ -12,7 +12,7 @@
"back": "Back", "back": "Back",
"browser": "Browser", "browser": "Browser",
"cancel": "Cancel", "cancel": "Cancel",
"cannotconnect": "Cannot connect: Verify that you have correctly typed the URL and that your site uses Moodle {{$a}} or later.", "cannotconnect": "<strong>Cannot connect</strong>: Verify that you have correctly typed your site address.",
"cannotdownloadfiles": "File downloading is disabled. Please contact your site administrator.", "cannotdownloadfiles": "File downloading is disabled. Please contact your site administrator.",
"captureaudio": "Record audio", "captureaudio": "Record audio",
"capturedimage": "Taken picture.", "capturedimage": "Taken picture.",
@ -167,6 +167,7 @@
"more": "more", "more": "more",
"mygroups": "My groups", "mygroups": "My groups",
"name": "Name", "name": "Name",
"needhelp": "Need help?",
"networkerroriframemsg": "This content is not available offline. Please connect to the internet and try again.", "networkerroriframemsg": "This content is not available offline. Please connect to the internet and try again.",
"networkerrormsg": "There was a problem connecting to the site. Please check your connection and try again.", "networkerrormsg": "There was a problem connecting to the site. Please check your connection and try again.",
"never": "Never", "never": "Never",
@ -293,6 +294,7 @@
"warningofflinedatadeleted": "Offline data from {{component}} '{{name}}' has been deleted. {{error}}", "warningofflinedatadeleted": "Offline data from {{component}} '{{name}}' has been deleted. {{error}}",
"whatisyourage": "What is your age?", "whatisyourage": "What is your age?",
"wheredoyoulive": "In which country do you live?", "wheredoyoulive": "In which country do you live?",
"whoissiteadmin": "\"Site Administrators\" are the people who manage the Moodle at your school/university/company or learning organisation. If you don't know how to contact them, please contact your teachers/trainers.",
"whoops": "Oops!", "whoops": "Oops!",
"whyisthishappening": "Why is this happening?", "whyisthishappening": "Why is this happening?",
"whyisthisrequired": "Why is this required?", "whyisthisrequired": "Why is this required?",

View File

@ -48,7 +48,7 @@ export class CoreSiteInfoCronHandler implements CoreCronHandler {
* @return Interval time (in milliseconds). * @return Interval time (in milliseconds).
*/ */
getInterval(): number { getInterval(): number {
return 3600000; // 1 hour. return 10800000; // 3 hours.
} }
/** /**

View File

@ -1561,25 +1561,26 @@ export class CoreDomUtilsProvider {
} }
/** /**
* View an image in a new page or modal. * View an image in a modal.
* *
* @param image URL of the image. * @param image URL of the image.
* @param title Title of the page or modal. * @param title Title of the page or modal.
* @param component Component to link the image to if needed. * @param component Component to link the image to if needed.
* @param componentId An ID to use in conjunction with the component. * @param componentId An ID to use in conjunction with the component.
* @param fullScreen Whether the modal should be full screen.
*/ */
viewImage(image: string, title?: string, component?: string, componentId?: string | number): void { viewImage(image: string, title?: string, component?: string, componentId?: string | number, fullScreen?: boolean): void {
if (image) { if (image) {
const params: any = { const params: any = {
title: title, title: title,
image: image, image: image,
component: component, component: component,
componentId: componentId componentId: componentId,
}, };
modal = this.modalCtrl.create('CoreViewerImagePage', params); const options = fullScreen ? { cssClass: 'core-modal-fullscreen' } : {};
const modal = this.modalCtrl.create('CoreViewerImagePage', params, options);
modal.present(); modal.present();
} }
} }
/** /**

View File

@ -171,6 +171,7 @@ export class CoreWSProvider {
/** /**
* Call a Moodle WS using the AJAX API. Please use it if the WS layer is not an option. * Call a Moodle WS using the AJAX API. Please use it if the WS layer is not an option.
* It uses a cache to prevent duplicate requests.
* *
* @param method The WebService method to be called. * @param method The WebService method to be called.
* @param data Arguments to pass to the method. * @param data Arguments to pass to the method.
@ -181,79 +182,19 @@ export class CoreWSProvider {
* - available: 0 if unknown, 1 if available, -1 if not available. * - available: 0 if unknown, 1 if available, -1 if not available.
*/ */
callAjax(method: string, data: any, preSets: CoreWSAjaxPreSets): Promise<any> { callAjax(method: string, data: any, preSets: CoreWSAjaxPreSets): Promise<any> {
let promise; const cacheParams = {
if (typeof preSets.siteUrl == 'undefined') {
return rejectWithError(this.createFakeWSError('core.unexpectederror', true));
} else if (!this.appProvider.isOnline()) {
return rejectWithError(this.createFakeWSError('core.networkerrormsg', true));
}
if (typeof preSets.responseExpected == 'undefined') {
preSets.responseExpected = true;
}
const script = preSets.noLogin ? 'service-nologin.php' : 'service.php',
ajaxData = JSON.stringify([{
index: 0,
methodname: method, methodname: method,
args: this.convertValuesToString(data) args: data,
}]); };
// The info= parameter has no function. It is just to help with debugging. let promise = this.getPromiseHttp('ajax', preSets.siteUrl, cacheParams);
// We call it info to match the parameter name use by Moodle's AMD ajax module.
let siteUrl = preSets.siteUrl + '/lib/ajax/' + script + '?info=' + method;
if (preSets.noLogin && preSets.useGet) { if (!promise) {
// Send params using GET. promise = this.performAjax(method, data, preSets);
siteUrl += '&args=' + encodeURIComponent(ajaxData); promise = this.setPromiseHttp(promise, 'ajax', preSets.siteUrl, cacheParams);
promise = this.http.get(siteUrl).timeout(this.getRequestTimeout()).toPromise();
} else {
promise = this.http.post(siteUrl, ajaxData).timeout(this.getRequestTimeout()).toPromise();
} }
return promise.then((data: any) => { return promise;
// Some moodle web services return null.
// If the responseExpected value is set then so long as no data is returned, we create a blank object.
if (!data && !preSets.responseExpected) {
data = [{}];
}
// Check if error. Ajax layer should always return an object (if error) or an array (if success).
if (!data || typeof data != 'object') {
return rejectWithError(this.createFakeWSError('core.serverconnection', true));
} else if (data.error) {
return rejectWithError(data);
}
// Get the first response since only one request was done.
data = data[0];
if (data.error) {
return rejectWithError(data.exception);
}
return data.data;
}, (data) => {
const available = data.status == 404 ? -1 : 0;
return rejectWithError(this.createFakeWSError('core.serverconnection', true), available);
});
// Convenience function to return an error.
function rejectWithError(exception: any, available?: number): Promise<never> {
if (typeof available == 'undefined') {
if (exception.errorcode) {
available = exception.errorcode == 'invalidrecord' ? -1 : 1;
} else {
available = 0;
}
}
exception.available = available;
return Promise.reject(exception);
}
} }
/** /**
@ -496,6 +437,94 @@ export class CoreWSProvider {
return method + '#' + Md5.hashAsciiStr(url); return method + '#' + Md5.hashAsciiStr(url);
} }
/**
* Call a Moodle WS using the AJAX API.
*
* @param method The WebService method to be called.
* @param data Arguments to pass to the method.
* @param preSets Extra settings and information. Only some
* @return Promise resolved with the response data in success and rejected with an object containing:
* - error: Error message.
* - errorcode: Error code returned by the site (if any).
* - available: 0 if unknown, 1 if available, -1 if not available.
*/
protected performAjax(method: string, data: any, preSets: CoreWSAjaxPreSets): Promise<any> {
let promise;
if (typeof preSets.siteUrl == 'undefined') {
return rejectWithError(this.createFakeWSError('core.unexpectederror', true));
} else if (!this.appProvider.isOnline()) {
return rejectWithError(this.createFakeWSError('core.networkerrormsg', true));
}
if (typeof preSets.responseExpected == 'undefined') {
preSets.responseExpected = true;
}
const script = preSets.noLogin ? 'service-nologin.php' : 'service.php',
ajaxData = JSON.stringify([{
index: 0,
methodname: method,
args: this.convertValuesToString(data)
}]);
// The info= parameter has no function. It is just to help with debugging.
// We call it info to match the parameter name use by Moodle's AMD ajax module.
let siteUrl = preSets.siteUrl + '/lib/ajax/' + script + '?info=' + method;
if (preSets.noLogin && preSets.useGet) {
// Send params using GET.
siteUrl += '&args=' + encodeURIComponent(ajaxData);
promise = this.http.get(siteUrl).timeout(this.getRequestTimeout()).toPromise();
} else {
promise = this.http.post(siteUrl, ajaxData).timeout(this.getRequestTimeout()).toPromise();
}
return promise.then((data: any) => {
// Some moodle web services return null.
// If the responseExpected value is set then so long as no data is returned, we create a blank object.
if (!data && !preSets.responseExpected) {
data = [{}];
}
// Check if error. Ajax layer should always return an object (if error) or an array (if success).
if (!data || typeof data != 'object') {
return rejectWithError(this.createFakeWSError('core.serverconnection', true));
} else if (data.error) {
return rejectWithError(data);
}
// Get the first response since only one request was done.
data = data[0];
if (data.error) {
return rejectWithError(data.exception);
}
return data.data;
}, (data) => {
const available = data.status == 404 ? -1 : 0;
return rejectWithError(this.createFakeWSError('core.serverconnection', true), available);
});
// Convenience function to return an error.
function rejectWithError(exception: any, available?: number): Promise<never> {
if (typeof available == 'undefined') {
if (exception.errorcode) {
available = exception.errorcode == 'invalidrecord' ? -1 : 1;
} else {
available = 0;
}
}
exception.available = available;
return Promise.reject(exception);
}
}
/** /**
* Perform a HEAD request and save the promise while waiting to be resolved. * Perform a HEAD request and save the promise while waiting to be resolved.
* *