infold 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +45 -36
- data/lib/generators/infold/controller_generator.rb +4 -8
- data/lib/generators/infold/decorator_generator.rb +2 -1
- data/lib/generators/infold/model_generator.rb +6 -4
- data/lib/generators/infold/search_form_generator.rb +2 -1
- data/lib/generators/infold/templates/install/config/locales/infold.en.yml +1 -1
- data/lib/generators/infold/templates/install/config/routes/admin.rb +1 -0
- data/lib/generators/infold/templates/resource.yml.tt +91 -26
- data/lib/generators/infold/templates/views/_form.haml.tt +3 -3
- data/lib/generators/infold/templates/views/_show_content.haml.tt +2 -2
- data/lib/generators/infold/views/form_generator.rb +3 -2
- data/lib/generators/infold/views/index_generator.rb +2 -1
- data/lib/generators/infold/views/show_generator.rb +2 -1
- data/lib/infold/db_schema.rb +2 -1
- data/lib/infold/field_group.rb +18 -8
- data/lib/infold/property/association.rb +4 -0
- data/lib/infold/property/form_element.rb +7 -1
- data/lib/infold/version.rb +1 -1
- data/lib/infold/yaml_reader.rb +4 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a965cd1508d39abde6e77ad66a19dec7a088159b3562d795576dc70a3a36332a
|
4
|
+
data.tar.gz: 40163f510b91241b30fe97c56dfe9114e679f5de014c2f451b3a00de0e42650b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c24112c452a48c2fcb3ca34b6cf8ea6a49edf18ecfe61ffd8ca35a972f484449af54cac939c2adfb1cfdd27cb635cbd5f59a4bced5e6a4248a0b647e5c5c4a7
|
7
|
+
data.tar.gz: 6bce2862588f717f633d09f1af464d9668f2a10a7de36f8c72610ab0141e76ec90d57e35b877b4b4ebe9c2789ad389d4efe1340fd523fe19f1e1fc311bb50140
|
data/README.md
CHANGED
@@ -1,18 +1,22 @@
|
|
1
1
|
# Infold
|
2
2
|
Infold provides Scaffolding functionality specifically for Internal tools.
|
3
|
-
CRUD (Create,Read,Update,Delete) applications with an easy-to-use UI can be built instantly.
|
3
|
+
CRUD (Create, Read, Update, Delete) applications with an easy-to-use UI can be built instantly.
|
4
4
|
The generated code is highly readable and customizable, allowing for easy additional customization.
|
5
5
|
Supports Rails >= 7.0 and Hotwire.
|
6
6
|
|
7
|
-
##
|
7
|
+
## Goals
|
8
8
|
- Quickly and easily build Internal tools with all the functionality you need
|
9
9
|
- No need for a designer, just a developer to create a usable UI/UX
|
10
10
|
- Easy customization with YAML and Scaffold instead of DSL development
|
11
11
|
|
12
|
+
## Getting started
|
13
|
+
- Try the [live demo](https://demo.infold.dev/admin).
|
14
|
+
- Check the [website](https://infold.dev).
|
15
|
+
|
12
16
|
## Installation
|
13
17
|
Add this line to your application's Gemfile:
|
14
18
|
```ruby
|
15
|
-
gem '
|
19
|
+
gem 'infold', require: false
|
16
20
|
```
|
17
21
|
|
18
22
|
In addition, infold uses the following Gem, add these lines to your Gemfile too.
|
@@ -55,33 +59,35 @@ The following is an example of a Product model.
|
|
55
59
|
$ rails generate infold Product
|
56
60
|
```
|
57
61
|
|
58
|
-
|
62
|
+
The above commands will generate several files, including Controller and View.
|
59
63
|
You can check it by starting rails from `bin/dev` and accessing `http://localhost:3000/admin`.
|
60
64
|
|
61
65
|
![basic](./readme/basic.png)
|
62
66
|
|
63
|
-
By executing the above command, each directory such as controllers, models, and views automatically generates code to run the internal tools.
|
64
|
-
This is
|
67
|
+
By executing the above command, each directory, such as controllers, models, and views, automatically generates code to run the internal tools.
|
68
|
+
This mechanism is similar to Rails' Scaffold, and it is possible to implement additional necessary functions based on this.
|
65
69
|
|
66
|
-
However, **this is not the only functionality that can
|
70
|
+
However, **this is not the only functionality that can generate from Infold**.
|
67
71
|
Let's customize YAML and automatically generate the necessary functions by referring to the following contents.
|
68
72
|
|
69
73
|
## More Customization
|
70
|
-
|
74
|
+
Infold can be customized more by configuring YAML. YAML is generated in the `config/infold` directory.
|
71
75
|
After setting up YAML, the code is regenerated by executing the following command.
|
72
76
|
```shell
|
73
|
-
$ rails generate infold:scaffold Product
|
77
|
+
$ rails generate infold:scaffold ResourceName (eg: Product)
|
74
78
|
```
|
75
79
|
|
80
|
+
### YAML for demo apps
|
81
|
+
The YAML file for the [demo apps](https://demo.infold.dev/admin) can be referenced [here](https://github.com/yamataka22/infold/tree/main/test/dummy/config/infold). Please refer to it.
|
82
|
+
|
76
83
|
### Validation
|
77
84
|
In `model`.`validate`, you can define validation for each field.
|
78
85
|
#### Example
|
79
|
-
The following example shows the `title` and `price` fields with required validation and the `price` field with numeric
|
86
|
+
The following example shows the `title` and `price` fields with required validation and the `price` field with numeric and greater than or equal to 0 validation.
|
80
87
|
```yaml
|
81
88
|
model:
|
82
89
|
validate:
|
83
|
-
title:
|
84
|
-
- presence
|
90
|
+
title: presence
|
85
91
|
price:
|
86
92
|
- presence
|
87
93
|
- numericality:
|
@@ -109,7 +115,8 @@ Then the screen displays the Name of the Enum.
|
|
109
115
|
![enum](./readme/enum.png)
|
110
116
|
|
111
117
|
#### Colored Enum
|
112
|
-
Enum also allows you to specify a color for each element.
|
118
|
+
Enum also allows you to specify a color for each element.
|
119
|
+
The available colors are `blue`, `azure`, `indigo`, `purple`, `pink`, `red`, `orange`, `yellow`, `lime`, `green`, `teal` and `cyan`.
|
113
120
|
#### Example
|
114
121
|
```yaml
|
115
122
|
model:
|
@@ -133,7 +140,7 @@ It will then be displayed with a colored badge for easy identification.
|
|
133
140
|
### Decorator
|
134
141
|
In `model`.`decorator`, you can define simple decorations such as comma-separated numbers and units.
|
135
142
|
#### Example
|
136
|
-
In the following example, the `price` field
|
143
|
+
In the following example, the `price` field indicates a comma-separated number and "$" as the unit of measure in the front, and the `weight` field indicates "Kg" in the back.
|
137
144
|
```yaml
|
138
145
|
model:
|
139
146
|
decorator:
|
@@ -144,16 +151,16 @@ model:
|
|
144
151
|
append: Kg
|
145
152
|
```
|
146
153
|
|
147
|
-
Price
|
154
|
+
Price indicated as comma-separated and with units.
|
148
155
|
|
149
156
|
![decorator](./readme/decorator.png)
|
150
157
|
|
151
158
|
### ActiveStorage
|
152
|
-
Infold supports ActiveStorage. If you want to store files such as images or PDFs, define them in `model`. `active_storage`.
|
159
|
+
Infold supports ActiveStorage. If you want to store files such as images or PDFs, define them in the `model`. `active_storage`.
|
153
160
|
|
154
|
-
**As a prerequisite, ActiveStorage must
|
161
|
+
**As a prerequisite, ActiveStorage must installed in the project.**
|
155
162
|
#### Example
|
156
|
-
In the following example, define the use of ActiveStorage with the name `photo` and
|
163
|
+
In the following example, define the use of ActiveStorage with the name `photo` and select "image" as kind (for PDF, etc., select "file" as kind).
|
157
164
|
```yaml
|
158
165
|
model:
|
159
166
|
active_storage:
|
@@ -166,7 +173,7 @@ Then images stored in ActiveStorage can be displayed.
|
|
166
173
|
![active_storage_image](./readme/active_storage_image.png)
|
167
174
|
|
168
175
|
### Association
|
169
|
-
Infold supports association with other models such as `has_many` and `belongs_to`. By defining `model`.`association`, it is possible to bulk register and reference related models.
|
176
|
+
Infold supports an association with other models such as `has_many` and `belongs_to`. By defining `model`.`association`, it is possible to bulk register and reference, related models.
|
170
177
|
### belongs_to
|
171
178
|
For example, the relation `purchase` belongs_to `customer` is defined as follows:
|
172
179
|
```yaml
|
@@ -176,7 +183,7 @@ model:
|
|
176
183
|
kind: belongs_to
|
177
184
|
```
|
178
185
|
#### Naming field
|
179
|
-
In the case of `belongs_to`,
|
186
|
+
In the case of `belongs_to`, the field representing the record name of the referenced parent model, if any, is defined in `name_filed`.
|
180
187
|
The `customer.name` associated with the `customer_id` is displayed. The `customer` is also displayed as a link, which can be clicked to view the details of the `customer`.
|
181
188
|
```yaml
|
182
189
|
model:
|
@@ -204,11 +211,11 @@ The `app.show.fields` settings described below will enable batch registration an
|
|
204
211
|
![has_many_show](./readme/has_many_show.png)
|
205
212
|
|
206
213
|
#### Advanced configuration of the referenced model in `has_many`.
|
207
|
-
For example, in a `has_many` association such as `order` and `order details`, you may want to register multiple `order details` at once when registering `order`.
|
208
|
-
In this case, by defining `model` in the association model, Validation, Enum, etc
|
214
|
+
For example, in a `has_many` association, such as `order` and `order details`, you may want to register multiple `order details` at once when registering `order`.
|
215
|
+
In this case, by defining the `model` in the association model, Validation, Enum, etc., can be defined in the same way as above.
|
209
216
|
#### Example
|
210
217
|
In the example below, there is a `has_many order_details` association.
|
211
|
-
For this `order_details`, define a required validation for the `product_id` field, and a decorator for the `amount` field. It also defines an `association`.`belongs_to` for the `product`
|
218
|
+
For this `order_details`, define a required validation for the `product_id` field, and a decorator for the `amount` field. It also defines an `association`.`belongs_to` for the `product` with which the `order_detail` is associated with.
|
212
219
|
```yaml
|
213
220
|
model:
|
214
221
|
association:
|
@@ -216,8 +223,7 @@ model:
|
|
216
223
|
kind: has_many
|
217
224
|
model:
|
218
225
|
validate:
|
219
|
-
|
220
|
-
- presence
|
226
|
+
product: presence
|
221
227
|
decorator:
|
222
228
|
amount:
|
223
229
|
digit: true
|
@@ -228,6 +234,9 @@ model:
|
|
228
234
|
```
|
229
235
|
|
230
236
|
#### Bulk Registration Form
|
237
|
+
In the following example, multiple lines of OrderDetails can be registered at once.
|
238
|
+
You can add rows from the ADD button and delete records with the trash icon.
|
239
|
+
|
231
240
|
![has_many_form](./readme/has_many_form.png)
|
232
241
|
|
233
242
|
## View Customization
|
@@ -249,10 +258,10 @@ form_kind can be specified as follows:
|
|
249
258
|
- number (input type="number")
|
250
259
|
- select
|
251
260
|
- switch (Used with the boolean type)
|
252
|
-
- association_search (For association columns in belongs_to, `association_search` allows you to search and specify the related tables from the child screen)
|
261
|
+
- association_search (For association columns in belongs_to, `association_search` allows you to search and specify the related tables from the child screen.)
|
253
262
|
|
254
263
|
#### Example
|
255
|
-
For example, equal search for id, association search for customer_id, multiple checkboxes for status
|
264
|
+
For example, equal search for id, association search for customer_id, and multiple checkboxes for status are defined as follows:
|
256
265
|
```yaml
|
257
266
|
app:
|
258
267
|
index:
|
@@ -291,7 +300,7 @@ app:
|
|
291
300
|
![index_view](./readme/index_view.png)
|
292
301
|
|
293
302
|
#### CSV output
|
294
|
-
|
303
|
+
Infold also allows CSV output of search results. Define the target columns in `app`.`index`.`csv`.`fields`. If empty, all fields will be output.
|
295
304
|
|
296
305
|
#### Example
|
297
306
|
```yaml
|
@@ -312,8 +321,8 @@ If you include has_many / has_one associations in the field, you can also specif
|
|
312
321
|
|
313
322
|
#### Example
|
314
323
|
- The following example shows fields such as `id` and `status` to be displayed.
|
315
|
-
- It also displays the `customer.name_field` by including `customer` in the `belongs_to` association.
|
316
|
-
- In addition, the has_many association `order_details` is included. The `product`, `amount
|
324
|
+
- It also displays the `customer.name_field` by including the `customer` in the `belongs_to` association.
|
325
|
+
- In addition, the has_many association `order_details` is included. The `product`, `amount` and `unit_price` of this `order_details` are specified as the display field.
|
317
326
|
```yaml
|
318
327
|
app:
|
319
328
|
show:
|
@@ -344,17 +353,17 @@ Specify the form type from `kind`, `kind` can be specified as follows:
|
|
344
353
|
- select
|
345
354
|
- switch (boolean)
|
346
355
|
- file (defined in ActiveStorage)
|
347
|
-
- association_search (For association columns in belongs_to, `association_search` allows you to search and specify the related tables from the child screen)
|
356
|
+
- association_search (For association columns in belongs_to, `association_search` allows you to search and specify the related tables from the child screen.)
|
348
357
|
|
349
358
|
If has_many/has_one of association is specified in the field, batch registration of related models is enabled.
|
350
359
|
|
351
360
|
#### Example
|
352
361
|
- Able to search and specify the related customer from a child screen (related to `order belongs_to customer`)
|
353
|
-
- `status` allows radio button selection of Enum elements
|
354
|
-
-
|
362
|
+
- The `status` allows radio button selection of Enum elements
|
363
|
+
- The decorator's append($) set to `total_price` is displayed on the form
|
355
364
|
- Enable batch registration of related data, including `order_details`, which are related to has_many.
|
356
365
|
- Display `product_id`, `amount`, `unit_price` from related `order_details` on the form
|
357
|
-
- In relation to `order_detail belongs_to product`,
|
366
|
+
- In relation to `order_detail belongs_to product`, the related product can be searched from the child screen.
|
358
367
|
- ADD button to add rows.
|
359
368
|
```yaml
|
360
369
|
app:
|
@@ -378,9 +387,9 @@ app:
|
|
378
387
|
![form](./readme/form.png)
|
379
388
|
|
380
389
|
### Association search view
|
381
|
-
Fields
|
390
|
+
Fields related to `belongs_to` can be searched and selected from the child screens for data in the related model.
|
382
391
|
|
383
|
-
**Note: Child screen
|
392
|
+
**Note: Child screen should be defined in the caller's resource (YAML). For example, in the case of `order belongs_to customer`, define the association_search in the YAML of the `customer`, not in the `order`.**
|
384
393
|
|
385
394
|
The configuration is the same as for `app`.`index`. Define the necessary fields for `conditions` and `list`.
|
386
395
|
#### Example
|
@@ -10,7 +10,8 @@ module Infold
|
|
10
10
|
|
11
11
|
def setup
|
12
12
|
resource_name = name.camelize.singularize
|
13
|
-
|
13
|
+
db_schema_file = Rails.root.join('db/schema.rb')
|
14
|
+
db_schema = DbSchema.new(File.exist?(db_schema_file) ? File.read(db_schema_file) : nil)
|
14
15
|
yaml = YAML.load_file(Rails.root.join("config/infold/#{resource_name.underscore}.yml"))
|
15
16
|
resource = YamlReader.generate_resource(resource_name, yaml, db_schema)
|
16
17
|
@writer = ControllerWriter.new(resource)
|
@@ -31,13 +32,8 @@ module Infold
|
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
if in_file.blank?
|
37
|
-
inject_into_file file, after: "resources :admin_users" do
|
38
|
-
"\n authenticated :admin_user do root :to => '#{name.pluralize.underscore}#index', as: :root end"
|
39
|
-
end
|
40
|
-
end
|
35
|
+
gsub_file file, "root :to => 'admin_users#index'",
|
36
|
+
"root :to => '#{name.pluralize.underscore}#index'"
|
41
37
|
end
|
42
38
|
|
43
39
|
def add_menu
|
@@ -10,7 +10,8 @@ module Infold
|
|
10
10
|
|
11
11
|
def setup
|
12
12
|
resource_name = name.camelize.singularize
|
13
|
-
|
13
|
+
db_schema_file = Rails.root.join('db/schema.rb')
|
14
|
+
db_schema = DbSchema.new(File.exist?(db_schema_file) ? File.read(db_schema_file) : nil)
|
14
15
|
yaml = YAML.load_file(Rails.root.join("config/infold/#{resource_name.underscore}.yml"))
|
15
16
|
@resource = YamlReader.generate_resource(resource_name, yaml, db_schema)
|
16
17
|
end
|
@@ -10,7 +10,8 @@ module Infold
|
|
10
10
|
|
11
11
|
def setup
|
12
12
|
resource_name = name.camelize.singularize
|
13
|
-
|
13
|
+
db_schema_file = Rails.root.join('db/schema.rb')
|
14
|
+
db_schema = DbSchema.new(File.exist?(db_schema_file) ? File.read(db_schema_file) : nil)
|
14
15
|
yaml = YAML.load_file(Rails.root.join("config/infold/#{resource_name.underscore}.yml"))
|
15
16
|
@resource = YamlReader.generate_resource(resource_name, yaml, db_schema)
|
16
17
|
end
|
@@ -21,10 +22,11 @@ module Infold
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def create_association_model_file
|
24
|
-
@resource.associations&.
|
25
|
-
|
25
|
+
@resource.associations&.select(&:has_child?)&.each do |association|
|
26
|
+
# association_modelが未定義の場合、skip: trueで作成する
|
27
|
+
option = association.field_group.has_association_model? ? { force: true } : { skip: true }
|
26
28
|
@writer = ModelWriter.new(association)
|
27
|
-
template "model.rb", Rails.root.join("app/models/admin", "#{association.model_name(:snake)}.rb"),
|
29
|
+
template "model.rb", Rails.root.join("app/models/admin", "#{association.model_name(:snake)}.rb"), **option
|
28
30
|
end
|
29
31
|
end
|
30
32
|
end
|
@@ -10,7 +10,8 @@ module Infold
|
|
10
10
|
|
11
11
|
def setup
|
12
12
|
resource_name = name.camelize.singularize
|
13
|
-
|
13
|
+
db_schema_file = Rails.root.join('db/schema.rb')
|
14
|
+
db_schema = DbSchema.new(File.exist?(db_schema_file) ? File.read(db_schema_file) : nil)
|
14
15
|
yaml = YAML.load_file(Rails.root.join("config/infold/#{resource_name.underscore}.yml"))
|
15
16
|
resource = YamlReader.generate_resource(resource_name, yaml, db_schema)
|
16
17
|
@writer = SearchFormWriter.new(resource)
|
@@ -1,29 +1,94 @@
|
|
1
1
|
<%# encoding: utf-8 -%>
|
2
2
|
model:
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
# # Define validation here
|
4
|
+
# validate:
|
5
|
+
# amount: presence
|
6
|
+
# price:
|
7
|
+
# - presence
|
8
|
+
# - numericality:
|
9
|
+
# greater_than_or_equal_to: 0
|
10
|
+
# # Define Enum here
|
11
|
+
# enum:
|
12
|
+
# status:
|
13
|
+
# ordered:
|
14
|
+
# value: 1
|
15
|
+
# color: blue
|
16
|
+
# charged:
|
17
|
+
# value: 2
|
18
|
+
# color: pink
|
19
|
+
# # Define decorator here
|
20
|
+
# decorator:
|
21
|
+
# price:
|
22
|
+
# prepend: $
|
23
|
+
# digit: true
|
24
|
+
# # Define association here
|
25
|
+
# association:
|
26
|
+
# customer:
|
27
|
+
# kind: belongs_to
|
28
|
+
# name_field: name
|
29
|
+
# order_details:
|
30
|
+
# kind: has_many
|
31
|
+
# dependent: destroy
|
32
|
+
# # If the child model on the has_many side also needs to be configured, define it here.
|
33
|
+
# model:
|
34
|
+
# validate:
|
35
|
+
# enum:
|
36
|
+
# decorator:
|
37
|
+
# association:
|
38
|
+
# # Define active_storage here
|
39
|
+
# active_storage:
|
40
|
+
# photo:
|
41
|
+
# kind: image
|
8
42
|
app:
|
9
|
-
title: <%= @name.pluralize.underscore.gsub('_', ' ').upcase %>
|
10
|
-
index
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
fields:
|
29
|
-
|
43
|
+
# title: <%= @name.pluralize.underscore.gsub('_', ' ').upcase %>
|
44
|
+
# # index view settings (search condition, list and csv)
|
45
|
+
# index:
|
46
|
+
# conditions:
|
47
|
+
# - id:
|
48
|
+
# sign: eq
|
49
|
+
# - status:
|
50
|
+
# sign: any
|
51
|
+
# form_kind: checkbox
|
52
|
+
# list:
|
53
|
+
# fields:
|
54
|
+
# - id
|
55
|
+
# - customer
|
56
|
+
# - status
|
57
|
+
# default_order:
|
58
|
+
# field: id
|
59
|
+
# kind: desc
|
60
|
+
# csv:
|
61
|
+
# # If fields is empty, all fields are covered. (The show view is the same)
|
62
|
+
# fields:
|
63
|
+
# # show view settings
|
64
|
+
# show:
|
65
|
+
# fields:
|
66
|
+
# - id
|
67
|
+
# - customer
|
68
|
+
# - order_details:
|
69
|
+
# fields:
|
70
|
+
# - product
|
71
|
+
# - amount
|
72
|
+
# # form view settings
|
73
|
+
# form:
|
74
|
+
# fields:
|
75
|
+
# - status:
|
76
|
+
# kind: radio
|
77
|
+
# - customer:
|
78
|
+
# kind: association_search
|
79
|
+
# #Bulk registration of has_many
|
80
|
+
# - order_details:
|
81
|
+
# kind: association
|
82
|
+
# fields:
|
83
|
+
# - product
|
84
|
+
# kind: association_search
|
85
|
+
# - amount
|
86
|
+
# # Child screen search for related models
|
87
|
+
# association_search:
|
88
|
+
# conditions:
|
89
|
+
# - id:
|
90
|
+
# sign: eq
|
91
|
+
# list:
|
92
|
+
# fields:
|
93
|
+
# - id
|
94
|
+
# - title
|
@@ -3,13 +3,13 @@
|
|
3
3
|
<%- @writer.form_fields.each do |field| -%>
|
4
4
|
<%- if field.form_element.kind_has_association? -%>
|
5
5
|
.card.mb-3{ data: {controller: 'nested-form'} }
|
6
|
-
.card-header
|
6
|
+
.card-header
|
7
7
|
%div
|
8
|
-
%
|
8
|
+
%h4.text-muted.mb-0= Admin::<%= field.association.model_name %>.model_name.human
|
9
9
|
= render Admin::InvalidMessageComponent.new(form, :<%= field.name %>)
|
10
10
|
%template{ data: { nested_form_target: 'template' } }
|
11
11
|
= form.fields_for :<%= field.name %>, Admin::<%= field.association.model_name %>.new, child_index: 'NEW_RECORD' do |nested_form|
|
12
|
-
= render 'form_<%= field.name(:single) %>',
|
12
|
+
= render 'form_<%= field.name(:single) %>', form: nested_form
|
13
13
|
.table-responsive
|
14
14
|
%table.table.nested_form_table.card-table
|
15
15
|
%thead
|
@@ -3,8 +3,8 @@
|
|
3
3
|
<%- @writer.show_fields.each do |field| -%>
|
4
4
|
<%- if field.show_element.kind_association? && !field.association.belongs_to? -%>
|
5
5
|
.card.mb-3
|
6
|
-
.card-header
|
7
|
-
%
|
6
|
+
.card-header
|
7
|
+
%h4.text-muted.mb-0= Admin::<%= field.association.model_name %>.model_name.human
|
8
8
|
- if <%= @writer.resource_name(:snake) %>.<%= field.name %>.blank?
|
9
9
|
.card-body
|
10
10
|
.alert= t('infold.no_data')
|
@@ -11,7 +11,8 @@ module Infold
|
|
11
11
|
|
12
12
|
def setup
|
13
13
|
resource_name = name.camelize.singularize
|
14
|
-
|
14
|
+
db_schema_file = Rails.root.join('db/schema.rb')
|
15
|
+
db_schema = DbSchema.new(File.exist?(db_schema_file) ? File.read(db_schema_file) : nil)
|
15
16
|
yaml = YAML.load_file(Rails.root.join("config/infold/#{resource_name.underscore}.yml"))
|
16
17
|
resource = YamlReader.generate_resource(resource_name, yaml, db_schema)
|
17
18
|
@writer = FormWriter.new(resource)
|
@@ -39,7 +40,7 @@ module Infold
|
|
39
40
|
|
40
41
|
def association_form_file
|
41
42
|
@writer.form_fields.each do |field|
|
42
|
-
if field.association&.
|
43
|
+
if field.association&.has_child?
|
43
44
|
@association_field = field
|
44
45
|
template "views/_form_association.haml",
|
45
46
|
Rails.root.join("app/views/admin/#{name.underscore.pluralize}/_form_#{field.name(:single)}.html.haml"), force: true
|
@@ -11,7 +11,8 @@ module Infold
|
|
11
11
|
|
12
12
|
def setup
|
13
13
|
resource_name = name.camelize.singularize
|
14
|
-
|
14
|
+
db_schema_file = Rails.root.join('db/schema.rb')
|
15
|
+
db_schema = DbSchema.new(File.exist?(db_schema_file) ? File.read(db_schema_file) : nil)
|
15
16
|
yaml = YAML.load_file(Rails.root.join("config/infold/#{resource_name.underscore}.yml"))
|
16
17
|
resource = YamlReader.generate_resource(resource_name, yaml, db_schema)
|
17
18
|
@writer = IndexWriter.new(resource)
|
@@ -11,7 +11,8 @@ module Infold
|
|
11
11
|
|
12
12
|
def setup
|
13
13
|
resource_name = name.camelize.singularize
|
14
|
-
|
14
|
+
db_schema_file = Rails.root.join('db/schema.rb')
|
15
|
+
db_schema = DbSchema.new(File.exist?(db_schema_file) ? File.read(db_schema_file) : nil)
|
15
16
|
yaml = YAML.load_file(Rails.root.join("config/infold/#{resource_name.underscore}.yml"))
|
16
17
|
resource = YamlReader.generate_resource(resource_name, yaml, db_schema)
|
17
18
|
@writer = ShowWriter.new(resource)
|
data/lib/infold/db_schema.rb
CHANGED
@@ -5,7 +5,8 @@ module Infold
|
|
5
5
|
|
6
6
|
def initialize(content=nil)
|
7
7
|
@tables = []
|
8
|
-
|
8
|
+
return unless content
|
9
|
+
content.split("\n").each.each do |row|
|
9
10
|
row = row.strip
|
10
11
|
if row.start_with?('create_table')
|
11
12
|
table_name = row.split('"').second.strip
|
data/lib/infold/field_group.rb
CHANGED
@@ -16,7 +16,7 @@ module Infold
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def find_or_initialize_field(field_name)
|
19
|
-
find { |field| field.name == field_name || field.
|
19
|
+
find { |field| field.association&.name == field_name || field.name == field_name } ||
|
20
20
|
(@fields << Field.new(field_name)).last
|
21
21
|
end
|
22
22
|
|
@@ -56,14 +56,24 @@ module Infold
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def condition_fields(kind=nil)
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
59
|
+
fields =
|
60
|
+
case kind.to_s
|
61
|
+
when 'index'
|
62
|
+
select { |f| f.search_conditions.find(&:in_index?).present? }
|
63
|
+
when 'association_search'
|
64
|
+
select { |f| f.search_conditions.find(&:in_association_search?).present? }
|
65
|
+
else
|
66
|
+
select { |f| f.search_conditions.present? }
|
67
|
+
end
|
68
|
+
if fields.blank?
|
69
|
+
# 条件が未設定の場合、idを対象とする
|
70
|
+
id_field = find_or_initialize_field(:id)
|
71
|
+
id_field.add_search_condition(kind || :index,
|
72
|
+
sign: 'eq',
|
73
|
+
form_kind: :text)
|
74
|
+
fields = [id_field]
|
66
75
|
end
|
76
|
+
fields
|
67
77
|
end
|
68
78
|
|
69
79
|
def conditions(kind=nil)
|
@@ -36,12 +36,18 @@ module Infold
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def form_kind
|
39
|
-
if @form_kind == 'association_search'
|
39
|
+
if @form_kind.to_s == 'association_search'
|
40
40
|
if field.association&.belongs_to?
|
41
41
|
:association_search
|
42
42
|
else
|
43
43
|
:text
|
44
44
|
end
|
45
|
+
elsif @form_kind.to_s == 'select'
|
46
|
+
if field.association&.belongs_to? || field.enum.present?
|
47
|
+
:select
|
48
|
+
else
|
49
|
+
:text
|
50
|
+
end
|
45
51
|
elsif kind_datetime?
|
46
52
|
:datetime
|
47
53
|
elsif kind_file?
|
data/lib/infold/version.rb
CHANGED
data/lib/infold/yaml_reader.rb
CHANGED
@@ -10,7 +10,7 @@ module Infold
|
|
10
10
|
@db_schema = db_schema
|
11
11
|
field_group = FieldGroup.new(db_schema.table(resource_name))
|
12
12
|
resource = Resource.new(resource_name)
|
13
|
-
yaml = yaml.with_indifferent_access
|
13
|
+
yaml = (yaml || {}).with_indifferent_access
|
14
14
|
model = yaml.dig('model') || {}
|
15
15
|
app = yaml.dig('app') || {}
|
16
16
|
assign_associations( field_group, model.dig(:association))
|
@@ -30,7 +30,8 @@ module Infold
|
|
30
30
|
field = field_group.find_or_initialize_field(default_order.dig(:field))
|
31
31
|
resource.default_order = DefaultOrder.new(self, field, default_order.dig(:kind))
|
32
32
|
end
|
33
|
-
resource.app_title = app.dig(:title)
|
33
|
+
resource.app_title = app.dig(:title).presence ||
|
34
|
+
resource_name.pluralize.underscore.gsub('_', ' ').upcase
|
34
35
|
resource
|
35
36
|
end
|
36
37
|
|
@@ -232,7 +233,7 @@ module Infold
|
|
232
233
|
form_element.add_association_fields(
|
233
234
|
association_field,
|
234
235
|
seq: association_seq,
|
235
|
-
form_kind: association_field_config.dig(
|
236
|
+
form_kind: association_field_config.dig(association_field_config.keys[0], :kind))
|
236
237
|
end
|
237
238
|
end
|
238
239
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: infold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yamataka22
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-12-
|
11
|
+
date: 2022-12-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|