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 @@ -
+ +
- +

+
- + + +
+ +
+
+ + +
+ + + +
+
+
+
+
+
+ + +
+ +
+
+
@@ -34,16 +61,16 @@
- +
- +
- + @@ -54,7 +81,7 @@ t('Address'); ?>
- +
- +
- +
-
+
- +
- + + +
- +
- + + +
- +
- +
-
+
- +
diff --git a/apps/contacts/templates/part.details.php b/apps/contacts/templates/part.details.php index 679ae5ede2..5badd81615 100644 --- a/apps/contacts/templates/part.details.php +++ b/apps/contacts/templates/part.details.php @@ -1,5 +1,6 @@ inc('part.property.FN', array('property' => $_['details']['FN'][0])); ?> + inc('part.property.N', array('property' => $_['details']['N'][0])); ?> diff --git a/apps/contacts/templates/part.property.N.php b/apps/contacts/templates/part.property.N.php new file mode 100644 index 0000000000..73d599ad7b --- /dev/null +++ b/apps/contacts/templates/part.property.N.php @@ -0,0 +1,4 @@ +

+ () + +

diff --git a/apps/contacts/templates/part.setpropertyform.php b/apps/contacts/templates/part.setpropertyform.php index 3e0b8d49b5..49fa966214 100644 --- a/apps/contacts/templates/part.setpropertyform.php +++ b/apps/contacts/templates/part.setpropertyform.php @@ -1,46 +1,79 @@ - + +

+

+
+
+
+
+
+
+ + +
+
+

+

-
    -
  1. +
    +
    +
    +
    -
  2. -
  3. +
+
+
+
- -
  • +
  • + +
    - - -
  • +
  • +
    + + +
    +
    - - -
  • - - -
  • -
  • +
  • +
    + - - -
  • + +
  • +
    + +
    +
    + +
    + +
    - - - +
    +
    + +
    +

    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);