adva-core 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/base_controller.rb +48 -2
- data/app/views/layouts/admin.rb +0 -5
- data/app/views/layouts/base.rb +1 -0
- data/lib/adva/generators/engine.rb +14 -6
- data/lib/adva/generators/templates/engine/env.rb +3 -0
- data/lib/adva/generators/templates/engine/feature.erb +3 -0
- data/lib/adva/generators/templates/engine/paths.rb.erb +12 -0
- data/lib/adva/generators/templates/engine/routes.rb.erb +2 -2
- data/lib/adva/generators/templates/engine/test_helper.rb.erb +1 -1
- data/lib/adva_core/version.rb +1 -1
- data/lib/patches/inherited_resources.rb +1 -1
- data/lib/patches/rails/integretion_runner_respond_to.rb +1 -1
- data/lib/patches/rails/route_set_trailing_segment.rb +1 -1
- data/lib/patches/rails/sti_associations.rb +1 -1
- data/lib/patches/simple_form.rb +1 -1
- data/lib/patches/webrat/links-data-method.rb +1 -1
- data/lib/patches/webrat/logger.rb +1 -1
- data/lib/patches/webrat/upload_file.rb +1 -1
- data/lib/testing/assertions.rb +4 -0
- data/lib/testing/helpers/global_helpers.rb +12 -1
- data/lib/testing/paths.rb +5 -0
- data/lib/testing/step_definitions/common_steps.rb +84 -16
- data/lib/testing/step_definitions/transforms.rb +1 -1
- data/lib/webrat/integrations/rails.rb +1 -1
- data/public/images/adva-core/admin/closed.png +0 -0
- data/public/images/adva-core/admin/open.png +0 -0
- data/public/javascripts/adva-core/admin.js +6 -0
- data/public/stylesheets/adva-core/admin/lists.css +27 -5
- data/public/stylesheets/adva-core/admin/styles.css +6 -0
- metadata +25 -21
- data/lib/patches/arel_in_subquery.rb +0 -44
@@ -8,11 +8,57 @@ class BaseController < InheritedResources::Base
|
|
8
8
|
layout 'default'
|
9
9
|
helper_method :site
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
mattr_accessor :sortable
|
12
|
+
self.sortable = []
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def responder
|
16
|
+
Adva::Responder
|
17
|
+
end
|
18
|
+
|
19
|
+
def sortable?(order)
|
20
|
+
!!sortable_direction(order)
|
21
|
+
end
|
22
|
+
|
23
|
+
def sortable_direction(order)
|
24
|
+
self.sortable.assoc(order.to_sym).last rescue nil
|
25
|
+
end
|
13
26
|
end
|
14
27
|
|
15
28
|
def site
|
16
29
|
@site ||= Site.by_host(request.host_with_port)
|
17
30
|
end
|
31
|
+
|
32
|
+
def collection
|
33
|
+
params[:order].present? ? sort(super, params[:order]) : super
|
34
|
+
end
|
35
|
+
|
36
|
+
protected
|
37
|
+
|
38
|
+
def sort(collection, order)
|
39
|
+
if !self.class.sortable?(order)
|
40
|
+
collection
|
41
|
+
elsif collection.respond_to?(order)
|
42
|
+
collection.send(order)
|
43
|
+
elsif collection.arel_table[order]
|
44
|
+
collection.order(collection.arel_table[order].send(self.class.sortable_direction(order)))
|
45
|
+
else
|
46
|
+
collection
|
47
|
+
end
|
48
|
+
end
|
18
49
|
end
|
50
|
+
|
51
|
+
# ActiveRecord::Base.class_eval do
|
52
|
+
# mattr_reader :sortable
|
53
|
+
# self.sortable = []
|
54
|
+
#
|
55
|
+
# class << self
|
56
|
+
# def sortable_by?(name)
|
57
|
+
# sortable.include?(name)
|
58
|
+
# end
|
59
|
+
#
|
60
|
+
# def sort_by(name)
|
61
|
+
# sortable_by?(name) && respond_to?(name) : send(name) : self
|
62
|
+
# end
|
63
|
+
# end
|
64
|
+
# end
|
data/app/views/layouts/admin.rb
CHANGED
data/app/views/layouts/base.rb
CHANGED
@@ -4,14 +4,14 @@ module Adva
|
|
4
4
|
module Generators
|
5
5
|
class Engine < Rails::Generators::Base
|
6
6
|
source_root File.expand_path('../templates/engine', __FILE__)
|
7
|
-
|
7
|
+
|
8
8
|
attr_reader :name
|
9
|
-
|
9
|
+
|
10
10
|
def initialize(name, options = {})
|
11
11
|
@name = name
|
12
12
|
super()
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def build
|
16
16
|
empty_directory "adva-#{name}"
|
17
17
|
template "gemspec.erb", "adva-#{name}/adva-#{name}.gemspec"
|
@@ -31,15 +31,23 @@ module Adva
|
|
31
31
|
empty_directory "adva-#{name}/db/migrate"
|
32
32
|
template 'migration.rb.erb', "adva-#{name}/db/migrate/#{migration_timestamp}_adva_#{name}_create_tables.rb"
|
33
33
|
|
34
|
+
empty_directory "adva-#{name}/features"
|
35
|
+
template 'env.rb', "adva-#{name}/features/env.rb"
|
36
|
+
template 'feature.erb', "adva-#{name}/features/#{name}.feature"
|
37
|
+
|
34
38
|
empty_directory "adva-#{name}/lib/adva"
|
35
39
|
create_file "adva-#{name}/lib/adva-#{name}.rb", "require 'adva/#{name}'"
|
36
40
|
template 'engine.rb.erb', "adva-#{name}/lib/adva/#{name}.rb"
|
37
41
|
|
42
|
+
empty_directory "adva-#{name}/lib/testing"
|
43
|
+
create_file "adva-#{name}/lib/paths.rb", "adva-#{name}/lib/step_definitions.rb"
|
44
|
+
template 'paths.rb.erb', "adva-#{name}/lib/testing/paths.rb"
|
45
|
+
|
38
46
|
empty_directory "adva-#{name}/test"
|
39
47
|
template 'all.rb', "adva-#{name}/test/all.rb"
|
40
48
|
template 'test_helper.rb.erb', "adva-#{name}/test/test_helper.rb"
|
41
49
|
end
|
42
|
-
|
50
|
+
|
43
51
|
protected
|
44
52
|
|
45
53
|
def migration_timestamp
|
@@ -49,10 +57,10 @@ module Adva
|
|
49
57
|
def table_name
|
50
58
|
name.tableize
|
51
59
|
end
|
52
|
-
|
60
|
+
|
53
61
|
def class_name
|
54
62
|
name.camelize
|
55
63
|
end
|
56
64
|
end
|
57
65
|
end
|
58
|
-
end
|
66
|
+
end
|
@@ -1,3 +1,3 @@
|
|
1
1
|
# Rails.application.routes.draw do
|
2
|
-
#
|
3
|
-
# end
|
2
|
+
# resources :<%= name %>
|
3
|
+
# end
|
data/lib/adva_core/version.rb
CHANGED
data/lib/patches/simple_form.rb
CHANGED
data/lib/testing/assertions.rb
CHANGED
@@ -3,7 +3,18 @@ module GlobalHelpers
|
|
3
3
|
Site.first || raise("Could not find a site. Maybe you want to set one up in your story background?")
|
4
4
|
end
|
5
5
|
|
6
|
+
def user
|
7
|
+
@user || raise("@current_user is not set. Maybe you want to sign in first?")
|
8
|
+
end
|
9
|
+
|
6
10
|
def account
|
7
11
|
Account.first || raise("Could not find a site. Maybe you want to set one up in your story background?")
|
8
12
|
end
|
9
|
-
|
13
|
+
|
14
|
+
def parsed_html
|
15
|
+
# memoizing this causes problems since it seems to be memoized across requests
|
16
|
+
# TODO: Figure out way to memoize within one request only
|
17
|
+
# @parsed_body ||= Nokogiri::HTML(response.body)
|
18
|
+
Nokogiri::HTML(response.body)
|
19
|
+
end
|
20
|
+
end
|
data/lib/testing/paths.rb
CHANGED
@@ -18,6 +18,11 @@ module Adva::Core::Paths
|
|
18
18
|
section = Section.where(:name => $1).first || raise("could not find section named #{$1}")
|
19
19
|
polymorphic_path(section)
|
20
20
|
|
21
|
+
# the "Catalog" section page, ordered by "most viewed"
|
22
|
+
when /,? ordered by "([^\"]*)"$/
|
23
|
+
order = $1
|
24
|
+
path_to(page.gsub(/,? ordered by "[^\"]*"$/, '')) + "?order=#{order.gsub(' ', '_')}"
|
25
|
+
|
21
26
|
when /^the admin sites page$/
|
22
27
|
polymorphic_path([:admin, :sites])
|
23
28
|
|
@@ -78,16 +78,29 @@ When /^(.+) that link$/ do |step|
|
|
78
78
|
When %(#{step} "#{@last_link}")
|
79
79
|
end
|
80
80
|
|
81
|
-
When /^I (press|click) "(.*)" in the row (of the ([a-z ]+) table )?where "(.*)" is "(.*)"$/ do |
|
81
|
+
When /^I (press|click|follow) "(.*)" in the row (of the ([a-z ]+) table )?where "(.*)" is "(.*)"$/ do |action, target, _, table_id, header, content|
|
82
82
|
body = Nokogiri::HTML(response.body)
|
83
83
|
table_xpath = table_id.nil? ? 'table' : "table[@id='#{table_id.gsub(/ /, '_')}']"
|
84
|
-
|
85
|
-
assert !
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
84
|
+
headers = body.xpath("//#{table_xpath}/descendant::th[normalize-space(text())='#{header}']/@id")
|
85
|
+
assert !headers.empty?, "could not find table header cell #{header.inspect}"
|
86
|
+
|
87
|
+
header_id = headers.first.value
|
88
|
+
cell_path = "//#{table_xpath}/descendant::td[@headers='#{header_id}']"
|
89
|
+
content = "normalize-space(text())='#{content}'"
|
90
|
+
tag_path = "#{cell_path}[#{content}]/ancestor::tr/@id"
|
91
|
+
nested_tag_path = "#{cell_path}/descendant::*[#{content}]/ancestor::tr/@id"
|
92
|
+
|
93
|
+
rows = body.xpath([tag_path, nested_tag_path].join('|'))
|
94
|
+
assert !rows.empty?, "could not find table row where a cell has the header id #{header_id.inspect} and the content #{content.inspect}"
|
95
|
+
|
96
|
+
map = { 'press' => 'click_button', 'click' => 'click_link' }
|
97
|
+
within("##{rows.first.value}") { map[action] ? send(map[action], target) : When(%(I #{action} "#{target}")) }
|
98
|
+
end
|
99
|
+
|
100
|
+
When /^I order the (.*)s list by "([^"]*)"$/ do |model, order|
|
101
|
+
When %(I select "#{order}" from "#{model}s_order")
|
102
|
+
select = Webrat::Locators::FieldLocator.new(webrat, webrat.dom, "#{model}s_order", Webrat::SelectField).locate!
|
103
|
+
select.send(:form).submit
|
91
104
|
end
|
92
105
|
|
93
106
|
When /^I visit the url from the email to (.*)$/ do |to|
|
@@ -97,6 +110,10 @@ When /^I visit the url from the email to (.*)$/ do |to|
|
|
97
110
|
visit(url)
|
98
111
|
end
|
99
112
|
|
113
|
+
# Examples:
|
114
|
+
# I should see a product row where "Name" is "Apple Powerbook"
|
115
|
+
# I should not see a product row where "Name" is "Apple Powerbook"
|
116
|
+
# I should see a row in the products table where "Name" is "Apple Powerbook"
|
100
117
|
Then /^I should (not )?see a ([a-z ]+ )?row (?:of the ([a-z ]+) table )?where "(.*)" is "(.*)"$/ do |optional_not, row_classes, table_id, header, cell_content|
|
101
118
|
body = Nokogiri::HTML(response.body)
|
102
119
|
table_xpath = table_id.nil? ? 'table' : "table[@id='#{table_id.gsub(/ /, '_')}']"
|
@@ -111,7 +128,7 @@ Then /^I should (not )?see a ([a-z ]+ )?row (?:of the ([a-z ]+) table )?where "(
|
|
111
128
|
"contains(concat(' ', normalize-space(@class), ' '), ' #{row_class} ')"
|
112
129
|
end.join(' and ')
|
113
130
|
tr_xpath = class_condition.empty? ? 'ancestor::tr' : "ancestor::tr[#{class_condition}]"
|
114
|
-
xpath_result = body.xpath("//#{table_xpath}/descendant::td[@headers='#{header_id}'][normalize-space(text())='#{cell_content}']/#{tr_xpath}
|
131
|
+
xpath_result = body.xpath("//#{table_xpath}/descendant::td[@headers='#{header_id}'][normalize-space(text())='#{cell_content}']/#{tr_xpath}")
|
115
132
|
|
116
133
|
if optional_not.present?
|
117
134
|
assert xpath_result.empty?, "Expected not find a row where #{header.inspect} is #{cell_content}."
|
@@ -158,6 +175,8 @@ Then /^the title should be "([^"]+)"$/ do |title|
|
|
158
175
|
assert_select('title', title)
|
159
176
|
end
|
160
177
|
|
178
|
+
# TODO: This is an almost duplicate step
|
179
|
+
# Use the one with un-quoted 'thing' expression
|
161
180
|
Then /^I should see (an?|the) "([^"]+)"$/ do |kind, thing|
|
162
181
|
kind = { 'a' => '.', 'the' => '#' }[kind]
|
163
182
|
assert_select("#{kind}#{thing}")
|
@@ -168,14 +187,21 @@ Then /^I should see a link "([^"]+)"$/ do |link|
|
|
168
187
|
assert_select('a', link)
|
169
188
|
end
|
170
189
|
|
171
|
-
Then /^I should not see any (
|
172
|
-
assert_select(".#{type.singularize}", :count => 0)
|
190
|
+
Then /^I should not see any ([a-z_ ]+)$/ do |type|
|
191
|
+
assert_select(".#{type.gsub(' ', '_').singularize}", :count => 0)
|
173
192
|
end
|
174
193
|
|
175
194
|
Then /^I should see an? (\w+)$/ do |type|
|
176
195
|
assert_select(".#{type}")
|
177
196
|
end
|
178
197
|
|
198
|
+
Then /^I should see a "([^"]*)" select box with the following options:$/ do |name, options|
|
199
|
+
select = Webrat::Locators::FieldLocator.new(webrat, webrat.dom, 'products_order', Webrat::SelectField).locate!
|
200
|
+
actual = select.options.map(&:inner_text).uniq
|
201
|
+
expected = options.raw.flatten[1..-1] # ignores the first row
|
202
|
+
assert_equal expected, actual
|
203
|
+
end
|
204
|
+
|
179
205
|
Then /^I should see an? (\w+) (?:titled|named) "([^"]+)"$/ do |type, text|
|
180
206
|
assert_select(".#{type} h2", text)
|
181
207
|
end
|
@@ -184,6 +210,18 @@ Then /^I should see an? (\w+) containing "([^"]+)"$/ do |type, text|
|
|
184
210
|
assert_select(".#{type}", /#{text}/)
|
185
211
|
end
|
186
212
|
|
213
|
+
# TODO: the sinature of this step should really be:
|
214
|
+
# I should see 'foo' within 'bar'
|
215
|
+
# However, the generic "within 'bar'" meta step uses 'within' which doesn't currently work with assertions
|
216
|
+
# only with navigation ('click', 'press')
|
217
|
+
Then /^the ([^"]+) should(?: (not))? contain "([^"]+)"$/ do |container_name, optional_negation, text|
|
218
|
+
container_id = container_name.gsub(' ', '_')
|
219
|
+
# 'within' doesn't currently work with assertions, so we need to resort to xpath
|
220
|
+
# within('#' + container_id) { assert_contain text }
|
221
|
+
assert(parsed_html.xpath("//*[@id=\"#{container_id}\"]").any?, "Could not find the #{container_name}")
|
222
|
+
assert(parsed_html.xpath("//*[@id=\"#{container_id}\"]/descendant::*[contains(normalize-space(text()), \"#{text}\")]").send(optional_negation ? :'none?' : :'any?'), "Could not see '#{text}' in the #{container_name}")
|
223
|
+
end
|
224
|
+
|
187
225
|
Then /^I should see an? (\w+) list$/ do |type|
|
188
226
|
assert_select(".#{type}.list")
|
189
227
|
end
|
@@ -192,6 +230,16 @@ Then /^I should see a list of (\w+)$/ do |type|
|
|
192
230
|
assert_select(".#{type}.list")
|
193
231
|
end
|
194
232
|
|
233
|
+
Then /^the (.*) list should display (.*)s in the following order:$/ do |list, model, values|
|
234
|
+
expected = values.raw.flatten
|
235
|
+
name = expected.shift
|
236
|
+
selector = "##{list}.list tr td.#{name}"
|
237
|
+
rows = parsed_html.css(selector)
|
238
|
+
|
239
|
+
assert !rows.empty?, "could not find any elements matching #{selector.inspect}"
|
240
|
+
assert_equal expected, rows.map(&:content)
|
241
|
+
end
|
242
|
+
|
195
243
|
Then /^I should see an? ([a-z ]+) form$/ do |type|
|
196
244
|
tokens = type.split(' ')
|
197
245
|
types = [tokens.join('_'), tokens.reverse.join('_')]
|
@@ -219,13 +267,24 @@ Then /^I should see a "(.+)" table with the following entries:$/ do |table_id, e
|
|
219
267
|
diff_table = expected_table.dup
|
220
268
|
diff_table.diff!(actual_table.dup)
|
221
269
|
rescue
|
222
|
-
puts
|
223
|
-
puts "Expected table:#{expected_table.to_s}\n"
|
224
|
-
puts "Difference:#{diff_table.to_s}\n"
|
270
|
+
puts tables_differ_message(actual_table, expected_table, diff_table)
|
225
271
|
raise
|
226
272
|
end
|
227
273
|
end
|
228
274
|
|
275
|
+
Then /^I should see a "(.+)" table with the following entries in no particular order:$/ do |table_id, expected_table|
|
276
|
+
actual_table = table(tableish("table##{table_id} tr", 'td,th'))
|
277
|
+
expected_rows = expected_table.raw
|
278
|
+
actual_rows = actual_table.raw.transpose.select { |row| expected_rows.first.include?(row.first) }.transpose
|
279
|
+
assert_equal expected_rows.to_set, actual_rows.to_set, tables_differ_message(actual_table, expected_table)
|
280
|
+
end
|
281
|
+
|
282
|
+
def tables_differ_message(actual, expected, diff = nil)
|
283
|
+
msg = "\nActual table:#{actual.to_s}\nExpected table:#{expected.to_s}\n"
|
284
|
+
msg += "Difference:#{diff.to_s}\n" if diff
|
285
|
+
msg
|
286
|
+
end
|
287
|
+
|
229
288
|
Then /^I should see the "([^"]+)" page$/ do |name|
|
230
289
|
assert_select('h2', name)
|
231
290
|
end
|
@@ -289,7 +348,8 @@ Then /^I should see "([^"]*)" formatted as a "([^"]*)" tag$/ do |value, tag|
|
|
289
348
|
assert_select(tag, value)
|
290
349
|
end
|
291
350
|
|
292
|
-
Then
|
351
|
+
Then(/^I should see (\d+|no|one|two|three) ([a-z ]+?)(?: in the ([a-z ]+))?$/) do |amount, item_class, container_id|
|
352
|
+
container_selector = container_id ? '#' + container_id.gsub(' ', '_') : nil
|
293
353
|
amount = case amount
|
294
354
|
when 'no' then 0
|
295
355
|
when 'one' then 1
|
@@ -297,6 +357,14 @@ Then /^I should see (\d+|no|one|two|three) ([a-z ]+)$/ do |amount, item_class|
|
|
297
357
|
when 'three' then 3
|
298
358
|
else amount.to_i
|
299
359
|
end
|
300
|
-
|
360
|
+
item_selector = '.' + item_class.gsub(' ', '_').singularize
|
361
|
+
# assertions do not work with 'within' yet, so we need to resort to cancatenating selectors:
|
362
|
+
# container_selector ? within(container_selector) { assert_select(item_selector) } : assert_select(item_selector)
|
363
|
+
if container_selector
|
364
|
+
assert_select container_selector
|
365
|
+
assert_select [container_selector, item_selector].join(' '), amount
|
366
|
+
else
|
367
|
+
assert_select item_selector, amount
|
368
|
+
end
|
301
369
|
end
|
302
370
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
# works for both normal tables and row_hash tables):
|
4
4
|
timezonify = lambda do |table|
|
5
5
|
dates = table.headers.select { |header| header =~ /(_at|_on)$/ }
|
6
|
-
dates.each { |date| table.map_column!(date) { |date| DateTime.parse(date).in_time_zone } }
|
6
|
+
dates.each { |date| table.map_column!(date) { |date| DateTime.parse(date).in_time_zone if date.present? && date != '-' } }
|
7
7
|
table.transpose
|
8
8
|
end
|
9
9
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# webrat/integrations/rails.rb requires 'action_controller/integration' which
|
2
2
|
# does not exist in rails 3 any more. so we gotta replace the whole file.
|
3
3
|
|
4
|
-
require '
|
4
|
+
require 'gem-patching'
|
5
5
|
|
6
6
|
Gem.patching('webrat', '0.7.2') do
|
7
7
|
require "action_controller"
|
Binary file
|
Binary file
|
@@ -19,4 +19,10 @@ $(document).ready(function() {
|
|
19
19
|
$(selected).addClass('active');
|
20
20
|
});
|
21
21
|
|
22
|
+
$('table.list .toggle').click(function(event) {
|
23
|
+
$(this).hasClass('open') ? $(this).removeClass('open').addClass('closed') : $(this).removeClass('closed').addClass('open');
|
24
|
+
$(this).closest('tr').next().toggle();
|
25
|
+
event.stopPropagation();
|
26
|
+
return false;
|
27
|
+
});
|
22
28
|
});
|
@@ -11,7 +11,7 @@ table.list thead tr:last-child th {
|
|
11
11
|
border-bottom: 3px solid #ddd;
|
12
12
|
}
|
13
13
|
table.list tbody tr {
|
14
|
-
border-bottom: 1px solid #ddd;
|
14
|
+
border-bottom: 1px solid #ddd;
|
15
15
|
}
|
16
16
|
table.list tbody td {
|
17
17
|
position: relative;
|
@@ -36,19 +36,41 @@ table.list span.status {
|
|
36
36
|
padding-left: 10px;
|
37
37
|
display: inline-block;
|
38
38
|
width: 16px;
|
39
|
-
height: 16px;
|
39
|
+
height: 16px;
|
40
40
|
margin-left: 4px;
|
41
41
|
text-indent: 16px;
|
42
42
|
overflow: hidden;
|
43
43
|
vertical-align: middle;
|
44
|
+
background-repeat: no-repeat;
|
45
|
+
}
|
46
|
+
table.list td.status {
|
47
|
+
width: 24px;
|
48
|
+
background-position: 4px 8px;
|
49
|
+
background-repeat: no-repeat;
|
44
50
|
}
|
45
51
|
|
52
|
+
table.list tr.published td.status,
|
46
53
|
table.list span.published {
|
47
|
-
background: url(/images/adva-core/icons/tick.png)
|
54
|
+
background-image: url(/images/adva-core/icons/tick.png);
|
48
55
|
}
|
49
56
|
table.list span.draft,
|
50
57
|
table.list span.hold,
|
51
58
|
table.list span.queued,
|
52
|
-
table.list span.pending
|
53
|
-
|
59
|
+
table.list span.pending,
|
60
|
+
table.list span.unpublished,
|
61
|
+
table.list tr.unpublished td.status {
|
62
|
+
background-image: url(/images/adva-core/icons/hourglass.png);
|
63
|
+
}
|
64
|
+
|
65
|
+
table.list .toggle {
|
66
|
+
padding-left: 18px;
|
67
|
+
background-position: 0 2px;
|
68
|
+
background-repeat: no-repeat;
|
69
|
+
background-image: url(/images/adva-core/admin/closed.png);
|
70
|
+
}
|
71
|
+
table.list .toggle.open {
|
72
|
+
background-image: url(/images/adva-core/admin/open.png);
|
73
|
+
}
|
74
|
+
table.list tr.details {
|
75
|
+
display: none;
|
54
76
|
}
|
@@ -89,6 +89,12 @@ ul.links li:before {
|
|
89
89
|
.actions a.destroy {
|
90
90
|
background: url(/images/adva-core/icons/bin_closed.png) no-repeat -5px top;
|
91
91
|
}
|
92
|
+
.actions a.publish {
|
93
|
+
background: url('/images/adva-core/icons/tick.png');
|
94
|
+
}
|
95
|
+
.actions a.unpublish {
|
96
|
+
background: url('/images/adva-core/icons/delete.png');
|
97
|
+
}
|
92
98
|
|
93
99
|
|
94
100
|
div.pagination {
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adva-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ingo Weiss
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-01-
|
19
|
+
date: 2011-01-31 00:00:00 +01:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -59,28 +59,28 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - "="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
hash:
|
62
|
+
hash: 27
|
63
63
|
segments:
|
64
64
|
- 0
|
65
65
|
- 0
|
66
|
-
-
|
67
|
-
version: 0.0.
|
66
|
+
- 2
|
67
|
+
version: 0.0.2
|
68
68
|
type: :runtime
|
69
69
|
version_requirements: *id003
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
71
|
+
name: gem-patching
|
72
72
|
prerelease: false
|
73
73
|
requirement: &id004 !ruby/object:Gem::Requirement
|
74
74
|
none: false
|
75
75
|
requirements:
|
76
76
|
- - "="
|
77
77
|
- !ruby/object:Gem::Version
|
78
|
-
hash:
|
78
|
+
hash: 25
|
79
79
|
segments:
|
80
80
|
- 0
|
81
81
|
- 0
|
82
|
-
-
|
83
|
-
version: 0.0.
|
82
|
+
- 3
|
83
|
+
version: 0.0.3
|
84
84
|
type: :runtime
|
85
85
|
version_requirements: *id004
|
86
86
|
- !ruby/object:Gem::Dependency
|
@@ -139,12 +139,12 @@ dependencies:
|
|
139
139
|
requirements:
|
140
140
|
- - "="
|
141
141
|
- !ruby/object:Gem::Version
|
142
|
-
hash:
|
142
|
+
hash: 45
|
143
143
|
segments:
|
144
144
|
- 0
|
145
145
|
- 0
|
146
|
-
-
|
147
|
-
version: 0.0.
|
146
|
+
- 25
|
147
|
+
version: 0.0.25
|
148
148
|
type: :runtime
|
149
149
|
version_requirements: *id008
|
150
150
|
- !ruby/object:Gem::Dependency
|
@@ -187,12 +187,12 @@ dependencies:
|
|
187
187
|
requirements:
|
188
188
|
- - "="
|
189
189
|
- !ruby/object:Gem::Version
|
190
|
-
hash:
|
190
|
+
hash: 63
|
191
191
|
segments:
|
192
192
|
- 0
|
193
193
|
- 0
|
194
|
-
-
|
195
|
-
version: 0.0.
|
194
|
+
- 16
|
195
|
+
version: 0.0.16
|
196
196
|
type: :runtime
|
197
197
|
version_requirements: *id011
|
198
198
|
- !ruby/object:Gem::Dependency
|
@@ -203,12 +203,12 @@ dependencies:
|
|
203
203
|
requirements:
|
204
204
|
- - "="
|
205
205
|
- !ruby/object:Gem::Version
|
206
|
-
hash:
|
206
|
+
hash: 37
|
207
207
|
segments:
|
208
208
|
- 0
|
209
209
|
- 0
|
210
|
-
-
|
211
|
-
version: 0.0.
|
210
|
+
- 29
|
211
|
+
version: 0.0.29
|
212
212
|
type: :runtime
|
213
213
|
version_requirements: *id012
|
214
214
|
- !ruby/object:Gem::Dependency
|
@@ -337,7 +337,6 @@ files:
|
|
337
337
|
- lib/patches/inherited_resources.rb
|
338
338
|
- lib/patches/responders/flash_responder.rb
|
339
339
|
- lib/patches/simple_form.rb
|
340
|
-
- lib/patches/arel_in_subquery.rb
|
341
340
|
- lib/patches/thor/group/symbolized_options.rb
|
342
341
|
- lib/patches/thor/core_ext/hash.rb
|
343
342
|
- lib/adva-core.rb
|
@@ -354,7 +353,10 @@ files:
|
|
354
353
|
- lib/adva/generators/install.rb
|
355
354
|
- lib/adva/generators/gemfile.rb
|
356
355
|
- lib/adva/generators/templates/engine/migration.rb.erb
|
356
|
+
- lib/adva/generators/templates/engine/feature.erb
|
357
357
|
- lib/adva/generators/templates/engine/test_helper.rb.erb
|
358
|
+
- lib/adva/generators/templates/engine/paths.rb.erb
|
359
|
+
- lib/adva/generators/templates/engine/env.rb
|
358
360
|
- lib/adva/generators/templates/engine/engine.rb.erb
|
359
361
|
- lib/adva/generators/templates/engine/routes.rb.erb
|
360
362
|
- lib/adva/generators/templates/engine/en.yml.erb
|
@@ -548,9 +550,11 @@ files:
|
|
548
550
|
- public/images/adva-core/admin/tab_action_active.png
|
549
551
|
- public/images/adva-core/admin/tab_sidebar_active.png
|
550
552
|
- public/images/adva-core/admin/tab_main_active.png
|
553
|
+
- public/images/adva-core/admin/open.png
|
551
554
|
- public/images/adva-core/admin/header_bg.png
|
552
555
|
- public/images/adva-core/admin/tab_top_active.png
|
553
556
|
- public/images/adva-core/admin/menu_checkmark.png
|
557
|
+
- public/images/adva-core/admin/closed.png
|
554
558
|
- public/images/adva-core/filter-bg.png
|
555
559
|
- public/images/adva-core/grid.png
|
556
560
|
- public/images/adva-core/theme_selected.png
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# https://gist.github.com/730257
|
2
|
-
# bars.where(bars[:id].in(foos.project(:bar_id).where(...)))
|
3
|
-
|
4
|
-
Gem.patching('arel', '2.0.6') do
|
5
|
-
Arel::Predications.module_eval do
|
6
|
-
def in_with_select_fix(other)
|
7
|
-
case other
|
8
|
-
when Arel::SelectManager
|
9
|
-
Arel::Nodes::In.new(self, other)
|
10
|
-
else
|
11
|
-
in_without_select_fix(other)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
alias_method_chain :in, :select_fix
|
15
|
-
|
16
|
-
def not_in_with_select_fix(other)
|
17
|
-
case other
|
18
|
-
when Arel::SelectManager
|
19
|
-
Arel::Nodes::NotIn.new(self, other)
|
20
|
-
else
|
21
|
-
in_without_select_fix(other)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
alias_method_chain :not_in, :select_fix
|
25
|
-
end
|
26
|
-
|
27
|
-
Arel::Visitors::ToSql.class_eval do
|
28
|
-
def visit_Arel_SelectManager o
|
29
|
-
o.to_sql
|
30
|
-
end
|
31
|
-
|
32
|
-
def visit_Arel_Nodes_In o
|
33
|
-
"#{visit o.left} IN (#{visit o.right})"
|
34
|
-
end
|
35
|
-
|
36
|
-
def visit_Arel_Nodes_NotIn o
|
37
|
-
"#{visit o.left} NOT IN (#{visit o.right})"
|
38
|
-
end
|
39
|
-
|
40
|
-
def visit_Array o
|
41
|
-
o.empty? ? 'NULL' : o.map { |x| visit x }.join(', ')
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|