plutonium 0.66.0 → 0.68.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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/skills/plutonium-dashboard/SKILL.md +17 -2
  3. data/.claude/skills/plutonium-resource/SKILL.md +17 -10
  4. data/.claude/skills/plutonium-ui/SKILL.md +13 -3
  5. data/CHANGELOG.md +35 -0
  6. data/SECURITY.md +1 -1
  7. data/app/assets/plutonium.css +1 -1
  8. data/app/assets/plutonium.js +56 -3
  9. data/app/assets/plutonium.js.map +4 -4
  10. data/app/assets/plutonium.min.js +32 -32
  11. data/app/assets/plutonium.min.js.map +4 -4
  12. data/config/brakeman.ignore +1 -1
  13. data/config/locales/en/dashboard.yml +1 -0
  14. data/config/locales/en/js.yml +4 -0
  15. data/config/locales/en/ui.yml +19 -0
  16. data/docs/reference/dashboard/dsl.md +54 -3
  17. data/docs/reference/resource/definition.md +14 -7
  18. data/docs/reference/resource/query.md +11 -1
  19. data/docs/reference/ui/displays.md +19 -2
  20. data/docs/reference/ui/forms.md +77 -4
  21. data/gemfiles/rails_7.gemfile +1 -0
  22. data/gemfiles/rails_7.gemfile.lock +13 -3
  23. data/gemfiles/rails_8.0.gemfile +1 -0
  24. data/gemfiles/rails_8.0.gemfile.lock +10 -1
  25. data/gemfiles/rails_8.1.gemfile +1 -0
  26. data/gemfiles/rails_8.1.gemfile.lock +10 -1
  27. data/lib/plutonium/auth/rodauth.rb +7 -0
  28. data/lib/plutonium/core/controller.rb +0 -2
  29. data/lib/plutonium/dashboard/base.rb +80 -1
  30. data/lib/plutonium/dashboard/card.rb +12 -13
  31. data/lib/plutonium/dashboard/controller.rb +28 -10
  32. data/lib/plutonium/dashboard/dsl.rb +59 -2
  33. data/lib/plutonium/dashboard/evaluation.rb +30 -0
  34. data/lib/plutonium/dashboard/filter.rb +114 -0
  35. data/lib/plutonium/dashboard/link.rb +35 -0
  36. data/lib/plutonium/dashboard/route_resolution.rb +6 -2
  37. data/lib/plutonium/helpers/content_helper.rb +0 -3
  38. data/lib/plutonium/query/filter.rb +2 -1
  39. data/lib/plutonium/query/filters/tags.rb +36 -0
  40. data/lib/plutonium/resource/query_object.rb +6 -0
  41. data/lib/plutonium/routing/dashboard_registration.rb +5 -0
  42. data/lib/plutonium/ui/avatar.rb +2 -2
  43. data/lib/plutonium/ui/component/resolves_tags.rb +13 -0
  44. data/lib/plutonium/ui/dashboard/board.rb +4 -1
  45. data/lib/plutonium/ui/dashboard/frame.rb +1 -1
  46. data/lib/plutonium/ui/dashboard/metric.rb +18 -5
  47. data/lib/plutonium/ui/dashboard/toolbar.rb +76 -0
  48. data/lib/plutonium/ui/display/base.rb +50 -2
  49. data/lib/plutonium/ui/display/components/badge.rb +1 -1
  50. data/lib/plutonium/ui/display/components/binary.rb +20 -0
  51. data/lib/plutonium/ui/display/components/boolean.rb +1 -1
  52. data/lib/plutonium/ui/display/components/code.rb +23 -0
  53. data/lib/plutonium/ui/display/components/color.rb +14 -6
  54. data/lib/plutonium/ui/display/components/duration.rb +31 -0
  55. data/lib/plutonium/ui/display/components/file_size.rb +22 -0
  56. data/lib/plutonium/ui/display/components/key_value.rb +37 -0
  57. data/lib/plutonium/ui/display/components/list.rb +33 -0
  58. data/lib/plutonium/ui/display/components/number.rb +32 -0
  59. data/lib/plutonium/ui/display/components/progress.rb +36 -0
  60. data/lib/plutonium/ui/display/components/rating.rb +36 -0
  61. data/lib/plutonium/ui/display/components/relative_time.rb +25 -0
  62. data/lib/plutonium/ui/display/components/rich_text.rb +23 -0
  63. data/lib/plutonium/ui/display/components/tags.rb +18 -0
  64. data/lib/plutonium/ui/display/options/inferred_types.rb +13 -0
  65. data/lib/plutonium/ui/display/theme.rb +24 -2
  66. data/lib/plutonium/ui/form/base.rb +50 -1
  67. data/lib/plutonium/ui/form/components/binary.rb +40 -0
  68. data/lib/plutonium/ui/form/components/key_value_store.rb +22 -71
  69. data/lib/plutonium/ui/form/components/list.rb +46 -0
  70. data/lib/plutonium/ui/form/components/rating.rb +51 -0
  71. data/lib/plutonium/ui/form/components/rich_text.rb +20 -0
  72. data/lib/plutonium/ui/form/components/secure_association.rb +31 -8
  73. data/lib/plutonium/ui/form/components/secure_association_checkboxes.rb +30 -0
  74. data/lib/plutonium/ui/form/components/secure_association_choices.rb +123 -0
  75. data/lib/plutonium/ui/form/components/secure_association_radio_buttons.rb +45 -0
  76. data/lib/plutonium/ui/form/components/secure_association_toggles.rb +18 -0
  77. data/lib/plutonium/ui/form/components/tags.rb +45 -0
  78. data/lib/plutonium/ui/form/components/tags_filter.rb +40 -0
  79. data/lib/plutonium/ui/form/components/uppy.rb +1 -1
  80. data/lib/plutonium/ui/form/options/inferred_types.rb +16 -15
  81. data/lib/plutonium/ui/form/theme.rb +34 -4
  82. data/lib/plutonium/ui/grid/card.rb +25 -5
  83. data/lib/plutonium/ui/layout/base.rb +10 -1
  84. data/lib/plutonium/ui/options/rich_text_field.rb +18 -0
  85. data/lib/plutonium/ui/options/secret_field.rb +32 -0
  86. data/lib/plutonium/ui/options/tags_field.rb +23 -0
  87. data/lib/plutonium/ui/page/dashboard.rb +1 -0
  88. data/lib/plutonium/ui/table/components/scopes_bar.rb +1 -1
  89. data/lib/plutonium/ui/table/components/scopes_pills.rb +1 -1
  90. data/lib/plutonium/ui/table/components/toolbar.rb +2 -2
  91. data/lib/plutonium/ui/table/components/view_switcher.rb +4 -2
  92. data/lib/plutonium/ui/table/display_theme.rb +30 -2
  93. data/lib/plutonium/version.rb +1 -1
  94. data/package.json +1 -1
  95. data/plutonium.gemspec +1 -1
  96. data/src/css/components.css +43 -0
  97. data/src/css/flatpickr.css +91 -0
  98. data/src/js/controllers/easymde_controller.js +1 -0
  99. data/src/js/controllers/register_controllers.js +2 -0
  100. data/src/js/controllers/slim_select_controller.js +32 -3
  101. data/src/js/controllers/timeago_controller.js +40 -0
  102. metadata +35 -4
