mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-12 21:30:39 +00:00
@@ -98,9 +98,21 @@ define([
|
||||
|
||||
if (collection.perm_type == 'user') {
|
||||
$('[name="emails"]', $panel).select2($.extend(
|
||||
Common.contactInputOptionsForSelect2(), {
|
||||
'width': '100%'
|
||||
}));
|
||||
Common.contactInputOptionsForSelect2(), {
|
||||
placeholder: gettext("Search user or enter email and press Enter") // to override 'placeholder' returned by `Common.conta...`
|
||||
}));
|
||||
} else {
|
||||
var groups = app.pageOptions.joined_groups_exclude_address_book || [];
|
||||
var g_opts = '';
|
||||
for (var i = 0, len = groups.length; i < len; i++) {
|
||||
g_opts += '<option value="' + groups[i].id + '" data-index="' + i + '">' + groups[i].name + '</option>';
|
||||
}
|
||||
$('[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
|
||||
@@ -135,8 +147,6 @@ define([
|
||||
},
|
||||
|
||||
events: {
|
||||
'click #repo-group-folder-perm-tab': 'clickGroupPermTab',
|
||||
|
||||
'click .js-add-folder': 'showFolderSelectForm',
|
||||
'click .js-folder-select-submit': 'addFolder',
|
||||
'click .js-folder-select-cancel': 'cancelFolderSelect',
|
||||
@@ -145,25 +155,6 @@ define([
|
||||
'click .js-group-perm-add-submit': 'addPerm'
|
||||
},
|
||||
|
||||
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; }
|
||||
});
|
||||
},
|
||||
|
||||
showFolderSelectForm: function(e) {
|
||||
var $icon = $(e.currentTarget);
|
||||
var $permContent = $icon.closest('.js-folder-perm-content').slideUp();
|
||||
@@ -225,36 +216,29 @@ define([
|
||||
if ($submit.hasClass('js-user-perm-add-submit')) {
|
||||
for_user = true;
|
||||
$panel = this.$userPermPanel;
|
||||
$email_or_group = $('[name="emails"]', $panel);
|
||||
url = Common.getUrl({name: 'repo_user_folder_perm', repo_id: this.repo_id});
|
||||
|
||||
url = Common.getUrl({
|
||||
name: 'repo_user_folder_perm',
|
||||
repo_id: this.repo_id
|
||||
});
|
||||
|
||||
var emails = $email_or_group.val(); // []
|
||||
if (!emails.length) {
|
||||
var $email_or_group = $('[name="emails"]', $panel);
|
||||
var email = $email_or_group.val();
|
||||
if (!email) {
|
||||
return false;
|
||||
}
|
||||
|
||||
post_data = {'user_email': emails};
|
||||
post_data = {'user_email': email.split(',')};
|
||||
|
||||
|
||||
} else {
|
||||
for_user = false;
|
||||
$panel = this.$groupPermPanel;
|
||||
$email_or_group = $('[name="groups"]', $panel);
|
||||
url = Common.getUrl({name: 'repo_group_folder_perm', repo_id: this.repo_id});
|
||||
|
||||
url = Common.getUrl({
|
||||
name: 'repo_group_folder_perm',
|
||||
repo_id: this.repo_id
|
||||
});
|
||||
|
||||
var groups = $email_or_group.val();
|
||||
if (!groups.length) {
|
||||
var $email_or_group = $('[name="groups"]', $panel);
|
||||
var group_val = $email_or_group.val().join(',');
|
||||
if (!group_val) {
|
||||
return false;
|
||||
}
|
||||
|
||||
post_data = {'group_id': groups};
|
||||
post_data = {'group_id': group_val.split(',')};
|
||||
}
|
||||
|
||||
var $path = $('[name="folder_path"]', $panel);
|
||||
@@ -266,10 +250,7 @@ define([
|
||||
return false;
|
||||
}
|
||||
|
||||
$.extend(post_data, {
|
||||
'folder_path': path,
|
||||
'permission': perm
|
||||
});
|
||||
$.extend(post_data, {'folder_path': path, 'permission': perm});
|
||||
|
||||
var $error = $('.error', $panel);
|
||||
Common.disableButton($submit);
|
||||
@@ -286,16 +267,12 @@ define([
|
||||
$(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
|
||||
})
|
||||
item_data: $.extend(item, {'for_user': for_user, 'show_folder_path': true, 'encoded_path': encoded_path})
|
||||
});
|
||||
$path.closest('tr').after(perm_item.el);
|
||||
$('[name="folder_path"]', $panel).closest('tr').after(perm_item.el);
|
||||
});
|
||||
|
||||
$email_or_group.val(null).trigger('change');
|
||||
$email_or_group.select2('val', '');
|
||||
$path.val('');
|
||||
$('option', $perm).prop('selected', false);
|
||||
$('[value="rw"]', $perm).prop('selected', true);
|
||||
|
@@ -70,8 +70,7 @@ define([
|
||||
str += '<li class="cur-tag fleft">' + Common.HTMLescape(tags[i].name) + '</li>';
|
||||
s2_tags.push({
|
||||
'id': tags[i].name,
|
||||
'text': tags[i].name,
|
||||
'selected': true
|
||||
'text': tags[i].name
|
||||
});
|
||||
}
|
||||
this.s2_tags = s2_tags;
|
||||
@@ -84,19 +83,18 @@ define([
|
||||
this.$('.cur-tags, .tags-edit-icon').hide();
|
||||
this.$('.tags-submit-btn').show();
|
||||
|
||||
var $input = this.$('.tags-input');
|
||||
// Select2 has been initialized
|
||||
if ($input.hasClass("select2-hidden-accessible")) {
|
||||
this.$('.select2-container').show();
|
||||
$input.val(this.s2_tags2).trigger('change'); // s2_tags2
|
||||
var $input = this.$('input.tags-input');
|
||||
var $s2_container = this.$('.tags-input.select2-container');
|
||||
if ($s2_container.length) {
|
||||
$input.select2('data', this.s2_tags);
|
||||
$s2_container.show();
|
||||
} else {
|
||||
$input.show()
|
||||
.select2({
|
||||
language: Common.i18nForSelect2(),
|
||||
width: '100%',
|
||||
multiple: true,
|
||||
tags: this.s2_tags
|
||||
});
|
||||
tags: [],
|
||||
formatNoMatches: gettext("No matches")
|
||||
})
|
||||
.select2('data', this.s2_tags);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
@@ -104,7 +102,7 @@ define([
|
||||
submitTags: function() {
|
||||
var _this = this;
|
||||
var $input = this.$('.tags-input');
|
||||
var tags = $input.val();
|
||||
var tags = $input.select2('val');
|
||||
var $submit = this.$('.tags-submit-btn');
|
||||
var $error = this.$('.tags-container .error');
|
||||
var error_msg;
|
||||
@@ -141,14 +139,15 @@ define([
|
||||
var s2_tags = [];
|
||||
for (var i = 0, len = tags.length; i < len; i++) {
|
||||
str += '<li class="cur-tag fleft">' + Common.HTMLescape(tags[i].name) + '</li>';
|
||||
s2_tags.push(tags[i].name);
|
||||
s2_tags.push({
|
||||
'id': tags[i].name,
|
||||
'text': tags[i].name
|
||||
});
|
||||
}
|
||||
_this.s2_tags2 = s2_tags; // s2_tags2
|
||||
_this.s2_tags = s2_tags;
|
||||
|
||||
$input.hide();
|
||||
_this.$('.tags-input').hide();
|
||||
$submit.hide();
|
||||
_this.$('.select2-container').hide();
|
||||
|
||||
_this.$('.cur-tags').html(str).show();
|
||||
_this.$('.tags-edit-icon').show();
|
||||
},
|
||||
|
@@ -120,37 +120,18 @@ define([
|
||||
'group_id': this.group_id
|
||||
});
|
||||
}
|
||||
$('[name="email"]', this.$add_user_perm).select2($.extend({
|
||||
'width': '100%'
|
||||
}, Common.contactInputOptionsForSelect2({'url': url})));
|
||||
},
|
||||
|
||||
events: {
|
||||
'click #group-folder-perm-tab': 'clickGroupFolderPermTab',
|
||||
|
||||
'click #add-user-folder-perm .submit': 'addFolderPerm',
|
||||
'click #add-group-folder-perm .submit': 'addFolderPerm'
|
||||
},
|
||||
|
||||
clickGroupFolderPermTab: function() {
|
||||
var _this = this;
|
||||
$('[name="email"]', this.$add_user_perm).select2(
|
||||
Common.contactInputOptionsForSelect2({'url': url}));
|
||||
|
||||
// use select2 to 'group' input in 'add group perm'
|
||||
var groups;
|
||||
var prepareGroupSelector = function(groups) {
|
||||
var group_list = [];
|
||||
var g_opts = '';
|
||||
for (var i = 0, len = groups.length; i < len; i++) {
|
||||
group_list.push({
|
||||
id: groups[i].id,
|
||||
text: groups[i].name
|
||||
});
|
||||
g_opts += '<option value="' + groups[i].id + '" data-index="' + i + '">' + groups[i].name + '</option>';
|
||||
}
|
||||
$('[name="group"]', _this.$add_group_perm).select2({
|
||||
language: Common.i18nForSelect2(),
|
||||
width: '100%',
|
||||
multiple: true,
|
||||
$('[name="group"]', _this.$add_group_perm).html(g_opts).select2({
|
||||
placeholder: gettext("Select groups"),
|
||||
data: group_list,
|
||||
escapeMarkup: function(m) { return m; }
|
||||
});
|
||||
};
|
||||
@@ -178,12 +159,16 @@ define([
|
||||
}
|
||||
},
|
||||
|
||||
events: {
|
||||
'click #add-user-folder-perm .submit': 'addFolderPerm',
|
||||
'click #add-group-folder-perm .submit': 'addFolderPerm'
|
||||
},
|
||||
|
||||
addFolderPerm: function(e) {
|
||||
var $form, $input, $error, url, perm, post_data, extended_data;
|
||||
var $form, $error, url, post_data, extended_data;
|
||||
|
||||
if ($(e.currentTarget).closest('tr').attr('id') == 'add-user-folder-perm') {
|
||||
$form = this.$add_user_perm;
|
||||
$input = $('[name="email"]', $form);
|
||||
$error = $('#user-folder-perm .error');
|
||||
|
||||
url = Common.getUrl({
|
||||
@@ -192,17 +177,17 @@ define([
|
||||
'repo_user_folder_perm',
|
||||
repo_id: this.repo_id
|
||||
});
|
||||
var emails_group_ids_input = $('[name="email"]', $form),
|
||||
emails = emails_group_ids_input.val(),
|
||||
perm = $('[name="permission"]', $form).val();
|
||||
|
||||
var emails = $input.val(); // []
|
||||
perm = $('[name="permission"]', $form).val();
|
||||
|
||||
if (!emails.length || !perm) {
|
||||
if (!emails || !perm) {
|
||||
return false;
|
||||
}
|
||||
|
||||
post_data = {
|
||||
'folder_path': this.path,
|
||||
'user_email': emails,
|
||||
'user_email': emails.split(','),
|
||||
'permission': perm
|
||||
};
|
||||
|
||||
@@ -213,7 +198,6 @@ define([
|
||||
|
||||
} else {
|
||||
$form = this.$add_group_perm;
|
||||
$input = $('[name="group"]', $form);
|
||||
$error = $('#group-folder-perm .error');
|
||||
|
||||
url = Common.getUrl({
|
||||
@@ -223,16 +207,17 @@ define([
|
||||
repo_id: this.repo_id
|
||||
});
|
||||
|
||||
var group_ids = $input.val();
|
||||
perm = $('[name="permission"]', $form).val();
|
||||
var emails_group_ids_input = $('[name="group"]', $form),
|
||||
group_ids = emails_group_ids_input.val().join(','),
|
||||
perm = $('[name="permission"]', $form).val();
|
||||
|
||||
if (!group_ids.length || !perm) {
|
||||
if (!group_ids || !perm) {
|
||||
return false;
|
||||
}
|
||||
|
||||
post_data = {
|
||||
'folder_path': this.path,
|
||||
'group_id': group_ids,
|
||||
'group_id': group_ids.split(','),
|
||||
'permission': perm
|
||||
};
|
||||
|
||||
@@ -262,7 +247,7 @@ define([
|
||||
$form.closest('tr').after(perm_item.el);
|
||||
});
|
||||
|
||||
$input.val(null).trigger('change');
|
||||
emails_group_ids_input.select2("val", "");
|
||||
$error.addClass('hide');
|
||||
}
|
||||
if (data.failed.length > 0) {
|
||||
|
@@ -130,7 +130,7 @@ define([
|
||||
validate: true,
|
||||
prepend: true,
|
||||
success: function() {
|
||||
$input.val(null).trigger('change');
|
||||
$input.select2('val', '');
|
||||
},
|
||||
error: function(collection, response, options) {
|
||||
var error_msg = Common.prepareAjaxErrorMsg(response);
|
||||
@@ -148,7 +148,7 @@ define([
|
||||
beforeSend: Common.prepareCSRFToken,
|
||||
data: {'emails': input_val},
|
||||
success: function(data) { // data: {success, failed}
|
||||
$input.val(null).trigger('change');
|
||||
$input.select2('val', '');
|
||||
|
||||
if (data.success.length > 0) {
|
||||
_this.collection.add(data.success, {prepend: true});
|
||||
|
@@ -146,13 +146,14 @@ define([
|
||||
$('[name="email"]', $form).select2($.extend(
|
||||
Common.contactInputOptionsForSelect2(), {
|
||||
width: '268px',
|
||||
maximumSelectionLength: 1,
|
||||
placeholder: gettext("Search user or enter email and press Enter")
|
||||
maximumSelectionSize: 1,
|
||||
placeholder: gettext("Search user or enter email and press Enter"), // to override 'placeholder' returned by `Common.conta...`
|
||||
formatSelectionTooBig: gettext("You cannot select any more choices")
|
||||
}));
|
||||
|
||||
$form.on('submit', function() {
|
||||
var email = $('[name="email"]', $(this)).val(); // []
|
||||
if (!email.length) {
|
||||
var email = $.trim($('[name="email"]', $(this)).val());
|
||||
if (!email) {
|
||||
return false;
|
||||
}
|
||||
if (email == _this.groupView.group.owner) {
|
||||
@@ -170,7 +171,7 @@ define([
|
||||
dataType: 'json',
|
||||
beforeSend: Common.prepareCSRFToken,
|
||||
data: {
|
||||
'owner': email[0]
|
||||
'owner': email
|
||||
},
|
||||
success: function(data) {
|
||||
_this.groupView.group = data;
|
||||
|
@@ -243,13 +243,14 @@ define([
|
||||
$('[name="email"]', $form).select2($.extend(
|
||||
Common.contactInputOptionsForSelect2(), {
|
||||
width: '280px',
|
||||
maximumSelectionLength: 1,
|
||||
placeholder: gettext("Search user or enter email and press Enter")
|
||||
maximumSelectionSize: 1,
|
||||
placeholder: gettext("Search user or enter email and press Enter"), // to override 'placeholder' returned by `Common.conta...`
|
||||
formatSelectionTooBig: gettext("You cannot select any more choices")
|
||||
}));
|
||||
|
||||
$form.on('submit', function() {
|
||||
var email = $('[name="email"]', $(this)).val(); // []
|
||||
if (!email.length) {
|
||||
var email = $.trim($('[name="email"]', $(this)).val());
|
||||
if (!email) {
|
||||
return false;
|
||||
}
|
||||
if (email == _this.model.get('owner')) {
|
||||
@@ -267,7 +268,7 @@ define([
|
||||
dataType: 'json',
|
||||
beforeSend: Common.prepareCSRFToken,
|
||||
data: {
|
||||
'owner': email[0]
|
||||
'owner': email
|
||||
},
|
||||
success: function() {
|
||||
$.modal.close();
|
||||
@@ -387,12 +388,7 @@ define([
|
||||
});
|
||||
}
|
||||
$('#simplemodal-data').html($form);
|
||||
$('[name="labels"]', $form).select2({
|
||||
language: Common.i18nForSelect2(),
|
||||
width: '100%',
|
||||
multiple: true,
|
||||
tags: s2_data
|
||||
});
|
||||
$('[name="labels"]', $form).select2({tags: s2_data});
|
||||
},
|
||||
error: function(xhr) {
|
||||
var error_msg = Common.prepareAjaxErrorMsg(xhr);
|
||||
@@ -402,11 +398,11 @@ define([
|
||||
|
||||
$form.on('submit', function() {
|
||||
var $input = $('[name="labels"]', $form);
|
||||
var labels = $input.val();
|
||||
var labels = $input.select2('val');
|
||||
var $error = $('.error', $form);
|
||||
var $submit = $('[type="submit"]', $form);
|
||||
|
||||
if (!labels.length) {
|
||||
if (labels.length == 0) {
|
||||
$error.html(gettext("It is required.")).show();
|
||||
return false;
|
||||
}
|
||||
|
@@ -53,7 +53,7 @@ define([
|
||||
}).modal({focus:false});
|
||||
}
|
||||
|
||||
this.$("#share-tabs").tabs({});
|
||||
this.$("#share-tabs").tabs();
|
||||
|
||||
if (!this.repo_encrypted && app.pageOptions.can_generate_share_link) {
|
||||
this.downloadLinkPanelInit();
|
||||
@@ -106,9 +106,6 @@ define([
|
||||
},
|
||||
|
||||
events: {
|
||||
'click #dir-user-share-tab': 'clickUserShareTab',
|
||||
'click #dir-group-share-tab': 'clickGroupShareTab',
|
||||
|
||||
'click [type="checkbox"]': 'clickCheckbox',
|
||||
'click .shared-link': 'clickToSelect',
|
||||
|
||||
@@ -140,40 +137,6 @@ define([
|
||||
'click #add-dir-group-share-item .submit': 'dirGroupShare'
|
||||
},
|
||||
|
||||
// To make select2 input get the right width
|
||||
clickUserShareTab: function() {
|
||||
var $add_item = $('#add-dir-user-share-item');
|
||||
$('[name="emails"]', $add_item).select2($.extend({
|
||||
'width': '100%'
|
||||
}, Common.contactInputOptionsForSelect2()));
|
||||
},
|
||||
|
||||
clickGroupShareTab: function() {
|
||||
var $add_item = $('#add-dir-group-share-item');
|
||||
var prepareGroupsSelector = function(groups) {
|
||||
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"]', $add_item).select2({
|
||||
language: Common.i18nForSelect2(),
|
||||
width: '100%',
|
||||
multiple: true,
|
||||
placeholder: gettext("Select groups"),
|
||||
data: group_list,
|
||||
escapeMarkup: function(m) { return m; }
|
||||
});
|
||||
};
|
||||
if (this.parent_group_id) { // group owned repo
|
||||
this.prepareAvailableGroupsForGroupOwnedRepo({'callback': prepareGroupsSelector});
|
||||
} else {
|
||||
this.prepareAvailableGroups({'callback': prepareGroupsSelector});
|
||||
}
|
||||
},
|
||||
|
||||
clickCheckbox: function(e) {
|
||||
var $el = $(e.currentTarget);
|
||||
// for link options such as 'password', 'expire'
|
||||
@@ -676,6 +639,9 @@ define([
|
||||
});
|
||||
$add_item.after(new_item.el);
|
||||
});
|
||||
$('[name="emails"]', $add_item).select2($.extend({
|
||||
//width: '292px' // the container will copy class 'w100' from the original element to get width
|
||||
},Common.contactInputOptionsForSelect2()));
|
||||
$table.removeClass('hide');
|
||||
},
|
||||
error: function(xhr, textStatus, errorThrown) {
|
||||
@@ -818,7 +784,23 @@ define([
|
||||
});
|
||||
$add_item.after(new_item.el);
|
||||
});
|
||||
$table.removeClass('hide');
|
||||
|
||||
var prepareGroupsSelector = function(groups) {
|
||||
var g_opts = '';
|
||||
for (var i = 0, len = groups.length; i < len; i++) {
|
||||
g_opts += '<option value="' + groups[i].id + '" data-index="' + i + '">' + groups[i].name + '</option>';
|
||||
}
|
||||
$('[name="groups"]', $add_item).html(g_opts).select2({
|
||||
placeholder: gettext("Select groups"),
|
||||
escapeMarkup: function(m) { return m; }
|
||||
});
|
||||
$table.removeClass('hide');
|
||||
};
|
||||
if (_this.parent_group_id) { // group owned repo
|
||||
_this.prepareAvailableGroupsForGroupOwnedRepo({'callback': prepareGroupsSelector});
|
||||
} else {
|
||||
_this.prepareAvailableGroups({'callback': prepareGroupsSelector});
|
||||
}
|
||||
},
|
||||
error: function(xhr, textStatus, errorThrown) {
|
||||
var err_msg = Common.prepareAjaxErrorMsg(xhr);
|
||||
@@ -840,9 +822,9 @@ define([
|
||||
var $panel = $('#dir-user-share');
|
||||
var $form = this.$('#add-dir-user-share-item'); // pseudo form
|
||||
|
||||
var $emails_input = $('[name="emails"]', $form),
|
||||
emails = $emails_input.val(); // []
|
||||
if (!emails.length) {
|
||||
var emails_input = $('[name="emails"]', $form),
|
||||
emails = emails_input.val(); // string
|
||||
if (!emails) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -864,7 +846,7 @@ define([
|
||||
data = {
|
||||
'permission': perm,
|
||||
'path': path,
|
||||
'username': emails
|
||||
'username': emails.split(',')
|
||||
};
|
||||
} else {
|
||||
url = Common.getUrl({
|
||||
@@ -874,7 +856,7 @@ define([
|
||||
method = 'PUT';
|
||||
data = {
|
||||
'share_type': 'user',
|
||||
'username': emails,
|
||||
'username': emails.split(','),
|
||||
'permission': perm
|
||||
};
|
||||
}
|
||||
@@ -898,7 +880,7 @@ define([
|
||||
});
|
||||
$add_item.after(new_item.el);
|
||||
});
|
||||
$emails_input.val(null).trigger('change'); // clear the selected items
|
||||
emails_input.select2("val", "");
|
||||
$('option', $perm).prop('selected', false);
|
||||
$('[value="rw"]', $perm).prop('selected', true);
|
||||
$error.addClass('hide');
|
||||
@@ -928,9 +910,9 @@ define([
|
||||
var $form = this.$('#add-dir-group-share-item'); // pseudo form
|
||||
|
||||
var $groups_input = $('[name="groups"]', $form),
|
||||
groups = $groups_input.val(); // [] or [group.id]
|
||||
groups = $groups_input.val(); // null or [group.id]
|
||||
|
||||
if (!groups.length) {
|
||||
if (!groups) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -985,7 +967,7 @@ define([
|
||||
});
|
||||
$add_item.after(new_item.el);
|
||||
});
|
||||
$groups_input.val(null).trigger('change'); // clear the selected items
|
||||
$groups_input.select2("val", "");
|
||||
$('option', $perm).prop('selected', false);
|
||||
$('[value="rw"]', $perm).prop('selected', true);
|
||||
$error.addClass('hide');
|
||||
|
Reference in New Issue
Block a user