Contacts: Modifications for using categories.

This commit is contained in:
Thomas Tanghus 2012-03-12 14:12:27 +01:00
parent 03eb5197b6
commit d36d317bb2
10 changed files with 69 additions and 187 deletions

View File

@ -1,39 +0,0 @@
<?php
/**
* Copyright (c) 2012 Thomas Tanghus <thomas@tanghus.net>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
require_once('../../../../lib/base.php');
OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('contacts');
function bailOut($msg) {
OC_JSON::error(array('data' => array('message' => $msg)));
OC_Log::write('contacts','ajax/categories/add.php: '.$msg, OC_Log::DEBUG);
exit();
}
function debug($msg) {
OC_Log::write('contacts','ajax/categories/add.php: '.$msg, OC_Log::DEBUG);
}
$category = isset($_GET['category'])?strip_tags($_GET['category']):null;
if(is_null($category)) {
bailOut(OC_Contacts_App::$l10n->t('No category to add?'));
}
debug(print_r($category, true));
$categories = new OC_VCategories('contacts');
if($categories->hasCategory($category)) {
bailOut(OC_Contacts_App::$l10n->t('This category already exists: '.$category));
} else {
$categories->add($category, true);
}
OC_JSON::success(array('data' => array('categories'=>$categories->categories())));
?>

View File

@ -63,11 +63,11 @@ if(!$checksum) {
if(is_array($value)){
$value = array_map('strip_tags', $value);
ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form!
if($name == 'CATEGORIES') {
$value = OC_Contacts_VCard::escapeDelimiters($value, ',');
} else {
//if($name == 'CATEGORIES') {
// $value = OC_Contacts_VCard::escapeDelimiters($value, ',');
//} else {
$value = OC_Contacts_VCard::escapeDelimiters($value, ';');
}
//}
} else {
$value = trim(strip_tags($value));
}

View File

@ -188,10 +188,3 @@ input[type="checkbox"] { width: 20px; height: 20px; vertical-align: bottom; }
.typelist { float: left; max-width: 10em; } /* for multiselect */
.addresslist { clear: both; }
#categoryform .scrollarea { position: absolute; left: 10px; top: 10px; right: 10px; bottom: 50px; overflow: auto; border:1px solid #ddd; background: #f8f8f8; }
#categoryform .bottombuttons { position: absolute; bottom: 10px;}
#categoryform .bottombuttons * { float: left;}
/*#categorylist { border:1px solid #ddd;}*/
#categorylist li { background:#f8f8f8; padding:.3em .8em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; -webkit-transition:background-color 500ms; -moz-transition:background-color 500ms; -o-transition:background-color 500ms; transition:background-color 500ms; }
#categorylist li:hover, li:active { background:#eee; }
#category_addinput { width: 10em; }

View File

@ -45,13 +45,14 @@ $freeSpace=max($freeSpace,0);
$maxUploadFilesize = min($maxUploadFilesize ,$freeSpace);
OC_Util::addScript('','jquery.multiselect');
OC_Util::addScript('','oc-vcategories');
OC_Util::addScript('contacts','contacts');
OC_Util::addScript('contacts','jquery.combobox');
OC_Util::addScript('contacts','jquery.inview');
OC_Util::addScript('contacts','jquery.Jcrop');
OC_Util::addScript('contacts','jquery.multi-autocomplete');
OC_Util::addStyle('','jquery.multiselect');
//OC_Util::addStyle('contacts','styles');
OC_Util::addStyle('','oc-vcategories');
OC_Util::addStyle('contacts','jquery.combobox');
OC_Util::addStyle('contacts','jquery.Jcrop');
OC_Util::addStyle('contacts','contacts');

View File

