super 0.0.14 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/app/assets/javascripts/super/application.js +148 -15
  4. data/app/assets/stylesheets/super/application.css +15 -22
  5. data/app/controllers/super/application_controller.rb +44 -42
  6. data/app/controllers/super/substructure_controller.rb +313 -0
  7. data/app/helpers/super/form_builder_helper.rb +7 -0
  8. data/app/views/layouts/super/application.html.erb +3 -21
  9. data/app/views/super/application/_collection_header.html.erb +2 -2
  10. data/app/views/super/application/_display_actions.html.erb +1 -1
  11. data/app/views/super/application/_display_index.html.erb +2 -2
  12. data/app/views/super/application/_display_show.html.erb +1 -1
  13. data/app/views/super/application/_filter.html.erb +62 -2
  14. data/app/views/super/application/_form_field.html.erb +5 -0
  15. data/app/views/super/application/_member_header.html.erb +2 -2
  16. data/app/views/super/application/_pagination.html.erb +1 -1
  17. data/app/views/super/application/_site_footer.html.erb +3 -0
  18. data/app/views/super/application/_site_header.html.erb +17 -0
  19. data/app/views/super/application/_sort_expression.html.erb +2 -2
  20. data/app/views/super/application/index.csv.erb +14 -0
  21. data/app/views/super/feather/README.md +0 -1
  22. data/frontend/super-frontend/dist/application.css +15 -22
  23. data/frontend/super-frontend/dist/application.js +148 -15
  24. data/lib/generators/super/install/install_generator.rb +0 -16
  25. data/lib/generators/super/install/templates/base_controller.rb.tt +0 -8
  26. data/lib/generators/super/resource/templates/resources_controller.rb.tt +4 -4
  27. data/lib/super/action_inquirer.rb +18 -3
  28. data/lib/super/badge.rb +60 -0
  29. data/lib/super/cheat.rb +6 -6
  30. data/lib/super/display/guesser.rb +1 -1
  31. data/lib/super/display/schema_types.rb +49 -1
  32. data/lib/super/display.rb +2 -1
  33. data/lib/super/error.rb +3 -0
  34. data/lib/super/filter/form_object.rb +74 -48
  35. data/lib/super/filter/guesser.rb +2 -0
  36. data/lib/super/filter/operator.rb +90 -64
  37. data/lib/super/filter/schema_types.rb +63 -80
  38. data/lib/super/filter.rb +1 -1
  39. data/lib/super/form/builder.rb +30 -39
  40. data/lib/super/form/field_transcript.rb +43 -0
  41. data/lib/super/form/guesser.rb +4 -4
  42. data/lib/super/form/schema_types.rb +66 -22
  43. data/lib/super/link.rb +2 -2
  44. data/lib/super/pagination.rb +2 -44
  45. data/lib/super/reset.rb +25 -0
  46. data/lib/super/schema.rb +4 -0
  47. data/lib/super/useful/builder.rb +4 -4
  48. data/lib/super/version.rb +1 -1
  49. data/lib/super.rb +3 -1
  50. data/lib/tasks/super/cheat.rake +1 -1
  51. metadata +25 -19
  52. data/app/views/super/application/_filter_type_select.html.erb +0 -21
  53. data/app/views/super/application/_filter_type_text.html.erb +0 -18
  54. data/app/views/super/application/_filter_type_timestamp.html.erb +0 -24
  55. data/app/views/super/application/_form_field_checkbox.html.erb +0 -1
  56. data/app/views/super/application/_form_field_flatpickr_date.html.erb +0 -8
  57. data/app/views/super/application/_form_field_flatpickr_datetime.html.erb +0 -8
  58. data/app/views/super/application/_form_field_flatpickr_time.html.erb +0 -8
  59. data/app/views/super/application/_form_field_rich_text_area.html.erb +0 -1
  60. data/app/views/super/application/_form_field_select.html.erb +0 -1
  61. data/app/views/super/application/_form_field_text.html.erb +0 -1
  62. data/app/views/super/feather/_chevron_down.html +0 -1
  63. data/docs/cheat.md +0 -41
  64. data/lib/super/controls/optional.rb +0 -113
  65. data/lib/super/controls/steps.rb +0 -106
  66. data/lib/super/controls/view.rb +0 -55
  67. data/lib/super/controls.rb +0 -22
