diff --git a/package-lock.json b/package-lock.json index b3b49a24dca..27c5e2a86cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -432,150 +432,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", @@ -592,214 +448,6 @@ "node": ">=12" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { "version": "20.12.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", @@ -4847,150 +4495,6 @@ "node": ">=10.0.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", - "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", - "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", - "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", - "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", - "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", - "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", - "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", - "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", - "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/linux-arm64": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", @@ -5007,214 +4511,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", - "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", - "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", - "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", - "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", - "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", - "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", - "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", - "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", - "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", - "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", - "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", - "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", - "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@gulp-sourcemaps/identity-map": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", @@ -6899,84 +6195,6 @@ "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", "dev": true }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz", - "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz", - "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz", - "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz", - "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz", - "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz", - "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.14.3", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz", @@ -7003,110 +6221,6 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz", - "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz", - "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz", - "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz", - "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz", - "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz", - "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz", - "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz", - "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@schematics/angular": { "version": "17.3.4", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.4.tgz", diff --git a/package.json b/package.json index 20b57a64b6d..33d9170816a 100644 --- a/package.json +++ b/package.json @@ -145,7 +145,7 @@ "test-coverage": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng test wise --source-map=false --browsers ChromeHeadlessNoSandbox --watch=false --code-coverage", "test-e2e-comment": "test-e2e assumes wise is already running.", "test-e2e": "node ./node_modules/protractor/bin/protractor src/assets/wise5/test-e2e/conf.js", - "extract-i18n": "ng extract-i18n --output-path=src" + "extract-i18n": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng extract-i18n --output-path=src" }, "repository": { "type": "git", @@ -224,4 +224,4 @@ ] ] } -} +} \ No newline at end of file diff --git a/src/app/authoring-tool/edit-advanced-component/edit-advanced-component.component.ts b/src/app/authoring-tool/edit-advanced-component/edit-advanced-component.component.ts index a658ba9d660..3c9cea77c49 100644 --- a/src/app/authoring-tool/edit-advanced-component/edit-advanced-component.component.ts +++ b/src/app/authoring-tool/edit-advanced-component/edit-advanced-component.component.ts @@ -21,6 +21,7 @@ export abstract class EditAdvancedComponentComponent { ngOnInit() { this.componentContent = this.teacherProjectService.getComponent(this.nodeId, this.componentId); this.component = new Component(this.componentContent, this.nodeId); + this.teacherProjectService.uiChanged(); } setShowSubmitButtonValue(show: boolean = false): void { diff --git a/src/app/authoring-tool/edit-component-advanced/edit-component-advanced.component.html b/src/app/authoring-tool/edit-component-advanced/edit-component-advanced.component.html index 7585bbc3179..0e9007fed3f 100644 --- a/src/app/authoring-tool/edit-component-advanced/edit-component-advanced.component.html +++ b/src/app/authoring-tool/edit-component-advanced/edit-component-advanced.component.html @@ -108,5 +108,7 @@

Advanced Settings

- + diff --git a/src/app/authoring-tool/edit-component-advanced/edit-component-advanced.component.ts b/src/app/authoring-tool/edit-component-advanced/edit-component-advanced.component.ts index d552abea441..b665cade816 100644 --- a/src/app/authoring-tool/edit-component-advanced/edit-component-advanced.component.ts +++ b/src/app/authoring-tool/edit-component-advanced/edit-component-advanced.component.ts @@ -1,4 +1,4 @@ -import { Component, Inject, OnInit } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA } from '@angular/material/dialog'; import { Component as WiseComponent } from '../../../assets/wise5/common/Component'; @@ -7,8 +7,6 @@ import { Component as WiseComponent } from '../../../assets/wise5/common/Compone templateUrl: './edit-component-advanced.component.html', styleUrls: ['./edit-component-advanced.component.scss'] }) -export class EditComponentAdvancedComponent implements OnInit { +export class EditComponentAdvancedComponent { constructor(@Inject(MAT_DIALOG_DATA) protected component: WiseComponent) {} - - ngOnInit(): void {} } diff --git a/src/app/authoring-tool/edit-component-prompt/edit-component-prompt.component.html b/src/app/authoring-tool/edit-component-prompt/edit-component-prompt.component.html index 8e869467ba4..43c6681eefe 100644 --- a/src/app/authoring-tool/edit-component-prompt/edit-component-prompt.component.html +++ b/src/app/authoring-tool/edit-component-prompt/edit-component-prompt.component.html @@ -1,12 +1,11 @@ - - Prompt - - + diff --git a/src/app/authoring-tool/edit-component-prompt/edit-component-prompt.component.ts b/src/app/authoring-tool/edit-component-prompt/edit-component-prompt.component.ts index 0842366cf93..510240641b7 100644 --- a/src/app/authoring-tool/edit-component-prompt/edit-component-prompt.component.ts +++ b/src/app/authoring-tool/edit-component-prompt/edit-component-prompt.component.ts @@ -1,14 +1,12 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { ComponentContent } from '../../../assets/wise5/common/ComponentContent'; @Component({ selector: 'edit-component-prompt', - styles: ['.prompt {width: 100%; }'], + styles: ['.prompt {width: 100%; mat-form-field { width:100%} }'], templateUrl: 'edit-component-prompt.component.html' }) export class EditComponentPrompt { - @Input() - prompt: string; - - @Output() - promptChangedEvent = new EventEmitter(); + @Input() componentContent: ComponentContent; + @Output() promptChangedEvent = new EventEmitter(); } diff --git a/src/app/authoring-tool/edit-component-rubric/edit-component-rubric.component.html b/src/app/authoring-tool/edit-component-rubric/edit-component-rubric.component.html index 791c0d31ddb..0c8f2e614a1 100644 --- a/src/app/authoring-tool/edit-component-rubric/edit-component-rubric.component.html +++ b/src/app/authoring-tool/edit-component-rubric/edit-component-rubric.component.html @@ -3,7 +3,7 @@ - - + [content]="componentContent" + key="rubric" + (defaultLanguageTextChanged)="rubricChanged()" +/> diff --git a/src/app/authoring-tool/edit-component-rubric/edit-component-rubric.component.ts b/src/app/authoring-tool/edit-component-rubric/edit-component-rubric.component.ts index 2ab06f7ce1d..dc27a3c1e71 100644 --- a/src/app/authoring-tool/edit-component-rubric/edit-component-rubric.component.ts +++ b/src/app/authoring-tool/edit-component-rubric/edit-component-rubric.component.ts @@ -1,10 +1,5 @@ import { Component, Input } from '@angular/core'; -import { ConfigService } from '../../../assets/wise5/services/configService'; import { TeacherProjectService } from '../../../assets/wise5/services/teacherProjectService'; -import { - insertWiseLinks, - replaceWiseLinks -} from '../../../assets/wise5/common/wise-link/wise-link'; @Component({ selector: 'edit-component-rubric', @@ -12,31 +7,12 @@ import { styleUrls: ['edit-component-rubric.component.scss'] }) export class EditComponentRubricComponent { - @Input() - componentContent: any; - rubric: string; - showRubricAuthoring: boolean = false; + @Input() componentContent: any; + protected showRubricAuthoring: boolean = false; - constructor( - private ConfigService: ConfigService, - private ProjectService: TeacherProjectService - ) {} + constructor(private projectService: TeacherProjectService) {} - ngOnInit() { - const componentContent = this.ConfigService.replaceStudentNames( - this.ProjectService.injectAssetPaths(this.componentContent) - ); - if (componentContent.rubric == null) { - this.rubric = ''; - } else { - this.rubric = replaceWiseLinks(componentContent.rubric); - } - } - - rubricChanged(): void { - this.componentContent.rubric = this.ConfigService.removeAbsoluteAssetPaths( - insertWiseLinks(this.rubric) - ); - this.ProjectService.componentChanged(); + protected rubricChanged(): void { + this.projectService.componentChanged(); } } diff --git a/src/app/authoring-tool/edit-dynamic-prompt-rules/edit-dynamic-prompt-rules.component.html b/src/app/authoring-tool/edit-dynamic-prompt-rules/edit-dynamic-prompt-rules.component.html index 86f54705ed7..eef7d78ecac 100644 --- a/src/app/authoring-tool/edit-dynamic-prompt-rules/edit-dynamic-prompt-rules.component.html +++ b/src/app/authoring-tool/edit-dynamic-prompt-rules/edit-dynamic-prompt-rules.component.html @@ -43,16 +43,14 @@
(ngModelChange)="inputChanged.next($event)" /> - - Prompt - - +
-
- - Pre Prompt (Optional) - - -
+ -
- - Post Prompt (Optional) - - -
+ diff --git a/src/app/authoring-tool/edit-dynamic-prompt/edit-dynamic-prompt.component.scss b/src/app/authoring-tool/edit-dynamic-prompt/edit-dynamic-prompt.component.scss index 573b30f080a..625669d5b10 100644 --- a/src/app/authoring-tool/edit-dynamic-prompt/edit-dynamic-prompt.component.scss +++ b/src/app/authoring-tool/edit-dynamic-prompt/edit-dynamic-prompt.component.scss @@ -1,9 +1,5 @@ @import 'style/abstracts/variables'; -.prompt { - width: 100%; -} - .section-container { padding: 16px; border: 2px solid #dddddd; diff --git a/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html b/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html index ee4bac274c3..2ceed4bdbc0 100644 --- a/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html +++ b/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html @@ -56,6 +56,7 @@
fxLayoutGap="8px" > @@ -63,25 +64,13 @@
Question #{{ questionIndex + 1 }} - - - - - - - + - + + +
+ +
+
+
+ +
diff --git a/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.scss b/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.scss index 41baff19086..e2b65bf609f 100644 --- a/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.scss +++ b/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.scss @@ -48,3 +48,7 @@ li { .question-input { width: 100%; } + +.question-button-div { + height: 100%; +} \ No newline at end of file diff --git a/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.ts b/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.ts index 8292bafc22a..f9489c8cd45 100644 --- a/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.ts +++ b/src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.ts @@ -54,4 +54,10 @@ export class EditQuestionBankRulesComponent extends EditFeedbackRulesComponent { customTrackBy(index: number): number { return index; } + + protected getQuestionLabel(rule: QuestionBankRule, questionIndex: number): string { + return rule.questions.length === 1 + ? $localize`Question` + : $localize`Question #${questionIndex + 1}`; + } } diff --git a/src/app/authoring-tool/edit-question-bank/edit-question-bank.component.html b/src/app/authoring-tool/edit-question-bank/edit-question-bank.component.html index f176c47c459..8404976fb3f 100644 --- a/src/app/authoring-tool/edit-question-bank/edit-question-bank.component.html +++ b/src/app/authoring-tool/edit-question-bank/edit-question-bank.component.html @@ -11,16 +11,13 @@
- - Custom Label - - +
+ arrow_drop_downtranslate {{ selectedLanguage.language }} + + + + diff --git a/src/app/common/project-language-chooser/project-language-chooser.component.scss b/src/app/common/project-language-chooser/project-language-chooser.component.scss new file mode 100644 index 00000000000..2cf5c68da5b --- /dev/null +++ b/src/app/common/project-language-chooser/project-language-chooser.component.scss @@ -0,0 +1,3 @@ +.mat-mdc-button { + text-transform: none; +} diff --git a/src/app/common/project-language-chooser/project-language-chooser.component.spec.ts b/src/app/common/project-language-chooser/project-language-chooser.component.spec.ts new file mode 100644 index 00000000000..3dfb285e3fe --- /dev/null +++ b/src/app/common/project-language-chooser/project-language-chooser.component.spec.ts @@ -0,0 +1,69 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ProjectLanguageChooserComponent } from './project-language-chooser.component'; +import { ProjectLocale } from '../../domain/projectLocale'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { HarnessLoader } from '@angular/cdk/testing'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { MatMenuHarness, MatMenuItemHarness } from '@angular/material/menu/testing'; +import { ProjectService } from '../../../assets/wise5/services/projectService'; + +class MockProjectService { + currentLanguage() { + return null; + } +} + +let loader: HarnessLoader; +let component: ProjectLanguageChooserComponent; +let fixture: ComponentFixture; +describe('ProjectLanguageChooserComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [BrowserAnimationsModule, HttpClientTestingModule, ProjectLanguageChooserComponent], + providers: [{ provide: ProjectService, useClass: MockProjectService }] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ProjectLanguageChooserComponent); + loader = TestbedHarnessEnvironment.loader(fixture); + component = fixture.componentInstance; + setProjectLocale(new ProjectLocale({ default: 'en_US', supported: ['ja', 'es'] })); + }); + + it('shows available languages and selects the default language', async () => { + const options = await getOptions(); + expect(options.length).toEqual(3); + expect(await options[0].getText()).toMatch('English'); + expect(await options[1].getText()).toMatch('Japanese'); + expect(await options[2].getText()).toMatch('Spanish'); + const selected = await options[0].host(); + expect(await selected.getAttribute('class')).toContain('primary'); + }); + + it('keeps selected language option when language option changes', async () => { + const menuHarness = await loader.getHarness(MatMenuHarness); + await menuHarness.clickItem({ text: 'Japanese' }); + spyOn(TestBed.inject(ProjectService), 'currentLanguage').and.returnValue({ + locale: 'ja', + language: 'Japanese' + }); + setProjectLocale(new ProjectLocale({ default: 'it', supported: ['de', 'fr', 'ja', 'es'] })); + const options = await getOptions(); + const selected = await options[3].host(); + expect(await selected.getAttribute('class')).toContain('primary'); + }); +}); + +function setProjectLocale(locale: ProjectLocale): void { + component.projectLocale = locale; + component.ngOnChanges(); + fixture.detectChanges(); +} + +async function getOptions(): Promise { + const menuHarness = await loader.getHarness(MatMenuHarness); + await menuHarness.open(); + return await menuHarness.getItems(); +} diff --git a/src/app/common/project-language-chooser/project-language-chooser.component.ts b/src/app/common/project-language-chooser/project-language-chooser.component.ts new file mode 100644 index 00000000000..b0b91913d0a --- /dev/null +++ b/src/app/common/project-language-chooser/project-language-chooser.component.ts @@ -0,0 +1,42 @@ +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core'; +import { Language } from '../../domain/language'; +import { ProjectLocale } from '../../domain/projectLocale'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatIconModule } from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { ProjectService } from '../../../assets/wise5/services/projectService'; + +@Component({ + standalone: true, + selector: 'project-language-chooser', + styleUrl: './project-language-chooser.component.scss', + imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatTooltipModule], + templateUrl: './project-language-chooser.component.html' +}) +export class ProjectLanguageChooserComponent implements OnChanges { + protected availableLanguages: Language[]; + @Output() languageChangedEvent = new EventEmitter(); + @Input() projectLocale: ProjectLocale; + protected selectedLanguage: Language; + @Input() tooltip: string = $localize`Select language`; + + constructor(private projectService: ProjectService) {} + + ngOnChanges(): void { + this.availableLanguages = this.projectLocale.getAvailableLanguages(); + this.selectedLanguage = this.projectService.currentLanguage(); + if ( + this.selectedLanguage == null || + !this.availableLanguages.some((lang) => lang.locale === this.selectedLanguage.locale) + ) { + this.selectedLanguage = this.projectLocale.getDefaultLanguage(); + } + } + + protected changeLanguage(language: Language): void { + this.selectedLanguage = language; + this.languageChangedEvent.emit(language); + } +} diff --git a/src/app/domain/language.ts b/src/app/domain/language.ts new file mode 100644 index 00000000000..9a73bb4f2a8 --- /dev/null +++ b/src/app/domain/language.ts @@ -0,0 +1,4 @@ +export interface Language { + language: string; + locale: string; +} diff --git a/src/app/domain/localeToLanguage.ts b/src/app/domain/localeToLanguage.ts new file mode 100644 index 00000000000..c18f05d2bbc --- /dev/null +++ b/src/app/domain/localeToLanguage.ts @@ -0,0 +1,12 @@ +export const localeToLanguage: { [locale: string]: string } = { + zh_CN: $localize`Chinese (Simplified)`, + zh_TW: $localize`Chinese (Traditional)`, + nl: $localize`Dutch`, + en_US: $localize`English`, + de: $localize`German`, + it: $localize`Italian`, + ja: $localize`Japanese`, + ko: $localize`Korean`, + es: $localize`Spanish`, + vi: $localize`Vietnamese` +}; diff --git a/src/app/domain/projectLocale.ts b/src/app/domain/projectLocale.ts new file mode 100644 index 00000000000..6c1e676d0b2 --- /dev/null +++ b/src/app/domain/projectLocale.ts @@ -0,0 +1,52 @@ +import { Language } from './language'; +import { localeToLanguage } from './localeToLanguage'; + +export class ProjectLocale { + private locale: { default: string; supported: string[] }; + + constructor(locale: any) { + this.locale = locale; + } + + getAvailableLanguages(): Language[] { + return [this.getDefaultLanguage()].concat(this.getSupportedLanguages()); + } + + getDefaultLanguage(): Language { + return { language: localeToLanguage[this.locale.default], locale: this.locale.default }; + } + + setDefaultLocale(locale: string): void { + this.locale.default = locale; + this.locale.supported = this.locale.supported.filter( + (supportedLocale) => supportedLocale != locale + ); + } + + getSupportedLanguages(): Language[] { + return this.locale.supported.map((locale) => ({ + language: localeToLanguage[locale], + locale: locale + })); + } + + setSupportedLanguages(languages: Language[]): void { + this.locale.supported = languages.map((language) => language.locale); + } + + hasTranslations(): boolean { + return this.locale.supported.length > 0; + } + + hasTranslationsToApply(locale: string): boolean { + return !this.isDefaultLocale(locale) && this.hasLocale(locale); + } + + isDefaultLocale(locale: string): boolean { + return this.locale.default === locale; + } + + private hasLocale(locale: string): boolean { + return this.locale.supported.includes(locale); + } +} diff --git a/src/app/domain/translations.ts b/src/app/domain/translations.ts new file mode 100644 index 00000000000..c8aadf8f3bf --- /dev/null +++ b/src/app/domain/translations.ts @@ -0,0 +1,6 @@ +export interface Translations extends Record {} + +export interface TranslationValue { + value: string; + modified: number; +} diff --git a/src/app/notebook/notebook-item/notebook-item.component.ts b/src/app/notebook/notebook-item/notebook-item.component.ts index 938e3af8212..3e8441110fa 100644 --- a/src/app/notebook/notebook-item/notebook-item.component.ts +++ b/src/app/notebook/notebook-item/notebook-item.component.ts @@ -55,6 +55,10 @@ export class NotebookItemComponent { ); } + ngOnChanges(): void { + this.label = this.config.itemTypes[this.type].label; + } + ngOnDestroy(): void { this.notebookUpdatedSubscription.unsubscribe(); } diff --git a/src/app/notebook/notebook-launcher/notebook-launcher.component.ts b/src/app/notebook/notebook-launcher/notebook-launcher.component.ts index 5f47babf9b4..8140bc35885 100644 --- a/src/app/notebook/notebook-launcher/notebook-launcher.component.ts +++ b/src/app/notebook/notebook-launcher/notebook-launcher.component.ts @@ -1,5 +1,7 @@ import { Component, Input } from '@angular/core'; import { NotebookService } from '../../../assets/wise5/services/notebookService'; +import { ProjectService } from '../../../assets/wise5/services/projectService'; +import { Subscription } from 'rxjs'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; @@ -13,10 +15,20 @@ import { MatTooltipModule } from '@angular/material/tooltip'; export class NotebookLauncherComponent { protected label: string = ''; @Input() notebookConfig: any; + private subscription: Subscription = new Subscription(); - constructor(private notebookService: NotebookService) {} + constructor(private notebookService: NotebookService, private projectService: ProjectService) {} ngOnInit(): void { + this.setLabel(); + this.subscription.add(this.projectService.projectParsed$.subscribe(() => this.setLabel())); + } + + ngOnDestroy(): void { + this.subscription.unsubscribe(); + } + + private setLabel(): void { this.label = this.notebookConfig.itemTypes.note.label.link; } diff --git a/src/app/notebook/notebook-notes/notebook-notes.component.ts b/src/app/notebook/notebook-notes/notebook-notes.component.ts index 70f3193ae21..40c86cc97e6 100644 --- a/src/app/notebook/notebook-notes/notebook-notes.component.ts +++ b/src/app/notebook/notebook-notes/notebook-notes.component.ts @@ -37,7 +37,7 @@ export class NotebookNotesComponent extends NotebookParentComponent { ngOnInit(): void { super.ngOnInit(); - this.label = this.config.itemTypes.note.label; + this.setLabel(); this.addPersonalGroupToGroups(); this.addSpacesToGroups(); this.hasPrivateNotes = this.isHasPrivateNotes(); @@ -76,6 +76,13 @@ export class NotebookNotesComponent extends NotebookParentComponent { }) ); + this.subscriptions.add( + this.ProjectService.projectParsed$.subscribe(() => { + this.setConfig(); + this.setLabel(); + }) + ); + this.NotebookService.retrievePublicNotebookItems('public'); } @@ -83,6 +90,10 @@ export class NotebookNotesComponent extends NotebookParentComponent { this.subscriptions.unsubscribe(); } + private setLabel(): void { + this.label = this.config.itemTypes.note.label; + } + isHasPrivateNotes(): boolean { return this.groupNameToGroup['private'].items.some((note) => note.serverDeleteTime == null); } diff --git a/src/app/notebook/notebook-report/notebook-report.component.ts b/src/app/notebook/notebook-report/notebook-report.component.ts index 0b4c4804257..178efd3d989 100644 --- a/src/app/notebook/notebook-report/notebook-report.component.ts +++ b/src/app/notebook/notebook-report/notebook-report.component.ts @@ -56,9 +56,6 @@ export class NotebookReportComponent extends NotebookParentComponent { if (this.mode !== 'classroomMonitor') { this.reportItem.id = null; // set the id to null so it can be inserted as initial version, as opposed to updated. this is true for both new and just-loaded reports. } - this.reportItemContent = this.ProjectService.injectAssetPaths( - replaceWiseLinks(this.reportItem.content.content) - ); this.latestAnnotations = this.AnnotationService.getLatestNotebookItemAnnotations( this.workgroupId, this.reportId @@ -105,6 +102,15 @@ export class NotebookReportComponent extends NotebookParentComponent { } }) ); + + this.subscriptions.add( + this.ProjectService.projectParsed$.subscribe(() => { + if (this.saveTime == null) { + this.setConfig(); + this.setReportItem(); + } + }) + ); } ngOnDestroy(): void { @@ -125,6 +131,11 @@ export class NotebookReportComponent extends NotebookParentComponent { } else { this.reportItem = this.NotebookService.getTemplateReportItemByReportId(this.reportId); } + if (this.reportItem != null) { + this.reportItemContent = this.ProjectService.injectAssetPaths( + replaceWiseLinks(this.reportItem.content.content) + ); + } } calculateHasAnnotation(latestAnnotations: any): boolean { diff --git a/src/app/services/copyTranslationsService.spec.ts b/src/app/services/copyTranslationsService.spec.ts new file mode 100644 index 00000000000..f6cdf577fc1 --- /dev/null +++ b/src/app/services/copyTranslationsService.spec.ts @@ -0,0 +1,50 @@ +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; +import { TeacherProjectService } from '../../assets/wise5/services/teacherProjectService'; +import { StudentTeacherCommonServicesModule } from '../student-teacher-common-services.module'; +import { ProjectLocale } from '../domain/projectLocale'; +import { ComponentContent } from '../../assets/wise5/common/ComponentContent'; +import { ConfigService } from '../../assets/wise5/services/configService'; +import { CopyTranslationsService } from '../../assets/wise5/services/copyTranslationsService'; +import { Node } from '../../assets/wise5/common/Node'; + +let configService: ConfigService; +let http: HttpTestingController; +let projectService: TeacherProjectService; +let service: CopyTranslationsService; +describe('CopyTranslationsService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, StudentTeacherCommonServicesModule], + providers: [CopyTranslationsService, TeacherProjectService], + teardown: { destroyAfterEach: false } + }); + configService = TestBed.inject(ConfigService); + http = TestBed.inject(HttpTestingController); + projectService = TestBed.inject(TeacherProjectService); + service = TestBed.inject(CopyTranslationsService); + }); + tryCopyComponents(); +}); + +function tryCopyComponents() { + describe('tryCopyComponents()', () => { + it('fetches all supported translations', () => { + spyOn(projectService, 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en_us', supported: ['es', 'ja'] }) + ); + spyOn(configService, 'getProjectId').and.returnValue('123'); + spyOn(configService, 'getConfigParam').and.returnValue('/123/project.json'); + service.tryCopyComponents({ components: [{ id: 'abc' }] } as Node, [ + { + id: 'abc', + type: 'OpenResponse', + prompt: 'hello', + 'prompt.i18n': { id: 'xyz' } + } as ComponentContent + ]); + http.expectOne(`/123/translations.es.json`).flush({ xyz: {} }); + http.expectOne(`/123/translations.ja.json`).flush({ xyz: {} }); + }); + }); +} diff --git a/src/app/services/deleteTranslationsService.spec.ts b/src/app/services/deleteTranslationsService.spec.ts new file mode 100644 index 00000000000..febac4b9ff5 --- /dev/null +++ b/src/app/services/deleteTranslationsService.spec.ts @@ -0,0 +1,49 @@ +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; +import { TeacherProjectService } from '../../assets/wise5/services/teacherProjectService'; +import { StudentTeacherCommonServicesModule } from '../student-teacher-common-services.module'; +import { DeleteTranslationsService } from '../../assets/wise5/services/deleteTranslationsService'; +import { ProjectLocale } from '../domain/projectLocale'; +import { ComponentContent } from '../../assets/wise5/common/ComponentContent'; +import { ConfigService } from '../../assets/wise5/services/configService'; + +let configService: ConfigService; +let http: HttpTestingController; +let projectService: TeacherProjectService; +let service: DeleteTranslationsService; +describe('DeleteTranslationsService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, StudentTeacherCommonServicesModule], + providers: [DeleteTranslationsService, TeacherProjectService], + teardown: { destroyAfterEach: false } + }); + configService = TestBed.inject(ConfigService); + http = TestBed.inject(HttpTestingController); + projectService = TestBed.inject(TeacherProjectService); + service = TestBed.inject(DeleteTranslationsService); + }); + tryDeleteComponents(); +}); + +function tryDeleteComponents() { + describe('tryDeleteComponents()', () => { + it('fetches all supported translations', () => { + spyOn(projectService, 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en_us', supported: ['es', 'ja'] }) + ); + spyOn(configService, 'getProjectId').and.returnValue('123'); + spyOn(configService, 'getConfigParam').and.returnValue('/123/project.json'); + service.tryDeleteComponents([ + { + id: 'abc', + type: 'OpenResponse', + prompt: 'hello', + 'prompt.i18n': { id: 'xyz' } + } as ComponentContent + ]); + http.expectOne(`/123/translations.es.json`).flush({ xyz: {} }); + http.expectOne(`/123/translations.ja.json`).flush({ xyz: {} }); + }); + }); +} diff --git a/src/app/services/projectService.spec.ts b/src/app/services/projectService.spec.ts index ae0a23af26e..b2a884d6fcb 100644 --- a/src/app/services/projectService.spec.ts +++ b/src/app/services/projectService.spec.ts @@ -514,7 +514,8 @@ function calculateNodeNumbersWhenNoLessons(): void { service.project = { nodes: [{ id: 'group0', type: 'group', ids: [], startId: '' }], startNodeId: 'group0', - startGroupId: 'group0' + startGroupId: 'group0', + metadata: {} }; service.parseProject(); expectNodeIdsToHaveNumbers([{ nodeId: 'group0', number: '0' }]); diff --git a/src/app/services/sampleData/curriculum/Demo.project.json b/src/app/services/sampleData/curriculum/Demo.project.json index 0f03547f92b..995b19eb9e6 100644 --- a/src/app/services/sampleData/curriculum/Demo.project.json +++ b/src/app/services/sampleData/curriculum/Demo.project.json @@ -2679,6 +2679,7 @@ }, "metadata": { "title": "Demo Project", + "title.i18n": { "id": "d66d3be571e16cf8d0166286a0a632ec", "modified": 123 }, "authors": [ { "firstName": "g", diff --git a/src/app/services/sampleData/curriculum/TeacherProjectServiceSpec.project.json b/src/app/services/sampleData/curriculum/TeacherProjectServiceSpec.project.json index bd80120f958..89021c0d7b9 100644 --- a/src/app/services/sampleData/curriculum/TeacherProjectServiceSpec.project.json +++ b/src/app/services/sampleData/curriculum/TeacherProjectServiceSpec.project.json @@ -1,6 +1,7 @@ { "startGroupId": "group0", "startNodeId": "node1", + "metadata": {}, "nodes": [ { "id": "group0", diff --git a/src/app/services/studentProjectTranslationService.spec.ts b/src/app/services/studentProjectTranslationService.spec.ts new file mode 100644 index 00000000000..c5f62ccb908 --- /dev/null +++ b/src/app/services/studentProjectTranslationService.spec.ts @@ -0,0 +1,69 @@ +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; +import { StudentTeacherCommonServicesModule } from '../student-teacher-common-services.module'; +import { StudentProjectTranslationService } from '../../assets/wise5/services/studentProjectTranslationService'; +import { ProjectService } from '../../assets/wise5/services/projectService'; +import { StudentDataService } from '../../assets/wise5/services/studentDataService'; +import { ProjectLocale } from '../domain/projectLocale'; +import demoProjectJSON_import from './sampleData/curriculum/Demo.project.json'; +import { copy } from '../../assets/wise5/common/object/object'; +import { ConfigService } from '../../assets/wise5/services/configService'; + +let http: HttpTestingController; +let demoProjectJSON: any; +let configService: ConfigService; +let dataService: StudentDataService; +let projectService: ProjectService; +let service: StudentProjectTranslationService; +describe('StudentProjectTranslationService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, StudentTeacherCommonServicesModule], + providers: [ + { + provide: StudentDataService, + useValue: jasmine.createSpyObj('StudentDataService', ['saveVLEEvent', 'getCurrentNodeId']) + } + ] + }); + http = TestBed.inject(HttpTestingController); + demoProjectJSON = copy(demoProjectJSON_import); + configService = TestBed.inject(ConfigService); + dataService = TestBed.inject(StudentDataService); + projectService = TestBed.inject(ProjectService); + service = TestBed.inject(StudentProjectTranslationService); + spyOn(projectService, 'getOriginalProject').and.returnValue(demoProjectJSON); + }); + describe('switchLanguage()', () => { + describe('has no translations to apply', () => { + beforeEach(() => { + spyOn(projectService, 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en_US', supported: [] }) + ); + spyOn(projectService, 'setCurrentLanguage').and.stub(); + spyOn(configService, 'isRunActive').and.returnValue(true); + }); + it('should keep original project in tact', () => { + service.switchLanguage({ language: 'Japanese', locale: 'ja' }, 'student').then(() => { + expect(projectService.getProjectTitle()).toEqual('Demo Project'); + }); + }); + }); + describe('has translations to apply', () => { + beforeEach(() => { + spyOn(projectService, 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en_US', supported: ['es'] }) + ); + spyOn(configService, 'getConfigParam').and.returnValue('/123/project.json'); + }); + it('should retrieve translation mapping file and translate project', () => { + service.switchLanguage({ language: 'Spanish', locale: 'es' }, 'student').then(() => { + expect(projectService.getProjectTitle()).toEqual('Proyecto de demostración'); + http.expectOne('/123/translations.es.json').flush({ + d66d3be571e16cf8d0166286a0a632ec: { value: 'Proyecto de demostración', modified: 456 } + }); + }); + }); + }); + }); +}); diff --git a/src/app/services/studentStatusService.spec.ts b/src/app/services/studentStatusService.spec.ts index 871e87d4171..21d8550b150 100644 --- a/src/app/services/studentStatusService.spec.ts +++ b/src/app/services/studentStatusService.spec.ts @@ -9,6 +9,8 @@ import { of } from 'rxjs'; import { MatDialogModule } from '@angular/material/dialog'; import { StudentTeacherCommonServicesModule } from '../student-teacher-common-services.module'; import { NodeProgressService } from '../../assets/wise5/services/nodeProgressService'; +import { ProjectService } from '../../assets/wise5/services/projectService'; +import { ProjectLocale } from '../domain/projectLocale'; let configService: ConfigService; let http: HttpClient; @@ -92,6 +94,9 @@ function saveStudentStatus_nodeStatusChanged_PostStudentStatus() { spyOn(configService, 'getStudentStatusURL').and.returnValue(studentStatusUrl); spyOn(studentDataService, 'getCurrentNodeId').and.returnValue(nodeId); spyOn(nodeProgressService, 'getNodeProgress').and.returnValue(projectCompletion); + spyOn(TestBed.inject(ProjectService), 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en_US', supported: [] }) + ); const httpPostSpy = spyOn(http, 'post').and.callFake((url: string, body: any) => { return of({} as any); }); diff --git a/src/app/services/teacherProjectTranslationService.spec.ts b/src/app/services/teacherProjectTranslationService.spec.ts new file mode 100644 index 00000000000..d7ddb632fa6 --- /dev/null +++ b/src/app/services/teacherProjectTranslationService.spec.ts @@ -0,0 +1,51 @@ +import { TestBed } from '@angular/core/testing'; +import { TeacherProjectTranslationService } from '../../assets/wise5/services/teacherProjectTranslationService'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { TeacherProjectService } from '../../assets/wise5/services/teacherProjectService'; +import { ConfigService } from '../../assets/wise5/services/configService'; +import { signal } from '@angular/core'; +import { ProjectService } from '../../assets/wise5/services/projectService'; + +class ConfigServiceStub { + getProjectId() { + return 1; + } +} + +class TeacherProjectServiceStub { + readonly currentLanguage = signal({ + language: 'Spanish', + locale: 'es' + }); + broadcastSavingProject(): void {} + broadcastProjectSaved(): void {} +} + +let http: HttpTestingController; +let projectService: TeacherProjectService; +let service: TeacherProjectTranslationService; +describe('TeacherProjectTranslationService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + TeacherProjectTranslationService, + HttpClientTestingModule, + { provide: ConfigService, useClass: ConfigServiceStub }, + { provide: ProjectService, useClass: TeacherProjectServiceStub }, + { provide: TeacherProjectService, useClass: TeacherProjectServiceStub } + ], + imports: [HttpClientTestingModule] + }); + http = TestBed.inject(HttpTestingController); + projectService = TestBed.inject(TeacherProjectService); + service = TestBed.inject(TeacherProjectTranslationService); + }); + describe('saveCurrentTranslations()', () => { + it('makes a POST request to backend', () => { + service.saveCurrentTranslations({}).subscribe(); + const request = http.expectOne(`/api/author/project/translate/1/es`); + expect(request.request.method).toEqual('POST'); + expect(request.request.body).toEqual({}); + }); + }); +}); diff --git a/src/app/student-teacher-common-services.module.ts b/src/app/student-teacher-common-services.module.ts index 49de92ff787..bd5925dab02 100644 --- a/src/app/student-teacher-common-services.module.ts +++ b/src/app/student-teacher-common-services.module.ts @@ -53,6 +53,7 @@ import { PeerGroupService } from '../assets/wise5/services/peerGroupService'; import { NodeProgressService } from '../assets/wise5/services/nodeProgressService'; import { CompletionService } from '../assets/wise5/services/completionService'; import { StudentNodeService } from '../assets/wise5/services/studentNodeService'; +import { StudentProjectTranslationService } from '../assets/wise5/services/studentProjectTranslationService'; import { AiChatService } from '../assets/wise5/components/aiChat/aiChatService'; @NgModule({ @@ -110,6 +111,7 @@ import { AiChatService } from '../assets/wise5/components/aiChat/aiChatService'; TableService, TabulatorDataService, TagService, + StudentProjectTranslationService, VLEProjectService, WiseLinkService ] diff --git a/src/app/student/top-bar/top-bar.component.html b/src/app/student/top-bar/top-bar.component.html index bb822b04bc3..30ce917c820 100644 --- a/src/app/student/top-bar/top-bar.component.html +++ b/src/app/student/top-bar/top-bar.component.html @@ -25,24 +25,27 @@

{{ projectName }}

Constraints Are Off
-
-
- -
+
+ + + + diff --git a/src/assets/wise5/authoringTool/components/translatable-asset-chooser/translatable-asset-chooser.component.scss b/src/assets/wise5/authoringTool/components/translatable-asset-chooser/translatable-asset-chooser.component.scss new file mode 100644 index 00000000000..113e9772633 --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-asset-chooser/translatable-asset-chooser.component.scss @@ -0,0 +1,3 @@ +.mat-mdc-raised-button>.mat-icon { + margin: 0; +} \ No newline at end of file diff --git a/src/assets/wise5/authoringTool/components/translatable-asset-chooser/translatable-asset-chooser.component.spec.ts b/src/assets/wise5/authoringTool/components/translatable-asset-chooser/translatable-asset-chooser.component.spec.ts new file mode 100644 index 00000000000..56b20343fe7 --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-asset-chooser/translatable-asset-chooser.component.spec.ts @@ -0,0 +1,39 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { TranslatableAssetChooserComponent } from './translatable-asset-chooser.component'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { StudentTeacherCommonServicesModule } from '../../../../../app/student-teacher-common-services.module'; +import { MatDialogModule } from '@angular/material/dialog'; +import { TeacherProjectService } from '../../../services/teacherProjectService'; +import { ProjectLocale } from '../../../../../app/domain/projectLocale'; +import { TeacherProjectTranslationService } from '../../../services/teacherProjectTranslationService'; + +describe('TranslatableAssetChooserComponent', () => { + let component: TranslatableAssetChooserComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + BrowserAnimationsModule, + HttpClientTestingModule, + MatDialogModule, + StudentTeacherCommonServicesModule, + TranslatableAssetChooserComponent + ], + providers: [TeacherProjectService, TeacherProjectTranslationService] + }); + spyOn(TestBed.inject(TeacherProjectService), 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en-US' }) + ); + spyOn(TestBed.inject(TeacherProjectService), 'isDefaultLocale').and.returnValue(true); + fixture = TestBed.createComponent(TranslatableAssetChooserComponent); + component = fixture.componentInstance; + component.content = {}; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/wise5/authoringTool/components/translatable-asset-chooser/translatable-asset-chooser.component.ts b/src/assets/wise5/authoringTool/components/translatable-asset-chooser/translatable-asset-chooser.component.ts new file mode 100644 index 00000000000..95081a6e453 --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-asset-chooser/translatable-asset-chooser.component.ts @@ -0,0 +1,49 @@ +import { Component, Input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { AssetChooser } from '../../project-asset-authoring/asset-chooser'; +import { MatDialog } from '@angular/material/dialog'; +import { filter } from 'rxjs'; +import { AbstractTranslatableFieldComponent } from '../abstract-translatable-field/abstract-translatable-field.component'; +import { TeacherProjectService } from '../../../services/teacherProjectService'; +import { TeacherProjectTranslationService } from '../../../services/teacherProjectTranslationService'; + +@Component({ + standalone: true, + selector: 'translatable-asset-chooser', + imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule], + templateUrl: './translatable-asset-chooser.component.html', + styleUrl: './translatable-asset-chooser.component.scss' +}) +export class TranslatableAssetChooserComponent extends AbstractTranslatableFieldComponent { + @Input() tooltip: String = $localize`Choose image`; + @Input() processAsset: (value: string) => string = (value) => { + return value; + }; + + constructor( + private dialog: MatDialog, + protected projectService: TeacherProjectService, + protected projectTranslationService: TeacherProjectTranslationService + ) { + super(projectService, projectTranslationService); + } + + protected chooseAsset(): void { + new AssetChooser(this.dialog) + .open(this.key, this.content) + .afterClosed() + .pipe(filter((data) => data != null)) + .subscribe(({ assetItem }) => { + const value = this.processAsset(assetItem.fileName); + if (this.showTranslationInput()) { + this.translationTextChanged.next(value); + } else { + this.content[this.key] = value; + this.defaultLanguageTextChanged.next(value); + } + }); + } +} diff --git a/src/assets/wise5/authoringTool/components/translatable-input/translatable-input.component.html b/src/assets/wise5/authoringTool/components/translatable-input/translatable-input.component.html new file mode 100644 index 00000000000..a7d8c7594cd --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-input/translatable-input.component.html @@ -0,0 +1,32 @@ +@if (showTranslationInput()) { + + {{ label }} ({{ currentLanguage().language }}) + + @if (hint) { + {{ hint }} + } + + translate {{ defaultLanguage.language }}: + {{ content[key] }} + + +} @else { + + {{ label }} + + @if (hint) { + {{ hint }} + } + +} diff --git a/src/assets/wise5/authoringTool/components/translatable-input/translatable-input.component.spec.ts b/src/assets/wise5/authoringTool/components/translatable-input/translatable-input.component.spec.ts new file mode 100644 index 00000000000..32cf02c9d37 --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-input/translatable-input.component.spec.ts @@ -0,0 +1,37 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { TranslatableInputComponent } from './translatable-input.component'; +import { StudentTeacherCommonServicesModule } from '../../../../../app/student-teacher-common-services.module'; +import { TeacherProjectService } from '../../../services/teacherProjectService'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { ProjectLocale } from '../../../../../app/domain/projectLocale'; +import { TeacherProjectTranslationService } from '../../../services/teacherProjectTranslationService'; + +describe('TranslatableInputComponent', () => { + let component: TranslatableInputComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + BrowserAnimationsModule, + HttpClientTestingModule, + StudentTeacherCommonServicesModule, + TranslatableInputComponent + ], + providers: [TeacherProjectTranslationService, TeacherProjectService] + }); + spyOn(TestBed.inject(TeacherProjectService), 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en-US' }) + ); + spyOn(TestBed.inject(TeacherProjectService), 'isDefaultLocale').and.returnValue(true); + fixture = TestBed.createComponent(TranslatableInputComponent); + component = fixture.componentInstance; + component.content = {}; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/wise5/authoringTool/components/translatable-input/translatable-input.component.ts b/src/assets/wise5/authoringTool/components/translatable-input/translatable-input.component.ts new file mode 100644 index 00000000000..b4223320451 --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-input/translatable-input.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatInputModule } from '@angular/material/input'; +import { FormsModule } from '@angular/forms'; +import { AbstractTranslatableFieldComponent } from '../abstract-translatable-field/abstract-translatable-field.component'; +import { MatIconModule } from '@angular/material/icon'; + +@Component({ + standalone: true, + selector: 'translatable-input', + imports: [CommonModule, FormsModule, MatIconModule, MatInputModule], + styleUrl: '../abstract-translatable-field/abstract-translatable-field.component.scss', + templateUrl: './translatable-input.component.html', + encapsulation: ViewEncapsulation.None +}) +export class TranslatableInputComponent extends AbstractTranslatableFieldComponent {} diff --git a/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.html b/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.html new file mode 100644 index 00000000000..e8ce5dc807b --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.html @@ -0,0 +1,56 @@ +@if (showTranslationInput()) { + + + +
+ +
+ + +
+
+ + +
+ Note: Editing is disabled. Please switch back to {{ defaultLanguage.language }} if you + want to edit. + +
+ +
+
+
+} @else { + + +} diff --git a/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.scss b/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.scss new file mode 100644 index 00000000000..c282c2ad94a --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.scss @@ -0,0 +1,3 @@ +.translation-tools { + padding: 8px 0; +} \ No newline at end of file diff --git a/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.spec.ts b/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.spec.ts new file mode 100644 index 00000000000..b44012c85ed --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.spec.ts @@ -0,0 +1,36 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { TranslatableRichTextEditorComponent } from './translatable-rich-text-editor.component'; +import { ConfigService } from '../../../services/configService'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TeacherProjectTranslationService } from '../../../services/teacherProjectTranslationService'; +import { TeacherProjectService } from '../../../services/teacherProjectService'; +import { StudentTeacherCommonServicesModule } from '../../../../../app/student-teacher-common-services.module'; +import { ProjectLocale } from '../../../../../app/domain/projectLocale'; + +describe('TranslatableRichTextEditorComponent', () => { + let component: TranslatableRichTextEditorComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + HttpClientTestingModule, + StudentTeacherCommonServicesModule, + TranslatableRichTextEditorComponent + ], + providers: [ConfigService, TeacherProjectTranslationService, TeacherProjectService] + }); + spyOn(TestBed.inject(TeacherProjectService), 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en-US' }) + ); + spyOn(TestBed.inject(TeacherProjectService), 'isDefaultLocale').and.returnValue(true); + fixture = TestBed.createComponent(TranslatableRichTextEditorComponent); + component = fixture.componentInstance; + component.content = {}; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.ts b/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.ts new file mode 100644 index 00000000000..868e71c87db --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.ts @@ -0,0 +1,75 @@ +import { Component, ViewChild } from '@angular/core'; +import { AbstractTranslatableFieldComponent } from '../abstract-translatable-field/abstract-translatable-field.component'; +import { WiseTinymceEditorModule } from '../../../directives/wise-tinymce-editor/wise-tinymce-editor.module'; +import { MatTabGroup, MatTabsModule } from '@angular/material/tabs'; +import { insertWiseLinks, replaceWiseLinks } from '../../../common/wise-link/wise-link'; +import { ConfigService } from '../../../services/configService'; +import { TeacherProjectTranslationService } from '../../../services/teacherProjectTranslationService'; +import { TeacherProjectService } from '../../../services/teacherProjectService'; +import { CommonModule } from '@angular/common'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatButtonModule } from '@angular/material/button'; +import { FlexLayoutModule } from '@angular/flex-layout'; + +@Component({ + standalone: true, + selector: 'translatable-rich-text-editor', + imports: [ + CommonModule, + FlexLayoutModule, + MatButtonModule, + MatDialogModule, + MatTabsModule, + WiseTinymceEditorModule + ], + templateUrl: './translatable-rich-text-editor.component.html', + styleUrl: './translatable-rich-text-editor.component.scss' +}) +export class TranslatableRichTextEditorComponent extends AbstractTranslatableFieldComponent { + protected html: string = ''; + @ViewChild(MatTabGroup) private tabs: MatTabGroup; + + constructor( + private configService: ConfigService, + protected projectService: TeacherProjectService, + protected projectTranslationService: TeacherProjectTranslationService + ) { + super(projectService, projectTranslationService); + } + + ngOnChanges(): void { + super.ngOnChanges(); + this.html = this.projectService.replaceAssetPaths(replaceWiseLinks(this.content[this.key])); + } + + protected setTranslationText(text: string): void { + this.translationText = this.projectService.replaceAssetPaths(replaceWiseLinks(text)); + } + + protected saveDefaultLanguageText(): void { + this.content[this.key] = insertWiseLinks( + this.configService.removeAbsoluteAssetPaths(this.html) + ); + this.defaultLanguageTextChanged.next(this.content[this.key]); + } + + protected copyDefaultLanguageText(): void { + if ( + this.translationText == undefined || + this.translationText === '' || + confirm( + $localize`Are you sure you want to replace the content in ${ + this.currentLanguage().language + } with content in ${this.defaultLanguage.language} for this item?` + ) + ) { + this.setTranslationText(this.html); + this.translationTextChanged.next(this.html); + this.tabs.selectedIndex = 0; + } + } + + protected saveTranslationText(text: string): void { + super.saveTranslationText(insertWiseLinks(this.configService.removeAbsoluteAssetPaths(text))); + } +} diff --git a/src/assets/wise5/authoringTool/components/translatable-textarea/translatable-textarea.component.html b/src/assets/wise5/authoringTool/components/translatable-textarea/translatable-textarea.component.html new file mode 100644 index 00000000000..3a173e6ec05 --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-textarea/translatable-textarea.component.html @@ -0,0 +1,35 @@ +@if (showTranslationInput()) { + + {{ label }} ({{ currentLanguage().language }}) + + @if (hint) { + {{ hint }} + } + + translate {{ defaultLanguage.language }}: + {{ content[key] }} + + +} @else { + + {{ label }} + + @if (hint) { + {{ hint }} + } + +} diff --git a/src/assets/wise5/authoringTool/components/translatable-textarea/translatable-textarea.component.spec.ts b/src/assets/wise5/authoringTool/components/translatable-textarea/translatable-textarea.component.spec.ts new file mode 100644 index 00000000000..11aad65d97f --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-textarea/translatable-textarea.component.spec.ts @@ -0,0 +1,37 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { TranslatableTextareaComponent } from './translatable-textarea.component'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { StudentTeacherCommonServicesModule } from '../../../../../app/student-teacher-common-services.module'; +import { TeacherProjectService } from '../../../services/teacherProjectService'; +import { ProjectLocale } from '../../../../../app/domain/projectLocale'; +import { TeacherProjectTranslationService } from '../../../services/teacherProjectTranslationService'; + +describe('TranslatableTextareaComponent', () => { + let component: TranslatableTextareaComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + BrowserAnimationsModule, + HttpClientTestingModule, + StudentTeacherCommonServicesModule, + TranslatableTextareaComponent + ], + providers: [TeacherProjectTranslationService, TeacherProjectService] + }); + spyOn(TestBed.inject(TeacherProjectService), 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en-US' }) + ); + spyOn(TestBed.inject(TeacherProjectService), 'isDefaultLocale').and.returnValue(true); + fixture = TestBed.createComponent(TranslatableTextareaComponent); + component = fixture.componentInstance; + component.content = {}; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/wise5/authoringTool/components/translatable-textarea/translatable-textarea.component.ts b/src/assets/wise5/authoringTool/components/translatable-textarea/translatable-textarea.component.ts new file mode 100644 index 00000000000..e92afb09fb1 --- /dev/null +++ b/src/assets/wise5/authoringTool/components/translatable-textarea/translatable-textarea.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatInputModule } from '@angular/material/input'; +import { AbstractTranslatableFieldComponent } from '../abstract-translatable-field/abstract-translatable-field.component'; +import { MatIconModule } from '@angular/material/icon'; + +@Component({ + standalone: true, + selector: 'translatable-textarea', + imports: [CommonModule, FormsModule, MatIconModule, MatInputModule], + styleUrl: '../abstract-translatable-field/abstract-translatable-field.component.scss', + templateUrl: './translatable-textarea.component.html', + encapsulation: ViewEncapsulation.None +}) +export class TranslatableTextareaComponent extends AbstractTranslatableFieldComponent {} diff --git a/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html b/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html index 67c38e7b8c8..028d1f3c23b 100644 --- a/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html +++ b/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html @@ -27,6 +27,7 @@

