ezframe 0.3.0 → 0.4.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 +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
|