administrate 0.20.1 → 1.0.0

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.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +9 -9
  3. data/app/assets/builds/administrate/application.css +2614 -0
  4. data/app/assets/builds/administrate/application.css.map +1 -0
  5. data/app/assets/builds/administrate/application.js +31661 -0
  6. data/app/assets/builds/administrate/application.js.map +7 -0
  7. data/app/assets/builds/administrate-internal/docs.css +102 -0
  8. data/app/assets/builds/administrate-internal/docs.css.map +1 -0
  9. data/app/assets/config/administrate_manifest.js +2 -0
  10. data/app/assets/javascripts/administrate/add_jquery.js +4 -0
  11. data/app/assets/javascripts/administrate/application.js +9 -4
  12. data/app/assets/javascripts/administrate/controllers/application.js +9 -0
  13. data/app/assets/javascripts/administrate/controllers/index.js +9 -0
  14. data/app/assets/javascripts/administrate/controllers/select_controller.js +25 -0
  15. data/app/assets/javascripts/administrate/{components/table.js → controllers/table_controller.js} +9 -9
  16. data/app/assets/javascripts/administrate/controllers/tooltip_controller.js +24 -0
  17. data/app/assets/javascripts/administrate/vendor/css-anchor-positioning.js +9310 -0
  18. data/app/assets/stylesheets/administrate/application.scss +3 -3
  19. data/app/assets/stylesheets/administrate/base/_forms.scss +4 -4
  20. data/app/assets/stylesheets/administrate/base/_layout.scss +5 -0
  21. data/app/assets/stylesheets/administrate/base/_tables.scss +1 -1
  22. data/app/assets/stylesheets/administrate/base/_typography.scss +15 -1
  23. data/app/assets/stylesheets/administrate/components/_attributes.scss +1 -0
  24. data/app/assets/stylesheets/administrate/components/_buttons.scss +37 -12
  25. data/app/assets/stylesheets/administrate/components/_cells.scss +26 -19
  26. data/app/assets/stylesheets/administrate/components/_field-unit.scss +3 -3
  27. data/app/assets/stylesheets/administrate/components/_main-content.scss +1 -1
  28. data/app/assets/stylesheets/administrate/components/_navigation.scss +3 -3
  29. data/app/assets/stylesheets/administrate/components/_search.scss +55 -14
  30. data/app/assets/stylesheets/administrate/library/_variables.scss +7 -3
  31. data/app/assets/stylesheets/administrate/reset/_normalize.scss +7 -1
  32. data/app/assets/stylesheets/{docs.scss → administrate-internal/docs.scss} +25 -23
  33. data/app/controllers/administrate/application_controller.rb +27 -39
  34. data/app/controllers/concerns/administrate/punditize.rb +4 -12
  35. data/app/helpers/administrate/application_helper.rb +13 -5
  36. data/app/views/administrate/application/_collection.html.erb +30 -20
  37. data/app/views/administrate/application/_collection_header_actions.html.erb +1 -1
  38. data/app/views/administrate/application/_collection_item_actions.html.erb +4 -4
  39. data/app/views/administrate/application/_form.html.erb +1 -1
  40. data/app/views/administrate/application/_icons.html.erb +14 -6
  41. data/app/views/administrate/application/_index_header.html.erb +23 -0
  42. data/app/views/administrate/application/_javascript.html.erb +1 -1
  43. data/app/views/administrate/application/edit.html.erb +15 -3
  44. data/app/views/administrate/application/index.html.erb +20 -11
  45. data/app/views/administrate/application/new.html.erb +16 -4
  46. data/app/views/administrate/application/show.html.erb +35 -23
  47. data/app/views/fields/belongs_to/_form.html.erb +3 -2
  48. data/app/views/fields/has_many/_form.html.erb +2 -2
  49. data/app/views/fields/has_one/_form.html.erb +6 -0
  50. data/app/views/fields/polymorphic/_form.html.erb +1 -1
  51. data/app/views/fields/rich_text/_form.html.erb +22 -0
  52. data/app/views/fields/rich_text/_index.html.erb +18 -0
  53. data/app/views/fields/rich_text/_show.html.erb +18 -0
  54. data/app/views/fields/select/_form.html.erb +2 -1
  55. data/app/views/fields/text/_form.html.erb +1 -1
  56. data/app/views/layouts/administrate/application.html.erb +1 -2
  57. data/docs/customizing_dashboards.md +214 -11
  58. data/docs/customizing_page_views.md +47 -0
  59. data/docs/guides/scoping_has_many_relations.md +2 -2
  60. data/docs/guides/switching_templates_with_view_variants.md +45 -0
  61. data/docs/guides.md +1 -0
  62. data/docs/migrating-to-v1.md +34 -0
  63. data/lib/administrate/base_dashboard.rb +6 -11
  64. data/lib/administrate/engine.rb +7 -6
  65. data/lib/administrate/field/associative.rb +8 -23
  66. data/lib/administrate/field/base.rb +40 -5
  67. data/lib/administrate/field/belongs_to.rb +8 -8
  68. data/lib/administrate/field/date.rb +6 -2
  69. data/lib/administrate/field/date_time.rb +3 -4
  70. data/lib/administrate/field/deferred.rb +14 -18
  71. data/lib/administrate/field/has_many.rb +25 -6
  72. data/lib/administrate/field/has_one.rb +11 -15
  73. data/lib/administrate/field/number.rb +2 -2
  74. data/lib/administrate/field/password.rb +4 -0
  75. data/lib/administrate/field/polymorphic.rb +4 -4
  76. data/lib/administrate/field/rich_text.rb +21 -0
  77. data/lib/administrate/field/select.rb +4 -0
  78. data/lib/administrate/field/time.rb +5 -4
  79. data/lib/administrate/generator_helpers.rb +1 -1
  80. data/lib/administrate/namespace/resource.rb +1 -1
  81. data/lib/administrate/namespace.rb +10 -10
  82. data/lib/administrate/order.rb +37 -33
  83. data/lib/administrate/page/base.rb +2 -7
  84. data/lib/administrate/page/collection.rb +2 -2
  85. data/lib/administrate/page/form.rb +1 -1
  86. data/lib/administrate/page/show.rb +1 -1
  87. data/lib/administrate/resource_resolver.rb +1 -1
  88. data/lib/administrate/search.rb +14 -16
  89. data/lib/administrate/version.rb +1 -1
  90. data/lib/administrate/view_generator.rb +4 -3
  91. data/lib/administrate.rb +0 -38
  92. data/lib/generators/administrate/dashboard/dashboard_generator.rb +12 -9
  93. data/lib/generators/administrate/field/field_generator.rb +2 -2
  94. data/lib/generators/administrate/install/install_generator.rb +3 -2
  95. data/lib/generators/administrate/routes/routes_generator.rb +6 -5
  96. data/lib/generators/administrate/views/field_generator.rb +2 -2
  97. data/lib/generators/administrate/views/index_generator.rb +5 -0
  98. data/lib/generators/administrate/views/layout_generator.rb +1 -1
  99. metadata +35 -76
  100. data/app/assets/javascripts/administrate/components/associative.js +0 -5
  101. data/app/assets/javascripts/administrate/components/select.js +0 -3
  102. data/app/assets/stylesheets/administrate/utilities/_text-color.scss +0 -3
  103. data/lib/generators/administrate/assets/assets_generator.rb +0 -12
  104. data/lib/generators/administrate/assets/javascripts_generator.rb +0 -17
  105. data/lib/generators/administrate/assets/stylesheets_generator.rb +0 -17
