From 518773d6e1c98008a37e3a204efebd798f10c9e6 Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Sun, 25 Sep 2016 00:27:04 +0800 Subject: [PATCH] pop up a lightbox using React to help you export --- app/assets/images/import-example.png | Bin 0 -> 57176 bytes app/assets/images/import.png | Bin 0 -> 320 bytes .../javascripts/src/Metamaps.Erb.js.erb | 1 + ...plication.css.erb => application.scss.erb} | 31 ++++++-- app/assets/stylesheets/clean.css.erb | 36 +++++---- app/assets/stylesheets/mobile.scss.erb | 2 +- app/views/layouts/_lowermapelements.html.erb | 1 + .../src/Metamaps/GlobalUI/ImportDialog.js | 36 +++++++++ frontend/src/Metamaps/GlobalUI/index.js | 4 +- frontend/src/Metamaps/Import.js | 1 + frontend/src/Metamaps/Map/index.js | 14 +++- frontend/src/Metamaps/PasteInput.js | 27 ++++--- frontend/src/Metamaps/index.js | 3 +- frontend/src/components/ImportDialogBox.js | 75 ++++++++++++++++++ package.json | 1 + 15 files changed, 195 insertions(+), 37 deletions(-) create mode 100644 app/assets/images/import-example.png create mode 100644 app/assets/images/import.png rename app/assets/stylesheets/{application.css.erb => application.scss.erb} (99%) create mode 100644 frontend/src/Metamaps/GlobalUI/ImportDialog.js create mode 100644 frontend/src/components/ImportDialogBox.js diff --git a/app/assets/images/import-example.png b/app/assets/images/import-example.png new file mode 100644 index 0000000000000000000000000000000000000000..3f013d58ce972f7236cd3d49f9aab47458cc299f GIT binary patch literal 57176 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 M)78&qol`;+0AW~si2wiq literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/src/Metamaps.Erb.js.erb b/app/assets/javascripts/src/Metamaps.Erb.js.erb index e8f3a25b..916d175a 100644 --- a/app/assets/javascripts/src/Metamaps.Erb.js.erb +++ b/app/assets/javascripts/src/Metamaps.Erb.js.erb @@ -14,6 +14,7 @@ Metamaps.Erb['icons/wildcard.png'] = '<%= asset_path('icons/wildcard.png') %>' Metamaps.Erb['topic_description_signifier.png'] = '<%= asset_path('topic_description_signifier.png') %>' Metamaps.Erb['topic_link_signifier.png'] = '<%= asset_path('topic_link_signifier.png') %>' Metamaps.Erb['synapse16.png'] = '<%= asset_path('synapse16.png') %>' +Metamaps.Erb['import-example.png'] = '<%= asset_path('import-example.png') %>' Metamaps.Erb['sounds/MM_sounds.mp3'] = '<%= asset_path 'sounds/MM_sounds.mp3' %>' Metamaps.Erb['sounds/MM_sounds.ogg'] = '<%= asset_path 'sounds/MM_sounds.ogg' %>' Metamaps.Metacodes = <%= Metacode.all.to_json.gsub(%r[(icon.*?)(\"},)], '\1?purple=stupid\2').html_safe %> diff --git a/app/assets/stylesheets/application.css.erb b/app/assets/stylesheets/application.scss.erb similarity index 99% rename from app/assets/stylesheets/application.css.erb rename to app/assets/stylesheets/application.scss.erb index 97276b9f..e4e7762e 100644 --- a/app/assets/stylesheets/application.css.erb +++ b/app/assets/stylesheets/application.scss.erb @@ -1526,9 +1526,8 @@ h3.filterBox { background-image: url(<%= asset_data_uri('permissions32_sprite.png') %>); } /* map info box */ -/* map info box */ -.wrapper div.mapInfoBox { +.wrapper .mapInfoBox { display: none; position: absolute; bottom: 40px; @@ -1536,12 +1535,34 @@ h3.filterBox { background-color: #424242; color: #F5F5F5; border-radius: 2px; + box-shadow: 0 3px 3px rgba(0,0,0,0.23), 0px 3px 3px rgba(0,0,0,0.16); + text-align: center; + font-style: normal; +} +.import-dialog{ + button { + margin: 1em 0.5em; + } + .import-blue-button { + display: inline-block; + box-sizing: border-box; + margin: 0.75em; + padding: 0.75em; + height: 3em; + background-color: #AAB0FB; + border-radius: 0.3em; + color: white; + cursor: pointer; + } + .fileupload { + width: 75%; + text-align: center; + } +} +.wrapper .mapInfoBox { width: 360px; min-height: 300px; padding: 0; - font-style: normal; - text-align: center; - box-shadow: 0 3px 3px rgba(0,0,0,0.23), 0px 3px 3px rgba(0,0,0,0.16); } .requestTitle { display: none; diff --git a/app/assets/stylesheets/clean.css.erb b/app/assets/stylesheets/clean.css.erb index b41f14ca..deb2719f 100644 --- a/app/assets/stylesheets/clean.css.erb +++ b/app/assets/stylesheets/clean.css.erb @@ -188,7 +188,7 @@ .upperRightIcon { width: 32px; height: 32px; - background-image: url(<%= asset_data_uri('topright_sprite.png') %>); + background-image: url(<%= asset_path('topright_sprite.png') %>); background-repeat: no-repeat; cursor: pointer; } @@ -325,7 +325,7 @@ } .fullWidthWrapper.withPartners { - background: url(<%= asset_data_uri('homepage_bg_fade.png') %>) no-repeat center -300px; + background: url(<%= asset_path('homepage_bg_fade.png') %>) no-repeat center -300px; } .homeWrapper.homePartners { padding: 64px 0 280px; @@ -364,7 +364,7 @@ cursor: pointer; } .openCheatsheet { - background-image: url(<%= asset_data_uri('help_sprite.png') %>); + background-image: url(<%= asset_path('help_sprite.png') %>); background-repeat:no-repeat; } .openCheatsheet:hover { @@ -373,7 +373,7 @@ .mapInfoIcon { position: relative; top: 56px; /* puts it just offscreen */ - background-image: url(<%= asset_data_uri('mapinfo_sprite.png') %>); + background-image: url(<%= asset_path('mapinfo_sprite.png') %>); background-repeat:no-repeat; } .mapInfoIcon:hover { @@ -382,8 +382,14 @@ .mapPage .mapInfoIcon { top: 0; } +.importDialog { + background-image: url(<%= asset_path('import.png') %>); + background-position: 0 0; + background-repeat: no-repeat; + width: 32px; +} .starMap { - background-image: url(<%= asset_data_uri('starmap_sprite.png') %>); + background-image: url(<%= asset_path('starmap_sprite.png') %>); background-position: 0 0; background-repeat: no-repeat; width: 32px; @@ -437,7 +443,7 @@ .takeScreenshot { margin-bottom: 5px; border-radius: 2px; - background-image: url(<%= asset_data_uri 'screenshot_sprite.png' %>); + background-image: url(<%= asset_path 'screenshot_sprite.png' %>); display: none; } .takeScreenshot:hover { @@ -450,7 +456,7 @@ .zoomExtents { margin-bottom:5px; border-radius: 2px; - background-image: url(<%= asset_data_uri('extents_sprite.png') %>); + background-image: url(<%= asset_path('extents_sprite.png') %>); } .zoomExtents:hover { @@ -458,7 +464,7 @@ } .zoomExtents:hover .tooltips, .zoomIn:hover .tooltips, .zoomOut:hover .tooltips, .takeScreenshot:hover .tooltips, .sidebarFilterIcon:hover .tooltipsUnder, .sidebarForkIcon:hover .tooltipsUnder, .addMap:hover .tooltipsUnder, .authenticated .sidebarAccountIcon:hover .tooltipsUnder, - .mapInfoIcon:hover .tooltipsAbove, .openCheatsheet:hover .tooltipsAbove, .chat-button:hover .tooltips, .starMap:hover .tooltipsAbove, .openMetacodeSwitcher:hover .tooltipsAbove, .pinCarousel:not(.isPinned):hover .tooltipsAbove.helpPin, .pinCarousel.isPinned:hover .tooltipsAbove.helpUnpin { + .mapInfoIcon:hover .tooltipsAbove, .openCheatsheet:hover .tooltipsAbove, .chat-button:hover .tooltips, importDialog:hover .tooltipsAbove, .starMap:hover .tooltipsAbove, .openMetacodeSwitcher:hover .tooltipsAbove, .pinCarousel:not(.isPinned):hover .tooltipsAbove.helpPin, .pinCarousel.isPinned:hover .tooltipsAbove.helpUnpin { display: block; } @@ -623,7 +629,7 @@ } .zoomIn { - background-image: url(<%= asset_data_uri('zoom_sprite.png') %>); + background-image: url(<%= asset_path('zoom_sprite.png') %>); background-position: 0 /…0; border-top-left-radius: 2px; border-top-right-radius: 2px; @@ -632,7 +638,7 @@ background-position: -32px 0; } .zoomOut { - background-image: url(<%= asset_data_uri('zoom_sprite.png') %>); + background-image: url(<%= asset_path('zoom_sprite.png') %>); background-position:0 -32px; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px; @@ -740,23 +746,23 @@ left:5px; } .exploreMapsCenter .myMaps .exploreMapsIcon { - background-image: url(<%= asset_data_uri 'exploremaps_sprite.png' %>); + background-image: url(<%= asset_path 'exploremaps_sprite.png' %>); background-position: -32px 0; } .exploreMapsCenter .sharedMaps .exploreMapsIcon { - background-image: url(<%= asset_data_uri 'exploremaps_sprite.png' %>); + background-image: url(<%= asset_path 'exploremaps_sprite.png' %>); background-position: -128px 0; } .exploreMapsCenter .activeMaps .exploreMapsIcon { - background-image: url(<%= asset_data_uri 'exploremaps_sprite.png' %>); + background-image: url(<%= asset_path 'exploremaps_sprite.png' %>); background-position: 0 0; } .exploreMapsCenter .featuredMaps .exploreMapsIcon { - background-image: url(<%= asset_data_uri 'exploremaps_sprite.png' %>); + background-image: url(<%= asset_path 'exploremaps_sprite.png' %>); background-position: -96px 0; } .exploreMapsCenter .starredMaps .exploreMapsIcon { - background-image: url(<%= asset_data_uri 'exploremaps_sprite.png' %>); + background-image: url(<%= asset_path 'exploremaps_sprite.png' %>); background-position: -96px 0; } .myMaps:hover .exploreMapsIcon, .myMaps.active .exploreMapsIcon { diff --git a/app/assets/stylesheets/mobile.scss.erb b/app/assets/stylesheets/mobile.scss.erb index cf416e37..a646fea4 100644 --- a/app/assets/stylesheets/mobile.scss.erb +++ b/app/assets/stylesheets/mobile.scss.erb @@ -56,7 +56,7 @@ width: 100%; } - .wrapper div.mapInfoBox { + .wrapper .mapInfoBox { position: fixed; top: 50px; right: 0px; diff --git a/app/views/layouts/_lowermapelements.html.erb b/app/views/layouts/_lowermapelements.html.erb index fe120219..b8b7f868 100644 --- a/app/views/layouts/_lowermapelements.html.erb +++ b/app/views/layouts/_lowermapelements.html.erb @@ -8,6 +8,7 @@
<%= render :partial => 'maps/mapinfobox' %> +
Import data
<% starred = current_user && @map && current_user.starred_map?(@map) starClass = starred ? 'starred' : '' tooltip = starred ? 'Star' : 'Unstar' %> diff --git a/frontend/src/Metamaps/GlobalUI/ImportDialog.js b/frontend/src/Metamaps/GlobalUI/ImportDialog.js new file mode 100644 index 00000000..3671cd90 --- /dev/null +++ b/frontend/src/Metamaps/GlobalUI/ImportDialog.js @@ -0,0 +1,36 @@ +import React from 'react' +import ReactDOM from 'react-dom' +import outdent from 'outdent' + +import ImportDialogBox from '../../components/ImportDialogBox' + +import PasteInput from '../PasteInput' + +const ImportDialog = { + openLightbox: null, + closeLightbox: null, + + init: function(serverData, openLightbox, closeLightbox) { + const self = ImportDialog + self.openLightbox = openLightbox + self.closeLightbox = closeLightbox + + $('#lightbox_content').append($(outdent` +
+
+
+ `)) + ReactDOM.render(React.createElement(ImportDialogBox, { + onFileAdded: PasteInput.handleFile, + exampleImageUrl: serverData['import-example.png'], + }), $('.importDialogWrapper').get(0)) + }, + show: function() { + self.openLightbox('import-dialog') + }, + hide: function() { + self.closeLightbox('import-dialog') + } +} + +export default ImportDialog diff --git a/frontend/src/Metamaps/GlobalUI/index.js b/frontend/src/Metamaps/GlobalUI/index.js index 3b16375e..4eb29bb7 100644 --- a/frontend/src/Metamaps/GlobalUI/index.js +++ b/frontend/src/Metamaps/GlobalUI/index.js @@ -6,6 +6,7 @@ import Create from '../Create' import Search from './Search' import CreateMap from './CreateMap' import Account from './Account' +import ImportDialog from './ImportDialog' /* * Metamaps.Backbone @@ -21,6 +22,7 @@ const GlobalUI = { self.Search.init() self.CreateMap.init() self.Account.init() + self.ImportDialog.init(Metamaps.Erb, self.openLightbox, self.closeLightbox) if ($('#toast').html().trim()) self.notifyUser($('#toast').html()) @@ -141,5 +143,5 @@ const GlobalUI = { } } -export { Search, CreateMap, Account } +export { Search, CreateMap, Account, ImportDialog } export default GlobalUI diff --git a/frontend/src/Metamaps/Import.js b/frontend/src/Metamaps/Import.js index f70a1290..05d762e5 100644 --- a/frontend/src/Metamaps/Import.js +++ b/frontend/src/Metamaps/Import.js @@ -411,6 +411,7 @@ const Import = { newKey = newKey.replace(/\s/g, '') // remove whitespace if (newKey === 'url') newKey = 'link' if (newKey === 'title') newKey = 'name' + if (newKey === 'label') newKey = 'desc' if (newKey === 'description') newKey = 'desc' if (newKey === 'direction') newKey = 'category' return newKey diff --git a/frontend/src/Metamaps/Map/index.js b/frontend/src/Metamaps/Map/index.js index 4c2f78bb..7d7322fc 100644 --- a/frontend/src/Metamaps/Map/index.js +++ b/frontend/src/Metamaps/Map/index.js @@ -1,6 +1,8 @@ /* global Metamaps, $ */ import outdent from 'outdent' +import React from 'react' +import ReactDOM from 'react-dom' import Active from '../Active' import AutoLayout from '../AutoLayout' @@ -40,6 +42,12 @@ const Map = { init: function () { var self = Map + // prevent right clicks on the main canvas, so as to not get in the way of our right clicks + $('#wrapper').on('contextmenu', function (e) { + return false + }) + + $('.starMap').click(function () { if ($(this).is('.starred')) self.unstar() else self.star() @@ -52,7 +60,7 @@ const Map = { GlobalUI.CreateMap.emptyForkMapForm = $('#fork_map').html() self.updateStar() - self.InfoBox.init() + InfoBox.init() CheatSheet.init() $(document).on(Map.events.editedByActiveMapper, self.editedByActiveMapper) @@ -102,7 +110,7 @@ const Map = { Selected.reset() // set the proper mapinfobox content - Map.InfoBox.load() + InfoBox.load() // these three update the actual filter box with the right list items Filter.checkMetacodes() @@ -132,7 +140,7 @@ const Map = { Create.newTopic.hide(true) // true means force (and override pinned) Create.newSynapse.hide() Filter.close() - Map.InfoBox.close() + InfoBox.close() Realtime.endActiveMap() } }, diff --git a/frontend/src/Metamaps/PasteInput.js b/frontend/src/Metamaps/PasteInput.js index 6f1cc03f..51d4a933 100644 --- a/frontend/src/Metamaps/PasteInput.js +++ b/frontend/src/Metamaps/PasteInput.js @@ -21,16 +21,7 @@ const PasteInput = { e.preventDefault(); var coords = Util.pixelsToCoords({ x: e.clientX, y: e.clientY }) if (e.dataTransfer.files.length > 0) { - var fileReader = new window.FileReader() - fileReader.readAsText(e.dataTransfer.files[0]) - fileReader.onload = function(e) { - var text = e.currentTarget.result - if (text.substring(0,5) === '(.*)<\/string>[\s\S]*/m, '$1') - } - self.handle(text, coords) - } + self.handleFile(e.dataTransfer.files[0], coords) } // OMG import bookmarks 😍 if (e.dataTransfer.items.length > 0) { @@ -52,7 +43,21 @@ const PasteInput = { }) }, - handle: function(text, coords) { + handleFile: (file, coords = null) => { + var self = PasteInput + var fileReader = new FileReader() + fileReader.readAsText(file) + fileReader.onload = function(e) { + var text = e.currentTarget.result + if (text.substring(0,5) === '(.*)<\/string>[\s\S]*/m, '$1') + } + self.handle(text, coords) + } + }, + + handle: function(text, coords = null) { var self = PasteInput if (text.match(self.URL_REGEX)) { diff --git a/frontend/src/Metamaps/index.js b/frontend/src/Metamaps/index.js index d179713e..44bbfdb6 100644 --- a/frontend/src/Metamaps/index.js +++ b/frontend/src/Metamaps/index.js @@ -10,7 +10,7 @@ import Create from './Create' import Debug from './Debug' import Filter from './Filter' import GlobalUI, { - Search, CreateMap, Account as GlobalUI_Account + Search, CreateMap, ImportDialog, Account as GlobalUI_Account } from './GlobalUI' import Import from './Import' import JIT from './JIT' @@ -47,6 +47,7 @@ Metamaps.GlobalUI = GlobalUI Metamaps.GlobalUI.Search = Search Metamaps.GlobalUI.CreateMap = CreateMap Metamaps.GlobalUI.Account = GlobalUI_Account +Metamaps.GlobalUI.ImportDialog = ImportDialog Metamaps.Import = Import Metamaps.JIT = JIT Metamaps.Listeners = Listeners diff --git a/frontend/src/components/ImportDialogBox.js b/frontend/src/components/ImportDialogBox.js new file mode 100644 index 00000000..4d113ccc --- /dev/null +++ b/frontend/src/components/ImportDialogBox.js @@ -0,0 +1,75 @@ +import React, { PropTypes, Component } from 'react' +import Dropzone from 'react-dropzone' + +class ImportDialogBox extends Component { + constructor(props) { + super(props) + + this.state = { + showImportInstructions: false + } + } + + handleExport = format => () => { + window.open(`${window.location.pathname}/export.${format}`, '_blank') + } + + handleFile = (files, e) => { + // for some reason it uploads twice, so we need this debouncer + this.debouncer = this.debouncer || window.setTimeout(() => this.debouncer = null, 10) + if (!this.debouncer) { + this.props.onFileAdded(files[0]) + } + } + + toggleShowInstructions = e => { + this.setState({ + showImportInstructions: !this.state.showImportInstructions + }) + } + + render = () => { + return ( +
+

EXPORT

+
+ Export as CSV +
+
+ Export as JSON +
+

IMPORT

+

To upload a file, drop it here:

+ + Drop files here! + +

+ + Show/hide import instructions + +

+ {!this.state.showImportInstructions ? null : (
+

+ You can import topics and synapses by uploading a spreadsheet here. + The file should be in comma-separated format (when you save, change the + filetype from .xls to .csv). +

+ +

You can choose which columns to include in your data. Topics must have a name field. Synapses must have Topic 1 and Topic 2.

+

 

+

* There are many valid import formats. Try exporting a map to see what columns you can include in your import data. You can also copy-paste from Excel to import, or import JSON.

+

* If you are importing a list of links, you can use a Link column in place of the Name column.

+
)} +
+ ) + } +} + +ImportDialogBox.propTypes = { + onFileAdded: PropTypes.func, + exampleImageUrl: PropTypes.string +} + +export default ImportDialogBox diff --git a/package.json b/package.json index c882fdd0..82cd120d 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "outdent": "0.2.1", "react": "15.3.2", "react-dom": "15.3.2", + "react-dropzone": "3.6.0", "socket.io": "0.9.12", "webpack": "1.13.2" },