@@ -0,0 +1,5 @@
1
+ <% if form_field.super_builder %>
2
+ <%= form.super.public_send(form_field.method_name, column, *form_field.args, **form_field.kwargs) %>
3
+ <% else %>
4
+ <%= form.public_send(form_field.method_name, column, *form_field.args, **form_field.kwargs) %>
5
+ <% end %>
@@ -1,9 +1,9 @@
1
1
  <header class="flex justify-between content-end">
2
2
  <h1 class="text-xl">
3
- <%= controls.title %>
3
+ <%= title %>
4
4
  </h1>
5
5
  <div>
6
- <% controls.member_actions(action: action_inquirer).each do |link| %>
6
+ <% member_actions(@record).each do |link| %>
7
7
  <%= link.to_s(
8
8
  default_options: {
9
9
  class: "super-button super-button--border-blue super-button-sm inline-block ml-2"
@@ -5,7 +5,7 @@
5
5
  <%= link_to(
6
6
  display,
7
7
  polymorphic_path(
8
- Super::Link.polymorphic_parts(controls.model),
8
+ Super::Link.polymorphic_parts(model),
9
9
  page_query_params
10
10
  ),
11
11
  class: "inline-block ml-2 text-lg #{is_current_page ? " text-gray-900" : ""}"
@@ -0,0 +1,3 @@
1
+ <div class="pt-8 text-sm text-gray-800">
2
+ <%= t("super.layout.powered_by", env: Rails.env.capitalize, version: Super::VERSION) %>
3
+ </div>
@@ -0,0 +1,17 @@
1
+ <header class="pt-4">
2
+ <h1 class="text-lg font-bold mr-6 mb-1"><%= site_title %></h1>
3
+ <% site_navigation.definition.each do |link_or_menu| %>
4
+ <% if link_or_menu.is_a?(Super::Link) %>
5
+ <%= link_or_menu.to_s(default_options: { class: "inline-block mr-6" }) %>
6
+ <% else %>
7
+ <details class="details-reset select-none inline-block mr-6" data-controller="click-outside-to-close" data-action="click@window->click-outside-to-close#close">
8
+ <summary class="text-blue-700"><%= link_or_menu.title %></summary>
9
+ <ul class="absolute bg-white shadow-md px-4 py-3">
10
+ <% link_or_menu.links.each do |link| %>
11
+ <li><%= link.to_s(default_options: { class: "" }) %></li>
12
+ <% end %>
13
+ </ul>
14
+ </details>
15
+ <% end %>
16
+ <% end %>
17
+ </header>
@@ -5,7 +5,7 @@
5
5
  :a,
6
6
  sort.sortable_columns,
7
7
  {},
8
- {}
8
+ { class: "w-full" }
9
9
  ) %>
10
10
  </div>
11
11
  <div class="flex-none w-2">
@@ -15,7 +15,7 @@
15
15
  :d,
16
16
  sort.class::DIRECTIONS,
17
17
  { include_blank: false },
18
- {}
18
+ { class: "w-full" }
19
19
  ) %>
20
20
  </div>
21
21
  <div class="flex-none pl-2">
@@ -0,0 +1,14 @@
1
+ <%=
2
+ attribute_names = @display.each_attribute_name.to_a
3
+
4
+ CSV
5
+ .generate(write_headers: true, headers: attribute_names) do |csv|
6
+ @records.each do |record|
7
+ row = attribute_names.map do |attribute_name|
8
+ @display.render_attribute(template: self, record: record, column: attribute_name)
9
+ end
10
+ csv << row
11
+ end
12
+ end
13
+ .html_safe
14
+ -%>
@@ -2,7 +2,6 @@
2
2
 
3
3
  Vendored from: https://github.com/feathericons/feather
4
4
 
5
- * `icons/chevron-down.svg` @ `3c64e93543fab6befab54c3abd013dd8db52509e`
6
5
  * `icons/x.svg` @ `a718a7e9c39447202f703783336e8ba1c8e32405`
7
6
 
8
7
 
@@ -1,6 +1,6 @@
1
- /*! tailwindcss v2.1.1 | MIT License | https://tailwindcss.com */
1
+ /*! tailwindcss v2.1.2 | MIT License | https://tailwindcss.com */
2
2
 
3
- /*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */
3
+ /*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */
4
4
 
5
5
  /*
6
6
  Document
@@ -12,8 +12,8 @@ Use a better box model (opinionated).
12
12
  */
13
13
 
14
14
  *,
15
- *::before,
16
- *::after {
15
+ ::before,
16
+ ::after {
17
17
  box-sizing: border-box;
18
18
  }
19
19
 
@@ -21,7 +21,7 @@ Use a better box model (opinionated).
21
21
  Use a more readable tab size (opinionated).
22
22
  */
23
23
 
24
- :root {
24
+ html {
25
25
  -moz-tab-size: 4;
26
26
  -o-tab-size: 4;
27
27
  tab-size: 4;
@@ -1475,28 +1475,21 @@ span.flatpickr-day.selected {
1475
1475
  .super-input:focus {
1476
1476
  --tw-border-opacity: 1;
1477
1477
  border-color: rgba(99, 179, 237, var(--tw-border-opacity));
1478
+ outline: 2px solid transparent;
1479
+ outline-offset: 2px;
1478
1480
  }
1479
1481
 
1480
- .super-input-select {
1481
- position: relative;
1482
+ .super-input:disabled {
1483
+ opacity: 0.5;
1484
+ --tw-bg-opacity: 1;
1485
+ background-color: rgba(247, 250, 252, var(--tw-bg-opacity));
1482
1486
  }
1483
1487
 
1484
- .super-input-select-field {
1488
+ .super-input-select {
1485
1489
  padding-right: 2rem;
1486
- width: 100%;
1487
- }
1488
-
1489
- .super-input-select-icon {
1490
- pointer-events: none;
1491
- position: absolute;
1492
- top: 0px;
1493
- bottom: 0px;
1494
- right: 0px;
1495
- display: flex;
1496
- align-items: center;
1497
- padding-left: 0.5rem;
1498
- padding-right: 0.5rem;
1499
- fill: currentColor;
1490
+ background-repeat: no-repeat;
1491
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232b6cb0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E %3Cpolyline points='6 9 12 15 18 9'/%3E %3C/svg%3E");
1492
+ background-position: right 0.5rem center;
1500
1493
  }
1501
1494
 
1502
1495
  .super-button {
@@ -237,7 +237,7 @@ var Super = (function (exports) {
237
237
 
238
238
  /*
239
239
  Unobtrusive JavaScript
240
- https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts
240
+ https://github.com/rails/rails/blob/main/actionview/app/assets/javascripts
241
241
  Released under the MIT license
242
242
  */
243
243
  createCommonjsModule(function (module) {
@@ -413,7 +413,7 @@ var Super = (function (exports) {
413
413
  }).call(this);
414
414
  (function () {
415
415
  var AcceptHeaders, CSRFProtection, createXHR, cspNonce, prepareOptions, processResponse;
416
- cspNonce = Rails.cspNonce, CSRFProtection = Rails.CSRFProtection, Rails.fire;
416
+ cspNonce = Rails.cspNonce, CSRFProtection = Rails.CSRFProtection;
417
417
  AcceptHeaders = {
418
418
  '*': '*/*',
419
419
  text: 'text/plain',
@@ -489,9 +489,9 @@ var Super = (function (exports) {
489
489
 
490
490
  if (!options.crossDomain) {
491
491
  xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
492
+ CSRFProtection(xhr);
492
493
  }
493
494
 
494
- CSRFProtection(xhr);
495
495
  xhr.withCredentials = !!options.withCredentials;
496
496
 
497
497
  xhr.onreadystatechange = function () {
@@ -3975,7 +3975,7 @@ var Super = (function (exports) {
3975
3975
  };
3976
3976
  }
3977
3977
 
3978
- var _default$6 = /*#__PURE__*/function (_Controller) {
3978
+ var _default$8 = /*#__PURE__*/function (_Controller) {
3979
3979
  _inherits(_default, _Controller);
3980
3980
 
3981
3981
  var _super = _createSuper(_default);
@@ -4004,7 +4004,7 @@ var Super = (function (exports) {
4004
4004
  return _default;
4005
4005
  }(Controller);
4006
4006
 
4007
- var _default$5 = /*#__PURE__*/function (_Controller) {
4007
+ var _default$7 = /*#__PURE__*/function (_Controller) {
4008
4008
  _inherits(_default, _Controller);
4009
4009
 
4010
4010
  var _super = _createSuper(_default);
@@ -4040,7 +4040,7 @@ var Super = (function (exports) {
4040
4040
  return _default;
4041
4041
  }(Controller);
4042
4042
 
4043
- var _default$4 = /*#__PURE__*/function (_Controller) {
4043
+ var _default$6 = /*#__PURE__*/function (_Controller) {
4044
4044
  _inherits(_default, _Controller);
4045
4045
 
4046
4046
  var _super = _createSuper(_default);
@@ -4064,7 +4064,7 @@ var Super = (function (exports) {
4064
4064
  return _default;
4065
4065
  }(Controller);
4066
4066
 
4067
- var _default$3 = /*#__PURE__*/function (_Controller) {
4067
+ var _default$5 = /*#__PURE__*/function (_Controller) {
4068
4068
  _inherits(_default, _Controller);
4069
4069
 
4070
4070
  var _super = _createSuper(_default);
@@ -4094,7 +4094,7 @@ var Super = (function (exports) {
4094
4094
  return _default;
4095
4095
  }(Controller);
4096
4096
 
4097
- var _default$2 = /*#__PURE__*/function (_Controller) {
4097
+ var _default$4 = /*#__PURE__*/function (_Controller) {
4098
4098
  _inherits(_default, _Controller);
4099
4099
 
4100
4100
  var _super = _createSuper(_default);
@@ -6354,7 +6354,7 @@ var Super = (function (exports) {
6354
6354
  window.flatpickr = flatpickr;
6355
6355
  }
6356
6356
 
6357
- var _default$1 = /*#__PURE__*/function (_Controller) {
6357
+ var _default$3 = /*#__PURE__*/function (_Controller) {
6358
6358
  _inherits(_default, _Controller);
6359
6359
 
6360
6360
  var _super = _createSuper(_default);
@@ -6382,6 +6382,137 @@ var Super = (function (exports) {
6382
6382
  return _default;
6383
6383
  }(Controller);
6384
6384
 
6385
+ var _default$2 = /*#__PURE__*/function (_Controller) {
6386
+ _inherits(_default, _Controller);
6387
+
6388
+ var _super = _createSuper(_default);
6389
+
6390
+ function _default() {
6391
+ _classCallCheck(this, _default);
6392
+
6393
+ return _super.apply(this, arguments);
6394
+ }
6395
+
6396
+ _createClass(_default, [{
6397
+ key: "connect",
6398
+ value: function connect() {
6399
+ var _this = this;
6400
+
6401
+ this.tabTargets.forEach(function (tab) {
6402
+ tab.tabContainer = _this;
6403
+ });
6404
+ }
6405
+ }, {
6406
+ key: "activeTabIdentifier",
6407
+ get: function get() {
6408
+ return this.controlTarget.value;
6409
+ }
6410
+ }, {
6411
+ key: "change",
6412
+ value: function change(event) {
6413
+ this.update(event.target.value);
6414
+ }
6415
+ }, {
6416
+ key: "update",
6417
+ value: function update(newActiveTabIdentifier) {
6418
+ var _this2 = this;
6419
+
6420
+ this.tabTargets.forEach(function (tab) {
6421
+ var tabController = _this2.application.getControllerForElementAndIdentifier(tab, _this2.tabControllerNameValue);
6422
+
6423
+ if (tab.dataset[_this2.tabIdentifierGetterValue] == newActiveTabIdentifier) {
6424
+ tabController.show();
6425
+ } else {
6426
+ tabController.hide();
6427
+ }
6428
+ });
6429
+ }
6430
+ }], [{
6431
+ key: "targets",
6432
+ get: function get() {
6433
+ return ["control", "tab"];
6434
+ }
6435
+ }, {
6436
+ key: "values",
6437
+ get: function get() {
6438
+ return {
6439
+ tabIdentifierGetter: String,
6440
+ tabControllerName: String
6441
+ };
6442
+ }
6443
+ }]);
6444
+
6445
+ return _default;
6446
+ }(Controller);
6447
+
6448
+ var _default$1 = /*#__PURE__*/function (_Controller) {
6449
+ _inherits(_default, _Controller);
6450
+
6451
+ var _super = _createSuper(_default);
6452
+
6453
+ function _default() {
6454
+ _classCallCheck(this, _default);
6455
+
6456
+ return _super.apply(this, arguments);
6457
+ }
6458
+
6459
+ _createClass(_default, [{
6460
+ key: "connect",
6461
+ value: function connect() {
6462
+ var tabContainer = this.element[this.tabContainerGetterValue];
6463
+
6464
+ if (tabContainer.activeTabIdentifier === this.identifierValue) {
6465
+ this.show();
6466
+ } else {
6467
+ this.hide();
6468
+ }
6469
+ }
6470
+ }, {
6471
+ key: "toggle",
6472
+ value: function toggle() {
6473
+ if (this.hasContentTarget) {
6474
+ this.hide();
6475
+ } else {
6476
+ this.show();
6477
+ }
6478
+ }
6479
+ }, {
6480
+ key: "show",
6481
+ value: function show() {
6482
+ if (this.hasContentTarget) {
6483
+ return;
6484
+ }
6485
+
6486
+ var pocketContent = this.pocketTarget.content.cloneNode(true);
6487
+ this.element.appendChild(pocketContent);
6488
+ }
6489
+ }, {
6490
+ key: "hide",
6491
+ value: function hide() {
6492
+ if (!this.hasContentTarget) {
6493
+ return;
6494
+ }
6495
+
6496
+ this.contentTarget.remove();
6497
+ }
6498
+ }], [{
6499
+ key: "targets",
6500
+ get: function get() {
6501
+ return ["pocket", "content"];
6502
+ }
6503
+ }, {
6504
+ key: "values",
6505
+ get: function get() {
6506
+ return {
6507
+ identifier: String,
6508
+ tabContainerGetter: String
6509
+ };
6510
+ }
6511
+ }]);
6512
+
6513
+ return _default;
6514
+ }(Controller);
6515
+
6385
6516
  var _default = /*#__PURE__*/function (_Controller) {
6386
6517
  _inherits(_default, _Controller);
6387
6518
 
@@ -6412,12 +6543,14 @@ var Super = (function (exports) {
6412
6543
  }(Controller);
6413
6544
 
6414
6545
  var StimulusApplication = Application.start();
6415
- StimulusApplication.register("apply-template", _default$6);
6416
- StimulusApplication.register("clean-filter-param", _default$5);
6417
- StimulusApplication.register("clean-filter-params", _default$4);
6418
- StimulusApplication.register("click-outside-to-close", _default$3);
6419
- StimulusApplication.register("delete", _default$2);
6420
- StimulusApplication.register("flatpickr", _default$1);
6546
+ StimulusApplication.register("apply-template", _default$8);
6547
+ StimulusApplication.register("clean-filter-param", _default$7);
6548
+ StimulusApplication.register("clean-filter-params", _default$6);
6549
+ StimulusApplication.register("click-outside-to-close", _default$5);
6550
+ StimulusApplication.register("delete", _default$4);
6551
+ StimulusApplication.register("flatpickr", _default$3);
6552
+ StimulusApplication.register("tab-container", _default$2);
6553
+ StimulusApplication.register("tab", _default$1);
6421
6554
  StimulusApplication.register("toggle-pending-destruction", _default);
6422
6555
 
6423
6556
  exports.StimulusApplication = StimulusApplication;
@@ -36,22 +36,6 @@ module Super
36
36
  create_file("app/controllers/#{controller_namespace}/.keep", "")
37
37
  end
38
38
 
39
- def copy_cheatsheet
40
- super_path = Pathname.new(Gem.loaded_specs["super"].full_gem_path).expand_path
41
- super_cheat_path = super_path.join("docs", "cheat.md")
42
-
43
- path =
44
- if options["controller_namespace"].present?
45
- "app/controllers/#{controller_namespace}/README.md"
46
- else
47
- "app/controllers/README.md"
48
- end
49
-
50
- create_file(path) do
51
- super_cheat_path.read.sub(%r{<!--.*?-->}m, "").strip + "\n"
52
- end
53
- end
54
-
55
39
  def setup_sprockets4_manifest
56
40
  append_to_file "app/assets/config/manifest.js", "//= link super_manifest.js\n"
57
41
  end
@@ -1,10 +1,2 @@
1
1
  class <%= parent_controller_name.classify %>Controller < Super::ApplicationController
2
- class <%= parent_controller_name.classify.demodulize %>Controls < Super::Controls
3
- end
4
-
5
- private
6
-
7
- def new_controls
8
- self.class::Controls.new
9
- end
10
2
  end
@@ -1,9 +1,9 @@
1
1
  <% module_namespacing do -%>
2
2
  class <%= controller_class_name %>Controller < <%= parent_controller_name.classify %>Controller
3
- class Controls < <%= parent_controller_name.classify.demodulize %>Controls
4
- def model
5
- <%= class_name %>
6
- end
3
+ private
4
+
5
+ def model
6
+ <%= class_name %>
7
7
  end
8
8
  end
9
9
  <% end -%>