new: [news] Show the latest news in nicer view

pull/8603/head
Jakub Onderka 2022-09-21 16:13:18 +02:00
parent 196c87963d
commit 098adf9f4f
6 changed files with 159 additions and 79 deletions

View File

@ -397,10 +397,11 @@ class ACLComponent extends Component
'queryEnrichment' => array('perm_auth'),
),
'news' => array(
'add' => array(),
'edit' => array(),
'delete' => array(),
'index' => array('*'),
'add' => array(),
'edit' => array(),
'delete' => array(),
'admin_index' => array(),
'index' => ['*'],
),
'noticelists' => array(
'delete' => array(),

View File

@ -1,6 +1,9 @@
<?php
App::uses('AppController', 'Controller', 'CRUD');
App::uses('AppController', 'Controller');
/**
* @property News $News
*/
class NewsController extends AppController
{
public $components = array('Session', 'RequestHandler');
@ -8,28 +11,51 @@ class NewsController extends AppController
public $paginate = array(
'limit' => 5,
'maxLimit' => 9999, // LATER we will bump here on a problem once we have more than 9999 events <- no we won't, this is the max a user van view/page.
'order' => array(
'order' => [
'News.id' => 'DESC'
),
],
'contain' => [
'User' => ['fields' => ['User.email']],
]
);
public function index()
{
$this->paginate['contain'] = array('User' => array('fields' => array('User.email')));
$user = $this->Auth->user();
$newsItems = $this->paginate();
$newsread = $this->Auth->user('newsread');
foreach ($newsItems as $key => $item) {
if ($item['News']['date_created'] > $newsread) {
$newsItems[$key]['News']['new'] = true;
} else {
$newsItems[$key]['News']['new'] = false;
$newsread = $user['newsread'];
$hasUnreadNews = false;
foreach ($newsItems as &$item) {
$isNew = $item['News']['date_created'] > $newsread;
$item['News']['new'] = $isNew;
if ($isNew) {
$hasUnreadNews = true;
}
}
$this->set('newsItems', $newsItems);
$this->set('hasUnreadNews', $hasUnreadNews);
$this->loadModel('User');
$this->User->updateField($this->Auth->user(), 'newsread', time());
if ($hasUnreadNews) {
$homepage = $this->User->UserSetting->getValueForUser($user['id'], 'homepage');
if (!empty($homepage)) {
$this->set('homepage', $homepage);
} else {
$this->set('homepage', "{$this->baseurl}/events/index");
}
$this->User->updateField($user, 'newsread', time());
}
}
public function admin_index()
{
$user = $this->Auth->user();
$this->paginate['limit'] = 25;
$newsItems = $this->paginate();
$this->set('newsItems', $newsItems);
$this->set('user', $user);
}
public function add()
@ -74,7 +100,6 @@ class NewsController extends AppController
public function delete($id)
{
$this->defaultModel = 'News';
$this->CRUD->delete($id);
if ($this->IndexFilter->isRest()) {
return $this->restResponsePayload;

View File

@ -1364,9 +1364,14 @@ $divider = $this->element('/genericElements/SideMenu/side_menu_divider');
case 'news':
echo $this->element('/genericElements/SideMenu/side_menu_link', array(
'url' => $baseurl . '/news/index',
'text' => __('View News')
'text' => __('View News'),
));
if ($isSiteAdmin) {
echo $this->element('/genericElements/SideMenu/side_menu_link', array(
'url' => $baseurl . '/admin/news/index',
'text' => __('View News as Admin'),
'element_id' => 'admin_index',
));
echo $this->element('/genericElements/SideMenu/side_menu_link', array(
'url' => $baseurl . '/news/add',
'text' => __('Add News Item')

View File

@ -1,16 +1,16 @@
<?php
$edit = $this->request->params['action'] === 'edit' ? true : false;
$isEdit = $this->request->params['action'] === 'edit';
echo $this->element(
'/genericElements/SideMenu/side_menu',
[
'menuList' => 'news',
'menuItem' => $edit ? 'edit' : 'add'
'menuItem' => $isEdit ? 'edit' : 'add'
]
);
echo $this->element('genericElements/Form/genericForm', [
'data' => [
'title' => $edit ? __('Edit News Item') : __('Add News Item'),
'title' => $isEdit ? __('Edit News Item') : __('Add News Item'),
'fields' => [
[
'field' => 'title',
@ -22,7 +22,7 @@ echo $this->element('genericElements/Form/genericForm', [
],
[
'field' => 'message',
'label' => __('Message'),
'label' => __('Message (you can use Markdown format)'),
'type' => 'textarea',
'error' => ['escape' => false],
'div' => 'input clear',

View File

@ -0,0 +1,56 @@
<?php
$this->set('menuData', ['menuList' => 'news', 'menuItem' => 'admin_index']);
echo $this->element('genericElements/IndexTable/scaffold', [
'scaffold_data' => [
'data' => [
'data' => $newsItems,
'fields' => [
[
'name' => __('ID'),
'sort' => 'id',
'data_path' => 'News.id'
],
[
'name' => __('User'),
'sort' => 'email',
'data_path' => 'User.email'
],
[
'name' => __('Title'),
'sort' => 'title',
'data_path' => 'News.title'
],
[
'name' => __('Message'),
'sort' => 'message',
'data_path' => 'News.message'
],
[
'name' => __('Created at'),
'sort' => 'date_created',
'data_path' => 'News.date_created',
'element' => 'datetime'
],
],
'title' => empty($ajax) ? __('News') : false,
'pull' => 'right',
'actions' => [
[
'url' => $baseurl . '/news/edit',
'url_params_data_paths' => [
'News.id'
],
'icon' => 'edit',
'title' => __('Edit News'),
],
[
'url' => $baseurl . '/news/delete',
'url_params_data_paths' => ['News.id'],
'class' => 'modal-open',
'icon' => 'trash',
'title' => __('Delete news'),
]
]
]
]
]);

View File

@ -1,61 +1,54 @@
<?php
<div class="index">
<h2><?= __("Latest news") ?></h2>
$this->set('menuData', ['menuList' => 'news', 'menuItem' => 'index']);
<?php if ($hasUnreadNews): ?>
<div class="alert alert-success">
<p><?= __('You have unread news.') ?></p>
<a class="btn btn-success" href="<?= $homepage ?>"><?= __('Continue to homepage') ?></a>
</div>
<?php endif; ?>
echo $this->element('genericElements/IndexTable/scaffold', [
'scaffold_data' => [
'data' => [
'data' => $newsItems,
'fields' => [
[
'name' => __('Id'),
'sort' => 'id',
'data_path' => 'News.id'
],
[
'name' => __('User'),
'sort' => 'email',
'data_path' => 'User.email'
],
[
'name' => __('Title'),
'sort' => 'title',
'data_path' => 'News.title'
],
[
'name' => __('Message'),
'sort' => 'message',
'data_path' => 'News.message'
],
[
'name' => __('Created at'),
'sort' => 'date_created',
'data_path' => 'News.date_created',
'element' => 'datetime'
],
<div class="pagination">
<ul>
<?php
$pagination = $this->Paginator->prev('&laquo; ' . __('previous'), array('tag' => 'li', 'escape' => false), null, array('tag' => 'li', 'class' => 'prev disabled', 'escape' => false, 'disabledTag' => 'span'));
$pagination .= $this->Paginator->numbers(array('modulus' => 20, 'separator' => '', 'tag' => 'li', 'currentClass' => 'active', 'currentTag' => 'span'));
$pagination .= $this->Paginator->next(__('next') . ' &raquo;', array('tag' => 'li', 'escape' => false), null, array('tag' => 'li', 'class' => 'next disabled', 'escape' => false, 'disabledTag' => 'span'));
echo $pagination;
?>
</ul>
</div>
],
'title' => empty($ajax) ? __('News') : false,
'pull' => 'right',
'actions' => [
[
'url' => $baseurl . '/news/edit',
'url_params_data_paths' => [
'News.id'
],
'icon' => 'edit',
'title' => 'Edit News',
],
[
'onclick' => sprintf(
'openGenericModal(\'%s/news/delete/[onclick_params_data_path]\');',
$baseurl
),
'onclick_params_data_path' => 'News.id',
'icon' => 'trash',
'title' => __('Delete news'),
]
]
]
]
<?php foreach ($newsItems as $news): ?>
<h3 style="margin-bottom: 5px; font-size: 22px"><?php if ($news['News']['new']): ?><span class="label label-warning"><?= __('New') ?></span><?php endif; ?> <?= h($news['News']['title']) ?></h3>
<p><?= __('Published at %s%s', $this->Time->time($news['News']['date_created']), $news['User']['email'] ? __(' by %s', $news['User']['email']) : '') ?></p>
<div class="md" style="font-size: 14px; margin-bottom: 32px; "><?= h($news['News']['message']) ?></div>
<?php endforeach; ?>
<p>
<?= $this->Paginator->counter(array(
'format' => __('Page {:page} of {:pages}, showing {:current} articles out of {:count} total, starting on article {:start}, ending on {:end}')
));
?>
</p>
<div class="pagination">
<ul>
<?= $pagination ?>
</ul>
</div>
</div>
<?= $this->element('genericElements/assetLoader', [
'js' => [
'markdown-it',
],
]);
?>
<script>
var md = window.markdownit('default');
md.disable(['image'])
$('.md').each(function (_, el) {
var $el = $(el);
$el.html(md.render($el.text()));
});
</script>
<?= $this->element('/genericElements/SideMenu/side_menu', ['menuList' => 'news', 'menuItem' => 'index']);