ezframe 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/asset/js/ezframe.js +262 -162
- data/exe/dbmigrate +43 -9
- data/exe/html2ruby +61 -0
- data/lib/ezframe.rb +0 -1
- data/lib/ezframe/column_type.rb +50 -13
- data/lib/ezframe/database.rb +7 -7
- data/lib/ezframe/editor_common.rb +26 -8
- data/lib/ezframe/ht.rb +5 -5
- data/lib/ezframe/html.rb +20 -13
- data/lib/ezframe/main_editor.rb +13 -232
- data/lib/ezframe/main_page_kit.rb +226 -0
- data/lib/ezframe/page_base.rb +1 -8
- data/lib/ezframe/single_page_editor.rb +7 -190
- data/lib/ezframe/single_page_kit.rb +199 -0
- data/lib/ezframe/sub_editor.rb +3 -200
- data/lib/ezframe/sub_page_kit.rb +213 -0
- data/lib/ezframe/version.rb +1 -1
- metadata +7 -3
- data/lib/ezframe/editor.rb +0 -176
@@ -0,0 +1,213 @@
|
|
1
|
+
module Ezframe
|
2
|
+
module SubPageKit
|
3
|
+
module Default
|
4
|
+
def public_default_post
|
5
|
+
return { inject: "##{@class_snake}_tab", body: Html.convert(make_index_page) }
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module Index
|
10
|
+
# 一覧表の生成
|
11
|
+
def make_index_page
|
12
|
+
list = list_for_index
|
13
|
+
target_keys = @index_keys
|
14
|
+
unless target_keys
|
15
|
+
target_keys = @column_set.keys.select { |k| !@column_set[k].no_view? }
|
16
|
+
end
|
17
|
+
# 項目名欄の生成
|
18
|
+
if @table_labels
|
19
|
+
thead = Ht.thead(Ht.tr(@table_labels.map { |label| Ht.th(label) }))
|
20
|
+
else
|
21
|
+
thead = Ht.thead(Ht.tr(target_keys.map { |key|
|
22
|
+
if @column_set[key].respond_to?(:label)
|
23
|
+
Ht.th(@column_set[key].label(force: true))
|
24
|
+
else
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
})).compact
|
28
|
+
end
|
29
|
+
|
30
|
+
tr_a = list.map do |data|
|
31
|
+
view_a = make_index_line(target_keys, data)
|
32
|
+
td_a = view_a.map { |view| Ht.td(view) }
|
33
|
+
Ht.tr(id: "tr-#{@class_snake}-#{data[:id]}", child: td_a, ezevent: "on=click:url=#{make_base_url(data[:id])}/detail")
|
34
|
+
end
|
35
|
+
tbody = Ht.tbody(tr_a)
|
36
|
+
return [
|
37
|
+
area_for_create,
|
38
|
+
Ht.table(id: "enable_datatable_#{@class_snake}", child: [thead, tbody], ezload: "command=enable_datatable:target=#enable_datatable_#{@class_snake}"),
|
39
|
+
Ht.div(id: edit_inject_element),
|
40
|
+
]
|
41
|
+
end
|
42
|
+
|
43
|
+
# 一覧表示の1行を生成
|
44
|
+
def make_index_line(target_keys, data)
|
45
|
+
@column_set.clear
|
46
|
+
@column_set.set_values(data, from_db: true)
|
47
|
+
return target_keys.map { |key| make_index_column(key) }
|
48
|
+
end
|
49
|
+
|
50
|
+
# 一覧表示の1カラムを生成
|
51
|
+
def make_index_column(key)
|
52
|
+
column = @column_set[key.to_sym]
|
53
|
+
return column.view(force: true)
|
54
|
+
end
|
55
|
+
|
56
|
+
# 一覧ページ用のデータリスト生成
|
57
|
+
def list_for_index
|
58
|
+
return @column_set.dataset.where(@parent_key.to_sym => get_parent_id, deleted_at: nil).order(@sort_key).all
|
59
|
+
end
|
60
|
+
|
61
|
+
# 一覧ページ用ボタン
|
62
|
+
def button_for_index_line(data)
|
63
|
+
Ht.button(class: %w[btn right], ezevent: "on=click:url=#{make_base_url(data[:id])}/edit", child: [Ht.icon("edit"), Message[:edit_button_label]])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
module Edit
|
68
|
+
# 新規データ登録
|
69
|
+
def public_create_post
|
70
|
+
@form = @event[:form]
|
71
|
+
# EzLog.debug("public_create_post: form=#{@form}")
|
72
|
+
unless @form
|
73
|
+
{ inject: "##{@class_snake}-create-area", body: Html.convert(make_edit_form(:create)) }
|
74
|
+
else
|
75
|
+
# 値の保存
|
76
|
+
@column_set.clear
|
77
|
+
form_values = @form
|
78
|
+
form_values.update(@env["url_params"])
|
79
|
+
# @column_set.values = form_values
|
80
|
+
@column_set[:id].value = @id = @column_set.create(form_values)
|
81
|
+
# return { redirect: "#{make_base_url}/#{@id}" }
|
82
|
+
return public_default_post
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# データ編集受信
|
87
|
+
def public_edit_post
|
88
|
+
@id ||= get_id
|
89
|
+
unless @event[:form]
|
90
|
+
data = @column_set.set_from_db(@id)
|
91
|
+
# データが空ならエラーページ
|
92
|
+
return { inject: "##{edit_inject_element}", body: "データがありません: #{@id}" } unless data
|
93
|
+
# フォームの表示
|
94
|
+
form = make_edit_form
|
95
|
+
found_a = Ht.search(form, tag: "input")
|
96
|
+
found_a.each { |h| h.add_class("#{@class_snake}-edit-box") if h[:size] }
|
97
|
+
return { inject: "##{edit_inject_element}", body: Html.convert(form) }
|
98
|
+
else
|
99
|
+
if @event[:cancel]
|
100
|
+
# キャンセルの場合
|
101
|
+
data = @column_set.set_from_db(@id)
|
102
|
+
return act_after_cancel
|
103
|
+
else
|
104
|
+
# 値を保存
|
105
|
+
@column_set.update(@id, @event[:form])
|
106
|
+
end
|
107
|
+
return act_after_edit
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
#--------------------------------------------------------------------------------------------------------
|
112
|
+
# 新規データ追加欄
|
113
|
+
def area_for_create(extra_buttons = nil)
|
114
|
+
create_button = make_create_button
|
115
|
+
create_button[:ezevent] = "on=click:url=#{make_base_url}/create"
|
116
|
+
return Ht.div(id: "#{@class_snake}-create-area", child: [create_button, extra_buttons].compact)
|
117
|
+
end
|
118
|
+
|
119
|
+
# 編集フォームの生成
|
120
|
+
def make_edit_form(command = :edit)
|
121
|
+
@id ||= get_id
|
122
|
+
if command == :edit && !@id
|
123
|
+
EzLog.error "make_edit_form: @id is not defined"
|
124
|
+
end
|
125
|
+
target_keys = @edit_keys || @column_set.keys
|
126
|
+
list = target_keys.map do |colkey|
|
127
|
+
column = @column_set[colkey.to_sym]
|
128
|
+
unless column
|
129
|
+
EzLog.error("undefined column entry: #{colkey}")
|
130
|
+
next
|
131
|
+
end
|
132
|
+
make_edit_line(column)
|
133
|
+
end.compact
|
134
|
+
event = "on=click:url=#{make_base_url(@id)}/#{command}:with=form"
|
135
|
+
send_button = Ht.button(id: "#{@class_snake}-#{command}-finish-button", class: %w[btn], child: [Ht.icon("check"), Message[:edit_finish_button_label]], ezevent: event)
|
136
|
+
cancel_button = make_cancel_button("on=click:url=#{make_base_url(@id)}/#{command}:cancel=true:with=form")
|
137
|
+
list.push(Ht.p(class: %w[edit-finish-buttons], child: [send_button, cancel_button]))
|
138
|
+
return make_form("#{make_base_url}/edit", list)
|
139
|
+
end
|
140
|
+
|
141
|
+
def make_edit_line(column)
|
142
|
+
form = column.form
|
143
|
+
if form
|
144
|
+
return Ht.p(class: %w[form-line], child: [Ht.small(column.label), form])
|
145
|
+
else
|
146
|
+
return nil
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def edit_inject_element
|
151
|
+
return "#{@class_snake}_show"
|
152
|
+
end
|
153
|
+
|
154
|
+
def act_after_edit
|
155
|
+
return [public_default_post, public_detail_post]
|
156
|
+
# return { inject: edit_inject_element, body: Html.convert(make_index_line(@column_set.get_hash(:value))) }
|
157
|
+
end
|
158
|
+
|
159
|
+
def act_after_cancel
|
160
|
+
return public_detail_post
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
module Detail
|
165
|
+
# データ詳細表示
|
166
|
+
def public_detail_post
|
167
|
+
@id = get_id
|
168
|
+
data = @column_set.set_from_db(@id)
|
169
|
+
target_keys = @show_keys || @column_set.keys.select { |key| !@column_set[key].attribute[:no_view] }
|
170
|
+
line_a = []
|
171
|
+
target_keys.each do |key|
|
172
|
+
column = @column_set[key]
|
173
|
+
v = make_detail_line(column)
|
174
|
+
line_a.push(v) if v
|
175
|
+
end
|
176
|
+
table = Ht.div(line_a)
|
177
|
+
collection = Materialize::Collection.new
|
178
|
+
# 詳細表示用のblockを追加
|
179
|
+
collection.push(Ht.div(class: "detail-box", child: [button_for_detail_box(data), table]))
|
180
|
+
return { inject: "##{edit_inject_element}", body: Html.convert(collection.to_h) }
|
181
|
+
end
|
182
|
+
|
183
|
+
# 詳細表示欄の一行を生成
|
184
|
+
def make_detail_line(column)
|
185
|
+
view = column.view
|
186
|
+
if view
|
187
|
+
view = Ht.pre(view) if view.index("\n")
|
188
|
+
return Ht.p([Ht.small(column.label), view])
|
189
|
+
end
|
190
|
+
return nil
|
191
|
+
end
|
192
|
+
|
193
|
+
# 詳細ページ用ボタン
|
194
|
+
def button_for_detail_box(data)
|
195
|
+
buttons = [Ht.button(class: %w[btn right], ezevent: "on=click:url=#{make_base_url(data[:id])}/edit", child: [Ht.icon("edit"), Message[:edit_button_label]])]
|
196
|
+
if @show_delete_button
|
197
|
+
buttons.push(make_delete_button)
|
198
|
+
end
|
199
|
+
return Ht.div(class: %w[button-box], child: buttons)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
module Delete
|
204
|
+
# 削除ボタン押下時の処理
|
205
|
+
def public_delete_post
|
206
|
+
@id = get_id
|
207
|
+
dataset = DB.dataset(@column_set.name)
|
208
|
+
DB.delete(dataset, @id)
|
209
|
+
return public_default_post
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
data/lib/ezframe/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ezframe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KAMACHI Masayuki
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -158,6 +158,7 @@ executables:
|
|
158
158
|
- console
|
159
159
|
- create_table
|
160
160
|
- dbmigrate
|
161
|
+
- html2ruby
|
161
162
|
extensions: []
|
162
163
|
extra_rdoc_files: []
|
163
164
|
files:
|
@@ -174,6 +175,7 @@ files:
|
|
174
175
|
- exe/console
|
175
176
|
- exe/create_table
|
176
177
|
- exe/dbmigrate
|
178
|
+
- exe/html2ruby
|
177
179
|
- ezframe.gemspec
|
178
180
|
- lib/ezframe.rb
|
179
181
|
- lib/ezframe/auth.rb
|
@@ -182,7 +184,6 @@ files:
|
|
182
184
|
- lib/ezframe/config.rb
|
183
185
|
- lib/ezframe/controller.rb
|
184
186
|
- lib/ezframe/database.rb
|
185
|
-
- lib/ezframe/editor.rb
|
186
187
|
- lib/ezframe/editor_common.rb
|
187
188
|
- lib/ezframe/email.rb
|
188
189
|
- lib/ezframe/ezlog.rb
|
@@ -192,13 +193,16 @@ files:
|
|
192
193
|
- lib/ezframe/jquery-ui.rb
|
193
194
|
- lib/ezframe/loader.rb
|
194
195
|
- lib/ezframe/main_editor.rb
|
196
|
+
- lib/ezframe/main_page_kit.rb
|
195
197
|
- lib/ezframe/materialize.rb
|
196
198
|
- lib/ezframe/message.rb
|
197
199
|
- lib/ezframe/page_base.rb
|
198
200
|
- lib/ezframe/route.rb
|
199
201
|
- lib/ezframe/server.rb
|
200
202
|
- lib/ezframe/single_page_editor.rb
|
203
|
+
- lib/ezframe/single_page_kit.rb
|
201
204
|
- lib/ezframe/sub_editor.rb
|
205
|
+
- lib/ezframe/sub_page_kit.rb
|
202
206
|
- lib/ezframe/template.rb
|
203
207
|
- lib/ezframe/util.rb
|
204
208
|
- lib/ezframe/version.rb
|
data/lib/ezframe/editor.rb
DELETED
@@ -1,176 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Ezframe
|
4
|
-
class DataEditor < PageBase
|
5
|
-
# 一覧ページ生成
|
6
|
-
def public_default_get
|
7
|
-
id = get_id
|
8
|
-
if id
|
9
|
-
return show_detail_page
|
10
|
-
else
|
11
|
-
data_a = @dataset.all
|
12
|
-
htb = make_index_table(data_a)
|
13
|
-
layout = index_layout(center: Ht.form(child: htb))
|
14
|
-
return show_base_template(title: Message[:index_page_title], body: Html.convert(layout))
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
# 一覧テーブルの生成
|
19
|
-
def make_index_table(data_a)
|
20
|
-
# @column_set.each { |col| col.attribute.delete(:hidden) }
|
21
|
-
idx_keys = @index_keys || @column_set.keys
|
22
|
-
puts "idx_keys=#{idx_keys.inspect}"
|
23
|
-
a_element = Proc.new { |key, id, text|
|
24
|
-
if key.to_s.index("_name")
|
25
|
-
Ht.a(href: "#{make_base_url(id)}", child: text)
|
26
|
-
else
|
27
|
-
text
|
28
|
-
end
|
29
|
-
}
|
30
|
-
tr_a = data_a.map do |data|
|
31
|
-
@column_set.clear
|
32
|
-
@column_set.set_value(data, from_db: true)
|
33
|
-
line = idx_keys.map do |key|
|
34
|
-
view = @column_set[key].view
|
35
|
-
Ht.td(Ht.a(href: "#{make_base_url(data[:id])}", child: view))
|
36
|
-
end
|
37
|
-
Ht.tr(line)
|
38
|
-
end
|
39
|
-
th_a = idx_keys.map {|key| Ht.th(@column_set[key.to_sym].label) }
|
40
|
-
thead = Ht.thead(Ht.tr(th_a))
|
41
|
-
tbody = Ht.tbody(tr_a)
|
42
|
-
table_id = "enable_datatable_#{@class_snake}"
|
43
|
-
return Ht.table(id: table_id, class: %w[enable_datatable], child: [ thead, tbody ], ezload: "command=enable_datatable:target=##{table_id}:size=10")
|
44
|
-
end
|
45
|
-
|
46
|
-
# 新規登録フォーム表示
|
47
|
-
def public_create_get
|
48
|
-
@column_set.clear
|
49
|
-
table = make_edit_form(:create)
|
50
|
-
layout = main_layout(center: Ht.form(child: table), type: 2)
|
51
|
-
show_base_template(title: Message[:parent_create_page_title], body: Html.convert(layout))
|
52
|
-
end
|
53
|
-
|
54
|
-
# 新規登録受信
|
55
|
-
def public_create_post
|
56
|
-
unless @event[:form]
|
57
|
-
{ inject: "#center-panel", body: Ht.form(child: make_edit_form(:create)) }
|
58
|
-
else
|
59
|
-
# 値の保存
|
60
|
-
@column_set.clear
|
61
|
-
@column_set.values = @event[:form]
|
62
|
-
@column_set[:id].value = id = @column_set.create
|
63
|
-
return { redirect: make_base_url(id) }
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# データ編集受信
|
68
|
-
def public_edit_post
|
69
|
-
id = get_id
|
70
|
-
unless @event[:form]
|
71
|
-
data = @column_set.set_from_db(id)
|
72
|
-
return show_message_page("no data", "data is not defined: #{id}") unless data
|
73
|
-
{ inject: "#center-panel", body: Html.convert(Ht.form(make_edit_form)) }
|
74
|
-
else
|
75
|
-
# 値を保存
|
76
|
-
@column_set.update(id, @event[:form])
|
77
|
-
{ redirect: make_base_url(id) }
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
# 編集フォームの生成
|
82
|
-
def make_edit_form(command = :edit)
|
83
|
-
@id = get_id
|
84
|
-
table = []
|
85
|
-
matrix = @column_set.map do |column|
|
86
|
-
form = column.form
|
87
|
-
table.push Ht.p([ Ht.small(column.label), form ]) if form
|
88
|
-
end
|
89
|
-
send_button = Ht.button(child: Message[:edit_finish_button_label], class: %w[btn], event: "on=click:url=#{make_base_url(@id)}/#{command}:with=form")
|
90
|
-
table.push(send_button)
|
91
|
-
return Ht.table(Ht.tr(table))
|
92
|
-
end
|
93
|
-
|
94
|
-
#--------------------------------------------------------------------------------------------------------
|
95
|
-
# 検索
|
96
|
-
def public_search_post
|
97
|
-
EzLog.info "public_search_post: #{@parsed_body.inspect}"
|
98
|
-
sch_keys = @search_keys || @column_set.keys
|
99
|
-
word = @params["word"]
|
100
|
-
pattern = "%#{word}%"
|
101
|
-
pattern_a = sch_keys.map {|key| Sequel.like(key, pattern) }
|
102
|
-
data_a = @dataset.where(Sequel.|(*pattern_a)).all
|
103
|
-
puts data_a.inspect
|
104
|
-
layout = index_layout(center: make_index_table(data_a))
|
105
|
-
show_base_template(title: Message[:search_result_page_title], body: Html.convert(layout))
|
106
|
-
end
|
107
|
-
|
108
|
-
# 詳細表示
|
109
|
-
def show_detail_page
|
110
|
-
EzLog.info "show_detail_page: #{@request.params.inspect}"
|
111
|
-
id = get_id(@class_snake)
|
112
|
-
unless @column_set.set_from_db(id)
|
113
|
-
return show_message_page("no data", "data is not defined: #{id}")
|
114
|
-
end
|
115
|
-
layout = main_layout(center: make_detail_table)
|
116
|
-
return show_base_template(title: Message[:detail_page_title], body: Html.convert(layout))
|
117
|
-
end
|
118
|
-
|
119
|
-
private
|
120
|
-
|
121
|
-
# 詳細ページの表の生成
|
122
|
-
def make_detail_table
|
123
|
-
@id = get_id
|
124
|
-
table = []
|
125
|
-
array = @column_set.map do |column|
|
126
|
-
edit_btn = nil
|
127
|
-
if @column_edit_mode
|
128
|
-
edit_btn = edit_button(column)
|
129
|
-
edit_btn[:event] = "on=click:branch=edit_column:key=#{column.key}" if edit_btn
|
130
|
-
end
|
131
|
-
table.push(Ht.p(class: %w[hover-button-box], child: [ Ht.small(column.label), column.view, edit_btn ].compact))
|
132
|
-
end
|
133
|
-
unless @column_edit_mode
|
134
|
-
edit_btn = Ht.button(class: %w[btn], child: [ Ht.icon("edit"), Message[:edit_button_label] ], event: "on=click:url=#{make_base_url(@id)}/edit")
|
135
|
-
table.push(edit_btn)
|
136
|
-
end
|
137
|
-
return Ht.table(Ht.tr(table))
|
138
|
-
end
|
139
|
-
|
140
|
-
def edit_cancel_button
|
141
|
-
Ht.span(class: %w[btn red small waves-effect waves-light switch-button], child: Ht.icon("cancel"))
|
142
|
-
end
|
143
|
-
|
144
|
-
# URLからのIDの取得
|
145
|
-
def get_id(class_name = nil)
|
146
|
-
class_name ||= @class_snake
|
147
|
-
params = @request.env['url_params']
|
148
|
-
return nil unless params
|
149
|
-
# EzLog.info "get_id: #{params.inspect}, #{class_name}"
|
150
|
-
return params[class_name.to_sym]
|
151
|
-
end
|
152
|
-
|
153
|
-
# 値の更新
|
154
|
-
def update_value
|
155
|
-
form = @event[:form]
|
156
|
-
@column_set.update(get_id, form)
|
157
|
-
end
|
158
|
-
|
159
|
-
# ラベル付きで1カラムのviewを表示
|
160
|
-
def show_label_view(key)
|
161
|
-
col = @column_set[key]
|
162
|
-
Ht.span([Ht.small(col.label), col.view(force: true)])
|
163
|
-
end
|
164
|
-
|
165
|
-
# ラベル付きで1カラムのformを表示
|
166
|
-
def show_label_edit(key)
|
167
|
-
col = @column_set[key]
|
168
|
-
Ht.span([Ht.small(col.label), col.form(force: true)])
|
169
|
-
end
|
170
|
-
|
171
|
-
# エラーページの表示
|
172
|
-
def show_message_page(title, body)
|
173
|
-
return show_base_template(title: title, body: Html.convert(body))
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|