adminable 0.0.3 → 0.0.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ed7d5e6b53555c9173e58a2428193fc82e2169d2
4
- data.tar.gz: 1526f33a3846f594823bed6daa75122ad21cb4be
3
+ metadata.gz: a219dbfca42335cddb071f1e9d2f24a08bb22992
4
+ data.tar.gz: 4be60a789135b4f404aa268b440bdd88a1705bac
5
5
  SHA512:
6
- metadata.gz: f9341f2b025e57567837f4681270f62dc6a5bd45b58cd6f21f8ea652d8a1a823cca842e51747efa9cbfcb932f1e0d98ef1e857f388118e107d4db9dd0d45e04e
7
- data.tar.gz: fc5d3ccd581223b2827ce54759b9079e4cbc88b80330fd00de115c19d8ce2b7416d1a820a5480c0fb16b518110109564305942550249f63b14e943b075e6829b
6
+ metadata.gz: c9fc788109f641c6c626af0e5e63d822a119b0a8ffca8e5e2359ff0907daea3bd830158174d7f12f4c502852f5b56ef6b98721806080bd08dcff5a0dd2159fb2
7
+ data.tar.gz: ef331388d6bd326f84c82d9736001cce5f7af8c7f69093d297578f9b5f5d7f1e837dcfe5e11b27fd6849c7fa38471ec37b3853b6fa78947d32f3f929b86da174
data/README.md CHANGED
@@ -85,10 +85,10 @@ You can update attributes with simple DSL inside `set_attributes` block:
85
85
 
86
86
  ##### Attributes Parameters
87
87
 
88
- * `index` - *(true/false)* - Shows attribute on index page.
89
- * `form` - *(true/false)* - Shows attribute on new/edit page.
90
- * `center` - *(true/false)* - Adds `text-align: center` for attribute value on index page.
91
- * `search` - *(true/false)* - Enables search for this attribute.
88
+ * `index` - (`true` or `false`) - Shows attribute on index page.
89
+ * `form` - (`true` or `false`) - Shows attribute on new/edit page.
90
+ * `center` - (`true` or `false`) - Adds `text-align: center` for attribute value on index page.
91
+ * `search` - (`true` or `false`) - Enables search for this attribute.
92
92
 
93
93
  ##### Examples
94
94
 
@@ -139,6 +139,16 @@ List of attributes with default parameters.
139
139
  | Belongs To | | + | | |
140
140
  | Has Many | | + | | |
141
141
 
