ab_admin 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/Gemfile +5 -2
  2. data/README.md +2 -4
  3. data/TODO +3 -0
  4. data/ab_admin.gemspec +1 -1
  5. data/app/assets/javascripts/ab_admin/application.js +4 -1
  6. data/app/assets/javascripts/ab_admin/components/in_place_edit.js.coffee +23 -0
  7. data/app/assets/javascripts/ab_admin/core/batch_actions.js.coffee +4 -1
  8. data/app/assets/javascripts/ab_admin/core/columns_hider.js.coffee +13 -5
  9. data/app/assets/javascripts/ab_admin/core/init.js.coffee +30 -15
  10. data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +15 -7
  11. data/app/assets/javascripts/ab_admin/core/utils.js.coffee +3 -0
  12. data/app/assets/javascripts/ab_admin/inputs/datetime_input.js.coffee +1 -1
  13. data/app/assets/stylesheets/ab_admin/application.css.scss +2 -1
  14. data/app/assets/stylesheets/ab_admin/components/_table_view.css.scss +12 -0
  15. data/app/controllers/admin/base_controller.rb +20 -2
  16. data/app/controllers/admin/manager_controller.rb +0 -2
  17. data/app/views/admin/base/create.js.erb +6 -0
  18. data/app/views/admin/base/edit.js.erb +10 -0
  19. data/app/views/admin/base/index.html.slim +2 -3
  20. data/app/views/admin/base/new.js.erb +8 -0
  21. data/app/views/admin/base/update.js.erb +7 -0
  22. data/app/views/admin/manager/_search_form.html.slim +1 -1
  23. data/app/views/admin/manager/_show_table.html.slim +7 -0
  24. data/app/views/admin/manager/_table.html.slim +6 -2
  25. data/app/views/admin/shared/_save_buttons.html.slim +1 -1
  26. data/features/dsl/action_items.feature +4 -4
  27. data/features/dsl/in_place_edit.feature +26 -0
  28. data/features/dsl/list_edit.feature +46 -0
  29. data/features/dsl/show.feature +37 -0
  30. data/features/step_definitions/dsl/in_place_edit_steps.rb +7 -0
  31. data/features/step_definitions/dsl/show_steps.rb +8 -0
  32. data/features/step_definitions/dsl/table_steps.rb +2 -2
  33. data/features/step_definitions/web_steps/browsing_steps.rb +13 -0
  34. data/features/support/paths.rb +1 -1
  35. data/lib/ab_admin/abstract_resource.rb +5 -1
  36. data/lib/ab_admin/config/base.rb +14 -0
  37. data/lib/ab_admin/version.rb +1 -1
  38. data/lib/ab_admin/views/admin_helpers.rb +22 -0
  39. data/lib/ab_admin/views/admin_navigation_helpers.rb +6 -7
  40. data/lib/ab_admin/views/form_builder.rb +1 -1
  41. data/lib/ab_admin/views/manager_helpers.rb +4 -0
  42. data/lib/ab_admin/views/search_form_builder.rb +5 -1
  43. data/lib/generators/template.rb +4 -3
  44. data/spec/dummy/app/helpers/application_helper.rb +1 -0
  45. data/spec/dummy/app/models/ab_admin/ab_admin_product.rb +33 -70
  46. data/spec/dummy/app/models/product.rb +2 -0
  47. data/vendor/assets/javascripts/jquery.hotkeys.js +106 -0
  48. metadata +26 -15
  49. data/NOTES +0 -16
  50. data/app/assets/images/admin/chosen-sprite.png +0 -0
  51. data/app/assets/stylesheets/ab_admin/chosen.css.scss +0 -368
  52. data/app/assets/stylesheets/ab_admin/components/_table_tools.css.scss +0 -94
  53. data/spec/dummy/app/models/.gitkeep +0 -0
  54. data/vendor/assets/javascripts/chosen.js.coffee +0 -780