@ -10,105 +10,6 @@ String.prototype.strip_tags = function(){
return stripped;
};
Categories={
edit:function(){
console.log('Categories.edit');
$('body').append('<div id="category_dialog"></div>');
$('#category_dialog').load(OC.filePath('contacts', 'ajax', 'categories/edit.php'), function(response, status, xhr){
try {
var response = jQuery.parseJSON(response);
console.log('status: ' + status + ', response: ' + response + ', response.status:' + response.status);
if(response.status == 'error'){
OC.dialogs.alert(response.data.message, 'Error');
} else {
OC.dialogs.alert(response, 'Error');
}
} catch(e) {
$('#edit_categories_dialog').dialog({
modal: true,
height: 350, minHeight:200, width: 250, minWidth: 200,
buttons: {
'Delete':function() {
Categories.delete();
},
'Rescan':function() {
Categories.rescan();
}
},
close : function(event, ui) {
//alert('close');
$(this).dialog('destroy').remove();
$('#category_dialog').remove();
},
open : function(event, ui) {
$('#category_addinput').live('input',function(){
if($(this).val().length > 0) {
$('#category_addbutton').removeAttr('disabled');
}
});
$('#categoryform').submit(function() {
Categories.add($('#category_addinput').val());
$('#category_addinput').val('');
$('#category_addbutton').attr('disabled', 'disabled');
return false;
});
$('#category_addbutton').live('click',function(e){
e.preventDefault();
if($('#category_addinput').val().length > 0) {
Categories.add($('#category_addinput').val());
$('#category_addinput').val('');
}
});
}
});
}
});
},
delete:function(){
var categories = $('#categorylist').find('input[type="checkbox"]').serialize();
console.log('Categories.delete: ' + categories);
$.post(OC.filePath('contacts', 'ajax', 'categories/delete.php'),categories,function(jsondata){
if(jsondata.status == 'success'){
Categories._update(jsondata.data.categories);
} else {
OC.dialogs.alert(jsondata.data.message, 'Error');
}
});
},
add:function(category){
console.log('Categories.add ' + category);
$.getJSON(OC.filePath('contacts', 'ajax', 'categories/add.php'),{'category':category},function(jsondata){
if(jsondata.status == 'success'){
Categories._update(jsondata.data.categories);
} else {
OC.dialogs.alert(jsondata.data.message, 'Error');
}
});
return false;
},
rescan:function(){
console.log('Categories.rescan');
$.getJSON(OC.filePath('contacts', 'ajax', 'categories/rescan.php'),{},function(jsondata){
if(jsondata.status == 'success'){
Categories._update(jsondata.data.categories);
} else {
OC.dialogs.alert(jsondata.data.message, 'Error');
}
});
},
_update:function(categories){
var categorylist = $('#categorylist');
categorylist.find('li').remove();
for(var category in categories) {
var item = '<li><input type="checkbox" name="categories" value="' + categories[category] + '" />' + categories[category] + '</li>';
$(item).appendTo(categorylist);
}
if(Categories.changed != undefined) {
Categories.changed(categories);
}
}
}
Contacts={
UI:{
notImplemented:function() {
@ -146,7 +47,6 @@ Contacts={
console.log('uri: ' + uri);
var newWindow = window.open(uri,'_blank');
newWindow.focus();
//Contacts.UI.notImplemented();
},
mailTo:function(obj) {
var adr = Contacts.UI.propertyContainerFor($(obj)).find('input[type="email"]').val().trim();
@ -252,12 +152,12 @@ Contacts={
$('#bday').datepicker({
dateFormat : 'dd-mm-yy'
});
$('#categories_value').find('select').multiselect({
/*$('#categories_value').find('select').multiselect({
noneSelectedText: t('contacts', 'Select categories'),
header: false,
selectedList: 6,
classes: 'categories'
});
});*/
// Style phone types
$('#phonelist').find('select.contacts_property').multiselect({
noneSelectedText: t('contacts', 'Select type'),
@ -299,7 +199,7 @@ Contacts={
click: function() { $(this).dialog('close'); }
}
] );
//$('#categories').multiple_autocomplete({source: categories});
$('#categories').multiple_autocomplete({source: categories});
Contacts.UI.loadListHandlers();
},
Card:{
@ -440,7 +340,7 @@ Contacts={
$('#rightcontent').data('id',this.id);
console.log('loaded: ' + this.data.FN[0]['value']);
this.populateNameFields();
this.loadCategories();
//this.loadCategories();
this.loadPhoto();
this.loadMails();
this.loadPhones();
@ -458,7 +358,7 @@ Contacts={
}
},
loadSingleProperties:function() {
var props = ['BDAY', 'NICKNAME', 'ORG']; //, 'CATEGORIES'];
var props = ['BDAY', 'NICKNAME', 'ORG', 'CATEGORIES'];
// Clear all elements
$('#ident .propertycontainer').each(function(){
if(props.indexOf($(this).data('element')) > -1) {
@ -494,12 +394,12 @@ Contacts={
$('#contact_identity').find('#org_label').show();
$('#contact_identity').find('#org_value').show();
break;
/*case 'CATEGORIES':
case 'CATEGORIES':
$('#contact_identity').find('#categories').val(value);
$('#contact_identity').find('#categories_value').data('checksum', checksum);
$('#contact_identity').find('#categories_label').show();
$('#contact_identity').find('#categories_value').show();
break;*/
break;
}
} else {
$('#contacts_propertymenu a[data-type="'+props[prop]+'"]').parent().show();
@ -825,7 +725,7 @@ Contacts={
}*/
});
} else {
alert(jsondata.data.message);
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
}
@ -1295,7 +1195,8 @@ Contacts={
$(document).ready(function(){
Contacts.UI.loadHandlers();
Categories.changed = Contacts.UI.Card.categoriesChanged;
OCCategories.changed = Contacts.UI.Card.categoriesChanged;
OCCategories.app = 'contacts';
/**
* Show the Addressbook chooser

View File

@ -13,6 +13,9 @@
}
//console.log('_create: ' + this.options['id']);
var self = this;
this.element.bind('blur', function( event ) {
self.element.trigger('change'); // Changes wasn't saved when only using the dropdown.
});
this.element.bind( "keydown", function( event ) {
if ( event.keyCode === $.ui.keyCode.TAB &&
$( this ).data( "autocomplete" ).menu.active ) {
@ -42,6 +45,27 @@
return false;
}
});
this.button = $( "<button type='button'>&nbsp;</button>" )
.attr( "tabIndex", -1 )
.attr( "title", "Show All Items" )
.insertAfter( this.element )
.addClass('svg')
.addClass('action')
.addClass('combo-button')
.click(function() {
// close if already visible
if ( self.element.autocomplete( "widget" ).is( ":visible" ) ) {
self.element.autocomplete( "close" );
return;
}
// work around a bug (likely same cause as #5265)
$( this ).blur();
// pass empty string as value to search for, displaying all results
self.element.autocomplete( "search", "" );
self.element.focus();
});
},
});
})( jQuery );

View File

@ -442,9 +442,9 @@ class OC_Contacts_VCard{
//$value = htmlspecialchars($value);
if($property->name == 'ADR' || $property->name == 'N'){
$value = self::unescapeDelimiters($value);
} elseif($property->name == 'CATEGORIES') {
}/* elseif($property->name == 'CATEGORIES') {
$value = self::unescapeDelimiters($value, ',');
}
}*/
$temp = array(
'name' => $property->name,
'value' => $value,

View File

@ -1,6 +1,6 @@
<script type='text/javascript'>
var totalurl = '<?php echo OC_Helper::linkToAbsolute('contacts', 'carddav.php'); ?>/addressbooks';
var categories = <?php echo json_encode($_['categories']); ?>;
var categories = <?php sort($_['categories']); echo json_encode($_['categories']); ?>;
</script>
<div id="controls">
<form>

View File

@ -55,15 +55,15 @@ $id = isset($_['id']) ? $_['id'] : '';
<dd style="display:none;" class="propertycontainer" id="nickname_value" data-element="NICKNAME"><input id="nickname" required="required" name="value[NICKNAME]" type="text" class="contacts_property" style="width:16em;" name="value" value="" placeholder="<?php echo $l->t('Enter nickname'); ?>" /><a class="delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a></dd>
<dt style="display:none;" id="bday_label" data-element="BDAY"><label for="bday"><?php echo $l->t('Birthday'); ?></label></dt>
<dd style="display:none;" class="propertycontainer" id="bday_value" data-element="BDAY"><input id="bday" required="required" name="value" type="text" class="contacts_property" value="" placeholder="<?php echo $l->t('dd-mm-yyyy'); ?>" /><a class="delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a></dd>
<dt id="categories_label" data-element="CATEGORIES"><label for="categories"><?php echo $l->t('Categories'); ?></label></dt>
<!-- dt id="categories_label" data-element="CATEGORIES"><label for="categories"><?php echo $l->t('Categories'); ?></label></dt>
<dd class="propertycontainer" id="categories_value" data-element="CATEGORIES">
<select class="contacts_property" multiple="multiple" id="categories" name="value[]">
<?php echo html_select_options($_['categories'], array(), array('combine'=>true)) ?>
</select>
<a class="action edit" onclick="$(this).tipsy('hide');Categories.edit();" title="<?php echo $l->t('Edit categories'); ?>"></a>
</dd>
<!-- dt style="display:none;" id="categories_label" data-element="CATEGORIES"><label for="categories"><?php echo $l->t('Categories'); ?></label></dt>
<dd style="display:none;" class="propertycontainer" id="categories_value" data-element="CATEGORIES"><input id="categories" required="required" name="value[CATEGORIES]" type="text" class="contacts_property" style="width:16em;" name="value" value="" placeholder="<?php echo $l->t('Categories'); ?>" /><a class="delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a><a class="action edit" onclick="$(this).tipsy('hide');Categories.edit();" title="<?php echo $l->t('Edit categories'); ?>"></a></dd -->
<a class="action edit" onclick="$(this).tipsy('hide');OCCategories.edit();" title="<?php echo $l->t('Edit categories'); ?>"></a>
</dd -->
<dt style="display:none;" id="categories_label" data-element="CATEGORIES"><label for="categories"><?php echo $l->t('Categories'); ?></label></dt>
<dd style="display:none;" class="propertycontainer" id="categories_value" data-element="CATEGORIES"><input id="categories" required="required" name="value[CATEGORIES]" type="text" class="contacts_property" style="width:16em;" name="value" value="" placeholder="<?php echo $l->t('Categories'); ?>" /><a class="delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a><a class="action edit" onclick="$(this).tipsy('hide');OCCategories.edit();" title="<?php echo $l->t('Edit categories'); ?>"></a></dd>
</dl>
</fieldset>
<fieldset id="note" class="formfloat propertycontainer" style="display:none;" data-element="NOTE">

View File

@ -157,7 +157,7 @@ class OC_VCategories {
* @param $names An array of categories to delete
* @param $objects An array of arrays with [id,vobject] (as text) pairs suitable for updating the apps object table.
*/
public function delete($names, array &$objects) {
public function delete($names, array &$objects=null) {
if(!is_array($names)) {
$names = array($names);
}
@ -171,26 +171,28 @@ class OC_VCategories {
}
$this->save();
OC_Log::write('core','OC_VCategories::delete, after: '.print_r($this->categories, true), OC_Log::DEBUG);
foreach($objects as $key=>&$value) {
$vobject = OC_VObject::parse($value[1]);
if(!is_null($vobject)){
$categories = $vobject->getAsArray('CATEGORIES');
//OC_Log::write('core','OC_VCategories::delete, before: '.$key.': '.print_r($categories, true), OC_Log::DEBUG);
foreach($names as $name) {
$idx = $this->array_searchi($name, $categories);
OC_Log::write('core','OC_VCategories::delete, loop: '.$name.', '.print_r($idx, true), OC_Log::DEBUG);
if($idx !== false) {
OC_Log::write('core','OC_VCategories::delete, unsetting: '.$categories[$this->array_searchi($name, $categories)], OC_Log::DEBUG);
unset($categories[$this->array_searchi($name, $categories)]);
//unset($categories[$idx]);
if(!is_null($objects)) {
foreach($objects as $key=>&$value) {
$vobject = OC_VObject::parse($value[1]);
if(!is_null($vobject)){
$categories = $vobject->getAsArray('CATEGORIES');
//OC_Log::write('core','OC_VCategories::delete, before: '.$key.': '.print_r($categories, true), OC_Log::DEBUG);
foreach($names as $name) {
$idx = $this->array_searchi($name, $categories);
OC_Log::write('core','OC_VCategories::delete, loop: '.$name.', '.print_r($idx, true), OC_Log::DEBUG);
if($idx !== false) {
OC_Log::write('core','OC_VCategories::delete, unsetting: '.$categories[$this->array_searchi($name, $categories)], OC_Log::DEBUG);
unset($categories[$this->array_searchi($name, $categories)]);
//unset($categories[$idx]);
}
}
OC_Log::write('core','OC_VCategories::delete, after: '.$key.': '.print_r($categories, true), OC_Log::DEBUG);
$vobject->setString('CATEGORIES', implode(',', $categories));
$value[1] = $vobject->serialize();
$objects[$key] = $value;
} else {
OC_Log::write('core','OC_VCategories::delete, unable to parse. ID: '.$value[0].', '.substr($value[1], 0, 50).'(...)', OC_Log::DEBUG);
}
OC_Log::write('core','OC_VCategories::delete, after: '.$key.': '.print_r($categories, true), OC_Log::DEBUG);
$vobject->setString('CATEGORIES', implode(',', $categories));
$value[1] = $vobject->serialize();
$objects[$key] = $value;
} else {
OC_Log::write('core','OC_VCategories::delete, unable to parse. ID: '.$value[0].', '.substr($value[1], 0, 50).'(...)', OC_Log::DEBUG);
}
}
}