kitsune 0.0.16 → 0.0.17

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'rake'
2
2
 
3
3
  gem_spec = Gem::Specification.new do |gem_spec|
4
4
  gem_spec.name = "kitsune"
5
- gem_spec.version = "0.0.16"
5
+ gem_spec.version = "0.0.17"
6
6
  gem_spec.summary = "Integrated Rails Content Management System."
7
7
  gem_spec.email = "matt@toastyapps.com"
8
8
  gem_spec.homepage = "http://github.com/toastyapps/kitsune"
@@ -1,6 +1,6 @@
1
1
  class Admin::Kitsune::KitsuneController < Admin::Kitsune::ApplicationController
2
2
  before_filter :load_models
3
-
3
+ skip_before_filter :verify_authenticity_token
4
4
  private
5
5
  def load_models
6
6
  models = Kitsune.models_with_admin.map{ |m| Kitsune::Inspector.new(m) }
@@ -0,0 +1,27 @@
1
+ class Admin::Kitsune::MediaController < Admin::Kitsune::KitsuneController
2
+ layout 'admin/kitsune'
3
+
4
+ helper 'admin/kitsune/records'
5
+
6
+ before_filter :load_model
7
+
8
+ def new
9
+ @parent_instance = @parent.new_record
10
+ @media = @model.new_record
11
+ render :layout => false
12
+ end
13
+
14
+ def create
15
+ @media = @model.new_record
16
+ @upload = @model.new_record
17
+ @parent_instance = @parent.new_record
18
+ @upload.update_attribute(@parent.kitsune_admin[:media].values.first, params['image'])
19
+ render 'new', :layout => false
20
+ end
21
+
22
+ private
23
+ def load_model
24
+ @parent = Kitsune::Inspector.new(params[:model_id].constantize) if params[:model_id]
25
+ @model = Kitsune::Inspector.new(params[:id].constantize) if params[:id]
26
+ end
27
+ end
@@ -5,7 +5,7 @@ class Admin::Kitsune::RecordsController < Admin::Kitsune::KitsuneController
5
5
  before_filter :load_record
6
6
 
7
7
  def index
8
- order, @sort_param, @sort_dir = nil, nil, nil
8
+ order, @sort_param, @sort_dir = @model.order_by, nil, nil
9
9
  if params[:sort]
10
10
  @sort_param = params[:sort]
11
11
  @sort_dir = params[:sort_dir]
@@ -19,24 +19,28 @@ class Admin::Kitsune::RecordsController < Admin::Kitsune::KitsuneController
19
19
  end
20
20
 
21
21
  def create
22
- if @model.is_sti? && params[params[:model_id].underscore][@model.sti_column].present?
23
- sti_model = Kitsune::Inspector.new(params[params[:model_id].underscore].delete(@model.sti_column).constantize)
24
- @record = sti_model.new_record(params[params[:model_id].underscore])
22
+ if request.xhr?
23
+ render :text => "Foo"
25
24
  else
26
- @record = @model.new_record(params[params[:model_id].underscore])
27
- end
28
- if @record.save
29
- flash[:notice] = "Record Saved"
30
- if params[:redirect]
31
- klass = params[:redirect].gsub(/_id$/, '').classify.constantize
32
- record = klass.find(params[:redirect_id])
33
- redirect_to url_for(:controller => 'admin/kitsune/records', :model_id => klass.to_s, :id => params[:redirect_id], :action => :edit)
34
- else
35
- redirect_to url_for(:controller => 'admin/kitsune/records', :model_id => @model.class_name)
36
- end
37
- else
38
- flash[:notice] = "Could not save record"
39
- render 'new'
25
+ if @model.is_sti? && params[params[:model_id].underscore][@model.sti_column].present?
26
+ sti_model = Kitsune::Inspector.new(params[params[:model_id].underscore].delete(@model.sti_column).constantize)
27
+ @record = sti_model.new_record(params[params[:model_id].underscore])
28
+ else
29
+ @record = @model.new_record(params[params[:model_id].underscore])
30
+ end
31
+ if @record.save
32
+ flash[:notice] = "Record Saved"
33
+ if params[:redirect]
34
+ klass = params[:redirect].gsub(/_id$/, '').classify.constantize
35
+ record = klass.find(params[:redirect_id])
36
+ redirect_to url_for(:controller => 'admin/kitsune/records', :model_id => klass.to_s, :id => params[:redirect_id], :action => :edit)
37
+ else
38
+ redirect_to url_for(:controller => 'admin/kitsune/records', :model_id => @model.class_name)
39
+ end
40
+ else
41
+ flash[:notice] = "Could not save record"
42
+ render 'new'
43
+ end
40
44
  end
