meta_workflows 0.9.30 → 0.9.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 148b5bd20b07342ebf32630150a513126f1293746bda2c63a535f6266cf97a36
4
- data.tar.gz: b97a6ac33bdba1b6c31c367357f39178a84cceb30a27a650e90b2902dbfdbf73
3
+ metadata.gz: 3b6e5652802f3f166ea4d2bc4860e7c3967f5be1b39fb92858dacceb7ce59990
4
+ data.tar.gz: d4ccc1608e8683b73d5a7f38e9a49fc2c7511820bd03abacb3bbacb487722313
5
5
  SHA512:
6
- metadata.gz: 48ccc44761193ff60ecde2bdc47dd12c74e58fe1e01cb9ed3139604df193a7fa5aa16a3779a7d9e0741db9d3f49157b719d6cb4aba8adf4dfd1aa95fb69858b0
7
- data.tar.gz: 90df170deb7b54dee335dcac670b096043a5d56e4859f739993e1b9982f87ba6d004731957ac1ac11e6344d2228aebe408517489750ff810b0a227ba2d976c5a
6
+ metadata.gz: c7ea1140103f59aa5667044d9000eb483c06fd5624ed7b761777d3b51e57e7971d040cf5295eee9e2a64a6e0f36d960f6953b65e8440b535520e0155dfd49260
7
+ data.tar.gz: 54a7458c7905680b5cb8a56dfb8a985d8bde3878cc7a7e6e3b745023c8571d6e4a6381d70b5e48668df77cd2eaf8fe2dedaf811b9dd79f551df196bb8851cdf4
data/README.md CHANGED
@@ -746,7 +746,8 @@ MetaWorkflows provides a flexible tray system for building modern, multi-pane la
746
746
  | Delta | Bottom tray | Optional collapsible tray at the bottom |
747
747
 
748
748
  ### How It Works
749
- - The tray system is controlled by a `TrayConfigurable` concern included in your controllers.
749
+ - The tray system is controlled by a `MetaWorkflows::TrayConfigurable` concern included in your `ApplicationController`.
750
+ - The concern requires your `ApplicationController` to implement a `configure_trays` method - it will raise `NotImplementedError` if not implemented.
750
751
  - By default, all trays are hidden. You must explicitly set `visible: true` for any tray you want to show.
751
752
  - The engine's layout will automatically respect your tray configuration.
752
753
 
@@ -756,8 +757,17 @@ MetaWorkflows provides a flexible tray system for building modern, multi-pane la
756
757
 
757
758
  ```ruby
758
759
  class ApplicationController < ActionController::Base
759
- include TrayConfigurable
760
+ include MetaWorkflows::TrayConfigurable
760
761
  before_action :configure_trays
762
+
763
+ private
764
+
765
+ def configure_trays
766
+ # ApplicationController must implement this method - it will raise NotImplementedError if not defined
767
+ tray_config[:beta][:visible] = false
768
+ tray_config[:gamma][:visible] = false
769
+ tray_config[:delta][:visible] = false
770
+ end
761
771
  end
762
772
  ```
763
773
 
@@ -765,8 +775,10 @@ MetaWorkflows provides a flexible tray system for building modern, multi-pane la
765
775
 
766
776
  ```ruby
767
777
  class PostsController < ApplicationController
778
+ private
779
+
768
780
  def configure_trays
769
- super
781
+ super # Call parent implementation first
770
782
  tray_config[:beta][:visible] = true # Show Beta (left) tray
771
783
  tray_config[:gamma][:visible] = false # Hide Gamma (right) tray
772
784
  tray_config[:delta][:collapsible] = false # Make Delta (bottom) tray not collapsible
@@ -775,6 +787,7 @@ MetaWorkflows provides a flexible tray system for building modern, multi-pane la
775
787
  ```
776
788
 
777
789
  3. **Default Behavior:**
790
+ - Your `ApplicationController` must implement the `configure_trays` method or a `NotImplementedError` will be raised.
778
791
  - All trays are hidden unless set to `visible: true`.
779
792
  - Trays are collapsible by default; set `collapsible: false` to disable collapsing.
780
793
 
@@ -785,8 +798,10 @@ MetaWorkflows provides a flexible tray system for building modern, multi-pane la
785
798
 