data/Gemfile CHANGED
@@ -23,10 +23,13 @@ gem 'globalize3', :git => 'git://github.com/leschenko/globalize3.git', :ref => '
23
23
 
24
24
  gem 'carrierwave'
25
25
  gem 'mini_magick'
26
+ gem 'will_paginate', '>= 3.0.3'
27
+ # disabled links broken styling in 0.2.2
28
+ gem 'will_paginate-bootstrap', '0.2.1'
26
29
  gem 'bootstrap-sass', '2.0.4'
27
30
  gem 'bootstrap-wysihtml5-rails'
28
- gem 'will_paginate', '>= 3.0.3'
29
- gem 'will_paginate-bootstrap'
31
+ gem 'bootstrap-x-editable-rails'
32
+ gem 'select2-rails'
30
33
  gem 'nested_form', '0.2.2'
31
34
  gem 'simple_form'
32
35
  gem 'russian'
data/README.md CHANGED
@@ -7,12 +7,10 @@ Simple and real-life tested Rails::Engine admin interface based on slim, bootstr
7
7
  To build a new Rails application with AbAdmin, run:
8
8
 
9
9
  ```bash
10
- $ rails new [MyAppName] -m https://raw.github.com/leschenko/ab_admin/master/lib/generators/template.rb
10
+ rails new [MyAppName] -m https://raw.github.com/leschenko/ab_admin/master/lib/generators/template.rb
11
11
  ```
12
12
 
