{"version":3,"sources":["node_modules/nodebb-plugin-composer-default/static/lib/composer/uploads.js"],"names":["define","preview","categoryList","translator","uploads","inProgress","uploadingText","initialize","post_uuid","initializeDragAndDrop","initializePaste","addChangeHandlers","addTopicThumbHandlers","translate","translated","postContainer","$","find","on","e","files","target","this","val","name","type","utils","fileMimeType","uploadContentFiles","route","fd","window","FormData","i","length","append","uploadTopicThumb","formData","trigger","resetInputFile","addClass","preventDefault","urlEl","setTimeout","url","removeClass","attr","toggleThumbEls","thumbToggleBtnEl","off","container","toggleClass","hasClass","$el","wrap","closest","get","reset","unwrap","onDragEnter","draggingDocument","drop","css","height","show","hide","onDragDrop","originalEvent","dataTransfer","cancel","document","event","items","clipboardData","some","call","item","blob","getAsFile","blobName","generateUUID","fileNames","escapeRegExp","text","replace","insertText","str","index","insert","slice","params","textarea","uploadForm","doneUploading","config","relative_path","cid","getSelectedCid","ajaxify","data","isImage","match","app","user","privileges","alertError","filenameMapping","push","Date","now","size","parseInt","maximumFileSize","getCursorPosition","prop","map","filename","test","submit","updateTextArea","trim","newFilename","current","re","RegExp","ajaxSubmit","headers","x-csrf-token","csrf_token","resetForm","clearForm","error","xhr","onUploadError","uploadProgress","position","total","percent","success","render","focus","complete","pop","spinner","thumbForm","msg","responseJSON","status","statusText","message"],"mappings":"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","file":"node_modules/nodebb-plugin-composer-default/static/lib/composer/uploads.js","sourcesContent":["'use strict';\r\n\r\n/* globals define, utils, config, app */\r\n\r\ndefine('composer/uploads', [\r\n\t'composer/preview',\r\n\t'composer/categoryList',\r\n\t'translator',\r\n], function(preview, categoryList, translator) {\r\n\tvar uploads = {\r\n\t\tinProgress: {}\r\n\t};\r\n\r\n\tvar uploadingText = '';\r\n\r\n\tuploads.initialize = function(post_uuid) {\r\n\t\tinitializeDragAndDrop(post_uuid);\r\n\t\tinitializePaste(post_uuid);\r\n\r\n\t\taddChangeHandlers(post_uuid);\r\n\t\taddTopicThumbHandlers(post_uuid);\r\n\t\ttranslator.translate('[[modules:composer.uploading, ' + 0 + '%]]', function(translated) {\r\n\t\t\tuploadingText = translated;\r\n\t\t});\r\n\t};\r\n\r\n\tfunction addChangeHandlers(post_uuid) {\r\n\t\tvar postContainer = $('.composer[data-uuid=\"' + post_uuid + '\"]');\r\n\r\n\t\tpostContainer.find('#files').on('change', function(e) {\r\n\t\t\tvar files = (e.target || {}).files || ($(this).val() ? [{name: $(this).val(), type: utils.fileMimeType($(this).val())}] : null);\r\n\t\t\tif (files) {\r\n\t\t\t\tuploadContentFiles({files: files, post_uuid: post_uuid, route: '/api/post/upload'});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tpostContainer.find('#topic-thumb-file').on('change', function(e) {\r\n\t\t\tvar files = (e.target || {}).files || ($(this).val() ? [{name: $(this).val(), type: utils.fileMimeType($(this).val())}] : null),\r\n\t\t\t\tfd;\r\n\r\n\t\t\tif (files) {\r\n\t\t\t\tif (window.FormData) {\r\n\t\t\t\t\tfd = new FormData();\r\n\t\t\t\t\tfor (var i = 0; i < files.length; ++i) {\r\n\t\t\t\t\t\tfd.append('files[]', files[i], files[i].name);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tuploadTopicThumb({files: files, post_uuid: post_uuid, route: '/api/topic/thumb/upload', formData: fd});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction addTopicThumbHandlers(post_uuid) {\r\n\t\tvar postContainer = $('.composer[data-uuid=\"' + post_uuid + '\"]');\r\n\r\n\t\tpostContainer.on('click', '.topic-thumb-clear-btn', function(e) {\r\n\t\t\tpostContainer.find('input#topic-thumb-url').val('').trigger('change');\r\n\t\t\tresetInputFile(postContainer.find('input#topic-thumb-file'));\r\n\t\t\t$(this).addClass('hide');\r\n\t\t\te.preventDefault();\r\n\t\t});\r\n\r\n\t\tpostContainer.on('paste change keypress', 'input#topic-thumb-url', function() {\r\n\t\t\tvar urlEl = $(this);\r\n\t\t\tsetTimeout(function(){\r\n\t\t\t\tvar url = urlEl.val();\r\n\t\t\t\tif (url) {\r\n\t\t\t\t\tpostContainer.find('.topic-thumb-clear-btn').removeClass('hide');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresetInputFile(postContainer.find('input#topic-thumb-file'));\r\n\t\t\t\t\tpostContainer.find('.topic-thumb-clear-btn').addClass('hide');\r\n\t\t\t\t}\r\n\t\t\t\tpostContainer.find('img.topic-thumb-preview').attr('src', url);\r\n\t\t\t}, 100);\r\n\t\t});\r\n\t}\r\n\r\n\tuploads.toggleThumbEls = function(postContainer, url) {\r\n\t\tvar thumbToggleBtnEl = postContainer.find('.topic-thumb-toggle-btn');\r\n\r\n\t\tpostContainer.find('input#topic-thumb-url').val(url);\r\n\t\tpostContainer.find('img.topic-thumb-preview').attr('src', url);\r\n\t\tif (url) {\r\n\t\t\tpostContainer.find('.topic-thumb-clear-btn').removeClass('hide');\r\n\t\t}\r\n\t\tthumbToggleBtnEl.removeClass('hide');\r\n\t\tthumbToggleBtnEl.off('click').on('click', function() {\r\n\t\t\tvar container = postContainer.find('.topic-thumb-container');\r\n\t\t\tcontainer.toggleClass('hide', !container.hasClass('hide'));\r\n\t\t});\r\n\t};\r\n\r\n\tfunction resetInputFile($el) {\r\n\t\t$el.wrap('
').closest('form').get(0).reset();\r\n\t\t$el.unwrap();\r\n\t}\r\n\r\n\tfunction initializeDragAndDrop(post_uuid) {\r\n\r\n\t\tfunction onDragEnter() {\r\n\t\t\tif (draggingDocument) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tdrop.css('top', '0px');\r\n\t\t\tdrop.css('height', postContainer.height() + 'px');\r\n\t\t\tdrop.css('line-height', postContainer.height() + 'px');\r\n\t\t\tdrop.show();\r\n\r\n\t\t\tdrop.on('dragleave', function() {\r\n\t\t\t\tdrop.hide();\r\n\t\t\t\tdrop.off('dragleave');\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfunction onDragDrop(e) {\r\n\t\t\te.preventDefault();\r\n\t\t\tvar files = e.originalEvent.dataTransfer.files;\r\n\t\t\tvar fd;\r\n\r\n\t\t\tif (files.length) {\r\n\t\t\t\tif (window.FormData) {\r\n\t\t\t\t\tfd = new FormData();\r\n\t\t\t\t\tfor (var i = 0; i < files.length; ++i) {\r\n\t\t\t\t\t\tfd.append('files[]', files[i], files[i].name);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tuploadContentFiles({\r\n\t\t\t\t\tfiles: files,\r\n\t\t\t\t\tpost_uuid: post_uuid,\r\n\t\t\t\t\troute: '/api/post/upload',\r\n\t\t\t\t\tformData: fd\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tdrop.hide();\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tfunction cancel(e) {\r\n\t\t\te.preventDefault();\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tvar draggingDocument = false;\r\n\r\n\t\tvar postContainer = $('.composer[data-uuid=\"' + post_uuid + '\"]');\r\n\t\tvar drop = postContainer.find('.imagedrop');\r\n\r\n\t\t$(document).off('dragstart').on('dragstart', function() {\r\n\t\t\tdraggingDocument = true;\r\n\t\t}).off('dragend').on('dragend', function() {\r\n\t\t\tdraggingDocument = false;\r\n\t\t});\r\n\r\n\t\tpostContainer.on('dragenter', onDragEnter);\r\n\r\n\t\tdrop.on('dragover', cancel);\r\n\t\tdrop.on('dragenter', cancel);\r\n\t\tdrop.on('drop', onDragDrop);\r\n\t}\r\n\r\n\tfunction initializePaste(post_uuid) {\r\n\t\tvar postContainer = $('.composer[data-uuid=\"' + post_uuid + '\"]');\r\n\t\tpostContainer.on('paste', function(event) {\r\n\t\t\tvar items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\r\n\r\n\t\t\t[].some.call(items, function(item) {\r\n\t\t\t\tvar blob = item.getAsFile();\r\n\r\n\t\t\t\tif (!blob) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar blobName = utils.generateUUID() + '-' + blob.name;\r\n\r\n\t\t\t\tvar fd = null;\r\n\t\t\t\tif (window.FormData) {\r\n\t\t\t\t\tfd = new FormData();\r\n\t\t\t\t\tfd.append('files[]', blob, blobName);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tuploadContentFiles({\r\n\t\t\t\t\tfiles: [blob],\r\n\t\t\t\t\tfileNames: [blobName],\r\n\t\t\t\t\tpost_uuid: post_uuid,\r\n\t\t\t\t\troute: '/api/post/upload',\r\n\t\t\t\t\tformData: fd\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tfunction escapeRegExp(text) {\r\n\t\treturn text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\r\n\t}\r\n\r\n\tfunction insertText(str, index, insert) {\r\n\t\treturn str.slice(0, index) + insert + str.slice(index);\r\n\t}\r\n\r\n\tfunction uploadContentFiles(params) {\r\n\t\tvar files = [ ...params.files ];\r\n\t\tvar post_uuid = params.post_uuid;\r\n\t\tvar postContainer = $('.composer[data-uuid=\"' + post_uuid + '\"]');\r\n\t\tvar textarea = postContainer.find('textarea');\r\n\t\tvar text = textarea.val();\r\n\t\tvar uploadForm = postContainer.find('#fileForm');\r\n\t\tvar doneUploading = false;\r\n\t\tuploadForm.attr('action', config.relative_path + params.route);\r\n\r\n\t\tvar cid = categoryList.getSelectedCid();\r\n\t\tif (!cid && ajaxify.data.cid) {\r\n\t\t\tcid = ajaxify.data.cid;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0; i < files.length; ++i) {\r\n\t\t\tvar isImage = files[i].type.match(/image./);\r\n\t\t\tif ((isImage && !app.user.privileges['upload:post:image']) || (!isImage && !app.user.privileges['upload:post:file'])) {\r\n\t\t\t\treturn app.alertError('[[error:no-privileges]]');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar filenameMapping = [];\r\n\r\n\t\tfor (var i = 0; i < files.length; ++i) {\r\n\t\t\t// The filename map has datetime and iterator prepended so that they can be properly tracked even if the\r\n\t\t\t// filenames are identical.\r\n\t\t\tfilenameMapping.push(i + '_' + Date.now() + '_' + (params.fileNames ? params.fileNames[i] : files[i].name));\r\n\t\t\tvar isImage = files[i].type.match(/image./);\r\n\r\n\t\t\tif (files[i].size > parseInt(config.maximumFileSize, 10) * 1024) {\r\n\t\t\t\tuploadForm[0].reset();\r\n\t\t\t\treturn app.alertError('[[error:file-too-big, ' + config.maximumFileSize + ']]');\r\n\t\t\t}\r\n\r\n\t\t\ttext = insertText(text, textarea.getCursorPosition(), (isImage ? '!' : '') + '[' + filenameMapping[i] + '](' + uploadingText + ') ');\r\n\t\t}\r\n\t\tif (uploadForm.length) {\r\n\t\t\tpostContainer.find('[data-action=\"post\"]').prop('disabled', true);\r\n\t\t}\r\n\t\ttextarea.val(text);\r\n\r\n\t\t$(window).trigger('action:composer.uploadStart', {\r\n\t\t\tpost_uuid: post_uuid,\r\n\t\t\tfiles: filenameMapping.map(function (filename, i) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tfilename: filename.replace(/^\\d+_\\d{13}_/, ''),\r\n\t\t\t\t\tisImage: /image./.test(files[i].type),\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\ttext: uploadingText,\r\n\t\t});\r\n\r\n\t\tuploadForm.off('submit').submit(function() {\r\n\t\t\tfunction updateTextArea(filename, text, trim) {\r\n\t\t\t\tvar newFilename;\r\n\t\t\t\tif (trim) {\r\n\t\t\t\t\tnewFilename = filename.replace(/^\\d+_\\d{13}_/, '');\r\n\t\t\t\t}\r\n\t\t\t\tvar current = textarea.val();\r\n\t\t\t\tvar re = new RegExp(escapeRegExp(filename) + \"]\\\\([^)]+\\\\)\", 'g');\r\n\t\t\t\ttextarea.val(current.replace(re, (newFilename || filename) + '](' + text + ')'));\r\n\r\n\t\t\t\t$(window).trigger('action:composer.uploadUpdate', {\r\n\t\t\t\t\tpost_uuid: post_uuid,\r\n\t\t\t\t\tfilename: filename,\r\n\t\t\t\t\ttext: text,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tuploads.inProgress[post_uuid] = uploads.inProgress[post_uuid] || [];\r\n\t\t\tuploads.inProgress[post_uuid].push(1);\r\n\r\n\t\t\tif (params.formData) {\r\n\t\t\t\tparams.formData.append('cid', cid);\r\n\t\t\t}\r\n\r\n\t\t\t$(this).ajaxSubmit({\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t'x-csrf-token': config.csrf_token\r\n\t\t\t\t},\r\n\t\t\t\tresetForm: true,\r\n\t\t\t\tclearForm: true,\r\n\t\t\t\tformData: params.formData,\r\n\t\t\t\tdata: { cid: cid },\r\n\r\n\t\t\t\terror: function (xhr) {\r\n\t\t\t\t\tpostContainer.find('[data-action=\"post\"]').prop('disabled', false);\r\n\t\t\t\t\tonUploadError(xhr, post_uuid);\r\n\t\t\t\t},\r\n\r\n\t\t\t\tuploadProgress: function(event, position, total, percent) {\r\n\t\t\t\t\ttranslator.translate('[[modules:composer.uploading, ' + percent + '%]]', function(translated) {\r\n\t\t\t\t\t\tif (doneUploading) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfor (var i=0; i < files.length; ++i) {\r\n\t\t\t\t\t\t\tupdateTextArea(filenameMapping[i], translated);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t},\r\n\r\n\t\t\t\tsuccess: function(uploads) {\r\n\t\t\t\t\tdoneUploading = true;\r\n\t\t\t\t\tif (uploads && uploads.length) {\r\n\t\t\t\t\t\tfor (var i=0; i