41
45
  end
42
46
 
@@ -5,13 +5,20 @@ module Admin::Kitsune::RecordsHelper
5
5
 
6
6
  def sort_link_to(resource, column)
7
7
  if resource.column_sortable(column)
8
+ ascending = false
9
+ unless params[:sort]
10
+ if resource.order_by_hash && resource.order_by_hash.keys.include?(column.name.to_sym)
11
+ params[:sort] = column.name
12
+ params[:sort_dir] = resource.order_by_hash[column.name.to_sym].to_s.upcase
13
+ end
14
+ end
8
15
  ascending = params[:sort] == column.name && params[:sort_dir] == 'DESC'
9
16
  options = {
10
17
  :model => resource.object,
11
18
  :sort => column.name,
12
19
  :sort_dir => (ascending ? 'ASC' : 'DESC')
13
20
  }
14
- link_to column.name.to_s.titleize + (ascending ? ' &darr;' : ' &uarr;'), options
21
+ link_to column.name.to_s.titleize + (ascending ? ' &darr;' : (params[:sort] == column.name ? ' &uarr;' : ' &#8597;')), options
15
22
  else
16
23
  column.name.to_s.titleize
17
24
  end
@@ -0,0 +1,49 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6
+ <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
7
+ <%= javascript_include_tag 'kitsune/jquery.js', 'kitsune/kitsune_jquery.js', 'kitsune/upload_maker.js' %>
8
+ <script type="text/javascript">
9
+ $(document).ready(function() {
10
+ //Get the parent window
11
+ up = window.parent.document;
12
+ <% if @upload %>
13
+ var destination = '<%= params['destination'] %>'
14
+ //Update value
15
+ $('#' + destination, up).val('<%= @upload.send(@parent.kitsune_admin[:media].values.first).url %>');
16
+ //Trigger select
17
+ $('#' + destination, up).focus();
18
+ <% end %>
19
+ })
20
+ </script>
21
+ </head>
22
+ <body style="background-color:transparent; margin:0px; padding:0px; overflow:hidden;">
23
+ <% form_for(@parent_instance, :url => url_for_record(@parent_instance).gsub(/records/, 'media')+"?id=#{@media.class.to_s}", :html => {:multipart => true, :id => "upload_image_form"}) do |form| %>
24
+ <input type="hidden" name="destination" value="<%= params['destination'] %>">
25
+ <div id="controls">
26
+ <input type="hidden" name="domain" value="data"/>
27
+
28
+ <div style="font:normal 11px 'Lucida Grande',Verdana; color:#aaa;
29
+ text-decoration:none; cursor:pointer; position:absolute;
30
+ right:0px; top:0px; height:16px; line-height:16px;">+ Upload photo</div>
31
+ </div>
32
+
33
+ <div
34
+ style="position:absolute; right:0px; top:0px;
35
+ width:100px; height:24px;
36
+ filter:alpha(opacity=0); -moz-opacity:0; opacity:0; overflow:hidden;"><input
37
+ type="file" id="image" name="image"
38
+ style="cursor:pointer; height:24px; position:absolute;
39
+ right:0px; top:0px;"
40
+ onchange="document.getElementById('upload_image_form').submit();
41
+ document.getElementById('controls').style.display = 'none';
42
+ document.getElementById('loader').style.display = 'inline';"/></div>
43
+
44
+ <img src="http://assets.tumblr.com/images/bookmarklet_loader.gif" id="loader" style="display:none; width:16px;
45
+ height:16px; position:absolute; top:0px; right:0px;"/>
46
+ <% end %>
47
+ </body>
48
+
49
+ </html>
@@ -25,3 +25,4 @@
25
25
  = hidden_field_tag :redirect_id, params[column.name]
26
26
  .submit_button
27
27
  %button(value="Save" type='submit' class="submitBtn") <span>Save</span>
