infold 0.2.0 → 0.2.1
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 +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
|

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

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

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

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

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

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

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

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