e9_vendors 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/README.markdown +6 -0
  4. data/Rakefile +1 -0
  5. data/app/controllers/e9_vendors/settings_controller.rb +11 -0
  6. data/app/controllers/e9_vendors/vendor_categories_controller.rb +36 -0
  7. data/app/controllers/e9_vendors/vendor_members_controller.rb +61 -0
  8. data/app/controllers/e9_vendors/vendor_proxies_controller.rb +38 -0
  9. data/app/controllers/e9_vendors/vendors_controller.rb +22 -0
  10. data/app/decorators/vendor_category_decorator.rb +10 -0
  11. data/app/decorators/vendor_member_decorator.rb +55 -0
  12. data/app/decorators/vendor_proxy_decorator.rb +74 -0
  13. data/app/decorators/vendors_decorator.rb +27 -0
  14. data/app/models/vendor.rb +23 -0
  15. data/app/models/vendor_category.rb +17 -0
  16. data/app/models/vendor_member.rb +21 -0
  17. data/app/models/vendor_proxy.rb +39 -0
  18. data/app/observers/vendor_member_observer.rb +17 -0
  19. data/app/observers/vendor_observer.rb +18 -0
  20. data/app/uploaders/logo_uploader.rb +14 -0
  21. data/app/views/e9_vendors/settings/_form.html.haml +18 -0
  22. data/app/views/e9_vendors/settings/show.html.haml +2 -0
  23. data/app/views/e9_vendors/vendor_categories/_form.html.haml +7 -0
  24. data/app/views/e9_vendors/vendor_categories/_table.html.haml +21 -0
  25. data/app/views/e9_vendors/vendor_categories/destroy.js.erb +3 -0
  26. data/app/views/e9_vendors/vendor_categories/edit.html.haml +2 -0
  27. data/app/views/e9_vendors/vendor_categories/index.html.haml +4 -0
  28. data/app/views/e9_vendors/vendor_categories/index.js.erb +1 -0
  29. data/app/views/e9_vendors/vendor_categories/new.html.haml +2 -0
  30. data/app/views/e9_vendors/vendor_members/_form.html.haml +49 -0
  31. data/app/views/e9_vendors/vendor_members/_table.html.haml +21 -0
  32. data/app/views/e9_vendors/vendor_members/_vendors.html.haml +24 -0
  33. data/app/views/e9_vendors/vendor_members/destroy.js.erb +3 -0
  34. data/app/views/e9_vendors/vendor_members/edit.html.haml +2 -0
  35. data/app/views/e9_vendors/vendor_members/index.html.haml +4 -0
  36. data/app/views/e9_vendors/vendor_members/index.js.erb +1 -0
  37. data/app/views/e9_vendors/vendor_members/new.html.haml +2 -0
  38. data/app/views/e9_vendors/vendor_members/widget_code.html.haml +3 -0
  39. data/app/views/e9_vendors/vendor_proxies/_form.html.haml +28 -0
  40. data/app/views/e9_vendors/vendor_proxies/_table.html.haml +16 -0
  41. data/app/views/e9_vendors/vendor_proxies/_table_row.html.haml +11 -0
  42. data/app/views/e9_vendors/vendor_proxies/destroy.js.erb +3 -0
  43. data/app/views/e9_vendors/vendor_proxies/edit.html.haml +2 -0
  44. data/app/views/e9_vendors/vendor_proxies/index.html.haml +1 -0
  45. data/app/views/e9_vendors/vendor_proxies/index.js.erb +1 -0
  46. data/app/views/e9_vendors/vendor_proxies/new.html.haml +2 -0
  47. data/app/views/e9_vendors/vendor_proxies/update.js.erb +7 -0
  48. data/app/views/e9_vendors/vendors/_form.html.haml +91 -0
  49. data/app/views/e9_vendors/vendors/_table.html.haml +20 -0
  50. data/app/views/e9_vendors/vendors/destroy.js.erb +3 -0
  51. data/app/views/e9_vendors/vendors/edit.html.haml +2 -0
  52. data/app/views/e9_vendors/vendors/index.html.haml +4 -0
  53. data/app/views/e9_vendors/vendors/index.js.erb +1 -0
  54. data/app/views/e9_vendors/vendors/new.html.haml +2 -0
  55. data/config/locales/vendorboon.en.yml +61 -0
  56. data/config/routes.rb +38 -0
  57. data/e9_vendors.gemspec +20 -0
  58. data/lib/e9_vendors.rb +24 -0
  59. data/lib/e9_vendors/controller.rb +18 -0
  60. data/lib/e9_vendors/model.rb +13 -0
  61. data/lib/e9_vendors/version.rb +3 -0
  62. data/lib/generators/e9_vendors/install_generator.rb +31 -0
  63. data/lib/generators/e9_vendors/templates/javascript.js +16 -0
  64. data/lib/generators/e9_vendors/templates/migration.rb +84 -0
  65. data/lib/generators/e9_vendors/templates/stylesheets/vb-widget-ie.scss +21 -0
  66. data/lib/generators/e9_vendors/templates/stylesheets/vb-widget.scss +151 -0
  67. metadata +129 -0
