Skip to content

Commit

Permalink
Return JSON instead of compiled HTML
Browse files Browse the repository at this point in the history
  • Loading branch information
nickvergessen committed Jul 3, 2015
1 parent 8d22b74 commit 70a191f
Show file tree
Hide file tree
Showing 6 changed files with 218 additions and 58 deletions.
11 changes: 7 additions & 4 deletions appinfo/application.php
Expand Up @@ -187,10 +187,10 @@ public function __construct (array $urlParams = array()) {

return new Settings(
$c->query('AppName'),
$c->query('Request'),
$server->getRequest(),
$server->getConfig(),
$server->getSecureRandom()->getMediumStrengthGenerator(),
$c->query('URLGenerator'),
$server->getURLGenerator(),
$c->query('ActivityData'),
$c->query('UserSettings'),
$c->query('ActivityL10N'),
Expand All @@ -204,13 +204,16 @@ public function __construct (array $urlParams = array()) {

return new Activities(
$c->query('AppName'),
$c->query('Request'),
$server->getRequest(),
$c->query('ActivityData'),
$c->query('DisplayHelper'),
$c->query('GroupHelper'),
$c->query('Navigation'),
$c->query('UserSettings'),
$server->getDateTimeFormatter(),
$server->getPreviewManager(),
$server->getURLGenerator(),
new View(''),
$c->query('CurrentUID')
);
});
Expand All @@ -221,7 +224,7 @@ public function __construct (array $urlParams = array()) {

return new Feed(
$c->query('AppName'),
$c->query('Request'),
$server->getRequest(),
$c->query('ActivityData'),
$c->query('GroupHelperSingleEntries'),
$c->query('UserSettings'),
Expand Down
1 change: 1 addition & 0 deletions appinfo/routes.php
Expand Up @@ -39,5 +39,6 @@
['name' => 'Settings#feed', 'url' => '/settings/feed', 'verb' => 'POST'],
['name' => 'Activities#showList', 'url' => '/', 'verb' => 'GET'],
['name' => 'Activities#fetch', 'url' => '/activities/fetch', 'verb' => 'GET'],
['name' => 'Activities#fetchJson', 'url' => '/activities/fetchJson', 'verb' => 'GET'],
['name' => 'Feed#show', 'url' => '/rss.php', 'verb' => 'GET'],
]]);
101 changes: 101 additions & 0 deletions controller/activities.php
Expand Up @@ -23,15 +23,21 @@

namespace OCA\Activity\Controller;

use OC\Files\View;
use OCA\Activity\Data;
use OCA\Activity\Display;
use OCA\Activity\GroupHelper;
use OCA\Activity\Navigation;
use OCA\Activity\UserSettings;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\Files;
use OCP\IDateTimeFormatter;
use OCP\IPreview;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\Template;

