edgarj 0.01.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +23 -0
  4. data/Rakefile +40 -0
  5. data/app/assets/javascripts/edgarj/base.js +49 -0
  6. data/app/assets/javascripts/edgarj/menu.js +39 -0
  7. data/app/assets/javascripts/edgarj/operator_selection.js +133 -0
  8. data/app/assets/stylesheets/edgarj/base.css +304 -0
  9. data/app/assets/stylesheets/edgarj/menu.css +65 -0
  10. data/app/controllers/edgarj/authentication_mixin.rb.sample +30 -0
  11. data/app/controllers/edgarj/controller_mixin_common.rb +80 -0
  12. data/app/controllers/edgarj/controller_mixin_for_app.rb +71 -0
  13. data/app/controllers/edgarj/edgarj_controller.rb +535 -0
  14. data/app/controllers/edgarj/model_permissions_controller.rb +8 -0
  15. data/app/controllers/edgarj/permission_mixin.rb +84 -0
  16. data/app/controllers/edgarj/popup_controller.rb +128 -0
  17. data/app/controllers/edgarj/rescue_mixin.rb +37 -0
  18. data/app/controllers/edgarj/user_group_users_controller.rb +8 -0
  19. data/app/controllers/edgarj/user_groups_controller.rb +9 -0
  20. data/app/controllers/edgarj/user_groups_popup_controller.rb +8 -0
  21. data/app/helpers/edgarj/assoc_helper.rb +369 -0
  22. data/app/helpers/edgarj/common_helper.rb +37 -0
  23. data/app/helpers/edgarj/edgarj_helper.rb +20 -0
  24. data/app/helpers/edgarj/field_helper.rb +397 -0
  25. data/app/helpers/edgarj/form_drawer.rb +322 -0
  26. data/app/helpers/edgarj/list_drawer.rb +169 -0
  27. data/app/helpers/edgarj/menu_helper.rb +92 -0
  28. data/app/helpers/edgarj/model_permissions_helper.rb +9 -0
  29. data/app/helpers/edgarj/popup_helper.rb +40 -0
  30. data/app/helpers/edgarj/search_helper.rb +14 -0
  31. data/app/helpers/edgarj/sessions_helper.rb +9 -0
  32. data/app/helpers/edgarj/user_group_users_helper.rb +9 -0
  33. data/app/helpers/edgarj/user_groups_helper.rb +9 -0
  34. data/app/helpers/edgarj/user_groups_popup_helper.rb +9 -0
  35. data/app/models/edgarj/drawer/base.rb +234 -0
  36. data/app/models/edgarj/drawer/normal.rb +6 -0
  37. data/app/models/edgarj/drawer/popup.rb +47 -0
  38. data/app/models/edgarj/drawer.rb +13 -0
  39. data/app/models/edgarj/model_permission.rb +41 -0
  40. data/app/models/edgarj/page_info.rb +47 -0
  41. data/app/models/edgarj/search.rb +81 -0
  42. data/app/models/edgarj/search_form.rb +255 -0
  43. data/app/models/edgarj/search_popup.rb +44 -0
  44. data/app/models/edgarj/sssn.rb +120 -0
  45. data/app/models/edgarj/user_group.rb +67 -0
  46. data/app/models/edgarj/user_group_user.rb +18 -0
  47. data/app/models/edgarj.rb +5 -0
  48. data/app/views/edgarj/edgarj/_form.html.erb +25 -0
  49. data/app/views/edgarj/edgarj/_list.html.erb +52 -0
  50. data/app/views/edgarj/edgarj/_message_popup.html.erb +15 -0
  51. data/app/views/edgarj/edgarj/_search_form.html.erb +64 -0
  52. data/app/views/edgarj/edgarj/_search_operator.html.erb +17 -0
  53. data/app/views/edgarj/edgarj/_search_operator_selection.html.erb +12 -0
  54. data/app/views/edgarj/edgarj/clear.js.erb +1 -0
  55. data/app/views/edgarj/edgarj/create.js.erb +4 -0
  56. data/app/views/edgarj/edgarj/destroy.js.erb +2 -0
  57. data/app/views/edgarj/edgarj/index.html.erb +37 -0
  58. data/app/views/edgarj/edgarj/index.js.erb +1 -0
  59. data/app/views/edgarj/edgarj/message_popup.js.erb +3 -0
  60. data/app/views/edgarj/edgarj/page_info_save.js.erb +1 -0
  61. data/app/views/edgarj/edgarj/search.js.erb +4 -0
  62. data/app/views/edgarj/edgarj/search_clear.js.erb +1 -0
  63. data/app/views/edgarj/edgarj/show.js.erb +1 -0
  64. data/app/views/edgarj/edgarj/top.html.erb +4 -0
  65. data/app/views/edgarj/edgarj/update.js.erb +4 -0
  66. data/app/views/edgarj/popup/_index.html.erb +16 -0
  67. data/app/views/edgarj/popup/_list.html.erb +42 -0
  68. data/app/views/edgarj/popup/_message_popup.html.erb +15 -0
  69. data/app/views/edgarj/popup/_search.html.erb +42 -0
  70. data/app/views/edgarj/popup/_search_save_popup.html.erb +16 -0
  71. data/app/views/edgarj/popup/index.js.erb +5 -0
  72. data/app/views/edgarj/popup/message_popup.js.erb +3 -0
  73. data/app/views/edgarj/popup/page_info_save.js.erb +1 -0
  74. data/app/views/edgarj/popup/search.js.erb +15 -0
  75. data/app/views/edgarj/popup/view_status_save.js.erb +1 -0
  76. data/config/routes.rb +15 -0
  77. data/config/settings.yml +5 -0
  78. data/db/migrate/20131118084600_create_edgar_sssns.rb +14 -0
  79. data/db/migrate/20131123124730_create_edgar_page_infos.rb +15 -0
  80. data/db/migrate/20140116062252_create_edgar_user_groups.rb +18 -0
  81. data/db/migrate/20140116062327_create_edgar_user_group_users.rb +10 -0
  82. data/db/migrate/20140206222308_create_edgar_model_permissions.rb +14 -0
  83. data/db/migrate/20141209053055_rename_edgar_to_edgarj.rb +17 -0
  84. data/lib/core_ext/active_record.rb +123 -0
  85. data/lib/core_ext/resources.rb +71 -0
  86. data/lib/edgarj/engine.rb +64 -0
  87. data/lib/edgarj/enum_cache.rb +46 -0
  88. data/lib/edgarj/templates/rails/helper/helper.rb +10 -0
  89. data/lib/edgarj/templates/test_unit/scaffold/functional_test.rb +575 -0
  90. data/lib/edgarj/version.rb +3 -0
  91. data/lib/edgarj.rb +14 -0
  92. data/lib/generators/edgarj/popup_scaffold/USAGE +6 -0
  93. data/lib/generators/edgarj/popup_scaffold/popup_scaffold_generator.rb +35 -0
  94. data/lib/generators/edgarj/popup_scaffold/templates/controller.rb +13 -0
  95. data/lib/generators/edgarj/popup_scaffold/templates/functional_test.rb +197 -0
  96. data/lib/generators/edgarj/popup_scaffold/templates/helper.rb +9 -0
  97. data/lib/generators/edgarj/scaffold/USAGE +17 -0
  98. data/lib/generators/edgarj/scaffold/scaffold_generator.rb +40 -0
  99. data/lib/generators/edgarj/scaffold/templates/controller.rb +13 -0
  100. data/lib/tasks/edgarj_tasks.rake +32 -0
  101. data/lib/tasks/pakcage.rake +18 -0
  102. data/locale/en.yml +94 -0
  103. data/locale/ja.yml +100 -0
  104. data/test/dummy/README.rdoc +28 -0
  105. data/test/dummy/Rakefile +6 -0
  106. data/test/dummy/app/assets/javascripts/application.js +21 -0
  107. data/test/dummy/app/assets/javascripts/authors.js +2 -0
  108. data/test/dummy/app/assets/stylesheets/application.css +16 -0
  109. data/test/dummy/app/assets/stylesheets/authors.css +4 -0
  110. data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
  111. data/test/dummy/app/controllers/application_controller.rb +15 -0
  112. data/test/dummy/app/controllers/authors_controller.rb +6 -0
  113. data/test/dummy/app/controllers/authors_popup_controller.rb +6 -0
  114. data/test/dummy/app/controllers/books_controller.rb +6 -0
  115. data/test/dummy/app/controllers/dummy_auth_mixin.rb +36 -0
  116. data/test/dummy/app/decorators/models/edgarj/user_group_decorator.rb +1 -0
  117. data/test/dummy/app/helpers/application_helper.rb +3 -0
  118. data/test/dummy/app/helpers/authors_helper.rb +7 -0
  119. data/test/dummy/app/helpers/authors_popup_helper.rb +7 -0
  120. data/test/dummy/app/helpers/books_helper.rb +7 -0
  121. data/test/dummy/app/models/author.rb +32 -0
  122. data/test/dummy/app/models/book.rb +5 -0
  123. data/test/dummy/app/models/user.rb +13 -0
  124. data/test/dummy/app/views/layouts/application.html.erb +32 -0
  125. data/test/dummy/app/views/layouts/login.html.erb +20 -0
  126. data/test/dummy/bin/bundle +3 -0
  127. data/test/dummy/bin/rails +4 -0
  128. data/test/dummy/bin/rake +4 -0
  129. data/test/dummy/config/application.rb +59 -0
  130. data/test/dummy/config/boot.rb +10 -0
  131. data/test/dummy/config/database.yml +15 -0
  132. data/test/dummy/config/edgarj/menu_config.rb +28 -0
  133. data/test/dummy/config/environment.rb +5 -0
  134. data/test/dummy/config/environments/development.rb +42 -0
  135. data/test/dummy/config/environments/production.rb +79 -0
  136. data/test/dummy/config/environments/test.rb +34 -0
  137. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  138. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  139. data/test/dummy/config/initializers/inflections.rb +16 -0
  140. data/test/dummy/config/initializers/mime_types.rb +5 -0
  141. data/test/dummy/config/initializers/secret_token.rb +12 -0
  142. data/test/dummy/config/initializers/session_store.rb +3 -0
  143. data/test/dummy/config/initializers/strong_parameter.rb +3 -0
  144. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  145. data/test/dummy/config/locales/en.yml +26 -0
  146. data/test/dummy/config/routes.rb +60 -0
  147. data/test/dummy/config.ru +4 -0
  148. data/test/dummy/db/migrate/20131107120635_create_authors.rb +9 -0
  149. data/test/dummy/db/migrate/20131218011851_create_books.rb +10 -0
  150. data/test/dummy/db/migrate/20140201000000_add_user_group_id_to_authors.rb +5 -0
  151. data/test/dummy/db/migrate/20140807065420_create_users.rb +10 -0
  152. data/test/dummy/db/schema.rb +93 -0
  153. data/test/dummy/public/404.html +58 -0
  154. data/test/dummy/public/422.html +58 -0
  155. data/test/dummy/public/500.html +57 -0
  156. data/test/dummy/public/favicon.ico +0 -0
  157. data/test/dummy/script/rails +6 -0
  158. data/test/dummy/test/functional/authors_controller_test.rb +631 -0
  159. data/test/dummy/test/functional/books_controller_test.rb +516 -0
  160. data/test/dummy/test/helpers/authors_helper_test.rb +4 -0
  161. data/test/dummy/test/unit/author_test.rb +7 -0
  162. data/test/dummy/test/unit/book_test.rb +7 -0
  163. data/test/edgar_test.rb +7 -0
  164. data/test/fixtures/authors.yml +32 -0
  165. data/test/fixtures/books.yml +56 -0
  166. data/test/fixtures/edgarj/model_permissions.yml +97 -0
  167. data/test/fixtures/edgarj/page_infos.yml +84 -0
  168. data/test/fixtures/edgarj/sssns.yml +38 -0
  169. data/test/fixtures/edgarj/user_group_users.yml +114 -0
  170. data/test/fixtures/edgarj/user_groups.yml +95 -0
  171. data/test/fixtures/users.yml +49 -0
  172. data/test/functional/edgarj/edgarj_controller_test.rb +24 -0
  173. data/test/functional/edgarj/model_permissions_controller_test.rb +554 -0
  174. data/test/functional/edgarj/user_group_users_controller_test.rb +567 -0
  175. data/test/integration/navigation_test.rb +10 -0
  176. data/test/support/edgarj/controller_supporter.rb +23 -0
  177. data/test/test_helper.rb +23 -0
  178. data/test/unit/edgarj/model_permission_test.rb +27 -0
  179. data/test/unit/edgarj/page_info_test.rb +7 -0
  180. data/test/unit/edgarj/sssn_test.rb +10 -0
  181. data/test/unit/edgarj/user_group_test.rb +32 -0
  182. data/test/unit/edgarj/user_group_user_test.rb +9 -0
  183. data/test/unit/helpers/edgarj/model_permissions_helper_test.rb +6 -0
  184. data/test/unit/helpers/edgarj/user_group_users_helper_test.rb +6 -0
  185. metadata +456 -0