@@ -0,0 +1,17 @@
1
+ class VendorMemberObserver < ActiveRecord::Observer
2
+ observe :vendor_member
3
+
4
+ #
5
+ # Assign hash_id before save (for gets)
6
+ #
7
+ def before_save(record)
8
+ record.md5_hash = Digest::MD5.hexdigest("#{record.name}/#{DateTime.now}") if record.md5_hash.blank?
9
+ end
10
+
11
+ #
12
+ # build and assign a new set of vendor proxies after creation
13
+ #
14
+ def after_create(record)
15
+ record.vendor_proxies = Vendor.all_proxies
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ class VendorObserver < ActiveRecord::Observer
2
+ observe :vendor
3
+
4
+ #
5
+ # On create, new VendorDetail joins are created for each existing member
6
+ #
7
+ def after_create(record)
8
+ VendorMember.add_vendor_proxy(record.vendor_proxies)
9
+ end
10
+
11
+ #
12
+ # On updates, all members are touched, ensuring that widget JSON requests
13
+ # for the members are pulling the most recent information
14
+ #
15
+ def after_update(record)
16
+ VendorMember.touch_all
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ class LogoUploader < BaseUploader
2
+ self.specified_dimensions = proc { Array.new(2, E9::Config[:e9_vendors_logo_size]) }
3
+
4
+ process :convert => :png
5
+ process :resize_to_fill => specified_dimensions if specified_dimensions?
6
+
7
+ def filename
8
+ "#{model.class.to_s.underscore}_logo.png" if present?
9
+ end
10
+
11
+ def default_url
12
+ File.join(host, DEFAULTS_BASE_PATH, "upload_image_thumb.png")
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ = form_for resource, :url => e9_vendors_settings_path do |f|
2
+ .errors= resource_error_messages!
3
+
4
+ %fieldset#widget_settings
5
+ %legend
6
+ = help_label(:widget_settings, :e9_vendors_widget_settings, :key => :e9_vendors_widget_help, :header => 'Variable Help')
7
+ .field
8
+ = f.label :e9_vendors_widget_title, nil, :class => :req
9
+ = f.text_field :e9_vendors_widget_title
10
+ .field
11
+ = f.label :e9_vendors_widget_form_title, nil, :class => :req
12
+ = f.text_field :e9_vendors_widget_form_title
13
+ - if e9_user?
14
+ .field
15
+ = f.label :e9_vendors_logo_size, nil, :class => :req
16
+ = f.text_field :e9_vendors_logo_size
17
+ .actions
18
+ = f.submit
@@ -0,0 +1,2 @@
1
+ = title e9_t(:index_title)
2
+ = render_admin_form
@@ -0,0 +1,7 @@
1
+ = form_for resource do |f|
2
+ .errors= resource_error_messages!
3
+ .field
4
+ = f.label :name, nil, :class => :req
5
+ = f.text_field :name
6
+ .actions
7
+ = f.submit
@@ -0,0 +1,21 @@
1
+ = form_tag polymorphic_path([:update_order, resource_class]) do
2
+ %table.records.sortable
3
+ %thead
4
+ %tr
5
+ %th= resource_humanize(:position)
6
+ %th= resource_humanize(:name)
7
+ %th= e9_t(:actions)
8
+ %tbody
9
+ - if collection.empty?
10
+ %tr
11
+ %td{:colspan => 3}= e9_t(:no_records_text)
12
+ - else
13
+ - collection.each do |record|
14
+ %tr{:id => "ids_#{record.id}", :class => cycle('odd', 'even')}
15
+ %td
16
+ .handle +++
17
+ %td.txt.wide
18
+ = record.name
19
+ %td.links
20
+ = link_to_edit_resource(record)
21
+ = link_to_destroy_resource(record)
@@ -0,0 +1,3 @@
1
+ <% if !resource.errors.any? %>
2
+ $("#ids_<%= resource.id %>").fadeOut(function() { $(this).remove(); });
3
+ <% end %>
@@ -0,0 +1,2 @@
1
+ = title e9_t(:edit_title)
2
+ = render_admin_form
@@ -0,0 +1,4 @@
1
+ - content_for :toolbar_right do
2
+ = link_to_new_resource resource_class
3
+
4
+ = render 'shared/admin/index', :collection => collection
@@ -0,0 +1 @@
1
+ $("#records_table").html("<%= escape_javascript(render('table', :collection => collection)) %>");
@@ -0,0 +1,2 @@
1
+ = title e9_t(:new_title)
2
+ = render_admin_form
@@ -0,0 +1,49 @@
1
+ = form_for resource do |f|
2
+ .errors= resource_error_messages!
3
+ .field
4
+ = f.label :name, nil, :class => :req
5
+ = f.text_field :name
6
+ .field
7
+ = upload_mount_field(resource.logo, :reset_path => true, :required => true)
8
+ .field
9
+ = f.label :nickname
10
+ = f.text_field :nickname
11
+ .field
12
+ = f.label :address_1
13
+ = f.text_field :address_1
14
+ .field
15
+ = f.label :address_2
16
+ = f.text_field :address_2
17
+ .field
18
+ = f.label :city
19
+ = f.text_field :city
20
+ .field
21
+ = f.label :state
22
+ = f.state_select :state
23
+ .field
24
+ = f.label :zipcode
25
+ = f.text_field :zipcode
26
+ .field
27
+ = f.label :country
28
+ = f.select :country, [["United States", "US"]]
29
+ .field
30
+ = f.label :website
31
+ = f.text_area :website
32
+ .field
33
+ = f.label :contact_email, nil, :class => :req
34
+ = f.text_field :contact_email
35
+ .field
36
+ = f.label :contact_full_name
37
+ = f.text_field :contact_full_name
38
+ .field
39
+ = f.label :contact_title
40
+ = f.text_field :contact_title
41
+ .field
42
+ = f.label :contact_phone
43
+ = f.text_field :contact_phone
44
+ .field
45
+ = f.label :admin_notes
46
+ = f.text_area :admin_notes
47
+
48
+ .actions
49
+ = f.submit
@@ -0,0 +1,21 @@
1
+ %table.records
2
+ %thead
3
+ %tr
4
+ %th= resource_humanize(:name)
5
+ %th= e9_t(:actions)
6
+ %tbody
7
+ - if collection.empty?
8
+ %tr
9
+ %td{:colspan => 2}= e9_t(:no_records_text)
10
+ - else
11
+ - collection.each do |record|
12
+ %tr{:id => "ids_#{record.id}", :class => cycle('odd', 'even')}
13
+ %td.txt.wide
14
+ = record.name
15
+ %td.links
16
+ = link_to e9_t(:manage), polymorphic_path([record, VendorProxy])
17
+ = link_to e9_t(:get_widget_code), polymorphic_path([:widget_code, record])
18
+ .tooltip
19
+ %pre #{record.widget_code}
20
+ = link_to_edit_resource(record)
21
+ = link_to_destroy_resource(record)
@@ -0,0 +1,24 @@
1
+ %table.records
2
+ %thead
3
+ %tr
4
+ %th= resource_humanize(:select)
5
+ %th= resource_humanize(:vendor)
6
+ %th= resource_humanize(:discount_code)
7
+ %th= resource_humanize(:discount_percentage)
8
+ %th= resource_humanize(:sales_contact)
9
+ %th= e9_t(:actions)
10
+ %tbody
11
+ - if collection.empty?
12
+ %tr
13
+ %td{:colspan => 3}= e9_t(:no_records_text)
14
+ - else
15
+ - collection.each do |record|
16
+ %tr{:id => "ids_#{record.id}", :class => cycle('odd', 'even')}
17
+ %td= check_box record, :display_on_widget
18
+ %td= record.vendor.name
19
+ %td= record.discount_code
20
+ %td= record.discount_percentage
21
+ %td= record.sales_contact
22
+ %td.links
23
+ = vendor_landing_page_link(record)
24
+ = edit_admin_resource_link(record)
@@ -0,0 +1,3 @@
1
+ <% if !resource.errors.any? %>
2
+ $("#ids_<%= resource.id %>").fadeOut(function() { $(this).remove(); });
3
+ <% end %>
@@ -0,0 +1,2 @@
1
+ = title e9_t(:edit_title)
2
+ = render_admin_form
@@ -0,0 +1,4 @@
1
+ - content_for :toolbar_right do
2
+ = link_to_new_resource(resource_class)
3
+
4
+ = render 'shared/admin/index', :collection => collection
@@ -0,0 +1 @@
1
+ $("#records_table").html("<%= escape_javascript(render('table', :collection => collection)) %>");
@@ -0,0 +1,2 @@
1
+ = title e9_t(:new_title)
2
+ = render_admin_form
@@ -0,0 +1,3 @@
1
+ = title e9_t(:widget_code_title)
2
+ %code
3
+ = resource.widget_code
@@ -0,0 +1,28 @@
1
+ = form_for resource, :url => vendor_member_vendor_proxy_path(resource.vendor_member, resource), :remote => request.xhr? do |f|
2
+ .errors= resource_error_messages!
3
+ .field
4
+ = f.label :discount_code, nil, :class => :req
5
+ = f.text_field :discount_code
6
+ .instructions
7
+ = e9_t(:vendor_defaults_instructions)
8
+ .field
9
+ = f.label :discount_percentage, resource.label_with_default(:discount_percentage)
10
+ = f.text_field :discount_percentage, :value => resource.send(:read_attribute, :discount_percentage)
11
+ .field
12
+ = f.label :landing_page, resource.label_with_default(:landing_page)
13
+ = f.text_area :landing_page, :value => (resource.send(:read_attribute, :landing_page) || '')
14
+ .field
15
+ = f.label :sales_full_name, resource.label_with_default(:sales_full_name)
16
+ = f.text_field :sales_full_name, :value => resource.send(:read_attribute, :sales_full_name)
17
+ .field
18
+ = f.label :sales_title, resource.label_with_default(:sales_title)
19
+ = f.text_field :sales_title, :value => resource.send(:read_attribute, :sales_title)
20
+ .field
21
+ = f.label :sales_phone, resource.label_with_default(:sales_phone)
22
+ = f.text_field :sales_phone, :value => resource.send(:read_attribute, :sales_phone)
23
+ .field
24
+ = f.label :sales_email, resource.label_with_default(:sales_email)
25
+ = f.text_field :sales_email, :value => resource.send(:read_attribute, :sales_email)
26
+
27
+ .actions
28
+ = f.submit
@@ -0,0 +1,16 @@
1
+ %table.records
2
+ %thead
3
+ %tr
4
+ %th= resource_humanize(:select)
5
+ %th= resource_humanize(:vendor)
6
+ %th= resource_humanize(:discount_code)
7
+ %th= resource_humanize(:discount_percentage)
8
+ %th= resource_humanize(:sales_info)
9
+ %th= e9_t(:actions)
10
+ %tbody
11
+ - if collection.empty?
12
+ %tr
13
+ %td{:colspan => 6}= e9_t(:no_records_text)
14
+ - else
15
+ - collection.each do |record|
16
+ = render 'table_row', :record => record
@@ -0,0 +1,11 @@
1
+ %tr{:id => "ids_#{record.id}"}
2
+ %td
3
+ = form_for record, :url => vendor_member_vendor_proxy_path(record.vendor_member, record) do |f|
4
+ = f.check_box :display_on_widget, :class => 'vendor-proxy-widget-display'
5
+ %td= record.vendor_name
6
+ %td= record.discount_code
7
+ %td= record.discount_percentage
8
+ %td= record.sales_info_array.join('<br />').html_safe
9
+ %td.links
10
+ = link_to e9_t(:view_landing_page), record.landing_page_url, :rel => 'external', :class => 'landing-page'
11
+ = link_to e9_t(:edit), edit_vendor_member_vendor_proxy_path(record.vendor_member, record)
@@ -0,0 +1,3 @@
1
+ <% if !resource.errors.any? %>
2
+ $("#ids_<%= resource.id %>").fadeOut();
3
+ <% end %>
@@ -0,0 +1,2 @@
1
+ = title e9_t(:edit_title)
2
+ = render_admin_form
@@ -0,0 +1 @@
1
+ = render 'shared/admin/index', :collection => collection
@@ -0,0 +1 @@
1
+ $("#records_table").html("<%= escape_javascript(render('table', :collection => collection)) %>");
@@ -0,0 +1,2 @@
1
+ = title e9_t(:new_title)
2
+ = render_admin_form
@@ -0,0 +1,7 @@
1
+ <% if resource.errors.any? %>
2
+ $('form .errors').html("<%= escape_javascript(resource_error_messages!) %>");
3
+ $.fn.colorbox.resize();
4
+ <% else %>
5
+ $('#ids_<%= resource.id %>').replaceWith("<%= escape_javascript(render('table_row', :record => resource)) %>");
6
+ $.fn.colorbox.close();
7
+ <% end %>
@@ -0,0 +1,91 @@
1
+ = form_for resource do |f|
2
+ = resource_error_messages!
3
+ .field
4
+ = f.label :name, nil, :class => :req
5
+ = f.text_field :name
6
+ %fieldset.checkbox
7
+ %legend
8
+ = f.label :vendor_category_id, resource_class.human_attribute_name(:vendor_category), :class => :req
9
+ %ul
10
+ - VendorCategory.order(:name).each do |vc|
11
+ %li.checkbox
12
+ = check_box_tag 'vendor[vendor_category_ids][]', vc.id, resource.vendor_category_ids.member?(vc.id), :id => "vendor_category_#{vc.id}"
13
+ = label_tag "vendor_category_#{vc.id}", vc.name
14
+ .field
15
+ = upload_mount_field(resource.logo, :reset_path => true, :required => true)
16
+ .field
17
+ = f.label :nickname
18
+ = f.text_field :nickname
19
+ .field
20
+ = f.label :address_1
21
+ = f.text_field :address_1
22
+ .field
23
+ = f.label :address_2
24
+ = f.text_field :address_2
25
+ .field
26
+ = f.label :city
27
+ = f.text_field :city
28
+ .field
29
+ = f.label :state
30
+ = f.state_select :state
31
+ .field
32
+ = f.label :zipcode
33
+ = f.text_field :zipcode
34
+ .field
35
+ = f.label :country
36
+ = f.select :country, [["United States", "US"]]
37
+ .field
38
+ = f.label :website
39
+ = f.text_area :website
40
+ .field
41
+ = f.label :contact_email, nil, :class => :req
42
+ = f.text_field :contact_email
43
+ .field
44
+ = f.label :contact_full_name
45
+ = f.text_field :contact_full_name
46
+ .field
47
+ = f.label :contact_title
48
+ = f.text_field :contact_title
49
+ .field
50
+ = f.label :contact_phone
51
+ = f.text_field :contact_phone
52
+
53
+ %fieldset
54
+ %legend= e9_t(:widget_settings_legend)
55
+ .field.checkbox
56
+ = f.label :display_on_widget_contact_form
57
+ = f.check_box :display_on_widget_contact_form
58
+ .field
59
+ = f.label :sales_email, nil, :class => :req
60
+ = f.text_field :sales_email
61
+ .field
62
+ = f.label :sales_full_name
63
+ = f.text_field :sales_full_name
64
+ .field
65
+ = f.label :sales_title
66
+ = f.text_field :sales_title
67
+ .field
68
+ = f.label :sales_phone
69
+ = f.text_field :sales_phone
70
+ .field
71
+ = help_label(f, :short_description, :key => :interpolation_instructions, :header => 'Variable Help')
72
+ = f.text_area :short_description
73
+ .field
74
+ = help_label(f, :long_description, :key => :interpolation_instructions, :header => 'Variable Help')
75
+ = f.text_area :long_description
76
+ .field
77
+ = f.label :discount_percentage, nil, :class => :req
78
+ #{f.text_field :discount_percentage}%
79
+ .field
80
+ = f.label :member_compensation, nil, :class => :req
81
+ #{f.text_field :member_compensation}%
82
+ .field
83
+ = f.label :landing_page, nil, :class => :req
84
+ = f.text_area :landing_page
85
+
86
+ .field
87
+ = f.label :admin_notes
88
+ = f.text_area :admin_notes
89
+
90
+ .actions
91
+ = f.submit