hot-glue 0.4.9 → 0.5.0

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: a742ee0c02993ed08614aafae1af82e86528f002b69a7213c8cd731518b14df3
4
- data.tar.gz: 6bd0941019c42f2ce0eee5d94447098b748a0475726efd53554c1f62f3051f2f
3
+ metadata.gz: ce580959416e9968343b55064541fe777cef3c213f6124add34aba96f13a194b
4
+ data.tar.gz: 902147016f8d3ef1b20a1ce713b84d68b9ff2b5700d2643369d1037d0658bbc2
5
5
  SHA512:
6
- metadata.gz: 4bdfa2cdfbf27a138d53be2455df509345ec20f0f37d047a67e77d7365fff543a76e41504f3a1699a6eb24056ad939e55254ec6b4195c8647734d4b7f6eb288a
7
- data.tar.gz: d123bf48ca0e1beb4eacdceeee934aaca4b6e6c6284a2c0c3f09e39caab94e9561bea7ccd8fcb92d6c8942df5ae855958270d2a8726a06dc3875fbfa6ec7b7d8
6
+ metadata.gz: d4625645ea4bd58ee8614965ff26083ef86ca6d07398408bcf01cb72e3aceda62d60480a86fbe4a999e12f726bc74c427f35a3d889cba9e6d0ef7e54c42f1f79
7
+ data.tar.gz: 7dd4e7fc8d7a605c54818c60bfdaa38148727f65a13e8e1135002bcc23c6f63649be909787b76b207fd81b3f6a139e0598a526b59c872dc71e512f2983432fe4
data/.github/FUNDING.yml CHANGED
@@ -1,2 +1 @@
1
- custom: ["https://heliosdev.shop/p/hot-glue?utm_source=github.com&utm_campaign=github_hot_glue_repo_funding_link",
2
- "https://jfbcodes.com/p/hot-glue-in-depth-tutorial?utm_source=github.com&utm_campaign=github_hot_glue_repo_funding_link"]
1
+ custom: ["https://jfbcodes.com/p/hot-glue-in-depth-tutorial?utm_source=github.com&utm_campaign=github_hot_glue_repo_funding_link"]
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hot-glue (0.4.8.1)
4
+ hot-glue (0.5.0)
5
5
  ffaker (~> 2.16)
6
6
  kaminari (~> 1.2)
7
7
  rails (> 5.1)
data/README.md CHANGED
@@ -3,24 +3,24 @@
3
3
 
