engine2 1.0.0
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/Gemfile +2 -0
- data/Rakefile +138 -0
- data/conf/message.yaml +93 -0
- data/conf/message_pl.yaml +93 -0
- data/engine2.gemspec +34 -0
- data/lib/engine2.rb +34 -0
- data/lib/engine2/action.rb +217 -0
- data/lib/engine2/core.rb +572 -0
- data/lib/engine2/handler.rb +134 -0
- data/lib/engine2/meta.rb +969 -0
- data/lib/engine2/meta/decode_meta.rb +110 -0
- data/lib/engine2/meta/delete_meta.rb +73 -0
- data/lib/engine2/meta/form_meta.rb +144 -0
- data/lib/engine2/meta/infra_meta.rb +292 -0
- data/lib/engine2/meta/link_meta.rb +133 -0
- data/lib/engine2/meta/list_meta.rb +284 -0
- data/lib/engine2/meta/save_meta.rb +63 -0
- data/lib/engine2/meta/view_meta.rb +22 -0
- data/lib/engine2/model.rb +390 -0
- data/lib/engine2/models/Files.rb +38 -0
- data/lib/engine2/models/UserInfo.rb +24 -0
- data/lib/engine2/post_bootstrap.rb +83 -0
- data/lib/engine2/pre_bootstrap.rb +27 -0
- data/lib/engine2/scheme.rb +202 -0
- data/lib/engine2/templates.rb +229 -0
- data/lib/engine2/type_info.rb +342 -0
- data/lib/engine2/version.rb +9 -0
- data/public/assets/javascripts.js +13 -0
- data/public/assets/styles.css +4 -0
- data/public/css/angular-motion.css +1022 -0
- data/public/css/angular-ui-tree.min.css +1 -0
- data/public/css/app.css +196 -0
- data/public/css/bootstrap-additions.css +1560 -0
- data/public/css/bootstrap.min.css +11 -0
- data/public/css/font-awesome.min.css +4 -0
- data/public/favicon.ico +0 -0
- data/public/fonts/FontAwesome.otf +0 -0
- data/public/fonts/fontawesome-webfont.eot +0 -0
- data/public/fonts/fontawesome-webfont.svg +655 -0
- data/public/fonts/fontawesome-webfont.ttf +0 -0
- data/public/fonts/fontawesome-webfont.woff +0 -0
- data/public/fonts/fontawesome-webfont.woff2 +0 -0
- data/public/fonts/glyphicons-halflings-regular.eot +0 -0
- data/public/fonts/glyphicons-halflings-regular.svg +288 -0
- data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/public/fonts/glyphicons-halflings-regular.woff +0 -0
- data/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/public/images/file.png +0 -0
- data/public/images/folder-closed.png +0 -0
- data/public/images/folder.png +0 -0
- data/public/images/node-closed-2.png +0 -0
- data/public/images/node-closed-light.png +0 -0
- data/public/images/node-closed.png +0 -0
- data/public/images/node-opened-2.png +0 -0
- data/public/images/node-opened-light.png +0 -0
- data/public/images/node-opened.png +0 -0
- data/public/img/ajax-loader-dark.gif +0 -0
- data/public/img/ajax-loader-light.gif +0 -0
- data/public/img/ajax-loader.gif +0 -0
- data/public/js/angular-animate.js +4115 -0
- data/public/js/angular-cookies.js +322 -0
- data/public/js/angular-local-storage.js +455 -0
- data/public/js/angular-route.js +1022 -0
- data/public/js/angular-sanitize.js +717 -0
- data/public/js/angular-strap.js +4339 -0
- data/public/js/angular-strap.tpl.js +43 -0
- data/public/js/angular-ui-tree.js +1569 -0
- data/public/js/angular.js +30714 -0
- data/public/js/i18n/angular-locale_pl.js +115 -0
- data/public/js/lodash.custom.min.js +97 -0
- data/public/js/ng-file-upload-shim.min.js +2 -0
- data/public/js/ng-file-upload.min.js +3 -0
- data/views/app.coffee +3 -0
- data/views/engine2.coffee +557 -0
- data/views/engine2actions.coffee +849 -0
- data/views/engine2templates.coffee +0 -0
- data/views/fields/blob.slim +22 -0
- data/views/fields/bs_select.slim +10 -0
- data/views/fields/bsselect_picker.slim +18 -0
- data/views/fields/bsselect_picker_opt.slim +22 -0
- data/views/fields/checkbox.slim +11 -0
- data/views/fields/checkbox_buttons.slim +6 -0
- data/views/fields/checkbox_buttons_opt.slim +8 -0
- data/views/fields/currency.slim +10 -0
- data/views/fields/date.slim +21 -0
- data/views/fields/date_range.slim +44 -0
- data/views/fields/date_time.slim +42 -0
- data/views/fields/datetime.slim +42 -0
- data/views/fields/decimal.slim +11 -0
- data/views/fields/decimal_date.slim +22 -0
- data/views/fields/decimal_time.slim +26 -0
- data/views/fields/email.slim +13 -0
- data/views/fields/file_store.slim +61 -0
- data/views/fields/input_text.slim +14 -0
- data/views/fields/integer.slim +11 -0
- data/views/fields/list_bsselect.slim +18 -0
- data/views/fields/list_bsselect_opt.slim +21 -0
- data/views/fields/list_buttons.slim +3 -0
- data/views/fields/list_buttons_opt.slim +5 -0
- data/views/fields/list_select.slim +11 -0
- data/views/fields/list_select_opt.slim +15 -0
- data/views/fields/password.slim +14 -0
- data/views/fields/radio_checkbox.slim +10 -0
- data/views/fields/scaffold.slim +2 -0
- data/views/fields/scaffold_picker.slim +20 -0
- data/views/fields/select_picker.slim +12 -0
- data/views/fields/select_picker_opt.slim +16 -0
- data/views/fields/text_area.slim +10 -0
- data/views/fields/time.slim +22 -0
- data/views/fields/typeahead_picker.slim +25 -0
- data/views/index.slim +44 -0
- data/views/infra/index.slim +5 -0
- data/views/infra/inspect.slim +81 -0
- data/views/modals/close_m.slim +15 -0
- data/views/modals/confirm_m.slim +19 -0
- data/views/modals/empty_m.slim +12 -0
- data/views/modals/menu_m.slim +13 -0
- data/views/modals/yes_no_m.slim +19 -0
- data/views/panels/menu_m.slim +9 -0
- data/views/scaffold/confirm.slim +3 -0
- data/views/scaffold/fields.slim +10 -0
- data/views/scaffold/form.slim +11 -0
- data/views/scaffold/list.slim +42 -0
- data/views/scaffold/message.slim +3 -0
- data/views/scaffold/search.slim +20 -0
- data/views/scaffold/view.slim +18 -0
- data/views/search_fields/bsmselect_picker.slim +25 -0
- data/views/search_fields/bsselect_picker.slim +24 -0
- data/views/search_fields/checkbox.slim +11 -0
- data/views/search_fields/checkbox2.slim +14 -0
- data/views/search_fields/checkbox_buttons.slim +10 -0
- data/views/search_fields/date_range.slim +46 -0
- data/views/search_fields/decimal_date_range.slim +47 -0
- data/views/search_fields/input_text.slim +18 -0
- data/views/search_fields/integer.slim +18 -0
- data/views/search_fields/integer_range.slim +27 -0
- data/views/search_fields/list_bsmselect.slim +24 -0
- data/views/search_fields/list_bsselect.slim +22 -0
- data/views/search_fields/list_buttons.slim +8 -0
- data/views/search_fields/list_select.slim +17 -0
- data/views/search_fields/scaffold_picker.slim +19 -0
- data/views/search_fields/select_picker.slim +17 -0
- data/views/search_fields/typeahead_picker.slim +25 -0
- metadata +327 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
module Engine2
|
|
4
|
+
class UserInfo < Sequel::Model(DUMMYDB)
|
|
5
|
+
extend MemoryModel
|
|
6
|
+
set_natural_key :name
|
|
7
|
+
|
|
8
|
+
type_info do
|
|
9
|
+
string_field :name, 10
|
|
10
|
+
required :name, LOCS[:user_required]
|
|
11
|
+
string_field :password, 20
|
|
12
|
+
required :password, LOCS[:password_required]
|
|
13
|
+
password :password
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def after_validation
|
|
17
|
+
@values[:password] = nil
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_hash
|
|
21
|
+
{name: @values[:name]}
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module SequelFixes
|
|
5
|
+
def self.fix_aliased_expression ds
|
|
6
|
+
ds.get_opts[:select].map do |sel|
|
|
7
|
+
case sel
|
|
8
|
+
when Sequel::SQL::QualifiedIdentifier
|
|
9
|
+
sel.column
|
|
10
|
+
when Sequel::SQL::AliasedExpression
|
|
11
|
+
Sequel::SQL::Identifier.new sel.aliaz
|
|
12
|
+
else
|
|
13
|
+
sel # symbol ?
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module EmulateOffsetWithRowNumber
|
|
20
|
+
def select_sql
|
|
21
|
+
return super unless emulate_offset_with_row_number?
|
|
22
|
+
offset = @opts[:offset]
|
|
23
|
+
order = @opts[:order]
|
|
24
|
+
if require_offset_order?
|
|
25
|
+
order ||= default_offset_order
|
|
26
|
+
if order.nil? || order.empty?
|
|
27
|
+
raise(Error, "#{db.database_type} requires an order be provided if using an offset")
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
# columns = clone(:append_sql=>'', :placeholder_literal_null=>true).columns
|
|
31
|
+
columns = SequelFixes.fix_aliased_expression(clone(:append_sql=>'', :placeholder_literal_null=>true))
|
|
32
|
+
dsa1 = dataset_alias(1)
|
|
33
|
+
rn = row_number_column
|
|
34
|
+
sql = @opts[:append_sql] || ''
|
|
35
|
+
subselect_sql_append(sql, unlimited.
|
|
36
|
+
unordered.
|
|
37
|
+
select_append{ROW_NUMBER{}.over(:order=>order).as(rn)}.
|
|
38
|
+
from_self(:alias=>dsa1).
|
|
39
|
+
select(*columns).
|
|
40
|
+
limit(@opts[:limit]).
|
|
41
|
+
where(SQL::Identifier.new(rn) > offset).
|
|
42
|
+
order(rn))
|
|
43
|
+
sql
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def default_offset_order
|
|
47
|
+
model.primary_keys_qualified
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
module Oracle::DatasetMethods
|
|
52
|
+
def select_sql
|
|
53
|
+
return super if @opts[:sql]
|
|
54
|
+
if o = @opts[:offset]
|
|
55
|
+
# columns = clone(:append_sql=>String.new, :placeholder_literal_null=>true).columns
|
|
56
|
+
columns = SequelFixes.fix_aliased_expression(clone(:append_sql=>String.new, :placeholder_literal_null=>true))
|
|
57
|
+
dsa1 = dataset_alias(1)
|
|
58
|
+
rn = row_number_column
|
|
59
|
+
limit = @opts[:limit]
|
|
60
|
+
ds = unlimited.
|
|
61
|
+
from_self(:alias=>dsa1).
|
|
62
|
+
select_append(ROW_NUMBER_EXPRESSION.as(rn)).
|
|
63
|
+
from_self(:alias=>dsa1).
|
|
64
|
+
select(*columns).
|
|
65
|
+
where(SQL::Identifier.new(rn) > o)
|
|
66
|
+
ds = ds.where(SQL::Identifier.new(rn) <= Sequel.+(o, limit)) if limit
|
|
67
|
+
sql = @opts[:append_sql] || String.new
|
|
68
|
+
subselect_sql_append(sql, ds)
|
|
69
|
+
sql
|
|
70
|
+
elsif limit = @opts[:limit]
|
|
71
|
+
ds = clone(:limit=>nil)
|
|
72
|
+
# Lock doesn't work in subselects, so don't use a subselect when locking.
|
|
73
|
+
# Don't use a subselect if custom SQL is used, as it breaks somethings.
|
|
74
|
+
ds = ds.from_self unless @opts[:lock]
|
|
75
|
+
sql = @opts[:append_sql] || String.new
|
|
76
|
+
subselect_sql_append(sql, ds.where(SQL::ComplexExpression.new(:<=, ROW_NUMBER_EXPRESSION, limit)))
|
|
77
|
+
sql
|
|
78
|
+
else
|
|
79
|
+
super
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end if defined? Oracle
|
|
83
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
class JDBC::Database
|
|
5
|
+
def metadata_schema_and_table(table, opts)
|
|
6
|
+
im = input_identifier_meth(opts[:dataset])
|
|
7
|
+
schema, table = schema_and_table(table)
|
|
8
|
+
schema ||= default_schema
|
|
9
|
+
schema ||= opts[:schema]
|
|
10
|
+
schema = im.call(schema) if schema
|
|
11
|
+
table = im.call(table)
|
|
12
|
+
[schema, table]
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
module JDBC::AS400::DatabaseMethods
|
|
17
|
+
IDENTITY_VAL_LOCAL ||= "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1".freeze
|
|
18
|
+
def last_insert_id(conn, opts=OPTS)
|
|
19
|
+
statement(conn) do |stmt|
|
|
20
|
+
sql = IDENTITY_VAL_LOCAL
|
|
21
|
+
rs = log_yield(sql){stmt.executeQuery(sql)}
|
|
22
|
+
rs.next
|
|
23
|
+
rs.getInt(1)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end if defined?(JDBC::AS400)
|
|
27
|
+
end if defined? JRUBY_VERSION
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
module Engine2
|
|
4
|
+
class Schemes
|
|
5
|
+
CRUD ||= {create: true, view: true, modify: true, delete: true}.freeze # bulk_delete: true
|
|
6
|
+
VIEW ||= {view: true}.freeze
|
|
7
|
+
LINK ||= {star_to_many_link: true, view: true, star_to_many_unlink: true}.freeze # star_to_many_bulk_unlink: true
|
|
8
|
+
|
|
9
|
+
attr_reader :schemes, :builtin
|
|
10
|
+
def initialize
|
|
11
|
+
@builtin = {}
|
|
12
|
+
@schemes = {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def define_scheme name, &blk
|
|
16
|
+
schemes = Engine2::core_loading ? @builtin : @schemes
|
|
17
|
+
raise "Scheme '#{name}' already defined" if schemes[name]
|
|
18
|
+
schemes[name] = blk
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def clear
|
|
22
|
+
@schemes = {}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def [] name
|
|
26
|
+
scheme = @schemes[name]
|
|
27
|
+
raise E2Error.new("Scheme #{name} not found") unless scheme
|
|
28
|
+
scheme
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def merge!
|
|
32
|
+
@schemes.merge!(@builtin){|n| raise E2Error.new("Scheme collision: #{n}")}
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
SCHEMES ||= Schemes.new
|
|
37
|
+
SCHEMES.builtin.clear
|
|
38
|
+
SCHEMES.instance_eval do
|
|
39
|
+
|
|
40
|
+
define_scheme :view do |name = :view|
|
|
41
|
+
define_action name, ViewMeta
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
define_scheme :create do |name = :create|
|
|
45
|
+
define_action name, CreateMeta do
|
|
46
|
+
define_action :approve, InsertMeta
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
define_scheme :modify do |name = :modify|
|
|
51
|
+
define_action name, ModifyMeta do
|
|
52
|
+
define_action :approve, UpdateMeta
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
define_scheme :delete do
|
|
57
|
+
define_action :confirm_delete, ConfirmMeta do
|
|
58
|
+
self.*.response message: LOCS[:delete_question]
|
|
59
|
+
self.*.panel_title LOCS[:confirm_delete_title]
|
|
60
|
+
define_action :delete, DeleteMeta
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
define_scheme :bulk_delete do
|
|
65
|
+
define_action :confirm_bulk_delete, ConfirmMeta do
|
|
66
|
+
self.*.response message: LOCS[:delete_question]
|
|
67
|
+
self.*.panel_title LOCS[:confirm_bulk_delete_title]
|
|
68
|
+
define_action :bulk_delete, BulkDeleteMeta
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
define_scheme :default do |name, model, options|
|
|
73
|
+
options ||= Schemes::CRUD
|
|
74
|
+
define_action name, ListMeta, model: model do
|
|
75
|
+
options.each{|k, v| run_scheme(k) if v}
|
|
76
|
+
|
|
77
|
+
define_action_bundle :form, :create, :modify if options[:create] && options[:modify]
|
|
78
|
+
# define_action_bundle :decode, :decode_entry, :decode_list, :typahead
|
|
79
|
+
|
|
80
|
+
# if ?
|
|
81
|
+
define_action :decode_entry, DecodeEntryMeta
|
|
82
|
+
define_action :decode_list, DecodeListMeta
|
|
83
|
+
define_action :typeahead, TypeAheadMeta
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# Many to One
|
|
89
|
+
#
|
|
90
|
+
define_scheme :many_to_one do
|
|
91
|
+
define_action :list, ManyToOneListMeta do
|
|
92
|
+
run_scheme :view
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
define_scheme :decode do |model, assoc_name, options = {scaffold: true}|
|
|
97
|
+
assoc = model.association_reflections[assoc_name]
|
|
98
|
+
::Kernel::raise E2Error.new("Association '#{assoc_name}' not found for model '#{model}'") unless assoc
|
|
99
|
+
|
|
100
|
+
if self.*.assets[:model] != model && self.*.is_a?(ListMeta)
|
|
101
|
+
# verify relations ?
|
|
102
|
+
mdl = assoc[:model]
|
|
103
|
+
info = mdl.type_info[assoc[:keys].first]
|
|
104
|
+
options = info[:decode][:search]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
define_action :"#{assoc_name}!" do
|
|
108
|
+
# iterate over options like in :default ?
|
|
109
|
+
define_action :list, DecodeListMeta, assoc: assoc if options[:list]
|
|
110
|
+
define_action :typeahead, TypeAheadMeta, assoc: assoc if options[:typeahead]
|
|
111
|
+
define_action :decode, DecodeEntryMeta, assoc: assoc do
|
|
112
|
+
run_scheme :many_to_one
|
|
113
|
+
end if options[:scaffold]
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
#
|
|
118
|
+
# * to Many
|
|
119
|
+
#
|
|
120
|
+
define_scheme :star_to_many_unlink do
|
|
121
|
+
define_action :confirm_unlink, ConfirmMeta do
|
|
122
|
+
self.*.response message: LOCS[:unlink_question]
|
|
123
|
+
self.*.panel_title LOCS[:confirm_unlink_title]
|
|
124
|
+
define_action :unlink, StarToManyUnlinkMeta
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
define_scheme :star_to_many_bulk_unlink do
|
|
129
|
+
define_action :confirm_bulk_unlink, ConfirmMeta do
|
|
130
|
+
self.*.response message: LOCS[:unlink_question]
|
|
131
|
+
self.*.panel_title LOCS[:confirm_bulk_unlink_title]
|
|
132
|
+
define_action :bulk_unlink, StarToManyBulkUnlinkMeta
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
define_scheme :star_to_many_link do
|
|
137
|
+
define_action :link_list, StarToManyLinkListMeta do
|
|
138
|
+
run_scheme :view
|
|
139
|
+
define_action :link, StarToManyLinkMeta
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
define_scheme :star_to_many do |act, assoc, model|
|
|
144
|
+
options = assoc[:options] || Schemes::LINK
|
|
145
|
+
define_action act, StarToManyListMeta, model: model, assoc: assoc do
|
|
146
|
+
options.each{|k, v| run_scheme(k) if v}
|
|
147
|
+
|
|
148
|
+
define_action_bundle :form, :create, :modify if options[:create] && options[:modify]
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
#
|
|
153
|
+
# arbitrary files per form
|
|
154
|
+
#
|
|
155
|
+
define_scheme :file_store do |model, field|
|
|
156
|
+
define_action :"#{field}_file_store!", FileStoreMeta do
|
|
157
|
+
self.*.model = model
|
|
158
|
+
self.*.field = field
|
|
159
|
+
define_action :download, DownloadFileStoreMeta
|
|
160
|
+
define_action :upload, UploadFileStoreMeta
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
#
|
|
165
|
+
# blob field in source table
|
|
166
|
+
#
|
|
167
|
+
define_scheme :blob_store do |model, field|
|
|
168
|
+
define_action :"#{field}_blob_store!", BlobStoreMeta do
|
|
169
|
+
self.*.model = model
|
|
170
|
+
self.*.field = field # model.type_info[field][:field]
|
|
171
|
+
define_action :download, DownloadBlobStoreMeta
|
|
172
|
+
define_action :upload, UploadBlobStoreMeta
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
#
|
|
177
|
+
# blob field in foreign (one to one) table
|
|
178
|
+
#
|
|
179
|
+
define_scheme :foreign_blob_store do |model, field|
|
|
180
|
+
define_action :"#{field}_blob_store!", ForeignBlobStoreMeta do
|
|
181
|
+
self.*.model = model
|
|
182
|
+
self.*.field = field # model.type_info[field][:field]
|
|
183
|
+
define_action :download, DownloadForeignBlobStoreMeta
|
|
184
|
+
define_action :upload, UploadBlobStoreMeta
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
define_scheme :star_to_many_field do |assoc, field|
|
|
189
|
+
define_action :"#{field}!", StarToManyFieldMeta, assoc: assoc do
|
|
190
|
+
run_scheme :view
|
|
191
|
+
define_action :confirm_unlink, ConfirmMeta do
|
|
192
|
+
self.*.response message: LOCS[:unlink_question]
|
|
193
|
+
define_action :unlink, StarToManyFieldUnlinkMeta
|
|
194
|
+
end
|
|
195
|
+
define_action :link_list, StarToManyFieldLinkListMeta do
|
|
196
|
+
run_scheme :view
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
end
|
|
202
|
+
end
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
module Engine2
|
|
4
|
+
BS_ANIMATION ||= "am-flip-x" # "am-fade"
|
|
5
|
+
|
|
6
|
+
class Templates
|
|
7
|
+
class << self
|
|
8
|
+
def default_template
|
|
9
|
+
{template: "fields/input_text"}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def text_area cols, rows
|
|
13
|
+
{template: "fields/text_area", cols: cols, rows: rows}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def input_text length
|
|
17
|
+
{template: "fields/input_text", length: length}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def text
|
|
21
|
+
{template: "fields/text"}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def password length
|
|
25
|
+
{template: "fields/password", length: length}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def file_store
|
|
29
|
+
{template: "fields/file_store"}
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def blob
|
|
33
|
+
{template: "fields/blob"}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def integer
|
|
37
|
+
{template: "fields/integer"}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def decimal
|
|
41
|
+
{template: "fields/integer"}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def decimal_date
|
|
45
|
+
{template: "fields/decimal_date", animation: BS_ANIMATION}
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def decimal_time
|
|
49
|
+
{template: "fields/decimal_time", animation: BS_ANIMATION}
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def date_picker
|
|
53
|
+
{template: "fields/date", animation: BS_ANIMATION}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def time_picker
|
|
57
|
+
{template: "fields/time", animation: BS_ANIMATION}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def datetime_picker
|
|
61
|
+
{template: "fields/datetime", animation: BS_ANIMATION}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def list_select length, options = {}
|
|
65
|
+
options.merge({
|
|
66
|
+
template: options[:optional] ? "fields/list_select_opt" : "fields/list_select",
|
|
67
|
+
length: length
|
|
68
|
+
})
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def list_bsselect length, options = {}
|
|
72
|
+
options.merge({
|
|
73
|
+
template: options[:optional] ? "fields/list_bsselect_opt" : "fields/list_bsselect",
|
|
74
|
+
length: length,
|
|
75
|
+
animation: BS_ANIMATION
|
|
76
|
+
})
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def list_buttons options = {}
|
|
80
|
+
options.merge({
|
|
81
|
+
template: options[:optional] ? "fields/list_buttons_opt" : "fields/list_buttons"
|
|
82
|
+
})
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def select_picker options = {}
|
|
86
|
+
options.merge({
|
|
87
|
+
template: options[:optional] ? "fields/select_picker_opt" : "fields/select_picker"
|
|
88
|
+
})
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def bsselect_picker options = {}
|
|
92
|
+
options.merge({
|
|
93
|
+
template: options[:optional] ? "fields/bsselect_picker_opt" : "fields/bsselect_picker",
|
|
94
|
+
animation: BS_ANIMATION
|
|
95
|
+
})
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# def bs_select_picker(options)
|
|
99
|
+
# {
|
|
100
|
+
# resource: options[:resource],
|
|
101
|
+
# template: "fields/bs_select"
|
|
102
|
+
# }
|
|
103
|
+
# end
|
|
104
|
+
|
|
105
|
+
def scaffold_picker options = {}
|
|
106
|
+
options.merge({
|
|
107
|
+
template: 'fields/scaffold_picker'
|
|
108
|
+
})
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def typeahead_picker
|
|
112
|
+
{template: "fields/typeahead_picker", animation: BS_ANIMATION}
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def email length
|
|
116
|
+
{template: "fields/email", length: length}
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def date_range
|
|
120
|
+
{template: "fields/date_range", animation: BS_ANIMATION}
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def date_time
|
|
124
|
+
{template: "fields/date_time", animation: BS_ANIMATION}
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def currency
|
|
128
|
+
{template: "fields/currency"}
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def checkbox
|
|
132
|
+
{template: "fields/checkbox"}
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def checkbox_buttons options = {}
|
|
136
|
+
options.merge({
|
|
137
|
+
template: options[:optional] ? "fields/checkbox_buttons_opt" : "fields/checkbox_buttons"
|
|
138
|
+
})
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def radio_checkbox
|
|
142
|
+
{template: "fields/radio_checkbox"}
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def scaffold
|
|
146
|
+
{template: "fields/scaffold"}
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
class SearchTemplates
|
|
153
|
+
class << self
|
|
154
|
+
def input_text
|
|
155
|
+
{template: "search_fields/input_text"}
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def date_range options = {}
|
|
159
|
+
options.merge({
|
|
160
|
+
template: "search_fields/date_range",
|
|
161
|
+
animation: BS_ANIMATION
|
|
162
|
+
})
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def integer_range
|
|
166
|
+
{template: "search_fields/integer_range"}
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def integer
|
|
170
|
+
{template: "search_fields/integer"}
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def select_picker options = {}
|
|
174
|
+
options.merge({
|
|
175
|
+
template: "search_fields/select_picker"
|
|
176
|
+
})
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def bsselect_picker options = {}
|
|
180
|
+
options.merge({
|
|
181
|
+
template: options[:multiple] ? "search_fields/bsmselect_picker" : "search_fields/bsselect_picker",
|
|
182
|
+
animation: BS_ANIMATION
|
|
183
|
+
})
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def scaffold_picker options = {}
|
|
187
|
+
options.merge({
|
|
188
|
+
# template: options[:multiple] ? "search_fields/scaffold_picker" : "search_fields/scaffold_picker"
|
|
189
|
+
template: "search_fields/scaffold_picker"
|
|
190
|
+
})
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def typeahead_picker
|
|
194
|
+
{template: "search_fields/typeahead_picker", animation: BS_ANIMATION}
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# def checkbox_search true_v = "1", false_v = "0"
|
|
198
|
+
# {
|
|
199
|
+
# template: "search_fields/checkbox2",
|
|
200
|
+
# true_value: true_v,
|
|
201
|
+
# false_value: false_v
|
|
202
|
+
# }
|
|
203
|
+
# end
|
|
204
|
+
|
|
205
|
+
def checkbox_buttons
|
|
206
|
+
{template: 'search_fields/checkbox_buttons'}
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def list_select
|
|
210
|
+
{template: "search_fields/list_select"}
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def list_bsselect options = {}
|
|
214
|
+
options.merge({
|
|
215
|
+
template: options[:multiple] ? "search_fields/list_bsmselect" : "search_fields/list_bsselect",
|
|
216
|
+
animation: BS_ANIMATION
|
|
217
|
+
})
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def list_buttons
|
|
221
|
+
{template: "search_fields/list_buttons"}
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def decimal_date
|
|
225
|
+
{template: "search_fields/decimal_date_range", animation: BS_ANIMATION}
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|