Milestones Authoring

keyboard_arrow_down
-
- - Milestone Name - - +
+
- - Milestone Description - - +
Custom Score Values
- - Description - - +
- - Content - - +
Content Preview
- - Recommendations - - +
Recommendations Preview
diff --git a/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.scss b/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.scss index 8dda6fca2a9..d1be5e9a81a 100644 --- a/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.scss +++ b/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.scss @@ -8,10 +8,6 @@ margin: 0px; } -.full-width { - width: 100%; -} - .width-200 { width: 200px; } diff --git a/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.ts b/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.ts index b12f61b5680..70bc2995109 100644 --- a/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.ts +++ b/src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.ts @@ -462,10 +462,12 @@ export class MilestonesAuthoringComponent { protected expand(id: string): void { this.idToExpanded[id] = true; + this.projectService.uiChanged(); } protected collapse(id: string): void { this.idToExpanded[id] = false; + this.projectService.uiChanged(); } protected save(): void { diff --git a/src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring.module.ts b/src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring.module.ts index 263436902c5..d068a552da2 100644 --- a/src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring.module.ts +++ b/src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring.module.ts @@ -10,6 +10,7 @@ import { NodeConstraintAuthoringComponent } from '../../constraint/node-constrai import { EditNodeRubricComponent } from '../editRubric/edit-node-rubric.component'; import { WiseTinymceEditorModule } from '../../../directives/wise-tinymce-editor/wise-tinymce-editor.module'; import { RouterModule } from '@angular/router'; +import { TranslatableRichTextEditorComponent } from '../../components/translatable-rich-text-editor/translatable-rich-text-editor.component'; import { RequiredErrorLabelComponent } from './required-error-label/required-error-label.component'; @NgModule({ @@ -36,6 +37,7 @@ import { RequiredErrorLabelComponent } from './required-error-label/required-err RequiredErrorLabelComponent, RouterModule, StudentTeacherCommonModule, + TranslatableRichTextEditorComponent, WiseTinymceEditorModule ] }) diff --git a/src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring/node-advanced-authoring.component.html b/src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring/node-advanced-authoring.component.html index 19514995cf2..0936df62ade 100644 --- a/src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring/node-advanced-authoring.component.html +++ b/src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring/node-advanced-authoring.component.html @@ -1,5 +1,6 @@
- -
Components
-
- - Notebook Label - - +
+
Notebook Settings
-
- - Label (Singular) - - - - Label (Plural) - - - - Label (Link) - - +
+ + +
Notebook Settings Enable Report
-
- - Label (Singular) - - - - Label (Plural) - - - - Label (Link) - - +
+ + +
- - Title - - -
- - Max Score - + - -
- - Description - - -
- - Prompt - - -
+
+
+ + Max Score + + +
+ + Starter Text - - +
@@ -263,6 +264,7 @@