@@ -0,0 +1,322 @@
1
+ # coding: UTF-8
2
+
3
+ module Edgarj
4
+ module FormDrawer
5
+ # Edgarj::FormDrawer::Base draws HTML table tag based data entry form.
6
+ # This also provides default methods for SearchFormDrawer search condition
7
+ # entry form.
8
+ #
9
+ # === How to Customize
10
+ # 1. First, it may be enough to just redefine @options
11
+ # 1. Next, when draw_ATTR() is defined, it is called. See ModelPermissionControllerHelper for example.
12
+ # 1. Then, consider to overwrite draw_ATTR() method.
13
+ class Base
14
+
15
+ # === INPUTS
16
+ # drawer:: Edgarj::Drawer instance
17
+ # record:: instance of AR
18
+ # f:: FormBuilder
19
+ def initialize(drawer, record, f)
20
+ @drawer = drawer
21
+ @vc = drawer.vc # just short-cut
22
+ @record = record
23
+ @f = f
24
+
25
+ # define default options for draw_X() method, where X is :flags, :kind,
26
+ # and so on. @options can be redefined at derived class.
27
+ @options = {
28
+ :flags => {},
29
+ :kind => {},
30
+ :boolean => {},
31
+ :default => {
32
+ :date => {:use_month_numbers=>true},
33
+ :integer => {:size=>16},
34
+ :text => {:size=>20},
35
+ }
36
+ }
37
+ end
38
+
39
+ # draw form
40
+ #
41
+ # I18n for label is:
42
+ #
43
+ # 1. usual column uses model.human_attribute_name()
44
+ # 1. 'belongs_to' column uses:
45
+ # ** I18n.t('activerecord.attributes.MODEL.EXT_ID')
46
+ # ** parent.human_name
47
+ def draw()
48
+ adrs_field = {}
49
+ @vc.content_tag(:table) do
50
+ @left = true
51
+ html = ''
52
+ for col in columns do
53
+ draw_method = "draw_#{col.name}"
54
+ html << if self.class.method_defined?(draw_method) then
55
+ send(draw_method, col)
56
+ #elsif edgarj_address?(col)
57
+ # draw_address(col)
58
+ #elsif edgarj_file?(col)
59
+ # draw_file(col)
60
+ elsif (enum = get_enum(col))
61
+ draw_enum(col, enum)
62
+ elsif (bitset = get_bitset(col))
63
+ draw_bitset(col, bitset)
64
+ else
65
+ parent_model = @vc.model.belongs_to_AR(col)
66
+ if parent_model
67
+ _draw_belongs_to_field(parent_model, col)
68
+ else
69
+ _draw_field(col)
70
+ end
71
+ end
72
+ end
73
+ html << '<td colspan=3></td>'.html_safe if !@left
74
+ html.html_safe
75
+ end
76
+ end
77
+
78
+ def columns
79
+ drawer = @vc.drawer
80
+ drawer.columns_for(drawer.form_columns)
81
+ end
82
+
83
+ # base method for derived class
84
+ def edgarj_address?(col)
85
+ @record.class.edgarj_address?(col)
86
+ end
87
+
88
+ # base method for derived class
89
+ def edgarj_file?(col)
90
+ @record.class.edgarj_file?(col)
91
+ end
92
+
93
+ # return enum of the column
94
+ #
95
+ # Derived class must overwrite to return expected enum
96
+ def get_enum(col)
97
+ @vc.get_enum(@f.object.class, col)
98
+ end
99
+
100
+ # return bitset of the column
101
+ #
102
+ # Derived class must overwrite to return expected bitset
103
+ def get_bitset(col)
104
+ @vc.get_bitset(@f.object.class, col)
105
+ end
106
+
107
+ # flip field to left-lane or right-lane
108
+ def _draw_2_lane(&block)
109
+ result = @left ? '<tr>' : ''
110
+ result += yield
111
+ result += '</tr>' if !@left
112
+ @left = !@left # flip it
113
+ result
114
+ end
115
+
116
+ # draw head(label). SearchFormDrawer will overwrite to insert operator.
117
+ #
118
+ # === INPUTS
119
+ # col:: column info
120
+ # label:: if not-nil, label is used rather than human_attribute_name of col.name for field-label
121
+ # block:: wrapped field-drawing logic
122
+ #
123
+ def _draw_head(col, label=nil, &block)
124
+ _draw_2_lane{
125
+ html = @vc.content_tag(:th, label || @record.class.human_attribute_name(col.name))
126
+ html << @vc.content_tag(:td, '')
127
+ html << (@vc.content_tag(:td) do yield end)
128
+ html
129
+ }
130
+ end
131
+
132
+ def draw_id(col)
133
+ ''
134
+ end
135
+
136
+ def draw_type(col)
137
+ ''
138
+ end
139
+
140
+ def draw_created_at(col)
141
+ ''
142
+ end
143
+
144
+ def draw_updated_at(col)
145
+ ''
146
+ end
147
+
148
+ # draw address fields
149
+ def draw_address(col)
150
+ _draw_head(col){ @vc.draw_address(@f, col) }
151
+ end
152
+
153
+ # draw bitset checkboxes field
154
+ def draw_bitset(col, bitset)
155
+ _draw_head(col){ @vc.draw_bitset(@f, col, bitset, @options[:flags]) }
156
+ end
157
+
158
+ # draw 'belongs_to' field for AR
159
+ def _draw_belongs_to_field(parent_model, col)
160
+ _draw_head(col, @vc.draw_belongs_to_label(@f, @drawer.popup_path(col), col.name)){
161
+ @vc.draw_belongs_to_field(@f, col.name)
162
+ }
163
+ end
164
+
165
+ def draw_boolean(col)
166
+ _draw_head(col){ @vc.draw_boolean(@f, col, @options[:boolean]) }
167
+ end
168
+
169
+ def draw_file(col)
170
+ _draw_head(col){ @vc.draw_file(@f, col) }
171
+ end
172
+
173
+ def draw_enum(col, enum)
174
+ _draw_head(col){ @vc.draw_enum(@f, col, enum) }
175
+ end
176
+
177
+ # draw general field
178
+ def _draw_field(col)
179
+ case col.type
180
+ when :boolean
181
+ draw_boolean(col)
182
+ else
183
+ _draw_head(col){ @vc.draw_field(@f, col, @options[:default]) }
184
+ end
185
+ end
186
+ end
187
+
188
+ # Search-class differs from Base-class as follows:
189
+ # * draws the fields of ID, created_at, and updated_at for search
190
+ # * 'kind' selection has blank-option.
191
+ # * boolean is not checkbox. Rather, it is selection of [nil,false,true]
192
+ # * edgarj_file column is not drawn.
193
+ class Search < Base
194
+ # === INPUTS
195
+ # drawer:: Edgarj::Drawer instance
196
+ # model:: SearchForm object
197
+ # f:: FormBuilder object
198
+ # operator_builder:: FormBuilder object for operator
199
+ def initialize(drawer, model, f, operator_builder)
200
+ super(drawer, model, f)
201
+ @operator_builder = operator_builder
202
+
203
+ # merge options
204
+ @options[:kind].merge!(:include_blank=>true)
205
+ @options[:default][:date].merge!(:include_blank=>true)
206
+ end
207
+
208
+ # overwrite
209
+ def columns
210
+ drawer = @vc.drawer
211
+ drawer.columns_for(drawer.search_form_columns)
212
+ end
213
+
214
+ # overwrite
215
+ def edgarj_address?(col)
216
+ @record._klass_str.constantize.edgarj_address?(col)
217
+ end
218
+
219
+ # overwrite
220
+ def edgarj_file?(col)
221
+ @record._klass_str.constantize.edgarj_file?(col)
222
+ end
223
+
224
+ # overwrite to insert operator
225
+ #
226
+ def _draw_head(col, label=nil, &block)
227
+ _draw_2_lane{
228
+ sprintf("<th>%s</th><td>", label || @record.class.human_attribute_name(col.name)) +
229
+
230
+ # add operator for appropreate data type.
231
+ if col.name == 'id'
232
+ @vc.draw_search_operator(@operator_builder, '_id')
233
+ else
234
+ case col.type
235
+ when :date, :datetime, :integer
236
+ @vc.draw_search_operator(@operator_builder, col.name)
237
+ else
238
+ ''
239
+ end
240
+ end + '</td><td>' + yield + '</td>'
241
+ }
242
+ end
243
+
244
+ # overwrite to draw 'id' search field
245
+ def draw_id(col)
246
+ _draw_head(col){ @f.text_field('_id', @options[:default][:integer]) }
247
+ end
248
+
249
+ # overwrite to draw created_at
250
+ def draw_created_at(col)
251
+ _draw_head(col){ @vc.draw_date(@f, col, @options[:default]) }
252
+ end
253
+
254
+ # overwrite to draw updated_at
255
+ def draw_updated_at(col)
256
+ _draw_head(col){ @vc.draw_date(@f, col, @options[:default]) }
257
+ end
258
+
259
+ # overwrite to draw address fields: TBD
260
+ def draw_address(col)
261
+ _draw_head(col){
262
+ 'TBD'
263
+ }
264
+ end
265
+
266
+ # overwrite to draw 'belongs_to' field for SearchForm
267
+ #
268
+ # This is similar to Base class 'belongs_to field', but
269
+ # * add parent 'name' hidden field at drawing.
270
+ # * no link on parent name
271
+ def _draw_belongs_to_field(parent_model, col)
272
+ model = @f.object._klass_str.constantize
273
+ parent_name = @f.object._parent && @f.object._parent[col.name]
274
+ _draw_head(col, @vc.draw_belongs_to_label(@f, @drawer.popup_path_on_search(col), col.name, model)){
275
+ popup_field = Edgarj::PopupHelper::PopupField.new_builder(
276
+ @f.object_name, col.name)
277
+
278
+ @vc.content_tag(:span, parent_name, id: popup_field.label_target) +
279
+ @vc.hidden_field_tag(
280
+ 'edgarj_search_form[search_form_parent][%s]' % col.name,
281
+ parent_name.blank? ? '' : parent_name,
282
+ id: popup_field.label_hidden_field) +
283
+ @vc.draw_belongs_to_clear_link(@f, col.name, popup_field, parent_name)
284
+ }
285
+ end
286
+
287
+ # overwrite because it is totally different from checkbox on search.
288
+ def draw_boolean(col)
289
+ _draw_head(col){
290
+ @f.select(col.name, [
291
+ ['(both)', ''],
292
+ ['', 'false'],
293
+ ['√', 'true']])
294
+ }
295
+ end
296
+
297
+ # overwrite to return enum of the column in SearchForm
298
+ #
299
+ # see overwritten draw_enum() also.
300
+ def get_enum(col)
301
+ @vc.get_enum(@record._klass_str.constantize, col)
302
+ end
303
+
304
+ # overwrite to add '(all)' at top of enum selection for search.
305
+ #
306
+ # see overwritten get_enum() also.
307
+ def draw_enum(col, enum)
308
+ _draw_head(col){
309
+ @vc.draw_enum(@f, col, enum,
310
+ :choice_1st => ['(all)',''],
311
+ :class => @record._klass_str.constantize
312
+ )
313
+ }
314
+ end
315
+
316
+ # overwrite to disable file upload column
317
+ def draw_file(col)
318
+ ''
319
+ end
320
+ end
321
+ end
322
+ end
@@ -0,0 +1,169 @@
1
+ # coding: UTF-8
2
+
3
+ module Edgarj
4
+ module ListDrawer
5
+ # Base for popup-list and normal-list column drawer
6
+ #
7
+ # Sub class of Drawer to draw list
8
+ class Base
9
+ include ERB::Util
10
+
11
+ # * options
12
+ # * namespace - namespace for path (ex: :admin)
13
+ #
14
+ # TODO: enum_cache は止め、グローバルに1つのキャッシュを作る。
15
+ def initialize(drawer, options = {})
16
+ @drawer = drawer
17
+ @options = options.dup
18
+ @vc = drawer.vc
19
+ @enum_cache = {}
20
+ @bitset_cache = {}
21
+ @parent_rec = nil
22
+ @belongs_to_link = false # doesn't make link on belongs_to
23
+ end
24
+
25
+ def draw_column(rec, col)
26
+ @parent_rec = rec.belongs_to_AR(col)
27
+ @vc.content_tag(:td, td_options(rec, col)) do
28
+ # edgarj_address column is prior to draw_belongs_to() because of
29
+ # avoiding link_to process on the 'belongs_to' column.
30
+ =begin
31
+ if rec.class.edgarj_address?(col)
32
+ col_name = rec.class.get_column_name(col)
33
+ adrs = Edgarj::Address.find_by_id(rec.send(col_name))
34
+ adrs ? draw_trimmed_str(adrs.name) : ''
35
+ =end
36
+ if @parent_rec then
37
+ if @belongs_to_link
38
+ @vc.link_to(@parent_rec.name, @drawer.popup_path(col), remote: true)
39
+ else
40
+ h(@parent_rec.name)
41
+ end
42
+ else
43
+ draw_normal_column(rec, col)
44
+ end
45
+ end
46
+ end
47
+
48
+ private
49
+ # <td> options
50
+ def td_options(rec, col)
51
+ if @enum_cache[col.name]
52
+ {}
53
+ elsif @bitset_cache[col.name]
54
+ {}
55
+ elsif @parent_rec
56
+ {}
57
+ else
58
+ if @vc.get_enum(rec.class, col)
59
+ {}
60
+ # elsif @vc.get_bitset(rec.class, col)
61
+ # {}
62
+ else
63
+ case col.type
64
+ when :datetime
65
+ {}
66
+ when :date
67
+ {}
68
+ when :integer
69
+ {align: 'right'}
70
+ when :boolean
71
+ {align: 'center'}
72
+ else
73
+ {}
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ # trim string when too long
80
+ def draw_trimmed_str(str)
81
+ s = str.split(//)
82
+ if s.size > Edgarj::LIST_TEXT_MAX_LEN
83
+ s = s[0..Edgarj::LIST_TEXT_MAX_LEN] << '...'
84
+ end
85
+ s.join('')
86
+ end
87
+
88
+
89
+ # draw rec.col other than 'belongs_to'
90
+ # 1. DateTime format is YYYY-MM-DD hh:mm:ss.
91
+ # 1. if col.name == 'flags', it is assumed bitset.
92
+ # 1. if col is edgarj_file, it is assumed file.
93
+ #
94
+ # === INPUTS
95
+ # rec:: AR instance
96
+ # col:: ActiveRecord::ConnectionAdapters::Column type which rec.class.columns returns
97
+ def draw_normal_column(rec, col)
98
+ =begin
99
+ if rec.class.edgarj_file?(col)
100
+ file_info = FileInfo.safe_find(rec.send(col.name))
101
+ file_info ? file_info.filename : ''
102
+ elsif (enum = @enum_cache[col.name])
103
+ @vc.draw_column_enum(rec, col, enum)
104
+ elsif (bitset = @bitset_cache[col.name])
105
+ @vc.draw_column_bitset(rec, col, bitset)
106
+ else
107
+ =end
108
+ if (enum = @vc.get_enum(rec.class, col))
109
+ @enum_cache[col.name] = enum
110
+ @vc.draw_column_enum(rec, col, enum)
111
+ =begin
112
+ elsif (bitset = @vc.get_bitset(rec.class, col))
113
+ @bitset_cache[col.name] = bitset
114
+ @vc.draw_column_bitset(rec, col, bitset)
115
+ =end
116
+ else
117
+ case col.type
118
+ when :datetime
119
+ @vc.datetime_fmt(rec.send(col.name))
120
+ when :date
121
+ @vc.date_fmt(rec.send(col.name))
122
+ when :integer
123
+ h(rec.send(col.name))
124
+ when :boolean
125
+ rec.send(col.name) ? '√' : ''
126
+ else
127
+ # NOTE: rec.send(col.name) is not used since sssn.send(:data)
128
+ # becomes hash rather than actual string-data so that following
129
+ # split() fails for Hash.
130
+ if str = rec.attributes[col.name]
131
+ draw_trimmed_str(str)
132
+ else
133
+ ''
134
+ end
135
+ end
136
+ end
137
+ #end
138
+ end
139
+ end
140
+
141
+ # Drawer for record list in Edgarj CRUD view.
142
+ #
143
+ class Normal < Base
144
+ def initialize(edgarj_drawer, options = {})
145
+ super(edgarj_drawer, options)
146
+ #@belongs_to_link = true # make link on belongs_to
147
+ end
148
+
149
+ # prepare path for the rec, which will be drawn later.
150
+ def set_path(rec)
151
+ @path = @vc.polymorphic_path([@options[:namespace], rec], format: :js)
152
+ end
153
+
154
+ # <td> options
155
+ #
156
+ # add Edgarj.click_listCB() with base result.
157
+ # When the column is parent, do nothing.
158
+ def td_options(rec, col)
159
+ result = super.merge(
160
+ style: 'cursor:pointer;',
161
+ class: '_edgarj_list_column')
162
+ #if !@parent_rec
163
+ result[:'data-url'] = @path
164
+ #end
165
+ result
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,92 @@
1
+ # draw Edgarj menu based on application's menu configuration
2
+ # at config/edgarj/menu_config.rb.
3
+ #
4
+ # Edgarj::MenuConfig should have 'top' module-function which returns arrays each
5
+ # entry is one of the followings:
6
+ #
7
+ # * item which contains link_to arg
8
+ # * controller menu list which contains controller name
9
+ # * special entry is '_separator' which is not controller name, rather
10
+ # generates just menu separator.
11
+ #
12
+ # See test/dummy/config/edgarj/menu_config.rb as an example.
13
+ #
14
+ # === SEE ALSO
15
+ # draw_menu:: method to draw menu
16
+ #
17
+ # === FILE
18
+ # config/initializer/menu.rb:: menu configuration at application
19
+ module Edgarj::MenuHelper
20
+ require File.join(Rails.root, 'config/edgarj/menu_config.rb')
21
+ include Edgarj::MenuConfig
22
+
23
+ def draw_menu
24
+ content_tag(:ul, :id=>'edgarj_menu', :class=>'edgarj_menu') do
25
+ out = ''
26
+ for menu in Edgarj::MenuConfig.top
27
+ out += content_tag(:li) do
28
+ case menu[0]
29
+ when :item
30
+ draw_item(*menu[1])
31
+ when :controller
32
+ draw_controller_menu(menu[1], menu[2], menu[3])
33
+ else
34
+ "unknown menu type: #{menu[0]}"
35
+ end
36
+ end
37
+ end
38
+ out.html_safe
39
+ end
40
+ end
41
+
42
+ private
43
+ # draw menu item
44
+ #
45
+ # === INPUTS
46
+ # link_to_args:: link_to args
47
+ def draw_item(*link_to_args)
48
+ content_tag(:li) do
49
+ link_to(
50
+ v(link_to_args[0]),
51
+ *link_to_args[1, link_to_args.size - 1])
52
+ end
53
+ end
54
+
55
+ # draw controller menu for arg
56
+ #
57
+ # @param [string] name menu name
58
+ # @param [ActionDispatch::Routing::RouteSet] route_proxy routes for url_for() method calling
59
+ # @param [Array] menu_items array of string(menu item name)
60
+ def draw_controller_menu(name, route_proxy, menu_items)
61
+ link_to(v(name.to_s), '#') +
62
+ content_tag(:ul) do
63
+ out = ''
64
+ for menu_item in menu_items do
65
+ out += content_tag(:li) do
66
+ case menu_item
67
+ when '_separator'
68
+ '<hr>'.html_safe
69
+ # <hr> background doesn't work as I expected so that
70
+ # use <div> with border color
71
+ #'<div class=separator>x</div>'.html_safe
72
+ else
73
+ ctrl_str = menu_item
74
+ if permitted_on?(ctrl_str)
75
+ # NOTE: controller string begins with '/' below. This ensures
76
+ # top name space. See Rails API url_for(). For example,
77
+ # Album::Book page, url is like /PREFIX/album/books/....
78
+ # If there is no beginning '/', User controler page means Album::User.
79
+ # This is not expected behavior at menu.
80
+ link_to(
81
+ "#{ctrl_str.camelize}Controller".constantize.new.send(:human_name),
82
+ route_proxy.url_for(
83
+ controller: '/' + ctrl_str,
84
+ only_path: true))
85
+ end
86
+ end
87
+ end
88
+ end
89
+ out.html_safe
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,9 @@
1
+ module Edgarj
2
+ module ModelPermissionsHelper
3
+ class ModelPermissionDrawer < Edgarj::Drawer::Normal
4
+ def initialize(view_context, params, page_info, model_class = Edgarj::ModelPermission)
5
+ super
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,40 @@
1
+ # coding: UTF-8
2
+ module Edgarj
3
+ module PopupHelper
4
+ # handle popup related fields to simplify params[] passing
5
+ # from browser to server.
6
+ #
7
+ # === SEE ALSO
8
+ # Edgarj.Popup.Field:: same logic at js side
9
+ class PopupField
10
+ attr_accessor(
11
+ :id_target,
12
+ :label_target,
13
+
14
+ # NOTE: This is search-form specific hidden field
15
+ # to store parent name. This will be used when re-drawing
16
+ # search-form.
17
+ :label_hidden_field,
18
+ :clear_link)
19
+
20
+ # new from object_name and col_name
21
+ def self.new_builder(object_name, col_name)
22
+ new(object_name.to_s + '_' + col_name.to_s)
23
+ end
24
+
25
+ def initialize(id_target)
26
+ raise Edgarj::NoPopupTarget if id_target.blank?
27
+
28
+ @id_target = id_target
29
+ # Using id_target as suffix rather than prefix is to avoid
30
+ # DOM-id conflict. For example, if id_target is 'author_id' and
31
+ # use it as prefix, then label_target would be something like
32
+ # 'author_id_label_target' and it would be conflict with actual
33
+ # author.id_label_target DB column.
34
+ @label_target = '__edgarj_label_target_for_' + @id_target
35
+ @label_hidden_field = '__edgarj_label_hidden_field_for_' + @id_target
36
+ @clear_link = @label_target + '_clear_link'
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,14 @@
1
+ # coding: UTF-8
2
+
3
+ module Edgarj
4
+ module SearchHelper
5
+ # === INPUTS
6
+ # o:: operator form builder
7
+ # method:: column name
8
+ def draw_search_operator(o, method)
9
+ render '/edgarj/edgarj/search_operator',
10
+ o: o,
11
+ method: method
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ module Edgarj
2
+ module SessionsHelper
3
+ class SessionDrawer < Edgarj::Drawer::Normal
4
+ def initialize(view_context, params, page_info, model = Sssn)
5
+ super
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Edgarj
2
+ module UserGroupUsersHelper
3
+ class UserGroupUserDrawer < Edgarj::Drawer::Normal
4
+ def initialize(view_context, params, page_info, model_class = UserGroupUser)
5
+ super
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Edgarj
2
+ module UserGroupsHelper
3
+ class UserGroupDrawer < Edgarj::Drawer::Normal
4
+ def initialize(view_context, params, page_info, model = UserGroup)
5
+ super
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Edgarj
2
+ module UserGroupsPopupHelper
3
+ class UserGroupPopupDrawer < Edgarj::Drawer::Popup
4
+ def initialize(view_context, params, page_info, model = UserGroup)
5
+ super
6
+ end
7
+ end
8
+ end
9
+ end