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