class Activities extends Controller {
const DEFAULT_PAGE_SIZE = 30;
Expand All @@ -54,6 +60,15 @@ class Activities extends Controller {
/** @var IDateTimeFormatter */
protected $dateTimeFormatter;

/** @var IPreview */
protected $preview;

/** @var IURLGenerator */
protected $urlGenerator;

/** @var View */
protected $view;

/** @var string */
protected $user;

Expand All @@ -68,6 +83,9 @@ class Activities extends Controller {
* @param Navigation $navigation
* @param UserSettings $settings
* @param IDateTimeFormatter $dateTimeFormatter
* @param IPreview $preview
* @param IURLGenerator $urlGenerator
* @param View $view
* @param string $user
*/
public function __construct($appName,
Expand All @@ -78,6 +96,9 @@ public function __construct($appName,
Navigation $navigation,
UserSettings $settings,
IDateTimeFormatter $dateTimeFormatter,
IPreview $preview,
IURLGenerator $urlGenerator,
View $view,
$user) {
parent::__construct($appName, $request);
$this->data = $data;
Expand All @@ -86,6 +107,9 @@ public function __construct($appName,
$this->navigation = $navigation;
$this->settings = $settings;
$this->dateTimeFormatter = $dateTimeFormatter;
$this->preview = $preview;
$this->urlGenerator = $urlGenerator;
$this->view = $view;
$this->user = $user;
}

Expand Down Expand Up @@ -122,4 +146,81 @@ public function fetch($page, $filter = 'all') {
'dateTimeFormatter' => $this->dateTimeFormatter,
], '');
}

/**
* @NoAdminRequired
*
* @param int $page
* @param string $filter
* @return TemplateResponse
*/
public function fetchJson($page, $filter = 'all') {
$pageOffset = $page - 1;
$filter = $this->data->validateFilter($filter);

$activities = $this->data->read($this->helper, $this->settings, $pageOffset * self::DEFAULT_PAGE_SIZE, self::DEFAULT_PAGE_SIZE, $filter);

$preparedActivities = [];
foreach ($activities as $activity) {
$activity['relativeTimestamp'] = (string) Template::relative_modified_date($activity['timestamp'], true);
$activity['readableTimestamp'] = (string) $this->dateTimeFormatter->formatDate($activity['timestamp']);
$activity['relativeDateTimestamp'] = (string) Template::relative_modified_date($activity['timestamp']);
$activity['readableDateTimestamp'] = (string) $this->dateTimeFormatter->formatDateTime($activity['timestamp']);

if (strpos($activity['subjectformatted']['markup']['trimmed'], '<a ') !== false) {
// We do not link the subject as we create links for the parameters instead
$activity['link'] = '';
}

if ($activity['file']) {
$this->view->chroot('/' . $activity['affecteduser'] . '/files');
$exist = $this->view->file_exists($activity['file']);
$is_dir = $this->view->is_dir($activity['file']);
$activity['preview'] = [
'link' => $this->getPreviewLink($activity['file'], $is_dir),
'source' => '',
'isMimeTypeIcon' => true,
];

// show a preview image if the file still exists
if ($is_dir) {
$activity['preview']['source'] = Template::mimetype_icon('dir');
} else {
$mimeType = Files::getMimeType($activity['file']);
if (!$is_dir && $mimeType && $this->preview->isMimeSupported($mimeType) && $exist) {
$activity['preview']['isMimeTypeIcon'] = false;
$activity['preview']['source'] = $this->urlGenerator->linkToRoute('core_ajax_preview', [
'file' => $activity['file'],
'x' => 150,
'y' => 150,
]);
} else {
$activity['preview']['source'] = Template::mimetype_icon($mimeType);
}
}
}

$preparedActivities[] = $activity;
}

return new JSONResponse($preparedActivities);
}

/**
* @param string $path
* @param bool $isDir
* @return string
*/
protected function getPreviewLink($path, $isDir) {
if ($isDir) {
return $this->urlGenerator->linkTo('files', 'index.php', array('dir' => $path));
} else {
$parentDir = (substr_count($path, '/') === 1) ? '/' : dirname($path);
$fileName = basename($path);
return $this->urlGenerator->linkTo('files', 'index.php', array(
'dir' => $parentDir,
'scrollto' => $fileName,
));
}
}
}
3 changes: 2 additions & 1 deletion css/style.css
Expand Up @@ -97,7 +97,8 @@
margin-left: 24px;
}

.box .preview-dir-icon{
.box .preview-dir-icon,
.box .preview-mimetype-icon {
width: 32px;
height: 32px;
}
Expand Down
136 changes: 89 additions & 47 deletions js/script.js
Expand Up @@ -33,36 +33,18 @@ $(function(){
OCActivity.InfinitScrolling = {
ignoreScroll: false,
container: $('#container'),
lastDateGroup: null,
content: $('#app-content'),

prefill: function () {
if (this.content.scrollTop() + this.content.height() > this.container.height() - 100) {
OCActivity.Filter.currentPage++;

$.get(
OC.generateUrl('/apps/activity/activities/fetch'),
OC.generateUrl('/apps/activity/activities/fetchJson'),
'filter=' + OCActivity.Filter.filter + '&page=' + OCActivity.Filter.currentPage,
function (data) {
if (data.trim().length) {
OCActivity.InfinitScrolling.appendContent(data);

// Continue prefill
OCActivity.InfinitScrolling.prefill();
} else if (OCActivity.Filter.currentPage == 1) {
// First page is empty - No activities :(
var $emptyContent = $('#emptycontent');
$emptyContent.removeClass('hidden');
if (OCActivity.Filter.filter == 'all') {
$emptyContent.find('p').text(t('activity', 'This stream will show events like additions, changes & shares'));
} else {
$emptyContent.find('p').text(t('activity', 'There are no events for this filter'));
}
$('#loading_activities').addClass('hidden');
} else {
// Page is empty - No more activities :(
$('#no_more_activities').removeClass('hidden');
$('#loading_activities').addClass('hidden');
}
OCActivity.InfinitScrolling.handleActivitiesCallback(data);
}
);
}
Expand All @@ -75,44 +57,104 @@ $(function(){

OCActivity.InfinitScrolling.ignoreScroll = true;
$.get(
OC.generateUrl('/apps/activity/activities/fetch'),
OC.generateUrl('/apps/activity/activities/fetchJson'),
'filter=' + OCActivity.Filter.filter + '&page=' + OCActivity.Filter.currentPage,
function (data) {
OCActivity.InfinitScrolling.appendContent(data);
OCActivity.InfinitScrolling.ignoreScroll = false;

if (!data.trim().length) {
// Page is empty - No more activities :(
$('#no_more_activities').removeClass('hidden');
$('#loading_activities').addClass('hidden');
OCActivity.InfinitScrolling.ignoreScroll = true;
}
OCActivity.InfinitScrolling.handleActivitiesCallback(data);
}
);
}
},

appendContent: function (content) {
var firstNewGroup = $(content).first(),
lastGroup = this.container.children().last();
handleActivitiesCallback: function (data) {
var $numActivities = data.length;

if ($numActivities > 0) {
for (var i = 0; i < data.length; i++) {
var $activity = data[i];
this.appendActivityToContainer($activity);
}

// Continue prefill
this.prefill();

} else if (OCActivity.Filter.currentPage == 1) {
// First page is empty - No activities :(
var $emptyContent = $('#emptycontent');
$emptyContent.removeClass('hidden');
if (OCActivity.Filter.filter == 'all') {
$emptyContent.find('p').text(t('activity', 'This stream will show events like additions, changes & shares'));
} else {
$emptyContent.find('p').text(t('activity', 'There are no events for this filter'));
}
$('#loading_activities').addClass('hidden');

// Is the first new container the same as the last one?
if (lastGroup && lastGroup.data('date') === firstNewGroup.data('date')) {
var appendedBoxes = firstNewGroup.find('.box'),
lastBoxContainer = lastGroup.find('.boxcontainer');
} else {
// Page is empty - No more activities :(
$('#no_more_activities').removeClass('hidden');
$('#loading_activities').addClass('hidden');
}
},

// Move content into the last box
OCActivity.InfinitScrolling.processElements(appendedBoxes);
lastBoxContainer.append(appendedBoxes);
appendActivityToContainer: function ($activity) {
this.makeSureDateGroupExists($activity.relativeTimestamp, $activity.readableTimestamp);
this.addActivity($activity);
},

// Remove the first box, so it's not duplicated
content = $(content).slice(1);
} else {
content = $(content);
makeSureDateGroupExists: function($relativeTimestamp, $readableTimestamp) {
var $lastGroup = this.container.children().last();

if ($lastGroup.data('date') !== $relativeTimestamp) {
var $content = '<div class="section activity-section group" data-date="' + escapeHTML($relativeTimestamp) + '">' + "\n"
+' <h2>'+"\n"
+' <span class="tooltip" title="' + escapeHTML($readableTimestamp) + '">' + escapeHTML($relativeTimestamp) + '</span>' + "\n"
+' </h2>' + "\n"
+' <div class="boxcontainer">' + "\n"
+' </div>' + "\n"
+'</div>';
$content = $($content);
OCActivity.InfinitScrolling.processElements($content);
this.container.append($content);
this.lastDateGroup = $content;
}
},

addActivity: function($activity) {
var $content = ''
+ '<div class="box">' + "\n"
+ ' <div class="messagecontainer">' + "\n"

+ ' <div class="activity-icon ' + (($activity.typeicon) ? escapeHTML($activity.typeicon) + ' svg' : '') + '"></div>' + "\n"

+ ' <div class="activitysubject">' + "\n"
+ (($activity.link) ? ' <a href="' + $activity.link + '">' + "\n" : '')
+ ' ' + $activity.subjectformatted.markup.trimmed + "\n"
+ (($activity.link) ? ' </a>' + "\n" : '')
+ ' </div>' + "\n"

+' <span class="activitytime tooltip" title="' + escapeHTML($activity.readableDateTimestamp) + '">' + "\n"
+ ' ' + escapeHTML($activity.relativeDateTimestamp) + "\n"
+' </span>' + "\n";

if ($activity.message) {
$content += '<div class="activitymessage">' + "\n"
+ $activity.messageformatted.markup.trimmed + "\n"
+'</div>' + "\n";
}

if ($activity.preview) {
var $preview = $activity.preview;
$content += (($preview.link) ? '<a href="' + $preview.link + '">' + "\n" : '')
+ '<img class="preview' + (($preview.isMimeTypeIcon) ? ' preview-mimetype-icon' : '') + '" src="' + $preview.source + '" alt=""/>' + "\n"
+ (($preview.link) ? '</a>' + "\n" : '')
}

$content += ' </div>' + "\n"
+'</div>';

OCActivity.InfinitScrolling.processElements(content);
this.container.append(content);
$content = $($content);
OCActivity.InfinitScrolling.processElements($content);
this.lastDateGroup.append($content);
},

processElements: function (parentElement) {
Expand Down

0 comments on commit 70a191f

Please sign in to comment.