From 5608aaee8a8bbf913f4abb665f18fbe510da7214 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Mon, 15 Aug 2011 22:05:07 +0200 Subject: [PATCH] initial commit of Bookmarks App --- apps/bookmarks/ajax/addBookmark.php | 70 +++++++++++++++ apps/bookmarks/ajax/delBookmark.php | 52 ++++++++++++ apps/bookmarks/ajax/recordClick.php | 47 ++++++++++ apps/bookmarks/ajax/updateList.php | 66 +++++++++++++++ apps/bookmarks/appinfo/app.php | 27 ++++++ apps/bookmarks/appinfo/database.xml | 127 ++++++++++++++++++++++++++++ apps/bookmarks/appinfo/info.xml | 10 +++ apps/bookmarks/css/bookmarks.css | 63 ++++++++++++++ apps/bookmarks/img/bookmarks.png | Bin 0 -> 496 bytes apps/bookmarks/index.php | 39 +++++++++ apps/bookmarks/js/bookmarks.js | 94 ++++++++++++++++++++ apps/bookmarks/templates/list.php | 18 ++++ 12 files changed, 613 insertions(+) create mode 100644 apps/bookmarks/ajax/addBookmark.php create mode 100644 apps/bookmarks/ajax/delBookmark.php create mode 100644 apps/bookmarks/ajax/recordClick.php create mode 100644 apps/bookmarks/ajax/updateList.php create mode 100644 apps/bookmarks/appinfo/app.php create mode 100644 apps/bookmarks/appinfo/database.xml create mode 100644 apps/bookmarks/appinfo/info.xml create mode 100644 apps/bookmarks/css/bookmarks.css create mode 100644 apps/bookmarks/img/bookmarks.png create mode 100644 apps/bookmarks/index.php create mode 100644 apps/bookmarks/js/bookmarks.js create mode 100644 apps/bookmarks/templates/list.php diff --git a/apps/bookmarks/ajax/addBookmark.php b/apps/bookmarks/ajax/addBookmark.php new file mode 100644 index 0000000000..b0d1a73089 --- /dev/null +++ b/apps/bookmarks/ajax/addBookmark.php @@ -0,0 +1,70 @@ +. +* +*/ + +//no apps or filesystem +$RUNTIME_NOSETUPFS=true; + +require_once('../../../lib/base.php'); + +// We send json data +header( "Content-Type: application/jsonrequest" ); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + echo json_encode( array( "status" => "error", "data" => array( "message" => "Authentication error" ))); + exit(); +} + +$query = OC_DB::prepare(" + INSERT IGNORE INTO *PREFIX*bookmarks + (url, title, description, user_id, public, added, lastmodified) + VALUES (?, ?, ?, ?, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()) + "); + +$params=array( + urldecode($_GET["url"]), + urldecode($_GET["title"]), + urldecode($_GET["description"]), + OC_User::getUser() + ); +$query->execute($params); +$b_id = OC_DB::insertid(); + +if($b_id !== false) { + $query = OC_DB::prepare(" + INSERT INTO *PREFIX*bookmarks_tags + (bookmark_id, tag) + VALUES (?, ?) + "); + + $tags = explode(' ', urldecode($_GET["tags"])); + foreach ($tags as $tag) { + if(empty($tag)) { + //avoid saving blankspaces + continue; + } + $params = array($b_id, trim($tag)); + $query->execute($params); + } +} + diff --git a/apps/bookmarks/ajax/delBookmark.php b/apps/bookmarks/ajax/delBookmark.php new file mode 100644 index 0000000000..a47bd2b9ea --- /dev/null +++ b/apps/bookmarks/ajax/delBookmark.php @@ -0,0 +1,52 @@ +. +* +*/ + +//no apps or filesystem +$RUNTIME_NOSETUPFS=true; + +require_once('../../../lib/base.php'); + +// We send json data +header( "Content-Type: application/jsonrequest" ); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + echo json_encode( array( "status" => "error", "data" => array( "message" => "Authentication error" ))); + exit(); +} + +$query = OC_DB::prepare(" + DELETE FROM *PREFIX*bookmarks + WHERE url LIKE ? + AND user_id = ? + "); + +$params=array( + urldecode($_GET["url"]), + OC_User::getUser() + ); +$result = $query->execute($params); + +// var_dump($params); + +echo json_encode( array( "status" => "success", "data" => array())); diff --git a/apps/bookmarks/ajax/recordClick.php b/apps/bookmarks/ajax/recordClick.php new file mode 100644 index 0000000000..4dcb0b4a0d --- /dev/null +++ b/apps/bookmarks/ajax/recordClick.php @@ -0,0 +1,47 @@ +. +* +*/ + +//no apps or filesystem +$RUNTIME_NOSETUPFS=true; + +require_once('../../../lib/base.php'); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + header( "Content-Type: application/jsonrequest" ); + echo json_encode( array( "status" => "error", "data" => array( "message" => "Authentication error" ))); + exit(); +} + +$query = OC_DB::prepare(" + UPDATE *PREFIX*bookmarks + SET clickcount = clickcount + 1 + WHERE user_id = ? + AND url LIKE ? + "); + +$params=array(OC_User::getUser(), urldecode($_GET["url"])); +$bookmarks = $query->execute($params); + +header( "HTTP/1.1 204 No Content" ); + diff --git a/apps/bookmarks/ajax/updateList.php b/apps/bookmarks/ajax/updateList.php new file mode 100644 index 0000000000..d7cf05b7a6 --- /dev/null +++ b/apps/bookmarks/ajax/updateList.php @@ -0,0 +1,66 @@ +. +* +*/ + +//no apps or filesystem +$RUNTIME_NOSETUPFS=true; + +require_once('../../../lib/base.php'); + +// We send json data +header( "Content-Type: application/jsonrequest" ); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + echo json_encode( array( "status" => "error", "data" => array( "message" => "Authentication error" ))); + exit(); +} + +$params=array(OC_User::getUser()); + +//Filter for tag? +$filterTag = isset($_GET["tag"]) ? urldecode($_GET["tag"]) : false; +if($filterTag){ + $sqlFilterTag = "HAVING INSTR (tags, ?) > 0"; + $params[] = $filterTag; +} else { + $sqlFilterTag = ''; +} + +$offset = isset($_GET["page"]) ? intval($_GET["page"]) * 10 : 0; +$params[] = $offset; + +//FIXME: bookmarks without tags are not being retrieved +$query = OC_DB::prepare(" + SELECT url, title, description, GROUP_CONCAT( tag SEPARATOR ' ' ) AS tags + FROM *PREFIX*bookmarks, *PREFIX*bookmarks_tags + WHERE *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id + AND *PREFIX*bookmarks.user_id = ? + GROUP BY url + $sqlFilterTag + ORDER BY *PREFIX*bookmarks.id DESC + LIMIT ?, 10"); + + +$bookmarks = $query->execute($params)->fetchAll(); + +echo json_encode( array( "status" => "success", "data" => $bookmarks)); diff --git a/apps/bookmarks/appinfo/app.php b/apps/bookmarks/appinfo/app.php new file mode 100644 index 0000000000..33b7ba6144 --- /dev/null +++ b/apps/bookmarks/appinfo/app.php @@ -0,0 +1,27 @@ +. +* +*/ + +OC_App::register( array( 'order' => 70, 'id' => 'bookmark', 'name' => 'Bookmarks' )); + +OC_App::addNavigationEntry( array( 'id' => 'bookmarks_index', 'order' => 70, 'href' => OC_Helper::linkTo( 'bookmarks', 'index.php' ), 'icon' => OC_Helper::imagePath( 'bookmarks', 'bookmarks.png' ), 'name' => 'Bookmarks' )); + diff --git a/apps/bookmarks/appinfo/database.xml b/apps/bookmarks/appinfo/database.xml new file mode 100644 index 0000000000..8bfb861fc5 --- /dev/null +++ b/apps/bookmarks/appinfo/database.xml @@ -0,0 +1,127 @@ + + + *dbname* + true + false + latin1 + + *dbprefix*bookmarks + + + id + integer + 1 + 0 + true + 64 + + + url + text + + true + 4096 + + + title + text + + true + 140 + + + description + text + + true + 255 + + + user_id + text + + true + 64 + + + public + integer + 0 + 1 + + + added + integer + + false + true + 4 + + + lastmodified + integer + + false + true + 4 + + + clickcount + integer + 0 + true + true + 4 + + + + id + true + + id + descending + + + + +
+ + + *dbprefix*bookmarks_tags + + + bookmark_id + integer + 64 + + + + tag + text + + true + 255 + + + bookmark_tag + true + + bookmark_id + ascending + + + tag + ascending + + + +
+
+ \ No newline at end of file diff --git a/apps/bookmarks/appinfo/info.xml b/apps/bookmarks/appinfo/info.xml new file mode 100644 index 0000000000..23aa6c219a --- /dev/null +++ b/apps/bookmarks/appinfo/info.xml @@ -0,0 +1,10 @@ + + + bookmarks + Bookmarks + Bookmark manager for ownCloud + 0.1 + AGPL + Arthur Schiwon + 2 + \ No newline at end of file diff --git a/apps/bookmarks/css/bookmarks.css b/apps/bookmarks/css/bookmarks.css new file mode 100644 index 0000000000..aa28424c0b --- /dev/null +++ b/apps/bookmarks/css/bookmarks.css @@ -0,0 +1,63 @@ +#content { overflow: auto; } + +.bookmarks_headline { + font-size: large; + font-weight: bold; + margin-left: 2em; + padding: 2.5ex 0.5ex; +} + +.bookmarks_menu { + margin-left: 1.5em; + padding: 0.5ex; +} + +.bookmark_actions { + font-size: smaller; + color: #ff44ff; + padding-left: 4em; +} + +.bookmark_actions span:hover { + cursor: pointer; + text-decoration: underline; +} + +.bookmarks_add { + display: none; +} + +.bookmarks_label { + width: 7em; + display: inline-block; + text-align: right; +} + +.bookmarks_input { + width: 20em; +} + +.bookmark_single { + margin-left: 2em; + margin-top: 3ex; + padding: 0.5ex; +/* border-bottom: 1px solid black; */ +} + +.bookmark_single:hover { + background-color: #ccccff; +} + +.bookmark_title { + font-size: larger; + color: blue; + text-decoration: underline; +} + +.bookmark_url { + color: green; +} + +.bookmark_tags { + color: #ff3333; +} \ No newline at end of file diff --git a/apps/bookmarks/img/bookmarks.png b/apps/bookmarks/img/bookmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..b92e4f50a42c68293d256e21cb44d31debbbb840 GIT binary patch literal 496 zcmVMO1eX+o-Nt_WD9 zuo5d_L4+;rWG##ukQIX(MQ3-@=yBY6B#<^=H4N{4^Yg<1{|E(ud_Mm+nM~e9qtTzK zRO*?cC@*Z=?#yO0>uxxmPCrQ`5^rQ#{u&O4C*$$BCjx-S8ZBj1@|y(tFOi zhY)g_%jG0hRoyO^3x;9bP9@?Vlu~fc5sSq{Ns>M+77J3XR^5bqz1lnWCGJP5s$~AY1*$wqhSt* z!zwUUftzg^s56iMH=kxiOUaz;kn|~lUP^;C5 mVHmFjLD+UWoo@i_W4Yg!;-M*5i;vj=0000. +* +*/ + +require_once('../../lib/base.php'); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + header( "Location: ".OC_Helper::linkTo( '', 'index.php' )); + exit(); +} + +OC_App::setActiveNavigationEntry( 'bookmarks_index' ); + +OC_Util::addScript('bookmarks','bookmarks'); +OC_Util::addStyle('bookmarks', 'bookmarks'); + +$tmpl = new OC_Template( 'bookmarks', 'list', 'user' ); + +$tmpl->printPage(); \ No newline at end of file diff --git a/apps/bookmarks/js/bookmarks.js b/apps/bookmarks/js/bookmarks.js new file mode 100644 index 0000000000..7624ff5d39 --- /dev/null +++ b/apps/bookmarks/js/bookmarks.js @@ -0,0 +1,94 @@ +var bookmarks_page = 0; +var bookmarks_loading = false; + +$(document).ready(function() { + $('.bookmarks_addBtn').click(function(event){ + $('.bookmarks_add').slideToggle(); + }); + + $('#bookmark_add_submit').click(addBookmark); + $(window).scroll(updateOnBottom); + + $('.bookmarks_list').empty(); + getBookmarks(); +}); + +function getBookmarks() { + if(bookmarks_loading) { + //have patience :) + return; + } + $.ajax({ + url: 'ajax/updateList.php', + data: "tag=" + encodeURI($('#bookmarkFilterTag').val()) + "&page=" + bookmarks_page, + success: function(bookmarks){ + bookmarks_page += 1; + $('.bookmark_link').unbind('click', recordClick); + $('.bookmark_delete').unbind('click', delBookmark); + + for(var i in bookmarks.data) { + updateBookmarksList(bookmarks.data[i]); + } + $('.bookmark_link').click(recordClick); + $('.bookmark_delete').click(delBookmark); + bookmarks_loading = false; + } + }); +} + +function addBookmark(event) { + $.ajax({ + url: 'ajax/addBookmark.php', + data: "url=" + encodeURI($('#bookmark_add_url').val()) + "&title=" + encodeURI($('#bookmark_add_title').val()) + "&description=" + encodeURI($('#bookmark_add_description').val()) + "&tags=" + encodeURI($('#bookmark_add_tags').val()), + success: function(data){ $('.bookmarks_add').slideToggle(); $('.bookmarks_add').children('p').children('.bookmarks_input').val(''); } + }); +} + +function delBookmark(event) { + $.ajax({ + url: 'ajax/delBookmark.php', + data: "url=" + encodeURI($(this).parent().parent().children('.bookmark_url:first').text()), + success: function(data){ alert('deleted!'); } + }); +} + +function updateBookmarksList(bookmark) { + var tags = encodeEntities(bookmark.tags).split(" "); + var taglist = ""; + for ( var i=0, len=tags.length; i" + tags[i] + " "; + } + $('.bookmarks_list').append( + "
" + + "

" + encodeEntities(bookmark.title) + "

" + + "

" + encodeEntities(bookmark.url) + "

" + + "

" + encodeEntities(bookmark.description) + "

" + + "

" + taglist + "

" + + "

Delete

" + + "
" + ); +} + +function updateOnBottom() { + //check wether user is on bottom of the page + if ($('body').height() <= ($(window).height() + $(window).scrollTop())) { + getBookmarks(); + } +} + +function recordClick(event) { + $.ajax({ + url: 'ajax/recordClick.php', + data: "url=" + encodeURI($(this).attr('href')), + }); + return false; +} + +function encodeEntities(s){ + try { + return $("
").text(s).html(); + + } catch (ex) { + return ""; + } +} diff --git a/apps/bookmarks/templates/list.php b/apps/bookmarks/templates/list.php new file mode 100644 index 0000000000..278a0db524 --- /dev/null +++ b/apps/bookmarks/templates/list.php @@ -0,0 +1,18 @@ + +

+
+ +
+
+

+

+

+

+

+
+
+ + You have no bookmarks +
\ No newline at end of file