owncloud/core

View on GitHub
core/js/tags.js

Summary

Maintainability
F
4 days
Test Coverage
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) {
            // noop
        });
    },
    _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) {
            // noop
        });
    },
    _addTag: function(self, type, tag) {
        $.when(self.addTag(tag, type))
        .then(function(tag) {
            self._fillTagList(type);
            self.$taginput.val('').trigger('input');
        })
        .fail(function(response) {
            // noop
        });
    }
};