786
799
  ```ruby
787
800
  class DashboardController < ApplicationController
801
+ private
802
+
788
803
  def configure_trays
789
- super
804
+ super # Call parent implementation first
790
805
  tray_config[:beta][:visible] = true
791
806
  tray_config[:gamma][:visible] = false
792
807
  tray_config[:delta][:visible] = false
@@ -799,7 +814,7 @@ end
799
814
  - You can override tray configuration per controller or per action as needed.
800
815
  - The main content area (Alpha tray) is always visible and holds your page content.
801
816
 
802
- For more advanced usage or to contribute improvements, see the tray logic in `TrayConfigurable` and the engine layout file.
817
+ For more advanced usage or to contribute improvements, see the tray logic in `MetaWorkflows::TrayConfigurable` and the engine layout file.
803
818
 
804
819
  ## Confluence Documentation
805
820
 
@@ -1,7 +1,7 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
3
  export default class extends Controller {
4
- static targets = ['textarea', 'form', 'structuredInputForm', 'hiddenMessage'];
4
+ static targets = ['textarea', 'form', 'structuredInputForm', 'hiddenMessage', 'structuredInput'];
5
5
 
6
6
  connect() {
7
7
  this.submitted = false;
@@ -14,7 +14,6 @@ export default class extends Controller {
14
14
  handleKeyDown(event) {
15
15
  if (event.key === 'Enter' && !event.shiftKey) {
16
16
  event.preventDefault();
17
- event.stopPropagation();
18
17
  this.handleSubmit();
19
18
  }
20
19
  }
@@ -24,7 +23,22 @@ export default class extends Controller {
24
23
  return;
25
24
  }
26
25
 
27
- if (!this.hasTextareaTarget || this.textareaTarget.value.trim() === '') {
26
+ // Check if we have structured input selections
27
+ const hasStructuredSelections = this.hasStructuredInputTargets.some(input =>
28
+ input.checked || (input.type === 'range' && input.value !== input.min)
29
+ );
30
+
31
+ if (hasStructuredSelections) {
32
+ // Submit the structured form to StructuredHumansController
33
+ this.submitted = true;
34
+ this.hideStructuredInputForm();
35
+ this.structuredInputFormTarget.requestSubmit();
36
+ return;
37
+ }
38
+
39
+ // Otherwise, handle normal text submission to HumansController
40
+ const textValue = this.hasTextareaTarget ? this.textareaTarget.value.trim() : '';
41
+ if (!textValue) {
28
42
  return;
29
43
  }
30
44
 
@@ -1,42 +1,61 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
3
  export default class extends Controller {
4
- static targets = ['form', 'submitButton', 'checkbox', 'slider'];
4
+ static targets = ['form', 'checkbox', 'slider'];
5
5
 
6
6
  connect() {
7
7
  this.submitted = false;
8
+ this.setupKeyboardListener();
8
9
  }
9
10
 
10
- sliderTargetConnected(slider) {
11
- this.updateSliderAria(slider);
11
+ disconnect() {
12
+ this.removeKeyboardListener();
12
13
  }
13
14
 
14
- updateSliderAria(slider) {
15
- slider.setAttribute('aria-valuenow', slider.value);
16
- slider.setAttribute('aria-valuetext', slider.value);
15
+ setupKeyboardListener() {
16
+ this.keydownHandler = this.handleKeyDown.bind(this);
17
+ if (this.hasFormTarget) {
18
+ this.formTarget.addEventListener('keydown', this.keydownHandler);
19
+ }
17
20
  }
18
21
 
19
- handleSliderChange(event) {
20
- this.updateSliderAria(event.target);
22
+ removeKeyboardListener() {
23
+ if (this.keydownHandler && this.hasFormTarget) {
24
+ this.formTarget.removeEventListener('keydown', this.keydownHandler);
25
+ }
21
26
  }
22
27
 
23
- checkboxTargetConnected() {
24
- this.updateSubmitButtonState();
28
+ handleKeyDown(event) {
29
+ if (event.key === 'Enter' && !event.shiftKey) {
30
+ // Check if we have selected checkboxes
31
+ const selectedCheckboxes = this.checkboxTargets.filter(checkbox => checkbox.checked);
32
+
33
+ if (selectedCheckboxes.length > 0) {
34
+ event.preventDefault();
35
+ event.stopPropagation();
36
+ this.handleSubmit();
37
+ }
38
+ }
25
39
  }
26
40
 
27
- checkboxTargetDisconnected() {
28
- this.updateSubmitButtonState();
41
+ sliderTargetConnected(slider) {
42
+ this.updateSliderAria(slider);
43
+ this.updateSliderFill(slider);
29
44
  }
30
45
 
31
- updateSubmitButtonState() {
32
- if (!this.hasSubmitButtonTarget) return;
46
+ updateSliderAria(slider) {
47
+ slider.setAttribute('aria-valuenow', slider.value);
48
+ slider.setAttribute('aria-valuetext', slider.value);
49
+ }
33
50
 
34
- const hasSelection = this.checkboxTargets.some(checkbox => checkbox.checked);
35
- this.submitButtonTarget.disabled = !hasSelection;
51
+ updateSliderFill(slider) {
52
+ const percentage = ((slider.value - slider.min) / (slider.max - slider.min)) * 100;
53
+ slider.style.setProperty('--slider-fill', `${percentage}%`);
36
54
  }
37
55
 
38
- handleCheckboxChange() {
39
- this.updateSubmitButtonState();
56
+ handleSliderChange(event) {
57
+ this.updateSliderAria(event.target);
58
+ this.updateSliderFill(event.target);
40
59
  }
41
60
 
42
61
  handleSubmit() {
@@ -48,19 +67,15 @@ export default class extends Controller {
48
67
  this.hideFormAndSubmit();
49
68
  }
50
69
 
51
- handleCheckboxSubmit(event) {
52
- event.preventDefault();
70
+ hideFormAndSubmit() {
71
+ // Hide the structured input form
72
+ if (this.hasFormTarget) {
73
+ this.formTarget.style.display = 'none';
74
+ }
53
75
 
54
- if (this.submitted) {
55
- return;
76
+ // Submit the form to StructuredHumansController
77
+ if (this.hasFormTarget) {
78
+ this.formTarget.requestSubmit();
56
79
  }
57
-
58
- this.submitted = true;
59
- this.hideFormAndSubmit();
60
- }
61
-
62
- hideFormAndSubmit() {
63
- this.formTarget.style.display = 'none';
64
- this.formTarget.requestSubmit();
65
80
  }
66
81
  }
@@ -840,8 +840,7 @@
840
840
  padding: 1rem;
841
841
  background-color: rgba(255, 255, 255, 0.9);
842
842
  border-radius: 0.75rem;
843
- border: 1px solid var(--gray-300);
844
- margin-bottom: 1rem;
843
+ margin-bottom: .5rem;
845
844
  }
846
845
 
847
846
  .structured-input-options {
@@ -856,28 +855,28 @@
856
855
  align-items: center;
857
856
  gap: 0.75rem;
858
857
  padding: 0.75rem 1rem;
859
- border: 1px solid var(--gray-300);
858
+ border: 2px solid transparent;
860
859
  border-radius: 0.5rem;
861
860
  background-color: white;
862
861
  cursor: pointer;
863
862
  transition: all 0.2s ease;
863
+ background-image: linear-gradient(white, white), linear-gradient(var(--gray-300), var(--gray-300));
864
+ background-origin: border-box;
865
+ background-clip: padding-box, border-box;
864
866
  }
865
867
 
866
868
  .structured-radio-option:hover {
867
- background-color: var(--gray-50);
868
- border-color: var(--purple-300);
869
+ background-image: linear-gradient(white, white), linear-gradient(45deg, #F3B51C, #E87C66, #F3B51C, #E87C66);
870
+ background-size: auto, 300% 300%;
871
+ animation: animatedgradient 3s ease alternate infinite;
869
872
  }
870
873
 
871
874
  .structured-radio-option:has(.structured-radio-input:checked) {
872
875
  background-color: var(--purple-50);
873
- border-color: var(--purple-500);
874
876
  }
875
877
 
876
878
  .structured-radio-input {
877
- width: 1.25rem;
878
- height: 1.25rem;
879
- accent-color: var(--purple-600);
880
- cursor: pointer;
879
+ display: none;
881
880
  }
882
881
 
883
882
  .structured-radio-label {
@@ -894,27 +893,32 @@
894
893
  align-items: center;
895
894
  gap: 0.75rem;
896
895
  padding: 0.75rem 1rem;
897
- border: 1px solid var(--gray-300);
896
+ border: 2px solid transparent;
898
897
  border-radius: 0.5rem;
899
898
  background-color: white;
900
899
  cursor: pointer;
901
900
  transition: all 0.2s ease;
901
+ background-image: linear-gradient(white, white), linear-gradient(var(--gray-300), var(--gray-300));
902
+ background-origin: border-box;
903
+ background-clip: padding-box, border-box;
902
904
  }
903
905
 
904
906
  .structured-checkbox-option:hover {
905
- background-color: var(--gray-50);
906
- border-color: var(--purple-300);
907
+ background-image: linear-gradient(white, white), linear-gradient(45deg, #F3B51C, #E87C66, #F3B51C, #E87C66);
908
+ background-size: auto, 300% 300%;
909
+ animation: animatedgradient 3s ease alternate infinite;
907
910
  }
908
911
 
909
912
  .structured-checkbox-option:has(.structured-checkbox-input:checked) {
910
- background-color: var(--purple-50);
911
- border-color: var(--purple-500);
913
+ background-image: linear-gradient(white, white), linear-gradient(45deg, #F3B51C, #E87C66);
912
914
  }
913
915
 
916
+
917
+
914
918
  .structured-checkbox-input {
915
919
  width: 1.25rem;
916
920
  height: 1.25rem;
917
- accent-color: var(--purple-600);
921
+ accent-color: var(--purple-700);
918
922
  cursor: pointer;
919
923
  }
920
924
 
@@ -929,12 +933,14 @@
929
933
  /* Slider Styles */
930
934
  .structured-slider-container {
931
935
  padding: 1rem;
936
+ border: 1px solid var(--gray-300);
937
+ border-radius: 0.5rem;
938
+ background-color: var(--gray-50);
932
939
  }
933
940
 
934
941
  .structured-slider-labels {
935
942
  display: flex;
936
943
  justify-content: space-between;
937
- margin-bottom: 1rem;
938
944
  font-size: 0.875rem;
939
945
  color: var(--gray-600);
940
946
  font-weight: 500;
@@ -948,46 +954,90 @@
948
954
 
949
955
  .structured-slider-input {
950
956
  width: 100%;
951
- height: 0.5rem;
957
+ height: 1rem;
952
958
  border-radius: 0.25rem;
953
- background: var(--gray-200);
959
+ background: transparent;
954
960
  outline: none;
955
961
  -webkit-appearance: none;
956
962
  appearance: none;
957
963
  cursor: pointer;
964
+ --slider-fill: 0%;
965
+ border: none;
966
+ }
967
+
968
+ .structured-slider-input::-webkit-slider-runnable-track {
969
+ width: 100%;
970
+ height: 1rem;
971
+ border-radius: 0.25rem;
972
+ background: linear-gradient(90deg,
973
+ #F3B51C 0%,
974
+ #E87C66 var(--slider-fill),
975
+ #e5e7eb var(--slider-fill),
976
+ #e5e7eb 100%
977
+ );
978
+ background-size: 100% 100%;
979
+ background-repeat: no-repeat;
980
+ border: 1px solid var(--gray-300);
981
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
982
+ }
983
+
984
+ .structured-slider-input::-moz-range-track {
985
+ width: 100%;
986
+ height: 1rem;
987
+ border-radius: 0.25rem;
988
+ background: linear-gradient(90deg,
989
+ #F3B51C 0%,
990
+ #E87C66 var(--slider-fill),
991
+ #e5e7eb var(--slider-fill),
992
+ #e5e7eb 100%
993
+ );
994
+ background-size: 100% 100%;
995
+ background-repeat: no-repeat;
996
+ border: 1px solid var(--gray-300);
997
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
958
998
  }
959
999
 
960
1000
  .structured-slider-input::-webkit-slider-thumb {
961
1001
  -webkit-appearance: none;
962
1002
  appearance: none;
963
- width: 1.5rem;
964
- height: 1.5rem;
965
- border-radius: 50%;
966
- background: var(--purple-600);
1003
+ width: 2.25rem;
1004
+ height: 2.25rem;
1005
+ border-radius: 0.5625rem;
1006
+ background: var(--purple-700);
1007
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='white' viewBox='0 0 320 512'%3e%3cpath d='M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z'/%3e%3c/svg%3e");
1008
+ background-size: 12px 12px;
1009
+ background-position: center;
1010
+ background-repeat: no-repeat;
967
1011
  cursor: pointer;
968
1012
  border: 2px solid white;
969
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
1013
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.25);
970
1014
  transition: all 0.2s ease;
1015
+ margin-top: -0.65rem;
971
1016
  }
972
1017
 
973
1018
  .structured-slider-input::-webkit-slider-thumb:hover {
974
- background: var(--purple-700);
1019
+ background-color: var(--purple-800);
975
1020
  transform: scale(1.1);
976
1021
  }
977
1022
 
978
1023
  .structured-slider-input::-moz-range-thumb {
979
- width: 1.5rem;
980
- height: 1.5rem;
981
- border-radius: 50%;
982
- background: var(--purple-600);
1024
+ width: 2.25rem;
1025
+ height: 2.25rem;
1026
+ border-radius: 0.5625rem;
1027
+ background: var(--purple-700);
1028
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='white' viewBox='0 0 320 512'%3e%3cpath d='M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z'/%3e%3c/svg%3e");
1029
+ background-size: 12px 12px;
1030
+ background-position: center;
1031
+ background-repeat: no-repeat;
983
1032
  cursor: pointer;
984
1033
  border: 2px solid white;
985
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
1034
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.25);
986
1035
  transition: all 0.2s ease;
1036
+ margin-top: -0.65rem;
987
1037
  }
988
1038
 
989
1039
  .structured-slider-input::-moz-range-thumb:hover {
990
- background: var(--purple-700);
1040
+ background-color: var(--purple-800);
991
1041
  transform: scale(1.1);
992
1042
  }
993
1043
 
@@ -1062,3 +1112,16 @@
1062
1112
  white-space: nowrap;
1063
1113
  border: 0;
1064
1114
  }
1115
+
1116
+ /* Animated Gradient Keyframes */
1117
+ @keyframes animatedgradient {
1118
+ 0% {
1119
+ background-position: 0% 50%;
1120
+ }
1121
+ 50% {
1122
+ background-position: 100% 50%;
1123
+ }
1124
+ 100% {
1125
+ background-position: 0% 50%;
1126
+ }
1127
+ }
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MetaWorkflows
4
+ module TrayConfigurable
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ helper_method :tray_config
9
+ end
10
+
11
+ def tray_config
12
+ @tray_config ||= {
13
+ beta: {
14
+ visible: true,
15
+ collapsible: true,
16
+ lexi: false
17
+ },
18
+ gamma: {
19
+ visible: true,
20
+ collapsible: true,
21
+ lexi: false
22
+ },
23
+ delta: {
24
+ visible: true,
25
+ collapsible: true,
26
+ lexi: false
27
+ }
28
+ }
29
+ end
30
+
31
+ # Override in controllers to customize tray configuration
32
+ # This method should be called as a before_action in the application controller.
33
+ def configure_trays
34
+ raise NotImplementedError, "#{self.class.name} must implement #configure_trays to define tray configuration"
35
+ end
36
+ end
37
+ end
@@ -4,15 +4,6 @@ module MetaWorkflows
4
4
  class ApplicationController < ActionController::Base
5
5
  protect_from_forgery with: :exception
6
6
 
7
- include TrayConfigurable
8
- before_action :configure_trays
9
-
10
- def configure_trays
11
- super
12
- tray_config[:beta][:visible] = false
13
- tray_config[:gamma][:visible] = false
14
- tray_config[:delta][:visible] = false
15
- end
16
7
  # Add any MetaWorkflows-specific controller functionality here
17
8
  # This ensures proper engine isolation
18
9
  end
@@ -12,6 +12,7 @@
12
12
  value="<%= option['value'] %>"
13
13
  class="structured-checkbox-input"
14
14
  data-meta-workflows--structured-form-submit-target="checkbox"
15
+ data-meta-workflows--lexi-form-submit-target="structuredInput"
15
16
  data-action="change->meta-workflows--structured-form-submit#handleCheckboxChange"
16
17
  aria-describedby="structured-checkbox-help"
17
18
  >
@@ -22,19 +23,4 @@
22
23
  <% end %>
23
24
  </div>
24
25
  <div id="structured-checkbox-help" class="sr-only">Use space to select/deselect options</div>
25
-
26
- <div class="structured-submit-container">
27
- <button
28
- type="submit"
29
- class="structured-submit-button"
30
- data-meta-workflows--structured-form-submit-target="submitButton"
31
- data-action="click->meta-workflows--structured-form-submit#handleCheckboxSubmit"
32
- disabled
33
- aria-describedby="structured-submit-help"
34
- aria-label="Submit your selections"
35
- >
36
- <i class="fa-solid fa-arrow-up"></i>
37
- </button>
38
- <div id="structured-submit-help" class="sr-only">Submit your selections. Button is disabled until at least one option is selected.</div>
39
- </div>
40
26
  </div>
@@ -36,12 +36,15 @@
36
36
  } %>
37
37
  </div>
38
38
 
39
+ <!-- Structured inputs area (above avatar) -->
40
+ <div class="structured-input-area" data-controller="meta-workflows--lexi-form-submit">
41
+ <%= render meta_structured_input, record: local_assigns[:record], structured_input_config: false, is_structured_input: false %>
42
+ </div>
43
+
39
44
  <!-- Avatar and input area pinned to bottom -->
40
45
  <div class="lexi-chat-bottom">
41
46
  <%= image_tag("lexi-expanded.png", alt: "Lexi Avatar", class: "lexi-avatar") %>
42
- <div class="lexi-input-wrapper" data-controller="meta-workflows--lexi-form-submit">
43
- <%= render meta_structured_input, record: local_assigns[:record], structured_input_config: false, is_structured_input: false %>
44
-
47
+ <div class="lexi-input-wrapper">
45
48
  <%= render partial: meta_response_form, locals: {record: local_assigns[:record], response_enabled: true, workflow_execution_id: active_execution&.id,
46
49
  chat_id: active_execution&.workflow_steps&.last&.chat&.id, workflow_execution: active_execution, is_structured_input: is_structured_input } %>
47
50
  </div>
@@ -12,6 +12,7 @@
12
12
  name="single_choice_selection"
13
13
  value="<%= option['value'] %>"
14
14
  class="structured-radio-input"
15
+ data-meta-workflows--lexi-form-submit-target="structuredInput"
15
16
  data-action="change->meta-workflows--structured-form-submit#handleSubmit"
16
17
  aria-describedby="structured-radio-help"
17
18
  required
@@ -19,6 +19,7 @@
19
19
  value="<%= options['min']['value'] %>"
20
20
  class="structured-slider-input"
21
21
  data-meta-workflows--structured-form-submit-target="slider"
22
+ data-meta-workflows--lexi-form-submit-target="structuredInput"
22
23
  data-action="change->meta-workflows--structured-form-submit#handleSubmit input->meta-workflows--structured-form-submit#handleSliderChange"
23
24
  aria-describedby="structured-slider-help"
24
25
  aria-valuemin="<%= options['min']['value'] %>"
@@ -3,7 +3,7 @@
3
3
  module MetaWorkflows
4
4
  MAJOR = 0
5
5
  MINOR = 9
6
- PATCH = 30 # this is automatically incremented by the build process
6
+ PATCH = 32 # this is automatically incremented by the build process
7
7
 
8
8
  VERSION = "#{MetaWorkflows::MAJOR}.#{MetaWorkflows::MINOR}.#{MetaWorkflows::PATCH}".freeze
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meta_workflows
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.30
4
+ version: 0.9.32
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leonid Medovyy
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2025-07-24 00:00:00.000000000 Z
12
+ date: 2025-07-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -130,7 +130,7 @@ files:
130
130
  - app/assets/javascripts/meta_workflows_manifest.js
131
131
  - app/assets/stylesheets/meta_workflows/application.css
132
132
  - app/controllers/concerns/meta_workflows/streamable.rb
133
- - app/controllers/concerns/tray_configurable.rb
133
+ - app/controllers/concerns/meta_workflows/tray_configurable.rb
134
134
  - app/controllers/meta_workflows/application_controller.rb
135
135
  - app/controllers/meta_workflows/base_debug_controller.rb
136
136
  - app/controllers/meta_workflows/debug_controller.rb
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module TrayConfigurable
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- helper_method :tray_config
8
- end
9
-
10
- def tray_config
11
- @tray_config ||= {
12
- beta: {
13
- visible: true,
14
- collapsible: true,
15
- lexi: false
16
- },
17
- gamma: {
18
- visible: true,
19
- collapsible: true,
20
- lexi: false
21
- },
22
- delta: {
23
- visible: true,
24
- collapsible: true,
25
- lexi: false
26
- }
27
- }
28
- end
29
-
30
- # Override in controllers to customize tray configuration
31
- def configure_trays
32
- # Example:
33
- # tray_config[:beta][:visible] = true
34
- # tray_config[:gamma][:collapsible] = false
35
- end
36
- end