first attempt at copy to export JS
This commit is contained in:
parent
98081097b4
commit
617db3a654
5 changed files with 52 additions and 4 deletions
|
@ -116,8 +116,12 @@ class MapsController < ApplicationController
|
||||||
|
|
||||||
# GET maps/:id/export
|
# GET maps/:id/export
|
||||||
def export
|
def export
|
||||||
exporter = MapExportService.new(current_user, @map, base_url: request.base_url)
|
topic_ids = params[:topic_ids].split(',').map(&:to_i)
|
||||||
|
synapse_ids = params[:synapse_ids].split(',').map(&:to_i)
|
||||||
|
exporter = MapExportService.new(current_user, @map,
|
||||||
|
topic_ids: topic_ids,
|
||||||
|
synapse_ids: synapse_ids,
|
||||||
|
base_url: request.base_url)
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.json { render json: exporter.json }
|
format.json { render json: exporter.json }
|
||||||
format.csv { send_data exporter.csv }
|
format.csv { send_data exporter.csv }
|
||||||
|
|
|
@ -6,6 +6,8 @@ class MapExportService
|
||||||
def initialize(user, map, opts = {})
|
def initialize(user, map, opts = {})
|
||||||
@user = user
|
@user = user
|
||||||
@map = map
|
@map = map
|
||||||
|
@topic_ids = opts[:topic_ids] if opts[:topic_ids]
|
||||||
|
@synapse_ids = opts[:synapse_ids] if opts[:synapse_ids]
|
||||||
@base_url = opts[:base_url] || 'https://metamaps.cc'
|
@base_url = opts[:base_url] || 'https://metamaps.cc'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -61,6 +63,7 @@ class MapExportService
|
||||||
topic_mappings.map do |mapping|
|
topic_mappings.map do |mapping|
|
||||||
topic = mapping.mappable
|
topic = mapping.mappable
|
||||||
next nil if topic.nil?
|
next nil if topic.nil?
|
||||||
|
next nil if @topic_ids && !@topic_ids.include?(topic.id)
|
||||||
OpenStruct.new(
|
OpenStruct.new(
|
||||||
id: topic.id,
|
id: topic.id,
|
||||||
name: topic.name,
|
name: topic.name,
|
||||||
|
@ -72,13 +75,14 @@ class MapExportService
|
||||||
user: topic.user.name,
|
user: topic.user.name,
|
||||||
permission: topic.permission
|
permission: topic.permission
|
||||||
)
|
)
|
||||||
end.compact
|
end.compact.uniq(&:id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def exportable_synapses
|
def exportable_synapses
|
||||||
visible_synapses = Pundit.policy_scope!(user, map.synapses)
|
visible_synapses = Pundit.policy_scope!(user, map.synapses).uniq
|
||||||
visible_synapses.map do |synapse|
|
visible_synapses.map do |synapse|
|
||||||
next nil if synapse.nil?
|
next nil if synapse.nil?
|
||||||
|
next nil if @synapse_ids && !@synapse_ids.include?(synapse.id)
|
||||||
OpenStruct.new(
|
OpenStruct.new(
|
||||||
topic1: synapse.topic1_id,
|
topic1: synapse.topic1_id,
|
||||||
topic2: synapse.topic2_id,
|
topic2: synapse.topic2_id,
|
||||||
|
|
32
frontend/src/Metamaps/Export.js
Normal file
32
frontend/src/Metamaps/Export.js
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/* global $ */
|
||||||
|
import Active from './Active'
|
||||||
|
import GlobalUI from './GlobalUI'
|
||||||
|
import Selected from './Selected'
|
||||||
|
|
||||||
|
const Export = {
|
||||||
|
// simple hack to use the existing ruby export code
|
||||||
|
// someday we can build a real export function here
|
||||||
|
copySelection: function() {
|
||||||
|
if (!Active.Map) return // someday we can expand this
|
||||||
|
const topic_ids = Selected.Nodes.map(node => node.id).join(',')
|
||||||
|
const synapse_ids = Selected.Edges.map(edge => {
|
||||||
|
return edge.getData('synapses')[edge.getData('displayIndex')].id
|
||||||
|
}).join(',')
|
||||||
|
const url = `/maps/${Active.Map.id}/export.json`
|
||||||
|
const query = `topic_ids=${topic_ids}&synapse_ids=${synapse_ids}`
|
||||||
|
$.ajax(`${url}?${query}`, {
|
||||||
|
success: data => {
|
||||||
|
$('body').append($('<div id="clipboard-text" style="display: none">" + data + </div>').select())
|
||||||
|
const copied = document.execCommand('copy')
|
||||||
|
$('#clipboard-text').remove()
|
||||||
|
if (copied) {
|
||||||
|
GlobalUI.notifyUser(`${Selected.Nodes.length} topics and ${Selected.Edges.length} synapses were copied to the clipboard`)
|
||||||
|
} else {
|
||||||
|
GlobalUI.notifyUser(`Copy-paste failed, try manually exporting the map at ${url}.`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Export
|
|
@ -4,6 +4,7 @@ import Active from './Active'
|
||||||
import Create from './Create'
|
import Create from './Create'
|
||||||
import Control from './Control'
|
import Control from './Control'
|
||||||
import DataModel from './DataModel'
|
import DataModel from './DataModel'
|
||||||
|
import Export from './Export'
|
||||||
import JIT from './JIT'
|
import JIT from './JIT'
|
||||||
import Realtime from './Realtime'
|
import Realtime from './Realtime'
|
||||||
import Selected from './Selected'
|
import Selected from './Selected'
|
||||||
|
@ -72,6 +73,11 @@ const Listeners = {
|
||||||
Visualize.mGraph.plot()
|
Visualize.mGraph.plot()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
case 67: // if c or C is pressed
|
||||||
|
if (e.ctrlKey && e.target.tagName === 'BODY') {
|
||||||
|
Export.copySelection()
|
||||||
|
}
|
||||||
break
|
break
|
||||||
case 68: // if d or D is pressed
|
case 68: // if d or D is pressed
|
||||||
if (e.ctrlKey || e.metaKey) {
|
if (e.ctrlKey || e.metaKey) {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import Control from './Control'
|
||||||
import Create from './Create'
|
import Create from './Create'
|
||||||
import DataModel from './DataModel'
|
import DataModel from './DataModel'
|
||||||
import Debug from './Debug'
|
import Debug from './Debug'
|
||||||
|
import Export from './Export'
|
||||||
import Filter from './Filter'
|
import Filter from './Filter'
|
||||||
import GlobalUI, {
|
import GlobalUI, {
|
||||||
Notifications, ReactApp, Search, CreateMap, ImportDialog
|
Notifications, ReactApp, Search, CreateMap, ImportDialog
|
||||||
|
@ -40,6 +41,7 @@ Metamaps.Control = Control
|
||||||
Metamaps.Create = Create
|
Metamaps.Create = Create
|
||||||
Metamaps.DataModel = DataModel
|
Metamaps.DataModel = DataModel
|
||||||
Metamaps.Debug = Debug
|
Metamaps.Debug = Debug
|
||||||
|
Metamaps.Export = Export
|
||||||
Metamaps.Filter = Filter
|
Metamaps.Filter = Filter
|
||||||
Metamaps.GlobalUI = GlobalUI
|
Metamaps.GlobalUI = GlobalUI
|
||||||
Metamaps.GlobalUI.Notifications = Notifications
|
Metamaps.GlobalUI.Notifications = Notifications
|
||||||
|
|
Loading…
Reference in a new issue