diff --git a/admin/app/admin/generic_state.rb b/admin/app/admin/generic_state.rb new file mode 100644 index 000000000..02bfedf6b --- /dev/null +++ b/admin/app/admin/generic_state.rb @@ -0,0 +1,18 @@ +ActiveAdmin.register JamRuby::GenericState, :as => 'GenericState' do + menu :parent => 'Operations' + + config.clear_action_items! + filter :env + permit_params :top_message + + actions :all, :except => [:destroy] + + index do + selectable_column + column :env + actions + end + + form :partial => 'form' + +end diff --git a/admin/app/views/admin/generic_states/_form.html.erb b/admin/app/views/admin/generic_states/_form.html.erb new file mode 100644 index 000000000..9778f56dc --- /dev/null +++ b/admin/app/views/admin/generic_states/_form.html.erb @@ -0,0 +1,7 @@ +<%= semantic_form_for([:admin, resource], :url => resource.new_record? ? admin_generic_states_path : "/admin/generic_states/#{resource.id}") do |f| %> + <%= f.semantic_errors *f.object.errors.keys %> + <%= f.inputs do %> + <%= f.input(:top_message, :input_html => {:maxlength => 10000, :rows=>10, :class => 'autogrow'}) %> + <% end %> + <%= f.actions %> +<% end %> \ No newline at end of file diff --git a/db/manifest b/db/manifest index 3eafba777..8ed347f9c 100755 --- a/db/manifest +++ b/db/manifest @@ -393,4 +393,4 @@ store_backend_details_rate_session.sql invited_user_receiver.sql live_streams.sql live_stream_notify.sql -find_sessions_2020.sql +find_sessions_2020.sql \ No newline at end of file diff --git a/db/up/find_sessions_2020.sql b/db/up/find_sessions_2020.sql index a36638b4c..1b19ed3fc 100644 --- a/db/up/find_sessions_2020.sql +++ b/db/up/find_sessions_2020.sql @@ -31,4 +31,8 @@ CREATE TABLE arses ( active BOOLEAN DEFAULT TRUE, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); \ No newline at end of file +); + +------ + +ALTER TABLE generic_state ADD COLUMN top_message VARCHAR(100000); \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/generic_state.rb b/ruby/lib/jam_ruby/models/generic_state.rb index 5722a9424..fdf87055c 100644 --- a/ruby/lib/jam_ruby/models/generic_state.rb +++ b/ruby/lib/jam_ruby/models/generic_state.rb @@ -2,6 +2,9 @@ module JamRuby class GenericState < ActiveRecord::Base + + attr_accessible :top_message, as: :admin + self.table_name = 'generic_state' validates :env, :inclusion => {:in => ['development', 'staging', 'production', 'test']} @@ -31,6 +34,10 @@ module JamRuby GenericState.singleton.bounce_check_at end + def self.top_message + GenericState.singleton.top_message + end + def self.singleton GenericState.find('default') end diff --git a/web/app/assets/javascripts/jam_rest.js b/web/app/assets/javascripts/jam_rest.js index 5f5a823f9..71fd20294 100644 --- a/web/app/assets/javascripts/jam_rest.js +++ b/web/app/assets/javascripts/jam_rest.js @@ -2697,6 +2697,20 @@ }); } + function getConfigClient(options) { + + if (!options) { + options = {} + } + + return $.ajax({ + type: "GET", + url: "/api/config/client?" + $.param(options), + dataType: "json", + contentType: 'application/json' + }); + } + function createReview(options) { return $.ajax({ @@ -3113,6 +3127,7 @@ this.updateOnboarding = updateOnboarding; this.findFriendSessions = findFriendSessions; this.findPublicSessions = findPublicSessions; + this.getConfigClient = getConfigClient; return this; }; })(window, jQuery); diff --git a/web/app/assets/javascripts/layout.js b/web/app/assets/javascripts/layout.js index 5e4723659..aec9eecca 100644 --- a/web/app/assets/javascripts/layout.js +++ b/web/app/assets/javascripts/layout.js @@ -239,15 +239,25 @@ var broadcastWidth = findCardLayout.width + feedCardLayout.width; //+ opts.gridPadding * 2; - layoutBroadcast(broadcastWidth, findCardLayout.left); + //layoutBroadcast(broadcastWidth, findCardLayout.left); + layoutTopMessage(broadcastWidth, findCardLayout.left) } + /** function layoutBroadcast(width, left) { var css = { width:width + opts.gridPadding * 2, left:left } $('[data-react-class="BroadcastHolder"]').animate(css, opts.animationDuration) + }*/ + + function layoutTopMessage(width, left) { + var css = { + width:width + opts.gridPadding * 2, + left:left + } + $('[data-react-class="TopMessageHolder"]').animate(css, opts.animationDuration) } function layoutSidebar(screenWidth, screenHeight) { diff --git a/web/app/assets/javascripts/react-components/TopMessageHolder.js.jsx.coffee b/web/app/assets/javascripts/react-components/TopMessageHolder.js.jsx.coffee new file mode 100644 index 000000000..488f100d8 --- /dev/null +++ b/web/app/assets/javascripts/react-components/TopMessageHolder.js.jsx.coffee @@ -0,0 +1,34 @@ +context = window +ConfigStore = context.ConfigStore + +ReactCSSTransitionGroup = React.addons.CSSTransitionGroup; + +@TopMessageHolder = React.createClass( + { + displayName: 'Top Message Holder', + + mixins: [Reflux.listenTo(ConfigStore, "onConfig")] + + getInitialState: () -> + {} + + onConfig: (configs) -> + + if configs.top_message + @setState({top_message: configs.top_message}) + + componentDidUpdate:() -> + $root = $(this.getDOMNode()) + context.JK.popExternalLinks($root) + return false + + render: () -> + if @state.top_message + `