summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorFrederic Guillot <fred@kanboard.net>2016-02-16 22:06:53 -0500
committerFrederic Guillot <fred@kanboard.net>2016-02-16 22:06:53 -0500
commit924949850322144036e281bf94fb8b88c42bbd74 (patch)
tree5e57db68f507849bb8c7a92574fbe6a3f319c009 /app
parent4961805e0f8a8c3630ace144450fdd97048b3929 (diff)
Add file preview for Markdown and text files
Diffstat (limited to 'app')
-rw-r--r--app/Controller/FileViewer.php27
-rw-r--r--app/Helper/File.php22
-rw-r--r--app/ServiceProvider/AuthenticationProvider.php1
-rw-r--r--app/Template/file_viewer/show.php16
-rw-r--r--app/Template/project_overview/files.php20
-rw-r--r--app/Template/task_file/show.php20
6 files changed, 87 insertions, 19 deletions
diff --git a/app/Controller/FileViewer.php b/app/Controller/FileViewer.php
index 24ccc691..bc91c3d8 100644
--- a/app/Controller/FileViewer.php
+++ b/app/Controller/FileViewer.php
@@ -13,6 +13,30 @@ use Kanboard\Core\ObjectStorage\ObjectStorageException;
class FileViewer extends Base
{
/**
+ * Get file content from object storage
+ *
+ * @access private
+ * @param array $file
+ * @return string
+ */
+ private function getFileContent(array $file)
+ {
+ $content = '';
+
+ try {
+
+ if ($file['is_image'] == 0) {
+ $content = $this->objectStorage->get($file['path']);
+ }
+
+ } catch (ObjectStorageException $e) {
+ $this->logger->error($e->getMessage());
+ }
+
+ return $content;
+ }
+
+ /**
* Show file content in a popover
*
* @access public
@@ -20,6 +44,7 @@ class FileViewer extends Base
public function show()
{
$file = $this->getFile();
+ $type = $this->helper->file->getPreviewType($file['name']);
$params = array('file_id' => $file['id'], 'project_id' => $this->request->getIntegerParam('project_id'));
if ($file['model'] === 'taskFile') {
@@ -29,6 +54,8 @@ class FileViewer extends Base
$this->response->html($this->template->render('file_viewer/show', array(
'file' => $file,
'params' => $params,
+ 'type' => $type,
+ 'content' => $this->getFileContent($file),
)));
}
diff --git a/app/Helper/File.php b/app/Helper/File.php
index 6948fe6a..b493e64f 100644
--- a/app/Helper/File.php
+++ b/app/Helper/File.php
@@ -82,4 +82,26 @@ class File extends \Kanboard\Core\Base
return 'image/jpeg';
}
}
+
+ /**
+ * Get the preview type
+ *
+ * @access public
+ * @param string $filename
+ * @return string
+ */
+ public function getPreviewType($filename)
+ {
+ $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
+
+ switch ($extension) {
+ case 'md':
+ case 'markdown':
+ return 'markdown';
+ case 'txt':
+ return 'text';
+ }
+
+ return null;
+ }
}
diff --git a/app/ServiceProvider/AuthenticationProvider.php b/app/ServiceProvider/AuthenticationProvider.php
index cc7b9302..700fe05b 100644
--- a/app/ServiceProvider/AuthenticationProvider.php
+++ b/app/ServiceProvider/AuthenticationProvider.php
@@ -81,6 +81,7 @@ class AuthenticationProvider implements ServiceProviderInterface
$acl->add('Project', array('share', 'integrations', 'notifications', 'duplicate', 'disable', 'enable', 'remove'), Role::PROJECT_MANAGER);
$acl->add('ProjectPermission', '*', Role::PROJECT_MANAGER);
$acl->add('ProjectEdit', '*', Role::PROJECT_MANAGER);
+ $acl->add('ProjectFile', '*', Role::PROJECT_MEMBER);
$acl->add('Projectuser', '*', Role::PROJECT_MANAGER);
$acl->add('Subtask', '*', Role::PROJECT_MEMBER);
$acl->add('SubtaskRestriction', '*', Role::PROJECT_MEMBER);
diff --git a/app/Template/file_viewer/show.php b/app/Template/file_viewer/show.php
index e0d1b21e..c71ef91c 100644
--- a/app/Template/file_viewer/show.php
+++ b/app/Template/file_viewer/show.php
@@ -1,8 +1,14 @@
<div class="page-header">
<h2><?= $this->e($file['name']) ?></h2>
- <div class="task-file-viewer">
- <?php if ($file['is_image']): ?>
- <img src="<?= $this->url->href('FileViewer', 'image', $params) ?>" alt="<?= $this->e($file['name']) ?>">
- <?php endif ?>
- </div>
+</div>
+<div class="file-viewer">
+ <?php if ($file['is_image']): ?>
+ <img src="<?= $this->url->href('FileViewer', 'image', $params) ?>" alt="<?= $this->e($file['name']) ?>">
+ <?php elseif ($type === 'markdown'): ?>
+ <article class="markdown">
+ <?= $this->text->markdown($content) ?>
+ </article>
+ <?php elseif ($type === 'text'): ?>
+ <pre><?= $content ?></pre>
+ <?php endif ?>
</div> \ No newline at end of file
diff --git a/app/Template/project_overview/files.php b/app/Template/project_overview/files.php
index fea20ad6..03835f6b 100644
--- a/app/Template/project_overview/files.php
+++ b/app/Template/project_overview/files.php
@@ -24,16 +24,16 @@
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-text"><?= $this->e($file['name']) ?> <i class="fa fa-caret-down"></i></a>
<ul>
+ <li>
+ <i class="fa fa-download fa-fw"></i>
+ <?= $this->url->link(t('Download'), 'FileViewer', 'download', array('project_id' => $project['id'], 'file_id' => $file['id'])) ?>
+ </li>
<?php if ($this->user->hasProjectAccess('ProjectFile', 'remove', $project['id'])): ?>
<li>
<i class="fa fa-trash fa-fw"></i>
<?= $this->url->link(t('Remove'), 'ProjectFile', 'confirm', array('project_id' => $project['id'], 'file_id' => $file['id']), false, 'popover') ?>
</li>
<?php endif ?>
- <li>
- <i class="fa fa-download fa-fw"></i>
- <?= $this->url->link(t('Download'), 'FileViewer', 'download', array('project_id' => $project['id'], 'file_id' => $file['id'])) ?>
- </li>
</ul>
</div>
</div>
@@ -64,16 +64,22 @@
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-text"><?= $this->e($file['name']) ?> <i class="fa fa-caret-down"></i></a>
<ul>
- <?php if ($this->user->hasProjectAccess('ProjectFile', 'remove', $project['id'])): ?>
+ <?php if ($this->file->getPreviewType($file['name']) !== null): ?>
<li>
- <i class="fa fa-trash fa-fw"></i>
- <?= $this->url->link(t('Remove'), 'ProjectFile', 'confirm', array('project_id' => $project['id'], 'file_id' => $file['id']), false, 'popover') ?>
+ <i class="fa fa-eye fa-fw"></i>
+ <?= $this->url->link(t('View'), 'FileViewer', 'show', array('project_id' => $project['id'], 'file_id' => $file['id']), false, 'popover') ?>
</li>
<?php endif ?>
<li>
<i class="fa fa-download fa-fw"></i>
<?= $this->url->link(t('Download'), 'FileViewer', 'download', array('project_id' => $project['id'], 'file_id' => $file['id'])) ?>
</li>
+ <?php if ($this->user->hasProjectAccess('ProjectFile', 'remove', $project['id'])): ?>
+ <li>
+ <i class="fa fa-trash fa-fw"></i>
+ <?= $this->url->link(t('Remove'), 'ProjectFile', 'confirm', array('project_id' => $project['id'], 'file_id' => $file['id']), false, 'popover') ?>
+ </li>
+ <?php endif ?>
</ul>
</div>
</td>
diff --git a/app/Template/task_file/show.php b/app/Template/task_file/show.php
index 67d7a99c..8aa76520 100644
--- a/app/Template/task_file/show.php
+++ b/app/Template/task_file/show.php
@@ -14,16 +14,16 @@
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-text"><?= $this->e($file['name']) ?> <i class="fa fa-caret-down"></i></a>
<ul>
+ <li>
+ <i class="fa fa-download fa-fw"></i>
+ <?= $this->url->link(t('Download'), 'FileViewer', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?>
+ </li>
<?php if ($this->user->hasProjectAccess('TaskFile', 'remove', $task['project_id'])): ?>
<li>
<i class="fa fa-trash fa-fw"></i>
<?= $this->url->link(t('Remove'), 'TaskFile', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, 'popover') ?>
</li>
<?php endif ?>
- <li>
- <i class="fa fa-download fa-fw"></i>
- <?= $this->url->link(t('Download'), 'FileViewer', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?>
- </li>
</ul>
</div>
</div>
@@ -54,16 +54,22 @@
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-text"><?= $this->e($file['name']) ?> <i class="fa fa-caret-down"></i></a>
<ul>
- <?php if ($this->user->hasProjectAccess('TaskFile', 'remove', $task['project_id'])): ?>
+ <?php if ($this->file->getPreviewType($file['name']) !== null): ?>
<li>
- <i class="fa fa-trash fa-fw"></i>
- <?= $this->url->link(t('Remove'), 'TaskFile', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, 'popover') ?>
+ <i class="fa fa-eye fa-fw"></i>
+ <?= $this->url->link(t('View'), 'FileViewer', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, 'popover') ?>
</li>
<?php endif ?>
<li>
<i class="fa fa-download fa-fw"></i>
<?= $this->url->link(t('Download'), 'FileViewer', 'download', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id'])) ?>
</li>
+ <?php if ($this->user->hasProjectAccess('TaskFile', 'remove', $task['project_id'])): ?>
+ <li>
+ <i class="fa fa-trash fa-fw"></i>
+ <?= $this->url->link(t('Remove'), 'TaskFile', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'file_id' => $file['id']), false, 'popover') ?>
+ </li>
+ <?php endif ?>
</ul>
</div>
</td>