spree_custom_notifications 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +13 -0
  5. data/LICENSE +26 -0
  6. data/README.md +37 -0
  7. data/Rakefile +15 -0
  8. data/app/assets/images/close.png +0 -0
  9. data/app/assets/javascripts/admin/jquery-timer.js +2135 -0
  10. data/app/assets/javascripts/admin/spree_custom_notifications.js +24 -0
  11. data/app/assets/javascripts/store/spree_custom_notifications.js +17 -0
  12. data/app/assets/stylesheets/admin/spree_custom_notifications.css +23 -0
  13. data/app/assets/stylesheets/store/spree_custom_notifications.css +23 -0
  14. data/app/controllers/spree/admin/notifications_controller.rb +76 -0
  15. data/app/controllers/spree/notifications_controller.rb +10 -0
  16. data/app/helpers/base_helper_decorator.rb +16 -0
  17. data/app/models/spree/notification.rb +17 -0
  18. data/app/overrides/admin_notification_link.rb +5 -0
  19. data/app/overrides/frontend_notifications.rb +6 -0
  20. data/app/views/spree/admin/notifications/_form.html.erb +28 -0
  21. data/app/views/spree/admin/notifications/edit.html.erb +12 -0
  22. data/app/views/spree/admin/notifications/index.html.erb +28 -0
  23. data/app/views/spree/admin/notifications/new.html.erb +9 -0
  24. data/app/views/spree/notifications/_notifications.html.erb +14 -0
  25. data/bin/rails +7 -0
  26. data/config/locales/en.yml +5 -0
  27. data/config/routes.rb +9 -0
  28. data/db/migrate/20140210083923_add_spree_notifications.rb +12 -0
  29. data/lib/generators/spree_custom_notifications/install/install_generator.rb +31 -0
  30. data/lib/spree_custom_notifications.rb +2 -0
  31. data/lib/spree_custom_notifications/engine.rb +22 -0
  32. data/lib/spree_custom_notifications/factories.rb +6 -0
  33. data/spec/spec_helper.rb +82 -0
  34. data/spree_custom_notifications.gemspec +30 -0
  35. metadata +231 -0