@@ -795,3 +795,94 @@ span.flatpickr-weekday {
795
795
  [data-controller="remote-modal"] > .flatpickr-calendar {
796
796
  left: auto !important;
797
797
  }
798
+
799
+ /* Dark mode: map flatpickr's hardcoded light palette onto the design tokens. */
800
+ .dark .flatpickr-calendar {
801
+ background: var(--pu-surface);
802
+ box-shadow: 0 0 0 1px var(--pu-border), 0 3px 13px rgba(0, 0, 0, 0.4);
803
+ }
804
+ .dark .flatpickr-calendar.arrowTop:after {
805
+ border-bottom-color: var(--pu-surface);
806
+ }
807
+ .dark .flatpickr-calendar.arrowBottom:after {
808
+ border-top-color: var(--pu-surface);
809
+ }
810
+ .dark .flatpickr-calendar.arrowTop:before {
811
+ border-bottom-color: var(--pu-border);
812
+ }
813
+ .dark .flatpickr-calendar.arrowBottom:before {
814
+ border-top-color: var(--pu-border);
815
+ }
816
+ .dark .flatpickr-calendar.hasTime .flatpickr-time {
817
+ border-top-color: var(--pu-border);
818
+ }
819
+ .dark .flatpickr-months .flatpickr-month,
820
+ .dark .flatpickr-months .flatpickr-prev-month,
821
+ .dark .flatpickr-months .flatpickr-next-month,
822
+ .dark .flatpickr-current-month input.cur-year,
823
+ .dark .flatpickr-current-month .flatpickr-monthDropdown-months {
824
+ color: var(--pu-text);
825
+ fill: var(--pu-text);
826
+ }
827
+ .dark .flatpickr-months .flatpickr-prev-month:hover svg,
828
+ .dark .flatpickr-months .flatpickr-next-month:hover svg {
829
+ fill: var(--pu-text-muted);
830
+ }
831
+ .dark .flatpickr-current-month .flatpickr-monthDropdown-months,
832
+ .dark .flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month {
833
+ background: var(--pu-surface);
834
+ }
835
+ .dark .flatpickr-current-month .numInputWrapper span.arrowUp:after {
836
+ border-bottom-color: var(--pu-text);
837
+ }
838
+ .dark .flatpickr-current-month .numInputWrapper span.arrowDown:after {
839
+ border-top-color: var(--pu-text);
840
+ }
841
+ .dark span.flatpickr-weekday {
842
+ color: var(--pu-text-muted);
843
+ }
844
+ .dark .flatpickr-day {
845
+ color: var(--pu-text);
846
+ }
847
+ .dark .flatpickr-day:hover,
848
+ .dark .flatpickr-day:focus,
849
+ .dark .flatpickr-day.prevMonthDay:hover,
850
+ .dark .flatpickr-day.nextMonthDay:hover,
851
+ .dark .flatpickr-day.inRange {
852
+ background: var(--pu-surface-alt);
853
+ border-color: var(--pu-surface-alt);
854
+ }
855
+ .dark .flatpickr-day.inRange {
856
+ box-shadow: -5px 0 0 var(--pu-surface-alt), 5px 0 0 var(--pu-surface-alt);
857
+ }
858
+ .dark .flatpickr-day.today {
859
+ border-color: var(--pu-text-muted);
860
+ }
861
+ .dark .flatpickr-day.prevMonthDay,
862
+ .dark .flatpickr-day.nextMonthDay,
863
+ .dark .flatpickr-day.flatpickr-disabled,
864
+ .dark .flatpickr-day.flatpickr-disabled:hover {
865
+ color: var(--pu-text-muted);
866
+ opacity: 0.5;
867
+ }
868
+ .dark .flatpickr-weekwrapper .flatpickr-weeks,
869
+ .dark .dayContainer + .dayContainer {
870
+ box-shadow: none;
871
+ }
872
+ .dark .flatpickr-time input,
873
+ .dark .flatpickr-time .flatpickr-am-pm,
874
+ .dark .flatpickr-time .flatpickr-time-separator {
875
+ color: var(--pu-text);
876
+ }
877
+ .dark .flatpickr-time .numInputWrapper span.arrowUp:after {
878
+ border-bottom-color: var(--pu-text);
879
+ }
880
+ .dark .flatpickr-time .numInputWrapper span.arrowDown:after {
881
+ border-top-color: var(--pu-text);
882
+ }
883
+ .dark .flatpickr-time input:hover,
884
+ .dark .flatpickr-time .flatpickr-am-pm:hover,
885
+ .dark .flatpickr-time input:focus,
886
+ .dark .flatpickr-time .flatpickr-am-pm:focus {
887
+ background: var(--pu-surface-alt);
888
+ }
@@ -66,6 +66,7 @@ export default class extends Controller {
66
66
  #buildOptions() {
67
67
  let options = {
68
68
  element: this.element,
69
+ autoDownloadFontAwesome: false,
69
70
  promptURLs: true,
70
71
  spellChecker: false,
71
72
  // Override the default preview renderer
@@ -43,6 +43,7 @@ import BreadcrumbsController from "./breadcrumbs_controller.js"
43
43
  import RunProgressController from "./run_progress_controller.js"
44
44
  import ChartController from "./chart_controller.js"
45
45
  import FrameRefreshController from "./frame_refresh_controller.js"
46
+ import TimeagoController from "./timeago_controller.js"
46
47
 
47
48
  export default function (application) {
48
49
  // Register controllers here
@@ -90,4 +91,5 @@ export default function (application) {
90
91
  application.register("run-progress", RunProgressController)
91
92
  application.register("chart", ChartController)
92
93
  application.register("frame-refresh", FrameRefreshController)
94
+ application.register("timeago", TimeagoController)
93
95
  }
@@ -9,10 +9,15 @@ import { t } from "../i18n.js";
9
9
  // When present, SlimSelect's built-in client-side
10
10
  // filter is replaced by a debounced fetch through
11
11
  // this URL.
12
+ // addable — typed text can be added as a new option (chip
13
+ // inputs, see Form::Components::List).
14
+ // max-selected — caps how many options a multi-select keeps.
12
15
  export default class extends Controller {
13
16
  static values = {
14
17
  typeaheadUrl: String,
15
- typeaheadDebounceMs: { type: Number, default: 200 }
18
+ typeaheadDebounceMs: { type: Number, default: 200 },
19
+ addable: Boolean,
20
+ maxSelected: Number
16
21
  }
17
22
 
18
23
  connect() {
@@ -39,11 +44,19 @@ export default class extends Controller {
39
44
  // define placeholderText, searchText, searchPlaceholder and searchingText.
40
45
  const strings = t("plutonium.js.libraries.slim_select");
41
46
  if (strings && typeof strings === "object") {
42
- const { placeholderText, searchText, searchPlaceholder, searchingText } = strings;
43
- Object.assign(settings, { placeholderText, searchText, searchPlaceholder, searchingText });
47
+ const { placeholderText, searchText, searchPlaceholder, searchingText, addableText } = strings;
48
+ Object.assign(settings, { placeholderText, searchText, searchPlaceholder, searchingText, addableText });
44
49
  Object.keys(settings).forEach((k) => settings[k] === undefined && delete settings[k]);
45
50
  }
46
51
 
52
+ if (this.hasMaxSelectedValue) settings.maxSelected = this.maxSelectedValue;
53
+
54
+ if (this.addableValue) {
55
+ // A plain "Select Value" / "Search" hides that new values can be typed in.
56
+ settings.placeholderText = t("plutonium.js.slim_select.add_placeholder");
57
+ settings.searchPlaceholder = t("plutonium.js.slim_select.add_search_placeholder");
58
+ }
59
+
47
60
  this.modal = this.element.closest('[data-controller="remote-modal"]');
48
61
 
49
62
  if (this.modal) {
@@ -67,6 +80,20 @@ export default class extends Controller {
67
80
 
68
81
  const events = {};
69
82
 
83
+ if (this.modal) {
84
+ // A modal <dialog> gets `overflow: auto` from the UA stylesheet, so a
85
+ // dropdown that runs past the dialog's edge (a select near the bottom
86
+ // of a short modal) is clipped. The dialog never scrolls itself (its
87
+ // body owns the scroll regions), so let it overflow while open.
88
+ events.afterOpen = () => { this.modal.style.overflow = "visible"; };
89
+ events.afterClose = () => { this.modal.style.overflow = ""; };
90
+ }
91
+
92
+ if (this.addableValue) {
93
+ // Returning false rejects blank input instead of adding an empty chip.
94
+ events.addable = (value) => value.trim() || false;
95
+ }
96
+
70
97
  if (this.hasTypeaheadUrlValue && this.typeaheadUrlValue) {
71
98
  // Replace SlimSelect's client-side filter with a server fetch.
72
99
  // Returns the SlimSelect data array shape: {value, text}.
@@ -193,6 +220,8 @@ export default class extends Controller {
193
220
  this.boundModalReposition = null;
194
221
  }
195
222
 
223
+ if (this.modal) this.modal.style.overflow = "";
224
+
196
225
  if (this.slimSelect) {
197
226
  this.slimSelect.destroy();
198
227
  this.slimSelect = null;
@@ -0,0 +1,40 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ // Renders a <time> as relative text ("3 days ago", "in 5 minutes") in the
4
+ // page's locale and keeps it current. The server-rendered absolute date stays
5
+ // in the element's title, so hovering still shows the exact time.
6
+ const UNITS = [
7
+ ["year", 60 * 60 * 24 * 365],
8
+ ["month", 60 * 60 * 24 * 30],
9
+ ["week", 60 * 60 * 24 * 7],
10
+ ["day", 60 * 60 * 24],
11
+ ["hour", 60 * 60],
12
+ ["minute", 60],
13
+ ["second", 1],
14
+ ]
15
+
16
+ export default class extends Controller {
17
+ static values = {
18
+ datetime: String,
19
+ refreshInterval: { type: Number, default: 60000 },
20
+ }
21
+
22
+ connect() {
23
+ this.formatter = new Intl.RelativeTimeFormat(document.documentElement.lang || undefined, { numeric: "auto" })
24
+ this.render()
25
+ this.timer = setInterval(() => this.render(), this.refreshIntervalValue)
26
+ }
27
+
28
+ disconnect() {
29
+ clearInterval(this.timer)
30
+ }
31
+
32
+ render() {
33
+ const date = new Date(this.datetimeValue)
34
+ if (isNaN(date)) return
35
+
36
+ const seconds = Math.round((date - Date.now()) / 1000)
37
+ const [unit, size] = UNITS.find(([, size]) => Math.abs(seconds) >= size) || UNITS[UNITS.length - 1]
38
+ this.element.textContent = this.formatter.format(Math.round(seconds / size), unit)
39
+ }
40
+ }
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plutonium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.66.0
4
+ version: 0.68.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Froelich
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-10-08 00:00:00.000000000 Z
10
+ date: 2026-10-14 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: zeitwerk
@@ -203,14 +203,14 @@ dependencies:
203
203
  requirements:
204
204
  - - ">="
205
205
  - !ruby/object:Gem::Version
206
- version: 0.14.3
206
+ version: 0.14.4
207
207
  type: :runtime
208
208
  prerelease: false
209
209
  version_requirements: !ruby/object:Gem::Requirement
210
210
  requirements:
211
211
  - - ">="
212
212
  - !ruby/object:Gem::Version
213
- version: 0.14.3
213
+ version: 0.14.4
214
214
  - !ruby/object:Gem::Dependency
215
215
  name: phlexi-table
216
216
  requirement: !ruby/object:Gem::Requirement
@@ -1144,6 +1144,9 @@ files:
1144
1144
  - lib/plutonium/dashboard/card.rb
1145
1145
  - lib/plutonium/dashboard/controller.rb
1146
1146
  - lib/plutonium/dashboard/dsl.rb
1147
+ - lib/plutonium/dashboard/evaluation.rb
1148
+ - lib/plutonium/dashboard/filter.rb
1149
+ - lib/plutonium/dashboard/link.rb
1147
1150
  - lib/plutonium/dashboard/register.rb
1148
1151
  - lib/plutonium/dashboard/route_resolution.rb
1149
1152
  - lib/plutonium/definition/actions.rb
@@ -1234,6 +1237,7 @@ files:
1234
1237
  - lib/plutonium/query/filters/date.rb
1235
1238
  - lib/plutonium/query/filters/date_range.rb
1236
1239
  - lib/plutonium/query/filters/select.rb
1240
+ - lib/plutonium/query/filters/tags.rb
1237
1241
  - lib/plutonium/query/filters/text.rb
1238
1242
  - lib/plutonium/query/model_scope.rb
1239
1243
  - lib/plutonium/railtie.rb
@@ -1307,17 +1311,30 @@ files:
1307
1311
  - lib/plutonium/ui/dashboard/frame.rb
1308
1312
  - lib/plutonium/ui/dashboard/metric.rb
1309
1313
  - lib/plutonium/ui/dashboard/skeleton.rb
1314
+ - lib/plutonium/ui/dashboard/toolbar.rb
1310
1315
  - lib/plutonium/ui/display/base.rb
1311
1316
  - lib/plutonium/ui/display/components/association.rb
1312
1317
  - lib/plutonium/ui/display/components/attachment.rb
1313
1318
  - lib/plutonium/ui/display/components/badge.rb
1319
+ - lib/plutonium/ui/display/components/binary.rb
1314
1320
  - lib/plutonium/ui/display/components/boolean.rb
1321
+ - lib/plutonium/ui/display/components/code.rb
1315
1322
  - lib/plutonium/ui/display/components/color.rb
1316
1323
  - lib/plutonium/ui/display/components/currency.rb
1324
+ - lib/plutonium/ui/display/components/duration.rb
1325
+ - lib/plutonium/ui/display/components/file_size.rb
1317
1326
  - lib/plutonium/ui/display/components/formatted_value.rb
1327
+ - lib/plutonium/ui/display/components/key_value.rb
1328
+ - lib/plutonium/ui/display/components/list.rb
1318
1329
  - lib/plutonium/ui/display/components/markdown.rb
1330
+ - lib/plutonium/ui/display/components/number.rb
1319
1331
  - lib/plutonium/ui/display/components/phlexi_render.rb
1332
+ - lib/plutonium/ui/display/components/progress.rb
1333
+ - lib/plutonium/ui/display/components/rating.rb
1334
+ - lib/plutonium/ui/display/components/relative_time.rb
1335
+ - lib/plutonium/ui/display/components/rich_text.rb
1320
1336
  - lib/plutonium/ui/display/components/section.rb
1337
+ - lib/plutonium/ui/display/components/tags.rb
1321
1338
  - lib/plutonium/ui/display/options/inferred_types.rb
1322
1339
  - lib/plutonium/ui/display/resource.rb
1323
1340
  - lib/plutonium/ui/display/theme.rb
@@ -1326,6 +1343,7 @@ files:
1326
1343
  - lib/plutonium/ui/empty_card.rb
1327
1344
  - lib/plutonium/ui/export_button.rb
1328
1345
  - lib/plutonium/ui/form/base.rb
1346
+ - lib/plutonium/ui/form/components/binary.rb
1329
1347
  - lib/plutonium/ui/form/components/currency.rb
1330
1348
  - lib/plutonium/ui/form/components/easymde.rb
1331
1349
  - lib/plutonium/ui/form/components/flatpickr.rb
@@ -1333,12 +1351,21 @@ files:
1333
1351
  - lib/plutonium/ui/form/components/intl_tel_input.rb
1334
1352
  - lib/plutonium/ui/form/components/json.rb
1335
1353
  - lib/plutonium/ui/form/components/key_value_store.rb
1354
+ - lib/plutonium/ui/form/components/list.rb
1336
1355
  - lib/plutonium/ui/form/components/password.rb
1356
+ - lib/plutonium/ui/form/components/rating.rb
1337
1357
  - lib/plutonium/ui/form/components/resource_select.rb
1358
+ - lib/plutonium/ui/form/components/rich_text.rb
1338
1359
  - lib/plutonium/ui/form/components/section.rb
1339
1360
  - lib/plutonium/ui/form/components/secure_association.rb
1361
+ - lib/plutonium/ui/form/components/secure_association_checkboxes.rb
1362
+ - lib/plutonium/ui/form/components/secure_association_choices.rb
1363
+ - lib/plutonium/ui/form/components/secure_association_radio_buttons.rb
1364
+ - lib/plutonium/ui/form/components/secure_association_toggles.rb
1340
1365
  - lib/plutonium/ui/form/components/secure_polymorphic_association.rb
1341
1366
  - lib/plutonium/ui/form/components/sticky_footer.rb
1367
+ - lib/plutonium/ui/form/components/tags.rb
1368
+ - lib/plutonium/ui/form/components/tags_filter.rb
1342
1369
  - lib/plutonium/ui/form/components/toggle.rb
1343
1370
  - lib/plutonium/ui/form/components/uppy.rb
1344
1371
  - lib/plutonium/ui/form/concerns/renders_nested_resource_fields.rb
@@ -1376,6 +1403,9 @@ files:
1376
1403
  - lib/plutonium/ui/nav_grid_menu.rb
1377
1404
  - lib/plutonium/ui/nav_user.rb
1378
1405
  - lib/plutonium/ui/options/has_cents_field.rb
1406
+ - lib/plutonium/ui/options/rich_text_field.rb
1407
+ - lib/plutonium/ui/options/secret_field.rb
1408
+ - lib/plutonium/ui/options/tags_field.rb
1379
1409
  - lib/plutonium/ui/page/base.rb
1380
1410
  - lib/plutonium/ui/page/dashboard.rb
1381
1411
  - lib/plutonium/ui/page/edit.rb
@@ -1511,6 +1541,7 @@ files:
1511
1541
  - src/js/controllers/table_column_menu_controller.js
1512
1542
  - src/js/controllers/table_header_controller.js
1513
1543
  - src/js/controllers/textarea_autogrow_controller.js
1544
+ - src/js/controllers/timeago_controller.js
1514
1545
  - src/js/controllers/view_switcher_controller.js
1515
1546
  - src/js/controllers/wizard_controller.js
1516
1547
  - src/js/core.js