Skip to content

Commit

Permalink
add ability to install views to Menu or Library and declare what type…
Browse files Browse the repository at this point in the history
… of objects they can handle
  • Loading branch information
webcracy committed Apr 22, 2012
1 parent de58de9 commit 2ef5d4e
Show file tree
Hide file tree
Showing 25 changed files with 442 additions and 87 deletions.
31 changes: 31 additions & 0 deletions app/assets/stylesheets/application.css
Original file line number Diff line number Diff line change
Expand Up @@ -688,4 +688,35 @@ ul.visualization-list {
ul.visualization-list li {
display: inline;
padding-right: 20px;
}

.success-icon {
background: url(/assets/icons/fugue-icons-1.7.2/tick-circle.png) 0 0 no-repeat;
padding-left: 20px;
}

.failure-icon {
background: url(/assets/icons/fugue-icons-1.7.2/cross-circle.png) 0 0 no-repeat;
padding-left: 20px;
}

.library-icon {
background: url(/assets/icons/fugue-icons-1.7.2/book-brown.png) 0 0 no-repeat;
padding-left: 20px;
font-weight: bold;
}

.menu-icon {
background: url(/assets/icons/fugue-icons-1.7.2/layout-select-sidebar.png) 0 0 no-repeat;
padding-left: 20px;
font-weight: bold;
padding-right: 5px;
}

.visu-obj-target {
text-transform: uppercase;
background-color: #ddd;
padding: 3px;
font-size: 10px;
font-weight: bold;
}
36 changes: 21 additions & 15 deletions app/controllers/aggregations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,24 @@ def index
end

def show
@visualizations = ClientApplication.visualizations
@aggregation = current_user.aggregations.find(params[:id])
@aggregations = current_user.aggregations.match(params[:id])
@aggregation = @aggregations.first
@visualizations = load_related_apps(@aggregations)

@notifications_count = @aggregation.notifications.count
@predictions_count = @aggregation.predictions.count
@notifications_count = @aggregation.notifications.count #rescue(0)
@predictions_count = @aggregation.predictions.count #rescue(0)

@activities = @aggregation.activities.timeline.scoped

@activities = @activities.paginate(:page => params[:page], :per_page => 10) unless
@activities.is_a? WillPaginate::Collection
aggregations_sql = Aggregation.bundled_activities(current_user.id, @aggregations.collect(&:id))
@activities = Activity.paginate_by_sql(aggregations_sql.to_sql, :per_page => 10, :page => params[:page])

@count = @activities.total_entries rescue(@activities.count)
end

def aggregates
@aggregation = current_user.aggregations.find(params[:id])
@activities = @aggregation.activities.timeline.scoped
@aggregates = load_aggregates
# paginate after aggregates to let aggregates deal with unscoped activities
@activities = @activities.paginate(:page => params[:page], :per_page => 10) unless
@activities.is_a? WillPaginate::Collection
@count = @activities.total_entries rescue(@activities.count)
end

def filter
Expand Down Expand Up @@ -74,10 +71,10 @@ def predictions
end

def bundle
@visualizations = ClientApplication.visualizations
@activities = load_bundles
logger.info @activities.class
@aggregates = load_aggregates
@visualizations = load_related_apps(@aggregations)
@activities = @activities.paginate(:page => params[:page], :per_page => 10) unless
@activities.is_a? WillPaginate::Collection
logger.info @activities.class
Expand All @@ -90,9 +87,6 @@ def bundle_aggregates
@activities = load_bundles
logger.info @activities.class
@aggregates = load_aggregates
@activities = @activities.paginate(:page => params[:page], :per_page => 10) unless
@activities.is_a? WillPaginate::Collection
logger.info @activities.class
render 'aggregates'
end

Expand Down Expand Up @@ -150,5 +144,17 @@ def load_aggregates
uniq
end
end

def load_related_apps(aggregations)
visualizations = current_user.installed_applications.in_library.collect(&:client_application)
aggregates = Aggregation.aggregates_for_intersection(aggregations.collect(&:id))
related = aggregates.collect(&:name)
apps = visualizations.collect {|v|
v if v.target_objects.split(',').collect do |target|
true if related.include?(target) or v.target_objects == 'all' or aggregations.collect(&:name).include? target
end.include? true
}
apps.uniq.compact
end

end
29 changes: 25 additions & 4 deletions app/controllers/visualizations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,28 @@ class VisualizationsController < ApplicationController
before_filter :authenticate_user!

def index
@visualizations = ClientApplication.visualizations#.are_trusted
# @my_visualizations = current_user.client_applications.where(:app_type => 'Visualization')
VisualizationApp.load_all
@installed_applications = current_user.installed_applications
@visualizations = ClientApplication.visualizations
end

def install
installed = InstalledApplication.find_or_initialize_by_user_id_and_client_application_id(current_user.id, params[:id])
if installed.new_record?
installed.in_library = installed.client_application.in_library
installed.in_menu = installed.client_application.in_menu
installed.is_default = false
installed.save
redirect_to visualization_path(installed.client_application.id), notice: "#{installed.client_application.name} installed."
else
redirect_to visualizations_path, alert: 'View was already installed.'
end
end

def uninstall
installed = InstalledApplication.find_or_initialize_by_user_id_and_client_application_id(current_user.id, params[:id])
installed.destroy
redirect_to visualizations_path, notice: "#{installed.client_application.name} uninstalled."
end

def show
Expand Down Expand Up @@ -56,11 +76,12 @@ def update


def edit
@visualization = ClientApplication.find(params[:id])
@installed_application = InstalledApplication.find_by_user_id_and_client_application_id(current_user.id, params[:id])
@visualization = @installed_application.client_application
end

def destroy
@visualization = current_user.client_applications.find(params[:id])
@visualization = ClientApplication.find(params[:id])
@visualization.destroy
redirect_to visualizations_path, :notice => 'Visualization deleted.'
end
Expand Down
25 changes: 18 additions & 7 deletions app/models/aggregation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,22 @@ class Aggregation < ActiveRecord::Base
has_and_belongs_to_many :notifications
has_and_belongs_to_many :predictions

def self.match(aggregation_params)
if aggregation_params.match '\+'
@match = 'reunion'
@match_symbol = '+'
params_id = aggregation_params.split('+').collect(&:to_i).flatten
elsif aggregation_params.match '&'
@match = 'intersection'
@match_symbol = '&'
params_id = aggregation_params.split('&').collect(&:to_i).flatten
else
params_id = [aggregation_params]
end
self.where(id: params_id)
end


def self.bundled_activities(user_id, aggregation_ids)
a0 = Arel::Table.new(:activities_aggregations)
bundles = []
Expand Down Expand Up @@ -33,7 +49,7 @@ def self.bundled_activities(user_id, aggregation_ids)
def self.recalculate_totals!
Aggregation.find_each do |ag|
ag.update_attribute :total, (ag.activities.count + ag.notifications.count)
ag.destroy if ag.total == 0
ag.destroy if ag.total <= 0
end
end

Expand Down Expand Up @@ -307,9 +323,4 @@ def self.create_all_for_object(obj)
end
## End add all aggregations


private

def aggregate_people_for_activity(activity)
end
end
end
4 changes: 4 additions & 0 deletions app/models/client_application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,10 @@ def as_provider(options={})

alias_method :as_generator, :as_provider

def installed_by_user?(this_user_id)
InstalledApplication.exists? user_id: this_user_id, client_application_id:self.id
end

protected

def generate_keys
Expand Down
15 changes: 15 additions & 0 deletions app/models/installed_application.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class InstalledApplication < ActiveRecord::Base
belongs_to :user
belongs_to :client_application
attr_accessible :in_library, :in_menu, :is_default

scope :in_menu, lambda {
where(in_menu: true)
}

scope :in_library, lambda {
where(in_library: true)
}


end
2 changes: 2 additions & 0 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ class User < ActiveRecord::Base
has_many :bundles, :dependent => :destroy
has_many :aggregations, :dependent => :destroy
has_many :oauth_accounts

has_many :installed_applications

validates_uniqueness_of :email
validates_presence_of :email, :on => :update
Expand Down
76 changes: 76 additions & 0 deletions app/models/visualization_app.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
class VisualizationApp

def initialize(path)
@path = path.split('./public').last.split('manybots.json').first

begin
@payload = JSON.load open(path)
rescue => e
raise "Error loading visualization at #{@path}: #{e}"
end
end

def display
@display ||= @payload['display']
end

def name
@name ||= @payload['name']
end

def developer
@developer ||= @payload['developer']
end

def nickname
@nickname ||= @payload['nickname']
end

def category
@category ||= @payload['category']
end

def description
@description ||= @payload['description'].strip
end

def target_objects
return case self.display['objects']
when 'all'
'all'
else
self.display['objects'].join(',') rescue('all')
end
end

def load_app
app = ClientApplication.find_or_initialize_by_nickname self.nickname
if app.new_record?
app.app_type = "Visualization"
app.url = ManybotsServer.url + @path
app.screenshot = "#{app.url}screenshot.png"
app.app_icon_url = "#{app.url}icon.png"
end
app.name = self.name || app.nickname
app.description = self.description

app.in_menu = self.display['menu']
app.in_library = self.display['library']
app.target_objects = self.target_objects

app.developer_name = self.developer['name']
app.developer_url = self.developer['url']
app.category = self.category
app.save
app
end

def self.load_all
visualizations = Dir["./public/*/manybots.json"]
visualizations.collect do |vis|
visualization = self.new(vis)
visualization.load_app
end
end

end # Visualization
37 changes: 17 additions & 20 deletions app/views/aggregations/index.html.erb
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
<section class="main-content">
<article class="box">
<div class="box-content">
<h1 class="page-title">Aggregations</h1>

<p style="font-size:30px;"><%= @aggregations.count %> aggregations</p>
</div>
</article>

<article class="box">
<div class="box-content">
<h3>Activities</h3>
<ol>
<%- for aggregation in @aggregations -%>
<li><%= aggregation.type_string %>: <%= link_to aggregation.name, aggregation %> (<%= aggregation.total %>)</li>
<%- end -%>
</ol>
</div>
</article>
</section>

<h1 class="page-title" style="">
Library
<span class="meta">
<%= @aggregations.size %> objects
</span>
</h1>

<article class="box">
<div class="box-content">
<ol>
<%- for aggregation in @aggregations -%>
<li><%= aggregation.type_string %>: <%= link_to aggregation.name, aggregation %> (<%= aggregation.total %>)</li>
<%- end -%>
</ol>
</div>
</article>
2 changes: 1 addition & 1 deletion app/views/layouts/_app_menu.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

<ul class="app-nav">
<li><a href="/analytics" class="<%= current_tab?(:filters)%>">Analytics</a></li>
<%- ClientApplication.visualizations.each do |visualization| -%>
<%- current_user.installed_applications.in_menu.collect(&:client_application).each do |visualization| -%>
<li><%= link_to visualization.name, "/visualizations/#{visualization.id}", class: current_tab?(:visualizations, visualization.id) %></li>
<%- end -%>
<li><%= link_to 'People', main_app.collection_path('people'), :class => current_tab?(:aggregations, 'people') %></li>
Expand Down
Loading

0 comments on commit 2ef5d4e

Please sign in to comment.