@@ -0,0 +1,24 @@
1
+ //= require admin/spree_backend
2
+ //= require admin/jquery-timer
3
+
4
+ $(document).ready(function(){
5
+ // show datetimepicker
6
+ $("#start_date").focusin(function () {
7
+ var currentTime = new Date(),
8
+ currrnt_hours = currentTime.getHours(),
9
+ current_minutes = currentTime.getMinutes();
10
+ $(this).datetimepicker({ dateFormat: "yy-mm-dd",
11
+ hour: currrnt_hours,
12
+ minute: current_minutes});
13
+ });
14
+
15
+ $("#end_date").focusin(function () {
16
+ var currentTime = new Date(),
17
+ currrnt_hours = currentTime.getHours(),
18
+ current_minutes = currentTime.getMinutes();
19
+ $(this).datetimepicker({ dateFormat: "yy-mm-dd",
20
+ hour: currrnt_hours,
21
+ minute: current_minutes});
22
+
23
+ });
24
+ });
@@ -0,0 +1,17 @@
1
+ //= require store/spree_frontend
2
+ // code to close notification div on click of close image
3
+ $(document).ready(function(){
4
+ $("#close_img").click(function() {
5
+ $.ajax({
6
+ async: "false",
7
+ url: '/destroy_notification',
8
+ type: "GET",
9
+ data: {},
10
+ dataType: "json",
11
+ success: function (result) {
12
+ }
13
+ });
14
+
15
+ $("ul#notification_list").slideUp();
16
+ });
17
+ });
@@ -0,0 +1,23 @@
1
+ /*
2
+ *= require admin/spree_backend
3
+ */
4
+
5
+ .create_btn{
6
+ float: right;
7
+ margin-right: 40px;
8
+ position: relative;
9
+ }
10
+ #index_table {
11
+ margin-top: 62px;
12
+ }
13
+ #notification-content-header{
14
+ padding-bottom: 25px;
15
+ }
16
+ .input-width{
17
+ width: 50%
18
+ }
19
+
20
+ /* time picker css*/
21
+ .ui-timepicker-div{
22
+ padding-left: 10px;
23
+ }
@@ -0,0 +1,23 @@
1
+ /*
2
+ *= require store/spree_frontend
3
+ */
4
+
5
+ #notification_div{
6
+ background-color: #9FC820;
7
+ font-size: larger;
8
+ height: auto;
9
+ padding: 10px;
10
+ color: #ffffff;
11
+ }
12
+
13
+ #notification_div li{
14
+ list-style: none outside none;
15
+ }
16
+
17
+ #close_img{
18
+ float: right;
19
+ margin-left: -3px;
20
+ margin-right: -5px;
21
+ margin-top: -12px;
22
+ width: 26px;
23
+ }
@@ -0,0 +1,76 @@
1
+ module Spree
2
+ # Class NotificationController
3
+ class Admin::NotificationsController < Admin::ResourceController
4
+ before_filter :auth_user
5
+
6
+ def index
7
+ @notifications =
8
+ Spree::Notification.order('created_at desc')
9
+ .page(params[:page]).per(Spree::Config[:orders_per_page])
10
+ end
11
+
12
+ def new
13
+ @spree_notification = Spree::Notification.new
14
+ end
15
+
16
+ def create
17
+ @notification_params = _set_notification(params)
18
+ @spree_notification = Spree::Notification.new(@notification_params)
19
+ if @spree_notification.save
20
+ redirect_to admin_notifications_path,
21
+ notice: 'Notification has been created Succefully.'
22
+ else
23
+ _date_time_string(@spree_notification)
24
+ render :new
25
+ end
26
+ end
27
+
28
+ def edit
29
+ @spree_notification = Spree::Notification.find(params[:id])
30
+ _date_time_string(@spree_notification)
31
+ end
32
+
33
+ def update
34
+ @spree_notification = Spree::Notification.find(params[:id])
35
+ @notification_params = _set_notification(params)
36
+
37
+ if @spree_notification.update_attributes(@notification_params)
38
+ redirect_to admin_notifications_path,
39
+ notice: 'Notification has been updated Successfully'
40
+ else
41
+ _date_time_string(@spree_notification)
42
+ render :edit
43
+ end
44
+ end
45
+
46
+ def _set_notification(params)
47
+ @notification = {}
48
+ @start_date = params[:notification][:start_date]
49
+ @start_date = Time.zone.parse(params[:notification][:start_date]).getutc unless @start_date.blank?
50
+
51
+ @end_date = params[:notification][:end_date]
52
+ @end_date = Time.zone.parse(params[:notification][:end_date]).getutc unless @end_date.blank?
53
+ @message = params[:notification][:notification]
54
+ @notification = { notification: @message,
55
+ start_date: @start_date,
56
+ end_date: @end_date }
57
+ end
58
+
59
+ def _date_time_string(notification)
60
+ notification.start_date =
61
+ notification.start_date.strftime('%Y-%m-%d %H:%M') if notification.start_date?
62
+ notification.end_date =
63
+ notification.end_date.strftime('%Y-%m-%d %H:%M') if notification.end_date?
64
+ end
65
+
66
+ private
67
+
68
+ def notification_params
69
+ params.require(:notification).permit!
70
+ end
71
+
72
+ def auth_user
73
+ redirect_to login_url unless spree_current_user.present?
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,10 @@
1
+ module Spree
2
+ # Class NotificationController
3
+ class NotificationsController < StoreController
4
+ def destroy_notification
5
+ session['show_notification'] = false
6
+ result = { success: true }
7
+ render json: result
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ # get Notifications
2
+ Spree::BaseHelper.class_eval do
3
+ def get_notification
4
+ notifications = []
5
+ session['show_notification'] = true if session['show_notification'].nil?
6
+ if session['show_notification']
7
+ session['show_notification'] = true
8
+ current_time = Time.zone.now.getutc
9
+ notifications =
10
+ Spree::Notification.where('start_date <= :start_date_cond AND
11
+ end_date >= :end_date_cond',
12
+ {start_date_cond: current_time, end_date_cond: current_time})
13
+ end
14
+ notifications
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module Spree
2
+ # Notification class
3
+ class Notification < ActiveRecord::Base
4
+ validates_presence_of :notification
5
+ validate :end_date_greater_than_start_date
6
+
7
+ def end_date_greater_than_start_date
8
+ if start_date.blank?
9
+ errors.add(:start_date, 'is required')
10
+ elsif end_date.blank?
11
+ errors.add(:end_date, 'is required')
12
+ elsif end_date < start_date
13
+ errors.add(:end_date, 'should be greater than start date')
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ Deface::Override.new(virtual_path: 'spree/admin/shared/_configuration_menu',
2
+ insert_bottom: 'ul.sidebar',
3
+ text: "<%= tab(:notifications, :url => '/admin/notifications') %>",
4
+ name: 'admin_notification_link'
5
+ )
@@ -0,0 +1,6 @@
1
+ Deface::Override.new(
2
+ virtual_path: 'spree/home/index',
3
+ insert_top: "[data-hook='homepage_products']",
4
+ partial: 'spree/notifications/notifications',
5
+ name: 'frontend_notifications'
6
+ )
@@ -0,0 +1,28 @@
1
+ <%= render :partial => 'spree/shared/error_messages', :locals => { :target => @spree_notification } %>
2
+ <div class="field">
3
+ <%= f.fields_for :notification do %>
4
+ <div class='label-div'><%= f.label :notification %></div>
5
+ <div class='input-div'>
6
+ <%= f.text_area :notification, :rows => "4", :class => 'input-width' %>
7
+ </div>
8
+ <% end %>
9
+ </div>
10
+ <div class="field">
11
+ <%= f.fields_for :start_date do %>
12
+ <div class='label-div'><%= f.label :start_date %></div>
13
+ <div class='input-div'>
14
+ <%= f.text_field :start_date, :id => "start_date", :class => 'input-width'%>
15
+ </div>
16
+ <% end %>
17
+ </div>
18
+ <div class="field">
19
+ <%= f.fields_for :end_date do %>
20
+ <div class='label-div'><%= f.label :end_date %></div>
21
+ <div class='input-div'>
22
+ <%= f.text_field :end_date, :id => "end_date", :class => 'input-width'%>
23
+ </div>
24
+ <% end %>
25
+ </div>
26
+ <div class="field">
27
+ <%= f.submit :id => "notification_btn" %>
28
+ </div>
@@ -0,0 +1,12 @@
1
+ <%= render :partial => 'spree/admin/shared/configuration_menu' %>
2
+ <div id='notification-content-header'>
3
+ <h4>Edit Notification</h4>
4
+ <div class='page-actions table-cell.toolbar'>
5
+ <%= link_to "Add Notification", "/admin/notifications/new", :class => "button icon-plus create_btn", :id => "notification_add_btn"%>
6
+ </div>
7
+ </div>
8
+ <div class='container'>
9
+ <%= form_for @spree_notification , :url => "/admin/notifications/#{@spree_notification.id}", :html => {:method => :put} do |f| %>
10
+ <%= render partial: 'form', :locals => {f: f}%>
11
+ <% end %>
12
+ </div>
@@ -0,0 +1,28 @@
1
+ <%= render :partial => 'spree/admin/shared/configuration_menu' %>
2
+ <h3> Notifications </h3>
3
+ <div class='page-actions table-cell.toolbar'>
4
+ <%= link_to "Add Notification", "/admin/notifications/new", :class => "button icon-plus create_btn", :id => "notification_add_btn"%>
5
+ </div>
6
+ <table class='index' id = 'index_table'>
7
+ <thead>
8
+ <tr>
9
+ <th> Notification Message </th>
10
+ <th> Start Date </th>
11
+ <th> End Date </th>
12
+ </tr>
13
+ </thead>
14
+ <tbody>
15
+ <% @notifications.each do |notification| %>
16
+ <tr>
17
+ <td><%= notification.notification %></td>
18
+ <td><%= notification.start_date.strftime('%Y-%m-%d %H:%M') %></td>
19
+ <td><%= notification.end_date.strftime('%Y-%m-%d %H:%M') %></td>
20
+ <td class='actions'>
21
+ <%= link_to '', edit_admin_notification_path(notification), :class => "icon_link with-tip icon-edit no-text", :title => 'edit'%>
22
+ <%= link_to '', "/admin/notifications/#{notification.id}", method: :delete, data: { confirm: 'Are you sure?' }, :class => "delete-resource icon_link with-tip icon-trash no-text", :title => 'delete'%>
23
+ </td>
24
+ </tr>
25
+ <% end %>
26
+ </tbody>
27
+ </table>
28
+ <%= paginate @notifications %>
@@ -0,0 +1,9 @@
1
+ <%= render :partial => 'spree/admin/shared/configuration_menu' %>
2
+ <div id='notification-content-header'>
3
+ <h4>New Notification</h4>
4
+ </div>
5
+ <div class='container'>
6
+ <%= form_for @spree_notification , :url => "/admin/notifications", :html => {:method => :post} do |f| %>
7
+ <%= render partial: 'form', :locals => {f: f}%>
8
+ <% end %>
9
+ </div>
@@ -0,0 +1,14 @@
1
+ <% if get_notification.present? %>
2
+ <ul id='notification_list'>
3
+ <img id="close_img" src="/assets/close.png">
4
+ <% get_notification.each do |notification|%>
5
+ <div id="notification_contents">
6
+ <div id="notification_div">
7
+ <li>
8
+ <%= notification.notification%>
9
+ </li>
10
+ </div>
11
+ </div>
12
+ <% end %>
13
+ </ul>
14
+ <% end %>
@@ -0,0 +1,7 @@
1
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
2
+
3
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
4
+ ENGINE_PATH = File.expand_path('../../lib/spree_custom_notifications/engine', __FILE__)
5
+
6
+ require 'rails/all'
7
+ require 'rails/engine/commands'
@@ -0,0 +1,5 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ hello: "Hello world"
@@ -0,0 +1,9 @@
1
+ Spree::Core::Engine.routes.append do
2
+ namespace :admin do
3
+ resources :notifications
4
+ end
5
+ end
6
+
7
+ Spree::Core::Engine.routes.draw do
8
+ get '/destroy_notification', to: 'notifications#destroy_notification'
9
+ end
@@ -0,0 +1,12 @@
1
+ # create table spree_notifications
2
+ class AddSpreeNotifications < ActiveRecord::Migration
3
+ def change
4
+ create_table :spree_notifications do |t|
5
+ t.datetime :start_date
6
+ t.datetime :end_date
7
+ t.text :notification
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,31 @@
1
+ module SpreeCustomNotifications
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ class_option :auto_run_migrations, :type => :boolean, :default => false
6
+
7
+ def add_javascripts
8
+ append_file 'app/assets/javascripts/store/all.js', "//= require store/spree_custom_notifications\n"
9
+ append_file 'app/assets/javascripts/admin/all.js', "//= require admin/spree_custom_notifications\n"
10
+ end
11
+
12
+ def add_stylesheets
13
+ inject_into_file 'app/assets/stylesheets/store/all.css', " *= require store/spree_custom_notifications\n", :before => /\*\//, :verbose => true
14
+ inject_into_file 'app/assets/stylesheets/admin/all.css', " *= require admin/spree_custom_notifications\n", :before => /\*\//, :verbose => true
15
+ end
16
+
17
+ def add_migrations
18
+ run 'bundle exec rake railties:install:migrations FROM=spree_custom_notifications'
19
+ end
20
+
21
+ def run_migrations
22
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
23
+ if run_migrations
24
+ run 'bundle exec rake db:migrate'
25
+ else
26
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,2 @@
1
+ require 'spree_core'
2
+ require 'spree_custom_notifications/engine'
@@ -0,0 +1,22 @@
1
+ module SpreeCustomNotifications
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'spree_custom_notifications'
6
+
7
+ config.autoload_paths += %W(#{config.root}/lib)
8
+
9
+ # use rspec for tests
10
+ config.generators do |g|
11
+ g.test_framework :rspec
12
+ end
13
+
14
+ def self.activate
15
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
16
+ Rails.configuration.cache_classes ? require(c) : load(c)
17
+ end
18
+ end
19
+
20
+ config.to_prepare &method(:activate).to_proc
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ # Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
3
+ #
4
+ # Example adding this to your spec_helper will load these Factories for use:
5
+ # require 'spree_custom_notifications/factories'
6
+ end
@@ -0,0 +1,82 @@
1
+ # Run Coverage report
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter 'spec/dummy'
5
+ add_group 'Controllers', 'app/controllers'
6
+ add_group 'Helpers', 'app/helpers'
7
+ add_group 'Mailers', 'app/mailers'
8
+ add_group 'Models', 'app/models'
9
+ add_group 'Views', 'app/views'
10
+ add_group 'Libraries', 'lib'
11
+ end
12
+
13
+ # Configure Rails Environment
14
+ ENV['RAILS_ENV'] = 'test'
15
+
16
+ require File.expand_path('../dummy/config/environment.rb', __FILE__)
17
+
18
+ require 'rspec/rails'
19
+ require 'database_cleaner'
20
+ require 'ffaker'
21
+
22
+ # Requires supporting ruby files with custom matchers and macros, etc,
23
+ # in spec/support/ and its subdirectories.
24
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
25
+
26
+ # Requires factories defined in spree_core
27
+ require 'spree/testing_support/factories'
28
+ require 'spree/testing_support/controller_requests'
29
+ require 'spree/testing_support/authorization_helpers'
30
+ require 'spree/testing_support/url_helpers'
31
+
32
+ # Requires factories defined in lib/spree_custom_notifications/factories.rb
33
+ require 'spree_custom_notifications/factories'
34
+
35
+ RSpec.configure do |config|
36
+ config.include FactoryGirl::Syntax::Methods
37
+
38
+ # == URL Helpers
39
+ #
40
+ # Allows access to Spree's routes in specs:
41
+ #
42
+ # visit spree.admin_path
43
+ # current_path.should eql(spree.products_path)
44
+ config.include Spree::TestingSupport::UrlHelpers
45
+
46
+ # == Mock Framework
47
+ #
48
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
49
+ #
50
+ # config.mock_with :mocha
51
+ # config.mock_with :flexmock
52
+ # config.mock_with :rr
53
+ config.mock_with :rspec
54
+ config.color = true
55
+
56
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
57
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
58
+
59
+ # Capybara javascript drivers require transactional fixtures set to false, and we use DatabaseCleaner
60
+ # to cleanup after each test instead. Without transactional fixtures set to false the records created
61
+ # to setup a test will be unavailable to the browser, which runs under a seperate server instance.
62
+ config.use_transactional_fixtures = false
63
+
64
+ # Ensure Suite is set to use transactions for speed.
65
+ config.before :suite do
66
+ DatabaseCleaner.strategy = :transaction
67
+ DatabaseCleaner.clean_with :truncation
68
+ end
69
+
70
+ # Before each spec check if it is a Javascript test and switch between using database transactions or not where necessary.
71
+ config.before :each do
72
+ DatabaseCleaner.strategy = example.metadata[:js] ? :truncation : :transaction
73
+ DatabaseCleaner.start
74
+ end
75
+
76
+ # After each spec clean the database.
77
+ config.after :each do
78
+ DatabaseCleaner.clean
79
+ end
80
+
81
+ config.fail_fast = ENV['FAIL_FAST'] || false
82
+ end