Skip to content
Snippets Groups Projects
Commit 92f8a9de authored by André Noack's avatar André Noack Committed by André Noack
Browse files

Resolve "Veranstaltungskategorien: Inhaltselemente nicht wählbar"

parent 64f2a3af
No related branches found
No related tags found
No related merge requests found
...@@ -68,17 +68,18 @@ class Admin_SemClassesController extends AuthenticatedController ...@@ -68,17 +68,18 @@ class Admin_SemClassesController extends AuthenticatedController
$plugins = PluginManager::getInstance()->getPlugins("StudipModule"); $plugins = PluginManager::getInstance()->getPlugins("StudipModule");
$this->sem_class = SemClass::getClasses()[Request::get("id")]; $this->sem_class = SemClass::getClasses()[Request::get("id")];
$modules = []; $modules = [];
foreach ($this->sem_class->getActivatedModuleObjects() as $plugin) { foreach ($this->sem_class->getModuleObjects() as $plugin) {
$modules[get_class($plugin)] = [ $modules[get_class($plugin)] = [
'name' => $plugin->getPluginName(), 'name' => $plugin->getPluginName(),
'id' => $plugin->getPluginId(), 'id' => $plugin->getPluginId(),
'enabled' => $plugin->isEnabled(), 'enabled' => $plugin->isEnabled(),
'activated' => true 'activated' => $this->sem_class->isModuleActivated($plugin->getPluginName())
]; ];
} }
foreach ($plugins as $plugin) { foreach ($plugins as $plugin) {
if (!$plugin->isActivatableForContext(new Course)) continue; if (!$plugin->isActivatableForContext(new Course)) continue;
if (isset($modules[get_class($plugin)])) continue; if (isset($modules[get_class($plugin)])) continue;
if ($this->sem_class->isModuleForbidden(get_class($plugin))) continue;
$modules[get_class($plugin)] = [ $modules[get_class($plugin)] = [
'name' => $plugin->getPluginName(), 'name' => $plugin->getPluginName(),
'id' => $plugin->getPluginId(), 'id' => $plugin->getPluginId(),
...@@ -97,9 +98,8 @@ class Admin_SemClassesController extends AuthenticatedController ...@@ -97,9 +98,8 @@ class Admin_SemClassesController extends AuthenticatedController
throw new Exception("Kein Zugriff über GET"); throw new Exception("Kein Zugriff über GET");
} }
$sem_class = $GLOBALS['SEM_CLASS'][Request::int("sem_class_id")]; $sem_class = $GLOBALS['SEM_CLASS'][Request::int("sem_class_id")];
foreach (Request::getArray("core_module_slots") as $slot => $module) { $old_data_sem_class = clone $sem_class;
$sem_class->setSlotModule($slot, $module);
}
$sem_class->setModules(Request::getArray("modules")); $sem_class->setModules(Request::getArray("modules"));
$sem_class->set('name', Request::get("sem_class_name")); $sem_class->set('name', Request::get("sem_class_name"));
$sem_class->set('description', Request::get("sem_class_description")); $sem_class->set('description', Request::get("sem_class_description"));
...@@ -126,6 +126,14 @@ class Admin_SemClassesController extends AuthenticatedController ...@@ -126,6 +126,14 @@ class Admin_SemClassesController extends AuthenticatedController
$sem_class->set('show_raumzeit', Request::int("show_raumzeit")); $sem_class->set('show_raumzeit', Request::int("show_raumzeit"));
$sem_class->set('is_group', Request::int("is_group")); $sem_class->set('is_group', Request::int("is_group"));
$sem_class->store(); $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())) { if (!count($sem_class->getSemTypes())) {
$notice = "<br>"._("Beachten Sie, dass es noch keine Veranstaltungstypen gibt!"); $notice = "<br>"._("Beachten Sie, dass es noch keine Veranstaltungstypen gibt!");
} }
......
...@@ -202,17 +202,15 @@ ...@@ -202,17 +202,15 @@
</label> </label>
</fieldset> </fieldset>
<fieldset class="collapsed attribute_table"> <fieldset class="attribute_table">
<legend> <legend>
<?= _("Inhaltselemente") ?> <?= _("Inhaltselemente") ?>
</legend> </legend>
<div container="plugins" id="plugins">
<div container="plugins" id="plugins" class="core_module_slot"> <h2 title="<?= _("Diese Inhaltselemente sind standardmäßig bei den Veranstaltungen dieser Klasse aktiviert.") ?>"><?= _("Verfügbare Inhaltselemente") ?></h2>
<h2 title="<?= _("Diese Inhaltselemente sind standardmäßig bei den Veranstaltungen dieser Klasse aktiviert.") ?>"><?= _("Aktivierte Inhaltselemente") ?></h2>
<div class="droparea"> <div class="droparea">
<? foreach ($modules as $module_name => $module_info) : ?> <? foreach ($modules as $module_name => $module_info) : ?>
<? if ($module_info['activated']) : ?>
<?= $this->render_partial("admin/sem_classes/content_plugin.php", <?= $this->render_partial("admin/sem_classes/content_plugin.php",
[ [
'plugin' => $module_info, 'plugin' => $module_info,
...@@ -222,29 +220,10 @@ ...@@ -222,29 +220,10 @@
'sticky' => $sem_class['modules'][$module_name]['sticky'] 'sticky' => $sem_class['modules'][$module_name]['sticky']
] ]
)?> )?>
<? endif ?>
<? endforeach ?> <? endforeach ?>
</div> </div>
</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> </fieldset>
<footer> <footer>
......
...@@ -41,20 +41,12 @@ class SemClass implements ArrayAccess ...@@ -41,20 +41,12 @@ class SemClass implements ArrayAccess
{ {
protected $data = []; protected $data = [];
static protected $core_modules = [ static protected $studygroup_forbidden_modules = [
"CoreOverview", 'CoreAdmin',
"CoreAdmin", 'CoreParticipants',
"CoreStudygroupAdmin", 'CoreSchedule'
"CoreStudygroupOverview",
"CoreDocuments",
"CoreParticipants",
"CoreStudygroupParticipants",
"CoreSchedule",
"CoreScm",
"CoreWiki",
"CoreCalendar",
"CoreElearningInterface"
]; ];
static protected $sem_classes = null; static protected $sem_classes = null;
static public function getDefaultSemClass() { static public function getDefaultSemClass() {
...@@ -128,6 +120,61 @@ class SemClass implements ArrayAccess ...@@ -128,6 +120,61 @@ class SemClass implements ArrayAccess
} else { } else {
$this->data['modules'] = []; $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 ...@@ -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. * Returns the metadata of a module regarding this sem_class object.
* @param string $modulename * @param string $modulename
...@@ -175,6 +235,24 @@ class SemClass implements ArrayAccess ...@@ -175,6 +235,24 @@ class SemClass implements ArrayAccess
return $this->data['modules']; 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() public function getActivatedModules()
{ {
return array_keys(array_filter($this->data['modules'], function ($meta) { return array_keys(array_filter($this->data['modules'], function ($meta) {
...@@ -182,6 +260,9 @@ class SemClass implements ArrayAccess ...@@ -182,6 +260,9 @@ class SemClass implements ArrayAccess
})); }));
} }
/**
* @return StudipModule[]
*/
public function getActivatedModuleObjects() public function getActivatedModuleObjects()
{ {
$result = []; $result = [];
...@@ -194,6 +275,9 @@ class SemClass implements ArrayAccess ...@@ -194,6 +275,9 @@ class SemClass implements ArrayAccess
return $result; return $result;
} }
/**
* @return mixed|object
*/
public function getAdminModuleObject() public function getAdminModuleObject()
{ {
if ($this->data['studygroup_mode']) { if ($this->data['studygroup_mode']) {
...@@ -436,8 +520,8 @@ class SemClass implements ArrayAccess ...@@ -436,8 +520,8 @@ class SemClass implements ArrayAccess
/** /**
* ArrayAccess method to check if an attribute exists. * ArrayAccess method to check if an attribute exists.
* @param type $offset * @param int $offset
* @return type * @return bool
*/ */
public function offsetExists($offset) public function offsetExists($offset)
{ {
......
...@@ -4,77 +4,13 @@ ...@@ -4,77 +4,13 @@
const admin_sem_class = { const admin_sem_class = {
make_sortable: function() { 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({ jQuery('#plugins .droparea').sortable({
connectWith: '.droparea:not(.full, #deactivated_modules .droparea)', revert: true,
revert: 200,
update: after_update
});
jQuery('#deactivated_modules .droparea').sortable({
connectWith: '.droparea:not(.full, #plugins .droparea)',
revert: 200,
update: after_update
}); });
}, },
saveData: function() { 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 = {}; var modules = {};
jQuery('div.plugin').each(function() { jQuery('div.plugin').each(function() {
var activated = jQuery(this) var activated = jQuery(this)
...@@ -83,7 +19,7 @@ const admin_sem_class = { ...@@ -83,7 +19,7 @@ const admin_sem_class = {
var sticky = var sticky =
!jQuery(this) !jQuery(this)
.find('input[name=nonsticky]') .find('input[name=nonsticky]')
.is(':checked') || jQuery(this).is('#deactivated_modules div.plugin'); .is(':checked');
var module_name = jQuery(this).attr('id'); var module_name = jQuery(this).attr('id');
if (module_name) { if (module_name) {
module_name = module_name.substr(module_name.indexOf('_') + 1); module_name = module_name.substr(module_name.indexOf('_') + 1);
...@@ -112,7 +48,6 @@ const admin_sem_class = { ...@@ -112,7 +48,6 @@ const admin_sem_class = {
title_autor_plural: !jQuery('#title_autor_isnull').is(':checked') title_autor_plural: !jQuery('#title_autor_isnull').is(':checked')
? jQuery('#title_autor_plural').val() ? jQuery('#title_autor_plural').val()
: '', : '',
core_module_slots: core_module_slots,
modules: modules, modules: modules,
workgroup_mode: jQuery('#workgroup_mode').is(':checked') ? 1 : 0, workgroup_mode: jQuery('#workgroup_mode').is(':checked') ? 1 : 0,
studygroup_mode: jQuery('#studygroup_mode').is(':checked') ? 1 : 0, studygroup_mode: jQuery('#studygroup_mode').is(':checked') ? 1 : 0,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment