metamaps--metamaps/frontend/src/Metamaps/PasteInput.js

83 lines
2.7 KiB
JavaScript
Raw Normal View History

/* global $ */
import Import from './Import'
2016-09-22 10:31:56 +00:00
import Util from './Util'
import Visualize from './Visualize'
const PasteInput = {
2016-09-21 02:48:47 +00:00
// thanks to https://github.com/kevva/url-regex
// eslint-disable-next-line no-useless-escape
2016-09-21 02:48:47 +00:00
URL_REGEX: new RegExp('^(?:(?:(?:[a-z]+:)?//)|www\.)(?:\S+(?::\S*)?@)?(?:localhost|(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#][^\s"]*)?$'),
2016-11-07 20:25:08 +00:00
init: function() {
var self = PasteInput
// intercept dragged files
// see http://stackoverflow.com/questions/6756583
2016-11-07 20:25:08 +00:00
window.addEventListener('dragover', function(e) {
e = e || window.event
e.preventDefault()
}, false)
window.addEventListener('drop', function(e) {
e = e || window.event
Into master: two finger pan/zoom, map and topic follows (for internal testing) on the UI, map activity emails (#1084) * fix topic spec * fix synapse/mapping spec * brakeman csrf warning suppressed :| * follows for maps in the ui for internal testing only still (#1072) * follows for maps in the ui for testers * require user for these actions * match how map follow works * include ability to unfollow from email * fixup templates * add unfollow_from_email to the policies * Update _cheatsheet.html.erb Clean up text, clarify, and bring in line with current functionality * topicsRegex and synapsesRegex should allow commas (#1073) * even better import csv regexes * prevent double prompt on file drop import * topic card in react (#1031) * its coming along * links bar * scssify a bunch * metacode image working a bit better * metacode selector in react topic card * riek editing for name field on topic card * riek submit on enter * factor out Title and Links from Topic Card component, but not the listeners * create working Desc editor * styling is much better now * textarea min height for desc * disallow images in topic card markdown * shift enter is linebreak, enter is save * attachments split out, but it's pretty buggy * move listeners into Links.js * slightly wider metacodeTitle * fix positioning on metacode selector * fix metacode selection * move metacode and permissions into subcomponents * fixes * prevent editing on desc/title if not authorized to edit * fix topic card draggability * fix embedly * fix md test * remove the removed link card manually with jquery * fix test syntax * eslint * more eslin * reuse authorizedToEdit * convert metacode sets to a json object for react * add the html in react whoop * fix metacode styling * sort wasn't working * finishing metacode select * readd the above link input border * fix syntax * multiline title editable textarea * more portable metacode selector component * factor out #metacodeOptions into one react component with a callback :D:D:D * render metacodeOptions in right click menu with react * render metacodeOptions in right click menu with react * fix up right click menu's metacode editing * fix topic card title character counter * ignore metamaps secret bundle in ag * simplify Attachments props * factor out embedly card into its own component; it seems to help * link resetter * fix edit icon on title in topic card * move mapCount and synapseCount hover/click logic to react * fix up the showMore control * metacode selection tweaks * tweak links bar spacing in topic card * rubocop * remove TODOs * more badass permissions selector * close permission selector when you click outside * fix overeager metacode selector * more modular attachments component * fix bug in Desc.js * fix right click styling * permission changes are different than edit rights * bad module ref * ensure maxLength on topic titles * hellz yeah (#1074) * fix drop from two touches to one * don't commit activity service * ability to select/unselect all metacodes in custom set with keyboard shortcut (fix #390) (#1078) * ability to select/unselect all metacodes in custom set with keyboard shortcut * select all button * nicer all/none buttons * set up react testing (#1080) * install mocha-webpack. also switch hark to npm version instead of github version * well, mocha-webpack runs * add jsdom for tests * upgrade to webpack 2 * fix npm run test errors * ImportDialogBox component tests * Fixes bug where pressing delete key while editing text will suggest... (#1083) * Fixes bug where pressing delete key while editing text will suggest the deletion of selected map entities * Changed the DEL key to remove entities instead of delete them * temporarily disable code climate duplication engine * add topic following for internal testing * daily map activity emails (#1081) * data prepared, task setup * add the basics of the email template * cover granular permissions * unfollow this map * break out permissions tests better * rename so test runs
2017-03-07 03:49:46 +00:00
// prevent conflict with react-dropzone file uploader
if (event.target.id !== 'infovis-canvas') return
2016-11-07 20:25:08 +00:00
e.preventDefault()
var coords = Util.pixelsToCoords(Visualize.mGraph, { x: e.clientX, y: e.clientY })
if (e.dataTransfer.files.length > 0) {
self.handleFile(e.dataTransfer.files[0], coords)
}
2016-09-21 02:48:47 +00:00
// OMG import bookmarks 😍
2016-11-08 20:51:39 +00:00
if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {
2016-09-21 02:48:47 +00:00
e.dataTransfer.items[0].getAsString(function(text) {
if (text.match(self.URL_REGEX)) {
self.handle(text, coords)
}
})
}
2016-11-07 20:25:08 +00:00
}, false)
// allow pasting onto canvas (but don't break existing inputs/textareas)
2016-11-07 20:25:08 +00:00
$('body').bind('paste', function(e) {
if (e.target.tagName === 'INPUT') return
if (e.target.tagName === 'TEXTAREA') return
var text = e.originalEvent.clipboardData.getData('text/plain').trim()
self.handle(text)
})
},
handleFile: (file, coords = null) => {
var self = PasteInput
2016-10-07 16:31:32 +00:00
var fileReader = new window.FileReader()
fileReader.readAsText(file)
fileReader.onload = function(e) {
var text = e.currentTarget.result
2016-11-07 20:25:08 +00:00
if (text.substring(0, 5) === '<?xml') {
// assume this is a macOS .webloc link
text = text.replace(/[\s\S]*<string>(.*)<\/string>[\s\S]*/m, '$1')
}
self.handle(text, coords)
}
},
2016-11-01 08:01:34 +00:00
handle: function(text, coords = {}) {
var self = PasteInput
2016-09-21 02:48:47 +00:00
if (text.match(self.URL_REGEX)) {
2016-10-01 04:57:19 +00:00
Import.handleURL(text, coords)
} else if (text[0] === '{') {
Import.handleJSON(text)
} else if (text.match(/\t/)) {
Import.handleTSV(text)
2016-10-01 03:21:42 +00:00
} else {
// just try to see if CSV works
Import.handleCSV(text)
}
2016-10-01 05:47:16 +00:00
}
}
export default PasteInput