From 7c3a4e24b811b4d6cc370503a7cf21cf513708b2 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Tue, 17 Oct 2023 08:26:48 +0000
Subject: [PATCH] extract courseware chunk, fixes #2627

Closes #2627

Merge request studip/studip!1778
---
 .../assets/javascripts/bootstrap/courseware.js | 16 ++++++++--------
 resources/assets/javascripts/chunk-loader.js   | 14 ++++++++++++--
 .../assets/javascripts/chunks/courseware.js    |  1 +
 resources/assets/stylesheets/mixins.scss       |  2 ++
 .../assets/stylesheets/scss/courseware.scss    |  6 +++---
 resources/assets/stylesheets/scss/layouts.scss | 16 ----------------
 .../assets/stylesheets/scss/variables.scss     | 18 ++++++++++++++++++
 resources/assets/stylesheets/studip.scss       |  1 -
 8 files changed, 44 insertions(+), 30 deletions(-)
 create mode 100644 resources/assets/javascripts/chunks/courseware.js

diff --git a/resources/assets/javascripts/bootstrap/courseware.js b/resources/assets/javascripts/bootstrap/courseware.js
index d24bd4db392..d50331f8ea5 100644
--- a/resources/assets/javascripts/bootstrap/courseware.js
+++ b/resources/assets/javascripts/bootstrap/courseware.js
@@ -1,6 +1,6 @@
 STUDIP.domReady(() => {
     if (document.getElementById('courseware-shelf-app')) {
-        STUDIP.Vue.load().then(({ createApp }) => {
+        STUDIP.loadChunk('courseware').then(({ createApp }) => {
             import(
                 /* webpackChunkName: "courseware-shelf-app" */
                 '@/vue/courseware-shelf-app.js'
@@ -11,7 +11,7 @@ STUDIP.domReady(() => {
     }
 
     if (document.getElementById('courseware-index-app')) {
-        STUDIP.Vue.load().then(({ createApp }) => {
+        STUDIP.loadChunk('courseware').then(({ createApp }) => {
             import(
                 /* webpackChunkName: "courseware-index-app" */
                 '@/vue/courseware-index-app.js'
@@ -22,7 +22,7 @@ STUDIP.domReady(() => {
     }
 
     if (document.getElementById('courseware-activities-app')) {
-        STUDIP.Vue.load().then(({ createApp }) => {
+        STUDIP.loadChunk('courseware').then(({ createApp }) => {
             import(
                 /* webpackChunkName: "courseware-activities-app" */
                 '@/vue/courseware-activities-app.js'
@@ -33,7 +33,7 @@ STUDIP.domReady(() => {
     }
 
     if (document.getElementById('courseware-tasks-app')) {
-        STUDIP.Vue.load().then(({ createApp }) => {
+        STUDIP.loadChunk('courseware').then(({ createApp }) => {
             import(
                 /* webpackChunkName: "courseware-tasks-app" */
                 '@/vue/courseware-tasks-app.js'
@@ -44,7 +44,7 @@ STUDIP.domReady(() => {
     }
 
     if (document.getElementById('courseware-content-bookmark-app')) {
-        STUDIP.Vue.load().then(({ createApp }) => {
+        STUDIP.loadChunk('courseware').then(({ createApp }) => {
             import(
                 /* webpackChunkName: "courseware-content-bookmark-app" */
                 '@/vue/courseware-content-bookmark-app.js'
@@ -55,7 +55,7 @@ STUDIP.domReady(() => {
     }
 
     if (document.getElementById('courseware-admin-app')) {
-        STUDIP.Vue.load().then(({ createApp }) => {
+        STUDIP.loadChunk('courseware').then(({ createApp }) => {
             import(
                 /* webpackChunkName: "courseware-content-bookmark-app" */
                 '@/vue/courseware-admin-app.js'
@@ -66,7 +66,7 @@ STUDIP.domReady(() => {
     }
 
     if (document.getElementById('courseware-public-app')) {
-        STUDIP.Vue.load().then(({ createApp }) => {
+        STUDIP.loadChunk('courseware').then(({ createApp }) => {
             import(
                 /* webpackChunkName: "courseware-public-app" */
                 '@/vue/courseware-public-app.js'
@@ -77,7 +77,7 @@ STUDIP.domReady(() => {
     }
 
     if (document.getElementById('courseware-content-releases-app')) {
-        STUDIP.Vue.load().then(({ createApp }) => {
+        STUDIP.loadChunk('courseware').then(({ createApp }) => {
             import(
                 /* webpackChunkName: "courseware-content-releases-app" */
                 '@/vue/courseware-content-releases-app.js'
diff --git a/resources/assets/javascripts/chunk-loader.js b/resources/assets/javascripts/chunk-loader.js
index d2da2a7b144..dcd95cc63df 100644
--- a/resources/assets/javascripts/chunk-loader.js
+++ b/resources/assets/javascripts/chunk-loader.js
@@ -9,10 +9,10 @@ export const loadScript = function (script_name) {
 };
 
 export const loadChunk = (function () {
-    var mathjax_promise = null;
+    let mathjax_promise = null;
 
     return function (chunk) {
-        var promise = null;
+        let promise = null;
         switch (chunk) {
 
             case 'code-highlight':
@@ -24,6 +24,16 @@ export const loadChunk = (function () {
                 });
                 break;
 
+            case 'courseware':
+                promise = Promise.all([
+                    STUDIP.loadChunk('vue'),
+                    import(
+                        /* webpackChunkName: "courseware" */
+                        './chunks/courseware'
+                    ),
+                ]).then(([Vue]) => Vue);
+                break;
+
             case 'chartist':
                 promise = import(
                     /* webpackChunkName: "chartist" */
diff --git a/resources/assets/javascripts/chunks/courseware.js b/resources/assets/javascripts/chunks/courseware.js
new file mode 100644
index 00000000000..5e555568c19
--- /dev/null
+++ b/resources/assets/javascripts/chunks/courseware.js
@@ -0,0 +1 @@
+import "../../stylesheets/scss/courseware.scss";
diff --git a/resources/assets/stylesheets/mixins.scss b/resources/assets/stylesheets/mixins.scss
index a9dd78d0d08..a7bb714cafa 100644
--- a/resources/assets/stylesheets/mixins.scss
+++ b/resources/assets/stylesheets/mixins.scss
@@ -1,6 +1,8 @@
 $image-path: "../images" !default;
 $icon-path: "#{$image-path}/icons" !default;
 
+@import "scss/variables";
+
 @import "mixins/misc";
 @import "mixins/colors";
 @import "mixins/studip";
diff --git a/resources/assets/stylesheets/scss/courseware.scss b/resources/assets/stylesheets/scss/courseware.scss
index 141bce98a00..b854bef5c05 100644
--- a/resources/assets/stylesheets/scss/courseware.scss
+++ b/resources/assets/stylesheets/scss/courseware.scss
@@ -1,7 +1,7 @@
-@import "courseware_gradients.scss";
-
-
 /* definitions */
+@use '../mixins.scss' as *;
+@import './drag-handle.scss';
+@import "courseware_gradients.scss";
 
 $companion-types: (
     default: basic,
diff --git a/resources/assets/stylesheets/scss/layouts.scss b/resources/assets/stylesheets/scss/layouts.scss
index 72ff2e7c01c..6d0454af0cf 100644
--- a/resources/assets/stylesheets/scss/layouts.scss
+++ b/resources/assets/stylesheets/scss/layouts.scss
@@ -1,21 +1,5 @@
 // TODO: SCSSify
 
-$page-margin: 15px;
-
-$sidebar-padding: 12px;
-$sidebar-width: 270px;
-
-$content-width: 400px;
-$content-margin: 12px;
-$max-content-width: 4 * $sidebar-width + $page-margin;
-
-$footer-height: 32px;
-
-$site-width: ($page-margin * 2 + $sidebar-width + $sidebar-padding * 2 + $sidebar-border-width * 2 + $content-width + $content-margin * 2);
-$page-width: ($sidebar-width + $sidebar-padding * 2 + $sidebar-border-width * 2 + $content-width + $content-margin * 2);
-
-$grid-gap: 0;
-
 html {
     height: 100vh;
     overflow-y: auto;
diff --git a/resources/assets/stylesheets/scss/variables.scss b/resources/assets/stylesheets/scss/variables.scss
index f82da12bfa1..c07fbd0be02 100644
--- a/resources/assets/stylesheets/scss/variables.scss
+++ b/resources/assets/stylesheets/scss/variables.scss
@@ -1,5 +1,6 @@
 @import '../mixins/colors.scss';
 
+// Typography
 $text-color:              #000;
 
 $font-family-base:        "Lato", sans-serif;
@@ -42,6 +43,23 @@ $drag_and_drop_border: 1px solid $base-color;
 
 $transition-duration: .3s;
 
+// Layout
+$page-margin: 15px;
+
+$sidebar-padding: 12px;
+$sidebar-width: 270px;
+
+$content-width: 400px;
+$content-margin: 12px;
+$max-content-width: 4 * $sidebar-width + $page-margin;
+
+$footer-height: 32px;
+
+$site-width: ($page-margin * 2 + $sidebar-width + $sidebar-padding * 2 + $sidebar-border-width * 2 + $content-width + $content-margin * 2);
+$page-width: ($sidebar-width + $sidebar-padding * 2 + $sidebar-border-width * 2 + $content-width + $content-margin * 2);
+
+$grid-gap: 0;
+
 :root {
     // The special handling for -- as #{"--"} seems to be neccessary to make
     // scss evaluate the color variables
diff --git a/resources/assets/stylesheets/studip.scss b/resources/assets/stylesheets/studip.scss
index 1ec3573cc1b..2d5b7b1296e 100644
--- a/resources/assets/stylesheets/studip.scss
+++ b/resources/assets/stylesheets/studip.scss
@@ -32,7 +32,6 @@
 @import "scss/comments";
 @import "scss/copyable-links";
 @import "scss/cronjobs";
-@import "scss/courseware";
 @import "scss/coursewizard";
 @import "scss/css_tree";
 @import "scss/dates";
-- 
GitLab