knitkit 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. data/GPL-3-LICENSE +674 -0
  2. data/README.md +6 -0
  3. data/Rakefile +30 -0
  4. data/app/assets/javascripts/knitkit/application.js +9 -0
  5. data/app/assets/stylesheets/knitkit/application.css +7 -0
  6. data/app/controllers/knitkit/articles_controller.rb +7 -0
  7. data/app/controllers/knitkit/base_controller.rb +45 -0
  8. data/app/controllers/knitkit/blogs_controller.rb +27 -0
  9. data/app/controllers/knitkit/comments_controller.rb +18 -0
  10. data/app/controllers/knitkit/erp_app/desktop/app_controller.rb +135 -0
  11. data/app/controllers/knitkit/erp_app/desktop/articles_controller.rb +144 -0
  12. data/app/controllers/knitkit/erp_app/desktop/comments_controller.rb +43 -0
  13. data/app/controllers/knitkit/erp_app/desktop/content_controller.rb +27 -0
  14. data/app/controllers/knitkit/erp_app/desktop/file_assets_controller.rb +145 -0
  15. data/app/controllers/knitkit/erp_app/desktop/image_assets_controller.rb +28 -0
  16. data/app/controllers/knitkit/erp_app/desktop/inquiries_controller.rb +68 -0
  17. data/app/controllers/knitkit/erp_app/desktop/position_controller.rb +20 -0
  18. data/app/controllers/knitkit/erp_app/desktop/theme_controller.rb +272 -0
  19. data/app/controllers/knitkit/erp_app/desktop/versions_controller.rb +135 -0
  20. data/app/controllers/knitkit/erp_app/desktop/website_controller.rb +177 -0
  21. data/app/controllers/knitkit/erp_app/desktop/website_nav_controller.rb +143 -0
  22. data/app/controllers/knitkit/erp_app/desktop/website_section_controller.rb +116 -0
  23. data/app/controllers/knitkit/unauthorized_controller.rb +8 -0
  24. data/app/controllers/knitkit/website_sections_controller.rb +17 -0
  25. data/app/helpers/application_helper.rb +132 -0
  26. data/app/models/article.rb +14 -0
  27. data/app/models/blog.rb +21 -0
  28. data/app/models/comment.rb +24 -0
  29. data/app/models/content.rb +158 -0
  30. data/app/models/extensions/user.rb +5 -0
  31. data/app/models/published_element.rb +9 -0
  32. data/app/models/published_website.rb +118 -0
  33. data/app/models/theme.rb +239 -0
  34. data/app/models/website.rb +457 -0
  35. data/app/models/website_host.rb +3 -0
  36. data/app/models/website_inquiry.rb +11 -0
  37. data/app/models/website_inquiry_mailer.rb +12 -0
  38. data/app/models/website_nav.rb +17 -0
  39. data/app/models/website_nav_item.rb +21 -0
  40. data/app/models/website_section.rb +152 -0
  41. data/app/models/website_section_content.rb +4 -0
  42. data/app/views/knitkit/articles/index.html.erb +3 -0
  43. data/app/views/knitkit/articles/show.html.erb +4 -0
  44. data/app/views/knitkit/blogs/_add_comment.html.erb +28 -0
  45. data/app/views/knitkit/blogs/_comment.html.erb +8 -0
  46. data/app/views/knitkit/blogs/index.html.erb +51 -0
  47. data/app/views/knitkit/blogs/index.rss.builder +23 -0
  48. data/app/views/knitkit/blogs/show.html.erb +22 -0
  49. data/app/views/knitkit/unauthorized/index.html.erb +4 -0
  50. data/app/views/knitkit/website_sections/index.html.erb +6 -0
  51. data/app/views/layouts/knitkit/base.html.erb +59 -0
  52. data/app/views/menus/knitkit/_default_menu.html.erb +23 -0
  53. data/app/views/menus/knitkit/_default_section_menu.html.erb +27 -0
  54. data/app/views/menus/knitkit/_default_sub_menu.html.erb +45 -0
  55. data/app/views/menus/knitkit/_default_sub_section_menu.html.erb +49 -0
  56. data/app/views/shared/knitkit/_bread_crumb.html.erb +7 -0
  57. data/app/views/shared/knitkit/_footer.html.erb +3 -0
  58. data/app/views/website_inquiry_mailer/inquiry.erb +3 -0
  59. data/app/widgets/contact_us/base.rb +86 -0
  60. data/app/widgets/contact_us/javascript/contact_us.js +13 -0
  61. data/app/widgets/contact_us/views/_contact_form.html.erb +36 -0
  62. data/app/widgets/contact_us/views/error.html.erb +10 -0
  63. data/app/widgets/contact_us/views/index.html.erb +1 -0
  64. data/app/widgets/contact_us/views/layouts/base.html.erb +7 -0
  65. data/app/widgets/contact_us/views/success.html.erb +4 -0
  66. data/app/widgets/google_map/base.rb +48 -0
  67. data/app/widgets/google_map/javascript/google_map.js +174 -0
  68. data/app/widgets/google_map/views/index.html.erb +41 -0
  69. data/app/widgets/login/base.rb +61 -0
  70. data/app/widgets/login/javascript/login.js +162 -0
  71. data/app/widgets/login/views/index.html.erb +37 -0
  72. data/app/widgets/login/views/layouts/base.html.erb +14 -0
  73. data/app/widgets/login/views/login_header.html.erb +9 -0
  74. data/app/widgets/login/views/reset_password.html.erb +26 -0
  75. data/app/widgets/manage_profile/base.rb +327 -0
  76. data/app/widgets/manage_profile/javascript/manage_profile.js +11 -0
  77. data/app/widgets/manage_profile/views/_contact_information_form.html.erb +180 -0
  78. data/app/widgets/manage_profile/views/_password_form.html.erb +20 -0
  79. data/app/widgets/manage_profile/views/_user_information_form.html.erb +30 -0
  80. data/app/widgets/manage_profile/views/contact_type_in_use.html.erb +4 -0
  81. data/app/widgets/manage_profile/views/default_type_error.html.erb +5 -0
  82. data/app/widgets/manage_profile/views/error.html.erb +3 -0
  83. data/app/widgets/manage_profile/views/index.html.erb +46 -0
  84. data/app/widgets/manage_profile/views/layouts/base.html.erb +1 -0
  85. data/app/widgets/manage_profile/views/password_blank.html.erb +4 -0
  86. data/app/widgets/manage_profile/views/password_invalid.html.erb +4 -0
  87. data/app/widgets/manage_profile/views/password_success.html.erb +3 -0
  88. data/app/widgets/manage_profile/views/success.html.erb +3 -0
  89. data/app/widgets/reset_password/base.rb +42 -0
  90. data/app/widgets/reset_password/javascript/reset_password.js +13 -0
  91. data/app/widgets/reset_password/views/index.html.erb +31 -0
  92. data/app/widgets/reset_password/views/layouts/base.html.erb +1 -0
  93. data/app/widgets/search/base.rb +80 -0
  94. data/app/widgets/search/javascript/search.js +31 -0
  95. data/app/widgets/search/views/_search.html.erb +39 -0
  96. data/app/widgets/search/views/index.html.erb +3 -0
  97. data/app/widgets/search/views/layouts/base.html.erb +24 -0
  98. data/app/widgets/search/views/show.html.erb +48 -0
  99. data/app/widgets/signup/base.rb +72 -0
  100. data/app/widgets/signup/javascript/signup.js +13 -0
  101. data/app/widgets/signup/views/_signup_form.html.erb +36 -0
  102. data/app/widgets/signup/views/error.html.erb +11 -0
  103. data/app/widgets/signup/views/index.html.erb +1 -0
  104. data/app/widgets/signup/views/layouts/base.html.erb +7 -0
  105. data/app/widgets/signup/views/success.html.erb +4 -0
  106. data/config/environment.rb +0 -0
  107. data/config/routes.rb +41 -0
  108. data/db/data_migrations/20110509223702_add_publisher_role.rb +11 -0
  109. data/db/data_migrations/20110816153456_add_knitkit_application.rb +31 -0
  110. data/db/data_migrations/upgrade/20111011203718_create_paths_for_sections.rb +13 -0
  111. data/db/data_migrations/upgrade/20111216192114_add_secured_models_to_menu_items.rb +18 -0
  112. data/db/data_migrations/upgrade/20111216202819_set_contents_iid_to_permalink_where_null.rb +12 -0
  113. data/db/migrate/20110211002317_setup_knitkit.rb +259 -0
  114. data/db/migrate/upgrade/20111014190442_update_contents.rb +25 -0
  115. data/db/migrate/upgrade/20111014201502_add_published_by_to_published_elements.rb +22 -0
  116. data/db/migrate/upgrade/20111017133851_add_iid_to_section.rb +21 -0
  117. data/db/migrate/upgrade/20111027145006_add_in_menu_to_section.rb +19 -0
  118. data/lib/knitkit.rb +12 -0
  119. data/lib/knitkit/engine.rb +26 -0
  120. data/lib/knitkit/extensions.rb +18 -0
  121. data/lib/knitkit/extensions/action_controller/theme_support/acts_as_themed_controller.rb +88 -0
  122. data/lib/knitkit/extensions/active_record/acts_as_commentable.rb +28 -0
  123. data/lib/knitkit/extensions/active_record/acts_as_publishable.rb +38 -0
  124. data/lib/knitkit/extensions/active_record/theme_support/has_many_themes.rb +34 -0
  125. data/lib/knitkit/extensions/compass/widgets/base.rb +53 -0
  126. data/lib/knitkit/extensions/core/array.rb +5 -0
  127. data/lib/knitkit/extensions/railties/action_view.rb +187 -0
  128. data/lib/knitkit/extensions/railties/theme_support/asset_tag_helper.rb +198 -0
  129. data/lib/knitkit/extensions/railties/theme_support/theme_file_resolver.rb +44 -0
  130. data/lib/knitkit/routing_filter/section_router.rb +55 -0
  131. data/lib/knitkit/syntax_validator.rb +32 -0
  132. data/lib/knitkit/version.rb +3 -0
  133. data/lib/tasks/knitkit_tasks.rake +4 -0
  134. data/public/images/knitkit/bullet.png +0 -0
  135. data/public/images/knitkit/content.png +0 -0
  136. data/public/images/knitkit/footer.png +0 -0
  137. data/public/images/knitkit/graphic.png +0 -0
  138. data/public/images/knitkit/greyFadeDown.png +0 -0
  139. data/public/images/knitkit/link.png +0 -0
  140. data/public/images/knitkit/logo.png +0 -0
  141. data/public/images/knitkit/menu.png +0 -0
  142. data/public/images/knitkit/menu_select.png +0 -0
  143. data/public/images/knitkit/search.png +0 -0
  144. data/public/javascripts/datepicker.js +440 -0
  145. data/public/javascripts/erp_app/desktop/applications/knitkit/articles_grid_panel.js +473 -0
  146. data/public/javascripts/erp_app/desktop/applications/knitkit/center_region.js +576 -0
  147. data/public/javascripts/erp_app/desktop/applications/knitkit/comments_grid_panel.js +217 -0
  148. data/public/javascripts/erp_app/desktop/applications/knitkit/east_region.js +26 -0
  149. data/public/javascripts/erp_app/desktop/applications/knitkit/file_assets_panel.js +109 -0
  150. data/public/javascripts/erp_app/desktop/applications/knitkit/image_assets_data_view.js +30 -0
  151. data/public/javascripts/erp_app/desktop/applications/knitkit/image_assets_panel.js +160 -0
  152. data/public/javascripts/erp_app/desktop/applications/knitkit/inquiries_grid_panel.js +46 -0
  153. data/public/javascripts/erp_app/desktop/applications/knitkit/module.js +46 -0
  154. data/public/javascripts/erp_app/desktop/applications/knitkit/publish_window.js +92 -0
  155. data/public/javascripts/erp_app/desktop/applications/knitkit/published_grid_panel.js +220 -0
  156. data/public/javascripts/erp_app/desktop/applications/knitkit/section_articles_grid_panel.js +613 -0
  157. data/public/javascripts/erp_app/desktop/applications/knitkit/themes_tree_panel.js +573 -0
  158. data/public/javascripts/erp_app/desktop/applications/knitkit/versions_grid_panel.js +664 -0
  159. data/public/javascripts/erp_app/desktop/applications/knitkit/west_region.js +2161 -0
  160. data/public/javascripts/erp_app/desktop/applications/knitkit/widgets_panel.js +52 -0
  161. data/public/stylesheets/datepicker.css +121 -0
  162. data/public/stylesheets/erp_app/desktop/applications/knitkit/knitkit.css +114 -0
  163. data/public/stylesheets/extjs/resources/css/knitkit_extjs_4.css +219 -0
  164. data/public/stylesheets/knitkit/style.css +394 -0
  165. metadata +289 -0