Notebook Settings

diff --git a/src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.scss b/src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.scss index e1450ff39f1..bc622fd36a6 100644 --- a/src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.scss +++ b/src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.scss @@ -17,3 +17,7 @@ .textarea { width: 100%; } + +.notebook-input { + width: 240px; +} diff --git a/src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.ts b/src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.ts index b40244bdf90..e277cab1966 100644 --- a/src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.ts +++ b/src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.ts @@ -11,7 +11,6 @@ import { Subject, debounceTime } from 'rxjs'; }) export class NotebookAuthoringComponent { protected notebookChanged: Subject = new Subject(); - protected projectId: number; protected project: any; protected reportIdToAuthoringNote: any; @@ -22,7 +21,6 @@ export class NotebookAuthoringComponent { ngOnInit(): void { this.project = this.projectService.project; - this.projectId = this.configService.getProjectId(); this.reportIdToAuthoringNote = {}; if (this.project.notebook == null) { @@ -36,17 +34,12 @@ export class NotebookAuthoringComponent { this.project.teacherNotebook = projectTemplate.teacherNotebook; } - this.initializeStudentNotesAuthoring(); this.initializeTeacherNotesAuthoring(); this.notebookChanged.pipe(debounceTime(1000)).subscribe(() => { this.save(); }); } - private initializeStudentNotesAuthoring(): void { - this.initializeNotesAuthoring(this.project.notebook.itemTypes.report.notes); - } - private initializeTeacherNotesAuthoring(): void { this.initializeNotesAuthoring(this.project.teacherNotebook.itemTypes.report.notes); } @@ -68,17 +61,14 @@ export class NotebookAuthoringComponent { this.reportIdToAuthoringNote[reportId] = authoringReportNote; } - private getAuthoringReportNote(id: string): any { - return this.reportIdToAuthoringNote[id]; + protected reportStarterTextChanged(reportId: string): void { + const note = this.getReportNote(reportId); + const authoringNote = this.getAuthoringReportNote(reportId); + note.content = insertWiseLinks(this.configService.removeAbsoluteAssetPaths(authoringNote.html)); + this.save(); } private getReportNote(id: string): any { - const studentNotes = this.project.notebook.itemTypes.report.notes; - for (const note of studentNotes) { - if (note.reportId === id) { - return note; - } - } const teacherNotes = this.project.teacherNotebook.itemTypes.report.notes; for (const note of teacherNotes) { if (note.reportId === id) { @@ -88,11 +78,8 @@ export class NotebookAuthoringComponent { return null; } - protected reportStarterTextChanged(reportId: string): void { - const note = this.getReportNote(reportId); - const authoringNote = this.getAuthoringReportNote(reportId); - note.content = insertWiseLinks(this.configService.removeAbsoluteAssetPaths(authoringNote.html)); - this.save(); + private getAuthoringReportNote(id: string): any { + return this.reportIdToAuthoringNote[id]; } protected contentChanged(): void { @@ -102,4 +89,8 @@ export class NotebookAuthoringComponent { private save(): void { this.projectService.saveProject(); } + + protected reportStarterTextDisabled(): boolean { + return !this.projectService.isDefaultLocale(); + } } diff --git a/src/assets/wise5/authoringTool/project-asset-authoring/project-asset-authoring.component.html b/src/assets/wise5/authoringTool/project-asset-authoring/project-asset-authoring.component.html index cd7a47dff75..5a0b0c70cd4 100644 --- a/src/assets/wise5/authoringTool/project-asset-authoring/project-asset-authoring.component.html +++ b/src/assets/wise5/authoringTool/project-asset-authoring/project-asset-authoring.component.html @@ -9,7 +9,7 @@

- - {{ metadataField.name }} - - - - {{ metadataField.name }} - - - + + + + diff --git a/src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.html b/src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.html new file mode 100644 index 00000000000..6fe1e62558c --- /dev/null +++ b/src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.html @@ -0,0 +1,20 @@ +

Language

+Default language: + + +Additional languages: + + diff --git a/src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.scss b/src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.scss new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.spec.ts b/src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.spec.ts new file mode 100644 index 00000000000..ecd4a4f58a1 --- /dev/null +++ b/src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.spec.ts @@ -0,0 +1,33 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { NgSelectModule } from '@ng-select/ng-select'; +import { EditProjectLanguageSettingComponent } from './edit-project-language-setting.component'; +import { TeacherProjectService } from '../../../services/teacherProjectService'; +import { ProjectLocale } from '../../../../../app/domain/projectLocale'; +import { FormsModule } from '@angular/forms'; + +class MockTeacherProjectService { + getLocale() {} + saveProject() {} +} +describe('EditProjectLanguageSettingComponent', () => { + let component: EditProjectLanguageSettingComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [EditProjectLanguageSettingComponent], + imports: [FormsModule, NgSelectModule], + providers: [{ provide: TeacherProjectService, useClass: MockTeacherProjectService }] + }); + fixture = TestBed.createComponent(EditProjectLanguageSettingComponent); + component = fixture.componentInstance; + spyOn(TestBed.inject(TeacherProjectService), 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en_US', supported: [] }) + ); + fixture.detectChanges(); + }); + + it('creates', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.ts b/src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.ts new file mode 100644 index 00000000000..4bd26f05117 --- /dev/null +++ b/src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.ts @@ -0,0 +1,46 @@ +import { Component } from '@angular/core'; +import { Language } from '../../../../../app/domain/language'; +import { TeacherProjectService } from '../../../services/teacherProjectService'; +import { ProjectLocale } from '../../../../../app/domain/projectLocale'; +import { localeToLanguage } from '../../../../../app/domain/localeToLanguage'; + +@Component({ + selector: 'edit-project-language-setting', + templateUrl: './edit-project-language-setting.component.html' +}) +export class EditProjectLanguageSettingComponent { + protected availableLanguages: Language[]; + protected defaultLanguage: Language; + private projectLocale: ProjectLocale; + protected supportedLanguages: Language[]; + + constructor(private projectService: TeacherProjectService) {} + + ngOnInit(): void { + this.updateModel(); + } + + private updateModel(): void { + this.projectLocale = this.projectService.getLocale(); + this.defaultLanguage = this.projectLocale.getDefaultLanguage(); + this.supportedLanguages = this.projectLocale.getSupportedLanguages(); + this.availableLanguages = Object.entries(localeToLanguage) + .map(([locale, language]) => ({ + locale: locale, + language: language + })) + .filter((language) => language.locale != this.defaultLanguage.locale); + } + + protected updateDefaultLanguage(): void { + this.projectLocale.setDefaultLocale(this.defaultLanguage.locale); + this.projectService.saveProject(); + this.updateModel(); + } + + protected updateSupportedLanguages(): void { + this.projectLocale.setSupportedLanguages(this.supportedLanguages); + this.projectService.saveProject(); + this.updateModel(); + } +} diff --git a/src/assets/wise5/authoringTool/rubric/rubric-authoring.component.html b/src/assets/wise5/authoringTool/rubric/rubric-authoring.component.html index 86a015798fe..8b4cc12573c 100644 --- a/src/assets/wise5/authoringTool/rubric/rubric-authoring.component.html +++ b/src/assets/wise5/authoringTool/rubric/rubric-authoring.component.html @@ -1,3 +1,6 @@
Edit Unit Rubric
- - + diff --git a/src/assets/wise5/authoringTool/rubric/rubric-authoring.component.ts b/src/assets/wise5/authoringTool/rubric/rubric-authoring.component.ts index fb00fbb6a2a..83e8a0722e3 100644 --- a/src/assets/wise5/authoringTool/rubric/rubric-authoring.component.ts +++ b/src/assets/wise5/authoringTool/rubric/rubric-authoring.component.ts @@ -1,7 +1,5 @@ -import { ConfigService } from '../../services/configService'; import { TeacherProjectService } from '../../services/teacherProjectService'; import { Component } from '@angular/core'; -import { insertWiseLinks } from '../../common/wise-link/wise-link'; @Component({ selector: 'rubric-authoring', @@ -9,20 +7,15 @@ import { insertWiseLinks } from '../../common/wise-link/wise-link'; styleUrls: ['./rubric-authoring.component.scss'] }) export class RubricAuthoringComponent { - rubric: string = ''; + protected project: any; - constructor( - private configService: ConfigService, - private projectService: TeacherProjectService - ) {} + constructor(private projectService: TeacherProjectService) {} ngOnInit(): void { - this.rubric = this.projectService.replaceAssetPaths(this.projectService.getProjectRubric()); + this.project = this.projectService.getProject(); } protected rubricChanged(): void { - const html = insertWiseLinks(this.configService.removeAbsoluteAssetPaths(this.rubric)); - this.projectService.setProjectRubric(html); this.projectService.saveProject(); } } diff --git a/src/assets/wise5/authoringTool/tsconfig.json b/src/assets/wise5/authoringTool/tsconfig.json index 5c18d0d290c..1b896955c98 100644 --- a/src/assets/wise5/authoringTool/tsconfig.json +++ b/src/assets/wise5/authoringTool/tsconfig.json @@ -10,8 +10,17 @@ "experimentalDecorators": true, "resolveJsonModule": true, "target": "es5", - "typeRoots": ["node_modules/@types"], - "lib": ["es2017", "dom"] + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2019", + "dom" + ] }, - "include": ["src/**/*.ts", "../services/projectService.ts", "**/*.ts"] -} + "include": [ + "src/**/*.ts", + "../services/projectService.ts", + "**/*.ts" + ] +} \ No newline at end of file diff --git a/src/assets/wise5/common/StudentStatus.ts b/src/assets/wise5/common/StudentStatus.ts index 9dc39a311d1..bc9f261a742 100644 --- a/src/assets/wise5/common/StudentStatus.ts +++ b/src/assets/wise5/common/StudentStatus.ts @@ -1,8 +1,10 @@ +import { Language } from '../../../app/domain/language'; import { NodeProgress } from './NodeProgress'; export class StudentStatus { computerAvatarId?: string; currentNodeId: string; + language?: Language; nodeStatuses: any; periodId: number; projectCompletion: NodeProgress; diff --git a/src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html b/src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html index 75d936b3443..893fd23c315 100644 --- a/src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html +++ b/src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html @@ -5,6 +5,7 @@ prompt. + +
- - Text - - +
- - Image Moving Left - - - - - Image Moving Right - - - + />
@@ -358,23 +345,20 @@ (ngModelChange)="inputChange.next($event)" /> - - Change to Image (Optional) - - - + />
+
+ +
- - Node Label - - +
- - Image - - - + +
@@ -202,14 +197,14 @@
- - Links Title - - +
Links +
+ +
; @@ -50,8 +51,12 @@ describe('DrawAuthoringComponent', () => { StudentTeacherCommonServicesModule ] }); + spyOn(TestBed.inject(TeacherProjectService), 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en-US' }) + ); fixture = TestBed.createComponent(DrawAuthoring); component = fixture.componentInstance; + spyOn(TestBed.inject(TeacherProjectService), 'isDefaultLocale').and.returnValue(true); spyOn(TestBed.inject(TeacherProjectService), 'getComponent').and.returnValue( copy(componentContent) ); @@ -60,29 +65,8 @@ describe('DrawAuthoringComponent', () => { }); moveAStampDown(); moveAStampUp(); - selectTheBackgroundImage(); }); -function selectTheBackgroundImage() { - it('should select the background image', () => { - component.nodeId = 'node1'; - component.componentId = 'component1'; - expect(component.componentContent.background).toEqual('background.png'); - spyOn(component, 'componentChanged').and.callFake(() => {}); - const args = { - nodeId: 'node1', - componentId: 'component1', - target: 'background', - targetObject: {}, - assetItem: { - fileName: 'new_background.png' - } - }; - component.assetSelected(args); - expect(component.componentContent.background).toEqual('new_background.png'); - }); -} - function moveAStampUp() { it('should move a stamp up', () => { expect(component.componentContent.stamps.Stamps[0]).toEqual('carbon.png'); diff --git a/src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.ts b/src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.ts index 4841efe523b..f75534a98a8 100644 --- a/src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.ts +++ b/src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.ts @@ -158,10 +158,7 @@ export class DrawAuthoring extends AbstractComponentAuthoring { assetSelected({ nodeId, componentId, assetItem, target, targetObject }): void { super.assetSelected({ nodeId, componentId, assetItem, target }); const fileName = assetItem.fileName; - if (target === 'background') { - this.componentContent.background = fileName; - this.updateStarterDrawDataBackgroundAndSave(); - } else if (target === 'stamp') { + if (target === 'stamp') { const stampIndex = targetObject; this.setStampImage(stampIndex, fileName); this.updateAuthoringComponentContentStampsAndSave(); @@ -272,14 +269,4 @@ export class DrawAuthoring extends AbstractComponentAuthoring { } return stampStrings; } - - chooseBackground(): void { - new AssetChooser(this.dialog, this.nodeId, this.componentId) - .open('background') - .afterClosed() - .pipe(filter((data) => data != null)) - .subscribe((data: any) => { - return this.assetSelected(data); - }); - } } diff --git a/src/assets/wise5/components/draw/draw-authoring/draw-authoring.module.ts b/src/assets/wise5/components/draw/draw-authoring/draw-authoring.module.ts index 433503f45cd..95fd478c3a7 100644 --- a/src/assets/wise5/components/draw/draw-authoring/draw-authoring.module.ts +++ b/src/assets/wise5/components/draw/draw-authoring/draw-authoring.module.ts @@ -19,11 +19,13 @@ import { TeacherProjectService } from '../../../services/teacherProjectService'; import { DrawService } from '../drawService'; import { DrawAuthoring } from './draw-authoring.component'; import { TeacherNodeService } from '../../../services/teacherNodeService'; +import { ComponentAuthoringModule } from '../../component-authoring.module'; @NgModule({ declarations: [DrawAuthoring, EditComponentPrompt], imports: [ CommonModule, + ComponentAuthoringModule, FormsModule, MatCheckboxModule, MatDialogModule, diff --git a/src/assets/wise5/components/embedded/edit-embedded-advanced/edit-embedded-advanced.component.html b/src/assets/wise5/components/embedded/edit-embedded-advanced/edit-embedded-advanced.component.html index 15b820a0792..d59e336c728 100644 --- a/src/assets/wise5/components/embedded/edit-embedded-advanced/edit-embedded-advanced.component.html +++ b/src/assets/wise5/components/embedded/edit-embedded-advanced/edit-embedded-advanced.component.html @@ -1,12 +1,12 @@
- - Model Parameters - - +
diff --git a/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.html b/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.html index 8827ae41c25..816edde61a0 100644 --- a/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.html +++ b/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.html @@ -1,19 +1,19 @@ -
- - Model File Name - - - +
+ +
; @@ -22,9 +23,22 @@ describe('EmbeddedAuthoringComponent', () => { ], providers: [TeacherNodeService] }); + spyOn(TestBed.inject(TeacherProjectService), 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en-US' }) + ); fixture = TestBed.createComponent(EmbeddedAuthoring); component = fixture.componentInstance; - const componentContent = createComponentContent(); + const componentContent = { + id: '86fel4wjm4', + type: 'Embedded', + prompt: '', + showSaveButton: false, + showSubmitButton: false, + url: 'glucose.html', + showAddToNotebookButton: true, + width: null + }; + spyOn(TestBed.inject(TeacherProjectService), 'isDefaultLocale').and.returnValue(true); spyOn(TestBed.inject(TeacherProjectService), 'getComponent').and.returnValue( copy(componentContent) ); @@ -32,38 +46,7 @@ describe('EmbeddedAuthoringComponent', () => { fixture.detectChanges(); }); - shouldSelectTheModelFile(); -}); - -function createComponentContent() { - return { - id: '86fel4wjm4', - type: 'Embedded', - prompt: '', - showSaveButton: false, - showSubmitButton: false, - url: 'glucose.html', - showAddToNotebookButton: true, - width: null - }; -} - -function shouldSelectTheModelFile() { - it('should select the model file', () => { - component.nodeId = 'node1'; - component.componentId = 'component1'; - expect(component.componentContent.url).toEqual('glucose.html'); - spyOn(component, 'componentChanged').and.callFake(() => {}); - const args = { - nodeId: 'node1', - componentId: 'component1', - target: 'modelFile', - targetObject: {}, - assetItem: { - fileName: 'thermo.html' - } - }; - component.assetSelected(args); - expect(component.componentContent.url).toEqual('thermo.html'); + it('should create', () => { + expect(component).toBeTruthy(); }); -} +}); diff --git a/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.ts b/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.ts index 521aaf7453a..3421f6d06b9 100644 --- a/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.ts +++ b/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.ts @@ -6,9 +6,6 @@ import { AbstractComponentAuthoring } from '../../../authoringTool/components/Ab import { ConfigService } from '../../../services/configService'; import { TeacherProjectService } from '../../../services/teacherProjectService'; import { EmbeddedService } from '../embeddedService'; -import { MatDialog } from '@angular/material/dialog'; -import { AssetChooser } from '../../../authoringTool/project-asset-authoring/asset-chooser'; -import { filter } from 'rxjs/operators'; import { TeacherNodeService } from '../../../services/teacherNodeService'; @Component({ @@ -21,7 +18,6 @@ export class EmbeddedAuthoring extends AbstractComponentAuthoring { constructor( protected ConfigService: ConfigService, - private dialog: MatDialog, private EmbeddedService: EmbeddedService, protected NodeService: TeacherNodeService, protected ProjectAssetService: ProjectAssetService, @@ -37,14 +33,6 @@ export class EmbeddedAuthoring extends AbstractComponentAuthoring { ); } - assetSelected({ nodeId, componentId, assetItem, target }): void { - super.assetSelected({ nodeId, componentId, assetItem, target }); - if (target === 'modelFile') { - this.componentContent.url = assetItem.fileName; - this.componentChanged(); - } - } - reloadModel(): void { const iframe: any = document.getElementById(this.embeddedApplicationIFrameId); const src = iframe.src; @@ -56,14 +44,4 @@ export class EmbeddedAuthoring extends AbstractComponentAuthoring { this.componentContent.url = url; this.componentChanged(); } - - chooseModelFile(): void { - new AssetChooser(this.dialog, this.nodeId, this.componentId) - .open('modelFile') - .afterClosed() - .pipe(filter((data) => data != null)) - .subscribe((data: any) => { - return this.assetSelected(data); - }); - } } diff --git a/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.module.ts b/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.module.ts index d54c69933ad..58d75cb8253 100644 --- a/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.module.ts +++ b/src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.module.ts @@ -21,11 +21,13 @@ import { TagService } from '../../../services/tagService'; import { TeacherProjectService } from '../../../services/teacherProjectService'; import { EmbeddedService } from '../embeddedService'; import { EmbeddedAuthoring } from './embedded-authoring.component'; +import { ComponentAuthoringModule } from '../../component-authoring.module'; @NgModule({ declarations: [EmbeddedAuthoring, EditComponentPrompt, AuthorUrlParametersComponent], imports: [ CommonModule, + ComponentAuthoringModule, FormsModule, MatCheckboxModule, MatDialogModule, diff --git a/src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html b/src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html index 687b1226094..37602c61860 100644 --- a/src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html +++ b/src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html @@ -1,14 +1,12 @@
-
- - Subtitle - - -
+
-
- - Custom Legend - - -
+ + +
X Axis Plot Line -
+
+ + Category Name + + + -
+ delete +
-
+
Enable Multiple Y Axes -
+ -
+
2 3 4
-
+
-
- Y Axis - - Title - - - +
+ Y Axis + + Color - - Units - - - + Min - + Max
-
+
- Y Axis - - Title - - - + Y Axis + + Color - - Units - - - + + Min - + Max Right Side
-
+
- - Background Image (Optional) - - - -
-
- - Round Values To - - - {{ availableRoundingOption.text }} - - - + +
+ + Round Values To + + + {{ availableRoundingOption.text }} + + +

-
- Series +
+ Series +
+ +
@@ -132,17 +125,15 @@ *ngFor="let label of componentContent.labels; index as labelIndex" class="starter-label-container" > -
- - Text - - +
+ Color data != null)) - .subscribe((data: any) => { - return this.assetSelected(data); - }); - } } diff --git a/src/assets/wise5/components/match/match-authoring/match-authoring.component.html b/src/assets/wise5/components/match/match-authoring/match-authoring.component.html index 90eca512f03..707943cc1e6 100644 --- a/src/assets/wise5/components/match/match-authoring/match-authoring.component.html +++ b/src/assets/wise5/components/match/match-authoring/match-authoring.component.html @@ -1,5 +1,5 @@

@@ -63,29 +63,22 @@ fxLayout="row" fxLayoutAlign="start center" > - - Choice Name - - - + +

- - Source Bucket Name - - +
Target Buckets + + +
+ +
- - Feeback - - +
Notify Teacher - - Feedback to Teacher - - +
diff --git a/src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.scss b/src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.scss index 18d50504261..607421b47d9 100644 --- a/src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.scss +++ b/src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.scss @@ -44,7 +44,7 @@ $notice-bg: map-get($default-colors, notice-bg); } .scoring-rule-score { - width: 5%; + width: 10%; } .scoring-rule-feedback-text { @@ -82,3 +82,7 @@ $notice-bg: map-get($default-colors, notice-bg); .custom-completion-criteria-action { width: 8%; } + +.mat-icon { + margin: 0; +} diff --git a/src/assets/wise5/components/openResponse/open-response-authoring/open-response-authoring.component.html b/src/assets/wise5/components/openResponse/open-response-authoring/open-response-authoring.component.html index 8a80c3c5604..a813c28789b 100644 --- a/src/assets/wise5/components/openResponse/open-response-authoring/open-response-authoring.component.html +++ b/src/assets/wise5/components/openResponse/open-response-authoring/open-response-authoring.component.html @@ -11,7 +11,7 @@ >announcement
diff --git a/src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html b/src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html index c52f348036a..24e89aff83d 100644 --- a/src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html +++ b/src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html @@ -23,6 +23,7 @@
- - URL - - +
diff --git a/src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.scss b/src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.scss index 03e99c94811..9ab26898490 100644 --- a/src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.scss +++ b/src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.scss @@ -74,10 +74,6 @@ p.select-oer-instructions { margin-top: 20px; } -.url-input-container { - width: 100%; -} - .dimension-input-container { margin-right: 20px; width: 150px; diff --git a/src/assets/wise5/components/peerChat/peer-chat-authoring/peer-chat-authoring.component.html b/src/assets/wise5/components/peerChat/peer-chat-authoring/peer-chat-authoring.component.html index 49a40c5571e..0714d30ff76 100644 --- a/src/assets/wise5/components/peerChat/peer-chat-authoring/peer-chat-authoring.component.html +++ b/src/assets/wise5/components/peerChat/peer-chat-authoring/peer-chat-authoring.component.html @@ -1,6 +1,6 @@
diff --git a/src/assets/wise5/components/showMyWork/show-my-work-authoring/show-my-work-authoring.component.html b/src/assets/wise5/components/showMyWork/show-my-work-authoring/show-my-work-authoring.component.html index 2b2f7012d2d..1a38841448f 100644 --- a/src/assets/wise5/components/showMyWork/show-my-work-authoring/show-my-work-authoring.component.html +++ b/src/assets/wise5/components/showMyWork/show-my-work-authoring/show-my-work-authoring.component.html @@ -1,5 +1,5 @@
diff --git a/src/assets/wise5/components/showMyWork/show-my-work-authoring/show-my-work-authoring.component.spec.ts b/src/assets/wise5/components/showMyWork/show-my-work-authoring/show-my-work-authoring.component.spec.ts index b539105b46b..485bd612646 100644 --- a/src/assets/wise5/components/showMyWork/show-my-work-authoring/show-my-work-authoring.component.spec.ts +++ b/src/assets/wise5/components/showMyWork/show-my-work-authoring/show-my-work-authoring.component.spec.ts @@ -13,6 +13,8 @@ import { StudentTeacherCommonServicesModule } from '../../../../../app/student-t import { TeacherProjectService } from '../../../services/teacherProjectService'; import { ShowMyWorkAuthoringComponent } from './show-my-work-authoring.component'; import { TeacherNodeService } from '../../../services/teacherNodeService'; +import { ComponentAuthoringModule } from '../../component-authoring.module'; +import { ProjectLocale } from '../../../../../app/domain/projectLocale'; describe('ShowMyWorkAuthoringComponent', () => { let component: ShowMyWorkAuthoringComponent; @@ -35,6 +37,7 @@ describe('ShowMyWorkAuthoringComponent', () => { imports: [ BrowserAnimationsModule, BrowserModule, + ComponentAuthoringModule, FormsModule, HttpClientTestingModule, MatDialogModule, @@ -49,7 +52,11 @@ describe('ShowMyWorkAuthoringComponent', () => { }); beforeEach(() => { + spyOn(TestBed.inject(TeacherProjectService), 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en-US' }) + ); fixture = TestBed.createComponent(ShowMyWorkAuthoringComponent); + spyOn(TestBed.inject(TeacherProjectService), 'isDefaultLocale').and.returnValue(true); spyOn(TestBed.inject(TeacherProjectService), 'getFlattenedProjectAsNodeIds').and.returnValue([ nodeId1 ]); diff --git a/src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html b/src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html index ec1349db1f6..d5b836bec66 100644 --- a/src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html +++ b/src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html @@ -1,5 +1,5 @@

Choose the step and component to show the summary data for:

@@ -134,14 +134,14 @@ fxLayoutAlign="start center" class="custom-label-color-container" > - - Label - - + Color { BrowserAnimationsModule, BrowserModule, CommonModule, + ComponentAuthoringModule, FormsModule, HttpClientTestingModule, MatCheckboxModule, @@ -50,10 +53,14 @@ describe('SummaryAuthoringComponent', () => { TeacherProjectService ] }); + spyOn(TestBed.inject(TeacherProjectService), 'getLocale').and.returnValue( + new ProjectLocale({ default: 'en-US' }) + ); fixture = TestBed.createComponent(SummaryAuthoring); component = fixture.componentInstance; const componentContent = createComponentContent(); component.componentContent = copy(componentContent); + spyOn(TestBed.inject(TeacherProjectService), 'isDefaultLocale').and.returnValue(true); getComponentSpy = spyOn(TestBed.inject(TeacherProjectService), 'getComponent'); getComponentSpy.and.returnValue(componentContent); spyOn(component, 'componentChanged'); diff --git a/src/assets/wise5/components/table/table-authoring/table-authoring.component.html b/src/assets/wise5/components/table/table-authoring/table-authoring.component.html index 9febc7bc5e6..0dbc44d884d 100644 --- a/src/assets/wise5/components/table/table-authoring/table-authoring.component.html +++ b/src/assets/wise5/components/table/table-authoring/table-authoring.component.html @@ -1,5 +1,5 @@
@@ -146,15 +146,14 @@
- - - + diff --git a/src/assets/wise5/directives/wise-tinymce-editor/wise-tinymce-editor.component.ts b/src/assets/wise5/directives/wise-tinymce-editor/wise-tinymce-editor.component.ts index 197f429bd68..0493aa5a198 100644 --- a/src/assets/wise5/directives/wise-tinymce-editor/wise-tinymce-editor.component.ts +++ b/src/assets/wise5/directives/wise-tinymce-editor/wise-tinymce-editor.component.ts @@ -1,9 +1,11 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Component, EventEmitter, Input, Output, SimpleChanges, ViewChild } from '@angular/core'; import { debounceTime } from 'rxjs/operators'; import { Subject, Subscription } from 'rxjs'; import { NotebookService } from '../../services/notebookService'; import { EditorModule } from '@tinymce/tinymce-angular'; import 'tinymce'; +import { EditorComponent } from '@tinymce/tinymce-angular'; +import { Language } from '../../../../app/domain/language'; declare let tinymce: any; @@ -17,8 +19,11 @@ declare let tinymce: any; export class WiseTinymceEditorComponent { public config: any; private debouncer: Subject = new Subject(); + @Input() disabled: boolean; public editor: any; + @ViewChild(EditorComponent) editorComponent: EditorComponent; @Input() isAddNoteButtonAvailable: boolean; + @Input() language: Language; @Input() model: any; @Output() modelChange: EventEmitter = new EventEmitter(); @Output() openNotebook: EventEmitter = new EventEmitter(); @@ -98,6 +103,25 @@ export class WiseTinymceEditorComponent { this.initializeTinyMCE(); } + ngOnChanges(changes: SimpleChanges): void { + if (this.editorComponent) { + if ( + changes.model && + changes.model.currentValue !== this.editorComponent.editor.getContent() + ) { + this.editorComponent.editor.setContent(changes.model.currentValue ?? ''); + } + if (changes.language && !this.model) { + // handles an edge case in the AT translation mode where + // 1. show lang1 (original value: undefined) + // 2. translate lang1 (set value to 'XYZ') + // 3. switch to lang2 (original value: undefined) + // should show empty editor, but is showing 'XYZ' + this.editorComponent.editor.setContent(''); + } + } + } + addPluginName(pluginName: string): void { this.plugins.push(pluginName); } @@ -114,9 +138,9 @@ export class WiseTinymceEditorComponent { media_live_embeds: true, extended_valid_elements: this.extendedValidElements, font_formats: `Roboto=Roboto,Helvetica Neue,sans-serif; Raleway=Raleway,sans-serif; - Arial=arial,helvetica,sans-serif; Arial Black=arial black,avant garde; - Comic Sans MS=comic sans ms,sans-serif; Courier New=courier new,courier; Georgia=georgia,palatino; - Helvetica=helvetica; Impact=impact,chicago; Tahoma=tahoma,arial,helvetica,sans-serif; + Arial=arial,helvetica,sans-serif; Arial Black=arial black,avant garde; + Comic Sans MS=comic sans ms,sans-serif; Courier New=courier new,courier; Georgia=georgia,palatino; + Helvetica=helvetica; Impact=impact,chicago; Tahoma=tahoma,arial,helvetica,sans-serif; Terminal=terminal,monaco; Times New Roman=times new roman,times; Verdana=verdana,geneva`, plugins: this.plugins, quickbars_insert_toolbar: false, diff --git a/src/assets/wise5/services/copyTranslationsService.ts b/src/assets/wise5/services/copyTranslationsService.ts new file mode 100644 index 00000000000..397ca08ab35 --- /dev/null +++ b/src/assets/wise5/services/copyTranslationsService.ts @@ -0,0 +1,63 @@ +import { Injectable } from '@angular/core'; +import { EditTranslationsService } from './editProjectTranslationsService'; +import { Node } from '../common/Node'; +import { Observable, forkJoin } from 'rxjs'; +import { generateRandomKey } from '../common/string/string'; +import { ComponentContent } from '../common/ComponentContent'; + +interface I18NReplaceKey { + new: string; + original: string; +} + +@Injectable() +export class CopyTranslationsService extends EditTranslationsService { + tryCopyNodes(nodes: Node[]): void { + if (this.projectService.getLocale().hasTranslations()) { + this.copyNodes(nodes); + } + } + + private async copyNodes(nodes: Node[]): Promise { + const i18nKeys = nodes.flatMap((node) => + node.components.flatMap((component) => this.getI18NKeys(component)) + ); + forkJoin(await this.getSaveTranslationRequests(i18nKeys)).subscribe(); + this.projectService.saveProject(); + } + + private async getSaveTranslationRequests( + i18nKeys: I18NReplaceKey[] + ): Promise[]> { + const saveTranslationRequests: Observable[] = []; + (await this.fetchAllTranslations()).forEach((translations, language) => { + i18nKeys.forEach((i18nKey) => (translations[i18nKey.new] = translations[i18nKey.original])); + saveTranslationRequests.push(this.getSaveTranslationRequest(translations, language)); + }); + return saveTranslationRequests; + } + + tryCopyComponents(node: Node, components: ComponentContent[]): void { + if (this.projectService.getLocale().hasTranslations()) { + this.copyComponents( + node, + components.map((c) => c.id) + ); + } + } + + private async copyComponents(node: Node, componentIds: string[]): Promise { + const i18nKeys = node.components + .filter((component) => componentIds.includes(component.id)) + .flatMap((component) => this.getI18NKeys(component)); + forkJoin(await this.getSaveTranslationRequests(i18nKeys)).subscribe(); + this.projectService.saveProject(); + } + + protected getI18NKey(componentElement: object, key: string): I18NReplaceKey { + const originalI18NKey = componentElement[key].id; + const newI18NKey = generateRandomKey(30); + componentElement[key].id = newI18NKey; + return { original: originalI18NKey, new: newI18NKey }; + } +} diff --git a/src/assets/wise5/services/deleteTranslationsService.ts b/src/assets/wise5/services/deleteTranslationsService.ts new file mode 100644 index 00000000000..98c76ee6d03 --- /dev/null +++ b/src/assets/wise5/services/deleteTranslationsService.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { Observable, forkJoin } from 'rxjs'; +import { ComponentContent } from '../common/ComponentContent'; +import { EditTranslationsService } from './editProjectTranslationsService'; + +@Injectable() +export class DeleteTranslationsService extends EditTranslationsService { + tryDeleteComponents(components: ComponentContent[]): void { + if (this.projectService.getLocale().hasTranslations()) { + this.deleteComponents(components); + } + } + + private async deleteComponents(components: ComponentContent[]): Promise { + const i18nKeys = components.flatMap((component) => this.getI18NKeys(component)); + const saveTranslationRequests: Observable[] = []; + (await this.fetchAllTranslations()).forEach((translations, language) => { + i18nKeys.forEach((i18nKey) => delete translations[i18nKey]); + saveTranslationRequests.push(this.getSaveTranslationRequest(translations, language)); + }); + forkJoin(saveTranslationRequests).subscribe(); + } +} diff --git a/src/assets/wise5/services/editProjectTranslationsService.ts b/src/assets/wise5/services/editProjectTranslationsService.ts new file mode 100644 index 00000000000..3cd4d72b1c3 --- /dev/null +++ b/src/assets/wise5/services/editProjectTranslationsService.ts @@ -0,0 +1,63 @@ +import { HttpClient } from '@angular/common/http'; +import { ConfigService } from './configService'; +import { ProjectTranslationService } from './projectTranslationService'; +import { TeacherProjectService } from './teacherProjectService'; +import { lastValueFrom, Observable } from 'rxjs'; +import { Translations } from '../../../app/domain/translations'; +import { Language } from '../../../app/domain/language'; +import { Injectable } from '@angular/core'; + +@Injectable() +export class EditTranslationsService extends ProjectTranslationService { + constructor( + protected configService: ConfigService, + protected http: HttpClient, + protected projectService: TeacherProjectService + ) { + super(configService, http, projectService); + } + + protected async fetchAllTranslations(): Promise> { + const allTranslations = new Map(); + await Promise.all( + this.projectService + .getLocale() + .getSupportedLanguages() + .map(async (language) => { + allTranslations.set( + language, + await lastValueFrom(this.fetchTranslations(language.locale)) + ); + }) + ); + return allTranslations; + } + + protected getI18NKeys(componentElement: object): any[] { + let i18nKeys = Object.keys(componentElement) + .filter((key) => key.endsWith('.i18n')) + .map((key) => this.getI18NKey(componentElement, key)); + Object.values(componentElement).forEach((value) => { + if (Array.isArray(value)) { + i18nKeys = i18nKeys.concat(...value.map((val) => this.getI18NKeys(val))); + } else if (typeof value === 'object' && value != null) { + i18nKeys = i18nKeys.concat(this.getI18NKeys(value)); + } + }); + return i18nKeys; + } + + protected getI18NKey(componentElement: object, key: string): any { + return componentElement[key].id; + } + + protected getSaveTranslationRequest( + translations: Translations, + language: Language + ): Observable { + return this.http.post( + `/api/author/project/translate/${this.configService.getProjectId()}/${language.locale}`, + translations + ); + } +} diff --git a/src/assets/wise5/services/projectService.ts b/src/assets/wise5/services/projectService.ts index 107b2584128..47509f82bb0 100644 --- a/src/assets/wise5/services/projectService.ts +++ b/src/assets/wise5/services/projectService.ts @@ -1,7 +1,7 @@ 'use strict'; import { ConfigService } from './configService'; -import { Injectable } from '@angular/core'; +import { Injectable, WritableSignal, signal } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Observable, Subject, tap } from 'rxjs'; import { Node } from '../common/Node'; @@ -18,6 +18,8 @@ import { ReferenceComponent } from '../../../app/domain/referenceComponent'; import { QuestionBank } from '../components/peerChat/peer-chat-question-bank/QuestionBank'; import { DynamicPrompt } from '../directives/dynamic-prompt/DynamicPrompt'; import { Component } from '../common/Component'; +import { ProjectLocale } from '../../../app/domain/projectLocale'; +import { Language } from '../../../app/domain/language'; @Injectable() export class ProjectService { @@ -25,6 +27,9 @@ export class ProjectService { additionalProcessingFunctionsMap: any = {}; allPaths: string[][] = []; applicationNodes: any = []; + private currentLanguageSignal: WritableSignal = signal(null); + readonly currentLanguage = this.currentLanguageSignal.asReadonly(); + flattenedProjectAsNodeIds: any = null; groupNodes: any[] = []; idToNode: any = {}; @@ -38,6 +43,7 @@ export class ProjectService { nodeIdToIsInBranchPath: any = {}; nodeIdsInAnyBranch: any = []; nodeIdToBranchPathLetter: any = {}; + private originalProject: any; project: any = null; rootNode: any = null; transitions: Transition[] = []; @@ -52,6 +58,10 @@ export class ProjectService { protected pathService: PathService ) {} + getProject(): any { + return this.project; + } + setProject(project: any): void { this.project = project; this.parseProject(); @@ -228,6 +238,9 @@ export class ProjectService { if (this.project.projectAchievements != null) { this.achievements = this.project.projectAchievements; } + if (this.currentLanguage() == null) { + this.currentLanguageSignal.set(this.getLocale().getDefaultLanguage()); + } this.broadcastProjectParsed(); } @@ -239,6 +252,10 @@ export class ProjectService { instantiateDefaults(): void { this.project.nodes = this.project.nodes ? this.project.nodes : []; this.project.inactiveNodes = this.project.inactiveNodes ? this.project.inactiveNodes : []; + this.project.metadata.locale = this.project.metadata.locale ?? { + default: 'en_US', + supported: [] + }; } private calculateNodeOrderOfProject(): void { @@ -783,6 +800,8 @@ export class ProjectService { retrieveProject(): Observable { return this.makeProjectRequest().pipe( tap((projectJSON: any) => { + this.originalProject = projectJSON; + this.setCurrentLanguage(null); this.setProject(projectJSON); return projectJSON; }) @@ -792,6 +811,7 @@ export class ProjectService { retrieveProjectWithoutParsing(): Observable { return this.makeProjectRequest().pipe( tap((projectJSON: any) => { + this.originalProject = projectJSON; this.project = projectJSON; this.metadata = projectJSON.metadata; return projectJSON; @@ -805,6 +825,10 @@ export class ProjectService { return this.http.get(projectURL, { headers: headers }); } + getOriginalProject(): any { + return this.originalProject; + } + getThemePath(): string { return this.getDefaultThemePath(); } @@ -1395,7 +1419,9 @@ export class ProjectService { calculateComponentIdToHasWork( components: ComponentContent[] - ): { [componentId: string]: boolean } { + ): { + [componentId: string]: boolean; + } { const componentIdToHasWork: { [componentId: string]: boolean } = {}; for (const component of components) { componentIdToHasWork[component.id] = this.componentHasWork(component); @@ -1999,6 +2025,18 @@ export class ProjectService { return new Component(this.getComponent(nodeId, componentId), nodeId); } + getLocale(): ProjectLocale { + return new ProjectLocale(this.project.metadata.locale); + } + + setCurrentLanguage(language: Language): void { + this.currentLanguageSignal.set(language); + } + + isDefaultLocale(): boolean { + return this.getLocale().isDefaultLocale(this.currentLanguage().locale); + } + getSpeechToTextSettings(): any { return this.project.speechToText; } diff --git a/src/assets/wise5/services/projectTranslationService.ts b/src/assets/wise5/services/projectTranslationService.ts new file mode 100644 index 00000000000..e65f8807ebf --- /dev/null +++ b/src/assets/wise5/services/projectTranslationService.ts @@ -0,0 +1,29 @@ +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { catchError, Observable, of } from 'rxjs'; +import { ConfigService } from './configService'; +import { ProjectService } from './projectService'; +import { Translations } from '../../../app/domain/translations'; + +@Injectable() +export class ProjectTranslationService { + constructor( + protected configService: ConfigService, + protected http: HttpClient, + protected projectService: ProjectService + ) {} + + protected fetchTranslations(locale: string): Observable { + return this.http + .get(this.getTranslationMappingURL(locale), { + headers: new HttpHeaders().set('cache-control', 'no-cache') + }) + .pipe(catchError(() => of({}))); + } + + private getTranslationMappingURL(locale: string): string { + return this.configService + .getConfigParam('projectURL') + .replace('project.json', `translations.${locale}.json`); + } +} diff --git a/src/assets/wise5/services/studentProjectTranslationService.ts b/src/assets/wise5/services/studentProjectTranslationService.ts new file mode 100644 index 00000000000..13e38ade854 --- /dev/null +++ b/src/assets/wise5/services/studentProjectTranslationService.ts @@ -0,0 +1,86 @@ +import { Injectable } from '@angular/core'; +import { lastValueFrom, of, switchMap, tap } from 'rxjs'; +import { copy } from '../common/object/object'; +import { Translations } from '../../../app/domain/translations'; +import { ProjectTranslationService } from './projectTranslationService'; +import { toSignal, toObservable } from '@angular/core/rxjs-interop'; +import { Language } from '../../../app/domain/language'; +import { HttpClient } from '@angular/common/http'; +import { ConfigService } from './configService'; +import { ProjectService } from './projectService'; +import { StudentDataService } from './studentDataService'; + +@Injectable() +export class StudentProjectTranslationService extends ProjectTranslationService { + constructor( + protected configService: ConfigService, + private dataService: StudentDataService, + protected http: HttpClient, + protected projectService: ProjectService + ) { + super(configService, http, projectService); + } + + currentTranslations = toSignal( + toObservable(this.projectService.currentLanguage).pipe( + switchMap((language) => + this.projectService.getLocale().isDefaultLocale(language.locale) + ? of({}) + : lastValueFrom(this.fetchTranslations(language.locale)) + ) + ), + { initialValue: {} } + ); + + async switchLanguage(language: Language, requester: 'student' | 'system'): Promise { + this.projectService.setCurrentLanguage(language); + await this.translate(language.locale); + this.dataService.saveVLEEvent( + this.dataService.getCurrentNodeId(), + null, + null, + 'Language', + 'languageSelected', + { language: language.locale, requester: requester } + ); + } + + private translate(locale = 'en_US'): Promise { + const project = this.revertToOriginalProject(); + return lastValueFrom( + this.projectService.getLocale().hasTranslationsToApply(locale) + ? this.fetchTranslations(locale).pipe( + tap((translations: Translations) => { + this.applyTranslations(project, translations); + this.projectService.setProject(project); + }) + ) + : of({}) + ); + } + + private revertToOriginalProject(): any { + const project = copy(this.projectService.getOriginalProject()); + this.projectService.setProject(project); + return project; + } + + private applyTranslations(projectElement: object, translations: Translations): void { + Object.keys(projectElement) + .filter((key) => key.endsWith('.i18n')) + .forEach((key) => { + const translationKey = projectElement[key].id; + if (translations[translationKey]) { + const keyWithoutI18NId = key.substring(0, key.lastIndexOf('.i18n')); + projectElement[keyWithoutI18NId] = translations[translationKey].value; + } + }); + Object.values(projectElement).forEach((value) => { + if (Array.isArray(value)) { + value.forEach((val) => this.applyTranslations(val, translations)); + } else if (typeof value === 'object' && value != null) { + this.applyTranslations(value, translations); + } + }); + } +} diff --git a/src/assets/wise5/services/studentStatusService.ts b/src/assets/wise5/services/studentStatusService.ts index 915c741a6bc..da913d34feb 100644 --- a/src/assets/wise5/services/studentStatusService.ts +++ b/src/assets/wise5/services/studentStatusService.ts @@ -6,6 +6,8 @@ import { ConfigService } from './configService'; import { NodeProgressService } from './nodeProgressService'; import { NodeStatusService } from './nodeStatusService'; import { StudentDataService } from './studentDataService'; +import { ProjectService } from './projectService'; +import { StudentProjectTranslationService } from './studentProjectTranslationService'; @Injectable() export class StudentStatusService { @@ -16,6 +18,8 @@ export class StudentStatusService { private configService: ConfigService, private nodeProgressService: NodeProgressService, private nodeStatusService: NodeStatusService, + private projectService: ProjectService, + private projectTranslationService: StudentProjectTranslationService, private studentDataService: StudentDataService ) { studentDataService.nodeStatusesChanged$.subscribe(() => { @@ -33,6 +37,10 @@ export class StudentStatusService { studentStatus == null ? new StudentStatus() : new StudentStatus(JSON.parse(studentStatus.status)); + const language = this.studentStatus.language; + if (language != null) { + this.projectTranslationService.switchLanguage(language, 'system'); + } }); } @@ -68,6 +76,9 @@ export class StudentStatusService { if (computerAvatarId != null) { studentStatusJSON.computerAvatarId = computerAvatarId; } + if (this.projectService.getLocale().hasTranslations()) { + studentStatusJSON.language = this.projectService.currentLanguage(); + } this.studentStatus = studentStatusJSON; const studentStatusParams = { runId: runId, diff --git a/src/assets/wise5/services/teacherProjectService.ts b/src/assets/wise5/services/teacherProjectService.ts index 30afd17a95f..f62d564c64c 100644 --- a/src/assets/wise5/services/teacherProjectService.ts +++ b/src/assets/wise5/services/teacherProjectService.ts @@ -12,6 +12,7 @@ import { generateRandomKey } from '../common/string/string'; import { branchPathBackgroundColors } from '../common/color/color'; import { reduceByUniqueId } from '../common/array/array'; import { NodeTypeSelected } from '../authoringTool/domain/node-type-selected'; +import { ComponentContent } from '../common/ComponentContent'; @Injectable() export class TeacherProjectService extends ProjectService { @@ -30,6 +31,8 @@ export class TeacherProjectService extends ProjectService { public projectSaved$: Observable = this.projectSavedSource.asObservable(); private savingProjectSource: Subject = new Subject(); public savingProject$: Observable = this.savingProjectSource.asObservable(); + private uiChangedSource: Subject = new Subject(); + public uiChanged$: Observable = this.uiChangedSource.asObservable(); constructor( protected branchService: BranchService, @@ -3044,7 +3047,7 @@ export class TeacherProjectService extends ProjectService { return a.order - b.order; } - private broadcastSavingProject(): void { + broadcastSavingProject(): void { this.savingProjectSource.next(); } @@ -3093,4 +3096,18 @@ export class TeacherProjectService extends ProjectService { getNodeTypeSelected(): Signal { return this.nodeTypeSelected.asReadonly(); } + + getComponentsFromStep(nodeId: string): ComponentContent[] { + return this.getNodeById(nodeId).components; + } + + getComponentsFromLesson(lessonId: string): ComponentContent[] { + return this.getNodeById(lessonId).ids.flatMap((nodeId: string) => + this.getComponentsFromStep(nodeId) + ); + } + + uiChanged(): void { + this.uiChangedSource.next(); + } } diff --git a/src/assets/wise5/services/teacherProjectTranslationService.ts b/src/assets/wise5/services/teacherProjectTranslationService.ts new file mode 100644 index 00000000000..627dfd30a2e --- /dev/null +++ b/src/assets/wise5/services/teacherProjectTranslationService.ts @@ -0,0 +1,51 @@ +import { Injectable, WritableSignal, signal } from '@angular/core'; +import { Observable, catchError, lastValueFrom, map, throwError } from 'rxjs'; +import { TeacherProjectService } from './teacherProjectService'; +import { Translations } from '../../../app/domain/translations'; +import { ProjectTranslationService } from './projectTranslationService'; +import { HttpClient } from '@angular/common/http'; +import { ConfigService } from './configService'; +import { toObservable } from '@angular/core/rxjs-interop'; + +@Injectable() +export class TeacherProjectTranslationService extends ProjectTranslationService { + private currentTranslationsSignal: WritableSignal = signal({}); + readonly currentTranslations = this.currentTranslationsSignal.asReadonly(); + constructor( + protected configService: ConfigService, + protected http: HttpClient, + protected projectService: TeacherProjectService + ) { + super(configService, http, projectService); + toObservable(this.projectService.currentLanguage).subscribe(async (language) => { + this.currentTranslationsSignal.set( + this.projectService.isDefaultLocale() + ? {} + : await lastValueFrom(this.fetchTranslations(language.locale)) + ); + }); + } + + saveCurrentTranslations(translations: Translations): Observable { + this.projectService.broadcastSavingProject(); + return this.http + .post( + `/api/author/project/translate/${this.configService.getProjectId()}/${ + this.projectService.currentLanguage().locale + }`, + translations + ) + .pipe( + map(() => { + this.currentTranslationsSignal.set(translations); + this.projectService.broadcastProjectSaved(); + }), + catchError(() => { + this.projectService.broadcastErrorSavingProject(); + return throwError( + () => new Error($localize`Error saving translation. Please try again later.`) + ); + }) + ); + } +} diff --git a/src/assets/wise5/themes/default/navigation/navigation.component.spec.ts b/src/assets/wise5/themes/default/navigation/navigation.component.spec.ts index 621edb7d40d..de5b6e2dc8f 100644 --- a/src/assets/wise5/themes/default/navigation/navigation.component.spec.ts +++ b/src/assets/wise5/themes/default/navigation/navigation.component.spec.ts @@ -4,26 +4,20 @@ import { StudentTeacherCommonServicesModule } from '../../../../../app/student-t import { VLEProjectService } from '../../../vle/vleProjectService'; import { NavigationComponent } from './navigation.component'; -class MockVLEProjectService { - getProjectRootNode() { - return { ids: [] }; - } -} - describe('NavigationComponent', () => { let component: NavigationComponent; let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, NavigationComponent, StudentTeacherCommonServicesModule], - providers: [{ provide: VLEProjectService, useClass: MockVLEProjectService }] + imports: [HttpClientTestingModule, NavigationComponent, StudentTeacherCommonServicesModule] }).compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(NavigationComponent); component = fixture.componentInstance; + spyOn(TestBed.inject(VLEProjectService), 'getProjectRootNode').and.returnValue({ ids: [] }); fixture.detectChanges(); }); diff --git a/src/assets/wise5/vle/nav-item/nav-item.component.ts b/src/assets/wise5/vle/nav-item/nav-item.component.ts index 85dfb62f854..b9b0aee04f0 100644 --- a/src/assets/wise5/vle/nav-item/nav-item.component.ts +++ b/src/assets/wise5/vle/nav-item/nav-item.component.ts @@ -55,14 +55,13 @@ export class NavItemComponent { this.item = this.projectService.idToNode[this.nodeId]; this.isGroup = this.projectService.isGroupNode(this.nodeId); this.nodeStatus = this.dataService.nodeStatuses[this.nodeId]; - this.nodeTitle = this.showPosition - ? this.projectService.nodeIdToNumber[this.nodeId] + ': ' + this.item.title - : this.item.title; + this.setNodeTitle(); this.currentNode = this.dataService.currentNode; this.isCurrentNode = this.currentNode.id === this.nodeId; if (this.isGroup && this.isCurrentNode) { this.setExpanded(); } + this.subscriptions.add(this.projectService.projectParsed$.subscribe(() => this.setNodeTitle())); this.subscriptions.add( this.dataService.navItemIsExpanded$.subscribe(({ nodeId, isExpanded }) => { if (nodeId === this.nodeId) { @@ -115,6 +114,12 @@ export class NavItemComponent { ); } + private setNodeTitle(): void { + this.nodeTitle = this.showPosition + ? this.projectService.getNodePositionAndTitle(this.nodeId) + : this.projectService.getNodeTitle(this.nodeId); + } + ngOnDestroy(): void { this.subscriptions.unsubscribe(); } diff --git a/src/assets/wise5/vle/node/node.component.html b/src/assets/wise5/vle/node/node.component.html index 80d48a473e4..964a9dc845e 100644 --- a/src/assets/wise5/vle/node/node.component.html +++ b/src/assets/wise5/vle/node/node.component.html @@ -10,7 +10,7 @@ fxLayout="row" fxLayoutAlign="center center" > - +
; @@ -31,6 +32,7 @@ describe('NodeComponent', () => { spyOn(TestBed.inject(VLEProjectService), 'getNodeById').and.returnValue({ components: [] }); spyOn(TestBed.inject(VLEProjectService), 'getNodeTitle').and.returnValue(''); component = fixture.componentInstance; + component.node = new Node(); fixture.detectChanges(); }); diff --git a/src/assets/wise5/vle/node/node.component.ts b/src/assets/wise5/vle/node/node.component.ts index f6e233cf7ac..73527ab00df 100644 --- a/src/assets/wise5/vle/node/node.component.ts +++ b/src/assets/wise5/vle/node/node.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; import { Subscription } from 'rxjs'; import { filter, take } from 'rxjs/operators'; import { ComponentState } from '../../../../app/domain/componentState'; @@ -12,6 +12,7 @@ import { NodeStatusService } from '../../services/nodeStatusService'; import { SessionService } from '../../services/sessionService'; import { StudentDataService } from '../../services/studentDataService'; import { VLEProjectService } from '../vleProjectService'; +import { copy } from '../../common/object/object'; @Component({ selector: 'node', @@ -26,10 +27,9 @@ export class NodeComponent implements OnInit { dirtyComponentIds: any = []; dirtySubmitComponentIds: any = []; isDisabled: boolean; - node: Node; + @Input() node: Node; nodeContent: any; nodeStatus: any; - rubric: string; latestComponentState: ComponentState; showRubric: boolean; submit: boolean = false; @@ -65,6 +65,11 @@ export class NodeComponent implements OnInit { private studentDataService: StudentDataService ) {} + ngOnChanges(): void { + // copy is needed to trigger change detection for current node.components array + this.components = copy(this.getComponents()); + } + ngOnInit(): void { this.workgroupId = this.configService.getWorkgroupId(); this.teacherWorkgroupId = this.configService.getTeacherWorkgroupId(); @@ -134,7 +139,8 @@ export class NodeComponent implements OnInit { ); this.subscriptions.add( - this.studentDataService.currentNodeChanged$.subscribe(() => { + this.studentDataService.currentNodeChanged$.subscribe(({ currentNode }) => { + this.node = this.projectService.getNode(currentNode.id); if (this.node.isEvaluateTransitionLogicOn('exitNode')) { this.nodeService.evaluateTransitionLogic(); } @@ -151,10 +157,9 @@ export class NodeComponent implements OnInit { initializeNode(): void { this.clearLatestComponentState(); - this.node = this.projectService.getNode(this.studentDataService.getCurrentNodeId()); this.nodeContent = this.projectService.getNodeById(this.node.id); - this.nodeStatus = this.nodeStatusService.getNodeStatusByNodeId(this.node.id); this.components = this.getComponents(); + this.nodeStatus = this.nodeStatusService.getNodeStatusByNodeId(this.node.id); this.dirtyComponentIds = []; this.dirtySubmitComponentIds = []; this.updateComponentVisibility(); @@ -170,8 +175,7 @@ export class NodeComponent implements OnInit { } if (this.configService.isPreview()) { - this.rubric = this.node.rubric; - this.showRubric = this.rubric != null && this.rubric != ''; + this.showRubric = this.node.rubric != null && this.node.rubric != ''; } const script = this.nodeContent.script; diff --git a/src/assets/wise5/vle/vle.component.html b/src/assets/wise5/vle/vle.component.html index 9cc2274a598..95c1b0256b5 100644 --- a/src/assets/wise5/vle/vle.component.html +++ b/src/assets/wise5/vle/vle.component.html @@ -6,7 +6,7 @@ - + - +
diff --git a/src/assets/wise5/vle/vle.component.ts b/src/assets/wise5/vle/vle.component.ts index dd7a8ec21af..6ab4638d3e9 100644 --- a/src/assets/wise5/vle/vle.component.ts +++ b/src/assets/wise5/vle/vle.component.ts @@ -14,6 +14,7 @@ import { ActivatedRoute, Router } from '@angular/router'; import { WiseLinkService } from '../../../app/services/wiseLinkService'; import { convertToPNGFile } from '../common/canvas/canvas'; import { NodeStatusService } from '../services/nodeStatusService'; +import { Node } from '../common/Node'; import { SafeResourceUrl } from '@angular/platform-browser'; @Component({ @@ -26,15 +27,17 @@ export class VLEComponent implements AfterViewInit { @ViewChild('drawer') public drawer: any; @ViewChild('tabbedVLETemplate') private tabbedVLETemplate: TemplateRef; - currentNode: any; + currentNode: Node; initialized: boolean; layoutState: string; notebookConfig: any; notesEnabled: boolean = false; notesVisible: boolean = false; + project: any; projectStylePath: SafeResourceUrl; reportEnabled: boolean = false; reportFullscreen: boolean = false; + rootNode: any; runEndedAndLocked: boolean; subscriptions: Subscription = new Subscription(); vleTemplate: TemplateRef; @@ -71,6 +74,7 @@ export class VLEComponent implements AfterViewInit { } initRestOfVLE() { + this.setProject(); this.vleTemplate = this.projectService.project.theme === 'tab' ? this.tabbedVLETemplate @@ -105,7 +109,6 @@ export class VLEComponent implements AfterViewInit { // TODO: set these variables dynamically from theme settings this.notebookConfig = this.notebookService.getNotebookConfig(); - this.currentNode = this.studentDataService.getCurrentNode(); this.setLayoutState(); this.initializeSubscriptions(); this.saveNodeEnteredEvent(); @@ -117,6 +120,16 @@ export class VLEComponent implements AfterViewInit { this.sessionService.broadcastExit(); } + private setProject(): void { + this.project = this.projectService.getProject(); + this.rootNode = this.projectService.rootNode; + this.setCurrentNode(); + } + + private setCurrentNode(): void { + this.currentNode = this.projectService.getNode(this.studentDataService.getCurrentNodeId()); + } + @HostListener('window:snip-image', ['$event.detail.target']) snipImage(image: HTMLImageElement): void { this.notebookService.addNote( @@ -143,6 +156,7 @@ export class VLEComponent implements AfterViewInit { this.subscribeToNotesVisible(); this.subscribeToReportFullScreen(); this.subscribeToViewCurrentAmbientNotification(); + this.subscriptions.add(this.projectService.projectParsed$.subscribe(() => this.setProject())); } private subscribeToShowSessionWarning(): void { @@ -170,7 +184,7 @@ export class VLEComponent implements AfterViewInit { private subscribeToCurrentNodeChanged(): void { this.subscriptions.add( this.studentDataService.currentNodeChanged$.subscribe(({ previousNode }) => { - this.currentNode = this.studentDataService.getCurrentNode(); + this.setCurrentNode(); const currentNodeId = this.currentNode.id; this.studentDataService.updateStackHistory(currentNodeId); this.nodeStatusService.setNodeIsVisited(currentNodeId); diff --git a/src/messages.xlf b/src/messages.xlf index bb53217d93a..61193615f46 100644 --- a/src/messages.xlf +++ b/src/messages.xlf @@ -265,10 +265,6 @@ src/app/announcement/announcement-dialog.component.html 11 - - src/app/authoring-tool/edit-component-advanced/edit-component-advanced.component.html - 111 - src/app/classroom-monitor/show-node-info-dialog/show-node-info-dialog.component.html 7 @@ -577,23 +573,23 @@ src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 385 + 369 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 157 + 152 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 160 + 155 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 259 + 260 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 262 + 263 src/assets/wise5/components/conceptMap/edit-concept-map-advanced/edit-concept-map-advanced.component.html @@ -601,27 +597,27 @@ src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 275 + 267 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 566 + 562 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 569 + 565 src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 95 + 88 src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 198 + 183 src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 96 + 89 src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html @@ -640,23 +636,23 @@ src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 399 + 383 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 170 + 165 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 173 + 168 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 272 + 273 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 275 + 276 src/assets/wise5/components/conceptMap/edit-concept-map-advanced/edit-concept-map-advanced.component.html @@ -664,23 +660,23 @@ src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 580 + 576 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 583 + 579 src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 109 + 102 src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 212 + 197 src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 110 + 103 src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html @@ -707,7 +703,7 @@ src/assets/wise5/authoringTool/project-asset-authoring/project-asset-authoring.component.html - 85 + 86 src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html @@ -715,31 +711,31 @@ src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 189 + 190 src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 415 + 399 src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 447 + 431 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 182 + 177 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 185 + 180 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 284 + 285 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 287 + 288 src/assets/wise5/components/conceptMap/edit-concept-map-advanced/edit-concept-map-advanced.component.html @@ -747,35 +743,35 @@ src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 302 + 294 src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 305 + 297 src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 115 + 117 src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 156 + 162 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 146 + 151 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 596 + 592 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 611 + 607 src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 239 + 230 src/assets/wise5/components/label/label-student/label-student.component.html @@ -783,19 +779,19 @@ src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 125 + 118 src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 228 + 213 src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 123 + 116 src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 126 + 119 src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html @@ -836,6 +832,13 @@ 1 + + Close + + src/app/authoring-tool/edit-component-advanced/edit-component-advanced.component.html + 111,113 + + Add Visibility Constraint @@ -903,7 +906,7 @@ src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring/node-advanced-authoring.component.html - 71 + 73 @@ -941,7 +944,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 140 + 147 @@ -955,26 +958,26 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Prompt src/app/authoring-tool/edit-component-prompt/edit-component-prompt.component.html - 2 + 4 src/app/authoring-tool/edit-dynamic-prompt-rules/edit-dynamic-prompt-rules.component.html - 47 + 49 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 160 + 166 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 253 + 254 Enter Prompt Here src/app/authoring-tool/edit-component-prompt/edit-component-prompt.component.html - 7 + 6 @@ -1052,7 +1055,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 470 + 474 src/assets/wise5/components/graph/edit-graph-connected-components/edit-graph-connected-components.component.html @@ -1060,7 +1063,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 449 + 443 @@ -1141,11 +1144,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/components/top-bar/top-bar.component.html - 39 + 50 src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html - 10 + 11 src/assets/wise5/components/common/feedbackRule/edit-feedback-rules/edit-feedback-rules.component.html @@ -1164,7 +1167,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 126 + 119 src/assets/wise5/components/common/feedbackRule/edit-feedback-rules/edit-feedback-rules.component.html @@ -1190,11 +1193,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Delete rule src/app/authoring-tool/edit-dynamic-prompt-rules/edit-dynamic-prompt-rules.component.html - 61 + 59 src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html - 114 + 127 src/assets/wise5/components/common/feedbackRule/edit-feedback-rules/edit-feedback-rules.component.html @@ -1205,11 +1208,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Move up src/app/authoring-tool/edit-dynamic-prompt-rules/edit-dynamic-prompt-rules.component.html - 72 + 70 src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html - 125 + 138 src/assets/wise5/components/common/feedbackRule/edit-feedback-rules/edit-feedback-rules.component.html @@ -1220,11 +1223,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Move down src/app/authoring-tool/edit-dynamic-prompt-rules/edit-dynamic-prompt-rules.component.html - 82 + 80 src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html - 135 + 148 src/assets/wise5/components/common/feedbackRule/edit-feedback-rules/edit-feedback-rules.component.html @@ -1235,11 +1238,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Add a new rule at the end src/app/authoring-tool/edit-dynamic-prompt-rules/edit-dynamic-prompt-rules.component.html - 97 + 95 src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html - 150 + 163 @@ -1264,35 +1267,21 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/app/authoring-tool/edit-question-bank/edit-question-bank.component.html - 52 + 49 Pre Prompt (Optional) src/app/authoring-tool/edit-dynamic-prompt/edit-dynamic-prompt.component.html - 33 - - - - Enter Pre Prompt Here - - src/app/authoring-tool/edit-dynamic-prompt/edit-dynamic-prompt.component.html - 38 + 34 Post Prompt (Optional) src/app/authoring-tool/edit-dynamic-prompt/edit-dynamic-prompt.component.html - 51 - - - - Enter Post Prompt Here - - src/app/authoring-tool/edit-dynamic-prompt/edit-dynamic-prompt.component.html - 56 + 45 @@ -1306,35 +1295,39 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Question src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html - 62 + 63 Question # src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html - 64 + 65 Delete question src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html - 89 + 78 + + + src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html + 99 Add new question src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html - 100 + 112 - + add_circle src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.html - 106 + 118 @@ -1351,6 +1344,20 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.48 + + Question + + src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.ts + 60 + + + + Question # + + src/app/authoring-tool/edit-question-bank-rules/edit-question-bank-rules.component.ts + 61 + + Enable Question Bank @@ -1362,32 +1369,21 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Custom Label src/app/authoring-tool/edit-question-bank/edit-question-bank.component.html - 15 - - - - Question Bank - - src/app/authoring-tool/edit-question-bank/edit-question-bank.component.html - 20 - - - src/assets/wise5/components/peerChat/peer-chat-question-bank/peer-chat-question-bank.component.html - 19 + 17 Student can select questions to use in Peer Chat src/app/authoring-tool/edit-question-bank/edit-question-bank.component.html - 31,33 + 28,30 Max Number of Questions src/app/authoring-tool/edit-question-bank/edit-question-bank.component.html - 37 + 34 @@ -1412,7 +1408,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/components/top-bar/top-bar.component.html - 31 + 37 src/assets/wise5/classroomMonitor/classroomMonitorComponents/shared/top-bar/top-bar.component.html @@ -1442,7 +1438,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring/node-advanced-authoring.component.html - 6 + 7 src/assets/wise5/classroomMonitor/dataExport/export-events/export-events.component.html @@ -1596,11 +1592,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 64 + 61 src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 522 + 513 src/assets/wise5/vle/node/node.component.html @@ -1659,11 +1655,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 469 + 453 src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 508 + 499 src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html @@ -1678,7 +1674,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 515 + 506 src/assets/wise5/components/showGroupWork/show-group-work-authoring/show-group-work-authoring.component.html @@ -1709,11 +1705,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 455 + 439 src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 498 + 489 src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html @@ -1870,6 +1866,13 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.61 + + Select language + + src/app/common/project-language-chooser/project-language-chooser.component.ts + 23 + + Thank you for contacting WISE! @@ -1946,11 +1949,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 171 + 173 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 427 + 422 @@ -2074,15 +2077,15 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 509 + 515 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 150 + 159 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 243 + 244 src/assets/wise5/components/common/feedbackRule/feedback-rule-help/feedback-rule-help.component.html @@ -2210,81 +2213,179 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.138 - - Elementary School + + Chinese (Simplified) - src/app/domain/profile.constants.ts + src/app/domain/localeToLanguage.ts 2 + + src/assets/wise5/services/transcribeService.ts + 30 + - - Middle School + + Chinese (Traditional) - src/app/domain/profile.constants.ts + src/app/domain/localeToLanguage.ts 3 - - High School + + Dutch - src/app/domain/profile.constants.ts + src/app/domain/localeToLanguage.ts 4 - - College + + English - src/app/domain/profile.constants.ts + src/app/domain/localeToLanguage.ts 5 - - - WISE Features - src/app/features/features.component.html - 12 + src/assets/wise5/services/transcribeService.ts + 31 - - A powerful online platform for designing, developing, and implementing science inquiry units + + German - src/app/features/features.component.html - 24,27 + src/app/domain/localeToLanguage.ts + 6 - - - Since 1997, WISE has served a growing community of more than 20,000 teachers, researchers, and curriculum designers, as well as over 200,000 K-12 students around the world. - src/app/features/features.component.html - 28,31 + src/assets/wise5/services/transcribeService.ts + 33 - - WISE students + + Italian - src/app/features/features.component.html - 53 + src/app/domain/localeToLanguage.ts + 7 - - - WISE students collaborate to: - src/app/features/features.component.html - 71 + src/assets/wise5/services/transcribeService.ts + 34 - - Explore issues of social importance + + Japanese - src/app/features/features.component.html - 75 + src/app/domain/localeToLanguage.ts + 8 - - - Pose relevant questions and make predictions - src/app/features/features.component.html - 79 + src/assets/wise5/services/transcribeService.ts + 35 + + + + Korean + + src/app/domain/localeToLanguage.ts + 9 + + + src/assets/wise5/services/transcribeService.ts + 36 + + + + Spanish + + src/app/domain/localeToLanguage.ts + 10 + + + src/assets/wise5/services/transcribeService.ts + 38 + + + + Vietnamese + + src/app/domain/localeToLanguage.ts + 11 + + + + Elementary School + + src/app/domain/profile.constants.ts + 2 + + + + Middle School + + src/app/domain/profile.constants.ts + 3 + + + + High School + + src/app/domain/profile.constants.ts + 4 + + + + College + + src/app/domain/profile.constants.ts + 5 + + + + WISE Features + + src/app/features/features.component.html + 12 + + + + A powerful online platform for designing, developing, and implementing science inquiry units + + src/app/features/features.component.html + 24,27 + + + + Since 1997, WISE has served a growing community of more than 20,000 teachers, researchers, and curriculum designers, as well as over 200,000 K-12 students around the world. + + src/app/features/features.component.html + 28,31 + + + + WISE students + + src/app/features/features.component.html + 53 + + + + WISE students collaborate to: + + src/app/features/features.component.html + 71 + + + + Explore issues of social importance + + src/app/features/features.component.html + 75 + + + + Pose relevant questions and make predictions + + src/app/features/features.component.html + 79 @@ -2949,7 +3050,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 29 + 30 @@ -5049,7 +5150,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/components/top-bar/top-bar.component.html - 4 + 10 src/assets/wise5/classroomMonitor/classroomMonitorComponents/shared/top-bar/top-bar.component.html @@ -6269,28 +6370,28 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Are you sure you want to delete this ? src/app/notebook/notebook-item/notebook-item.component.ts - 95 + 99 Delete src/app/notebook/notebook-item/notebook-item.component.ts - 96 + 100 Are you sure you want to revive this ? src/app/notebook/notebook-item/notebook-item.component.ts - 112 + 116 Revive src/app/notebook/notebook-item/notebook-item.component.ts - 113 + 117 @@ -6325,7 +6426,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Personal src/app/notebook/notebook-notes/notebook-notes.component.ts - 92 + 103 @@ -7527,6 +7628,10 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.src/app/teacher/account/edit-profile/edit-profile.component.html 109 + + src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.html + 1 + Language required @@ -7634,27 +7739,27 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 313 + 300 src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 434 + 418 src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 236 + 228 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 120 + 121 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 412 + 404 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 504 + 496 src/assets/wise5/components/match/match-authoring/match-authoring.component.html @@ -7662,7 +7767,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 151 + 143 src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html @@ -7969,21 +8074,21 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.View alerts src/app/student/top-bar/top-bar.component.html - 34 + 38 Unit percent completed src/app/student/top-bar/top-bar.component.html - 53 + 56 Open Account Menu src/app/student/top-bar/top-bar.component.html - 63 + 66 @@ -8329,31 +8434,31 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 249 + 250 src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 107 + 109 src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 148 + 154 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 191 + 195 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 250 + 253 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 431 + 427 src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 147 + 138 src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html @@ -8837,11 +8942,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 114 + 116 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 367 + 371 src/assets/wise5/classroomMonitor/dataExport/export-item/export-item.component.html @@ -9088,7 +9193,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/components/top-bar/top-bar.component.html - 9 + 15 @@ -9369,7 +9474,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html - 87 + 88 @@ -9631,11 +9736,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 38 + 39 src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 40 + 41 @@ -9697,11 +9802,15 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 237 + 222 src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 253 + 243 + + + src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html + 75 @@ -9787,14 +9896,14 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Unit Home src/assets/wise5/authoringTool/authoring-tool.component.ts - 57 + 60 Unit Info src/assets/wise5/authoringTool/authoring-tool.component.ts - 64 + 67 src/assets/wise5/authoringTool/components/shared/authoring-tool-bar/authoring-tool-bar.component.ts @@ -9805,7 +9914,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.File Manager src/assets/wise5/authoringTool/authoring-tool.component.ts - 71 + 74 src/assets/wise5/authoringTool/components/shared/authoring-tool-bar/authoring-tool-bar.component.ts @@ -9816,7 +9925,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Notebook Settings src/assets/wise5/authoringTool/authoring-tool.component.ts - 78 + 81 src/assets/wise5/authoringTool/components/shared/authoring-tool-bar/authoring-tool-bar.component.ts @@ -9827,7 +9936,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Milestones src/assets/wise5/authoringTool/authoring-tool.component.ts - 85 + 88 src/assets/wise5/authoringTool/components/shared/authoring-tool-bar/authoring-tool-bar.component.ts @@ -9846,21 +9955,21 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Advanced Settings src/assets/wise5/authoringTool/authoring-tool.component.ts - 92 + 95 Unit List src/assets/wise5/authoringTool/authoring-tool.component.ts - 99 + 102 You have been inactive for a long time. Do you want to stay logged in? src/assets/wise5/authoringTool/authoring-tool.component.ts - 113 + 116 src/assets/wise5/classroomMonitor/classroom-monitor.component.ts @@ -9868,14 +9977,14 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/vle/vle.component.ts - 148 + 168 Session Timeout src/assets/wise5/authoringTool/authoring-tool.component.ts - 114 + 117 src/assets/wise5/classroomMonitor/classroom-monitor.component.ts @@ -9883,14 +9992,14 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/vle/vle.component.ts - 149 + 169 Saving... src/assets/wise5/authoringTool/authoring-tool.component.ts - 138 + 141 src/assets/wise5/services/notificationService.ts @@ -9901,25 +10010,25 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Saved src/assets/wise5/authoringTool/authoring-tool.component.ts - 152 + 155 Error Saving Unit. Please refresh the page. src/assets/wise5/authoringTool/authoring-tool.component.ts - 159 + 162 You do not have permission to edit this unit. src/assets/wise5/authoringTool/authoring-tool.component.ts - 166 + 169 src/assets/wise5/authoringTool/authoring-tool.component.ts - 199 + 251 @@ -9945,7 +10054,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html - 78 + 80 @@ -9971,7 +10080,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html - 100 + 102 @@ -10007,11 +10116,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 92 + 93 src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 73 + 74 @@ -10022,7 +10131,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 97 + 98 @@ -10078,11 +10187,11 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Advanced src/assets/wise5/authoringTool/components/edit-component-advanced-button/edit-component-advanced-button.component.html - 5 + 6 src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 10 + 11 @@ -10135,28 +10244,35 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Project Info src/assets/wise5/authoringTool/components/top-bar/top-bar.component.html - 14 + 20 Switch to Grading View src/assets/wise5/authoringTool/components/top-bar/top-bar.component.html - 25 + 31 + + + + Language to translate + + src/assets/wise5/authoringTool/components/top-bar/top-bar.component.html + 45 Help src/assets/wise5/authoringTool/components/top-bar/top-bar.component.html - 44,46 + 55,57 User Menu src/assets/wise5/authoringTool/components/top-bar/top-bar.component.html - 49 + 60 src/assets/wise5/classroomMonitor/classroomMonitorComponents/shared/top-bar/top-bar.component.html @@ -10167,7 +10283,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. Go Home src/assets/wise5/authoringTool/components/top-bar/top-bar.component.html - 74,76 + 85,87 src/assets/wise5/classroomMonitor/classroomMonitorComponents/shared/top-bar/top-bar.component.html @@ -10178,7 +10294,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. Sign Out src/assets/wise5/authoringTool/components/top-bar/top-bar.component.html - 78,80 + 89,91 src/assets/wise5/classroomMonitor/classroomMonitorComponents/shared/top-bar/top-bar.component.html @@ -10189,20 +10305,55 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.ID: src/assets/wise5/authoringTool/components/top-bar/top-bar.component.ts - 51 + 74 Run ID: | Access Code: src/assets/wise5/authoringTool/components/top-bar/top-bar.component.ts - 53 + 76 src/assets/wise5/classroomMonitor/classroomMonitorComponents/shared/top-bar/top-bar.component.ts 75 + + Choose image + + src/assets/wise5/authoringTool/components/translatable-asset-chooser/translatable-asset-chooser.component.ts + 21 + + + + Copy content from + + src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.html + 12,14 + + + + Note: Editing is disabled. Please switch back to if you want to edit. + + src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.html + 33,34 + + + + Copy content to + + src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.html + 42,44 + + + + Are you sure you want to replace the content in with content in for this item? + + src/assets/wise5/authoringTool/components/translatable-rich-text-editor/translatable-rich-text-editor.component.ts + 61,63 + + Also currently editing this unit: src/assets/wise5/components/match/match-authoring/match-authoring.component.ts - 303 + 278 src/assets/wise5/components/match/match-student/match-student-default/match-student-default.component.ts @@ -10727,107 +10878,107 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 572 + 566 Click to Collapse src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 34 + 35 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 327 + 330 Click to Expand src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 44 + 46 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 337 + 341 Milestone src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 49 + 51 Delete Milestone src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 54 + 56 Milestone Name src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 63 + 67 Milestone Description src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 69 + 76 Enable Satisfy Criteria src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 85,87 + 87,89 Satisfy Criteria src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 90 + 92 Satisfy Minimum Percentage src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 93 + 95 Satisfy Minimum Number Of Workgroups src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 102 + 104 Satisfy Conditional src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 111 + 113 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 361 + 365 Any src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 113 + 115 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 366 + 370 src/assets/wise5/components/conceptMap/edit-concept-map-advanced/edit-concept-map-advanced.component.html @@ -10846,69 +10997,69 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Add Milestone Satisfy Criteria src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 125 + 127 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 202 + 204 Milestone Satisfy Criteria src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 132 + 134 Delete Milestone Satisfy Criteria src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 137 + 139 Node ID src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 145 + 147 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 224 + 226 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 405 + 409 Component ID src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 155 + 157 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 234 + 236 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 415 + 419 Copy Node ID and Component ID to Milestone src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 190 + 192 Report src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 207 + 209 src/assets/wise5/classroomMonitor/classroomMonitorComponents/nodeGrading/node-grading-view/node-grading-view.component.html @@ -10919,163 +11070,156 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Add Report Location src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 212 + 214 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 266 + 268 Location src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 222 + 224 Delete Location src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 253 + 255 Custom Score Values src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 271 + 273 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 296 + 298 Delete Custom Score Values src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 284 + 286 Custom Score Key src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 292 + 294 Add Custom Score Values src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 305 + 307 Add Template src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 312 + 314 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 561 + 555 Template src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 342 + 346 Delete Template src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 347 + 351 Add Template Satisfy Criteria src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 379 + 383 src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 503 + 507 Template Satisfy Criteria src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 392 + 396 Delete Template Satisfy Criteria src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 397 + 401 Function src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 443 + 447 Percent Threshold src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 459 + 463 Target Variable src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 478 + 482 Value src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 486 - - - - Content - - src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 521 + 490 Content Preview src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 531 + 528 Recommendations src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 537 + 536 Recommendations Preview src/assets/wise5/authoringTool/milestones-authoring/milestones-authoring.component.html - 547 + 541 @@ -11191,7 +11335,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring/node-advanced-authoring.component.html - 61 + 63 @@ -11277,7 +11421,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 138 + 135 @@ -11438,14 +11582,14 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.General Advanced src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring/node-advanced-authoring.component.html - 17 + 18 Edit Step Rubric src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring/node-advanced-authoring.component.html - 28 + 30 src/assets/wise5/authoringTool/node/editRubric/edit-node-rubric.component.html @@ -11456,14 +11600,14 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Edit Transitions src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring/node-advanced-authoring.component.html - 39 + 41 Edit Constraints src/assets/wise5/authoringTool/node/advanced/node-advanced-authoring/node-advanced-authoring.component.html - 50 + 52 @@ -11745,136 +11889,102 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.38 - - Copy Component + + Copy component src/assets/wise5/authoringTool/node/copy-component-button/copy-component-button.component.html 5 - - Step Title : - - src/assets/wise5/authoringTool/node/edit-node-title/edit-node-title.component.html - 2 - - - - Lesson Title : - - src/assets/wise5/authoringTool/node/edit-node-title/edit-node-title.component.html - 3 - - - - Title - - src/assets/wise5/authoringTool/node/edit-node-title/edit-node-title.component.html - 8 - - - src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 135 - - - src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 238 - - - src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 47 - - - src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 183 - + + Lesson Title - src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 242 + src/assets/wise5/authoringTool/node/edit-node-title/edit-node-title.component.ts + 20 - - Back to unit + + Step Title - src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 21 + src/assets/wise5/authoringTool/node/edit-node-title/edit-node-title.component.ts + 20 Components src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 35 + 26 Move Components src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 45 + 36 Copy Components src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 55 + 46 Delete Components src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 65 + 56 + Expand All src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 80,82 + 72,74 - Collapse All src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 89,91 + 82,84 This step does not have any components. Click the + button to add a component. src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 96 + 89 Toggle component authoring src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 118 + 111 Select component src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 135 + 128 Click to expand/collapse src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 146 + 139 Delete Component src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.html - 180 + 173 @@ -11882,7 +11992,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.ts - 200 + 193 @@ -11890,7 +12000,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. src/assets/wise5/authoringTool/node/node-authoring/node-authoring.component.ts - 201 + 194 @@ -11911,120 +12021,143 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Notebook Label src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 18 + 20 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 192 + 193 Enable Note src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 29,31 + 32,34 Label (Singular) src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 36 + 41 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 109 + 114 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 212 + 213 Label (Plural) src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 44 + 49 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 117 + 122 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 220 + 221 Label (Link) src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 52 + 57 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 125 + 130 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 228 + 229 Enable Add Note Button src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 65,67 + 68,70 Require students to write text on every note src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 75,77 + 78,80 Enable Clipping src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 84,86 + 87,89 Enable Student Uploads src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 93,95 + 96,98 Enable Report src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 103,105 + 106,108 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 206,208 + 207,209 + + + + Title + + src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html + 140 + + + src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html + 239 + + + src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html + 50 + + + src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html + 189 + + + src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html + 247 Starter Text src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 169 + 170 src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 262 + 263 Teacher Notebook src/assets/wise5/authoringTool/notebook-authoring/notebook-authoring.component.html - 185,187 + 186,188 @@ -12326,7 +12459,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Download src/assets/wise5/authoringTool/project-asset-authoring/project-asset-authoring.component.html - 76 + 77 @@ -12394,35 +12527,35 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Edit lesson src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html - 29 + 30 Move lesson src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html - 39 + 40 Delete lesson src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html - 49 + 50 This lesson has no steps src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.html - 82 + 83 Are you sure you want to delete this lesson? src/assets/wise5/authoringTool/project-authoring-lesson/project-authoring-lesson.component.ts - 60 + 62 @@ -12489,7 +12622,7 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.Are you sure you want to delete this step? src/assets/wise5/authoringTool/project-authoring-step/project-authoring-step.component.ts - 112 + 117 @@ -12503,46 +12636,39 @@ Click "Cancel" to keep the invalid JSON open so you can fix it. + Expand All src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html - 42,44 + 43,45 - Collapse All src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html - 51,53 + 53,55 There are no lessons src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html - 57 + 59 There are no unused lessons src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html - 80 + 82 There are no unused steps src/assets/wise5/authoringTool/project-authoring/project-authoring.component.html - 101 - - - - Are you sure you want to delete the selected item? - - src/assets/wise5/authoringTool/project-authoring/project-authoring.component.ts - 90 + 103 - - Are you sure you want to delete the selected items? + + Are you sure you want to delete the selected item(s)? src/assets/wise5/authoringTool/project-authoring/project-authoring.component.ts 91 @@ -12583,6 +12709,20 @@ Click "Cancel" to keep the invalid JSON open so you can fix it.22,24 + + Default language: + + src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.html + 2 + + + + Additional languages: + + src/assets/wise5/authoringTool/project-info/edit-project-language-setting/edit-project-language-setting.component.html + 11 + + Back to Teacher Home @@ -15224,11 +15364,11 @@ Are you sure you want to proceed? src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 65 + 62 src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 523 + 514 src/assets/wise5/vle/node/node.component.html @@ -15403,56 +15543,56 @@ Are you sure you want to proceed? Toggle system prompt instructions src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html - 13 + 14 System Prompt Instructions src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html - 20 + 21 Provide context, instructions, and other relevant information to help the chat bot act the way you want it to. Be as specific as possible. src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html - 21,24 + 22,25 Example System Prompt src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html - 25 + 26 You are a teacher helping a student understand the greenhouse effect by using the example of a car that has been sitting in the sun on a cold day. The student is asked how the temperature inside the car will feel. Do not tell them the correct answer, but guide them to better understand the science by asking questions. Also make sure they explain their reasoning. Limit your response to 100 words or less. src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html - 26,32 + 27,33 System Prompt src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html - 35 + 36 Use the prompt to introduce the chatbot activity. Students will see the prompt. src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html - 44 + 45 Enable Computer Avatar src/assets/wise5/components/aiChat/ai-chat-authoring/ai-chat-authoring.component.html - 55 + 56 src/assets/wise5/components/dialogGuidance/dialog-guidance-authoring/dialog-guidance-authoring.component.html @@ -15616,129 +15756,22 @@ Are you sure you want to proceed? Image src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 131 - - - src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 142 + 133 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 110 + 114 src/assets/wise5/components/discussion/discussion-student/discussion-student.component.html 59 - - src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 21 - - - src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 61 - - - - Choose an Image - - src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 139 - - - src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 231 - - - src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 234 - - - src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 252 - - - src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 255 - - - src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 370 - - - src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 373 - - - src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 19 - - - src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 121 - - - src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 124 - - - src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 19 - - - src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 22 - - - src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 252 - - - src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 261 - - - src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 264 - - - src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 315 - - - src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 318 - - - src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 18 - - - src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 81 - - - src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 84 - - - src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 184 - - - src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 187 - - - src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 58 - Text src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 149 + 148 src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html @@ -15746,45 +15779,45 @@ Are you sure you want to proceed? src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 140 + 144 - src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 137 + src/assets/wise5/components/table/table-authoring/table-authoring.component.html + 152 Move Object Up src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 159 + 160 Up src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 162 + 163 src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 388 + 372 src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 278 + 270 src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 98 + 91 src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 201 + 186 src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 99 + 92 src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html @@ -15795,34 +15828,34 @@ Are you sure you want to proceed? Move Object Down src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 173 + 174 Down src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 176 + 177 src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 402 + 386 src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 292 + 284 src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 112 + 105 src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 215 + 200 src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 113 + 106 src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html @@ -15833,239 +15866,239 @@ Are you sure you want to proceed? Delete Object src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 186 + 187 Image Width (Pixels) src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 197 + 198 Image Height (Pixels) src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 207 + 208 Image Moving Left src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 219 + 222 Image Moving Right src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 240 + 236 Location X (Pixels) src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 263 + 250 Location Y (Pixels) src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 273 + 260 Data X (Units) src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 283 + 270 Data Y (Units) src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 293 + 280 Data Points src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 304 + 291 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 496 + 488 Add Data Point src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 310 + 297 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 501 + 493 Time src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 332 + 319 X src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 342 + 329 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 531 + 527 src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 193 + 184 src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 214 + 205 Y src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 352 + 339 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 540 + 536 src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 202 + 193 src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 223 + 214 Change to Image (Optional) src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 362 + 351 Delete Data Point src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 412 + 396 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 593 + 589 Data Source src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 424 + 408 Add Data Source src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 431 + 415 Delete Data Source src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 444 + 428 Trial Index src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 493 + 477 Series Index src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 503 + 487 Time Column Index src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 513 + 497 X Column Index src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 523 + 507 Y Column Index src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.html - 533 + 517 You can only have Data Points or a Data Source. If you add a Data Point, the Data Source will be deleted. Are you sure you want to add a Data Point? src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.ts - 72 + 69 Are you sure you want to delete this data point? src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.ts - 89 + 86 Are you sure you want to delete this object? src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.ts - 146 + 143 You can only have Data Points or a Data Source. If you add a Data Source, the Data Points will be deleted. Are you sure you want to add a Data Source? src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.ts - 160 + 157 Are you sure you want to delete the Data Source? src/assets/wise5/components/animation/animation-authoring/animation-authoring.component.ts - 189 + 186 @@ -16788,72 +16821,76 @@ Are you ready to receive feedback on this answer? Background Image (Optional) src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 8 + 10 src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 7 + 9 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 304 + 307 + + + src/assets/wise5/components/label/label-authoring/label-authoring.component.html + 9 Stretch background to fit src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 32,34 + 27,29 Allow student to upload background image src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 42,44 + 37,39 Canvas Width (Optional) src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 48 + 43 Canvas Height (Optional) src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 57 + 52 src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 49 + 41 Nodes src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 68 + 63 Add Node src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 73 + 68 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 76 + 71 There are no nodes. Click the "Add Node" button to add a node. src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 83 + 78 @@ -16867,60 +16904,60 @@ Are you ready to receive feedback on this answer? Width src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 132 + 127 Height src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 141 + 136 Show Node Labels src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 199,201 + 194,196 Links Title src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 206 + 203 Links src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 214 + 209 Add Link src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 219 + 214 src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 222 + 217 There are no links. Click the "Add Link" button to add a link. src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 229 + 224 Link Label src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.html - 245 + 244 @@ -16930,7 +16967,7 @@ File Name: Label: src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.ts - 51 + 47 @@ -16939,7 +16976,7 @@ Label: Label: src/assets/wise5/components/conceptMap/concept-map-authoring/concept-map-authoring.component.ts - 63 + 59 @@ -17190,7 +17227,7 @@ Are you ready to receive feedback on this answer? src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 132 + 137 @@ -17299,18 +17336,18 @@ Category Name: Computer Avatar Label src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 10 + 12 Thought Buddy src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 15 + 14 - - This is what the computer avatar will be referred as + + This is what the computer avatar will be referred to as src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html 18 @@ -17320,7 +17357,7 @@ Category Name: Computer Avatar Prompt src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 21 + 24 @@ -17334,21 +17371,21 @@ Category Name: This text will introduce the avatar selection task src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 31 + 30 Computer Avatar Initial Response src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 34 + 36 Hi there! It's nice to meet you. What do you think about... src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 39 + 38 @@ -17362,49 +17399,49 @@ Category Name: Select all avatars src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 51 + 52 Select All src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 54,56 + 55,57 Select no avatars src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 61 + 62 Select None src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 64,66 + 65,67 Avatars available to students src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 71 + 72 Toggle src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 79 + 80 Not selected src/assets/wise5/components/dialogGuidance/edit-dialog-guidance-computer-avatar/edit-dialog-guidance-computer-avatar.component.html - 99 + 100 @@ -17607,161 +17644,176 @@ Category Name: Allow student to upload background image src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 34,36 + 26,28 Enable All Tools src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 63 + 55 Enable All src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 66 + 58 Disable All Tools src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 76 + 68 Disable All src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 79 + 71 Select Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 91,93 + 83,85 Line Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 100,102 + 92,94 Shape Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 109,111 + 101,103 Free Hand Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 118,120 + 110,112 Text Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 128,130 + 120,122 Stamp Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 137,139 + 129,131 Clone Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 146,148 + 138,140 Stroke Color Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 155,157 + 147,149 Fill Color Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 165,167 + 157,159 Stroke Width Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 174,176 + 166,168 Send Back Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 183,185 + 175,177 Send Forward Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 192,194 + 184,186 Undo Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 202,204 + 194,196 Redo Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 211,213 + 203,205 Delete Tool src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 220,222 + 212,214 Stamps src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 227 + 219 Add Stamp src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 233 + 225 + + + + Choose an Image + + src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html + 244 + + + src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html + 253 + + + src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html + 256 above src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.html - 290 + 282 @@ -17770,7 +17822,7 @@ Category Name: src/assets/wise5/components/draw/draw-authoring/draw-authoring.component.ts - 244 + 241 @@ -17848,21 +17900,21 @@ Category Name: Model Parameters src/assets/wise5/components/embedded/edit-embedded-advanced/edit-embedded-advanced.component.html - 3 + 5 - - Model File Name + + Model file name src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.html - 3 + 5 - - Choose Model File + + Choose model file src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.html - 11 + 13 @@ -17873,7 +17925,7 @@ Category Name: src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 115 + 113 @@ -17884,7 +17936,7 @@ Category Name: src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 124 + 122 @@ -17894,18 +17946,18 @@ Category Name: >"/> src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.html - 49,55 + 50,56 Reload Model src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.html - 63 + 64 src/assets/wise5/components/embedded/embedded-authoring/embedded-authoring.component.html - 66 + 67 @@ -17934,49 +17986,49 @@ Category Name: Subtitle src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 4 + 5 Show Mouse X Plot Line src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 18,20 + 16,18 Highlight X Range From Zero src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 29,31 + 27,29 Show Mouse Y Plot Line src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 39,41 + 37,39 Save Mouse Over Points src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 49,51 + 47,49 Hide Trial Select src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 59,61 + 57,59 Use Custom Legend src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 69,71 + 67,69 @@ -17990,42 +18042,42 @@ Category Name: X Axis Plot Line src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 84 + 82 Add X Axis Plot Line src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 89 + 87 X Value src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 103 + 105 Y Axis Plot Line src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 125 + 127 Add Y Axis Plot Line src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 130 + 132 Y Value src/assets/wise5/components/graph/edit-graph-advanced/edit-graph-advanced.component.html - 144 + 150 @@ -18130,141 +18182,141 @@ Category Name: Graph Title src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 7 + 9 Plot Type src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 15 + 16 Graph Width src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 26 + 27 Graph Height src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 35 + 36 X Axis src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 45 + 46 Axis Type src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 55 + 56 Units src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 77 + 79 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 199 + 205 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 258 + 263 Min src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 85 + 84 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 207 + 210 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 266 + 268 Max src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 94 + 93 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 216 + 219 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 275 + 277 Locked src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 107,109 + 106,108 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 289,291 + 290,292 Categories src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 112 + 113 Add Category src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 117 + 118 Delete Category src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 143 + 148 Enable Multiple Y Axes src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 162,164 + 166,168 Y Axis src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 181 + 185 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 240 + 243 src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 483 + 475 src/assets/wise5/components/table/edit-table-advanced/edit-table-advanced.component.html @@ -18275,84 +18327,84 @@ Category Name: Locked src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 230,232 + 232,234 Left Side src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 297 + 298 Right Side src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 298 + 299 Round Values To src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 326 + 319 Enable Trials src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 343,345 + 335,337 Can Student Create Trials src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 353,355 + 345,347 Can Student Delete Trials src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 362,364 + 354,356 Hide Existing Trials On New Trial src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 371,373 + 363,365 Can Student Hide Series By Clicking On Legend src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 380,382 + 372,374 Enable File Upload src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 389,391 + 381,383 Hide Legend src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 398,400 + 390,392 Series src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 404 + 396 src/assets/wise5/components/table/edit-table-advanced/edit-table-advanced.component.html @@ -18363,7 +18415,7 @@ Category Name: Add Series src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 409 + 401 @@ -18371,252 +18423,252 @@ Category Name: src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 422,424 + 414,416 Symbol src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 438 + 433 Line Type src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 463 + 456 - + Can Student Edit src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 479,481 + 471,473 - + Y Axis : src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 489,491 + 481,483 Delete Series src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.html - 608 + 604 Line Plot src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 24 + 21 Column Plot src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 28 + 25 Scatter Plot src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 32 + 29 No Rounding src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 39 + 36 Integer (example 1) src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 43 + 40 Tenth (exapmle 0.1) src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 47 + 44 Hundredth (example 0.01) src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 51 + 48 Circle src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 58 + 55 Square src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 62 + 59 Triangle src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 66 + 63 Triangle Down src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 70 + 67 Diamond src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 74 + 71 Line src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 81 + 78 Point src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 85 + 82 Solid src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 92 + 89 Dash src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 96 + 93 Dot src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 100 + 97 Short Dash src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 104 + 101 Short Dot src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 108 + 105 Limits src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 115 + 112 Categories src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 119 + 116 Are you sure you want to delete the series? src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 190 + 186 Are you sure you want to delete the "" series? src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 192 + 188 Are you sure you want to delete the category? src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 232 + 220 Are you sure you want to delete the "" category? src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 234 + 222 Are you sure you want to delete the data point? src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 258 + 246 Category One src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 297 + 285 Category Two src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 297 + 285 Are you sure you want to remove multiple Y axes? src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 341 + 329 Are you sure you want to decrease the number of Y Axes? src/assets/wise5/components/graph/graph-authoring/graph-authoring.component.ts - 434 + 422 @@ -18868,154 +18920,151 @@ Category Name: src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 58 - - - - Background Image - - src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 7 + 51 Canvas Width (px) src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 29 + 22 Canvas Height (px) src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 38 + 31 Point Radius Size (px) src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 49 + 42 Label Max Character Width src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 67 + 60 Can Student Create Labels src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 83,85 + 76,78 Enable Dots src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 93,95 + 86,88 Allow Student to Upload Image for Background src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 103,105 + 96,98 Starter Labels src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 110 + 103 Add Starter Label src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 115 + 108 add src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 118 + 111 There are no starter labels. Click the "Add Label" button to add a starter label. src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 128,130 + 121,123 - - Enter Label Text Here + + Label Text src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 142 + 132 + + + src/assets/wise5/components/label/label-student/label-student.component.html + 18 View Colors src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 159 + 150 Color Palette src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 162 + 153 Can Student Edit Label src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 175,177 + 166,168 Can Student Delete Label src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 185,187 + 176,178 Point Location src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 191 + 182 Text Location src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 212 + 203 Delete Label src/assets/wise5/components/label/label-authoring/label-authoring.component.html - 236 + 227 Enter text here src/assets/wise5/components/label/label-authoring/label-authoring.component.ts - 54 + 51 @@ -19024,7 +19073,7 @@ Category Name: src/assets/wise5/components/label/label-authoring/label-authoring.component.ts - 69 + 66 src/assets/wise5/components/label/label-student/label-student.component.ts @@ -19038,13 +19087,6 @@ Category Name: 10 - - Label Text - - src/assets/wise5/components/label/label-student/label-student.component.html - 18 - - A New Label @@ -19168,131 +19210,131 @@ Warning: This will delete all existing choices and buckets in this component.Choice Name src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 67 + 69 Type text or choose an image src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 72 + 71 src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 175 + 166 src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 49 + 47 Delete Choice src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 122 + 115 Source Bucket Name src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 134 + 129 Target Buckets src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 142 + 134 Add Target Bucket src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 148 + 140 There are no target buckets. Click the "Add Target Bucket" button to add a bucket. src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 156,158 + 148,150 Target Bucket Name src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 170 + 164 Delete Bucket src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 225 + 210 Choices need to be ordered within buckets src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 243,245 + 228,230 Bucket Name: src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 248 + 233 Choice: src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 250 + 238 Is Correct src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 267,269 + 254,256 Position src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 273 + 260 Incorrect Position Feedback src/assets/wise5/components/match/match-authoring/match-authoring.component.html - 282 + 271 Are you sure you want to delete this choice? src/assets/wise5/components/match/match-authoring/match-authoring.component.ts - 116 + 113 src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.ts - 73 + 70 Are you sure you want to delete this bucket? src/assets/wise5/components/match/match-authoring/match-authoring.component.ts - 174 + 171 @@ -19460,7 +19502,7 @@ Warning: This will delete all existing choices and buckets in this component. src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 87,89 + 84,86 @@ -19498,35 +19540,28 @@ Warning: This will delete all existing choices in this component. Choice Text src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 43 + 45 Is Correct src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 71 + 64 Is Correct src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 73,75 - - - - Feeback - - src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 80 + 66,68 Optional src/assets/wise5/components/multipleChoice/multiple-choice-authoring/multiple-choice-authoring.component.html - 86 + 77 @@ -19618,261 +19653,261 @@ Warning: This will delete all existing choices in this component. 78 - - Starter Sentence (Optional) + + Starter Sentence src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 2 + 4 Allow students to record audio response src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 18,20 + 15,17 Enable CRater src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 29,31 + 26,28 Item Id src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 36 + 33 Verify src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 49,51 + 46,48 Verifying... src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 53 + 50 Valid src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 54 + 51 Invalid src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 55 + 52 Score On src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 59 + 56 Change src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 66 + 63 Show Score src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 77,79 + 74,76 Enable Feedback Rules src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 97,99 + 94,96 Scoring Rule src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 113 + 110 Add Scoring Rule src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 118 + 115 Feedback Text src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 148 + 147 Move Scoring Rule Up src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 163 + 158 Move Scoring Rule Down src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 174 + 169 Delete Scoring Rule src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 184 + 179 Enable Multiple Attempt Feedback src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 201,203 + 196,198 Multiple Attempt Scoring Rules src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 207 + 202 Add Multiple Attempt Scoring Rule src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 212 + 207 Previous Score src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 232 + 227 src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 343 + 336 Current Score src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 241 + 236 src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 353 + 346 Feedback to Student src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 250 + 247 src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 428 + 424 Move Multiple Attempt Scoring Rule Up src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 270 + 263 Move Multiple Attempt Scoring Rule Down src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 286 + 279 Delet Multiple Attempt Scoring src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 296 + 289 Enable Notifications src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 314,316 + 307,309 Notifications src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 320 + 313 add src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 329 + 322 Move Notification Up src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 371 + 364 Move Notification Down src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 387 + 380 Delete Notification src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 397 + 390 Enable Ambient Display Dismiss Mode src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 406,408 + 399,401 Dismiss Code src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 410 + 403 src/assets/wise5/vle/dismiss-ambient-notification-dialog/dismiss-ambient-notification-dialog.component.html @@ -19883,63 +19918,63 @@ Warning: This will delete all existing choices in this component. Notify Student src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 424,426 + 417,419 Notify Teacher src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 444,446 + 436,438 Feedback to Teacher src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 448 + 443 Use Custom Completion Criteria src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 468,470 + 459,461 Custom Completion Criteria src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 473 + 464 Add Completion Criteria src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 478 + 469 Move Completion Criteria Up src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 533 + 524 Move Completion Criteria Down src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 544 + 535 Delete Completion Criteria src/assets/wise5/components/openResponse/edit-open-response-advanced/edit-open-response-advanced.component.html - 554 + 545 @@ -20155,46 +20190,39 @@ If this problem continues, let your teacher know and move on to the next activit Item(s) Found src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 46 + 47 Info src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 80,82 + 81,83 Select src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 90,92 + 91,93 URL src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 103 - - - - Enter URL Here - - src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 108 + 106 Reload resource src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 136 + 134 src/assets/wise5/components/outsideURL/outside-url-authoring/outside-url-authoring.component.html - 138 + 136 @@ -20332,6 +20360,13 @@ If this problem continues, let your teacher know and move on to the next activit 38 + + Question Bank + + src/assets/wise5/components/peerChat/peer-chat-question-bank/peer-chat-question-bank.component.html + 19 + + Add to chat @@ -20679,7 +20714,7 @@ If this problem continues, let your teacher know and move on to the next activit Label src/assets/wise5/components/summary/summary-authoring/summary-authoring.component.html - 138 + 140 @@ -21058,42 +21093,42 @@ If this problem continues, let your teacher know and move on to the next activit Editable src/assets/wise5/components/table/table-authoring/table-authoring.component.html - 163,165 + 162,164 Column Cell Size src/assets/wise5/components/table/table-authoring/table-authoring.component.html - 183 + 182 You can freeze the first column and any next to it to the beginning of the table. Other columns you freeze will be pinned to the end. src/assets/wise5/components/table/table-authoring/table-authoring.component.html - 199 + 198 Freeze src/assets/wise5/components/table/table-authoring/table-authoring.component.html - 203 + 202 Make All Cells Editable src/assets/wise5/components/table/table-authoring/table-authoring.component.html - 217,219 + 216,218 Make All Cells Uneditable src/assets/wise5/components/table/table-authoring/table-authoring.component.html - 226,228 + 225,227 @@ -21383,28 +21418,28 @@ If this problem continues, let your teacher know and move on to the next activit File src/assets/wise5/directives/wise-tinymce-editor/wise-tinymce-editor.component.ts - 141 + 165 Insert from Notebook src/assets/wise5/directives/wise-tinymce-editor/wise-tinymce-editor.component.ts - 155 + 179 Insert note + src/assets/wise5/directives/wise-tinymce-editor/wise-tinymce-editor.component.ts - 156 + 180 Image from notebook src/assets/wise5/directives/wise-tinymce-editor/wise-tinymce-editor.component.ts - 182 + 206 @@ -21523,7 +21558,7 @@ If this problem continues, let your teacher know and move on to the next activit src/assets/wise5/services/teacherProjectService.ts - 97 + 100 @@ -21534,11 +21569,11 @@ If this problem continues, let your teacher know and move on to the next activit src/assets/wise5/services/teacherProjectService.ts - 109 + 112 src/assets/wise5/services/teacherProjectService.ts - 151 + 154 @@ -21549,11 +21584,11 @@ If this problem continues, let your teacher know and move on to the next activit src/assets/wise5/services/teacherProjectService.ts - 110 + 113 src/assets/wise5/services/teacherProjectService.ts - 152 + 155 @@ -21571,7 +21606,7 @@ If this problem continues, let your teacher know and move on to the next activit src/assets/wise5/services/teacherProjectService.ts - 119 + 122 @@ -21582,7 +21617,7 @@ If this problem continues, let your teacher know and move on to the next activit src/assets/wise5/services/teacherProjectService.ts - 120 + 123 @@ -21593,7 +21628,7 @@ If this problem continues, let your teacher know and move on to the next activit src/assets/wise5/services/teacherProjectService.ts - 121 + 124 @@ -21635,112 +21670,112 @@ If this problem continues, let your teacher know and move on to the next activit Complete <b></b> src/assets/wise5/services/projectService.ts - 1188 + 1212 Visit <b></b> src/assets/wise5/services/projectService.ts - 1194 + 1218 Correctly answer <b></b> src/assets/wise5/services/projectService.ts - 1200 + 1224 Obtain a score of <b></b> on <b></b> src/assets/wise5/services/projectService.ts - 1215 + 1239 You must choose "" on "" src/assets/wise5/services/projectService.ts - 1223 + 1247 Submit <b></b> time on <b></b> src/assets/wise5/services/projectService.ts - 1235 + 1259 Submit <b></b> times on <b></b> src/assets/wise5/services/projectService.ts - 1237 + 1261 Take the branch path from <b></b> to <b></b> src/assets/wise5/services/projectService.ts - 1244 + 1268 Write <b></b> words on <b></b> src/assets/wise5/services/projectService.ts - 1250 + 1274 "" is visible src/assets/wise5/services/projectService.ts - 1256 + 1280 "" is visitable src/assets/wise5/services/projectService.ts - 1262 + 1286 Add <b></b> note on <b></b> src/assets/wise5/services/projectService.ts - 1269 + 1293 Add <b></b> notes on <b></b> src/assets/wise5/services/projectService.ts - 1271 + 1295 You must fill in <b></b> row in the <b>Table</b> on <b></b> src/assets/wise5/services/projectService.ts - 1278 + 1302 You must fill in <b></b> rows in the <b>Table</b> on <b></b> src/assets/wise5/services/projectService.ts - 1280 + 1304 Wait for your teacher to unlock the item src/assets/wise5/services/projectService.ts - 1283 + 1307 @@ -21761,28 +21796,28 @@ If this problem continues, let your teacher know and move on to the next activit Preview Student src/assets/wise5/services/studentDataService.ts - 74 + 77 StudentDataService.saveComponentEvent: component, category, event args must not be null src/assets/wise5/services/studentDataService.ts - 241 + 244 StudentDataService.saveComponentEvent: nodeId, componentId, componentType must not be null src/assets/wise5/services/studentDataService.ts - 251 + 254 StudentDataService.saveVLEEvent: category and event args must not be null src/assets/wise5/services/studentDataService.ts - 260 + 263 @@ -21810,159 +21845,152 @@ If this problem continues, let your teacher know and move on to the next activit First Lesson src/assets/wise5/services/teacherProjectService.ts - 57 + 60 First Step src/assets/wise5/services/teacherProjectService.ts - 75 + 78 Notes src/assets/wise5/services/teacherProjectService.ts - 111 + 114 src/assets/wise5/services/teacherProjectService.ts - 153 + 156 Final Report src/assets/wise5/services/teacherProjectService.ts - 128 + 131 Final summary report of what you learned in this unit src/assets/wise5/services/teacherProjectService.ts - 129 + 132 Use this space to write your final report using evidence from your notebook. src/assets/wise5/services/teacherProjectService.ts - 130 + 133 <h3>This is a heading</h3><p>This is a paragraph.</p> src/assets/wise5/services/teacherProjectService.ts - 131 + 134 Teacher Notebook src/assets/wise5/services/teacherProjectService.ts - 139 + 142 teacher notes src/assets/wise5/services/teacherProjectService.ts - 161 + 164 src/assets/wise5/services/teacherProjectService.ts - 162 + 165 Teacher Notes src/assets/wise5/services/teacherProjectService.ts - 163 + 166 src/assets/wise5/services/teacherProjectService.ts - 170 + 173 Notes for the teacher as they're running the WISE unit src/assets/wise5/services/teacherProjectService.ts - 171 + 174 Use this space to take notes for this unit src/assets/wise5/services/teacherProjectService.ts - 172 + 175 <p>Use this space to take notes for this unit</p> src/assets/wise5/services/teacherProjectService.ts - 173 + 176 All steps after this one will not be visitable until src/assets/wise5/services/teacherProjectService.ts - 945 + 948 All steps after this one will not be visible until src/assets/wise5/services/teacherProjectService.ts - 948 + 951 All other steps will not be visitable until src/assets/wise5/services/teacherProjectService.ts - 951 + 954 All other steps will not be visible until src/assets/wise5/services/teacherProjectService.ts - 954 + 957 This step will not be visitable until src/assets/wise5/services/teacherProjectService.ts - 957 + 960 This step will not be visible until src/assets/wise5/services/teacherProjectService.ts - 960 - - - - Chinese (Simplified) - - src/assets/wise5/services/transcribeService.ts - 30 + 963 - - English + + Error saving translation. Please try again later. - src/assets/wise5/services/transcribeService.ts - 31 + src/assets/wise5/services/teacherProjectTranslationService.ts + 46 @@ -21972,34 +22000,6 @@ If this problem continues, let your teacher know and move on to the next activit 32 - - German - - src/assets/wise5/services/transcribeService.ts - 33 - - - - Italian - - src/assets/wise5/services/transcribeService.ts - 34 - - - - Japanese - - src/assets/wise5/services/transcribeService.ts - 35 - - - - Korean - - src/assets/wise5/services/transcribeService.ts - 36 - - Portuguese (Brazilian) @@ -22007,13 +22007,6 @@ If this problem continues, let your teacher know and move on to the next activit 37 - - Spanish - - src/assets/wise5/services/transcribeService.ts - 38 - - Project Plan diff --git a/src/style/styles.scss b/src/style/styles.scss index 41996d3e618..51450c0bf3d 100644 --- a/src/style/styles.scss +++ b/src/style/styles.scss @@ -63,6 +63,9 @@ @import 'themes/dark'; @import 'themes/author'; @import 'themes/monitor'; +@import "~@ng-select/ng-select/themes/material.theme.css"; + +@import "~@ng-select/ng-select/themes/material.theme.css"; @import "~@ng-select/ng-select/themes/material.theme.css";