28
+ = yield :below_form
@@ -0,0 +1,6 @@
1
+ #flash_messages
2
+ - [:notice,:error].each do |flash_type|
3
+ - if flash[flash_type]
4
+ %div{ :class => "flash_#{flash_type}" }
5
+ - flash[flash_type].each do |n,msg|
6
+ = "#{n} #{msg}"
@@ -2,12 +2,26 @@
2
2
  <html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
3
3
  <head>
4
4
  <title>Kitsune CMS</title>
5
- <%= javascript_include_tag 'kitsune/jquery.js', 'kitsune/kitsune_jquery.js' %>
5
+ <%= javascript_include_tag 'kitsune/jquery.js', 'kitsune/kitsune_jquery.js', 'kitsune/upload_maker.js' %>
6
6
  <%= stylesheet_link_tag 'kitsune/global.css' %>
7
7
  <!--[if IE]>
8
8
  <%= stylesheet_link_tag 'kitsune/ie.css' %>
9
9
  <![endif]-->
10
- <%= javascript_include_tag 'kitsune/nicEdit.js' %>
10
+ <%= javascript_include_tag 'kitsune/tiny_mce/tiny_mce.js' %>
11
+ <script type='text/javascript'>
12
+ tinyMCE.init({
13
+ plugins: "iespell",
14
+ theme: "advanced",
15
+ width: "650px",
16
+ height: "500px",
17
+ theme_advanced_buttons1 : "bold,italic,strikethrough,|,bullist,numlist,|,outdent,indent,|,image,link,unlink,|,code",
18
+ theme_advanced_buttons2 : "",
19
+ theme_advanced_buttons3 : "",
20
+ theme_advanced_toolbar_location : "top",
21
+ convert_urls : false
22
+ });
23
+ </script>
24
+ <%= yield :head %>
11
25
  </head>
12
26
  <body>
13
27
  <div id='content'>
@@ -15,6 +29,7 @@
15
29
  <h1><%= link_to 'Kitsune CMS', :controller => 'admin/kitsune/models' %></h1>
16
30
  <a href='/' class='view'>View Site</a>
17
31
  </div>
32
+ <%= render "admin/kitsune/shared/flashes" %>
18
33
  <div class='kitsune_container'>
19
34
  <div class='kitsune_right_container'>
20
35
  <div class='kitsune_right wrapper'>
@@ -5,6 +5,7 @@ ActionController::Routing::Routes.draw do |map|
5
5
  kitsune.resources :pages
6
6
  kitsune.resources :models do |model|
7
7
  model.resources :records
8
+ model.resources :media, :only => [:new, :create]
8
9
  end
9
10
  end
10
11
  end
@@ -3,19 +3,24 @@ class KitsuneGenerator < Rails::Generator::Base
3
3
 
4
4
  def initialize(runtime_args, runtime_options = {})
5
5
  @versioned = runtime_args.delete("--versioned")
6
+ @include_pages = runtime_args.delete("--include-page-model")
7
+ @include_users = runtime_args.delete("--include-user-model")
6
8
  super
7
9
  end
8
10
 
9
11
  def manifest
10
12
  record do |m|
11
- page_model = "app/models/page.rb"
12
- if File.exists?(page_model)
13
- m.insert_into page_model, "include Kitsune::Page"
14
- else
15
- m.directory File.join("app", "models")
16
- m.file "page.rb", page_model
17
- m.migration_template "migrations/create_pages.rb", 'db/migrate', :migration_file_name => "kitsune_create_pages"
13
+ if !!@include_pages
14
+ page_model = "app/models/page.rb"
15
+ if File.exists?(page_model)
16
+ m.insert_into page_model, "include Kitsune::Page"
17
+ else
18
+ m.directory File.join("app", "models")
19
+ m.file "page.rb", page_model
20
+ m.migration_template "migrations/create_pages.rb", 'db/migrate', :migration_file_name => "kitsune_create_pages"
21
+ end
18
22
  end
23
+
19
24
  if !!@versioned
20
25
  Rails::Generator::Scripts::Generate.new.run(['vestal_versions_migration'])
21
26
  end