@@ -2,7 +2,9 @@
2
2
 
3
3
  @import "reset/normalize";
4
4
 
5
- @import "selectize";
5
+ @import "trix/dist/trix";
6
+ @import "selectize/dist/css/selectize";
7
+ @import "selectize/dist/css/selectize.default";
6
8
 
7
9
  @import "library/clearfix";
8
10
  @import "library/data-label";
@@ -25,5 +27,3 @@
25
27
  @import "components/navigation";
26
28
  @import "components/pagination";
27
29
  @import "components/search";
28
-
29
- @import "utilities/text-color";
@@ -32,6 +32,10 @@ textarea {
32
32
  font-size: 16px;
33
33
  }
34
34
 
35
+ textarea {
36
+ resize: vertical;
37
+ }
38
+
35
39
  [type="color"],
36
40
  [type="date"],
37
41
  [type="datetime-local"],
@@ -78,10 +82,6 @@ textarea {
78
82
  }
79
83
  }
80
84
 
81
- textarea {
82
- resize: vertical;
83
- }
84
-
85
85
  [type="checkbox"],
86
86
  [type="radio"] {
87
87
  display: inline;
@@ -13,6 +13,11 @@ figure {
13
13
  margin: 0;
14
14
  }
15
15
 
16
+ /* stylelint-disable selector-no-qualifying-type, selector-class-pattern */
17
+ form.button_to { // we don't control this class name
18
+ display: contents;
19
+ }
20
+
16
21
  img,
17
22
  picture {
18
23
  margin: 0;
@@ -23,7 +23,7 @@ tbody tr {
23
23
  background-color: $base-background-color;
24
24
  }
25
25
 
26
- [role=link] {
26
+ [role="link"] {
27
27
  cursor: pointer;
28
28
  }
29
29
 
@@ -21,7 +21,13 @@ p {
21
21
  margin: 0 0 $small-spacing;
22
22
  }
23
23
 
24
- a {
24
+ a,
25
+ .link:is(
26
+ button,
27
+ [type="button"],
28
+ [type="reset"],
29
+ [type="submit"]
30
+ ) {
25
31
  color: $action-color;
26
32
  text-decoration-skip-ink: auto;
27
33
  transition: color $base-duration $base-timing;
@@ -34,6 +40,14 @@ a {
34
40
  outline: $focus-outline;
35
41
  outline-offset: $focus-outline-offset;
36
42
  }
43
+ /* stylelint-disable selector-no-qualifying-type */
44
+ &.link--danger {
45
+ color: $red;
46
+ }
47
+
48
+ &.link--danger:hover {
49
+ color: mix($black, $red, 20%);
50
+ }
37
51
  }
38
52
 
39
53
  hr {
@@ -1,5 +1,6 @@
1
1
  .attribute-label {
2
2
  @include data-label;
3
+
3
4
  clear: left;
4
5
  float: left;
5
6
  margin-bottom: $base-spacing;
@@ -1,7 +1,7 @@
1
1
  button,
2
- input[type="button"],
3
- input[type="reset"],
4
- input[type="submit"],
2
+ [type="button"],
3
+ [type="reset"],
4
+ [type="submit"],
5
5
  .button {
6
6
  appearance: none;
7
7
  background-color: $action-color;
@@ -22,23 +22,31 @@ input[type="submit"],
22
22
  vertical-align: middle;
23
23
  white-space: nowrap;
24
24
 
25
- &:hover {
25
+ &:disabled {
26
+ cursor: not-allowed;
27
+ opacity: 0.5;
28
+ }
29
+
30
+ &:not(.link):hover {
26
31
  background-color: mix($black, $action-color, 20%);
27
32
  color: $white;
28
33
  }
29
34
 
30
- &:focus {
35
+ &:not(.link):focus {
31
36
  outline: $focus-outline;
32
37
  outline-offset: $focus-outline-offset;
33
38
  }
34
39
 
35
- &:disabled {
36
- cursor: not-allowed;
37
- opacity: 0.5;
40
+ &:not(.link):disabled:hover {
41
+ background-color: $action-color;
42
+ }
43
+ }
38
44
 
39
- &:hover {
40
- background-color: $action-color;
41
- }
45
+
46
+ form.button_to { /* stylelint-disable selector-no-qualifying-type, selector-class-pattern */
47
+ .link {
48
+ padding-left: 0;
49
+ padding-right: 0;
42
50
  }
43
51
  }
44
52
 
@@ -52,12 +60,29 @@ input[type="submit"],
52
60
  .button--danger {
53
61
  background-color: $red;
54
62
 
55
- &:hover {
63
+ &:not(.link):hover {
56
64
  background-color: mix($black, $red, 20%);
57
65
  color: $white;
58
66
  }
67
+
68
+ &:not(.link):disabled:hover {
69
+ background-color: mix($black, $red, 20%);
70
+ }
59
71
  }
60
72
 
61
73
  .button--nav {
62
74
  margin-bottom: $base-spacing;
63
75
  }
76
+
77
+ .button--tooltip {
78
+ background: none;
79
+ border: none;
80
+ color: inherit;
81
+ cursor: pointer;
82
+ padding: 0;
83
+
84
+ /* stylelint-disable declaration-no-important */
85
+ &:hover {
86
+ background-color: unset !important;
87
+ }
88
+ }
@@ -1,6 +1,25 @@
1
+ .cell-label__sort-indicator {
2
+ float: right;
3
+ margin-left: 5px;
4
+
5
+ svg {
6
+ color: $hint-grey;
7
+ height: 13px;
8
+ transition: transform $base-duration $base-timing;
9
+ width: 13px;
10
+ }
11
+ }
12
+
1
13
  .cell-label {
2
14
  padding-top: 0.15em;
3
15
 
16
+ a {
17
+ color: inherit;
18
+ display: inline-block;
19
+ transition: color $base-duration $base-timing;
20
+ width: 100%;
21
+ }
22
+
4
23
  &:hover {
5
24
  a {
6
25
  color: $action-color;
@@ -11,13 +30,6 @@
11
30
  transform: rotate(180deg);
12
31
  }
13
32
  }
14
-
15
- a {
16
- color: inherit;
17
- display: inline-block;
18
- transition: color $base-duration $base-timing;
19
- width: 100%;
20
- }
21
33
  }
22
34
 
23
35
  .cell-label--asc,
@@ -25,23 +37,18 @@
25
37
  font-weight: $bold-font-weight;
26
38
  }
27
39
 
28
- .cell-label__sort-indicator {
29
- float: right;
30
- margin-left: 5px;
31
-
32
- svg {
33
- fill: $hint-grey;
34
- height: 13px;
35
- transition: transform $base-duration $base-timing;
36
- width: 13px;
37
- }
38
- }
39
-
40
40
  .cell-label__sort-indicator--desc {
41
41
  transform: rotate(180deg);
42
42
  }
43
43
 
44
+ .cell-label--action-button {
45
+ white-space: nowrap;
46
+ width: 1rem;
47
+ }
48
+
44
49
  .cell-data--number,
45
50
  .cell-label--number {
46
51
  text-align: right;
52
+ white-space: nowrap;
53
+ width: 1rem;
47
54
  }
@@ -1,5 +1,6 @@
1
1
  .field-unit {
2
2
  @include administrate-clearfix;
3
+
3
4
  align-items: center;
4
5
  display: flex;
5
6
  flex-wrap: wrap;
@@ -16,10 +17,9 @@
16
17
  }
17
18
 
18
19
  .field-unit__field {
20
+ flex-grow: 1;
19
21
  float: left;
20
22
  margin-left: 2rem;
21
- max-width: 50rem;
22
- width: 100%;
23
23
 
24
24
  .optgroup-header {
25
25
  font-weight: $bold-font-weight;
@@ -40,7 +40,7 @@
40
40
  width: 100%;
41
41
 
42
42
  .field-unit__field {
43
- width: 100%;
43
+ flex-grow: 1;
44
44
  }
45
45
 
46
46
  .field-unit__label {
@@ -4,8 +4,8 @@
4
4
  box-shadow: 0 0 6px 0 rgba($black, 0.12),
5
5
  0 2px 2px rgba($black, 0.2);
6
6
  flex: 1 1 100%;
7
- padding-bottom: 10vh;
8
7
  min-width: 800px;
8
+ padding-bottom: 10vh;
9
9
  }
10
10
 
11
11
  .main-content__header,
@@ -1,4 +1,4 @@
1
- $_navigation-link-padding: 0.6em;
1
+ $navigation-link-padding: 0.6em;
2
2
 
3
3
  .navigation {
4
4
  flex: 1 0 10rem;
@@ -11,8 +11,8 @@ $_navigation-link-padding: 0.6em;
11
11
  color: $base-font-color;
12
12
  display: block;
13
13
  line-height: 1;
14
- margin-left: -($_navigation-link-padding);
15
- padding: $_navigation-link-padding;
14
+ margin-left: -($navigation-link-padding);
15
+ padding: $navigation-link-padding;
16
16
  transition: background-color $base-duration $base-timing,
17
17
  color $base-duration $base-timing;
18
18
 
@@ -1,4 +1,4 @@
1
- $_search-icon-size: 1rem;
1
+ $search-icon-size: 1rem;
2
2
 
3
3
  .search {
4
4
  margin-left: auto;
@@ -10,37 +10,78 @@ $_search-icon-size: 1rem;
10
10
 
11
11
  .search__input {
12
12
  border-radius: 100rem;
13
- padding-left: $_search-icon-size * 2.5;
14
- padding-right: $_search-icon-size * 2.5;
13
+ padding-left: $search-icon-size * 2.5;
14
+ padding-right: $search-icon-size * 2.5;
15
15
  }
16
16
 
17
17
  .search__eyeglass-icon {
18
- fill: $grey-7;
19
- height: $_search-icon-size;
20
- left: $_search-icon-size;
18
+ height: $search-icon-size;
19
+ left: $search-icon-size;
21
20
  position: absolute;
22
21
  top: 50%;
23
22
  transform: translateY(-50%);
24
- width: $_search-icon-size;
23
+ width: $search-icon-size;
25
24
  }
26
25
 
27
26
  .search__clear-link {
28
- height: $_search-icon-size;
27
+ height: $search-icon-size;
29
28
  position: absolute;
30
- right: $_search-icon-size * 0.75;
29
+ right: $search-icon-size * 0.75;
31
30
  top: 50%;
32
31
  transform: translateY(-50%);
33
- width: $_search-icon-size;
32
+ width: $search-icon-size;
34
33
  }
35
34
 
36
35
  .search__clear-icon {
37
- fill: $grey-5;
38
- height: $_search-icon-size;
36
+ color: $grey-5;
37
+ height: $search-icon-size;
39
38
  position: absolute;
40
39
  transition: fill $base-duration $base-timing;
41
- width: $_search-icon-size;
40
+ width: $search-icon-size;
42
41
 
43
42
  &:hover {
44
- fill: $action-color;
43
+ color: $action-color;
45
44
  }
46
45
  }
46
+
47
+ .search__tooltip {
48
+ anchor-name: --tooltip-anchor;
49
+ margin-right: 2rem;
50
+
51
+ svg {
52
+ color: $grey-5;
53
+ height: 24px;
54
+ width: 24px;
55
+
56
+ &:hover {
57
+ color: $action-color;
58
+ }
59
+ }
60
+ }
61
+
62
+ .search__tooltip-popover {
63
+ background-color: $blue;
64
+ border-color: $blue;
65
+ border-radius: $base-border-radius;
66
+ color: $white;
67
+ padding: 2rem;
68
+ width: max-content;
69
+ }
70
+
71
+
72
+ /* We can remove this stylelint disable (and the css-anchor-positioning polyfill)
73
+ when position-anchor becomes widely available */
74
+
75
+ /* stylelint-disable property-no-unknown */
76
+ .search__tooltip-popover-positioning {
77
+ left: anchor(center);
78
+ margin: 1rem;
79
+ position: fixed;
80
+ position-anchor: --tooltip-anchor;
81
+ top: anchor(bottom);
82
+ transform: translateX(-50%);
83
+ }
84
+
85
+ .search__tooltip-popover-value {
86
+ opacity: 0.5;
87
+ }
@@ -1,5 +1,7 @@
1
+ /* stylelint-disable scss/dollar-variable-empty-line-before */
2
+
1
3
  // Typography
2
- $base-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
4
+ $base-font-family: -apple-system, blinkmacsystemfont, "Segoe UI", "Roboto",
3
5
  "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
4
6
  sans-serif !default;
5
7
  $heading-font-family: $base-font-family !default;
@@ -17,8 +19,8 @@ $base-spacing: $base-line-height * 1em !default;
17
19
  $small-spacing: $base-spacing * 0.5 !default;
18
20
 
19
21
  // Colors
20
- $white: #fff !default;
21
- $black: #000 !default;
22
+ $white: #ffffff !default;
23
+ $black: #000000 !default;
22
24
 
23
25
  $blue: #1976d2 !default;
24
26
  $red: #d32f2f !default;
@@ -63,3 +65,5 @@ $base-border: 1px solid $base-border-color !default;
63
65
  // Transitions
64
66
  $base-duration: 250ms !default;
65
67
  $base-timing: ease-in-out !default;
68
+
69
+ /* stylelint-enable scss/dollar-variable-empty-line-before */
@@ -100,7 +100,13 @@ pre {
100
100
  * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
101
101
  */
102
102
 
103
- a {
103
+ a,
104
+ .link:is(
105
+ button,
106
+ [type="button"],
107
+ [type="reset"],
108
+ [type="submit"]
109
+ ) {
104
110
  background-color: transparent; /* 1 */
105
111
  -webkit-text-decoration-skip: objects; /* 2 */
106
112
  }
@@ -1,14 +1,16 @@
1
- $blue: #53adc6;
2
- $red: #cf726e;
3
- $green: #5bc89e;
4
- $white: #f0f0f0;
5
-
6
- $code-black: #202020;
7
- $code-white: #e0e0dc;
8
- $code-green: #b0bf82;
9
- $code-blue: #8fbdcc;
10
- $code-yellow: #f8d29d;
11
- $code-red: #b95c56;
1
+ :root {
2
+ --blue: #53adc6;
3
+ --red: #cf726e;
4
+ --green: #5bc89e;
5
+ --white: #f0f0f0;
6
+
7
+ --code-black: #202020;
8
+ --code-white: #e0e0dc;
9
+ --code-green: #b0bf82;
10
+ --code-blue: #8fbdcc;
11
+ --code-yellow: #f8d29d;
12
+ --code-red: #b95c56;
13
+ }
12
14
 
13
15
  html,
14
16
  body {
@@ -30,7 +32,7 @@ h3 {
30
32
  }
31
33
 
32
34
  a {
33
- color: $blue;
35
+ color: var(--blue);
34
36
  text-decoration: none;
35
37
  }
36
38
 
@@ -58,8 +60,8 @@ a {
58
60
  }
59
61
 
60
62
  .flash-wrapper {
61
- background-color: $red;
62
- color: $white;
63
+ background-color: var(--red);
64
+ color: var(--white);
63
65
  padding: 1em;
64
66
 
65
67
  .flash {
@@ -75,19 +77,19 @@ code {
75
77
  padding: 0.4em 0.2em 0;
76
78
 
77
79
  &.hljs {
78
- background-color: $code-black;
79
- color: $code-white;
80
+ background-color: var(--code-black);
81
+ color: var(--code-white);
80
82
  padding-left: 1rem;
81
83
 
82
- .hljs-string { color: $code-green; }
83
- .hljs-subst { color: $code-white; }
84
- .hljs-constant { color: $code-blue; }
85
- .hljs-symbol { color: $code-red; }
86
- .hljs-keyword { color: $code-yellow; }
84
+ .hljs-string { color: var(--code-green); }
85
+ .hljs-subst { color: var(--code-white); }
86
+ .hljs-constant { color: var(--code-blue); }
87
+ .hljs-symbol { color: var(--code-red); }
88
+ .hljs-keyword { color: var(--code-yellow); }
87
89
 
88
90
  .hljs-title,
89
- .hljs-parent { color: $code-blue; }
91
+ .hljs-parent { color: var(--code-blue); }
90
92
 
91
- .hljs-tag { color: $code-yellow; }
93
+ .hljs-tag { color: var(--code-yellow); }
92
94
  }
93
95
  }