From a9c40e363b3e13223bb771105c190be9475021a5 Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms Date: Thu, 4 Jul 2024 13:31:50 +0000 Subject: introduce [data-vue-app], fixes #4294 Closes #4294, #4295, #4297, #4298, #4301, #4304, and #4306 Merge request studip/studip!3109 --- app/controllers/admin/cache.php | 28 +-- app/controllers/admin/courses.php | 8 +- app/controllers/admin/tree.php | 42 +++- app/controllers/course/contentmodules.php | 22 +- app/controllers/my_courses.php | 20 +- app/controllers/search/courses.php | 15 ++ app/views/admin/cache/settings.php | 14 -- app/views/admin/courses/index.php | 34 +-- app/views/admin/tree/batch_assign_semtree.php | 10 +- app/views/admin/tree/rangetree.php | 9 - app/views/admin/tree/semtree.php | 10 - app/views/course/contentmodules/index.php | 1 - app/views/course/contentmodules/info.php | 4 +- app/views/my_courses/index.php | 11 +- app/views/search/courses/index.php | 16 -- lib/classes/Debug/VueCollector.php | 97 ++++++++ lib/classes/StudipController.php | 11 + lib/classes/VueApp.php | 194 ++++++++++++++++ .../assets/javascripts/bootstrap/admin-courses.js | 26 --- .../assets/javascripts/bootstrap/cache-admin.js | 21 -- .../assets/javascripts/bootstrap/contentmodules.js | 45 ---- .../assets/javascripts/bootstrap/my-courses.js | 22 -- .../javascripts/bootstrap/responsive-navigation.js | 10 - resources/assets/javascripts/bootstrap/treeview.js | 13 -- resources/assets/javascripts/bootstrap/vue.js | 80 ++++--- resources/assets/javascripts/entry-base.js | 8 - resources/assets/javascripts/lib/admin-courses.js | 15 +- resources/assets/javascripts/lib/studip-vue.js | 35 ++- resources/vue/components/AdminCourses.vue | 254 ++++++++++++--------- resources/vue/components/CacheAdministration.vue | 11 +- templates/header.php | 12 +- templates/vue-app.php | 14 ++ 32 files changed, 690 insertions(+), 422 deletions(-) delete mode 100644 app/views/admin/cache/settings.php delete mode 100644 app/views/admin/tree/rangetree.php delete mode 100644 app/views/admin/tree/semtree.php delete mode 100644 app/views/course/contentmodules/index.php delete mode 100644 app/views/search/courses/index.php create mode 100644 lib/classes/Debug/VueCollector.php create mode 100644 lib/classes/VueApp.php delete mode 100644 resources/assets/javascripts/bootstrap/cache-admin.js delete mode 100644 resources/assets/javascripts/bootstrap/contentmodules.js delete mode 100644 resources/assets/javascripts/bootstrap/my-courses.js delete mode 100644 resources/assets/javascripts/bootstrap/responsive-navigation.js delete mode 100644 resources/assets/javascripts/bootstrap/treeview.js create mode 100644 templates/vue-app.php diff --git a/app/controllers/admin/cache.php b/app/controllers/admin/cache.php index c016af5..7bd70c6 100644 --- a/app/controllers/admin/cache.php +++ b/app/controllers/admin/cache.php @@ -64,19 +64,21 @@ class Admin_CacheController extends AuthenticatedController */ public function settings_action() { - if ($this->enabled) { - $this->types = CacheType::findAndMapBySQL(function (CacheType $type) { - return $type->toArray(); - }, "1 ORDER BY `cache_id`"); - - $currentCache = Config::get()->SYSTEMCACHE; - $currentCacheClass = CacheType::findOneByClass_name($currentCache['type']); - $this->cache = $currentCacheClass->class_name; - $this->config = $currentCacheClass->class_name::getConfig(); - } else { - PageLayout::postWarning( - _('Caching ist systemweit ausgeschaltet, daher kann hier nichts konfiguriert werden.')); - } + $currentCache = Config::get()->SYSTEMCACHE; + $currentCacheClass = CacheType::findOneByClass_name($currentCache['type']); + + $this->render_vue_app( + Studip\VueApp::create('CacheAdministration') + ->withProps([ + 'enabled' => (bool) $this->enabled, + 'currentCache' => $currentCacheClass->class_name, + 'currentConfig' => $currentCacheClass->class_name::getConfig(), + 'cacheTypes' => CacheType::findAndMapBySQL( + fn(CacheType $type) => $type->toArray(), + "1 ORDER BY `cache_id`" + ), + ]) + ); } /** diff --git a/app/controllers/admin/courses.php b/app/controllers/admin/courses.php index 5f60442..a10aa5c 100644 --- a/app/controllers/admin/courses.php +++ b/app/controllers/admin/courses.php @@ -305,15 +305,9 @@ class Admin_CoursesController extends AuthenticatedController $this->fields = $this->getViewFilters(); $this->sortby = $GLOBALS['user']->cfg->MEINE_SEMINARE_SORT ?? (Config::get()->IMPORTANT_SEMNUMBER ? 'number' : 'name'); $this->sortflag = $GLOBALS['user']->cfg->MEINE_SEMINARE_SORT_FLAG ?? 'ASC'; + $this->store_data = $this->getStoreData(); $this->buildSidebar(); - - PageLayout::addHeadElement('script', [ - 'type' => 'text/javascript', - ], sprintf( - 'window.AdminCoursesStoreData = %s;', - json_encode($this->getStoreData()) - )); } private function getStoreData(): array diff --git a/app/controllers/admin/tree.php b/app/controllers/admin/tree.php index c8f2a8f..ec35368 100644 --- a/app/controllers/admin/tree.php +++ b/app/controllers/admin/tree.php @@ -7,10 +7,28 @@ class Admin_TreeController extends AuthenticatedController $GLOBALS['perm']->check('root'); Navigation::activateItem('/admin/locations/range_tree'); PageLayout::setTitle(_('Einrichtungshierarchie bearbeiten')); - $this->startId = Request::get('node_id', 'RangeTreeNode_root'); + $this->semester = Request::option('semester', Semester::findCurrent()->id); $this->classname = RangeTreeNode::class; $this->setupSidebar(); + + $this->render_vue_app( + Studip\VueApp::create('tree/StudipTree') + ->withProps([ + 'breadcrumb-icon' => 'institute', + 'create-url' => $this->createURL(), + 'delete-url' => $this->deleteURL(), + 'edit-url' => $this->editURL(), + 'editable' => true, + 'semester' => $this->semester, + 'show-structure-as-navigation' => true, + 'start-id' => Request::get('node_id', 'RangeTreeNode_root'), + 'title' => _('Einrichtungshierarchie bearbeiten'), + 'view-type' => 'table', + 'visible-children-only' => false, + 'with-courses' => true, + ]) + ); } public function semtree_action() @@ -18,10 +36,30 @@ class Admin_TreeController extends AuthenticatedController $GLOBALS['perm']->check('root'); Navigation::activateItem('/admin/locations/sem_tree'); PageLayout::setTitle(_('Veranstaltungshierarchie bearbeiten')); - $this->startId = Request::get('node_id', 'StudipStudyArea_root'); + + $this->semester = Request::option('semester', Semester::findCurrent()->id); $this->classname = StudipStudyArea::class; $this->setupSidebar(); + + $this->render_vue_app( + Studip\VueApp::create('tree/StudipTree') + ->withProps([ + 'breadcrumb-icon' => 'literature', + 'create-url' => $this->createURL(), + 'delete-url' => $this->deleteURL(), + 'edit-url' => $this->editURL(), + 'editable' => true, + 'semester' => $this->semester, + 'show-structure-as-navigation' => true, + 'start-id' => Request::get('node_id', 'StudipStudyArea_root'), + 'title' => _('Veranstaltungshierarchie bearbeiten'), + 'view-type' => 'table', + 'visible-children-only' => false, + 'with-course-assign' => true, + 'with-courses' => true, + ]) + ); } /** diff --git a/app/controllers/course/contentmodules.php b/app/controllers/course/contentmodules.php index d37d1bb..d1ac7b4 100644 --- a/app/controllers/course/contentmodules.php +++ b/app/controllers/course/contentmodules.php @@ -83,18 +83,16 @@ class Course_ContentmodulesController extends AuthenticatedController Sidebar::Get()->addWidget($widget); } - PageLayout::addHeadElement('script', [ - 'type' => 'text/javascript', - ], sprintf( - 'window.ContentModulesStoreData = %s;', - json_encode([ - 'setCategories' => $this->categories, - 'setHighlighted' => $this->highlighted_modules, - 'setModules' => array_values($this->modules), - 'setUserId' => User::findCurrent()->id, - 'setView' => $GLOBALS['user']->cfg->CONTENTMODULES_TILED_DISPLAY ? 'tiles' : 'table', - ]) - )); + $this->render_vue_app( + Studip\VueApp::create('ContentModules') + ->withStore('ContentModulesStore', 'contentmodules', [ + 'setCategories' => $this->categories, + 'setHighlighted' => $this->highlighted_modules, + 'setModules' => array_values($this->modules), + 'setUserId' => User::findCurrent()->id, + 'setView' => $GLOBALS['user']->cfg->CONTENTMODULES_TILED_DISPLAY ? 'tiles' : 'table', + ]) + ); } public function trigger_action() diff --git a/app/controllers/my_courses.php b/app/controllers/my_courses.php index 8205c12..e17fc91 100644 --- a/app/controllers/my_courses.php +++ b/app/controllers/my_courses.php @@ -113,13 +113,13 @@ class MyCoursesController extends AuthenticatedController } $this->setupSidebar($sem_key, $group_field, $this->check_for_new($sem_courses, $group_field)); - $data = $this->getMyCoursesData($sem_courses, $group_field); - PageLayout::addHeadElement( - 'script', - ['type' => 'text/javascript'], - 'window.STUDIP.MyCoursesData = ' . json_encode($data) . ';' - ); + $this->vueApp = Studip\VueApp::create('MyCourses') + ->withStore( + 'MyCoursesStore', + 'mycourses', + $this->getMyCoursesData($sem_courses, $group_field) + ); } /** @@ -797,10 +797,10 @@ class MyCoursesController extends AuthenticatedController } return [ - 'courses' => $this->sanitizeNavigations(array_map([$this, 'convertCourse'], $temp_courses)), - 'groups' => $groups, - 'user_id' => $GLOBALS['user']->id, - 'config' => [ + 'setCourses' => $this->sanitizeNavigations(array_map([$this, 'convertCourse'], $temp_courses)), + 'setGroups' => $groups, + 'setUserId' => $GLOBALS['user']->id, + 'setConfig' => [ 'allow_dozent_visibility' => Config::get()->ALLOW_DOZENT_VISIBILITY, 'open_groups' => array_values($GLOBALS['user']->cfg->MY_COURSES_OPEN_GROUPS), 'sem_number' => Config::get()->IMPORTANT_SEMNUMBER, diff --git a/app/controllers/search/courses.php b/app/controllers/search/courses.php index a6a4d27..76e3320 100644 --- a/app/controllers/search/courses.php +++ b/app/controllers/search/courses.php @@ -59,6 +59,21 @@ class Search_CoursesController extends AuthenticatedController $this->setupSidebar(); PageLayout::setTitle($title); + + $this->render_vue_app( + Studip\VueApp::create('tree/StudipTree') + ->withProps([ + 'breadcrumb-icon' => $this->breadcrumbIcon, + 'sem-class' => $this->semClass, + 'semester' => $this->semester, + 'start-id' => $this->startId, + 'title' => $this->treeTitle, + 'view-type' => $this->show_as, + 'with-courses' => true, + 'with-export' => true, + 'with-search' => true, + ]) + ); } private function setupSidebar() diff --git a/app/views/admin/cache/settings.php b/app/views/admin/cache/settings.php deleted file mode 100644 index cf022d4..0000000 --- a/app/views/admin/cache/settings.php +++ /dev/null @@ -1,14 +0,0 @@ - - -
- -
- - ', '')) ?> - json_encode((bool) Config::get()->ADMIN_COURSES_SHOW_COMPLETE), - ':fields' => json_encode($fields), - ':unsortable-fields' => json_encode($unsortable_fields), - ':max-courses' => (int) $max_show_courses, - 'sort-by' => $sortby, - 'sort-flag' => $sortflag, - ]; -?> -
- - -
- >
-
+ + withProps([ + 'show-complete' => (bool) Config::get()->ADMIN_COURSES_SHOW_COMPLETE, + 'fields' => $fields, + 'unsortable-fields' => $unsortable_fields, + 'max-courses' => (int) $max_show_courses, + 'sort-by' => $sortby, + 'sort-flag' => $sortflag, + ]) + ->withStore('AdminCoursesStore', 'admincourses', $store_data) ?> diff --git a/app/views/admin/tree/batch_assign_semtree.php b/app/views/admin/tree/batch_assign_semtree.php index 4b1a4ff..6b7df0e 100644 --- a/app/views/admin/tree/batch_assign_semtree.php +++ b/app/views/admin/tree/batch_assign_semtree.php @@ -2,10 +2,12 @@
-
- -
+ withProps([ + 'assignable' => true, + 'open-levels' => 1, + 'start-id' => 'StudipStudyArea_root', + 'with-info' => false, + ]) ?>
diff --git a/app/views/admin/tree/rangetree.php b/app/views/admin/tree/rangetree.php deleted file mode 100644 index 1e3e945..0000000 --- a/app/views/admin/tree/rangetree.php +++ /dev/null @@ -1,9 +0,0 @@ -
- -
diff --git a/app/views/admin/tree/semtree.php b/app/views/admin/tree/semtree.php deleted file mode 100644 index 0c48245..0000000 --- a/app/views/admin/tree/semtree.php +++ /dev/null @@ -1,10 +0,0 @@ -
- -
diff --git a/app/views/course/contentmodules/index.php b/app/views/course/contentmodules/index.php deleted file mode 100644 index af8f3e1..0000000 --- a/app/views/course/contentmodules/index.php +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/app/views/course/contentmodules/info.php b/app/views/course/contentmodules/info.php index 93d3ad9..0585ebe 100644 --- a/app/views/course/contentmodules/info.php +++ b/app/views/course/contentmodules/info.php @@ -18,7 +18,9 @@ -
+ withProps([ + 'module_id' => (string) $plugin->getPluginId(), + ]) ?> 0) : ?>