diff --git a/app/controllers/admin/sem_classes.php b/app/controllers/admin/sem_classes.php index b892431070fe608aef538ae4abdff3343d789990..42516853c3a0782fbfbd5d8e582bc420149039d7 100644 --- a/app/controllers/admin/sem_classes.php +++ b/app/controllers/admin/sem_classes.php @@ -68,17 +68,18 @@ class Admin_SemClassesController extends AuthenticatedController $plugins = PluginManager::getInstance()->getPlugins("StudipModule"); $this->sem_class = SemClass::getClasses()[Request::get("id")]; $modules = []; - foreach ($this->sem_class->getActivatedModuleObjects() as $plugin) { + foreach ($this->sem_class->getModuleObjects() as $plugin) { $modules[get_class($plugin)] = [ 'name' => $plugin->getPluginName(), 'id' => $plugin->getPluginId(), 'enabled' => $plugin->isEnabled(), - 'activated' => true + 'activated' => $this->sem_class->isModuleActivated($plugin->getPluginName()) ]; } foreach ($plugins as $plugin) { if (!$plugin->isActivatableForContext(new Course)) continue; if (isset($modules[get_class($plugin)])) continue; + if ($this->sem_class->isModuleForbidden(get_class($plugin))) continue; $modules[get_class($plugin)] = [ 'name' => $plugin->getPluginName(), 'id' => $plugin->getPluginId(), @@ -97,9 +98,8 @@ class Admin_SemClassesController extends AuthenticatedController throw new Exception("Kein Zugriff über GET"); } $sem_class = $GLOBALS['SEM_CLASS'][Request::int("sem_class_id")]; - foreach (Request::getArray("core_module_slots") as $slot => $module) { - $sem_class->setSlotModule($slot, $module); - } + $old_data_sem_class = clone $sem_class; + $sem_class->setModules(Request::getArray("modules")); $sem_class->set('name', Request::get("sem_class_name")); $sem_class->set('description', Request::get("sem_class_description")); @@ -126,6 +126,14 @@ class Admin_SemClassesController extends AuthenticatedController $sem_class->set('show_raumzeit', Request::int("show_raumzeit")); $sem_class->set('is_group', Request::int("is_group")); $sem_class->store(); + foreach (array_keys($sem_class->getModules()) as $module_name) { + if ($sem_class->isModuleMandatory($module_name) && !$old_data_sem_class->isModuleMandatory($module_name)) { + $sem_class->activateModuleInCourses($module_name); + } + if (!$sem_class->isModuleAllowed($module_name) && $old_data_sem_class->isModuleAllowed($module_name)) { + $sem_class->deActivateModuleInCourses($module_name); + } + } if (!count($sem_class->getSemTypes())) { $notice = "<br>"._("Beachten Sie, dass es noch keine Veranstaltungstypen gibt!"); } diff --git a/app/views/admin/sem_classes/details.php b/app/views/admin/sem_classes/details.php index a0693a7c280398c319f8e43a164265714905fb79..2496473decc96303f4f5c126d0c9fd1c328d7978 100644 --- a/app/views/admin/sem_classes/details.php +++ b/app/views/admin/sem_classes/details.php @@ -202,17 +202,15 @@ </label> </fieldset> - <fieldset class="collapsed attribute_table"> + <fieldset class="attribute_table"> <legend> <?= _("Inhaltselemente") ?> </legend> - - <div container="plugins" id="plugins" class="core_module_slot"> - <h2 title="<?= _("Diese Inhaltselemente sind standardmäßig bei den Veranstaltungen dieser Klasse aktiviert.") ?>"><?= _("Aktivierte Inhaltselemente") ?></h2> + <div container="plugins" id="plugins"> + <h2 title="<?= _("Diese Inhaltselemente sind standardmäßig bei den Veranstaltungen dieser Klasse aktiviert.") ?>"><?= _("Verfügbare Inhaltselemente") ?></h2> <div class="droparea"> <? foreach ($modules as $module_name => $module_info) : ?> - <? if ($module_info['activated']) : ?> <?= $this->render_partial("admin/sem_classes/content_plugin.php", [ 'plugin' => $module_info, @@ -222,29 +220,10 @@ 'sticky' => $sem_class['modules'][$module_name]['sticky'] ] )?> - <? endif ?> <? endforeach ?> </div> </div> - <hr> - <div container="deactivated" id="deactivated_modules"> - <h2 title="<?= _("Diese Module sind standardmäßig nicht aktiviert.") ?>"><?= _("Nichtaktivierte Inhaltselemente") ?></h2> - <div class="droparea"> - <? foreach ($modules as $module_name => $module_info) { - if (!$module_info['activated']) { - echo $this->render_partial("admin/sem_classes/content_plugin.php", - [ - 'plugin' => $module_info, - 'sem_class' => $sem_class, - 'plugin_id' => $module_name, - 'activated' => $sem_class['modules'][$module_id]['activated'], - 'sticky' => $sem_class['modules'][$module_id]['sticky'] - ] - ); - } - } ?> - </div> - </div> + </fieldset> <footer> diff --git a/lib/classes/SemClass.class.php b/lib/classes/SemClass.class.php index f4ef3da8d83de0fb6cd21ebe243413a84f0e29b1..8f122a3d8947c2347c832fc3b68001a62152f73e 100644 --- a/lib/classes/SemClass.class.php +++ b/lib/classes/SemClass.class.php @@ -41,20 +41,12 @@ class SemClass implements ArrayAccess { protected $data = []; - static protected $core_modules = [ - "CoreOverview", - "CoreAdmin", - "CoreStudygroupAdmin", - "CoreStudygroupOverview", - "CoreDocuments", - "CoreParticipants", - "CoreStudygroupParticipants", - "CoreSchedule", - "CoreScm", - "CoreWiki", - "CoreCalendar", - "CoreElearningInterface" + static protected $studygroup_forbidden_modules = [ + 'CoreAdmin', + 'CoreParticipants', + 'CoreSchedule' ]; + static protected $sem_classes = null; static public function getDefaultSemClass() { @@ -128,6 +120,61 @@ class SemClass implements ArrayAccess } else { $this->data['modules'] = []; } + foreach (array_keys($this->data['modules']) as $modulename) { + if ($this->isModuleForbidden($modulename)) { + unset($this->data['modules'][$modulename]); + } + } + } + + + /** + * @param string $module + * @return false|int + */ + public function activateModuleInCourses($module) + { + $plugin = PluginManager::getInstance()->getPlugin($module); + if ($plugin) { + return Course::findEachBySQL(function ($course) use ($plugin) { + if (!$course->tools->findOneby('plugin_id', $plugin->getPluginId())) { + return ToolActivation::create([ + 'plugin_id' => $plugin->getPluginId(), + 'range_type' => 'course', + 'range_id' => $course->id + ]); + } else { + return 0; + } + }, + "seminare.status IN (?)", + [array_keys($this->getSemTypes())]); + } else { + return false; + } + } + + /** + * @param string $module + * @return false|int + */ + public function deActivateModuleInCourses($module) + { + $plugin = PluginManager::getInstance()->getPlugin($module); + if ($plugin) { + return Course::findEachBySQL(function ($course) use ($plugin) { + if ($tool = $course->tools->findOneby('plugin_id', $plugin->getPluginId())) { + return $tool->delete(); + } else { + return 0; + } + }, + "seminare.status IN (?)", + [array_keys($this->getSemTypes())]); + } else { + return false; + } + } /** @@ -147,6 +194,19 @@ class SemClass implements ArrayAccess } + /** + * @param string $modulename + * @return bool + */ + public function isModuleForbidden($modulename) + { + if ($this->data['studygroup_mode']) { + return in_array($modulename, self::$studygroup_forbidden_modules); + } else { + return strpos($modulename, 'Studygroup') !== false; + } + } + /** * Returns the metadata of a module regarding this sem_class object. * @param string $modulename @@ -175,6 +235,24 @@ class SemClass implements ArrayAccess return $this->data['modules']; } + /** + * @return StudipModule[] + */ + public function getModuleObjects() + { + $result = []; + foreach (array_keys($this->getModules()) as $module) { + $plugin = PluginManager::getInstance()->getPlugin($module); + if ($plugin) { + $result[$plugin->getPluginId()] = $plugin; + } + } + return $result; + } + + /** + * @return string[] + */ public function getActivatedModules() { return array_keys(array_filter($this->data['modules'], function ($meta) { @@ -182,6 +260,9 @@ class SemClass implements ArrayAccess })); } + /** + * @return StudipModule[] + */ public function getActivatedModuleObjects() { $result = []; @@ -194,6 +275,9 @@ class SemClass implements ArrayAccess return $result; } + /** + * @return mixed|object + */ public function getAdminModuleObject() { if ($this->data['studygroup_mode']) { @@ -436,8 +520,8 @@ class SemClass implements ArrayAccess /** * ArrayAccess method to check if an attribute exists. - * @param type $offset - * @return type + * @param int $offset + * @return bool */ public function offsetExists($offset) { diff --git a/resources/assets/javascripts/lib/admin_sem_class.js b/resources/assets/javascripts/lib/admin_sem_class.js index e4fc20d227cc66047fe238f096a9bad7d70a91fe..698a8d6b2770b69a60f4f9ca046a6d7ebc34a3d7 100644 --- a/resources/assets/javascripts/lib/admin_sem_class.js +++ b/resources/assets/javascripts/lib/admin_sem_class.js @@ -4,77 +4,13 @@ const admin_sem_class = { make_sortable: function() { - var after_update = function(event, ui) { - if ( - jQuery(ui.item).is('.core') && - jQuery(this).is('#activated_plugins .droparea, #nonactivated_plugins .droparea') - ) { - jQuery('#deactivated_modules .droparea').append( - jQuery(ui.item) - .clone() - .fadeIn(1500) - ); - jQuery(ui.item).remove(); - } - if (jQuery(ui.item).is('.plugin:not(.core)') && jQuery(this).is('#deactivated_modules .droparea')) { - jQuery('#nonactivated_plugins .droparea').append( - jQuery(ui.item) - .clone() - .fadeIn(1500) - ); - jQuery(ui.item).remove(); - } - - jQuery('.droparea.limited').each(function(index, droparea) { - if (jQuery(this).children().length === 0) { - jQuery(this).removeClass('full'); - } else { - jQuery(this).addClass('full'); - } - }); - admin_sem_class.make_sortable(); - }; - jQuery('.droparea').sortable({ - connectWith: '.droparea:not(.full)', - revert: 200, - update: after_update - }); jQuery('#plugins .droparea').sortable({ - connectWith: '.droparea:not(.full, #deactivated_modules .droparea)', - revert: 200, - update: after_update - }); - jQuery('#deactivated_modules .droparea').sortable({ - connectWith: '.droparea:not(.full, #plugins .droparea)', - revert: 200, - update: after_update + revert: true, }); + }, saveData: function() { - var core_module_slots = {}; - jQuery.each( - [ - 'overview', - 'forum', - 'admin', - 'documents', - 'participants', - 'schedule', - 'literature', - 'scm', - 'wiki', - 'calendar', - 'elearning_interface', - 'resources' - ], - function(index, element) { - var module = jQuery('div[container=' + element + '] .droparea > div.plugin').attr('id'); - if (module) { - module = module.substr(module.indexOf('_') + 1); - } - core_module_slots[element] = module ? module : '0'; - } - ); + var modules = {}; jQuery('div.plugin').each(function() { var activated = jQuery(this) @@ -83,7 +19,7 @@ const admin_sem_class = { var sticky = !jQuery(this) .find('input[name=nonsticky]') - .is(':checked') || jQuery(this).is('#deactivated_modules div.plugin'); + .is(':checked'); var module_name = jQuery(this).attr('id'); if (module_name) { module_name = module_name.substr(module_name.indexOf('_') + 1); @@ -112,7 +48,6 @@ const admin_sem_class = { title_autor_plural: !jQuery('#title_autor_isnull').is(':checked') ? jQuery('#title_autor_plural').val() : '', - core_module_slots: core_module_slots, modules: modules, workgroup_mode: jQuery('#workgroup_mode').is(':checked') ? 1 : 0, studygroup_mode: jQuery('#studygroup_mode').is(':checked') ? 1 : 0,