summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGregor Tätzner <gregor@freenet.de>2012-07-08 17:37:35 +0200
committerGregor Tätzner <gregor@freenet.de>2012-07-08 17:37:35 +0200
commit70537725190ed54a4c3cc6a1d603cf3d1582a117 (patch)
treef59f35525ddee0c96b25c7780566a74d9f538d5c
parente49ddd268532cd78bdb5ef9cf9e402f5e3ba3830 (diff)
UI and model fixes
- added dropdown menu to choose parent in addfeedfolder setting - added edit button to folder items - foldermapper: also load children of children to show folder hierarchy
-rw-r--r--ajax/addfeedfolder.php17
-rw-r--r--ajax/createfeed.php (renamed from ajax/newfeed.php)7
-rw-r--r--ajax/createfolder.php13
-rw-r--r--ajax/deletefolder.php4
-rw-r--r--css/news.css26
-rw-r--r--index.php10
-rw-r--r--js/news.js129
-rw-r--r--lib/foldermapper.php68
-rw-r--r--templates/part.addfeedfolder.php37
-rw-r--r--templates/part.feeds.php3
10 files changed, 202 insertions, 112 deletions
diff --git a/ajax/addfeedfolder.php b/ajax/addfeedfolder.php
index 89785cced..e643c861d 100644
--- a/ajax/addfeedfolder.php
+++ b/ajax/addfeedfolder.php
@@ -1,7 +1,22 @@
<?php
-
+
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('news');
+$foldermapper = new OC_News_FolderMapper(OCP\USER::getUser());
+
+$allfeeds = $foldermapper->populate('All Feeds', 0);
+
+if ($allfeeds) {
+ $feedid = isset( $_GET['feedid'] ) ? $_GET['feedid'] : null;
+ if ($feedid == null) {
+
+ }
+}
+else {
+ $feedid = 0;
+}
+
$output = new OCP\Template("news", "part.addfeedfolder");
+$output -> assign('allfeeds', $allfeeds);
$output -> printpage(); \ No newline at end of file
diff --git a/ajax/newfeed.php b/ajax/createfeed.php
index 2d85bcdc8..e5c0396a6 100644
--- a/ajax/newfeed.php
+++ b/ajax/createfeed.php
@@ -4,10 +4,10 @@
*
* @author Alessandro Cosentino
* Copyright (c) 2012 - Alessandro Cosentino <cosenal@gmail.com>
-*
+*
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file
-*
+*
*/
// Check if we are a user
@@ -18,10 +18,11 @@ OCP\JSON::callCheck();
$userid = OCP\USER::getUser();
$feedurl = trim($_POST['feedurl']);
+$folderid = trim($_POST['folderid']);
$feed = OC_News_Utils::fetch($feedurl);
$feedmapper = new OC_News_FeedMapper();
-$feedid = $feedmapper->save($feed, 0);
+$feedid = $feedmapper->save($feed, $folderid);
$l = OC_L10N::get('news');
diff --git a/ajax/createfolder.php b/ajax/createfolder.php
index cbb3d89aa..b5f624604 100644
--- a/ajax/createfolder.php
+++ b/ajax/createfolder.php
@@ -4,10 +4,10 @@
*
* @author Alessandro Cosentino
* Copyright (c) 2012 - Alessandro Cosentino <cosenal@gmail.com>
-*
+*
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file
-*
+*
*/
// Check if we are a user
@@ -18,8 +18,15 @@ OCP\JSON::callCheck();
$userid = OCP\USER::getUser();
$name = trim($_POST['name']);
-$folder = new OC_News_Folder($name);
+$parentid = trim($_POST['parentid']);
+
$foldermapper = new OC_News_FolderMapper($userid);
+
+if($parentid != 0)
+ $folder = new OC_News_Folder($name, NULL, $foldermapper->find($parentid));
+else
+ $folder = new OC_News_Folder($name);
+
$folderid = $foldermapper->save($folder);
$l = OC_L10N::get('news');
diff --git a/ajax/deletefolder.php b/ajax/deletefolder.php
index f11a1975f..bf975c6c3 100644
--- a/ajax/deletefolder.php
+++ b/ajax/deletefolder.php
@@ -4,10 +4,10 @@
*
* @author Alessandro Cosentino
* Copyright (c) 2012 - Alessandro Cosentino <cosenal@gmail.com>
-*
+*
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file
-*
+*
*/
// Check if we are a user
diff --git a/css/news.css b/css/news.css
index 6078cdf99..f0b4d46de 100644
--- a/css/news.css
+++ b/css/news.css
@@ -1,24 +1,26 @@
+li { padding-right: 0px !important; }
+
+.accordion .title { background: #DCDCDC; font-size: 12px; border-bottom:1px solid #ccc; font-weight:bold;}
+.collapsable { background: url('%webroot%/core/img/places/folder.svg') no-repeat left center; padding-left: 20px;}
+.news_input { float:left; font-size:12px; padding:4px 2px; border:solid 1px #aacfe4; width:200px; }
+.svg { border: inherit; background: inherit; }
+
#leftcontent { top: 3.5em !important; padding: 0; margin: 0; }
#rightcontent { top: 3.5em !important; padding-top: 5px; }
#feeds { background: #fff; width: 20em; left: 12.5em; top: 3.7em; bottom:3em; position: fixed; overflow: auto; padding: 0; margin: 0; }
/* #feeds a { height: 23px; display: block; margin: 0 0 0 0; padding: 0 0 0 25px; } */
#bottomcontrols { padding: 0; bottom:0px; height:2.8em; width: 20em; margin:0; background:#eee; border-top:1px solid #ccc; position:fixed; -moz-box-shadow: 0 -3px 3px -3px #000; -webkit-box-shadow: 0 -3px 3px -3px #000; box-shadow: 0 -3px 3px -3px #000;}
-#feeds_delete { position: absolute; right: 0px; background-image: url('%webroot%/core/img/actions/delete.svg'); background-repeat: no-repeat; }
-.collapsable { background: url('%webroot%/core/img/filetypes/folder.png') no-repeat left center; padding-left: 20px;}
-
-#feeds_edit { position: relative; float:right; background:url('%webroot%/core/img/actions/rename.svg') no-repeat center; }
-
-.svg { border: inherit; background: inherit; }
-
-.news_input { float:left; font-size:12px; padding:4px 2px; border:solid 1px #aacfe4; width:200px; }
+#feeds_delete { position: absolute; right: 0px; background: url('%webroot%/core/img/actions/delete.svg') no-repeat center; display: inline; }
+#feeds_edit { position: absolute; right: 1.6em; background: url('%webroot%/core/img/actions/rename.svg') no-repeat center; display: inline; }
+/* #dropdownBtn { background: url('%webroot%/core/img/actions/triangle-s.svg') no-repeat right center; } */
+#dropdownBtn { width: 9em; padding-right:20px; background: url('%webroot%/core/img/actions/triangle-s.svg') no-repeat right center; }
ul.controls li { float: left; }
-
-.accordion .title { background: #DCDCDC; font-size: 12px; border-bottom:1px solid #ccc; font-weight:bold;}
-
+ul.dropdown { position: absolute; display: none; background-color: #FEFEFE;
+ box-shadow: 0px 0px 10px rgb(0, 0, 0); border-radius: 0.5em 0.5em 0.5em 0.5em; }
li.folder_list:hover { color: rgb(0, 0, 0) !important; background: none !important; }
li.feeds_list:hover { background: none repeat scroll 0% 0% rgb(221, 221, 221) !important; }
div.collapsable:hover { background-color: rgb(221, 221, 221); }
-li { padding-right: 0px !important; }
+
diff --git a/index.php b/index.php
index 1719f2f3c..75a8485e6 100644
--- a/index.php
+++ b/index.php
@@ -5,10 +5,10 @@
*
* @author Alessandro Cosentino
* Copyright (c) 2012 - Alessandro Cosentino <cosenal@gmail.com>
-*
+*
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file
-*
+*
*/
// Check if we are a user
@@ -22,14 +22,14 @@ OCP\Util::addStyle('news','news');
$foldermapper = new OC_News_FolderMapper(OCP\USER::getUser());
-$allfeeds = $foldermapper->root();
+$allfeeds = $foldermapper->populate('All Feeds', 0);
if ($allfeeds) {
$feedid = isset( $_GET['feedid'] ) ? $_GET['feedid'] : null;
if ($feedid == null) {
-
+
}
-}
+}
else {
$feedid = 0;
}
diff --git a/js/news.js b/js/news.js
index b940a3f69..ab68621dd 100644
--- a/js/news.js
+++ b/js/news.js
@@ -1,7 +1,24 @@
News={
- UI:{
+ DropDownMenu: {
+ show:function(button){
+ var list = $(button).parent().find('ul.dropdown');
+ if (list.css('display') == 'none')
+ list.slideDown('fast').show();
+ else
+ list.slideUp('fast');
+
+ return false;
+ },
+ selectItem:function(item, folderid){
+ var parent = $(item).parent().parent();
+ parent.find('#dropdownBtn').text($(item).text());
+ parent.find(':input[name="folderid"]').val(folderid);
+ parent.find('ul.dropdown').slideUp('fast');
+ }
+ },
+ UI: {
overview:function(){
- if($('#addfeedfolder_dialog').dialog('isOpen') == true){
+ if($('#addfeedfolder_dialog').dialog('isOpen') == true){
$('#addfeedfolder_dialog').dialog('moveToTop');
}else{
$('#dialog_holder').load(OC.filePath('news', 'ajax', 'addfeedfolder.php'), function(jsondata){
@@ -19,28 +36,30 @@ News={
}
return false;
}
- },
+ },
Folder: {
submit:function(button){
- var displayname = $("#folder_add_name").val().trim();
-
- if(displayname.length == 0) {
- OC.dialogs.alert(t('news', 'Displayname cannot be empty.'), t('news', 'Error'));
- return false;
- }
-
- var url;
- url = OC.filePath('news', 'ajax', 'createfolder.php');
-
- $.post(url, { name: displayname },
- function(jsondata){
- if(jsondata.status == 'success'){
- //$(button).closest('tr').prev().html(jsondata.page).show().next().remove();
- OC.dialogs.alert(jsondata.data.message, t('news', 'Success!'));
- } else {
- OC.dialogs.alert(jsondata.data.message, t('news', 'Error'));
- }
- });
+ var displayname = $("#folder_add_name").val().trim();
+
+ if(displayname.length == 0) {
+ OC.dialogs.alert(t('news', 'Displayname cannot be empty.'), t('news', 'Error'));
+ return false;
+ }
+
+ var folderid = $('#folder_parentfolder').find(':input[name="folderid"]').val();
+
+ var url;
+ url = OC.filePath('news', 'ajax', 'createfolder.php');
+
+ $.post(url, { name: displayname, parentid: folderid },
+ function(jsondata){
+ if(jsondata.status == 'success'){
+ //$(button).closest('tr').prev().html(jsondata.page).show().next().remove();
+ OC.dialogs.alert(jsondata.data.message, t('news', 'Success!'));
+ } else {
+ OC.dialogs.alert(jsondata.data.message, t('news', 'Error'));
+ }
+ });
},
delete:function(folderid) {
$('#feeds_delete').tipsy('hide');
@@ -62,25 +81,27 @@ News={
Feed: {
id:'',
submit:function(button){
- var feedurl = $("#feed_add_url").val().trim();
-
- if(feedurl.length == 0) {
- OC.dialogs.alert(t('news', 'URL cannot be empty.'), t('news', 'Error'));
- return false;
- }
-
- var url;
- url = OC.filePath('news', 'ajax', 'newfeed.php');
-
- $.post(url, { feedurl: feedurl },
- function(jsondata){
- if(jsondata.status == 'success'){
- //$(button).closest('tr').prev().html(jsondata.page).show().next().remove();
- OC.dialogs.alert(jsondata.data.message, t('news', 'Success!'));
- } else {
- OC.dialogs.alert(jsondata.data.message, t('news', 'Error'));
- }
- });
+ var feedurl = $("#feed_add_url").val().trim();
+
+ if(feedurl.length == 0) {
+ OC.dialogs.alert(t('news', 'URL cannot be empty.'), t('news', 'Error'));
+ return false;
+ }
+
+ var folderid = $('#feed_parentfolder').find(':input[name="folderid"]').val();
+
+ var url;
+ url = OC.filePath('news', 'ajax', 'createfeed.php');
+
+ $.post(url, { feedurl: feedurl, folderid: folderid },
+ function(jsondata){
+ if(jsondata.status == 'success'){
+ //$(button).closest('tr').prev().html(jsondata.page).show().next().remove();
+ OC.dialogs.alert(jsondata.data.message, t('news', 'Success!'));
+ } else {
+ OC.dialogs.alert(jsondata.data.message, t('news', 'Error'));
+ }
+ });
},
delete:function(feedid) {
$('#feeds_delete').tipsy('hide');
@@ -101,22 +122,28 @@ News={
}
}
-$(document).ready(function(){
-
+$(document).ready(function(){
+
$('#addfeedfolder').click(News.UI.overview);
-
- $('.collapsable').click(function(){
+
+ $('.collapsable').click(function(){
$(this).parent().children().toggle();
$(this).toggle();
});
-
+
$('.accordion .title').click(function() {
$(this).next().toggle();
return false;
}).next().hide();
-
- $('.feeds_list').hover(function() {
- $(this).find('#feeds_delete').toggle();
+
+ var list = $('.collapsable,.feeds_list').hover(function() {
+ var elem = $(this).find('#feeds_delete,#feeds_edit');
+ if(elem.css('display') == 'none')
+ elem.css('display', 'inline');
+ else
+ elem.css('display', 'none');
return false;
- }).find('#feeds_delete').hide();
-}); \ No newline at end of file
+ });
+ list.find('#feeds_delete').hide();
+ list.find('#feeds_edit').hide();
+}); \ No newline at end of file
diff --git a/lib/foldermapper.php b/lib/foldermapper.php
index 79115ec56..45dc53c42 100644
--- a/lib/foldermapper.php
+++ b/lib/foldermapper.php
@@ -4,10 +4,10 @@
*
* @author Alessandro Cosentino
* Copyright (c) 2012 - Alessandro Cosentino <cosenal@gmail.com>
-*
+*
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file
-*
+*
*/
/**
@@ -16,7 +16,7 @@
class OC_News_FolderMapper {
const tableName = '*PREFIX*news_folders';
-
+
private $userid;
public function __construct($userid = null){
@@ -25,51 +25,55 @@ class OC_News_FolderMapper {
}
$userid = OCP\USER::getUser();
}
-
- public function root(){
- $root = new OC_News_Folder('All feeds');
- $stmt = OCP\DB::prepare('SELECT *
- FROM ' . self::tableName .
+
+ /**
+ * @brief Create a folder and populate with children from the database
+ * @param id The id of the folder.
+ * @param name The name of the folder.
+ * @returns an instance of OC_News_Folder
+ */
+ public function populate($name, $id){
+ $root = new OC_News_Folder($name, $id);
+ $stmt = OCP\DB::prepare('SELECT *
+ FROM ' . self::tableName .
' WHERE user_id = ? AND parent_id = ?');
- $result = $stmt->execute(array($this->userid, 0));
-
+ $result = $stmt->execute(array($this->userid, $id));
+
while( $row = $result->fetchRow()){
- $child = new OC_News_Folder($row['name'], $row['id']);
+ $child = OC_News_FolderMapper::populate($row['name'], $row['id']);
$root->addChild($child);
}
-
+
$feedmapper = new OC_News_FeedMapper();
- $feeds = $feedmapper->findByFolderId(0);
+ $feeds = $feedmapper->findByFolderId($id);
foreach ($feeds as $feed){
$root->addChild($feed);
}
-
+
return $root;
}
-
+
/**
* @brief Retrieve a folder from the database
* @param id The id of the folder in the database table.
* @returns an instance of OC_News_Folder
*/
public function find($id){
- $stmt = OCP\DB::prepare('SELECT *
- FROM ' . self::tableName .
+ $stmt = OCP\DB::prepare('SELECT *
+ FROM ' . self::tableName .
' WHERE user_id = ? AND id = ?');
- $result = $stmt->execute(array($this->userid, 0));
-
- while( $row = $result->fetchRow()){
- $child = new OC_News_Folder($row['name'], $row['id']);
- $root->addChild($child);
- }
+ $result = $stmt->execute(array($this->userid, $id));
- return $root;
+ $row = $result->fetchRow();
+ $folder = new OC_News_Folder($row['name'], $row['id']);
+
+ return $folder;
}
/**
* @brief Retrieve a feed and all its items from the database
* @param id The id of the feed in the database table.
- * @returns
+ * @returns
*/
public function findWithItems($id){
$stmt = OCP\DB::prepare('SELECT * FROM ' . self::tableName . ' WHERE id = ?');
@@ -82,7 +86,7 @@ class OC_News_FolderMapper {
$itemMapper = new OC_News_ItemMapper($feed);
$items = $itemMapper->findAll();
$feed->setItems($items);
-
+
return $feed;
}
@@ -97,7 +101,7 @@ class OC_News_FolderMapper {
'(name, parent_id, user_id)
VALUES (?, ?, ?)
');
-
+
$name = $folder->getName();
if(empty($name)) {
@@ -118,12 +122,12 @@ class OC_News_FolderMapper {
$folder->setId($folderid);
return $folderid;
}
-
+
public function delete(OC_News_Folder $folder){
$folderid = $folder->getId();
return deleteById(folderid);
}
-
+
//TODO: replace it with a DELETE INNER JOIN operation
public function deleteById($folderid){
if ($folderid == null){
@@ -133,12 +137,12 @@ class OC_News_FolderMapper {
$stmt = OCP\DB::prepare('DELETE FROM ' . self::tableName .' WHERE id = ?');
$result = $stmt->execute(array($folderid));
-
+
$feedMapper = new OC_News_FeedMapper();
//TODO: handle the value that the execute returns
$feedMapper->deleteAll($folderid);
-
+
return true;
}
-
+
} \ No newline at end of file
diff --git a/templates/part.addfeedfolder.php b/templates/part.addfeedfolder.php
index 7f6a8f6a7..6ace0ddfa 100644
--- a/templates/part.addfeedfolder.php
+++ b/templates/part.addfeedfolder.php
@@ -1,15 +1,48 @@
+
+<?php
+ function print_folder(OC_News_Folder $folder, $depth){
+ echo '<li onclick="News.DropDownMenu.selectItem(this, ' . $folder->getId() . ')">' . strtoupper($folder->getName()) . '</li>';
+ $children = $folder->getChildren();
+ foreach($children as $child) {
+ if ($child instanceOf OC_News_Folder){
+ print_folder($child, $depth+1);
+ }
+ }
+ }
+?>
+
<div id="addfeedfolder_dialog" title="<?php echo $l->t("Add Feed/Folder"); ?>">
<table width="100%" style="border: 0;">
<tr>
<td>Add new feed</td>
- <td>...where?...</td>
+ <td>
+ <div id="feed_parentfolder">
+ <button id="dropdownBtn" onclick="News.DropDownMenu.show(this)">
+ <?php echo $l->t('ALL FEEDS'); ?>
+ </button>
+ <input type="hidden" name="folderid" value="0" />
+ <ul class="dropdown">
+ <?php print_folder($_['allfeeds'], 0); ?>
+ </ul>
+ </div>
+ </td>
</tr>
<tr>
<td><input type="text" id="feed_add_url" placeholder="<?php echo $l->t('URL'); ?>" class="news_input" /></td>
<td><input type="submit" value="<?php echo $l->t('Add feed'); ?>" onclick="News.Feed.submit(this)" id="feed_add_submit" /></td>
</tr>
<td>Add new folder</td>
- <td>...where?...</td>
+ <td>
+ <div id="folder_parentfolder">
+ <button id="dropdownBtn" onclick="News.DropDownMenu.show(this)">
+ <?php echo $l->t('ALL FEEDS'); ?>
+ </button>
+ <input type="hidden" name="folderid" value="0" />
+ <ul class="dropdown">
+ <?php print_folder($_['allfeeds'], 0); ?>
+ </ul>
+ </div>
+ </td>
</tr>
<tr>
<td><input type="text" id="folder_add_name" placeholder="<?php echo $l->t('Folder name'); ?>" class="news_input" /></td>
diff --git a/templates/part.feeds.php b/templates/part.feeds.php
index e3266bed6..3fbf4c08d 100644
--- a/templates/part.feeds.php
+++ b/templates/part.feeds.php
@@ -5,6 +5,7 @@
echo '<ul style="margin-left:' . 10*$depth . 'px;"> <li class="folder_list" >' .
'<div class="collapsable" >' . strtoupper($folder->getName()) .
( ($depth != 0) ? '<button class="svg action" id="feeds_delete" onClick="(News.Folder.delete(' . $folder->getId(). '))" title="' . $l->t('Delete folder') . '">' : '' ) . '</button>' .
+ '<button class="svg action" id="feeds_edit" title="' . $l->t('Edit feed') . '"></button>' .
'</div>';
echo '<ul>';
$children = $folder->getChildren();
@@ -16,7 +17,7 @@
echo '<li class="feeds_list"><a href="' . OCP\Util::linkTo('news', 'index.php'). '?feedid=' . $child->getId() . '">' . $child->getTitle() .'</a>';
echo '<button class="svg action" id="feeds_delete" onClick="(News.Feed.delete(' . $child->getId(). '))" title="' . $l->t('Delete feed') . '"></button>';
-// echo '<button class="svg action" id="feeds_edit" title="' . $l->t('Edit feed') . '"></button>';
+ echo '<button class="svg action" id="feeds_edit" title="' . $l->t('Edit feed') . '"></button>';
echo '</li>';
}
else {