diff --git a/changelog/62_UNRELEASED_xxxx-xx-xx.md b/changelog/62_UNRELEASED_xxxx-xx-xx.md index 3fba5663..b3e3ccea 100644 --- a/changelog/62_UNRELEASED_xxxx-xx-xx.md +++ b/changelog/62_UNRELEASED_xxxx-xx-xx.md @@ -76,7 +76,8 @@ - => The on chore execution tracking entered information is then visible on the corresponding chore journal entry - Fixed that tracking chores with "Done by" a different user was not possible -### Userfield fixes +### Userfield improvements/fixes +- Userfields can now be configured as mandatory (new Userfield option, defaults to disabled) - Fixed that numeric Userfields were initialised with `1.0` - Fixed that shortcuts (up/down key) and the format did not work correctly when using multiple date/time Userfields per object - Fixed that Userfields were not saved when adding a product or a recipe (only on editing) diff --git a/localization/strings.pot b/localization/strings.pot index ad9acd4b..468e5db2 100644 --- a/localization/strings.pot +++ b/localization/strings.pot @@ -2157,3 +2157,12 @@ msgstr "" msgid "Mark this item as undone" msgstr "" + +msgid "Mandatory" +msgstr "" + +msgid "Mandatory Userfield" +msgstr "" + +msgid "When enabled, then this field must be filled on the destination form" +msgstr "" diff --git a/migrations/0145.sql b/migrations/0145.sql new file mode 100644 index 00000000..18b1beb9 --- /dev/null +++ b/migrations/0145.sql @@ -0,0 +1,2 @@ +ALTER TABLE userfields +ADD input_required TINYINT NOT NULL DEFAULT 0 CHECK(input_required IN (0, 1)); diff --git a/public/viewjs/components/userfieldsform.js b/public/viewjs/components/userfieldsform.js index eca3f2d0..968dd638 100644 --- a/public/viewjs/components/userfieldsform.js +++ b/public/viewjs/components/userfieldsform.js @@ -158,6 +158,11 @@ Grocy.Components.UserfieldsForm.Load = function() input.val(value); } }); + + $("form").each(function() + { + Grocy.FrontendHelpers.ValidateForm(this.id); + }); }, function(xhr) { @@ -179,3 +184,11 @@ $(".userfield-link").keyup(function(e) formRow.find(".userfield-input").val(JSON.stringify(value)); }); + +$(".userfield-input").change(function(e) +{ + $("form").each(function() + { + Grocy.FrontendHelpers.ValidateForm(this.id); + }); +}); diff --git a/views/components/userfieldsform.blade.php b/views/components/userfieldsform.blade.php index becb74ce..8bfc6543 100644 --- a/views/components/userfieldsform.blade.php +++ b/views/components/userfieldsform.blade.php @@ -19,14 +19,18 @@ + data-userfield-name="{{ $userfield->name }}" + @if($userfield->input_required == 1) required @endif> +
{{ $__t('Mandatory Userfield') }}
@elseif($userfield->type == \Grocy\Services\UserfieldsService::USERFIELD_TYPE_SINGLE_MULTILINE_TEXT)
+ data-userfield-name="{{ $userfield->name }}" + @if($userfield->input_required == 1) required @endif> +
{{ $__t('Mandatory Userfield') }}
@elseif($userfield->type == \Grocy\Services\UserfieldsService::USERFIELD_TYPE_INTEGRAL_NUMBER) @include('components.numberpicker', array( @@ -34,7 +38,7 @@ 'label' => $userfield->caption, 'noNameAttribute' => true, 'min' => 0, - 'isRequired' => false, + 'isRequired' => $userfield->input_required == 1, 'additionalCssClasses' => 'userfield-input', 'additionalAttributes' => 'data-userfield-name="' . $userfield->name . '"', 'value' => '' @@ -46,7 +50,7 @@ 'noNameAttribute' => true, 'min' => 0, 'decimals' => 4, - 'isRequired' => false, + 'isRequired' => $userfield->input_required == 1, 'additionalCssClasses' => 'userfield-input', 'additionalAttributes' => 'data-userfield-name="' . $userfield->name . '"', 'value' => '' @@ -61,7 +65,7 @@ 'limitEndToNow' => false, 'limitStartToNow' => false, 'additionalGroupCssClasses' => 'date-only-datetimepicker', - 'isRequired' => false, + 'isRequired' => $userfield->input_required == 1, 'additionalCssClasses' => 'userfield-input', 'additionalAttributes' => 'data-userfield-name="' . $userfield->name . '"' )) @@ -74,7 +78,7 @@ 'initWithNow' => false, 'limitEndToNow' => false, 'limitStartToNow' => false, - 'isRequired' => false, + 'isRequired' => $userfield->input_required == 1, 'additionalCssClasses' => 'userfield-input', 'additionalAttributes' => 'data-userfield-name="' . $userfield->name . '"' )) @@ -85,21 +89,25 @@ type="checkbox" id="userfield-{{ $userfield->name }}" data-userfield-name="{{ $userfield->name }}" - value="1"> + value="1" + @if($userfield->input_required == 1) required @endif> +
{{ $__t('Mandatory Userfield') }}
@elseif($userfield->type == \Grocy\Services\UserfieldsService::USERFIELD_TYPE_PRESET_LIST)
+
{{ $__t('Mandatory Userfield') }}
@elseif($userfield->type == \Grocy\Services\UserfieldsService::USERFIELD_TYPE_PRESET_CHECKLIST)
@@ -108,18 +116,21 @@ class="form-control userfield-input selectpicker" data-userfield-name="{{ $userfield->name }}" data-actions-Box="true" - data-live-search="true"> + data-live-search="true" + @if($userfield->input_required == 1) required @endif> @foreach(preg_split('/\r\n|\r|\n/', $userfield->config) as $option) @endforeach +
{{ $__t('Mandatory Userfield') }}
@elseif($userfield->type == \Grocy\Services\UserfieldsService::USERFIELD_TYPE_LINK)
+ data-userfield-name="{{ $userfield->name }}" + @if($userfield->input_required == 1) required @endif>
@elseif($userfield->type == \Grocy\Services\UserfieldsService::USERFIELD_TYPE_LINK_WITH_TITLE)
@@ -128,13 +139,16 @@
+ placeholder="{{ $__t('Title') }}" + @if($userfield->input_required == 1) required @endif>
+ placeholder="{{ $__t('Link') }}" + @if($userfield->input_required == 1) required @endif>
+
{{ $__t('Mandatory Userfield') }}
+ data-userfield-name="{{ $userfield->name }}" + @if($userfield->input_required == 1) required @endif> +
{{ $__t('Mandatory Userfield') }}
@@ -171,11 +187,13 @@
+ data-userfield-name="{{ $userfield->name }}" + @if($userfield->input_required == 1) required @endif> +
{{ $__t('Mandatory Userfield') }}
diff --git a/views/userfieldform.blade.php b/views/userfieldform.blade.php index 595a7c79..abbe8c3e 100644 --- a/views/userfieldform.blade.php +++ b/views/userfieldform.blade.php @@ -128,6 +128,22 @@
+
+
+ input_required == 1) checked @endif class="form-check-input custom-control-input" type="checkbox" id="input_required" name="input_required" value="1"> + +
+
+