ezframe 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Ezframe
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
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.3.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-05-21 00:00:00.000000000 Z
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
@@ -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