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
$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!");
}
......
......@@ -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>
......
......@@ -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)
{
......
......@@ -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,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment