metamaps--metamaps/frontend/src/Metamaps/Views/ExploreMaps.js

127 lines
3.5 KiB
JavaScript
Raw Normal View History

/* global $ */
2016-09-22 20:16:18 -04:00
import React from 'react'
import ReactDOM from 'react-dom' // TODO ensure this isn't a double import
2016-09-23 08:05:26 +08:00
import Active from '../Active'
2016-11-07 15:25:08 -05:00
import DataModel from '../DataModel'
2016-10-21 17:42:21 -04:00
import GlobalUI from '../GlobalUI'
import Realtime from '../Realtime'
import Loading from '../Loading'
import Maps from '../../components/Maps'
2016-09-23 08:05:26 +08:00
const ExploreMaps = {
pending: false,
2016-10-24 13:42:26 +00:00
mapper: null,
2016-11-07 15:25:08 -05:00
setCollection: function(collection) {
var self = ExploreMaps
if (self.collection) {
self.collection.off('add', self.render)
self.collection.off('successOnFetch', self.handleSuccess)
self.collection.off('errorOnFetch', self.handleError)
}
self.collection = collection
self.collection.on('add', self.render)
self.collection.on('successOnFetch', self.handleSuccess)
self.collection.on('errorOnFetch', self.handleError)
},
2016-11-07 15:25:08 -05:00
render: function(cb) {
var self = ExploreMaps
if (!self.collection) return
var exploreObj = {
currentUser: Active.Mapper,
section: self.collection.id,
maps: self.collection,
juntoState: Realtime.juntoState,
2016-11-07 15:25:08 -05:00
moreToLoad: self.collection.page !== 'loadedAll',
2016-10-24 13:42:26 +00:00
user: self.collection.id === 'mapper' ? self.mapper : null,
2016-10-21 17:42:21 -04:00
loadMore: self.loadMore,
pending: self.pending,
2016-11-07 15:25:08 -05:00
onStar: function(map) {
2016-10-21 17:42:21 -04:00
$.post('/maps/' + map.id + '/star')
map.set('star_count', map.get('star_count') + 1)
2016-11-07 15:25:08 -05:00
if (DataModel.Stars) DataModel.Stars.push({ user_id: Active.Mapper.id, map_id: map.id })
DataModel.Maps.Starred.add(map)
2016-10-21 17:42:21 -04:00
GlobalUI.notifyUser('Map is now starred')
self.render()
},
2016-11-07 15:25:08 -05:00
onRequest: function(map) {
2016-10-21 17:42:21 -04:00
$.post({
url: `/maps/${map.id}/access_request`
})
GlobalUI.notifyUser('You will be notified by email if request accepted')
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-06 22:49:46 -05:00
},
onFollow: function(map) {
const isFollowing = map.isFollowedBy(Active.Mapper)
$.post({
url: `/maps/${map.id}/${isFollowing ? 'un' : ''}follow`
})
if (isFollowing) {
GlobalUI.notifyUser('You are no longer following this map')
Active.Mapper.unfollowMap(map.id)
} else {
GlobalUI.notifyUser('You are now following this map')
Active.Mapper.followMap(map.id)
}
self.render()
2016-10-21 17:42:21 -04:00
}
}
ReactDOM.render(
React.createElement(Maps, exploreObj),
document.getElementById('explore')
2016-10-21 19:10:28 -04:00
).resize()
if (cb) cb()
Loading.hide()
},
2016-11-07 15:25:08 -05:00
loadMore: function() {
var self = ExploreMaps
2016-11-07 15:25:08 -05:00
if (self.collection.page !== 'loadedAll') {
self.collection.getMaps()
self.pending = true
}
self.render()
},
2016-11-07 15:25:08 -05:00
handleSuccess: function(cb) {
var self = ExploreMaps
self.pending = false
if (self.collection && self.collection.id === 'mapper') {
self.fetchUserThenRender(cb)
} else {
self.render(cb)
2016-11-07 15:25:08 -05:00
Loading.hide()
}
},
2016-11-07 15:25:08 -05:00
handleError: function() {
console.log('error loading maps!') // TODO
2016-11-07 15:25:08 -05:00
Loading.hide()
},
2016-11-07 15:25:08 -05:00
fetchUserThenRender: function(cb) {
var self = ExploreMaps
2016-10-24 13:42:26 +00:00
if (self.mapper && self.mapper.id === self.collection.mapperId) {
self.render(cb)
2016-11-07 15:25:08 -05:00
return Loading.hide()
2016-10-24 13:42:26 +00:00
}
// first load the mapper object and then call the render function
$.ajax({
url: '/users/' + self.collection.mapperId + '/details.json',
2016-11-07 15:25:08 -05:00
success: function(response) {
2016-10-24 13:42:26 +00:00
self.mapper = response
self.render(cb)
2016-11-07 15:25:08 -05:00
Loading.hide()
},
2016-11-07 15:25:08 -05:00
error: function() {
self.render(cb)
2016-11-07 15:25:08 -05:00
Loading.hide()
}
})
}
}
export default ExploreMaps