knitkit 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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