Implement custom html widget
[shapado:shapado.git] / app / controllers / widgets_controller.rb
1 class WidgetsController < ApplicationController
2   before_filter :login_required, :except => :embedded
3   before_filter :check_permissions, :except => :embedded
4   layout "manage"
5   tabs :default => :widgets
6
7   subtabs :widgets => [[:mainlist, "mainlist"],
8                        [:question, "question"],
9                        [:external, "external"]]
10
11   # GET /widgets
12   # GET /widgets.json
13   def index
14     @active_subtab ||= "mainlist"
15
16     @widget = Widget.new
17     @widget_list = @group.send(:"#{@active_subtab}_widgets")
18   end
19
20   # POST /widgets
21   # POST /widgets.json
22   def create
23     if Widget.types(params[:tab],current_group.has_custom_ads).include?(params[:widget][:_type])
24       @widget = params[:widget][:_type].constantize.new
25     end
26
27     widget_list = @group.send(:"#{params[:tab]}_widgets")
28     widget_list.send(:"#{params[:widget][:position]}") << @widget
29
30     respond_to do |format|
31       if @widget.save
32         flash[:notice] = 'Widget was successfully created.'
33         format.html { redirect_to widgets_path(:tab => params[:tab]) }
34         format.json  { render :json => @widget.to_json, :status => :created, :location => widget_path(:id => @widget.id) }
35       else
36         format.html { render :action => "index" }
37         format.json  { render :json => @widget.errors, :status => :unprocessable_entity }
38       end
39     end
40   end
41
42   # PUT /widgets
43   # PUT /widgets.json
44   def update
45     widget_list = @group.send(:"#{params[:tab]}_widgets")
46
47     @widget = nil
48     if WidgetList::POSITIONS.include? params[:position]
49       @widget = widget_list.send(params[:position]).find(params[:id])
50       @widget.update_settings(params)
51     end
52
53     respond_to do |format|
54       if @widget.valid? && @group.save && @widget.save
55         flash[:notice] = 'Widget was successfully updated.'
56         format.html { redirect_to widgets_path(:tab => params[:tab]) }
57         format.json  { render :json => @widget.to_json, :status => :updated, :location => widget_path(:id => @widget.id) }
58       else
59         format.html { render :action => "index" }
60         format.json  { render :json => @widget.errors, :status => :unprocessable_entity }
61       end
62     end
63   end
64
65
66   # DELETE /ads/1
67   # DELETE /ads/1.json
68   def destroy
69     widget_list = @group.send(:"#{params[:tab]}_widgets")
70
71   if WidgetList::POSITIONS.include? params[:position]
72     @widget = widget_list.send(params[:position]).find(params[:id])
73     @widget.destroy
74   end
75
76     respond_to do |format|
77       format.html { redirect_to(widgets_url) }
78       format.json  { head :ok }
79     end
80   end
81
82   def move
83     widget_list = @group.send(:"#{params[:tab]}_widgets")
84
85     if WidgetList::POSITIONS.include? params[:position]
86       widget_list.move_to(params[:move_to], params[:id], params[:position])
87     end
88
89     redirect_to widgets_path(:tab => params[:tab])
90   end
91
92   def embedded
93     @widget = current_group.external_widgets.sidebar.find(params[:id])
94     render :layout => false
95   end
96
97   private
98   def check_permissions
99     @group = current_group
100
101     if @group.nil?
102       redirect_to groups_path
103     elsif !current_user.owner_of?(@group)
104       flash[:error] = t("global.permission_denied")
105       redirect_to widgets_path
106     end
107   end
108 end