@@ -0,0 +1,19 @@
1
+ $.fn.upload_maker = function(destination) {
2
+ $(this).each(function() {
3
+ //Get some vars
4
+ var id = $(this).attr('id');
5
+ var image_input_id = id + '_image_url';
6
+ //write the iframe
7
+ $(this).before('<iframe src="'+destination+'?destination=' + image_input_id +'" frameborder="0"></iframe>');
8
+ //write hidden input
9
+ $(this).after('<input id="' + image_input_id +'" name="' + image_input_id +'" style="position:absolute;left:-9999em" />');
10
+ $('#' + image_input_id).focus(function() {
11
+ var url = $(this).val();
12
+ if (tinyMCE && (ed = tinyMCE.get(id))) {
13
+ ed.execCommand('mceInsertContent', false, '<img src="' + url + '" alt="' + url + '" />');
14
+ } else {
15
+ insertTag(id, '<img src="' + url + '" alt="' + url + '" />');
16
+ }
17
+ });
18
+ })
19
+ }
@@ -307,6 +307,10 @@ button.submitBtn:hover {
307
307
  color: #fff;
308
308
  }
309
309
 
310
+ #flash_messages {padding:0px;}
311
+ .flash_notice {background:green; padding:5px; color:white;}
312
+ .flash_error {background:red; padding:5px; color:white;}
313
+
310
314
  .kitsune_container {
311
315
  background:url('/images/kitsune/content-bg.gif') repeat-x left top;
312
316
  padding-top: 20px;
@@ -8,7 +8,7 @@ module Kitsune
8
8
  autoload :Page, 'kitsune/page'
9
9
  class << self
10
10
  def version
11
- '0.0.16'
11
+ '0.0.17'
12
12
  end
13
13
 
14
14
  def model_paths # abstract this to something else
@@ -15,7 +15,9 @@ module Kitsune
15
15
  :tabs => {},
16
16
  :is_sti => false,
17
17
  :disabled => [],
18
- :versioned => false
18
+ :versioned => false,
19
+ :order_by => nil,
20
+ :media => nil # class to store images into
19
21
  }
20
22
  end
21
23
  end
@@ -1,7 +1,7 @@
1
1
  module Kitsune
2
2
  class TypeError < StandardError; end
3
3
  class Builder
4
-
4
+
5
5
  TYPES = [:check_box, :datetime_select, :password_field, :text_area, :text_field, :wysiwyg]
6
6
  def initialize(resource, &block)
7
7
  @resource = resource
@@ -16,10 +16,17 @@ module Kitsune
16
16
  @resource.kitsune_admin[:name] = name
17
17
  end
18
18
 
19
+ def media media
20
+ @resource.kitsune_admin[:media] = media
21
+ end
22
+
19
23
  def no_menu
20
24
  no_admin
21
25
  end
22
26
 
27
+ def order_by(order)
28
+ @resource.kitsune_admin[:order_by] = order
29
+ end
23
30
 
24
31
  def versioned
25
32
  @resource.send(:versioned)
@@ -78,6 +85,14 @@ module Kitsune
78
85
  add :select, field, {:options => options}
79
86
  end
80
87
 
88
+ def string(field)
89
+ add :text_field, field
90
+ end
91
+
92
+ def text(field)
93
+ add :text_area, field
94
+ end
95
+
81
96
  def sti(field, options = {})
82
97
  add :sti, field, {:options => options}
83
98
  is_sti field
@@ -94,13 +109,36 @@ module Kitsune
94
109
  end
95
110
 
96
111
  def display(*fields)
97
- set :display, fields
112
+ fields.each do |field|
113
+ if field.is_a?(Hash)
114
+ field.each do |key, value|
115
+ set :display, key
116
+ set_attributes(key, value)
117
+ end
118
+ else
119
+ set :display, field
120
+ end
121
+ end
122
+ end
123
+
124
+ def set_attributes(field, attributes)
125
+ [attributes].flatten.each do |attribute|
126
+ send(attribute.to_sym, field)
127
+ end
98
128
  end
99
129
 
100
130
  def edit(*fields)
101
131
  fields.each do |field|
102
- type = @resource.reflections[field.to_sym] ? :reflections : :edit
103
- set type, field
132
+ if field.is_a?(Hash)
133
+ field.each do |key, value|
134
+ type = @resource.reflections[key.to_sym] ? :reflections : :edit
135
+ set(type, key)
136
+ set_attributes(key, value)
137
+ end
138
+ else
139
+ type = @resource.reflections[field.to_sym] ? :reflections : :edit
140
+ set type, field
141
+ end
104
142
  end
