smart_management 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8daa95a3250b8dca65c85fd76ef9e288127a4022
4
+ data.tar.gz: 5112b78695a8b7e27469bc99c909c49a85c1e72f
5
+ SHA512:
6
+ metadata.gz: a20e208898d2a9080b985ca2ba71ff64eb5df6f37c47dc238ab2b1cede2b524f12dc6cfcd41327255a05251feba62f6ae2f7bc2daa83bfb25f68d20e0c49ef87
7
+ data.tar.gz: 4dd82b8bedb9afe971b0d6708a439b9c04d3d0babce29f33390adfb2992de59876219a722ab0b9b8b3361c2cd3405076fe7f192b9d8344ff672c971117451713
@@ -0,0 +1,20 @@
1
+ Copyright 2015 GCorbel
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,133 @@
1
+ # Smart Management
2
+
3
+ The main goal of this tool is to give a powerful administration tool for a
4
+ Rails application. It is simple to use and highly customisable.
5
+
6
+ ## Installation
7
+
8
+ Add it to your Gemfile :
9
+
10
+ ```ruby
11
+ gem 'smart_management'
12
+ ```
13
+
14
+ You have to include those dependencies in `application.js` :
15
+
16
+ ```coffee
17
+ //= require jquery
18
+ //= require jquery_ujs
19
+ //= require turbolinks
20
+ //= require twitter/bootstrap
21
+ //= require underscore
22
+ //= require angular
23
+ //= require smart_table
24
+ //= require smart_management
25
+ ```
26
+
27
+ And you have to add this in `application.css` :
28
+ ```css
29
+ *= require bootstrap_and_overrides
30
+ ```
31
+
32
+ You also have to download Smart-Table with this command :
33
+ ```
34
+ wget https://raw.githubusercontent.com/lorenzofox3/Smart-Table/master/dist/smart-table.js -O app/assets/javascripts/smart-table.js
35
+ ```
36
+
37
+ Finally, you have to generate the simple_form installation with this command :
38
+ ```
39
+ rails g simple_form:install --bootstrap
40
+ ```
41
+
42
+ ## How to use
43
+
44
+ Now, you can create a new controller, as you do in a normal Rails application.
45
+ You can use SmartManagement by including `SmartMangement::ControllerScaffold`
46
+ like in this example :
47
+
48
+ ```ruby
49
+ class PluralModelNameController < ApplicationController
50
+ include SmartManagement::ControllerScaffold
51
+ end
52
+ ```
53
+
54
+ ## Customize the list
55
+
56
+ To customize the list of records, you can simple override the `table` partial
57
+ by creating a file called `app/views/plural_model_name/_table.html.erb`. You
58
+ can find the one used by SmartManagement
59
+ [here](https://github.com/GCorbel/smart_management/blob/master/app/views/smart_management/_table.html.erb). You can just do a copy/paste in your new file.
60
+
61
+
62
+ ## Customize the form
63
+
64
+ You can customize the form by creating a file called `app/views/plural_model_name/_form.html.erb`. You can find the default form [here](https://github.com/GCorbel/smart_management/blob/master/app/views/smart_management/_form.html.erb).
65
+
66
+ You can also add fields at the bottom of the default form like this :
67
+
68
+ ```ruby
69
+ <%= render layout: 'smart_management/form' do |f| %>
70
+ <%= f.input :custom_field %>
71
+ <% end %>
72
+ ```
73
+
74
+ ## Customize the data returned by the index
75
+
76
+ To customize the data returned by `/plural_model_name.json` you can create a
77
+ helper called `PluralModelNameHelper` and create a method called
78
+ `json_options`. For example :
79
+
80
+ ```ruby
81
+ module PluralModelNameHelper
82
+ def json_options
83
+ { include: [:groups] }
84
+ end
85
+ end
86
+ ```
87
+
88
+ In additions, you should also customize the scope of the query. You can do this
89
+ by creating a function called `scope` in your helper. You helper have to be
90
+ like this :
91
+
92
+ ```ruby
93
+ module PluralModelNameHelper
94
+ def scope
95
+ PluralModelName.includes(:groups)
96
+ end
97
+
98
+ def json_options
99
+ { include: [:groups] }
100
+ end
101
+ end
102
+ ```
103
+
104
+ ## Customize the controller
105
+
106
+ You can override methods of the module
107
+ [here](https://github.com/GCorbel/smart_management/blob/master/lib/smart_management/controller_scaffold.rb).
108
+ For example, if you want to send an email after the creation a new model, you
109
+ can create a controller like this :
110
+
111
+ ```ruby
112
+ class PluralModelNameController < ApplicationController
113
+ include SmartManagement::ControllerScaffold
114
+
115
+ def create
116
+ if resource.save
117
+ PluralModelNameMailer.welcome_email(resource).deliver_later
118
+ else
119
+ render :new
120
+ end
121
+ end
122
+ end
123
+ ```
124
+
125
+ SmartManagement is using [responders](https://github.com/plataformatec/responders) and [decent_exposure](https://github.com/hashrocket/decent_exposure).
126
+ You can go on their Github pages to know how it works.
127
+
128
+ ## Host the application another host
129
+
130
+ To be more efficient, and to don't have performance impact on the client app,
131
+ you can host your app another host, like Heroku. You just have to copy models
132
+ and `schema.rb`. You can change the file `database.yml` to give the information
133
+ of database you want to be connected.
@@ -0,0 +1,25 @@
1
+ require 'rails/dummy/tasks'
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+
8
+ require 'rdoc/task'
9
+
10
+ RDoc::Task.new(:rdoc) do |rdoc|
11
+ rdoc.rdoc_dir = 'rdoc'
12
+ rdoc.title = 'SmartManagement'
13
+ rdoc.options << '--line-numbers'
14
+ rdoc.rdoc_files.include('README.rdoc')
15
+ rdoc.rdoc_files.include('lib/**/*.rb')
16
+ end
17
+
18
+
19
+
20
+ load 'rails/tasks/statistics.rake'
21
+
22
+
23
+
24
+ Bundler::GemHelper.install_tasks
25
+
@@ -0,0 +1,50 @@
1
+ app = angular.module('smart_management', ['smart-table'])
2
+
3
+ $(document).on 'page:load', ->
4
+ angular.bootstrap $("[ng-app='#{app.name}']"), ['smart_management']
5
+
6
+ app.factory('RestManager', =>
7
+ class RestManager
8
+ @pluralModelName = =>
9
+ $("[ng-app='#{app.name}']").first().data('plural-model-name')
10
+ )
11
+
12
+ app.controller "sortCtrl", [
13
+ "$scope"
14
+ "$filter"
15
+ "$http"
16
+ "RestManager"
17
+ (scope, filter, http, RestManager) ->
18
+ window.scope = scope
19
+ scope.new_path = "/#{RestManager.pluralModelName()}/new"
20
+ scope.callServer = (tableState) ->
21
+ scope.rowCollection = []
22
+ http.get("/#{RestManager.pluralModelName()}.json", params: tableState).
23
+ success((data) =>
24
+ scope.rowCollection = []
25
+ numberOfPages = data.meta.total / tableState.pagination.number
26
+ tableState.pagination.numberOfPages = Math.ceil(numberOfPages)
27
+ $.each data.items, (_, resource) ->
28
+ scope.addNewRow(resource)
29
+ )
30
+
31
+ scope.deleteEntry = (row) ->
32
+ http.delete("/#{RestManager.pluralModelName()}/#{row.resource.id}.json").
33
+ success( =>
34
+ scope.rowCollection = _.filter(scope.rowCollection,
35
+ (item) -> item != row)
36
+ )
37
+
38
+ scope.addNewRow = (resource) ->
39
+ row = {}
40
+ row.resource = resource
41
+ row.editUrl = "/#{RestManager.pluralModelName()}/#{resource.id}/edit"
42
+ scope.rowCollection.push(row)
43
+ scope.$apply() unless scope.$$phase
44
+
45
+ scope.updateRow = (resource) ->
46
+ $.each scope.rowCollection, (_, row) ->
47
+ if row.resource.id == resource.id
48
+ row.resource = resource
49
+ scope.$apply() unless scope.$$phase
50
+ ]
@@ -0,0 +1,13 @@
1
+ <div ng-controller="sortCtrl" ng-app="smart_management"
2
+ data-plural-model-name = "<%= plural_model_name %>">
3
+
4
+ <h1><%= plural_model_name.capitalize %></h1>
5
+
6
+ <div class="modal fade" id="formContainer" tabindex="-1" role="dialog"
7
+ aria-labelledby="formModalLabel" aria-hidden="true">
8
+ </div>
9
+
10
+ <%= render 'table' %>
11
+
12
+ <a href="{{new_path}}" data-remote="true">Add a new</a>
13
+ </div>
@@ -0,0 +1,26 @@
1
+ <%= simple_form_for resource, remote: true do |form| %>
2
+ <div class="modal-dialog">
3
+ <div class="modal-content">
4
+ <div class="modal-header">
5
+ <button type="button" class="close" data-dismiss="modal"
6
+ aria-label="Close">
7
+ <span aria-hidden="true">&times;</span>
8
+ </button>
9
+ <h4 class="modal-title" id="formModalLabel">Modal title</h4>
10
+ </div>
11
+ <div class="modal-body">
12
+ <% editable_columns.each do |column| %>
13
+ <%= field_for form: form, klass: model_class, column: column %>
14
+ <% end %>
15
+ <%= yield(form) %>
16
+ </div>
17
+ <div class="modal-footer">
18
+ <button type="button" class="btn btn-default" data-dismiss="modal">
19
+ Close
20
+ </button>
21
+
22
+ <%= form.button :submit %>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ <% end %>
@@ -0,0 +1,39 @@
1
+ <table id="<%= plural_model_name %>_table" st-table="rowCollection"
2
+ st-pipe="callServer" class="table table-striped">
3
+ <thead>
4
+ <tr>
5
+ <% visible_columns.each do |column| %>
6
+ <th st-sort="<%= column.name %>">
7
+ <%= column.name.humanize.capitalize %>
8
+ </th>
9
+ <% end %>
10
+ <th></th>
11
+ <th></th>
12
+ </tr>
13
+ <tr>
14
+ <% visible_columns.each do |column| %>
15
+ <td>
16
+ <% if searchable?(column) %>
17
+ <input st-search="'<%= column.name %>'"/>
18
+ <% end %>
19
+ </td>
20
+ <% end %>
21
+ </tr>
22
+ </thead>
23
+ <tbody>
24
+ <tr id="{{row.id}}" ng-repeat="row in rowCollection">
25
+ <% visible_columns.each do |column| %>
26
+ <td><%= smart_management_row(column) %></td>
27
+ <% end %>
28
+ <td><a ng-href="{{row.editUrl}}" data-remote="true">Edit</a></td>
29
+ <td><a href="javascript:" ng-click="deleteEntry(row)">Delete</a></td>
30
+ </tr>
31
+ </tbody>
32
+ <tfoot>
33
+ <tr>
34
+ <td class="text-center" st-pagination="" st-items-by-page="25"
35
+ colspan="<%= colspan %>">
36
+ </td>
37
+ </tr>
38
+ </tfoot>
39
+ </table>
@@ -0,0 +1,6 @@
1
+ <% if resource.valid? %>
2
+ $('#formContainer').modal('hide')
3
+ window.scope.addNewRow(<%= (resource.to_json(json_options).html_safe) %>)
4
+ <% else %>
5
+ $('#formContainer').html('<%= j(render('form', resource: resource)) %>')
6
+ <% end %>
@@ -0,0 +1,2 @@
1
+ $('#formContainer').html('<%= j(render('form', resource: resource)) %>').
2
+ modal()
@@ -0,0 +1 @@
1
+ <%= render 'smart_management/crud_interface' %>
@@ -0,0 +1,2 @@
1
+ $('#formContainer').html('<%= j(render('form', resource: resource)) %>').
2
+ modal()
@@ -0,0 +1,6 @@
1
+ <% if resource.valid? %>
2
+ $('#formContainer').modal('hide')
3
+ window.scope.updateRow(<%= (resource.to_json(json_options).html_safe) %>)
4
+ <% else %>
5
+ $('#formContainer').html('<%= j(render('form', resource: resource)) %>')
6
+ <% end %>
@@ -0,0 +1,20 @@
1
+ require 'decent_exposure'
2
+ require 'responders'
3
+ require 'simple_form'
4
+ require 'smart_management/helpers'
5
+ require 'smart_management/controller_scaffold'
6
+ require 'smart_management/engine'
7
+ require 'smart_management/index_builder'
8
+ require 'smart_management/searcher'
9
+ require 'smart_management/paginer'
10
+ require 'smart_management/sorter'
11
+ require 'smart_management/json_converter'
12
+
13
+ require 'therubyracer'
14
+ require 'angularjs-rails'
15
+ require 'underscore-rails'
16
+ require 'twitter-bootstrap-rails'
17
+ require 'less-rails'
18
+
19
+ module SmartManagement
20
+ end
@@ -0,0 +1,94 @@
1
+ module SmartManagement
2
+ module ControllerScaffold
3
+ include SmartManagement::Helpers
4
+
5
+ def index
6
+ respond_to do |format|
7
+ format.html { render 'index' }
8
+ format.json { render json: json_values }
9
+ end
10
+ end
11
+
12
+ def show
13
+ respond_with(resource)
14
+ end
15
+
16
+ def create
17
+ resource.save if resource.valid?
18
+ end
19
+
20
+ def update
21
+ resource.save if resource.valid?
22
+ end
23
+
24
+ def destroy
25
+ resource.destroy
26
+ respond_with(resource)
27
+ end
28
+
29
+ private
30
+
31
+ def resource_attributes
32
+ params.require(singular_model_name.to_sym).permit(editable_columns_syms)
33
+ end
34
+
35
+ def editable_columns_syms
36
+ editable_columns.map do |column|
37
+ column.name.to_sym
38
+ end
39
+ end
40
+
41
+ def sort_options
42
+ JSON.parse(params["sort"]).symbolize_keys if params["sort"]
43
+ end
44
+
45
+ def pagination_options
46
+ JSON.parse(params["pagination"]).symbolize_keys if params["pagination"]
47
+ end
48
+
49
+ def search_options
50
+ if params["search"]
51
+ search_params = JSON.parse(params["search"])
52
+ if search_params["predicateObject"]
53
+ search_params["predicateObject"].symbolize_keys
54
+ end
55
+ end
56
+ end
57
+
58
+ def smart_management_options
59
+ { sort: sort_options, pagination: pagination_options, search: search_options }
60
+ end
61
+
62
+ private
63
+
64
+ def self.included(controller)
65
+ controller.decent_configuration do
66
+ strategy DecentExposure::StrongParametersStrategy
67
+ end
68
+
69
+ name = controller.controller_name
70
+ singular = name.singularize
71
+ controller.expose(name, attributes: :resource_attributes)
72
+ controller.expose(singular, attributes: :resource_attributes)
73
+ controller.helper_method :resource
74
+ controller.respond_to :html, :json
75
+ end
76
+
77
+ def _prefixes
78
+ super << 'smart_management'
79
+ end
80
+
81
+ def resource
82
+ @resource ||= send(singular_model_name)
83
+ end
84
+
85
+ def index_builder
86
+ SmartManagement::IndexBuilder.
87
+ new(scope, smart_management_options)
88
+ end
89
+
90
+ def json_values
91
+ JsonConverter.new(index_builder, json_options).call
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,4 @@
1
+ module SmartManagement
2
+ class Engine < ::Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,79 @@
1
+ module SmartManagement
2
+ module Helpers
3
+ COLUMNS_AT_FIRST = ['id']
4
+ COLUMNS_AT_END = ['created_at', 'updated_at']
5
+ PROTECTED_COLUMNS = ['id', 'created_at', 'updated_at']
6
+ UNSEARCHABLE_TYPES = [:string, :text]
7
+
8
+ def smart_management_row(column)
9
+ if column.sql_type.include?('time')
10
+ filter = " | date: 'dd-MM-yyyy hh:mm:ss'"
11
+ end
12
+ "{{row.resource.#{column.name} #{filter} }}"
13
+ end
14
+
15
+ def json_options
16
+ {}
17
+ end
18
+
19
+ def visible_columns
20
+ model_class.columns.select { |c| visible_columns_names.include? c.name }
21
+ end
22
+
23
+ def visible_columns_names
24
+ COLUMNS_AT_FIRST +
25
+ (model_class.columns.map(&:name) - PROTECTED_COLUMNS) +
26
+ COLUMNS_AT_END
27
+ end
28
+
29
+ def editable_columns
30
+ model_class.columns.reject do |column|
31
+ PROTECTED_COLUMNS.include?(column.name)
32
+ end
33
+ end
34
+
35
+ def editable_columns_names
36
+ editable_columns.map(&:name)
37
+ end
38
+
39
+ def singular_model_name
40
+ controller_name.to_s.singularize
41
+ end
42
+
43
+ def plural_model_name
44
+ controller_name.to_s
45
+ end
46
+
47
+ def model_class
48
+ singular_model_name.capitalize.camelize.constantize
49
+ end
50
+
51
+ def colspan
52
+ model_class.columns.length + 2
53
+ end
54
+
55
+ def field_for(form:, klass:, column:)
56
+ if klass.reflect_on_association(assoc_name(column.name))
57
+ form.send(:association, assoc_name(column.name))
58
+ else
59
+ form.send(:input, column.name)
60
+ end
61
+ end
62
+
63
+ def searchable?(column)
64
+ UNSEARCHABLE_TYPES.include?(column.type)
65
+ end
66
+
67
+ def scope
68
+ model_class
69
+ end
70
+
71
+ private
72
+
73
+ def assoc_name(column)
74
+ column.gsub(/_id$/, '')
75
+ end
76
+ end
77
+ end
78
+
79
+ ActionView::Base.send(:include, SmartManagement::Helpers) if defined?(ActionView::Base)
@@ -0,0 +1,26 @@
1
+ module SmartManagement
2
+ class IndexBuilder
3
+ attr_accessor :klass, :options
4
+
5
+ def initialize(klass, options)
6
+ @klass = klass
7
+ @options = options
8
+ end
9
+
10
+ def items
11
+ items = searched_items
12
+ items = Paginer.new(items, options[:pagination]).call
13
+ Sorter.new(items, options[:sort]).call
14
+ end
15
+
16
+ def total
17
+ @total ||= searched_items.count
18
+ end
19
+
20
+ private
21
+
22
+ def searched_items
23
+ @seached_items ||= Searcher.new(klass.all, options[:search]).call
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ class JsonConverter
2
+ attr_accessor :data, :schema
3
+
4
+ def initialize(data, schema)
5
+ @data = data
6
+ @schema = schema
7
+ end
8
+
9
+ def call
10
+ hash = {}
11
+ hash[:items] = data.items.as_json(schema)
12
+ hash[:meta] = { total: data.total }
13
+ hash.to_json
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module SmartManagement
2
+ class Paginer
3
+ def initialize(data, options)
4
+ @data = data
5
+ @options = options
6
+ end
7
+
8
+ def call
9
+ if @options.present?
10
+ @data = @data.limit(@options[:number]).offset(@options[:start])
11
+ end
12
+ @data
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ module SmartManagement
2
+ class Searcher
3
+ def initialize(data, options)
4
+ @data = data
5
+ @options = options
6
+ end
7
+
8
+ def call
9
+ if @options.present?
10
+ @options.each do |k, v|
11
+ @data = @data.where("#{@data.table_name}.#{k} like ?", "%#{v}%")
12
+ end
13
+ end
14
+ @data
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module SmartManagement
2
+ class Sorter
3
+ def initialize(data, options)
4
+ @data = data
5
+ @options = options
6
+ end
7
+
8
+ def call
9
+ if @options.present?
10
+ order = @options[:reverse] ? "desc" : "asc"
11
+ @data = @data.order("#{@options[:predicate]} #{order}")
12
+ end
13
+ @data
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module SmartManagement
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,264 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smart_management
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - GCorbel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: decent_exposure
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: responders
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simple_form
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: angular_rails_csrf
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: twitter-bootstrap-rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.2'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: therubyracer
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.12'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.12'
111
+ - !ruby/object:Gem::Dependency
112
+ name: angularjs-rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.3'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.3'
125
+ - !ruby/object:Gem::Dependency
126
+ name: underscore-rails
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.8'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.8'
139
+ - !ruby/object:Gem::Dependency
140
+ name: less-rails
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.6'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.6'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec-rails
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.2'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.2'
167
+ - !ruby/object:Gem::Dependency
168
+ name: capybara
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '2.4'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '2.4'
181
+ - !ruby/object:Gem::Dependency
182
+ name: capybara-webkit
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '1.3'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '1.3'
195
+ - !ruby/object:Gem::Dependency
196
+ name: database_cleaner
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '1.4'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '1.4'
209
+ description: "\n SmartManagement is designed to be simple to use and to customize.\n
210
+ \ It allows to create a admin part for you Rails application in a few\n seconds.\n
211
+ \ "
212
+ email:
213
+ - guirec.corbel@gmail.com
214
+ executables: []
215
+ extensions: []
216
+ extra_rdoc_files: []
217
+ files:
218
+ - MIT-LICENSE
219
+ - README.md
220
+ - Rakefile
221
+ - app/assets/javascripts/smart_management.coffee
222
+ - app/views/smart_management/_crud_interface.html.erb
223
+ - app/views/smart_management/_form.html.erb
224
+ - app/views/smart_management/_table.html.erb
225
+ - app/views/smart_management/create.js.erb
226
+ - app/views/smart_management/edit.js.erb
227
+ - app/views/smart_management/index.html.erb
228
+ - app/views/smart_management/new.js.erb
229
+ - app/views/smart_management/update.js.erb
230
+ - lib/smart_management.rb
231
+ - lib/smart_management/controller_scaffold.rb
232
+ - lib/smart_management/engine.rb
233
+ - lib/smart_management/helpers.rb
234
+ - lib/smart_management/index_builder.rb
235
+ - lib/smart_management/json_converter.rb
236
+ - lib/smart_management/paginer.rb
237
+ - lib/smart_management/searcher.rb
238
+ - lib/smart_management/sorter.rb
239
+ - lib/smart_management/version.rb
240
+ homepage: https://github.com/GCorbel/smart_management
241
+ licenses:
242
+ - MIT
243
+ metadata: {}
244
+ post_install_message:
245
+ rdoc_options: []
246
+ require_paths:
247
+ - lib
248
+ required_ruby_version: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ required_rubygems_version: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ requirements: []
259
+ rubyforge_project:
260
+ rubygems_version: 2.2.2
261
+ signing_key:
262
+ specification_version: 4
263
+ summary: Easy way to build an administration part for a Rails application
264
+ test_files: []