4
4
  Hot Glue is a Rails scaffold builder for the Turbo era. It is an evolution of the admin-interface style scaffolding systems of the 2010s ([activeadmin](https://github.com/activeadmin/activeadmin), [rails_admin](https://github.com/sferik/rails_admin), and [active_scaffold](https://github.com/activescaffold/active_scaffold)).
5
5
 
6
- Using Turbo-Rails and Hotwire (default in Rails 7) you get a lightning-fast out-of-the-box CRUD building experience.
6
+ Using Turbo-Rails and Hotwire (default in Rails 7) you get a lightning-fast out-of-the-box CRUD-building experience.
7
7
 
8
- Every page displays only a list view: new and edit operations happen as 'edit-in-place', so the user never leaves the page.
8
+ Every page displays only a list view: new and edit operations happen as 'edit-in-place,' so the user never leaves the page.
9
9
 
10
- Because all page navigation is Turbo's responsibilty, everything plugs & plays nicely into a Turbo-backed Rails app.
10
+ Because all page navigation is Turbo's responsibility, everything plugs & plays nicely into a Turbo-backed Rails app.
11
11
 
12
- Alternatively, you can use this tool to create a Turbo-backed *section* of your Rails app-- like an admin interface -- while still treating the rest of the Rails app as an API or building out other features by hand.
12
+ Alternatively, you can use this tool to create a Turbo-backed *section* of your Rails app -- such as an admin interface -- while still treating the rest of the Rails app as an API or building out other features by hand.
13
13
 
14
- It will read your relationships and field types to generate your code for you, leaving you with a 'sourdough starter' to work from. If you modify the generated code, you're on your own if you want to preserve your changes and also re-generate scaffold after adding fields.
14
+ It will read your relationships and field types to generate your code for you, leaving you with a 'sourdough starter' to work from. If you modify the generated code, you're on your own if you want to preserve your changes and also re-generate scaffolding after adding fields.
15
15
 
16
16
  By default, it generates code that gives users full control over objects they 'own' and by default it spits out functionality giving access to all fields.
17
17
 
18
- Hot Glue generates functionality that's quick and dirty. It lets you be crafty. As with a real hot glue gun, use with caution.
18
+ Hot Glue generates functionality that is quick and dirty. It lets you be crafty. As with a real glue gun, use it with caution.
19
19
 
20
20
  * Build plug-and-play scaffolding mixing generated ERB with the power of Hotwire and Turbo-Rails
21
- * Everything edits-in-place (unless you use `--big-edit`, then it won't)
22
- * Automatically Reads Your Models (make them AND migrate your DB before building your scaffolding!)
23
- * Excellent for CREATE-READ-UPDATE-DELETE (CRUD), lists with pagination (coming soon: searching & sorting)
21
+ * Everything edits-in-place (unless you use `--big-edit`)
22
+ * Automatically reads your models (make them AND migrate your database before building your scaffolding!)
23
+ * Excellent for CREATE-READ-UPDATE-DELETE (CRUD), lists with pagination
24
24
  * Great for prototyping, but you should learn Rails fundamentals first.
25
25
  * 'Packaged' with Devise, Kaminari, Rspec, FontAwesome
26
26
  * Create system specs automatically along with the generated code.
@@ -68,9 +68,9 @@ Confirm that both Stimulus and Turbo are working.
68
68
 
69
69
  **If using JSBundling, make sure to use the new `bin/dev rails` instead of the old `rails server` or else your Webpack will not compile.**
70
70
 
71
- For the quick step-by-step to help you confirm that both Stimulus and Turbo are working for your new JSBundling-Rails/CSSBunlding-Rails setup [see this post](https://jasonfleetwoodboldt.com/courses/stepping-up-rails/rails-7-new-app-with-js-bundling-css-bundling/).
71
+ For the quick step-by-step guide to help you confirm that both Stimulus and Turbo are working for your new JSBundling-Rails/CSSBunlding-Rails setup [see this post](https://jasonfleetwoodboldt.com/courses/stepping-up-rails/rails-7-new-app-with-js-bundling-css-bundling/).
72
72
 
73
- (Note that Bootstrap is optional for Hot Glue. Here, I am just showing you the default isntallation for simplicity.)
73
+ (Note that Bootstrap is optional for Hot Glue. Here, I am just showing you the default installation for simplicity.)
74
74
 
75
75
  For the old method of installing Bootstrap [see this post](https://jasonfleetwoodboldt.com/courses/stepping-up-rails/rails-7-bootstrap/)
76
76
 
@@ -92,18 +92,20 @@ gem 'ffaker'
92
92
  ## 3. HOTGLUE INSTALLER
93
93
  Add `gem 'hot-glue'` to your Gemfile & `bundle install`
94
94
 
95
- Purchase a license at https://heliosdev.shop/hot-glue-license
95
+ Purchase a license at https://heliosdev.shop/p/hot-glue
96
96
 
97
97
  During in installation, you MUST supply a `--layout` flag.
98
98
 
99
- ### `--layout` flag (NOTE: haml and slim are no longer supported at this time)
99
+ ### `--layout` flag (only two options: `hotglue` or `bootstrap`; default is `bootstrap`)
100
100
  Here you will set up and install Hot Glue for the first time.
101
101
 
102
102
  It will install a config file that will save two preferences: layout (`hotglue` or `bootstrap`)
103
103
 
104
104
  The installer will create `config/hot_glue.yml`.
105
105
 
106
- During the installation, if your `--layout` flag is set to `hotglue` you must also pass `--theme` flag.
106
+
107
+ ### `--theme` flag
108
+ During the installation, **if** your `--layout` flag is set to `hotglue` you must also pass `--theme` flag.
107
109
 
108
110
  the themes are:
109
111
  • like_mountain_view (Google)
@@ -112,15 +114,16 @@ the themes are:
112
114
  • dark_knight (_The Dark Night_ (2008) inspired)
113
115
  • like_cupertino (modern Apple-UX inspired)
114
116
 
115
- ### `--markup` flag
116
117
 
117
- default is `erb`. IMPORTANT: As of right now, HAML and SLIM are not currently supported.
118
+ ### `--markup` flag (NOTE: haml and slim are no longer supported at this time)
119
+
120
+ default is `erb`. IMPORTANT: As of right now, HAML and SLIM are not currently supported so the only option is also the default `erb`.
118
121
 
119
122
 
120
123
  ### example installing ERB using Bootstrap layout:
121
124
  `rails generate hot_glue:install --markup=erb --layout=bootstrap`
122
125
 
123
- ### Example installing HAML using Hot Glue layout and the 'like_mountain_view' (Gmail-inspired) theme:
126
+ ### Example installing using Hot Glue layout and the 'like_mountain_view' (Gmail-inspired) theme:
124
127
  `rails generate hot_glue:install --markup=erb --layout=hotglue --theme=like_mountain_view`
125
128
 
126
129
  The Hot Glue installer did several things for you in this step. Examine the git diffs or see 'Hot Glue Installer Notes' below.
@@ -140,11 +143,11 @@ https://github.com/FortAwesome/font-awesome-sass
140
143
 
141
144
  Add to your Gemfile
142
145
 
143
- As of 2022-01-26 Devise for Rails 7 is still not released so you must use **main branch**, like so:
146
+ As of now, Devise for Rails 7 is still not released so you must use **main branch**, like so:
144
147
 
145
148
  `gem 'devise', branch: 'main', git: 'https://github.com/heartcombo/devise.git'`
146
149
 
147
- (If you are on Rails 6, you must do ALL of the steps in the Legacy Setup steps. Be sure not to skip **Legacy Step #5** (below))
150
+ (If you are on Rails 6, you must do ALL of the steps in the Legacy Setup steps. Be sure not to skip **Legacy Step #5** below)
148
151
 
149
152
  For Rails 7, be sure you are on the main branch of devise above and your logins should work. (The previously necessary step of disabling turbo shown in Legacy Step #5 is no longer needed. )
150
153
 
@@ -205,7 +208,7 @@ this may not have been automatically applied by the installer.
205
208
  #### Hot Glue switched Capybara from RACK-TEST to HEADLESS CHROME
206
209
 
207
210
  - By default Capybara is installed with :rack_test as its driver.
208
- - This does not support Javascript, and the code from Hot Glue IS NOT fallback compatible-- it will not work on non-Javascript browsers.
211
+ - This does not support Javascript. Hot Glue is not targeted for fallback browsers.
209
212
  - From the [Capybara docs](https://github.com/teamcapybara/capybara#drivers):
210
213
  ```
211
214
  By default, Capybara uses the :rack_test driver, which is fast but limited: it does not support JavaScript
@@ -300,7 +303,7 @@ end
300
303
 
301
304
  ### `--nested=`
302
305
 
303
- This object is nested within another tree of objects, and there is a nested route in your `routes.rb` file. When specifying the parent(s), be sure to use **singular case**.
306
+ This object is nested within another tree of objects, and there is a nested route in your `routes.rb` file with the specified parent controllers above this controller. When specifying the parent(s), be sure to use **singular case**.
304
307
 
305
308
  #### Example #1: One-level Nesting
306
309
  Invoice `has_many :lines` and a Line `belongs_to :invoice`
@@ -364,11 +367,11 @@ This is "starfish access control" or "poor man's access control." It works when
364
367
 
365
368
  #### Optionalized Nested Parents
366
369
 
367
- Add `~` in front of any nested parameter (any parent in the `--nest` list) you want to make optional. This creates a two-headed controller: It can operate with or without that optionalized parameter.
370
+ Add `~` in front of any nested parameter (any parent in the `--nested` list) you want to make optional. This creates a two-headed controller: It can operate with or without that optionalized parameter.
368
371
 
369
- This is an advanced feature is to use **two duplicative routes to the same controller**. You can only use this feature with Gd controller.
372
+ This is an advanced feature. To use, **make duplicative routes to the same controller**. You can only use this feature with Gd controller.
370
373
 
371
- Specify your controller *twice* in your routes.rb. Then, in your `--nest` setting, add `~` to any nested parent you want to **make optional**. "Make optional" means the controller will behave as-if it exists in two places: once, at the normal nest level. Then the same controller will 'exist' again one-level up in your routes. **If the route has sub-routes, you'll need to re-specify the entire subtree also**.
374
+ Specify your controller *twice* in your routes.rb. Then, in your `--nested` setting, add `~` to any nested parent you want to **make optional**. "Make optional" means the controller will behave as-if it exists in two places: once, at the normal nest level. Then the same controller will 'exist' again one-level up in your routes. **If the route has sub-routes, you'll need to re-specify the entire subtree also**.
372
375
  ```
373
376
  namespace :admin
374
377
  resources :users do
@@ -378,15 +381,15 @@ namespace :admin
378
381
  end
379
382
  ```
380
383
 
381
- Even though we have two routes pointed to invoices, both will go to the same controller (`invoices_controller.rb`)
384
+ Even though we have two routes pointed to **invoices**, both will go to the same controller (`app/controllers/admin/invoices_controller.rb`)
382
385
 
383
386
  ```
384
- rails generate hot_glue:scaffold User --namespace=admin --gd --downnest=invoices
385
- rails generate hot_glue:scaffold Invoice --namespace=admin --gd --nest=~users
387
+ rails generate hot_glue:scaffold User --namespace=admin --gd
388
+ rails generate hot_glue:scaffold Invoice --namespace=admin --gd --nested=~users
386
389
  ```
387
390
  Notice for the Invoice build, the parent user is *optionalized* (not 'optional'-- optionalized: to be made so it can be made optional).
388
391
 
389
- The Invoices controller, which is a Gd controller, will load the User if a user is specified in the route (`/admin/users/:user_id/invoices/`). It will ALSO work at `/admin/invoices` and will switch back into loading directly from the base class when routed this way.
392
+ The Invoices controller, which is a Gd controller, will load the User if a user is specified in the route (`/admin/users/:user_id/invoices/`). It will ALSO work at `/admin/invoices` and will switch back into loading directly from the base class when routed without the parent user.
390
393
 
391
394
 
392
395
 
@@ -394,11 +397,11 @@ The Invoices controller, which is a Gd controller, will load the User if a user
394
397
 
395
398
  By default, it will be assumed you have a `current_user` for your user authentication. This will be treated as the "authentication root" for the "poor man's auth" explained above.
396
399
 
397
- The poor man's auth presumes that object graphs have only one natural way to traverse them (that is, one primary way to traverse them), and that all relationships infer that a set of things or their descendants are granted access to me for reading, writing, updating, and deleting.
400
+ The poor man's auth presumes that object graphs have only one natural way to traverse them (that is, one primary way to traverse them), and that all relationships infer that a set of things or their descendants are granted access to "me" for reading, writing, updating, and deleting.
398
401
 
399
402
  Of course this is a sloppy way to do access control, and can easily leave open endpoints your real users shouldn't have access to.
400
403
 
401
- When you display anything built with the scaffolding, we assume the `current_user` will have `has_many` association that matches the pluralized name of the scaffold. In the case of nesting, we will automatically find the nested objects first, then continue down the nest chain to find the target object. In this way, we know that all object are 'anchored' to the logged-in user.
404
+ When you display anything built with the scaffolding, Hot Glue assumes the `current_user` will have `has_many` association that matches the pluralized name of the scaffold. In the case of nesting, we will automatically find the nested objects first, then continue down the nest chain to find the target object. This is how Hot Glue assumes all object are 'anchored' to the logged-in user. (As explained in the `--nested` section.)
402
405
 
403
406
  If you use Devise, you probably already have a `current_user` method available in your controllers. If you don't use Devise, you can implement it in your ApplicationController.
404
407
 
@@ -444,6 +447,8 @@ The default (do not pass `auth_identifier=`) will match the `auth` (So if you us
444
447
 
445
448
 
446
449
  `rails generate hot_glue:scaffold Thing --auth=current_account --auth_identifier=login`
450
+
451
+
447
452
  In this example, the controller produced with:
448
453
  ```
449
454
  before_action :authenticate_login!
@@ -454,11 +459,12 @@ However, the object graph anchors would continue to start from current_account.
454
459
  ```
455
460
 
456
461
  Use empty string to **turn this method off**:
462
+
457
463
  `rails generate hot_glue:scaffold Thing --auth=current_account --auth_identifier=''`
458
464
 
459
465
  In this case a controller would be generated that would have NO before_action to authenticate the account, but it would still treat the current_account as the auth root for the purpose of loading the objects.
460
466
 
461
- Please note that this example would product non-functional code, so you would need to manually fix your controllers to make sure `current_account` is available to the controller.
467
+ Please note that this example would produce non-functional code, so you would need to manually fix your controllers to make sure `current_account` is available to the controller.
462
468
 
463
469
 
464
470
  ### `--plural=`
@@ -466,17 +472,24 @@ Please note that this example would product non-functional code, so you would ne
466
472
  You don't need this if the pluralized version is just + "s" of the singular version. Only use for non-standard plurlizations, and be sure to pass it as TitleCase (as if you pluralized the model name which is non-standard for Rails)
467
473
 
468
474
 
475
+ ### `--form-labels-position` (default: `after`; options are **before**, **after**, and **omit**)
476
+ By default form labels appear after the form inputs. To make them appear before or omit them, use this flag.
477
+
478
+ See also `--form-placeholder-labels` to use placeolder labels.
479
+
480
+
481
+
469
482
  ### `--exclude=`
470
483
  (separate field names by COMMA)
471
484
 
472
- By default, all fields are included unless they are on the exclude list. (The default for the exclude list is `id`, `created_at`, and `updated_at` so you don't need to exclude those-- they are added.)
485
+ By default, all fields are included unless they are on the default exclude list. (The default exclude list is `id`, `created_at`, `updated_at`, `encrypted_password`, `reset_password_token`, `reset_password_sent_at`, `remember_created_at`, `confirmation_token`, `confirmed_at`, `confirmation_sent_at`, `unconfirmed_email`.)
473
486
 
474
- If you specify an exclude list, those and the default excluded list will be excluded.
487
+ If you specify any exclude list, those excluded **and** the default exclude list will be excluded. (If you need any of the fields on the default exclude list, you must use `--include` instead.)
475
488
 
476
489
 
477
490
  `rails generate hot_glue:scaffold Account --exclude=password`
478
491
 
479
- (The default excluded list is: :id, :created_at, :updated_at, :encrypted_password, :reset_password_token, :reset_password_sent_at, :remember_created_at, :confirmation_token, :confirmed_at, :confirmation_sent_at, :unconfirmed_email. If you want to edit any fields with the same name, you must use the include flag instead.)
492
+ (The default excluded list is: If you want to edit any fields with the same name, you must use the include flag instead.)
480
493
 
481
494
 
482
495
  ### `--include=`
@@ -488,42 +501,46 @@ If you specify an include list, it will be treated as a whitelist: no fields wil
488
501
 
489
502
  You may not specify both include and exclude.
490
503
 
491
- Include setting is affected by both specified grouping and smarty layouts, explained below.
504
+ Include setting is affected by both specified grouping mode and smart layouts, explained below.
492
505
 
493
506
 
494
507
  #### Specified Grouping Mode
495
508
 
496
509
  To specify grouped columns, separate COLUMNS by a COLON, then separate fields with commas. Specified groupings work like smart layouts (see below), except you drive which groupings make up the columns.
497
510
 
498
- (Smarty layouts, below, achieves the same effect but automatically groups your fields into a smart number of columns. )
511
+ (Smart layouts, below, achieves the same effect but automatically group your fields into a smart number of columns.)
499
512
 
500
513
  If you want to group up fields together into columns, use a COLON (`:`) character to specify columns.
501
514
 
502
515
  Your input **may** have a COLON at the end of it, but otherwise your columns will made **flush left**.
503
516
 
504
- Without specified grouping (and not using smart layout), no group will happen, so these two fields would display in two columns:
505
- `--include=api_id,api_key`
506
-
507
- With a trailing colon you would be specifying the grouping. You're telling Hot Glue to make the two fields into column #1. (There is no other column.)
508
- `--include=api_id,api_key:`
517
+ Without specified grouping (and not using smart layout), no grouping will happen. So these two fields would display in two (small, 1-column Bootstrap) columns:
518
+
519
+ `--include=first,last`
509
520
 
521
+ With a **trailing colon** you switch Hot Glue into specified grouping mode. You're telling Hot Glue to make the two fields into column #1. (There is no other column.)
522
+ `--include=first,last:`
510
523
 
511
- If, for example, you wanted to put the `name` field into column #1 and then the api_id and api_key into column #2, you would use:
512
- `--include=name:api_id,api_key`
524
+ Hot Glue also happens to know that, for example, when you say "one column" you really want _one visual_ column made up of the available Bootstrap columns. For example, with 1 child portal (4) + the default edit/create buttons (2), you would have 6 remaining bootstrap columns (2+4+6=12). With 6 remaining Bootstrap columns Hot Glue will make 1 _visual colum_ into a 6-column Bootstrap column.
513
525
 
526
+ If, for example, you wanted to put the `email` field into column #1 and then the `first` and `last` into column #2, you would use:
527
+ `--include=email:first,last`
514
528
 
529
+ Assuming we have the same number of columns as the above example (6), Hot Glue knows that you now have 2 _visual columns_. It then gives each visual column 3-colum bootstrap columns, which makes your layout into a 3+3+4+2=12 Bootstrap layout.
515
530
 
516
- Specifying any colon in your include syntax switches the builder into specified grouping mode. The effect will be that the fields will be stacked together into nicely fit columns. (This will look confusing if your user expect an Excel-like interface.)
531
+ **Specifying any colon in your include syntax switches the builder into specified grouping mode.**
532
+
533
+ The effect will be that the fields will be stacked together into nicely fit columns. (This will look confusing if your end-user is expecting an Excel-like interface.)
517
534
 
518
- With Bootstrap in specified grouping or smart layout mode, it automatically attempts to fit everything into 12-columns.
535
+ With Hot Glue in specified grouping or smart layout mode, it automatically attempts to fit everything into Bootstrap 12-columns.
519
536
 
520
- Using Bootstrap with neither specified grouping nor smart layouts may make 12 columns, which will produce strange result. (Bootstrap is not designed to work with, for example, a 13-column layout.)
537
+ Using Bootstrap with neither specified grouping nor smart layouts may make more than 12 columns, which will produce strange results. (Bootstrap is not designed to work with, for example, a 13-column layout.)
521
538
 
522
539
  You should typically either specify your grouping or use smart layouts when building with Bootstrap, but if your use case does not fit the stacking feature you can specify neither flag and then you may then have to deal with the over-stuffed layouts as explained.
523
540
 
524
541
 
525
542
 
526
- ### `--smart-layout` mode (automatic grouping) (default: false)
543
+ ### `--smart-layout` (also known as automatic grouping)
527
544
 
528
545
  Smart layouts are like specified grouping but Hot Glue does the work of figuring out how many fields you want in each column.
529
546
 
@@ -535,7 +552,7 @@ The effect will be that the fields will be stacked together into nicely fit colu
535
552
 
536
553
  **If your customer is used to Excel, this feature will confuse them.**
537
554
 
538
- Also, this feature will **probably not** be supported by the SORTING (not yet implemented; TBD). I'm not really sure it makes sense to build a non-columnar layout with sorting, so I think I **probably won't support smart layouts** if you want sorting. (You will be forced to choose between the two which I think makes sense.)
555
+ Also, this feature will **probably not** be supported by the SORTING (not yet implemented). (You will be forced to choose between the two which I think makes sense.)
539
556
 
540
557
  The layout builder works from right-to-left and starts with 12, the number of Bootstrap's columns.
541
558
 
@@ -547,7 +564,7 @@ If you're keeping track, that means we may have used 6 to 8 out of our Bootstrap
547
564
 
548
565
  If we have 2 downnested portals and only the default buttons, that uses 10 out of 12 Bootstrap columns, leaving only 2 bootstrap columns for the fields.
549
566
 
550
- The layout builder takes the number of columns left and then distributes the feilds 'evenly' among them. However, note that order specified translates to up-to-down within the column, and then left-to-right across the columns, like so:
567
+ The layout builder takes the number of columns remaining and then distributes the feilds 'evenly' among them. However, note that order specified translates to up-to-down within the column, and then left-to-right across the columns, like so:
551
568
 
552
569
  A D G
553
570
 
@@ -557,7 +574,7 @@ C F I
557
574
 
558
575
  This is what would happen if 9 fields, specified in the order A,B,C,D,E,F,G,H,I, were distributed across 3 columns.
559
576
 
560
- (If you had a number of fields that wasn't easily divisible by the number of columns, it would leave the final column a few fields short of the others.)
577
+ (If you had a number of fields that wasn't easily divisible by the number of columns, it would leave the final column one or a few fields short of the others.)
561
578
 
562
579
 
563
580
 
@@ -658,39 +675,48 @@ Omits pagination. (All list views have pagination by default.)
658
675
 
659
676
  ### `--no-list`
660
677
 
661
- Omits list action. Only makes sense to use this if you are create a view where you only want the create button you want to navigate to the update screen alternative ways.
678
+ Omits list action. Only makes sense to use this if want to create a view where you only want the create button or to navigate to the update screen alternative ways. (The new/create still appears, as well the edit, update & destroy actions are still created even though there is no natural way to navigate to them.)
662
679
 
663
680
 
664
- ### `--no-list-labels`
681
+ ### `--no-list-label`
665
682
 
666
- Omits list labels at the top of the list.
683
+ Omits list LABEL itself above the list. (Do not confuse with the field labels.)
667
684
 
668
- ### `--no-list-heading`
685
+ (Note that on a per model basis, you can also globally omit the label or set a unique label value using
686
+ `@@table_label_singular` and `@@table_label_plural` on your model objects.)
669
687
 
670
- Omits the list heading.
688
+ Note that list labels may be automatically omitted on downnested scaffolds.
671
689
 
672
- (Note that on a per model basis, you can also globally omit the heading or set a unique value using
673
- `@@table_label_singular` and `@@table_label_plural` on your model objects.)
690
+ ### `--form-placeholder-labels` (default: false)
691
+
692
+ When set to true, fields, numbers, and text areas will have placeholder labels.
693
+ Will not apply to dates, times, datetimes, dropdowns (enums + foreign keys), or booleans.
694
+
695
+ See also setting `--form-labels-position` to control position or omit normal labels.
696
+
697
+ ### `--no-list-heading`
698
+
699
+ Omits the heading of column names that appears above the 1st row of data.
674
700
 
675
701
  ### `--no-create`
676
702
 
677
- Omits create action.
703
+ Omits new & create actions.
678
704
 
679
705
  ### `--no-delete`
680
706
 
681
- Omits delete action.
707
+ Omits delete button & destroy action.
682
708
 
683
709
  ### `--big-edit`
684
710
 
685
- If you do not want inline editing of your list items but instead to fall back to full page style behavior for your edit views, use `--big-edit`. Turbo still handles the page interactions, but the user is taken to a full-screen edit page instead of an edit-in-place interaction.
711
+ If you do not want inline editing of your list items but instead want to fall back to full page style behavior for your edit views, use `--big-edit`. Turbo still handles the page interactions, but the user is taken to a full-screen edit page instead of an edit-in-place interaction.
686
712
 
687
- ### `--display-list-after-update` (default: false)
713
+ ### `--display-list-after-update`
688
714
 
689
715
  After an update-in-place normally only the edit view is swapped out for the show view of the record you just edited.
690
716
 
691
717
  Sometimes you might want to redisplay the entire list after you make an update (for example, if your action removes that record from the result set).
692
718
 
693
- To do this, use flag `--display_list_after_update`. The update will behave like delete and re-fetch all the records in the result and tell Turbo to swap out the entire list.
719
+ To do this, use flag `--display-list-after-update`. The update will behave like delete and re-fetch all the records in the result and tell Turbo to swap out the entire list.
694
720
 
695
721
 
696
722
 
@@ -700,14 +726,14 @@ To do this, use flag `--display_list_after_update`. The update will behave like
700
726
 
701
727
  HotGlue will copy a file named base_controller.rb to the same folder where it tries to create any controller, unless such a file exists there already.
702
728
 
703
- Obviously, the created controller will always have this base controller as its subclass. In this way, you are encouraged to implement functionality common to the *namespace* (shared between the controllers in the namespace), using this technique.
729
+ The created controller will always have this base controller as its subclass. You are encouraged to implement functionality common to the *namespace* (shared between the controllers in the namespace) using this technique.
704
730
 
705
731
  ## Special Table Labels
706
732
 
707
733
  If your object is very wordy (like MyGreatHook) and you want it to display in the UI as something shorter,
708
- add `@@table_label_plural = "The Things"` and `@@table_label_singular = "The Things"`.
734
+ add `@@table_label_plural = "Hooks"` and `@@table_label_singular = "Hook"`.
709
735
 
710
- Hot Glue will use this as the listing heading label and New record label. This affects only the UI only.
736
+ Hot Glue will use this as the **list heading** and **New record label**, respectively. This affects only the UI only.
711
737
 
712
738
  You can also set these to `nil` to omit the labels completely.
713
739
 
@@ -727,6 +753,7 @@ Child portals have the headings omitted automatically (there is a heading identi
727
753
  - Time: displayed as HTML5 time picker
728
754
  - Boolean: displayed radio buttons yes/ no
729
755
  - Enum - displayed as a drop-down list (defined the enum values on your model). For Rails 6 see https://jasonfleetwoodboldt.com/courses/stepping-up-rails/enumerated-types-in-rails-and-postgres/
756
+ - AFAIK, you must specify the enum definition both in your model and also in your database migration for both Rails 6 + Rails 7
730
757
 
731
758
 
732
759
  # VERSION HISTORY
@@ -8,43 +8,25 @@ module HotGlue
8
8
 
9
9
 
10
10
  def datetime_field_localized(form_object, field_name, value, label, timezone = nil )
11
- res = form_object.label(label,
12
- field_name,
13
- class: 'small form-text text-muted')
14
-
15
- res << form_object.text_field(field_name, class: 'form-control',
11
+ form_object.text_field(field_name, class: 'form-control',
16
12
  type: 'datetime-local',
17
13
  value: date_to_current_timezone(value, timezone))
18
-
19
- res << timezonize(timezone)
20
- res
14
+ + timezonize(timezone)
21
15
  end
22
16
 
23
17
 
24
18
  def date_field_localized(form_object, field_name, value, label, timezone = nil )
25
-
26
- res = form_object.label(label,
27
- field_name,
28
- class: 'small form-text text-muted')
29
-
30
- res << form_object.text_field(field_name, class: 'form-control',
19
+ form_object.text_field(field_name, class: 'form-control',
31
20
  type: 'date',
32
21
  value: value )
33
-
34
- res
35
22
  end
36
23
 
37
24
  def time_field_localized(form_object, field_name, value, label, timezone = nil )
38
- res = form_object.label(label,
39
- field_name,
40
- class: 'small form-text text-muted')
41
-
42
- res << form_object.text_field(field_name, class: 'form-control',
25
+ form_object.text_field(field_name, class: 'form-control',
43
26
  type: 'time',
44
27
  value: date_to_current_timezone(value, timezone))
28
+ + timezonize(timezone)
45
29
 
46
- res << timezonize(timezone)
47
- res
48
30
  end
49
31
 
50
32
  def current_timezone
@@ -38,7 +38,7 @@ module HotGlue
38
38
  require 'open-uri'
39
39
 
40
40
  # ask HeliosDev.shop if this email is good
41
- stream = URI.open("https://heliosdev.shop/check_licenses/hot-glue-license?email=#{license_email}")
41
+ stream = URI.open("https://heliosdev.shop/check_licenses/hot-glue?email=#{license_email}")
42
42
  resp = JSON.parse(stream.read)
43
43
 
44
44
  if resp['status'] == 'success'
@@ -87,11 +87,6 @@ module HotGlue
87
87
 
88
88
  end
89
89
 
90
- if Rails.version.split(".")[0].to_i >= 7
91
- copy_file "confirmable.js", "#{'spec/dummy/' if Rails.env.test?}app/javascript/controllers/confirmable.js"
92
- end
93
-
94
-
95
90
  begin
96
91
  if Rails.version.split(".")[0].to_i == 6
97
92
  app_js_contents = File.read("app/javascript/packs/application.js")
@@ -1,23 +1,19 @@
1
1
  module HotGlue
2
2
  class ErbTemplate < TemplateBase
3
3
 
4
-
4
+ attr_accessor :path, :singular, :singular_class,
5
+ :magic_buttons, :small_buttons,
6
+ :show_only, :column_width, :layout, :perc_width,
7
+ :ownership_field, :form_labels_position,
8
+ :inline_list_labels,
9
+ :columns, :column_width, :col_identifier, :singular,
10
+ :form_placeholder_labels
5
11
 
6
12
  def add_spaces_each_line(text, num_spaces)
7
13
  add_spaces = " " * num_spaces
8
14
  text.lines.collect{|line| add_spaces + line}.join("")
9
15
  end
10
16
 
11
-
12
- # include GeneratorHelper
13
- attr_accessor :singular
14
-
15
- def field_output(col, type = nil, width, col_identifier )
16
- " <%= f.text_field :#{col}, value: @#{@singular}.#{col}, autocomplete: 'off', size: #{width}, class: 'form-control', type: '#{type}' %>\n "+
17
- "\n"
18
- end
19
-
20
-
21
17
  def magic_button_output(*args)
22
18
  path = args[0][:path]
23
19
  # path_helper_singular = args[0][:path_helper_singular]
@@ -34,20 +30,13 @@ module HotGlue
34
30
  }.join("\n")
35
31
  end
36
32
 
37
- def text_area_output(col, field_length, col_identifier )
38
- lines = field_length % 40
39
- if lines > 5
40
- lines = 5
41
- end
42
33
 
43
- "<%= f.text_area :#{col}, class: 'form-control', autocomplete: 'off', cols: 40, rows: '#{lines}' %>"
44
- end
45
34
 
46
35
  def list_column_headings(*args)
47
- layout_columns = args[0][:columns]
48
- column_width = args[0][:column_width]
49
- col_identifier = args[0][:col_identifier]
50
- layout = args[0][:layout]
36
+ @columns = args[0][:columns]
37
+ @column_width = args[0][:column_width]
38
+ @col_identifier = args[0][:col_identifier]
39
+ @layout = args[0][:layout]
51
40
 
52
41
  if layout == "hotglue"
53
42
  col_style = " style='flex-basis: #{column_width}%'"
@@ -55,23 +44,29 @@ module HotGlue
55
44
  col_style = ""
56
45
  end
57
46
 
58
- result = layout_columns.map{ |column|
47
+ result = columns.map{ |column|
59
48
  "<div class='#{col_identifier}'" + col_style + ">" + column.map(&:to_s).map{|col_name| "#{col_name.humanize}"}.join("<br />") + "</div>"
60
49
  }.join("\n")
61
50
  return result
62
51
  end
63
52
 
64
53
 
54
+ ################################################################
55
+
56
+ # THE FORM
57
+
65
58
  def all_form_fields(*args)
66
- layout_columns = args[0][:columns]
67
- show_only = args[0][:show_only]
68
- singular_class = args[0][:singular_class]
69
- col_identifier = args[0][:col_identifier]
70
- ownership_field = args[0][:ownership_field]
59
+ @columns = args[0][:columns]
60
+ @show_only = args[0][:show_only]
61
+ @singular_class = args[0][:singular_class]
62
+ @col_identifier = args[0][:col_identifier]
63
+ @ownership_field = args[0][:ownership_field]
64
+ @form_labels_position = args[0][:form_labels_position]
65
+ @form_placeholder_labels = args[0][:form_placeholder_labels]
71
66
 
72
67
  @singular = args[0][:singular]
73
68
  singular = @singular
74
- result = layout_columns.map{ |column|
69
+ result = columns.map{ |column|
75
70
  " <div class='#{col_identifier}' >" +
76
71
  column.map { |col|
77
72
  field_result =
@@ -84,41 +79,11 @@ module HotGlue
84
79
 
85
80
  case type
86
81
  when :integer
87
- # look for a belongs_to on this object
88
- if col.to_s.ends_with?("_id")
89
- assoc_name = col.to_s.gsub("_id","")
90
- assoc = eval("#{singular_class}.reflect_on_association(:#{assoc_name})")
91
- if assoc.nil?
92
- exit_message = "*** Oops. on the #{singular_class} object, there doesn't seem to be an association called '#{assoc_name}'"
93
- exit
94
- end
95
-
96
- is_owner = col == ownership_field
97
- assoc_class_name = assoc.active_record.name
98
- display_column = HotGlue.derrive_reference_name(assoc_class_name)
99
-
100
- (is_owner ? "<% unless @#{assoc_name} %>\n" : "") +
101
- " <%= f.collection_select(:#{col}, #{assoc.class_name}.all, :id, :#{display_column}, {prompt: true, selected: @#{singular}.#{col} }, class: 'form-control') %>\n" +
102
- (is_owner ? "<% else %>\n <%= @#{assoc_name}.#{display_column} %>" : "") +
103
- (is_owner ? "\n<% end %>" : "")
104
-
105
- else
106
- "<%= f.text_field :#{col}, value: #{singular}.#{col}, class: 'form-control', size: 4, type: 'number' %>"
107
-
108
- end
82
+ integer_result(col)
109
83
  when :string
110
- if sql_type == "varchar" || sql_type == "character varying"
111
- field_output(col, nil, limit || 40, col_identifier)
112
- else
113
- text_area_output(col, 65536, col_identifier)
114
- end
115
-
84
+ string_result(col, sql_type, limit)
116
85
  when :text
117
- if sql_type == "varchar"
118
- field_output(col, nil, limit, col_identifier)
119
- else
120
- text_area_output(col, 65536, col_identifier)
121
- end
86
+ text_result(col, sql_type, limit)
122
87
  when :float
123
88
  field_output(col, nil, 5, col_identifier)
124
89
  when :datetime
@@ -128,18 +93,10 @@ module HotGlue
128
93
  when :time
129
94
  "<%= time_field_localized(f, :#{col}, #{singular}.#{col}, '#{ col.to_s.humanize }', #{@auth ? @auth+'.timezone' : 'nil'}) %>"
130
95
  when :boolean
131
- " " +
132
- " <span>#{col.to_s.humanize}</span>" +
133
- " <%= f.radio_button(:#{col}, '0', checked: #{singular}.#{col} ? '' : 'checked') %>\n" +
134
- " <%= f.label(:#{col}, value: 'No', for: '#{singular}_#{col}_0') %>\n" +
135
- " <%= f.radio_button(:#{col}, '1', checked: #{singular}.#{col} ? 'checked' : '') %>\n" +
136
- " <%= f.label(:#{col}, value: 'Yes', for: '#{singular}_#{col}_1') %>\n" +
137
- ""
96
+ boolean_result(col)
138
97
  when :enum
139
- enum_type = eval("#{singular_class}.columns.select{|x| x.name == '#{col}'}[0].sql_type")
140
- "<%= f.collection_select(:#{col}, enum_to_collection_select( #{singular_class}.defined_enums['#{enum_type}']), :key, :value, {selected: @#{singular}.#{col} }, class: 'form-control') %>"
98
+ enum_result(col)
141
99
  end
142
-
143
100
  end
144
101
 
145
102
  if (type == :integer) && col.to_s.ends_with?("_id")
@@ -148,16 +105,93 @@ module HotGlue
148
105
  field_error_name = col
149
106
  end
150
107
 
151
- add_spaces_each_line( "\n <span class='<%= \"alert-danger\" if #{singular}.errors.details.keys.include?(:#{field_error_name}) %>' #{ 'style="display: inherit;"'} >\n" +
152
- add_spaces_each_line(field_result + "\n<label class='small form-text text-muted'>#{col.to_s.humanize}</label>", 4) +
108
+ the_label = "\n<label class='small form-text text-muted'>#{col.to_s.humanize}</label>"
109
+ add_spaces_each_line( "\n <span class='<%= \"alert-danger\" if #{singular}.errors.details.keys.include?(:#{field_error_name}) %>' #{'style="display: inherit;"'} >\n" +
110
+ add_spaces_each_line( (@form_labels_position == 'before' ? the_label : "") +
111
+ field_result + (@form_labels_position == 'after' ? the_label : "") , 4) +
153
112
  "\n </span>\n <br />", 2)
154
113
 
114
+
155
115
  }.join("") + "\n </div>"
156
116
  }.join("\n")
157
117
  return result
158
118
  end
159
119
 
160
120
 
121
+ def integer_result(col)
122
+ # look for a belongs_to on this object
123
+ if col.to_s.ends_with?("_id")
124
+ assoc_name = col.to_s.gsub("_id","")
125
+ assoc = eval("#{singular_class}.reflect_on_association(:#{assoc_name})")
126
+ if assoc.nil?
127
+ exit_message = "*** Oops. on the #{singular_class} object, there doesn't seem to be an association called '#{assoc_name}'"
128
+ exit
129
+ end
130
+
131
+ is_owner = col == ownership_field
132
+ assoc_class_name = assoc.active_record.name
133
+ display_column = HotGlue.derrive_reference_name(assoc_class_name)
134
+
135
+ (is_owner ? "<% unless @#{assoc_name} %>\n" : "") +
136
+ " <%= f.collection_select(:#{col}, #{assoc.class_name}.all, :id, :#{display_column}, {prompt: true, selected: @#{singular}.#{col} }, class: 'form-control') %>\n" +
137
+ (is_owner ? "<% else %>\n <%= @#{assoc_name}.#{display_column} %>" : "") +
138
+ (is_owner ? "\n<% end %>" : "")
139
+
140
+ else
141
+ " <%= f.text_field :#{col}, value: #{@singular}.#{col}, autocomplete: 'off', size: 4, class: 'form-control', type: 'number'" + (@form_placeholder_labels ? ", placeholder: '#{col.to_s.humanize}'" : "") + " %>\n " + "\n"
142
+
143
+ # field_output(col, nil, 4, col_identifier)
144
+ #
145
+ # # "<%= f.text_field :#{col}, value: #{singular}.#{col}, class: 'form-control', size: 4, type: 'number' %>"
146
+
147
+ end
148
+ end
149
+
150
+ def string_result(col, sql_type, limit)
151
+ if sql_type == "varchar" || sql_type == "character varying"
152
+ field_output(col, nil, limit || 40, col_identifier)
153
+ else
154
+ text_area_output(col, 65536, col_identifier)
155
+ end
156
+ end
157
+
158
+
159
+ def text_result(col, sql_type, limit)
160
+ if sql_type == "varchar"
161
+ field_output(col, nil, limit, col_identifier)
162
+ else
163
+ text_area_output(col, 65536, col_identifier)
164
+ end
165
+ end
166
+
167
+ def field_output(col, type = nil, width, col_identifier )
168
+ " <%= f.text_field :#{col}, value: #{@singular}.#{col}, autocomplete: 'off', size: #{width}, class: 'form-control', type: '#{type}'" + (@form_placeholder_labels ? ", placeholder: '#{col.to_s.humanize}'" : "") + " %>\n " + "\n"
169
+ end
170
+
171
+ def text_area_output(col, field_length, col_identifier )
172
+ lines = field_length % 40
173
+ if lines > 5
174
+ lines = 5
175
+ end
176
+
177
+ "<%= f.text_area :#{col}, class: 'form-control', autocomplete: 'off', cols: 40, rows: '#{lines}'" + ( @form_placeholder_labels ? ", placeholder: '#{col.to_s.humanize}'" : "") + " %>"
178
+ end
179
+
180
+ def boolean_result(col)
181
+ " <br />" +
182
+ " <%= f.radio_button(:#{col}, '0', checked: #{singular}.#{col} ? '' : 'checked') %>\n" +
183
+ " <%= f.label(:#{col}, value: 'No', for: '#{singular}_#{col}_0') %>\n" +
184
+ " <%= f.radio_button(:#{col}, '1', checked: #{singular}.#{col} ? 'checked' : '') %>\n" +
185
+ " <%= f.label(:#{col}, value: 'Yes', for: '#{singular}_#{col}_1') %>\n" +
186
+ ""
187
+ end
188
+
189
+ def enum_result(col)
190
+ enum_type = eval("#{singular_class}.columns.select{|x| x.name == '#{col}'}[0].sql_type")
191
+ "<%= f.collection_select(:#{col}, enum_to_collection_select( #{singular_class}.defined_enums['#{enum_type}']), :key, :value, {selected: @#{singular}.#{col} }, class: 'form-control') %>"
192
+ end
193
+
194
+ ################################################################
161
195
 
162
196
  def paginate(*args)
163
197
  plural = args[0][:plural]
@@ -165,18 +199,24 @@ module HotGlue
165
199
  "<% if #{plural}.respond_to?(:total_pages) %><%= paginate(#{plural}) %> <% end %>"
166
200
  end
167
201
 
202
+
203
+
204
+
205
+ ################################################################
206
+
207
+
168
208
  def all_line_fields(*args)
169
- layout_columns = args[0][:columns]
170
- show_only = args[0][:show_only]
171
- singular_class = args[0][:singular_class]
172
- singular = args[0][:singular]
173
- perc_width = args[0][:perc_width]
174
- layout = args[0][:layout]
175
- col_identifier = args[0][:col_identifier] || (layout == "bootstrap" ? "col-md-2" : "scaffold-cell")
209
+ @columns = args[0][:columns]
210
+ @show_only = args[0][:show_only]
211
+ @singular_class = args[0][:singular_class]
212
+ @singular = args[0][:singular]
213
+ @perc_width = args[0][:perc_width]
214
+ @layout = args[0][:layout]
215
+ @col_identifier = args[0][:col_identifier] || (layout == "bootstrap" ? "col-md-2" : "scaffold-cell")
176
216
 
177
217
 
178
- columns_count = layout_columns.count + 1
179
- perc_width = (perc_width).floor
218
+ columns_count = columns.count + 1
219
+ perc_width = (@perc_width).floor
180
220
 
181
221
  if layout == "bootstrap"
182
222
  style_with_flex_basis = ""
@@ -184,7 +224,7 @@ module HotGlue
184
224
  style_with_flex_basis = " style='flex-basis: #{perc_width}%'"
185
225
  end
186
226
 
187
- result = layout_columns.map{ |column|
227
+ result = columns.map{ |column|
188
228
  "<div class='#{col_identifier}'#{style_with_flex_basis}>" +
189
229
 
190
230
 
@@ -97,7 +97,6 @@ module HotGlue
97
97
  class_option :nest, type: :string, default: nil # DEPRECATED —— DO NOT USE
98
98
  class_option :nested, type: :string, default: ""
99
99
 
100
-
101
100
  class_option :namespace, type: :string, default: nil
102
101
  class_option :auth, type: :string, default: nil
103
102
  class_option :auth_identifier, type: :string, default: nil
@@ -105,6 +104,7 @@ module HotGlue
105
104
  class_option :include, type: :string, default: ""
106
105
  class_option :god, type: :boolean, default: false
107
106
  class_option :gd, type: :boolean, default: false # alias for god
107
+
108
108
  class_option :specs_only, type: :boolean, default: false
109
109
  class_option :no_specs, type: :boolean, default: false
110
110
  class_option :no_delete, type: :boolean, default: false
@@ -116,24 +116,31 @@ module HotGlue
116
116
  class_option :show_only, type: :string, default: ""
117
117
 
118
118
  class_option :ujs_syntax, type: :boolean, default: nil
119
-
120
119
  class_option :downnest, type: :string, default: nil
121
120
  class_option :magic_buttons, type: :string, default: nil
122
121
  class_option :small_buttons, type: :boolean, default: nil
123
-
124
122
  class_option :display_list_after_update, type: :boolean, default: false
125
123
  class_option :smart_layout, type: :boolean, default: false
126
124
  class_option :markup, type: :string, default: nil # deprecated -- use in app config instead
127
125
  class_option :layout, type: :string, default: nil # if used here it will override what is in the config
128
- class_option :no_list_labels, type: :boolean, default: false
126
+
127
+ class_option :no_list_label, type: :boolean, default: false
128
+
129
129
  class_option :no_list_heading, type: :boolean, default: false
130
130
 
131
- class_option :before_list_labels, type: :boolean, default: false
131
+
132
+ # determines if the labels show up BEFORE or AFTER on the NEW/EDIT (form)
133
+ class_option :form_labels_position, default: 'after' # choices are before, after, omit
134
+ class_option :form_placeholder_labels, default: false # puts the field names into the placeholder labels
135
+
136
+
137
+ # NOT YET IMPLEMENTED
138
+ # determines if labels appear within the rows of the VIEWABLE list (does NOT affect the list heading)
139
+ # class_option :inline_list_labels, default: 'omit' # choices are before, after, omit
132
140
 
133
141
  def initialize(*meta_args)
134
142
  super
135
143
 
136
-
137
144
  begin
138
145
  @the_object = eval(class_name)
139
146
  rescue StandardError => e
@@ -165,7 +172,6 @@ module HotGlue
165
172
  if !options['markup'].nil?
166
173
  message = "Using --markup flag in the generator is deprecated; instead, use a file at config/hot_glue.yml with a key markup set to `erb` or `haml`"
167
174
  raise(HotGlue::Error, message)
168
-
169
175
  end
170
176
 
171
177
  if !options['markup'].nil?
@@ -264,9 +270,21 @@ module HotGlue
264
270
 
265
271
  @no_edit = options['no_edit'] || false
266
272
  @no_list = options['no_list'] || false
267
- @no_list_labels = options['no_list_labels'] || false
273
+ @no_list_label = options['no_list_label'] || false
268
274
  @no_list_heading = options['no_list_heading'] || false
269
275
 
276
+ @form_labels_position = options['form_labels_position']
277
+ if !['before','after','omit'].include?(@form_labels_position)
278
+ raise "You passed '#{@form_labels_position}' as the setting for --form-labels-position but the only allowed options are before, after (default), and omit"
279
+ end
280
+
281
+ @form_placeholder_labels = options['form_placeholder_labels'] # true or false
282
+
283
+
284
+ # if !['before','after','omit'].include?(@form_placeholder_labels)
285
+ # raise "You passed '#{@form_placeholder_labels}' as the setting for --form-placeholder-labels but the only allowed options are before, after, and omit (default)"
286
+ # end
287
+
270
288
  @display_list_after_update = options['display_list_after_update'] || false
271
289
  @smart_layout = options['smart_layout']
272
290
 
@@ -915,7 +933,9 @@ module HotGlue
915
933
  singular_class: singular_class,
916
934
  singular: singular,
917
935
  col_identifier: col_identifier,
918
- ownership_field: @ownership_field
936
+ ownership_field: @ownership_field,
937
+ form_labels_position: @form_labels_position,
938
+ form_placeholder_labels: @form_placeholder_labels
919
939
  )
920
940
  end
921
941
 
@@ -40,24 +40,29 @@ class <%= controller_class_name %> < <%= controller_descends_from %>
40
40
  @<%= @nested_set[0][:singular] %> ||= <%= root_object %> <% else %>
41
41
  @<%= @nested_set[0][:singular] %> ||= <%= root_object %>.find(params[:<%= @nested_set[0][:singular] %>_id])<%= " if params.include?(:#{@nested_set[0][:singular]}_id)" if @nested_set[0][:optional] %> <% end %>
42
42
  end
43
- <% end %><% if any_nested? %><% nest_chain = [@nested_set[0][:singular]]; this_scope = @nested_set[0][:plural]; %> <% @nested_set[1..-1].each_with_index { |arg,index|
44
- this_scope = "#{nest_chain.last}.#{arg[:plural]}"
45
- nest_chain << arg %>
43
+ <% end %><% if any_nested? %><% nest_chain = [@nested_set[0][:singular]]; this_scope = @nested_set[0][:plural]; %>
44
+ <% for index in 0..(@nested_set.count - 1) do
45
+ arg = @nested_set[index]
46
+ last_arg = (index == 0 ? nil : @nested_set[index-1])
47
+
48
+ this_scope = "#{nest_chain.last}.#{arg[:plural]}"
49
+ nest_chain << arg %>
46
50
  def <%= arg[:singular] %>
47
- @<%= arg[:singular] %> ||= (<%= this_scope %>.find(params[:<%= arg[:singular] %>_id])<%= " if params.include?(:#{@nested_set[index][:singular]}_id)" if @god && arg[:optional] %>)<% if @god && arg[:optional] %> || (<%= collect_objects[index] %>.find(params[:<%= arg[:singular] %>_id]) if params.include?(:<%= arg[:singular] %>_id) ) <% end %>
48
- end<% } %> <% end %> <% if !@self_auth %>
51
+ @<%= arg[:singular] %> ||= (<%= this_scope %>.find(params[:<%= arg[:singular] %>_id])<%= " if params.include?(:#{last_arg[:singular]}_id)" if last_arg && @god && last_arg[:optional] %>)
52
+ <% if @god && (last_arg[:optional] ) %>@<%= arg[:singular] %> ||= (<%= collect_objects[index-1] %>.find(params[:<%= arg[:singular] %>_id]) if params.include?(:<%= arg[:singular] %>_id) ) <% end %>
53
+ end<% end %> <% end %> <% if !@self_auth %>
49
54
 
50
55
  def load_<%= singular_name %>
51
56
  @<%= singular_name %> = (<%= object_scope.gsub("@",'') %>.find(params[:id])<%= " if params.include?(:#{@nested_set.last[:singular]}_id)" if @nested_set[0] && @nested_set[0][:optional] %>)<% if @nested_set[0] && @nested_set[0][:optional] %> || <%= class_name %>.find(params[:id])<% end %>
52
57
  end
53
58
  <% else %>
54
59
  def load_<%= singular_name %>
55
- @<%= singular_name %> = (<%= auth_object.gsub("@",'') %><%= " if params.include?(:#{@nested_set[0][:singular]}_id)" if @nested_set[0][:optional] %>)<% if @nested_set[0][:optional] %> || <%= class_name %>.find(params[:id])<% end %>
60
+ @<%= singular_name %> = (<%= auth_object.gsub("@",'') %><%= " if params.include?(:#{@nested_set[0][:singular]}_id)" if @nested_set.any? && @nested_set[0][:optional] %>)<% if @nested_set.any? && @nested_set[0][:optional] %> || <%= class_name %>.find(params[:id])<% end %>
56
61
  end<% end %>
57
62
 
58
63
  def load_all_<%= plural %> <% if !@self_auth %>
59
- @<%= plural_name %> = ( <%= object_scope.gsub("@",'') %>.page(params[:page])<%= n_plus_one_includes %><%= " if params.include?(:#{ @nested_set.last[:singular]}_id)" if @nested_set[0] && @nested_set[0][:optional] %>) <% if @nested_set[0] && @nested_set[0][:optional] %> || <%= class_name %>.all<% end %> <% else %>
60
- @<%= plural_name %> = <%= class_name %>.where(id: <%= auth_object.gsub("@",'') %>.id)<%= n_plus_one_includes %> # returns iterable even though this <%= singular_name %> is anly allowed access to themselves<% end %>
64
+ @<%= plural_name %> = ( <%= object_scope.gsub("@",'') %>.page(params[:page])<%= n_plus_one_includes %><%= " if params.include?(:#{ @nested_set.last[:singular]}_id)" if @nested_set.any? && @nested_set[0] && @nested_set[0][:optional] %>) <% if @nested_set[0] && @nested_set[0][:optional] %> || <%= class_name %>.all<% end %> <% else %>
65
+ @<%= plural_name %> = <%= class_name %>.where(id: <%= auth_object.gsub("@",'') %>.id)<%= n_plus_one_includes %> # returns iterable even though this <%= singular_name %> is only allowed access to themselves<% end %>
61
66
  end
62
67
 
63
68
  def index
@@ -1,6 +1,6 @@
1
1
  <\%= turbo_frame_tag "<%= plural %>-list" <%= nested_for_turbo_id_list_constructor %> do %>
2
2
  <div class="<%= @container_name %> scaffold-list">
3
- <% unless @no_list || @no_list_heading || (@nested_set.any? && !@nested_set.collect{|x| x[:optional]}.any?) %>
3
+ <% unless @no_list || @no_list_label || (@nested_set.any? && !@nested_set.collect{|x| x[:optional]}.any?) %>
4
4
  <% unless list_label.nil? %><h4>
5
5
  <%= list_label %>
6
6
  </h4><% end %>
@@ -9,7 +9,7 @@
9
9
  <% unless @no_create %><%= '<%= render partial: "' + ((@namespace+"/" if @namespace) || "") + @controller_build_folder + '/new_button", locals: {}' + @nested_set.collect{|arg| ".merge(defined?(#{arg[:singular]}) ? {#{arg[:singular]}: #{arg[:singular]}} : {})"}.join() + ' %\>'.gsub('\\',"") %><br /><% end %>
10
10
 
11
11
  <% unless @no_list %>
12
- <% unless @no_list_labels %>
12
+ <% unless @no_list_heading %>
13
13
  <div class="row scaffold-heading-row">
14
14
  <%= list_column_headings %>
15
15
  <% if @downnest_object.any? %>
@@ -1,5 +1,5 @@
1
1
  module HotGlue
2
2
  class Version
3
- CURRENT = '0.4.9'
3
+ CURRENT = '0.5.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hot-glue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.9
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Fleetwood-Boldt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-14 00:00:00.000000000 Z
11
+ date: 2022-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -85,7 +85,6 @@ files:
85
85
  - lib/generators/hot_glue/scaffold_generator.rb
86
86
  - lib/generators/hot_glue/templates/base_controller.rb.erb
87
87
  - lib/generators/hot_glue/templates/capybara_login.rb
88
- - lib/generators/hot_glue/templates/confirmable.js
89
88
  - lib/generators/hot_glue/templates/controller.rb.erb
90
89
  - lib/generators/hot_glue/templates/erb/_errors.erb
91
90
  - lib/generators/hot_glue/templates/erb/_flash_notices.erb
@@ -1,14 +0,0 @@
1
- import { Controller } from "@hotwired/stimulus"
2
-
3
- console.log("defining Confirmable....")
4
- export default class extends Controller {
5
- static values = { message: String }
6
-
7
- confirm(event) {
8
-
9
- if(!window.confirm(this.message)) {
10
- event.preventDefault();
11
- event.stopPropagation()
12
- }
13
- }
14
- }