diff --git a/assets/js/app.js b/assets/js/app.js index d81a2cf0..652162a6 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -45,6 +45,7 @@ import "./datatables"; import "./error_handler"; //import "./tab_remember"; import "./register_events"; +import "./tristate_checkboxes"; //Define jquery globally window.$ = window.jQuery = require("jquery") diff --git a/assets/js/register_events.js b/assets/js/register_events.js index 7022d5f9..075966ac 100644 --- a/assets/js/register_events.js +++ b/assets/js/register_events.js @@ -5,7 +5,6 @@ import "bootstrap-fileinput/css/fileinput.css" //JS -import "./lib/jquery.tristate" import "bootstrap-fileinput"; @@ -14,8 +13,6 @@ const RegisterEventHelper = class { constructor() { this.registerTooltips(); this.registerJumpToTopBtn(); - - this.registerTriStateCheckboxes(); this.registerFileInput(); this.registerSpecialCharInput(); @@ -67,27 +64,6 @@ const RegisterEventHelper = class { }); } - registerTriStateCheckboxes() { - this.registerLoadHandler(() => { - $(".tristate").tristate( { - checked: "true", - unchecked: "false", - indeterminate: "indeterminate", - }); - - $('.permission_multicheckbox:checkbox').change(function() { - //Find the other checkboxes in this row, and change their value - var $row = $(this).parents('tr'); - - //@ts-ignore - var new_state = $(this).tristate('state'); - - //@ts-ignore - $('.tristate:checkbox', $row).tristate('state', new_state); - }); - }) - } - registerSpecialCharInput() { this.registerLoadHandler(() => { //@ts-ignore diff --git a/assets/js/tristate_checkboxes.js b/assets/js/tristate_checkboxes.js new file mode 100644 index 00000000..84d82380 --- /dev/null +++ b/assets/js/tristate_checkboxes.js @@ -0,0 +1,51 @@ +'use strict'; + +import "./lib/jquery.tristate" + +const TristateHelper = class { + constructor() { + this.registerTriStateCheckboxes(); + this.registerSubmitHandler(); + } + + registerSubmitHandler() { + document.addEventListener("turbo:submit-start", (e) => { + var form = e.detail.formSubmission.formElement; + var formData = e.detail.formSubmission.formData; + + var $tristate_checkboxes = $('.tristate:checkbox', form); + + //Iterate over each tristate checkbox in the form and set formData to the correct value + $tristate_checkboxes.each(function() { + var $checkbox = $(this); + var state = $checkbox.tristate('state'); + + formData.set($checkbox.attr('name'), state); + }); + }); + } + + registerTriStateCheckboxes() { + //Initialize tristate checkboxes and if needed the multicheckbox functionality + document.addEventListener("turbo:load", () => { + $(".tristate").tristate( { + checked: "true", + unchecked: "false", + indeterminate: "indeterminate", + }); + + $('.permission_multicheckbox:checkbox').change(function() { + //Find the other checkboxes in this row, and change their value + var $row = $(this).parents('tr'); + + //@ts-ignore + var new_state = $(this).tristate('state'); + + //@ts-ignore + $('.tristate:checkbox', $row).tristate('state', new_state); + }); + }) + } +} + +export default new TristateHelper(); \ No newline at end of file diff --git a/src/Form/Permissions/PermissionType.php b/src/Form/Permissions/PermissionType.php index 9914235a..4da75c3e 100644 --- a/src/Form/Permissions/PermissionType.php +++ b/src/Form/Permissions/PermissionType.php @@ -97,6 +97,9 @@ class PermissionType extends AbstractType 'mapped' => false, 'label' => $operation['label'] ?? null, 'disabled' => $options['disabled'], + 'label_attr' => [ + 'class' => 'checkbox-inline opacity-100', + ], ]); } diff --git a/src/Form/Type/TriStateCheckboxType.php b/src/Form/Type/TriStateCheckboxType.php index 48755787..17c15a58 100644 --- a/src/Form/Type/TriStateCheckboxType.php +++ b/src/Form/Type/TriStateCheckboxType.php @@ -174,6 +174,7 @@ final class TriStateCheckboxType extends AbstractType implements DataTransformer case '': return false; case 'indeterminate': + case 'null': return null; default: throw new InvalidArgumentException('Invalid value encountered!: '.$value); diff --git a/templates/Form/extendedBootstrap4_layout.html.twig b/templates/Form/extendedBootstrap4_layout.html.twig index 823138b4..ca9772b3 100644 --- a/templates/Form/extendedBootstrap4_layout.html.twig +++ b/templates/Form/extendedBootstrap4_layout.html.twig @@ -104,7 +104,7 @@ {%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%} {%- if 'checkbox-custom' in parent_label_class -%} {%- set attr = attr|merge({class: (attr.class|default('') ~ ' form-check-input')|trim}) -%} -
+
{{- form_label(form, null, { widget: block('tr_parent') }) -}}
{%- else -%} diff --git a/templates/Form/permissionLayout.html.twig b/templates/Form/permissionLayout.html.twig index 4124e960..b77b8f35 100644 --- a/templates/Form/permissionLayout.html.twig +++ b/templates/Form/permissionLayout.html.twig @@ -29,7 +29,7 @@ {% block permission_group_row %} {{ form_errors(form) }} - +
@@ -52,17 +52,17 @@
-
- - +
+ +
-
- - +
+ +
-
- - +
+ +
{% trans %}permission.edit.permission{% endtrans %}