105
143
  end
106
144
 
@@ -111,6 +149,8 @@ module Kitsune
111
149
  def method_missing(method, *args, &block)
112
150
  if TYPES.include?(method)
113
151
  add method, *args
152
+ else
153
+ raise Exception, "THIS IS WRONG@! #{method.to_s}"
114
154
  end
115
155
  end
116
156
 
@@ -5,7 +5,18 @@ module ActionView
5
5
  sanitized_object_name = @object_name.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "")
6
6
  sanitized_method_name = method.to_s.sub(/\?$/,"")
7
7
  id = "#{sanitized_object_name}_#{sanitized_method_name}"
8
- @template.send('text_area', @object_name, method, objectify_options(options.merge({:class => 'wysiwyg'}))) + @template.content_tag('script', "new nicEditor().panelInstance('#{id}');")
8
+ if @object.kitsune_admin[:media]
9
+ @template.content_for(:head) do
10
+ @template.capture do
11
+ "<script>
12
+ $(function() {
13
+ $('textarea.wysiwyg').upload_maker('#{@template.url_for({:id => @object.kitsune_admin[:media].keys.first.to_s.classify, :action=>"new", :controller=>"admin/kitsune/media"})}');
14
+ })
15
+ </script>"
16
+ end
17
+ end
18
+ end
19
+ @template.send('text_area', @object_name, method, objectify_options(options.merge({:class => 'wysiwyg'}))) + @template.content_tag('script', "tinyMCE.execCommand('mceAddControl', true, '#{id}');")
9
20
  end
10
21
  end
11
22
  end
@@ -13,6 +13,14 @@ module Kitsune
13
13
  kitsune_admin[:name] || @object.to_s.pluralize
14
14
  end
15
15
 
16
+ def order_by
17
+ order_by_hash ? order_by_hash.map{|k,v| "#{k} #{v}"}.join(' ') : nil
18
+ end
19
+
20
+ def order_by_hash
21
+ kitsune_admin[:order_by] || nil
22
+ end
23
+
16
24
  def category
17
25
  kitsune_admin[:category] || nil
18
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitsune
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.16
4
+ version: 0.0.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Mongeau <matt@toastyapps.com>
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-08 00:00:00 -05:00
12
+ date: 2009-12-10 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -45,11 +45,13 @@ files:
45
45
  - README.textile
46
46
  - app/controllers/admin/kitsune/application_controller.rb
47
47
  - app/controllers/admin/kitsune/kitsune_controller.rb
48
+ - app/controllers/admin/kitsune/media_controller.rb
48
49
  - app/controllers/admin/kitsune/models_controller.rb
49
50
  - app/controllers/admin/kitsune/pages_controller.rb
50
51
  - app/controllers/admin/kitsune/records_controller.rb
51
52
  - app/controllers/kitsune_controller.rb
52
53
  - app/helpers/admin/kitsune/records_helper.rb
54
+ - app/views/admin/kitsune/media/new.html.erb
53
55
  - app/views/admin/kitsune/models/index.html.haml
54
56
  - app/views/admin/kitsune/pages/_form.html.erb
55
57
  - app/views/admin/kitsune/pages/edit.html.erb
@@ -60,6 +62,7 @@ files:
60
62
  - app/views/admin/kitsune/records/edit.html.haml
61
63
  - app/views/admin/kitsune/records/index.html.haml
62
64
  - app/views/admin/kitsune/records/new.html.haml
65
+ - app/views/admin/kitsune/shared/_flashes.html.haml
63
66
  - app/views/kitsune/show.html.erb
64
67
  - app/views/layouts/admin/kitsune.html.erb
65
68
  - config/kitsune_routes.rb
@@ -77,6 +80,7 @@ files:
77
80
  - generators/kitsune/templates/javascripts/jquery.js
78
81
  - generators/kitsune/templates/javascripts/kitsune_jquery.js
79
82
  - generators/kitsune/templates/javascripts/nicEdit.js
83
+ - generators/kitsune/templates/javascripts/upload_maker.js
80
84
  - generators/kitsune/templates/migrations/create_pages.rb
81
85
  - generators/kitsune/templates/page.rb
82
86
  - generators/kitsune/templates/README