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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +23 -0
- data/Rakefile +40 -0
- data/app/assets/javascripts/edgarj/base.js +49 -0
- data/app/assets/javascripts/edgarj/menu.js +39 -0
- data/app/assets/javascripts/edgarj/operator_selection.js +133 -0
- data/app/assets/stylesheets/edgarj/base.css +304 -0
- data/app/assets/stylesheets/edgarj/menu.css +65 -0
- data/app/controllers/edgarj/authentication_mixin.rb.sample +30 -0
- data/app/controllers/edgarj/controller_mixin_common.rb +80 -0
- data/app/controllers/edgarj/controller_mixin_for_app.rb +71 -0
- data/app/controllers/edgarj/edgarj_controller.rb +535 -0
- data/app/controllers/edgarj/model_permissions_controller.rb +8 -0
- data/app/controllers/edgarj/permission_mixin.rb +84 -0
- data/app/controllers/edgarj/popup_controller.rb +128 -0
- data/app/controllers/edgarj/rescue_mixin.rb +37 -0
- data/app/controllers/edgarj/user_group_users_controller.rb +8 -0
- data/app/controllers/edgarj/user_groups_controller.rb +9 -0
- data/app/controllers/edgarj/user_groups_popup_controller.rb +8 -0
- data/app/helpers/edgarj/assoc_helper.rb +369 -0
- data/app/helpers/edgarj/common_helper.rb +37 -0
- data/app/helpers/edgarj/edgarj_helper.rb +20 -0
- data/app/helpers/edgarj/field_helper.rb +397 -0
- data/app/helpers/edgarj/form_drawer.rb +322 -0
- data/app/helpers/edgarj/list_drawer.rb +169 -0
- data/app/helpers/edgarj/menu_helper.rb +92 -0
- data/app/helpers/edgarj/model_permissions_helper.rb +9 -0
- data/app/helpers/edgarj/popup_helper.rb +40 -0
- data/app/helpers/edgarj/search_helper.rb +14 -0
- data/app/helpers/edgarj/sessions_helper.rb +9 -0
- data/app/helpers/edgarj/user_group_users_helper.rb +9 -0
- data/app/helpers/edgarj/user_groups_helper.rb +9 -0
- data/app/helpers/edgarj/user_groups_popup_helper.rb +9 -0
- data/app/models/edgarj/drawer/base.rb +234 -0
- data/app/models/edgarj/drawer/normal.rb +6 -0
- data/app/models/edgarj/drawer/popup.rb +47 -0
- data/app/models/edgarj/drawer.rb +13 -0
- data/app/models/edgarj/model_permission.rb +41 -0
- data/app/models/edgarj/page_info.rb +47 -0
- data/app/models/edgarj/search.rb +81 -0
- data/app/models/edgarj/search_form.rb +255 -0
- data/app/models/edgarj/search_popup.rb +44 -0
- data/app/models/edgarj/sssn.rb +120 -0
- data/app/models/edgarj/user_group.rb +67 -0
- data/app/models/edgarj/user_group_user.rb +18 -0
- data/app/models/edgarj.rb +5 -0
- data/app/views/edgarj/edgarj/_form.html.erb +25 -0
- data/app/views/edgarj/edgarj/_list.html.erb +52 -0
- data/app/views/edgarj/edgarj/_message_popup.html.erb +15 -0
- data/app/views/edgarj/edgarj/_search_form.html.erb +64 -0
- data/app/views/edgarj/edgarj/_search_operator.html.erb +17 -0
- data/app/views/edgarj/edgarj/_search_operator_selection.html.erb +12 -0
- data/app/views/edgarj/edgarj/clear.js.erb +1 -0
- data/app/views/edgarj/edgarj/create.js.erb +4 -0
- data/app/views/edgarj/edgarj/destroy.js.erb +2 -0
- data/app/views/edgarj/edgarj/index.html.erb +37 -0
- data/app/views/edgarj/edgarj/index.js.erb +1 -0
- data/app/views/edgarj/edgarj/message_popup.js.erb +3 -0
- data/app/views/edgarj/edgarj/page_info_save.js.erb +1 -0
- data/app/views/edgarj/edgarj/search.js.erb +4 -0
- data/app/views/edgarj/edgarj/search_clear.js.erb +1 -0
- data/app/views/edgarj/edgarj/show.js.erb +1 -0
- data/app/views/edgarj/edgarj/top.html.erb +4 -0
- data/app/views/edgarj/edgarj/update.js.erb +4 -0
- data/app/views/edgarj/popup/_index.html.erb +16 -0
- data/app/views/edgarj/popup/_list.html.erb +42 -0
- data/app/views/edgarj/popup/_message_popup.html.erb +15 -0
- data/app/views/edgarj/popup/_search.html.erb +42 -0
- data/app/views/edgarj/popup/_search_save_popup.html.erb +16 -0
- data/app/views/edgarj/popup/index.js.erb +5 -0
- data/app/views/edgarj/popup/message_popup.js.erb +3 -0
- data/app/views/edgarj/popup/page_info_save.js.erb +1 -0
- data/app/views/edgarj/popup/search.js.erb +15 -0
- data/app/views/edgarj/popup/view_status_save.js.erb +1 -0
- data/config/routes.rb +15 -0
- data/config/settings.yml +5 -0
- data/db/migrate/20131118084600_create_edgar_sssns.rb +14 -0
- data/db/migrate/20131123124730_create_edgar_page_infos.rb +15 -0
- data/db/migrate/20140116062252_create_edgar_user_groups.rb +18 -0
- data/db/migrate/20140116062327_create_edgar_user_group_users.rb +10 -0
- data/db/migrate/20140206222308_create_edgar_model_permissions.rb +14 -0
- data/db/migrate/20141209053055_rename_edgar_to_edgarj.rb +17 -0
- data/lib/core_ext/active_record.rb +123 -0
- data/lib/core_ext/resources.rb +71 -0
- data/lib/edgarj/engine.rb +64 -0
- data/lib/edgarj/enum_cache.rb +46 -0
- data/lib/edgarj/templates/rails/helper/helper.rb +10 -0
- data/lib/edgarj/templates/test_unit/scaffold/functional_test.rb +575 -0
- data/lib/edgarj/version.rb +3 -0
- data/lib/edgarj.rb +14 -0
- data/lib/generators/edgarj/popup_scaffold/USAGE +6 -0
- data/lib/generators/edgarj/popup_scaffold/popup_scaffold_generator.rb +35 -0
- data/lib/generators/edgarj/popup_scaffold/templates/controller.rb +13 -0
- data/lib/generators/edgarj/popup_scaffold/templates/functional_test.rb +197 -0
- data/lib/generators/edgarj/popup_scaffold/templates/helper.rb +9 -0
- data/lib/generators/edgarj/scaffold/USAGE +17 -0
- data/lib/generators/edgarj/scaffold/scaffold_generator.rb +40 -0
- data/lib/generators/edgarj/scaffold/templates/controller.rb +13 -0
- data/lib/tasks/edgarj_tasks.rake +32 -0
- data/lib/tasks/pakcage.rake +18 -0
- data/locale/en.yml +94 -0
- data/locale/ja.yml +100 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +21 -0
- data/test/dummy/app/assets/javascripts/authors.js +2 -0
- data/test/dummy/app/assets/stylesheets/application.css +16 -0
- data/test/dummy/app/assets/stylesheets/authors.css +4 -0
- data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
- data/test/dummy/app/controllers/application_controller.rb +15 -0
- data/test/dummy/app/controllers/authors_controller.rb +6 -0
- data/test/dummy/app/controllers/authors_popup_controller.rb +6 -0
- data/test/dummy/app/controllers/books_controller.rb +6 -0
- data/test/dummy/app/controllers/dummy_auth_mixin.rb +36 -0
- data/test/dummy/app/decorators/models/edgarj/user_group_decorator.rb +1 -0
- data/test/dummy/app/helpers/application_helper.rb +3 -0
- data/test/dummy/app/helpers/authors_helper.rb +7 -0
- data/test/dummy/app/helpers/authors_popup_helper.rb +7 -0
- data/test/dummy/app/helpers/books_helper.rb +7 -0
- data/test/dummy/app/models/author.rb +32 -0
- data/test/dummy/app/models/book.rb +5 -0
- data/test/dummy/app/models/user.rb +13 -0
- data/test/dummy/app/views/layouts/application.html.erb +32 -0
- data/test/dummy/app/views/layouts/login.html.erb +20 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +15 -0
- data/test/dummy/config/edgarj/menu_config.rb +28 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +42 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +34 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +12 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/strong_parameter.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +26 -0
- data/test/dummy/config/routes.rb +60 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/migrate/20131107120635_create_authors.rb +9 -0
- data/test/dummy/db/migrate/20131218011851_create_books.rb +10 -0
- data/test/dummy/db/migrate/20140201000000_add_user_group_id_to_authors.rb +5 -0
- data/test/dummy/db/migrate/20140807065420_create_users.rb +10 -0
- data/test/dummy/db/schema.rb +93 -0
- data/test/dummy/public/404.html +58 -0
- data/test/dummy/public/422.html +58 -0
- data/test/dummy/public/500.html +57 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test/functional/authors_controller_test.rb +631 -0
- data/test/dummy/test/functional/books_controller_test.rb +516 -0
- data/test/dummy/test/helpers/authors_helper_test.rb +4 -0
- data/test/dummy/test/unit/author_test.rb +7 -0
- data/test/dummy/test/unit/book_test.rb +7 -0
- data/test/edgar_test.rb +7 -0
- data/test/fixtures/authors.yml +32 -0
- data/test/fixtures/books.yml +56 -0
- data/test/fixtures/edgarj/model_permissions.yml +97 -0
- data/test/fixtures/edgarj/page_infos.yml +84 -0
- data/test/fixtures/edgarj/sssns.yml +38 -0
- data/test/fixtures/edgarj/user_group_users.yml +114 -0
- data/test/fixtures/edgarj/user_groups.yml +95 -0
- data/test/fixtures/users.yml +49 -0
- data/test/functional/edgarj/edgarj_controller_test.rb +24 -0
- data/test/functional/edgarj/model_permissions_controller_test.rb +554 -0
- data/test/functional/edgarj/user_group_users_controller_test.rb +567 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/support/edgarj/controller_supporter.rb +23 -0
- data/test/test_helper.rb +23 -0
- data/test/unit/edgarj/model_permission_test.rb +27 -0
- data/test/unit/edgarj/page_info_test.rb +7 -0
- data/test/unit/edgarj/sssn_test.rb +10 -0
- data/test/unit/edgarj/user_group_test.rb +32 -0
- data/test/unit/edgarj/user_group_user_test.rb +9 -0
- data/test/unit/helpers/edgarj/model_permissions_helper_test.rb +6 -0
- data/test/unit/helpers/edgarj/user_group_users_helper_test.rb +6 -0
- metadata +456 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Modal popup controller module to pick-up 'belongs_to' record
|
|
2
|
+
#
|
|
3
|
+
# == Requrements for popup
|
|
4
|
+
# 1. Multiple 'belongs_to' parents for one model
|
|
5
|
+
# 1. Easy customize as the same as EdgarjController
|
|
6
|
+
module Edgarj
|
|
7
|
+
class PopupController < ApplicationController
|
|
8
|
+
include ControllerMixinCommon
|
|
9
|
+
include Edgarj::PermissionMixin
|
|
10
|
+
|
|
11
|
+
helper_method :model, :popup_drawer
|
|
12
|
+
before_filter :require_read_permission
|
|
13
|
+
|
|
14
|
+
# draw popup windows
|
|
15
|
+
#
|
|
16
|
+
# === INPUTS
|
|
17
|
+
# params[:id_target]:: id target DOM on click entry of popup
|
|
18
|
+
# params[:page]:: on paginate
|
|
19
|
+
#
|
|
20
|
+
# === Paginate logic
|
|
21
|
+
# - params[:page] exists -> save it to @page_info and use it
|
|
22
|
+
# - params[:page] doesn't exist -> use @page_info.page
|
|
23
|
+
#
|
|
24
|
+
# === call flow
|
|
25
|
+
# ==== draw popup
|
|
26
|
+
# EdgarjHelper.draw_belongs_to_label() is called. Example:
|
|
27
|
+
# <a href='http://.../edgarj_popup?...' data-remote=true>Author</a>
|
|
28
|
+
# <input type=hidden name='book[author_id]'>
|
|
29
|
+
# <span id='popup_target_book_author'>...</span>
|
|
30
|
+
# :
|
|
31
|
+
#
|
|
32
|
+
# ==== on opening popup
|
|
33
|
+
# 1. edgarj_popup URL http://.../edgarj_popup?... is executed.
|
|
34
|
+
# 1. EdgarjPopupController.index() is called.
|
|
35
|
+
# 1. data is searched based on @page_info and user_scoped and
|
|
36
|
+
# set it to \@list.
|
|
37
|
+
# 1. app/views/edgarj_popup/index.js.erb
|
|
38
|
+
# 1. $('#edgarj_form_popup') dialog is opened.
|
|
39
|
+
#
|
|
40
|
+
# ==== on paginate
|
|
41
|
+
# Same as above('on opening popup'), but page=N parameter is added.
|
|
42
|
+
#
|
|
43
|
+
# ==== on search
|
|
44
|
+
# 1. post search condition to EdgarjPopupController.search().
|
|
45
|
+
#
|
|
46
|
+
# ==== on clicking entry on the popup
|
|
47
|
+
# TBD
|
|
48
|
+
def index
|
|
49
|
+
page_info
|
|
50
|
+
@page_info.page = (params[:page] || 1)
|
|
51
|
+
prepare_list
|
|
52
|
+
@search = page_info.record
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Ajax method to execute search
|
|
56
|
+
#
|
|
57
|
+
# Actually, this saves condition for later use.
|
|
58
|
+
# Execution of search could be done at 'index' method, but
|
|
59
|
+
# do it in this action to avoid 'POST' redirect issue(
|
|
60
|
+
# POST method redirect resulted in 'POST index', not 'GET index').
|
|
61
|
+
#
|
|
62
|
+
# === INPUTS
|
|
63
|
+
# params[:id_target]:: id target DOM on click entry of popup
|
|
64
|
+
# params[:edgarj_search_form]:: search condition
|
|
65
|
+
def search
|
|
66
|
+
page_info
|
|
67
|
+
@page_info.record = SearchPopup.new(model, params[:edgarj_search_form])
|
|
68
|
+
@page_info.update_attribute(:page, 1)
|
|
69
|
+
@search = @page_info.record
|
|
70
|
+
prepare_list if @search.valid?
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
# # derive model class from this controller.
|
|
75
|
+
#
|
|
76
|
+
# If controller cannot guess model class, overwrite this.
|
|
77
|
+
#
|
|
78
|
+
# === Examples:
|
|
79
|
+
# * PopupAuthorsController -> Author
|
|
80
|
+
def model
|
|
81
|
+
@_model ||=
|
|
82
|
+
if self.class.name =~ /^(.+)PopupController$/
|
|
83
|
+
$1.singularize.constantize
|
|
84
|
+
else
|
|
85
|
+
raise 'Cannot guess popup model from controller'
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# return search-form object.
|
|
90
|
+
#
|
|
91
|
+
# called from page_info
|
|
92
|
+
def search_form
|
|
93
|
+
SearchPopup.new(model)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# drawer class of this controller.
|
|
97
|
+
#
|
|
98
|
+
# Derived popup controller should implement this method.
|
|
99
|
+
#
|
|
100
|
+
# === Examples:
|
|
101
|
+
# * AuthorsController -> AuthorPopupHelper::AuthorPopupDrawer
|
|
102
|
+
def drawer_class
|
|
103
|
+
raise 'Derived popup controller class should implement'
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# set drawer instance as drawer for later use on rendering view
|
|
107
|
+
def set_popup_drawer
|
|
108
|
+
@popup_drawer = drawer_class.new(view_context, params, page_info)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def popup_drawer
|
|
112
|
+
@popup_drawer
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# This works as:
|
|
116
|
+
#
|
|
117
|
+
# before_render :set_popup_drawer
|
|
118
|
+
#
|
|
119
|
+
# to set drawer just before rendering.
|
|
120
|
+
#
|
|
121
|
+
# See http://stackoverflow.com/questions/9281224/filter-to-execute-before-render-but-after-controller
|
|
122
|
+
def render(*args)
|
|
123
|
+
# set_drawer should be called only when finishing before_filters.
|
|
124
|
+
set_popup_drawer if current_user
|
|
125
|
+
super
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# rescue part for EdgarjController (or ApplicationController) and
|
|
2
|
+
# EdgarjPopupController
|
|
3
|
+
#
|
|
4
|
+
module Edgarj
|
|
5
|
+
module RescueMixin
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
# rescue callback sub method to show message by flush on normal http request
|
|
9
|
+
# or by popup-dialog on Ajax request.
|
|
10
|
+
def edgarj_rescue_sub(ex, message)
|
|
11
|
+
logger.info(
|
|
12
|
+
"#{ex.class} #{ex.message} bactrace:\n " +
|
|
13
|
+
ex.backtrace.join("\n "))
|
|
14
|
+
|
|
15
|
+
respond_to do |format|
|
|
16
|
+
format.html {
|
|
17
|
+
flash[:error] = message
|
|
18
|
+
redirect_to top_path
|
|
19
|
+
}
|
|
20
|
+
format.js {
|
|
21
|
+
flash.now[:error] = message
|
|
22
|
+
render 'message_popup'
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# rescue callback for 404
|
|
28
|
+
def edgarj_rescue_404(ex)
|
|
29
|
+
edgarj_rescue_sub(ex, v('not_found'))
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# rescue callback
|
|
33
|
+
def edgarj_rescue_app_error(ex)
|
|
34
|
+
edgarj_rescue_sub(ex, ex.message)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
module Edgarj
|
|
2
|
+
module AssocHelper
|
|
3
|
+
=begin
|
|
4
|
+
# remote_function + spinner
|
|
5
|
+
def edgarj_remote_function(url, method='get')
|
|
6
|
+
"Edgarj._simple_ajax('#{j(url_for(url))}', '#{method}')"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# form_for which supports Ajax-like file upload.
|
|
10
|
+
#
|
|
11
|
+
# In order to support Ajax-like file upload, use
|
|
12
|
+
# form-target-iframe-responds_to_parent mechanism.
|
|
13
|
+
def edgarj_form(&block)
|
|
14
|
+
url_hash = {
|
|
15
|
+
controller: params[:controller],
|
|
16
|
+
action: @model.new_record? ? 'create' : 'update',
|
|
17
|
+
format: :js
|
|
18
|
+
}
|
|
19
|
+
url_hash[:id] = @model.id if @model.persisted?
|
|
20
|
+
form_for(@model,
|
|
21
|
+
remote: true,
|
|
22
|
+
url: url_hash,
|
|
23
|
+
html: {
|
|
24
|
+
id: '_edgarj_form',
|
|
25
|
+
method: @model.new_record? ? 'post' : 'put',
|
|
26
|
+
multipart: true,
|
|
27
|
+
#target: 'edgarj_form_frame'
|
|
28
|
+
}, &block)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# According to http://khamsouk.souvanlasy.com/articles/ajax_file_uploads_in_rails
|
|
32
|
+
# 'display:none' style should *NOT* used:
|
|
33
|
+
def iframe_for_edgarj_form
|
|
34
|
+
%Q(<iframe id=edgarj_form_frame name=edgarj_form_frame
|
|
35
|
+
style='width:1px;height:1px;border:0px' src='about:blank'></iframe>
|
|
36
|
+
).html_safe
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# === INPUTS
|
|
40
|
+
# o:: operator form builder
|
|
41
|
+
# method:: column name
|
|
42
|
+
def draw_search_operator(o, method)
|
|
43
|
+
render '/edgarj/search_operator',
|
|
44
|
+
o: o,
|
|
45
|
+
method: method
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Edgarj standard datetime format
|
|
49
|
+
def datetime_fmt(dt)
|
|
50
|
+
if dt.blank? then
|
|
51
|
+
''
|
|
52
|
+
else
|
|
53
|
+
I18n.l(dt, format: I18n.t('edgarj.time.format'))
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Edgarj standard date format
|
|
58
|
+
def date_fmt(dt)
|
|
59
|
+
if dt == nil then
|
|
60
|
+
''
|
|
61
|
+
else
|
|
62
|
+
dt.strftime(I18n.t('date.formats.default'))
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def draw_view_status_load_menu
|
|
67
|
+
content_tag(:div, :id=>'edgarj_load_condition_menu', :class=>'edgarj_menu') do
|
|
68
|
+
content_tag(:table) do
|
|
69
|
+
content_tag(:tr) do
|
|
70
|
+
if current_user.saved_view_statuss.count(:conditions=>['view=?', controller_name]) > 0
|
|
71
|
+
draw_menu_top_and_pulldown('saved_conditions', t('load_condition')) do
|
|
72
|
+
out = ""
|
|
73
|
+
for svc in current_user.saved_view_statuss.find_all_by_view(controller_name) do
|
|
74
|
+
out += edgarj_link_to_remote(
|
|
75
|
+
svc.name, {:action=>'search_load', :id=>svc.id})
|
|
76
|
+
end
|
|
77
|
+
out
|
|
78
|
+
end
|
|
79
|
+
else
|
|
80
|
+
# not to draw empty sub menu of 'saved_conditions'
|
|
81
|
+
''
|
|
82
|
+
end +
|
|
83
|
+
content_tag(:td) do
|
|
84
|
+
link_to 'Help', url_for(:controller=>'/help',
|
|
85
|
+
:action=>'search.html'), {:target=>'help'}
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# draw sort link on list column header
|
|
93
|
+
#
|
|
94
|
+
# === INPUTS
|
|
95
|
+
# col:: column data
|
|
96
|
+
# options:: options to url_for
|
|
97
|
+
def draw_sort(col, options={})
|
|
98
|
+
label = model_class.human_attribute_name(col.name)
|
|
99
|
+
dir = 'asc'
|
|
100
|
+
if @view_status.order_by == col.name
|
|
101
|
+
# toggle direction
|
|
102
|
+
if @view_status.dir == 'asc' || @view_status.dir.blank?
|
|
103
|
+
label += '▲'
|
|
104
|
+
dir = 'desc'
|
|
105
|
+
else
|
|
106
|
+
label += '▼'
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
link_to(label,
|
|
110
|
+
{
|
|
111
|
+
:controller => params[:controller],
|
|
112
|
+
:action => 'view_status_save',
|
|
113
|
+
:id => @view_status.id,
|
|
114
|
+
'edgarj_view_status[order_by]' => col.name,
|
|
115
|
+
'edgarj_view_status[dir]' => dir
|
|
116
|
+
}.merge(options),
|
|
117
|
+
:remote => true,
|
|
118
|
+
:method => :put)
|
|
119
|
+
end
|
|
120
|
+
=end
|
|
121
|
+
|
|
122
|
+
# 1. column I18n is used if defined
|
|
123
|
+
# 2. else, parent.human_name is used.
|
|
124
|
+
def draw_belongs_to_label_sub(model, col_name, parent_model)
|
|
125
|
+
I18n.t(col_name,
|
|
126
|
+
scope: "activerecord.attributes.#{model.to_s.underscore}",
|
|
127
|
+
default: parent_model.human_name)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
=begin
|
|
131
|
+
# draw belongs_to name. When link=true(default), draw it as hyper-link
|
|
132
|
+
def draw_belongs_to(parent_obj, link=true)
|
|
133
|
+
if link
|
|
134
|
+
link_to( parent_obj.name,
|
|
135
|
+
controller: '/' + parent_obj.class.name.underscore.pluralize,
|
|
136
|
+
action: 'show',
|
|
137
|
+
id: parent_obj.id)
|
|
138
|
+
else
|
|
139
|
+
h(parent_obj.name)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
=end
|
|
143
|
+
|
|
144
|
+
# draw 'belongs_to' popup button(link) label. This is used at:
|
|
145
|
+
#
|
|
146
|
+
# * edgarj form for data entry
|
|
147
|
+
# * edgarj search form(Edgarj::SearchForm) for search-condition entry
|
|
148
|
+
#
|
|
149
|
+
# === INPUTS
|
|
150
|
+
# f:: FormBuilder object
|
|
151
|
+
# popup_path:: popup path(url)
|
|
152
|
+
# col_name:: 'belongs_to' column name
|
|
153
|
+
# model:: data model class
|
|
154
|
+
def draw_belongs_to_label(f, popup_path, col_name, model = f.object.class)
|
|
155
|
+
col = model.columns.detect{|c| c.name == col_name.to_s}
|
|
156
|
+
return "no column found" if !col
|
|
157
|
+
|
|
158
|
+
parent_model = model.belongs_to_AR(col)
|
|
159
|
+
return "parent_model is nil" if !parent_model
|
|
160
|
+
|
|
161
|
+
link_to(
|
|
162
|
+
draw_belongs_to_label_sub(model, col.name, parent_model),
|
|
163
|
+
popup_path,
|
|
164
|
+
remote: true)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# draw 'clear' link for 'belongs_to' popup data-entry field
|
|
168
|
+
#
|
|
169
|
+
# === INPUTS
|
|
170
|
+
# f:: FormBuilder object
|
|
171
|
+
# col_name:: 'belongs_to' column name
|
|
172
|
+
# popup_field:: Edgarj::PopupHelper::PopupField object
|
|
173
|
+
# parent_name:: initial parent name
|
|
174
|
+
def draw_belongs_to_clear_link(f, col_name, popup_field, parent_name)
|
|
175
|
+
(' ' +
|
|
176
|
+
link_to("[#{I18n.t('edgarj.default.clear')}]", '#',
|
|
177
|
+
onClick: sprintf("Edgarj.Popup.clear('%s'); return false;",
|
|
178
|
+
popup_field.id_target),
|
|
179
|
+
id: popup_field.clear_link,
|
|
180
|
+
style: 'display:' + (parent_name.blank? ? 'none' : '')) +
|
|
181
|
+
f.hidden_field(col_name)).html_safe
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# draw 'belongs_to' popup data-entry field
|
|
185
|
+
#
|
|
186
|
+
# This is usually used with draw_belongs_to_label().
|
|
187
|
+
#
|
|
188
|
+
# === INPUTS
|
|
189
|
+
# f:: FormBuilder object
|
|
190
|
+
# col_name:: 'belongs_to' column name
|
|
191
|
+
# model:: data model class
|
|
192
|
+
def draw_belongs_to_field(f, col_name, model = f.object.class)
|
|
193
|
+
col = model.columns.detect{|c| c.name == col_name.to_s}
|
|
194
|
+
return "no column found" if !col
|
|
195
|
+
|
|
196
|
+
parent_model = model.belongs_to_AR(col)
|
|
197
|
+
return "parent_model is nil" if !parent_model
|
|
198
|
+
|
|
199
|
+
parent_obj = f.object.belongs_to_AR(col)
|
|
200
|
+
popup_field = Edgarj::PopupHelper::PopupField.new_builder(
|
|
201
|
+
f.object_name, col_name)
|
|
202
|
+
label = sprintf("<span id='%s'>%s</span>",
|
|
203
|
+
popup_field.label_target,
|
|
204
|
+
parent_obj ? parent_obj.name : '').html_safe
|
|
205
|
+
if parent_obj
|
|
206
|
+
link_to(label,
|
|
207
|
+
# TODO: Hardcoded 'master' prefix should be fixed
|
|
208
|
+
controller: url_prefix + parent_obj.class.name.underscore.pluralize,
|
|
209
|
+
action: 'show',
|
|
210
|
+
id: parent_obj,
|
|
211
|
+
topic_path: 'add')
|
|
212
|
+
else
|
|
213
|
+
label
|
|
214
|
+
end +
|
|
215
|
+
draw_belongs_to_clear_link(f, col.name, popup_field, parent_obj && parent_obj.name)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Is flag in column_value on?
|
|
219
|
+
def flag_on?(column_value, bitset, flag)
|
|
220
|
+
val = column_value || 0
|
|
221
|
+
(val & bitset.const_get(flag)) != 0
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# get bitset Module.
|
|
225
|
+
#
|
|
226
|
+
# When ColBitset(camelized argument col name + 'Bitset') module exists,
|
|
227
|
+
# the ColBitset is assumed enum definition.
|
|
228
|
+
def get_bitset(model, col)
|
|
229
|
+
bitset_name = col.name.camelize + 'Bitset'
|
|
230
|
+
if model.const_defined?(bitset_name, false)
|
|
231
|
+
_module = model.const_get(bitset_name)
|
|
232
|
+
_module.is_a?(Module) ? _module : nil
|
|
233
|
+
else
|
|
234
|
+
nil
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# draw bitset column in list.
|
|
239
|
+
#
|
|
240
|
+
# === INPUTS
|
|
241
|
+
# rec:: AR object
|
|
242
|
+
# col_or_sym:: column object returned by rec.class.columns
|
|
243
|
+
# bitset:: Module which contains bitset constants
|
|
244
|
+
#
|
|
245
|
+
# === SEE ALSO
|
|
246
|
+
# get_bitset():: get bitset definition
|
|
247
|
+
# draw_bitset():: draw bitste checkboxes field
|
|
248
|
+
# draw_column_enum():: draw bitset column in list
|
|
249
|
+
def draw_column_bitset(rec, col_or_sym, bitset)
|
|
250
|
+
turn_on_flags = []
|
|
251
|
+
value = rec.send(get_column_name(col_or_sym))
|
|
252
|
+
for flag in bitset.constants do
|
|
253
|
+
turn_on_flags << flag if flag_on?(value, bitset, flag)
|
|
254
|
+
end
|
|
255
|
+
turn_on_flags.map{|f| rec.class.human_const_name(bitset, f) }.join(' ')
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
# get enum Module.
|
|
259
|
+
#
|
|
260
|
+
# When Col(camelized argument col name) module exists, the Col is
|
|
261
|
+
# assumed enum definition.
|
|
262
|
+
def get_enum(model, col)
|
|
263
|
+
col_name = col.name
|
|
264
|
+
if model.const_defined?(col_name.camelize, false)
|
|
265
|
+
enum = model.const_get(col_name.camelize)
|
|
266
|
+
enum.is_a?(Module) ? enum : nil
|
|
267
|
+
else
|
|
268
|
+
nil
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
# draw enum column in list.
|
|
273
|
+
#
|
|
274
|
+
# When enum for col is defined, constant string (rather than rec.col value)
|
|
275
|
+
# is drawn. See get_enum() for more detail of enum for the col.
|
|
276
|
+
#
|
|
277
|
+
# === EXAMPLE
|
|
278
|
+
# Question has status attribute and Question::Status enum.
|
|
279
|
+
# When question.status == 300,
|
|
280
|
+
# draw_column_enum(question, status_col, Question::Status) returns
|
|
281
|
+
# I18n.t('WORKING').
|
|
282
|
+
#
|
|
283
|
+
# Where:
|
|
284
|
+
# * question is Question AR object.
|
|
285
|
+
# * status_col is one of Question.columns object for status column.
|
|
286
|
+
#
|
|
287
|
+
# === INPUTS
|
|
288
|
+
# rec:: AR object
|
|
289
|
+
# col_or_sym:: column object returned by rec.class.columns
|
|
290
|
+
# enum:: Module which contains constants
|
|
291
|
+
#
|
|
292
|
+
# === SEE ALSO
|
|
293
|
+
# get_enum():: get enum definition
|
|
294
|
+
# draw_enum():: draw enum selection field
|
|
295
|
+
# draw_column_bitset():: draw bitset column in list
|
|
296
|
+
#
|
|
297
|
+
def draw_column_enum(rec, col_or_sym, enum)
|
|
298
|
+
Edgarj::EnumCache.instance.label(rec, get_column_name(col_or_sym), enum)
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
# return address element string or ''
|
|
302
|
+
def adrs_str_sub(model, prefix, element)
|
|
303
|
+
e = model.send(prefix + element)
|
|
304
|
+
e.blank? ? '' : e
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
# model & adrs_prefix -> address string
|
|
308
|
+
def adrs_str(model, adrs_prefix)
|
|
309
|
+
result = ''
|
|
310
|
+
for adrs_element in ['prefecture', 'city', 'other', 'bldg'] do
|
|
311
|
+
result << adrs_str_sub(model, adrs_prefix, adrs_element)
|
|
312
|
+
end
|
|
313
|
+
result
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
# return true if login user has enough permission on current controller.
|
|
317
|
+
def permitted?(requested_flags = 0)
|
|
318
|
+
current_user_roles.any?{|ug| ug.admin?} ||
|
|
319
|
+
current_model_permissions.any?{|cp| cp.permitted?(requested_flags)}
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
# return true if login user has any permission on the controller.
|
|
323
|
+
def permitted_on?(controller)
|
|
324
|
+
true # TBD
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
# Visit @list and generate csv
|
|
328
|
+
class CsvVisitor
|
|
329
|
+
# === INPUTS
|
|
330
|
+
# t:: template object
|
|
331
|
+
def initialize(t)
|
|
332
|
+
@t = t
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def visit_column(rec, col)
|
|
336
|
+
val = rec.send(col.name)
|
|
337
|
+
case col.type
|
|
338
|
+
when :date
|
|
339
|
+
@t.date_fmt(val)
|
|
340
|
+
when :datetime
|
|
341
|
+
@t.datetime_fmt(val)
|
|
342
|
+
else
|
|
343
|
+
rec.send(col.name)
|
|
344
|
+
end
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
private
|
|
349
|
+
def top_menu_td(id, name)
|
|
350
|
+
content_tag(:td,
|
|
351
|
+
:id => id,
|
|
352
|
+
:onMouseOver => "Edgarj.Menu.show('#{id}')",
|
|
353
|
+
:onMouseOut => "Edgarj.Menu.hide('#{id}')") do
|
|
354
|
+
|
|
355
|
+
content_tag(:a, name, :href=>'#') + yield
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# Provide consistency between <td> tag id and its sub contents <div> id.
|
|
360
|
+
# This concistency is required for javascript pull-down action.
|
|
361
|
+
def draw_menu_top_and_pulldown(id, name)
|
|
362
|
+
top_menu_td(id, name) do
|
|
363
|
+
content_tag(:div, :class=>'submenu', :id=>"sub#{id}") do
|
|
364
|
+
yield
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
end
|
|
368
|
+
end
|
|
369
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# coding: UTF-8
|
|
2
|
+
|
|
3
|
+
module Edgarj
|
|
4
|
+
module CommonHelper
|
|
5
|
+
# Edgarj standard datetime format
|
|
6
|
+
def datetime_fmt(dt)
|
|
7
|
+
if dt.blank? then
|
|
8
|
+
''
|
|
9
|
+
else
|
|
10
|
+
I18n.l(dt, format: I18n.t('edgarj.time.format'))
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Edgarj standard date format
|
|
15
|
+
def date_fmt(dt)
|
|
16
|
+
if dt == nil then
|
|
17
|
+
''
|
|
18
|
+
else
|
|
19
|
+
dt.strftime(I18n.t('date.formats.default'))
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# get enum Module.
|
|
24
|
+
#
|
|
25
|
+
# When Col(camelized argument col name) module exists, the Col is
|
|
26
|
+
# assumed enum definition.
|
|
27
|
+
def get_enum(model, col)
|
|
28
|
+
col_name = col.name
|
|
29
|
+
if model.const_defined?(col_name.camelize, false)
|
|
30
|
+
enum = model.const_get(col_name.camelize)
|
|
31
|
+
enum.is_a?(Module) ? enum : nil
|
|
32
|
+
else
|
|
33
|
+
nil
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# coding: UTF-8
|
|
2
|
+
|
|
3
|
+
require 'edgarj/common_helper'
|
|
4
|
+
require 'edgarj/assoc_helper'
|
|
5
|
+
require 'edgarj/field_helper'
|
|
6
|
+
require 'edgarj/popup_helper'
|
|
7
|
+
require 'edgarj/form_drawer'
|
|
8
|
+
require 'edgarj/list_drawer'
|
|
9
|
+
|
|
10
|
+
module Edgarj
|
|
11
|
+
module EdgarjHelper
|
|
12
|
+
include CommonHelper
|
|
13
|
+
include AssocHelper
|
|
14
|
+
include FieldHelper
|
|
15
|
+
include PopupHelper
|
|
16
|
+
include FormDrawer
|
|
17
|
+
include ListDrawer
|
|
18
|
+
include SearchHelper
|
|
19
|
+
end
|
|
20
|
+
end
|