dandify 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +22 -0
- data/README.md +52 -0
- data/Rakefile +15 -0
- data/app/assets/javascripts/spree/backend/dandify.js +0 -0
- data/app/assets/javascripts/spree/frontend/dandify.js +0 -0
- data/app/assets/stylesheets/spree/backend/dandify.css +42 -0
- data/app/assets/stylesheets/spree/frontend/dandify.css +0 -0
- data/app/controllers/spree/admin/stylesheets_controller.rb +58 -0
- data/app/controllers/spree/stylesheets_controller.rb +15 -0
- data/app/helpers/spree/admin/navigation_helper_decorator.rb +9 -0
- data/app/helpers/spree/admin/stylesheet_helper.rb +9 -0
- data/app/models/spree/blank_stylesheet.rb +7 -0
- data/app/models/spree/stylesheet.rb +30 -0
- data/app/models/spree/stylesheet_version.rb +5 -0
- data/app/models/spree/user_decorator.rb +5 -0
- data/app/overrides/spree/admin/shared/_configuration_menu/add_dandify_to_admin_configuration_sidebar.html.erb.deface +2 -0
- data/app/overrides/spree/shared/_head/add_dandystyles_link.html.erb.deface +2 -0
- data/app/views/spree/admin/stylesheets/_form.html.erb +11 -0
- data/app/views/spree/admin/stylesheets/_versions.html.erb +32 -0
- data/app/views/spree/admin/stylesheets/edit.html.erb +19 -0
- data/app/views/spree/admin/stylesheets/new.html.erb +19 -0
- data/app/views/spree/admin/stylesheets/show.html.erb +23 -0
- data/app/views/spree/stylesheets/show.css.erb +1 -0
- data/config/locales/en.yml +37 -0
- data/config/routes.rb +9 -0
- data/config/spring.rb +1 -0
- data/db/migrate/20140616202617_create_spree_stylesheets.rb +10 -0
- data/db/migrate/20140617221725_add_paper_trail_versions.rb +13 -0
- data/lib/dandify.rb +7 -0
- data/lib/dandify/engine.rb +18 -0
- data/lib/dandify/version.rb +3 -0
- data/lib/generators/dandify/install/install_generator.rb +24 -0
- data/lib/tasks/dandify_tasks.rake +4 -0
- data/spec/controllers/spree/admin/stylesheets_controller_spec.rb +71 -0
- data/spec/controllers/spree/stylesheets_controller_spec.rb +36 -0
- data/spec/factories/stylesheet_factory.rb +5 -0
- data/spec/features/dandy_style_spec.rb +10 -0
- data/spec/features/managing_stylsheet_spec.rb +80 -0
- data/spec/features/sidebar_spec.rb +41 -0
- data/spec/features/viewing_admin_spec.rb +49 -0
- data/spec/helpers/admin/navigation_helper_spec.rb +14 -0
- data/spec/models/spree/blank_stylesheet_spec.rb +7 -0
- data/spec/models/spree/stylesheet_spec.rb +102 -0
- data/spec/spec_helper.rb +59 -0
- metadata +296 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 730fbffc3ec3adf78538bd7eb1b4230dedac95d2
|
4
|
+
data.tar.gz: 2bbdc174a33199b642b76acb2425d525c4384142
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 37c676843579698efc0f98cac2623a4fd3bc0270d0e6bda298ea625670d55002f3495ccb490c851eec0f096ff645fd48d36c3733d556ddf2ecc4791f9289aa8c
|
7
|
+
data.tar.gz: ec7ae8bef9ccef09f630b5303d539dca25e60bbf8188b0837152900960afcc1f9c86264de6fd632daf184439aed6e3b4285828b12bfd44d5091b4ea947f0c581
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 ground(ctrl)
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# Dandify
|
2
|
+
|
3
|
+
[![Code Climate](https://codeclimate.com/github/groundctrl/dandify.png)](https://codeclimate.com/github/groundctrl/dandify)
|
4
|
+
|
5
|
+
Dandify is not a theme. It is a theme helper that allows you to quickly apply versioned frontend style changes from the Spree admin. Dandify only works with stylesheets. Dandify is best used in conjunction with [Shopping Mall](https://github.com/groundctrl/shopping_mall).
|
6
|
+
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
#### Gem
|
11
|
+
|
12
|
+
Add this line to your Spree application's Gemfile:
|
13
|
+
|
14
|
+
gem 'dandify', github: 'groundctrl/dandify'
|
15
|
+
|
16
|
+
#### Bleeding edge
|
17
|
+
|
18
|
+
Add this line to your Spree application's Gemfile:
|
19
|
+
|
20
|
+
gem 'dandify', github: 'groundctrl/dandify', branch: 'master'
|
21
|
+
|
22
|
+
> Note: The master branch is not guaranteed to be in a fully functioning state. It is unwise to use this branch in a production system.
|
23
|
+
|
24
|
+
#### Generators
|
25
|
+
|
26
|
+
Run the bundle command to install it:
|
27
|
+
|
28
|
+
bundle install
|
29
|
+
|
30
|
+
After installing Dandify you'll need to run the generator:
|
31
|
+
|
32
|
+
bundle exec rails g dandify:install
|
33
|
+
|
34
|
+
|
35
|
+
## Testing
|
36
|
+
|
37
|
+
Generate a dummy application
|
38
|
+
|
39
|
+
bundle exec rake test_app
|
40
|
+
|
41
|
+
Running tests
|
42
|
+
|
43
|
+
bundle exec rake spec
|
44
|
+
|
45
|
+
|
46
|
+
## Contributing
|
47
|
+
|
48
|
+
1. Fork it ( https://github.com/groundctrl/dandify/fork )
|
49
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
50
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
51
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
52
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
require 'spree/testing_support/common_rake'
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new
|
8
|
+
|
9
|
+
task default: [:spec]
|
10
|
+
|
11
|
+
desc 'Generates a dummy app for testing'
|
12
|
+
task :test_app do
|
13
|
+
ENV['LIB_NAME'] = 'dandify'
|
14
|
+
Rake::Task['common:test_app'].invoke 'Spree::User'
|
15
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,42 @@
|
|
1
|
+
/* Icon rollover - Restore */
|
2
|
+
table th.actions .fa-history:hover,
|
3
|
+
table td.actions .fa-history:hover {
|
4
|
+
background-color: #9fc820;
|
5
|
+
color: #ffffff;
|
6
|
+
}
|
7
|
+
|
8
|
+
table tbody tr.highlight.action-restore td {
|
9
|
+
background-color: #f8fceb;
|
10
|
+
border-color: #e0f1a9;
|
11
|
+
}
|
12
|
+
|
13
|
+
table tbody tr.before-highlight.action-restore td {
|
14
|
+
border-bottom-color: #e0f1a9;
|
15
|
+
}
|
16
|
+
|
17
|
+
/* PowerTip - Restore */
|
18
|
+
#powerTip.restore {
|
19
|
+
background-color: #9fc820;
|
20
|
+
}
|
21
|
+
|
22
|
+
#powerTip.restore.n:before,
|
23
|
+
#powerTip.restore.ne:before,
|
24
|
+
#powerTip.restore.nw:before {
|
25
|
+
border-top-color: #9fc820;
|
26
|
+
}
|
27
|
+
|
28
|
+
#powerTip.restore.e:before,
|
29
|
+
#powerTip.restore.nw:before,
|
30
|
+
#powerTip.restore.sw:before {
|
31
|
+
border-right-color: #9fc820;
|
32
|
+
}
|
33
|
+
|
34
|
+
#powerTip.restore.s:before,
|
35
|
+
#powerTip.restore.se:before,
|
36
|
+
#powerTip.restore.sw:before {
|
37
|
+
border-bottom-color: #9fc820;
|
38
|
+
}
|
39
|
+
|
40
|
+
#powerTip.restore.w:before {
|
41
|
+
border-left-color: #9fc820;
|
42
|
+
}
|
File without changes
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
class StylesheetsController < BaseController
|
4
|
+
helper Spree::Admin::StylesheetHelper
|
5
|
+
|
6
|
+
respond_to :html
|
7
|
+
|
8
|
+
before_action :set_style
|
9
|
+
|
10
|
+
def create
|
11
|
+
update_action :new
|
12
|
+
end
|
13
|
+
|
14
|
+
def update
|
15
|
+
update_action :edit
|
16
|
+
end
|
17
|
+
|
18
|
+
def restore
|
19
|
+
response = rollback_version
|
20
|
+
|
21
|
+
redirect_to admin_stylesheets_path, flash: {
|
22
|
+
response => Spree.t("dandify.restore.#{response}")
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def rollback_version
|
29
|
+
@style.versions.last.reify.save!
|
30
|
+
:success
|
31
|
+
rescue
|
32
|
+
:error
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_action(type)
|
36
|
+
if @style.update(style_params)
|
37
|
+
redirect_to admin_stylesheets_path, flash: {
|
38
|
+
success: Spree.t("dandify.#{type}.success")
|
39
|
+
}
|
40
|
+
else
|
41
|
+
render type
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def set_style
|
46
|
+
@style = Spree::Stylesheet.first_or_initialize
|
47
|
+
end
|
48
|
+
|
49
|
+
def style_params
|
50
|
+
params.require(:stylesheet).permit(:style_raw)
|
51
|
+
end
|
52
|
+
|
53
|
+
def user_for_paper_trail
|
54
|
+
current_spree_user
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Spree
|
2
|
+
class StylesheetsController < Spree::StoreController
|
3
|
+
before_filter :set_response_format
|
4
|
+
|
5
|
+
def show
|
6
|
+
@style = Spree::Stylesheet.load_style
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def set_response_format
|
12
|
+
request.format = :css
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Spree::Admin::NavigationHelper.class_eval do
|
2
|
+
def link_to_restore_url(url, options = {})
|
3
|
+
name = options[:name] || Spree.t('dandify.restore.name')
|
4
|
+
options[:class] = 'restore-resource'
|
5
|
+
options[:data] = { confirm: Spree.t('dandify.confirm.restore'),
|
6
|
+
action: 'restore' }
|
7
|
+
link_to_with_icon('history', name, url, options)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Spree
|
2
|
+
class Stylesheet < ActiveRecord::Base
|
3
|
+
validates :style_raw, presence: true
|
4
|
+
validate :compilation
|
5
|
+
|
6
|
+
has_paper_trail only: [:style_raw],
|
7
|
+
class_name: 'Spree::StylesheetVersion'
|
8
|
+
|
9
|
+
def self.load_style
|
10
|
+
first || BlankStylesheet.new
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def compilation
|
16
|
+
self.style_compressed = rendered_sass
|
17
|
+
end
|
18
|
+
|
19
|
+
def sass_engine
|
20
|
+
Sass::Engine.new style_raw, syntax: :scss, style: :compressed
|
21
|
+
end
|
22
|
+
|
23
|
+
def rendered_sass
|
24
|
+
sass_engine.render
|
25
|
+
rescue => err
|
26
|
+
errors.add :style_raw, err.message
|
27
|
+
nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<div data-hook="admin_style_form_fields" class="row">
|
2
|
+
<div class="alpha twelve columns">
|
3
|
+
<div data-hook="admin_stylesheet_form_style_raw" class="field">
|
4
|
+
<%= f.field_container :style_raw do %>
|
5
|
+
<%= f.label :style_raw, raw(Spree.t('dandify.form.label') + content_tag(:span, ' *', class: 'required')) %>
|
6
|
+
<%= f.text_area :style_raw, rows: '13', class: 'fullwidth style_raw' %>
|
7
|
+
<br/><span class="info"><%= Spree.t('dandify.form.notes.sass') %></span>
|
8
|
+
<% end %>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
</div>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<table class="index responsive" id="listing_versions" data-hook="listing_style_versions">
|
2
|
+
<colgroup>
|
3
|
+
<col style="width: 22%;">
|
4
|
+
<col style="width: 60%;">
|
5
|
+
<col style="width: 10%;">
|
6
|
+
<col style="width: 8%;">
|
7
|
+
</colgroup>
|
8
|
+
<thead>
|
9
|
+
<tr data-hook="stylesheets_show_index_headers">
|
10
|
+
<th><%= Spree.t('dandify.show.headers.created_at') %></th>
|
11
|
+
<th><%= Spree.t('dandify.show.headers.author') %></th>
|
12
|
+
<th><%= Spree.t('dandify.show.headers.action') %></th>
|
13
|
+
<th data-hook="admin_stylesheets_show_header_actions" class="actions"></th>
|
14
|
+
</tr>
|
15
|
+
</thead>
|
16
|
+
<tbody>
|
17
|
+
<% versions.reverse.each_with_index do |version, index| %>
|
18
|
+
<tr data-hook="admin_stylesheets_show_rows" class="<%= cycle('odd', 'even') %>">
|
19
|
+
<td class="align-center"><%= version.created_at.to_date %></td>
|
20
|
+
<td><%= link_to(dandify_version_email(version.user), admin_user_path(version.whodunnit.to_i)) %></td>
|
21
|
+
<td><%= version.event.capitalize %></td>
|
22
|
+
<td class='actions align-center' data-hook="admin_stylesheets_show_row_actions">
|
23
|
+
<% if index == 0 %>
|
24
|
+
<%= link_to_edit_url edit_admin_stylesheets_path, title: 'admin_edit_stylesheet', no_text: true %>
|
25
|
+
<% elsif index == 1 %>
|
26
|
+
<%= link_to_restore_url restore_admin_stylesheets_path, title: 'admin_restore_stylesheet', no_text: true, method: :post %>
|
27
|
+
<% end %>
|
28
|
+
</td>
|
29
|
+
</tr>
|
30
|
+
<% end %>
|
31
|
+
</tbody>
|
32
|
+
</table>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<%= render 'spree/admin/shared/configuration_menu' %>
|
2
|
+
|
3
|
+
<% content_for :page_title do %>
|
4
|
+
<%= Spree.t('dandify.edit.title') %>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<%= render partial: 'spree/shared/error_messages', locals: {target: @style} %>
|
8
|
+
|
9
|
+
<%= form_for @style, url: admin_stylesheets_path do |f| %>
|
10
|
+
<fieldset data-hook="edit_style">
|
11
|
+
<legend align="center"><%= Spree.t('dandify.form.fieldset') %></legend>
|
12
|
+
<%= render partial: 'form', locals: {f: f} %>
|
13
|
+
<div class="form-buttons filter-actions actions" data-hook="buttons">
|
14
|
+
<%= button Spree.t('actions.update'), 'ok' %>
|
15
|
+
<span class="or"><%= Spree.t(:or) %></span>
|
16
|
+
<%= link_to_with_icon 'remove', Spree.t('actions.cancel'), admin_stylesheets_path, class: 'button' %>
|
17
|
+
</div>
|
18
|
+
</fieldset>
|
19
|
+
<% end %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<%= render 'spree/admin/shared/configuration_menu' %>
|
2
|
+
|
3
|
+
<% content_for :page_title do %>
|
4
|
+
<%= Spree.t('dandify.new.title') %>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<%= render partial: 'spree/shared/error_messages', locals: {target: @style} %>
|
8
|
+
|
9
|
+
<%= form_for @style, url: admin_stylesheets_path do |f| %>
|
10
|
+
<fieldset data-hook="new_style">
|
11
|
+
<legend align="center"><%= Spree.t('dandify.form.fieldset') %></legend>
|
12
|
+
<%= render partial: 'form', locals: {f: f} %>
|
13
|
+
<div class="form-buttons filter-actions actions" data-hook="buttons">
|
14
|
+
<%= button Spree.t('actions.create'), 'ok' %>
|
15
|
+
<span class="or"><%= Spree.t(:or) %></span>
|
16
|
+
<%= link_to_with_icon 'remove', Spree.t('actions.cancel'), admin_stylesheets_path, class: 'button' %>
|
17
|
+
</div>
|
18
|
+
</fieldset>
|
19
|
+
<% end %>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<%= render 'spree/admin/shared/configuration_menu' %>
|
2
|
+
|
3
|
+
<% content_for :page_title do %>
|
4
|
+
<%= Spree.t('dandify.show.title') %>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<% content_for :page_actions do %>
|
8
|
+
<li>
|
9
|
+
<% if @style.persisted? %>
|
10
|
+
<%= button_link_to Spree.t('dandify.show.buttons.edit'), edit_admin_stylesheets_path, icon: 'edit', id: 'admin_edit_stylesheet_link' %>
|
11
|
+
<% else %>
|
12
|
+
<%= button_link_to Spree.t('dandify.show.buttons.new'), new_admin_stylesheets_path, icon: 'plus', id: 'admin_new_stylesheet_link' %>
|
13
|
+
<% end %>
|
14
|
+
</li>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<p class="notice"><%= notice %></p>
|
18
|
+
|
19
|
+
<% if @style.persisted? %>
|
20
|
+
<%= render partial: 'versions', locals: { versions: @style.versions } %>
|
21
|
+
<% else %>
|
22
|
+
<%= Spree.t('dandify.show.none') %>
|
23
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= raw @style.style_compressed %>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
---
|
2
|
+
en:
|
3
|
+
activerecord:
|
4
|
+
attributes:
|
5
|
+
spree/stylesheet:
|
6
|
+
style_raw: Styles
|
7
|
+
spree:
|
8
|
+
dandify:
|
9
|
+
unknown: Unknown
|
10
|
+
sidebar: Store Stylesheet
|
11
|
+
show:
|
12
|
+
title: Custom Styles
|
13
|
+
buttons:
|
14
|
+
new: Create stylesheet
|
15
|
+
edit: Edit stylesheet
|
16
|
+
none: No custom style yet! Let's get dandy!
|
17
|
+
headers:
|
18
|
+
created_at: Created
|
19
|
+
author: Author
|
20
|
+
action: Action
|
21
|
+
new:
|
22
|
+
title: Creating Custom Styles
|
23
|
+
success: New stylesheet has been created.
|
24
|
+
edit:
|
25
|
+
title: Editing Custom Styles
|
26
|
+
success: Stylesheet has been updated. A new revision has been created.
|
27
|
+
restore:
|
28
|
+
name: Restore
|
29
|
+
success: Stylesheet has been restored. A new revision has been created.
|
30
|
+
error: Unable to restore stylesheet.
|
31
|
+
form:
|
32
|
+
fieldset: Stylesheet
|
33
|
+
label: Styles
|
34
|
+
notes:
|
35
|
+
sass: Stylesheets are compiled and minified using a CSS preprocessor. Valid SCSS can be used here.
|
36
|
+
confirm:
|
37
|
+
restore: Are you sure you want to restore this version of the stylesheet?
|