7ee96bf6c6
* 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
127 lines
3.5 KiB
JavaScript
127 lines
3.5 KiB
JavaScript
/* global $ */
|
|
|
|
import React from 'react'
|
|
import ReactDOM from 'react-dom' // TODO ensure this isn't a double import
|
|
|
|
import Active from '../Active'
|
|
import DataModel from '../DataModel'
|
|
import GlobalUI from '../GlobalUI'
|
|
import Realtime from '../Realtime'
|
|
import Loading from '../Loading'
|
|
import Maps from '../../components/Maps'
|
|
|
|
const ExploreMaps = {
|
|
pending: false,
|
|
mapper: null,
|
|
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)
|
|
},
|
|
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,
|
|
moreToLoad: self.collection.page !== 'loadedAll',
|
|
user: self.collection.id === 'mapper' ? self.mapper : null,
|
|
loadMore: self.loadMore,
|
|
pending: self.pending,
|
|
onStar: function(map) {
|
|
$.post('/maps/' + map.id + '/star')
|
|
map.set('star_count', map.get('star_count') + 1)
|
|
if (DataModel.Stars) DataModel.Stars.push({ user_id: Active.Mapper.id, map_id: map.id })
|
|
DataModel.Maps.Starred.add(map)
|
|
GlobalUI.notifyUser('Map is now starred')
|
|
self.render()
|
|
},
|
|
onRequest: function(map) {
|
|
$.post({
|
|
url: `/maps/${map.id}/access_request`
|
|
})
|
|
GlobalUI.notifyUser('You will be notified by email if request accepted')
|
|
},
|
|
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()
|
|
}
|
|
}
|
|
ReactDOM.render(
|
|
React.createElement(Maps, exploreObj),
|
|
document.getElementById('explore')
|
|
).resize()
|
|
|
|
if (cb) cb()
|
|
Loading.hide()
|
|
},
|
|
loadMore: function() {
|
|
var self = ExploreMaps
|
|
if (self.collection.page !== 'loadedAll') {
|
|
self.collection.getMaps()
|
|
self.pending = true
|
|
}
|
|
self.render()
|
|
},
|
|
handleSuccess: function(cb) {
|
|
var self = ExploreMaps
|
|
self.pending = false
|
|
if (self.collection && self.collection.id === 'mapper') {
|
|
self.fetchUserThenRender(cb)
|
|
} else {
|
|
self.render(cb)
|
|
Loading.hide()
|
|
}
|
|
},
|
|
handleError: function() {
|
|
console.log('error loading maps!') // TODO
|
|
Loading.hide()
|
|
},
|
|
fetchUserThenRender: function(cb) {
|
|
var self = ExploreMaps
|
|
|
|
if (self.mapper && self.mapper.id === self.collection.mapperId) {
|
|
self.render(cb)
|
|
return Loading.hide()
|
|
}
|
|
|
|
// first load the mapper object and then call the render function
|
|
$.ajax({
|
|
url: '/users/' + self.collection.mapperId + '/details.json',
|
|
success: function(response) {
|
|
self.mapper = response
|
|
self.render(cb)
|
|
Loading.hide()
|
|
},
|
|
error: function() {
|
|
self.render(cb)
|
|
Loading.hide()
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
export default ExploreMaps
|