active_versioning_workflow 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c6ccbcef6a2ddf4cbbac736460c019d342ebf637
4
+ data.tar.gz: 7f648b388482f2481c5b1c086136de3f5b97242e
5
+ SHA512:
6
+ metadata.gz: f121626c87df06c944365fc4e06a81f9eb0632f2079b35c9f2bf1df17557063e2369f5b153f1273018c05013835a2bc3e27daa1534b1b6644364dcfa51fd5fd6
7
+ data.tar.gz: ad18878f2135250692f94ac247c0c143933c7fae5a526253350097c4523b0c41dc5e124cdd000abaeca897fa6d4ec2bd60bb2efdab4ed6af5d3ed9ef2c578e7a
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,170 @@
1
+ # ActiveVersioning Workflow
2
+
3
+ ActiveVersioning Workflow is an extension of ActiveVersioning that provides version workflow for ActiveAdmin-based CMSes.
4
+
5
+ ## Installation
6
+
7
+ ActiveVersioning Workflow is designed for ActiveAdmin, ActiveMaterial, and Rails 4.2+ applications, so ensure you have the following in your gemfile:
8
+ ```ruby
9
+ gem 'activeadmin', github: 'activeadmin'
10
+ gem 'devise' # Necessary if using standard ActiveAdmin configuration
11
+ gem 'active_material', git: 'git@github.com:vigetlabs/active_material.git'
12
+ ```
13
+ These should all be installed and configured as well.
14
+
15
+ Add this line to your application's Gemfile:
16
+ ```ruby
17
+ gem 'active_versioning_workflow', git: 'git@github.com:vigetlabs/active_versioning_workflow.git'
18
+ ```
19
+
20
+ And then execute:
21
+ ```
22
+ $ bundle install
23
+ $ rails generate active_versioning:workflow
24
+ $ bundle exec rake db:migrate
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ After installing all the necessary gems, there are a handful of things to do in order to get versioning workflow in place for an ActiveAdmin resource:
30
+
31
+ 1. Configure models for versioning
32
+ 2. Pull in necessary styles and javascript
33
+ 3. Add versioned routes to the routes file
34
+ 4. Include the workflow controller module to the ActiveAdmin resource
35
+ 5. Configure how versioned resources are displayed in ActiveAdmin
36
+ 6. Set up live preview (optional)
37
+
38
+ ### Configure Models for Versioning
39
+ First off, if you haven't already configured the models you'd like to have versioned, follow the steps in the [ActiveVersioning README](https://github.com/vigetlabs/active_versioning).
40
+
41
+ ### Require Stylesheets and Javascript
42
+ We'll need to pull in some CSS and JS for versioning to look and function correctly in ActiveAdmin.
43
+
44
+ In `app/assets/javascripts/active_admin.js.coffee`, add:
45
+ ```coffeescript
46
+ #= require active_versioning/workflow
47
+ ```
48
+
49
+ In `app/assets/stylesheets/active_admin.scss`, add the following after the other ActiveAdmin-related import statements:
50
+ ```scss
51
+ @import "active_versioning/workflow";
52
+ ```
53
+
54
+ ### Versioned Routes (using `ActiveVersioning::Workflow::Router`)
55
+ The generator for ActiveVersioning Workflow includes a router module that provides a `versioned_routes` method inside the main Rails routes block. It takes a list of underscored model names and generates version routes for each of the given models:
56
+ ```ruby
57
+ Rails.application.routes.draw do
58
+ self.class.send(:include, ActiveVersioning::Workflow::Router) # Inserted after running the generator
59
+ devise_for :admin_users, ActiveAdmin::Devise.config # Inserted by an ActiveAdmin install
60
+ ActiveAdmin.routes(self) # Inserted by an ActiveAdmin install
61
+
62
+ namespace :admin do
63
+ versioned_routes :posts
64
+
65
+ # If the Post model was namespaced -- something like Blog::Post -- you'd need to do the following based on how AA sets up routes:
66
+ versioned_routes :blog_posts
67
+ end
68
+ end
69
+ ```
70
+
71
+ In a fresh ActiveAdmin-based Rails app, this is what your routes file would look like in order to manage a versioned `Post` model in ActiveAdmin under the `:admin` namespace (default namespace for ActiveAdmin). If you have ActiveAdmin configured differently and are using different namespaces, you'll want to use `versioned_routes` in the appropriate context.
72
+
73
+ In this example, we'd get routes like `/admin/posts/1/versions` and `/admin/posts/1/versions/1`.
74
+
75
+ *Note: If you are using a different attribute for admin URLs (eg: slug or friendly_id), then you'll need to manually specify this in `app/admin/version.rb` after running the generator. Running with the Post example, that would look like so:*
76
+
77
+ ```ruby
78
+ ActiveAdmin.register Version do
79
+ # ...
80
+
81
+ controller do
82
+ # Override the finder option if all your versioned models use the same thing, like `finder: :find_by_slug!` for example.
83
+ ActiveVersioning.versioned_models.each do |model|
84
+ belongs_to model.name.underscore.gsub('/', '_').to_sym, class_name: model.name, polymorphic: true, finder: :find_by_id!
85
+ end
86
+
87
+ # Otherwise, either replace the above block or explicitly add a `belongs_to` statement for each non-standard model:
88
+ belongs_to :post, polymorphic: true, finder: :find_by_slug!
89
+
90
+ # ...
91
+ end
92
+ end
93
+ ```
94
+
95
+ ### Versioned Controller (using `ActiveVersioning::Workflow::Controller`)
96
+ Running with the example of a versioned `Post` model, we should have a file that registers the `Post` model with ActiveAdmin (generated with the `rails generate active_admin:resource Post` command and probably lives at `app/admin/post.rb`). At the top of the register block, include the controller module:
97
+ ```ruby
98
+ ActiveAdmin.register Post do
99
+ include ActiveVersioning::Workflow::Controller
100
+ end
101
+ ```
102
+
103
+ This adds the necessary actions to the admin controller for our resource so we can work with versions.
104
+
105
+ ### Versioned Form
106
+ Use the `draft_actions` method over the default `actions` method at the end of the form block:
107
+ ```ruby
108
+ ActiveAdmin.register Post do
109
+ include ActiveVersioning::Workflow::Controller
110
+
111
+ form do |f|
112
+ inputs do
113
+ input :title
114
+ input :body
115
+ end
116
+
117
+ draft_actions
118
+ end
119
+ end
120
+ ```
121
+
122
+ This pulls a label from `t('active_versioning.actions.draft')`, which is included in the generated locale file for ActiveVersioning Workflow. It defaults to "Save Draft".
123
+
124
+ ### Versioned Show Page
125
+ Finally, we'll want to configure the show page for our versioned resource. This is done in a similar style to the regular `show` block in ActiveAdmin, except that we'll use `show_version` and `version_attributes_panel`:
126
+ ```ruby
127
+ ActiveAdmin.register Post do
128
+ include ActiveVersioning::Workflow::Controller
129
+
130
+ permit_params :title, :body
131
+
132
+ show_version do |version|
133
+ version_attributes_panel(version) do
134
+ attributes_table_for(version) do
135
+ row :title
136
+ row :body
137
+ end
138
+ end
139
+ end
140
+ end
141
+ ```
142
+ When all is said and done, this will give us an awesome interface for version workflow in ActiveAdmin:
143
+ ![example](https://s3.amazonaws.com/f.cl.ly/items/2i2h1T1J0v2h0C2n0v3N/Screen%20Shot%202015-09-23%20at%203.15.32%20PM.png)
144
+
145
+ ### Live Preview
146
+ ActiveVersioning Workflow allows for some optional basic previewing functionality that leverages the non-admin controller for a resource. If you'd like to take advantage of previewing, here's how you'll want to set it up:
147
+ ```ruby
148
+ class PostsController < ApplicationController
149
+ extend ActiveVersioning::Workflow::Previewable
150
+
151
+ preview_resource :post
152
+
153
+ def show
154
+ end
155
+
156
+ private
157
+
158
+ def post
159
+ @post ||= Post.find(params[:id])
160
+ end
161
+ helper_method :post
162
+ end
163
+ ```
164
+
165
+ The `extend` adds the necessary functionality and `preview_resource` class method to the controller. Previewing only works for show pages where there's a single resource to preview, so you'll need a `show` method (and the corresponding route in your routes file) and then point the `preview_resource` at the reader method for the versioned resource.
166
+
167
+ In the ActiveAdmin draft panel, you'll see an extra preview button:
168
+ ![preview](https://s3.amazonaws.com/f.cl.ly/items/1a3E1I0N3G36211k3m3t/Screen%20Shot%202015-09-24%20at%209.15.47%20AM.png)
169
+
170
+ This will open a new window with our `PostsController#show` rendered out with the current draft version of our post.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'active_versioning/workflow/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = "active_versioning_workflow"
10
+ spec.version = ActiveVersioning::Workflow::VERSION
11
+ spec.authors = ["Ryan Stenberg"]
12
+ spec.email = ["ryan.stenberg@viget.com"]
13
+
14
+ spec.summary = "An ActiveVersioning Extension for Version Workflow in ActiveAdmin"
15
+ spec.description = "ActiveVersioning Workflow provides the tools necessary for version workflow in ActiveAdmin."
16
+ spec.homepage = "https://github.com/vigetlabs/active_versioning_workflow"
17
+ spec.license = "BSD"
18
+
19
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_path = ['lib']
23
+
24
+ spec.add_dependency "active_versioning", "~> 1.0.0"
25
+
26
+ spec.add_development_dependency "bundler", ">= 1.10"
27
+ spec.add_development_dependency "rake", ">= 10.0"
28
+ spec.add_development_dependency "rspec"
29
+ spec.add_development_dependency "pry"
30
+ spec.add_development_dependency "generator_spec"
31
+ end
@@ -0,0 +1,13 @@
1
+ $(function() {
2
+ $('a.commit-link').on('click', function(e) {
3
+ e.preventDefault();
4
+
5
+ $('.commit-draft').slideDown();
6
+ });
7
+
8
+ $('a.cancel-commit').on('click', function(e) {
9
+ e.preventDefault();
10
+
11
+ $('.commit-draft').slideUp();
12
+ });
13
+ });
@@ -0,0 +1,96 @@
1
+ /**
2
+ * ActiveVersioning Workflow Styles
3
+ * A two-abreast display of a current version and draft version
4
+ *
5
+ * Dependent upon ActiveMaterial.
6
+ */
7
+
8
+ .column {
9
+ float: left;
10
+ }
11
+
12
+ .committed-version-column,
13
+ .current-draft-column {
14
+ margin-bottom: grid(4);
15
+
16
+ .panel_contents {
17
+ border-top: 1px solid $theme-divider;
18
+ }
19
+ }
20
+
21
+ .header_action {
22
+ padding: 0 10px;
23
+
24
+ a,
25
+ a:hover {
26
+ text-decoration: none;
27
+ }
28
+
29
+ a.commit-link {
30
+ color: $theme-accent;
31
+
32
+ &:before {
33
+ content: '\02713';
34
+ padding-right: 5px;
35
+ }
36
+ }
37
+
38
+ a.edit-link {
39
+ color: $theme-primary;
40
+
41
+ &:before {
42
+ content: '\0270E';
43
+ padding-right: 5px;
44
+ }
45
+ }
46
+
47
+ a.preview-link {
48
+ color: $theme-primary;
49
+
50
+ &:before {
51
+ content: '\026B2';
52
+ display: inline-block;
53
+ transform: translate(0, 2px) rotate(45deg);
54
+ padding-right: 8px;
55
+ }
56
+ }
57
+
58
+ a.discard-link {
59
+ color: $theme-error;
60
+
61
+ &:before {
62
+ content: '\02716';
63
+ padding-right: 5px;
64
+ }
65
+ }
66
+ }
67
+
68
+ .commit-draft {
69
+ display: none;
70
+ padding: 10px 15px;
71
+
72
+ .input.string {
73
+ padding: 0;
74
+ }
75
+
76
+ input[type=text] {
77
+ width: calc(100% - 22px);
78
+ }
79
+
80
+ a.cancel-commit {
81
+ font-size: 1em;
82
+ padding: 7px 16px 6px;
83
+ }
84
+
85
+ p {
86
+ margin-bottom: 1em;
87
+ }
88
+
89
+ .inline-hints {
90
+ color: #666;
91
+ font-size: 0.95em;
92
+ font-style: italic;
93
+ font-weight: normal;
94
+ line-height: 1.5;
95
+ }
96
+ }
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "active_versioning_workflow"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/circle.yml ADDED
@@ -0,0 +1,6 @@
1
+ database:
2
+ override:
3
+ - echo "No database setup necessary."
4
+ dependencies:
5
+ pre:
6
+ - gem install bundler --pre
@@ -0,0 +1,15 @@
1
+ require 'active_versioning'
2
+ require 'active_versioning/workflow/engine'
3
+ require 'generators/active_versioning/workflow_generator'
4
+
5
+ module ActiveVersioning
6
+ module Workflow
7
+ autoload :Controller, 'active_versioning/workflow/controller'
8
+ autoload :DraftActions, 'active_versioning/workflow/draft_actions'
9
+ autoload :DSL, 'active_versioning/workflow/dsl'
10
+ autoload :Previewable, 'active_versioning/workflow/previewable'
11
+ autoload :Router, 'active_versioning/workflow/router'
12
+ autoload :ShowResource, 'active_versioning/workflow/show_resource'
13
+ autoload :ShowVersion, 'active_versioning/workflow/show_version'
14
+ end
15
+ end
@@ -0,0 +1,78 @@
1
+ module ActiveVersioning
2
+ module Workflow
3
+ module Controller
4
+ def self.included(dsl)
5
+ dsl.instance_eval do
6
+ member_action :commit, method: :put do
7
+ if resource.commit(commit_params)
8
+ # We need to reload the resource by ID, in case the resource uses
9
+ # something other than id for the param and it has changed
10
+ set_resource_ivar(resource.class.find(resource.id))
11
+
12
+ redirect_to resource_path, notice: I18n.t('active_versioning.notices.commit')
13
+ else
14
+ # FIXME: In what ways can this fail?
15
+ #:nocov:
16
+ redirect_to resource_path, alert: I18n.t('active_versioning.errors.commit')
17
+ #:nocov:
18
+ end
19
+ end
20
+
21
+ member_action :create_draft, method: :post do
22
+ if resource.create_draft_from_version(params[:version_id])
23
+ redirect_to edit_resource_path,
24
+ notice: I18n.t('active_versioning.notices.create_draft_from_version')
25
+ else
26
+ # FIXME: In what ways can this fail?
27
+ #:nocov:
28
+ redirect_to [active_admin_namespace.name, resource, :versions],
29
+ alert: I18n.t('active_versioning.errors.create_draft_from_version')
30
+ #:nocov:
31
+ end
32
+ end
33
+
34
+ member_action :discard_draft, method: :delete do
35
+ resource.destroy_draft
36
+ redirect_to resource_path, notice: I18n.t('active_versioning.notices.discard_draft')
37
+ end
38
+
39
+ controller do
40
+ before_action :assign_version_params, only: [:create, :update]
41
+ before_action :set_draft_as_resource, only: [:edit, :update, :commit, :preview]
42
+
43
+ private
44
+
45
+ def renderer_for(action)
46
+ if action == :show
47
+ ShowResource
48
+ else
49
+ super
50
+ end
51
+ end
52
+
53
+ # `resource_params` is an Array where the first element is the permitted
54
+ # params and the next element is a role. These params are splatted into a
55
+ # build method within Inherited Resources -- a remnant of Rails 3
56
+ # `attr_accessible` method. This method will modify that first parameter
57
+ # by merging in the version author.
58
+ def assign_version_params
59
+ resource_params.first.merge!(version_author: committer)
60
+ end
61
+
62
+ def set_draft_as_resource
63
+ set_resource_ivar(resource.current_draft)
64
+ end
65
+
66
+ def committer
67
+ current_admin_user.email
68
+ end
69
+
70
+ def commit_params
71
+ params.permit(:commit_message).merge(committer: committer)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,16 @@
1
+ module ActiveVersioning
2
+ module Workflow
3
+ module DraftActions
4
+ def draft_actions
5
+ if object.new_record?
6
+ actions
7
+ else
8
+ actions do
9
+ action :submit, label: :draft
10
+ cancel_link
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ module ActiveVersioning
2
+ module Workflow
3
+ module DSL
4
+ def show_version(options = {}, &block)
5
+ config.set_page_presenter :show_version, ::ActiveAdmin::PagePresenter.new(options, &block)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module ActiveVersioning
2
+ module Workflow
3
+ class Engine < ::Rails::Engine
4
+ isolate_namespace ActiveVersioning
5
+
6
+ engine_name 'active_versioning_workflow'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,31 @@
1
+ module ActiveVersioning
2
+ module Workflow
3
+ module Previewable
4
+ KEY = :_preview
5
+
6
+ def self.extended(base)
7
+ base.cattr_reader :_previewable_resource_method
8
+
9
+ base.include InstanceMethods
10
+ end
11
+
12
+ def preview_resource(resource_method)
13
+ class_variable_set(:@@_previewable_resource_method, resource_method)
14
+
15
+ before_action :use_draft_as_resource, only: :show, if: :previewing?
16
+ end
17
+
18
+ module InstanceMethods
19
+ private
20
+
21
+ def use_draft_as_resource
22
+ instance_variable_set("@#{_previewable_resource_method}", send(_previewable_resource_method).current_draft)
23
+ end
24
+
25
+ def previewing?
26
+ params.has_key?(KEY)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,13 @@
1
+ module ActiveVersioning
2
+ module Workflow
3
+ module Router
4
+ def versioned_routes(*models)
5
+ models.each do |name|
6
+ resources name.to_sym, only: [] do
7
+ resources :versions, only: [:index, :show]
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,128 @@
1
+ module ActiveVersioning
2
+ module Workflow
3
+ class ShowResource < ::ActiveAdmin::Views::Pages::Show
4
+ def main_content
5
+ instance_exec(resource, &show_block)
6
+ end
7
+
8
+ def version_attributes_panel(version, &block)
9
+ args = if version.live?
10
+ [I18n.t('active_versioning.panels.committed_version'), id: 'committed-panel']
11
+ else
12
+ [I18n.t('active_versioning.panels.current_draft'), id: 'current-draft-panel']
13
+ end
14
+
15
+ panel(*args) do
16
+ if version.live?
17
+ header_action(versions_link)
18
+ else
19
+ header_action(discard_link)
20
+ header_action(commit_link)
21
+ header_action(preview_link)
22
+ header_action(edit_link)
23
+
24
+ render 'commit_form'
25
+ end
26
+
27
+ instance_eval(&block)
28
+ end
29
+ end
30
+
31
+ def committed_version_panels
32
+ instance_exec(resource, &version_block)
33
+ end
34
+
35
+ def current_draft_panels
36
+ if resource.current_draft?
37
+ instance_exec(resource.current_draft, &version_block)
38
+ else
39
+ blank_slate(draft_blank_slate_content)
40
+ end
41
+ end
42
+
43
+ def committed_version_column
44
+ column class: 'committed-version-column column' do
45
+ committed_version_panels
46
+ end
47
+ end
48
+
49
+ def current_draft_column
50
+ column class: 'current-draft-column column' do
51
+ current_draft_panels
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def show_block
58
+ config.block || default_show_block
59
+ end
60
+
61
+ def version_config
62
+ active_admin_config.get_page_presenter(:show_version)
63
+ end
64
+
65
+ def version_block
66
+ version_config.block
67
+ end
68
+
69
+ #:nocov:
70
+ def default_show_block
71
+ proc do
72
+ columns do
73
+ committed_version_column
74
+
75
+ current_draft_column
76
+ end
77
+ end
78
+ end
79
+ #:nocov:
80
+
81
+ def draft_blank_slate_content
82
+ [
83
+ I18n.t('active_versioning.helpers.blank_slate'),
84
+ draft_blank_slate_link
85
+ ].compact.join(' ')
86
+ end
87
+
88
+ def draft_blank_slate_link
89
+ link_to I18n.t('active_versioning.links.blank_slate'), [:edit, active_admin_namespace.name, resource]
90
+ end
91
+
92
+ def versions_link
93
+ link_to I18n.t('active_versioning.links.view_versions'), [active_admin_namespace.name, resource, :versions]
94
+ end
95
+
96
+ def commit_link
97
+ link_to I18n.t('active_versioning.links.commit'), '#', class: 'commit-link'
98
+ end
99
+
100
+ def edit_link
101
+ link_to I18n.t('active_versioning.links.edit'), [:edit, active_admin_namespace.name, resource], class: 'edit-link'
102
+ end
103
+
104
+ def preview_controller
105
+ @preview_controller ||= "#{resource_class.to_s.pluralize}Controller".safe_constantize
106
+ end
107
+
108
+ def preview_link
109
+ unless preview_controller && preview_controller.singleton_class.ancestors.include?(ActiveVersioning::Workflow::Previewable)
110
+ return ''
111
+ end
112
+
113
+ link_to I18n.t('active_versioning.links.preview'), polymorphic_url(resource, _preview: true), {
114
+ class: 'preview-link',
115
+ target: :blank
116
+ }
117
+ end
118
+
119
+ def discard_link
120
+ link_to I18n.t('active_versioning.links.discard_draft'), [:discard_draft, active_admin_namespace.name, resource], {
121
+ class: 'discard-link',
122
+ method: :delete,
123
+ data: { confirm: I18n.t('active_versioning.confirmations.discard_draft') }
124
+ }
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,51 @@
1
+ module ActiveVersioning
2
+ module Workflow
3
+ class ShowVersion < ::ActiveAdmin::Views::Pages::Show
4
+ def main_content
5
+ instance_exec(version, &show_block)
6
+ end
7
+
8
+ def version_attributes_panel(version, &block)
9
+ panel I18n.t('active_admin.details', model: resource_config.resource_label) do
10
+ instance_eval(&block)
11
+ end
12
+ end
13
+
14
+ def version_details_panel
15
+ panel I18n.t('active_admin.details', model: Version.model_name.human) do
16
+ attributes_table_for(resource) do
17
+ row 'Responsible for Change', &:committer
18
+ row :commit_message
19
+ row :committed_at
20
+ end
21
+ end
22
+ end
23
+
24
+ def versioned_resource
25
+ @versioned_resource ||= resource.reify
26
+ end
27
+
28
+ private
29
+
30
+ def show_block
31
+ config.block || default_show_block
32
+ end
33
+
34
+ def default_show_block
35
+ proc do
36
+ instance_exec(versioned_resource, &version_block)
37
+
38
+ version_details_panel
39
+ end
40
+ end
41
+
42
+ def resource_config
43
+ active_admin_namespace.resource_for(versioned_resource.class)
44
+ end
45
+
46
+ def version_block
47
+ resource_config.get_page_presenter(:show_version).block
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ module ActiveVersioning
2
+ module Workflow
3
+ VERSION = '1.0.0'
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ require 'active_versioning/workflow'
@@ -0,0 +1,45 @@
1
+ ActiveAdmin.register Version do
2
+ config.sort_order = 'committed_at_desc'
3
+ config.batch_actions = false
4
+
5
+ navigation_menu :default
6
+
7
+ menu false
8
+
9
+ actions :index, :show
10
+
11
+ filter :committer_cont, label: 'Committer'
12
+ filter :commit_message_cont, label: 'Commit Message'
13
+ filter :committed_at
14
+
15
+ index download_links: false do
16
+ column :committed_at
17
+ column :committer, sortable: false
18
+ column :commit_message, sortable: false
19
+
20
+ actions do |version|
21
+ link_to t('active_versioning.links.create_draft_from_version'),
22
+ [:create_draft, active_admin_namespace.name, version.versionable, { version_id: version }],
23
+ method: :post,
24
+ data: { confirm: t('active_versioning.confirmations.create_draft_from_version') }
25
+ end
26
+ end
27
+
28
+ show title: :to_s
29
+
30
+ controller do
31
+ ActiveVersioning.versioned_models.each do |model|
32
+ belongs_to model.name.underscore.gsub('/', '_').to_sym, class_name: model.name, polymorphic: true, finder: :find_by_id!
33
+ end
34
+
35
+ private
36
+
37
+ def renderer_for(action)
38
+ if action == :show
39
+ ActiveVersioning::Workflow::ShowVersion
40
+ else
41
+ super
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ <div class="commit-draft">
2
+ <%= form_tag [:commit, :admin, resource], method: :put do %>
3
+ <p class="input string">
4
+ <%= text_field_tag :commit_message, params[:commit_message], placeholder: t('active_versioning.placeholders.commit') %>
5
+ </p>
6
+
7
+ <p>
8
+ <%= submit_tag 'Commit' %>
9
+ <%= link_to 'Cancel', '#', class: 'table_tools_button cancel-commit' %>
10
+ </p>
11
+
12
+ <p class="inline-hints">
13
+ <%= t('active_versioning.helpers.commit') %>
14
+ </p>
15
+ <% end %>
16
+ <hr>
17
+ </div>
@@ -0,0 +1,4 @@
1
+ require 'active_versioning/workflow'
2
+
3
+ ActiveAdmin::ResourceDSL.send(:include, ActiveVersioning::Workflow::DSL)
4
+ ActiveAdmin::Views::ActiveAdminForm.send(:include, ActiveVersioning::Workflow::DraftActions)
@@ -0,0 +1,31 @@
1
+ en:
2
+ active_versioning:
3
+ actions:
4
+ draft: 'Save Draft'
5
+ confirmations:
6
+ create_draft_from_version: 'Are you sure you wish to create a draft from this version?'
7
+ discard_draft: 'Are you sure you want to discard this draft?'
8
+ errors:
9
+ commit: 'An error occurred while committing.'
10
+ create_draft_from_version: 'An error occurred while restoring this version.'
11
+ helpers:
12
+ blank_slate: "This resource doesn't have a draft."
13
+ commit: 'Committing this draft will overwrite the attributes in the committed version. If the committed version is published, then the changes will be reflected on the live site.'
14
+ links:
15
+ blank_slate: 'Create one.'
16
+ commit: 'Commit'
17
+ create_draft_from_version: 'Create Draft'
18
+ discard_draft: 'Discard'
19
+ edit: 'Edit'
20
+ preview: 'Preview'
21
+ view_versions: 'View Versions'
22
+ not_versioned: '%{model} are not versioned. Any changes you make will appear on the site immediately.'
23
+ notices:
24
+ commit: 'Committed!'
25
+ create_draft_from_version: 'Versioning successfully restored.'
26
+ discard_draft: 'Draft successfully discarded.'
27
+ panels:
28
+ committed_version: 'Committed Version'
29
+ current_draft: 'Current Draft'
30
+ placeholders:
31
+ commit: 'Enter a note about what changed.'
@@ -0,0 +1,35 @@
1
+ require 'rails/generators'
2
+
3
+ module ActiveVersioning
4
+ class WorkflowGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+
7
+ def install_active_versioning
8
+ InstallGenerator.new.tap do |generator|
9
+ generator.destination_root = destination_root
10
+ generator.install_models
11
+ generator.install_migrations
12
+ end
13
+ end
14
+
15
+ def install_initializers
16
+ copy_file 'initializers/active_versioning_workflow.rb', 'config/initializers/active_versioning_workflow.rb'
17
+ end
18
+
19
+ def install_router
20
+ route 'self.class.send(:include, ActiveVersioning::Workflow::Router)'
21
+ end
22
+
23
+ def install_locales
24
+ copy_file 'locales/active_versioning.en.yml', 'config/locales/active_versioning.en.yml'
25
+ end
26
+
27
+ def install_active_admin_resources
28
+ copy_file 'active_admin_resources/version.rb', 'app/admin/version.rb'
29
+ end
30
+
31
+ def install_active_admin_views
32
+ copy_file 'active_admin_views/_commit_form.html.erb', 'app/views/active_admin/resource/_commit_form.html.erb'
33
+ end
34
+ end
35
+ end
metadata ADDED
@@ -0,0 +1,156 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_versioning_workflow
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Stenberg
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-09-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: active_versioning
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '1.10'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '1.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: generator_spec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: ActiveVersioning Workflow provides the tools necessary for version workflow
98
+ in ActiveAdmin.
99
+ email:
100
+ - ryan.stenberg@viget.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - Gemfile
108
+ - README.md
109
+ - Rakefile
110
+ - active_versioning_workflow.gemspec
111
+ - app/assets/javascripts/active_versioning/workflow.js
112
+ - app/assets/stylesheets/active_versioning/workflow.scss
113
+ - bin/console
114
+ - bin/setup
115
+ - circle.yml
116
+ - lib/active_versioning/workflow.rb
117
+ - lib/active_versioning/workflow/controller.rb
118
+ - lib/active_versioning/workflow/draft_actions.rb
119
+ - lib/active_versioning/workflow/dsl.rb
120
+ - lib/active_versioning/workflow/engine.rb
121
+ - lib/active_versioning/workflow/previewable.rb
122
+ - lib/active_versioning/workflow/router.rb
123
+ - lib/active_versioning/workflow/show_resource.rb
124
+ - lib/active_versioning/workflow/show_version.rb
125
+ - lib/active_versioning/workflow/version.rb
126
+ - lib/active_versioning_workflow.rb
127
+ - lib/generators/active_versioning/templates/active_admin_resources/version.rb
128
+ - lib/generators/active_versioning/templates/active_admin_views/_commit_form.html.erb
129
+ - lib/generators/active_versioning/templates/initializers/active_versioning_workflow.rb
130
+ - lib/generators/active_versioning/templates/locales/active_versioning.en.yml
131
+ - lib/generators/active_versioning/workflow_generator.rb
132
+ homepage: https://github.com/vigetlabs/active_versioning_workflow
133
+ licenses:
134
+ - BSD
135
+ metadata: {}
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubyforge_project:
152
+ rubygems_version: 2.5.1
153
+ signing_key:
154
+ specification_version: 4
155
+ summary: An ActiveVersioning Extension for Version Workflow in ActiveAdmin
156
+ test_files: []