campbellhay-bureau 4.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/campbellhay-bureau.gemspec +14 -0
- data/gempush +8 -0
- data/lib/_static/_test.txt +1 -0
- data/lib/_static/css/main.css +586 -0
- data/lib/_static/css/plugin.asmselect.css +63 -0
- data/lib/_static/css/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-bg_glass_20_555555_1x400.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-icons_222222_256x240.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-icons_4b8e0b_256x240.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-icons_a83300_256x240.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-icons_cccccc_256x240.png +0 -0
- data/lib/_static/css/ui-darkness/images/ui-icons_ffffff_256x240.png +0 -0
- data/lib/_static/css/ui-darkness/jquery-ui-1.9.1.custom.css +378 -0
- data/lib/_static/css/ui-darkness/jquery-ui-1.9.1.custom.min.css +5 -0
- data/lib/_static/img/backend_small_icons.png +0 -0
- data/lib/_static/img/btn.png +0 -0
- data/lib/_static/img/btn_old.png +0 -0
- data/lib/_static/img/file.png +0 -0
- data/lib/_static/img/handle.png +0 -0
- data/lib/_static/img/help/clone-button.png +0 -0
- data/lib/_static/img/help/create-button.png +0 -0
- data/lib/_static/img/help/delete-button.png +0 -0
- data/lib/_static/img/help/delete-warning.png +0 -0
- data/lib/_static/img/help/document.png +0 -0
- data/lib/_static/img/help/edit-button.png +0 -0
- data/lib/_static/img/help/form.png +0 -0
- data/lib/_static/img/help/image-dimensions.png +0 -0
- data/lib/_static/img/help/list.png +0 -0
- data/lib/_static/img/help/logout.png +0 -0
- data/lib/_static/img/help/move-button.png +0 -0
- data/lib/_static/img/help/overview.png +0 -0
- data/lib/_static/img/help/preview-button.png +0 -0
- data/lib/_static/img/help/relationships.png +0 -0
- data/lib/_static/img/help/reload-button.png +0 -0
- data/lib/_static/img/help/save-or-cancel.png +0 -0
- data/lib/_static/img/help/search.png +0 -0
- data/lib/_static/img/help/sub-section.png +0 -0
- data/lib/_static/img/help/x-list.png +0 -0
- data/lib/_static/img/placeholder.nutshell.jpg +0 -0
- data/lib/_static/img/placeholder.stash_thumb.gif +0 -0
- data/lib/_static/img/small-loader.gif +0 -0
- data/lib/_static/img/underwood_btn.png +0 -0
- data/lib/_static/js/addon.timepicker.js +20 -0
- data/lib/_static/js/jquery-ui-1.9.1.custom.js +8364 -0
- data/lib/_static/js/jquery-ui-1.9.1.custom.min.js +6 -0
- data/lib/_static/js/main.js +347 -0
- data/lib/_static/js/plugin.asmselect.js +407 -0
- data/lib/_static/js/plugin.form.js +23 -0
- data/lib/_static/js/plugin.mapolygon.js +3 -0
- data/lib/_static/js/plugin.quickmask.js +68 -0
- data/lib/_static/js/plugin.quicksearch.js +1 -0
- data/lib/_static/js/plugin.speechify.js +4 -0
- data/lib/_static/js/plugin.underwood.js +4 -0
- data/lib/_templates/_test.txt +1 -0
- data/lib/_templates/head.html +23 -0
- data/lib/_templates/help.html +104 -0
- data/lib/_templates/layout.html +13 -0
- data/lib/bureau/adapter.rb +114 -0
- data/lib/bureau.rb +122 -0
- data/lib/mongo_bureau.rb +214 -0
- data/lib/sequel_bureau_adapter.rb +188 -0
- data/test/spec_bureau.rb +123 -0
- data/test/spec_bureau_adapter.rb +71 -0
- metadata +126 -0
@@ -0,0 +1,188 @@
|
|
1
|
+
require 'bureau/adapter'
|
2
|
+
|
3
|
+
module ::Sequel::Plugins::BureauAdapter
|
4
|
+
|
5
|
+
def self.configure(model, opts = {})
|
6
|
+
model.bureau_config = opts
|
7
|
+
model.crushyform_types.update({
|
8
|
+
:autocomplete => proc do |instance, column_name, options|
|
9
|
+
values = model.select(column_name).exclude(column_name=>'').map(column_name)
|
10
|
+
values = values.inject([]){|s,l| s+l.split(/\s*,\s*/)} if options[:autocomplete_multiple]
|
11
|
+
values.uniq.compact!
|
12
|
+
tag = model.crushyform_types[:string].call(instance, column_name, options)
|
13
|
+
return tag if values.empty?
|
14
|
+
unless options[:autocomplete_multiple]
|
15
|
+
js = <<-EOJS
|
16
|
+
<script type="text/javascript" charset="utf-8">
|
17
|
+
$(function(){
|
18
|
+
$( "##{instance.crushyid_for(column_name)}" ).autocomplete({source: ["#{values.join('","')}"]});
|
19
|
+
});
|
20
|
+
</script>
|
21
|
+
EOJS
|
22
|
+
else
|
23
|
+
js = <<-EOJS
|
24
|
+
<script type="text/javascript" charset="utf-8">
|
25
|
+
$(function(){
|
26
|
+
$( "##{instance.crushyid_for(column_name)}" )
|
27
|
+
.bind( "keydown", function( event ) {
|
28
|
+
if ( event.keyCode === $.ui.keyCode.TAB &&
|
29
|
+
$( this ).data( "autocomplete" ).menu.active ) {
|
30
|
+
event.preventDefault();
|
31
|
+
}
|
32
|
+
})
|
33
|
+
.autocomplete({
|
34
|
+
minLength: 0,
|
35
|
+
source: function( request, response ) {
|
36
|
+
response($.ui.autocomplete.filter(["#{values.join('","')}"], request.term.split(/,\s*/).pop()));
|
37
|
+
},
|
38
|
+
focus: function() { return false; },
|
39
|
+
select: function( event, ui ) {
|
40
|
+
var terms = this.value.split(/,\s*/);
|
41
|
+
terms.pop();
|
42
|
+
terms.push(ui.item.value);
|
43
|
+
terms.push("");
|
44
|
+
this.value = terms.join( ", " );
|
45
|
+
return false;
|
46
|
+
}
|
47
|
+
});
|
48
|
+
});
|
49
|
+
</script>
|
50
|
+
EOJS
|
51
|
+
end
|
52
|
+
tag+js
|
53
|
+
end,
|
54
|
+
:permalink => proc do |instance, column_name, options|
|
55
|
+
values = "<option value=''>Or Browse the list</option>\n"
|
56
|
+
tag = model.crushyform_types[:string].call(instance, column_name, options)
|
57
|
+
return tag if options[:permalink_classes].nil?
|
58
|
+
options[:permalink_classes].each do |sym|
|
59
|
+
c = Kernel.const_get sym
|
60
|
+
entries = c.all
|
61
|
+
unless entries.empty?
|
62
|
+
values << "<optgroup label='#{c.human_name}'>\n"
|
63
|
+
entries.each do |e|
|
64
|
+
values << "<option value='#{e.permalink}' #{'selected' if e.permalink==options[:input_value]}>#{e.to_label}</option>\n"
|
65
|
+
end
|
66
|
+
values << "</optgroup>\n"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
"#{tag}<br />\n<select name='__permalink' class='permalink-dropdown'>\n#{values}</select>\n"
|
70
|
+
end
|
71
|
+
})
|
72
|
+
end
|
73
|
+
|
74
|
+
module ClassMethods
|
75
|
+
|
76
|
+
include Bureau::Adapter::ClassMethods
|
77
|
+
|
78
|
+
attr_accessor :list_options
|
79
|
+
|
80
|
+
def list_view(r)
|
81
|
+
@list_options={:request=>r, :destination=>r.fullpath, :path=>r.script_name }
|
82
|
+
# symbolize keys of filter
|
83
|
+
unless r['filter'].nil?
|
84
|
+
@list_options[:filter] = {}
|
85
|
+
r['filter'].each do |key,value|
|
86
|
+
@list_options[:filter][key.to_sym] = value
|
87
|
+
end
|
88
|
+
end
|
89
|
+
@list_options.store(:search, r['q'].scan(/\w+/).map {|w| "%#{w}%"}) unless r['q'].to_s==''
|
90
|
+
@list_options.store(:sortable,sortable_on_that_page?)
|
91
|
+
o = @list_options
|
92
|
+
|
93
|
+
out = list_view_header
|
94
|
+
out << scene_selector unless bureau_config[:scene_selector_class].nil?
|
95
|
+
out << many_to_many_picker unless bureau_config[:minilist_class].nil?
|
96
|
+
out << "<ul class='nut-tree #{'sortable' if o[:sortable]} #{bureau_config[:nut_tree_class]}' id='#{self.name}' rel='#{o[:path]}/#{self.name}'>"
|
97
|
+
|
98
|
+
ds = self
|
99
|
+
ds = ds.filter(o[:filter]) unless o[:filter].nil?
|
100
|
+
ds = ds.grep(text_columns, o[:search], {:all_patterns=>true, :case_insensitive=>true}) unless (o[:search].nil? || o[:search].empty?)
|
101
|
+
ds.all {|e| out << e.to_nutshell }
|
102
|
+
|
103
|
+
out << "</ul>"
|
104
|
+
out
|
105
|
+
end
|
106
|
+
|
107
|
+
def foreign_key_name plural
|
108
|
+
"#{underscore(demodulize(name))}_id#{'s' if plural}"
|
109
|
+
end
|
110
|
+
|
111
|
+
def human_plural_name; self.table_name.to_s.tr('_', ' ').gsub(/(['\w]+)/) {|s| "#{s.capitalize}"}; end
|
112
|
+
def text_columns; crushyform_schema.inject([]){|a,(k,v)| a<<k if [:text,:string,:autocomplete,:permalink,:select].include?(v[:type]);a}; end
|
113
|
+
|
114
|
+
def sortable_on_that_page?
|
115
|
+
o = @list_options
|
116
|
+
o[:search].nil? && respond_to?(:position_field) && (o[:filter]||{}).keys==[bureau_config[:position_scope]].compact
|
117
|
+
end
|
118
|
+
|
119
|
+
def minilist_view
|
120
|
+
o = "<ul class='minilist'>\n"
|
121
|
+
self.all do |m|
|
122
|
+
thumb = m.respond_to?(:to_bureau_thumb) ? m.to_bureau_thumb('stash_thumb.gif') : m.placeholder_thumb('stash_thumb.gif')
|
123
|
+
o << "<li title='#{m.to_label}' id='mini-#{m.id}'>#{thumb}<div>#{m.to_label}</div></li>\n"
|
124
|
+
end
|
125
|
+
o << "</ul>\n"
|
126
|
+
end
|
127
|
+
|
128
|
+
def scene_selector
|
129
|
+
"Not yet implemented for Sequel. See Mongo implementation. And do not forget to implement instance.scene_selector_coordinates."
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
module InstanceMethods
|
135
|
+
|
136
|
+
include Bureau::Adapter::InstanceMethods
|
137
|
+
|
138
|
+
def in_nutshell
|
139
|
+
o = model.list_options
|
140
|
+
out = "<div class='in-nutshell'>\n"
|
141
|
+
out << self.to_bureau_thumb('nutshell.jpg') if self.respond_to?(:to_bureau_thumb)
|
142
|
+
nutshell_backend_columns.select{|col| [:boolean,:select].include?(model.crushyform_schema[col][:type]) }.each do |c|
|
143
|
+
column_label = c.to_s.sub(/_id$/, '').tr('_', ' ').capitalize
|
144
|
+
out << "<div class='quick-update'><form><span class='column-title'>#{column_label}:</span> #{self.crushyinput(c)}</form></div>\n"
|
145
|
+
end
|
146
|
+
out << "</div>\n"
|
147
|
+
end
|
148
|
+
|
149
|
+
def nutshell_children
|
150
|
+
o = model.list_options
|
151
|
+
out = ""
|
152
|
+
nutshell_backend_associations.each do |ass|
|
153
|
+
ass_ref = model.association_reflection(ass)
|
154
|
+
link = "#{o[:path]}/list/#{ass_ref[:class_name]}?filter[#{ass_ref[:key]}]=#{self.id}"
|
155
|
+
text = ass_ref[:nutshell_link_text] || "#{ass.to_s.tr('_', ' ').split.map{|s|s.capitalize}.join(" ").sub(/s$/,'(s)')}"
|
156
|
+
out << "<a href='#{link}' class='push-stack sublist-link nutshell-child'>#{text} #{self.__send__(ass.to_s+'_dataset').count}</a>\n"
|
157
|
+
end
|
158
|
+
out
|
159
|
+
end
|
160
|
+
|
161
|
+
def nutshell_backend_associations
|
162
|
+
@nutshell_backend_associations ||= model.associations.select do |ass|
|
163
|
+
t = model.association_reflection(ass)[:type]
|
164
|
+
t!=:many_to_one && t!=:many_to_many
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def generic_thumb(img , size='stash_thumb.gif', obj=self)
|
169
|
+
current = obj.__send__(img)
|
170
|
+
if !current.nil? && current[:type][/^image\//]
|
171
|
+
"<img src='#{obj.file_url(img, size)}?#{::Time.now.to_i.to_s}' />\n"
|
172
|
+
else
|
173
|
+
placeholder_thumb(size)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def bureau_after_stash(attachment_name)
|
178
|
+
current = self.__send__(attachment_name)
|
179
|
+
if !current.nil? && current[:type][/^image\//]
|
180
|
+
convert(attachment_name, "-resize '100x75^' -gravity center -extent 100x75", 'stash_thumb.gif')
|
181
|
+
convert(attachment_name, "-resize '184x138^' -gravity center -extent 184x138", 'nutshell.jpg')
|
182
|
+
yield if block_given? # Block is for images transformation so that verification are processed only once
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
data/test/spec_bureau.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bacon'
|
3
|
+
require 'rack'
|
4
|
+
require 'fileutils' # fix Rack missing
|
5
|
+
|
6
|
+
Bacon.summary_on_exit
|
7
|
+
|
8
|
+
# Helpers
|
9
|
+
F = ::File
|
10
|
+
D = ::Dir
|
11
|
+
ROOT = F.dirname(__FILE__)+'/..'
|
12
|
+
$:.unshift ROOT+'/lib'
|
13
|
+
require 'bureau'
|
14
|
+
|
15
|
+
# =========
|
16
|
+
# = Basic =
|
17
|
+
# =========
|
18
|
+
|
19
|
+
class Basic
|
20
|
+
include Bureau
|
21
|
+
config.update :client_name=>"me", :index => ['my_index','with','args']
|
22
|
+
|
23
|
+
before do
|
24
|
+
bureau_before
|
25
|
+
if @action=='instance_config' && !@action_arguments.empty?
|
26
|
+
_config.update :client_name=>@action_arguments.join(' ')
|
27
|
+
@action_arguments = []
|
28
|
+
end
|
29
|
+
if @action=='wrapped' && @r['with_head_addons']=='true'
|
30
|
+
_config[:head_addons] = "<!-- ADDONS -->"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def client_name; self.class.config[:client_name]; end
|
35
|
+
def instance_config; _config[:client_name]; end
|
36
|
+
def get_cms_path; _config[:path]; end
|
37
|
+
def wrapped; @content = ''; _with_layout; end
|
38
|
+
def is_it_xhr; xhr?.to_s; end
|
39
|
+
def my_index(*a); a.join('+'); end
|
40
|
+
def nude_index; 'nude'; end
|
41
|
+
end
|
42
|
+
R = ::Rack::MockRequest.new(::Rack::Lint.new(Basic.new))
|
43
|
+
wrapR = ::Rack::MockRequest.new(::Rack::Lint.new(Basic.new(proc{|env|
|
44
|
+
::Rack::Response.new("<!-- #{::Rack::Utils::unescape(::Rack::Request.new(env)['_destination'])} -->", 201, {'Content-Type'=>'text/html'
|
45
|
+
}).finish})))
|
46
|
+
|
47
|
+
# =========
|
48
|
+
# = Specs =
|
49
|
+
# =========
|
50
|
+
|
51
|
+
describe 'Bureau Static Files' do
|
52
|
+
|
53
|
+
it "Should include Golem mini framework" do
|
54
|
+
Basic.ancestors.include?(Rack::Golem).should==true
|
55
|
+
end
|
56
|
+
|
57
|
+
it "Has a static file path" do
|
58
|
+
R.get('/_static/_test.txt').body.should=='works'
|
59
|
+
end
|
60
|
+
|
61
|
+
it "Reads templates" do
|
62
|
+
Basic.read('_test.txt').should=='works'
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'Bureau Config' do
|
68
|
+
|
69
|
+
it "Should have the right :cms_path automatically after first use of _config" do
|
70
|
+
Basic.config[:path].should=='/admin'
|
71
|
+
R.get('/get_cms_path').body.should==''
|
72
|
+
Basic.config[:path].should==''
|
73
|
+
end
|
74
|
+
|
75
|
+
it "Should be possible to change config values" do
|
76
|
+
R.get('/client_name').body.should=='me'
|
77
|
+
end
|
78
|
+
|
79
|
+
it "Can override instance config for each request" do
|
80
|
+
R.get('/instance_config').body.should=='me'
|
81
|
+
R.get('/instance_config/has/changed').body.should=='has changed'
|
82
|
+
Basic.config[:client_name].should=='me'
|
83
|
+
R.get('/instance_config').body.should=='me'
|
84
|
+
end
|
85
|
+
|
86
|
+
it "Can build the menu" do
|
87
|
+
b = R.get('/wrapped').body
|
88
|
+
b.should.match(/<div class='menu-section-title'>Menu<\/div>/)
|
89
|
+
b.should.match(/<a class='' href='\/'>Home<\/a><br \/>/)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "Can add things at the end of <head> through _config" do
|
93
|
+
R.get('/wrapped?with_head_addons=true').body.should.match(/<!-- ADDONS -->\n<\/head>/)
|
94
|
+
R.get('/wrapped').body.should.not.match(/<!-- ADDONS --><\/head>/)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "Bureau Helpers" do
|
100
|
+
|
101
|
+
it "Should have a xhr? helper that detects pseudo xhr" do
|
102
|
+
R.get('/is_it_xhr').body.should=='false'
|
103
|
+
R.get('/is_it_xhr', "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest").body.should=='true'
|
104
|
+
R.get('/is_it_xhr?_xhr=true').body.should=='true'
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "Bureau behaviour" do
|
110
|
+
|
111
|
+
it "Can wrap form sent by BackendAPI and set _destination" do
|
112
|
+
res = wrapR.get('/Model/3?_no_wrap=true')
|
113
|
+
res.status.should==201
|
114
|
+
res.body.should.match(/^<!DOCTYPE html>.*<!-- \/Model\/3\?_no_wrap=true -->.*<\/html>$/m)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "Can have an index" do
|
118
|
+
R.get('/').body.should=='with+args'
|
119
|
+
Basic.config.update({:index=>['nude_index']})
|
120
|
+
R.get('/').body.should=='nude'
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bacon'
|
3
|
+
Bacon.summary_on_exit
|
4
|
+
|
5
|
+
F = ::File
|
6
|
+
D = ::Dir
|
7
|
+
ROOT = F.dirname(__FILE__)+'/..'
|
8
|
+
$:.unshift(ROOT+'/lib')
|
9
|
+
|
10
|
+
require 'sequel'
|
11
|
+
DB = ::Sequel.sqlite
|
12
|
+
::Sequel::Model.plugin :schema
|
13
|
+
::Sequel::Model.plugin :crushyform
|
14
|
+
|
15
|
+
class NoSort < ::Sequel::Model
|
16
|
+
set_schema do
|
17
|
+
primary_key :id
|
18
|
+
Fixnum :position
|
19
|
+
String :category
|
20
|
+
String :name
|
21
|
+
end
|
22
|
+
create_table unless table_exists?
|
23
|
+
plugin :bureau_adapter
|
24
|
+
end
|
25
|
+
|
26
|
+
class SimpleSort < ::Sequel::Model
|
27
|
+
set_schema do
|
28
|
+
primary_key :id
|
29
|
+
Fixnum :position
|
30
|
+
String :category
|
31
|
+
String :name
|
32
|
+
end
|
33
|
+
create_table unless table_exists?
|
34
|
+
plugin :bureau_adapter
|
35
|
+
plugin :list
|
36
|
+
end
|
37
|
+
|
38
|
+
class ScopeSort < ::Sequel::Model
|
39
|
+
set_schema do
|
40
|
+
primary_key :id
|
41
|
+
Fixnum :position
|
42
|
+
String :category
|
43
|
+
String :name
|
44
|
+
end
|
45
|
+
create_table unless table_exists?
|
46
|
+
plugin :bureau_adapter, :position_scope=>:category
|
47
|
+
plugin :list, :scope=>:category
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "Bureau Adapter" do
|
51
|
+
|
52
|
+
should "Set sortable_on_that_page? correctly" do
|
53
|
+
# Each class with: No filter / Good filter / Good filter but not alone / Bad filter
|
54
|
+
|
55
|
+
NoSort.sortable_on_that_page?.should==false
|
56
|
+
NoSort.sortable_on_that_page?({:filter => {:category=>'4'}}).should==false
|
57
|
+
NoSort.sortable_on_that_page?({:filter => {:category=>'4', :name=>'4'}}).should==false
|
58
|
+
NoSort.sortable_on_that_page?({:filter => {:name=>'4'}}).should==false
|
59
|
+
|
60
|
+
SimpleSort.sortable_on_that_page?.should==true
|
61
|
+
SimpleSort.sortable_on_that_page?({:filter => {:category=>'4'}}).should==false
|
62
|
+
SimpleSort.sortable_on_that_page?({:filter => {:category=>'4', :name=>'4'}}).should==false
|
63
|
+
SimpleSort.sortable_on_that_page?({:filter => {:name=>'4'}}).should==false
|
64
|
+
|
65
|
+
ScopeSort.sortable_on_that_page?.should==false
|
66
|
+
ScopeSort.sortable_on_that_page?({:filter => {:category=>'4'}}).should==true
|
67
|
+
ScopeSort.sortable_on_that_page?({:filter => {:category=>'4', :name=>'4'}}).should==false
|
68
|
+
ScopeSort.sortable_on_that_page?({:filter => {:name=>'4'}}).should==false
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
metadata
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: campbellhay-bureau
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 4.1.7
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mickael Riga
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-06-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rack-golem
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: The CampbellHay Admin System
|
28
|
+
email: mig@campbellhay.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- ".gitignore"
|
34
|
+
- campbellhay-bureau.gemspec
|
35
|
+
- gempush
|
36
|
+
- lib/_static/_test.txt
|
37
|
+
- lib/_static/css/main.css
|
38
|
+
- lib/_static/css/plugin.asmselect.css
|
39
|
+
- lib/_static/css/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png
|
40
|
+
- lib/_static/css/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png
|
41
|
+
- lib/_static/css/ui-darkness/images/ui-bg_glass_20_555555_1x400.png
|
42
|
+
- lib/_static/css/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png
|
43
|
+
- lib/_static/css/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png
|
44
|
+
- lib/_static/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png
|
45
|
+
- lib/_static/css/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png
|
46
|
+
- lib/_static/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png
|
47
|
+
- lib/_static/css/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png
|
48
|
+
- lib/_static/css/ui-darkness/images/ui-icons_222222_256x240.png
|
49
|
+
- lib/_static/css/ui-darkness/images/ui-icons_4b8e0b_256x240.png
|
50
|
+
- lib/_static/css/ui-darkness/images/ui-icons_a83300_256x240.png
|
51
|
+
- lib/_static/css/ui-darkness/images/ui-icons_cccccc_256x240.png
|
52
|
+
- lib/_static/css/ui-darkness/images/ui-icons_ffffff_256x240.png
|
53
|
+
- lib/_static/css/ui-darkness/jquery-ui-1.9.1.custom.css
|
54
|
+
- lib/_static/css/ui-darkness/jquery-ui-1.9.1.custom.min.css
|
55
|
+
- lib/_static/img/backend_small_icons.png
|
56
|
+
- lib/_static/img/btn.png
|
57
|
+
- lib/_static/img/btn_old.png
|
58
|
+
- lib/_static/img/file.png
|
59
|
+
- lib/_static/img/handle.png
|
60
|
+
- lib/_static/img/help/clone-button.png
|
61
|
+
- lib/_static/img/help/create-button.png
|
62
|
+
- lib/_static/img/help/delete-button.png
|
63
|
+
- lib/_static/img/help/delete-warning.png
|
64
|
+
- lib/_static/img/help/document.png
|
65
|
+
- lib/_static/img/help/edit-button.png
|
66
|
+
- lib/_static/img/help/form.png
|
67
|
+
- lib/_static/img/help/image-dimensions.png
|
68
|
+
- lib/_static/img/help/list.png
|
69
|
+
- lib/_static/img/help/logout.png
|
70
|
+
- lib/_static/img/help/move-button.png
|
71
|
+
- lib/_static/img/help/overview.png
|
72
|
+
- lib/_static/img/help/preview-button.png
|
73
|
+
- lib/_static/img/help/relationships.png
|
74
|
+
- lib/_static/img/help/reload-button.png
|
75
|
+
- lib/_static/img/help/save-or-cancel.png
|
76
|
+
- lib/_static/img/help/search.png
|
77
|
+
- lib/_static/img/help/sub-section.png
|
78
|
+
- lib/_static/img/help/x-list.png
|
79
|
+
- lib/_static/img/placeholder.nutshell.jpg
|
80
|
+
- lib/_static/img/placeholder.stash_thumb.gif
|
81
|
+
- lib/_static/img/small-loader.gif
|
82
|
+
- lib/_static/img/underwood_btn.png
|
83
|
+
- lib/_static/js/addon.timepicker.js
|
84
|
+
- lib/_static/js/jquery-ui-1.9.1.custom.js
|
85
|
+
- lib/_static/js/jquery-ui-1.9.1.custom.min.js
|
86
|
+
- lib/_static/js/main.js
|
87
|
+
- lib/_static/js/plugin.asmselect.js
|
88
|
+
- lib/_static/js/plugin.form.js
|
89
|
+
- lib/_static/js/plugin.mapolygon.js
|
90
|
+
- lib/_static/js/plugin.quickmask.js
|
91
|
+
- lib/_static/js/plugin.quicksearch.js
|
92
|
+
- lib/_static/js/plugin.speechify.js
|
93
|
+
- lib/_static/js/plugin.underwood.js
|
94
|
+
- lib/_templates/_test.txt
|
95
|
+
- lib/_templates/head.html
|
96
|
+
- lib/_templates/help.html
|
97
|
+
- lib/_templates/layout.html
|
98
|
+
- lib/bureau.rb
|
99
|
+
- lib/bureau/adapter.rb
|
100
|
+
- lib/mongo_bureau.rb
|
101
|
+
- lib/sequel_bureau_adapter.rb
|
102
|
+
- test/spec_bureau.rb
|
103
|
+
- test/spec_bureau_adapter.rb
|
104
|
+
homepage: http://www.campbellhay.com
|
105
|
+
licenses: []
|
106
|
+
metadata: {}
|
107
|
+
post_install_message:
|
108
|
+
rdoc_options: []
|
109
|
+
require_paths:
|
110
|
+
- "./lib"
|
111
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
requirements: []
|
122
|
+
rubygems_version: 3.0.3
|
123
|
+
signing_key:
|
124
|
+
specification_version: 4
|
125
|
+
summary: The CampbellHay Admin System
|
126
|
+
test_files: []
|