ezframe 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 66c032e7ea5bbeaaccb2afb326e586b64566e2a55fcc4402abfd5629caf80418
4
- data.tar.gz: 790b2060a76feccd9970dcd3c6cf452dbfb3b42834e3dbfbee7196f173b2b8f1
3
+ metadata.gz: 82287b72480dbecef6d697d80d7fbc286233622997f49ab94ef45162f0a2c5f6
4
+ data.tar.gz: 0f5d7c0caaccaba148d5c1c8ab8d8b725fe65cf36723773eb88beb0b6edc6295
5
5
  SHA512:
6
- metadata.gz: b402c070b7bd0664709f8d12ea14e88ea29fba58e649d49b86394d1cff120ffae755eb2c255055709a31d41ec542f58535d171fa1e2a00e4c583918141e8d9b7
7
- data.tar.gz: 6a5f44ba9417b892c77ad61ccb0316dbdf6d945aff93cfed1c2161ec173e44a7e2f6396b19a74e872b147d42ecd4a3d7adc167b57fc30974f18949b627858114
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.git
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
- 例: vi columns/address.yml
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
-  label: E-mail
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
- $ bin/create_tables
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を開きます。
@@ -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
@@ -27,7 +27,7 @@ module Ezframe
27
27
  return
28
28
  end
29
29
  column_info = yaml.recursively_symbolize_keys
30
- # puts "load_one_file: filename=#{filename} column_info=#{column_info.inspect}"
30
+ puts "load_one_file: filename=#{filename} column_info=#{column_info.inspect}"
31
31
  add(table_name, column_info)
32
32
  end
33
33
 
@@ -4,8 +4,10 @@ module Ezframe
4
4
  attr_accessor :value_h
5
5
 
6
6
  def load_files(dir)
7
- Dir["#{dir}/*.yml"].each do |file|
8
- load_one_file(file)
7
+ unless @value_h
8
+ Dir["#{dir}/*.yml"].each do |file|
9
+ load_one_file(file)
10
+ end
9
11
  end
10
12
  end
11
13
 
@@ -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)
@@ -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
- @sequel.create_table(table_name) do
33
- # if @dbfile.index("postgresql")
31
+ # puts "create_table: #{table_name}"
32
+ if @dbfile.index("postgres")
33
+ @sequel.create_table(table_name) do
34
34
  serial :id
35
- # else
36
- #primary_key :id, auto_increment: true
37
- #end
38
- dbtype_h.each do |key, dbtype|
39
- column(key, dbtype)
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
@@ -1,3 +1,3 @@
1
1
  module Ezframe
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/ezframe.rb CHANGED
@@ -22,6 +22,7 @@ require_relative 'ezframe/page_base'
22
22
  require_relative 'ezframe/template'
23
23
  require_relative 'ezframe/server'
24
24
  require_relative 'ezframe/auth.rb'
25
+ require_relative 'ezframe/editor.rb'
25
26
  require_relative 'ezframe/loader'
26
27
 
27
28
 
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.3
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-23 00:00:00.000000000 Z
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
data/Gemfile DELETED
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
-
5
- gemspec