campbellhay-bureau 4.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/campbellhay-bureau.gemspec +14 -0
  4. data/gempush +8 -0
  5. data/lib/_static/_test.txt +1 -0
  6. data/lib/_static/css/main.css +586 -0
  7. data/lib/_static/css/plugin.asmselect.css +63 -0
  8. data/lib/_static/css/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png +0 -0
  9. data/lib/_static/css/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png +0 -0
  10. data/lib/_static/css/ui-darkness/images/ui-bg_glass_20_555555_1x400.png +0 -0
  11. data/lib/_static/css/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png +0 -0
  12. data/lib/_static/css/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png +0 -0
  13. data/lib/_static/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png +0 -0
  14. data/lib/_static/css/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png +0 -0
  15. data/lib/_static/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png +0 -0
  16. data/lib/_static/css/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png +0 -0
  17. data/lib/_static/css/ui-darkness/images/ui-icons_222222_256x240.png +0 -0
  18. data/lib/_static/css/ui-darkness/images/ui-icons_4b8e0b_256x240.png +0 -0
  19. data/lib/_static/css/ui-darkness/images/ui-icons_a83300_256x240.png +0 -0
  20. data/lib/_static/css/ui-darkness/images/ui-icons_cccccc_256x240.png +0 -0
  21. data/lib/_static/css/ui-darkness/images/ui-icons_ffffff_256x240.png +0 -0
  22. data/lib/_static/css/ui-darkness/jquery-ui-1.9.1.custom.css +378 -0
  23. data/lib/_static/css/ui-darkness/jquery-ui-1.9.1.custom.min.css +5 -0
  24. data/lib/_static/img/backend_small_icons.png +0 -0
  25. data/lib/_static/img/btn.png +0 -0
  26. data/lib/_static/img/btn_old.png +0 -0
  27. data/lib/_static/img/file.png +0 -0
  28. data/lib/_static/img/handle.png +0 -0
  29. data/lib/_static/img/help/clone-button.png +0 -0
  30. data/lib/_static/img/help/create-button.png +0 -0
  31. data/lib/_static/img/help/delete-button.png +0 -0
  32. data/lib/_static/img/help/delete-warning.png +0 -0
  33. data/lib/_static/img/help/document.png +0 -0
  34. data/lib/_static/img/help/edit-button.png +0 -0
  35. data/lib/_static/img/help/form.png +0 -0
  36. data/lib/_static/img/help/image-dimensions.png +0 -0
  37. data/lib/_static/img/help/list.png +0 -0
  38. data/lib/_static/img/help/logout.png +0 -0
  39. data/lib/_static/img/help/move-button.png +0 -0
  40. data/lib/_static/img/help/overview.png +0 -0
  41. data/lib/_static/img/help/preview-button.png +0 -0
  42. data/lib/_static/img/help/relationships.png +0 -0
  43. data/lib/_static/img/help/reload-button.png +0 -0
  44. data/lib/_static/img/help/save-or-cancel.png +0 -0
  45. data/lib/_static/img/help/search.png +0 -0
  46. data/lib/_static/img/help/sub-section.png +0 -0
  47. data/lib/_static/img/help/x-list.png +0 -0
  48. data/lib/_static/img/placeholder.nutshell.jpg +0 -0
  49. data/lib/_static/img/placeholder.stash_thumb.gif +0 -0
  50. data/lib/_static/img/small-loader.gif +0 -0
  51. data/lib/_static/img/underwood_btn.png +0 -0
  52. data/lib/_static/js/addon.timepicker.js +20 -0
  53. data/lib/_static/js/jquery-ui-1.9.1.custom.js +8364 -0
  54. data/lib/_static/js/jquery-ui-1.9.1.custom.min.js +6 -0
  55. data/lib/_static/js/main.js +347 -0
  56. data/lib/_static/js/plugin.asmselect.js +407 -0
  57. data/lib/_static/js/plugin.form.js +23 -0
  58. data/lib/_static/js/plugin.mapolygon.js +3 -0
  59. data/lib/_static/js/plugin.quickmask.js +68 -0
  60. data/lib/_static/js/plugin.quicksearch.js +1 -0
  61. data/lib/_static/js/plugin.speechify.js +4 -0
  62. data/lib/_static/js/plugin.underwood.js +4 -0
  63. data/lib/_templates/_test.txt +1 -0
  64. data/lib/_templates/head.html +23 -0
  65. data/lib/_templates/help.html +104 -0
  66. data/lib/_templates/layout.html +13 -0
  67. data/lib/bureau/adapter.rb +114 -0
  68. data/lib/bureau.rb +122 -0
  69. data/lib/mongo_bureau.rb +214 -0
  70. data/lib/sequel_bureau_adapter.rb +188 -0
  71. data/test/spec_bureau.rb +123 -0
  72. data/test/spec_bureau_adapter.rb +71 -0
  73. 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
@@ -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: []