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.
@@ -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