diff --git a/app/Controller/Component/ACLComponent.php b/app/Controller/Component/ACLComponent.php index edf189ec6..20823cc70 100644 --- a/app/Controller/Component/ACLComponent.php +++ b/app/Controller/Component/ACLComponent.php @@ -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(), diff --git a/app/Controller/NewsController.php b/app/Controller/NewsController.php index e7ce8c257..f4df8cbd2 100755 --- a/app/Controller/NewsController.php +++ b/app/Controller/NewsController.php @@ -1,6 +1,9 @@ 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; diff --git a/app/View/Elements/genericElements/SideMenu/side_menu.ctp b/app/View/Elements/genericElements/SideMenu/side_menu.ctp index 01170d17c..b5b801272 100644 --- a/app/View/Elements/genericElements/SideMenu/side_menu.ctp +++ b/app/View/Elements/genericElements/SideMenu/side_menu.ctp @@ -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') diff --git a/app/View/News/add.ctp b/app/View/News/add.ctp index 376f5505d..d4f11b47c 100755 --- a/app/View/News/add.ctp +++ b/app/View/News/add.ctp @@ -1,16 +1,16 @@ 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', diff --git a/app/View/News/admin_index.ctp b/app/View/News/admin_index.ctp new file mode 100644 index 000000000..1f405183c --- /dev/null +++ b/app/View/News/admin_index.ctp @@ -0,0 +1,56 @@ +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'), + ] + ] + ] + ] +]); \ No newline at end of file diff --git a/app/View/News/index.ctp b/app/View/News/index.ctp index 74ebd33bd..db852841c 100644 --- a/app/View/News/index.ctp +++ b/app/View/News/index.ctp @@ -1,61 +1,54 @@ - +

-$this->set('menuData', ['menuList' => 'news', 'menuItem' => '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', - ], - [ - 'onclick' => sprintf( - 'openGenericModal(\'%s/news/delete/[onclick_params_data_path]\');', - $baseurl - ), - 'onclick_params_data_path' => 'News.id', - 'icon' => 'trash', - 'title' => __('Delete news'), - ] - ] - ] - ] + +

+

Time->time($news['News']['date_created']), $news['User']['email'] ? __(' by %s', $news['User']['email']) : '') ?>

+
+ + +

+ Paginator->counter(array( + 'format' => __('Page {:page} of {:pages}, showing {:current} articles out of {:count} total, starting on article {:start}, ending on {:end}') + )); + ?> +

+ + +element('genericElements/assetLoader', [ + 'js' => [ + 'markdown-it', + ], ]); +?> + +element('/genericElements/SideMenu/side_menu', ['menuList' => 'news', 'menuItem' => 'index']); \ No newline at end of file