summaryrefslogtreecommitdiffstats
path: root/apps/contacts/js
diff options
context:
space:
mode:
authorThomas Tanghus <thomas@tanghus.net>2012-03-07 16:39:56 +0100
committerThomas Tanghus <thomas@tanghus.net>2012-03-07 16:39:56 +0100
commit75323b86d157c48031b9ac8c151e4a41577a1481 (patch)
tree6e047d81b17a4bcbd15e9799ef8c5209c96a0ea5 /apps/contacts/js
parentfaf6055baa224fbf4248a70d28ae4416c9c7eb1c (diff)
downloadnextcloud-server-75323b86d157c48031b9ac8c151e4a41577a1481.tar.gz
nextcloud-server-75323b86d157c48031b9ac8c151e4a41577a1481.zip
Contacts: UI updates and ajax methods for categories.
Diffstat (limited to 'apps/contacts/js')
-rw-r--r--apps/contacts/js/contacts.js311
1 files changed, 260 insertions, 51 deletions
diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js
index 11661320c59..7306e5714c9 100644
--- a/apps/contacts/js/contacts.js
+++ b/apps/contacts/js/contacts.js
@@ -4,13 +4,105 @@ function ucwords (str) {
});
}
-String.prototype.strip_tags = function(){
- tags = this;
- stripped = tags.replace(/[\<\>]/gi, "");
- 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'){
+ alert(response.data.message);
+ } else {
+ alert(response);
+ }
+ } 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 {
+ alert(jsondata.data.message);
+ }
+ });
+ },
+ 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 {
+ alert(jsondata.data.message);
+ }
+ });
+ 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 {
+ alert(jsondata.data.message);
+ }
+ });
+ },
+ _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() {
@@ -125,22 +217,26 @@ Contacts={
// NOTE: Do we ever get here?
$('#messagebox').dialog('moveToTop');
}else{
- $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'messagebox.php'), function(){
- $('#messagebox').dialog(
- {
- autoOpen: true,
- title: title,
- buttons: [{
- text: "Ok",
- click: function() { $(this).dialog("close"); }
- }],
- close: function(event, ui) {
- $(this).dialog('destroy').remove();
- },
- open: function(event, ui) {
- $('#messagebox_msg').html(msg);
- }
- });
+ $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'messagebox.php'), function(jsondata){
+ if(jsondata.status != 'error'){
+ $('#messagebox').dialog(
+ {
+ autoOpen: true,
+ title: title,
+ buttons: [{
+ text: "Ok",
+ click: function() { $(this).dialog("close"); }
+ }],
+ close: function(event, ui) {
+ $(this).dialog('destroy').remove();
+ },
+ open: function(event, ui) {
+ $('#messagebox_msg').html(msg);
+ }
+ });
+ } else {
+ alert(jsondata.data.message);
+ }
});
}
},
@@ -182,6 +278,12 @@ Contacts={
$('#bday').datepicker({
dateFormat : 'dd-mm-yy'
});
+ $('#categories_value').find('select').multiselect({
+ noneSelectedText: t('contacts', 'Select categories'),
+ header: false,
+ selectedList: 6,
+ classes: 'categories'
+ });
// Style phone types
$('#phonelist').find('select[class*="contacts_property"]').multiselect({
noneSelectedText: t('contacts', 'Select type'),
@@ -361,7 +463,7 @@ Contacts={
this.data = jsondata;
this.id = this.data.id;
$('#rightcontent').data('id',this.id);
- //console.log('loaded: ' + this.data.FN[0]['value']);
+ console.log('loaded: ' + this.data.FN[0]['value']);
this.populateNameFields();
this.loadCategories();
this.loadPhoto();
@@ -369,6 +471,16 @@ Contacts={
this.loadPhones();
this.loadAddresses();
this.loadSingleProperties();
+ // TODO: load NOTE ;-)
+ if(this.data.NOTE) {
+ $('#note').data('checksum', this.data.NOTE[0]['checksum']);
+ $('#note').find('textarea').val(this.data.NOTE[0]['value']);
+ $('#note').show();
+ } else {
+ $('#note').data('checksum', '');
+ $('#note').find('textarea').val('');
+ $('#note').hide();
+ }
},
loadSingleProperties:function() {
var props = ['BDAY', 'NICKNAME', 'ORG'];
@@ -457,21 +569,64 @@ Contacts={
$('#contact_identity').find('*[data-element="FN"]').data('checksum', this.data.FN[0]['checksum']);
$('#contact_identity').show();
},
- loadCategories:function(){
+ hasCategory:function(category) {
+ if(this.data.CATEGORIES) {
+ for(var c in this.data.CATEGORIES[0]['value']) {
+ var cat = this.data.CATEGORIES[0]['value'][c];
+ //console.log('hasCategory: ' + cat + ' === ' + category + '?');
+ if(typeof cat === 'string' && (cat.toUpperCase() === category.toUpperCase())) {
+ //console.log('Yes');
+ return true;
+ }
+ }
+ }
+ return false;
+ },
+ categoriesChanged:function(categories) { // Categories added/deleted.
+ console.log('categoriesChanged for ' + Contacts.UI.Card.id + ' : ' + categories);
+ var categorylist = $('#categories_value').find('select');
+ categorylist.find('option').remove();
+ for(var category in categories) {
+ console.log('categoriesChanged: ' + categories[category]);
+ var selected = Contacts.UI.Card.hasCategory(categories[category]) ? ' selected="selected"' : '';
+ var item = '<option value="' + categories[category] + '"' + selected + '>' + categories[category] + '</option>';
+ $(item).appendTo(categorylist);
+ }
+ $('#categories_value').find('select').multiselect('refresh');
+ $.getJSON(OC.filePath('contacts', 'ajax', 'categories/checksumfor.php'),{'id':Contacts.UI.Card.id},function(jsondata){
+ if(jsondata.status == 'success'){
+ console.log('Setting checksum: ' + jsondata.data.checksum);
+ $('#categories_value').data('checksum', jsondata.data.checksum);
+ } else {
+ Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
+ }
+ });
+ },
+ loadCategories:function(){ // On loading contact.
+ var categories = $('#categories_value').find('select');
if(this.data.CATEGORIES) {
- //
+ $('#categories_value').data('checksum', this.data.CATEGORIES[0]['checksum']);
+ } else {
+ $('#categories_value').data('checksum', '');
}
+ categories.find('option').each(function(){
+ if(Contacts.UI.Card.hasCategory($(this).val())) {
+ $(this).attr('selected', 'selected');
+ } else {
+ $(this).removeAttr('selected');
+ }
+ });
+ categories.multiselect('refresh');
},
editNew:function(){ // add a new contact
this.id = ''; this.fn = ''; this.fullname = ''; this.givname = ''; this.famname = ''; this.addname = ''; this.honpre = ''; this.honsuf = '';
- $.getJSON('ajax/newcontact.php',{},function(jsondata){
+ $.getJSON(OC.filePath('contacts', 'ajax', 'newcontact.php'),{},function(jsondata){
if(jsondata.status == 'success'){
id = '';
$('#rightcontent').data('id','');
$('#rightcontent').html(jsondata.data.page);
Contacts.UI.Card.editName();
- }
- else{
+ } else {
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
//alert(jsondata.data.message);
}
@@ -479,14 +634,19 @@ Contacts={
},
savePropertyInternal:function(name, fields, oldchecksum, checksum){
// TODO: Add functionality for new fields.
- //console.log('savePropertyInternal: ' + name + ', checksum: ' + checksum);
- //console.log('savePropertyInternal: ' + this.data[name]);
+ console.log('savePropertyInternal: ' + name + ', fields: ' + fields + 'checksum: ' + checksum);
+ console.log('savePropertyInternal: ' + this.data[name]);
+ var multivalue = ['CATEGORIES'];
var params = {};
- var value = undefined;
+ var value = multivalue.indexOf(name) != -1 ? new Array() : undefined;
jQuery.each(fields, function(i, field){
//.substring(11,'parameters[TYPE][]'.indexOf(']'))
if(field.name.substring(0, 5) === 'value') {
- value = field.value;
+ if(multivalue.indexOf(name) != -1) {
+ value.push(field.value);
+ } else {
+ value = field.value;
+ }
} else if(field.name.substring(0, 10) === 'parameters') {
var p = field.name.substring(11,'parameters[TYPE][]'.indexOf(']'));
if(!(p in params)) {
@@ -506,7 +666,7 @@ Contacts={
saveProperty:function(obj){
// I couldn't get the selector to filter on 'contacts_property' so I filter by hand here :-/
if(!$(obj).hasClass('contacts_property')) {
- //console.log('Filtering out object.' + obj);
+ console.log('Filtering out object.' + obj);
return false;
}
if($(obj).hasClass('nonempty') && $(obj).val().trim() == '') {
@@ -529,32 +689,38 @@ Contacts={
if(checksum != undefined && checksum != '') { // save
q = q + '&checksum=' + checksum;
console.log('Saving: ' + q);
+ $(obj).attr('disabled', 'disabled');
$.post('ajax/saveproperty.php',q,function(jsondata){
if(jsondata.status == 'success'){
container.data('checksum', jsondata.data.checksum);
Contacts.UI.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum);
Contacts.UI.loading(container, false);
+ $(obj).removeAttr('disabled');
return true;
}
else{
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
Contacts.UI.loading(container, false);
+ $(obj).removeAttr('disabled');
return false;
}
},'json');
} else { // add
console.log('Adding: ' + q);
+ $(obj).attr('disabled', 'disabled');
$.post('ajax/addproperty.php',q,function(jsondata){
if(jsondata.status == 'success'){
container.data('checksum', jsondata.data.checksum);
// TODO: savePropertyInternal doesn't know about new fields
//Contacts.UI.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum);
Contacts.UI.loading(container, false);
+ $(obj).removeAttr('disabled');
return true;
}
else{
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
Contacts.UI.loading(container, false);
+ $(obj).removeAttr('disabled');
return false;
}
},'json');
@@ -565,10 +731,14 @@ Contacts={
console.log('addProperty:' + type);
switch (type) {
case 'PHOTO':
- this.loadPhoto();
+ this.loadPhoto(true);
$('#file_upload_form').show();
$('#contacts_propertymenu a[data-type="'+type+'"]').parent().hide();
break;
+ case 'NOTE':
+ $('#note').show();
+ $('#contacts_propertymenu a[data-type="'+type+'"]').parent().hide();
+ break;
case 'EMAIL':
if($('#emaillist>li').length == 1) {
$('#emails').show();
@@ -647,8 +817,9 @@ Contacts={
if($('#edit_name_dialog').dialog('isOpen') == true){
$('#edit_name_dialog').dialog('moveToTop');
}else{ // TODO: If id=='' call addcontact.php (or whatever name) instead and reload view with id.
- $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editname.php')+'?id='+this.id, function(){
- $('#edit_name_dialog' ).dialog({
+ $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editname.php')+'?id='+this.id, function(jsondata){
+ if(jsondata.status != 'error'){
+ $('#edit_name_dialog' ).dialog({
modal: (isnew && true || false),
closeOnEscape: (isnew == '' && false || true),
title: (isnew && t('contacts', 'Add contact') || t('contacts', 'Edit name')),
@@ -667,7 +838,10 @@ Contacts={
open : function(event, ui) {
// load 'N' property - maybe :-P
}*/
- });
+ });
+ } else {
+ alert(jsondata.data.message);
+ }
});
}
},
@@ -692,7 +866,14 @@ Contacts={
$('#fn_select option').remove();
//$('#fn_select').combobox('value', this.fn);
- var names = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname];
+ var tmp = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname];
+ var names = new Array();
+ for(var name in tmp) {
+ console.log('idx: ' + names.indexOf(tmp[name]));
+ if(names.indexOf(tmp[name]) == -1) {
+ names.push(tmp[name]);
+ }
+ }
$.each(names, function(key, value) {
$('#fn_select')
.append($('<option></option>')
@@ -771,8 +952,9 @@ Contacts={
if($('#edit_address_dialog').dialog('isOpen') == true){
$('#edit_address_dialog').dialog('moveToTop');
}else{
- $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editaddress.php')+q, function(){
- $('#edit_address_dialog' ).dialog({
+ $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editaddress.php')+q, function(jsondata){
+ if(jsondata.status != 'error'){
+ $('#edit_address_dialog' ).dialog({
/*modal: true,*/
height: 'auto', width: 'auto',
buttons: {
@@ -803,7 +985,10 @@ Contacts={
open : function(event, ui) {
// load 'ADR' property - maybe :-P
}*/
- });
+ });
+ } else {
+ alert(jsondata.data.message);
+ }
});
}
},
@@ -867,8 +1052,8 @@ Contacts={
form.submit();
}
},
- loadPhoto:function(){
- if(this.data.PHOTO) {
+ loadPhoto:function(force){
+ if(this.data.PHOTO||force==true) {
$.getJSON('ajax/loadphoto.php',{'id':this.id},function(jsondata){
if(jsondata.status == 'success'){
//alert(jsondata.data.page);
@@ -1006,13 +1191,17 @@ Contacts={
if($('#chooseaddressbook_dialog').dialog('isOpen') == true){
$('#chooseaddressbook_dialog').dialog('moveToTop');
}else{
- $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'chooseaddressbook.php'), function(){
- $('#chooseaddressbook_dialog').dialog({
- width : 600,
- close : function(event, ui) {
- $(this).dialog('destroy').remove();
- }
- });
+ $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'chooseaddressbook.php'), function(jsondata){
+ if(jsondata.status != 'error'){
+ $('#chooseaddressbook_dialog').dialog({
+ width : 600,
+ close : function(event, ui) {
+ $(this).dialog('destroy').remove();
+ }
+ });
+ } else {
+ alert(jsondata.data.message);
+ }
});
}
},
@@ -1121,6 +1310,7 @@ Contacts={
$(document).ready(function(){
Contacts.UI.loadHandlers();
+ Categories.changed = Contacts.UI.Card.categoriesChanged;
/**
* Show the Addressbook chooser
@@ -1189,7 +1379,8 @@ $(document).ready(function(){
// NOTE: For some reason the selector doesn't work when I select by '.contacts_property' too...
// I do the filtering in the event handler instead.
- $('input[type="text"],input[type="checkbox"],input[type="email"],input[type="tel"],input[type="date"], select').live('change', function(){
+ //$('input[type="text"],input[type="checkbox"],input[type="email"],input[type="tel"],input[type="date"], select').live('change', function(){
+ $('.contacts_property').live('change', function(){
Contacts.UI.Card.saveProperty(this);
});
@@ -1298,11 +1489,29 @@ $(document).ready(function(){
xhr.send(file);
}
+ $('body').live('click',function(e){
+ if(!$(e.target).is('#contacts_propertymenu_button')) {
+ $('#contacts_propertymenu').hide();
+ }
+ });
$('#contacts_propertymenu_button').live('click',function(){
- $('#contacts_propertymenu').is(':hidden') && $('#contacts_propertymenu').slideDown() || $('#contacts_propertymenu').slideUp();
+ var menu = $('#contacts_propertymenu');
+ if(menu.is(':hidden')) {
+ menu.show();
+ menu.find('ul').focus();
+ } else {
+ menu.hide();
+ }
});
$('#contacts_propertymenu a').live('click',function(){
Contacts.UI.Card.addProperty(this);
$('#contacts_propertymenu').hide();
});
});
+
+String.prototype.strip_tags = function(){
+ tags = this;
+ stripped = tags.replace(/[\<\>]/gi, "");
+ return stripped;
+}
+