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,41 @@
1
+ <div id='<%=@uuid%>' style='width:<%=@map_width%>px;height:<%=@map_height%>px;border:solid 1px black;'></div>
2
+ <script type='text/javascript'>
3
+ //we do not want to load google libraries more than once.
4
+ window.loadMap_<%=@uuid%> = function(){
5
+ var myOptions = {
6
+ zoom: <%=@zoom%>,
7
+ mapTypeId: google.maps.MapTypeId.<%=@map_type%>
8
+ }
9
+
10
+ var map_<%=@uuid%> = new google.maps.Map(document.getElementById('<%=@uuid%>'), myOptions);
11
+ var dropPins = <%=raw @drop_pins.to_json%>;
12
+ window.codeAddress(dropPins,map_<%=@uuid%>)
13
+ }
14
+
15
+ if(!window.mapJsLoaded){
16
+ Compass.ErpApp.Utility.JsLoader.load('http://maps.google.com/maps/api/js?sensor=false&callback=loadMap_<%=@uuid%>', false);
17
+ window.mapJsLoaded = true;
18
+ }
19
+ else{
20
+ setTimeout(loadMap_<%=@uuid%>,1000);
21
+ }
22
+
23
+ window.codeAddress = function(dropPins, map){
24
+ var geocoder = new google.maps.Geocoder();
25
+ Ext.each(dropPins,function(dropPin){
26
+ geocoder.geocode( { 'address': dropPin['address']}, function(results, status) {
27
+ if (status == google.maps.GeocoderStatus.OK) {
28
+ map.setCenter(results[0].geometry.location);
29
+ new google.maps.Marker({
30
+ map: map,
31
+ animation: google.maps.Animation.DROP,
32
+ position: results[0].geometry.location,
33
+ title:dropPin['title']
34
+ });
35
+ } else {
36
+ alert("Geocode was not successful for the following reason: " + status);
37
+ }
38
+ });
39
+ });
40
+ }
41
+ </script>
@@ -0,0 +1,61 @@
1
+
2
+ module Widgets
3
+ module Login
4
+ class Base < ErpApp::Widgets::Base
5
+
6
+ def index
7
+ @logout_to = params[:logout_to]
8
+ @login_to = params[:login_to]
9
+ @signup_url = params[:signup_url]
10
+ @reset_password_url = params[:reset_password_url]
11
+
12
+ render
13
+ end
14
+
15
+ def login_header
16
+ @login_url = params[:login_url]
17
+ @signup_url = params[:signup_url]
18
+ @authenticated = logged_in?
19
+ @user = current_user if logged_in?
20
+
21
+ render
22
+ end
23
+
24
+ def reset_password
25
+ @login_url = params[:login_url]
26
+
27
+ render
28
+ end
29
+
30
+ #should not be modified
31
+ #modify at your own risk
32
+ def locate
33
+ File.dirname(__FILE__)
34
+ end
35
+
36
+ class << self
37
+ def title
38
+ "Login"
39
+ end
40
+
41
+ def views_location
42
+ File.join(File.dirname(__FILE__),"/views")
43
+ end
44
+
45
+ def widget_name
46
+ File.basename(File.dirname(__FILE__))
47
+ end
48
+
49
+ def base_layout
50
+ begin
51
+ file = File.join(File.dirname(__FILE__),"/views/layouts/base.html.erb")
52
+ IO.read(file)
53
+ rescue
54
+ return nil
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+
@@ -0,0 +1,162 @@
1
+ Compass.ErpApp.Widgets.Login = {
2
+ addLogin:function(){
3
+ var addLoginWidgetWindow = Ext.create("Ext.window.Window",{
4
+ layout:'fit',
5
+ width:375,
6
+ title:'Add Login Widget',
7
+ plain: true,
8
+ buttonAlign:'center',
9
+ items: Ext.create("Ext.form.Panel",{
10
+ labelWidth: 100,
11
+ frame:false,
12
+ bodyStyle:'padding:5px 5px 0',
13
+ defaults: {
14
+ width: 225
15
+ },
16
+ items: [
17
+ {
18
+ width: 150,
19
+ xtype: 'combo',
20
+ forceSelection:true,
21
+ store: [
22
+ [':login_header','Header'],
23
+ [':login_page','Page'],
24
+ ],
25
+ fieldLabel: 'Widget View',
26
+ value:':login_page',
27
+ name: 'widgetLayout',
28
+ allowBlank: false,
29
+ triggerAction: 'all',
30
+ listeners:{
31
+ change:function(field, newValue, oldValue){
32
+ var basicForm = field.findParentByType('form').getForm();
33
+ var loginWidgetLoginToField = basicForm.findField('loginWidgetLoginTo');
34
+ var loginWidgetLogoutToField = basicForm.findField('loginWidgetLogoutTo');
35
+ var loginWidgetLoginUrlField = basicForm.findField('loginWidgetLoginUrl');
36
+ var loginWidgetSignUpUrlField = basicForm.findField('loginWidgetSignUpUrl');
37
+ var loginWidgetResetPasswordUrlField = basicForm.findField('loginWidgetResetPasswordUrl');
38
+ if(newValue == ':login_header'){
39
+ loginWidgetLoginToField.hide();
40
+ loginWidgetLogoutToField.hide();
41
+ loginWidgetLoginUrlField.show();
42
+ loginWidgetResetPasswordUrlField.hide();
43
+ loginWidgetLoginUrlField.setValue('/login');
44
+ loginWidgetSignUpUrlField.setValue('/sign-up');
45
+ loginWidgetResetPasswordUrlField.setValue('/reset-password');
46
+ }
47
+ else{
48
+ loginWidgetLoginToField.show();
49
+ loginWidgetLogoutToField.show();
50
+ loginWidgetLoginUrlField.hide();
51
+ loginWidgetResetPasswordUrlField.show();
52
+ loginWidgetLoginToField.setValue('/home');
53
+ loginWidgetLogoutToField.setValue('/home');
54
+ loginWidgetSignUpUrlField.setValue('/sign-up');
55
+ }
56
+ }
57
+ }
58
+ },
59
+ {
60
+ xtype:'textfield',
61
+ fieldLabel:'Login To',
62
+ allowBlank:false,
63
+ value:'/home',
64
+ id:'loginWidgetLoginTo'
65
+ },
66
+ {
67
+ xtype:'textfield',
68
+ fieldLabel:'Logout To',
69
+ allowBlank:false,
70
+ value:'/home',
71
+ id:'loginWidgetLogoutTo'
72
+ },
73
+ {
74
+ xtype:'textfield',
75
+ fieldLabel:'Login Url',
76
+ allowBlank:false,
77
+ hidden:true,
78
+ value:'/login',
79
+ id:'loginWidgetLoginUrl'
80
+ },
81
+ {
82
+ xtype:'textfield',
83
+ toolTip:'Only needed if Signup widget is setup.',
84
+ fieldLabel:'Sign Up Url',
85
+ allowBlank:true,
86
+ value:'/sign-up',
87
+ id:'loginWidgetSignUpUrl'
88
+ },
89
+ {
90
+ xtype:'textfield',
91
+ toolTip:'Only needed if Reset Password widget is setup.',
92
+ fieldLabel:'Reset Password Url',
93
+ allowBlank:true,
94
+ hidden:true,
95
+ value:'/reset-password',
96
+ id:'loginWidgetResetPasswordUrl'
97
+ }
98
+ ]
99
+ }),
100
+ buttons: [{
101
+ text:'Submit',
102
+ listeners:{
103
+ 'click':function(button){
104
+ var tpl = null;
105
+ var content = null;
106
+ var window = button.findParentByType('window');
107
+ var formPanel = window.query('form')[0];
108
+ var basicForm = formPanel.getForm();
109
+ var action = basicForm.findField('widgetLayout').getValue();
110
+
111
+ var loginWidgetSignUpUrlField = basicForm.findField('loginWidgetSignUpUrl');
112
+ var loginWidgetResetPasswordUrlField = basicForm.findField('loginWidgetResetPasswordUrl');
113
+ var data = {action:action};
114
+ data.loginWidgetSignUpUrl = loginWidgetSignUpUrlField.getValue();
115
+ data.loginWidgetResetPasswordUrl = loginWidgetResetPasswordUrlField.getValue();
116
+ if(action == ':login_header'){
117
+ var loginWidgetLoginUrlField = basicForm.findField('loginWidgetLoginUrl');
118
+ data.loginWidgetLoginUrl = loginWidgetLoginUrlField.getValue();
119
+ tpl = new Ext.XTemplate("<%= render_widget :login,\n",
120
+ " :action => :login_header,\n",
121
+ " :params => {:login_url => '{loginWidgetLoginUrl}',\n",
122
+ " :signup_url => '{loginWidgetSignUpUrl}'}%>");
123
+ content = tpl.apply(data);
124
+ }
125
+ else{
126
+ var loginWidgetLoginToField = basicForm.findField('loginWidgetLoginTo');
127
+ var loginWidgetLogoutToField = basicForm.findField('loginWidgetLogoutTo');
128
+ data.loginWidgetLoginTo = loginWidgetLoginToField.getValue();
129
+ data.loginWidgetLogoutTo = loginWidgetLogoutToField.getValue();
130
+ tpl = new Ext.XTemplate("<%= render_widget :login,\n",
131
+ " :params => {:login_to => '{loginWidgetLoginTo}',\n",
132
+ " :logout_to => '{loginWidgetLogoutTo}',\n",
133
+ " #optional field if Sign Up widget is setup\n",
134
+ " #:signup_url => '{loginWidgetSignUpUrl}',\n",
135
+ " #optional field if Reset Password widget is setup\n",
136
+ " #:reset_password_url => '{loginWidgetResetPasswordUrl}'}%>");
137
+ content = tpl.apply(data);
138
+ }
139
+
140
+ //add rendered template to center region editor
141
+ Ext.getCmp('knitkitCenterRegion').addContentToActiveCodeMirror(content);
142
+ addLoginWidgetWindow.close();
143
+ }
144
+ }
145
+ },{
146
+ text: 'Close',
147
+ handler: function(){
148
+ addLoginWidgetWindow.close();
149
+ }
150
+ }]
151
+ });
152
+ addLoginWidgetWindow.show();
153
+ }
154
+ }
155
+
156
+ Compass.ErpApp.Widgets.AvailableWidgets.push({
157
+ name:'Login',
158
+ iconUrl:'/images/icons/key/key_48x48.png',
159
+ onClick:Compass.ErpApp.Widgets.Login.addLogin
160
+ });
161
+
162
+
@@ -0,0 +1,37 @@
1
+ <div id="<%=widget_result_id%>"></div>
2
+ <div>
3
+ <%= form_tag '/session/sign_in', :remote => true, :id => 'login_form' do %>
4
+ <div class="form_settings">
5
+ <p>
6
+ <span style="width:175px">Username or Email Address</span>
7
+ <%= text_field_tag "login"%>
8
+ </p>
9
+ <p>
10
+ <span style="width:175px">Password</span>
11
+ <%= password_field_tag "password"%>
12
+ </p>
13
+ <input type="hidden" name="logout_to" value="<%=@logout_to%>" />
14
+ <input type="hidden" name="login_to" value="<%=@login_to%>" />
15
+ <p style="padding-top: 15px">
16
+ <span style="width:175px">&nbsp;</span>
17
+ <%= submit_tag "Login", :disable_with => "Please wait...", :class => "submit", :style => 'margin:0px;'%>
18
+ <%unless @signup_url.blank?%> | <%= link_to 'Sign Up', @signup_url %> <%end%> <%unless @reset_password_url.blank?%> | <%= link_to 'Reset Password', @reset_password_url %> <%end%>
19
+ </p>
20
+ </div>
21
+ <% end %>
22
+ </div>
23
+ <script type="text/javascript">
24
+ $('#login_form').bind('ajaxComplete', function(e, xhr, settings){
25
+ var response = jQuery.parseJSON(xhr.responseText);
26
+ if(response.success){
27
+ window.location = '<%=@login_to%>';
28
+ }
29
+ else{
30
+ $('#<%=widget_result_id%>').html('<div class="sexyerror">'+response.errors.reason+'</div>');
31
+ }
32
+ });
33
+ </script>
34
+
35
+
36
+
37
+
@@ -0,0 +1,14 @@
1
+ <h2><%=h @website_section.title %></h2>
2
+
3
+ <% @contents.each do |content| %>
4
+ <%=raw content.body_html %>
5
+ <% end %>
6
+
7
+ <%= render_widget :login,
8
+ :params => {:logout_to => "/login",
9
+ :login_to => "/home",
10
+ #optional field if Sign Up widget is setup
11
+ :signup_url => '/sign-up',
12
+ #optional field if Reset Password widget is setup
13
+ :reset_password_url => '/reset-password'
14
+ } %>
@@ -0,0 +1,9 @@
1
+ <div style="float:left;font-size:15px;">
2
+ <% unless @authenticated %>
3
+ <span>
4
+ <a href="<%=@login_url%>">Login</a>&nbsp;|&nbsp;<a href="<%=@signup_url%>">Sign Up</a>
5
+ </span>
6
+ <% else %>
7
+ <span>Welcome <%= @user.party.description %>&nbsp;|&nbsp;<a href="/session/sign_out?login_url=<%=@login_url%>">Logout</a></span>
8
+ <% end %>
9
+ </div>
@@ -0,0 +1,26 @@
1
+ <div id="<%=widget_result_id%>"></div>
2
+ <div>
3
+ <%= form_tag '/users/reset_password', :remote => true, :id => 'reset_password_form' do %>
4
+ <div class="form_settings">
5
+ <p>
6
+ <span style="width:175px">Username or Email Address</span>
7
+ <%= text_field_tag "login"%>
8
+ </p>
9
+ <input type="hidden" name="login_url" value="<%=@login_url%>" />
10
+ <p style="padding-top: 15px">
11
+ <span style="width:175px">&nbsp;</span>
12
+ <%= submit_tag "Reset", :disable_with => "Please wait...", :class => "submit", :style => 'margin:0px;'%>
13
+ </p>
14
+ </div>
15
+ <% end %>
16
+ </div>
17
+ <script type="text/javascript">
18
+ $('#login_form').bind('ajaxComplete', function(e, xhr, settings){
19
+ var response = jQuery.parseJSON(xhr.responseText);
20
+ $('#<%=widget_result_id%>').html('<div class="sexyerror">'+response.message+'</div>');
21
+ });
22
+ </script>
23
+
24
+
25
+
26
+
@@ -0,0 +1,327 @@
1
+
2
+ module Widgets
3
+ module ManageProfile
4
+ class Base < ErpApp::Widgets::Base
5
+ def contact_purpose_in_use?(contacts, purpose)
6
+ result = false
7
+ contacts.each do |e|
8
+ if e.contact.contact_purposes[0].internal_identifier == purpose
9
+ result = true
10
+ else
11
+ result = false
12
+ end
13
+ end
14
+ result
15
+ end
16
+
17
+ def index
18
+ @user = User.find(current_user)
19
+ @individual = @user.party.business_party
20
+ @email_addresses = @user.party.find_all_contacts_by_contact_mechanism(EmailAddress)
21
+ @phone_numbers = @user.party.find_all_contacts_by_contact_mechanism(PhoneNumber)
22
+ @postal_addresses = @user.party.find_all_contacts_by_contact_mechanism(PostalAddress)
23
+
24
+ contact_purposes = ContactPurpose.all
25
+ @purpose_hash={"Type" => "type"}
26
+ contact_purposes.each do |p|
27
+ @purpose_hash[p.description]=p.internal_identifier
28
+ end
29
+
30
+ countries= GeoCountry.all
31
+ @countries_id=[]
32
+ @countries_id << ["Country", "default"]
33
+ countries.each do |c|
34
+ @countries_id << [c.name, c.id]
35
+ end
36
+
37
+ states= GeoZone.all
38
+ @states_id=[]
39
+ @states_id << ["State", "default"]
40
+ states.each do |s|
41
+ @states_id << [s.zone_name, s.id]
42
+ end
43
+
44
+ render
45
+ end
46
+
47
+ def update_user_information
48
+ #### Get appropriate models ####
49
+
50
+ @user=User.find(current_user)
51
+ @individual= @user.party.business_party
52
+
53
+ #### Formating the date for sqlite. Will probably need diffrent formating for production ####
54
+ if params[:date][:day].to_i < 10
55
+ day="0#{params[:date][:day]}"
56
+ else
57
+ day= params[:date][:day]
58
+ end
59
+
60
+ if params[:date][:month].to_i < 10
61
+ month="0#{params[:date][:month]}"
62
+ else
63
+ month= params[:date][:month]
64
+ end
65
+
66
+ formated_date= "#{params[:date][:year]}-#{month}-#{day}"
67
+
68
+
69
+ #### Check if user made changes to info then update ####
70
+ if @individual.current_first_name != params[:first_name]
71
+ @user.first_name= params[:first_name]
72
+ @individual.current_first_name= params[:first_name]
73
+ end
74
+
75
+ if @individual.current_last_name != params[:last_name]
76
+ @user.last_name= params[:last_name]
77
+ @individual.current_last_name= params[:last_name]
78
+ end
79
+
80
+ if @individual.current_middle_name != params[:middle_name]
81
+ @individual.current_middle_name= params[:middle_name]
82
+ end
83
+
84
+ if @individual.gender != params[:gender]
85
+ @individual.gender= params[:gender]
86
+ end
87
+
88
+ if @individual.birth_date != formated_date
89
+ @individual.birth_date= formated_date
90
+ end
91
+
92
+ #### check validation then save and render message ####
93
+ if @user.changed? || @individual.changed?
94
+ if @user.valid? && @individual.valid?
95
+ @user.save
96
+ @individual.save
97
+ render :update => {:id => "#{@uuid}_result", :view => :success}
98
+ else
99
+ render :update => {:id => "#{@uuid}_result", :view => :error}
100
+ end
101
+ else
102
+ render :update => {:id => "#{@uuid}_result", :view => :success}
103
+ end
104
+
105
+ end
106
+
107
+
108
+ def update_password
109
+ if @user = User.authenticate(current_user.username, params[:old_password])
110
+ if !params[:new_password].blank? && !params[:password_confirmation].blank? && params[:new_password] == params[:password_confirmation]
111
+
112
+ @user.password_confirmation= params[:password_confirmation]
113
+
114
+ if @user.change_password!(params[:new_password])
115
+ render :update => {:id => "#{@uuid}_result", :view => :password_success}
116
+ else
117
+ #### validation failed ####
118
+ render :update => {:id => "#{@uuid}_result", :view => :error}
119
+ end
120
+
121
+ else
122
+ #### password and password confirmation cant be blank or unequal ####
123
+ render :update => {:id => "#{@uuid}_result", :view => :password_blank}
124
+ end
125
+ else
126
+ #### old password wrong ####
127
+ render :update => {:id => "#{@uuid}_result", :view => :password_invalid}
128
+ end
129
+
130
+ end
131
+
132
+ def update_contact_information
133
+ @user= User.find(current_user)
134
+ @email_addresses= @user.party.find_all_contacts_by_contact_mechanism(EmailAddress)
135
+ @phone_numbers= @user.party.find_all_contacts_by_contact_mechanism(PhoneNumber)
136
+ @postal_addresses= @user.party.find_all_contacts_by_contact_mechanism(PostalAddress)
137
+ something_changed=false
138
+ contact_type_in_use=false
139
+ default_type_error=false
140
+
141
+ #### Updates email records ####
142
+ @email_addresses.each_with_index do |e, i|
143
+ email_address_args={}
144
+ if e.email_address != params[:email_addresses][i.to_s]
145
+ email_address_args={:email_address => params[:email_addresses][i.to_s]}
146
+ @user.party.update_or_add_contact_with_purpose(EmailAddress,
147
+ ContactPurpose.find_by_internal_identifier(params[:email_address_contact_purposes][i.to_s]),
148
+ email_address_args)
149
+ something_changed=true
150
+ end
151
+ end
152
+
153
+ #### Updates Phone Numbers ####
154
+ @phone_numbers.each_with_index do |p, i|
155
+ phone_number_args={}
156
+ if p.phone_number != params[:phone_numbers][i.to_s]
157
+ phone_number_args={:phone_number => params[:phone_numbers][i.to_s]}
158
+ @user.party.update_or_add_contact_with_purpose(PhoneNumber,
159
+ ContactPurpose.find_by_internal_identifier(params[:phone_number_contact_purposes][i.to_s]),
160
+ phone_number_args)
161
+ something_changed=true
162
+ end
163
+ end
164
+
165
+ #### Updates Postal Addresses
166
+ @postal_addresses.each_with_index do |a, i|
167
+ postal_address_args= {}
168
+
169
+ if a.address_line_1 != params[:postal_addresses][i.to_s][:address_line_1]
170
+ postal_address_args[:address_line_1]= params[:postal_addresses][i.to_s][:address_line_1]
171
+ end
172
+
173
+ if a.address_line_2 != params[:postal_addresses][i.to_s][:address_line_2]
174
+ postal_address_args[:address_line_2]= params[:postal_addresses][i.to_s][:address_line_2]
175
+ end
176
+
177
+ if a.city != params[:postal_addresses][i.to_s][:city]
178
+ postal_address_args[:city]= params[:postal_addresses][i.to_s][:city]
179
+ end
180
+
181
+ if a.geo_zone_id != params[:postal_addresses][i.to_s][:state_id].to_i
182
+ postal_address_args[:geo_zone_id]= params[:postal_addresses][i.to_s][:state_id].to_i
183
+ postal_address_args[:state]= GeoZone.find(params[:postal_addresses][i.to_s][:state_id]).zone_name
184
+ end
185
+
186
+ if a.zip != params[:postal_addresses][i.to_s][:zip]
187
+ postal_address_args[:zip]= params[:postal_addresses][i.to_s][:zip]
188
+ end
189
+
190
+ if a.geo_country_id != params[:postal_addresses][i.to_s][:country_id].to_i
191
+ postal_address_args[:geo_country_id]= params[:postal_addresses][i.to_s][:country_id].to_i
192
+ postal_address_args[:country]= GeoCountry.find(params[:postal_addresses][i.to_s][:country_id]).name
193
+ end
194
+
195
+ if !postal_address_args.empty?
196
+ @user.party.update_or_add_contact_with_purpose(PostalAddress,
197
+ ContactPurpose.find_by_internal_identifier(params[:postal_address_contact_purposes][i.to_s]),
198
+ postal_address_args)
199
+ something_changed=true
200
+ end
201
+ end
202
+
203
+ #### Adds new email address ####
204
+ if params[:new_email_address] != nil && params[:new_email_address] != ""
205
+ if params[:new_email_address_contact_purpose] != "type"
206
+ if !contact_purpose_in_use?(@email_addresses, params[:new_email_address_contact_purpose])
207
+ @user.party.update_or_add_contact_with_purpose(EmailAddress,
208
+ ContactPurpose.find_by_internal_identifier(params[:new_email_address_contact_purpose]),
209
+ :email_address => params[:new_email_address])
210
+ something_changed=true
211
+ else
212
+ contact_type_in_use=true
213
+ #render :view => :contact_type_in_use
214
+ end
215
+ else
216
+ default_type_error=true
217
+ #render :view => :default_type_error
218
+ end
219
+ end
220
+
221
+ #### Adds new phone number ####
222
+ if params[:new_phone_number] != nil && params[:new_phone_number] != ""
223
+ if params[:new_phone_number_contact_purpose] != "type"
224
+ if !contact_purpose_in_use?(@phone_numbers, params[:new_phone_number_contact_purpose])
225
+ @user.party.update_or_add_contact_with_purpose(PhoneNumber,
226
+ ContactPurpose.find_by_internal_identifier(params[:new_phone_number_contact_purpose]),
227
+ :phone_number => params[:new_phone_number])
228
+ something_changed=true
229
+ else
230
+ contact_type_in_use=true
231
+ #render :view => :contact_type_in_use
232
+ end
233
+ else
234
+ default_type_error=true
235
+ #render :view => :default_type_error
236
+ end
237
+ end
238
+
239
+ #### Adds new postal address ####
240
+ new_postal_address_args= {}
241
+
242
+ if params[:new_postal_address][:address_line_1] != "Address Line 1"
243
+ new_postal_address_args[:address_line_1]= params[:new_postal_address][:address_line_1]
244
+ end
245
+
246
+ if params[:new_postal_address][:address_line_2] != "Address Line 2"
247
+ new_postal_address_args[:address_line_2]= params[:new_postal_address][:address_line_2]
248
+ end
249
+
250
+ if params[:new_postal_address][:city] != "City"
251
+ new_postal_address_args[:city]= params[:new_postal_address][:city]
252
+ end
253
+
254
+ if params[:new_postal_address][:state_id] != "default"
255
+ new_postal_address_args[:geo_zone_id]= params[:new_postal_address][:state_id].to_i
256
+ new_postal_address_args[:state]= GeoZone.find(params[:new_postal_address][:state_id]).zone_name
257
+ end
258
+
259
+ if params[:new_postal_address][:zip] != "Zipcode"
260
+ new_postal_address_args[:zip]= params[:new_postal_address][:zip]
261
+ end
262
+
263
+ if params[:new_postal_address][:country_id] != "default"
264
+ new_postal_address_args[:geo_country_id]= params[:new_postal_address][:country_id].to_i
265
+ new_postal_address_args[:country]= GeoCountry.find(params[:new_postal_address][:country_id]).name
266
+ end
267
+
268
+ if !new_postal_address_args.empty?
269
+ if params[:new_postal_address_contact_purpose] != "type"
270
+ if !contact_purpose_in_use?(@postal_addresses, params[:new_postal_address_contact_purpose])
271
+ @user.party.update_or_add_contact_with_purpose(PostalAddress,
272
+ ContactPurpose.find_by_internal_identifier(params[:new_postal_address_contact_purpose]),
273
+ new_postal_address_args)
274
+ something_changed=true
275
+ else
276
+ contact_type_in_use=true
277
+ #render :view => :contact_type_in_use
278
+ end
279
+ else
280
+ default_type_error=true
281
+ #render :view => :default_type_error
282
+ end
283
+ end
284
+
285
+ #### Renders proper error or success message ####
286
+ if default_type_error
287
+ render :update => {:id => "#{@uuid}_result", :view => :default_type_error}
288
+ elsif contact_type_in_use
289
+ render :update => {:id => "#{@uuid}_result", :view => :contact_type_in_use}
290
+ else
291
+ render :update => {:id => "#{@uuid}_result", :view => :success}
292
+ end
293
+
294
+ end
295
+
296
+ #should not be modified
297
+ #modify at your own risk
298
+ def locate
299
+ File.dirname(__FILE__)
300
+ end
301
+
302
+ class << self
303
+ def title
304
+ "Manage Profile"
305
+ end
306
+
307
+ def views_location
308
+ File.join(File.dirname(__FILE__),"/views")
309
+ end
310
+
311
+ def widget_name
312
+ File.basename(File.dirname(__FILE__))
313
+ end
314
+
315
+ def base_layout
316
+ begin
317
+ file = File.join(File.dirname(__FILE__),"/views/layouts/base.html.erb")
318
+ IO.read(file)
319
+ rescue
320
+ return nil
321
+ end
322
+ end
323
+ end
324
+ end
325
+ end
326
+ end
327
+