372 lines
9.4 KiB
JavaScript
372 lines
9.4 KiB
JavaScript
OC.Tags= {
|
|
edit:function(type, cb) {
|
|
if(!type && !this.type) {
|
|
throw {
|
|
name: 'MissingParameter',
|
|
message: t(
|
|
'core',
|
|
'The object type is not specified.'
|
|
)
|
|
};
|
|
}
|
|
type = type ? type : this.type;
|
|
var self = this;
|
|
$.when(this._getTemplate()).then(function($tmpl) {
|
|
if(self.$dialog) {
|
|
self.$dialog.ocdialog('close');
|
|
}
|
|
self.$dialog = $tmpl.octemplate({
|
|
addText: t('core', 'Enter new')
|
|
});
|
|
$('body').append(self.$dialog);
|
|
|
|
self.$dialog.ready(function() {
|
|
self.$taglist = self.$dialog.find('.taglist');
|
|
self.$taginput = self.$dialog.find('.addinput');
|
|
self.$taglist.on('change', 'input:checkbox', function(event) {
|
|
self._handleChanges(self.$taglist, self.$taginput);
|
|
});
|
|
self.$taginput.on('input', function(event) {
|
|
self._handleChanges(self.$taglist, self.$taginput);
|
|
});
|
|
self.deleteButton = {
|
|
text: t('core', 'Delete'),
|
|
click: function() {
|
|
self._deleteTags(
|
|
self,
|
|
type,
|
|
self._selectedIds()
|
|
);
|
|
}
|
|
};
|
|
self.addButton = {
|
|
text: t('core', 'Add'),
|
|
click: function() {
|
|
self._addTag(
|
|
self,
|
|
type,
|
|
self.$taginput.val()
|
|
);
|
|
}
|
|
};
|
|
|
|
self._fillTagList(type, self.$taglist);
|
|
});
|
|
|
|
self.$dialog.ocdialog({
|
|
title: t('core', 'Edit tags'),
|
|
closeOnEscape: true,
|
|
width: 250,
|
|
height: 'auto',
|
|
modal: true,
|
|
//buttons: buttonlist,
|
|
close: function(event, ui) {
|
|
try {
|
|
$(this).ocdialog('destroy').remove();
|
|
} catch(e) {console.warn(e);}
|
|
self.$dialog = null;
|
|
}
|
|
});
|
|
})
|
|
.fail(function(status, error) {
|
|
// If the method is called while navigating away
|
|
// from the page, it is probably not needed ;)
|
|
if(status !== 0) {
|
|
alert(t('core', 'Error loading dialog template: {error}', {error: error}));
|
|
}
|
|
});
|
|
},
|
|
/**
|
|
* @param {string} type
|
|
* @param {string} tag
|
|
* @return jQuery.Promise which resolves with an array of ids
|
|
*/
|
|
getIdsForTag:function(type, tag) {
|
|
if(!type && !this.type) {
|
|
throw new Error('The object type is not specified.');
|
|
}
|
|
type = type ? type : this.type;
|
|
var defer = $.Deferred(),
|
|
url = OC.generateUrl('/tags/{type}/ids', {type: type});
|
|
$.getJSON(url, {tag: tag}, function(response) {
|
|
if(response.status === 'success') {
|
|
defer.resolve(response.ids);
|
|
} else {
|
|
defer.reject(response);
|
|
}
|
|
});
|
|
return defer.promise();
|
|
},
|
|
/**
|
|
* @param {string} type
|
|
* @return {*} jQuery.Promise which resolves with an array of ids
|
|
*/
|
|
getFavorites:function(type) {
|
|
if(!type && !this.type) {
|
|
throw new Error('The object type is not specified.');
|
|
}
|
|
type = type ? type : this.type;
|
|
var defer = $.Deferred(),
|
|
url = OC.generateUrl('/tags/{type}/favorites', {type: type});
|
|
$.getJSON(url, function(response) {
|
|
if(response.status === 'success') {
|
|
defer.resolve(response.ids);
|
|
} else {
|
|
defer.reject(response);
|
|
}
|
|
});
|
|
return defer.promise();
|
|
},
|
|
/**
|
|
* @param {string} type
|
|
* @return {*} jQuery.Promise which resolves with an array of id/name objects
|
|
*/
|
|
getTags:function(type) {
|
|
if(!type && !this.type) {
|
|
throw new Error('The object type is not specified.');
|
|
}
|
|
type = type ? type : this.type;
|
|
var defer = $.Deferred(),
|
|
url = OC.generateUrl('/tags/{type}', {type: type});
|
|
$.getJSON(url, function(response) {
|
|
if(response.status === 'success') {
|
|
defer.resolve(response.tags);
|
|
} else {
|
|
defer.reject(response);
|
|
}
|
|
});
|
|
return defer.promise();
|
|
},
|
|
/**
|
|
* @param {number} id
|
|
* @param {string} tag
|
|
* @param {string} type
|
|
* @return {*} jQuery.Promise
|
|
*/
|
|
tagAs:function(id, tag, type) {
|
|
if(!type && !this.type) {
|
|
throw new Error('The object type is not specified.');
|
|
}
|
|
type = type ? type : this.type;
|
|
var defer = $.Deferred(),
|
|
url = OC.generateUrl('/tags/{type}/tag/{id}/', {type: type, id: id});
|
|
$.post(url, {tag: tag}, function(response) {
|
|
if(response.status === 'success') {
|
|
defer.resolve(response);
|
|
} else {
|
|
defer.reject(response);
|
|
}
|
|
}).fail(function(jqXHR, textStatus, errorThrown) {
|
|
defer.reject(jqXHR.status, errorThrown);
|
|
});
|
|
return defer.promise();
|
|
},
|
|
/**
|
|
* @param {number} id
|
|
* @param {string} tag
|
|
* @param {string} type
|
|
* @return {*} jQuery.Promise
|
|
*/
|
|
unTag:function(id, tag, type) {
|
|
if(!type && !this.type) {
|
|
throw new Error('The object type is not specified.');
|
|
}
|
|
type = type ? type : this.type;
|
|
var defer = $.Deferred(),
|
|
self = this,
|
|
url = OC.generateUrl('/tags/{type}/untag/{id}/', {type: type, id: id});
|
|
$.post(url, {tag: tag}, function(response) {
|
|
if(response.status === 'success') {
|
|
defer.resolve(response);
|
|
} else {
|
|
defer.reject(response);
|
|
}
|
|
}).fail(function(jqXHR, textStatus, errorThrown) {
|
|
defer.reject(jqXHR.status, errorThrown);
|
|
});
|
|
return defer.promise();
|
|
},
|
|
/**
|
|
* @param {number} id
|
|
* @param {string} type
|
|
* @return {*} jQuery.Promise
|
|
*/
|
|
addToFavorites:function(id, type) {
|
|
if(!type && !this.type) {
|
|
throw new Error('The object type is not specified.');
|
|
}
|
|
type = type ? type : this.type;
|
|
var defer = $.Deferred(),
|
|
url = OC.generateUrl(
|
|
'/tags/{type}/favorite/{id}/',
|
|
{type: type, id: id}
|
|
);
|
|
$.post(url, function(response) {
|
|
if(response.status === 'success') {
|
|
defer.resolve(response);
|
|
} else {
|
|
defer.reject(response);
|
|
}
|
|
}).fail(function(jqXHR, textStatus, errorThrown) {
|
|
defer.reject(jqXHR.status, errorThrown);
|
|
});
|
|
return defer.promise();
|
|
},
|
|
/**
|
|
* @param {number} id
|
|
* @param {string} type
|
|
* @return {*} jQuery.Promise
|
|
*/
|
|
removeFromFavorites:function(id, type) {
|
|
if(!type && !this.type) {
|
|
throw new Error('The object type is not specified.');
|
|
}
|
|
type = type ? type : this.type;
|
|
var defer = $.Deferred(),
|
|
url = OC.generateUrl(
|
|
'/tags/{type}/unfavorite/{id}/',
|
|
{type: type, id: id}
|
|
);
|
|
$.post(url, function(response) {
|
|
if(response.status === 'success') {
|
|
defer.resolve();
|
|
} else {
|
|
defer.reject(response);
|
|
}
|
|
}).fail(function(jqXHR, textStatus, errorThrown) {
|
|
defer.reject(jqXHR.status, errorThrown);
|
|
});
|
|
return defer.promise();
|
|
},
|
|
/**
|
|
* @param {string} tag
|
|
* @param {string} type
|
|
* @return {*} jQuery.Promise which resolves with an object with the name and the new id
|
|
*/
|
|
addTag:function(tag, type) {
|
|
if(!type && !this.type) {
|
|
throw new Error('The object type is not specified.');
|
|
}
|
|
type = type ? type : this.type;
|
|
var defer = $.Deferred(),
|
|
url = OC.generateUrl('/tags/{type}/add', {type: type});
|
|
$.post(url,{tag:tag}, function(response) {
|
|
if(typeof cb == 'function') {
|
|
cb(response);
|
|
}
|
|
if(response.status === 'success') {
|
|
defer.resolve({id:response.id, name: tag});
|
|
} else {
|
|
defer.reject(response);
|
|
}
|
|
}).fail(function(jqXHR, textStatus, errorThrown) {
|
|
defer.reject(jqXHR.status, errorThrown);
|
|
});
|
|
return defer.promise();
|
|
},
|
|
/**
|
|
* @param {array} tags
|
|
* @param {string} type
|
|
* @return {*} jQuery.Promise
|
|
*/
|
|
deleteTags:function(tags, type) {
|
|
if(!type && !this.type) {
|
|
throw new Error('The object type is not specified.');
|
|
}
|
|
type = type ? type : this.type;
|
|
var defer = $.Deferred(),
|
|
url = OC.generateUrl('/tags/{type}/delete', {type: type});
|
|
if(!tags || !tags.length) {
|
|
throw new Error(t('core', 'No tags selected for deletion.'));
|
|
}
|
|
$.post(url, {tags:tags}, function(response) {
|
|
if(response.status === 'success') {
|
|
defer.resolve(response.tags);
|
|
} else {
|
|
defer.reject(response);
|
|
}
|
|
}).fail(function(jqXHR, textStatus, errorThrown) {
|
|
defer.reject(jqXHR.status, errorThrown);
|
|
});
|
|
return defer.promise();
|
|
},
|
|
_update:function(tags, type) {
|
|
if(!this.$dialog) {
|
|
return;
|
|
}
|
|
var $taglist = this.$dialog.find('.taglist'),
|
|
self = this;
|
|
$taglist.empty();
|
|
$.each(tags, function(idx, tag) {
|
|
var $item = self.$listTmpl.octemplate({id: tag.id, name: tag.name});
|
|
$item.appendTo($taglist);
|
|
});
|
|
$(this).trigger('change', {type: type, tags: tags});
|
|
if(typeof this.changed === 'function') {
|
|
this.changed(tags);
|
|
}
|
|
},
|
|
_getTemplate: function() {
|
|
var defer = $.Deferred();
|
|
if(!this.$template) {
|
|
var self = this;
|
|
$.get(OC.filePath('core', 'templates', 'tags.html'), function(tmpl) {
|
|
self.$template = $(tmpl);
|
|
self.$listTmpl = self.$template.find('.taglist li:first-child').detach();
|
|
defer.resolve(self.$template);
|
|
})
|
|
.fail(function(jqXHR, textStatus, errorThrown) {
|
|
defer.reject(jqXHR.status, errorThrown);
|
|
});
|
|
} else {
|
|
defer.resolve(this.$template);
|
|
}
|
|
return defer.promise();
|
|
},
|
|
_fillTagList: function(type) {
|
|
var self = this;
|
|
$.when(this.getTags(type))
|
|
.then(function(tags) {
|
|
self._update(tags, type);
|
|
})
|
|
.fail(function(response) {
|
|
console.warn(response);
|
|
});
|
|
},
|
|
_selectedIds: function() {
|
|
return $.map(this.$taglist.find('input:checked'), function(b) {return $(b).val();});
|
|
},
|
|
_handleChanges: function($list, $input) {
|
|
var ids = this._selectedIds();
|
|
var buttons = [];
|
|
if($input.val().length) {
|
|
buttons.push(this.addButton);
|
|
}
|
|
if(ids.length) {
|
|
buttons.push(this.deleteButton);
|
|
}
|
|
this.$dialog.ocdialog('option', 'buttons', buttons);
|
|
},
|
|
_deleteTags: function(self, type, ids) {
|
|
$.when(self.deleteTags(ids, type))
|
|
.then(function() {
|
|
self._fillTagList(type);
|
|
self.$dialog.ocdialog('option', 'buttons', []);
|
|
})
|
|
.fail(function(response) {
|
|
console.warn(response);
|
|
});
|
|
},
|
|
_addTag: function(self, type, tag) {
|
|
$.when(self.addTag(tag, type))
|
|
.then(function(tag) {
|
|
self._fillTagList(type);
|
|
self.$taginput.val('').trigger('input');
|
|
})
|
|
.fail(function(response) {
|
|
console.warn(response);
|
|
});
|
|
}
|
|
};
|
|
|