diff options
author | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2011-08-15 22:05:07 +0200 |
---|---|---|
committer | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2011-08-15 22:05:07 +0200 |
commit | 5608aaee8a8bbf913f4abb665f18fbe510da7214 (patch) | |
tree | f704a1657117af202001ddcc71a9d3ad0df338ad /apps | |
parent | 523b0966d22d0fc149ca64afb32995a0eb29a6d3 (diff) | |
download | nextcloud-server-5608aaee8a8bbf913f4abb665f18fbe510da7214.tar.gz nextcloud-server-5608aaee8a8bbf913f4abb665f18fbe510da7214.zip |
initial commit of Bookmarks App
Diffstat (limited to 'apps')
-rw-r--r-- | apps/bookmarks/ajax/addBookmark.php | 70 | ||||
-rw-r--r-- | apps/bookmarks/ajax/delBookmark.php | 52 | ||||
-rw-r--r-- | apps/bookmarks/ajax/recordClick.php | 47 | ||||
-rw-r--r-- | apps/bookmarks/ajax/updateList.php | 66 | ||||
-rw-r--r-- | apps/bookmarks/appinfo/app.php | 27 | ||||
-rw-r--r-- | apps/bookmarks/appinfo/database.xml | 127 | ||||
-rw-r--r-- | apps/bookmarks/appinfo/info.xml | 10 | ||||
-rw-r--r-- | apps/bookmarks/css/bookmarks.css | 63 | ||||
-rw-r--r-- | apps/bookmarks/img/bookmarks.png | bin | 0 -> 496 bytes | |||
-rw-r--r-- | apps/bookmarks/index.php | 39 | ||||
-rw-r--r-- | apps/bookmarks/js/bookmarks.js | 94 | ||||
-rw-r--r-- | apps/bookmarks/templates/list.php | 18 |
12 files changed, 613 insertions, 0 deletions
diff --git a/apps/bookmarks/ajax/addBookmark.php b/apps/bookmarks/ajax/addBookmark.php new file mode 100644 index 00000000000..b0d1a730897 --- /dev/null +++ b/apps/bookmarks/ajax/addBookmark.php @@ -0,0 +1,70 @@ +<?php + +/** +* ownCloud - bookmarks plugin +* +* @author Arthur Schiwon +* @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +//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 00000000000..a47bd2b9ea4 --- /dev/null +++ b/apps/bookmarks/ajax/delBookmark.php @@ -0,0 +1,52 @@ +<?php + +/** +* ownCloud - bookmarks plugin +* +* @author Arthur Schiwon +* @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +//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 00000000000..4dcb0b4a0df --- /dev/null +++ b/apps/bookmarks/ajax/recordClick.php @@ -0,0 +1,47 @@ +<?php + +/** +* ownCloud - bookmarks plugin +* +* @author Arthur Schiwon +* @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +//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 00000000000..d7cf05b7a60 --- /dev/null +++ b/apps/bookmarks/ajax/updateList.php @@ -0,0 +1,66 @@ +<?php + +/** +* ownCloud - bookmarks plugin +* +* @author Arthur Schiwon +* @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +//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 00000000000..33b7ba61449 --- /dev/null +++ b/apps/bookmarks/appinfo/app.php @@ -0,0 +1,27 @@ +<?php + +/** +* ownCloud - bookmarks plugin +* +* @author Arthur Schiwon +* @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +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 00000000000..8bfb861fc5d --- /dev/null +++ b/apps/bookmarks/appinfo/database.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<database> + <name>*dbname*</name> + <create>true</create> + <overwrite>false</overwrite> + <charset>latin1</charset> + <table> + <name>*dbprefix*bookmarks</name> + <declaration> + <field> + <name>id</name> + <type>integer</type> + <autoincrement>1</autoincrement> + <default>0</default> + <notnull>true</notnull> + <length>64</length> + </field> + <field> + <name>url</name> + <type>text</type> + <default></default> + <notnull>true</notnull> + <length>4096</length> + </field> + <field> + <name>title</name> + <type>text</type> + <default></default> + <notnull>true</notnull> + <length>140</length> + </field> + <field> + <name>description</name> + <type>text</type> + <default></default> + <notnull>true</notnull> + <length>255</length> + </field> + <field> + <name>user_id</name> + <type>text</type> + <default></default> + <notnull>true</notnull> + <length>64</length> + </field> + <field> + <name>public</name> + <type>integer</type> + <default>0</default> + <length>1</length> + </field> + <field> + <name>added</name> + <type>integer</type> + <default></default> + <notnull>false</notnull> + <unsigned>true</unsigned> + <length>4</length> + </field> + <field> + <name>lastmodified</name> + <type>integer</type> + <default></default> + <notnull>false</notnull> + <unsigned>true</unsigned> + <length>4</length> + </field> + <field> + <name>clickcount</name> + <type>integer</type> + <default>0</default> + <notnull>true</notnull> + <unsigned>true</unsigned> + <length>4</length> + </field> + + <index> + <name>id</name> + <unique>true</unique> + <field> + <name>id</name> + <sorting>descending</sorting> + </field> + </index> +<!-- <index> + <name>url</name> + <unique>true</unique> + <field> + <name>url</name> + <sorting>ascending</sorting> + </field> + </index>--> + </declaration> + </table> + + <table> + <name>*dbprefix*bookmarks_tags</name> + <declaration> + <field> + <name>bookmark_id</name> + <type>integer</type> + <length>64</length> + </field> + + <field> + <name>tag</name> + <type>text</type> + <default></default> + <notnull>true</notnull> + <length>255</length> + </field> + <index> + <name>bookmark_tag</name> + <unique>true</unique> + <field> + <name>bookmark_id</name> + <sorting>ascending</sorting> + </field> + <field> + <name>tag</name> + <sorting>ascending</sorting> + </field> + </index> + </declaration> + </table> +</database> +
\ 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 00000000000..23aa6c219a9 --- /dev/null +++ b/apps/bookmarks/appinfo/info.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<info> + <id>bookmarks</id> + <name>Bookmarks</name> + <description>Bookmark manager for ownCloud</description> + <version>0.1</version> + <licence>AGPL</licence> + <author>Arthur Schiwon</author> + <require>2</require> +</info>
\ 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 00000000000..aa28424c0b2 --- /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 Binary files differnew file mode 100644 index 00000000000..b92e4f50a42 --- /dev/null +++ b/apps/bookmarks/img/bookmarks.png diff --git a/apps/bookmarks/index.php b/apps/bookmarks/index.php new file mode 100644 index 00000000000..ba9f7cc0c61 --- /dev/null +++ b/apps/bookmarks/index.php @@ -0,0 +1,39 @@ +<?php + +/** +* ownCloud - bookmarks plugin +* +* @author Arthur Schiwon +* @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +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 00000000000..7624ff5d394 --- /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<len; ++i ){ + taglist = taglist + "<a class=\"bookmark_tags\" href=\"?tag=" + encodeURI(tags[i]) + "\">" + tags[i] + "</a> "; + } + $('.bookmarks_list').append( + "<div class=\"bookmark_single\">" + + "<p class=\"bookmark_title\"><a href=\"" + encodeEntities(bookmark.url) + "\" target=\"_new\" class=\"bookmark_link\">" + encodeEntities(bookmark.title) + "</a></p>" + + "<p class=\"bookmark_url\">" + encodeEntities(bookmark.url) + "</p>" + + "<p class=\"bookmark_description\">" + encodeEntities(bookmark.description) + "</p>" + + "<p>" + taglist + "</p>" + + "<p class=\"bookmark_actions\"><span class=\"bookmark_delete\">Delete</span></p>" + + "</div>" + ); +} + +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 $("<div/>").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 00000000000..278a0db5249 --- /dev/null +++ b/apps/bookmarks/templates/list.php @@ -0,0 +1,18 @@ +<input type="hidden" id="bookmarkFilterTag" value="<?php echo htmlentities($_GET['tag']); ?>" /> +<h2 class="bookmarks_headline"><?php echo isset($_GET["tag"]) ? 'Bookmarks with tag: ' . urldecode($_GET["tag"]) : 'All bookmarks'; ?></h2> +<div class="bookmarks_menu"> + <input type="button" class="bookmarks_addBtn" value="Add Bookmark" /> +</div> +<div class="bookmarks_add"> + <p><label class="bookmarks_label">URL: </label><input type="text" id="bookmark_add_url" class="bookmarks_input" /></p> + <p><label class="bookmarks_label">Title: </label><input type="text" id="bookmark_add_title" class="bookmarks_input" /></p> + <p><label class="bookmarks_label">Description: </label><input type="text" id="bookmark_add_description" class="bookmarks_input" /></p> + <p><label class="bookmarks_label">Tags:</label><input type="text" id="bookmark_add_tags" class="bookmarks_input" /></p> + <p><label class="bookmarks_label"></label><input type="submit" id="bookmark_add_submit" /></p> +</div> +<div class="bookmarks_list"> + <noscript> + JavaScript is needed to display your Bookmarks + </noscript> + You have no bookmarks +</div>
\ No newline at end of file |