13
- Or add [list of gems](https://gist.github.com/leschenko/752aaa0f03323aa8c6b3) to an existing application
14
-
15
- Run generators
13
+ Or add [list of gems](https://gist.github.com/leschenko/752aaa0f03323aa8c6b3) to an existing application and run generators:
16
14
 
17
15
  ```bash
18
16
  rails generate devise:install
data/TODO ADDED
@@ -0,0 +1,3 @@
1
+ form has_many has_one
2
+ settings and locales reloading
3
+ add resource history
data/ab_admin.gemspec CHANGED
@@ -39,7 +39,7 @@ Gem::Specification.new do |gem|
39
39
  gem.add_dependency 'bootstrap-sass', '~> 2.0.4'
40
40
  gem.add_dependency 'bootstrap-wysihtml5-rails'
41
41
  gem.add_dependency 'will_paginate'
42
- gem.add_dependency 'will_paginate-bootstrap'
42
+ gem.add_dependency 'will_paginate-bootstrap', '0.2.1'
43
43
  gem.add_dependency 'nested_form', '~> 0.2.2'
44
44
  gem.add_dependency 'simple_form'
45
45
  gem.add_dependency 'gon'
@@ -5,6 +5,7 @@
5
5
  //= require jquery.pjax
6
6
  //= require jquery.ui.nestedSortable
7
7
  //= require jquery_nested_form
8
+ //= require jquery.hotkeys
8
9
  //= require bootstrap
9
10
  //= require ab_admin/bootstrap-tab-multi
10
11
  //= require ab_admin/bootstrap-datepicker/core
@@ -12,13 +13,15 @@
12
13
  //= require ab_admin/bootstrap-timepicker
13
14
  //= require bootstrap-wysihtml5
14
15
  //= require bootstrap-wysihtml5/locales/ru
15
- //= require chosen
16
+ //= require bootstrap-editable-inline
17
+ //= require select2
16
18
  //= require jquery.ui.nestedSortable
17
19
  //= require ab_admin/components/sortable_tree
18
20
  //= require ab_admin/components/google_translate
19
21
  //= require ab_admin/components/locator
20
22
  //= require ab_admin/components/admin_assets
21
23
  //= require ab_admin/components/gmaps
24
+ //= require ab_admin/components/in_place_edit
22
25
 
23
26
  //= require ab_admin/core/init
24
27
  //= require ab_admin/inputs/datetime_input
@@ -0,0 +1,23 @@
1
+ EditableForm = $.fn.editableform.Constructor
2
+ EditableForm.prototype.saveWithUrlHook = (value) ->
3
+ url = @options.url
4
+ @options.url = (params) =>
5
+ params[@options.model] ||= {}
6
+ params[@options.model][params.name] = value
7
+ ajax_opts =
8
+ url: url
9
+ data: params
10
+ type: 'PUT'
11
+ dataType: 'json'
12
+ delete params.name
13
+ delete params.value
14
+ delete params.pk
15
+ $.ajax $.extend(ajax_opts, @options.ajaxOptions)
16
+ @saveWithoutUrlHook(value)
17
+ EditableForm.prototype.saveWithoutUrlHook = EditableForm.prototype.save
18
+ EditableForm.prototype.save = EditableForm.prototype.saveWithUrlHook
19
+
20
+ $(document).on 'admin:init', (e) ->
21
+ return unless window.viewType == 'list'
22
+ $('.editable').editable
23
+ onblur: 'submit'
@@ -11,9 +11,12 @@ $ ->
11
11
  submitBatch = (el) ->
12
12
  if $("#list [name='ids[]']:checked")[0]
13
13
  $el = $(el)
14
+ ids = $("#list [name='ids[]']:checked").map(-> $(this).val()).get()
14
15
  action = $el.data('action')
15
16
  $('#batch_action').val(action)
16
- $('#batch_action_form').submit()
17
+ $form = $('#batch_action_form')
18
+ $form.append("<input type='checkbox' name='ids[]' checked='1' value='#{id}'/>") for id in ids
19
+ $form.submit()
17
20
 
18
21
  $('#list tbody tr').live 'click', (e) ->
19
22
  return true unless _.include(['TR', 'TD'], e.target.tagName)
@@ -2,13 +2,17 @@ class window.ColumnsHider
2
2
  constructor: ->
3
3
  @store_key = 'cols'
4
4
  @data_el = $('#columns_hider_data')
5
- @data = @getData()
6
- @collection_name = $('html').attr('id').replace(/^controller_/, '')
7
5
  @column_names = @columnNames()
6
+ @collection_name = $('html').attr('id').replace(/^controller_/, '')
7
+ @data = @getData()
8
+ @initDefaults()
8
9
  @initButtons()
9
10
  @initHandlers()
10
11
  @refreshColumns()
11
12
 
13
+ initDefaults: ->
14
+ @data
15
+
12
16
  setData: ->
13
17
  res = {}
14
18
  _.each @data, (v, k) ->
@@ -22,6 +26,10 @@ class window.ColumnsHider
22
26
  data[k] = []
23
27
  _.each v.split('_'), (el) ->
24
28
  data[k].push to_i(el) if el
29
+ unless data[@collection_name]
30
+ data[@collection_name] = []
31
+ for col, i in @column_names
32
+ data[@collection_name].push(i) if col.disabled
25
33
  data
26
34
 
27
35
  fetchData: ->
@@ -36,15 +44,15 @@ class window.ColumnsHider
36
44
 
37
45
  initButtons: ->
38
46
  @data_el.empty()
39
- for name, i in @column_names
47
+ for col, i in @column_names
40
48
  css_class = if _.include(@data[@collection_name], i) then 'active' else ''
41
- html = "<button class='btn btn-primary #{css_class}' data-val='#{i}'>#{name}</button>"
49
+ html = "<button class='btn btn-primary #{css_class}' data-val='#{i}'>#{col.name}</button>"
42
50
  @data_el.append(html)
43
51
 
44
52
  columnNames: ->
45
53
  _.map $('#list th'), (el) ->
46
54
  $el = $(el)
47
- $.trim($el.text().replace(/[▼▲]/g, ''))
55
+ {disabled: $el.hasClass('hide_cell'), name: $.trim($el.text().replace(/[▼▲]/g, ''))}
48
56
 
49
57
  initHandlers: ->
50
58
  $('#submit_columns_hider').click =>
@@ -19,36 +19,51 @@ $ ->
19
19
  initPopover()
20
20
  initTooltip()
21
21
 
22
- $('#list tbody tr').dblclick (e) ->
23
- e.preventDefault()
24
- $el = $(this)
25
- window.location.href = $el.find('td a.resource_id_link').prop('href')
26
-
27
22
  $('.per_page').click ->
28
23
  $.cookie('pp', $(this).data('val'))
29
24
 
25
+ $('#list').on 'click', '.form_cancel', (e) ->
26
+ e.preventDefault()
27
+ $(this).closest('tr').remove()
28
+
30
29
 
31
30
  $(document).on 'admin:init', (e) ->
32
31
  return unless window.viewType == 'form'
33
32
  window.resource_id = $('form.simple_form').data('id')
34
- initEditor()
35
- inputSetToggle()
33
+ $(document).trigger('admin:form_init')
36
34
 
37
- # $('form .region_ac').regionAc()
38
- # new NestedFieldsAdder
39
- # region_ac: true
40
- # callback: ->
41
- # initPickers()
42
- # initChosen()
43
- # initEditor()
44
35
 
36
+ $(document).on 'admin:form_init', 'form', (e) ->
37
+ focusInput($(this))
38
+ initEditor()
39
+ initFancySelect()
40
+ inputSetToggle()
45
41
 
46
42
  $(document).on 'pjax:end', ->
47
43
  $(document).trigger({type: 'admin:init', pjax: true})
48
44
  $(document).trigger({type: 'admin:init'})
49
45
 
46
+ $(document).on 'dblclick', '#list tbody tr', (e) ->
47
+ e.preventDefault()
48
+ $el = $(this)
49
+ $el.find('td a.resource_id_link').click()
50
+
50
51
 
51
- initChosen()
52
+ initFancySelect()
52
53
  # initAcFileds()
53
54
  if window.gon?.bg_color
54
55
  $('body').css('background-color', "##{window.gon.bg_color.replace(/^#/, '')}")
56
+
57
+ if window.gon?.hotkeys
58
+ $(document).bind 'keydown.alt_n', -> $('a.new_resource:first').click()
59
+ $(document).bind 'keydown.alt_left', -> $('a[rel^="prev"]:first').click()
60
+ $(document).bind 'keydown.alt_right', -> $('a[rel="next"]:first').click()
61
+ $(document).bind 'keydown.alt_s', -> $('#search_form').submit()
62
+
63
+ # $('form .region_ac').regionAc()
64
+ # new NestedFieldsAdder
65
+ # region_ac: true
66
+ # callback: ->
67
+ # initPickers()
68
+ # initFancySelect()
69
+ # initEditor()
@@ -15,14 +15,19 @@ window.initPopover = ->
15
15
  $('.popover').hide()
16
16
  $('a[rel=popover]').popover({trigger: 'hover'})
17
17
 
18
- window.initChosen = ->
18
+ window.initFancySelect = ->
19
19
  return if gon.test
20
- chosen_options =
21
- allow_single_deselect: true
22
- no_results_text: I18n.t('admin_js.no_results')
23
- placeholder_text_single: ' '
24
- placeholder_text_multiple: ' '
25
- $('form .do_chosen, .without_form.do_chosen, form .do_chosen_multi').chosen(chosen_options)
20
+ options =
21
+ formatNoMatches: -> I18n.t('admin_js.no_results')
22
+ placeholder: ' '
23
+ width: 'resolve'
24
+ $('form .fancy_select, .without_form.fancy_select, form .fancy_select_multi').select2(options)
25
+ # chosen_options =
26
+ # allow_single_deselect: true
27
+ # no_results_text: I18n.t('admin_js.no_results')
28
+ # placeholder_text_single: ' '
29
+ # placeholder_text_multiple: ' '
30
+ # $('form .do_chosen, .without_form.do_chosen, form .do_chosen_multi').chosen(chosen_options)
26
31
 
27
32
  window.initAcFileds = ->
28
33
  for el in $('.ac_field')
@@ -60,3 +65,6 @@ window.inputSetToggle = ->
60
65
 
61
66
  window.flash = (type, message) ->
62
67
  $('#wrap').prepend $("<div class='alert alert-#{type}'><a class='close' data-dismiss='alert'>×</a>#{message}</div>")
68
+
69
+ window.focusInput = (scope=null) ->
70
+ $('input[type="text"],input[type="string"],select:visible,textarea:visible', scope || $('form.simple_form:first')).get(0)?.focus()
@@ -68,6 +68,9 @@ $.fn.loadSelect = (optionsDataArray) ->
68
68
  else
69
69
  selectElement.add option, null
70
70
 
71
+ $.fn.scrollToEl = ->
72
+ $('html, body').animate({scrollTop: $(this).offset().top}, 'slow')
73
+
71
74
  $.parseQuery = ->
72
75
  window.location.search.replace("?", "").parseQuery()
73
76
 
@@ -20,4 +20,4 @@ $ ->
20
20
 
21
21
  $('.simple_form').bind "nested:fieldAdded", =>
22
22
  initPickers()
23
- initChosen()
23
+ initFancySelect()
@@ -1,7 +1,8 @@
1
1
  //= require ab_admin/bootstrap-datepicker
2
2
  //= require ab_admin/bootstrap-timepicker
3
3
  //= require bootstrap-wysihtml5
4
- //= require ab_admin/chosen
4
+ //= require bootstrap-editable
5
+ //= require select2
5
6
  //= require ab_admin/bootstrap_and_overrides
6
7
  //= require ab_admin/fileupload
7
8
 
@@ -72,4 +72,16 @@ table.index_table {
72
72
  tr.selected td {
73
73
  background: #d9e4ec;
74
74
  }
75
+ .form-actions {
76
+ position: static;
77
+ background-color: transparent;
78
+ border-top: none;
79
+ margin: 0;
80
+ .extra_buttons button {
81
+ display: none;
82
+ }
83
+ }
84
+ form.simple_form {
85
+ margin: 0;
86
+ }
75
87
  }
@@ -19,7 +19,7 @@ class Admin::BaseController < ::InheritedResources::Base
19
19
  helper_method :button_scopes, :collection_action?, :action_items, :resource_action_items, :csv_builder,
20
20
  :preview_resource_path, :get_subject, :settings, :batch_action_list, :tree_node_renderer
21
21
 
22
- respond_to :json, :only => [:index]
22
+ respond_to :json, :only => [:index, :update]
23
23
 
24
24
  rescue_from ::CanCan::AccessDenied, :with => :render_unauthorized
25
25
 
@@ -42,6 +42,8 @@ class Admin::BaseController < ::InheritedResources::Base
42
42
  def create
43
43
  create! do |success, failure|
44
44
  success.html { redirect_to redirect_to_on_success }
45
+ success.js { render :layout => false }
46
+ failure.js { render :new, :layout => false }
45
47
  end
46
48
  end
47
49
 
@@ -49,6 +51,8 @@ class Admin::BaseController < ::InheritedResources::Base
49
51
  update! do |success, failure|
50
52
  success.html { redirect_to redirect_to_on_success }
51
53
  failure.html { render :edit }
54
+ success.js { render :layout => false }
55
+ failure.js { render :edit, :layout => false }
52
56
  end
53
57
  end
54
58
 
@@ -56,6 +60,18 @@ class Admin::BaseController < ::InheritedResources::Base
56
60
  destroy! { redirect_to_on_success }
57
61
  end
58
62
 
63
+ def edit
64
+ edit! do |format|
65
+ format.js { render :layout => false }
66
+ end
67
+ end
68
+
69
+ def new
70
+ new! do |format|
71
+ format.js { render :layout => false }
72
+ end
73
+ end
74
+
59
75
  def batch
60
76
  raise 'No ids specified for batch action' unless params[:ids].present?
61
77
  batch_action = params[:batch_action].to_sym
@@ -119,7 +135,8 @@ class Admin::BaseController < ::InheritedResources::Base
119
135
  end
120
136
 
121
137
  def settings
122
- {:index_view => 'table', :sidebar => collection_action?, :well => (collection_action? || action_name == 'show'), :search => true, :batch => true}
138
+ {:index_view => 'table', :sidebar => collection_action?, :well => (collection_action? || action_name == 'show'),
139
+ :search => true, :batch => true, :hotkeys => true}
123
140
  end
124
141
 
125
142
  def action_items
@@ -223,6 +240,7 @@ class Admin::BaseController < ::InheritedResources::Base
223
240
  gon.bg_color = current_user.bg_color
224
241
  gon.admin = admin?
225
242
  gon.test = Rails.env.test?
243
+ gon.hotkeys = settings[:hotkeys]
226
244
  end
227
245
 
228
246
  def moderator?
@@ -1,5 +1,3 @@
1
- #load 'ab_admin/abstract_resource.rb'
2
-
3
1
  class ::Admin::ManagerController < ::Admin::BaseController
4
2
  include AbAdmin::Utils::EvalHelpers
5
3
  include AbAdmin::Controllers::Tree
@@ -0,0 +1,6 @@
1
+ <%
2
+ form_wrap_id = dom_id(resource_class.new, 'list_edit')
3
+ html = render('table', :collection => [resource])[/<tr id[^>]+>.*<\/tr>/].html_safe
4
+ %>
5
+ $('#<%= form_wrap_id %>').remove();
6
+ $('#list tbody').prepend('<%= j html %>');
@@ -0,0 +1,10 @@
1
+ <%
2
+ el_id = dom_id(resource, 'list')
3
+ form_wrap_id = dom_id(resource, 'list_edit')
4
+ html = %[<tr id="#{form_wrap_id}" class="warning"><td>#{render('form')}</td></tr>].html_safe
5
+ %>
6
+ $('#<%= form_wrap_id %>').remove();
7
+ $('#<%= el_id %>').after('<%= j html %>');
8
+ $('#<%= form_wrap_id %> td').attr('colspan', $('#list tr:first th').length);
9
+ $('#<%= el_id %>').scrollToEl();
10
+ $('#<%= form_wrap_id %> form').trigger('admin:form_init');
@@ -2,9 +2,8 @@
2
2
  = form_tag url_for(:action => :batch), :id => 'batch_action_form', :class => 'pjax-form' do
3
3
  input name='batch_action' id='batch_action' type='hidden'
4
4
  = render 'admin/shared/batch_actions'
5
- #content= render settings[:index_view]
6
- - else
7
- #content= render settings[:index_view]
5
+
6
+ #content= render settings[:index_view]
8
7
  .pagination.pull-left
9
8
  = will_paginate collection, :renderer => BootstrapPagination::Rails
10
9
  .pagination_info= pagination_info collection
@@ -0,0 +1,8 @@
1
+ <%
2
+ form_wrap_id = dom_id(resource, 'list_edit')
3
+ html = %[<tr id="#{form_wrap_id}" class="warning"><td>#{render('form')}</td></tr>].html_safe
4
+ %>
5
+ $('#<%= form_wrap_id %>').remove();
6
+ $('#list tbody').prepend('<%= j html %>');
7
+ $('#<%= form_wrap_id %> td').attr('colspan', $('#list tr:first th').length);
8
+ $('#<%= form_wrap_id %> form').trigger('admin:form_init');
@@ -0,0 +1,7 @@
1
+ <%
2
+ form_wrap_id = dom_id(resource, 'list_edit')
3
+ html = render('table', :collection => [resource])[/<tr id[^>]+>.*<\/tr>/].html_safe
4
+ %>
5
+ $('#<%= form_wrap_id %>').remove();
6
+ $('#<%= dom_id(resource, 'list') %>').replaceWith('<%= j html %>');
7
+ $('#<%= dom_id(resource, 'list') %>').addClass('success').scrollToEl()
@@ -2,4 +2,4 @@
2
2
  = render tmpl
3
3
  - else
4
4
  - search_builder.fields.each do |field|
5
- = f.input field.data
5
+ = f.input field.data, field.options
@@ -0,0 +1,7 @@
1
+ - if tmpl = admin_partial_name(show_builder)
2
+ = render tmpl
3
+ - else
4
+ - show_builder.fields.each do |field|
5
+ tr
6
+ td= ha(field.name)
7
+ td= admin_pretty_data call_method_or_proc_on(resource, field.data)
@@ -19,9 +19,13 @@
19
19
  th=t 'admin.table.actions'
20
20
  tbody
21
21
  - collection.each do |item|
22
- tr
22
+ tr id=dom_id(item, 'list')
23
23
  = batch_action_item(item)
24
24
  td= id_link(item)
25
25
  - table_builder.fields.each do |field|
26
- td= admin_pretty_data call_method_or_proc_on(item, field.data)
26
+ td
27
+ - if field.options[:editable] && field.data.is_a?(Symbol)
28
+ = admin_editable item, field.data, field.options[:editable]
29
+ - else
30
+ = admin_pretty_data call_method_or_proc_on(item, field.data)
27
31
  td.actions= item_index_actions(item)
@@ -19,6 +19,6 @@ input type='hidden' name='return_to' value=return_to
19
19
  - if can? :edit, resource
20
20
  button.btn.btn-info type="submit" name="_add_edit" data-disable-with=t('admin.form.save_and_edit')
21
21
  = t('admin.form.save_and_edit')
22
- a.btn href=(return_to || collection_path)
22
+ a.btn.form_cancel href=(return_to || collection_path)
23
23
  = icon('remove')
24
24
  = t('admin.form.cancel')
@@ -24,7 +24,7 @@ Feature: Actions items
24
24
  Then I should see action items:
25
25
  | Create | Review | Remove |
26
26
 
27
- When I am on the show admin product page
27
+ When I am on the the admin product page
28
28
  Then I should see action items:
29
29
  | Create | Edit | Remove |
30
30
 
@@ -47,7 +47,7 @@ Feature: Actions items
47
47
  end
48
48
  end
49
49
  """
50
- When I am on the show admin product page
50
+ When I am on the the admin product page
51
51
  Then I should see an action item to "Main page"
52
52
 
53
53
  Scenario: Conditional action item
@@ -59,7 +59,7 @@ Feature: Actions items
59
59
  end
60
60
  end
61
61
  """
62
- When I am on the show admin product page
62
+ When I am on the the admin product page
63
63
  Then I should see an action item to "Secret link"
64
64
 
65
65
  When I am on the edit admin product page
@@ -75,5 +75,5 @@ Feature: Actions items
75
75
  action_item :destroy, false
76
76
  end
77
77
  """
78
- When I am on the show admin product page
78
+ When I am on the the admin product page
79
79
  Then I should not see an action item to "Remove"
@@ -0,0 +1,26 @@
1
+ @dsl @javascript
2
+ Feature: In place edit
3
+
4
+ Background:
5
+ Given I am logged in
6
+ And a product with sku "sofa-12"
7
+ And a configuration of:
8
+ """
9
+ class AbAdminProduct < AbAdmin::AbstractResource
10
+ table do
11
+ field :sku, :editable => true
12
+ field :name
13
+ field :created_at
14
+ end
15
+ end
16
+ """
17
+ And I am on the admin products page
18
+
19
+ Scenario: In place edit field
20
+ When I click "sofa-12"
21
+ And I fill in place with "sofa_new"
22
+ And I submit in place form
23
+ Then I should see "sofa_new"
24
+
25
+ When I reload the page
26
+ Then I should see "sofa_new"
@@ -0,0 +1,46 @@
1
+ @dsl @javascript
2
+ Feature: Editing records in the list
3
+
4
+ Background:
5
+ Given I am logged in
6
+ And a product with sku "sofa-12"
7
+ And a configuration of:
8
+ """
9
+ class AbAdminProduct < AbAdmin::AbstractResource
10
+ settings :list_edit => true
11
+ end
12
+ """
13
+ And I am on the admin products page
14
+
15
+ Scenario: Saving record with valid attributes
16
+ Given I click "Edit"
17
+ Then I should be on the admin products page
18
+ And I fill in "Sku" with "new_sofa" within "#list"
19
+ And I submit form
20
+ When I should see "new_sofa"
21
+ And I should not see "Save"
22
+
23
+ Scenario: Saving record with invalid attributes
24
+ Given I click "Edit"
25
+ Then I should be on the admin products page
26
+ And I fill in "Sku" with "" within "#list"
27
+ And I submit form
28
+ When I should see "Sku can't be blank"
29
+ And I should see "Save"
30
+
31
+ Scenario: Creating record with valid attributes
32
+ Given I click "Create" within ".resource_actions"
33
+ Then I should be on the admin products page
34
+ And I fill in "Sku" with "new_sofa" within "#list"
35
+ And I submit form
36
+ When I should see "new_sofa"
37
+ And I should not see "Save"
38
+
39
+ Scenario: Creating record with invalid attributes
40
+ Given I click "Create" within ".resource_actions"
41
+ Then I should be on the admin products page
42
+ And I fill in "Sku" with "" within "#list"
43
+ And I submit form
44
+ When I should see "Sku can't be blank"
45
+ And I should see "Save"
46
+
@@ -0,0 +1,37 @@
1
+ @dsl
2
+ Feature: Show resource page
3
+
4
+ Background:
5
+ Given I am logged in
6
+ And products exists with attributes:
7
+ | sku | name | price |
8
+ | sofa-12 | FancySofa | 123 |
9
+
10
+ Scenario: Default show view
11
+ Given a configuration of:
12
+ """
13
+ class AbAdminProduct < AbAdmin::AbstractResource
14
+ end
15
+ """
16
+ When I am on the admin product page
17
+ Then I should see attributes table:
18
+ | Sku | sofa-12 |
19
+ | Name | FancySofa |
20
+ | Price | 123 |
21
+
22
+ Scenario: Default show view
23
+ Given a configuration of:
24
+ """
25
+ class AbAdminProduct < AbAdmin::AbstractResource
26
+ show do
27
+ field :sku
28
+ field(:price) {|item| "$#{item.price}" }
29
+ end
30
+ end
31
+ """
32
+ When I am on the admin product page
33
+ Then I should see attributes table:
34
+ | Sku | sofa-12 |
35
+ | Price | $123 |
36
+ And I should not see "FancySofa" within "table"
37
+
@@ -0,0 +1,7 @@
1
+ When /^I fill in place with "(.*?)"$/ do |value|
2
+ find('#list .editableform input').set(value)
3
+ end
4
+
5
+ When /^I submit in place form$/ do
6
+ find('#list .editableform .editable-submit').click()
7
+ end
@@ -0,0 +1,8 @@
1
+ Then /^I should see attributes table:$/ do |table|
2
+ within 'table' do
3
+ table.rows_hash.each do |attr, value|
4
+ page.should have_content(attr)
5
+ page.should have_content(value)
6
+ end
7
+ end
8
+ end
@@ -2,9 +2,9 @@ Given /^a product with sku "(.*?)"$/ do |sku|
2
2
  @product = FactoryGirl.create(:product, :sku => sku)
3
3
  end
4
4
 
5
- Given /^products exists with attributes:$/ do |products|
5
+ Given /^products? exists with attributes:$/ do |products|
6
6
  products.hashes.each do |attrs|
7
- FactoryGirl.create(:full_product, attrs)
7
+ @product = FactoryGirl.create(:full_product, attrs)
8
8
  end
9
9
  end
10
10