@@ -0,0 +1,27 @@
1
+ module Knitkit
2
+ module ErpApp
3
+ module Desktop
4
+
5
+ class ContentController < Knitkit::ErpApp::Desktop::AppController
6
+ def update
7
+ id = params[:id]
8
+ html = params[:html]
9
+ content = Content.find(id)
10
+ content.body_html = html
11
+
12
+ render :json => (content.save ? {:success => true} : {:success => false})
13
+ end
14
+
15
+ def save_excerpt
16
+ id = params[:id]
17
+ html = params[:html]
18
+ content = Content.find(id)
19
+ content.excerpt_html = html
20
+
21
+ render :json => (content.save ? {:success => true} : {:success => false})
22
+ end
23
+
24
+ end#ContentController
25
+ end#Desktop
26
+ end#ErpApp
27
+ end#Knitkit
@@ -0,0 +1,145 @@
1
+ module Knitkit
2
+ module ErpApp
3
+ module Desktop
4
+ class FileAssetsController < ::ErpApp::Desktop::FileManager::BaseController
5
+ skip_before_filter :require_login, :only => [:download_file_asset]
6
+ before_filter :set_asset_model, :except => [:download_file_asset]
7
+
8
+ def base_path
9
+ @base_path = nil
10
+ if @context == :website
11
+ @base_path = File.join(@file_support.root,"/sites/site-#{@assets_model.id}", "files") unless @assets_model.nil?
12
+ else
13
+ @base_path = File.join(@file_support.root,"/files") unless @assets_model.nil?
14
+ end
15
+ end
16
+
17
+ def expand_directory
18
+ if @assets_model.nil?
19
+ render :json => []
20
+ else
21
+ path = (params[:node] == ROOT_NODE) ? base_path : params[:node]
22
+ render :json => @file_support.build_tree(path, :file_asset_holder => @assets_model, :preload => true)
23
+ end
24
+ end
25
+
26
+ def create_file
27
+ path = params[:path] == 'root_node' ? base_path : params[:path]
28
+ name = params[:name]
29
+
30
+ @assets_model.add_file('#Empty File', File.join(@file_support.root, path, name))
31
+
32
+ render :json => {:success => true}
33
+ end
34
+
35
+ def create_folder
36
+ path = (params[:path] == 'root_node') ? base_path : params[:path]
37
+ name = params[:name]
38
+
39
+ path = File.join(@file_support.root,path) if path.index(@file_support.root).nil?
40
+
41
+ @file_support.create_folder(path, name)
42
+ render :json => {:success => true}
43
+ end
44
+
45
+ def upload_file
46
+ result = {}
47
+ upload_path = request.env['HTTP_EXTRAPOSTDATA_DIRECTORY'].blank? ? params[:directory] : request.env['HTTP_EXTRAPOSTDATA_DIRECTORY']
48
+ name = request.env['HTTP_X_FILE_NAME'].blank? ? params[:file_data].original_filename : request.env['HTTP_X_FILE_NAME']
49
+ data = request.env['HTTP_X_FILE_NAME'].blank? ? params[:file_data] : request.raw_post
50
+
51
+ begin
52
+ upload_path == 'root_node' ? @assets_model.add_file(data, File.join(@file_support.root,base_path,name)) : @assets_model.add_file(data, File.join(@file_support.root,upload_path,name))
53
+ result = {:success => true}
54
+ rescue Exception=>ex
55
+ logger.error ex.message
56
+ logger.error ex.backtrace.join("\n")
57
+ result = {:success => false, :error => "Error uploading file."}
58
+ end
59
+
60
+ #the awesome uploader widget whats this to mime type text, leave it render :inline
61
+ render :inline => result.to_json
62
+ end
63
+
64
+ def save_move
65
+ result = {}
66
+ path = params[:node]
67
+ new_parent_path = params[:parent_node]
68
+ new_parent_path = base_path if new_parent_path == ROOT_NODE
69
+
70
+ unless File.exists? path
71
+ result = {:success => false, :msg => 'File does not exists'}
72
+ else
73
+ path = path[1..path.length] if path[0] == "/"
74
+ file = @assets_model.files.find(:first, :conditions => ['name = ? and directory = ?', ::File.basename(path), ::File.dirname(path)])
75
+ file.move(new_parent_path)
76
+ result = {:success => true, :msg => "#{File.basename(path)} was moved to #{new_parent_path} successfully"}
77
+ end
78
+
79
+ render :json => result
80
+ end
81
+
82
+ def delete_file
83
+ path = params[:node]
84
+ result = {}
85
+ begin
86
+ name = File.basename(path)
87
+ result, message, is_folder = @file_support.delete_file(File.join(@file_support.root,path))
88
+ if result && !is_folder
89
+ file = @assets_model.files.find(:first, :conditions => ['name = ? and directory = ?', ::File.basename(path), ::File.dirname(path)])
90
+ file.destroy
91
+ end
92
+ result = {:success => result, :error => message}
93
+ rescue Exception=>ex
94
+ logger.error ex.message
95
+ logger.error ex.backtrace.join("\n")
96
+ result = {:success => false, :error => "Error deleting #{name}"}
97
+ end
98
+ render :json => result
99
+ end
100
+
101
+ def rename_file
102
+ result = {:success => true, :data => {:success => true}}
103
+ path = params[:node]
104
+ name = params[:file_name]
105
+
106
+ result, message = @file_support.rename_file(path, name)
107
+ if result
108
+ file = @assets_model.files.find(:first, :conditions => ['name = ? and directory = ?', ::File.basename(path), ::File.dirname(path)])
109
+ file.name = name
110
+ file.save
111
+ end
112
+
113
+ render :json => {:success => true, :message => message}
114
+ end
115
+
116
+ def download_file_asset
117
+ contents, message = @file_support.get_contents(params[:path])
118
+
119
+ send_data contents, :filename => File.basename(path)
120
+ end
121
+
122
+ protected
123
+
124
+ def set_file_support
125
+ @file_support = ErpTechSvcs::FileSupport::Base.new(:storage => ErpTechSvcs::FileSupport.options[:storage])
126
+ end
127
+
128
+ def set_asset_model
129
+ @context = params[:context].to_sym
130
+
131
+ if @context == :website
132
+ #get website id this can be an xhr request or regular
133
+ website_id = request.env['HTTP_EXTRAPOSTDATA_WEBSITE_ID'].blank? ? params[:website_id] : request.env['HTTP_EXTRAPOSTDATA_WEBSITE_ID']
134
+ (@assets_model = website_id.blank? ? nil : Website.find(website_id))
135
+
136
+ render :inline => {:success => false, :error => "No Website Selected"}.to_json if (@assets_model.nil? && params[:action] != "base_path")
137
+ else
138
+ @assets_model = CompassAeInstance.first
139
+ end
140
+ end
141
+
142
+ end#FileAssetsController
143
+ end#Desktop
144
+ end#ErpApp
145
+ end#Knitkit
@@ -0,0 +1,28 @@
1
+ module Knitkit
2
+ module ErpApp
3
+ module Desktop
4
+ class ImageAssetsController < FileAssetsController
5
+ def base_path
6
+ @base_path = nil
7
+ if @context == :website
8
+ @base_path = File.join(@file_support.root,"/sites/site-#{@assets_model.id}", "images") unless @assets_model.nil?
9
+ else
10
+ @base_path = File.join(@file_support.root,"/images") unless @assets_model.nil?
11
+ end
12
+ end
13
+
14
+ def get_images
15
+ directory = (params[:directory] == 'root_node' or params[:directory].blank?) ? base_path : params[:directory]
16
+ render :json => @assets_model.images.select{|image| image.directory == directory.sub(@file_support.root,'')}.collect{|image|{:name => image.name, :shortName => image.name[0..15], :url => image.data.url}}
17
+ end
18
+
19
+ protected
20
+
21
+ def set_file_support
22
+ @file_support = ErpTechSvcs::FileSupport::Base.new(:storage => ErpTechSvcs::FileSupport.options[:storage])
23
+ end
24
+
25
+ end#ImageAssetsController
26
+ end#Desktop
27
+ end#ErpApp
28
+ end#Knitkit
@@ -0,0 +1,68 @@
1
+ module Knitkit
2
+ module ErpApp
3
+ module Desktop
4
+ class InquiriesController < Knitkit::ErpApp::Desktop::AppController
5
+
6
+ def setup
7
+ form = DynamicForm.get_form('WebsiteInquiry')
8
+ definition = form.definition_object
9
+
10
+ columns = []
11
+ definition.each do |field_hash|
12
+ field_hash['width'] = 120
13
+ columns << DynamicGridColumn.build_column(field_hash)
14
+ end
15
+
16
+ columns << DynamicGridColumn.build_column({ :fieldLabel => "Username", :name => 'username', :xtype => 'textfield' })
17
+ columns << DynamicGridColumn.build_column({ :fieldLabel => "Created At", :name => 'created_at', :xtype => 'datefield', :width => 75 })
18
+ columns << DynamicGridColumn.build_view_column("Ext.getCmp('knitkitCenterRegion').showComment(rec.get('message'));")
19
+ columns << DynamicGridColumn.build_delete_column("Ext.getCmp('InquiriesGridPanel').deleteInquiry(rec);")
20
+
21
+ definition << DynamicFormField.textfield({ :fieldLabel => "Username", :name => 'username' })
22
+ definition << DynamicFormField.datefield({ :fieldLabel => "Created At", :name => 'created_at' })
23
+ definition << DynamicFormField.hidden({ :fieldLabel => "ID", :name => 'id' })
24
+
25
+ result = "{
26
+ \"success\": true,
27
+ \"model\": \"WebsiteInquiry\",
28
+ \"validations\": \"[]\",
29
+ \"columns\": [#{columns.join(',')}],
30
+ \"fields\": #{definition.to_json}
31
+ }"
32
+
33
+ render :inline => result
34
+ end
35
+
36
+ def get
37
+ WebsiteInquiry.include_root_in_json = false
38
+
39
+ website = Website.find(params[:website_id])
40
+ sort_hash = params[:sort].blank? ? {} : Hash.symbolize_keys(JSON.parse(params[:sort]).first)
41
+ sort = sort_hash[:property] || 'created_at'
42
+ dir = sort_hash[:direction] || 'DESC'
43
+
44
+ website_inquiries = website.website_inquiries.paginate(:page => page, :per_page => per_page, :order => "#{sort} #{dir}")
45
+
46
+ wi = []
47
+ website_inquiries.each do |i|
48
+ wihash = i.data.dynamic_attributes_without_prefix
49
+
50
+ wihash[:id] = i.id
51
+ wihash[:username] = i.data.created_by.nil? ? '' : i.data.created_by.username
52
+ wihash[:created_at] = i.data.created_at
53
+ wi << wihash
54
+ end
55
+
56
+ render :inline => "{ total:#{website_inquiries.total_entries}, data:#{wi.to_json} }"
57
+ end
58
+
59
+ def delete
60
+ website_inquiry = WebsiteInquiry.find(params[:id])
61
+ website_inquiry.destroy
62
+ render :json => {:success => true}
63
+ end
64
+
65
+ end#InquiriesController
66
+ end#Desktop
67
+ end#ErpApp
68
+ end#Knitkit
@@ -0,0 +1,20 @@
1
+ module Knitkit
2
+ module ErpApp
3
+ module Desktop
4
+ class PositionController < Knitkit::ErpApp::Desktop::AppController
5
+
6
+ def update
7
+ params[:position_array].each do |position|
8
+ model = position['klass'].constantize.find(position['id'])
9
+ model.position = position['position'].to_i
10
+ model.save
11
+ end
12
+
13
+ render :json => {:success => true}
14
+ end
15
+
16
+ end#PositionController
17
+ end#Desktop
18
+ end#ErpApp
19
+ end#Knitkit
20
+
@@ -0,0 +1,272 @@
1
+ module Knitkit
2
+ module ErpApp
3
+ module Desktop
4
+ class ThemeController < ::ErpApp::Desktop::FileManager::BaseController
5
+ before_filter :set_file_support
6
+ before_filter :set_website, :only => [:new, :change_status, :available_themes]
7
+ before_filter :set_theme, :only => [:delete, :change_status, :theme_widget, :available_widgets]
8
+ IGNORED_PARAMS = %w{action controller node_id theme_data}
9
+
10
+ def index
11
+ if params[:node] == ROOT_NODE
12
+ setup_tree
13
+ else
14
+ theme = get_theme(params[:node])
15
+ unless theme.nil?
16
+ render :json => @file_support.build_tree(params[:node], :file_asset_holder => theme, :preload => true)
17
+ else
18
+ render :json => {:success => false, :message => 'Could not find theme'}
19
+ end
20
+ end
21
+ end
22
+
23
+ def available_themes
24
+ render :json => {:success => true, :themes => @website.themes.map{|theme|{:id => theme.id, :name => theme.name}}}
25
+ end
26
+
27
+ def available_widgets
28
+ render :json => {:success => true, :widgets => @theme.non_themed_widgets.map{|widget|{:id => widget, :name => widget.humanize}}}
29
+ end
30
+
31
+ def theme_widget
32
+ @theme.create_layouts_for_widget(params[:widget_id])
33
+ render :json => {:success => true}
34
+ end
35
+
36
+ def new
37
+ unless params[:theme_data].blank?
38
+ @website.themes.import(params[:theme_data], @website)
39
+ else
40
+ theme = Theme.create(:website => @website, :name => params[:name], :theme_id => params[:theme_id])
41
+ theme.version = params[:version]
42
+ theme.author = params[:author]
43
+ theme.homepage = params[:homepage]
44
+ theme.summary = params[:summary]
45
+ theme.save
46
+ theme.create_theme_files!
47
+ end
48
+
49
+ render :inline => {:success => true}.to_json
50
+ end
51
+
52
+ def delete
53
+ render :json => @theme.destroy ? {:success => true} : {:success => false}
54
+ end
55
+
56
+ def export
57
+ theme = Theme.find(params[:id])
58
+ zip_path = theme.export
59
+ send_file(zip_path.to_s, :stream => false) rescue raise "Error sending #{zip_path} file"
60
+ ensure
61
+ FileUtils.rm_r File.dirname(zip_path) rescue nil
62
+ end
63
+
64
+ def change_status
65
+ #clear active themes
66
+ @website.deactivate_themes! if (params[:active] == 'true')
67
+ (params[:active] == 'true') ? @theme.activate! : @theme.deactivate!
68
+
69
+ render :json => {:success => true}
70
+ end
71
+
72
+ ##############################################################
73
+ #
74
+ # Overrides from ErpApp::Desktop::FileManager::BaseController
75
+ #
76
+ ##############################################################
77
+
78
+ def create_file
79
+ path = File.join(@file_support.root,params[:path])
80
+ name = params[:name]
81
+
82
+ theme = get_theme(path)
83
+ theme.add_file('#Empty File', File.join(path, name))
84
+
85
+ render :json => {:success => true}
86
+ end
87
+
88
+ def create_folder
89
+ path = File.join(@file_support.root,params[:path])
90
+ name = params[:name]
91
+
92
+ @file_support.create_folder(path, name)
93
+ render :json => {:success => true}
94
+ end
95
+
96
+ def update_file
97
+ path = File.join(@file_support.root,params[:node])
98
+ content = params[:content]
99
+
100
+ type = File.extname(File.basename(path)).gsub(/^\.+/, '').to_sym
101
+ result = Knitkit::SyntaxValidator.validate_content(type, content)
102
+
103
+ unless result
104
+ @file_support.update_file(path, content)
105
+ render :json => {:success => true}
106
+ else
107
+ render :json => {:success => false, :message => result}
108
+ end
109
+ end
110
+
111
+ def save_move
112
+ result = {}
113
+ path = params[:node]
114
+ new_parent_path = params[:parent_node]
115
+ new_parent_path = base_path if new_parent_path == ROOT_NODE
116
+
117
+ unless @file_support.exists? path
118
+ result = {:success => false, :msg => 'File does not exists'}
119
+ else
120
+ theme_file = get_theme_file(path)
121
+ theme_file.move(new_parent_path)
122
+ result = {:success => true, :msg => "#{File.basename(path)} was moved to #{new_parent_path} successfully"}
123
+ end
124
+
125
+ render :json => result
126
+ end
127
+
128
+ def download_file
129
+ path = File.join(@file_support.root,params[:path])
130
+ contents, message = @file_support.get_contents(path)
131
+
132
+ send_data contents, :filename => File.basename(path)
133
+ end
134
+
135
+ def get_contents
136
+ path = File.join(@file_support.root,params[:node])
137
+ contents, message = @file_support.get_contents(path)
138
+
139
+ if contents.nil?
140
+ render :text => message
141
+ else
142
+ render :text => contents
143
+ end
144
+ end
145
+
146
+ def upload_file
147
+ result = {}
148
+ upload_path = request.env['HTTP_EXTRAPOSTDATA_DIRECTORY'].blank? ? params[:directory] : request.env['HTTP_EXTRAPOSTDATA_DIRECTORY']
149
+ name = request.env['HTTP_X_FILE_NAME'].blank? ? params[:file_data].original_filename : request.env['HTTP_X_FILE_NAME']
150
+ data = request.env['HTTP_X_FILE_NAME'].blank? ? params[:file_data] : request.raw_post
151
+
152
+ theme = get_theme(upload_path)
153
+ name = File.join(@file_support.root, upload_path, name)
154
+
155
+ begin
156
+ theme.add_file(data, name)
157
+ result = {:success => true}
158
+ rescue Exception=>ex
159
+ logger.error ex.message
160
+ logger.error ex.backtrace.join("\n")
161
+ result = {:success => false, :error => "Error uploading #{name}"}
162
+ end
163
+
164
+ render :inline => result.to_json
165
+ end
166
+
167
+ def delete_file
168
+ path = params[:node]
169
+ result = {}
170
+ begin
171
+ name = File.basename(path)
172
+ result, message, is_folder = @file_support.delete_file(File.join(@file_support.root,path))
173
+ if result && !is_folder
174
+ theme_file = get_theme_file(path)
175
+ theme_file.destroy
176
+ end
177
+ result = {:success => result, :error => message}
178
+ rescue Exception=>ex
179
+ logger.error ex.message
180
+ logger.error ex.backtrace.join("\n")
181
+ result = {:success => false, :error => "Error deleting #{name}"}
182
+ end
183
+ render :json => result
184
+ end
185
+
186
+ def rename_file
187
+ result = {:success => true, :data => {:success => true}}
188
+ path = params[:node]
189
+ name = params[:file_name]
190
+
191
+ result, message = @file_support.rename_file(path, name)
192
+ if result
193
+ theme_file = get_theme_file(path)
194
+ theme_file.name = name
195
+ theme_file.save
196
+ end
197
+
198
+ render :json => {:success => true, :message => message}
199
+ end
200
+
201
+ protected
202
+
203
+ def get_theme(path)
204
+ sites_index = path.index('sites')
205
+ sites_path = path[sites_index..path.length]
206
+ site_name = sites_path.split('/')[1]
207
+ site = Website.find(site_name.split('-')[1])
208
+
209
+ themes_index = path.index('themes')
210
+ path = path[themes_index..path.length]
211
+ theme_name = path.split('/')[1]
212
+ theme = site.themes.find_by_theme_id(theme_name)
213
+
214
+ theme
215
+ end
216
+
217
+ def get_theme_file(path)
218
+ theme = get_theme(path)
219
+ theme.files.where('name = ? and directory = ?', ::File.basename(path), ::File.dirname(path)).first
220
+ end
221
+
222
+ def setup_tree
223
+ tree = []
224
+ sites = Website.all
225
+ sites.each do |site|
226
+ site_hash = {
227
+ :text => site.name,
228
+ :browseable => true,
229
+ :contextMenuDisabled => true,
230
+ :iconCls => 'icon-globe',
231
+ :id => "site_#{site.id}",
232
+ :leaf => false,
233
+ :children => []
234
+ }
235
+
236
+ #handle themes
237
+ themes_hash = {:text => 'Themes', :contextMenuDisabled => true, :isThemeRoot => true, :siteId => site.id, :children => []}
238
+ site.themes.each do |theme|
239
+ theme_hash = {:text => "#{theme.name}[#{theme.theme_id}]", :handleContextMenu => true, :siteId => site.id, :isActive => (theme.active == 1), :isTheme => true, :id => theme.id, :children => []}
240
+ if theme.active == 1
241
+ theme_hash[:iconCls] = 'icon-add'
242
+ else
243
+ theme_hash[:iconCls] = 'icon-delete'
244
+ end
245
+ ['stylesheets', 'javascripts', 'images', 'templates', 'widgets'].each do |resource_folder|
246
+ theme_hash[:children] << {:text => resource_folder, :leaf => false, :id => "/#{theme.url}/#{resource_folder}"}
247
+ end
248
+ themes_hash[:children] << theme_hash
249
+ end
250
+ site_hash[:children] << themes_hash
251
+ tree << site_hash
252
+ end
253
+
254
+ render :json => tree
255
+ end
256
+
257
+ def set_website
258
+ @website = Website.find(params[:site_id])
259
+ end
260
+
261
+ def set_theme
262
+ @theme = Theme.find(params[:theme_id])
263
+ end
264
+
265
+ def set_file_support
266
+ @file_support = ErpTechSvcs::FileSupport::Base.new(:storage => ErpTechSvcs::FileSupport.options[:storage])
267
+ end
268
+
269
+ end#ThemeController
270
+ end#Desktop
271
+ end#ErpApp
272
+ end#Knitkit