142
+ ## Generating Partials
143
+
144
+ You can use generator to copy original partial to your application.
145
+
146
+ `rails g adminable:partial [layout] [type] [resource]`
147
+
148
+ * `layout` - `index` or `form`.
149
+ * `type` - `string`, `text` etc. See [Built-in Attributes](#built-in-attributes).
150
+ * `resource` - Use controller name (e.g. `users`) to replace partial only for single controller or leave blank to replace partials for all controllers.
151
+
142
152
  ## Contributing
143
153
 
144
154
  1. Fork it (https://github.com/droptheplot/adminable/fork)
@@ -1,7 +1,9 @@
1
1
  module Adminable
2
2
  class ResourcesController < ApplicationController
3
3
  def initialize(*)
4
- @resource = Adminable::Configuration.find_resource(resource_model)
4
+ @resource = Adminable::Configuration.resources.find do |resource|
5
+ resource == Adminable::Resource.new(resource_model_name)
6
+ end
5
7
 
6
8
  super
7
9
  end
@@ -11,7 +13,8 @@ module Adminable
11
13
  before_action do
12
14
  append_view_path(
13
15
  [
14
- Adminable::Engine.root.join('app/views/adminable', controller_name),
16
+ Rails.root.join('app/views', controller_path),
17
+ Rails.root.join('app/views/adminable/resources'),
15
18
  Adminable::Engine.root.join('app/views/adminable/resources')
16
19
  ]
17
20
  )
@@ -19,7 +22,7 @@ module Adminable
19
22
 
20
23
  def index
21
24
  @q = @resource.model.ransack(params[:q])
22
- @entries = Adminable::EntriesPresenter.new(
25
+ @entries = Adminable::Presenters::Entries.new(
23
26
  @q.result.includes(*@resource.includes).order(id: :desc)
24
27
  .page(params[:page]).per(25)
25
28
  )
@@ -100,12 +103,12 @@ module Adminable
100
103
  private
101
104
 
102
105
  def set_entry
103
- @entry = Adminable::EntryPresenter.new(
106
+ @entry = Adminable::Presenters::Entry.new(
104
107
  @resource.model.find(params[:id])
105
108
  )
106
109
  end
107
110
 
108
- def resource_model
111
+ def resource_model_name
109
112
  controller_path.sub(%r{^adminable/}, '')
110
113
  end
111
114
 
@@ -2,12 +2,10 @@
2
2
  = hidden_field_tag "#{@resource.model.model_name.param_key}[#{attribute.key}]", nil
3
3
  #clusterizeScrollArea.clusterize-scroll.associations
4
4
  #clusterizeContentArea.clusterize-content
5
- - attribute.association.all.each do |association_entry|
5
+ - attribute.association.entries.each do |association_entry|
6
6
  .association
7
7
  %label.c-input.c-radio.m-a-0
8
8
  = radio_button_tag "#{@resource.model.model_name.param_key}[#{attribute.key}]",
9
9
  association_entry.id, entry.send(attribute.key) == association_entry.id
10
10
  %span.c-indicator
11
- = link_to association_entry.to_name,
12
- edit_polymorphic_path(association_entry),
13
- target: '_blank'
11
+ = association_entry.link_to_self
@@ -2,7 +2,7 @@
2
2
  = hidden_field_tag "#{@resource.model.model_name.param_key}[#{attribute.key}][]", nil
3
3
  #clusterizeScrollArea.clusterize-scroll.associations
4
4
  #clusterizeContentArea.clusterize-content
5
- - attribute.association.all.each do |association_entry|
5
+ - attribute.association.entries.each do |association_entry|
6
6
  .association
7
7
  %label.c-input.c-checkbox.m-a-0
8
8
  = check_box_tag "#{@resource.model.model_name.param_key}[#{attribute.key}][]",
@@ -19,7 +19,7 @@
19
19
  - @resource.attributes.index.each do |attribute|
20
20
  %td{ :class => ('text-md-center' if attribute.options[:center]) }
21
21
  = render attribute.index_partial_path, entry: entry,
22
- attribute: attribute, value: entry[attribute.key]
22
+ attribute: attribute, value: entry.public_send(attribute.name)
23
23
  %td.text-nowrap.text-md-right
24
24
  = entry.link_to_edit_small
25
25
  = entry.link_to_delete_small
@@ -1,4 +1,2 @@
1
- - if entry.public_send(attribute.name)
2
- = Adminable::EntryPresenter.new(entry.public_send(attribute.name)).link_to_self
3
- - else
4
- = "##{value}"
1
+ - if value
2
+ = Adminable::Presenters::Entry.new(value).link_to_self
@@ -1,2 +1,2 @@
1
- - if entry
2
- = Adminable::EntriesPresenter.new(entry.public_send(attribute.name)).to_s
1
+ - if value
2
+ = Adminable::Presenters::Entries.new(value).to_s
@@ -4,9 +4,9 @@ require 'adminable/errors'
4
4
 
5
5
  require 'adminable/resource'
6
6
 
7
- require 'adminable/presenters/base_presenter'
8
- require 'adminable/presenters/entry_presenter'
9
- require 'adminable/presenters/entries_presenter'
7
+ require 'adminable/presenters/base'
8
+ require 'adminable/presenters/entry'
9
+ require 'adminable/presenters/entries'
10
10
 
11
11
  require 'adminable/attributes/collection'
12
12
  require 'adminable/attributes/association'
@@ -1,13 +1,13 @@
1
1
  module Adminable
2
2
  module Attributes
3
3
  class Association
4
- attr_reader :reflection, :model, :all
4
+ attr_reader :reflection, :model, :entries
5
5
 
6
6
  # @param reflection [Object] ActiveRecord::Reflection::HasManyReflection
7
7
  def initialize(reflection)
8
8
  @reflection = reflection
9
9
  @model = @reflection.klass
10
- @all = Adminable::EntriesPresenter.new(@model)
10
+ @entries = Adminable::Presenters::Entries.new(@model)
11
11
  end
12
12
  end
13
13
  end
@@ -40,7 +40,7 @@ module Adminable
40
40
  end
41
41
 
42
42
  def form_partial_path
43
- "adminable/resources/form/#{type}"
43
+ "form/#{type}"
44
44
  end
45
45
 
46
46
  private
@@ -12,10 +12,6 @@ module Adminable
12
12
  end
13
13
  end
14
14
 
15
- def self.find_resource(name)
16
- resources.find { |resource| resource.name == name }
17
- end
18
-
19
15
  def self.resources_paths
20
16
  Dir[Rails.root.join('app/controllers/adminable/**/*_controller.rb')]
21
17
  .reject { |f| f['app/controllers/adminable/application_controller.rb'] }
@@ -0,0 +1,13 @@
1
+ module Adminable
2
+ module Presenters
3
+ class Base
4
+ include Adminable::Engine.routes.url_helpers
5
+
6
+ private
7
+
8
+ def view
9
+ ActionController::Base.helpers
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,57 @@
1
+ module Adminable
2
+ module Presenters
3
+ class Entries < Base
4
+ ENTRIES_LIMIT = 5
5
+
6
+ include Enumerable
7
+ extend Forwardable
8
+
9
+ def_delegators :@collection, :each, :first, :last, :empty?
10
+ def_delegators(
11
+ *%i(
12
+ @relation
13
+ current_page
14
+ total_pages
15
+ limit_value
16
+ entry_name
17
+ total_count
18
+ offset_value
19
+ last_page?
20
+ )
21
+ )
22
+
23
+ def initialize(relation)
24
+ @relation = relation
25
+ @collection = relation.all.map do |entry|
26
+ Adminable::Presenters::Entry.new(entry)
27
+ end
28
+ end
29
+
30
+ def to_s
31
+ string = collection.first(ENTRIES_LIMIT).map do |entry|
32
+ view.link_to(entry.to_name, edit_polymorphic_path(entry))
33
+ end
34
+
35
+ string << and_more_tag if collection_size_residue > 0
36
+
37
+ string.join(', ').html_safe
38
+ end
39
+
40
+ private
41
+
42
+ attr_accessor :relation, :collection
43
+
44
+ def collection_size_residue
45
+ @collection_residue ||= collection.size - ENTRIES_LIMIT
46
+ end
47
+
48
+ def and_more_tag
49
+ view.content_tag(
50
+ :span,
51
+ I18n.t('adminable.ui.and_more', size: collection_size_residue),
52
+ class: 'text-muted'
53
+ )
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,81 @@
1
+ module Adminable
2
+ module Presenters
3
+ class Entry < Base
4
+ def initialize(entry)
5
+ @entry = entry
6
+ end
7
+
8
+ def to_name
9
+ %i(name title email login id).each do |method_name|
10
+ begin
11
+ return entry.public_send(method_name)
12
+ rescue NoMethodError
13
+ next
14
+ end
15
+ end
16
+ end
17
+
18
+ def link_to_self
19
+ return to_name unless resource
20
+
21
+ view.link_to(
22
+ to_name,
23
+ edit_polymorphic_path(entry),
24
+ target: '_blank'
25
+ )
26
+ end
27
+
28
+ def link_to_delete
29
+ view.link_to(
30
+ I18n.t('adminable.buttons.delete'),
31
+ polymorphic_path(@entry),
32
+ class: 'btn btn-danger-outline pull-xs-right',
33
+ method: :delete,
34
+ data: {
35
+ confirm: I18n.t('adminable.ui.confirm')
36
+ }
37
+ )
38
+ end
39
+
40
+ def link_to_edit_small
41
+ view.link_to(
42
+ I18n.t('adminable.buttons.edit'),
43
+ edit_polymorphic_path(entry),
44
+ class: 'label label-primary'
45
+ )
46
+ end
47
+
48
+ def link_to_delete_small
49
+ view.link_to(
50
+ I18n.t('adminable.buttons.delete'),
51
+ polymorphic_path(entry),
52
+ class: 'label label-danger',
53
+ method: :delete,
54
+ data: {
55
+ confirm: I18n.t('adminable.ui.confirm')
56
+ }
57
+ )
58
+ end
59
+
60
+ def method_missing(method_name, *args, &block)
61
+ entry.public_send(method_name, *args, &block)
62
+ end
63
+
64
+ def respond_to_missing?(method_name, *)
65
+ entry.respond_to?(method_name)
66
+ end
67
+
68
+ private
69
+
70
+ attr_accessor :entry
71
+
72
+ def resource
73
+ Adminable::Configuration.resources.find do |resource|
74
+ resource == Adminable::Resource.new(
75
+ entry.class.name.pluralize.underscore
76
+ )
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -1,7 +1,6 @@
1
1
  module Adminable
2
2
  class Resource
3
- attr_reader :name, :model
4
- attr_writer :attributes
3
+ attr_reader :name, :model, :attributes
5
4
 
6
5
  # @param name [String] resource name, usually same as the model name
7
6
  def initialize(name)
@@ -27,5 +26,9 @@ module Adminable
27
26
  def attributes
28
27
  @attributes ||= Adminable::Attributes::Collection.new(@model)
29
28
  end
29
+
30
+ def ==(other)
31
+ other.is_a?(Adminable::Resource) && name == other.name
32
+ end
30
33
  end
31
34
  end
@@ -1,3 +1,3 @@
1
1
  module Adminable
2
- VERSION = '0.0.3'.freeze
2
+ VERSION = '0.0.4'.freeze
3
3
  end
@@ -0,0 +1,26 @@
1
+ require 'rails/generators/base'
2
+
3
+ module Adminable
4
+ module Generators
5
+ class PartialGenerator < Rails::Generators::Base
6
+ source_root Adminable::Engine.root.join('app/views/adminable/resources')
7
+
8
+ argument :layout, type: :string, default: 'index'
9
+ argument :type, type: :string, default: 'string'
10
+ argument :resource, type: :string, default: 'resources'
11
+
12
+ def copy_partial
13
+ template(
14
+ File.join(partial_path),
15
+ File.join('app/views/adminable', resource, partial_path)
16
+ )
17
+ end
18
+
19
+ private
20
+
21
+ def partial_path
22
+ File.join(layout, "_#{type}.html.haml")
23
+ end
24
+ end
25
+ end
26
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adminable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Novikov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-29 00:00:00.000000000 Z
11
+ date: 2016-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -388,13 +388,14 @@ files:
388
388
  - lib/adminable/configuration.rb
389
389
  - lib/adminable/engine.rb
390
390
  - lib/adminable/errors.rb
391
- - lib/adminable/presenters/base_presenter.rb
392
- - lib/adminable/presenters/entries_presenter.rb
393
- - lib/adminable/presenters/entry_presenter.rb
391
+ - lib/adminable/presenters/base.rb
392
+ - lib/adminable/presenters/entries.rb
393
+ - lib/adminable/presenters/entry.rb
394
394
  - lib/adminable/resource.rb
395
395
  - lib/adminable/version.rb
396
396
  - lib/generators/adminable/install/templates/application_controller.rb
397
397
  - lib/generators/adminable/install_generator.rb
398
+ - lib/generators/adminable/partial_generator.rb
398
399
  - lib/generators/adminable/resource/templates/resource_controller.rb.erb
399
400
  - lib/generators/adminable/resource_generator.rb
400
401
  homepage: https://github.com/droptheplot/adminable
@@ -417,7 +418,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
417
418
  version: '0'
418
419
  requirements: []
419
420
  rubyforge_project:
420
- rubygems_version: 2.4.8
421
+ rubygems_version: 2.5.1
421
422
  signing_key:
422
423
  specification_version: 4
423
424
  summary: Simple admin interface for Ruby on Rails applications.
@@ -1,11 +0,0 @@
1
- module Adminable
2
- class BasePresenter
3
- include Adminable::Engine.routes.url_helpers
4
-
5
- private
6
-
7
- def view
8
- ActionController::Base.helpers
9
- end
10
- end
11
- end
@@ -1,55 +0,0 @@
1
- module Adminable
2
- class EntriesPresenter < BasePresenter
3
- ENTRIES_LIMIT = 5
4
-
5
- include Enumerable
6
- extend Forwardable
7
-
8
- def_delegators :@collection, :each, :first, :last, :empty?
9
- def_delegators(
10
- *%i(
11
- @relation
12
- current_page
13
- total_pages
14
- limit_value
15
- entry_name
16
- total_count
17
- offset_value
18
- last_page?
19
- )
20
- )
21
-
22
- def initialize(relation)
23
- @relation = relation
24
- @collection = relation.all.map do |entry|
25
- Adminable::EntryPresenter.new(entry)
26
- end
27
- end
28
-
29
- def to_s
30
- string = collection.first(ENTRIES_LIMIT).map do |entry|
31
- view.link_to(entry.to_name, edit_polymorphic_path(entry))
32
- end
33
-
34
- string << and_more_tag if collection_size_residue > 0
35
-
36
- string.join(', ').html_safe
37
- end
38
-
39
- private
40
-
41
- attr_accessor :relation, :collection
42
-
43
- def collection_size_residue
44
- @collection_residue ||= collection.size - ENTRIES_LIMIT
45
- end
46
-
47
- def and_more_tag
48
- view.content_tag(
49
- :span,
50
- I18n.t('adminable.ui.and_more', size: collection_size_residue),
51
- class: 'text-muted'
52
- )
53
- end
54
- end
55
- end
@@ -1,68 +0,0 @@
1
- module Adminable
2
- class EntryPresenter < BasePresenter
3
- def initialize(entry)
4
- @entry = entry
5
- end
6
-
7
- def to_name
8
- %i(name title email login id).each do |method_name|
9
- begin
10
- return entry.public_send(method_name)
11
- rescue NoMethodError
12
- next
13
- end
14
- end
15
- end
16
-
17
- def link_to_self
18
- view.link_to(
19
- to_name,
20
- edit_polymorphic_path(entry)
21
- )
22
- end
23
-
24
- def link_to_delete
25
- view.link_to(
26
- I18n.t('adminable.buttons.delete'),
27
- polymorphic_path(@entry),
28
- class: 'btn btn-danger-outline pull-xs-right',
29
- method: :delete,
30
- data: {
31
- confirm: I18n.t('adminable.ui.confirm')
32
- }
33
- )
34
- end
35
-
36
- def link_to_edit_small
37
- view.link_to(
38
- I18n.t('adminable.buttons.edit'),
39
- edit_polymorphic_path(entry),
40
- class: 'label label-primary'
41
- )
42
- end
43
-
44
- def link_to_delete_small
45
- view.link_to(
46
- I18n.t('adminable.buttons.delete'),
47
- polymorphic_path(entry),
48
- class: 'label label-danger',
49
- method: :delete,
50
- data: {
51
- confirm: I18n.t('adminable.ui.confirm')
52
- }
53
- )
54
- end
55
-
56
- def method_missing(method_name, *args, &block)
57
- entry.public_send(method_name, *args) { block if block_given? }
58
- end
59
-
60
- def respond_to_missing?(method_name, *)
61
- entry.respond_to?(method_name)
62
- end
63
-
64
- private
65
-
66
- attr_accessor :entry
67
- end
68
- end