ezframe 0.0.3 → 0.0.4
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/README.md +21 -14
- data/app_template/config.ru +0 -5
- data/exe/setup.rb +0 -0
- data/lib/ezframe/column_set.rb +1 -1
- data/lib/ezframe/config.rb +4 -2
- data/lib/ezframe/controller.rb +1 -2
- data/lib/ezframe/database.rb +17 -10
- data/lib/ezframe/editor.rb +188 -0
- data/lib/ezframe/version.rb +1 -1
- data/lib/ezframe.rb +1 -0
- metadata +3 -3
- data/Gemfile +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82287b72480dbecef6d697d80d7fbc286233622997f49ab94ef45162f0a2c5f6
|
4
|
+
data.tar.gz: 0f5d7c0caaccaba148d5c1c8ab8d8b725fe65cf36723773eb88beb0b6edc6295
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43fc823b68520ca5814624c1afceaf76a54ce77d423490a99ef2e2661dc6087da295f7c59920d3c21210942c62c73e98c20eb0c0111c562f647e4a30cb2cee07
|
7
|
+
data.tar.gz: a70a72705c927fc3338c0afd75aa80dc1c438a736f6559cda3130d5401f56febb2422af7c32863f888f8ff41bc4741b66d1a74d2e15c83da5d3902a09d6ec300
|
data/README.md
CHANGED
@@ -1,44 +1,51 @@
|
|
1
1
|
# ezframe
|
2
2
|
|
3
3
|
ezframeは主にRubyで記述されたウェブフレームワークです。
|
4
|
-
以下を目指して開発を進めています。
|
4
|
+
以下を目指して開発を進めています。
|
5
5
|
|
6
6
|
* Ruby言語でのプログラミングだけでリッチなGUIを持つウエブアプリを作れる。
|
7
|
-
*
|
8
|
-
*
|
9
|
-
*
|
7
|
+
* 最小の学習コストで、最大限の自由で柔軟な開発スキルを得られる。
|
8
|
+
* コードの再利用性を高める。
|
9
|
+
* 他ライブラリーへの依存は極力少なくし、見通しの良くする。
|
10
10
|
|
11
11
|
## 基本的な使い方
|
12
12
|
|
13
13
|
1. レポジトリーの取得
|
14
14
|
```sh
|
15
|
-
git clone git@github.com:sakura-forest/ezframe
|
16
|
-
cd ezframe
|
15
|
+
git clone git@github.com:sakura-forest/ezframe-template
|
16
|
+
cd ezframe-template
|
17
17
|
bundle install --path vendor/bundle
|
18
|
-
bundle exec rackup
|
19
18
|
```
|
20
19
|
|
21
|
-
2. columns/に、データ項目を記したyaml
|
22
|
-
|
20
|
+
2. columns/に、データ項目を記したyamlファイルを生成します。
|
21
|
+
ここではcolumns/address.ymlという名前のファイルを作ります。
|
23
22
|
|
24
23
|
```yaml
|
25
24
|
- key: name
|
26
25
|
label: 氏名
|
27
26
|
type: jpname
|
28
27
|
- key: email
|
29
|
-
|
28
|
+
label: E-mail
|
30
29
|
type: email
|
31
30
|
```
|
32
31
|
|
32
|
+
3. データを編集する機能を実装します。
|
33
|
+
|
34
|
+
|
33
35
|
3. データベースの生成
|
36
|
+
データベースにaddressテーブルを作ります。
|
37
|
+
デフォルトではdb/dev.sqliteを生成します。
|
38
|
+
|
34
39
|
```sh
|
35
|
-
$
|
40
|
+
$ bundle exec create_tables.rb
|
36
41
|
```
|
37
42
|
|
38
|
-
4. 使う機能の選択
|
39
|
-
* Todo..
|
40
|
-
|
41
43
|
5. アプリケーションサーバーの起動
|
44
|
+
|
45
|
+
サーバーが起動します。デフォルトでは9292番ポートが使われます。
|
46
|
+
|
42
47
|
```sh
|
43
48
|
bundle exec rackup
|
44
49
|
```
|
50
|
+
|
51
|
+
6. ブラウザでhttp://localhost:9292を開きます。
|
data/app_template/config.ru
CHANGED
@@ -2,14 +2,9 @@
|
|
2
2
|
|
3
3
|
require "logger"
|
4
4
|
require "rack"
|
5
|
-
require "rack-flash"
|
6
|
-
require 'rack/session/redis'
|
7
|
-
|
8
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "lib"))
|
9
5
|
require "ezframe"
|
10
6
|
|
11
7
|
use Rack::Session::Pool
|
12
8
|
use Rack::Static, urls: ["/image", "/js", "/css"], root: "asset"
|
13
9
|
use Rack::ShowExceptions
|
14
|
-
use Rack::Flash, :accessorize => [:notice, :error]
|
15
10
|
run Ezframe::Server
|
data/exe/setup.rb
CHANGED
File without changes
|
data/lib/ezframe/column_set.rb
CHANGED
@@ -27,7 +27,7 @@ module Ezframe
|
|
27
27
|
return
|
28
28
|
end
|
29
29
|
column_info = yaml.recursively_symbolize_keys
|
30
|
-
|
30
|
+
puts "load_one_file: filename=#{filename} column_info=#{column_info.inspect}"
|
31
31
|
add(table_name, column_info)
|
32
32
|
end
|
33
33
|
|
data/lib/ezframe/config.rb
CHANGED
data/lib/ezframe/controller.rb
CHANGED
@@ -8,9 +8,8 @@ module Ezframe
|
|
8
8
|
Config.load_files("./config")
|
9
9
|
Model.init
|
10
10
|
model = Model.get_clone
|
11
|
-
Auth.init_warden
|
11
|
+
Auth.init_warden if defined?(Warden)
|
12
12
|
@request.env["model"] = model
|
13
|
-
# Auth.model = model
|
14
13
|
|
15
14
|
mylog("exec: path=#{request.path_info} params=#{request.params}")
|
16
15
|
klass, method = PageBase::decide_route(request.path_info)
|
data/lib/ezframe/database.rb
CHANGED
@@ -28,18 +28,25 @@ module Ezframe
|
|
28
28
|
%w[id created_at updated_at].each do |key|
|
29
29
|
dbtype_h.delete(key.to_sym)
|
30
30
|
end
|
31
|
-
puts "create_table: #{table_name}"
|
32
|
-
@
|
33
|
-
|
31
|
+
# puts "create_table: #{table_name}"
|
32
|
+
if @dbfile.index("postgres")
|
33
|
+
@sequel.create_table(table_name) do
|
34
34
|
serial :id
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
column(
|
35
|
+
dbtype_h.each do |key, dbtype|
|
36
|
+
column(key, dbtype)
|
37
|
+
end
|
38
|
+
column(:created_at, :timestamp, default: Sequel::CURRENT_TIMESTAMP)
|
39
|
+
column(:updated_at, :timestamp, default: Sequel::CURRENT_TIMESTAMP)
|
40
|
+
end
|
41
|
+
else
|
42
|
+
@sequel.create_table(table_name) do
|
43
|
+
primary_key :id, auto_increment: true
|
44
|
+
dbtype_h.each do |key, dbtype|
|
45
|
+
column(key, dbtype)
|
46
|
+
end
|
47
|
+
column(:created_at, :timestamp, default: Sequel::CURRENT_TIMESTAMP)
|
48
|
+
column(:updated_at, :timestamp, default: Sequel::CURRENT_TIMESTAMP)
|
40
49
|
end
|
41
|
-
column(:created_at, :timestamp, default: Sequel::CURRENT_TIMESTAMP)
|
42
|
-
column(:updated_at, :timestamp, default: Sequel::CURRENT_TIMESTAMP)
|
43
50
|
end
|
44
51
|
end
|
45
52
|
|
@@ -0,0 +1,188 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Ezframe
|
4
|
+
class DataEditor < PageBase
|
5
|
+
|
6
|
+
def initialize(request=nil, model=nil)
|
7
|
+
super(request, model)
|
8
|
+
decide_target
|
9
|
+
if model
|
10
|
+
@column_set = @model.column_sets[@target]
|
11
|
+
unless @column_set
|
12
|
+
raise "[ERROR] no such column set: #{@target}"
|
13
|
+
end
|
14
|
+
@dataset = @column_set.dataset
|
15
|
+
end
|
16
|
+
if @json
|
17
|
+
@event = @json[:event] || {}
|
18
|
+
@target_id = @event[@target]
|
19
|
+
end
|
20
|
+
@auth = false
|
21
|
+
init_vars
|
22
|
+
end
|
23
|
+
|
24
|
+
def init_vars
|
25
|
+
end
|
26
|
+
|
27
|
+
def decide_target
|
28
|
+
@target = self.class.to_s
|
29
|
+
if @target.index("::")
|
30
|
+
@target = $1 if /::(\w+)$/ =~ @target
|
31
|
+
end
|
32
|
+
@target.downcase!
|
33
|
+
@target = @target.to_sym
|
34
|
+
return @target
|
35
|
+
end
|
36
|
+
|
37
|
+
def public_login_page
|
38
|
+
flash_area = ""
|
39
|
+
mylog "public_login_page: #{@request}"
|
40
|
+
if @request
|
41
|
+
mylog "flash=#{@request.env['x-rack.flash']}"
|
42
|
+
flash_area = Ht.div(class: %w[teal], child: @request['env']['x-rack.flash'].error)
|
43
|
+
end
|
44
|
+
form = Ht.multi_div([ %w[container], %w[row]],
|
45
|
+
Ht.form(class: "col s6 offset-s3", action: "/#{@target}/login", method: "post", child: [
|
46
|
+
Materialize.input(type: "text", name: "account", label: "User ID"),
|
47
|
+
Materialize.input(type: "password", name: "password", label: "Password"),
|
48
|
+
Ht.button(type: "submit", class: %w[btn], child: "login")
|
49
|
+
]))
|
50
|
+
common_page(title: "Login", body: Html.convert(Materialize.convert([flash_area, form])))
|
51
|
+
end
|
52
|
+
|
53
|
+
def public_login_post
|
54
|
+
mylog "public_login_post: #{@params.inspect}, #{@json}"
|
55
|
+
warden.authenticate
|
56
|
+
public_index_page
|
57
|
+
end
|
58
|
+
|
59
|
+
#--------------------------------------------------------------------------------------------------------
|
60
|
+
# add new parts
|
61
|
+
def public_new_page
|
62
|
+
matrix = @column_set.map do |column|
|
63
|
+
[column.label, column.form]
|
64
|
+
end
|
65
|
+
matrix.push([Ht.button(child: "送信", class: %w[btn], event: "on=click:branch=add_new:url=/#{@target}/new:with=form")])
|
66
|
+
tb = Ht::Table.new(matrix)
|
67
|
+
layout = main_layout(left: sidenav, center: Ht.form(child: tb.to_h))
|
68
|
+
common_page(title: "新規登録", body: Html.convert(Materialize.convert(layout)))
|
69
|
+
end
|
70
|
+
|
71
|
+
def public_new_post
|
72
|
+
@column_set.values = @event[:form]
|
73
|
+
@column_set[:id].value = @target_id = @column_set.save
|
74
|
+
{ redirect: "/#{@target}/detail?id=#{@target_id}" }
|
75
|
+
end
|
76
|
+
|
77
|
+
#--------------------------------------------------------------------------------------------------------
|
78
|
+
# index parts
|
79
|
+
def public_index_page
|
80
|
+
data_a = @dataset.all
|
81
|
+
htb = make_index_table(data_a)
|
82
|
+
layout = index_layout(left: sidenav, center: Ht.form(child: htb))
|
83
|
+
common_page(title: "データ一覧", body: Html.convert(Materialize.convert(layout)))
|
84
|
+
end
|
85
|
+
|
86
|
+
def make_index_table(data_a)
|
87
|
+
column_header = [:id, :name, :email, :zipcode, :prefecture]
|
88
|
+
@column_set.each { |col| col.attribute.delete(:hidden) }
|
89
|
+
a_element = Proc.new { |key, id, text|
|
90
|
+
# mylog "proc executed"
|
91
|
+
if key == :name
|
92
|
+
Ht.a(href: "/#{@target}/detail?id=#{id}", child: text)
|
93
|
+
else
|
94
|
+
text
|
95
|
+
end
|
96
|
+
}
|
97
|
+
table = PageKit::IndexTable.new(column_header: column_header, column_set: @column_set, add_checkbox: :id,
|
98
|
+
decorate_column: a_element)
|
99
|
+
table.make_table(data_a)
|
100
|
+
end
|
101
|
+
|
102
|
+
alias_method :public_default_page, :public_index_page
|
103
|
+
|
104
|
+
#--------------------------------------------------------------------------------------------------------
|
105
|
+
# search parts
|
106
|
+
def public_search_post
|
107
|
+
mylog "public_search_post: #{@json.inspect}"
|
108
|
+
word = @event[:form][:word]
|
109
|
+
pattern = "%#{word}%"
|
110
|
+
data_a = @dataset.where(Sequel.|(Sequel.like(:name_kana, pattern), Sequel.like(:name, pattern))).all
|
111
|
+
make_index_table(data_a)
|
112
|
+
end
|
113
|
+
|
114
|
+
#--------------------------------------------------------------------------------------------------------
|
115
|
+
# detail parts
|
116
|
+
def public_detail_page
|
117
|
+
mylog "pubilc_detail_page: #{@request.params.inspect}"
|
118
|
+
@target_id ||= @request.params["id"]
|
119
|
+
data = @column_set.set_from_db(@target_id)
|
120
|
+
return common_page(title: "no data", body: "no customer data: #{@target_id}") unless data
|
121
|
+
common_page(title: "データ一覧", body: Html.convert(make_detail_page))
|
122
|
+
end
|
123
|
+
|
124
|
+
def make_detail_page
|
125
|
+
layout = main_layout( left: sidenav, center: detail_table )
|
126
|
+
@request.env['rack.session'][@target] = @target_id
|
127
|
+
layout[:event] = "on=load:branch=set_global@target=#{@target_id}"
|
128
|
+
Materialize.convert(layout)
|
129
|
+
end
|
130
|
+
|
131
|
+
def public_detail_post
|
132
|
+
mylog "public_detail_post: #{@request.params.inspect}: #{@json}"
|
133
|
+
if @json[:global]
|
134
|
+
@target_id ||= @json[:global][@target]
|
135
|
+
end
|
136
|
+
@column_set.set_from_db(@target_id)
|
137
|
+
case @event[:branch]
|
138
|
+
when "update_value"
|
139
|
+
update_value
|
140
|
+
end
|
141
|
+
{ inject: "#center-panel", is_html: true, body: Html.convert(Materialize.convert(detail_table)) }
|
142
|
+
end
|
143
|
+
|
144
|
+
private
|
145
|
+
|
146
|
+
def update_value
|
147
|
+
form = @event[:form]
|
148
|
+
@column_set.update(@target_id, form)
|
149
|
+
end
|
150
|
+
|
151
|
+
def detail_table
|
152
|
+
row_a = @column_set.map do |column|
|
153
|
+
# column.attribute.delete(:hidden) # Todo: remove this
|
154
|
+
Ht.tr(class: %w[hover-button-box], child: [
|
155
|
+
Ht.td(child: column.label),
|
156
|
+
Ht.td(child: Ht.div(class: %w[switch-box], child: [ detail_value_part(column), detail_form_part(column)].compact))
|
157
|
+
])
|
158
|
+
end
|
159
|
+
return Ht.table(child: row_a)
|
160
|
+
end
|
161
|
+
|
162
|
+
def detail_value_part(column)
|
163
|
+
return Ht.span(class: %w[switch-element], child: [ Ht.span(child: column.view) , edit_button(column)])
|
164
|
+
end
|
165
|
+
|
166
|
+
def detail_form_part(column)
|
167
|
+
return nil if column.attribute[:no_edit]
|
168
|
+
form = column.form
|
169
|
+
if (form)
|
170
|
+
form = Ht.form(class: %w[switch-element hide], child: [ Ht.span(child: column.form) , edit_ok_button(column), edit_cancel_button ])
|
171
|
+
end
|
172
|
+
return form
|
173
|
+
end
|
174
|
+
|
175
|
+
def edit_button(column)
|
176
|
+
return nil if column.attribute[:no_edit]
|
177
|
+
return Ht.button(class: %w[btn-floating switch-button hover-button hide right], child: Ht.icon("edit"))
|
178
|
+
end
|
179
|
+
|
180
|
+
def edit_ok_button(column)
|
181
|
+
return Ht.span(class: %w[btn small teal waves-effect waves-light], event: "on=click:branch=update_value:url=/#{@target}/detail:key=#{column.key}:with=form", child: Ht.icon("check"))
|
182
|
+
end
|
183
|
+
|
184
|
+
def edit_cancel_button
|
185
|
+
Ht.span(class: %w[btn red small waves-effect waves-light switch-button], child: Ht.icon("clear"))
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
data/lib/ezframe/version.rb
CHANGED
data/lib/ezframe.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.0.
|
4
|
+
version: 0.0.4
|
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-01-
|
11
|
+
date: 2020-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -134,7 +134,6 @@ extra_rdoc_files: []
|
|
134
134
|
files:
|
135
135
|
- ".gitignore"
|
136
136
|
- ".rubocop.yml"
|
137
|
-
- Gemfile
|
138
137
|
- README.md
|
139
138
|
- Rakefile
|
140
139
|
- app_template/asset/image/favicon.ico
|
@@ -154,6 +153,7 @@ files:
|
|
154
153
|
- lib/ezframe/config.rb
|
155
154
|
- lib/ezframe/controller.rb
|
156
155
|
- lib/ezframe/database.rb
|
156
|
+
- lib/ezframe/editor.rb
|
157
157
|
- lib/ezframe/ht.rb
|
158
158
|
- lib/ezframe/html.rb
|
159
159
|
- lib/ezframe/japanese_utils.rb
|