From db1f77e4f51b1172aabe12defdd8228e9dd3b93b Mon Sep 17 00:00:00 2001
From: Thomas Tanghus
Date: Wed, 25 Jan 2012 01:10:56 +0100
Subject: [PATCH 1/6] Some reminders in the code of what I have to change post
OC3.0
---
apps/contacts/ajax/addproperty.php | 8 ++++++++
apps/contacts/lib/app.php | 1 +
apps/contacts/lib/vcard.php | 2 ++
3 files changed, 11 insertions(+)
diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php
index f016820ce5..a4b5c59119 100644
--- a/apps/contacts/ajax/addproperty.php
+++ b/apps/contacts/ajax/addproperty.php
@@ -74,6 +74,14 @@ foreach ($parameters as $key=>$element) {
}
$checksum = md5($vcard->children[$line]->serialize());
+/* FIXME: OC_Contacts_App::getPropertyLineByChecksum throws an OC_JSON error when doing this check.
+ Fix for v. 3.1
+if(!is_null(OC_Contacts_App::getPropertyLineByChecksum($id, $checksum))) {
+ OC_JSON::error(array('data' => array('message' => $l->t('Trying to add duplicate property.'))));
+ OC_Log::write('contacts','ajax/addproperty.php: Trying to add duplicate property: '.$name, OC_Log::DEBUG);
+ exit();
+}
+*/
if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) {
OC_JSON::error(array('data' => array('message' => $l->t('Error adding contact property.'))));
OC_Log::write('contacts','ajax/addproperty.php: Error updating contact property: '.$name, OC_Log::ERROR);
diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php
index bc1e4974b3..39df497043 100644
--- a/apps/contacts/lib/app.php
+++ b/apps/contacts/lib/app.php
@@ -85,6 +85,7 @@ class OC_Contacts_App{
break;
}
}
+ // FIXME: I'm not sure this should throw a JSON error as it might just be used to check for dupes. /Tanghus.
if(is_null($line)){
OC_JSON::error(array('data' => array( 'message' => self::$l10n->t('Information about vCard is incorrect. Please reload the page.'))));
exit();
diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php
index ceac2dcfad..aefa2c7411 100644
--- a/apps/contacts/lib/vcard.php
+++ b/apps/contacts/lib/vcard.php
@@ -320,6 +320,8 @@ class OC_Contacts_VCard{
* ['value'] htmlspecialchars escaped value of property
* ['parameters'] associative array name=>value
* ['checksum'] checksum of whole property
+ * NOTE: $value is not escaped anymore. It shouldn't make any difference
+ * but we should look out for any problems.
*/
public static function structureProperty($property){
$value = $property->value;
From 3f1486534f687fdcad219b97072ed71a2998de87 Mon Sep 17 00:00:00 2001
From: Thomas Tanghus
Date: Tue, 31 Jan 2012 19:26:26 +0100
Subject: [PATCH 2/6] - Fixed
http://bugs.owncloud.org/thebuggenie/owncloud/issues/oc-93 Property was
added multiple times. - Fixed
http://bugs.owncloud.org/thebuggenie/owncloud/issues/oc-8 "Missing "N"
field: Contacts app not compatible with vcard 3.0 format" - Almost sure I've
fixed http://bugs.owncloud.org/thebuggenie/owncloud/issues/oc-27 "Full name
in Contacts app doesn't sync to iOS 5 contacts" because it is caused by oc-8
---
apps/contacts/ajax/addcard.php | 23 ++++-
apps/contacts/ajax/addproperty.php | 23 +++--
apps/contacts/ajax/deleteproperty.php | 5 ++
apps/contacts/ajax/setproperty.php | 6 +-
apps/contacts/ajax/showsetproperty.php | 5 ++
apps/contacts/css/styles.css | 58 ++-----------
apps/contacts/lib/app.php | 5 --
apps/contacts/templates/part.addcardform.php | 75 +++++++++++-----
apps/contacts/templates/part.details.php | 1 +
apps/contacts/templates/part.property.N.php | 4 +
.../templates/part.setpropertyform.php | 85 +++++++++++++------
11 files changed, 177 insertions(+), 113 deletions(-)
create mode 100644 apps/contacts/templates/part.property.N.php
diff --git a/apps/contacts/ajax/addcard.php b/apps/contacts/ajax/addcard.php
index 7e47659d23..140d6a4809 100644
--- a/apps/contacts/ajax/addcard.php
+++ b/apps/contacts/ajax/addcard.php
@@ -22,6 +22,11 @@
// Init owncloud
require_once('../../../lib/base.php');
+function bailOut($msg) {
+ OC_JSON::error(array('data' => array('message' => $msg)));
+ OC_Log::write('contacts','ajax/addcard.php: '.$msg, OC_Log::DEBUG);
+ exit();
+}
// Check if we are a user
OC_JSON::checkLoggedIn();
@@ -31,12 +36,22 @@ $l=new OC_L10N('contacts');
$aid = $_POST['id'];
$addressbook = OC_Contacts_App::getAddressbook( $aid );
-$fn = $_POST['fn'];
+$fn = trim($_POST['fn']);
$values = $_POST['value'];
$parameters = $_POST['parameters'];
$vcard = new OC_VObject('VCARD');
$vcard->setUID();
+
+$n = isset($values['N'][0])?trim($values['N'][0]).';':';';
+$n .= isset($values['N'][1])?trim($values['N'][1]).';':';';
+$n .= isset($values['N'][2])?trim($values['N'][2]).';;':';;';
+
+if(!$fn || ($n == ';;;;')) {
+ bailOut('You have to enter both the extended name and the display name.');
+}
+
+$vcard->setString('N',$n);
$vcard->setString('FN',$fn);
// Data to add ...
@@ -58,6 +73,10 @@ foreach( $add as $propname){
} else {
$prop_parameters = array();
}
+ if(is_array($value)){
+ ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form!
+ $value = OC_VObject::escapeSemicolons($value);
+ }
$vcard->addProperty($propname, $value); //, $prop_parameters);
$line = count($vcard->children) - 1;
foreach ($prop_parameters as $key=>$element) {
@@ -77,7 +96,7 @@ foreach( $add as $propname){
$id = OC_Contacts_VCard::add($aid,$vcard->serialize());
if(!$id) {
OC_JSON::error(array('data' => array('message' => $l->t('There was an error adding the contact.'))));
- OC_Log::write('contacts','ajax/addcard.php: Recieved non-positive ID on adding card: '.$name, OC_Log::ERROR);
+ OC_Log::write('contacts','ajax/addcard.php: Recieved non-positive ID on adding card: '.$id, OC_Log::ERROR);
exit();
}
diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php
index a4b5c59119..c90af217c8 100644
--- a/apps/contacts/ajax/addproperty.php
+++ b/apps/contacts/ajax/addproperty.php
@@ -54,6 +54,21 @@ if(!is_array($value)){
}
$parameters = isset($_POST['parameters']) ? $_POST['parameters'] : array();
+// Prevent setting a duplicate entry
+$current = $vcard->select($name);
+foreach($current as $item) {
+ $tmpvalue = (is_array($value)?implode(';', $value):$value);
+ if($tmpvalue == $item->value) {
+ OC_JSON::error(array('data' => array('message' => $l->t('Trying to add duplicate property: ').$name.': '.$tmpvalue)));
+ OC_Log::write('contacts','ajax/addproperty.php: Trying to add duplicate property: '.$name.': '.$tmpvalue, OC_Log::DEBUG);
+ exit();
+ }
+}
+
+if(is_array($value)) {
+ ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form!
+}
+
$property = $vcard->addProperty($name, $value); //, $parameters);
$line = count($vcard->children) - 1;
@@ -74,14 +89,6 @@ foreach ($parameters as $key=>$element) {
}
$checksum = md5($vcard->children[$line]->serialize());
-/* FIXME: OC_Contacts_App::getPropertyLineByChecksum throws an OC_JSON error when doing this check.
- Fix for v. 3.1
-if(!is_null(OC_Contacts_App::getPropertyLineByChecksum($id, $checksum))) {
- OC_JSON::error(array('data' => array('message' => $l->t('Trying to add duplicate property.'))));
- OC_Log::write('contacts','ajax/addproperty.php: Trying to add duplicate property: '.$name, OC_Log::DEBUG);
- exit();
-}
-*/
if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) {
OC_JSON::error(array('data' => array('message' => $l->t('Error adding contact property.'))));
OC_Log::write('contacts','ajax/addproperty.php: Error updating contact property: '.$name, OC_Log::ERROR);
diff --git a/apps/contacts/ajax/deleteproperty.php b/apps/contacts/ajax/deleteproperty.php
index 89cf292f4f..d745d3271d 100644
--- a/apps/contacts/ajax/deleteproperty.php
+++ b/apps/contacts/ajax/deleteproperty.php
@@ -33,6 +33,11 @@ $checksum = $_GET['checksum'];
$vcard = OC_Contacts_App::getContactVCard( $id );
$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum);
+if(is_null($line)){
+ $l=new OC_L10N('contacts');
+ OC_JSON::error(array('data' => array( 'message' => $l->t('Information about vCard is incorrect. Please reload the page.'))));
+ exit();
+}
unset($vcard->children[$line]);
diff --git a/apps/contacts/ajax/setproperty.php b/apps/contacts/ajax/setproperty.php
index cdc6d34c52..cf3fe58224 100644
--- a/apps/contacts/ajax/setproperty.php
+++ b/apps/contacts/ajax/setproperty.php
@@ -36,8 +36,9 @@ $line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum);
// Set the value
$value = $_POST['value'];
if(is_array($value)){
- $value = OC_VObject::escapeSemicolons($value);
+ ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form!
}
+OC_Log::write('contacts','ajax/setproperty.php: setting: '.$vcard->children[$line]->name.': '.$value, OC_Log::DEBUG);
$vcard->children[$line]->setValue($value);
// Add parameters
@@ -87,6 +88,9 @@ $phone_types = OC_Contacts_App::getTypesOfProperty('TEL');
if ($vcard->children[$line]->name == 'FN'){
$tmpl = new OC_Template('contacts','part.property.FN');
}
+elseif ($vcard->children[$line]->name == 'N'){
+ $tmpl = new OC_Template('contacts','part.property.N');
+}
else{
$tmpl = new OC_Template('contacts','part.property');
}
diff --git a/apps/contacts/ajax/showsetproperty.php b/apps/contacts/ajax/showsetproperty.php
index e23fa21c56..577230e456 100644
--- a/apps/contacts/ajax/showsetproperty.php
+++ b/apps/contacts/ajax/showsetproperty.php
@@ -33,6 +33,11 @@ $checksum = $_GET['checksum'];
$vcard = OC_Contacts_App::getContactVCard( $id );
$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum);
+if(is_null($line)){
+ $l=new OC_L10N('contacts');
+ OC_JSON::error(array('data' => array( 'message' => $l->t('Information about vCard is incorrect. Please reload the page.'))));
+ exit();
+}
$adr_types = OC_Contacts_App::getTypesOfProperty('ADR');
$phone_types = OC_Contacts_App::getTypesOfProperty('TEL');
diff --git a/apps/contacts/css/styles.css b/apps/contacts/css/styles.css
index 4fcd8fc113..58e1bf6c93 100644
--- a/apps/contacts/css/styles.css
+++ b/apps/contacts/css/styles.css
@@ -2,6 +2,7 @@
#leftcontent a { height: 23px; display: block; margin: 0 0 0 0; padding: 0 0 0 25px; }
#chooseaddressbook {margin-right: 170px; float: right;}
#contacts_details_name { font-weight:bold;font-size:1.1em;margin-left:25%;}
+#contacts_details_name_n { font-size:0.8em;margin-left:25%;color:#666;}
#contacts_details_photo { margin:.5em 0em .5em 25%; }
#contacts_deletecard {position:absolute;top:15px;right:25px;}
@@ -12,41 +13,15 @@
#contacts_details_list li p.contacts_property_data, #contacts_details_list li ul.contacts_property_data { width:72%;float:left; clear: right; }
#contacts_setproperty_button { margin-left:25%; }
-dl.form
-{
- width: 100%;
- float: left;
- clear: right;
- margin: 1em;
- padding: 0;
-}
+#contacts_addcardform legend,label { font-weight: bold; width: 10em; overflow: ellipsis; }
+#contacts_addcardform legend { padding-left: 3em; font-size:1.1em; }
+#contacts_addcardform input[type="text"] { width: 25em; }
+#contacts_addcardform input[type="email"] { width: 15em; }
+#contacts_addcardform input[type="tel"] { width: 15em; }
-.form dt
-{
- display: table-cell;
- clear: left;
- float: left;
- min-width: 10em;
- margin: 0;
- padding-top: 0.5em;
- padding-right: 1em;
- font-weight: bold;
- text-align:right;
- vertical-align: text-bottom;
- bottom: 0px;
-}
-
-.form dd
-{
- display: table-cell;
- clear: right;
- float: left;
- min-width: 20em;
- margin: 0;
- padding: 0;
- white-space: nowrap;
- top: 0px;
-}
+dl.form { width: 100%; float: left; clear: right; margin: 1em; padding: 0; }
+.form dt { display: table-cell; clear: left; float: left; min-width: 10em; margin: 0; padding-top: 0.5em; padding-right: 1em;font-weight: bold; text-align:right; vertical-align: text-bottom; bottom: 0px; }
+.form dd { display: table-cell; clear: right; float: left; min-width: 20em; margin: 0; padding: 0; white-space: nowrap; top: 0px; }
.form input { position: relative; width: 20em; }
.contacts_property_data ul, ol.contacts_property_data { list-style:none; }
@@ -60,18 +35,3 @@ dl.form
.chzn-container.chzn-container-active .chzn-choices { border-bottom-left-radius: 0;border-bottom-right-radius: 0; }
.chzn-container .chzn-drop { border-bottom-left-radius: 0.5em;border-bottom-right-radius: 0.5em; }
-/* Form setup ----------------------------------------------------------------*/
-/* .forme {} */
-/* .forme ul, .forme ol { list-style:none; } */
-/* .forme .inputs, .forme .buttons { overflow: hidden; } */
-
-/* Labels --------------------------------------------------------------------*/
-/* .forme .input .label { width:25%; float:left; display:block; } */
-
-/* Inputs --------------------------------------------------------------------*/
-/* .forme .stringish input { width:72%; } */
-/* .forme .text textarea { width:72%; } */
-
-/* Buttons -------------------------------------------------------------------*/
-/* .forme .buttons { padding-left:25%; } */
-/* .forme .button { float:left; padding-left:0.5em; } */
diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php
index 39df497043..580cc72d5e 100644
--- a/apps/contacts/lib/app.php
+++ b/apps/contacts/lib/app.php
@@ -85,11 +85,6 @@ class OC_Contacts_App{
break;
}
}
- // FIXME: I'm not sure this should throw a JSON error as it might just be used to check for dupes. /Tanghus.
- if(is_null($line)){
- OC_JSON::error(array('data' => array( 'message' => self::$l10n->t('Information about vCard is incorrect. Please reload the page.'))));
- exit();
- }
return $line;
}
diff --git a/apps/contacts/templates/part.addcardform.php b/apps/contacts/templates/part.addcardform.php
index 11457ff269..17207d2ebc 100644
--- a/apps/contacts/templates/part.addcardform.php
+++ b/apps/contacts/templates/part.addcardform.php
@@ -1,11 +1,14 @@
-
+
-
- -
+
+ -
+
+ -
-
- -
+
+
-
+
+ -
-
- -
+
+
+
-
-
-
- -
+
+
-
+
+
+
+ -
-
-
- -
-
-
-
- -
+
+
-
+
-
-
- -
+
+
+
-
+
+
+ -
+
+
+
+ -
-
-
-
+
+
+
+
+
From 6c340416d9020f40031119d1d76bf797066895ec Mon Sep 17 00:00:00 2001
From: Thomas Tanghus
Date: Fri, 27 Jan 2012 21:34:56 +0100
Subject: [PATCH 3/6] Resize profile picture if bigger than 200px on either x
or y. Bolded text on message box.
---
apps/contacts/photo.php | 3 +++
apps/contacts/templates/part.messagebox.php | 6 +-----
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/apps/contacts/photo.php b/apps/contacts/photo.php
index 478ef829ca..756aae63c4 100644
--- a/apps/contacts/photo.php
+++ b/apps/contacts/photo.php
@@ -63,6 +63,9 @@ if( is_null($content)){
}
}
if($image->loadFromBase64($child->value)) {
+ if($image->width() > 200 || $image->height() > 200) {
+ $image->resize(200);
+ }
header('Content-Type: '.$mime);
$image();
exit();
diff --git a/apps/contacts/templates/part.messagebox.php b/apps/contacts/templates/part.messagebox.php
index 3681bb6e3f..5db10e7e6c 100644
--- a/apps/contacts/templates/part.messagebox.php
+++ b/apps/contacts/templates/part.messagebox.php
@@ -1,7 +1,3 @@
-
+
From 4145e3b2651312b5949de3aae4f34c1be5332eb8 Mon Sep 17 00:00:00 2001
From: Thomas Schmidt
Date: Wed, 1 Feb 2012 12:00:38 +0100
Subject: [PATCH 4/6] pre-select current language, sort available languages
---
settings/personal.php | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/settings/personal.php b/settings/personal.php
index 787957f246..3b90827ed9 100755
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -23,8 +23,10 @@ $relative=round(($used/$total)*10000)/100;
$email=OC_Preferences::getValue(OC_User::getUser(), 'settings','email','');
-$lang=OC_Preferences::getValue( OC_User::getUser(), 'core', 'lang', 'en' );
+$lang=OC_Preferences::getValue( OC_User::getUser(), 'core', 'lang', OC_L10N::findLanguage() );
$languageCodes=OC_L10N::findAvailableLanguages();
+sort ($languageCodes);
+
//put the current language in the front
unset($languageCodes[array_search($lang,$languageCodes)]);
array_unshift($languageCodes,$lang);
From e229a6adecde57d919b6b1385729cbf8cd41fe89 Mon Sep 17 00:00:00 2001
From: David Iwanowitsch
Date: Sun, 29 Jan 2012 19:32:33 +0100
Subject: [PATCH 5/6] Added searchprovider for bookmarks, initial l10n support
for bookmark plugin moved some code from updateList.php to bookmarks.php, to
make it reusable
---
apps/bookmarks/ajax/updateList.php | 60 ++------------
apps/bookmarks/appinfo/app.php | 7 +-
apps/bookmarks/js/bookmarksearch.js | 22 ++++++
apps/bookmarks/l10n/xgettextfiles | 5 ++
apps/bookmarks/lib/bookmarks.php | 117 ++++++++++++++++++++++++++++
apps/bookmarks/lib/search.php | 50 ++++++++++++
6 files changed, 205 insertions(+), 56 deletions(-)
create mode 100644 apps/bookmarks/js/bookmarksearch.js
create mode 100644 apps/bookmarks/l10n/xgettextfiles
create mode 100644 apps/bookmarks/lib/bookmarks.php
create mode 100644 apps/bookmarks/lib/search.php
diff --git a/apps/bookmarks/ajax/updateList.php b/apps/bookmarks/ajax/updateList.php
index d2a5397452..487e0d290e 100644
--- a/apps/bookmarks/ajax/updateList.php
+++ b/apps/bookmarks/ajax/updateList.php
@@ -5,6 +5,7 @@
*
* @author Arthur Schiwon
* @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de
+* @copyright 2012 David Iwanowitsch
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
@@ -30,71 +31,20 @@ require_once('../../../lib/base.php');
OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('bookmarks');
-$params=array(OC_User::getUser());
-$CONFIG_DBTYPE = OC_Config::getValue( 'dbtype', 'sqlite' );
//Filter for tag?
-$filterTag = isset($_GET['tag']) ? '%' . htmlspecialchars_decode($_GET['tag']) . '%' : false;
-if($filterTag){
- $sqlFilterTag = 'HAVING tags LIKE ?';
- $params[] = $filterTag;
- if($CONFIG_DBTYPE == 'pgsql' ) {
- $sqlFilterTag = 'HAVING array_to_string(array_agg(tag), \' \') LIKE ?';
- }
-} else {
- $sqlFilterTag = '';
-}
+$filterTag = isset($_GET['tag']) ? htmlspecialchars_decode($_GET['tag']) : false;
$offset = isset($_GET['page']) ? intval($_GET['page']) * 10 : 0;
$sort = isset($_GET['sort']) ? ($_GET['sort']) : 'bookmarks_sorting_recent';
if($sort == 'bookmarks_sorting_clicks') {
- $sqlSort = 'clickcount DESC';
+ $sqlSortColumn = 'clickcount';
} else {
- $sqlSort = 'id DESC';
+ $sqlSortColumn = 'id';
}
-if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){
- $_gc_separator = ', \' \'';
-} else {
- $_gc_separator = 'SEPARATOR \' \'';
-}
-if($CONFIG_DBTYPE == 'pgsql' ){
- $params[] = $offset;
- $query = OC_DB::prepare('
- SELECT id, url, title, array_to_string(array_agg(tag), \' \') as tags
- FROM *PREFIX*bookmarks
- LEFT JOIN *PREFIX*bookmarks_tags ON *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id
- WHERE
- *PREFIX*bookmarks.user_id = ?
- GROUP BY id, url, title
- '.$sqlFilterTag.'
- ORDER BY *PREFIX*bookmarks.'.$sqlSort.'
- LIMIT 10
- OFFSET ?');
-} else {
- $query = OC_DB::prepare('
- SELECT id, url, title,
- CASE WHEN *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id
- THEN GROUP_CONCAT( tag ' .$_gc_separator. ' )
- ELSE \' \'
- END
- AS tags
- FROM *PREFIX*bookmarks
- LEFT JOIN *PREFIX*bookmarks_tags ON 1=1
- WHERE (*PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id
- OR *PREFIX*bookmarks.id NOT IN (
- SELECT *PREFIX*bookmarks_tags.bookmark_id FROM *PREFIX*bookmarks_tags
- )
- )
- AND *PREFIX*bookmarks.user_id = ?
- GROUP BY url
- '.$sqlFilterTag.'
- ORDER BY *PREFIX*bookmarks.'.$sqlSort.'
- LIMIT '.$offset.', 10');
-}
-
-$bookmarks = $query->execute($params)->fetchAll();
+$bookmarks = OC_Bookmarks_Bookmarks::findBookmarks($offset, $sqlSortColumn, $filterTag, true);
OC_JSON::success(array('data' => $bookmarks));
diff --git a/apps/bookmarks/appinfo/app.php b/apps/bookmarks/appinfo/app.php
index 44a1e47dff..479d8ed476 100644
--- a/apps/bookmarks/appinfo/app.php
+++ b/apps/bookmarks/appinfo/app.php
@@ -7,8 +7,13 @@
* See the COPYING-README file.
*/
+OC::$CLASSPATH['OC_Bookmarks_Bookmarks'] = 'apps/bookmarks/lib/bookmarks.php';
+
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' ));
+$l = new OC_l10n('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' => $l->t('Bookmarks')));
OC_App::registerPersonal('bookmarks', 'settings');
+require_once('apps/bookmarks/lib/search.php');
+OC_Util::addScript('bookmarks','bookmarksearch');
diff --git a/apps/bookmarks/js/bookmarksearch.js b/apps/bookmarks/js/bookmarksearch.js
new file mode 100644
index 0000000000..39874aa0b2
--- /dev/null
+++ b/apps/bookmarks/js/bookmarksearch.js
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2012 David Iwanowitsch
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+$(document).ready(function(){
+ OC.search.customResults.Bookm.=function(row,item){
+ var a=row.find('a');
+ a.attr('target','_blank');
+ a.click(recordClick);
+ }
+});
+
+function recordClick(event) {
+ var jsFileLocation = $('script[src*=bookmarksearch]').attr('src');
+ jsFileLocation = jsFileLocation.replace('js/bookmarksearch.js', '');
+ $.ajax({
+ url: jsFileLocation + 'ajax/recordClick.php',
+ data: 'url=' + encodeURI($(this).attr('href')),
+ });
+}
diff --git a/apps/bookmarks/l10n/xgettextfiles b/apps/bookmarks/l10n/xgettextfiles
new file mode 100644
index 0000000000..cd55543239
--- /dev/null
+++ b/apps/bookmarks/l10n/xgettextfiles
@@ -0,0 +1,5 @@
+../appinfo/app.php
+../lib/search.php
+../templates/settings.php
+../templates/addBm.php
+../templates/list.php
diff --git a/apps/bookmarks/lib/bookmarks.php b/apps/bookmarks/lib/bookmarks.php
new file mode 100644
index 0000000000..81c1b03981
--- /dev/null
+++ b/apps/bookmarks/lib/bookmarks.php
@@ -0,0 +1,117 @@
+.
+ *
+ */
+
+/**
+ * This class manages bookmarks
+ */
+class OC_Bookmarks_Bookmarks{
+
+ /**
+ * @brief Finds all bookmarks, matching the filter
+ * @param offset result offset
+ * @param sqlSortColumn sort result with this column
+ * @param filter can be: empty -> no filter, a string -> filter this, a string array -> filter for all strings
+ * @param filterTagOnly if true, filter affacts only tags, else filter affects url, title and tags
+ * @return void
+ */
+ public static function findBookmarks($offset, $sqlSortColumn, $filter, $filterTagOnly){
+ //OC_Log::write('bookmarks', 'findBookmarks ' .$offset. ' '.$sqlSortColumn.' '. $filter.' '. $filterTagOnly ,OC_Log::DEBUG);
+ $CONFIG_DBTYPE = OC_Config::getValue( 'dbtype', 'sqlite' );
+
+ $params=array(OC_User::getUser());
+
+ if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){
+ $_gc_separator = ', \' \'';
+ } else {
+ $_gc_separator = 'SEPARATOR \' \'';
+ }
+
+ if($filter){
+ if($CONFIG_DBTYPE == 'pgsql' )
+ $tagString = 'array_to_string(array_agg(tag), \' \')';
+ else
+ $tagString = 'tags';
+
+ $sqlFilterTag = 'HAVING ';
+ if(is_array($filter)){
+ $first = true;
+ $filterstring = '';
+ foreach ($filter as $singleFilter){
+ $filterstring = $filterstring . ($first?'':' AND ') . $tagString.' LIKE ? ';
+ $params[] = '%'.$singleFilter.'%';
+ $first=false;
+ }
+ $sqlFilterTag = $sqlFilterTag . $filterstring;
+ } else{
+ $sqlFilterTag = $sqlFilterTag .$tagString.' LIKE ? ';
+ $params[] = '%'.$filter.'%';
+ }
+ } else {
+ $sqlFilterTag = '';
+ }
+
+ if($CONFIG_DBTYPE == 'pgsql' ){
+ $query = OC_DB::prepare('
+ SELECT id, url, title, '.($filterTagOnly?'':'url || title ||').' array_to_string(array_agg(tag), \' \') as tags
+ FROM *PREFIX*bookmarks
+ LEFT JOIN *PREFIX*bookmarks_tags ON *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id
+ WHERE
+ *PREFIX*bookmarks.user_id = ?
+ GROUP BY id, url, title
+ '.$sqlFilterTag.'
+ ORDER BY *PREFIX*bookmarks.'.$sqlSortColumn.' DESC
+ LIMIT 10
+ OFFSET '. $offset);
+ } else {
+ if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' )
+ $concatFunction = '(url || title || ';
+ else
+ $concatFunction = 'Concat(Concat( url, title), ';
+
+ $query = OC_DB::prepare('
+ SELECT id, url, title, '
+ .($filterTagOnly?'':$concatFunction).
+ 'CASE WHEN *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id
+ THEN GROUP_CONCAT( tag ' .$_gc_separator. ' )
+ ELSE \' \'
+ END '
+ .($filterTagOnly?'':')').'
+ AS tags
+ FROM *PREFIX*bookmarks
+ LEFT JOIN *PREFIX*bookmarks_tags ON 1=1
+ WHERE (*PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id
+ OR *PREFIX*bookmarks.id NOT IN (
+ SELECT *PREFIX*bookmarks_tags.bookmark_id FROM *PREFIX*bookmarks_tags
+ )
+ )
+ AND *PREFIX*bookmarks.user_id = ?
+ GROUP BY url
+ '.$sqlFilterTag.'
+ ORDER BY *PREFIX*bookmarks.'.$sqlSortColumn.' DESC
+ LIMIT '.$offset.', 10');
+ }
+
+ $bookmarks = $query->execute($params)->fetchAll();
+ return $bookmarks;
+ }
+}
+?>
diff --git a/apps/bookmarks/lib/search.php b/apps/bookmarks/lib/search.php
new file mode 100644
index 0000000000..59495db82e
--- /dev/null
+++ b/apps/bookmarks/lib/search.php
@@ -0,0 +1,50 @@
+
+ *
+ * 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 Affero General Public
+ * License along with this library. If not, see .
+ *
+ */
+
+class OC_Search_Provider_Bookmarks extends OC_Search_Provider{
+ function search($query){
+ $results=array();
+
+ $offset = 0;
+ $sqlSortColumn = 'id';
+
+ $searchquery=array();
+ if(substr_count($query, ' ') > 0){
+ $searchquery = explode(' ', $query);
+ }else{
+ $searchquery = $query;
+ }
+
+// OC_Log::write('bookmarks', 'search ' .$query ,OC_Log::DEBUG);
+ $bookmarks = OC_Bookmarks_Bookmarks::findBookmarks($offset, $sqlSortColumn, $searchquery, false);
+// OC_Log::write('bookmarks', 'found ' .count($bookmarks) ,OC_Log::DEBUG);
+ //$l = new OC_l10n('bookmarks'); //resulttype can't be localized, javascript relies on that type
+ foreach($bookmarks as $bookmark){
+ $results[]=new OC_Search_Result($bookmark['title'],'', $bookmark['url'],'Bookm.');
+ }
+
+ return $results;
+ }
+}
+new OC_Search_Provider_Bookmarks();
+
+?>
From 6583d30e26d752c5ddccb1e350e075f59b7ba75d Mon Sep 17 00:00:00 2001
From: David Iwanowitsch
Date: Mon, 30 Jan 2012 18:14:09 +0100
Subject: [PATCH 6/6] fix javascript
---
apps/bookmarks/js/bookmarksearch.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/bookmarks/js/bookmarksearch.js b/apps/bookmarks/js/bookmarksearch.js
index 39874aa0b2..e7a4fb1839 100644
--- a/apps/bookmarks/js/bookmarksearch.js
+++ b/apps/bookmarks/js/bookmarksearch.js
@@ -5,7 +5,7 @@
* See the COPYING-README file.
*/
$(document).ready(function(){
- OC.search.customResults.Bookm.=function(row,item){
+ OC.search.customResults['Bookm.'] = function(row,item){
var a=row.find('a');
a.attr('target','_blank');
a.click(recordClick);