37 protected \ILIAS\DI\UIServices
$ui;
44 public function __construct($a_id = 0, $a_id_type = self::REPOSITORY_NODE_ID, $a_parent_node_id = 0)
49 $this->
lng = $DIC->language();
50 $this->
lng->loadLanguageModule(
"pwsp");
51 $this->
help = $DIC[
"ilHelp"];
52 $this->tpl =
$DIC->ui()->mainTemplate();
53 $this->
user = $DIC->user();
54 $this->
tabs = $DIC->tabs();
55 $this->
ctrl = $DIC->ctrl();
56 $this->
ui = $DIC->ui();
58 $this->repo_gui_service =
$DIC->repository()->gui();
72 $this->requested_sortation = $this->std_request->getSortation();
74 $this->
lng->loadLanguageModule(
"cntr");
82 protected function setTabs(
bool $a_show_settings =
true): void
89 $this->
ctrl->setParameter($this,
"wsp_id", $this->node_id);
91 $this->tabs_gui->addTab(
94 $this->ctrl->getLinkTarget($this,
"")
97 $this->
ctrl->setParameterByClass(
98 "ilObjWorkspaceRootFolderGUI",
103 $this->tabs_gui->addTab(
106 $this->ctrl->getLinkTargetByClass(
"ilObjWorkspaceRootFolderGUI",
"shareFilter")
109 $this->tabs_gui->addTab(
111 $lng->
txt(
"wsp_tab_ownership"),
112 $this->ctrl->getLinkTargetByClass(array(
"ilObjWorkspaceRootFolderGUI",
"ilObjectOwnershipManagementGUI"),
"listObjects")
115 if (!$this->
ctrl->getNextClass($this)) {
116 if (stristr($this->
ctrl->getCmd(),
"share")) {
117 $this->tabs_gui->activateTab(
"share");
119 $this->tabs_gui->activateTab(
"wsp");
147 $this->tabs_gui->addSubTab(
150 $this->ctrl->getLinkTarget($this,
"edit")
164 $this->
ctrl->redirect($this,
"");
170 $this->
ctrl->redirect($this,
"");
175 $next_class = $this->
ctrl->getNextClass($this);
176 $cmd = $this->
ctrl->getCmd();
178 switch ($next_class) {
179 case "ilcommonactiondispatchergui":
181 $this->
ctrl->forwardCommand($gui);
184 case "ilobjectownershipmanagementgui":
186 $this->tabs_gui->activateTab(
"ownership");
187 $gui = $this->repo_gui_service->ownershipManagementGUI();
188 $this->
ctrl->forwardCommand($gui);
193 if ($this->type !=
"wsrt") {
213 $this->session_repo->clearClipboard();
224 $this->
ctrl->getLinkTargetByClass(array(
"ilcommonactiondispatchergui",
"iltagginggui"),
"",
"",
true,
false)
235 $this->obj_definition,
237 $this->user_folder_settings
242 $exp->setTypeWhiteList(array(
"wsrt",
"wfld"));
243 $exp->setSelectableTypes(array(
"wsrt",
"wfld"));
244 $exp->setLinkToNodeClass(
true);
245 $exp->setActivateHighlighting(
true);
246 if ($exp->handleCommand()) {
249 $left = $exp->getHTML();
258 $this->tabs_gui->activateTab(
"wsp");
259 $this->tabs_gui->activateSubTab(
"settings");
266 $this->tabs_gui->activateTab(
"wsp");
267 $this->tabs_gui->activateSubTab(
"settings");
270 public function cut(): void
272 $item_ids = $this->std_request->getItemIds();
273 if (count($item_ids) == 0) {
274 $this->tpl->setOnScreenMessage(
'failure', $this->
lng->txt(
"no_checkbox"),
true);
275 $this->
ctrl->redirect($this);
280 $repo_switch_allowed =
true;
281 foreach ($item_ids as $item_id) {
282 foreach ($this->tree->getSubTree($this->tree->getNodeData($item_id)) as $node) {
284 $repo_switch_allowed =
false;
288 $no_cut[$node[
"wsp_id"]] = $obj->getTitle();
293 if (count($no_cut)) {
294 $this->tpl->setOnScreenMessage(
'failure', $this->
lng->txt(
"msg_no_perm_cut") .
" " . implode(
',', $no_cut),
true);
295 $this->
ctrl->redirect($this);
299 $this->session_repo->setClipboardSourceIds($item_ids);
300 $this->session_repo->setClipboardCmd(
'cut');
307 $this->session_repo->setClipboardWsp2Repo(
true);
313 $this->session_repo->setClipboardWsp2Repo(
false);
321 $item_ids = $this->std_request->getItemIds();
322 if (count($item_ids) == 0) {
323 $this->tpl->setOnScreenMessage(
'failure', $this->
lng->txt(
"no_checkbox"),
true);
324 $this->
ctrl->redirect($this);
328 $this->
ctrl->setParameter($this,
"wsp_id", $this->node_id);
330 $repo_switch_allowed =
true;
331 foreach ($item_ids as $item_id) {
332 $node = $this->tree->getNodeData($item_id);
334 $repo_switch_allowed =
false;
336 $current_node = $item_id;
337 $owner = $this->tree->lookupOwner($current_node);
338 if ($owner != $ilUser->getId()) {
339 $this->tpl->setOnScreenMessage(
'failure', $this->
lng->txt(
'permission_denied'),
true);
340 $this->
ctrl->redirect($this);
342 if (!$this->obj_definition->allowCopy($node[
"type"])) {
343 $this->tpl->setOnScreenMessage(
347 $this->
lng->txt(
"obj_" . $node[
"type"]),
348 $this->lng->txt(
"pwsp_type_cannot_be_copied")
352 $this->
ctrl->redirect($this);
357 $this->session_repo->setClipboardSourceIds($item_ids);
358 $this->session_repo->setClipboardCmd(
'copy');
365 $ids = $this->std_request->getItemIds();
366 if (count($ids) != 1) {
367 $this->
ctrl->redirect($this,
"share");
370 $current_node = current($ids);
373 if (
$handler->checkAccess(
"read",
"", $current_node)) {
375 $this->session_repo->setClipboardSourceIds([$current_node]);
376 $this->session_repo->setClipboardCmd(
'copy');
377 $this->session_repo->setClipboardShared(
true);
381 $perms =
$handler->getPermissions($current_node);
388 $this->tpl->setOnScreenMessage(
'failure', $this->
lng->txt(
'permission_denied'),
true);
389 $this->
ctrl->redirect($this,
"share");
394 $this->session_repo->setClipboardWsp2Repo(
true);
400 $this->session_repo->setClipboardWsp2Repo(
false);
409 $ilTabs->clearTargets();
411 if (!$this->session_repo->getClipboardShared()) {
412 $ilTabs->setBackTarget(
413 $this->
lng->txt(
'back'),
414 $this->ctrl->getLinkTarget($this)
417 $ilTabs->setBackTarget(
418 $this->
lng->txt(
'back'),
419 $this->ctrl->getLinkTarget($this,
'share')
423 $mode = $this->session_repo->getClipboardCmd();
425 $this->tpl->setOnScreenMessage(
'info', $this->
lng->txt(
'msg_' . $mode .
'_clipboard'));
427 $this->tpl->addBlockFile(
430 'tpl.paste_into_multiple_objects.html',
431 "components/ILIAS/WorkspaceFolder"
435 if (!$this->session_repo->getClipboardWsp2Repo()) {
437 $exp->setTypeWhiteList(array(
"wsrt",
"wfld"));
438 $exp->setSelectableTypes(array(
"wsrt",
"wfld"));
439 $exp->setSelectMode(
"node",
false);
440 if ($exp->handleCommand()) {
443 $this->tpl->setVariable(
'OBJECT_TREE', $exp->getHTML());
446 if ($repo_switch_allowed) {
447 $switch_cmd = ($mode ==
"cut")
448 ?
"cut_for_repository"
449 :
"copy_to_repository";
450 $this->tpl->setCurrentBlock(
"switch_button");
451 $this->tpl->setVariable(
'CMD_SWITCH', $switch_cmd);
452 $this->tpl->setVariable(
'TXT_SWITCH', $this->
lng->txt(
'wsp_switch_to_repo_tree'));
453 $this->tpl->parseCurrentBlock();
455 foreach ($this->std_request->getItemIds() as
$id) {
456 $this->tpl->setCurrentBlock(
"hidden");
457 $this->tpl->setVariable(
'VALUE', (
string)
$id);
458 $this->tpl->parseCurrentBlock();
467 'paste_' . $mode .
'_repexpand'
469 $exp->setTargetGet(
'ref_id');
471 if ($this->std_request->getPasteExpand($mode) ==
'') {
474 $expanded = $this->std_request->getPasteExpand($mode);
476 $exp->setCheckedItems(array($this->std_request->getNode()));
477 $exp->setExpandTarget($this->
ctrl->getLinkTarget($this,
'showMoveIntoObjectTree'));
478 $exp->setPostVar(
'node');
479 $exp->setExpand($expanded);
481 $this->tpl->setVariable(
'OBJECT_TREE', $exp->getOutput());
483 if (in_array($mode, [
"copy",
"cut"])) {
484 $switch_cmd = ($mode ==
"cut")
485 ?
"cut_for_workspace"
486 :
"copy_to_workspace";
487 $this->tpl->setCurrentBlock(
"switch_button");
488 $this->tpl->setVariable(
'CMD_SWITCH', $switch_cmd);
489 $this->tpl->setVariable(
'TXT_SWITCH', $this->
lng->txt(
'wsp_switch_to_wsp_tree'));
490 $this->tpl->parseCurrentBlock();
492 foreach ($this->std_request->getItemIds() as
$id) {
493 $this->tpl->setCurrentBlock(
"hidden");
494 $this->tpl->setVariable(
'VALUE', (
string)
$id);
495 $this->tpl->parseCurrentBlock();
503 $this->tpl->setVariable(
'FORM_TARGET',
'_top');
504 $this->tpl->setVariable(
506 $this->
ctrl->getFormAction($this,
'performPasteIntoMultipleObjects')
509 $this->tpl->setVariable(
'CMD_SUBMIT',
'performPasteIntoMultipleObjects');
510 $this->tpl->setVariable(
'TXT_SUBMIT', $this->
lng->txt(
'paste'));
517 $mode = $this->session_repo->getClipboardCmd();
518 $source_node_ids = $this->session_repo->getClipboardSourceIds();
519 $target_node_id = $this->std_request->getNode();
521 if (!is_array($source_node_ids) || count($source_node_ids) == 0) {
522 $this->tpl->setOnScreenMessage(
'failure', $this->
lng->txt(
'select_at_least_one_object'),
true);
523 $this->
ctrl->redirect($this);
525 if (!$target_node_id) {
526 $this->tpl->setOnScreenMessage(
'failure', $this->
lng->txt(
'select_at_least_one_object'),
true);
527 $this->
ctrl->redirect($this,
"showMoveIntoObjectTree");
530 if (!$this->session_repo->getClipboardWsp2Repo()) {
531 $target_obj_id = $this->tree->lookupObjectId($target_node_id);
538 foreach ($source_node_ids as $source_node_id) {
540 $source_obj_id = $this->tree->lookupObjectId($source_node_id);
545 if ($source_node_id == $target_node_id) {
547 $this->
lng->txt(
'msg_obj_exists_in_folder'),
548 $source_object->getTitle(),
549 $target_object->getTitle()
553 if (!in_array($source_object->getType(), array_keys($target_object->getPossibleSubObjects()))) {
555 $this->
lng->txt(
'msg_obj_may_not_contain_objects_of_type'),
556 $target_object->getTitle(),
557 $source_object->getType()
562 $owner = $this->tree->lookupOwner($source_node_id);
563 if ($mode ==
"copy" && $ilUser->getId() == $owner && !$this->checkPermissionBool(
'copy',
'',
'', $source_node_id)) {
564 $fail[] = $this->
lng->txt(
'permission_denied');
567 if (!$this->session_repo->getClipboardWsp2Repo()) {
568 if ($mode ==
"cut" && $this->tree->isGrandChild($source_node_id, $target_node_id)) {
570 $this->
lng->txt(
'msg_paste_object_not_in_itself'),
571 $source_object->getTitle()
576 if ($this->session_repo->getClipboardWsp2Repo() ==
true) {
578 if (!$ilAccess->checkAccess(
"create",
"", $target_node_id, $source_object->getType())) {
580 $this->
lng->txt(
'msg_no_perm_paste_object_in_folder'),
581 $source_object->getTitle(),
582 $target_object->getTitle()
586 if (!$this->
checkPermissionBool(
'create',
'', $source_object->getType(), $target_node_id)) {
588 $this->
lng->txt(
'msg_no_perm_paste_object_in_folder'),
589 $source_object->getTitle(),
590 $target_object->getTitle()
597 $this->tpl->setOnScreenMessage(
'failure', implode(
"<br />", $fail),
true);
598 $this->
ctrl->redirect($this);
601 foreach ($source_node_ids as $source_node_id) {
603 if ($ilUser->getId() != $owner && $mode ==
"copy") {
606 $node_data = $source_tree->getNodeData($source_node_id);
610 if ($mode ==
"cut") {
611 if (!$this->session_repo->getClipboardWsp2Repo()) {
612 $this->tree->moveTree($source_node_id, $target_node_id);
614 $parent_id = $this->tree->getParentId($source_node_id);
618 $this->tree->deleteReference($source_node_id);
619 $source_node = $this->tree->getNodeData($source_node_id);
620 $this->tree->deleteTree($source_node);
623 $source_object->createReference();
624 $source_object->putInTree($target_node_id);
625 $source_object->setPermissions($target_node_id);
630 elseif ($mode ==
"copy") {
633 $this->wsp_log->debug(
"Copy ID: " . $copy_id .
", Source Node: " . $source_node_id
634 .
", source object: " . $source_object->getId());
635 if (!$this->session_repo->getClipboardWsp2Repo()) {
636 $wizard_options->disableTreeCopy();
638 $wizard_options->saveOwner($ilUser->getId());
639 $wizard_options->saveRoot($source_node_id);
640 $wizard_options->read();
642 $new_obj = $source_object->cloneObject($target_node_id, $copy_id);
644 if ($new_obj && !$this->session_repo->getClipboardWsp2Repo()) {
645 $this->wsp_log->debug(
"New Obj ID: " . $new_obj->getId());
646 $new_obj_node_id = $this->tree->insertObject($target_node_id, $new_obj->getId());
647 $this->
getAccessHandler()->setPermissions($target_node_id, $new_obj_node_id);
650 $wizard_options->deleteAll();
655 if (!$this->session_repo->getClipboardWsp2Repo()) {
663 $this->session_repo->clearClipboard();
666 if ($mode ==
'cut') {
667 $this->tpl->setOnScreenMessage(
'success', $this->
lng->txt(
'msg_cut_copied'),
true);
669 $this->tpl->setOnScreenMessage(
'success', $this->
lng->txt(
'msg_cloned'),
true);
672 $this->
ctrl->setParameter($this,
"wsp_id", $redirect_node);
673 $this->
ctrl->redirect($this);
681 public function share(
bool $a_load_data =
true): void
693 $tbl->writeFilterToSession();
716 $ilTabs->clearTargets();
717 $ilTabs->setBackTarget(
719 $this->ctrl->getLinkTarget($this,
"share")
734 $this->
ctrl->setParameter($this,
"item_ref_id", $a_node_id);
736 $object_data = $this->
getAccessHandler()->getObjectDataFromNode($a_node_id);
739 $form->setFormAction($ilCtrl->getFormAction($this,
"checkPassword"));
740 $form->setTitle(
$lng->
txt(
"wsp_password_for") .
": " . $object_data[
"title"]);
743 $password->setRetype(
false);
744 $password->setRequired(
true);
745 $password->setSkipSyntaxCheck(
true);
746 $form->addItem($password);
748 $form->addCommandButton(
"checkPassword",
$lng->
txt(
"submit"));
749 $form->addCommandButton(
"share",
$lng->
txt(
"cancel"));
758 $ids = $this->std_request->getItemIds();
759 if (count($ids) != 1) {
760 $this->
ctrl->redirect($this,
"share");
765 if ($form->checkInput()) {
767 $input = md5($form->getInput(
"password"));
768 if ($input == $password) {
772 $this->
ctrl->setParameter($this,
"item_ref_id",
$node_id);
773 $this->
ctrl->redirect($this,
"copyShared");
775 $item = $form->getItemByPostVar(
"password");
776 $item->setAlert(
$lng->
txt(
"wsp_invalid_password"));
777 $this->tpl->setOnScreenMessage(
'failure',
$lng->
txt(
"form_input_not_valid"));
781 $form->setValuesByPost();
785 public static function _goto(
string $a_target): void
789 $id = explode(
"_", $a_target);
791 "ilsharedresourceGUI",
803 $tbl->writeFilterToSession();
814 $item_ids = $this->std_request->getItemIds();
816 if (count($item_ids) == 0) {
817 $this->tpl->setOnScreenMessage(
'failure',
$lng->
txt(
"no_checkbox"),
true);
818 $this->
ctrl->redirect($this,
"");
826 $cgui->setHeaderText(
$lng->
txt(
"info_delete_sure") .
"<br/>" .
827 $lng->
txt(
"info_delete_warning_no_trash"));
829 $cgui->setFormAction($this->
ctrl->getFormAction($this));
830 $cgui->setCancel(
$lng->
txt(
"cancel"),
"cancelDeletion");
831 $cgui->setConfirm(
$lng->
txt(
"confirm"),
"confirmedDelete");
834 $children = $this->tree->getSubTree($this->tree->getNodeData(
$node_id));
835 foreach ($children as $child) {
843 $this->tpl->setOnScreenMessage(
'failure',
$lng->
txt(
"msg_no_perm_delete") .
" " . $title,
true);
844 $this->
ctrl->redirect($this);
862 $this->session_repo->clearClipboard();
863 parent::cancelDelete();
877 $main_tpl =
$DIC->ui()->mainTemplate();
881 if (!$this->session_repo->isClipboardEmpty()) {
883 $main_tpl->setPageFormAction($this->
ctrl->getFormAction($this));
886 $this->
ctrl->setParameter($this,
"type",
"");
887 $this->
ctrl->setParameter($this,
"item_ref_id",
"");
890 $this->
lng->txt(
'paste_clipboard_items'),
895 $this->
lng->txt(
'clear_clipboard'),
899 $main_tpl->addAdminPanelToolbar(
$toolbar,
true,
false);
902 $main_tpl->setPageFormAction($this->
ctrl->getFormAction($this));
905 $this->
ctrl->setParameter($this,
"type",
"");
906 $this->
ctrl->setParameter($this,
"item_ref_id",
"");
908 if ($this->
object->gotItems($this->node_id)) {
914 $this->
lng->txt(
'delete_selected_items'),
918 $this->
lng->txt(
'move_selected_items'),
922 $this->
lng->txt(
'copy_selected_items'),
926 $this->
lng->txt(
'download_selected_items'),
932 $main_tpl->addAdminPanelToolbar(
934 $this->
object->gotItems($this->node_id) && $this->session_repo->isClipboardEmpty(),
935 ($this->object->gotItems($this->node_id) && $this->session_repo->isClipboardEmpty())
939 if ($this->
object->gotItems($this->node_id)) {
940 $main_tpl->setPageFormAction($this->
ctrl->getFormAction($this));
951 $this->user_folder_settings->updateSortation($this->
object->getId(), $this->requested_sortation);
952 $this->
ctrl->redirect($this,
"");
959 $initiated_by_folder_action =
false;
961 $ids = $this->std_request->getItemIds();
963 if (count($ids) == 0) {
964 $this->
ctrl->redirect($this,
"");
970 if ($download_job->run()) {
971 $this->tpl->setOnScreenMessage(
'success', $this->
lng->txt(
'msg_bt_download_started'),
true);
973 $this->
ctrl->redirect($this);
980 $title = $this->
lng->txt(
'personal_resources');
994 $filtered_object_types = [];
995 foreach (array_keys($object_types) as
$type) {
996 if (isset($settings_map[
$type])
997 && $this->
settings->get(
"disable_wsp_" . $settings_map[
$type])) {
1004 return $filtered_object_types;
1009 $icon = $this->ui_factory->symbol()->icon()->custom(
1014 $this->
ctrl->setParameterByClass(self::class,
'new_type',
$type);
1016 AddNewItemElementTypes::Object,
1017 $this->
lng->txt(
'wsp_type_' . $type),
1019 new \
ILIAS\Data\URI(ILIAS_HTTP_PATH .
'/' . $this->
ctrl->getLinkTargetByClass(self::class,
'create'))
1021 $this->
ctrl->clearParameterByClass(self::class,
'new_type',
$type);
Render add new item selector.
Workspace clipboard session repository.
static getInstanceFromAjaxCall()
(Re-)Build instance from ajax call
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _allocateCopyId()
Allocate a copy for further entries.
static _getInstance(int $a_copy_id)
redirectByClass( $a_class, ?string $a_cmd=null, ?string $a_anchor=null, bool $is_async=false)
@inheritDoc
getLinkTarget(object $a_gui_obj, ?string $a_cmd=null, ?string $a_anchor=null, bool $is_async=false, bool $has_xml_style=false)
@inheritDoc
setParameterByClass(string $a_class, string $a_parameter, $a_value)
@inheritDoc
Background task for downloads.
static getASCIIFilename(string $a_filename)
setScreenIdComponent(string $a_comp)
loadLanguageModule(string $a_module)
Load language module.
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
static getLogger(string $a_component_id)
Get component logger.
Component logger with individual log levels by component id.
Class ilObjWorkspaceFolderGUI.
getType()
Functions that must be overwritten.
StandardGUIRequest $std_request
__construct($a_id=0, $a_id_type=self::REPOSITORY_NODE_ID, $a_parent_node_id=0)
buildObjectType(string $type)
setTabs(bool $a_show_settings=true)
setSortation()
Set sortation.
performPasteIntoMultipleObjects()
initPasswordForm(int $a_node_id)
ilWorkspaceFolderUserSettings $user_folder_settings
static _goto(string $a_target)
setAdministrationPanel(bool $active)
isActiveAdministrationPanel()
buildAvailableObjectTypes()
listSharedResourcesOfOtherUser()
showMoveIntoObjectTree(bool $repo_switch_allowed=false)
ILIAS Repository ExternalGUIService $repo_gui_service
WorkspaceSessionRepository $session_repo
share(bool $a_load_data=true)
addContentSubTabs(bool $a_show_settings)
showAdministrationPanel()
passwordForm(int $a_node_id, ?ilPropertyFormGUI $form=null)
executeCommand()
execute command
New implementation of ilObjectGUI.
ilGlobalTemplateInterface $tpl
checkPermissionBool(string $perm, string $cmd="", string $type="", ?int $node_id=null)
prepareOutput(bool $show_sub_objects=true)
static getClassByType(string $obj_type)
static getInstanceByObjId(?int $obj_id, bool $stop_on_error=true)
get an instance of an Ilias object by object id
addHeaderAction()
Add header action menu.
static prepareJsLinks(string $redraw_url, string $notes_url, string $tags_url, ?ilGlobalTemplateInterface $tpl=null)
Insert js/ajax links into template.
static _lookupType(int $id, bool $reference=false)
static _getIcon(int $obj_id=0, string $size="big", string $type="", bool $offline=false)
Get icon for repository item.
static _lookupObjId(int $ref_id)
ilPasteIntoMultipleItemsExplorer Explorer
static get(string $a_var)
static set(string $a_var, $a_val)
Set a value.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
activateSubTab(string $a_id)
addSubTab(string $a_id, string $a_text, string $a_link, string $a_frame="")
static getImagePath(string $image_name, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
const PERMISSION_ALL_PASSWORD
static getSharedNodePassword(int $a_node_id)
static keepSharedSessionPassword(int $a_node_id, string $a_password)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Explorer for selecting a personal workspace item.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Workspace share handler table GUI class.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setDescription(string $a_descr)
Sets description below title in standard template.
setLeftNavContent(string $a_content)
Sets content of left navigation column.
setTitle(string $a_title, bool $hidden=false)
Sets title in standard template.
setContent(string $a_html)
Sets content for standard template.
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.