diff --git a/app/assets/stylesheets/clean.css.erb b/app/assets/stylesheets/clean.css.erb index bc94a6f7..088ebe0d 100644 --- a/app/assets/stylesheets/clean.css.erb +++ b/app/assets/stylesheets/clean.css.erb @@ -169,6 +169,9 @@ .upperRightMapButtons { right: 134px; } +.unauthenticated .upperRightMapButtons { + right: 115px; +} .upperRightIcon { width: 32px; diff --git a/app/assets/stylesheets/request_access.scss.erb b/app/assets/stylesheets/request_access.scss.erb index 19ae2792..98f1a380 100644 --- a/app/assets/stylesheets/request_access.scss.erb +++ b/app/assets/stylesheets/request_access.scss.erb @@ -1,7 +1,6 @@ .viewOnly { float: left; margin-left: 16px; - display: none; height: 32px; border: 1px solid #BDBDBD; border-radius: 2px; @@ -23,7 +22,7 @@ } .requestNotice { - display: none; + display: inline-block; padding: 0 8px; } @@ -42,16 +41,6 @@ .requestNotAccepted { background-color: #c04f4f; } - - &.sendRequest .requestAccess { - display: inline-block; - } - &.sentRequest .requestPending { - display: inline-block; - } - &.requestDenied .requestNotAccepted { - display: inline-block; - } } .request_access { diff --git a/app/views/maps/conversation.html.erb b/app/views/maps/conversation.html.erb index 4ecbd274..51d68a7a 100644 --- a/app/views/maps/conversation.html.erb +++ b/app/views/maps/conversation.html.erb @@ -18,5 +18,6 @@ Metamaps.ServerData.Mappings = <%= @allmappings.to_json.html_safe %>; Metamaps.ServerData.Messages = <%= @allmessages.to_json.html_safe %>; Metamaps.ServerData.Stars = <%= @allstars.to_json.html_safe %>; + Metamaps.ServerData.requests = <%= @allrequests.to_json.html_safe %>; Metamaps.ServerData.VisualizeType = "ForceDirected"; diff --git a/app/views/maps/show.html.erb b/app/views/maps/show.html.erb index 4ecbd274..51d68a7a 100644 --- a/app/views/maps/show.html.erb +++ b/app/views/maps/show.html.erb @@ -18,5 +18,6 @@ Metamaps.ServerData.Mappings = <%= @allmappings.to_json.html_safe %>; Metamaps.ServerData.Messages = <%= @allmessages.to_json.html_safe %>; Metamaps.ServerData.Stars = <%= @allstars.to_json.html_safe %>; + Metamaps.ServerData.requests = <%= @allrequests.to_json.html_safe %>; Metamaps.ServerData.VisualizeType = "ForceDirected"; diff --git a/frontend/src/Metamaps/GlobalUI/ReactApp.js b/frontend/src/Metamaps/GlobalUI/ReactApp.js index 2a32001f..2d176ebf 100644 --- a/frontend/src/Metamaps/GlobalUI/ReactApp.js +++ b/frontend/src/Metamaps/GlobalUI/ReactApp.js @@ -101,6 +101,10 @@ const ReactApp = { return { mapId: self.mapId, map: Active.Map, + userRequested: Map.userRequested, + requestAnswered: Map.requestAnswered, + requestApproved: Map.requestApproved, + onRequestAccess: Map.requestAccess, mapIsStarred: Map.mapIsStarred, endActiveMap: Map.end, launchNewMap: Map.launch, diff --git a/frontend/src/Metamaps/Map/index.js b/frontend/src/Metamaps/Map/index.js index 0b64a0b0..b06131ef 100644 --- a/frontend/src/Metamaps/Map/index.js +++ b/frontend/src/Metamaps/Map/index.js @@ -26,110 +26,108 @@ const Map = { editedByActiveMapper: 'Metamaps:Map:events:editedByActiveMapper' }, mapIsStarred: false, + requests: [], + userRequested: false, + requestAnswered: false, + requestApproved: false, init: function(serverData) { var self = Map - self.mapIsStarred = serverData.mapIsStarred - + self.requests = serverData.requests + self.setAccessRequest() $('#wrapper').mousedown(function(e) { if (e.button === 1) return false }) - GlobalUI.CreateMap.emptyForkMapForm = $('#fork_map').html() - InfoBox.init(serverData, function updateThumbnail() { self.uploadMapScreenshot() }) CheatSheet.init(serverData) - - $('.viewOnly .requestAccess').click(self.requestAccess) - $(document).on(Map.events.editedByActiveMapper, self.editedByActiveMapper) }, requestAccess: function() { - $('.viewOnly').removeClass('sendRequest').addClass('sentRequest') + const self = Map + self.requests.push({ + user_id: Active.Mapper.id, + answered: false, + approved: false + }) + self.setAccessRequest() const mapId = Active.Map.id $.post({ url: `/maps/${mapId}/access_request` }) GlobalUI.notifyUser('Map creator will be notified of your request') }, - setAccessRequest: function(requests, activeMapper) { - let className = 'isViewOnly ' - if (activeMapper) { - const request = _find(requests, r => r.user_id === activeMapper.id) - if (!request) className += 'sendRequest' - else if (request && !request.answered) className += 'sentRequest' - else if (request && request.answered && !request.approved) className += 'requestDenied' + setAccessRequest: function() { + const self = Map + if (Active.Mapper) { + const request = _find(self.requests, r => r.user_id === Active.Mapper.id) + if (!request) { + self.userRequested = false + self.requestAnswered = false + self.requestApproved = false + } + else if (request && !request.answered) { + self.userRequested = true + self.requestAnswered = false + self.requestApproved = false + } + else if (request && request.answered && !request.approved) { + self.userRequested = true + self.requestAnswered = true + self.requestApproved = false + } } - $('.viewOnly').removeClass('sendRequest sentRequest requestDenied').addClass(className) + ReactApp.render() }, launch: function(id) { - var start = function(data) { - Active.Map = new DataModelMap(data.map) - DataModel.Mappers = new DataModel.MapperCollection(data.mappers) - DataModel.Collaborators = new DataModel.MapperCollection(data.collaborators) - DataModel.Topics = new DataModel.TopicCollection(data.topics) - DataModel.Synapses = new DataModel.SynapseCollection(data.synapses) - DataModel.Mappings = new DataModel.MappingCollection(data.mappings) - DataModel.Messages = data.messages - DataModel.Stars = data.stars - DataModel.attachCollectionEvents() - - var map = Active.Map - var mapper = Active.Mapper - - document.title = map.get('name') + ' | Metamaps' - - // add class to .wrapper for specifying whether you can edit the map - if (map.authorizeToEdit(mapper)) { - $('.wrapper').addClass('canEditMap') - } else { - Map.setAccessRequest(data.requests, mapper) - } - - // add class to .wrapper for specifying if the map can - // be collaborated on - if (map.get('permission') === 'commons') { - $('.wrapper').addClass('commonsMap') - } - - // set filter mapper H3 text - $('#filter_by_mapper h3').html('MAPPERS') - - // build and render the visualization + const self = Map + var start = function() { + document.title = Active.Map.get('name') + ' | Metamaps' + Map.setAccessRequest() + $('#filter_by_mapper h3').html('MAPPERS') // TODO: rewrite filter box in react Visualize.type = 'ForceDirected' JIT.prepareVizData() - - // update filters Filter.reset() - - // reset selected arrays Selected.reset() - - // set the proper mapinfobox content InfoBox.load() - - // these three update the actual filter box with the right list items Filter.checkMetacodes() Filter.checkSynapses() Filter.checkMappers() - Realtime.startActiveMap() Loading.hide() - - // for mobile - $('#header_content').html(map.get('name')) + $('#header_content').html(Active.Map.get('name')) // TODO: make this use ReactApp.mobileTitle to set this + } + function isLoaded() { + if (InfoBox.generateBoxHTML) start() + else setTimeout(() => isLoaded(), 50) + } + if (Active.Map && Active.Map.id == id) { + isLoaded() + } + else { + Loading.show() + $.ajax({ + url: '/maps/' + id + '/contains.json', + success: function(data) { + Active.Map = new DataModelMap(data.map) + DataModel.Mappers = new DataModel.MapperCollection(data.mappers) + DataModel.Collaborators = new DataModel.MapperCollection(data.collaborators) + DataModel.Topics = new DataModel.TopicCollection(data.topics) + DataModel.Synapses = new DataModel.SynapseCollection(data.synapses) + DataModel.Mappings = new DataModel.MappingCollection(data.mappings) + DataModel.Messages = data.messages + DataModel.Stars = data.stars + DataModel.attachCollectionEvents() + self.requests = data.requests + isLoaded() + } + }) } - Loading.show() - $.ajax({ - url: '/maps/' + id + '/contains.json', - success: start - }) }, end: function() { if (Active.Map) { - $('.wrapper').removeClass('canEditMap commonsMap') AutoLayout.resetSpiral() $('.rightclickmenu').remove() diff --git a/frontend/src/components/App/Toast.js b/frontend/src/components/App/Toast.js deleted file mode 100644 index 48ac4cb1..00000000 --- a/frontend/src/components/App/Toast.js +++ /dev/null @@ -1,14 +0,0 @@ -import React, { Component, PropTypes } from 'react' - -class Toast extends Component { - static propTypes = { - message: PropTypes.string - } - - render () { - const html = {__html: this.props.html} - return
- } -} - -export default Toast diff --git a/frontend/src/components/App/UpperLeftUI.js b/frontend/src/components/App/UpperLeftUI.js index 51a79784..802e71b9 100644 --- a/frontend/src/components/App/UpperLeftUI.js +++ b/frontend/src/components/App/UpperLeftUI.js @@ -3,13 +3,20 @@ import { Link } from 'react-router' class UpperLeftUI extends Component { static propTypes = { - currentUser: PropTypes.object + currentUser: PropTypes.object, + map: PropTypes.object, + userRequested: PropTypes.bool, + requestAnswered: PropTypes.bool, + requestApproved: PropTypes.bool, + onRequestClick: PropTypes.func } render () { + const { map, currentUser, userRequested, requestAnswered, requestApproved, onRequestClick } = this.props return