Skip to content

Commit b2536c0

Browse files
committed
Issues-373: added custom upload permissions
1 parent a8c3655 commit b2536c0

File tree

4 files changed

+220
-84
lines changed

4 files changed

+220
-84
lines changed

TopcoderEditorPlugin.php

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -339,11 +339,49 @@ protected function canUpload() {
339339
return $this->canUpload;
340340
} else {
341341
// Check config and user role upload permission
342-
if (c('Garden.AllowFileUploads', true) &&
343-
Gdn::session()->checkPermission('Garden.Uploads.Add', false)) {
344-
// Check category-specific permission
345-
$permissionCategory = CategoryModel::permissionCategory(Gdn::controller()->data('Category'));
346-
$this->canUpload = val('AllowFileUploads', $permissionCategory, true);
342+
if (c('Garden.AllowFileUploads', true)) {
343+
if(Gdn::session()->checkPermission('Garden.Uploads.Add', false)) {
344+
$this->canUpload = true;
345+
} else {
346+
$actionType = Gdn::controller()->data('ActionType');
347+
// Check category-specific permission
348+
if(Gdn::controller()->data('Category')) {
349+
$permissionCategory = CategoryModel::permissionCategory(Gdn::controller()->data('Category'));
350+
$discussionsUploads = CategoryModel::checkPermission($permissionCategory, 'Vanilla.Discussions.Uploads');
351+
$commentsUploads = CategoryModel::checkPermission($permissionCategory, 'Vanilla.Comments.Uploads');
352+
// User has both permissions
353+
if ($commentsUploads && $discussionsUploads) {
354+
$this->canUpload = true;
355+
} else {
356+
// Current Discussion mode
357+
switch ($actionType) {
358+
case 'NewDiscussion':
359+
// Always true. User can change a category before posting discussion.
360+
// Check upload permissions on the client
361+
$this->canUpload = true;
362+
break;
363+
case 'EditDiscussion':
364+
$this->canUpload = $discussionsUploads;
365+
break;
366+
case 'NewComment':
367+
case 'EditComment':
368+
$this->canUpload = $commentsUploads;
369+
break;
370+
default:
371+
$this->canUpload = false;
372+
}
373+
}
374+
} else {
375+
// a category is not selected, check permission on the client
376+
switch ($actionType) {
377+
case 'NewDiscussion':
378+
$this->canUpload = true;
379+
break;
380+
default:
381+
$this->canUpload = false;
382+
}
383+
}
384+
}
347385
} else {
348386
$this->canUpload = false;
349387
}

js/easymde.min.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17465,7 +17465,9 @@ function drawImage(editor) {
1746517465
*/
1746617466
function drawUploadedImage(editor) {
1746717467
// TODO: Draw the image template with a fake url? ie: '![](importing foo.png...)'
17468-
editor.openBrowseFileWindow();
17468+
if(editor.options.uploadImage) {
17469+
editor.openBrowseFileWindow();
17470+
}
1746917471
}
1747017472

1747117473
/**
@@ -18726,6 +18728,7 @@ EasyMDE.prototype.render = function (el) {
1872618728
extraKeys: keyMaps,
1872718729
lineWrapping: (options.lineWrapping === false) ? false : true,
1872818730
allowDropFileTypes: ['text/plain'],
18731+
// dragDrop: (options.uploadImage != undefined)? options.uploadImage: false,
1872918732
placeholder: options.placeholder || el.getAttribute('placeholder') || '',
1873018733
styleSelectedText: (options.styleSelectedText != undefined) ? options.styleSelectedText : !isMobile(),
1873118734
scrollbarStyle: (options.scrollbarStyle != undefined) ? options.scrollbarStyle : 'native',
@@ -18940,6 +18943,7 @@ EasyMDE.prototype.clearAutosavedValue = function () {
1894018943
EasyMDE.prototype.openBrowseFileWindow = function (onSuccess, onError) {
1894118944
var self = this;
1894218945
var imageInput = this.gui.toolbar.getElementsByClassName('imageInput')[0];
18946+
1894318947
imageInput.click(); //dispatchEvent(new MouseEvent('click')); // replaced with click() for IE11 compatibility.
1894418948
function onChange(event) {
1894518949
if (self.options.imageUploadFunction) {
@@ -19565,6 +19569,32 @@ EasyMDE.prototype.toTextArea = function () {
1956519569
this.clearAutosavedValue();
1956619570
}
1956719571
};
19572+
EasyMDE.prototype.updateToolbar = function () {
19573+
var cm = this.codemirror;
19574+
var wrapper = cm.getWrapperElement();
19575+
var easyMDEContainer = wrapper.parentNode;
19576+
19577+
if (easyMDEContainer) {
19578+
var uploadImage = easyMDEContainer.querySelector('.upload-image');
19579+
if(uploadImage) {
19580+
uploadImage.style.display = this.options.uploadImage ? '' : 'none';
19581+
}
19582+
19583+
var insertImage = easyMDEContainer.querySelector('.image');
19584+
if(insertImage) {
19585+
insertImage.style.display = this.options.uploadImage ? 'none' : '';
19586+
}
19587+
}
19588+
};
19589+
19590+
EasyMDE.prototype.enableUploadImages = function (canUploadImages) {
19591+
var cm = this.codemirror;
19592+
this.options.uploadImage = canUploadImages;
19593+
cm.setOption('dragDrop', this.options.uploadImage);
19594+
this.updateStatusBar('upload-image', this.options.uploadImage?this.options.imageTexts.sbInit:'');
19595+
this.updateToolbar();
19596+
};
19597+
1956819598

1956919599
module.exports = EasyMDE;
1957019600

js/topcodereditor.js

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
(function($) {
2+
var editor;
23
$.fn.setAsEditor = function(selector) {
34
selector = selector || '.BodyBox,.js-bodybox';
45

@@ -194,6 +195,25 @@
194195
var formData = new FormData();
195196
formData.append('file', file);
196197

198+
var $element = self.element;
199+
var postForm = $element.closest('form');
200+
var commentId = $(postForm).find('#Form_CommentID').val();
201+
var discussionId = $(postForm).find('#Form_DiscussionID').val();
202+
var categoryId = $(postForm).find('#Form_CategoryID').val();
203+
var actionType = $(postForm).find('#Form_ActionType').val();
204+
if(actionType != null) {
205+
formData.append('actionType', actionType);
206+
}
207+
if(categoryId != null) {
208+
formData.append('categoryID', categoryId);
209+
}
210+
if(commentId != null) {
211+
formData.append('commentID', commentId);
212+
}
213+
if(discussionId != null) {
214+
formData.append('discussionID', discussionId);
215+
}
216+
197217
var request = new XMLHttpRequest();
198218
request.upload.onprogress = function (event) {
199219
if (event.lengthComputable) {
@@ -453,7 +473,7 @@
453473
var $currentEditableTextarea = $(textareaObj);
454474
if ($currentEditableTextarea.length) {
455475
// instantiate new editor
456-
var editor = new EasyMDE({
476+
editor = new EasyMDE({
457477
shortcuts: {
458478
"mentions": "Ctrl-Space",
459479
},
@@ -472,8 +492,8 @@
472492
className: "fa fa-at",
473493
title: "Mention a Topcoder User",
474494

475-
}, "link", canUpload ? 'upload-image' : "image", "table", "horizontal-rule", "|", "fullscreen", "|", "guide"],
476-
hideIcons: ["guide", "heading", "preview", "side-by-side"],
495+
}, "link","upload-image" , "image", "table", "horizontal-rule", "|", "fullscreen", "|", "guide"],
496+
hideIcons: canUpload ? ["guide", "heading", "preview", "side-by-side"]: ["guide", "heading", "preview", "side-by-side", "upload-image"],
477497
insertTexts: {
478498
link: ['[', '](#url#)'],
479499
image: ['![](', '#url#)'],
@@ -493,13 +513,13 @@
493513
sbOnUploaded: 'Uploaded #image_name#',
494514
sizeUnits: ' B, KB, MB',
495515
},
496-
uploadImage: canUpload,
497-
imageMaxSize: maxUploadSize, //Maximum image size in bytes
498-
imageAccept: allowedFileMimeTypeWithExts, //A comma-separated list of mime-types and extensions
499-
imageUploadFunction: customUploadImage,
500-
beforeUploadingImagesFunction: beforeUploadingImages,
501-
errorCallback: errorCallback,// A callback function used to define how to display an error message.
502-
errorMessages: {
516+
uploadImage: canUpload,
517+
imageMaxSize: maxUploadSize, //Maximum image size in bytes
518+
imageAccept: allowedFileMimeTypeWithExts, //A comma-separated list of mime-types and extensions
519+
imageUploadFunction: customUploadImage,
520+
beforeUploadingImagesFunction: beforeUploadingImages,
521+
errorCallback: errorCallback,// A callback function used to define how to display an error message.
522+
errorMessages: {
503523
noFileGiven: 'Select a file.',
504524
typeNotAllowed: 'Uploading #image_name# was failed. The file type (#image_type#) is not supported.',
505525
fileTooLarge: 'Uploading #image_name# was failed. The file is too big (#image_size#).\n' +
@@ -557,6 +577,24 @@
557577
}
558578
// Multiple editors are supported on a page
559579
$('.BodyBox[format="Markdown"], .BodyBox[format="wysiwyg"],.js-bodybox[format="Markdown"], .js-bodybox[format="wysiwyg"]', e.target).setAsEditor();
580+
var categorySelect = $(this).find('#DiscussionForm select');
581+
if(categorySelect.length) {
582+
var selectedOption = categorySelect.find('option:selected');
583+
var uploads = selectedOption.attr("uploads");
584+
editor.enableUploadImages(uploads === "1");
585+
}
586+
editor.updateToolbar();
587+
});
588+
589+
$(document).on('change','#DiscussionForm select', function() {
590+
var element = $(this).find('option:selected');
591+
var categoryID = element.val();
592+
if($(this).id != '#Form_CategoryID') {
593+
var postForm = $(element).closest('form');
594+
$(postForm).find('#Form_CategoryID').val(categoryID);
595+
}
596+
var uploads = element.attr("uploads");
597+
editor.enableUploadImages(uploads === "1");
560598
});
561599

562600
// Preview mode

0 commit comments

Comments
 (0)