diff --git a/.eslintrc.js b/.eslintrc.js
index c39053bf4..260d9cef7 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -96,14 +96,14 @@ const appConfig = {
'error',
{
selector: [
- 'classProperty',
- 'objectLiteralProperty',
- 'typeProperty',
- 'classMethod',
- 'objectLiteralMethod',
- 'typeMethod',
- 'accessor',
- 'enumMember'
+ 'classProperty',
+ 'objectLiteralProperty',
+ 'typeProperty',
+ 'classMethod',
+ 'objectLiteralMethod',
+ 'typeMethod',
+ 'accessor',
+ 'enumMember'
],
modifiers: ['requiresQuotes'],
format: null,
@@ -332,10 +332,11 @@ module.exports = {
'@angular-eslint/template/alt-text': 'error',
'@angular-eslint/template/elements-content': 'error',
'@angular-eslint/template/label-has-associated-control': 'error',
- '@angular-eslint/template/table-scope': 'error',
- '@angular-eslint/template/valid-aria': 'error',
'@angular-eslint/template/no-duplicate-attributes': 'error',
'@angular-eslint/template/no-positive-tabindex': 'error',
+ '@angular-eslint/template/prefer-self-closing-tags': 'error',
+ '@angular-eslint/template/table-scope': 'error',
+ '@angular-eslint/template/valid-aria': 'error',
'max-len': ['warn', { code: 140 }],
},
},
diff --git a/jest.config.js b/jest.config.js
index cae628ad0..fd6c50807 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -12,7 +12,7 @@ module.exports = {
transform: {
'^.+\\.(ts|html)$': 'ts-jest',
},
- transformIgnorePatterns: ['node_modules/(?!@ionic-native|@ionic|@moodlehq/ionic-native-push)'],
+ transformIgnorePatterns: ['node_modules/(?!@awesome-cordova-plugins|@ionic/core|@stencil/core|ionicons|@moodlehq/ionic-native-push)'],
moduleNameMapper: {
...pathsToModuleNameMapper(compilerOptions.paths, { prefix: '/src/' }),
'^!raw-loader!.*': 'jest-raw-loader',
diff --git a/package-lock.json b/package-lock.json
index 94b5a6400..7d74f0f81 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,6 +18,29 @@
"@angular/platform-browser": "^16.2.0",
"@angular/platform-browser-dynamic": "^16.2.0",
"@angular/router": "^16.2.0",
+ "@awesome-cordova-plugins/badge": "^6.3.0",
+ "@awesome-cordova-plugins/camera": "^6.3.0",
+ "@awesome-cordova-plugins/chooser": "^6.3.0",
+ "@awesome-cordova-plugins/clipboard": "^6.3.0",
+ "@awesome-cordova-plugins/core": "^6.3.0",
+ "@awesome-cordova-plugins/device": "^6.3.0",
+ "@awesome-cordova-plugins/diagnostic": "^6.3.0",
+ "@awesome-cordova-plugins/file": "^6.3.0",
+ "@awesome-cordova-plugins/file-opener": "^6.3.0",
+ "@awesome-cordova-plugins/file-transfer": "^6.3.0",
+ "@awesome-cordova-plugins/geolocation": "^6.3.0",
+ "@awesome-cordova-plugins/http": "^6.3.0",
+ "@awesome-cordova-plugins/in-app-browser": "^6.3.0",
+ "@awesome-cordova-plugins/ionic-webview": "^6.3.0",
+ "@awesome-cordova-plugins/keyboard": "^6.3.0",
+ "@awesome-cordova-plugins/local-notifications": "^6.3.0",
+ "@awesome-cordova-plugins/media-capture": "^6.3.0",
+ "@awesome-cordova-plugins/network": "^6.3.0",
+ "@awesome-cordova-plugins/splash-screen": "^6.3.0",
+ "@awesome-cordova-plugins/sqlite": "^6.3.0",
+ "@awesome-cordova-plugins/status-bar": "^6.3.0",
+ "@awesome-cordova-plugins/web-intent": "^6.3.0",
+ "@awesome-cordova-plugins/zip": "^6.3.0",
"@ionic/angular": "^7.0.0",
"@ionic/cordova-builders": "^10.0.0",
"@moodlehq/cordova-plugin-advanced-http": "3.3.1-moodle.1",
@@ -71,6 +94,7 @@
"nl.kingsquare.cordova.background-audio": "^1.0.1",
"ogv": "^1.8.9",
"rxjs": "~7.8.0",
+ "swiper": "^11.0.3",
"ts-md5": "^1.2.7",
"tslib": "^2.3.0",
"video.js": "^7.21.1",
@@ -758,6 +782,281 @@
"resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz",
"integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg=="
},
+ "node_modules/@awesome-cordova-plugins/badge": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/badge/-/badge-6.4.0.tgz",
+ "integrity": "sha512-4Fy1ykRH6hfSVTbVOX98g+MiJlhc3ozjEePTl7z2FsJ4kkfUT9lVPM6TdBo1PVNn+PePNR2gKCKOIMJK4BJ+jw==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/camera": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/camera/-/camera-6.4.0.tgz",
+ "integrity": "sha512-ApkGm5DaRet1XVTZEk2flhFqPaxbI2Ymj3I7FjqfjR+oP5GvVj0MQ17Oo8gVGRIHZIde6ifks0xn/NfdiT9ySg==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/chooser": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/chooser/-/chooser-6.4.0.tgz",
+ "integrity": "sha512-/0Tei8A9Ms2sE9VyWKtt0pVC9r+d9hURQxFnVmtZfKX3nM5fdYRRfzh5BBIrJzn4YMV+TIOv6g3EE1YAhvYTpA==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/clipboard": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/clipboard/-/clipboard-6.4.0.tgz",
+ "integrity": "sha512-oDPQ/vJe8wQi/GeqHt7bCydeiReRMQ1lcmC9EvH0GoQUa/M3MOb4dWcSAAz23CxdGY6ePeeCS+727+Hc7xpakA==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/core": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/core/-/core-6.4.0.tgz",
+ "integrity": "sha512-06I5JdTgAgKTby+VG+3sQF5+z4RNCEyVl6y7tz2rICx8MURL1biuh3oGGN1rCQQjsuMZcX5siMBr0NF/OHqxLQ==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/device": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/device/-/device-6.4.0.tgz",
+ "integrity": "sha512-uGwlkNH7siiMvgC6PijCDySn59JY0qwxXLvOvhhumX1Lh8VjCEUfVRjkrgJEPEcJGY6lHjw4jChCWY2Tr1g/UQ==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/diagnostic": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/diagnostic/-/diagnostic-6.4.0.tgz",
+ "integrity": "sha512-XvYYviet10nRLeNDLcYkO9EdWxxTKWKt4XFHscmhP1Nyg7QFi2vJS8FwZj6u4y/u3JBlCe+/4s3xXC/6jpQTbg==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/file": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/file/-/file-6.4.0.tgz",
+ "integrity": "sha512-KOpYpUYA9PU37qiNS1QsTwtms1bX6YsOY2ASxwCqhD+gOqpCfkFHW0kJ9yFmO68gRR2vK3k6PgUimwJXkG6RgA==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/file-opener": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/file-opener/-/file-opener-6.4.0.tgz",
+ "integrity": "sha512-1IIFvnz8gPL4mQNqkA1LOUQeWoF8aUAbFGSVLfcvEwJlgXvzT6yC/t8F3Czf0se2TX4tbaoqCiAtxnwBaoIItA==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/file-transfer": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/file-transfer/-/file-transfer-6.4.0.tgz",
+ "integrity": "sha512-0FCtWSJQh62tlRu6GZdila6Yz5Z4D538zoIDvbmPNJfH8Urhops5ihscatebYHjNAt2UF8WmxzVjDyGOljcCbQ==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/geolocation": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/geolocation/-/geolocation-6.4.0.tgz",
+ "integrity": "sha512-Jyn3pB1sPBqpZrv6/6A1gT7/FIDSYOaGbYNEeF9EHm9hz2maLXIVVdwYY8Hp9vggZ2g2mDpRLRNbXRfSo+R9Gw==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/http": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/http/-/http-6.4.0.tgz",
+ "integrity": "sha512-nv8Az1bYnEm/MQSA6Oec0FFAGFu5bmubQXypp08ZUJA4uGkps3IJS02F0451PF/vM0Jcpnb+W6ZRqRCNJ34ZJA==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/in-app-browser": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/in-app-browser/-/in-app-browser-6.4.0.tgz",
+ "integrity": "sha512-AaHg/hpXrfKtX+HCzENJDjR9z2wYyNe86o2VeKZlQQP/teuo8SleOIsmN4yTVI1nqnGrQTuD4sKQIhiNeS836g==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/ionic-webview": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/ionic-webview/-/ionic-webview-6.4.0.tgz",
+ "integrity": "sha512-w45CjIn/CqZ3D5pXG5t+QyXwdUnBskFmbdN/A6Tv0NVu6uYl3cz0ZWFN+4bK2X/5IPlSC1orQAHaEHrGFomvpw==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/keyboard": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/keyboard/-/keyboard-6.4.0.tgz",
+ "integrity": "sha512-9CNRYlnqbi47FyRPzcPGUkW8kQNv0nowxPAmBFkda51GNXvtw+BQ7YLDQSkthyBZr5RlU3GmtGibyYIMeOlLkQ==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/local-notifications": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/local-notifications/-/local-notifications-6.4.0.tgz",
+ "integrity": "sha512-q6oeVqLx6SSOkeSCu46PvX6twdY3GevRz5aIlOtroNhqmCmeDmIq2OppDnL3DmnqOY0VVO3spYdQEuo2uYRCwQ==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/media-capture": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/media-capture/-/media-capture-6.4.0.tgz",
+ "integrity": "sha512-HP6OsvIDr1V76UgBfNvhoy9dM1IC7Eo0ACisbPoJECZKVSNfTwWoVZonyCvp76U0xaoXuF10GRN6WlQisoWXIw==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/network": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/network/-/network-6.4.0.tgz",
+ "integrity": "sha512-opEQo8c/KeGH2bSqJ6F7jOxgC2lMkTZD2PxIsN5jId4KsbOMfvB4cE5ljVcx8TCmeKwHj7pGPlLcR9Eze1BawA==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/splash-screen": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/splash-screen/-/splash-screen-6.4.0.tgz",
+ "integrity": "sha512-0JlJysmxOPiU+wCMfo4ocHTPBWrhyTsh34Kig6t+lgO5fLUUtrLXW3LCOxx0TaXJt5XjYdfXXQciLYGXcQ4gww==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/sqlite": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/sqlite/-/sqlite-6.4.0.tgz",
+ "integrity": "sha512-2CXSZxp0pQUabSv4kLzCMpicNjuKmwraJ3xCP3+6QVvZr0kZ10Xh8cgIU5nPL/x9G2zzG9fVubLewh3hEgR8Zg==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/status-bar": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/status-bar/-/status-bar-6.4.0.tgz",
+ "integrity": "sha512-BQ0Nip16YFQ7PvQvu5+SJASDl8Uomxm1wn9tZpk+8NcQGLKTf8fL94Z2MA5HjFsHaAlzw+fFo7UJ9+9qfd1hPA==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/web-intent": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/web-intent/-/web-intent-6.4.0.tgz",
+ "integrity": "sha512-JJJpQ/viDCCkdhvq0A3ZnY5mmnNPd1IHGlB8tDR0jfunWzh2wK5EbETt0RVAF7zYxRnHKltx6Ep3FAd7JIY0Kw==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
+ "node_modules/@awesome-cordova-plugins/zip": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/zip/-/zip-6.4.0.tgz",
+ "integrity": "sha512-s6Bg+sBepwhVvN+8fdns8QOOY5Mo5pg9Iy1aJiFDBUipuQOLaO++zw5u+no0igObnYcaQAdSO2XyEBX/h0T59g==",
+ "dependencies": {
+ "@types/cordova": "latest"
+ },
+ "peerDependencies": {
+ "@awesome-cordova-plugins/core": "^6.0.1",
+ "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.23.4",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz",
@@ -27268,6 +27567,24 @@
"es6-symbol": "^3.1.1"
}
},
+ "node_modules/swiper": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.0.5.tgz",
+ "integrity": "sha512-rhCwupqSyRnWrtNzWzemnBLMoyYuoDgGgspAm/8iBD3jCvAWycPLH4Z3TB0O5520DHLzMx94yUMH/B9Efpa48w==",
+ "funding": [
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/swiperjs"
+ },
+ {
+ "type": "open_collective",
+ "url": "http://opencollective.com/swiper"
+ }
+ ],
+ "engines": {
+ "node": ">= 4.7.0"
+ }
+ },
"node_modules/symbol-observable": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz",
diff --git a/package.json b/package.json
index 11f19e95b..7eb597346 100644
--- a/package.json
+++ b/package.json
@@ -53,6 +53,29 @@
"@angular/platform-browser": "^16.2.0",
"@angular/platform-browser-dynamic": "^16.2.0",
"@angular/router": "^16.2.0",
+ "@awesome-cordova-plugins/badge": "^6.3.0",
+ "@awesome-cordova-plugins/camera": "^6.3.0",
+ "@awesome-cordova-plugins/chooser": "^6.3.0",
+ "@awesome-cordova-plugins/clipboard": "^6.3.0",
+ "@awesome-cordova-plugins/core": "^6.3.0",
+ "@awesome-cordova-plugins/device": "^6.3.0",
+ "@awesome-cordova-plugins/diagnostic": "^6.3.0",
+ "@awesome-cordova-plugins/file": "^6.3.0",
+ "@awesome-cordova-plugins/file-opener": "^6.3.0",
+ "@awesome-cordova-plugins/file-transfer": "^6.3.0",
+ "@awesome-cordova-plugins/geolocation": "^6.3.0",
+ "@awesome-cordova-plugins/http": "^6.3.0",
+ "@awesome-cordova-plugins/in-app-browser": "^6.3.0",
+ "@awesome-cordova-plugins/ionic-webview": "^6.3.0",
+ "@awesome-cordova-plugins/keyboard": "^6.3.0",
+ "@awesome-cordova-plugins/local-notifications": "^6.3.0",
+ "@awesome-cordova-plugins/media-capture": "^6.3.0",
+ "@awesome-cordova-plugins/network": "^6.3.0",
+ "@awesome-cordova-plugins/splash-screen": "^6.3.0",
+ "@awesome-cordova-plugins/sqlite": "^6.3.0",
+ "@awesome-cordova-plugins/status-bar": "^6.3.0",
+ "@awesome-cordova-plugins/web-intent": "^6.3.0",
+ "@awesome-cordova-plugins/zip": "^6.3.0",
"@ionic/angular": "^7.0.0",
"@ionic/cordova-builders": "^10.0.0",
"@moodlehq/cordova-plugin-advanced-http": "3.3.1-moodle.1",
@@ -106,6 +129,7 @@
"nl.kingsquare.cordova.background-audio": "^1.0.1",
"ogv": "^1.8.9",
"rxjs": "~7.8.0",
+ "swiper": "^11.0.3",
"ts-md5": "^1.2.7",
"tslib": "^2.3.0",
"video.js": "^7.21.1",
diff --git a/src/addons/badges/pages/issued-badge/issued-badge.html b/src/addons/badges/pages/issued-badge/issued-badge.html
index 7a609db0b..0cb85f6c7 100644
--- a/src/addons/badges/pages/issued-badge/issued-badge.html
+++ b/src/addons/badges/pages/issued-badge/issued-badge.html
@@ -1,7 +1,7 @@
-
+
{{ badge.name }}
@@ -11,7 +11,7 @@
-
+
@@ -122,8 +122,7 @@
{{ 'core.course' | translate}}
-
-
+
diff --git a/src/addons/badges/pages/user-badges/user-badges.html b/src/addons/badges/pages/user-badges/user-badges.html
index d91a5e0e8..edc263c99 100644
--- a/src/addons/badges/pages/user-badges/user-badges.html
+++ b/src/addons/badges/pages/user-badges/user-badges.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.badges.badges' | translate }}
@@ -11,11 +11,10 @@
-
+
-
-
+
-
-
+
{{ entry.name }}
diff --git a/src/addons/block/myoverview/components/myoverview/addon-block-myoverview.html b/src/addons/block/myoverview/components/myoverview/addon-block-myoverview.html
index 1a1f2e148..1c55aafb3 100644
--- a/src/addons/block/myoverview/components/myoverview/addon-block-myoverview.html
+++ b/src/addons/block/myoverview/components/myoverview/addon-block-myoverview.html
@@ -7,16 +7,14 @@
0" class="core-button-spinner">
-
-
+
{{prefetchCoursesData.badge}}
-
-
+
@@ -26,8 +24,7 @@
-
+ (ionCancel)="filterTextChanged($event.target)" [placeholder]="'core.courses.filtermycourses' | translate" />
@@ -70,8 +67,7 @@
-
+ (ionCancel)="filterTextChanged($event.target)" [placeholder]="'core.courses.filtermycourses' | translate" />
-
+
-
+
@@ -114,8 +110,7 @@
{{'addon.block_myoverview.nocoursesenrolleddescription' | translate}}
-
-
+
{{'addon.block_myoverview.browseallcourses' | translate}}
@@ -128,8 +123,7 @@
-
+ [layout]="layout" />
diff --git a/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/addon-block-recentlyaccessedcourses.html b/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/addon-block-recentlyaccessedcourses.html
index ea4e9891a..1b76456b0 100644
--- a/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/addon-block-recentlyaccessedcourses.html
+++ b/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/addon-block-recentlyaccessedcourses.html
@@ -3,21 +3,19 @@
{{ 'addon.block_recentlyaccessedcourses.pluginname' | translate }}
-
-
+
+ [message]="'addon.block_recentlyaccessedcourses.nocourses' | translate" />
+ [message]="'addon.block_recentlyaccesseditems.noitems' | translate" />
diff --git a/src/addons/block/sitemainmenu/components/sitemainmenu/addon-block-sitemainmenu.html b/src/addons/block/sitemainmenu/components/sitemainmenu/addon-block-sitemainmenu.html
index 4b6d5b6ba..6885e5146 100644
--- a/src/addons/block/sitemainmenu/components/sitemainmenu/addon-block-sitemainmenu.html
+++ b/src/addons/block/sitemainmenu/components/sitemainmenu/addon-block-sitemainmenu.html
@@ -8,10 +8,10 @@
+ [contextInstanceId]="siteHomeId" />
-
+
diff --git a/src/addons/block/starredcourses/components/starredcourses/addon-block-starredcourses.html b/src/addons/block/starredcourses/components/starredcourses/addon-block-starredcourses.html
index debe61210..f022f3e2c 100644
--- a/src/addons/block/starredcourses/components/starredcourses/addon-block-starredcourses.html
+++ b/src/addons/block/starredcourses/components/starredcourses/addon-block-starredcourses.html
@@ -3,21 +3,19 @@
{{ 'addon.block_starredcourses.pluginname' | translate }}
-
-
+
+ [message]="'addon.block_starredcourses.nocourses' | translate" />
diff --git a/src/addons/block/timeline/components/timeline/addon-block-timeline.html b/src/addons/block/timeline/components/timeline/addon-block-timeline.html
index b20b7952d..a5bc3a312 100644
--- a/src/addons/block/timeline/components/timeline/addon-block-timeline.html
+++ b/src/addons/block/timeline/components/timeline/addon-block-timeline.html
@@ -9,7 +9,7 @@
+ searchArea="AddonBlockTimeline" />
@@ -31,7 +31,7 @@
+ searchArea="AddonBlockTimeline" />
+ [loadingMore]="data.loadingMore" (loadMore)="section.loadMore()" [course]="section.course" />
+ [message]="'addon.block_timeline.noevents' | translate" />
diff --git a/src/addons/blog/pages/entries/entries.html b/src/addons/blog/pages/entries/entries.html
index df97ac484..9fac4dfb2 100644
--- a/src/addons/blog/pages/entries/entries.html
+++ b/src/addons/blog/pages/entries/entries.html
@@ -1,37 +1,35 @@
-
+
{{ title | translate }}
-
+
-
+
{{ 'addon.blog.showonlyyourentries' | translate }}
-
+
-
-
+
-
+
-
+ [contextInstanceId]="contextInstanceId" />
{{ 'addon.blog.' + entry.publishTranslated! | translate}}
@@ -49,35 +47,32 @@
-
+ [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" />
0">
{{ 'core.tag.tags' | translate }}:
-
+
-
+ [instanceId]="entry.userid" contextLevel="user" [showItem]="true" />
-
+ [componentId]="entry.id" />
{{ 'addon.blog.linktooriginalentry' | translate }}
entry.created">
- {{entry.lastmodified
+ {{entry.lastmodified
|
coreTimeAgo}}
-
+
diff --git a/src/addons/calendar/components/calendar/addon-calendar-calendar.html b/src/addons/calendar/components/calendar/addon-calendar-calendar.html
index 02bab4b3b..2d543551b 100644
--- a/src/addons/calendar/components/calendar/addon-calendar-calendar.html
+++ b/src/addons/calendar/components/calendar/addon-calendar-calendar.html
@@ -2,8 +2,7 @@
-
+ [content]="'addon.calendar.currentmonth' | translate" iconAction="fas-calendar-day" (action)="goToCurrentMonth()" />
@@ -14,19 +13,18 @@
-
+
{{ periodName }}
-
-
+
-
+
@@ -50,8 +48,7 @@
-
-
+
+ [attr.aria-label]="'core.notsent' | translate" />
+ [attr.aria-label]="'core.deletedoffline' | translate" />
{{ event.timestart * 1000 | coreFormatDate: timeFormat }}
@@ -98,8 +95,7 @@
-
-
+
diff --git a/src/addons/calendar/components/calendar/calendar.scss b/src/addons/calendar/components/calendar/calendar.scss
index f3d27322f..2403bf1a1 100644
--- a/src/addons/calendar/components/calendar/calendar.scss
+++ b/src/addons/calendar/components/calendar/calendar.scss
@@ -142,7 +142,7 @@
}
}
- ion-slide {
+ swiper-slide {
display: block;
font-size: inherit;
justify-content: start;
diff --git a/src/addons/calendar/components/calendar/calendar.ts b/src/addons/calendar/components/calendar/calendar.ts
index 1d9c2eea9..3561366a8 100644
--- a/src/addons/calendar/components/calendar/calendar.ts
+++ b/src/addons/calendar/components/calendar/calendar.ts
@@ -64,7 +64,7 @@ import { Translate } from '@singletons';
})
export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestroy {
- @ViewChild(CoreSwipeSlidesComponent) slides?: CoreSwipeSlidesComponent;
+ @ViewChild(CoreSwipeSlidesComponent) swipeSlidesComponent?: CoreSwipeSlidesComponent;
@Input() initialYear?: number; // Initial year to load.
@Input() initialMonth?: number; // Initial month to load.
@@ -185,7 +185,7 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro
this.hiddenDiffer = this.hidden;
if (!this.hidden) {
- this.slides?.slides?.getSwiper().then(swipper => swipper.update());
+ this.swipeSlidesComponent?.updateSlidesComponent();
}
}
}
@@ -248,14 +248,14 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro
* Load next month.
*/
loadNext(): void {
- this.slides?.slideNext();
+ this.swipeSlidesComponent?.slideNext();
}
/**
* Load previous month.
*/
loadPrevious(): void {
- this.slides?.slidePrev();
+ this.swipeSlidesComponent?.slidePrev();
}
/**
@@ -343,8 +343,7 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro
*/
async viewMonth(month: number, year: number): Promise {
const manager = this.manager;
- const slides = this.slides;
- if (!manager || !slides) {
+ if (!manager || !this.swipeSlidesComponent) {
return;
}
@@ -360,7 +359,7 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro
// Make sure the day is loaded.
await manager.getSource().loadItem(item);
- slides.slideToItem(item);
+ this.swipeSlidesComponent.slideToItem(item);
} catch (error) {
CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true);
} finally {
diff --git a/src/addons/calendar/components/filter/filter.html b/src/addons/calendar/components/filter/filter.html
index 65dee4fd4..365e7e72f 100644
--- a/src/addons/calendar/components/filter/filter.html
+++ b/src/addons/calendar/components/filter/filter.html
@@ -2,7 +2,7 @@
-
+
@@ -10,18 +10,18 @@
-
+
{{ 'addon.calendar.' + type + 'events' | translate}}
-
+
-
+
-
+
-
+
diff --git a/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html b/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html
index c16291fdc..1224e95ef 100644
--- a/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html
+++ b/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html
@@ -1,6 +1,6 @@
-
-
+
@@ -8,9 +8,8 @@
-
-
+ [componentId]="event.instance" [showAlt]="false" [purpose]="event.purpose" />
+
@@ -19,18 +18,18 @@
+ [contextInstanceId]="event.contextInstanceId" />
-
+
-
+
{{ 'core.notsent' | translate }}
-
+
{{ 'core.deletedoffline' | translate }}
diff --git a/src/addons/calendar/pages/day/day.html b/src/addons/calendar/pages/day/day.html
index acdb94351..373e65cdd 100644
--- a/src/addons/calendar/pages/day/day.html
+++ b/src/addons/calendar/pages/day/day.html
@@ -1,30 +1,28 @@
-
+
{{ 'addon.calendar.calendarevents' | translate }}
-
+
-
+ iconAction="fas-calendar-day" (action)="goToCurrentDay()" />
-
+ [closeOnClick]="false" />
-
+
@@ -34,7 +32,7 @@
-
+
@@ -42,7 +40,7 @@
-
+
@@ -54,14 +52,13 @@
-
+
{{ 'core.hasdatatosync' | translate:{$a: 'core.day' | translate} }}
-
+ [message]="'addon.calendar.noevents' | translate" />
@@ -70,11 +67,9 @@
(click)="gotoEvent(event.id, day)" [class.item-dimmed]="event.ispast"
[ngClass]="['addon-calendar-eventtype-'+event.eventtype]" button [detail]="false">
-
+ [modname]="event.modulename" [componentId]="event.instance" [purpose]="event.purpose" />
-
+ aria-hidden="true" />
@@ -84,18 +79,18 @@
+ [contextInstanceId]="event.contextInstanceId" />
-
+
-
+
{{ 'core.notsent' | translate }}
-
+
{{ 'core.deletedoffline' | translate }}
@@ -111,7 +106,7 @@
-
+
{{ 'addon.calendar.newevent' | translate }}
diff --git a/src/addons/calendar/pages/day/day.ts b/src/addons/calendar/pages/day/day.ts
index 83c8e41a8..6097d8af7 100644
--- a/src/addons/calendar/pages/day/day.ts
+++ b/src/addons/calendar/pages/day/day.ts
@@ -60,7 +60,7 @@ import { CoreTime } from '@singletons/time';
})
export class AddonCalendarDayPage implements OnInit, OnDestroy {
- @ViewChild(CoreSwipeSlidesComponent) slides?: CoreSwipeSlidesComponent;
+ @ViewChild(CoreSwipeSlidesComponent) swipeSlidesComponent?: CoreSwipeSlidesComponent;
protected currentSiteId: string;
@@ -434,8 +434,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
*/
async goToCurrentDay(): Promise {
const manager = this.manager;
- const slides = this.slides;
- if (!manager || !slides) {
+ if (!manager || !this.swipeSlidesComponent) {
return;
}
@@ -448,7 +447,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
// Make sure the day is loaded.
await manager.getSource().loadItem(currentDay);
- slides.slideToItem(currentDay);
+ this.swipeSlidesComponent.slideToItem(currentDay);
} catch (error) {
CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true);
} finally {
@@ -460,14 +459,14 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
* Load next day.
*/
async loadNext(): Promise {
- this.slides?.slideNext();
+ this.swipeSlidesComponent?.slideNext();
}
/**
* Load previous day.
*/
async loadPrevious(): Promise {
- this.slides?.slidePrev();
+ this.swipeSlidesComponent?.slidePrev();
}
/**
diff --git a/src/addons/calendar/pages/edit-event/edit-event.html b/src/addons/calendar/pages/edit-event/edit-event.html
index 09a702814..f949796e8 100644
--- a/src/addons/calendar/pages/edit-event/edit-event.html
+++ b/src/addons/calendar/pages/edit-event/edit-event.html
@@ -1,7 +1,7 @@
-
+
{{ title | translate }}
@@ -10,7 +10,7 @@
-
+
@@ -20,9 +20,8 @@
{{ 'addon.calendar.eventname' | translate }}
-
-
-
+
+
@@ -31,9 +30,8 @@
{{ 'core.date' | translate }}
-
-
+ [max]="maxDate" [min]="minDate" [displayTimezone]="displayTimezone" />
+
@@ -108,7 +106,7 @@
-
+
@@ -121,7 +119,7 @@
-
+
@@ -129,7 +127,7 @@
{{ reminder.label }}
-
+
@@ -146,31 +144,30 @@
{{ 'addon.calendar.durationnone' | translate }}
-
+
{{ 'addon.calendar.durationuntil' | translate }}
-
+
-
+
-
+ [displayTimezone]="displayTimezone" />
{{ 'addon.calendar.durationminutes' | translate }}
-
+
{{ 'addon.calendar.durationminutes' | translate }}
+ [placeholder]="'addon.calendar.durationminutes' | translate" formControlName="timedurationminutes" />
@@ -181,14 +178,13 @@
{{ 'addon.calendar.repeatevent' | translate }}
-
+
{{ 'addon.calendar.repeatweeksl' | translate }}
-
-
+
@@ -204,13 +200,13 @@
{{ 'addon.calendar.repeateditall' | translate:{$a: otherEventsCount} }}
-
+
{{ 'addon.calendar.repeateditthis' | translate }}
-
+
@@ -222,7 +218,7 @@
+ [autoSave]="false" />
@@ -230,8 +226,7 @@
{{ 'core.location' | translate }}
-
-
+
diff --git a/src/addons/calendar/pages/event/event.html b/src/addons/calendar/pages/event/event.html
index 81a83d325..1af4abd75 100644
--- a/src/addons/calendar/pages/event/event.html
+++ b/src/addons/calendar/pages/event/event.html
@@ -1,42 +1,38 @@
-
+
-
-
+
-
+ [iconAction]="syncIcon" [closeOnClick]="false" />
0)" [priority]="300"
- [content]="'core.edit' | translate" (action)="openEdit()" iconAction="fas-pen">
-
+ [content]="'core.edit' | translate" (action)="openEdit()" iconAction="fas-pen" />
+ [content]="'core.delete' | translate" (action)="deleteEvent()" iconAction="fas-trash" />
+ (action)="undoDelete()" iconAction="fas-rotate-left" />
-
+
-
-
+ [componentId]="event.instance" slot="start" [purpose]="event.purpose" />
+
@@ -45,25 +41,24 @@
-
+ [contextInstanceId]="event.contextInstanceId" />
-
+
{{ 'core.hasdatatosync' | translate:{$a: 'addon.calendar.calendarevent' | translate} }}
{{ 'addon.calendar.when' | translate }}
-
+
- {{ 'core.deletedoffline' | translate }}
+ {{ 'core.deletedoffline' | translate }}
@@ -76,8 +71,7 @@
{{ 'core.course' | translate}}
-
-
+
@@ -85,8 +79,7 @@
{{ 'core.group' | translate}}
-
-
+
@@ -94,8 +87,7 @@
{{ 'core.category' | translate}}
-
-
+
@@ -104,7 +96,7 @@
{{ 'core.description' | translate}}
+ [contextInstanceId]="event.contextInstanceId" />
@@ -114,7 +106,7 @@
+ [contextInstanceId]="event.contextInstanceId" />
@@ -142,7 +134,7 @@
-
+
diff --git a/src/addons/calendar/pages/index/index.html b/src/addons/calendar/pages/index/index.html
index 39f929563..6e3c382bb 100644
--- a/src/addons/calendar/pages/index/index.html
+++ b/src/addons/calendar/pages/index/index.html
@@ -1,55 +1,52 @@
-
+
{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}
-
+
+ iconAction="fas-table-list" (action)="toggleDisplay()" />
+ iconAction="fas-calendar-days" (action)="toggleDisplay()" />
-
+ iconAction="fas-gears" />
+ [iconAction]="syncIcon" [closeOnClick]="false" />
-
+
-
+
-
+
{{ 'core.hasdatatosync' | translate:{$a: 'addon.calendar.calendar' | translate} }}
-
+ [displayNavButtons]="showCalendar" (onEventClicked)="gotoEvent($event)" (onDayClicked)="gotoDay($event)" />
-
-
+
-
+
{{ 'addon.calendar.newevent' | translate }}
diff --git a/src/addons/calendar/pages/settings/settings.html b/src/addons/calendar/pages/settings/settings.html
index d8982f79b..7ca79cf28 100644
--- a/src/addons/calendar/pages/settings/settings.html
+++ b/src/addons/calendar/pages/settings/settings.html
@@ -1,7 +1,7 @@
-
+
{{ 'core.settings.settings' | translate }}
diff --git a/src/addons/competency/pages/competencies/competencies.html b/src/addons/competency/pages/competencies/competencies.html
index 33b3afe43..9a4b264c5 100644
--- a/src/addons/competency/pages/competencies/competencies.html
+++ b/src/addons/competency/pages/competencies/competencies.html
@@ -1,12 +1,11 @@
-
+
-
-
+
@@ -14,7 +13,7 @@
-
+
@@ -24,8 +23,7 @@
- {{competency.competency.idnumber}}
+ [contextInstanceId]="contextInstanceId" /> {{competency.competency.idnumber}}
-
+
- {{ competency.competency.competency.idnumber }}
+ [contextInstanceId]="contextInstanceId" /> {{ competency.competency.competency.idnumber }}
-
+
-
+
{{ user.fullname }}
@@ -30,8 +29,7 @@
-
+ [contextInstanceId]="contextInstanceId" />
@@ -40,26 +38,22 @@
-
+ [contextInstanceId]="contextInstanceId" />
-
+ [contextInstanceId]="contextInstanceId" />
/
-
+ [contextInstanceId]="contextInstanceId" />
-
+ [contextInstanceId]="contextInstanceId" />
/
@@ -76,8 +70,7 @@
- - {{ relatedcomp.idnumber }}
+ [contextInstanceId]="contextInstanceId" /> - {{ relatedcomp.idnumber }}
@@ -91,12 +84,10 @@
-
-
+
-
+ [courseId]="courseId" />
@@ -136,7 +127,7 @@
-
+
{{ evidence.actionuser.fullname }}
{{ evidence.timemodified * 1000 | coreFormatDate }}
diff --git a/src/addons/competency/pages/competencysummary/competencysummary.html b/src/addons/competency/pages/competencysummary/competencysummary.html
index 3c354f39f..7271d983c 100644
--- a/src/addons/competency/pages/competencysummary/competencysummary.html
+++ b/src/addons/competency/pages/competencysummary/competencysummary.html
@@ -1,28 +1,26 @@
-
+
- {{ competency.competency.idnumber }}
+ [contextInstanceId]="contextInstanceId" /> {{ competency.competency.idnumber }}
-
+
-
+ [contextInstanceId]="contextInstanceId" />
@@ -30,14 +28,12 @@
{{ 'addon.competency.path' | translate }}
-
+ [contextInstanceId]="contextInstanceId" />
/
-
+ [contextInstanceId]="contextInstanceId" />
diff --git a/src/addons/competency/pages/coursecompetencies/coursecompetencies.html b/src/addons/competency/pages/coursecompetencies/coursecompetencies.html
index 687d8f88c..1547cbb80 100644
--- a/src/addons/competency/pages/coursecompetencies/coursecompetencies.html
+++ b/src/addons/competency/pages/coursecompetencies/coursecompetencies.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.competency.coursecompetencies' | translate }}
@@ -10,7 +10,7 @@
-
+
0">
@@ -29,8 +29,7 @@
{x: courseCompetencies.statistics.proficientcompetencycount, y: courseCompetencies.statistics.competencycount} } }}
-
+ ariaDescribedBy="addon-competency-course-{{courseId}}-progress" />
{{ 'addon.competency.competenciesmostoftennotproficientincourse' | translate }}
-
- - {{ comp.idnumber }}
+ - {{
+ comp.idnumber }}
@@ -52,15 +51,14 @@
-
+
{{ user.fullname }}
-
+ message="{{ 'addon.competency.nocompetenciesincourse' | translate }}" />
@@ -68,8 +66,8 @@
[attr.aria-label]="competency.competency.shortname" [detail]="true" button>
-
- {{competency.competency.idnumber}}
+ {{competency.competency.idnumber}}
-
+ [contextInstanceId]="courseId" />
{{ 'addon.competency.path' | translate }}
@@ -90,24 +87,20 @@
-
+ [contextInstanceId]="courseId" />
-
+ [contextInstanceId]="courseId" />
/
-
-
+
-
-
+
/
@@ -126,12 +119,10 @@
-
-
+
-
+ [courseId]="courseId" />
@@ -143,8 +134,7 @@
-
-
+
diff --git a/src/addons/competency/pages/plan/plan.html b/src/addons/competency/pages/plan/plan.html
index 8bbcd992d..be91b266e 100644
--- a/src/addons/competency/pages/plan/plan.html
+++ b/src/addons/competency/pages/plan/plan.html
@@ -1,25 +1,24 @@
-
+
-
-
+
-
+
-
+
{{ user.fullname }}
@@ -29,8 +28,7 @@
-
-
+
@@ -50,8 +48,7 @@
{{ 'addon.competency.template' | translate }}
-
-
+
@@ -64,8 +61,7 @@
-
+ ariaDescribedBy="addon-competency-plan-{{plan.plan.id}}-progress" />
@@ -85,8 +81,7 @@
- {{competency.competency.idnumber}}
+ [contextInstanceId]="plan.plan.userid" /> {{competency.competency.idnumber}}
-
+
{{ 'addon.competency.userplans' | translate }}
@@ -11,19 +11,16 @@
-
+
-
-
-
+
-
-
+
0">
{{ 'addon.competency.duedate' | translate }}:
diff --git a/src/addons/coursecompletion/pages/report/report.html b/src/addons/coursecompletion/pages/report/report.html
index d31d01da6..b94dd4763 100644
--- a/src/addons/coursecompletion/pages/report/report.html
+++ b/src/addons/coursecompletion/pages/report/report.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.coursecompletion.coursecompletion' | translate }}
@@ -10,11 +10,11 @@
-
+
-
+
{{user.fullname}}
@@ -44,10 +44,10 @@
-
+
-
+
{{ 'core.yes' | translate }}
@@ -65,23 +65,23 @@
-
+
-
+
-
+
-
+
{{ 'core.yes' | translate }}
{{ 'core.no' | translate }}
{{ criteria.timecompleted * 1000 | coreFormatDate :'strftimedatetimeshort' }}
-
+
@@ -103,7 +103,7 @@
-
+
{{ 'addon.coursecompletion.nottracked' | translate }}
diff --git a/src/addons/filter/mathjaxloader/services/handlers/mathjaxloader.ts b/src/addons/filter/mathjaxloader/services/handlers/mathjaxloader.ts
index 7589f5be8..7ca996ae7 100644
--- a/src/addons/filter/mathjaxloader/services/handlers/mathjaxloader.ts
+++ b/src/addons/filter/mathjaxloader/services/handlers/mathjaxloader.ts
@@ -411,7 +411,7 @@ type MathJaxWindow = Window & {
_configured: boolean; // eslint-disable-line @typescript-eslint/naming-convention
// Add the configuration to the head and set the lang.
configure: (params: Record) => void;
- _setLocale: () => void; // eslint-disable-line @typescript-eslint/naming-convention
+ _setLocale: () => void;
typeset: (container: HTMLElement) => void;
};
};
diff --git a/src/addons/messageoutput/airnotifier/pages/devices/devices.html b/src/addons/messageoutput/airnotifier/pages/devices/devices.html
index 2a84773ea..ffecacf69 100644
--- a/src/addons/messageoutput/airnotifier/pages/devices/devices.html
+++ b/src/addons/messageoutput/airnotifier/pages/devices/devices.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.messageoutput_airnotifier.processorsettingsdesc' | translate }}
@@ -10,7 +10,7 @@
-
+
@@ -33,8 +33,7 @@
-
-
+
diff --git a/src/addons/messages/components/conversation-info/conversation-info.html b/src/addons/messages/components/conversation-info/conversation-info.html
index 8d53b3dce..1e8b058d3 100644
--- a/src/addons/messages/components/conversation-info/conversation-info.html
+++ b/src/addons/messages/components/conversation-info/conversation-info.html
@@ -5,14 +5,14 @@
-
+
-
+
@@ -23,12 +23,11 @@
onError="this.src='assets/img/group-avatar.svg'">
-
+
-
+ [contextInstanceId]="0" />
{{ 'addon.messages.numparticipants' | translate:{$a: conversation.membercount} }}
@@ -36,19 +35,16 @@
-
-
+
{{ member.fullname }}
-
+ [attr.aria-label]="'addon.messages.contactblocked' | translate" />
-
-
+
diff --git a/src/addons/messages/pages/contacts-35/contacts.html b/src/addons/messages/pages/contacts-35/contacts.html
index 4086c4c08..209e28930 100644
--- a/src/addons/messages/pages/contacts-35/contacts.html
+++ b/src/addons/messages/pages/contacts-35/contacts.html
@@ -1,32 +1,32 @@
-
+
{{ 'addon.messages.contacts' | translate }}
-
+
-
+
+ autocorrect="off" spellcheck="false" lengthCheck="2" [disabled]="!loaded" searchArea="AddonMessagesContacts" />
+ [message]="'addon.messages.contactlistempty' | translate" />
+ [message]="'addon.messages.nousersfound' | translate" />
0 || contactType === searchType)">
@@ -44,7 +44,7 @@
*ngIf="contact.profileimageurl || contact.profileimageurlsmall" [attr.aria-label]="contact.fullname"
(click)="gotoDiscussion(contact.id)" [detail]="true" button
[attr.aria-current]="contact.id === discussionUserId ? 'page' : 'false'">
-
+
{{ contact.fullname }}
diff --git a/src/addons/messages/pages/contacts/contacts.html b/src/addons/messages/pages/contacts/contacts.html
index 5903b00ee..613d674f0 100644
--- a/src/addons/messages/pages/contacts/contacts.html
+++ b/src/addons/messages/pages/contacts/contacts.html
@@ -1,17 +1,17 @@
-
+
{{ 'addon.messages.contacts' | translate }}
-
+
-
+
@@ -23,7 +23,7 @@
-
+
@@ -31,27 +31,22 @@
*ngFor="let contact of confirmedContacts" [attr.aria-label]="contact.fullname" [detail]="true"
[attr.aria-current]="contact.id === selectedUserId ? 'page' : 'false'">
-
+ [linkProfile]="false" />
-
-
+
-
+ [attr.aria-label]="'addon.messages.contactblocked' | translate" />
-
+ [message]="'addon.messages.nocontactsgetstarted' | translate" />
-
+ position="bottom" />
@@ -61,17 +56,16 @@
badgeA11yText="addon.messages.pendingcontactrequests">
-
+
-
+
-
-
+
{{ 'addon.messages.wouldliketocontactyou' | translate }}
@@ -79,11 +73,9 @@
-
+ [message]="'addon.messages.nocontactrequests' | translate" />
-
+ position="bottom" />
diff --git a/src/addons/messages/pages/discussion/discussion.html b/src/addons/messages/pages/discussion/discussion.html
index 3a6610ec0..db3c27112 100644
--- a/src/addons/messages/pages/discussion/discussion.html
+++ b/src/addons/messages/pages/discussion/discussion.html
@@ -1,67 +1,57 @@
-
+
-
-
+ [checkOnline]="otherMember.showonlinestatus" />
+
-
+ [attr.aria-label]="'core.favourites' | translate" />
-
+ [attr.aria-label]="'addon.messages.mutedconversation' | translate" />
-
+
+ [content]="'addon.messages.info' | translate" (action)="viewInfo()" iconAction="fas-circle-info" />
-
+ [content]="'addon.messages.groupinfo' | translate" (action)="viewInfo()" iconAction="fas-circle-info" />
-
+ 'addon.messages.addtofavourites') | translate" [iconAction]="favouriteIcon" [iconSlash]="favouriteIconSlash" />
-
+ [content]="'addon.messages.blockuser' | translate" (action)="blockUser()" [iconAction]="blockIcon" />
-
+ [content]="'addon.messages.unblockuser' | translate" (action)="unblockUser()" [iconAction]="blockIcon" />
+ 'addon.messages.muteconversation') | translate" [iconAction]="muteIcon" />
-
+ [content]="'addon.messages.showdeletemessages' | translate" iconAction="toggle" [(toggle)]="showDelete" />
+ [closeOnClick]="false" [iconAction]="deleteIcon" />
-
+ [content]="'addon.messages.addtoyourcontacts' | translate" (action)="createContactRequest()" [iconAction]="addRemoveIcon" />
+ [iconSlash]="true" />
-
-
+
{{ 'addon.messages.selfconversation' | translate }}
@@ -78,25 +68,23 @@
0 && message.id === unreadMessageFrom" color="light">
{{ 'addon.messages.newmessages' | translate }}
-
+
-
+ [time]="message.timecreated" />
-
+ [message]="'addon.messages.nomessagesfound' | translate" />
0">
-
+
{{ 'addon.messages.newmessages' | translate }}
{{ newMessages }}
@@ -138,6 +126,6 @@
+ [placeholder]="'addon.messages.newmessage' | translate" />
diff --git a/src/addons/messages/pages/discussions-35/discussions.html b/src/addons/messages/pages/discussions-35/discussions.html
index a778f18f2..8995fb3cd 100644
--- a/src/addons/messages/pages/discussions-35/discussions.html
+++ b/src/addons/messages/pages/discussions-35/discussions.html
@@ -1,27 +1,27 @@
-
+
{{ 'addon.messages.messages' | translate }}
-
-
+
+
-
+
+ [autoFocus]="false" />
@@ -29,7 +29,7 @@
-
+
{{ 'addon.messages.contacts' | translate }}
@@ -47,12 +47,12 @@
-
+
{{ result.fullname }}
+ [contextInstanceId]="0" />
@@ -61,7 +61,7 @@
-
+
{{ discussion.fullname }}
@@ -69,8 +69,7 @@
0" class="addon-message-last-message-date">
{{discussion.message!.timecreated / 1000 | coreDateDayOrTime}}
-
-
+
{{ 'addon.messages.unreadmessages' | translate }}
@@ -78,8 +77,7 @@
-
+ [contextInstanceId]="0" />
@@ -87,10 +85,10 @@
+ [message]="'addon.messages.nomessagesfound' | translate" />
+ [message]="'core.noresults' | translate" />
diff --git a/src/addons/messages/pages/group-conversations/group-conversations.html b/src/addons/messages/pages/group-conversations/group-conversations.html
index 7a9af7157..de0dd6db5 100644
--- a/src/addons/messages/pages/group-conversations/group-conversations.html
+++ b/src/addons/messages/pages/group-conversations/group-conversations.html
@@ -1,34 +1,34 @@
-
+
{{ 'addon.messages.messages' | translate }}
-
+
-
+
-
-
+
+
-
+
-
+
{{ 'addon.messages.contacts' | translate }}
@@ -43,8 +43,7 @@
[attr.aria-expanded]="favourites.expanded" aria-controls="addon-messages-groupconversations-favourite" role="heading"
[detail]="false">
-
+ [class.expandable-status-icon-expanded]="favourites.expanded" />
{{ 'core.favourites' | translate }} ({{ favourites.count }})
@@ -55,11 +54,10 @@
-
-
+
+ [error]="favourites.loadMoreError" />
{{ 'addon.messages.nofavourites' | translate }}
@@ -68,7 +66,7 @@
-
+
@@ -77,8 +75,7 @@
[attr.aria-label]="(group.expanded ? 'core.collapse' : 'core.expand') | translate" [attr.aria-expanded]="group.expanded"
aria-controls="addon-messages-groupconversations-group" role="heading" [detail]="false">
-
+ [class.expandable-status-icon-expanded]="group.expanded" />
{{ 'addon.messages.groupconversations' | translate }} ({{ group.count }})
@@ -89,11 +86,10 @@
-
-
+
+ [error]="group.loadMoreError" />
{{ 'addon.messages.nogroupconversations' | translate }}
@@ -102,7 +98,7 @@
-
+
@@ -111,8 +107,7 @@
[attr.aria-expanded]="individual.expanded" aria-controls="addon-messages-groupconversations-individual" role="heading"
[detail]="false">
-
+ [class.expandable-status-icon-expanded]="individual.expanded" />
{{ 'addon.messages.individualconversations' | translate }} ({{ individual.count }})
@@ -123,11 +118,10 @@
-
-
+
+ [error]="individual.loadMoreError" />
{{ 'addon.messages.noindividualconversations' | translate }}
@@ -136,7 +130,7 @@
-
+
@@ -148,9 +142,9 @@
@@ -161,16 +155,15 @@
+ [checkOnline]="conversation.showonlinestatus" slot="start" />
-
-
-
-
-
+
+
+
0 || conversation.unreadcount">
0" class="addon-message-last-message-date">
@@ -183,7 +176,7 @@
-
+
@@ -192,7 +185,7 @@
{{ conversation.members[0].fullname + ':' }}
+ contextLevel="system" [contextInstanceId]="0" />
diff --git a/src/addons/messages/pages/search/search.html b/src/addons/messages/pages/search/search.html
index 933c0b2bb..60fa3c1ca 100644
--- a/src/addons/messages/pages/search/search.html
+++ b/src/addons/messages/pages/search/search.html
@@ -1,35 +1,34 @@
-
+
{{ 'addon.messages.searchcombined' | translate }}
-
+
+ [spellcheck]="false" [autoFocus]="true" [lengthCheck]="1" searchArea="AddonMessagesSearch" />
-
-
-
+
+
+
+ [error]="messages.loadMoreError" />
-
+ icon="fas-magnifying-glass" [message]="'core.noresults' | translate" />
@@ -46,13 +45,11 @@
-
+
-
-
-
-
+
+
0">
{{result.lastmessagedate | coreDateDayOrTime}}
@@ -62,7 +59,7 @@
{{ 'addon.messages.you' | translate }}
+ contextLevel="system" [contextInstanceId]="0" class="addon-message-last-message-text" />
@@ -75,7 +72,7 @@
-
+
diff --git a/src/addons/messages/pages/settings/settings.html b/src/addons/messages/pages/settings/settings.html
index fe58ac796..c5c8a9c40 100644
--- a/src/addons/messages/pages/settings/settings.html
+++ b/src/addons/messages/pages/settings/settings.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.messages.messages' | translate }}
@@ -10,7 +10,7 @@
-
+
@@ -25,7 +25,7 @@
{{ 'addon.messages.useentertosend' | translate }}
-
+
@@ -36,8 +36,7 @@
{{ 'addon.messages.blocknoncontacts' | translate }}
-
-
+
@@ -51,19 +50,19 @@
{{ 'addon.messages.contactableprivacy_onlycontacts' | translate }}
-
+
{{ 'addon.messages.contactableprivacy_coursemember' | translate }}
-
+
{{ 'addon.messages.contactableprivacy_site' | translate }}
-
+
@@ -72,10 +71,10 @@
-
+
-
+
@@ -109,8 +108,7 @@
-
+ (ngModelChange)="changePreferenceLegacy(notification, processor, state)" />
{{'core.settings.forced' | translate }}
@@ -145,8 +143,7 @@
-
-
+
{{ processor.lockedmessage }}
diff --git a/src/addons/mod/assign/components/edit-feedback-modal/edit-feedback-modal.html b/src/addons/mod/assign/components/edit-feedback-modal/edit-feedback-modal.html
index 38aa16a83..174c766bd 100644
--- a/src/addons/mod/assign/components/edit-feedback-modal/edit-feedback-modal.html
+++ b/src/addons/mod/assign/components/edit-feedback-modal/edit-feedback-modal.html
@@ -5,15 +5,14 @@
-
+
diff --git a/src/addons/mod/assign/components/feedback-plugin/addon-mod-assign-feedback-plugin.html b/src/addons/mod/assign/components/feedback-plugin/addon-mod-assign-feedback-plugin.html
index 3a61b78e2..81d2f09e0 100644
--- a/src/addons/mod/assign/components/feedback-plugin/addon-mod-assign-feedback-plugin.html
+++ b/src/addons/mod/assign/components/feedback-plugin/addon-mod-assign-feedback-plugin.html
@@ -9,12 +9,10 @@
-
+ contextLevel="module" [contextInstanceId]="assign.cmid" [courseId]="assign.course" />
-
+ [alwaysDownload]="true" />
diff --git a/src/addons/mod/assign/components/index/addon-mod-assign-index.html b/src/addons/mod/assign/components/index/addon-mod-assign-index.html
index 3f65bb593..cef082331 100644
--- a/src/addons/mod/assign/components/index/addon-mod-assign-index.html
+++ b/src/addons/mod/assign/components/index/addon-mod-assign-index.html
@@ -1,7 +1,7 @@
-
+
@@ -12,8 +12,7 @@
-
-
+
@@ -21,8 +20,7 @@
-
-
+
@@ -115,19 +113,17 @@
-
+
{{ 'addon.mod_assign.'+summary.warnofungroupedusers | translate }}
-
-
+
-
+ [moduleId]="module.id" />
diff --git a/src/addons/mod/assign/components/submission-plugin/addon-mod-assign-submission-plugin.html b/src/addons/mod/assign/components/submission-plugin/addon-mod-assign-submission-plugin.html
index 29818a878..389c7ed53 100644
--- a/src/addons/mod/assign/components/submission-plugin/addon-mod-assign-submission-plugin.html
+++ b/src/addons/mod/assign/components/submission-plugin/addon-mod-assign-submission-plugin.html
@@ -9,12 +9,10 @@
-
+ contextLevel="module" [contextInstanceId]="assign.cmid" [courseId]="assign.course" />
-
+ [alwaysDownload]="true" />
diff --git a/src/addons/mod/assign/components/submission/addon-mod-assign-submission.html b/src/addons/mod/assign/components/submission/addon-mod-assign-submission.html
index fc5a16654..a0f9a4e70 100644
--- a/src/addons/mod/assign/components/submission/addon-mod-assign-submission.html
+++ b/src/addons/mod/assign/components/submission/addon-mod-assign-submission.html
@@ -3,7 +3,7 @@
-
+
{{ 'addon.mod_assign.caneditsubmission' | translate }}
@@ -13,10 +13,10 @@
-
+
{{ user!.fullname }}
-
+
@@ -24,7 +24,7 @@
{{ 'addon.mod_assign.hiddenuser' | translate }} {{blindId}}
-
+
@@ -32,7 +32,7 @@
{{ 'addon.mod_assign.submissionstatus' | translate }}
-
+
@@ -103,8 +103,7 @@
{{ 'addon.mod_assign.timeremaining' | translate }}
0" [endTime]="timeLimitEndTime" mode="basic" timeUpText="00:00:00"
- [timeLeftClassThreshold]="-1" [underTimeClassThresholds]="[300, 900]" (finished)="timeUp()">
-
+ [timeLeftClassThreshold]="-1" [underTimeClassThresholds]="[300, 900]" (finished)="timeUp()" />
@@ -136,8 +135,7 @@
-
+ [submission]="userSubmission" [plugin]="plugin" />
0">
@@ -149,7 +147,7 @@
-
+
{{ user.fullname }}
@@ -213,7 +211,7 @@
{{ 'core.openinbrowser' | translate }}
-
+
@@ -229,10 +227,9 @@
-
+
-
-
+
@@ -253,8 +250,7 @@
-
-
+
@@ -268,12 +264,12 @@
{{ 'addon.mod_assign.currentgrade' | translate }}
-
+
-
+
@@ -285,8 +281,7 @@
{{ 'addon.mod_assign.gradeoutof' | translate: {$a: gradeInfo!.grade} }}
-
+ [lang]="grade.lang" />
{{ 'addon.mod_assign.gradelocked' | translate }}
@@ -345,8 +340,7 @@
-
+ [submission]="userSubmission" [userId]="submitId" [plugin]="plugin" [canEdit]="canSaveGrades" />
@@ -363,7 +357,7 @@
{{ 'addon.mod_assign.groupsubmissionsettings' | translate }}
{{ 'addon.mod_assign.applytoteam' | translate }}
-
+
@@ -387,14 +381,14 @@
{{ 'addon.mod_assign.addattempt' | translate }}
-
+
-
+
{{ 'addon.mod_assign.gradedby' | translate }}
{{ grader!.fullname }}
@@ -413,12 +407,12 @@
-
+
{{ 'addon.mod_assign.cannotgradefromapp' | translate }}
{{ 'core.openinbrowser' | translate }}
-
+
@@ -434,8 +428,7 @@
-
+ [wsNotFiltered]="true" />
{{ plugin.name }}
-
+ [contextInstanceId]="assign.cmid" [courseId]="assign.course" />
-
+
- {{ 'core.notsent' | translate }}
+ {{ 'core.notsent' | translate }}
@@ -25,6 +24,5 @@
{{ plugin.name }}
-
+ elementId="assignfeedbackcomments_editor" [draftExtraParams]="{userid: userId, action: 'grade'}" />
diff --git a/src/addons/mod/assign/feedback/editpdf/component/addon-mod-assign-feedback-editpdf.html b/src/addons/mod/assign/feedback/editpdf/component/addon-mod-assign-feedback-editpdf.html
index d50b9ae85..e3facd7a1 100644
--- a/src/addons/mod/assign/feedback/editpdf/component/addon-mod-assign-feedback-editpdf.html
+++ b/src/addons/mod/assign/feedback/editpdf/component/addon-mod-assign-feedback-editpdf.html
@@ -3,8 +3,8 @@
{{plugin.name}}
-
-
+
diff --git a/src/addons/mod/assign/feedback/file/component/addon-mod-assign-feedback-file.html b/src/addons/mod/assign/feedback/file/component/addon-mod-assign-feedback-file.html
index d50b9ae85..e3facd7a1 100644
--- a/src/addons/mod/assign/feedback/file/component/addon-mod-assign-feedback-file.html
+++ b/src/addons/mod/assign/feedback/file/component/addon-mod-assign-feedback-file.html
@@ -3,8 +3,8 @@
{{plugin.name}}
-
-
+
diff --git a/src/addons/mod/assign/pages/edit/edit.html b/src/addons/mod/assign/pages/edit/edit.html
index 9b1cecbaa..a05415641 100644
--- a/src/addons/mod/assign/pages/edit/edit.html
+++ b/src/addons/mod/assign/pages/edit/edit.html
@@ -1,12 +1,11 @@
-
+
-
-
+
@@ -22,38 +21,33 @@
0" [endTime]="timeLimitEndTime" (finished)="timeUp()" timeUpText="00:00:00"
[timerText]="'addon.mod_assign.assigntimeleft' | translate" [align]="'center'" [timeLeftClassThreshold]="-1"
- [underTimeClassThresholds]="[300, 900]">
-
+ [underTimeClassThresholds]="[300, 900]" />
-
+ [contextInstanceId]="moduleId" [courseId]="courseId" />
-
-
+
diff --git a/src/addons/mod/assign/pages/index/index.html b/src/addons/mod/assign/pages/index/index.html
index 0ee3bc5a8..4bcdb2e52 100644
--- a/src/addons/mod/assign/pages/index/index.html
+++ b/src/addons/mod/assign/pages/index/index.html
@@ -1,24 +1,21 @@
-
+
-
-
+
-
-
-
+
-
+
-
+
diff --git a/src/addons/mod/assign/pages/submission-list/submission-list.html b/src/addons/mod/assign/pages/submission-list/submission-list.html
index dfc608421..2dc9b43e2 100644
--- a/src/addons/mod/assign/pages/submission-list/submission-list.html
+++ b/src/addons/mod/assign/pages/submission-list/submission-list.html
@@ -1,35 +1,33 @@
-
+
-
-
+
-
+
-
+
-
+ [courseId]="courseId" />
-
+
{{submission.userfullname}}
@@ -37,8 +35,7 @@
-
-
+
@@ -68,8 +65,7 @@
-
+ [message]="'addon.mod_assign.submissionstatus_' | translate" />
diff --git a/src/addons/mod/assign/pages/submission-review/submission-review.html b/src/addons/mod/assign/pages/submission-review/submission-review.html
index 370086cb0..fe477e715 100644
--- a/src/addons/mod/assign/pages/submission-review/submission-review.html
+++ b/src/addons/mod/assign/pages/submission-review/submission-review.html
@@ -1,16 +1,15 @@
-
+
-
-
+
-
+
@@ -21,10 +20,9 @@
-
+
-
-
+
diff --git a/src/addons/mod/assign/services/assign-helper.ts b/src/addons/mod/assign/services/assign-helper.ts
index 36691cf68..49384adee 100644
--- a/src/addons/mod/assign/services/assign-helper.ts
+++ b/src/addons/mod/assign/services/assign-helper.ts
@@ -15,7 +15,7 @@
import { Injectable } from '@angular/core';
import { CoreFileUploader, CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
-import { FileEntry, DirectoryEntry } from '@ionic-native/file/ngx';
+import { FileEntry, DirectoryEntry } from '@awesome-cordova-plugins/file/ngx';
import {
AddonModAssignProvider,
AddonModAssignAssign,
diff --git a/src/addons/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html b/src/addons/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html
index 912151506..aeb861c11 100644
--- a/src/addons/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html
+++ b/src/addons/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html
@@ -2,7 +2,6 @@
{{plugin.name}}
-
+ area="submission_comments" [title]="plugin.name" [courseId]="assign.course" />
diff --git a/src/addons/mod/assign/submission/file/component/addon-mod-assign-submission-file.html b/src/addons/mod/assign/submission/file/component/addon-mod-assign-submission-file.html
index 9dff2e4d5..5e4e45293 100644
--- a/src/addons/mod/assign/submission/file/component/addon-mod-assign-submission-file.html
+++ b/src/addons/mod/assign/submission/file/component/addon-mod-assign-submission-file.html
@@ -3,7 +3,7 @@
{{ plugin.name }}
-
+
@@ -16,6 +16,5 @@
-
+ [component]="component" [componentId]="assign.cmid" [acceptedTypes]="acceptedTypes" [allowOffline]="allowOffline" />
diff --git a/src/addons/mod/assign/submission/file/component/file.ts b/src/addons/mod/assign/submission/file/component/file.ts
index 560757263..dd43def99 100644
--- a/src/addons/mod/assign/submission/file/component/file.ts
+++ b/src/addons/mod/assign/submission/file/component/file.ts
@@ -20,7 +20,7 @@ import { CoreFileUploaderStoreFilesResult } from '@features/fileuploader/service
import { CoreFileSession } from '@services/file-session';
import { CoreUtils } from '@services/utils/utils';
import { AddonModAssignSubmissionFileHandlerService } from '../services/handler';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component';
import { CoreFileEntry } from '@services/file-helper';
diff --git a/src/addons/mod/assign/submission/file/services/handler.ts b/src/addons/mod/assign/submission/file/services/handler.ts
index 07f87e6a9..a919b5ac4 100644
--- a/src/addons/mod/assign/submission/file/services/handler.ts
+++ b/src/addons/mod/assign/submission/file/services/handler.ts
@@ -30,7 +30,7 @@ import { CoreUtils } from '@services/utils/utils';
import { CoreWSFile } from '@services/ws';
import { makeSingleton } from '@singletons';
import { AddonModAssignSubmissionFileComponent } from '../component/file';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import type { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component';
/**
diff --git a/src/addons/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html b/src/addons/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html
index b417a1286..80ee10649 100644
--- a/src/addons/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html
+++ b/src/addons/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html
@@ -5,8 +5,7 @@
{{ 'addon.mod_assign.numwords' | translate: {'$a': words} }}
-
+ [contextInstanceId]="assign.cmid" [courseId]="assign.course" />
@@ -29,7 +28,6 @@
-
+ [draftExtraParams]="{userid: currentUserId, action: 'editsubmission'}" />
diff --git a/src/addons/mod/bigbluebuttonbn/components/index/index.html b/src/addons/mod/bigbluebuttonbn/components/index/index.html
index bb1d82c25..eb5ae623d 100644
--- a/src/addons/mod/bigbluebuttonbn/components/index/index.html
+++ b/src/addons/mod/bigbluebuttonbn/components/index/index.html
@@ -1,7 +1,7 @@
-
+
@@ -10,12 +10,10 @@
-
+ [courseId]="courseId" (completionChanged)="onCompletionChange()" />
-
+ [multipleGroupsMessage]="'addon.mod_bigbluebuttonbn.view_groups_selection_warning' | translate" [courseId]="module.course" />
@@ -78,7 +76,7 @@
-
+
{{ meetingInfo.statusmessage }}
@@ -94,8 +92,7 @@
-
+ [class.expandable-status-icon-expanded]="recording.expanded" />
{{ recording.type }}
{{ recording.name }}
@@ -113,7 +110,7 @@
{{ playback.name }}
-
+
@@ -121,7 +118,7 @@
{{ data.label }}
+ [contextInstanceId]="module.id" [courseId]="module.course" />
{{ data.value }}
@@ -130,8 +127,7 @@
-
+ [message]="'addon.mod_bigbluebuttonbn.view_message_norecordings' | translate" />
@@ -146,7 +142,6 @@
-
-
+
diff --git a/src/addons/mod/bigbluebuttonbn/pages/index/index.html b/src/addons/mod/bigbluebuttonbn/pages/index/index.html
index 506ef400b..538e267fe 100644
--- a/src/addons/mod/bigbluebuttonbn/pages/index/index.html
+++ b/src/addons/mod/bigbluebuttonbn/pages/index/index.html
@@ -1,23 +1,20 @@
-
+
-
-
+
-
-
-
+
-
+
-
+
diff --git a/src/addons/mod/book/components/index/addon-mod-book-index.html b/src/addons/mod/book/components/index/addon-mod-book-index.html
index 704677aee..6f60eaf28 100644
--- a/src/addons/mod/book/components/index/addon-mod-book-index.html
+++ b/src/addons/mod/book/components/index/addon-mod-book-index.html
@@ -1,7 +1,7 @@
-
+
@@ -10,8 +10,7 @@
-
+ [courseId]="courseId" (completionChanged)="onCompletionChange()" />
@@ -26,8 +25,7 @@
{{chapter.indexNumber}}
•
-
-
+
@@ -41,7 +39,6 @@
-
-
+
diff --git a/src/addons/mod/book/components/toc/toc.html b/src/addons/mod/book/components/toc/toc.html
index 64a99d665..e68109ac6 100644
--- a/src/addons/mod/book/components/toc/toc.html
+++ b/src/addons/mod/book/components/toc/toc.html
@@ -5,7 +5,7 @@
-
+
@@ -20,8 +20,8 @@
{{chapter.indexNumber}}
•
-
-
+
diff --git a/src/addons/mod/book/pages/contents/contents.html b/src/addons/mod/book/pages/contents/contents.html
index ac443ffd7..b1169bfeb 100644
--- a/src/addons/mod/book/pages/contents/contents.html
+++ b/src/addons/mod/book/pages/contents/contents.html
@@ -1,43 +1,42 @@
-
+
-
-
+
-
+
-
+
-
+
-
+
+ [contextInstanceId]="cmId" [courseId]="courseId" [disabled]="!active" />
0">
{{ 'core.tag.tags' | translate }}:
-
+
@@ -47,6 +46,5 @@
1"
[items]="navigationItems" previousTranslate="addon.mod_book.navprevtitle" nextTranslate="addon.mod_book.navnexttitle"
- (action)="changeChapter($event.id)" slot="fixed">
-
+ (action)="changeChapter($event.id)" slot="fixed" />
diff --git a/src/addons/mod/book/pages/contents/contents.ts b/src/addons/mod/book/pages/contents/contents.ts
index 0581eae1d..02bf9560a 100644
--- a/src/addons/mod/book/pages/contents/contents.ts
+++ b/src/addons/mod/book/pages/contents/contents.ts
@@ -41,6 +41,7 @@ import {
} from '../../services/book';
import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
import { CoreUrlUtils } from '@services/utils/url';
+import { IonicSlides } from '@ionic/angular';
/**
* Page that displays a book contents.
@@ -52,7 +53,7 @@ import { CoreUrlUtils } from '@services/utils/url';
})
export class AddonModBookContentsPage implements OnInit, OnDestroy {
- @ViewChild(CoreSwipeSlidesComponent) slides?: CoreSwipeSlidesComponent;
+ @ViewChild(CoreSwipeSlidesComponent) swipeSlidesComponent?: CoreSwipeSlidesComponent;
title = '';
cmId!: number;
@@ -63,7 +64,8 @@ export class AddonModBookContentsPage implements OnInit, OnDestroy {
warning = '';
displayNavBar = true;
navigationItems: CoreNavigationBarItem[] = [];
- slidesOpts: CoreSwipeSlidesOptions = {
+ swiperOpts: CoreSwipeSlidesOptions = {
+ modules: [IonicSlides],
autoHeight: true,
observer: true,
observeParents: true,
@@ -222,7 +224,7 @@ export class AddonModBookContentsPage implements OnInit, OnDestroy {
return;
}
- this.slides?.slideToItem({ id: chapterId });
+ this.swipeSlidesComponent?.slideToItem({ id: chapterId });
}
/**
diff --git a/src/addons/mod/book/pages/index/index.html b/src/addons/mod/book/pages/index/index.html
index 5b58f63cc..525f74785 100644
--- a/src/addons/mod/book/pages/index/index.html
+++ b/src/addons/mod/book/pages/index/index.html
@@ -1,24 +1,20 @@
-
+
-
-
+
-
-
-
+
-
+
-
-
+
diff --git a/src/addons/mod/book/tests/behat/basic_usage.feature b/src/addons/mod/book/tests/behat/basic_usage.feature
index a20893125..7231a77c7 100755
--- a/src/addons/mod/book/tests/behat/basic_usage.feature
+++ b/src/addons/mod/book/tests/behat/basic_usage.feature
@@ -134,22 +134,22 @@ Feature: Test basic usage of book activity in app
But I should not find "This is the first chapter" in the app
# Navigate using swipe.
- When I swipe to the left in "Chapt 3" "ion-slides" in the app
+ When I swipe to the left in "Chapt 3" "swiper-container" in the app
Then I should find "Chapt 3" in the app
And I should find "This is the third chapter" in the app
And I should find "4 / 4" in the app
- When I swipe to the right in "Chapt 3" "ion-slides" in the app
+ When I swipe to the right in "Chapt 3" "swiper-container" in the app
Then I should find "Chapt 2" in the app
And I should find "This is the second chapter" in the app
And I should find "3 / 4" in the app
- When I swipe to the right in "Chapt 2" "ion-slides" in the app
+ When I swipe to the right in "Chapt 2" "swiper-container" in the app
Then I should find "Chapt 1.1" in the app
And I should find "This is a subchapter" in the app
And I should find "2 / 4" in the app
- When I swipe to the left in "Chapt 1.1" "ion-slides" in the app
+ When I swipe to the left in "Chapt 1.1" "swiper-container" in the app
Then I should find "Chapt 2" in the app
And I should find "This is the second chapter" in the app
And I should find "3 / 4" in the app
@@ -208,22 +208,22 @@ Scenario: View and navigate book contents (teacher)
But I should not find "This is the first chapter" in the app
# Navigate using swipe.
- When I swipe to the left in "Hidden subchapter" "ion-slides" in the app
+ When I swipe to the left in "Hidden subchapter" "swiper-container" in the app
Then I should find "Chapt 3" in the app
And I should find "This is the third chapter" in the app
And I should find "6 / 7" in the app
- When I swipe to the left in "Chapt 3" "ion-slides" in the app
+ When I swipe to the left in "Chapt 3" "swiper-container" in the app
Then I should find "Last hidden" in the app
And I should find "Another hidden subchapter" in the app
And I should find "7 / 7" in the app
- When I swipe to the left in "Last hidden" "ion-slides" in the app
+ When I swipe to the left in "Last hidden" "swiper-container" in the app
Then I should find "Last hidden" in the app
And I should find "Another hidden subchapter" in the app
And I should find "7 / 7" in the app
- When I swipe to the right in "Last hidden" "ion-slides" in the app
+ When I swipe to the right in "Last hidden" "swiper-container" in the app
Then I should find "Chapt 3" in the app
And I should find "This is the third chapter" in the app
And I should find "6 / 7" in the app
diff --git a/src/addons/mod/chat/components/index/addon-mod-chat-index.html b/src/addons/mod/chat/components/index/addon-mod-chat-index.html
index a10e1a5f1..74b7c4e80 100644
--- a/src/addons/mod/chat/components/index/addon-mod-chat-index.html
+++ b/src/addons/mod/chat/components/index/addon-mod-chat-index.html
@@ -1,7 +1,7 @@
-
+
@@ -10,12 +10,11 @@
-
+ [courseId]="courseId" (completionChanged)="onCompletionChange()" />
-
+
{{ 'addon.mod_chat.sessionstartsin' | translate:{$a: chatTime} }}
@@ -31,7 +30,6 @@
-
-
+
diff --git a/src/addons/mod/chat/components/users-modal/users-modal.html b/src/addons/mod/chat/components/users-modal/users-modal.html
index df6fcd304..dd98dc8f9 100644
--- a/src/addons/mod/chat/components/users-modal/users-modal.html
+++ b/src/addons/mod/chat/components/users-modal/users-modal.html
@@ -5,7 +5,7 @@
-
+
@@ -14,16 +14,16 @@
-
+
{{ user.fullname }}
-
+
{{ 'addon.mod_chat.talk' | translate }}
-
+
{{ 'addon.mod_chat.beep' | translate }}
diff --git a/src/addons/mod/chat/pages/chat/chat.html b/src/addons/mod/chat/pages/chat/chat.html
index ba9f9bc44..fd15a114c 100644
--- a/src/addons/mod/chat/pages/chat/chat.html
+++ b/src/addons/mod/chat/pages/chat/chat.html
@@ -1,17 +1,16 @@
-
+
-
-
+
-
+
@@ -28,7 +27,7 @@
-
+
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
{{ 'addon.mod_chat.messageenter' | translate:{$a: message.userfullname} }}
@@ -36,7 +35,7 @@
-
+
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
{{ 'addon.mod_chat.messageexit' | translate:{$a: message.userfullname} }}
@@ -44,7 +43,7 @@
-
+
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
{{ 'addon.mod_chat.messagebeepseveryone' | translate:{$a: message.userfullname} }}
@@ -53,7 +52,7 @@
-
+
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
{{ 'addon.mod_chat.messagebeepsyou' | translate:{$a: message.userfullname} }}
@@ -62,7 +61,7 @@
-
+
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
{{ 'addon.mod_chat.messageyoubeep' | translate:{$a: message.beepWho} }}
@@ -70,12 +69,11 @@
-
+
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
{{ message.userfullname }}
-
+ [contextInstanceId]="cmId" [courseId]="courseId" (afterRender)="last && scrollToBottom()" />
@@ -83,13 +81,11 @@
-
+ [courseId]="courseId" />
-
-
+
-
-
+
@@ -153,8 +148,7 @@
-
-
+
= option.maxanswers">
{{ 'addon.mod_choice.full' | translate }}
diff --git a/src/addons/mod/choice/pages/index/index.html b/src/addons/mod/choice/pages/index/index.html
index b1837e151..4f5850db2 100644
--- a/src/addons/mod/choice/pages/index/index.html
+++ b/src/addons/mod/choice/pages/index/index.html
@@ -1,23 +1,20 @@
-
+
-
-
+
-
-
-
+
-
+
-
+
diff --git a/src/addons/mod/data/components/action/addon-mod-data-action.html b/src/addons/mod/data/components/action/addon-mod-data-action.html
index 2fca169f6..26315c8b0 100644
--- a/src/addons/mod/data/components/action/addon-mod-data-action.html
+++ b/src/addons/mod/data/components/action/addon-mod-data-action.html
@@ -1,49 +1,48 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+ component="mod_data" [itemId]="entry.id" area="database_entry" [courseId]="database.course" />
{{ entry.timecreated * 1000 | coreFormatDate }}
{{ entry.timemodified * 1000 | coreFormatDate }}
+ [profileUrl]="userPicture" />
{{entry.fullname}}
-
+
diff --git a/src/addons/mod/data/components/actionsmenu/actionsmenu.html b/src/addons/mod/data/components/actionsmenu/actionsmenu.html
index eadbe7c6a..70fe1df31 100644
--- a/src/addons/mod/data/components/actionsmenu/actionsmenu.html
+++ b/src/addons/mod/data/components/actionsmenu/actionsmenu.html
@@ -5,7 +5,7 @@
{{ item.text | translate }}
-
+
diff --git a/src/addons/mod/data/components/field-plugin/addon-mod-data-field-plugin.html b/src/addons/mod/data/components/field-plugin/addon-mod-data-field-plugin.html
index c738b7d01..6a9ff5ec9 100644
--- a/src/addons/mod/data/components/field-plugin/addon-mod-data-field-plugin.html
+++ b/src/addons/mod/data/components/field-plugin/addon-mod-data-field-plugin.html
@@ -1,4 +1,4 @@
-
+
diff --git a/src/addons/mod/data/components/index/addon-mod-data-index.html b/src/addons/mod/data/components/index/addon-mod-data-index.html
index 841034633..269610acf 100644
--- a/src/addons/mod/data/components/index/addon-mod-data-index.html
+++ b/src/addons/mod/data/components/index/addon-mod-data-index.html
@@ -1,19 +1,17 @@
-
+
-
+ (action)="gotoAddEntries()" />
-
+ (action)="gotoEntry(firstEntry)" />
-
+
@@ -22,30 +20,28 @@
-
+ [courseId]="courseId" [hasDataToSync]="hasOffline || hasOfflineRatings" (completionChanged)="onCompletionChange()" />
-
+ [courseId]="database?.course" />
-
+
{{ 'addon.mod_data.notopenyet' | translate:{$a: timeAvailableFromReadable} }}
-
+
{{ 'addon.mod_data.expired' | translate:{$a: timeAvailableToReadable} }}
-
+
{{ 'addon.mod_data.entrieslefttoaddtoview' | translate:{$a: {entrieslefttoview: access.entrieslefttoview} } }}
@@ -54,7 +50,7 @@
-
+
{{ 'addon.mod_data.entrieslefttoadd' | translate:{$a: {entriesleft: access.entrieslefttoadd} } }}
@@ -79,30 +75,29 @@
-
+
-
+
0 || hasNextPage">
0">
-
+
{{ 'core.previous' | translate }}
{{ 'core.next' | translate }}
-
+
-
-
+
@@ -111,12 +106,11 @@
-
-
+
-
+
{{ 'addon.mod_data.addentries' | translate }}
diff --git a/src/addons/mod/data/components/search/search.html b/src/addons/mod/data/components/search/search.html
index 445d8b2aa..4071d5917 100644
--- a/src/addons/mod/data/components/search/search.html
+++ b/src/addons/mod/data/components/search/search.html
@@ -5,7 +5,7 @@
-
+
@@ -13,15 +13,14 @@
{{ 'addon.mod_data.advancedsearch' | translate }}
-
+
-
+
diff --git a/src/addons/mod/data/fields/date/component/addon-mod-data-field-date.html b/src/addons/mod/data/fields/date/component/addon-mod-data-field-date.html
index e1f3e1fd3..596b8cf49 100644
--- a/src/addons/mod/data/fields/date/component/addon-mod-data-field-date.html
+++ b/src/addons/mod/data/fields/date/component/addon-mod-data-field-date.html
@@ -1,14 +1,12 @@
-
-
+ [disabled]="searchMode && !searchFields!['f_'+field.id+'_z']" [displayFormat]="format" [displayTimezone]="displayTimezone" />
+
{{ 'addon.mod_data.usedate' | translate }}
-
-
+
diff --git a/src/addons/mod/data/fields/file/component/addon-mod-data-field-file.html b/src/addons/mod/data/fields/file/component/addon-mod-data-field-file.html
index c66729d2b..1d8b879e0 100644
--- a/src/addons/mod/data/fields/file/component/addon-mod-data-field-file.html
+++ b/src/addons/mod/data/fields/file/component/addon-mod-data-field-file.html
@@ -1,17 +1,16 @@
-
-
+ [allowOffline]="true" [courseId]="database?.course" />
+
-
+
-
+
diff --git a/src/addons/mod/data/fields/file/services/handler.ts b/src/addons/mod/data/fields/file/services/handler.ts
index 46c665809..28db29431 100644
--- a/src/addons/mod/data/fields/file/services/handler.ts
+++ b/src/addons/mod/data/fields/file/services/handler.ts
@@ -22,7 +22,7 @@ import {
import { AddonModDataFieldHandler } from '@addons/mod/data/services/data-fields-delegate';
import { Injectable, Type } from '@angular/core';
import { CoreFileUploader, CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFileSession } from '@services/file-session';
import { CoreFormFields } from '@singletons/form';
import { makeSingleton, Translate } from '@singletons';
diff --git a/src/addons/mod/data/fields/latlong/component/addon-mod-data-field-latlong.html b/src/addons/mod/data/fields/latlong/component/addon-mod-data-field-latlong.html
index 5851d3765..eee88521b 100644
--- a/src/addons/mod/data/fields/latlong/component/addon-mod-data-field-latlong.html
+++ b/src/addons/mod/data/fields/latlong/component/addon-mod-data-field-latlong.html
@@ -1,23 +1,23 @@
-
+
-
+
°N
-
+
°E
-
+
{{ 'addon.mod_data.mylocation' | translate }}
-
+
diff --git a/src/addons/mod/data/fields/menu/component/addon-mod-data-field-menu.html b/src/addons/mod/data/fields/menu/component/addon-mod-data-field-menu.html
index a3b12a099..cc2184808 100644
--- a/src/addons/mod/data/fields/menu/component/addon-mod-data-field-menu.html
+++ b/src/addons/mod/data/fields/menu/component/addon-mod-data-field-menu.html
@@ -5,7 +5,7 @@
{{ 'addon.mod_data.menuchoose' | translate }}
{{option}}
-
+
{{ value.content }}
diff --git a/src/addons/mod/data/fields/multimenu/component/addon-mod-data-field-multimenu.html b/src/addons/mod/data/fields/multimenu/component/addon-mod-data-field-multimenu.html
index a1c003849..455677ce0 100644
--- a/src/addons/mod/data/fields/multimenu/component/addon-mod-data-field-multimenu.html
+++ b/src/addons/mod/data/fields/multimenu/component/addon-mod-data-field-multimenu.html
@@ -5,14 +5,13 @@
interface="alert">
{{option.key}}
-
+
{{ 'addon.mod_data.selectedrequired' | translate }}
-
-
+
-
+
diff --git a/src/addons/mod/data/fields/number/component/addon-mod-data-field-number.html b/src/addons/mod/data/fields/number/component/addon-mod-data-field-number.html
index 2bd75978b..f7a295261 100644
--- a/src/addons/mod/data/fields/number/component/addon-mod-data-field-number.html
+++ b/src/addons/mod/data/fields/number/component/addon-mod-data-field-number.html
@@ -1,7 +1,7 @@
-
-
+
+
{{ value.content }}
diff --git a/src/addons/mod/data/fields/picture/component/addon-mod-data-field-picture.html b/src/addons/mod/data/fields/picture/component/addon-mod-data-field-picture.html
index 4a9e62bb7..99cfcd004 100644
--- a/src/addons/mod/data/fields/picture/component/addon-mod-data-field-picture.html
+++ b/src/addons/mod/data/fields/picture/component/addon-mod-data-field-picture.html
@@ -1,17 +1,15 @@
-
-
+ [allowOffline]="true" acceptedTypes="image" [courseId]="database?.course" />
+
{{ 'addon.mod_data.alttext' | translate }}
-
-
+
-
+
diff --git a/src/addons/mod/data/fields/picture/services/handler.ts b/src/addons/mod/data/fields/picture/services/handler.ts
index 386b59231..809f3ef7f 100644
--- a/src/addons/mod/data/fields/picture/services/handler.ts
+++ b/src/addons/mod/data/fields/picture/services/handler.ts
@@ -22,7 +22,7 @@ import {
import { AddonModDataFieldHandler } from '@addons/mod/data/services/data-fields-delegate';
import { Injectable, Type } from '@angular/core';
import { CoreFileUploader, CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFileSession } from '@services/file-session';
import { CoreFormFields } from '@singletons/form';
import { makeSingleton, Translate } from '@singletons';
diff --git a/src/addons/mod/data/fields/radiobutton/component/addon-mod-data-field-radiobutton.html b/src/addons/mod/data/fields/radiobutton/component/addon-mod-data-field-radiobutton.html
index 31e37921b..1f51004cc 100644
--- a/src/addons/mod/data/fields/radiobutton/component/addon-mod-data-field-radiobutton.html
+++ b/src/addons/mod/data/fields/radiobutton/component/addon-mod-data-field-radiobutton.html
@@ -6,7 +6,7 @@
{{ 'addon.mod_data.menuchoose' | translate }}
{{option}}
-
+
{{ value.content }}
diff --git a/src/addons/mod/data/fields/text/component/addon-mod-data-field-text.html b/src/addons/mod/data/fields/text/component/addon-mod-data-field-text.html
index af610893a..597ccec16 100644
--- a/src/addons/mod/data/fields/text/component/addon-mod-data-field-text.html
+++ b/src/addons/mod/data/fields/text/component/addon-mod-data-field-text.html
@@ -1,7 +1,7 @@
-
-
+
+
{{ value.content }}
diff --git a/src/addons/mod/data/fields/textarea/component/addon-mod-data-field-textarea.html b/src/addons/mod/data/fields/textarea/component/addon-mod-data-field-textarea.html
index 1b4e97cae..bfa25fc6e 100644
--- a/src/addons/mod/data/fields/textarea/component/addon-mod-data-field-textarea.html
+++ b/src/addons/mod/data/fields/textarea/component/addon-mod-data-field-textarea.html
@@ -1,14 +1,12 @@
-
+
-
-
+ [elementId]="'field_'+field.id" ngDefaultControl />
+
-
+ contextLevel="module" [contextInstanceId]="componentId" [courseId]="database!.course" />
diff --git a/src/addons/mod/data/fields/url/component/addon-mod-data-field-url.html b/src/addons/mod/data/fields/url/component/addon-mod-data-field-url.html
index 059d0ceab..8b446be20 100644
--- a/src/addons/mod/data/fields/url/component/addon-mod-data-field-url.html
+++ b/src/addons/mod/data/fields/url/component/addon-mod-data-field-url.html
@@ -1,7 +1,7 @@
-
-
+
+
diff --git a/src/addons/mod/data/pages/edit/edit.html b/src/addons/mod/data/pages/edit/edit.html
index 5cede4d25..f4916f20f 100644
--- a/src/addons/mod/data/pages/edit/edit.html
+++ b/src/addons/mod/data/pages/edit/edit.html
@@ -1,12 +1,11 @@
-
+
-
-
+
@@ -19,14 +18,13 @@
-
+ [courseId]="database?.course" />
-
+
diff --git a/src/addons/mod/data/pages/entry/entry.html b/src/addons/mod/data/pages/entry/entry.html
index 53a41d6b3..d536d0ee9 100644
--- a/src/addons/mod/data/pages/entry/entry.html
+++ b/src/addons/mod/data/pages/entry/entry.html
@@ -1,12 +1,11 @@
-
+
-
-
+
@@ -14,57 +13,51 @@
-
+
-
+
{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}
-
+ [courseId]="courseId" />
-
+
-
-
+
-
+ (onUpdate)="ratingUpdated()" />
-
+ [scaleId]="database.scale" />
0 && commentsEnabled" contextLevel="module"
[instanceId]="database.coursemodule" component="mod_data" [itemId]="entry.id" area="database_entry" [courseId]="courseId"
- (onLoading)="setLoadingComments($event)" [showItem]="true">
-
+ (onLoading)="setLoadingComments($event)" [showItem]="true" />
-
+
-
-
+
-
+
diff --git a/src/addons/mod/data/pages/index/index.html b/src/addons/mod/data/pages/index/index.html
index 4d0cd6995..53330fce1 100644
--- a/src/addons/mod/data/pages/index/index.html
+++ b/src/addons/mod/data/pages/index/index.html
@@ -1,25 +1,21 @@
-
+
-
-
+
-
-
-
+
-
+
-
-
+
diff --git a/src/addons/mod/data/services/data-fields-delegate.ts b/src/addons/mod/data/services/data-fields-delegate.ts
index 4332cefc9..ba0a103d3 100644
--- a/src/addons/mod/data/services/data-fields-delegate.ts
+++ b/src/addons/mod/data/services/data-fields-delegate.ts
@@ -22,7 +22,7 @@ import { AddonModDataEntryField,
AddonModDataSubfieldData,
} from './data';
import { CoreFormFields } from '@singletons/form';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFileEntry } from '@services/file-helper';
import type { AddonModDataFieldPluginBaseComponent } from '@addons/mod/data/classes/base-field-plugin-component';
diff --git a/src/addons/mod/data/services/data-helper.ts b/src/addons/mod/data/services/data-helper.ts
index 8227bd512..a5df40d37 100644
--- a/src/addons/mod/data/services/data-helper.ts
+++ b/src/addons/mod/data/services/data-helper.ts
@@ -17,7 +17,7 @@ import { Injectable } from '@angular/core';
import { CoreCourse } from '@features/course/services/course';
import { CoreFileUploader, CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
import { CoreRatingOffline } from '@features/rating/services/rating-offline';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
import { CoreDomUtils, ToastDuration } from '@services/utils/dom';
import { CoreFormFields } from '@singletons/form';
diff --git a/src/addons/mod/feedback/components/index/addon-mod-feedback-index.html b/src/addons/mod/feedback/components/index/addon-mod-feedback-index.html
index fbe9ce761..dbeae8223 100644
--- a/src/addons/mod/feedback/components/index/addon-mod-feedback-index.html
+++ b/src/addons/mod/feedback/components/index/addon-mod-feedback-index.html
@@ -1,7 +1,7 @@
-
+
@@ -10,26 +10,25 @@
-
+ [courseId]="courseId" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()" />
-
+
-
+
-
+
@@ -39,7 +38,7 @@
*ngIf="access && (access.canedititems || access.canviewreports || !access.isempty)">
-
+
{{ 'addon.mod_feedback.preview' | translate }}
-
-
+
-
-
+
0)"
[detail]="true" [button]="access.canviewreports && completedCount > 0">
@@ -98,18 +95,18 @@
-
+
-
+
{{ 'addon.mod_feedback.feedback_is_not_open' | translate }}
-
+
{{ 'addon.mod_feedback.this_feedback_is_already_submitted' | translate }}
@@ -131,8 +128,7 @@
{{ 'addon.mod_feedback.page_after_submit' | translate }}
-
+ contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId" />
@@ -151,12 +147,12 @@
-
+
-
+
{{ warning }}
@@ -166,13 +162,11 @@
{{item.num}}.
-
+ contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId" />
-
+ [contextInstanceId]="module.id" [courseId]="courseId" />
@@ -190,8 +184,7 @@
-
+ contextLevel="module" [contextInstanceId]="module.id" [wsNotFiltered]="true" [courseId]="courseId" />
{{ 'addon.mod_feedback.average' | translate }}: {{item.average | number : '1.2-2'}}
diff --git a/src/addons/mod/feedback/pages/attempt/attempt.html b/src/addons/mod/feedback/pages/attempt/attempt.html
index a8d28e106..841a5dd9b 100644
--- a/src/addons/mod/feedback/pages/attempt/attempt.html
+++ b/src/addons/mod/feedback/pages/attempt/attempt.html
@@ -1,7 +1,7 @@
-
+
{{ attempt.fullname }}
@@ -14,7 +14,7 @@
-
+
{{attempt.fullname}}
{{attempt.timemodified * 1000 | coreFormatDate }}
@@ -22,7 +22,7 @@
-
+
{{ 'addon.mod_feedback.anonymous_user' |translate }}
{{ 'addon.mod_feedback.response_nr' | translate }}: {{anonAttempt.number}}
@@ -30,19 +30,17 @@
-
+
0 ? 'light' : ''">
{{item.itemnumber}}.
-
+ [contextInstanceId]="cmId" [courseId]="courseId" />
-
+ contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId" />
diff --git a/src/addons/mod/feedback/pages/attempts/attempts.html b/src/addons/mod/feedback/pages/attempts/attempts.html
index 39cec4859..0b1ec781b 100644
--- a/src/addons/mod/feedback/pages/attempts/attempts.html
+++ b/src/addons/mod/feedback/pages/attempts/attempts.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.mod_feedback.responses' |translate }}
@@ -11,13 +11,12 @@
-
+
-
+ [courseId]="courseId" />
0">
@@ -27,7 +26,7 @@
-
+
{{ attempt.fullname }}
{{ attempt.timemodified * 1000 | coreFormatDate }}
@@ -43,7 +42,7 @@
-
+
{{ 'addon.mod_feedback.anonymous_user' | translate }}
{{ 'addon.mod_feedback.response_nr' | translate }}: {{attempt.number}}
@@ -52,8 +51,7 @@
-
+ (action)="fetchMoreAttempts($event)" />
diff --git a/src/addons/mod/feedback/pages/form/form.html b/src/addons/mod/feedback/pages/form/form.html
index 4f55ac59e..0f6671a84 100644
--- a/src/addons/mod/feedback/pages/form/form.html
+++ b/src/addons/mod/feedback/pages/form/form.html
@@ -1,12 +1,11 @@
-
+
-
-
+
@@ -23,7 +22,7 @@
-
+
0 ? 'light' : ''"
[class.core-danger-item]="item.isEmpty || item.hasError">
@@ -31,42 +30,36 @@
{{item.itemnumber}}.
-
+ [contextInstanceId]="cmId" [courseId]="courseId" [wsNotFiltered]="true" />
{{item.postfix}}
-
+ contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId" />
-
+ name="{{item.typ}}_{{item.id}}" maxlength="{{item.length}}" [required]="item.required" />
-
+ [required]="item.required" />
{{ 'addon.mod_feedback.numberoutofrange' | translate }} [{{item.rangefrom}}
, {{item.rangeto}}]
-
-
+
-
+ contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId" />
@@ -76,10 +69,9 @@
-
+ contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId" />
-
+
@@ -87,22 +79,19 @@
-
+ contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId" />
-
+ value="option.value" />
-
+ modelValueName="value" />
-
+
{{ 'addon.mod_feedback.captchaofflinewarning' | translate }}
@@ -113,14 +102,14 @@
-
+
{{ 'core.previous' | translate }}
{{ 'core.next' | translate }}
-
+
@@ -134,7 +123,7 @@
-
+
{{ 'addon.mod_feedback.this_feedback_is_already_submitted' | translate }}
@@ -143,8 +132,7 @@
{{ 'addon.mod_feedback.feedback_submitted_offline' | translate }}
-
+ [text]="completionPageContents" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId" />
@@ -153,7 +141,7 @@
diff --git a/src/addons/mod/imscp/components/toc/toc.html b/src/addons/mod/imscp/components/toc/toc.html
index cc4be9163..c8251314d 100644
--- a/src/addons/mod/imscp/components/toc/toc.html
+++ b/src/addons/mod/imscp/components/toc/toc.html
@@ -5,7 +5,7 @@
-
+
diff --git a/src/addons/mod/imscp/pages/index/index.html b/src/addons/mod/imscp/pages/index/index.html
index 1ecc39a45..f4d83f8fc 100644
--- a/src/addons/mod/imscp/pages/index/index.html
+++ b/src/addons/mod/imscp/pages/index/index.html
@@ -1,20 +1,17 @@
-
+
-
-
+
-
-
-
+
-
+
diff --git a/src/addons/mod/imscp/pages/view/view.html b/src/addons/mod/imscp/pages/view/view.html
index b2f8e3329..f272a3b8f 100644
--- a/src/addons/mod/imscp/pages/view/view.html
+++ b/src/addons/mod/imscp/pages/view/view.html
@@ -1,18 +1,17 @@
-
+
-
-
+
-
+
@@ -23,15 +22,14 @@
-
+
-
+
1" [items]="navigationItems"
- (action)="loadItem($event)">
-
+ (action)="loadItem($event)" />
diff --git a/src/addons/mod/lesson/components/index/addon-mod-lesson-index.html b/src/addons/mod/lesson/components/index/addon-mod-lesson-index.html
index 6b0aea98b..4dd254e12 100644
--- a/src/addons/mod/lesson/components/index/addon-mod-lesson-index.html
+++ b/src/addons/mod/lesson/components/index/addon-mod-lesson-index.html
@@ -1,7 +1,7 @@
-
+
@@ -10,8 +10,7 @@
-
+ [courseId]="courseId" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()" />
@@ -20,8 +19,8 @@
-
-
+
+
@@ -32,8 +31,7 @@
{{ 'addon.mod_lesson.enterpassword' | translate }}
-
+ core-auto-focus #passwordinput [clearOnEdit]="false" />
@@ -46,7 +44,7 @@
-
+
@@ -57,17 +55,15 @@
-
+ [courseId]="courseId" />
+ [wsNotFiltered]="true" />
-
+ [message]="'addon.mod_lesson.nolessonattempts' | translate" />
@@ -185,12 +181,10 @@
-
-
+
{{ student.fullname }}
-
-
+
@@ -201,11 +195,10 @@
@@ -246,7 +239,7 @@
-
+
{{ 'addon.mod_lesson.continue' | translate }}
@@ -256,7 +249,7 @@
-
+
@@ -265,7 +258,7 @@
{{ 'core.start' | translate }}
-
+
{{ 'addon.mod_lesson.preview' | translate }}
diff --git a/src/addons/mod/lesson/components/menu-modal/menu-modal.html b/src/addons/mod/lesson/components/menu-modal/menu-modal.html
index f3d22c084..f0498afd9 100644
--- a/src/addons/mod/lesson/components/menu-modal/menu-modal.html
+++ b/src/addons/mod/lesson/components/menu-modal/menu-modal.html
@@ -5,7 +5,7 @@
-
+
@@ -21,8 +21,7 @@
-
+ [componentId]="pageInstance.lesson?.coursemodule" />
@@ -34,7 +33,7 @@
-
+
@@ -44,8 +43,7 @@
[detail]="true">
-
+ [contextInstanceId]="pageInstance.lesson?.coursemodule" />
diff --git a/src/addons/mod/lesson/pages/index/index.html b/src/addons/mod/lesson/pages/index/index.html
index 2b4c25520..b784a7446 100644
--- a/src/addons/mod/lesson/pages/index/index.html
+++ b/src/addons/mod/lesson/pages/index/index.html
@@ -1,24 +1,21 @@
-
+
-
-
+
-
-
-
+
-
+
-
-
+
diff --git a/src/addons/mod/lesson/pages/player/player.html b/src/addons/mod/lesson/pages/player/player.html
index 88d8a8784..edca7531d 100644
--- a/src/addons/mod/lesson/pages/player/player.html
+++ b/src/addons/mod/lesson/pages/player/player.html
@@ -1,18 +1,17 @@
-
+
-
-
+
-
+
@@ -22,7 +21,7 @@
-
+
{{ messages[0].message }}
@@ -31,8 +30,7 @@
[ngStyle]="{'width': lessonWidth, 'height': lessonHeight}">
-
+ [timerText]="'addon.mod_lesson.timeremaining' | translate" />
@@ -51,8 +49,7 @@
-
+ contextLevel="module" [contextInstanceId]="lesson.coursemodule" [courseId]="courseId" />
@@ -64,8 +61,7 @@
-
+ contextLevel="module" [contextInstanceId]="lesson.coursemodule" [courseId]="courseId" />
@@ -75,11 +71,10 @@
-
+
-
+ [maxlength]="question.input!.maxlength" />
@@ -89,8 +84,7 @@
-
+ elementId="answer_editor" />
@@ -98,8 +92,7 @@
-
+ [courseId]="courseId" />
@@ -112,11 +105,9 @@
-
+ contextLevel="module" [contextInstanceId]="lesson.coursemodule" [courseId]="courseId" />
-
-
+
@@ -125,10 +116,9 @@
-
+ contextLevel="module" [contextInstanceId]="lesson.coursemodule" [courseId]="courseId" />
-
+
@@ -139,8 +129,7 @@
-
+ contextLevel="module" [contextInstanceId]="lesson.coursemodule" [courseId]="courseId" />
{{ 'addon.mod_lesson.progresscompleted' | translate:{$a: pageData.progress} }}
-
-
+
-
+
{{ 'addon.mod_lesson.progressbarteacherwarning2' | translate }}
@@ -193,7 +181,7 @@
-
+
{{ 'addon.mod_lesson.finishretakeoffline' | translate }}
@@ -216,7 +204,7 @@
{{ eolData.numberofcorrectanswers.message }}
-
+
{{ eolData.displayscorewithoutessays.message }}
@@ -236,8 +224,7 @@
{{ 'addon.mod_lesson.progresscompleted' | translate:{$a: eolData.progresscompleted.value} }}
-
+ ariaDescribedBy="addon-mod_lesson-{{cmId}}-progress-end" />
@@ -254,15 +241,13 @@
-
+ [courseId]="courseId" />
-
+ [courseId]="courseId" />
@@ -276,8 +261,7 @@
-
+ contextLevel="module" [contextInstanceId]="lesson.coursemodule" [courseId]="courseId" />
{{ 'addon.mod_lesson.gotoendoflesson' | translate }}
diff --git a/src/addons/mod/lesson/pages/user-retake/user-retake.html b/src/addons/mod/lesson/pages/user-retake/user-retake.html
index a787489d8..a105b835a 100644
--- a/src/addons/mod/lesson/pages/user-retake/user-retake.html
+++ b/src/addons/mod/lesson/pages/user-retake/user-retake.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.mod_lesson.detailedstats' | translate }}
@@ -10,18 +10,17 @@
-
+
-
-
+
{{student.fullname}}
-
+
@@ -89,8 +88,7 @@
-
+ [courseId]="courseId" />
@@ -135,21 +133,18 @@
-
+ [courseId]="courseId" />
-
+ [courseId]="courseId" />
{{ answer[0].successBadge }}
-
-
+
@@ -159,8 +154,7 @@
-
+ [courseId]="courseId" />
@@ -174,8 +168,7 @@
-
+ [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId" />
@@ -183,8 +176,7 @@
-
+ [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId" />
@@ -198,14 +190,12 @@
-
+ [courseId]="courseId" />
-
+ [courseId]="courseId" />
@@ -216,13 +206,11 @@
-
+ contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId" />
-
+ contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId" />
@@ -234,8 +222,7 @@
-
+ [courseId]="courseId" />
diff --git a/src/addons/mod/lti/components/index/addon-mod-lti-index.html b/src/addons/mod/lti/components/index/addon-mod-lti-index.html
index 70a72d2c6..fbfb8a94a 100644
--- a/src/addons/mod/lti/components/index/addon-mod-lti-index.html
+++ b/src/addons/mod/lti/components/index/addon-mod-lti-index.html
@@ -1,7 +1,7 @@
-
+
@@ -10,18 +10,16 @@
-
+ [componentId]="componentId" [courseId]="courseId" (completionChanged)="onCompletionChange()" />
{{ 'addon.mod_lti.launchactivity' | translate }}
-
+
-
-
+
diff --git a/src/addons/mod/lti/pages/index/index.html b/src/addons/mod/lti/pages/index/index.html
index 566f57401..a981475bc 100644
--- a/src/addons/mod/lti/pages/index/index.html
+++ b/src/addons/mod/lti/pages/index/index.html
@@ -1,24 +1,21 @@
-
+
-
-
+
-
-
-
+
-
+
-
+
diff --git a/src/addons/mod/page/components/index/addon-mod-page-index.html b/src/addons/mod/page/components/index/addon-mod-page-index.html
index 0a03ba6ab..dddc42495 100644
--- a/src/addons/mod/page/components/index/addon-mod-page-index.html
+++ b/src/addons/mod/page/components/index/addon-mod-page-index.html
@@ -1,7 +1,7 @@
-
+
@@ -10,20 +10,18 @@
-
+ [componentId]="componentId" [courseId]="courseId" (completionChanged)="onCompletionChange()" />
-
+
-
+ [contextInstanceId]="module.id" [courseId]="courseId" />
{{ 'core.lastmodified' | translate}}: {{ timemodified! * 1000 | coreFormatDate }}
@@ -32,5 +30,5 @@
-
-
+
diff --git a/src/addons/mod/page/pages/index/index.html b/src/addons/mod/page/pages/index/index.html
index 013f28a4d..b8949ac8e 100644
--- a/src/addons/mod/page/pages/index/index.html
+++ b/src/addons/mod/page/pages/index/index.html
@@ -1,24 +1,20 @@
-
+
-
-
+
-
-
-
+
-
+
-
-
+
diff --git a/src/addons/mod/quiz/accessrules/password/component/addon-mod-quiz-access-password.html b/src/addons/mod/quiz/accessrules/password/component/addon-mod-quiz-access-password.html
index ed53f0e8e..6ac16c283 100644
--- a/src/addons/mod/quiz/accessrules/password/component/addon-mod-quiz-access-password.html
+++ b/src/addons/mod/quiz/accessrules/password/component/addon-mod-quiz-access-password.html
@@ -8,7 +8,6 @@
{{ 'addon.mod_quiz.quizpassword' | translate }}
-
+ placeholder="{{ 'addon.mod_quiz.quizpassword' | translate }}" [formControlName]="'quizpassword'" [clearOnEdit]="false" />
diff --git a/src/addons/mod/quiz/components/index/addon-mod-quiz-index.html b/src/addons/mod/quiz/components/index/addon-mod-quiz-index.html
index a484ac79e..b3bc4b6fa 100644
--- a/src/addons/mod/quiz/components/index/addon-mod-quiz-index.html
+++ b/src/addons/mod/quiz/components/index/addon-mod-quiz-index.html
@@ -1,7 +1,7 @@
-
+
@@ -10,8 +10,7 @@
-
+ [courseId]="courseId" [hasDataToSync]="buttonText && hasOffline" (completionChanged)="onCompletionChange()" />
@@ -116,8 +115,7 @@
{{ 'addon.mod_quiz.comment' | translate }}
-
+ contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId" />
@@ -126,8 +124,7 @@
{{ 'addon.mod_quiz.overallfeedback' | translate }}
-
+ [contextInstanceId]="module.id" [courseId]="courseId" />
@@ -200,7 +197,7 @@
-
+
{{ buttonText | translate }}
@@ -209,12 +206,11 @@
unsupportedRules.length || behaviourSupported === false)" expand="block" [href]="module.url" core-link
[showBrowserWarning]="false">
{{ 'core.openinbrowser' | translate }}
-
+
-
-
+
diff --git a/src/addons/mod/quiz/components/navigation-modal/navigation-modal.html b/src/addons/mod/quiz/components/navigation-modal/navigation-modal.html
index 0256b44d5..08856265c 100644
--- a/src/addons/mod/quiz/components/navigation-modal/navigation-modal.html
+++ b/src/addons/mod/quiz/components/navigation-modal/navigation-modal.html
@@ -5,7 +5,7 @@
-
+
@@ -27,20 +27,16 @@
+ aria-hidden="true" />
-
+ [attr.aria-label]="question.status" slot="end" />
-
+ [attr.aria-label]="question.status" slot="end" />
-
+ [attr.aria-label]="question.status" slot="end" />
-
+ [attr.aria-label]="question.status" slot="end" />
diff --git a/src/addons/mod/quiz/components/preflight-modal/preflight-modal.html b/src/addons/mod/quiz/components/preflight-modal/preflight-modal.html
index ae476d3b9..30de24c1d 100644
--- a/src/addons/mod/quiz/components/preflight-modal/preflight-modal.html
+++ b/src/addons/mod/quiz/components/preflight-modal/preflight-modal.html
@@ -5,7 +5,7 @@
-
+
@@ -19,7 +19,7 @@
Couldn't find the directive to render this access rule.
-
+
diff --git a/src/addons/mod/quiz/pages/attempt/attempt.html b/src/addons/mod/quiz/pages/attempt/attempt.html
index 8ad67c5c6..792851aea 100644
--- a/src/addons/mod/quiz/pages/attempt/attempt.html
+++ b/src/addons/mod/quiz/pages/attempt/attempt.html
@@ -1,20 +1,19 @@
-
+
-
+ [courseId]="courseId" />
-
+
@@ -48,8 +47,7 @@
{{ 'addon.mod_quiz.feedback' | translate }}
-
+ [contextInstanceId]="cmId" [courseId]="courseId" />
@@ -64,7 +62,7 @@
-
+
{{ 'addon.mod_quiz.review' | translate }}
diff --git a/src/addons/mod/quiz/pages/index/index.html b/src/addons/mod/quiz/pages/index/index.html
index 5691e4137..d21872d64 100644
--- a/src/addons/mod/quiz/pages/index/index.html
+++ b/src/addons/mod/quiz/pages/index/index.html
@@ -1,24 +1,21 @@
-
+
-
-
+
-
-
-
+
-
+
-
+
diff --git a/src/addons/mod/quiz/pages/player/player.html b/src/addons/mod/quiz/pages/player/player.html
index 1da5b0e30..c0df031f7 100644
--- a/src/addons/mod/quiz/pages/player/player.html
+++ b/src/addons/mod/quiz/pages/player/player.html
@@ -1,13 +1,12 @@
-
+
-
+ [courseId]="courseId" />
@@ -15,16 +14,15 @@
-
+
-
+
-
+ [timerText]="'addon.mod_quiz.timeleft' | translate" [hiddable]="true" />
@@ -58,8 +56,7 @@
-
+ (onAbort)="abortQuiz()" (buttonClicked)="behaviourButtonClicked($event)" />
@@ -68,14 +65,14 @@
= 0">
-
+
{{ 'core.previous' | translate }}
= -1">
0">
{{ 'core.next' | translate }}
-
+
{{ 'core.submit' | translate }}
@@ -125,8 +122,7 @@
-
-
+
@@ -153,7 +149,7 @@
{{ 'core.openinbrowser' | translate }}
-
+
diff --git a/src/addons/mod/quiz/pages/player/player.scss b/src/addons/mod/quiz/pages/player/player.scss
index 1242fc6f4..417040e35 100644
--- a/src/addons/mod/quiz/pages/player/player.scss
+++ b/src/addons/mod/quiz/pages/player/player.scss
@@ -1,4 +1,5 @@
-@import "~theme/globals";
+@use "theme/globals" as *;
+@use "sass:math" as math;
$quiz-timer-warn-color: $red !default;
$quiz-timer-iterations: 15 !default;
@@ -13,9 +14,9 @@ $quiz-timer-iterations: 15 !default;
// Make the timer go red when it's reaching 0.
@for $i from 0 through $quiz-timer-iterations {
&.core-timer-timeleft-#{$i} {
- $timer-background: rgba($quiz-timer-warn-color, 1 - ($i / $quiz-timer-iterations));
+ $timer-background: rgba($quiz-timer-warn-color, 1 - math.div($i, $quiz-timer-iterations));
--timer-background: #{$timer-background};
- @if $i <= $quiz-timer-iterations / 2 {
+ @if $i <= math.div($quiz-timer-iterations, 2) {
--timer-text-color: var(--white);
}
}
diff --git a/src/addons/mod/quiz/pages/review/review.html b/src/addons/mod/quiz/pages/review/review.html
index a39266b09..fa287af18 100644
--- a/src/addons/mod/quiz/pages/review/review.html
+++ b/src/addons/mod/quiz/pages/review/review.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.mod_quiz.review' | translate }}
@@ -10,14 +10,14 @@
-
+
-
+
@@ -70,8 +70,7 @@
{{ data.title }}
-
+ [contextInstanceId]="cmId" [courseId]="courseId" />
@@ -103,8 +102,7 @@
-
+ [contextInstanceId]="cmId" [courseId]="courseId" [review]="true" [preferredBehaviour]="quiz?.preferredbehaviour" />
@@ -114,7 +112,7 @@
-
+
@@ -127,7 +125,7 @@
= numPages" fill="clear" [attr.aria-label]="'core.next' | translate"
(click)="changePage(nextPage)">
-
+
diff --git a/src/addons/mod/resource/components/index/addon-mod-resource-index.html b/src/addons/mod/resource/components/index/addon-mod-resource-index.html
index a190f2522..a2cccf4a1 100644
--- a/src/addons/mod/resource/components/index/addon-mod-resource-index.html
+++ b/src/addons/mod/resource/components/index/addon-mod-resource-index.html
@@ -1,7 +1,7 @@
-
+
@@ -12,24 +12,23 @@
-
-
+
-
+
-
+
-
+
@@ -70,7 +69,7 @@
-
+
{{ 'addon.mod_resource.resourcestatusoutdated' | translate }}
@@ -87,22 +86,21 @@
-
+
{{ 'core.openwith' | translate }}
-
+
{{ 'core.play' | translate }}
-
+
{{ 'addon.mod_resource.openthefile' | translate }}
-
-
+
diff --git a/src/addons/mod/resource/pages/index/index.html b/src/addons/mod/resource/pages/index/index.html
index 2509b760f..0355ae6f3 100644
--- a/src/addons/mod/resource/pages/index/index.html
+++ b/src/addons/mod/resource/pages/index/index.html
@@ -1,26 +1,22 @@
-
+
-
-
+
-
-
-
+
-
+
-
-
+
diff --git a/src/addons/mod/scorm/classes/data-model-12.ts b/src/addons/mod/scorm/classes/data-model-12.ts
index 13d6121b0..3be16edf6 100644
--- a/src/addons/mod/scorm/classes/data-model-12.ts
+++ b/src/addons/mod/scorm/classes/data-model-12.ts
@@ -81,7 +81,6 @@ const ERROR_STRINGS = {
/**
* SCORM data model implementation for version 1.2.
*/
-/* eslint-disable @typescript-eslint/naming-convention */
export class AddonModScormDataModel12 {
protected currentUserData: AddonModScormUserDataMap = {}; // Current user data.
diff --git a/src/addons/mod/scorm/components/index/addon-mod-scorm-index.html b/src/addons/mod/scorm/components/index/addon-mod-scorm-index.html
index 5835113bf..6e3e06fa4 100644
--- a/src/addons/mod/scorm/components/index/addon-mod-scorm-index.html
+++ b/src/addons/mod/scorm/components/index/addon-mod-scorm-index.html
@@ -1,7 +1,7 @@
-
+
@@ -10,13 +10,12 @@
-
+ [courseId]="courseId" [hasDataToSync]="!errorMessage && hasOffline" (completionChanged)="onCompletionChange()" />
-
+
{{ scorm.warningMessage }}
@@ -47,8 +46,7 @@
0" button class="divider ion-text-wrap" (click)="toggleGrades()"
[attr.aria-label]="(gradesExpanded ? 'core.collapse' : 'core.expand') | translate" [detail]="false">
-
+ [class.expandable-status-icon-expanded]="gradesExpanded" />
{{'core.grades.grades' | translate}}
@@ -123,7 +121,7 @@
-
+
@@ -135,17 +133,14 @@
{{ currentOrganization.title }}
-
-
+
-
+ [courseId]="courseId" />
-
+ [courseId]="courseId" />
({{ 'addon.mod_scorm.score' | translate }}: {{sco.scoreraw}})
@@ -169,7 +164,7 @@
{{ 'core.openinbrowser' | translate }}
-
+
@@ -188,8 +183,7 @@
0 && !incomplete && attemptsLeft > 0">
{{ 'addon.mod_scorm.newattempt' | translate }}
-
-
+
@@ -202,7 +196,7 @@
-
+
{{ 'addon.mod_scorm.browse' | translate }}
@@ -214,15 +208,13 @@
-
+
{{ progressMessage | translate }}
-
-
+
-
-
+
diff --git a/src/addons/mod/scorm/components/toc/toc.html b/src/addons/mod/scorm/components/toc/toc.html
index 243779e63..cf823ac0b 100644
--- a/src/addons/mod/scorm/components/toc/toc.html
+++ b/src/addons/mod/scorm/components/toc/toc.html
@@ -5,7 +5,7 @@
-
+
@@ -35,11 +35,9 @@
[ngClass]="'core-padding-' + sco.level + ' addon-mod_scorm-type-' + sco.scormtype"
[attr.aria-current]="selected === sco.id ? 'page' : 'false'" (click)="loadSco(sco)"
[disabled]="!sco.prereq || !sco.launch ? true : null" [button]="sco.prereq && sco.launch">
-
-
+
-
-
+
({{ 'addon.mod_scorm.score' | translate }}: {{sco.scoreraw}})
diff --git a/src/addons/mod/scorm/pages/index/index.html b/src/addons/mod/scorm/pages/index/index.html
index 1e5f18cd5..490d03383 100644
--- a/src/addons/mod/scorm/pages/index/index.html
+++ b/src/addons/mod/scorm/pages/index/index.html
@@ -1,24 +1,20 @@
-
+
-
-
+
-
-
-
+
-
+
-
-
+
diff --git a/src/addons/mod/scorm/pages/player/player.html b/src/addons/mod/scorm/pages/player/player.html
index a4e33155b..4b426014f 100644
--- a/src/addons/mod/scorm/pages/player/player.html
+++ b/src/addons/mod/scorm/pages/player/player.html
@@ -1,19 +1,18 @@
-
+
-
-
+
-
+
@@ -22,13 +21,11 @@
-
+ [showFullscreenOnToolbar]="true" [autoFullscreenOnRotate]="true" />
{{ errorMessage | translate }}
1" [items]="navigationItems"
- (action)="loadSco($event)" slot="fixed">
-
+ (action)="loadSco($event)" slot="fixed" />
diff --git a/src/addons/mod/survey/components/index/addon-mod-survey-index.html b/src/addons/mod/survey/components/index/addon-mod-survey-index.html
index 0683b1de0..3ef172a08 100644
--- a/src/addons/mod/survey/components/index/addon-mod-survey-index.html
+++ b/src/addons/mod/survey/components/index/addon-mod-survey-index.html
@@ -1,7 +1,7 @@
-
+
@@ -11,13 +11,12 @@
-
+ (completionChanged)="onCompletionChange()" />
-
+
{{ 'addon.mod_survey.surveycompletednograph' | translate }}
@@ -62,8 +61,7 @@
-
-
+
{{question.num}}. {{ question.text }}
-
-
+
@@ -121,7 +118,7 @@
{{ 'addon.mod_survey.results' | translate }}
-
+
-
-
+
diff --git a/src/addons/mod/survey/pages/index/index.html b/src/addons/mod/survey/pages/index/index.html
index 38ed35fea..cb6f9bc61 100644
--- a/src/addons/mod/survey/pages/index/index.html
+++ b/src/addons/mod/survey/pages/index/index.html
@@ -1,23 +1,21 @@
-
+
-
+
-
-
-
+
-
+
-
+
diff --git a/src/addons/mod/url/components/index/addon-mod-url-index.html b/src/addons/mod/url/components/index/addon-mod-url-index.html
index c7518f987..e5b74e85c 100644
--- a/src/addons/mod/url/components/index/addon-mod-url-index.html
+++ b/src/addons/mod/url/components/index/addon-mod-url-index.html
@@ -1,7 +1,7 @@
-
+
@@ -10,11 +10,10 @@
-
+ [componentId]="componentId" [courseId]="courseId" (completionChanged)="onCompletionChange()" />
-
+
@@ -40,11 +39,10 @@
-
+
{{ 'addon.mod_url.accessurl' | translate }}
-
-
+
diff --git a/src/addons/mod/url/pages/index/index.html b/src/addons/mod/url/pages/index/index.html
index 7d4b31ae6..3033ac732 100644
--- a/src/addons/mod/url/pages/index/index.html
+++ b/src/addons/mod/url/pages/index/index.html
@@ -1,23 +1,21 @@
-
+
-
+
-
-
-
+
-
+
-
+
diff --git a/src/addons/mod/wiki/components/index/addon-mod-wiki-index.html b/src/addons/mod/wiki/components/index/addon-mod-wiki-index.html
index cf3a053cb..eeff12dbc 100644
--- a/src/addons/mod/wiki/components/index/addon-mod-wiki-index.html
+++ b/src/addons/mod/wiki/components/index/addon-mod-wiki-index.html
@@ -3,26 +3,24 @@
1" (click)="showSubwikiPicker($event)" [attr.aria-label]="'addon.mod_wiki.subwiki' | translate"
aria-haspopup="true">
-
-
+
+
-
+
-
+ iconAction="fas-pen" (action)="goToEditPage()" />
-
+ (action)="goToNewPage()" />
-
+
@@ -31,14 +29,13 @@
-
+ [componentId]="componentId" [courseId]="courseId" (completionChanged)="onCompletionChange()" />
-
+
{{ 'core.hasdatatosync' | translate:{$a: pageStr} }}
{{ 'core.hasdatatosync' | translate:{$a: moduleName} }}
@@ -49,7 +46,7 @@
-
+
{{ pageWarning }}
@@ -58,26 +55,23 @@
{{pageTitle}}
-
-
-
+ contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId" />
+
0">
{{ 'core.tag.tags' | translate }}:
-
+
-
+ [currentModuleId]="module.id" />
-
+
{{ 'addon.mod_wiki.createpage' | translate }}
diff --git a/src/addons/mod/wiki/components/map/map.html b/src/addons/mod/wiki/components/map/map.html
index 00c8c29bb..ecd32a8ee 100644
--- a/src/addons/mod/wiki/components/map/map.html
+++ b/src/addons/mod/wiki/components/map/map.html
@@ -5,7 +5,7 @@
-
+
@@ -15,7 +15,7 @@
-
+
{{ 'addon.mod_wiki.gowikihome' | translate }}
@@ -26,13 +26,12 @@
-
+
-
-
+
-
+
{{ 'core.notsent' | translate }}
diff --git a/src/addons/mod/wiki/components/subwiki-picker/addon-mod-wiki-subwiki-picker.html b/src/addons/mod/wiki/components/subwiki-picker/addon-mod-wiki-subwiki-picker.html
index 42034ae8f..a2d628d3c 100644
--- a/src/addons/mod/wiki/components/subwiki-picker/addon-mod-wiki-subwiki-picker.html
+++ b/src/addons/mod/wiki/components/subwiki-picker/addon-mod-wiki-subwiki-picker.html
@@ -4,17 +4,15 @@
-
+ class="item-heading" />
-
-
+
-
+
diff --git a/src/addons/mod/wiki/pages/edit/edit.html b/src/addons/mod/wiki/pages/edit/edit.html
index d44b5db2d..fb07e5de5 100644
--- a/src/addons/mod/wiki/pages/edit/edit.html
+++ b/src/addons/mod/wiki/pages/edit/edit.html
@@ -1,12 +1,11 @@
-
+
-
-
+
@@ -22,16 +21,14 @@
{{ 'addon.mod_wiki.newpagetitle' | translate }}
-
-
+
{{ 'core.content' | translate }}
-
+ elementId="newcontent_editor" [draftExtraParams]="editorExtraParams" />
diff --git a/src/addons/mod/wiki/pages/index/index.html b/src/addons/mod/wiki/pages/index/index.html
index 1289bc186..310d7a68d 100644
--- a/src/addons/mod/wiki/pages/index/index.html
+++ b/src/addons/mod/wiki/pages/index/index.html
@@ -1,26 +1,22 @@
-
+
-
-
+
-
-
-
+
-
+
-
+ [subwikiId]="subwikiId" [userId]="userId" [groupId]="groupId" (dataRetrieved)="updateData($event)" />
diff --git a/src/addons/mod/workshop/assessment/accumulative/component/addon-mod-workshop-assessment-strategy-accumulative.html b/src/addons/mod/workshop/assessment/accumulative/component/addon-mod-workshop-assessment-strategy-accumulative.html
index ec6884d67..2663902c3 100644
--- a/src/addons/mod/workshop/assessment/accumulative/component/addon-mod-workshop-assessment-strategy-accumulative.html
+++ b/src/addons/mod/workshop/assessment/accumulative/component/addon-mod-workshop-assessment-strategy-accumulative.html
@@ -3,8 +3,7 @@
{{ field.dimtitle }}
-
-
+
@@ -18,8 +17,7 @@
interface="action-sheet">
{{grade.label}}
-
-
+
@@ -34,8 +32,7 @@
{{ 'addon.mod_workshop_assessment_accumulative.dimensioncommentfor' | translate : {'$a': field.dimtitle } }}
-
-
+
@@ -44,8 +41,7 @@
-
+ [courseId]="courseId" />
diff --git a/src/addons/mod/workshop/assessment/comments/component/addon-mod-workshop-assessment-strategy-comments.html b/src/addons/mod/workshop/assessment/comments/component/addon-mod-workshop-assessment-strategy-comments.html
index 974b0deb6..8097e372e 100644
--- a/src/addons/mod/workshop/assessment/comments/component/addon-mod-workshop-assessment-strategy-comments.html
+++ b/src/addons/mod/workshop/assessment/comments/component/addon-mod-workshop-assessment-strategy-comments.html
@@ -3,8 +3,7 @@
{{ field.dimtitle }}
-
-
+
@@ -13,10 +12,8 @@
{{ 'addon.mod_workshop_assessment_comments.dimensioncommentfor' | translate : {'$a': field.dimtitle } }}
-
-
-
-
+
+
@@ -24,8 +21,7 @@
} }}
-
+ [courseId]="courseId" />
diff --git a/src/addons/mod/workshop/assessment/numerrors/component/addon-mod-workshop-assessment-strategy-numerrors.html b/src/addons/mod/workshop/assessment/numerrors/component/addon-mod-workshop-assessment-strategy-numerrors.html
index 33a93fc14..8d79ddd43 100644
--- a/src/addons/mod/workshop/assessment/numerrors/component/addon-mod-workshop-assessment-strategy-numerrors.html
+++ b/src/addons/mod/workshop/assessment/numerrors/component/addon-mod-workshop-assessment-strategy-numerrors.html
@@ -3,8 +3,7 @@
{{ field.dimtitle }}
-
-
+
@@ -15,20 +14,19 @@
{{ 'addon.mod_workshop.yourassessmentfor' | translate : {'$a': field.dimtitle } }}
-
-
+
-
+
-
+
-
+
-
+
@@ -37,8 +35,7 @@
{{ 'addon.mod_workshop_assessment_numerrors.dimensioncommentfor' | translate : {'$a': field.dimtitle } }}
-
+ [core-auto-rows]="selectedValues[n].peercomment" />
@@ -46,8 +43,7 @@
} }}
-
+ [courseId]="courseId" />
diff --git a/src/addons/mod/workshop/assessment/rubric/component/addon-mod-workshop-assessment-strategy-rubric.html b/src/addons/mod/workshop/assessment/rubric/component/addon-mod-workshop-assessment-strategy-rubric.html
index 58fa080ba..a9673c651 100644
--- a/src/addons/mod/workshop/assessment/rubric/component/addon-mod-workshop-assessment-strategy-rubric.html
+++ b/src/addons/mod/workshop/assessment/rubric/component/addon-mod-workshop-assessment-strategy-rubric.html
@@ -3,11 +3,9 @@
{{ field.dimtitle }}
-
-
+
-
-
+
@@ -15,11 +13,10 @@
-
+ [courseId]="courseId" />
-
+
diff --git a/src/addons/mod/workshop/components/assessment-strategy/addon-mod-workshop-assessment-strategy.html b/src/addons/mod/workshop/components/assessment-strategy/addon-mod-workshop-assessment-strategy.html
index 73bb0ac69..1c08bfc01 100644
--- a/src/addons/mod/workshop/components/assessment-strategy/addon-mod-workshop-assessment-strategy.html
+++ b/src/addons/mod/workshop/components/assessment-strategy/addon-mod-workshop-assessment-strategy.html
@@ -3,7 +3,7 @@
-
+
@@ -29,16 +29,13 @@
-
+ [draftExtraParams]="{asid: assessmentId}" (contentChanged)="onFeedbackChange($event)" />
-
+ [errorText]="data.fieldErrors['feedbackauthor']" />
-
+ [componentId]="componentId" [allowOffline]="true" [courseId]="workshop.course" />
@@ -53,14 +50,12 @@
-
+ contextLevel="module" [contextInstanceId]="workshop.coursemodule" [courseId]="workshop.course" />
-
-
+
diff --git a/src/addons/mod/workshop/components/assessment/addon-mod-workshop-assessment.html b/src/addons/mod/workshop/components/assessment/addon-mod-workshop-assessment.html
index f48d01f29..2104fdc7e 100644
--- a/src/addons/mod/workshop/components/assessment/addon-mod-workshop-assessment.html
+++ b/src/addons/mod/workshop/components/assessment/addon-mod-workshop-assessment.html
@@ -1,7 +1,7 @@
-
+
{{profile.fullname}}
@@ -22,7 +22,7 @@
- {{ 'core.notsent' | translate }}
+ {{ 'core.notsent' | translate }}
diff --git a/src/addons/mod/workshop/components/index/addon-mod-workshop-index.html b/src/addons/mod/workshop/components/index/addon-mod-workshop-index.html
index c4448dfde..d16591ae1 100644
--- a/src/addons/mod/workshop/components/index/addon-mod-workshop-index.html
+++ b/src/addons/mod/workshop/components/index/addon-mod-workshop-index.html
@@ -1,7 +1,7 @@
-
+
@@ -10,8 +10,7 @@
-
+ [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()" />
@@ -24,22 +23,18 @@
+ [attr.aria-label]="'addon.mod_workshop.tasktodo' | translate" />
-
+ [attr.aria-label]="'addon.mod_workshop.taskfail' | translate" />
-
+ [attr.aria-label]="'addon.mod_workshop.taskinfo' | translate" />
-
+ [attr.aria-label]="'addon.mod_workshop.taskdone' | translate" />
{{task.title}}
-
-
+
@@ -50,8 +45,7 @@
{{ 'core.description' | translate }}
-
+ [contextInstanceId]="module.id" [courseId]="courseId" />
@@ -64,8 +58,7 @@
{{ 'addon.mod_workshop.conclusion' | translate }}
-
+ contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId" />
@@ -97,8 +90,7 @@
{{ 'addon.mod_workshop.areainstructauthors' | translate }}
-
+ contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId" />
@@ -120,8 +112,7 @@
-
+ [workshop]="workshop" [access]="access" />
@@ -134,8 +125,7 @@
-
+ [workshop]="workshop" [access]="access" summary="true" class="core-as-item" />
@@ -147,8 +137,8 @@
{{ 'addon.mod_workshop.areainstructreviewers' | translate }}
-
+ [text]="workshop.instructreviewers" contextLevel="module" [contextInstanceId]="module.id"
+ [courseId]="courseId" />
@@ -167,8 +157,7 @@
-
+ class="core-as-item" />
@@ -184,27 +173,25 @@
-
-
+
-
+ [workshop]="workshop" [access]="access" summary="true" class="core-as-item" />
0 || hasNextPage">
0">
-
+
{{ 'core.previous' | translate }}
{{ 'core.next' | translate }}
-
+
@@ -219,17 +206,16 @@
-
+
{{ 'addon.mod_workshop.createsubmission' | translate }}
-
+
{{ 'addon.mod_workshop.editsubmission' | translate }}
-
-
+
diff --git a/src/addons/mod/workshop/components/phase/phase.html b/src/addons/mod/workshop/components/phase/phase.html
index b0ea2a7a4..5fce6d779 100644
--- a/src/addons/mod/workshop/components/phase/phase.html
+++ b/src/addons/mod/workshop/components/phase/phase.html
@@ -5,7 +5,7 @@
-
+
@@ -22,29 +22,28 @@
-
+
{{ 'addon.mod_workshop.switchphase' + phase.code | translate }}
-
+
+ [attr.aria-label]="'addon.mod_workshop.tasktodo' | translate" />
+ [attr.aria-label]="'addon.mod_workshop.taskfail' | translate" />
+ [attr.aria-label]="'addon.mod_workshop.taskinfo' | translate" />
+ [attr.aria-label]="'addon.mod_workshop.taskdone' | translate" />
{{task.title}}
-
-
+
diff --git a/src/addons/mod/workshop/components/submission/addon-mod-workshop-submission.html b/src/addons/mod/workshop/components/submission/addon-mod-workshop-submission.html
index a239d2aef..4f77df3f3 100644
--- a/src/addons/mod/workshop/components/submission/addon-mod-workshop-submission.html
+++ b/src/addons/mod/workshop/components/submission/addon-mod-workshop-submission.html
@@ -1,12 +1,11 @@
-
-
+
-
-
+
{{profile.fullname}}
@@ -20,44 +19,42 @@
- {{ 'core.notsent' | translate }}
+ {{ 'core.notsent' | translate }}
{{submission.timemodified | coreDateDayOrTime}}
- {{ 'core.notsent' | translate }}
+ {{ 'core.notsent' | translate }}
- {{ 'core.deletedoffline' | translate }}
+ {{ 'core.deletedoffline' | translate }}
-
+ [contextInstanceId]="module.id" [courseId]="courseId" />
-
+
+ [userId]="evaluateByProfile.id" />
{{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }}
-
+ [courseId]="courseId" />
{{ 'core.showmore' | translate }}
-
+
@@ -65,12 +62,10 @@
-
-
+
-
-
+
{{profile.fullname}}
@@ -100,10 +95,10 @@
{{submission.timemodified | coreDateDayOrTime}}
- {{ 'core.notsent' | translate }}
+ {{ 'core.notsent' | translate }}
- {{ 'core.deletedoffline' | translate }}
+ {{ 'core.deletedoffline' | translate }}
diff --git a/src/addons/mod/workshop/pages/assessment/assessment.html b/src/addons/mod/workshop/pages/assessment/assessment.html
index adc15f1ba..3a385db05 100644
--- a/src/addons/mod/workshop/pages/assessment/assessment.html
+++ b/src/addons/mod/workshop/pages/assessment/assessment.html
@@ -1,13 +1,12 @@
-
+
-
+ [courseId]="courseId" />
@@ -19,13 +18,12 @@
-
+
-
-
+
{{profile.fullname}}
@@ -51,8 +49,7 @@
-
+ [workshop]="workshop" [access]="access" [assessmentId]="assessmentId" [userId]="profile && profile.id" [strategy]="strategy" />
@@ -90,21 +87,19 @@
{{ 'addon.mod_workshop.feedbackreviewer' | translate }}
-
+ [draftExtraParams]="{asid: assessmentId}" />
+ [userId]="evaluateByProfile.id" />
{{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }}
-
+ [courseId]="courseId" />
diff --git a/src/addons/mod/workshop/pages/edit-submission/edit-submission.html b/src/addons/mod/workshop/pages/edit-submission/edit-submission.html
index 044e1ca5d..c28b405f8 100644
--- a/src/addons/mod/workshop/pages/edit-submission/edit-submission.html
+++ b/src/addons/mod/workshop/pages/edit-submission/edit-submission.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.mod_workshop.editsubmission' | translate }}
@@ -23,8 +23,7 @@
-
+ formControlName="title" />
@@ -36,13 +35,12 @@
+ [draftExtraParams]="editorExtraParams" />
-
+ [acceptedTypes]="workshop.submissionfiletypes" [required]="fileRequired" [courseId]="workshop.course" />
diff --git a/src/addons/mod/workshop/pages/index/index.html b/src/addons/mod/workshop/pages/index/index.html
index b28ffdd39..5a2e08660 100644
--- a/src/addons/mod/workshop/pages/index/index.html
+++ b/src/addons/mod/workshop/pages/index/index.html
@@ -1,24 +1,20 @@
-
+
-
-
+
-
-
-
+
-
+
-
-
+
diff --git a/src/addons/mod/workshop/pages/submission/submission.html b/src/addons/mod/workshop/pages/submission/submission.html
index 742496405..ecb28c9a1 100644
--- a/src/addons/mod/workshop/pages/submission/submission.html
+++ b/src/addons/mod/workshop/pages/submission/submission.html
@@ -1,12 +1,12 @@
-
+
-
-
+
@@ -23,26 +23,25 @@
-
+
-
+ [access]="access" />
-
+
{{ 'addon.mod_workshop.editsubmission' | translate }}
-
+
{{ 'addon.mod_workshop.deletesubmission' | translate }}
-
+
{{ 'core.restore' | translate }}
@@ -52,13 +51,12 @@
+ [userId]="evaluateByProfile.id" />
{{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }}
-
-
+
@@ -70,8 +68,7 @@
-
+ [module]="module" [workshop]="workshop" />
@@ -82,8 +79,7 @@
-
+ [courseId]="courseId" [access]="access" [module]="module" [workshop]="workshop" />
@@ -94,8 +90,7 @@
-
+ [module]="module" [workshop]="workshop" [access]="access" />
@@ -109,7 +104,7 @@
{{ 'addon.mod_workshop.publishsubmission' | translate }}
{{ 'addon.mod_workshop.publishsubmission_help' | translate }}
-
+
@@ -130,26 +125,23 @@
{{ 'addon.mod_workshop.feedbackauthor' | translate }}
-
+ [contextInstanceId]="module.id" elementId="feedbackauthor_editor" [draftExtraParams]="{id: submissionId}" />
-
+ [userId]="assessmentUserId" [strategy]="strategy" [edit]="access.assessingallowed" />
+ [userId]="evaluateGradingByProfile.id" />
{{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateGradingByProfile.fullname} }}
-
+ [courseId]="courseId" />
diff --git a/src/addons/mod/workshop/services/workshop-helper.ts b/src/addons/mod/workshop/services/workshop-helper.ts
index 367148474..898ab0166 100644
--- a/src/addons/mod/workshop/services/workshop-helper.ts
+++ b/src/addons/mod/workshop/services/workshop-helper.ts
@@ -15,7 +15,7 @@
import { Injectable } from '@angular/core';
import { CoreError } from '@classes/errors/error';
import { CoreFileUploader, CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFile } from '@services/file';
import { CoreFileEntry } from '@services/file-helper';
import { CoreSites } from '@services/sites';
diff --git a/src/addons/notes/components/add/add-modal.html b/src/addons/notes/components/add/add-modal.html
index b87f3d239..f806e1b4e 100644
--- a/src/addons/notes/components/add/add-modal.html
+++ b/src/addons/notes/components/add/add-modal.html
@@ -5,7 +5,7 @@
-
+
@@ -22,8 +22,7 @@
{{ 'addon.notes.note' | translate }}
-
-
+
diff --git a/src/addons/notes/pages/list/list.html b/src/addons/notes/pages/list/list.html
index b6b7bccf8..a96150d7f 100644
--- a/src/addons/notes/pages/list/list.html
+++ b/src/addons/notes/pages/list/list.html
@@ -1,38 +1,36 @@
-
+
{{ 'addon.notes.notes' | translate }}
-
-
+
-
+
-
+ (action)="refreshNotes(false)" [iconAction]="refreshIcon" [closeOnClick]="true" />
+ [closeOnClick]="false" />
-
+
-
+
{{user!.fullname}}
@@ -52,20 +50,19 @@
-
+
{{ 'core.thereisdatatosync' | translate:{$a: 'addon.notes.notes' | translate | lowercase } }}
-
-
+
0">
-
+
{{note.userfullname}}
@@ -73,28 +70,28 @@
-
+
{{ 'core.notsent' | translate }}
-
+
{{ 'core.deletedoffline' | translate }}
-
+
-
+
-
+
@@ -103,7 +100,7 @@
-
+
{{ 'addon.notes.addnewnote' | translate }}
diff --git a/src/addons/notifications/pages/list/list.html b/src/addons/notifications/pages/list/list.html
index b7f7a5897..16d7d3e00 100644
--- a/src/addons/notifications/pages/list/list.html
+++ b/src/addons/notifications/pages/list/list.html
@@ -1,20 +1,20 @@
-
+
{{ 'addon.notifications.notifications' | translate }}
-
+
-
+
@@ -38,40 +38,36 @@
role="presentation" slot="start">
-
+
-
+ [wsNotFiltered]="true" />
{{ notification.timecreated | coreTimeAgo }} 0"> · {{
notification.userfromfullname }}
-
+
-
+ [message]="'addon.notifications.therearentnotificationsyet' | translate" />
-
+ [error]="fetchMoreNotificationsFailed" />
-
-
-
+
+
{{ 'addon.notifications.markallread' | translate }}
diff --git a/src/addons/notifications/pages/notification/notification.html b/src/addons/notifications/pages/notification/notification.html
index 808cfe861..b4d6abaff 100644
--- a/src/addons/notifications/pages/notification/notification.html
+++ b/src/addons/notifications/pages/notification/notification.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.notifications.notifications' | translate }}
@@ -25,15 +25,14 @@
role="presentation" slot="start">
-
+
-
+ [wsNotFiltered]="true" />
0">
{{ notification.timecreated | coreTimeAgo }}
@@ -43,8 +42,7 @@
-
-
+
@@ -52,7 +50,7 @@
0" slot="fixed">
-
+
{{ action.message | translate }}
diff --git a/src/addons/notifications/pages/settings/settings.html b/src/addons/notifications/pages/settings/settings.html
index 97174d554..16d12064c 100644
--- a/src/addons/notifications/pages/settings/settings.html
+++ b/src/addons/notifications/pages/settings/settings.html
@@ -1,25 +1,23 @@
-
+
{{ 'addon.notifications.notifications' | translate }}
-
-
+
-
+ [content]="handler.label | translate" (action)="openExtraPreferences(handler)" [iconAction]="handler.icon" />
-
+
@@ -27,14 +25,13 @@
{{ 'addon.notifications.allownotifications' | translate }}
-
+
{{ 'addon.notifications.playsound' | translate }}
-
-
+
@@ -52,11 +49,11 @@
-
+
-
+
@@ -98,8 +95,7 @@
-
+ (ngModelChange)="changePreferenceLegacy(notification, state)" />
@@ -133,8 +129,7 @@
[loading]="notification.processorsByName[currentProcessorName][state].updating">
-
+ (ngModelChange)="changePreferenceLegacy(notification, state)" />
@@ -171,8 +166,7 @@
[loading]="notification.processorsByName[currentProcessorName].updating">
-
+ (ngModelChange)="changePreference(notification)" />
diff --git a/src/addons/privatefiles/pages/index/index.html b/src/addons/privatefiles/pages/index/index.html
index af53f6643..14080063a 100644
--- a/src/addons/privatefiles/pages/index/index.html
+++ b/src/addons/privatefiles/pages/index/index.html
@@ -1,7 +1,7 @@
-
+
{{ title }}
@@ -11,7 +11,7 @@
-
+
@@ -39,22 +39,21 @@
-
+
{{file.filename}}
-
+
-
-
+
-
+
{{ 'core.fileuploader.uploadafile' | translate }}
diff --git a/src/addons/qbehaviour/deferredcbm/component/addon-qbehaviour-deferredcbm.html b/src/addons/qbehaviour/deferredcbm/component/addon-qbehaviour-deferredcbm.html
index 92e1b8dd8..a41071878 100644
--- a/src/addons/qbehaviour/deferredcbm/component/addon-qbehaviour-deferredcbm.html
+++ b/src/addons/qbehaviour/deferredcbm/component/addon-qbehaviour-deferredcbm.html
@@ -8,7 +8,7 @@
{{ option.text }}
-
+
diff --git a/src/addons/qtype/calculated/component/addon-qtype-calculated.html b/src/addons/qtype/calculated/component/addon-qtype-calculated.html
index 68dde2517..bb5fb9136 100644
--- a/src/addons/qtype/calculated/component/addon-qtype-calculated.html
+++ b/src/addons/qtype/calculated/component/addon-qtype-calculated.html
@@ -2,14 +2,13 @@
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
-
+
@@ -18,28 +17,26 @@
-
+
-
+ [disabled]="question.input.readOnly" autocorrect="off" />
-
+
-
+ [name]="question.input.correctIcon" [color]="[question.input.correctIconColor]" />
-
+
@@ -63,8 +60,7 @@
{{ option.text }}
-
+ [color]="question!.input?.correctIconColor" />
diff --git a/src/addons/qtype/ddimageortext/component/addon-qtype-ddimageortext.html b/src/addons/qtype/ddimageortext/component/addon-qtype-ddimageortext.html
index 65adb222a..40af91739 100644
--- a/src/addons/qtype/ddimageortext/component/addon-qtype-ddimageortext.html
+++ b/src/addons/qtype/ddimageortext/component/addon-qtype-ddimageortext.html
@@ -1,24 +1,22 @@
-
+
-
+
{{ 'core.question.howtodraganddrop' | translate }}
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" (afterRender)="textRendered()" />
-
+ [text]="question.ddArea" [filter]="false" (afterRender)="ddAreaRendered()" />
diff --git a/src/addons/qtype/ddmarker/component/addon-qtype-ddmarker.html b/src/addons/qtype/ddmarker/component/addon-qtype-ddmarker.html
index bdd9a91fc..d800948a9 100644
--- a/src/addons/qtype/ddmarker/component/addon-qtype-ddmarker.html
+++ b/src/addons/qtype/ddmarker/component/addon-qtype-ddmarker.html
@@ -1,23 +1,22 @@
-
+
-
+
{{ 'core.question.howtodraganddrop' | translate }}
-
+ [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" [courseId]="courseId"
+ (afterRender)="textRendered()" />
-
+ [text]="question.ddArea" [filter]="false" (afterRender)="ddAreaRendered()" />
diff --git a/src/addons/qtype/ddwtos/component/addon-qtype-ddwtos.html b/src/addons/qtype/ddwtos/component/addon-qtype-ddwtos.html
index aa11107e3..d243f0fbf 100644
--- a/src/addons/qtype/ddwtos/component/addon-qtype-ddwtos.html
+++ b/src/addons/qtype/ddwtos/component/addon-qtype-ddwtos.html
@@ -1,22 +1,20 @@
-
+
-
+
{{ 'core.question.howtodraganddrop' | translate }}
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" #questiontext (afterRender)="textRendered()" />
-
+ [filter]="false" (afterRender)="answersRendered()" />
diff --git a/src/addons/qtype/description/component/addon-qtype-description.html b/src/addons/qtype/description/component/addon-qtype-description.html
index 089d5912a..f8c067dc6 100644
--- a/src/addons/qtype/description/component/addon-qtype-description.html
+++ b/src/addons/qtype/description/component/addon-qtype-description.html
@@ -5,8 +5,7 @@
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
diff --git a/src/addons/qtype/essay/component/addon-qtype-essay.html b/src/addons/qtype/essay/component/addon-qtype-essay.html
index 4996c7b8b..452f716f8 100644
--- a/src/addons/qtype/essay/component/addon-qtype-essay.html
+++ b/src/addons/qtype/essay/component/addon-qtype-essay.html
@@ -3,8 +3,7 @@
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
@@ -20,13 +19,11 @@
-
+ [ngModel]="question.textarea.text" />
-
+ [autoSave]="false" />
@@ -39,8 +36,7 @@
-
+ [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
@@ -49,8 +45,7 @@
-
+ [allowOffline]="offlineEnabled" [acceptedTypes]="question.attachmentsAcceptedTypes" [courseId]="courseId" />
@@ -70,8 +65,7 @@
-
+ [text]="question.answer" [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
@@ -79,8 +73,7 @@
-
+ [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
@@ -88,14 +81,12 @@
-
+ [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
-
+ [extraHtml]="question.attachmentsPlagiarisms" />
diff --git a/src/addons/qtype/essay/component/essay.ts b/src/addons/qtype/essay/component/essay.ts
index 2b2313f8b..d216b87f4 100644
--- a/src/addons/qtype/essay/component/essay.ts
+++ b/src/addons/qtype/essay/component/essay.ts
@@ -14,7 +14,7 @@
import { Component, ElementRef } from '@angular/core';
import { FormBuilder, FormControl } from '@angular/forms';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
import { AddonModQuizEssayQuestion, CoreQuestionBaseComponent } from '@features/question/classes/base-question-component';
diff --git a/src/addons/qtype/essay/services/handlers/essay.ts b/src/addons/qtype/essay/services/handlers/essay.ts
index 96c39cd18..5d5ad3d7a 100644
--- a/src/addons/qtype/essay/services/handlers/essay.ts
+++ b/src/addons/qtype/essay/services/handlers/essay.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable, Type } from '@angular/core';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFileUploader, CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
import { AddonModQuizEssayQuestion } from '@features/question/classes/base-question-component';
diff --git a/src/addons/qtype/gapselect/component/addon-qtype-gapselect.html b/src/addons/qtype/gapselect/component/addon-qtype-gapselect.html
index 7bb2c46df..4ce037280 100644
--- a/src/addons/qtype/gapselect/component/addon-qtype-gapselect.html
+++ b/src/addons/qtype/gapselect/component/addon-qtype-gapselect.html
@@ -2,8 +2,7 @@
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" (afterRender)="questionRendered()" />
diff --git a/src/addons/qtype/match/component/addon-qtype-match.html b/src/addons/qtype/match/component/addon-qtype-match.html
index eed4cf9bf..28b81e9d5 100644
--- a/src/addons/qtype/match/component/addon-qtype-match.html
+++ b/src/addons/qtype/match/component/addon-qtype-match.html
@@ -2,15 +2,13 @@
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
-
+ [text]="row.text" [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
{{ row.accessibilityLabel }}
@@ -24,8 +22,8 @@
+ [attr.aria-label]="'core.question.correct' | translate" />
+ [attr.aria-label]="'core.question.incorrect' | translate" />
diff --git a/src/addons/qtype/multianswer/component/addon-qtype-multianswer.html b/src/addons/qtype/multianswer/component/addon-qtype-multianswer.html
index db188b1f2..ea009c6c1 100644
--- a/src/addons/qtype/multianswer/component/addon-qtype-multianswer.html
+++ b/src/addons/qtype/multianswer/component/addon-qtype-multianswer.html
@@ -1,7 +1,6 @@
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" (afterRender)="questionRendered()" />
diff --git a/src/addons/qtype/multichoice/component/addon-qtype-multichoice.html b/src/addons/qtype/multichoice/component/addon-qtype-multichoice.html
index f1d5a707f..a6b5d868f 100644
--- a/src/addons/qtype/multichoice/component/addon-qtype-multichoice.html
+++ b/src/addons/qtype/multichoice/component/addon-qtype-multichoice.html
@@ -4,13 +4,11 @@
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
@@ -20,23 +18,20 @@
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
-
+ [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
-
+ [color]='(option.isCorrect === 1 ? "success": "") + (option.isCorrect === 0 ? "danger": "")' />
+ [attr.aria-label]="'core.question.correct' | translate" />
+ [attr.aria-label]="'core.question.incorrect' | translate" />
@@ -48,23 +43,20 @@
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
-
+ [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
-
+ [color]='(option.isCorrect === 1 ? "success": "") + (option.isCorrect === 0 ? "danger": "")' />
+ [attr.aria-label]="'core.question.correct' | translate" />
+ [attr.aria-label]="'core.question.incorrect' | translate" />
diff --git a/src/addons/qtype/shortanswer/component/addon-qtype-shortanswer.html b/src/addons/qtype/shortanswer/component/addon-qtype-shortanswer.html
index dedbb455d..5c65cee57 100644
--- a/src/addons/qtype/shortanswer/component/addon-qtype-shortanswer.html
+++ b/src/addons/qtype/shortanswer/component/addon-qtype-shortanswer.html
@@ -2,18 +2,15 @@
-
+ [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
{{ 'addon.mod_quiz.answercolon' | translate }}
-
+ [attr.name]="question.input.name" [value]="question.input.value" autocorrect="off" [disabled]="question.input.readOnly" />
-
+ [color]="[question.input.correctIconColor]" />
diff --git a/src/addons/storagemanager/pages/course-storage/course-storage.html b/src/addons/storagemanager/pages/course-storage/course-storage.html
index 4b93a8815..c890ab0dc 100644
--- a/src/addons/storagemanager/pages/course-storage/course-storage.html
+++ b/src/addons/storagemanager/pages/course-storage/course-storage.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.storagemanager.coursedownloads' | translate }}
@@ -20,8 +20,7 @@
-
-
+
@@ -34,15 +33,14 @@
-
-
+
+
{{ prefetchCourseData.statusTranslatable | translate }}
-
+ { name: title }" />
{{ 'addon.storagemanager.deleteall' | translate }}
@@ -55,27 +53,23 @@
[attr.aria-label]="(section.expanded ? 'core.collapse' : 'core.expand') | translate"
[attr.aria-expanded]="section.expanded" [attr.aria-controls]="'core-course-storage-section-' + section.id">
-
+ [class.expandable-status-icon-expanded]="section.expanded" />
-
+ [adaptImg]="false" />
0">
- {{ section.totalSize | coreBytesToSize }}
+ [attr.aria-label]="'core.downloaded' | translate" />{{ section.totalSize | coreBytesToSize }}
{{ 'core.calculating' | translate }}
-
-
+
-
+ [loading]="section.isDownloading || section.isCalculating" [canTrustDownload]="true" />
0" color="danger" fill="clear">
-
+ [attr.aria-label]="'addon.storagemanager.deletedatafrom' | translate: { name: section.name }" />
@@ -108,19 +100,16 @@
0)">
-
+ [modname]="module.modname" [componentId]="module.instance" [fallbackTranslation]="module.modplural" />
-
+ [contextInstanceId]="module.id" [adaptImg]="false" />
0">
- {{ module.totalSize | coreBytesToSize }}
+ [attr.aria-label]="'core.downloaded' | translate" />{{ module.totalSize | coreBytesToSize }}
{{ 'core.calculating' | translate }}
@@ -131,13 +120,11 @@
-
+ (action)="prefetchModule(module)" />
0" color="danger">
-
+ [attr.aria-label]="'addon.storagemanager.deletedatafrom' | translate: { name: module.name }" />
{{ 'core.notdownloadable' | translate }}
diff --git a/src/addons/storagemanager/pages/courses-storage/courses-storage.html b/src/addons/storagemanager/pages/courses-storage/courses-storage.html
index 134cc61bc..892a08ab1 100644
--- a/src/addons/storagemanager/pages/courses-storage/courses-storage.html
+++ b/src/addons/storagemanager/pages/courses-storage/courses-storage.html
@@ -1,7 +1,7 @@
-
+
{{ 'addon.storagemanager.managedownloads' | translate }}
@@ -22,7 +22,7 @@
-
+
@@ -38,16 +38,14 @@
-
-
+
-
-
+
{{ 'core.downloading' | translate }}
@@ -58,8 +56,7 @@
-
+ { name: course.title }" />
diff --git a/src/addons/userprofilefield/checkbox/component/addon-user-profile-field-checkbox.html b/src/addons/userprofilefield/checkbox/component/addon-user-profile-field-checkbox.html
index 231a6bb4a..f4a639077 100644
--- a/src/addons/userprofilefield/checkbox/component/addon-user-profile-field-checkbox.html
+++ b/src/addons/userprofilefield/checkbox/component/addon-user-profile-field-checkbox.html
@@ -3,8 +3,7 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
{{ 'core.yes' | translate }}
@@ -20,11 +19,9 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
-
+
-
-
+
diff --git a/src/addons/userprofilefield/datetime/component/addon-user-profile-field-datetime.html b/src/addons/userprofilefield/datetime/component/addon-user-profile-field-datetime.html
index ff6256e5d..8e2a21349 100644
--- a/src/addons/userprofilefield/datetime/component/addon-user-profile-field-datetime.html
+++ b/src/addons/userprofilefield/datetime/component/addon-user-profile-field-datetime.html
@@ -3,8 +3,7 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
{{ valueNumber * 1000 | coreFormatDate }}
{{ displayValue }}
@@ -16,12 +15,10 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
-
-
+ [min]="min" [monthNames]="monthNames" [displayTimezone]="displayTimezone" />
+
diff --git a/src/addons/userprofilefield/menu/component/addon-user-profile-field-menu.html b/src/addons/userprofilefield/menu/component/addon-user-profile-field-menu.html
index 2abaebba9..545f8938b 100644
--- a/src/addons/userprofilefield/menu/component/addon-user-profile-field-menu.html
+++ b/src/addons/userprofilefield/menu/component/addon-user-profile-field-menu.html
@@ -3,13 +3,11 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
-
+ [wsNotFiltered]="valueNotFiltered" />
@@ -19,8 +17,7 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
{{ 'core.choosedots' | translate }}
{{option}}
-
+
diff --git a/src/addons/userprofilefield/social/component/addon-user-profile-field-social.html b/src/addons/userprofilefield/social/component/addon-user-profile-field-social.html
index f6a65df66..8cffbf860 100644
--- a/src/addons/userprofilefield/social/component/addon-user-profile-field-social.html
+++ b/src/addons/userprofilefield/social/component/addon-user-profile-field-social.html
@@ -3,13 +3,11 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
-
+ [wsNotFiltered]="valueNotFiltered" />
@@ -19,10 +17,9 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
-
-
+
+
diff --git a/src/addons/userprofilefield/text/component/addon-user-profile-field-text.html b/src/addons/userprofilefield/text/component/addon-user-profile-field-text.html
index e75d88886..123ac8566 100644
--- a/src/addons/userprofilefield/text/component/addon-user-profile-field-text.html
+++ b/src/addons/userprofilefield/text/component/addon-user-profile-field-text.html
@@ -3,13 +3,11 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
-
+ [wsNotFiltered]="valueNotFiltered" />
@@ -19,10 +17,9 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
-
-
+
+
diff --git a/src/addons/userprofilefield/textarea/component/addon-user-profile-field-textarea.html b/src/addons/userprofilefield/textarea/component/addon-user-profile-field-textarea.html
index 29f16a3c5..6077c5990 100644
--- a/src/addons/userprofilefield/textarea/component/addon-user-profile-field-textarea.html
+++ b/src/addons/userprofilefield/textarea/component/addon-user-profile-field-textarea.html
@@ -3,13 +3,11 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
-
+ [wsNotFiltered]="valueNotFiltered" />
@@ -19,12 +17,10 @@
-
+ [courseId]="courseId" [wsNotFiltered]="true" />
-
+
-
+ [contextInstanceId]="contextInstanceId" [elementId]="modelName" />
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 4f8005305..0c3b63393 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -35,11 +35,14 @@ import { CorePlatform } from '@services/platform';
import { CoreUrl } from '@singletons/url';
import { CoreLogger } from '@singletons/logger';
import { CorePromisedValue } from '@classes/promised-value';
+import { register } from 'swiper/element/bundle';
const MOODLE_SITE_URL_PREFIX = 'url-';
const MOODLE_VERSION_PREFIX = 'version-';
const MOODLEAPP_VERSION_PREFIX = 'moodleapp-';
+register();
+
@Component({
selector: 'app-root',
templateUrl: 'app.component.html',
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 99683c1f7..b295b1723 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -34,7 +34,12 @@ import { CoreSiteInfoCronHandler } from '@services/handlers/site-info-cron';
import { moodleTransitionAnimation } from '@classes/page-transition';
import { TestingModule } from '@/testing/testing.module';
-// For translate loader. AoT requires an exported function for factories.
+/**
+ * For translate loader. AoT requires an exported function for factories.
+ *
+ * @param http Http client.
+ * @returns Translate loader.
+ */
export function createTranslateLoader(http: HttpClient): TranslateHttpLoader {
return new TranslateHttpLoader(http, './assets/lang/', '.json');
}
diff --git a/src/core/classes/modal-lateral-transition.ts b/src/core/classes/modal-lateral-transition.ts
index 45fafb626..95476b607 100644
--- a/src/core/classes/modal-lateral-transition.ts
+++ b/src/core/classes/modal-lateral-transition.ts
@@ -27,7 +27,7 @@ export function CoreModalLateralTransitionEnter(baseEl: HTMLElement): Animation
const otherAnimations: Animation[] = [];
- const backdrop = baseEl.querySelector('ion-backdrop');
+ const backdrop = baseEl.shadowRoot?.querySelector('ion-backdrop');
if (backdrop) {
const backdropAnimation = createAnimation()
.addElement(backdrop)
@@ -36,7 +36,7 @@ export function CoreModalLateralTransitionEnter(baseEl: HTMLElement): Animation
otherAnimations.push(backdropAnimation);
}
- const wrapper = baseEl.querySelector('.modal-wrapper');
+ const wrapper = baseEl.shadowRoot?.querySelector('.modal-wrapper');
if (wrapper) {
const wrapperAnimation = createAnimation()
.addElement(wrapper)
@@ -64,7 +64,7 @@ export function CoreModalLateralTransitionLeave(baseEl: HTMLElement): Animation
const otherAnimations: Animation[] = [];
- const backdrop = baseEl.querySelector('ion-backdrop');
+ const backdrop = baseEl.shadowRoot?.querySelector('ion-backdrop');
if (backdrop) {
const backdropAnimation = createAnimation()
.addElement(backdrop)
@@ -73,7 +73,7 @@ export function CoreModalLateralTransitionLeave(baseEl: HTMLElement): Animation
otherAnimations.push(backdropAnimation);
}
- const wrapper = baseEl.querySelector('.modal-wrapper');
+ const wrapper = baseEl.shadowRoot?.querySelector('.modal-wrapper');
if (wrapper) {
const wrapperAnimation = createAnimation()
.addElement(wrapper)
diff --git a/src/core/classes/native-to-angular-http.ts b/src/core/classes/native-to-angular-http.ts
index 08349dd30..a5c12dc0f 100644
--- a/src/core/classes/native-to-angular-http.ts
+++ b/src/core/classes/native-to-angular-http.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { HttpResponse as AngularHttpResponse, HttpHeaders } from '@angular/common/http';
-import { HTTPResponse as NativeHttpResponse } from '@ionic-native/http';
+import { HTTPResponse as NativeHttpResponse } from '@awesome-cordova-plugins/http';
const HTTP_STATUS_MESSAGES = {
100: 'Continue',
diff --git a/src/core/classes/sites/authenticated-site.ts b/src/core/classes/sites/authenticated-site.ts
index 4a7b57b56..4fd6fb9fd 100644
--- a/src/core/classes/sites/authenticated-site.ts
+++ b/src/core/classes/sites/authenticated-site.ts
@@ -211,7 +211,7 @@ export class CoreAuthenticatedSite extends CoreUnauthenticatedSite {
/**
* Check if current user is Admin.
- * Works properly since v3.8. See more in: {@link} https://tracker.moodle.org/browse/MDL-65550
+ * Works properly since v3.8. See more in: {@link https://tracker.moodle.org/browse/MDL-65550}
*
* @returns Whether the user is Admin.
*/
diff --git a/src/core/classes/sites/site.ts b/src/core/classes/sites/site.ts
index 53cce59c8..b19afa532 100644
--- a/src/core/classes/sites/site.ts
+++ b/src/core/classes/sites/site.ts
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { InAppBrowserObject, InAppBrowserOptions } from '@ionic-native/in-app-browser';
+import { InAppBrowserObject, InAppBrowserOptions } from '@awesome-cordova-plugins/in-app-browser';
import { CoreNetwork } from '@services/network';
import { CoreDB } from '@services/db';
diff --git a/src/core/classes/sqlitedb.ts b/src/core/classes/sqlitedb.ts
index a406f7e43..f6793f8cb 100644
--- a/src/core/classes/sqlitedb.ts
+++ b/src/core/classes/sqlitedb.ts
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { SQLiteObject } from '@ionic-native/sqlite/ngx';
+import { SQLiteObject } from '@awesome-cordova-plugins/sqlite/ngx';
import { SQLite } from '@singletons';
import { CoreError } from '@classes/errors/error';
diff --git a/src/core/classes/tabs.ts b/src/core/classes/tabs.ts
index f74babe68..2758cbaf6 100644
--- a/src/core/classes/tabs.ts
+++ b/src/core/classes/tabs.ts
@@ -25,7 +25,6 @@ import {
SimpleChange,
ElementRef,
} from '@angular/core';
-import { IonSlides } from '@ionic/angular';
import { BackButtonEvent } from '@ionic/core';
import { Subscription } from 'rxjs';
@@ -40,6 +39,9 @@ import { CorePromisedValue } from './promised-value';
import { AsyncDirective } from './async-directive';
import { CoreDirectivesRegistry } from '@singletons/directives-registry';
import { CorePlatform } from '@services/platform';
+import { Swiper } from 'swiper';
+import { SwiperOptions } from 'swiper/types';
+import { IonicSlides } from '@ionic/angular';
/**
* Class to abstract some common code for tabs.
@@ -56,7 +58,34 @@ export class CoreTabsBaseComponent implements OnInit, Aft
@Input() hideUntil = false; // Determine when should the contents be shown.
@Output() protected ionChange = new EventEmitter(); // Emitted when the tab changes.
- @ViewChild(IonSlides) protected slides?: IonSlides;
+ protected swiper?: Swiper;
+ @ViewChild('swiperRef')
+ set swiperRef(swiperRef: ElementRef) {
+ /**
+ * This setTimeout waits for Ionic's async initialization to complete.
+ * Otherwise, an outdated swiper reference will be used.
+ */
+ setTimeout(() => {
+ if (swiperRef?.nativeElement?.swiper && !this.swiper) {
+ this.swiper = swiperRef.nativeElement.swiper as Swiper;
+
+ this.swiper.changeLanguageDirection(CorePlatform.isRTL ? 'rtl' : 'ltr');
+
+ Object.keys(this.swiperOpts).forEach((key) => {
+ if (this.swiper) {
+ this.swiper.params[key] = this.swiperOpts[key];
+ }
+ });
+
+ // Subscribe to changes.
+ this.swiper.on('slideChangeTransitionEnd', () => {
+ this.slideChanged();
+ });
+
+ this.init();
+ }
+ }, 0);
+ }
tabs: T[] = []; // List of tabs.
@@ -66,18 +95,14 @@ export class CoreTabsBaseComponent implements OnInit, Aft
showNextButton = false;
maxSlides = 3;
numTabsShown = 0;
- direction = 'ltr';
description = '';
- slidesOpts = {
- initialSlide: 0,
+ swiperOpts: SwiperOptions = {
+ modules: [IonicSlides],
slidesPerView: 3,
centerInsufficientSlides: true,
threshold: 10,
};
- protected slidesElement?: HTMLIonSlidesElement;
- protected initialized = false;
-
protected resizeListener?: CoreEventObserver;
protected isDestroyed = false;
protected isCurrentView = true;
@@ -87,7 +112,7 @@ export class CoreTabsBaseComponent implements OnInit, Aft
protected firstSelectedTab?: string; // ID of the first selected tab to control history.
protected backButtonFunction: (event: BackButtonEvent) => void;
- // Swiper 6 documentation: https://swiper6.vercel.app/
+ // Swiper documentation: https://swiperjs.com/swiper-api
protected isInTransition = false; // Wether Slides is in transition.
protected subscriptions: Subscription[] = [];
protected onReadyPromise = new CorePromisedValue();
@@ -106,12 +131,10 @@ export class CoreTabsBaseComponent implements OnInit, Aft
* @inheritdoc
*/
async ngOnInit(): Promise {
- this.direction = CorePlatform.isRTL ? 'rtl' : 'ltr';
-
// Change the side when the language changes.
this.subscriptions.push(Translate.onLangChange.subscribe(() => {
setTimeout(() => {
- this.direction = CorePlatform.isRTL ? 'rtl' : 'ltr';
+ this.swiper?.changeLanguageDirection(CorePlatform.isRTL ? 'rtl' : 'ltr');
});
}));
}
@@ -125,6 +148,10 @@ export class CoreTabsBaseComponent implements OnInit, Aft
}
this.init();
+
+ this.resizeListener = CoreDom.onWindowResize(() => {
+ this.calculateSlides();
+ });
}
/**
@@ -136,7 +163,7 @@ export class CoreTabsBaseComponent implements OnInit, Aft
}
/**
- * User entered the page that contains the component.
+ * @inheritdoc
*/
ionViewDidEnter(): void {
this.isCurrentView = true;
@@ -179,7 +206,7 @@ export class CoreTabsBaseComponent implements OnInit, Aft
}
/**
- * User left the page that contains the component.
+ * @inheritdoc
*/
ionViewDidLeave(): void {
// Unregister the custom back button action for this component.
@@ -189,16 +216,15 @@ export class CoreTabsBaseComponent implements OnInit, Aft
}
/**
- * Calculate slides.
+ * Updates the number of slides to show.
*/
protected async calculateSlides(): Promise {
- if (!this.isCurrentView || !this.initialized) {
+ if (!this.isCurrentView || !this.swiper) {
// Don't calculate if component isn't in current view, the calculations are wrong.
return;
}
this.numTabsShown = this.tabs.reduce((prev: number, current) => current.enabled ? prev + 1 : prev, 0);
-
if (this.numTabsShown <= 1) {
this.hideTabs = true;
@@ -209,7 +235,32 @@ export class CoreTabsBaseComponent implements OnInit, Aft
await this.calculateMaxSlides();
- await this.updateSlides();
+ this.swiperOpts.slidesPerView = Math.min(this.maxSlides, this.numTabsShown);
+
+ this.slideChanged();
+
+ this.swiper.update();
+ await CoreUtils.nextTick();
+
+ if (!this.hasSliddenToInitial && this.selectedIndex && this.selectedIndex >= this.swiper.slidesPerViewDynamic()) {
+ this.hasSliddenToInitial = true;
+ this.shouldSlideToInitial = true;
+
+ setTimeout(() => {
+ if (this.shouldSlideToInitial) {
+ this.swiper?.slideTo(this.selectedIndex, 0);
+ this.shouldSlideToInitial = false;
+ }
+ }, 400);
+
+ return;
+ } else if (this.selectedIndex) {
+ this.hasSliddenToInitial = true;
+ }
+
+ setTimeout(() => {
+ this.slideChanged(); // Call slide changed again, sometimes the slide active index takes a while to be updated.
+ }, 400);
}
/**
@@ -218,8 +269,12 @@ export class CoreTabsBaseComponent implements OnInit, Aft
* @param tabId Tab ID.
* @returns Selected tab.
*/
- protected getTabIndex(tabId: string): number {
- return this.tabs.findIndex((tab) => tabId == tab.id);
+ protected getTabIndex(tabId?: string): number {
+ if (!tabId) {
+ return -1;
+ }
+
+ return this.tabs.findIndex((tab) => tabId === tab.id);
}
/**
@@ -228,89 +283,39 @@ export class CoreTabsBaseComponent implements OnInit, Aft
* @returns Selected tab.
*/
getSelected(): T | undefined {
- const index = this.selected && this.getTabIndex(this.selected);
+ const index = this.getTabIndex(this.selected);
- return index !== undefined && index >= 0 ? this.tabs[index] : undefined;
+ return index >= 0 ? this.tabs[index] : undefined;
}
/**
* Init the component.
*/
protected async init(): Promise {
- if (!this.hideUntil) {
+ if (!this.hideUntil || !this.swiper) {
// Hidden, do nothing.
return;
}
try {
- await this.initializeSlider();
- await this.initializeTabs();
+ const selectedTab = this.calculateInitialTab();
+ if (!selectedTab) {
+ // No enabled tabs, return.
+ throw new CoreError('No enabled tabs.');
+ }
+
+ this.firstSelectedTab = selectedTab.id;
+ if (this.firstSelectedTab !== undefined) {
+ this.selectTab(this.firstSelectedTab);
+ }
+
+ // Check which arrows should be shown.
+ this.calculateSlides();
} catch {
// Something went wrong, ignore.
}
}
- /**
- * Initialize the slider elements.
- */
- protected async initializeSlider(): Promise {
- if (this.initialized) {
- return;
- }
-
- if (this.slidesElement) {
- // Already initializated, await for ready.
- await this.slidesElement.componentOnReady();
-
- return;
- }
-
- if (!this.slides) {
- await CoreUtils.nextTick();
- }
- const slidesSwiper = await this.slides?.getSwiper();
- if (!slidesSwiper || !this.slides) {
- throw new CoreError('Swiper not found, will try on next change.');
- }
-
- this.slidesElement = slidesSwiper.el;
- await this.slidesElement.componentOnReady();
-
- this.initialized = true;
-
- // Subscribe to changes.
- this.subscriptions.push(this.slides.ionSlideDidChange.subscribe(() => {
- this.slideChanged();
- }));
- }
-
- /**
- * Initialize the tabs, determining the first tab to be shown.
- */
- protected async initializeTabs(): Promise {
- if (!this.initialized || !this.slidesElement) {
- return;
- }
-
- const selectedTab = this.calculateInitialTab();
- if (!selectedTab) {
- // No enabled tabs, return.
- throw new CoreError('No enabled tabs.');
- }
-
- this.firstSelectedTab = selectedTab.id;
- if (this.firstSelectedTab !== undefined) {
- this.selectTab(this.firstSelectedTab);
- }
-
- // Check which arrows should be shown.
- this.calculateSlides();
-
- this.resizeListener = CoreDom.onWindowResize(() => {
- this.calculateSlides();
- });
- }
-
/**
* Calculate the initial tab to load.
*
@@ -330,116 +335,71 @@ export class CoreTabsBaseComponent implements OnInit, Aft
/**
* Method executed when the slides are changed.
*/
- async slideChanged(): Promise {
- if (!this.slidesElement) {
+ slideChanged(): void {
+ if (!this.swiper) {
return;
}
this.isInTransition = false;
- const slidesCount = await this.slides?.length() || 0;
+ const slidesCount = this.swiper.slides.length || 0;
if (slidesCount > 0) {
- this.showPrevButton = !await this.slides?.isBeginning();
- this.showNextButton = !await this.slides?.isEnd();
+ this.showPrevButton = !this.swiper.isBeginning;
+ this.showNextButton = !this.swiper.isEnd;
} else {
this.showPrevButton = false;
this.showNextButton = false;
}
- const currentIndex = await this.slides?.getActiveIndex();
+ const currentIndex = this.swiper.activeIndex;
if (this.shouldSlideToInitial && currentIndex != this.selectedIndex) {
// Current tab has changed, don't slide to initial anymore.
this.shouldSlideToInitial = false;
}
}
- /**
- * Updates the number of slides to show.
- */
- protected async updateSlides(): Promise {
- if (!this.slides) {
- return;
- }
-
- this.slidesOpts = { ...this.slidesOpts, slidesPerView: Math.min(this.maxSlides, this.numTabsShown) };
-
- await this.slideChanged();
-
- await this.slides.update();
-
- if (!this.hasSliddenToInitial && this.selectedIndex && this.selectedIndex >= this.slidesOpts.slidesPerView) {
- this.hasSliddenToInitial = true;
- this.shouldSlideToInitial = true;
-
- setTimeout(() => {
- if (this.shouldSlideToInitial) {
- this.slides?.slideTo(this.selectedIndex, 0);
- this.shouldSlideToInitial = false;
- }
- }, 400);
-
- return;
- } else if (this.selectedIndex) {
- this.hasSliddenToInitial = true;
- }
-
- setTimeout(() => {
- this.slideChanged(); // Call slide changed again, sometimes the slide active index takes a while to be updated.
- }, 400);
- }
-
/**
* Calculate the number of slides that can fit on the screen.
*/
protected async calculateMaxSlides(): Promise {
- if (!this.slidesElement || !this.slides) {
+ if (!this.swiper) {
return;
}
this.maxSlides = 3;
await CoreUtils.nextTick();
- let width: number = this.slidesElement.getBoundingClientRect().width;
- if (!width) {
- const slidesSwiper = await this.slides.getSwiper();
-
- await slidesSwiper.updateSize();
- await CoreUtils.nextTick();
-
- width = slidesSwiper.width;
- if (!width) {
-
- return;
- }
+ if (!this.swiper.width) {
+ return;
}
const zoomLevel = await CoreSettingsHelper.getZoom();
- this.maxSlides = Math.floor(width / (zoomLevel / 100 * CoreTabsBaseComponent.MIN_TAB_WIDTH));
+ this.maxSlides = Math.floor(this.swiper.width / (zoomLevel / 100 * CoreTabsBaseComponent.MIN_TAB_WIDTH));
}
/**
* Method that shows the next tab.
*/
- async slideNext(): Promise {
+ slideNext(): void {
// Stop if slides are in transition.
- if (!this.showNextButton || this.isInTransition || !this.slides) {
+ if (!this.showNextButton || this.isInTransition || !this.swiper) {
return;
}
- if (await this.slides.isBeginning()) {
+ if (this.swiper.isBeginning) {
// Slide to the second page.
- this.slides.slideTo(this.maxSlides);
+ this.swiper.slideTo(this.maxSlides);
} else {
- const currentIndex = await this.slides.getActiveIndex();
+ const currentIndex = this.swiper.activeIndex;
if (currentIndex !== undefined) {
const nextSlideIndex = currentIndex + this.maxSlides;
this.isInTransition = true;
if (nextSlideIndex < this.numTabsShown) {
// Slide to the next page.
- await this.slides.slideTo(nextSlideIndex);
+ this.swiper.slideTo(nextSlideIndex);
} else {
// Slide to the latest slide.
- await this.slides.slideTo(this.numTabsShown - 1);
+ this.swiper.slideTo(this.numTabsShown - 1);
}
}
@@ -449,26 +409,26 @@ export class CoreTabsBaseComponent implements OnInit, Aft
/**
* Method that shows the previous tab.
*/
- async slidePrev(): Promise {
+ slidePrev(): void {
// Stop if slides are in transition.
- if (!this.showPrevButton || this.isInTransition || !this.slides) {
+ if (!this.showPrevButton || this.isInTransition || !this.swiper) {
return;
}
- if (await this.slides.isEnd()) {
- this.slides.slideTo(this.numTabsShown - this.maxSlides * 2);
+ if (this.swiper.isEnd) {
+ this.swiper.slideTo(this.numTabsShown - this.maxSlides * 2);
// Slide to the previous of the latest page.
} else {
- const currentIndex = await this.slides.getActiveIndex();
+ const currentIndex = this.swiper.activeIndex;
if (currentIndex !== undefined) {
const prevSlideIndex = currentIndex - this.maxSlides;
this.isInTransition = true;
if (prevSlideIndex >= 0) {
// Slide to the previous page.
- await this.slides.slideTo(prevSlideIndex);
+ this.swiper.slideTo(prevSlideIndex);
} else {
// Slide to the first page.
- await this.slides.slideTo(0);
+ this.swiper.slideTo(0);
}
}
}
@@ -517,12 +477,12 @@ export class CoreTabsBaseComponent implements OnInit, Aft
return;
}
- if (this.selected && this.slides) {
+ if (this.selected && this.swiper) {
// Check if we need to slide to the tab because it's not visible.
- const firstVisibleTab = await this.slides.getActiveIndex();
- const lastVisibleTab = firstVisibleTab + this.slidesOpts.slidesPerView - 1;
+ const firstVisibleTab = this.swiper.activeIndex;
+ const lastVisibleTab = firstVisibleTab + this.swiper.slidesPerViewDynamic() - 1;
if (index < firstVisibleTab || index > lastVisibleTab) {
- await this.slides.slideTo(index, 0, true);
+ this.swiper.slideTo(index, 0, true);
}
}
diff --git a/src/core/classes/tests/database-table.test.ts b/src/core/classes/tests/database-table.test.ts
index 3b9c2bca2..005bf0ff8 100644
--- a/src/core/classes/tests/database-table.test.ts
+++ b/src/core/classes/tests/database-table.test.ts
@@ -24,10 +24,24 @@ type User = {
surname: string;
};
+/**
+ * Checks if a user object matches specified conditions.
+ *
+ * @param user The user object to be checked.
+ * @param conditions The conditions to match against the user object.
+ * @returns Returns true if the user matches the conditions, false otherwise.
+ */
function userMatches(user: User, conditions: Partial) {
return !Object.entries(conditions).some(([column, value]) => user[column] !== value);
}
+/**
+ * Prepares stubs for testing with a mock database configuration.
+ *
+ * @param config The partial CoreDatabaseConfiguration to use for the mock database.
+ * @returns An array containing a mock user records array, a mock SQLite database,
+ * and a CoreDatabaseTable instance for the 'users' table.
+ */
function prepareStubs(config: Partial = {}): [User[], SQLiteDB, CoreDatabaseTable] {
const records: User[] = [];
const database = mock({
@@ -68,6 +82,12 @@ function prepareStubs(config: Partial = {}): [User[],
return [records, database, table];
}
+/**
+ * Test function for finding items in the database.
+ *
+ * @param records An array of user records to use for testing.
+ * @param table The CoreDatabaseTable instance to test.
+ */
async function testFindItems(records: User[], table: CoreDatabaseTable) {
const john = { id: 1, name: 'John', surname: 'Doe' };
const amy = { id: 2, name: 'Amy', surname: 'Doe' };
@@ -83,6 +103,13 @@ async function testFindItems(records: User[], table: CoreDatabaseTable) {
await expect(table.getOneByPrimaryKey({ id: 2 })).resolves.toEqual(amy);
}
+/**
+ * Tests the insertion of items into a database table.
+ *
+ * @param records An array of User records.
+ * @param database The SQLite database instance.
+ * @param table The database table instance.
+ */
async function testInsertItems(records: User[], database: SQLiteDB, table: CoreDatabaseTable) {
// Arrange.
const john = { id: 1, name: 'John', surname: 'Doe' };
@@ -98,6 +125,13 @@ async function testInsertItems(records: User[], database: SQLiteDB, table: CoreD
await expect(table.getOneByPrimaryKey({ id: 1 })).resolves.toEqual(john);
}
+/**
+ * Tests the deletion of items from a database table based on a condition.
+ *
+ * @param records An array of User records.
+ * @param database The SQLite database instance.
+ * @param table The database table instance.
+ */
async function testDeleteItems(records: User[], database: SQLiteDB, table: CoreDatabaseTable) {
// Arrange.
const john = { id: 1, name: 'John', surname: 'Doe' };
@@ -121,6 +155,13 @@ async function testDeleteItems(records: User[], database: SQLiteDB, table: CoreD
await expect(table.getOneByPrimaryKey({ id: 3 })).resolves.toEqual(jane);
}
+/**
+ * Tests the deletion of items from a database table based on primary key values.
+ *
+ * @param records An array of User records.
+ * @param database The SQLite database instance.
+ * @param table The database table instance.
+ */
async function testDeleteItemsByPrimaryKey(records: User[], database: SQLiteDB, table: CoreDatabaseTable) {
// Arrange.
const john = { id: 1, name: 'John', surname: 'Doe' };
diff --git a/src/core/components/attachments/attachments.ts b/src/core/components/attachments/attachments.ts
index 97999dd16..d8b9ad346 100644
--- a/src/core/components/attachments/attachments.ts
+++ b/src/core/components/attachments/attachments.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Component, Input, OnInit } from '@angular/core';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFileUploader, CoreFileUploaderTypeList } from '@features/fileuploader/services/fileuploader';
import { CoreSites } from '@services/sites';
diff --git a/src/core/components/attachments/core-attachments.html b/src/core/components/attachments/core-attachments.html
index 3b5cd9371..a86ff9e2c 100644
--- a/src/core/components/attachments/core-attachments.html
+++ b/src/core/components/attachments/core-attachments.html
@@ -21,20 +21,18 @@
-
+ (onDelete)="delete(index, true)" [canDownload]="!file.offline" />
-
+ (onRename)="renamed(index, $event)" />
= 0 && files && files.length < maxSubmissions)"
class="ion-text-wrap ion-margin" (click)="add()">
-
+
{{ 'core.fileuploader.addfiletext' | translate }}
diff --git a/src/core/components/button-with-spinner/core-button-with-spinner.html b/src/core/components/button-with-spinner/core-button-with-spinner.html
index da739883f..3ce1927eb 100644
--- a/src/core/components/button-with-spinner/core-button-with-spinner.html
+++ b/src/core/components/button-with-spinner/core-button-with-spinner.html
@@ -3,4 +3,4 @@
-
+
diff --git a/src/core/components/chart/core-chart.html b/src/core/components/chart/core-chart.html
index f8b0b20f4..95cdd8ed1 100644
--- a/src/core/components/chart/core-chart.html
+++ b/src/core/components/chart/core-chart.html
@@ -2,7 +2,7 @@
-
+
{{data.text}}
diff --git a/src/core/components/combobox/core-combobox.html b/src/core/components/combobox/core-combobox.html
index 58a91cd47..1ffd3db43 100644
--- a/src/core/components/combobox/core-combobox.html
+++ b/src/core/components/combobox/core-combobox.html
@@ -1,6 +1,5 @@
-
-
+
@@ -12,7 +11,7 @@
-
+
{{ label }}:
{{selection}}
diff --git a/src/core/components/components.module.ts b/src/core/components/components.module.ts
index fd78701a6..8e35e23e2 100644
--- a/src/core/components/components.module.ts
+++ b/src/core/components/components.module.ts
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { NgModule } from '@angular/core';
+import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { IonicModule } from '@ionic/angular';
import { TranslateModule } from '@ngx-translate/core';
@@ -170,5 +170,6 @@ import { CoreSitesListComponent } from './sites-list/sites-list';
CoreSheetModalComponent,
CoreSitesListComponent,
],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class CoreComponentsModule {}
diff --git a/src/core/components/context-menu/core-context-menu-popover.html b/src/core/components/context-menu/core-context-menu-popover.html
index bddc16604..1e2accd45 100644
--- a/src/core/components/context-menu/core-context-menu-popover.html
+++ b/src/core/components/context-menu/core-context-menu-popover.html
@@ -9,18 +9,15 @@
[showBrowserWarning]="item.showBrowserWarning">
-
+
-
-
-
+ [class.icon-slash]="item.iconSlash" slot="end" aria-hidden="true" />
+
-
+ slot="end" />
{{item.badge}}
diff --git a/src/core/components/context-menu/core-context-menu.html b/src/core/components/context-menu/core-context-menu.html
index f55c2038b..1c58d36f3 100644
--- a/src/core/components/context-menu/core-context-menu.html
+++ b/src/core/components/context-menu/core-context-menu.html
@@ -1,6 +1,5 @@
-
-
+
diff --git a/src/core/components/course-image/course-image.html b/src/core/components/course-image/course-image.html
index 6251e1eea..a9e8d0ead 100644
--- a/src/core/components/course-image/course-image.html
+++ b/src/core/components/course-image/course-image.html
@@ -1,5 +1,4 @@
-
-
+
diff --git a/src/core/components/download-refresh/core-download-refresh.html b/src/core/components/download-refresh/core-download-refresh.html
index 7f940df2e..06a81d24f 100644
--- a/src/core/components/download-refresh/core-download-refresh.html
+++ b/src/core/components/download-refresh/core-download-refresh.html
@@ -2,22 +2,22 @@
-
+
-
+
+ name="fam-cloud-done" [attr.aria-label]="(statusTranslatable || 'core.downloaded') | translate" role="status" />
+ [attr.aria-label]="(statusTranslatable || 'core.downloading') | translate" />
-
+
diff --git a/src/core/components/dynamic-component/core-dynamic-component.html b/src/core/components/dynamic-component/core-dynamic-component.html
index 99c89fec9..9baedda3d 100644
--- a/src/core/components/dynamic-component/core-dynamic-component.html
+++ b/src/core/components/dynamic-component/core-dynamic-component.html
@@ -2,4 +2,4 @@
-
+
diff --git a/src/core/components/dynamic-component/dynamic-component.ts b/src/core/components/dynamic-component/dynamic-component.ts
index 00e48d8c4..72876a368 100644
--- a/src/core/components/dynamic-component/dynamic-component.ts
+++ b/src/core/components/dynamic-component/dynamic-component.ts
@@ -59,7 +59,6 @@ import { CoreLogger } from '@singletons/logger';
* The contents of this component will be displayed if no component is supplied or it cannot be created. In the example above,
* if no component is supplied then the template will show the message "Cannot render the data.".
*/
-/* eslint-disable @angular-eslint/no-conflicting-lifecycle */
@Component({
selector: 'core-dynamic-component',
templateUrl: 'core-dynamic-component.html',
diff --git a/src/core/components/empty-box/core-empty-box.html b/src/core/components/empty-box/core-empty-box.html
index 34604cea3..b40bb9da8 100644
--- a/src/core/components/empty-box/core-empty-box.html
+++ b/src/core/components/empty-box/core-empty-box.html
@@ -1,4 +1,4 @@
-
+
{{ message }}
diff --git a/src/core/components/file/core-file.html b/src/core/components/file/core-file.html
index 59c82403a..565930726 100644
--- a/src/core/components/file/core-file.html
+++ b/src/core/components/file/core-file.html
@@ -13,16 +13,15 @@
-
+ (action)="download()" />
-
+
-
+
diff --git a/src/core/components/files/core-files.html b/src/core/components/files/core-files.html
index be8580a72..4a2a9fd47 100644
--- a/src/core/components/files/core-files.html
+++ b/src/core/components/files/core-files.html
@@ -1,19 +1,17 @@
-
+
-
+ [alwaysDownload]="alwaysDownload" [canDownload]="canDownload" [showSize]="showSize" [showTime]="showTime" />
-
+
-
-
+
diff --git a/src/core/components/group-selector/group-selector.html b/src/core/components/group-selector/group-selector.html
index 2becbbc0a..300db0750 100644
--- a/src/core/components/group-selector/group-selector.html
+++ b/src/core/components/group-selector/group-selector.html
@@ -1,7 +1,7 @@
0 && (groupInfo.separateGroups || groupInfo.visibleGroups)">
1">
-
+
{{ multipleGroupsMessage }}
@@ -14,8 +14,7 @@
-
-
+
diff --git a/src/core/components/horizontal-scroll-controls/core-horizontal-scroll-controls.html b/src/core/components/horizontal-scroll-controls/core-horizontal-scroll-controls.html
index f23a2ee22..cf55200bd 100644
--- a/src/core/components/horizontal-scroll-controls/core-horizontal-scroll-controls.html
+++ b/src/core/components/horizontal-scroll-controls/core-horizontal-scroll-controls.html
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/src/core/components/iframe/core-iframe.html b/src/core/components/iframe/core-iframe.html
index 6c7a0fa1d..d15df751c 100644
--- a/src/core/components/iframe/core-iframe.html
+++ b/src/core/components/iframe/core-iframe.html
@@ -1,5 +1,5 @@
-
+
@@ -7,7 +7,7 @@
-
+
diff --git a/src/core/components/infinite-loading/core-infinite-loading.html b/src/core/components/infinite-loading/core-infinite-loading.html
index 32b06f708..4ec1b60b2 100644
--- a/src/core/components/infinite-loading/core-infinite-loading.html
+++ b/src/core/components/infinite-loading/core-infinite-loading.html
@@ -10,7 +10,7 @@
-
+
@@ -25,5 +25,5 @@
-
+
diff --git a/src/core/components/loading/core-loading.html b/src/core/components/loading/core-loading.html
index cabe746af..94bbb6b9d 100644
--- a/src/core/components/loading/core-loading.html
+++ b/src/core/components/loading/core-loading.html
@@ -1,5 +1,5 @@
diff --git a/src/core/components/local-file/core-local-file.html b/src/core/components/local-file/core-local-file.html
index d3ca0cdd2..01f2dee0a 100644
--- a/src/core/components/local-file/core-local-file.html
+++ b/src/core/components/local-file/core-local-file.html
@@ -18,28 +18,27 @@
-
+ (click)="$event.stopPropagation()" core-auto-focus [(ngModel)]="newFileName" *ngIf="editMode" />
-
+
-
+
-
+
-
+
diff --git a/src/core/components/local-file/local-file.ts b/src/core/components/local-file/local-file.ts
index 290979e0d..a61142734 100644
--- a/src/core/components/local-file/local-file.ts
+++ b/src/core/components/local-file/local-file.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Component, Input, Output, OnInit, EventEmitter, ViewChild, ElementRef } from '@angular/core';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreIonLoadingElement } from '@classes/ion-loading';
import { CoreFile } from '@services/file';
diff --git a/src/core/components/mark-required/core-mark-required.html b/src/core/components/mark-required/core-mark-required.html
index 73f8ec1b0..d4466a62b 100644
--- a/src/core/components/mark-required/core-mark-required.html
+++ b/src/core/components/mark-required/core-mark-required.html
@@ -1,4 +1,3 @@
-
+ [attr.aria-label]="requiredLabel" />
diff --git a/src/core/components/mark-required/mark-required.ts b/src/core/components/mark-required/mark-required.ts
index d486ca322..8d1ba253a 100644
--- a/src/core/components/mark-required/mark-required.ts
+++ b/src/core/components/mark-required/mark-required.ts
@@ -35,7 +35,6 @@ import { Translate } from '@singletons';
})
export class CoreMarkRequiredComponent implements OnInit, AfterViewInit {
- // eslint-disable-next-line @angular-eslint/no-input-rename
@Input('core-mark-required') coreMarkRequired: boolean | string = true;
protected element: HTMLElement;
diff --git a/src/core/components/message/message.html b/src/core/components/message/message.html
index 9380c0137..f8c3e1099 100644
--- a/src/core/components/message/message.html
+++ b/src/core/components/message/message.html
@@ -2,8 +2,7 @@
@@ -13,8 +12,7 @@
-
+ [contextInstanceId]="instanceId" [courseId]="courseId" />
-
+
-
+
diff --git a/src/core/components/navigation-bar/core-navigation-bar.html b/src/core/components/navigation-bar/core-navigation-bar.html
index 24703b279..3d77826db 100644
--- a/src/core/components/navigation-bar/core-navigation-bar.html
+++ b/src/core/components/navigation-bar/core-navigation-bar.html
@@ -1,16 +1,15 @@
1">
-
+
- = 0">
-
+ = 0" />
= items.length" fill="clear" [attr.aria-label]="nextTitle" (click)="navigate(nextIndex)">
-
+
diff --git a/src/core/components/password-modal/password-modal.html b/src/core/components/password-modal/password-modal.html
index 9a37010a7..95629d7ab 100644
--- a/src/core/components/password-modal/password-modal.html
+++ b/src/core/components/password-modal/password-modal.html
@@ -5,7 +5,7 @@
-
+
@@ -17,12 +17,11 @@
{{ placeholder | translate }}
-
+ placeholder="{{ placeholder | translate }}" [(ngModel)]="password" core-auto-focus [clearOnEdit]="false" />
-
+
diff --git a/src/core/components/progress-bar/core-progress-bar.html b/src/core/components/progress-bar/core-progress-bar.html
index 2739ea78b..5fd316b99 100644
--- a/src/core/components/progress-bar/core-progress-bar.html
+++ b/src/core/components/progress-bar/core-progress-bar.html
@@ -8,4 +8,4 @@
-
+
diff --git a/src/core/components/refresh-button-modal/refresh-button-modal.html b/src/core/components/refresh-button-modal/refresh-button-modal.html
index 58fa174ae..bc7da7b54 100644
--- a/src/core/components/refresh-button-modal/refresh-button-modal.html
+++ b/src/core/components/refresh-button-modal/refresh-button-modal.html
@@ -1,4 +1,4 @@
-
+
{{ 'core.refresh' | translate }}
diff --git a/src/core/components/send-message-form/core-send-message-form.html b/src/core/components/send-message-form/core-send-message-form.html
index dec9430f5..b7d807ffd 100644
--- a/src/core/components/send-message-form/core-send-message-form.html
+++ b/src/core/components/send-message-form/core-send-message-form.html
@@ -7,6 +7,6 @@
-
+
diff --git a/src/core/components/sheet-modal/sheet-modal.html b/src/core/components/sheet-modal/sheet-modal.html
index e5a79c2c8..47f7d9c6a 100644
--- a/src/core/components/sheet-modal/sheet-modal.html
+++ b/src/core/components/sheet-modal/sheet-modal.html
@@ -1,2 +1,2 @@
-
+
diff --git a/src/core/components/show-password/core-show-password.html b/src/core/components/show-password/core-show-password.html
index 5a260c94a..ed3fb385f 100644
--- a/src/core/components/show-password/core-show-password.html
+++ b/src/core/components/show-password/core-show-password.html
@@ -1,5 +1,5 @@
-
+
diff --git a/src/core/components/sites-list/sites-list.html b/src/core/components/sites-list/sites-list.html
index b00d973dd..7ac9a9149 100644
--- a/src/core/components/sites-list/sites-list.html
+++ b/src/core/components/sites-list/sites-list.html
@@ -1,19 +1,19 @@
-
+
-
+
-
+
-
+
-
+
@@ -24,7 +24,7 @@
-
+
@@ -40,17 +40,15 @@
-
+
{{site.fullname}}
-
+ [ngTemplateOutletContext]="{site: site, isCurrentSite: isCurrentSite}" />
-
+ [ngTemplateOutletContext]="{site: site, isCurrentSite: isCurrentSite}" />
diff --git a/src/core/components/split-view/split-view.html b/src/core/components/split-view/split-view.html
index fa61e7011..27aa94ddd 100644
--- a/src/core/components/split-view/split-view.html
+++ b/src/core/components/split-view/split-view.html
@@ -1,6 +1,5 @@
-
-
-
+
+
diff --git a/src/core/components/stories/components/course-image-cards-page/course-image-cards-page.html b/src/core/components/stories/components/course-image-cards-page/course-image-cards-page.html
index 90514a8e3..f1ad00bca 100644
--- a/src/core/components/stories/components/course-image-cards-page/course-image-cards-page.html
+++ b/src/core/components/stories/components/course-image-cards-page/course-image-cards-page.html
@@ -9,7 +9,7 @@
-
+
{{ course.shortname }}
diff --git a/src/core/components/stories/components/course-image-list-page/course-image-list-page.html b/src/core/components/stories/components/course-image-list-page/course-image-list-page.html
index ec47e63fb..f9638bea7 100644
--- a/src/core/components/stories/components/course-image-list-page/course-image-list-page.html
+++ b/src/core/components/stories/components/course-image-list-page/course-image-list-page.html
@@ -9,7 +9,7 @@
-
+
{{ course.shortname }}
diff --git a/src/core/components/stories/components/empty-box-page/empty-box-page.html b/src/core/components/stories/components/empty-box-page/empty-box-page.html
index 9246d8bf6..0bd2c567a 100644
--- a/src/core/components/stories/components/empty-box-page/empty-box-page.html
+++ b/src/core/components/stories/components/empty-box-page/empty-box-page.html
@@ -8,9 +8,8 @@
-
-
-
+
+
diff --git a/src/core/components/stories/components/sites-list-wrapper/sites-list-wrapper.html b/src/core/components/stories/components/sites-list-wrapper/sites-list-wrapper.html
index c51b145ec..a7b72397b 100644
--- a/src/core/components/stories/components/sites-list-wrapper/sites-list-wrapper.html
+++ b/src/core/components/stories/components/sites-list-wrapper/sites-list-wrapper.html
@@ -10,7 +10,7 @@
-
+
diff --git a/src/core/components/swipe-navigation-tour/core-swipe-navigation-tour.html b/src/core/components/swipe-navigation-tour/core-swipe-navigation-tour.html
index 349247d15..d63c3a67e 100644
--- a/src/core/components/swipe-navigation-tour/core-swipe-navigation-tour.html
+++ b/src/core/components/swipe-navigation-tour/core-swipe-navigation-tour.html
@@ -1,4 +1,4 @@
-
+
{{ 'core.swipenavigationtourdescription' | translate }}
{{ 'core.endonesteptour' | translate }}
diff --git a/src/core/components/swipe-slides/swipe-slides.html b/src/core/components/swipe-slides/swipe-slides.html
index 65ab4c92a..d3b02b245 100644
--- a/src/core/components/swipe-slides/swipe-slides.html
+++ b/src/core/components/swipe-slides/swipe-slides.html
@@ -1,6 +1,6 @@
-
-
-
-
-
-
+
+
+
+
+
diff --git a/src/core/components/swipe-slides/swipe-slides.scss b/src/core/components/swipe-slides/swipe-slides.scss
index 90b467e57..4f221edf4 100644
--- a/src/core/components/swipe-slides/swipe-slides.scss
+++ b/src/core/components/swipe-slides/swipe-slides.scss
@@ -1,13 +1,13 @@
:host {
- ion-slides {
+ swiper-container {
height: 100%;
- }
- ion-slide {
- display: block;
- font-size: inherit;
- justify-content: start;
- align-items: start;
- text-align: start;
+ swiper-slide {
+ display: block;
+ font-size: inherit;
+ justify-content: start;
+ align-items: start;
+ text-align: start;
+ }
}
}
diff --git a/src/core/components/swipe-slides/swipe-slides.ts b/src/core/components/swipe-slides/swipe-slides.ts
index e411d6748..a2569739e 100644
--- a/src/core/components/swipe-slides/swipe-slides.ts
+++ b/src/core/components/swipe-slides/swipe-slides.ts
@@ -13,16 +13,17 @@
// limitations under the License.
import {
- Component, ContentChild, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, Output, TemplateRef, ViewChild,
+ Component, ContentChild, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChange, TemplateRef, ViewChild,
} from '@angular/core';
import { CoreSwipeSlidesItemsManager } from '@classes/items-management/swipe-slides-items-manager';
-import { IonContent, IonSlides } from '@ionic/angular';
+import { IonContent } from '@ionic/angular';
import { CoreDomUtils, VerticalPoint } from '@services/utils/dom';
import { CoreUtils } from '@services/utils/utils';
import { CoreDom } from '@singletons/dom';
import { CoreEventObserver } from '@singletons/events';
import { CoreMath } from '@singletons/math';
-
+import { Swiper } from 'swiper';
+import { SwiperOptions } from 'swiper/types';
/**
* Helper component to display swipable slides.
*/
@@ -38,13 +39,31 @@ export class CoreSwipeSlidesComponent- implements OnChanges, OnDe
@Output() onWillChange = new EventEmitter
>();
@Output() onDidChange = new EventEmitter>();
- @ViewChild(IonSlides) slides?: IonSlides;
+ protected swiper?: Swiper;
+ @ViewChild('swiperRef')
+ set swiperRef(swiperRef: ElementRef) {
+ /**
+ * This setTimeout waits for Ionic's async initialization to complete.
+ * Otherwise, an outdated swiper reference will be used.
+ */
+ setTimeout(() => {
+ if (swiperRef?.nativeElement?.swiper) {
+ this.swiper = swiperRef.nativeElement.swiper as Swiper;
+
+ Object.keys(this.options).forEach((key) => {
+ if (this.swiper) {
+ this.swiper.params[key] = this.options[key];
+ }
+ });
+ }
+ }, 0);
+ }
+
@ContentChild(TemplateRef) template?: TemplateRef; // Template defined by the content.
protected hostElement: HTMLElement;
protected unsubscribe?: () => void;
protected resizeListener: CoreEventObserver;
- protected updateSlidesPromise?: Promise;
protected activeSlideIndexes: number[] = [];
constructor(
@@ -53,18 +72,26 @@ export class CoreSwipeSlidesComponent- implements OnChanges, OnDe
) {
this.hostElement = elementRef.nativeElement;
- this.resizeListener = CoreDom.onWindowResize(async () => {
- await this.updateSlidesComponent();
+ this.resizeListener = CoreDom.onWindowResize(() => {
+ this.updateSlidesComponent();
});
}
/**
* @inheritdoc
*/
- ngOnChanges(): void {
+ ngOnChanges(changes: { [name: string]: SimpleChange }): void {
if (!this.unsubscribe && this.manager) {
this.initialize(this.manager);
}
+
+ if (changes.options) {
+ Object.keys(this.options).forEach((key) => {
+ if (this.swiper) {
+ this.swiper.params[key] = this.options[key];
+ }
+ });
+ }
}
get items(): Item[] {
@@ -133,23 +160,20 @@ export class CoreSwipeSlidesComponent
- implements OnChanges, OnDe
* @param speed Animation speed.
* @param runCallbacks Whether to run callbacks.
*/
- async slideToIndex(index: number, speed?: number, runCallbacks?: boolean): Promise
{
+ slideToIndex(index: number, speed?: number, runCallbacks?: boolean): void {
// If slides are being updated, wait for the update to finish.
- await this.updateSlidesPromise;
-
- const slides = this.slides;
- if (!slides) {
+ if (!this.swiper) {
return;
}
// Verify that the number of slides matches the number of items.
- const slidesLength = await slides.length();
+ const slidesLength = this.swiper.slides.length;
if (slidesLength !== this.items.length) {
// Number doesn't match, do a new update to try to match them.
- await this.updateSlidesComponent();
+ this.updateSlidesComponent();
}
- this.slides?.slideTo(index, speed, runCallbacks);
+ this.swiper?.slideTo(index, speed, runCallbacks);
}
/**
@@ -173,7 +197,7 @@ export class CoreSwipeSlidesComponent- implements OnChanges, OnDe
* @param runCallbacks Whether to run callbacks.
*/
slideNext(speed?: number, runCallbacks?: boolean): void {
- this.slides?.slideNext(speed, runCallbacks);
+ this.swiper?.slideNext(speed, runCallbacks);
}
/**
@@ -183,7 +207,7 @@ export class CoreSwipeSlidesComponent
- implements OnChanges, OnDe
* @param runCallbacks Whether to run callbacks.
*/
slidePrev(speed?: number, runCallbacks?: boolean): void {
- this.slides?.slidePrev(speed, runCallbacks);
+ this.swiper?.slidePrev(speed, runCallbacks);
}
/**
@@ -194,7 +218,7 @@ export class CoreSwipeSlidesComponent
- implements OnChanges, OnDe
await CoreUtils.nextTick();
// Update the slides component so the slides list reflects the new items.
- await this.updateSlidesComponent();
+ this.updateSlidesComponent();
const currentItem = this.manager?.getSelectedItem();
@@ -205,7 +229,7 @@ export class CoreSwipeSlidesComponent
- implements OnChanges, OnDe
// Keep the same slide in case the list has changed.
const newIndex = this.manager.getSource().getItemIndex(currentItem) ?? -1;
if (newIndex != -1) {
- this.slides?.slideTo(newIndex, 0, false);
+ this.swiper?.slideTo(newIndex, 0, false);
}
}
@@ -270,11 +294,11 @@ export class CoreSwipeSlidesComponent
- implements OnChanges, OnDe
* @returns Promise resolved with current item data. Null if not found.
*/
protected async getCurrentSlideItemData(): Promise
| null> {
- if (!this.slides || !this.manager) {
+ if (!this.swiper || !this.manager) {
return null;
}
- const index = await this.slides.getActiveIndex();
+ const index = this.swiper.activeIndex;
const items = this.manager.getSource().getItems();
const currentItem = items && items[index];
@@ -291,19 +315,8 @@ export class CoreSwipeSlidesComponent- implements OnChanges, OnDe
/**
* Update slides component.
*/
- protected async updateSlidesComponent(): Promise
{
- if (!this.slides) {
- return;
- }
-
- const promise = this.slides.update();
- this.updateSlidesPromise = promise;
-
- await promise;
-
- if (this.updateSlidesPromise === promise) {
- delete this.updateSlidesPromise;
- }
+ updateSlidesComponent(): void {
+ this.swiper?.update();
}
/**
@@ -321,8 +334,7 @@ export class CoreSwipeSlidesComponent- implements OnChanges, OnDe
*
* @todo Change unknown with the right type once Swiper library is used.
*/
-export type CoreSwipeSlidesOptions = Record
& {
- initialSlide?: number;
+export type CoreSwipeSlidesOptions = SwiperOptions & {
scrollOnChange?: 'top' | 'none'; // Scroll behaviour on change slide. By default, none.
};
diff --git a/src/core/components/tabs-outlet/core-tabs-outlet.html b/src/core/components/tabs-outlet/core-tabs-outlet.html
index 0f2af04ea..1819ef577 100644
--- a/src/core/components/tabs-outlet/core-tabs-outlet.html
+++ b/src/core/components/tabs-outlet/core-tabs-outlet.html
@@ -1,20 +1,20 @@
@@ -50,14 +47,13 @@
-
+ [instanceId]="course.id" />
-
+
{{'core.course.courseindex' | translate }}
@@ -70,8 +66,7 @@
-
-
+
@@ -85,10 +80,9 @@
-
+
-
-
+
@@ -98,8 +92,7 @@
-
-
+
@@ -107,8 +100,7 @@
-
+ !viewedModules[module.id] && (!module.completiondata || module.completiondata.state === completionStatusIncomplete)" />
diff --git a/src/core/features/course/components/course-index/course-index.html b/src/core/features/course/components/course-index/course-index.html
index efc764d56..74fbd8a65 100644
--- a/src/core/features/course/components/course-index/course-index.html
+++ b/src/core/features/course/components/course-index/course-index.html
@@ -5,7 +5,7 @@
-
+
@@ -19,8 +19,7 @@
[detail]="false">
-
-
+
@@ -32,23 +31,21 @@
class="expandable-status-icon" (ariaButtonClick)="toggleExpand($event, section)"
[attr.aria-label]="(section.expanded ? 'core.collapse' : 'core.expand') | translate"
[attr.aria-expanded]="section.expanded" [attr.aria-controls]="'core-course-index-section-' + section.id"
- [class.expandable-status-icon-expanded]="section.expanded">
-
-
-
+ [class.expandable-status-icon-expanded]="section.expanded" />
+
-
-
+
{{highlighted}}
+ [attr.aria-label]="'core.restricted' | translate" />
+ [attr.aria-label]="'core.notavailable' | translate" />
+ [attr.aria-label]="'core.course.hiddenfromstudents' | translate" />
@@ -57,27 +54,23 @@
[class.item-hightlighted]="section.highlighted"
(click)="selectSectionOrModule($event, section.id, module.id)" button>
+ slot="start" aria-hidden="true" />
-
+ [attr.aria-label]="'core.course.todo' | translate" />
-
+ [attr.aria-label]="'core.course.done' | translate" />
-
+ color="danger" slot="start" [attr.aria-label]="'core.course.failed' | translate" />
-
+ [courseId]="module.course" />
+ [attr.aria-label]="'core.restricted' | translate" />
diff --git a/src/core/features/course/components/module-completion-details/module-completion-details.html b/src/core/features/course/components/module-completion-details/module-completion-details.html
index 6ef5932eb..3d1805068 100644
--- a/src/core/features/course/components/module-completion-details/module-completion-details.html
+++ b/src/core/features/course/components/module-completion-details/module-completion-details.html
@@ -10,19 +10,19 @@
-
+
{{ 'core.course.completion_automatic:done' | translate }}
{{ rule.rulevalue.description }}
-
+
{{ 'core.course.completion_automatic:failed' | translate }}
{{ rule.rulevalue.description }}
-
+
{{ 'core.course.completion_automatic:todo' | translate }}
{{ rule.rulevalue.description }}
@@ -30,14 +30,14 @@
-
+
{{ rule.rulevalue.description }}
-
+
{{ 'core.course.completion_manual:markdone' | translate }}
diff --git a/src/core/features/course/components/module-completion/core-course-module-completion.html b/src/core/features/course/components/module-completion/core-course-module-completion.html
index 363b382bb..3162f135f 100644
--- a/src/core/features/course/components/module-completion/core-course-module-completion.html
+++ b/src/core/features/course/components/module-completion/core-course-module-completion.html
@@ -11,7 +11,7 @@
-
+
{{'core.course.done' | translate }}
@@ -22,16 +22,16 @@
-
+
{{ 'core.course.completion_manual:done' | translate }}
+ [attr.aria-label]="'core.course.manualcompletionnotsynced' | translate" slot="end" />
{{ 'core.course.completion_manual:markdone' | translate }}
+ [attr.aria-label]="'core.course.manualcompletionnotsynced' | translate" slot="end" />
diff --git a/src/core/features/course/components/module-description/core-course-module-description.html b/src/core/features/course/components/module-description/core-course-module-description.html
index 0ada00665..73b336347 100644
--- a/src/core/features/course/components/module-description/core-course-module-description.html
+++ b/src/core/features/course/components/module-description/core-course-module-description.html
@@ -2,8 +2,7 @@
-
+ [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId" [courseId]="courseId" />
diff --git a/src/core/features/course/components/module-info/core-course-module-info.html b/src/core/features/course/components/module-info/core-course-module-info.html
index 1ace5ddc0..e6674bba1 100644
--- a/src/core/features/course/components/module-info/core-course-module-info.html
+++ b/src/core/features/course/components/module-info/core-course-module-info.html
@@ -1,13 +1,11 @@
-
-
+
-
+ [contextInstanceId]="module.id" [courseId]="courseId" />
+ [attr.aria-label]="'core.restricted' | translate" />
@@ -19,28 +17,25 @@
module.completiondata && (module.completiondata.isautomatic || (showManualCompletion && module.uservisible))">
-
+ (completionChanged)="completionChanged.emit($event)" />
-
+ [label]="date.label" [time]="date.timestamp" [relativeTo]="date.relativeto" [title]="module.name" [url]="module.url" />
-
-
-
+
+
-
+ [contextInstanceId]="module.id" [courseId]="courseId" [collapsible-item]="expandDescription ? null : ''" />
@@ -50,7 +45,7 @@
-
+
{{ 'core.hasdatatosync' | translate: {$a: moduleNameTranslated} }}
diff --git a/src/core/features/course/components/module-manual-completion/core-course-module-manual-completion.html b/src/core/features/course/components/module-manual-completion/core-course-module-manual-completion.html
index 837781567..928f43f99 100644
--- a/src/core/features/course/components/module-manual-completion/core-course-module-manual-completion.html
+++ b/src/core/features/course/components/module-manual-completion/core-course-module-manual-completion.html
@@ -2,16 +2,16 @@
-
+
{{ 'core.course.completion_manual:done' | translate }}
+ [attr.aria-label]="'core.course.manualcompletionnotsynced' | translate" slot="end" />
{{ 'core.course.completion_manual:markdone' | translate }}
+ [attr.aria-label]="'core.course.manualcompletionnotsynced' | translate" slot="end" />
diff --git a/src/core/features/course/components/module-navigation/core-course-module-navigation.html b/src/core/features/course/components/module-navigation/core-course-module-navigation.html
index 67afb3dc5..e31a325ab 100644
--- a/src/core/features/course/components/module-navigation/core-course-module-navigation.html
+++ b/src/core/features/course/components/module-navigation/core-course-module-navigation.html
@@ -3,14 +3,14 @@
-
+
{{ 'core.course.previousactivity' | translate }}
{{ 'core.course.nextactivity' | translate }}
-
+
diff --git a/src/core/features/course/components/module-summary/module-summary.html b/src/core/features/course/components/module-summary/module-summary.html
index 0d6d0e6b6..9d862340d 100644
--- a/src/core/features/course/components/module-summary/module-summary.html
+++ b/src/core/features/course/components/module-summary/module-summary.html
@@ -2,7 +2,7 @@
-
+
@@ -15,31 +15,28 @@
-
+ [fallbackTranslation]="module.modplural" />
{{moduleNameTranslated}}
-
+ [contextInstanceId]="module.id" [courseId]="courseId" />
-
+
-
+
{{ 'core.course' | translate}}
-
-
+
@@ -50,8 +47,7 @@
{{ 'core.description' | translate}}
-
+ [contextInstanceId]="module.id" [courseId]="courseId" collapsible-item />
@@ -60,7 +56,7 @@
0 && grade.weight !== '-'">
@@ -138,8 +131,7 @@
{{ 'core.grades.feedback' | translate}}
-
+ [contextInstanceId]="courseId" />
@@ -160,7 +152,7 @@
@@ -183,8 +175,8 @@
-
-
+
+
{{ 'core.download' | translate }}
@@ -192,7 +184,7 @@
-
+
{{ 'addon.blog.blog' | translate }}
@@ -201,14 +193,14 @@
-
+
{{ 'core.refresh' | translate }}
-
+
{{ 'core.settings.synchronizenow' | translate }}
diff --git a/src/core/features/course/components/module/core-course-module.html b/src/core/features/course/components/module/core-course-module.html
index b1f674f9f..d4f3da3c6 100644
--- a/src/core/features/course/components/module/core-course-module.html
+++ b/src/core/features/course/components/module/core-course-module.html
@@ -8,27 +8,25 @@
-
+ [componentId]="module.instance" [fallbackTranslation]="module.modplural" />
-
+ [courseId]="module.course" [attr.aria-label]="module.handlerData.a11yTitle + ', ' + modNameTranslated" />
+ [attr.aria-label]="'core.restricted' | translate" />
+ [attr.aria-label]="((prefetchStatusText$ | async) || '') | translate" />
-
+
{{ 'core.course.hiddenfromstudents' | translate }}
-
+
{{ 'core.course.hiddenoncoursepage' | translate }}
@@ -38,20 +36,18 @@
-
+ (completionChanged)="completionChanged.emit($event)" />
-
+ [showManualCompletion]="showManualCompletion" (completionChanged)="completionChanged.emit($event)" />
-
+
@@ -59,7 +55,7 @@
*ngIf="!module.handlerData.button && module.handlerData.buttons && module.handlerData.buttons[0]"
[hidden]="module.handlerData.buttons[0].hidden || module.handlerData.spinner" (click)="buttonClicked($event)"
[attr.aria-label]="module.handlerData.buttons[0].label | translate:{$a: module.handlerData.title}">
-
+
@@ -67,31 +63,27 @@
+ (completionChanged)="completionChanged.emit($event)" />
@@ -102,7 +94,7 @@
-
+
{{ 'core.course.lastaccessedactivity' | translate }}
@@ -111,7 +103,7 @@
-
+
diff --git a/src/core/features/course/components/tag-area/core-course-tag-area.html b/src/core/features/course/components/tag-area/core-course-tag-area.html
index 4fc9e95a8..efaffb04e 100644
--- a/src/core/features/course/components/tag-area/core-course-tag-area.html
+++ b/src/core/features/course/components/tag-area/core-course-tag-area.html
@@ -1,6 +1,6 @@
-
+
{{ item.courseName }}
{{ 'core.category' | translate }}: {{ item.categoryName }}
diff --git a/src/core/features/course/components/unsupported-module/core-course-unsupported-module.html b/src/core/features/course/components/unsupported-module/core-course-unsupported-module.html
index 5503b295f..0c24606d1 100644
--- a/src/core/features/course/components/unsupported-module/core-course-unsupported-module.html
+++ b/src/core/features/course/components/unsupported-module/core-course-unsupported-module.html
@@ -1,7 +1,7 @@
-
+
{{ 'core.uhoh' | translate }}
{{ 'core.course.activitydisabled' | translate }}
@@ -18,7 +18,7 @@
{{ 'core.course.useactivityonbrowser' | translate }}
{{ 'core.openinbrowser' | translate }}
-
+
diff --git a/src/core/features/course/format/singleactivity/components/core-course-format-single-activity.html b/src/core/features/course/format/singleactivity/components/core-course-format-single-activity.html
index 342f17c3e..2e960aa88 100644
--- a/src/core/features/course/format/singleactivity/components/core-course-format-single-activity.html
+++ b/src/core/features/course/format/singleactivity/components/core-course-format-single-activity.html
@@ -1,3 +1,3 @@
-
+
diff --git a/src/core/features/course/pages/contents/contents.html b/src/core/features/course/pages/contents/contents.html
index 30246dd99..b5dd06beb 100644
--- a/src/core/features/course/pages/contents/contents.html
+++ b/src/core/features/course/pages/contents/contents.html
@@ -1,12 +1,11 @@
-
+
-
+ *ngIf="dataLoaded && sections" [isGuest]="isGuest" />
diff --git a/src/core/features/course/pages/course-summary/course-summary.html b/src/core/features/course/pages/course-summary/course-summary.html
index bded5b685..bf8bd280a 100644
--- a/src/core/features/course/pages/course-summary/course-summary.html
+++ b/src/core/features/course/pages/course-summary/course-summary.html
@@ -1,26 +1,24 @@
-
+
-
-
+
-
+
-
+
-
-
+
@@ -28,43 +26,37 @@
-
-
+
{{ 'core.courses.aria:coursename' | translate }}
-
-
+
{{ 'core.courses.aria:coursecategory' | translate }}
-
+ [contextInstanceId]="course.categoryid" />
-
+
-
-
+
-
+ [url]="courseUrl" />
-
+ [url]="courseUrl" />
@@ -74,8 +66,7 @@
{{'core.course.coursesummary' | translate}}
-
-
+
@@ -83,8 +74,7 @@
= 5" class="ion-text-wrap" (click)="toggleContacts()"
[attr.aria-label]="(contactsExpanded ? 'core.collapse' : 'core.expand') | translate" [detail]="false">
= 5" name="fas-chevron-right" flip-rtl slot="start" aria-hidden="true"
- class="expandable-status-icon" [class.expandable-status-icon-expanded]="contactsExpanded">
-
+ class="expandable-status-icon" [class.expandable-status-icon-expanded]="contactsExpanded" />
{{ 'core.teachers' | translate }}
@@ -95,14 +85,13 @@
-
+ [linkProfile]="false" />
{{contact.fullname}}
-
+
@@ -111,14 +100,12 @@
-
-
+
:
-
+ contextLevel="course" [contextInstanceId]="course.id" />
@@ -134,7 +121,7 @@
-
+
{{item.data.title | translate }}
@@ -145,13 +132,13 @@
-
+
{{ 'core.courses.notenrollable' | translate }}
-
+
{{ 'core.course.viewcourse' | translate }}
diff --git a/src/core/features/course/pages/index/index.html b/src/core/features/course/pages/index/index.html
index a07c35d1d..5b17a3397 100644
--- a/src/core/features/course/pages/index/index.html
+++ b/src/core/features/course/pages/index/index.html
@@ -1,20 +1,20 @@
-
+
-
+
-
+
-
+
@@ -22,8 +22,7 @@
-
-
+
@@ -32,13 +31,12 @@
-
+
-
-
+
-
+
diff --git a/src/core/features/course/pages/list-mod-type/list-mod-type.html b/src/core/features/course/pages/list-mod-type/list-mod-type.html
index 92d8c00f1..ce6264820 100644
--- a/src/core/features/course/pages/list-mod-type/list-mod-type.html
+++ b/src/core/features/course/pages/list-mod-type/list-mod-type.html
@@ -1,7 +1,7 @@
-
+
{{ title }}
@@ -10,11 +10,11 @@
-
+
-
-
+
@@ -22,19 +22,17 @@
-
-
+
-
+ [showExtra]="false" [showDownloadStatus]="false" [showCompletion]="false" [showIndentation]="false" />
-
+
diff --git a/src/core/features/course/pages/module-preview/module-preview.html b/src/core/features/course/pages/module-preview/module-preview.html
index c6e3cb528..95c3f03e1 100644
--- a/src/core/features/course/pages/module-preview/module-preview.html
+++ b/src/core/features/course/pages/module-preview/module-preview.html
@@ -1,29 +1,28 @@
-
+
-
-
+
-
+
-
+
-
+
-
+
{{ 'core.course.hiddenfromstudents' | translate }}
-
+
{{ 'core.course.hiddenoncoursepage' | translate }}
-
+
-
-
+
diff --git a/src/core/features/courses/components/course-list-item/core-courses-course-list-item.html b/src/core/features/courses/components/course-list-item/core-courses-course-list-item.html
index b823ac7ae..777234016 100644
--- a/src/core/features/courses/components/course-list-item/core-courses-course-list-item.html
+++ b/src/core/features/courses/components/course-list-item/core-courses-course-list-item.html
@@ -4,26 +4,25 @@
-
-
+
+ [loading]="prefetchCourseData.loading" (action)="prefetchCourse()" />
-
+
-
+
@@ -31,8 +30,7 @@
-
+ aria-hidden="true" />
@@ -42,35 +40,30 @@
-
-
+
-
-
+
{{ 'core.courses.aria:favourite' | translate }}
{{ 'core.courses.aria:coursename' | translate }}
-
-
+
-
+ [attr.aria-label]="icon.label | translate" [ngClass]="[icon.className]" />
+ color="success" role="status" [attr.aria-label]="'core.downloaded' | translate" />
{{ 'core.courses.aria:coursecategory' | translate }}
-
-
+
@@ -84,7 +77,7 @@
= 0 && completionUserTracked !== false"
class="core-course-progress">
-
+
diff --git a/src/core/features/courses/components/course-options-menu/core-courses-course-options-menu.html b/src/core/features/courses/components/course-options-menu/core-courses-course-options-menu.html
index c7eb710b3..044336685 100644
--- a/src/core/features/courses/components/course-options-menu/core-courses-course-options-menu.html
+++ b/src/core/features/courses/components/course-options-menu/core-courses-course-options-menu.html
@@ -1,39 +1,39 @@
-
-
+
+
{{ prefetch.statusTranslatable | translate }}
-
+
{{ 'addon.storagemanager.deletedata' | translate }}
-
+
{{ 'core.courses.hidecourse' | translate }}
-
+
{{ 'core.courses.show' | translate }}
-
+
{{ 'core.courses.addtofavourites' | translate }}
-
+
{{ 'core.courses.removefromfavourites' | translate }}
diff --git a/src/core/features/courses/components/course-progress/core-courses-course-progress.html b/src/core/features/courses/components/course-progress/core-courses-course-progress.html
index 9e0388ac8..94f024f2c 100644
--- a/src/core/features/courses/components/course-progress/core-courses-course-progress.html
+++ b/src/core/features/courses/components/course-progress/core-courses-course-progress.html
@@ -1,3 +1,2 @@
-
+ [layout]="showAll ? 'card' : 'summarycard'" />
diff --git a/src/core/features/courses/pages/categories/categories.html b/src/core/features/courses/pages/categories/categories.html
index bdc86b61d..09e2de396 100644
--- a/src/core/features/courses/pages/categories/categories.html
+++ b/src/core/features/courses/pages/categories/categories.html
@@ -1,41 +1,39 @@
-
+
-
-
+
+ [(toggle)]="downloadEnabled" />
+ iconAction="toggle" [(toggle)]="showOnlyEnrolled" />
-
+
-
+
-
-
+
+ [contextInstanceId]="currentCategory.id" />
@@ -49,11 +47,10 @@
-
+
-
-
+
0" color="light">
@@ -71,12 +68,10 @@
{{ 'core.courses.mycourses' | translate }}
-
-
+
-
+ [message]="'core.courses.nocoursesyet' | translate" />
diff --git a/src/core/features/courses/pages/dashboard/dashboard.html b/src/core/features/courses/pages/dashboard/dashboard.html
index 1d9fbece3..c1e4865f4 100644
--- a/src/core/features/courses/pages/dashboard/dashboard.html
+++ b/src/core/features/courses/pages/dashboard/dashboard.html
@@ -1,24 +1,22 @@
-
+
-
+
-
+
-
-
+
-
-
+
diff --git a/src/core/features/courses/pages/list/list.html b/src/core/features/courses/pages/list/list.html
index 562940ca4..47b406bc2 100644
--- a/src/core/features/courses/pages/list/list.html
+++ b/src/core/features/courses/pages/list/list.html
@@ -1,7 +1,7 @@
-
+
{{ 'core.courses.availablecourses' | translate }}
@@ -11,22 +11,22 @@
+ [(toggle)]="downloadEnabled" />
+ iconAction="toggle" [(toggle)]="showOnlyEnrolled" />
-
+
-
+
+ searchArea="CoreCoursesSearch" />
0">
@@ -38,20 +38,16 @@
-
-
+
-
-
+
-
+ [message]="'core.courses.nosearchresults' | translate" />
-
-
+
diff --git a/src/core/features/courses/pages/my/my.html b/src/core/features/courses/pages/my/my.html
index 83cc1fd54..de4cf18de 100644
--- a/src/core/features/courses/pages/my/my.html
+++ b/src/core/features/courses/pages/my/my.html
@@ -1,23 +1,22 @@
-
+
-
+
-
+
-
+
@@ -31,8 +30,7 @@
-
-
+
{{myOverviewBlock.prefetchCoursesData.badge}}
-
-
+
+ labelledBy="core-courses-my-title" />
-
+ [myDashboardPage]="myPageCourses" />
-
-
+
diff --git a/src/core/features/editor/components/components.module.ts b/src/core/features/editor/components/components.module.ts
index 3c46c84a7..8bc9e4105 100644
--- a/src/core/features/editor/components/components.module.ts
+++ b/src/core/features/editor/components/components.module.ts
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { NgModule } from '@angular/core';
+import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { CoreEditorRichTextEditorComponent } from './rich-text-editor/rich-text-editor';
import { CoreSharedModule } from '@/core/shared.module';
@@ -29,5 +29,6 @@ import { CoreSharedModule } from '@/core/shared.module';
exports: [
CoreEditorRichTextEditorComponent,
],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class CoreEditorComponentsModule {}
diff --git a/src/core/features/editor/components/rich-text-editor/core-editor-rich-text-editor.html b/src/core/features/editor/components/rich-text-editor/core-editor-rich-text-editor.html
index 2d260dbd3..3e8d4cd0b 100644
--- a/src/core/features/editor/components/rich-text-editor/core-editor-rich-text-editor.html
+++ b/src/core/features/editor/components/rich-text-editor/core-editor-rich-text-editor.html
@@ -6,11 +6,10 @@
-
+ [placeholder]="placeholder" (ionChange)="onChange()" (ionFocus)="showToolbar($event)" (ionBlur)="hideToolbar($event)" />
-
+
{{ infoMessage | translate }}
@@ -19,108 +18,108 @@
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
- 3
+ 3
-
-
+
+
- 4
+ 4
-
-
+
+
- 5
+ 5
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
diff --git a/src/core/features/editor/components/rich-text-editor/rich-text-editor.scss b/src/core/features/editor/components/rich-text-editor/rich-text-editor.scss
index 150441cdf..f75d17f41 100644
--- a/src/core/features/editor/components/rich-text-editor/rich-text-editor.scss
+++ b/src/core/features/editor/components/rich-text-editor/rich-text-editor.scss
@@ -108,7 +108,7 @@
padding-top: 5px;
border-top: 1px solid var(--stroke);
- ion-slides {
+ swiper-container {
width: 240px;
flex-grow: 1;
flex-shrink: 1;
diff --git a/src/core/features/editor/components/rich-text-editor/rich-text-editor.ts b/src/core/features/editor/components/rich-text-editor/rich-text-editor.ts
index 74bf1f1f5..2d54bd8f6 100644
--- a/src/core/features/editor/components/rich-text-editor/rich-text-editor.ts
+++ b/src/core/features/editor/components/rich-text-editor/rich-text-editor.ts
@@ -25,7 +25,7 @@ import {
AfterViewInit,
} from '@angular/core';
import { FormControl } from '@angular/forms';
-import { IonTextarea, IonContent, IonSlides } from '@ionic/angular';
+import { IonTextarea, IonContent, IonicSlides } from '@ionic/angular';
import { Subscription } from 'rxjs';
import { CoreSites } from '@services/sites';
@@ -42,6 +42,8 @@ import { CoreScreen } from '@services/screen';
import { CoreCancellablePromise } from '@classes/cancellable-promise';
import { CoreDom } from '@singletons/dom';
import { CorePlatform } from '@services/platform';
+import { Swiper } from 'swiper';
+import { SwiperOptions } from 'swiper/types';
/**
* Component to display a rich text editor if enabled.
@@ -78,7 +80,27 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
@ViewChild('editor') editor?: ElementRef; // WYSIWYG editor.
@ViewChild('textarea') textarea?: IonTextarea; // Textarea editor.
@ViewChild('toolbar') toolbar?: ElementRef;
- @ViewChild(IonSlides) toolbarSlides?: IonSlides;
+ protected toolbarSlides?: Swiper;
+ @ViewChild('swiperRef')
+ set swiperRef(swiperRef: ElementRef) {
+ /**
+ * This setTimeout waits for Ionic's async initialization to complete.
+ * Otherwise, an outdated swiper reference will be used.
+ */
+ setTimeout(() => {
+ if (swiperRef.nativeElement?.swiper) {
+ this.toolbarSlides = swiperRef.nativeElement.swiper as Swiper;
+
+ this.toolbarSlides.changeLanguageDirection(CorePlatform.isRTL ? 'rtl' : 'ltr');
+
+ Object.keys(this.swiperOpts).forEach((key) => {
+ if (this.toolbarSlides) {
+ this.toolbarSlides.params[key] = this.swiperOpts[key];
+ }
+ });
+ }
+ }, 0);
+ }
protected readonly DRAFT_AUTOSAVE_FREQUENCY = 30000;
protected readonly RESTORE_MESSAGE_CLEAR_TIME = 6000;
@@ -119,7 +141,6 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
canScanQR = false;
ariaLabelledBy?: string;
infoMessage?: string;
- direction = 'ltr';
toolbarStyles = {
strong: 'false',
em: 'false',
@@ -133,11 +154,11 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
ol: 'false',
};
- slidesOpts = {
- initialSlide: 0,
+ swiperOpts: SwiperOptions = {
+ modules: [IonicSlides],
slidesPerView: 6,
centerInsufficientSlides: true,
- watchSlidesVisibility: true,
+ watchSlidesProgress: true,
};
constructor(
@@ -156,7 +177,6 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
this.canScanQR = CoreUtils.canScanQR();
this.isPhone = CoreScreen.isMobile;
this.toolbarHidden = this.isPhone;
- this.direction = CorePlatform.isRTL ? 'rtl' : 'ltr';
}
/**
@@ -265,7 +285,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
// Change the side when the language changes.
this.languageChangedSubscription = Translate.onLangChange.subscribe(() => {
setTimeout(() => {
- this.direction = CorePlatform.isRTL ? 'rtl' : 'ltr';
+ this.toolbarSlides?.changeLanguageDirection(CorePlatform.isRTL ? 'rtl' : 'ltr');
});
});
}
@@ -656,8 +676,8 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
/**
* Replace tags for a11y.
*
- * @param originTag Origin tags to be replaced.
- * @param destinationTag Destination tags to replace.
+ * @param originTags Origin tags to be replaced.
+ * @param destinationTags Destination tags to replace.
*/
protected replaceTags(originTags: string[], destinationTags: string[]): void {
if (!this.editorElement) {
@@ -774,8 +794,8 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
this.stopBubble(event);
if (!this.toolbarNextHidden) {
- const currentIndex = await this.toolbarSlides?.getActiveIndex();
- this.toolbarSlides?.slideTo((currentIndex || 0) + this.slidesOpts.slidesPerView);
+ const currentIndex = this.toolbarSlides?.activeIndex;
+ this.toolbarSlides?.slideTo((currentIndex || 0) + this.toolbarSlides.slidesPerViewDynamic());
}
await this.updateToolbarArrows();
@@ -792,8 +812,8 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
this.stopBubble(event);
if (!this.toolbarPrevHidden) {
- const currentIndex = await this.toolbarSlides?.getActiveIndex();
- this.toolbarSlides?.slideTo((currentIndex || 0) - this.slidesOpts.slidesPerView);
+ const currentIndex = this.toolbarSlides?.activeIndex;
+ this.toolbarSlides?.slideTo((currentIndex || 0) - this.toolbarSlides.slidesPerViewDynamic());
}
await this.updateToolbarArrows();
@@ -808,7 +828,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
return;
}
- const length = await this.toolbarSlides.length();
+ const length = this.toolbarSlides.slides.length;
// Cancel previous one, if any.
this.buttonsDomPromise?.cancel();
@@ -818,17 +838,16 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
const width = this.toolbar.nativeElement.getBoundingClientRect().width;
if (length > 0 && width > length * this.toolbarButtonWidth) {
- this.slidesOpts = { ...this.slidesOpts, slidesPerView: length };
+ this.swiperOpts.slidesPerView = length;
this.toolbarArrows = false;
} else {
- const slidesPerView = Math.floor((width - this.toolbarArrowWidth * 2) / this.toolbarButtonWidth);
- this.slidesOpts = { ...this.slidesOpts, slidesPerView };
+ this.swiperOpts.slidesPerView = Math.floor((width - this.toolbarArrowWidth * 2) / this.toolbarButtonWidth);
this.toolbarArrows = true;
}
await CoreUtils.nextTick();
- await this.toolbarSlides.update();
+ this.toolbarSlides.update();
await this.updateToolbarArrows();
}
@@ -841,10 +860,10 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit,
return;
}
- const currentIndex = await this.toolbarSlides.getActiveIndex();
- const length = await this.toolbarSlides.length();
+ const currentIndex = this.toolbarSlides.activeIndex;
+ const length = this.toolbarSlides.slides.length;
this.toolbarPrevHidden = currentIndex <= 0;
- this.toolbarNextHidden = currentIndex + this.slidesOpts.slidesPerView >= length;
+ this.toolbarNextHidden = currentIndex + this.toolbarSlides.slidesPerViewDynamic() >= length;
}
/**
diff --git a/src/core/features/emulator/classes/sqlitedb.ts b/src/core/features/emulator/classes/sqlitedb.ts
index 9111fd84b..f0243ba6f 100644
--- a/src/core/features/emulator/classes/sqlitedb.ts
+++ b/src/core/features/emulator/classes/sqlitedb.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { SQLiteDB } from '@classes/sqlitedb';
-import { DbTransaction, SQLiteObject } from '@ionic-native/sqlite/ngx';
+import { DbTransaction, SQLiteObject } from '@awesome-cordova-plugins/sqlite/ngx';
import { CoreDB } from '@services/db';
/**
diff --git a/src/core/features/emulator/components/capture-media/capture-media.html b/src/core/features/emulator/components/capture-media/capture-media.html
index a33ca161c..a3b55675d 100644
--- a/src/core/features/emulator/components/capture-media/capture-media.html
+++ b/src/core/features/emulator/components/capture-media/capture-media.html
@@ -31,21 +31,20 @@
-
+
-
-
-
+
+
+
-
+
-
+ (onEnd)="stopCapturing()" />
diff --git a/src/core/features/emulator/components/capture-media/capture-media.ts b/src/core/features/emulator/components/capture-media/capture-media.ts
index 34f9390e9..dfa829888 100644
--- a/src/core/features/emulator/components/capture-media/capture-media.ts
+++ b/src/core/features/emulator/components/capture-media/capture-media.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Component, OnInit, OnDestroy, ViewChild, ElementRef, ChangeDetectorRef, Input } from '@angular/core';
-import { MediaFile } from '@ionic-native/media-capture/ngx';
+import { MediaFile } from '@awesome-cordova-plugins/media-capture/ngx';
import { CoreFile, CoreFileProvider } from '@services/file';
import { CoreDomUtils } from '@services/utils/dom';
diff --git a/src/core/features/emulator/emulator.module.ts b/src/core/features/emulator/emulator.module.ts
index e82936fe0..a5436fa31 100644
--- a/src/core/features/emulator/emulator.module.ts
+++ b/src/core/features/emulator/emulator.module.ts
@@ -18,16 +18,16 @@ import { CoreEmulatorHelper } from './services/emulator-helper';
import { CoreEmulatorComponentsModule } from './components/components.module';
// Ionic Native services.
-import { Camera } from '@ionic-native/camera/ngx';
-import { Clipboard } from '@ionic-native/clipboard/ngx';
-import { File } from '@ionic-native/file/ngx';
-import { FileOpener } from '@ionic-native/file-opener/ngx';
-import { FileTransfer } from '@ionic-native/file-transfer/ngx';
-import { Geolocation } from '@ionic-native/geolocation/ngx';
-import { InAppBrowser } from '@ionic-native/in-app-browser/ngx';
-import { LocalNotifications } from '@ionic-native/local-notifications/ngx';
-import { MediaCapture } from '@ionic-native/media-capture/ngx';
-import { Zip } from '@ionic-native/zip/ngx';
+import { Camera } from '@awesome-cordova-plugins/camera/ngx';
+import { Clipboard } from '@awesome-cordova-plugins/clipboard/ngx';
+import { File } from '@awesome-cordova-plugins/file/ngx';
+import { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx';
+import { FileTransfer } from '@awesome-cordova-plugins/file-transfer/ngx';
+import { Geolocation } from '@awesome-cordova-plugins/geolocation/ngx';
+import { InAppBrowser } from '@awesome-cordova-plugins/in-app-browser/ngx';
+import { LocalNotifications } from '@awesome-cordova-plugins/local-notifications/ngx';
+import { MediaCapture } from '@awesome-cordova-plugins/media-capture/ngx';
+import { Zip } from '@awesome-cordova-plugins/zip/ngx';
// Mock services.
import { CameraMock } from './services/camera';
diff --git a/src/core/features/emulator/services/camera.ts b/src/core/features/emulator/services/camera.ts
index 5718ca7a3..871fc2235 100644
--- a/src/core/features/emulator/services/camera.ts
+++ b/src/core/features/emulator/services/camera.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { Camera, CameraOptions } from '@ionic-native/camera/ngx';
+import { Camera, CameraOptions } from '@awesome-cordova-plugins/camera/ngx';
import { CoreEmulatorCaptureHelper } from './capture-helper';
diff --git a/src/core/features/emulator/services/capture-helper.ts b/src/core/features/emulator/services/capture-helper.ts
index 42c0288a5..e984b3cb4 100644
--- a/src/core/features/emulator/services/capture-helper.ts
+++ b/src/core/features/emulator/services/capture-helper.ts
@@ -13,8 +13,8 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { CameraOptions } from '@ionic-native/camera/ngx';
-import { CaptureImageOptions, CaptureVideoOptions, MediaFile } from '@ionic-native/media-capture/ngx';
+import { CameraOptions } from '@awesome-cordova-plugins/camera/ngx';
+import { CaptureImageOptions, CaptureVideoOptions, MediaFile } from '@awesome-cordova-plugins/media-capture/ngx';
import { CoreMimetypeUtils } from '@services/utils/mimetype';
import { makeSingleton, ModalController } from '@singletons';
diff --git a/src/core/features/emulator/services/clipboard.ts b/src/core/features/emulator/services/clipboard.ts
index 3a4615fc2..ea5dd4722 100644
--- a/src/core/features/emulator/services/clipboard.ts
+++ b/src/core/features/emulator/services/clipboard.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { Clipboard } from '@ionic-native/clipboard/ngx';
+import { Clipboard } from '@awesome-cordova-plugins/clipboard/ngx';
/**
* Emulates the Cordova Clipboard plugin in browser.
@@ -46,6 +46,7 @@ export class ClipboardMock extends Clipboard {
this.copyTextarea.select();
try {
+ // eslint-disable-next-line deprecation/deprecation
if (document.execCommand('copy')) {
resolve();
} else {
@@ -71,6 +72,7 @@ export class ClipboardMock extends Clipboard {
this.copyTextarea.select();
try {
+ // eslint-disable-next-line deprecation/deprecation
if (document.execCommand('paste')) {
resolve(this.copyTextarea.innerHTML);
} else {
diff --git a/src/core/features/emulator/services/file-opener.ts b/src/core/features/emulator/services/file-opener.ts
index 89835c2ab..38fc0ff22 100644
--- a/src/core/features/emulator/services/file-opener.ts
+++ b/src/core/features/emulator/services/file-opener.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { FileOpener } from '@ionic-native/file-opener/ngx';
+import { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx';
import { CoreFile } from '@services/file';
diff --git a/src/core/features/emulator/services/file-transfer.ts b/src/core/features/emulator/services/file-transfer.ts
index 174ad8a42..7b758bb4d 100644
--- a/src/core/features/emulator/services/file-transfer.ts
+++ b/src/core/features/emulator/services/file-transfer.ts
@@ -14,7 +14,7 @@
import { CoreTextUtils } from '@services/utils/text';
import { Injectable } from '@angular/core';
-import { FileTransfer, FileTransferObject, FileUploadResult, FileTransferError } from '@ionic-native/file-transfer/ngx';
+import { FileTransfer, FileTransferObject, FileUploadResult, FileTransferError } from '@awesome-cordova-plugins/file-transfer/ngx';
import { CoreFile } from '@services/file';
diff --git a/src/core/features/emulator/services/file.ts b/src/core/features/emulator/services/file.ts
index b98d70e9b..a9a61a124 100644
--- a/src/core/features/emulator/services/file.ts
+++ b/src/core/features/emulator/services/file.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { File, Entry, DirectoryEntry, FileEntry, IWriteOptions, RemoveResult } from '@ionic-native/file/ngx';
+import { File, Entry, DirectoryEntry, FileEntry, IWriteOptions, RemoveResult } from '@awesome-cordova-plugins/file/ngx';
import { CorePath } from '@singletons/path';
/**
diff --git a/src/core/features/emulator/services/geolocation.ts b/src/core/features/emulator/services/geolocation.ts
index 2f7ef778b..729993ac8 100644
--- a/src/core/features/emulator/services/geolocation.ts
+++ b/src/core/features/emulator/services/geolocation.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { Geolocation, GeolocationOptions, Geoposition } from '@ionic-native/geolocation/ngx';
+import { Geolocation, GeolocationOptions, Geoposition } from '@awesome-cordova-plugins/geolocation/ngx';
import { Observable, Subscriber, TeardownLogic } from 'rxjs';
/**
diff --git a/src/core/features/emulator/services/inappbrowser.ts b/src/core/features/emulator/services/inappbrowser.ts
index 4a5dd709c..f91f78207 100644
--- a/src/core/features/emulator/services/inappbrowser.ts
+++ b/src/core/features/emulator/services/inappbrowser.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { InAppBrowser, InAppBrowserObject } from '@ionic-native/in-app-browser/ngx';
+import { InAppBrowser, InAppBrowserObject } from '@awesome-cordova-plugins/in-app-browser/ngx';
/**
* Emulates the Cordova InAppBrowser plugin in desktop apps.
diff --git a/src/core/features/emulator/services/local-notifications.ts b/src/core/features/emulator/services/local-notifications.ts
index 006b78230..02ef0cdd9 100644
--- a/src/core/features/emulator/services/local-notifications.ts
+++ b/src/core/features/emulator/services/local-notifications.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { CoreError } from '@classes/errors/error';
-import { ILocalNotification, ILocalNotificationAction, LocalNotifications } from '@ionic-native/local-notifications/ngx';
+import { ILocalNotification, ILocalNotificationAction, LocalNotifications } from '@awesome-cordova-plugins/local-notifications/ngx';
import { Observable, Subject } from 'rxjs';
/**
diff --git a/src/core/features/emulator/services/media-capture.ts b/src/core/features/emulator/services/media-capture.ts
index 8c8985fbd..a84aced0c 100644
--- a/src/core/features/emulator/services/media-capture.ts
+++ b/src/core/features/emulator/services/media-capture.ts
@@ -18,7 +18,7 @@ import {
CaptureImageOptions,
CaptureVideoOptions,
MediaFile,
-} from '@ionic-native/media-capture/ngx';
+} from '@awesome-cordova-plugins/media-capture/ngx';
import { CoreEmulatorCaptureHelper } from './capture-helper';
diff --git a/src/core/features/emulator/services/zip.ts b/src/core/features/emulator/services/zip.ts
index a511661f0..eb2c869c6 100644
--- a/src/core/features/emulator/services/zip.ts
+++ b/src/core/features/emulator/services/zip.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { Zip } from '@ionic-native/zip/ngx';
+import { Zip } from '@awesome-cordova-plugins/zip/ngx';
import * as JSZip from 'jszip';
import { CorePath } from '@singletons/path';
import { File } from '@singletons';
diff --git a/src/core/features/fileuploader/components/audio-recorder/audio-recorder.html b/src/core/features/fileuploader/components/audio-recorder/audio-recorder.html
index 3e95963ea..bda39a252 100644
--- a/src/core/features/fileuploader/components/audio-recorder/audio-recorder.html
+++ b/src/core/features/fileuploader/components/audio-recorder/audio-recorder.html
@@ -2,7 +2,7 @@
{{ 'core.fileuploader.audiotitle' | translate }}
-
+
@@ -14,38 +14,37 @@
-
+
-
+ [paused]="status !== 'recording-ongoing'" />
@@ -60,7 +59,7 @@
-
+
diff --git a/src/core/features/fileuploader/services/fileuploader-delegate.ts b/src/core/features/fileuploader/services/fileuploader-delegate.ts
index 1b2f2eb34..04683f7d6 100644
--- a/src/core/features/fileuploader/services/fileuploader-delegate.ts
+++ b/src/core/features/fileuploader/services/fileuploader-delegate.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate';
import { CoreEvents } from '@singletons/events';
diff --git a/src/core/features/fileuploader/services/fileuploader-helper.ts b/src/core/features/fileuploader/services/fileuploader-helper.ts
index 6db1e65d3..d1d2cf9c1 100644
--- a/src/core/features/fileuploader/services/fileuploader-helper.ts
+++ b/src/core/features/fileuploader/services/fileuploader-helper.ts
@@ -14,10 +14,10 @@
import { Injectable } from '@angular/core';
import { ActionSheetButton } from '@ionic/core';
-import { CameraOptions } from '@ionic-native/camera/ngx';
-import { ChooserResult } from '@ionic-native/chooser/ngx';
-import { FileEntry, IFile } from '@ionic-native/file/ngx';
-import { MediaFile } from '@ionic-native/media-capture/ngx';
+import { CameraOptions } from '@awesome-cordova-plugins/camera/ngx';
+import { ChooserResult } from '@awesome-cordova-plugins/chooser/ngx';
+import { FileEntry, IFile } from '@awesome-cordova-plugins/file/ngx';
+import { MediaFile } from '@awesome-cordova-plugins/media-capture/ngx';
import { CoreNetwork } from '@services/network';
import { CoreFile, CoreFileProvider, CoreFileProgressEvent } from '@services/file';
diff --git a/src/core/features/fileuploader/services/fileuploader.ts b/src/core/features/fileuploader/services/fileuploader.ts
index b9565d276..00c0d3af6 100644
--- a/src/core/features/fileuploader/services/fileuploader.ts
+++ b/src/core/features/fileuploader/services/fileuploader.ts
@@ -13,9 +13,9 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { CameraOptions } from '@ionic-native/camera/ngx';
-import { FileEntry } from '@ionic-native/file/ngx';
-import { MediaFile, CaptureError, CaptureVideoOptions } from '@ionic-native/media-capture/ngx';
+import { CameraOptions } from '@awesome-cordova-plugins/camera/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
+import { MediaFile, CaptureError, CaptureVideoOptions } from '@awesome-cordova-plugins/media-capture/ngx';
import { Subject } from 'rxjs';
import { CoreFile, CoreFileProvider } from '@services/file';
diff --git a/src/core/features/grades/pages/course/course.html b/src/core/features/grades/pages/course/course.html
index c45814538..1079d5ff0 100644
--- a/src/core/features/grades/pages/course/course.html
+++ b/src/core/features/grades/pages/course/course.html
@@ -1,7 +1,7 @@
-
+
{{ title }}
@@ -10,11 +10,10 @@
-
+
-
-
+
@@ -41,15 +40,12 @@
-
-
-
+ class="expandable-status-icon" [class.expandable-status-icon-expanded]="row.expanded" />
+
-
+ [modname]="row.itemmodule" />
@@ -61,13 +57,11 @@
-
+ [contextInstanceId]="courseId" />
-
-
+
@@ -131,8 +125,7 @@
{{ 'core.grades.feedback' | translate}}
-
+ [contextInstanceId]="courseId" />
@@ -149,7 +142,7 @@
-
+
diff --git a/src/core/features/grades/pages/courses/courses.html b/src/core/features/grades/pages/courses/courses.html
index 1c6149ebd..9a0f31c22 100644
--- a/src/core/features/grades/pages/courses/courses.html
+++ b/src/core/features/grades/pages/courses/courses.html
@@ -1,7 +1,7 @@
-
+
{{ 'core.grades.grades' | translate }}
@@ -11,19 +11,17 @@
-
+
-
-
+
-
-
+
diff --git a/src/core/features/h5p/classes/helper.ts b/src/core/features/h5p/classes/helper.ts
index f79ed7304..ba3c25a12 100644
--- a/src/core/features/h5p/classes/helper.ts
+++ b/src/core/features/h5p/classes/helper.ts
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFile, CoreFileProvider } from '@services/file';
import { CoreSites } from '@services/sites';
diff --git a/src/core/features/h5p/classes/validator.ts b/src/core/features/h5p/classes/validator.ts
index cabe33d35..2a7e7ea34 100644
--- a/src/core/features/h5p/classes/validator.ts
+++ b/src/core/features/h5p/classes/validator.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { CoreError } from '@classes/errors/error';
-import { FileEntry, DirectoryEntry } from '@ionic-native/file/ngx';
+import { FileEntry, DirectoryEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFile, CoreFileFormat } from '@services/file';
import { Translate } from '@singletons';
import { CorePath } from '@singletons/path';
diff --git a/src/core/features/h5p/components/h5p-iframe/core-h5p-iframe.html b/src/core/features/h5p/components/h5p-iframe/core-h5p-iframe.html
index b09ea0ef2..7b7876d87 100644
--- a/src/core/features/h5p/components/h5p-iframe/core-h5p-iframe.html
+++ b/src/core/features/h5p/components/h5p-iframe/core-h5p-iframe.html
@@ -1,6 +1,5 @@
-
+ [showFullscreenOnToolbar]="enableInAppFullscreen" [autoFullscreenOnRotate]="enableInAppFullscreen" />
diff --git a/src/core/features/h5p/components/h5p-player/core-h5p-player.html b/src/core/features/h5p/components/h5p-player/core-h5p-player.html
index 6b32af633..c6f1eb653 100644
--- a/src/core/features/h5p/components/h5p-player/core-h5p-player.html
+++ b/src/core/features/h5p/components/h5p-player/core-h5p-player.html
@@ -1,15 +1,13 @@
-
+
-
+ (action)="download()" />
-
-
+
diff --git a/src/core/features/h5p/services/handlers/pluginfile.ts b/src/core/features/h5p/services/handlers/pluginfile.ts
index aff8d9095..a370b7cbb 100644
--- a/src/core/features/h5p/services/handlers/pluginfile.ts
+++ b/src/core/features/h5p/services/handlers/pluginfile.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFilepoolOnProgressCallback } from '@services/filepool';
import { CorePluginFileDownloadableResult, CorePluginFileHandler } from '@services/plugin-file-delegate';
diff --git a/src/core/features/login/components/exceeded-attempts/exceeded-attempts.html b/src/core/features/login/components/exceeded-attempts/exceeded-attempts.html
index a7aaa4000..e5aca5070 100644
--- a/src/core/features/login/components/exceeded-attempts/exceeded-attempts.html
+++ b/src/core/features/login/components/exceeded-attempts/exceeded-attempts.html
@@ -1,6 +1,6 @@
-
+
diff --git a/src/core/features/login/components/login-methods/login-methods.html b/src/core/features/login/components/login-methods/login-methods.html
index e553ef901..bc2f9f617 100644
--- a/src/core/features/login/components/login-methods/login-methods.html
+++ b/src/core/features/login/components/login-methods/login-methods.html
@@ -5,14 +5,14 @@
-
+
{{ method.name }}
-
+
{{ 'core.scanqr' | translate }}
diff --git a/src/core/features/login/components/site-help/site-help.html b/src/core/features/login/components/site-help/site-help.html
index 3517b8dc6..5483d3b5a 100644
--- a/src/core/features/login/components/site-help/site-help.html
+++ b/src/core/features/login/components/site-help/site-help.html
@@ -5,7 +5,7 @@
-
+
@@ -16,8 +16,7 @@
-
+ [class.expandable-status-icon-expanded]="isOpen(question)" />
{{ question.text }}
@@ -28,8 +27,7 @@
{{ question.answer.text }}
-
-
+
diff --git a/src/core/features/login/components/site-onboarding/site-onboarding.html b/src/core/features/login/components/site-onboarding/site-onboarding.html
index 638c95474..140519174 100644
--- a/src/core/features/login/components/site-onboarding/site-onboarding.html
+++ b/src/core/features/login/components/site-onboarding/site-onboarding.html
@@ -2,10 +2,10 @@
-
+
-
+
{{'core.skip' | translate}}
@@ -47,16 +47,13 @@
-
- {{ 'core.login.onboardingcreatemanagecourses' | translate }}
+ {{ 'core.login.onboardingcreatemanagecourses' | translate }}
-
- {{ 'core.login.onboardingenrolmanagestudents' | translate }}
+ {{ 'core.login.onboardingenrolmanagestudents' | translate }}
-
- {{ 'core.login.onboardingprovidefeedback' | translate }}
+ {{ 'core.login.onboardingprovidefeedback' | translate }}
diff --git a/src/core/features/login/components/sites-modal/sites-modal.html b/src/core/features/login/components/sites-modal/sites-modal.html
index 4c616a9a4..9b78848b6 100644
--- a/src/core/features/login/components/sites-modal/sites-modal.html
+++ b/src/core/features/login/components/sites-modal/sites-modal.html
@@ -2,7 +2,7 @@
-
+
@@ -13,7 +13,7 @@
1" (click)="toggleDelete()"
[attr.aria-label]="'core.login.toggleremove' | translate">
-
+
@@ -23,7 +23,7 @@
-
+
@@ -33,7 +33,7 @@
-
+
@@ -41,7 +41,7 @@
-
+
{{ 'core.login.add' | translate }}
diff --git a/src/core/features/login/pages/change-password/change-password.html b/src/core/features/login/pages/change-password/change-password.html
index 4dc0c8b1a..44821f7b2 100644
--- a/src/core/features/login/pages/change-password/change-password.html
+++ b/src/core/features/login/pages/change-password/change-password.html
@@ -1,7 +1,7 @@
-
+
@@ -11,7 +11,7 @@
-
+
diff --git a/src/core/features/login/pages/credentials/credentials.html b/src/core/features/login/pages/credentials/credentials.html
index d2cbebcc8..94c9e9c4c 100644
--- a/src/core/features/login/pages/credentials/credentials.html
+++ b/src/core/features/login/pages/credentials/credentials.html
@@ -1,7 +1,7 @@
-
+
@@ -10,10 +10,10 @@
-
+
-
+
@@ -28,7 +28,7 @@
-
+
{{site.siteUrl}}
@@ -45,16 +45,14 @@
{{ 'core.login.username' | translate }}
-
+ required="true" />
{{ 'core.login.password' | translate }}
-
+ required="true" />
{{ 'core.login.loginbutton' | translate }}
-
+
{{ 'core.openinbrowserdescription' | translate }}
-
+
@@ -89,7 +87,7 @@
-
+
diff --git a/src/core/features/login/pages/email-signup/email-signup.html b/src/core/features/login/pages/email-signup/email-signup.html
index 8030ccd6e..a48fb7453 100644
--- a/src/core/features/login/pages/email-signup/email-signup.html
+++ b/src/core/features/login/pages/email-signup/email-signup.html
@@ -1,7 +1,7 @@
-
+
@@ -11,7 +11,7 @@
-
+
@@ -46,8 +46,7 @@
{{ 'core.whatisyourage' | translate }}
-
-
+
@@ -85,7 +84,7 @@
{{site.siteUrl}}
-
+
{{site.siteUrl}}
@@ -102,9 +101,8 @@
{{ 'core.login.username' | translate }}
-
-
+ formControlName="username" autocapitalize="none" autocorrect="off" />
+
@@ -112,13 +110,12 @@
-
+ formControlName="password" [clearOnEdit]="false" autocomplete="new-password" required="true" />
-
+
@@ -132,34 +129,29 @@
{{ 'core.user.email' | translate }}
-
-
+ autocapitalize="none" autocorrect="off" />
+
{{ 'core.user.emailagain' | translate }}
-
-
+ formControlName="email2" autocorrect="off" [pattern]="escapeMail(signupForm.controls.email.value)" />
+
{{ 'core.user.' + nameField | translate }}
-
-
-
+ formControlName="{{nameField}}" autocorrect="off" />
+
{{ 'core.user.city' | translate }}
-
+ autocorrect="off" />
{{ 'core.user.country' | translate }}
@@ -178,7 +170,7 @@
+ registerAuth="email" [form]="signupForm" />
@@ -189,7 +181,7 @@
+ [showRequiredError]="formSubmitClicked" />
@@ -209,10 +201,9 @@
{{ 'core.login.policyacceptmandatory' | translate }}
-
-
+
-
+
@@ -232,7 +223,7 @@
-
+
diff --git a/src/core/features/login/pages/forgotten-password/forgotten-password.html b/src/core/features/login/pages/forgotten-password/forgotten-password.html
index 12cb62c05..db8ac4b3e 100644
--- a/src/core/features/login/pages/forgotten-password/forgotten-password.html
+++ b/src/core/features/login/pages/forgotten-password/forgotten-password.html
@@ -1,7 +1,7 @@
-
+
@@ -31,18 +31,17 @@
{{ 'core.login.username' | translate }}
-
+
{{ 'core.user.email' | translate }}
-
+
{{ 'core.login.usernameoremail' | translate }}
-
+ autocapitalize="none" autocorrect="off" [core-auto-focus]="autoFocus" />
{{ 'core.courses.search' | translate }}
diff --git a/src/core/features/login/pages/reconnect/reconnect.html b/src/core/features/login/pages/reconnect/reconnect.html
index 4844c440c..3113d5098 100644
--- a/src/core/features/login/pages/reconnect/reconnect.html
+++ b/src/core/features/login/pages/reconnect/reconnect.html
@@ -2,7 +2,7 @@
-
+
@@ -12,7 +12,7 @@
-
+
@@ -22,7 +22,7 @@
-
+
{{ 'core.lostconnection' | translate }}
@@ -36,7 +36,7 @@
-
+
{{site.siteUrl}}
@@ -44,9 +44,9 @@
+ [siteId]="siteId" />
-
+
= 3"
@@ -62,8 +62,7 @@
-
+ autocomplete="current-password" enterkeyhint="go" required="true" />
{{ 'core.login.loginbutton' | translate }}
-
+
{{ 'core.openinbrowserdescription' | translate }}
+ [redirectData]="redirectData" />
diff --git a/src/core/features/login/pages/site-policy/site-policy.html b/src/core/features/login/pages/site-policy/site-policy.html
index 25f2f27de..76ca02525 100644
--- a/src/core/features/login/pages/site-policy/site-policy.html
+++ b/src/core/features/login/pages/site-policy/site-policy.html
@@ -1,7 +1,7 @@
-
+
@@ -25,7 +25,7 @@
-
+
{{ 'core.login.policyacceptmandatory' | translate }}
diff --git a/src/core/features/login/pages/site/site.html b/src/core/features/login/pages/site/site.html
index 620918b92..c9e098b7a 100644
--- a/src/core/features/login/pages/site/site.html
+++ b/src/core/features/login/pages/site/site.html
@@ -1,7 +1,7 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -28,8 +28,7 @@
{{ 'core.login.siteaddress' | translate }}
-
+ formControlName="siteUrl" [core-auto-focus]="showKeyboard && !showScanQR" />
@@ -38,8 +37,7 @@
{{ 'core.login.siteaddress' | translate }}
-
+ [core-auto-focus]="showKeyboard && !showScanQR" (ionChange)="searchSite($event, siteForm.value.siteUrl)" />
@@ -51,7 +49,7 @@
-
+
{{ 'core.login.yourenteredsite' | translate }}
@@ -61,16 +59,16 @@
-
+
@@ -92,10 +90,9 @@
4" [(ngModel)]="filter" (ionInput)="filterChanged($event)"
- (ionCancel)="filterChanged()" [placeholder]="'core.login.findyoursite' | translate">
-
+ (ionCancel)="filterChanged()" [placeholder]="'core.login.findyoursite' | translate" />
-
+
@@ -105,7 +102,7 @@
-
+
{{ 'core.scanqr' | translate }}
diff --git a/src/core/features/login/pages/sites/sites.html b/src/core/features/login/pages/sites/sites.html
index a6cbe0f01..38c21d054 100644
--- a/src/core/features/login/pages/sites/sites.html
+++ b/src/core/features/login/pages/sites/sites.html
@@ -1,7 +1,7 @@
-
+
@@ -11,10 +11,10 @@
0" (click)="toggleDelete()"
[attr.aria-label]="'core.login.toggleremove' | translate">
-
+
-
+
@@ -30,14 +30,14 @@
-
+
-
+
{{ 'core.login.add' | translate }}
diff --git a/src/core/features/mainmenu/components/user-menu-button/user-menu-button.html b/src/core/features/mainmenu/components/user-menu-button/user-menu-button.html
index b23e54da8..766db041e 100644
--- a/src/core/features/mainmenu/components/user-menu-button/user-menu-button.html
+++ b/src/core/features/mainmenu/components/user-menu-button/user-menu-button.html
@@ -1,4 +1,3 @@
-
+ [attr.aria-label]="'core.user.useraccount' | translate" />
diff --git a/src/core/features/mainmenu/components/user-menu/user-menu.html b/src/core/features/mainmenu/components/user-menu/user-menu.html
index 896d075c2..04bacc312 100644
--- a/src/core/features/mainmenu/components/user-menu/user-menu.html
+++ b/src/core/features/mainmenu/components/user-menu/user-menu.html
@@ -7,7 +7,7 @@
-
+
@@ -23,8 +23,7 @@
@@ -36,15 +35,14 @@
-
+
{{ siteInfo.fullname }}
@@ -52,14 +50,14 @@
-
+
-
+
{{ handler.title | translate }}
@@ -69,13 +67,12 @@
{{ handler.badgeA11yText | translate: {$a : handler.badge } }}
-
-
+
-
+
0">
-
+
{{ 'core.search.filtercategories' | translate }}
@@ -25,18 +25,18 @@
{{ 'core.search.allcategories' | translate }}
+ (ionChange)="allSearchAreaCategoriesUpdated()" />
-
+
+ (ionChange)="onSearchAreaCategoryInputChanged(searchAreaCategory)" />
0">
-
+
{{ 'core.search.filtercourses' | translate }}
@@ -44,14 +44,13 @@
{{ 'core.search.allcourses' | translate }}
-
-
+
-
+
-
+
diff --git a/src/core/features/search/components/global-search-result/global-search-result.html b/src/core/features/search/components/global-search-result/global-search-result.html
index dfb49fe48..88238eec1 100644
--- a/src/core/features/search/components/global-search-result/global-search-result.html
+++ b/src/core/features/search/components/global-search-result/global-search-result.html
@@ -1,23 +1,23 @@
-
-
+
+
-
+
+ [modname]="result.module.name" />
-
+
-
+
-
-
+
+
-
+
{{ 'core.search.resultby' | translate: { $a: renderedContext.userName } }}
diff --git a/src/core/features/search/components/search-box/core-search-box.html b/src/core/features/search/components/search-box/core-search-box.html
index 6f0cc0bba..522d9818c 100644
--- a/src/core/features/search/components/search-box/core-search-box.html
+++ b/src/core/features/search/components/search-box/core-search-box.html
@@ -2,22 +2,20 @@
{{ placeholder }}
-
+ [spellcheck]="spellcheck" [core-auto-focus]="autoFocus" [disabled]="disabled" role="searchbox" (ionFocus)="focus($event)" />
-
+
-
+
-
-
+
{{item.searchedtext}}
diff --git a/src/core/features/search/pages/global-search/global-search.html b/src/core/features/search/pages/global-search/global-search.html
index 07965f954..61f677773 100644
--- a/src/core/features/search/pages/global-search/global-search.html
+++ b/src/core/features/search/pages/global-search/global-search.html
@@ -1,14 +1,14 @@
-
+
{{ 'core.search' | translate }}
{{ 'core.search.globalsearch' | translate }}
-
+
@@ -16,25 +16,23 @@
-
+
-
+
+ [searchLabel]="'core.search' | translate" [autoFocus]="true" searchArea="CoreSearchGlobalSearch" />
-
+ (onClick)="visitResult(result)" />
-
+ [error]="loadMoreError" />
{{ 'core.search.empty' | translate }}
@@ -46,7 +44,7 @@
-
+
diff --git a/src/core/features/search/stories/components/global-search-results-page/global-search-results-page.html b/src/core/features/search/stories/components/global-search-results-page/global-search-results-page.html
index 7625c8827..eeb81da2c 100644
--- a/src/core/features/search/stories/components/global-search-results-page/global-search-results-page.html
+++ b/src/core/features/search/stories/components/global-search-results-page/global-search-results-page.html
@@ -8,10 +8,10 @@
-
+
-
-
+
diff --git a/src/core/features/settings/pages/about/about.html b/src/core/features/settings/pages/about/about.html
index 2f7796a70..ce17902b3 100644
--- a/src/core/features/settings/pages/about/about.html
+++ b/src/core/features/settings/pages/about/about.html
@@ -1,7 +1,7 @@
-
+
@@ -14,27 +14,27 @@
-
+
{{ 'core.settings.opensourcelicenses' | translate }}
-
+
{{ 'core.settings.privacypolicy' | translate }}
-
+
{{ 'core.settings.accessstatement' | translate }}
-
+
{{ 'core.settings.helpusimprove' | translate }}
-
+
{{ 'core.settings.legaldisclaimer' | translate }}
diff --git a/src/core/features/settings/pages/dev/dev.html b/src/core/features/settings/pages/dev/dev.html
index 0daa68c2b..107d688b1 100644
--- a/src/core/features/settings/pages/dev/dev.html
+++ b/src/core/features/settings/pages/dev/dev.html
@@ -1,7 +1,7 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -22,20 +22,19 @@
Change text direction
{{ direction }}
-
+
Force safe area margins
-
+
Enable staging sites ({{stagingSitesCount}})
-
-
+
@@ -44,14 +43,14 @@
Enable remote styles {{remoteStylesCount}}
-
+
Enable site plugin styles {{pluginStylesCount}}
-
+
@@ -60,7 +59,7 @@
Reset user tours
-
+
@@ -69,7 +68,7 @@
Invalidate caches
-
+
@@ -85,7 +84,7 @@
Clear deleted sites from file storage and temp folder
-
+
diff --git a/src/core/features/settings/pages/deviceinfo/deviceinfo.html b/src/core/features/settings/pages/deviceinfo/deviceinfo.html
index c4da48990..98a838f0f 100644
--- a/src/core/features/settings/pages/deviceinfo/deviceinfo.html
+++ b/src/core/features/settings/pages/deviceinfo/deviceinfo.html
@@ -1,7 +1,7 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -19,7 +19,7 @@
-
+
{{ 'core.settings.developeroptions' | translate }}
diff --git a/src/core/features/settings/pages/error-log/error-log.html b/src/core/features/settings/pages/error-log/error-log.html
index 7647af8c7..8a8c0a442 100644
--- a/src/core/features/settings/pages/error-log/error-log.html
+++ b/src/core/features/settings/pages/error-log/error-log.html
@@ -1,7 +1,7 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -45,7 +45,6 @@
-
-
+
diff --git a/src/core/features/settings/pages/general/general.html b/src/core/features/settings/pages/general/general.html
index 90843dac5..f73deaa03 100644
--- a/src/core/features/settings/pages/general/general.html
+++ b/src/core/features/settings/pages/general/general.html
@@ -1,7 +1,7 @@
-
+
@@ -57,7 +57,7 @@
{{ 'core.settings.enablerichtexteditor' | translate }}
{{ 'core.settings.enablerichtexteditordescription' | translate }}
-
+
@@ -73,14 +73,14 @@
{{ 'core.settings.debugdisplay' | translate }}
{{ 'core.settings.debugdisplaydescription' | translate }}
-
+
{{ 'core.settings.enableanalytics' | translate }}
{{ 'core.settings.enableanalyticsdescription' | translate }}
-
+
diff --git a/src/core/features/settings/pages/index/index.html b/src/core/features/settings/pages/index/index.html
index d9cca2a34..7b6374247 100644
--- a/src/core/features/settings/pages/index/index.html
+++ b/src/core/features/settings/pages/index/index.html
@@ -1,12 +1,12 @@
-
+
{{ 'core.settings.appsettings' | translate }}
-
+
@@ -14,7 +14,7 @@
-
+
{{ section.name | translate }}
diff --git a/src/core/features/settings/pages/licenses/licenses.html b/src/core/features/settings/pages/licenses/licenses.html
index b883d1942..99d366555 100644
--- a/src/core/features/settings/pages/licenses/licenses.html
+++ b/src/core/features/settings/pages/licenses/licenses.html
@@ -1,7 +1,7 @@
-
+
@@ -12,8 +12,7 @@
-
+ [placeholder]="'core.filter' | translate" class="ion-margin-top" />
diff --git a/src/core/features/settings/pages/site/site.html b/src/core/features/settings/pages/site/site.html
index 5b940b309..d463d1ba9 100644
--- a/src/core/features/settings/pages/site/site.html
+++ b/src/core/features/settings/pages/site/site.html
@@ -1,33 +1,30 @@
-
+
{{ 'core.settings.preferences' | translate}}
-
-
+
-
+
-
-
+
{{ handler.title | translate}}
-
+ (ionChange)="handler.toggle($event.detail.checked)" slot="end" />
@@ -42,12 +39,12 @@
-
+
-
+
{{ 'core.settings.connectwifitosync' | translate }}
diff --git a/src/core/features/settings/pages/space-usage/space-usage.html b/src/core/features/settings/pages/space-usage/space-usage.html
index 939553d14..519d8db67 100644
--- a/src/core/features/settings/pages/space-usage/space-usage.html
+++ b/src/core/features/settings/pages/space-usage/space-usage.html
@@ -1,20 +1,19 @@
-
+
{{ 'core.settings.spaceusage' | translate }}
-
-
+
-
+
@@ -27,8 +26,7 @@
-
+ [attr.aria-label]="'addon.storagemanager.deletedatafrom' | translate: { name: site.siteName }" />
diff --git a/src/core/features/settings/pages/synchronization/synchronization.html b/src/core/features/settings/pages/synchronization/synchronization.html
index ab6439509..f46cde682 100644
--- a/src/core/features/settings/pages/synchronization/synchronization.html
+++ b/src/core/features/settings/pages/synchronization/synchronization.html
@@ -1,7 +1,7 @@
-
+
{{ 'core.settings.synchronization' | translate }}
@@ -9,7 +9,7 @@
-
+
@@ -29,13 +29,12 @@
{{ 'core.settings.syncdatasaver' | translate }}
-
-
+
-
+
{{ 'core.settings.connectwifitosync' | translate }}
@@ -60,12 +59,12 @@
-
+
-
+
diff --git a/src/core/features/sharedfiles/components/list-modal/list-modal.html b/src/core/features/sharedfiles/components/list-modal/list-modal.html
index 669934cbe..8b1161c97 100644
--- a/src/core/features/sharedfiles/components/list-modal/list-modal.html
+++ b/src/core/features/sharedfiles/components/list-modal/list-modal.html
@@ -5,13 +5,12 @@
-
+
-
+ [showSitePicker]="!hideSitePicker" (onPathChanged)="calculateTitle($event)" (onFilePicked)="filePicked($event)" />
diff --git a/src/core/features/sharedfiles/components/list-modal/list-modal.ts b/src/core/features/sharedfiles/components/list-modal/list-modal.ts
index 6f0b206bf..34f9cd550 100644
--- a/src/core/features/sharedfiles/components/list-modal/list-modal.ts
+++ b/src/core/features/sharedfiles/components/list-modal/list-modal.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Component, OnInit, Input } from '@angular/core';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFile } from '@services/file';
import { ModalController, Translate } from '@singletons';
diff --git a/src/core/features/sharedfiles/components/list/list.html b/src/core/features/sharedfiles/components/list/list.html
index 51823b9a7..5dfc856ca 100644
--- a/src/core/features/sharedfiles/components/list/list.html
+++ b/src/core/features/sharedfiles/components/list/list.html
@@ -1,29 +1,25 @@
-
+
-
-
+
0">
-
+ (onDelete)="fileDeleted(idx)" (onRename)="fileRenamed(idx, $event)" />
-
+
{{ file.name }}
-
-
+
-
+ [message]="'core.sharedfiles.nosharedfilestoupload' | translate" />
diff --git a/src/core/features/sharedfiles/components/list/list.ts b/src/core/features/sharedfiles/components/list/list.ts
index b2d802af2..827d06205 100644
--- a/src/core/features/sharedfiles/components/list/list.ts
+++ b/src/core/features/sharedfiles/components/list/list.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Component, OnInit, OnDestroy, Input, Output, EventEmitter } from '@angular/core';
-import { FileEntry, DirectoryEntry } from '@ionic-native/file/ngx';
+import { FileEntry, DirectoryEntry } from '@awesome-cordova-plugins/file/ngx';
import { Md5 } from 'ts-md5';
import { CoreSharedFiles } from '@features/sharedfiles/services/sharedfiles';
diff --git a/src/core/features/sharedfiles/pages/choose-site/choose-site.html b/src/core/features/sharedfiles/pages/choose-site/choose-site.html
index 4c56c753d..9009885cf 100644
--- a/src/core/features/sharedfiles/pages/choose-site/choose-site.html
+++ b/src/core/features/sharedfiles/pages/choose-site/choose-site.html
@@ -1,7 +1,7 @@
-
+
{{ 'core.sharedfiles.sharedfiles' | translate }}
@@ -17,8 +17,7 @@
{{fileName}}
-
-
+
diff --git a/src/core/features/sharedfiles/pages/choose-site/choose-site.ts b/src/core/features/sharedfiles/pages/choose-site/choose-site.ts
index 84407e809..271ce4ada 100644
--- a/src/core/features/sharedfiles/pages/choose-site/choose-site.ts
+++ b/src/core/features/sharedfiles/pages/choose-site/choose-site.ts
@@ -15,7 +15,7 @@
import { Component, OnInit } from '@angular/core';
import { CoreAccountsList, CoreLoginHelper } from '@features/login/services/login-helper';
import { CoreSharedFilesHelper } from '@features/sharedfiles/services/sharedfiles-helper';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFile } from '@services/file';
import { CoreNavigator } from '@services/navigator';
import { CoreSiteBasicInfo } from '@services/sites';
diff --git a/src/core/features/sharedfiles/pages/list/list.html b/src/core/features/sharedfiles/pages/list/list.html
index b5b619acd..b230fd7ce 100644
--- a/src/core/features/sharedfiles/pages/list/list.html
+++ b/src/core/features/sharedfiles/pages/list/list.html
@@ -1,7 +1,7 @@
-
+
{{ title }}
@@ -10,6 +10,5 @@
-
+ [showSitePicker]="showSitePicker" (onPathChanged)="calculateTitle($event)" />
diff --git a/src/core/features/sharedfiles/services/sharedfiles-helper.ts b/src/core/features/sharedfiles/services/sharedfiles-helper.ts
index 4fa26d913..6fcba0679 100644
--- a/src/core/features/sharedfiles/services/sharedfiles-helper.ts
+++ b/src/core/features/sharedfiles/services/sharedfiles-helper.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreCanceledError } from '@classes/errors/cancelederror';
import { CoreFileUploader } from '@features/fileuploader/services/fileuploader';
diff --git a/src/core/features/sharedfiles/services/sharedfiles.ts b/src/core/features/sharedfiles/services/sharedfiles.ts
index 151d4b515..f0a732e72 100644
--- a/src/core/features/sharedfiles/services/sharedfiles.ts
+++ b/src/core/features/sharedfiles/services/sharedfiles.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { FileEntry, DirectoryEntry } from '@ionic-native/file/ngx';
+import { FileEntry, DirectoryEntry } from '@awesome-cordova-plugins/file/ngx';
import { Md5 } from 'ts-md5/dist/md5';
import { SQLiteDB } from '@classes/sqlitedb';
diff --git a/src/core/features/sitehome/pages/index/index.html b/src/core/features/sitehome/pages/index/index.html
index 4d80cc5c1..efc616e35 100644
--- a/src/core/features/sitehome/pages/index/index.html
+++ b/src/core/features/sitehome/pages/index/index.html
@@ -1,11 +1,11 @@
-
+
-
+
@@ -13,17 +13,16 @@
-
-
+
-
+
0">
-
+
@@ -45,19 +44,16 @@
-
-
+
-
-
-
+
-
+
{{ 'core.courses.availablecourses' | translate}}
@@ -66,14 +62,13 @@
-
-
+
-
+
{{ 'core.courses.categories' | translate}}
@@ -84,8 +79,7 @@
-
-
+
{{ 'core.courses.mycourses' | translate}}
@@ -96,7 +90,7 @@
-
+
{{ 'core.courses.searchcourses' | translate}}
diff --git a/src/core/features/siteplugins/components/assign-feedback/core-siteplugins-assign-feedback.html b/src/core/features/siteplugins/components/assign-feedback/core-siteplugins-assign-feedback.html
index f58bcd913..469fc233e 100644
--- a/src/core/features/siteplugins/components/assign-feedback/core-siteplugins-assign-feedback.html
+++ b/src/core/features/siteplugins/components/assign-feedback/core-siteplugins-assign-feedback.html
@@ -1 +1 @@
-
+
diff --git a/src/core/features/siteplugins/components/assign-submission/core-siteplugins-assign-submission.html b/src/core/features/siteplugins/components/assign-submission/core-siteplugins-assign-submission.html
index f58bcd913..469fc233e 100644
--- a/src/core/features/siteplugins/components/assign-submission/core-siteplugins-assign-submission.html
+++ b/src/core/features/siteplugins/components/assign-submission/core-siteplugins-assign-submission.html
@@ -1 +1 @@
-
+
diff --git a/src/core/features/siteplugins/components/block/core-siteplugins-block.html b/src/core/features/siteplugins/components/block/core-siteplugins-block.html
index 4198fb8c6..09636a7ca 100644
--- a/src/core/features/siteplugins/components/block/core-siteplugins-block.html
+++ b/src/core/features/siteplugins/components/block/core-siteplugins-block.html
@@ -1,3 +1,2 @@
-
+ [initResult]="initResult" />
diff --git a/src/core/features/siteplugins/components/course-format/core-siteplugins-course-format.html b/src/core/features/siteplugins/components/course-format/core-siteplugins-course-format.html
index 875413506..8ccd604a3 100644
--- a/src/core/features/siteplugins/components/course-format/core-siteplugins-course-format.html
+++ b/src/core/features/siteplugins/components/course-format/core-siteplugins-course-format.html
@@ -1,3 +1,2 @@
-
+ [initResult]="initResult" [data]="data" />
diff --git a/src/core/features/siteplugins/components/module-index/core-siteplugins-module-index.html b/src/core/features/siteplugins/components/module-index/core-siteplugins-module-index.html
index d609e5f25..7eb7bd09a 100644
--- a/src/core/features/siteplugins/components/module-index/core-siteplugins-module-index.html
+++ b/src/core/features/siteplugins/components/module-index/core-siteplugins-module-index.html
@@ -1,19 +1,16 @@
-
+
-
-
+
-
+ (onLoadingContent)="contentLoading()" />
-
+ [currentModuleId]="module.id" />
diff --git a/src/core/features/siteplugins/components/plugin-content/core-siteplugins-plugin-content.html b/src/core/features/siteplugins/components/plugin-content/core-siteplugins-plugin-content.html
index 2126b11fb..4ae340d76 100644
--- a/src/core/features/siteplugins/components/plugin-content/core-siteplugins-plugin-content.html
+++ b/src/core/features/siteplugins/components/plugin-content/core-siteplugins-plugin-content.html
@@ -1,4 +1,3 @@
-
-
+
diff --git a/src/core/features/siteplugins/components/question-behaviour/core-siteplugins-question-behaviour.html b/src/core/features/siteplugins/components/question-behaviour/core-siteplugins-question-behaviour.html
index f58bcd913..469fc233e 100644
--- a/src/core/features/siteplugins/components/question-behaviour/core-siteplugins-question-behaviour.html
+++ b/src/core/features/siteplugins/components/question-behaviour/core-siteplugins-question-behaviour.html
@@ -1 +1 @@
-
+
diff --git a/src/core/features/siteplugins/components/question/core-siteplugins-question.html b/src/core/features/siteplugins/components/question/core-siteplugins-question.html
index f58bcd913..469fc233e 100644
--- a/src/core/features/siteplugins/components/question/core-siteplugins-question.html
+++ b/src/core/features/siteplugins/components/question/core-siteplugins-question.html
@@ -1 +1 @@
-
+
diff --git a/src/core/features/siteplugins/components/quiz-access-rule/core-siteplugins-quiz-access-rule.html b/src/core/features/siteplugins/components/quiz-access-rule/core-siteplugins-quiz-access-rule.html
index f58bcd913..469fc233e 100644
--- a/src/core/features/siteplugins/components/quiz-access-rule/core-siteplugins-quiz-access-rule.html
+++ b/src/core/features/siteplugins/components/quiz-access-rule/core-siteplugins-quiz-access-rule.html
@@ -1 +1 @@
-
+
diff --git a/src/core/features/siteplugins/components/user-profile-field/core-siteplugins-user-profile-field.html b/src/core/features/siteplugins/components/user-profile-field/core-siteplugins-user-profile-field.html
index f58bcd913..469fc233e 100644
--- a/src/core/features/siteplugins/components/user-profile-field/core-siteplugins-user-profile-field.html
+++ b/src/core/features/siteplugins/components/user-profile-field/core-siteplugins-user-profile-field.html
@@ -1 +1 @@
-
+
diff --git a/src/core/features/siteplugins/components/workshop-assessment-strategy/core-siteplugins-workshop-assessment-strategy.html b/src/core/features/siteplugins/components/workshop-assessment-strategy/core-siteplugins-workshop-assessment-strategy.html
index f58bcd913..469fc233e 100644
--- a/src/core/features/siteplugins/components/workshop-assessment-strategy/core-siteplugins-workshop-assessment-strategy.html
+++ b/src/core/features/siteplugins/components/workshop-assessment-strategy/core-siteplugins-workshop-assessment-strategy.html
@@ -1 +1 @@
-
+
diff --git a/src/core/features/siteplugins/pages/course-option/core-siteplugins-course-option.html b/src/core/features/siteplugins/pages/course-option/core-siteplugins-course-option.html
index bb6328cbb..d34f71c55 100644
--- a/src/core/features/siteplugins/pages/course-option/core-siteplugins-course-option.html
+++ b/src/core/features/siteplugins/pages/course-option/core-siteplugins-course-option.html
@@ -1,9 +1,8 @@
-
+
-
+ [initResult]="initResult" />
diff --git a/src/core/features/siteplugins/pages/module-index/module-index.html b/src/core/features/siteplugins/pages/module-index/module-index.html
index 58f3efc7c..aa6c38d05 100644
--- a/src/core/features/siteplugins/pages/module-index/module-index.html
+++ b/src/core/features/siteplugins/pages/module-index/module-index.html
@@ -1,21 +1,19 @@
-
+
{{ title }}
-
-
-
+
-
+
-
+
diff --git a/src/core/features/siteplugins/pages/plugin/plugin.html b/src/core/features/siteplugins/pages/plugin/plugin.html
index 704dea867..ee8ef621c 100644
--- a/src/core/features/siteplugins/pages/plugin/plugin.html
+++ b/src/core/features/siteplugins/pages/plugin/plugin.html
@@ -1,22 +1,19 @@
-
+
{{ title | translate }}
-
-
-
+
-
+
-
+ [data]="jsData" [pageTitle]="title" />
diff --git a/src/core/features/tag/components/feed/core-tag-feed.html b/src/core/features/tag/components/feed/core-tag-feed.html
index 1223943fe..b2dbea3c2 100644
--- a/src/core/features/tag/components/feed/core-tag-feed.html
+++ b/src/core/features/tag/components/feed/core-tag-feed.html
@@ -1,9 +1,8 @@
-
+
-
-
+
{{ item.heading }}
{{ text }}
diff --git a/src/core/features/tag/pages/index-area/index-area.html b/src/core/features/tag/pages/index-area/index-area.html
index a23e1f352..5d96270d6 100644
--- a/src/core/features/tag/pages/index-area/index-area.html
+++ b/src/core/features/tag/pages/index-area/index-area.html
@@ -1,7 +1,7 @@
-
+
@@ -12,11 +12,10 @@
-
+
-
-
-
+
+
diff --git a/src/core/features/tag/pages/index/index.html b/src/core/features/tag/pages/index/index.html
index 3e8f9c87e..e409114c7 100644
--- a/src/core/features/tag/pages/index/index.html
+++ b/src/core/features/tag/pages/index/index.html
@@ -1,7 +1,7 @@
-
+
{{ 'core.tag.tag' | translate }}: {{ tagName }}
@@ -12,12 +12,12 @@
-
+
-
+
{{ 'core.tag.warningareasnotsupported' | translate }}
+ [message]="'core.tag.noresultsfor' | translate: { $a: tagName }" />
diff --git a/src/core/features/tag/pages/search/search.html b/src/core/features/tag/pages/search/search.html
index f428692cb..40a682ac7 100644
--- a/src/core/features/tag/pages/search/search.html
+++ b/src/core/features/tag/pages/search/search.html
@@ -1,25 +1,25 @@
-
+
{{ 'core.tag.searchtags' | translate }}
-
+
-
+
1 ? '' : null">
+ autocorrect="off" [spellcheck]="false" [autoFocus]="false" [lengthCheck]="0" searchArea="CoreTag" />
1">
@@ -34,7 +34,7 @@
+ [message]="'core.tag.notagsfound' | translate: {$a: query}" />
0">
diff --git a/src/core/features/user/components/tag-area/core-user-tag-area.html b/src/core/features/user/components/tag-area/core-user-tag-area.html
index ccba8b626..8fc2eb065 100644
--- a/src/core/features/user/components/tag-area/core-user-tag-area.html
+++ b/src/core/features/user/components/tag-area/core-user-tag-area.html
@@ -1,6 +1,6 @@
-
+
{{ item.heading }}
diff --git a/src/core/features/user/components/user-profile-field/core-user-profile-field.html b/src/core/features/user/components/user-profile-field/core-user-profile-field.html
index 1f3a37007..4d97bf5b0 100644
--- a/src/core/features/user/components/user-profile-field/core-user-profile-field.html
+++ b/src/core/features/user/components/user-profile-field/core-user-profile-field.html
@@ -1 +1 @@
-
+
diff --git a/src/core/features/user/pages/about/about.html b/src/core/features/user/pages/about/about.html
index 128d010ad..932b5f5f8 100644
--- a/src/core/features/user/pages/about/about.html
+++ b/src/core/features/user/pages/about/about.html
@@ -1,7 +1,7 @@
-
+
{{ 'core.user.profile' | translate }}
@@ -10,7 +10,7 @@
-
+
@@ -18,7 +18,7 @@
-
+
@@ -29,8 +29,7 @@
-
-
+
@@ -129,13 +128,11 @@
-
+ [contextInstanceId]="courseId" [courseId]="courseId" />
-
+ [message]=" 'core.user.detailsnotavailable' | translate" />
diff --git a/src/core/features/user/pages/complete-profile/complete-profile.html b/src/core/features/user/pages/complete-profile/complete-profile.html
index bc62ba89f..c3d28949c 100644
--- a/src/core/features/user/pages/complete-profile/complete-profile.html
+++ b/src/core/features/user/pages/complete-profile/complete-profile.html
@@ -1,7 +1,7 @@
-
+
@@ -11,7 +11,7 @@
-
+
diff --git a/src/core/features/user/pages/participants/participants.html b/src/core/features/user/pages/participants/participants.html
index c724447a0..4775bb79f 100644
--- a/src/core/features/user/pages/participants/participants.html
+++ b/src/core/features/user/pages/participants/participants.html
@@ -1,29 +1,25 @@
-
+
-
+ searchArea="CoreUserParticipants" (onSubmit)="search($event)" (onClear)="clearSearch()" />
-
+ [message]="'core.user.noparticipants' | translate" />
-
+ [message]="'core.noresults' | translate" />
-
-
+
@@ -43,8 +39,7 @@
-
-
+
@@ -52,8 +47,7 @@
-
+ [error]="fetchMoreParticipantsFailed" />
diff --git a/src/core/features/user/pages/profile/profile.html b/src/core/features/user/pages/profile/profile.html
index 17a3ce676..94f262618 100644
--- a/src/core/features/user/pages/profile/profile.html
+++ b/src/core/features/user/pages/profile/profile.html
@@ -1,7 +1,7 @@
-
+
{{ user?.fullname }}
@@ -10,17 +10,16 @@
-
+
-
-
+
{{ user.fullname }}
- {{ user.address }}
+ {{ user.address }}
{{ 'core.user.roles' | translate}} {{'core.labelsep' | translate}}
@@ -41,31 +40,31 @@
-
+
{{ handler.title | translate }}
-
+
-
+
{{ 'core.user.details' | translate }}
-
+
-
+
{{ handler.title | translate }}
@@ -75,25 +74,24 @@
{{ handler.badgeA11yText | translate: {$a : handler.badge } }}
-
-
+
-
+
{{ handler.title | translate }}
-
+
-
-
-
-
-
+
+
+
+
diff --git a/src/core/features/user/services/support.ts b/src/core/features/user/services/support.ts
index beefcb5e3..1e85f5848 100644
--- a/src/core/features/user/services/support.ts
+++ b/src/core/features/user/services/support.ts
@@ -15,7 +15,7 @@
import { Injectable } from '@angular/core';
import { CoreUserSupportConfig } from '@features/user/classes/support/support-config';
import { CoreUserAuthenticatedSupportConfig } from '@features/user/classes/support/authenticated-support-config';
-import { InAppBrowserObject } from '@ionic-native/in-app-browser';
+import { InAppBrowserObject } from '@awesome-cordova-plugins/in-app-browser';
import { CorePlatform } from '@services/platform';
import { CoreSites } from '@services/sites';
import { CoreUtils } from '@services/utils/utils';
diff --git a/src/core/features/viewer/components/components.module.ts b/src/core/features/viewer/components/components.module.ts
index d47cd558b..1baa9b84c 100644
--- a/src/core/features/viewer/components/components.module.ts
+++ b/src/core/features/viewer/components/components.module.ts
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { NgModule } from '@angular/core';
+import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { CoreSharedModule } from '@/core/shared.module';
import { CoreViewerImageComponent } from './image/image';
@@ -33,5 +33,6 @@ import { CoreViewerTextComponent } from './text/text';
CoreViewerQRScannerComponent,
CoreViewerTextComponent,
],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class CoreViewerComponentsModule {}
diff --git a/src/core/features/viewer/components/image/image.html b/src/core/features/viewer/components/image/image.html
index 8f2777077..b3ba23c73 100644
--- a/src/core/features/viewer/components/image/image.html
+++ b/src/core/features/viewer/components/image/image.html
@@ -1,28 +1,28 @@
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
diff --git a/src/core/features/viewer/components/image/image.scss b/src/core/features/viewer/components/image/image.scss
index 9d8036854..55b861bfb 100644
--- a/src/core/features/viewer/components/image/image.scss
+++ b/src/core/features/viewer/components/image/image.scss
@@ -1,4 +1,4 @@
-ion-slides {
+swiper-container {
height: 100%;
}
diff --git a/src/core/features/viewer/components/image/image.ts b/src/core/features/viewer/components/image/image.ts
index 23c3a4a1d..cf1f236d5 100644
--- a/src/core/features/viewer/components/image/image.ts
+++ b/src/core/features/viewer/components/image/image.ts
@@ -12,10 +12,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { AfterViewInit, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';
-import { IonSlides } from '@ionic/angular';
+import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';
import { ModalController, Translate } from '@singletons';
import { CoreMath } from '@singletons/math';
+import { Swiper } from 'swiper';
+import { SwiperOptions } from 'swiper/types';
+import { IonicSlides } from '@ionic/angular';
/**
* Modal component to view an image.
@@ -25,29 +27,49 @@ import { CoreMath } from '@singletons/math';
templateUrl: 'image.html',
styleUrls: ['image.scss'],
})
-export class CoreViewerImageComponent implements OnInit, AfterViewInit {
+export class CoreViewerImageComponent implements OnInit {
- @ViewChild(IonSlides) protected slides?: IonSlides;
+ protected swiper?: Swiper;
+ @ViewChild('swiperRef')
+ set swiperRef(swiperRef: ElementRef) {
+ /**
+ * This setTimeout waits for Ionic's async initialization to complete.
+ * Otherwise, an outdated swiper reference will be used.
+ */
+ setTimeout(() => {
+ if (swiperRef.nativeElement?.swiper) {
+ this.swiper = swiperRef.nativeElement.swiper as Swiper;
+
+ Object.keys(this.swiperOpts).forEach((key) => {
+ if (this.swiper) {
+ this.swiper.params[key] = this.swiperOpts[key];
+ }
+ });
+ }
+ }, 0);
+ }
@Input() title = ''; // Modal title.
@Input() image = ''; // Image URL.
@Input() component?: string; // Component to use in external-content.
@Input() componentId?: string | number; // Component ID to use in external-content.
- slidesOpts = {
+ private static readonly MAX_RATIO = 8;
+
+ protected swiperOpts: SwiperOptions = {
+ modules: [IonicSlides],
+ freeMode: true,
slidesPerView: 1,
centerInsufficientSlides: true,
- centerSlides: true,
+ centeredSlides: true,
zoom: {
- maxRatio: 8,
+ maxRatio: CoreViewerImageComponent.MAX_RATIO,
minRatio: 0.5, // User can zoom out to 0.5 only using pinch gesture.
},
};
protected zoomRatio = 1;
- slidesSwiper: any; // eslint-disable-line @typescript-eslint/no-explicit-any
-
constructor(protected element: ElementRef) {
}
@@ -58,13 +80,6 @@ export class CoreViewerImageComponent implements OnInit, AfterViewInit {
this.title = this.title || Translate.instant('core.imageviewer');
}
- /**
- * @inheritdoc
- */
- async ngAfterViewInit(): Promise {
- this.slidesSwiper = await this.slides?.getSwiper();
- }
-
/**
* Close modal.
*/
@@ -80,7 +95,7 @@ export class CoreViewerImageComponent implements OnInit, AfterViewInit {
zoom(zoomIn = true): void {
const imageElement = this.element.nativeElement.querySelector('img');
- if (!this.slidesSwiper || !imageElement) {
+ if (!this.swiper || !imageElement) {
return;
}
@@ -89,15 +104,15 @@ export class CoreViewerImageComponent implements OnInit, AfterViewInit {
: this.zoomRatio /= 2;
// Using 1 as minimum for manual zoom.
- this.zoomRatio = CoreMath.clamp(this.zoomRatio, 1, this.slidesOpts.zoom.maxRatio);
+ this.zoomRatio = CoreMath.clamp(this.zoomRatio, 1, CoreViewerImageComponent.MAX_RATIO);
if (this.zoomRatio > 1) {
- this.slidesSwiper.zoom.in();
+ this.swiper.zoom.in();
imageElement.style.transform =
'translate3d(0px, 0px, 0px) scale(' + this.zoomRatio + ')';
} else {
- this.slidesSwiper.zoom.out();
+ this.swiper.zoom.out();
}
}
diff --git a/src/core/features/viewer/components/qr-scanner/qr-scanner.html b/src/core/features/viewer/components/qr-scanner/qr-scanner.html
index b572b1d0b..3fc073023 100644
--- a/src/core/features/viewer/components/qr-scanner/qr-scanner.html
+++ b/src/core/features/viewer/components/qr-scanner/qr-scanner.html
@@ -5,10 +5,9 @@
-
+
-
-
+
diff --git a/src/core/features/viewer/components/text/text.html b/src/core/features/viewer/components/text/text.html
index dd0f64752..7753bb032 100644
--- a/src/core/features/viewer/components/text/text.html
+++ b/src/core/features/viewer/components/text/text.html
@@ -5,23 +5,22 @@
-
+
-
+ [contextInstanceId]="instanceId" [courseId]="courseId" />
-
+
-
+
{{ 'core.copytoclipboard' | translate }}
diff --git a/src/core/features/viewer/pages/iframe/iframe.html b/src/core/features/viewer/pages/iframe/iframe.html
index 16ecc4b39..f102eba35 100644
--- a/src/core/features/viewer/pages/iframe/iframe.html
+++ b/src/core/features/viewer/pages/iframe/iframe.html
@@ -1,7 +1,7 @@
-
+
{{ title }}
@@ -10,6 +10,6 @@
-
+
diff --git a/src/core/initializers/clear-tmp-folder.ts b/src/core/initializers/clear-tmp-folder.ts
index 6249f79a4..44c3e2d82 100644
--- a/src/core/initializers/clear-tmp-folder.ts
+++ b/src/core/initializers/clear-tmp-folder.ts
@@ -14,6 +14,9 @@
import { CoreFile } from '@services/file';
+/**
+ * Clears the temporary folder.
+ */
export default async function(): Promise {
await CoreFile.clearTmpFolder();
}
diff --git a/src/core/initializers/consume-storage-redirect.ts b/src/core/initializers/consume-storage-redirect.ts
index 990636a0c..20b776ae3 100644
--- a/src/core/initializers/consume-storage-redirect.ts
+++ b/src/core/initializers/consume-storage-redirect.ts
@@ -15,6 +15,9 @@
import { CoreApp } from '@services/app';
import { CoreUpdateManager } from '@services/update-manager';
+/**
+ * Read redirect data from local storage and clear it if it existed.
+ */
export default async function(): Promise {
await CoreUpdateManager.donePromise;
diff --git a/src/core/initializers/index.ts b/src/core/initializers/index.ts
index 56c30b171..993ba5d32 100644
--- a/src/core/initializers/index.ts
+++ b/src/core/initializers/index.ts
@@ -14,6 +14,12 @@
import { APP_INITIALIZER, Provider } from '@angular/core';
+/**
+ * Get the providers for the initializers.
+ * Please use the APP_INITIALIZER token to provide the initializers.
+ *
+ * @returns List of providers.
+ */
export function getInitializerProviders(): Provider[] {
const context = require.context('./', false, /\.ts$/);
diff --git a/src/core/initializers/initialize-services.ts b/src/core/initializers/initialize-services.ts
index 77d7b4ae8..bffdd03e0 100644
--- a/src/core/initializers/initialize-services.ts
+++ b/src/core/initializers/initialize-services.ts
@@ -22,6 +22,9 @@ import { CoreSites } from '@services/sites';
import { CoreUpdateManager } from '@services/update-manager';
import { CoreTimeUtils } from '@services/utils/time';
+/**
+ * Initializes various core components asynchronously.
+ */
export default async function(): Promise {
await Promise.all([
CoreConfig.initialize(),
diff --git a/src/core/initializers/initialize-urlscheme.ts b/src/core/initializers/initialize-urlscheme.ts
index af0aee7dd..312d53c1f 100644
--- a/src/core/initializers/initialize-urlscheme.ts
+++ b/src/core/initializers/initialize-urlscheme.ts
@@ -16,6 +16,9 @@ import { CoreCustomURLSchemes } from '@services/urlschemes';
import { NgZone } from '@singletons';
import { CoreEvents } from '@singletons/events';
+/**
+ * Asynchronous function to handle custom URLs when the app is launched.
+ */
export default async function(): Promise {
const lastUrls: Record = {};
diff --git a/src/core/initializers/initialize-user-agent.ts b/src/core/initializers/initialize-user-agent.ts
index 2b87862be..3a6ab0852 100644
--- a/src/core/initializers/initialize-user-agent.ts
+++ b/src/core/initializers/initialize-user-agent.ts
@@ -15,6 +15,9 @@
import { CorePlatform } from '@services/platform';
import { NativeHttp } from '@singletons';
+/**
+ * This function sets the User-Agent header using NativeHttp for mobile platform.
+ */
export default async function(): Promise {
if (!CorePlatform.isMobile()) {
return;
diff --git a/src/core/initializers/override-window-open.ts b/src/core/initializers/override-window-open.ts
index 04e4ec995..d48dc9436 100644
--- a/src/core/initializers/override-window-open.ts
+++ b/src/core/initializers/override-window-open.ts
@@ -14,7 +14,10 @@
import { CorePlatform } from '@services/platform';
-export default async function(): Promise {
+/**
+ * Initializes the application and sets up the InAppBrowser if available.
+ */
+export default async function initializeApp(): Promise {
await CorePlatform.ready();
if (!window.cordova?.InAppBrowser) {
diff --git a/src/core/initializers/prepare-devtools.ts b/src/core/initializers/prepare-devtools.ts
index 7e0d4d255..f2442ebad 100644
--- a/src/core/initializers/prepare-devtools.ts
+++ b/src/core/initializers/prepare-devtools.ts
@@ -29,6 +29,11 @@ type DevelopmentWindow = Window & {
pushNotifications?: CorePushNotificationsProvider;
};
+/**
+ * Initializes the development window with necessary providers and configurations.
+ *
+ * @param window The development window object to be initialized.
+ */
function initializeDevelopmentWindow(window: DevelopmentWindow) {
window.browser = CoreBrowser;
window.appProvider = CoreApp.instance;
@@ -38,6 +43,9 @@ function initializeDevelopmentWindow(window: DevelopmentWindow) {
window.pushNotifications = CorePushNotifications.instance;
}
+/**
+ * Initializes the development tools if enabled by CoreConstants.
+ */
export default function(): void {
if (!CoreConstants.enableDevTools()) {
return;
diff --git a/src/core/initializers/restore-session.ts b/src/core/initializers/restore-session.ts
index 41914ea02..d96b32927 100644
--- a/src/core/initializers/restore-session.ts
+++ b/src/core/initializers/restore-session.ts
@@ -15,6 +15,9 @@
import { CoreSites } from '@services/sites';
import { CoreUpdateManager } from '@services/update-manager';
+/**
+ * Restores the session to the previous one so the user doesn't has to login everytime the app is started.
+ */
export default async function(): Promise {
await CoreUpdateManager.donePromise;
diff --git a/src/core/initializers/subscribe-to-keyboard-events.ts b/src/core/initializers/subscribe-to-keyboard-events.ts
index 9bb7deb14..56728d493 100644
--- a/src/core/initializers/subscribe-to-keyboard-events.ts
+++ b/src/core/initializers/subscribe-to-keyboard-events.ts
@@ -15,6 +15,9 @@
import { CoreApp } from '@services/app';
import { NgZone, Keyboard } from '@singletons';
+/**
+ * Initializes keyboard event listeners and ensures Angular zone is properly managed for change detection.
+ */
export default function(): void {
const zone = NgZone.instance;
const app = CoreApp.instance;
diff --git a/src/core/initializers/wait-for-platform-ready.ts b/src/core/initializers/wait-for-platform-ready.ts
index 7604edb5a..90e521685 100644
--- a/src/core/initializers/wait-for-platform-ready.ts
+++ b/src/core/initializers/wait-for-platform-ready.ts
@@ -14,6 +14,9 @@
import { CorePlatform } from '@services/platform';
+/**
+ * Initializes the application when the CorePlatform is ready.
+ */
export default async function(): Promise {
await CorePlatform.ready();
}
diff --git a/src/core/initializers/watch-screen-status.ts b/src/core/initializers/watch-screen-status.ts
index ee4d5fcf1..326cced43 100644
--- a/src/core/initializers/watch-screen-status.ts
+++ b/src/core/initializers/watch-screen-status.ts
@@ -14,6 +14,10 @@
import { CoreScreen } from '@services/screen';
+/**
+ * Initializes the application by watching the viewport and orientation changes.
+ * This function should be called to set up necessary event listeners for proper functionality.
+ */
export default function(): void {
CoreScreen.watchViewport();
diff --git a/src/core/services/file-helper.ts b/src/core/services/file-helper.ts
index 93825ee38..4914dab06 100644
--- a/src/core/services/file-helper.ts
+++ b/src/core/services/file-helper.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreNetwork } from '@services/network';
import { CoreFile } from '@services/file';
diff --git a/src/core/services/file.ts b/src/core/services/file.ts
index 939cea4ee..f5988f8b6 100644
--- a/src/core/services/file.ts
+++ b/src/core/services/file.ts
@@ -14,7 +14,7 @@
import { Injectable } from '@angular/core';
-import { FileEntry, DirectoryEntry, Entry, Metadata, IFile } from '@ionic-native/file/ngx';
+import { FileEntry, DirectoryEntry, Entry, Metadata, IFile } from '@awesome-cordova-plugins/file/ngx';
import { CoreMimetypeUtils } from '@services/utils/mimetype';
import { CoreTextUtils } from '@services/utils/text';
diff --git a/src/core/services/geolocation.ts b/src/core/services/geolocation.ts
index dbbd977c0..c696550f3 100644
--- a/src/core/services/geolocation.ts
+++ b/src/core/services/geolocation.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { Coordinates } from '@ionic-native/geolocation';
+import { Coordinates } from '@awesome-cordova-plugins/geolocation';
import { CoreApp } from '@services/app';
import { CoreAnyError, CoreError } from '@classes/errors/error';
diff --git a/src/core/services/local-notifications.ts b/src/core/services/local-notifications.ts
index 3a776001d..87fa6ff1e 100644
--- a/src/core/services/local-notifications.ts
+++ b/src/core/services/local-notifications.ts
@@ -14,7 +14,7 @@
import { Injectable } from '@angular/core';
import { Subject, Subscription } from 'rxjs';
-import { ILocalNotification } from '@ionic-native/local-notifications';
+import { ILocalNotification } from '@awesome-cordova-plugins/local-notifications';
import { CoreApp } from '@services/app';
import { CoreConfig } from '@services/config';
diff --git a/src/core/services/navigator.ts b/src/core/services/navigator.ts
index a0f33b6f4..2c164ce84 100644
--- a/src/core/services/navigator.ts
+++ b/src/core/services/navigator.ts
@@ -15,7 +15,7 @@
import { Injectable } from '@angular/core';
import { ActivatedRoute, ActivatedRouteSnapshot, NavigationEnd, Params } from '@angular/router';
-import { NavigationOptions } from '@ionic/angular/providers/nav-controller';
+import { NavigationOptions } from '@ionic/angular/common/providers/nav-controller';
import { CoreConstants } from '@/core/constants';
import { CoreDomUtils } from '@services/utils/dom';
@@ -437,8 +437,8 @@ export class CoreNavigatorService {
*
* @returns Promise resolved when done.
*/
- back(): Promise {
- return NavController.pop();
+ async back(): Promise {
+ await NavController.pop();
}
/**
diff --git a/src/core/services/network.ts b/src/core/services/network.ts
index b50a87601..bedc9549b 100644
--- a/src/core/services/network.ts
+++ b/src/core/services/network.ts
@@ -14,7 +14,7 @@
import { Injectable } from '@angular/core';
import { CorePlatform } from '@services/platform';
-import { Network } from '@ionic-native/network/ngx';
+import { Network } from '@awesome-cordova-plugins/network/ngx';
import { makeSingleton } from '@singletons';
import { Observable, Subject, merge } from 'rxjs';
diff --git a/src/core/services/plugin-file-delegate.ts b/src/core/services/plugin-file-delegate.ts
index 8cfb3f32f..65b0b8e12 100644
--- a/src/core/services/plugin-file-delegate.ts
+++ b/src/core/services/plugin-file-delegate.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFilepool, CoreFilepoolOnProgressCallback } from '@services/filepool';
import { CoreWSFile } from '@services/ws';
diff --git a/src/core/services/utils/iframe.ts b/src/core/services/utils/iframe.ts
index 50b28f91d..5a2db963a 100644
--- a/src/core/services/utils/iframe.ts
+++ b/src/core/services/utils/iframe.ts
@@ -62,8 +62,6 @@ export class CoreIframeUtilsProvider {
* @returns True if frame is online and the app is offline, false otherwise.
*/
checkOnlineFrameInOffline(element: CoreFrameElement, isSubframe?: boolean): boolean {
- // @todo Drop frame tag support to avoid deprecation.
- // eslint-disable-next-line deprecation/deprecation
const src = 'src' in element ? element.src : element.data;
if (src && src != 'about:blank' && !CoreUrlUtils.isLocalFileUrl(src) && !CoreNetwork.isOnline()) {
@@ -91,7 +89,7 @@ export class CoreIframeUtilsProvider {
// Reload the frame.
if ('src' in element) {
// eslint-disable-next-line no-self-assign
- element.src = element.src; // eslint-disable-line deprecation/deprecation
+ element.src = element.src;
} else {
// eslint-disable-next-line no-self-assign
@@ -135,7 +133,6 @@ export class CoreIframeUtilsProvider {
const canHandleLink = await CoreContentLinksHelper.canHandleLink(src, undefined, username);
if (!canHandleLink) {
- // @todo The not connected icon isn't seen due to the div's height. Also, it's quite big.
div.innerHTML = (isSubframe ? '' : '
') +
'' + Translate.instant('core.networkerroriframemsg') + '
';
@@ -232,21 +229,18 @@ export class CoreIframeUtilsProvider {
* @returns Window and Document.
*/
getContentWindowAndDocument(element: CoreFrameElement): { window: Window | null; document: Document | null } {
- // @todo Drop frame tag support to avoid deprecation.
- // eslint-disable-next-line deprecation/deprecation
const src = 'src' in element ? element.src : element.data;
if (src !== 'about:blank' && !CoreUrlUtils.isLocalFileUrl(src)) {
// No permissions to access the iframe.
return { window: null, document: null };
}
- // eslint-disable-next-line deprecation/deprecation
let contentWindow: Window | null = 'contentWindow' in element ? element.contentWindow : null;
let contentDocument: Document | null = null;
try {
- contentDocument = 'contentDocument' in element && element.contentDocument // eslint-disable-line deprecation/deprecation
- ? element.contentDocument // eslint-disable-line deprecation/deprecation
+ contentDocument = 'contentDocument' in element && element.contentDocument
+ ? element.contentDocument
: contentWindow && contentWindow.document;
} catch {
// Ignore errors.
@@ -425,9 +419,8 @@ export class CoreIframeUtilsProvider {
const scheme = CoreUrlUtils.getUrlScheme(url);
if (!scheme) {
// It's a relative URL, use the frame src to create the full URL.
- // @todo Drop frame tag support to avoid deprecation.
const src = element
- ? ('src' in element ? element.src : element.data) // eslint-disable-line deprecation/deprecation
+ ? ('src' in element ? element.src : element.data)
: null;
if (src) {
const dirAndFile = CoreFile.getFileAndDirectoryFromPath(src);
diff --git a/src/core/services/utils/mimetype.ts b/src/core/services/utils/mimetype.ts
index e563cf843..69d6496a9 100644
--- a/src/core/services/utils/mimetype.ts
+++ b/src/core/services/utils/mimetype.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreFile } from '@services/file';
import { CoreTextUtils } from '@services/utils/text';
diff --git a/src/core/services/utils/utils.ts b/src/core/services/utils/utils.ts
index 16ccfe1f2..b9710aaca 100644
--- a/src/core/services/utils/utils.ts
+++ b/src/core/services/utils/utils.ts
@@ -13,8 +13,8 @@
// limitations under the License.
import { Injectable } from '@angular/core';
-import { InAppBrowserObject, InAppBrowserOptions } from '@ionic-native/in-app-browser';
-import { FileEntry } from '@ionic-native/file/ngx';
+import { InAppBrowserObject, InAppBrowserOptions } from '@awesome-cordova-plugins/in-app-browser';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { Subscription } from 'rxjs';
import { CoreEvents } from '@singletons/events';
@@ -1059,7 +1059,7 @@ export class CoreUtilsProvider {
/**
* Open a URL using InAppBrowser.
- * Do not use for files, refer to {@link openFile}.
+ * Do not use for files, refer to {@link CoreUtilsProvider.openFile}.
*
* @param url The URL to open.
* @param options Override default options passed to InAppBrowser.
@@ -1176,7 +1176,7 @@ export class CoreUtilsProvider {
/**
* Open a URL using a browser.
- * Do not use for files, refer to {@link openFile}.
+ * Do not use for files, refer to {@link CoreUtilsProvider.openFile}.
*
* @param url The URL to open.
* @param options Options.
diff --git a/src/core/services/ws.ts b/src/core/services/ws.ts
index 3f8d682eb..8e7d7ae0c 100644
--- a/src/core/services/ws.ts
+++ b/src/core/services/ws.ts
@@ -15,8 +15,8 @@
import { Injectable } from '@angular/core';
import { HttpResponse, HttpParams, HttpErrorResponse } from '@angular/common/http';
-import { FileEntry } from '@ionic-native/file/ngx';
-import { FileUploadOptions, FileUploadResult } from '@ionic-native/file-transfer/ngx';
+import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
+import { FileUploadOptions, FileUploadResult } from '@awesome-cordova-plugins/file-transfer/ngx';
import { Md5 } from 'ts-md5/dist/md5';
import { Observable, firstValueFrom } from 'rxjs';
import { timeout } from 'rxjs/operators';
@@ -260,7 +260,7 @@ export class CoreWSProvider {
// Download the file in the tmp file.
await transfer.download(url, fileEntry.toURL(), true, {
headers: {
- 'User-Agent': navigator.userAgent, // eslint-disable-line @typescript-eslint/naming-convention
+ 'User-Agent': navigator.userAgent,
},
});
@@ -995,7 +995,7 @@ export class CoreWSProvider {
};
options.chunkedMode = false;
options.headers = {
- 'User-Agent': navigator.userAgent, // eslint-disable-line @typescript-eslint/naming-convention
+ 'User-Agent': navigator.userAgent,
};
options['Connection'] = 'close';
diff --git a/src/core/singletons/index.ts b/src/core/singletons/index.ts
index 493dd35a0..52e8fea21 100644
--- a/src/core/singletons/index.ts
+++ b/src/core/singletons/index.ts
@@ -37,29 +37,29 @@ import {
PopoverController as PopoverControllerService,
} from '@ionic/angular';
-import { Badge as BadgeService } from '@ionic-native/badge/ngx';
-import { Camera as CameraService } from '@ionic-native/camera/ngx';
-import { Chooser as ChooserService } from '@ionic-native/chooser/ngx';
-import { Clipboard as ClipboardService } from '@ionic-native/clipboard/ngx';
-import { Diagnostic as DiagnosticService } from '@ionic-native/diagnostic/ngx';
-import { Device as DeviceService } from '@ionic-native/device/ngx';
-import { File as FileService } from '@ionic-native/file/ngx';
-import { FileOpener as FileOpenerService } from '@ionic-native/file-opener/ngx';
-import { FileTransfer as FileTransferService } from '@ionic-native/file-transfer/ngx';
-import { Geolocation as GeolocationService } from '@ionic-native/geolocation/ngx';
-import { HTTP } from '@ionic-native/http/ngx';
-import { InAppBrowser as InAppBrowserService } from '@ionic-native/in-app-browser/ngx';
-import { WebView as WebViewService } from '@ionic-native/ionic-webview/ngx';
-import { Keyboard as KeyboardService } from '@ionic-native/keyboard/ngx';
-import { LocalNotifications as LocalNotificationsService } from '@ionic-native/local-notifications/ngx';
-import { MediaCapture as MediaCaptureService } from '@ionic-native/media-capture/ngx';
+import { Badge as BadgeService } from '@awesome-cordova-plugins/badge/ngx';
+import { Camera as CameraService } from '@awesome-cordova-plugins/camera/ngx';
+import { Chooser as ChooserService } from '@awesome-cordova-plugins/chooser/ngx';
+import { Clipboard as ClipboardService } from '@awesome-cordova-plugins/clipboard/ngx';
+import { Diagnostic as DiagnosticService } from '@awesome-cordova-plugins/diagnostic/ngx';
+import { Device as DeviceService } from '@awesome-cordova-plugins/device/ngx';
+import { File as FileService } from '@awesome-cordova-plugins/file/ngx';
+import { FileOpener as FileOpenerService } from '@awesome-cordova-plugins/file-opener/ngx';
+import { FileTransfer as FileTransferService } from '@awesome-cordova-plugins/file-transfer/ngx';
+import { Geolocation as GeolocationService } from '@awesome-cordova-plugins/geolocation/ngx';
+import { HTTP } from '@awesome-cordova-plugins/http/ngx';
+import { InAppBrowser as InAppBrowserService } from '@awesome-cordova-plugins/in-app-browser/ngx';
+import { WebView as WebViewService } from '@awesome-cordova-plugins/ionic-webview/ngx';
+import { Keyboard as KeyboardService } from '@awesome-cordova-plugins/keyboard/ngx';
+import { LocalNotifications as LocalNotificationsService } from '@awesome-cordova-plugins/local-notifications/ngx';
+import { MediaCapture as MediaCaptureService } from '@awesome-cordova-plugins/media-capture/ngx';
import { Push as PushService } from '@moodlehq/ionic-native-push/ngx';
import { QRScanner as QRScannerService } from '@ionic-native/qr-scanner/ngx';
-import { StatusBar as StatusBarService } from '@ionic-native/status-bar/ngx';
-import { SplashScreen as SplashScreenService } from '@ionic-native/splash-screen/ngx';
-import { SQLite as SQLiteService } from '@ionic-native/sqlite/ngx';
-import { WebIntent as WebIntentService } from '@ionic-native/web-intent/ngx';
-import { Zip as ZipService } from '@ionic-native/zip/ngx';
+import { StatusBar as StatusBarService } from '@awesome-cordova-plugins/status-bar/ngx';
+import { SplashScreen as SplashScreenService } from '@awesome-cordova-plugins/splash-screen/ngx';
+import { SQLite as SQLiteService } from '@awesome-cordova-plugins/sqlite/ngx';
+import { WebIntent as WebIntentService } from '@awesome-cordova-plugins/web-intent/ngx';
+import { Zip as ZipService } from '@awesome-cordova-plugins/zip/ngx';
import { TranslateService } from '@ngx-translate/core';
diff --git a/src/core/utils/rxjs.ts b/src/core/utils/rxjs.ts
index bc29138e6..63b959856 100644
--- a/src/core/utils/rxjs.ts
+++ b/src/core/utils/rxjs.ts
@@ -77,6 +77,8 @@ export function asyncObservable(createObservable: () => Promise
});
}
+export function ignoreErrors(observable: Observable): Observable;
+export function ignoreErrors(observable: Observable, fallback: Fallback): Observable;
/**
* Ignore errors from an observable, returning a certain value instead.
*
@@ -84,8 +86,6 @@ export function asyncObservable(createObservable: () => Promise
* @param fallback Value to return if the observer errors.
* @returns Observable with ignored errors, returning the fallback result if provided.
*/
-export function ignoreErrors(observable: Observable): Observable;
-export function ignoreErrors(observable: Observable, fallback: Fallback): Observable;
export function ignoreErrors(
observable: Observable,
fallback?: Fallback,
diff --git a/src/storybook/stubs/classes/sqlitedb.ts b/src/storybook/stubs/classes/sqlitedb.ts
index 94d81b5a1..f35345951 100644
--- a/src/storybook/stubs/classes/sqlitedb.ts
+++ b/src/storybook/stubs/classes/sqlitedb.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { SQLiteDB } from '@classes/sqlitedb';
-import { SQLiteObject } from '@ionic-native/sqlite/ngx';
+import { SQLiteObject } from '@awesome-cordova-plugins/sqlite/ngx';
/**
* SQlite database stub.
diff --git a/src/testing/services/behat-blocking.ts b/src/testing/services/behat-blocking.ts
index 8ae1d02be..57329ba71 100644
--- a/src/testing/services/behat-blocking.ts
+++ b/src/testing/services/behat-blocking.ts
@@ -204,7 +204,7 @@ export class TestingBehatBlockingService {
return false;
}
- const slide = element.closest('ion-slide');
+ const slide = element.closest('swiper-slide');
if (slide && !slide.classList.contains('swiper-slide-active')) {
return false;
}
diff --git a/src/testing/services/behat-dom.ts b/src/testing/services/behat-dom.ts
index 2705a33ac..06f09a91f 100644
--- a/src/testing/services/behat-dom.ts
+++ b/src/testing/services/behat-dom.ts
@@ -48,7 +48,7 @@ export class TestingBehatDomUtilsService {
return false;
}
- if (element.tagName === 'ION-SLIDE') {
+ if (element.tagName === 'SWIPER-SLIDE') {
// Check if the slide is visible (in the viewport).
const bounding = element.getBoundingClientRect();
if (bounding.right <= 0 || bounding.left >= window.innerWidth) {
diff --git a/src/testing/services/behat-runtime.ts b/src/testing/services/behat-runtime.ts
index ffc67398e..4945a1246 100644
--- a/src/testing/services/behat-runtime.ts
+++ b/src/testing/services/behat-runtime.ts
@@ -29,7 +29,7 @@ import { Injectable } from '@angular/core';
import { CoreSites, CoreSitesProvider } from '@services/sites';
import { CoreNavigator, CoreNavigatorService } from '@services/navigator';
import { CoreSwipeNavigationDirective } from '@directives/swipe-navigation';
-import { IonSlides } from '@ionic/angular';
+import { Swiper } from 'swiper';
/**
* Behat runtime servive with public API.
@@ -631,8 +631,8 @@ export class TestingBehatRuntimeService {
this.log('Action - Swipe', { direction, locator });
if (locator) {
- // Locator specified, try to find ion-slides first.
- const instance = this.getAngularInstance('ion-slides', 'IonSlides', locator);
+ // Locator specified, try to find swiper-container first.
+ const instance = this.getAngularInstance('swiper-container', 'Swiper', locator);
if (instance) {
direction === 'left' ? instance.slideNext() : instance.slidePrev();
@@ -640,7 +640,7 @@ export class TestingBehatRuntimeService {
}
}
- // No locator specified or ion-slides not found, search swipe navigation now.
+ // No locator specified or swiper-container not found, search swipe navigation now.
const instance = this.getAngularInstance(
'ion-content',
'CoreSwipeNavigationDirective',
diff --git a/src/testing/testing.module.ts b/src/testing/testing.module.ts
index 479df360d..3b92ac120 100644
--- a/src/testing/testing.module.ts
+++ b/src/testing/testing.module.ts
@@ -21,6 +21,11 @@ type AutomatedTestsWindow = Window & {
behat?: TestingBehatRuntimeService;
};
+/**
+ * Initialize automated tests.
+ *
+ * @param window Window.
+ */
function initializeAutomatedTests(window: AutomatedTestsWindow) {
if (!CoreAppProvider.isAutomated()) {
return;
diff --git a/src/testing/utils.ts b/src/testing/utils.ts
index 092adaf13..7c78b93d8 100644
--- a/src/testing/utils.ts
+++ b/src/testing/utils.ts
@@ -80,6 +80,13 @@ const DEFAULT_SERVICE_SINGLETON_MOCKS: [CoreSingletonProxy, unknown][] = [
})],
];
+/**
+ * Renders an Angular component for testing.
+ *
+ * @param component The Angular component to render.
+ * @param config Configuration options for rendering.
+ * @returns A promise that resolves to the testing component fixture.
+ */
async function renderAngularComponent(component: Type, config: RenderConfig): Promise> {
config.declarations.push(component);
@@ -114,6 +121,13 @@ async function renderAngularComponent(component: Type, config: RenderConfi
return fixture;
}
+/**
+ * Creates a wrapper component for testing.
+ *
+ * @param template The template for the wrapper component.
+ * @param componentClass The class of the component to be wrapped.
+ * @returns The wrapper component class.
+ */
function createWrapperComponent(template: string, componentClass: Type): Type> {
@Component({ template })
class HostComponent extends WrapperComponent {
@@ -125,6 +139,11 @@ function createWrapperComponent(template: string, componentClass: Type): T
return HostComponent;
}
+/**
+ * Gets the default declarations for testing.
+ *
+ * @returns An array of default declarations.
+ */
function getDefaultDeclarations(): unknown[] {
return [
TranslatePipeStub,
@@ -132,6 +151,12 @@ function getDefaultDeclarations(): unknown[] {
];
}
+/**
+ * Gets the default providers for testing.
+ *
+ * @param config Configuration options for rendering.
+ * @returns An array of default providers.
+ */
function getDefaultProviders(config: RenderConfig): unknown[] {
const serviceProviders = DEFAULT_SERVICE_SINGLETON_MOCKS.map(
([singleton, mockInstance]) => ({
@@ -159,6 +184,12 @@ function getDefaultProviders(config: RenderConfig): unknown[] {
];
}
+/**
+ * Resolves a service instance from the TestBed.
+ *
+ * @param injectionToken The injection token for the service.
+ * @returns The service instance or null if not found.
+ */
function resolveServiceInstanceFromTestBed(injectionToken: Exclude): Record | null {
if (!testBedInitialized) {
return null;
@@ -167,6 +198,12 @@ function resolveServiceInstanceFromTestBed(injectionToken: Exclude | null;
}
+/**
+ * Creates a new instance of a service.
+ *
+ * @param injectionToken The injection token for the service.
+ * @returns The new service instance or null if an error occurs.
+ */
function createNewServiceInstance(injectionToken: Exclude): Record | null {
try {
const constructor = injectionToken as { new (): Record };
@@ -192,6 +229,14 @@ export type TestingComponentFixture = Omit, 'na
export type WrapperComponentFixture = TestingComponentFixture>;
+/**
+ * Finds an element in the fixture's native element.
+ *
+ * @param fixture The testing component fixture.
+ * @param selector The CSS selector for the element.
+ * @param content The text content or regular expression to match.
+ * @returns The element or null if not found.
+ */
export function findElement(
fixture: TestingComponentFixture,
selector: string,
@@ -215,6 +260,14 @@ export function findElement(
return null;
}
+/**
+ * Requires an element in the fixture's native element.
+ *
+ * @param fixture The testing component fixture.
+ * @param selector The CSS selector for the element.
+ * @param content The text content or regular expression to match.
+ * @returns The element.
+ */
export function requireElement(
fixture: TestingComponentFixture,
selector: string,
@@ -272,6 +325,15 @@ export function mockSingleton(
methods: string[],
instance?: Record,
): T;
+
+/**
+ * Mocks a singleton instance for testing purposes.
+ *
+ * @param singleton The singleton class or proxy.
+ * @param methodsOrProperties An array of method names to mock or an object containing property names and values.
+ * @param properties If `methodsOrProperties` is an array, this object contains the properties to mock.
+ * @returns The mocked singleton instance.
+ */
export function mockSingleton(
singleton: CoreSingletonProxy,
methodsOrProperties: string[] | Record = [],
@@ -299,6 +361,10 @@ export function mockSingleton(
return mockInstance;
}
+/**
+ * Resets the testing environment by marking the test bed as uninitialized and
+ * restoring default service singleton mocks.
+ */
export function resetTestingEnvironment(): void {
testBedInitialized = false;
@@ -307,6 +373,15 @@ export function resetTestingEnvironment(): void {
}
}
+/**
+ * Retrieves the service instance corresponding to the provided injection token.
+ * If the injection token is a string, an empty object is returned.
+ * If the service instance is found in the test bed, it is returned.
+ * If not found, a new service instance is created, or an empty object is returned if creation fails.
+ *
+ * @param injectionToken The injection token for the desired service.
+ * @returns The service instance or an empty object.
+ */
export function getServiceInstance(injectionToken: ServiceInjectionToken): Record {
if (typeof injectionToken === 'string') {
return {};
@@ -317,6 +392,13 @@ export function getServiceInstance(injectionToken: ServiceInjectionToken): Recor
?? {};
}
+/**
+ * Renders a component with the given configuration.
+ *
+ * @param component The Angular component to render.
+ * @param config Configuration options for rendering.
+ * @returns A promise that resolves to the testing component fixture.
+ */
export async function renderComponent(
component: Type,
config: Partial = {},
@@ -329,6 +411,13 @@ export async function renderComponent(
});
}
+/**
+ * Renders a page component with the given configuration.
+ *
+ * @param component The Angular component to render.
+ * @param config Configuration options for rendering a page component.
+ * @returns A promise that resolves to the testing component fixture.
+ */
export async function renderPageComponent(
component: Type,
config: Partial = {},
@@ -347,6 +436,14 @@ export async function renderPageComponent(
return renderComponent(component, config);
}
+/**
+ * Renders a template with the given configuration.
+ *
+ * @param component The Angular component to wrap in a template.
+ * @param template The template for the wrapper component.
+ * @param config Configuration options for rendering.
+ * @returns A promise that resolves to the wrapper component fixture.
+ */
export async function renderTemplate(
component: Type,
template: string,
@@ -366,6 +463,15 @@ export async function renderTemplate(
);
}
+/**
+ * Renders a wrapper component with the given configuration.
+ *
+ * @param component The Angular component to wrap.
+ * @param tag The HTML tag for the wrapper component.
+ * @param inputs Input attributes for the wrapper component.
+ * @param config Configuration options for rendering.
+ * @returns A promise that resolves to the wrapper component fixture.
+ */
export async function renderWrapperComponent(
component: Type,
tag: string,
@@ -423,10 +529,21 @@ export function mockTranslate(translations: Record = {}): void {
});
}
+/**
+ * Creates a test function that asserts that two types are equal.
+ *
+ * @param equal The equality check function for types A and B.
+ * @returns A test function that asserts equality.
+ */
export function expectSameTypes(equal: Equal ): () => void {
return () => expect(equal).toBe(true);
}
+/**
+ * Creates a test function that always asserts true, used for testing generic types.
+ *
+ * @returns A test function that always asserts true.
+ */
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export function expectAnyType(): () => void {
return () => expect(true).toBe(true);
diff --git a/src/theme/components/format-text.scss b/src/theme/components/format-text.scss
index 2b937a7d8..9a1a635f6 100644
--- a/src/theme/components/format-text.scss
+++ b/src/theme/components/format-text.scss
@@ -1,6 +1,7 @@
/** Format Text - Show more styles. */
/** Styles of elements inside the directive should be placed in format-text.scss */
@use "theme/globals.variables" as global;
+@use "sass:math" as math;
core-format-text {
--core-format-text-background: var(--background, var(--ion-item-background));
@@ -182,19 +183,19 @@ core-format-text {
.embed-responsive-21by9 {
&::before {
- padding-top: percentage(9 / 21);
+ padding-top: percentage(math.div(9, 21));
}
}
.embed-responsive-16by9 {
&::before {
- padding-top: percentage(9 / 16);
+ padding-top: percentage(math.div(9, 16));
}
}
.embed-responsive-4by3 {
&::before {
- padding-top: percentage(3 / 4);
+ padding-top: percentage(math.div(3, 4));
}
}
diff --git a/src/theme/helpers/custom.mixins.scss b/src/theme/helpers/custom.mixins.scss
index dfafaa7b0..87e419ad9 100644
--- a/src/theme/helpers/custom.mixins.scss
+++ b/src/theme/helpers/custom.mixins.scss
@@ -248,7 +248,7 @@
// Color mixins.
@function get_brightness($color) {
- @return (red($color) + green($color) + blue($color)) / 3;
+ @return math.div(red($color) + green($color) + blue($color), 3);
}
// Get the better color contrast using WCAG algorythm.
@@ -256,9 +256,9 @@
$lumiance: luminance($color);
// White lumiance is 1.
- $whiteContrast: ($lumiance + 0.05) / (1 + 0.05);
+ $whiteContrast: math.div($lumiance + 0.05, 1 + 0.05);
// White lumiance is 0.
- $blackContrast: (0.05) / ($lumiance + 0.05);
+ $blackContrast: math.div(0.05, $lumiance + 0.05);
@return if($whiteContrast < $blackContrast, white, black);
}
@@ -269,7 +269,7 @@
$g: green($color);
$b: blue($color);
- $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
+ $yiq: math.div(($r * 299) + ($g * 587) + ($b * 114), 1000);
@return if($yiq >= 128, $dark, $light);
}
@@ -280,9 +280,9 @@
$backgroundLuminance: luminance($background);
@if ($backgroundLuminance < $foregroundLumiance) {
- @return ($backgroundLuminance + 0.05) / ($foregroundLumiance + 0.05);
+ @return math.div($backgroundLuminance + 0.05, $foregroundLumiance + 0.05);
} @else {
- @return ($foregroundLumiance + 0.05) / ($backgroundLuminance + 0.05);
+ @return math.div($foregroundLumiance + 0.05, $backgroundLuminance + 0.05);
}
}
@@ -299,11 +299,11 @@
}
@function component-luminance($value) {
- $value: $value / 255;
+ $value: math.div($value, 255);
@if ($value <= 0.03928) {
- @return $value / 12.92;
+ @return math.div($value, 12.92);
} @else {
- @return math.pow(($value + 0.055) / 1.055, 2.4);
+ @return math.pow(math.div($value + 0.055, 1.055), 2.4);
}
}
diff --git a/src/theme/theme.base.scss b/src/theme/theme.base.scss
index c6ef546ae..738bf9a49 100644
--- a/src/theme/theme.base.scss
+++ b/src/theme/theme.base.scss
@@ -151,7 +151,7 @@ ion-toolbar {
// Header.
ion-header {
- z-index: 12; // To hide ion-slides on scroll.
+ z-index: 12; // To hide swiper-container on scroll.
ion-toolbar {
ion-spinner {
@@ -680,7 +680,7 @@ body.core-iframe-fullscreen ion-router-outlet {
}
// Modals.
-.core-modal-fullscreen .modal-wrapper {
+.core-modal-fullscreen::part(content) {
position: absolute;
@include position(0 !important, null, null, 0 !important);
display: block;
@@ -690,11 +690,11 @@ body.core-iframe-fullscreen ion-router-outlet {
.core-modal-transparent {
- ion-backdrop {
+ &::part(backdrop) {
backdrop-filter: blur(8px);
}
- .modal-wrapper {
+ &::part(content) {
backdrop-filter: blur(12px);
--background: rgba(10, 10, 10, 0.2);
@@ -717,7 +717,7 @@ body.core-iframe-fullscreen ion-router-outlet {
--ion-safe-area-left: 0px;
--ion-safe-area-right: 0px;
- .modal-wrapper {
+ &::part(content) {
@include margin-horizontal(var(--modal-lateral-margin), null);
position: absolute;
@@ -729,7 +729,7 @@ body.core-iframe-fullscreen ion-router-outlet {
box-shadow: 0 28px 48px rgba(0, 0, 0, 0.4);
}
- ion-backdrop {
+ &::part(backdrop) {
visibility: visible;
}
@@ -740,10 +740,10 @@ body.core-iframe-fullscreen ion-router-outlet {
.core-modal-transparent-no-filter {
@extend .core-modal-transparent;
- ion-backdrop {
+ &::part(backdrop) {
backdrop-filter: none;
}
- .modal-wrapper {
+ &::part(content) {
backdrop-filter: none;
}
}
@@ -1107,7 +1107,7 @@ ion-checkbox,
input[type=checkbox] {
--border-radius: 2px;
--border-color-checked: var(--text-color);
- --background-checked: var(--text-color);
+ --checkbox-background-checked: var(--text-color);
--checkmark-color: var(--contrast-background);
--border-width: 2px;
--outer-border-width: 2px;
@@ -1318,7 +1318,7 @@ mark, .matchtext {
}
.core-scanning-qr {
- .ion-page, .modal-wrapper {
+ .ion-page, ion-modal::part(content) {
background-color: transparent !important;
--background: transparent;
}
@@ -1807,13 +1807,53 @@ ion-header.no-title {
flex-direction: column;
flex-grow: 1;
- ion-slides {
+ swiper-container {
flex-grow: 1;
max-width: 100%;
}
}
+}
+swiper-container {
+ --swiper-theme-color: var(--ion-color-primary, #3880ff);
+ --swiper-pagination-bullet-inactive-color: var(--ion-color-step-200, #cccccc);
+ --swiper-pagination-color: var(--swiper-theme-color);
+ --swiper-pagination-progressbar-bg-color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.25);
+ --swiper-scrollbar-bg-color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.1);
+ --swiper-scrollbar-drag-bg-color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.5);
+ width: 100%;
+ max-width: 100%;
+ max-height: 100vh;
+ // CSS Grid/Flexbox bug size workaround
+ // @see https://github.com/kenwheeler/slick/issues/982
+ // @see https://github.com/nolimits4web/swiper/issues/3599
+ min-height: 0;
+ min-width: 0;
+ swiper-slide {
+ display: flex;
+ position: relative;
+
+ flex-direction: column;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: center;
+
+ width: 100%;
+ height: 100%;
+
+ font-size: 18px;
+
+ text-align: center;
+ box-sizing: border-box;
+
+ img {
+ width: auto;
+ max-width: 100%;
+ height: auto;
+ max-height: 100%;
+ }
+ }
}
.has-spacer,
@@ -1887,14 +1927,14 @@ ion-modal {
--box-shadow: none !important;
pointer-events: none;
- ion-backdrop {
+ &::part(backdrop) {
display: none;
}
}
}
ion-popover {
- .popover-wrapper .popover-content {
+ &::part(content) {
border-radius: var(--modal-radius);
}
&.md {
@@ -1903,7 +1943,7 @@ ion-popover {
// Never show backdrop on popovers on Android
// @todo Apply box shadow on ios and make it transparent too. The main problem is the box arrow.
- ion-backdrop {
+ &::part(backdrop) {
background: transparent;
}
}
@@ -1926,3 +1966,10 @@ ion-popover {
inset: initial;
color: initial;
}
+
+/**
+ * https://github.com/ionic-team/ionic-framework/blob/6ffbdbb3b2b69290cf25753d535bc7483bd7c6e8/BREAKING.md#css-utilities
+ */
+[hidden] {
+ display: none !important;
+}
diff --git a/src/theme/theme.light.scss b/src/theme/theme.light.scss
index 4778e4428..a973751c2 100644
--- a/src/theme/theme.light.scss
+++ b/src/theme/theme.light.scss
@@ -146,7 +146,7 @@ html {
--core-header-buttons-background: var(--core-header-toolbar-background);
--core-header-buttons-color: var(--core-header-toolbar-color);
- ion-header {
+ ion-header, ion-header.header-md {
box-shadow: var(--core-header-shadow, none);
transition: box-shadow 0.5s;
@@ -247,7 +247,7 @@ html {
--core-tab-font-weight-active: normal;
--core-tabs-height: 48px;
core-tabs, core-tabs-outlet {
- ion-slide {
+ swiper-slide {
--background: var(--core-tab-background);
--color: var(--core-tab-color);
--border-color: var(--core-tab-border-color);
diff --git a/src/types/angular.d.ts b/src/types/angular.d.ts
index 4f63bb656..ca503972d 100644
--- a/src/types/angular.d.ts
+++ b/src/types/angular.d.ts
@@ -13,7 +13,7 @@
// limitations under the License.
import { UrlTree } from '@angular/router';
-import { NavigationOptions } from '@ionic/angular/providers/nav-controller';
+import { NavigationOptions } from '@ionic/angular/common/providers/nav-controller';
declare module '@ionic/angular' {
diff --git a/upgrade.txt b/upgrade.txt
index b574fc614..69a177f0b 100644
--- a/upgrade.txt
+++ b/upgrade.txt
@@ -8,6 +8,7 @@ For more information about upgrading, read the official documentation: https://m
- CoreCache has been deprecated, use plain object as in-memory stores instead.
- Renamed CoreLoginSitesComponent to CoreLoginSitesModalComponent to make it clear that it's a modal and to avoid confusing it with the new CoreSitesListComponent.
- Removed CoreToLocaleStringPipe deprecated since 3.6.0
+ - With the upgrade to Ionic 7 ion-slides is no longer supported and now you need to use swiper-container and swiper-slide. More info here: https://ionicframework.com/docs/angular/slides
=== 4.3.0 ===