define([ 'jquery', 'underscore', 'backbone', 'common', 'jquery.ui', /* for tabs */ 'file-tree', 'app/collections/repo-user-folder-perm', 'app/collections/repo-group-folder-perm', 'app/views/repo-folder-perm-item' ], function($, _, Backbone, Common, jQueryUI, FileTree, UserFolderPerm, GroupFolderPerm, ItemView) { 'use strict'; var View = Backbone.View.extend({ id: 'repo-folder-perm-popup', template: _.template($('#repo-folder-perm-admin-dialog-tmpl').html()), initialize: function(options) { this.repo_name = options.repo_name; this.repo_id = options.repo_id; this.is_group_owned_repo = options.is_group_owned_repo; this.render(); this.$('.op-target').css({'max-width':280}); // for long repo name if ($(window).width() < 768) { this.$el.css({ 'width': $(window).width() - 50, 'height': $(window).height() - 50, 'overflow': 'auto' }); } this.$el.modal({ focus: false, onClose: function() { $(document).off('click', hideItemEdit); $.modal.close(); } }); if ($(window).width() >= 768) { $("#simplemodal-container").css({ 'width':'auto', 'height':'auto' }); } this.$('.js-tabs').tabs(); this.userPerm = new UserFolderPerm({ is_group_owned_repo: this.is_group_owned_repo, repo_id: this.repo_id }); this.userPerm.perm_type = 'user'; this.$userPermPanel = this.$('#js-repo-user-folder-perm .js-folder-perm-content'); this.groupPerm = new GroupFolderPerm({ is_group_owned_repo: this.is_group_owned_repo, repo_id: this.repo_id }); this.groupPerm.perm_type = 'group'; this.$groupPermPanel = this.$('#js-repo-group-folder-perm .js-folder-perm-content'); this.renderPanel({ collection: this.userPerm, $panel: this.$userPermPanel }); this.renderPanel({ collection: this.groupPerm, $panel: this.$groupPermPanel }); // click to hide 'perm edit' var _this = this; var hideItemEdit = function(e) { var target = e.target || event.srcElement; var $el = _this.$('.perm-toggle-select:visible'); var $td = $el.parent(); if ($el.length && !$el.is(target) && !$el.find('*').is(target) && !$td.find('.perm-edit-icon').is(target)) { $el.addClass('hide'); $td.find('.perm').removeClass('hide'); } }; $(document).on('click', hideItemEdit); }, render: function() { this.$el.html(this.template({ title: gettext("{placeholder} Folder Permission") .replace('{placeholder}', '' + Common.HTMLescape(this.repo_name) + '') })); return this; }, renderPanel: function(options) { var collection = options.collection; var $panel = options.$panel; var $loadingTip = $('.loading-tip', $panel); var $error = $('.error', $panel); if (collection.perm_type == 'user') { $('[name="emails"]', $panel).select2($.extend( Common.contactInputOptionsForSelect2(), { placeholder: gettext("Search user or enter email and press Enter") // to override 'placeholder' returned by `Common.conta...` })); } else { var groups = []; $.ajax({ url: Common.getUrl({ name: 'shareable_groups' }), type: 'GET', dataType: 'json', cache: false, success: function(data) { for (var i = 0, len = data.length; i < len; i++) { groups.push({ 'id': data[i].id, 'name': data[i].name }); } groups.sort(function(a, b) { return Common.compareTwoWord(a.name, b.name); }); }, error: function(xhr, textStatus, errorThrown) { // do nothing }, complete: function() { var g_opts = ''; for (var i = 0, len = groups.length; i < len; i++) { g_opts += ''; } $('[name="groups"]', $panel).html(g_opts).select2({ placeholder: gettext("Select a group"), maximumSelectionSize: 1, formatSelectionTooBig: gettext("You can only select 1 item"), escapeMarkup: function(m) { return m; } }); } }); } // show existing items this.listenTo(collection, 'add', this.addItem); collection.fetch({ cache: false, success: function(collection, response, opts) { $loadingTip.hide(); }, error: function(collection, response, opts) { var err_msg = Common.prepareCollectionFetchErrorMsg(collection, response, opts); $error.html(err_msg).show(); $loadingTip.hide(); } }); }, addItem: function(model, collection, options) { var perm_type = collection.perm_type; var $panel = perm_type == 'user' ? this.$userPermPanel : this.$groupPermPanel; var for_user = perm_type == 'user' ? true : false; var encoded_path = Common.encodePath(model.get('folder_path')); var view = new ItemView({ item_data: $.extend(model.toJSON(), { 'for_user': for_user, 'show_folder_path': true, 'encoded_path': encoded_path, 'is_group_owned_repo': this.is_group_owned_repo }) }); if (options.prepend) { $('[name="folder_path"]', $panel).closest('tr').after(view.render().el); } else { $('tbody', $panel).append(view.render().el); } }, events: { 'click .js-add-folder': 'showFolderSelectForm', 'click .js-folder-select-submit': 'addFolder', 'click .js-folder-select-cancel': 'cancelFolderSelect', 'click .js-user-perm-add-submit': 'addPerm', 'click .js-group-perm-add-submit': 'addPerm' }, showFolderSelectForm: function(e) { var $icon = $(e.currentTarget); var $permContent = $icon.closest('.js-folder-perm-content').slideUp(); var $form = $('.js-folder-select-form', $permContent.parent()).slideDown(); var $jstreeContainer = $('.js-jtree-container', $form); if ($.jstree.reference($jstreeContainer)) { // null or {...} return; } FileTree.renderTreeForPath({ $form: $form, $container: $jstreeContainer, repo_id: this.repo_id, repo_name: this.repo_name, path: '/' }); }, addFolder: function(e) { var $submitBtn = $(e.currentTarget); var $form = $submitBtn.closest('form'); var $input = $('[name=dst_path]', $form); var path = $input.val(); var $error = $('.error', $form); if (!path) { $error.html(gettext("Please click and choose a directory.")).removeClass('hide'); return false; } $form.slideUp(); // clean the state $.jstree.reference($('.js-jtree-container', $form)).deselect_all(); $('[name=dst_path]', $form).val(''); $error.hide(); var $folderPerm = $('.js-folder-perm-content', $form.parent()).slideDown(); $('[name=folder_path]', $folderPerm).val(path); return false; }, cancelFolderSelect: function(e) { var $cancelBtn = $(e.currentTarget); var $form = $cancelBtn.closest('form').slideUp(); $('.js-folder-perm-content', $form.parent()).slideDown(); // clean the state var theTree = $.jstree.reference($('.js-jtree-container', $form)); if (theTree.get_selected().length > 0) { // if select any node theTree.deselect_all(); } }, addPerm: function(e) { var $submit = $(e.currentTarget); var $panel, $email_or_group, url, post_data, for_user; if ($submit.hasClass('js-user-perm-add-submit')) { for_user = true; $panel = this.$userPermPanel; url = Common.getUrl({ name: this.is_group_owned_repo ? 'group-owned-library-user-folder-permission' : 'repo_user_folder_perm', repo_id: this.repo_id }); var $email_or_group = $('[name="emails"]', $panel); var email = $email_or_group.val(); if (!email) { return false; } post_data = {'user_email': email.split(',')}; } else { for_user = false; $panel = this.$groupPermPanel; url = Common.getUrl({ name: this.is_group_owned_repo ? 'group-owned-library-group-folder-permission' : 'repo_group_folder_perm', repo_id: this.repo_id }); var $email_or_group = $('[name="groups"]', $panel); var group_val = $email_or_group.val().join(','); if (!group_val) { return false; } post_data = {'group_id': group_val.split(',')}; } var $path = $('[name="folder_path"]', $panel); var $perm = $('[name="permission"]', $panel); var perm = $perm.val(); var path = $path.val(); if (!perm || !path) { return false; } $.extend(post_data, {'folder_path': path, 'permission': perm}); var $error = $('.error', $panel); Common.disableButton($submit); var is_group_owned_repo = this.is_group_owned_repo; $.ajax({ url: url, dataType: 'json', method: 'POST', beforeSend: Common.prepareCSRFToken, traditional: true, data: post_data, success: function(data) { if (data.success.length > 0) { $(data.success).each(function(index, item) { var encoded_path = Common.encodePath(item.folder_path); var perm_item = new ItemView({ item_data: $.extend(item, { 'for_user': for_user, 'show_folder_path': true, 'encoded_path': encoded_path, 'is_group_owned_repo': is_group_owned_repo }) }); $('[name="folder_path"]', $panel).closest('tr').after(perm_item.el); }); $email_or_group.select2('val', ''); $path.val(''); $('option', $perm).prop('selected', false); $('[value="rw"]', $perm).prop('selected', true); $error.addClass('hide'); } if (data.failed.length > 0) { var error_msg = ''; $(data.failed).each(function(index, item) { error_msg += Common.HTMLescape(item.user_email || item.group_id) + ': ' + Common.HTMLescape(item.error_msg) + '
'; }); $error.html(error_msg).removeClass('hide'); } }, error: function(xhr) { var error_msg = Common.prepareAjaxErrorMsg(xhr); $error.html(error_msg).removeClass('hide'); }, complete: function() { Common.enableButton($submit); } }); } }); return View; });