Skip to content
Snippets Groups Projects
Commit 333b1181 authored by Ron Lucke's avatar Ron Lucke
Browse files

StEP 00357

parent e40d838a
No related branches found
No related tags found
No related merge requests found
Showing
with 343 additions and 117 deletions
<?php
class Admin_CoursewareController extends AuthenticatedController
{
public function before_filter(&$action, &$args)
{
parent::before_filter($action, $args);
$GLOBALS['perm']->check('root');
PageLayout::setTitle(_('Coursewareverwaltung'));
Navigation::activateItem('/admin/locations/courseware');
}
public function index_action()
{
$this->setSidebar();
}
private function setSidebar()
{
$sidebar = Sidebar::Get();
$views = new TemplateWidget(
_('Ansichten'),
$this->get_template_factory()->open('admin/courseware/admin_view_widget')
);
$sidebar->addWidget($views)->addLayoutCSSClass('courseware-admin-view-widget');
$views = new TemplateWidget(
_('Aktionen'),
$this->get_template_factory()->open('admin/courseware/admin_action_widget')
);
$sidebar->addWidget($views)->addLayoutCSSClass('courseware-admin-action-widget');
}
}
\ No newline at end of file
...@@ -30,18 +30,34 @@ class Contents_CoursewareController extends AuthenticatedController ...@@ -30,18 +30,34 @@ class Contents_CoursewareController extends AuthenticatedController
* @SuppressWarnings(PHPMD.Superglobals) * @SuppressWarnings(PHPMD.Superglobals)
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/ */
public function index_action($action = false, $widgetId = null) public function index_action()
{ {
Navigation::activateItem('/contents/courseware/projects'); Navigation::activateItem('/contents/courseware/overview');
$this->setProjectsSidebar($action); $this->user_id = $GLOBALS['user']->id;
$this->courseware_root = StructuralElement::getCoursewareUser($this->user->id); $this->setOverviewSidebar();
$this->courseware_root = \Courseware\StructuralElement::getCoursewareUser($this->user_id);
if (!$this->courseware_root) { if (!$this->courseware_root) {
// create initial courseware dataset // create initial courseware dataset
$new = StructuralElement::createEmptyCourseware($this->user->id, 'user'); $new = \Courseware\StructuralElement::createEmptyCourseware($this->user_id, 'user');
$this->courseware_root = $new->getRoot(); $this->courseware_root = $new->getRoot();
} }
$this->licenses = $this->getLicences();
}
private function setOverviewSidebar()
{
$sidebar = Sidebar::Get();
$views = new TemplateWidget(
_('Aktionen'),
$this->get_template_factory()->open('contents/courseware/overview_action_widget')
);
$sidebar->addWidget($views)->addLayoutCSSClass('courseware-overview-filter-widget');
$this->elements = $this->getProjects('all'); $views = new TemplateWidget(
_('Filter'),
$this->get_template_factory()->open('contents/courseware/overview_filter_widget')
);
$sidebar->addWidget($views)->addLayoutCSSClass('courseware-overview-filter-widget');
} }
/** /**
...@@ -87,12 +103,7 @@ class Contents_CoursewareController extends AuthenticatedController ...@@ -87,12 +103,7 @@ class Contents_CoursewareController extends AuthenticatedController
$last[$this->user_id] = $this->entry_element_id; $last[$this->user_id] = $this->entry_element_id;
UserConfig::get($this->user_id)->store('COURSEWARE_LAST_ELEMENT', $last); UserConfig::get($this->user_id)->store('COURSEWARE_LAST_ELEMENT', $last);
$this->licenses = array(); $this->licenses = $this->getLicences();
$sorm_licenses = License::findBySQL("1 ORDER BY name ASC");
foreach($sorm_licenses as $license) {
array_push($this->licenses, $license->toArray());
}
$this->licenses = json_encode($this->licenses);
$this->oer_enabled = Config::get()->OERCAMPUS_ENABLED && $perm->have_perm(Config::get()->OER_PUBLIC_STATUS); $this->oer_enabled = Config::get()->OERCAMPUS_ENABLED && $perm->have_perm(Config::get()->OER_PUBLIC_STATUS);
} }
...@@ -111,8 +122,16 @@ class Contents_CoursewareController extends AuthenticatedController ...@@ -111,8 +122,16 @@ class Contents_CoursewareController extends AuthenticatedController
$this->get_template_factory()->open('course/courseware/view_widget') $this->get_template_factory()->open('course/courseware/view_widget')
); );
$sidebar->addWidget($views)->addLayoutCSSClass('courseware-view-widget'); $sidebar->addWidget($views)->addLayoutCSSClass('courseware-view-widget');
}
private function getLicences()
{
$licenses = array();
$sorm_licenses = License::findBySQL("1 ORDER BY name ASC");
foreach($sorm_licenses as $license) {
array_push($licenses, $license->toArray());
}
return json_encode($licenses);
} }
/** /**
...@@ -141,31 +160,21 @@ class Contents_CoursewareController extends AuthenticatedController ...@@ -141,31 +160,21 @@ class Contents_CoursewareController extends AuthenticatedController
* @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/ */
public function bookmarks_action($action = false, $widgetId = null) public function bookmarks_action()
{ {
Navigation::activateItem('/contents/courseware/bookmarks'); Navigation::activateItem('/contents/courseware/bookmarks');
$this->bookmarks = array(); $this->user_id = $GLOBALS['user']->id;
$cw_bookmarks = Courseware\Bookmark::findUsersBookmarks($this->user->id); $this->setBookmarkSidebar();
foreach($cw_bookmarks as $bookmark) { }
$bm = array();
$bm['bookmark'] = $bookmark;
$element = Courseware\StructuralElement::find($bookmark->element_id);
if(empty($element)) {
continue;
}
$element['payload'] = json_decode($element['payload'], true);
$bm['element'] = $element;
if ($element->range_type === 'course') {
$bm['url'] = URLHelper::getURL('dispatch.php/course/courseware/?cid='.$element['range_id'].'#/structural_element/'.$element['id']);
$bm['course'] = Course::find($element['range_id']);
}
if ($element->range_type === 'user' && $element->range_id === $this->user->id) {
$bm['url'] = URLHelper::getURL('dispatch.php/contents/courseware/courseware#/structural_element/'.$element['id']);
$bm['user'] = $this->user;
}
array_push($this->bookmarks, $bm); private function setBookmarkSidebar()
} {
$sidebar = Sidebar::Get();
$views = new TemplateWidget(
_('Filter'),
$this->get_template_factory()->open('contents/courseware/bookmark_filter_widget')
);
$sidebar->addWidget($views)->addLayoutCSSClass('courseware-bookmark-filter-widget');
} }
/** /**
...@@ -419,4 +428,11 @@ class Contents_CoursewareController extends AuthenticatedController ...@@ -419,4 +428,11 @@ class Contents_CoursewareController extends AuthenticatedController
$actions->addLink(_('Neues Lernmaterial anlegen'), $this->url_for('contents/courseware/create_project'), Icon::create('add', 'clickable'))->asDialog('size=700'); $actions->addLink(_('Neues Lernmaterial anlegen'), $this->url_for('contents/courseware/create_project'), Icon::create('add', 'clickable'))->asDialog('size=700');
$sidebar->addWidget($actions); $sidebar->addWidget($actions);
} }
public function pdf_export_action($element_id)
{
$element = \Courseware\StructuralElement::findOneById($element_id);
$this->render_pdf($element->pdfExport($this->user), trim($element->title).'.pdf');
}
} }
...@@ -7,6 +7,7 @@ use Courseware\UserProgress; ...@@ -7,6 +7,7 @@ use Courseware\UserProgress;
/** /**
* @property ?string $entry_element_id * @property ?string $entry_element_id
* @property int $last_visitdate * @property int $last_visitdate
* @property mixed $course_id
* @property mixed $courseware_progress_data * @property mixed $courseware_progress_data
* @property mixed $courseware_chapter_counter * @property mixed $courseware_chapter_counter
*/ */
...@@ -71,10 +72,11 @@ class Course_CoursewareController extends AuthenticatedController ...@@ -71,10 +72,11 @@ class Course_CoursewareController extends AuthenticatedController
public function dashboard_action(): void public function dashboard_action(): void
{ {
global $perm, $user; global $perm, $user;
$course_progress = $perm->have_studip_perm('dozent', Context::getId(), $user->id); $this->is_teacher = $perm->have_studip_perm('tutor', Context::getId(), $user->id);
$this->courseware_progress_data = $this->getProgressData($course_progress); $this->courseware_progress_data = $this->getProgressData($this->is_teacher);
$this->courseware_chapter_counter = $this->getChapterCounter($this->courseware_progress_data); $this->courseware_chapter_counter = $this->getChapterCounter($this->courseware_progress_data);
Navigation::activateItem('course/courseware/dashboard'); Navigation::activateItem('course/courseware/dashboard');
$this->setDashboardSidebar();
} }
public function manager_action(): void public function manager_action(): void
...@@ -89,6 +91,13 @@ class Course_CoursewareController extends AuthenticatedController ...@@ -89,6 +91,13 @@ class Course_CoursewareController extends AuthenticatedController
} }
} }
public function pdf_export_action($element_id)
{
$element = \Courseware\StructuralElement::findOneById($element_id);
$this->render_pdf($element->pdfExport($this->user), trim($element->title).'.pdf');
}
private function setIndexSidebar(): void private function setIndexSidebar(): void
{ {
$sidebar = Sidebar::Get(); $sidebar = Sidebar::Get();
...@@ -105,6 +114,17 @@ class Course_CoursewareController extends AuthenticatedController ...@@ -105,6 +114,17 @@ class Course_CoursewareController extends AuthenticatedController
$sidebar->addWidget($views)->addLayoutCSSClass('courseware-view-widget'); $sidebar->addWidget($views)->addLayoutCSSClass('courseware-view-widget');
} }
private function setDashboardSidebar(): void
{
$sidebar = Sidebar::Get();
$views = new TemplateWidget(
_('Ansichten'),
$this->get_template_factory()->open('course/courseware/dashboard_view_widget')
);
$sidebar->addWidget($views)->addLayoutCSSClass('courseware-dashboard-view-widget');
}
private function getProgressData(bool $showProgressForAllParticipants = false): iterable private function getProgressData(bool $showProgressForAllParticipants = false): iterable
{ {
/** @var ?\Course $course */ /** @var ?\Course $course */
......
...@@ -70,6 +70,17 @@ class Activity extends \RESTAPI\RouteMap ...@@ -70,6 +70,17 @@ class Activity extends \RESTAPI\RouteMap
$scrollfrom = \Request::int('scrollfrom', false); $scrollfrom = \Request::int('scrollfrom', false);
$filtertype = \Request::get('filtertype', ''); $filtertype = \Request::get('filtertype', '');
$objectType = \Request::get('object_type', '');
$filter->setObjectType($objectType);
$objectId = \Request::get('object_id', '');
$filter->setObjectId($objectId);
$context = \Request::get('context_type', '');
$filter->setContext($context);
$contextId = \Request::get('context_id', '');
$filter->setContextId($contextId);
if (!empty($filtertype)) { if (!empty($filtertype)) {
$filter->setType(json_decode($filtertype)); $filter->setType(json_decode($filtertype));
......
<aside id="courseware-admin-action-widget" class="widget-sidebar"></aside>
\ No newline at end of file
<aside id="courseware-admin-view-widget" class="widget-sidebar"></aside>
\ No newline at end of file
<div id="courseware-admin-app"></div>
\ No newline at end of file
<aside id="courseware-content-bookmark-filter-widget" class="widget-sidebar"></aside>
\ No newline at end of file
<div class="cw-bookmarks"> <div
<? if(!empty($bookmarks)): ?> id="courseware-content-bookmark-app"
<ul class="cw-tiles"> entry-type="users"
<? foreach($bookmarks as $bookmark) :?> entry-id="<?= $user_id ?>"
<li class="tile <?= htmlReady($bookmark['element']['payload']['color'])?>"> >
<a href="<?= htmlReady($bookmark['url'])?>">
<? if ($element->getImageUrl() === null) : ?>
<div class="preview-image default-image"></div>
<? else : ?>
<div class="preview-image" style="background-image: url(<?= htmlReady($element->getImageUrl()) ?>)" ></div>
<? endif; ?>
<div class="description">
<header><?= htmlReady($bookmark['element']['title']) ?></header>
<div class="description-text-wrapper">
<p><?= htmlReady($bookmark['element']['payload']['description']) ?></p>
</div>
<footer>
<? if($bookmark['course']): ?>
<?= Icon::create('seminar', Icon::ROLE_INFO_ALT)?> <?= htmlReady($bookmark['course']['name'])?>
<? endif; ?>
<? if($bookmark['user']): ?>
<?= Icon::create('headache', Icon::ROLE_INFO_ALT)?> <?= htmlReady($bookmark['user']->getFullName())?>
<? endif; ?>
</footer>
</div>
</a>
</li>
<? endforeach; ?>
</ul>
<? else: ?>
<?= MessageBox::info(_('Sie haben noch keine Lesezeichen angelegt.')); ?>
<? endif; ?>
</div> </div>
<div class="cw-content-projects"> <div class="cw-content-courses">
<? if (empty($sem_courses)) : ?> <? if (empty($sem_courses)) : ?>
<? if (!$all_semesters) : ?> <? if (!$all_semesters) : ?>
<h2> <h2>
......
<div class="cw-content-projects"> <script>
<? if (!empty($elements)): ?> STUDIP.COURSEWARE_USERS_ROOT_ID = <?=$courseware_root->id ?>
<ul class="cw-tiles"> </script>
<? foreach ($elements as $element) :?> <div
<li class="tile <?= htmlReady($element['payload']['color'])?>"> id="courseware-content-overview-app"
<a href="<?= URLHelper::getLink('dispatch.php/contents/courseware/courseware#/structural_element/'.$element['id']) ?>"> entry-type="users"
<? if ($element->getImageUrl() === null) : ?> entry-id="<?= $user_id ?>"
<div class="preview-image default-image"></div> licenses='<?= $licenses ?>'
<? else : ?> >
<div class="preview-image" style="background-image: url(<?= htmlReady($element->getImageUrl()) ?>)" ></div>
<? endif; ?>
<div class="description">
<header><?= htmlReady($element['title']) ?></header>
<div class="description-text-wrapper">
<p>
<?= htmlReady($element['payload']['description']) ?>
</p>
</div>
<footer>
<?= sprintf(ngettext('%d Seite', '%d Seiten', $element->countChildren()), $element->countChildren()); ?>
</footer>
</div>
</a>
</li>
<? endforeach; ?>
</ul>
<? else : ?>
<div class="cw-contents-overview-teaser">
<div class="cw-contents-overview-teaser-content">
<header><?= _('Ihre persönlichen Lernmaterialien')?></header>
<p><?= _('Erstellen und Verwalten Sie hier ihre eigenen persönlichen Lernmaterialien in Form von ePorfolios,
Vorlagen für Veranstaltungen oder einfach nur persönliche Inhalte für das Studium.
Entwickeln Sie ihre eigenen (Lehr-)Materialien für Studium oder die Lehre und teilen diese mit anderen Nutzenden.')?></p>
<a class="button"
href="<?= $controller->link_for('contents/courseware/create_project', []) ?>"
data-dialog="size=700"
title="<?= _('Neues Lernmaterial anlegen') ?>">
<?= _('Neues Lernmaterial anlegen') ?>
</a>
</div>
</div>
<? endif; ?>
</div> </div>
<aside id="courseware-content-overview-action-widget" class="widget-sidebar"></aside>
\ No newline at end of file
<aside id="courseware-content-overview-filter-widget" class="widget-sidebar"></aside>
\ No newline at end of file
<script> <script>
STUDIP.courseware_progress_data = <?= json_encode($courseware_progress_data);?>; STUDIP.courseware_progress_data = <?= json_encode($courseware_progress_data);?>;
STUDIP.courseware_chapter_counter = <?= json_encode($courseware_chapter_counter);?>; STUDIP.courseware_chapter_counter = <?= json_encode($courseware_chapter_counter);?>;
STUDIP.is_teacher = <?= json_encode($is_teacher);?>;
</script> </script>
<div id="courseware-dashboard-app"></div> <div
id="courseware-dashboard-app"
entry-type="courses"
entry-id="<?= Context::getId() ?>"
>
</div>
<aside id="courseware-dashboard-view-widget" class="widget-sidebar"></aside>
\ No newline at end of file
<?php
class AddCoursewareTemplates extends \Migration
{
public function description()
{
return 'Create Courseware template database tables';
}
public function up()
{
$db = \DBManager::get();
$db->exec("CREATE TABLE `cw_templates` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`purpose` ENUM('content', 'template', 'oer', 'portfolio', 'draft', 'other') COLLATE latin1_bin,
`structure` MEDIUMTEXT NOT NULL,
`mkdate` int(11) NOT NULL,
`chdate` int(11) NOT NULL,
PRIMARY KEY (`id`)
)
");
}
public function down()
{
$db = \DBManager::get();
$db->exec("DROP TABLE IF EXISTS `cw_templates`");
}
}
<?php
class AddCoursewareTasks extends \Migration
{
public function description()
{
return 'Create Courseware Task database tables and settings';
}
public function up()
{
$db = \DBManager::get();
$db->exec("CREATE TABLE `cw_task_groups` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`seminar_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`lecturer_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`target_id` int(11) NOT NULL,
`task_template_id` int(11) NOT NULL,
`solver_may_add_blocks` tinyint(1) NOT NULL,
`title` varchar(255) NOT NULL,
`mkdate` int(11) NOT NULL,
`chdate` int(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX index_seminar_id (`seminar_id`),
INDEX index_lecturer_id (`lecturer_id`)
)
");
$db->exec("CREATE TABLE `cw_tasks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`task_group_id` int(11) NOT NULL,
`structural_element_id` int(11) NOT NULL,
`solver_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`solver_type` ENUM('autor', 'group') COLLATE latin1_bin,
`submission_date` int(11) NOT NULL,
`submitted` tinyint(1) NOT NULL,
`renewal` ENUM('pending', 'granted', 'declined') COLLATE latin1_bin,
`renewal_date` int(11) NOT NULL,
`feedback_id` int(11) NULL DEFAULT NULL,
`mkdate` int(11) NOT NULL,
`chdate` int(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX index_task_group_id (`task_group_id`),
INDEX index_structural_element_id (`structural_element_id`),
INDEX index_solver_id (`solver_id`)
)
");
$db->exec("CREATE TABLE `cw_task_feedbacks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`task_id` int(11) NOT NULL,
`lecturer_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`content` MEDIUMTEXT NOT NULL,
`mkdate` int(11) NOT NULL,
`chdate` int(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX index_task_id (`task_id`),
INDEX index_lecturer_id (`lecturer_id`)
)
");
$db->exec("ALTER TABLE `cw_structural_elements`
CHANGE `purpose` `purpose` ENUM('content','draft','task','template','oer','other','portfolio')
CHARACTER SET latin1 COLLATE latin1_bin NULL DEFAULT NULL;"
);
}
public function down()
{
$db = \DBManager::get();
$db->exec("DROP TABLE IF EXISTS `cw_tasks`, `cw_task_feedbacks`");
}
}
<?php
class AddCoursewareStructuralElementDiscussion extends \Migration
{
public function description()
{
return 'Create Courseware structural element database tables for discussions';
}
public function up()
{
$db = \DBManager::get();
$db->exec("CREATE TABLE `cw_structural_element_comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`structural_element_id` int(11) NOT NULL,
`user_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`comment` MEDIUMTEXT NOT NULL,
`mkdate` int(11) NOT NULL,
`chdate` int(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX index_structural_element_id (`structural_element_id`),
INDEX index_user_id (`user_id`)
)
");
$db->exec("CREATE TABLE `cw_structural_element_feedbacks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`structural_element_id` int(11) NOT NULL,
`user_id` char(32) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`feedback` MEDIUMTEXT NOT NULL,
`mkdate` int(11) NOT NULL,
`chdate` int(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX index_structural_element_id (`structural_element_id`),
INDEX index_user_id (`user_id`)
)
");
}
public function down()
{
$db = \DBManager::get();
$db->exec("DROP TABLE IF EXISTS `cw_structural_element_feedbacks`, `cw_structural_element_comments`");
}
}
\ No newline at end of file
...@@ -143,6 +143,7 @@ class Activity extends \SimpleORMap ...@@ -143,6 +143,7 @@ class Activity extends \SimpleORMap
'passed' => _('bestand %s'), 'passed' => _('bestand %s'),
'shared' => _('teilte %s'), 'shared' => _('teilte %s'),
'sent' => _('sendete %s'), 'sent' => _('sendete %s'),
'set' => _('stellte %s'),
'voided' => _('löschte %s') 'voided' => _('löschte %s')
]; ];
......
...@@ -39,5 +39,39 @@ class ActivityObserver ...@@ -39,5 +39,39 @@ class ActivityObserver
//Notifications for ScheduleProvider (Course) //Notifications for ScheduleProvider (Course)
\NotificationCenter::addObserver('\Studip\Activity\ScheduleProvider', 'postActivity','CourseDidChangeSchedule'); \NotificationCenter::addObserver('\Studip\Activity\ScheduleProvider', 'postActivity','CourseDidChangeSchedule');
// Notifications for CoursewareProvider
foreach (
[
\Courseware\Block::class,
\Courseware\BlockComment::class,
\Courseware\BlockFeedback::class,
\Courseware\StructuralElementComment::class,
\Courseware\StructuralElement::class,
\Courseware\StructuralElementFeedback::class,
\Courseware\Task::class,
\Courseware\TaskFeedback::class,
] as $class
) {
\NotificationCenter::addObserver(
\Studip\Activity\CoursewareProvider::class,
'postActivity',
$class . 'DidCreate'
);
}
foreach (
[
\Courseware\Block::class,
\Courseware\TaskFeedback::class
] as $class
) {
\NotificationCenter::addObserver(
\Studip\Activity\CoursewareProvider::class,
'postActivity',
$class . 'DidUpdate'
);
}
} }
} }
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