<?php /** * Class FilesystemVueDataManager is a manager that provides for a file or a folder * the data that the vue component FilesTable needs to display the file or folder. */ class FilesystemVueDataManager { /** * Provides for a file the data that the vue component FilesTable needs * to display that file. Data is provides as an array that can be easily * transferred into a JSON-object. * @param FileType $file : the file that should be displayed * @param FolderType $topFolder : The top-folder of that file * @return array of data */ public static function getFileVueData(FileType $file, FolderType $topFolder, $last_visitdate = null) { $isDownloadable = $file->isDownloadable($GLOBALS['user']->id); $terms = $file->getTermsOfUse(); $additionalColumns = []; foreach ((array) $topFolder->getAdditionalColumns() as $index => $name) { $additionalColumns[$index] = [ 'html' => (string) $file->getContentForAdditionalColumn($index), 'order' => $file->getAdditionalColumnOrderWeigh($index) ]; } $actionMenu = $file->getActionMenu(); return [ 'id' => $file->getId(), 'name' => $file->getFilename(), 'download_url' => $isDownloadable ? $file->getDownloadURL() : null, 'downloads' => $file->getDownloads(), 'mime_type' => $file->getMimeType(), 'icon' => $file->getIcon($isDownloadable ? Icon::ROLE_CLICKABLE : Icon::ROLE_INFO)->getShape(), 'size' => $file->getSize(), 'author_url' => $file->getUser() && $file->getUserId() !== $GLOBALS['user']->id ? URLHelper::getURL('dispatch.php/profile', ['username' => $file->getUser()->username], true) : "", 'author_name' => $file->getUserName() ?: '', 'author_id' => $file->getUserId(), 'chdate' => (int) $file->getLastChangeDate(), 'additionalColumns' => $additionalColumns, 'details_url' => URLhelper::getURL("dispatch.php/file/details/{$file->getId()}", ['file_navigation' => '1']), 'restrictedTermsOfUse' => $terms && !$terms->isDownloadable($topFolder->range_id, $topFolder->range_type, false), 'actions' => $actionMenu ? (is_string($actionMenu) ? $actionMenu : $actionMenu->render()) : "", 'new' => isset($last_visitdate) && $file->getLastChangeDate() > $last_visitdate && $file->getUserId() !== $GLOBALS['user']->id, 'isEditable' => $file->isEditable(), ]; } /** * Provides for a folder the data that the vue component FilesTable needs * to display that folder. Data is provides as an array that can be easily * transferred into a JSON-object. * @param FolderType $folder : the folder that should be displayed * @param FolderType $topFolder : The top-folder of that file * @return array of data */ public static function getFolderVueData(FolderType $folder, FolderType $topFolder) { $actionMenu = ActionMenu::get(); $actionMenu->addLink( URLHelper::getURL('dispatch.php/file/details/' . $folder->getId()), _('Info'), Icon::create('info-circle', 'clickable', ['size' => 20]), ['data-dialog' => '1'] ); if ($folder->isEditable($GLOBALS['user']->id)) { $actionMenu->addLink( URLHelper::getURL('dispatch.php/file/edit_folder/' . $folder->getId()), _('Ordner bearbeiten'), Icon::create('edit', 'clickable', ['size' => 20]), ['data-dialog' => '1'] ); } if ($folder->isReadable($GLOBALS['user']->id) && $GLOBALS['user']->id !== 'nobody') { $actionMenu->addLink( URLHelper::getURL('dispatch.php/file/download_folder/' . $folder->getId()), _('Ordner herunterladen'), Icon::create('download', 'clickable', ['size' => 20]) ); } if ($folder->isEditable($GLOBALS['user']->id)) { $actionMenu->addLink( URLHelper::getURL('dispatch.php/file/choose_destination/move/' . $folder->getId(), ['isfolder' => 1]), _('Ordner verschieben'), Icon::create('folder-empty+move_right', 'clickable', ['size' => 20]), ['data-dialog' => 'size=auto'] ); $actionMenu->addLink( URLHelper::getURL('dispatch.php/file/choose_destination/copy/' . $folder->getId(), ['isfolder' => 1]), _('Ordner kopieren'), Icon::create('folder-empty+add', 'clickable', ['size' => 20]), ['data-dialog' => 'size=auto'] ); $actionMenu->addLink( URLHelper::getURL('dispatch.php/file/delete_folder/' . $folder->getId()), _('Ordner löschen'), Icon::create('trash', 'clickable', ['size' => 20]), ['onclick' => "return STUDIP.Dialog.confirmAsPost('" . sprintf(_('Soll der Ordner "%s" wirklich gelöscht werden?'), htmlReady($folder->name)) . "', this.href);"] ); } $permissions = ""; if ($folder->isReadable($GLOBALS['user']->id)) { $permissions .= 'r'; } if ($folder->isEditable($GLOBALS['user']->id)) { $permissions .= 'w'; } if ($folder->isReadable($GLOBALS['user']->id)) { $permissions .= 'd'; } $additionalColumns = []; foreach ($topFolder->getAdditionalColumns() as $index => $name) { $additionalColumns[$index] = [ 'html' => (string) $folder->getContentForAdditionalColumn($index), 'order' => $folder->getAdditionalColumnOrderWeigh($index) ]; } $controllerpath = 'files/index'; if (is_numeric($topFolder->range_type)) { //plugin: $controllerpath = 'files/system/' . $topFolder->range_type; } elseif ($topFolder->range_type !== 'user') { $controllerpath = $topFolder->range_type . '/' . $controllerpath; } $vue_folder = [ 'id' => $folder->getId(), 'icon' => $folder->getIcon(Icon::ROLE_CLICKABLE)->getShape(), 'name' => $folder->name, 'url' => URLhelper::getURL('dispatch.php/' . $controllerpath . '/' . $folder->getId()), 'user_id' => $folder->user_id, 'author_name' => $folder->owner ? $folder->owner->getFullname('no_title_rev') : '', 'author_url' => $folder->owner && $folder->owner->id !== $GLOBALS['user']->id? URLHelper::getURL('dispatch.php/profile', ['username' => $folder->owner->username]) : '', 'chdate' => (int) $folder->chdate, 'actions' => $actionMenu->render(), 'mime_type' => get_class($folder), 'permissions' => $permissions, 'additionalColumns' => $additionalColumns ]; return $vue_folder; } }