2016-02-07 09:29:49 +00:00
|
|
|
define([
|
|
|
|
'jquery',
|
|
|
|
'underscore',
|
|
|
|
'backbone',
|
|
|
|
'common',
|
2018-02-05 08:47:56 +00:00
|
|
|
'jquery.ui', /* for tabs */
|
2016-02-29 09:01:12 +00:00
|
|
|
'file-tree',
|
2016-02-07 09:29:49 +00:00
|
|
|
'app/collections/repo-user-folder-perm',
|
|
|
|
'app/collections/repo-group-folder-perm',
|
2016-08-30 03:15:22 +00:00
|
|
|
'app/views/repo-folder-perm-item'
|
2018-02-05 08:47:56 +00:00
|
|
|
], function($, _, Backbone, Common, jQueryUI, FileTree, UserFolderPerm, GroupFolderPerm, ItemView) {
|
2016-02-07 09:29:49 +00:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var View = Backbone.View.extend({
|
|
|
|
|
2016-03-10 10:02:32 +00:00
|
|
|
id: 'repo-folder-perm-popup',
|
2016-02-07 09:29:49 +00:00
|
|
|
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.render();
|
|
|
|
this.$('.op-target').css({'max-width':280}); // for long repo name
|
2016-12-03 09:29:41 +00:00
|
|
|
if ($(window).width() < 768) {
|
|
|
|
this.$el.css({
|
|
|
|
'width': $(window).width() - 50,
|
|
|
|
'height': $(window).height() - 50,
|
|
|
|
'overflow': 'auto'
|
|
|
|
});
|
|
|
|
}
|
2016-02-07 09:29:49 +00:00
|
|
|
this.$el.modal({
|
2016-02-29 09:01:12 +00:00
|
|
|
focus: false,
|
|
|
|
onClose: function() {
|
|
|
|
$(document).off('click', hideItemEdit);
|
|
|
|
$.modal.close();
|
|
|
|
}
|
2016-02-07 09:29:49 +00:00
|
|
|
});
|
2016-12-03 09:29:41 +00:00
|
|
|
if ($(window).width() >= 768) {
|
|
|
|
$("#simplemodal-container").css({
|
|
|
|
'width':'auto',
|
|
|
|
'height':'auto'
|
|
|
|
});
|
|
|
|
}
|
2016-02-07 09:29:49 +00:00
|
|
|
this.$('.js-tabs').tabs();
|
|
|
|
|
2016-02-29 09:01:12 +00:00
|
|
|
this.userPerm = new UserFolderPerm({repo_id: this.repo_id});
|
|
|
|
this.userPerm.perm_type = 'user';
|
|
|
|
this.$userPermPanel = this.$('#js-repo-user-folder-perm .js-folder-perm-content');
|
2016-02-07 09:29:49 +00:00
|
|
|
|
2016-02-29 09:01:12 +00:00
|
|
|
this.groupPerm = new GroupFolderPerm({repo_id: this.repo_id});
|
|
|
|
this.groupPerm.perm_type = 'group';
|
|
|
|
this.$groupPermPanel = this.$('#js-repo-group-folder-perm .js-folder-perm-content');
|
2016-02-07 09:29:49 +00:00
|
|
|
|
|
|
|
this.renderPanel({
|
2016-02-29 09:01:12 +00:00
|
|
|
collection: this.userPerm,
|
2016-02-07 09:29:49 +00:00
|
|
|
$panel: this.$userPermPanel
|
|
|
|
});
|
|
|
|
this.renderPanel({
|
2016-02-29 09:01:12 +00:00
|
|
|
collection: this.groupPerm,
|
2016-02-07 09:29:49 +00:00
|
|
|
$panel: this.$groupPermPanel
|
|
|
|
});
|
2016-02-29 09:01:12 +00:00
|
|
|
|
|
|
|
// 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) &&
|
2018-05-15 03:26:33 +00:00
|
|
|
!$td.find('.perm-edit-icon').is(target)) {
|
|
|
|
$el.addClass('hide');
|
|
|
|
$td.find('.perm').removeClass('hide');
|
2016-02-29 09:01:12 +00:00
|
|
|
}
|
|
|
|
};
|
2018-02-05 08:47:56 +00:00
|
|
|
$(document).on('click', hideItemEdit);
|
2016-02-07 09:29:49 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
render: function() {
|
|
|
|
this.$el.html(this.template({
|
|
|
|
title: gettext("{placeholder} Folder Permission")
|
|
|
|
.replace('{placeholder}',
|
|
|
|
'<span class="op-target ellipsis ellipsis-op-target" title="'
|
|
|
|
+ Common.HTMLescape(this.repo_name) + '">'
|
|
|
|
+ Common.HTMLescape(this.repo_name) + '</span>')
|
|
|
|
}));
|
|
|
|
|
|
|
|
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') {
|
2016-02-29 09:01:12 +00:00
|
|
|
$('[name="emails"]', $panel).select2($.extend(
|
2018-07-26 10:28:17 +00:00
|
|
|
Common.contactInputOptionsForSelect2(), {
|
|
|
|
'width': '100%'
|
|
|
|
}));
|
2016-02-07 09:29:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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) {
|
|
|
|
$loadingTip.hide();
|
2016-12-03 06:12:04 +00:00
|
|
|
var err_msg;
|
2016-02-07 09:29:49 +00:00
|
|
|
if (response.responseText) {
|
|
|
|
if (response['status'] == 401 || response['status'] == 403) {
|
|
|
|
err_msg = gettext("Permission error");
|
|
|
|
} else {
|
2018-02-05 08:47:56 +00:00
|
|
|
err_msg = JSON.parse(response.responseText).error_msg;
|
2016-02-07 09:29:49 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
err_msg = gettext('Please check the network.');
|
|
|
|
}
|
|
|
|
$error.html(err_msg).show();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
addItem: function(model, collection, options) {
|
|
|
|
var perm_type = collection.perm_type;
|
|
|
|
var $panel = perm_type == 'user' ? this.$userPermPanel : this.$groupPermPanel;
|
2016-08-30 03:15:22 +00:00
|
|
|
var for_user = perm_type == 'user' ? true : false;
|
|
|
|
var encoded_path = Common.encodePath(model.get('folder_path'));
|
2016-02-07 09:29:49 +00:00
|
|
|
var view = new ItemView({
|
2017-02-07 08:03:46 +00:00
|
|
|
item_data: $.extend(model.toJSON(), {'for_user': for_user, 'show_folder_path': true, 'encoded_path': encoded_path})
|
2016-02-07 09:29:49 +00:00
|
|
|
});
|
2016-08-30 03:15:22 +00:00
|
|
|
|
2016-02-29 09:01:12 +00:00
|
|
|
if (options.prepend) {
|
|
|
|
$('[name="folder_path"]', $panel).closest('tr').after(view.render().el);
|
|
|
|
} else {
|
|
|
|
$('tbody', $panel).append(view.render().el);
|
|
|
|
}
|
2016-02-23 04:46:00 +00:00
|
|
|
},
|
|
|
|
|
2016-02-29 09:01:12 +00:00
|
|
|
events: {
|
2018-07-26 10:28:17 +00:00
|
|
|
'click #repo-group-folder-perm-tab': 'clickGroupPermTab',
|
|
|
|
|
2016-03-10 05:56:00 +00:00
|
|
|
'click .js-add-folder': 'showFolderSelectForm',
|
2016-02-29 09:01:12 +00:00
|
|
|
'click .js-folder-select-submit': 'addFolder',
|
|
|
|
'click .js-folder-select-cancel': 'cancelFolderSelect',
|
|
|
|
|
2016-08-30 03:15:22 +00:00
|
|
|
'click .js-user-perm-add-submit': 'addPerm',
|
|
|
|
'click .js-group-perm-add-submit': 'addPerm'
|
2016-02-29 09:01:12 +00:00
|
|
|
},
|
|
|
|
|
2018-07-26 10:28:17 +00:00
|
|
|
clickGroupPermTab: function() {
|
|
|
|
var groups = app.pageOptions.joined_groups_exclude_address_book || [];
|
|
|
|
var group_list = [];
|
|
|
|
for (var i = 0, len = groups.length; i < len; i++) {
|
|
|
|
group_list.push({
|
|
|
|
id: groups[i].id,
|
|
|
|
text: groups[i].name
|
|
|
|
});
|
|
|
|
}
|
|
|
|
$('[name="groups"]', this.$groupPermPanel).select2({
|
|
|
|
language: Common.i18nForSelect2(),
|
|
|
|
width: '100%',
|
|
|
|
multiple: true,
|
|
|
|
data: group_list,
|
|
|
|
placeholder: gettext("Select groups"),
|
|
|
|
escapeMarkup: function(m) { return m; }
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2016-02-29 09:01:12 +00:00
|
|
|
showFolderSelectForm: function(e) {
|
2016-02-23 04:46:00 +00:00
|
|
|
var $icon = $(e.currentTarget);
|
|
|
|
var $permContent = $icon.closest('.js-folder-perm-content').slideUp();
|
2016-02-29 09:01:12 +00:00
|
|
|
var $form = $('.js-folder-select-form', $permContent.parent()).slideDown();
|
2016-08-31 08:10:46 +00:00
|
|
|
|
2016-02-29 09:01:12 +00:00
|
|
|
var $jstreeContainer = $('.js-jtree-container', $form);
|
2016-08-31 08:10:46 +00:00
|
|
|
if ($.jstree.reference($jstreeContainer)) { // null or {...}
|
|
|
|
return;
|
|
|
|
}
|
2016-03-10 07:11:21 +00:00
|
|
|
FileTree.renderTreeForPath({
|
|
|
|
$form: $form,
|
|
|
|
$container: $jstreeContainer,
|
|
|
|
repo_id: this.repo_id,
|
|
|
|
repo_name: this.repo_name,
|
|
|
|
path: '/'
|
|
|
|
});
|
2016-02-29 09:01:12 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
addFolder: function(e) {
|
|
|
|
var $submitBtn = $(e.currentTarget);
|
|
|
|
|
|
|
|
var $form = $submitBtn.closest('form');
|
2016-08-31 08:10:46 +00:00
|
|
|
var $input = $('[name=dst_path]', $form);
|
|
|
|
var path = $input.val();
|
|
|
|
var $error = $('.error', $form);
|
2016-02-29 09:01:12 +00:00
|
|
|
if (!path) {
|
2016-08-31 08:10:46 +00:00
|
|
|
$error.html(gettext("Please click and choose a directory.")).removeClass('hide');
|
2016-02-29 09:01:12 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
$form.slideUp();
|
2016-08-31 08:10:46 +00:00
|
|
|
|
|
|
|
// clean the state
|
|
|
|
$.jstree.reference($('.js-jtree-container', $form)).deselect_all();
|
|
|
|
$('[name=dst_path]', $form).val('');
|
|
|
|
$error.hide();
|
2016-02-29 09:01:12 +00:00
|
|
|
|
|
|
|
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();
|
2016-08-31 08:10:46 +00:00
|
|
|
|
|
|
|
// clean the state
|
|
|
|
var theTree = $.jstree.reference($('.js-jtree-container', $form));
|
|
|
|
if (theTree.get_selected().length > 0) { // if select any node
|
|
|
|
theTree.deselect_all();
|
|
|
|
}
|
2016-02-29 09:01:12 +00:00
|
|
|
},
|
|
|
|
|
2016-08-30 03:15:22 +00:00
|
|
|
addPerm: function(e) {
|
|
|
|
var $submit = $(e.currentTarget);
|
|
|
|
var $panel, $email_or_group, url, post_data, for_user;
|
2016-02-29 09:01:12 +00:00
|
|
|
|
2016-08-30 03:15:22 +00:00
|
|
|
if ($submit.hasClass('js-user-perm-add-submit')) {
|
|
|
|
for_user = true;
|
|
|
|
$panel = this.$userPermPanel;
|
2018-07-26 10:28:17 +00:00
|
|
|
$email_or_group = $('[name="emails"]', $panel);
|
|
|
|
|
|
|
|
url = Common.getUrl({
|
|
|
|
name: 'repo_user_folder_perm',
|
|
|
|
repo_id: this.repo_id
|
|
|
|
});
|
2016-02-29 09:01:12 +00:00
|
|
|
|
2018-07-26 10:28:17 +00:00
|
|
|
var emails = $email_or_group.val(); // []
|
|
|
|
if (!emails.length) {
|
2016-08-30 03:15:22 +00:00
|
|
|
return false;
|
|
|
|
}
|
2016-02-29 09:01:12 +00:00
|
|
|
|
2018-07-26 10:28:17 +00:00
|
|
|
post_data = {'user_email': emails};
|
2016-08-30 03:15:22 +00:00
|
|
|
|
|
|
|
} else {
|
|
|
|
for_user = false;
|
|
|
|
$panel = this.$groupPermPanel;
|
2018-07-26 10:28:17 +00:00
|
|
|
$email_or_group = $('[name="groups"]', $panel);
|
2016-08-30 03:15:22 +00:00
|
|
|
|
2018-07-26 10:28:17 +00:00
|
|
|
url = Common.getUrl({
|
|
|
|
name: 'repo_group_folder_perm',
|
|
|
|
repo_id: this.repo_id
|
|
|
|
});
|
|
|
|
|
|
|
|
var groups = $email_or_group.val();
|
|
|
|
if (!groups.length) {
|
2016-08-30 03:15:22 +00:00
|
|
|
return false;
|
2016-02-29 09:01:12 +00:00
|
|
|
}
|
|
|
|
|
2018-07-26 10:28:17 +00:00
|
|
|
post_data = {'group_id': groups};
|
2016-08-30 03:15:22 +00:00
|
|
|
}
|
2016-02-29 09:01:12 +00:00
|
|
|
|
2016-08-30 03:15:22 +00:00
|
|
|
var $path = $('[name="folder_path"]', $panel);
|
|
|
|
var $perm = $('[name="permission"]', $panel);
|
|
|
|
var perm = $perm.val();
|
2016-02-29 09:01:12 +00:00
|
|
|
var path = $path.val();
|
|
|
|
|
2016-08-30 03:15:22 +00:00
|
|
|
if (!perm || !path) {
|
2016-02-29 09:01:12 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2018-07-26 10:28:17 +00:00
|
|
|
$.extend(post_data, {
|
|
|
|
'folder_path': path,
|
|
|
|
'permission': perm
|
|
|
|
});
|
2016-08-30 03:15:22 +00:00
|
|
|
|
|
|
|
var $error = $('.error', $panel);
|
2016-02-29 09:01:12 +00:00
|
|
|
Common.disableButton($submit);
|
|
|
|
|
2016-08-30 03:15:22 +00:00
|
|
|
$.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({
|
2018-07-26 10:28:17 +00:00
|
|
|
item_data: $.extend(item, {
|
|
|
|
'for_user': for_user,
|
|
|
|
'show_folder_path': true,
|
|
|
|
'encoded_path': encoded_path
|
|
|
|
})
|
2016-08-30 03:15:22 +00:00
|
|
|
});
|
2018-07-26 10:28:17 +00:00
|
|
|
$path.closest('tr').after(perm_item.el);
|
2016-08-30 03:15:22 +00:00
|
|
|
});
|
|
|
|
|
2018-07-26 10:28:17 +00:00
|
|
|
$email_or_group.val(null).trigger('change');
|
2016-08-30 03:15:22 +00:00
|
|
|
$path.val('');
|
2018-02-05 08:47:56 +00:00
|
|
|
$('option', $perm).prop('selected', false);
|
|
|
|
$('[value="rw"]', $perm).prop('selected', true);
|
2016-08-30 03:15:22 +00:00
|
|
|
$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) + '<br />';
|
|
|
|
});
|
|
|
|
$error.html(error_msg).removeClass('hide');
|
|
|
|
}
|
2016-02-29 09:01:12 +00:00
|
|
|
},
|
2016-08-30 03:15:22 +00:00
|
|
|
error: function(xhr) {
|
|
|
|
var error_msg;
|
|
|
|
if (xhr.responseText) {
|
2018-02-05 08:47:56 +00:00
|
|
|
error_msg = JSON.parse(xhr.responseText).error_msg;
|
2016-02-29 09:01:12 +00:00
|
|
|
} else {
|
2016-08-30 03:15:22 +00:00
|
|
|
error_msg = gettext("Failed. Please check the network.");
|
2016-02-29 09:01:12 +00:00
|
|
|
}
|
2016-08-30 03:15:22 +00:00
|
|
|
$error.html(error_msg).removeClass('hide');
|
2016-02-29 09:01:12 +00:00
|
|
|
},
|
|
|
|
complete: function() {
|
|
|
|
Common.enableButton($submit);
|
|
|
|
}
|
|
|
|
});
|
2016-02-07 09:29:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
return View;
|
|
|
|
});
|