diff --git a/app/Http/Controllers/Api/CustomFieldsetsController.php b/app/Http/Controllers/Api/CustomFieldsetsController.php index 27da7733cd..12436ebbfa 100644 --- a/app/Http/Controllers/Api/CustomFieldsetsController.php +++ b/app/Http/Controllers/Api/CustomFieldsetsController.php @@ -94,6 +94,18 @@ class CustomFieldsetsController extends Controller $fieldset->fill($request->all()); if ($fieldset->save()) { + // Sync fieldset with auto_add_to_fieldsets + $fields = CustomField::select('id')->where('auto_add_to_fieldsets', '=', '1')->get(); + + if ($fields->count() > 0) { + + foreach ($fields as $field) { + $field_ids[] = $field->id; + } + + $fieldset->fields()->sync($field_ids); + } + return response()->json(Helper::formatStandardApiResponse('success', $fieldset, trans('admin/custom_fields/message.fieldset.create.success'))); } diff --git a/app/Http/Controllers/CustomFieldsController.php b/app/Http/Controllers/CustomFieldsController.php index e29cbaa3fc..bbc3790d63 100644 --- a/app/Http/Controllers/CustomFieldsController.php +++ b/app/Http/Controllers/CustomFieldsController.php @@ -7,6 +7,7 @@ use App\Http\Requests\CustomFieldRequest; use App\Models\CustomField; use App\Models\CustomFieldset; use Illuminate\Support\Facades\Auth; +use Illuminate\Http\Request; use Redirect; /** @@ -45,7 +46,7 @@ class CustomFieldsController extends Controller * @see CustomFieldsController::storeField() * @author [A. Gianotto] [] * @since [v5.1.5] - * @return Redirect + * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ public function show() @@ -63,14 +64,17 @@ class CustomFieldsController extends Controller * @return \Illuminate\Support\Facades\View * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function create() + public function create(Request $request) { $this->authorize('create', CustomField::class); + $fieldsets = CustomFieldset::get(); return view('custom_fields.fields.edit', [ 'predefinedFormats' => Helper::predefined_formats(), - 'customFormat' => '', - ])->with('field', new CustomField()); + 'customFormat' => '', + 'fieldsets' => $fieldsets, + 'field' => new CustomField(), + ]); } /** @@ -79,7 +83,7 @@ class CustomFieldsController extends Controller * @see CustomFieldsController::createField() * @author [Brady Wetherington] [] * @since [v1.8] - * @return Redirect + * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ public function store(CustomFieldRequest $request) @@ -104,6 +108,7 @@ class CustomFieldsController extends Controller "show_in_email" => $show_in_email, "is_unique" => $request->get("is_unique", 0), "display_in_user_view" => $display_in_user_view, + "auto_add_to_fieldsets" => $request->get("auto_add_to_fieldsets", 0), "user_id" => Auth::id() ]); @@ -115,10 +120,20 @@ class CustomFieldsController extends Controller } if ($field->save()) { + + // Sync fields with fieldsets + $fieldset_array = $request->input('associate_fieldsets'); + if ($request->has('associate_fieldsets') && (is_array($fieldset_array))) { + $field->fieldset()->sync(array_keys($fieldset_array)); + } else { + $field->fieldset()->sync([]); + } + + return redirect()->route('fields.index')->with('success', trans('admin/custom_fields/message.field.create.success')); } - return redirect()->back()->withInput() + return redirect()->back()->with('selected_fieldsets', $request->input('associate_fieldsets'))->withInput() ->with('error', trans('admin/custom_fields/message.field.create.error')); } @@ -128,7 +143,7 @@ class CustomFieldsController extends Controller * * @author [A. Gianotto] [] * @since [v3.0] - * @return Redirect + * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ public function deleteFieldFromFieldset($field_id, $fieldset_id) @@ -147,8 +162,7 @@ class CustomFieldsController extends Controller ->with('success', trans('admin/custom_fields/message.field.delete.success')); } else { return redirect()->back()->withErrors(['message' => "Field is in use and cannot be deleted."]); - } - + } } return redirect()->back()->withErrors(['message' => "Error deleting field from fieldset"]); @@ -161,7 +175,7 @@ class CustomFieldsController extends Controller * * @author [Brady Wetherington] [] * @since [v1.8] - * @return Redirect + * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ public function destroy($field_id) @@ -190,12 +204,12 @@ class CustomFieldsController extends Controller * @return \Illuminate\Support\Facades\View * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function edit($id) + public function edit(Request $request, $id) { if ($field = CustomField::find($id)) { $this->authorize('update', $field); - + $fieldsets = CustomFieldset::get(); $customFormat = ''; if ((stripos($field->format, 'regex') === 0) && ($field->format !== CustomField::PREDEFINED_FORMATS['MAC'])) { $customFormat = $field->format; @@ -204,6 +218,7 @@ class CustomFieldsController extends Controller return view('custom_fields.fields.edit', [ 'field' => $field, 'customFormat' => $customFormat, + 'fieldsets' => $fieldsets, 'predefinedFormats' => Helper::predefined_formats(), ]); } @@ -222,7 +237,7 @@ class CustomFieldsController extends Controller * @author [A. Gianotto] [] * @param int $id * @since [v4.0] - * @return Redirect + * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ public function update(CustomFieldRequest $request, $id) @@ -249,6 +264,7 @@ class CustomFieldsController extends Controller $field->show_in_email = $show_in_email; $field->is_unique = $request->get("is_unique", 0); $field->display_in_user_view = $display_in_user_view; + $field->auto_add_to_fieldsets = $request->get("auto_add_to_fieldsets", 0); if ($request->get('format') == 'CUSTOM REGEX') { $field->format = e($request->get('custom_format')); @@ -256,11 +272,21 @@ class CustomFieldsController extends Controller $field->format = e($request->get('format')); } - if($field->element == 'checkbox' || $field->element == 'radio'){ + if ($field->element == 'checkbox' || $field->element == 'radio'){ $field->format = 'ANY'; } if ($field->save()) { + + + // Sync fields with fieldsets + $fieldset_array = $request->input('associate_fieldsets'); + if ($request->has('associate_fieldsets') && (is_array($fieldset_array))) { + $field->fieldset()->sync(array_keys($fieldset_array)); + } else { + $field->fieldset()->sync([]); + } + return redirect()->route('fields.index')->with('success', trans('admin/custom_fields/message.field.update.success')); } diff --git a/app/Http/Controllers/CustomFieldsetsController.php b/app/Http/Controllers/CustomFieldsetsController.php index 8c14502285..dbee97b776 100644 --- a/app/Http/Controllers/CustomFieldsetsController.php +++ b/app/Http/Controllers/CustomFieldsetsController.php @@ -93,16 +93,27 @@ class CustomFieldsetsController extends Controller { $this->authorize('create', CustomField::class); - $cfset = new CustomFieldset([ + $fieldset = new CustomFieldset([ 'name' => e($request->get('name')), 'user_id' => Auth::user()->id, ]); - $validator = Validator::make($request->all(), $cfset->rules); - if ($validator->passes()) { - $cfset->save(); + $validator = Validator::make($request->all(), $fieldset->rules); - return redirect()->route('fieldsets.show', [$cfset->id]) + if ($validator->passes()) { + $fieldset->save(); + + // Sync fieldset with auto_add_to_fieldsets + $fields = CustomField::select('id')->where('auto_add_to_fieldsets', '=', '1')->get(); + if ($fields->count() > 0) { + foreach ($fields as $field) { + $field_ids[] = $field->id; + } + + $fieldset->fields()->sync($field_ids); + } + + return redirect()->route('fieldsets.show', [$fieldset->id]) ->with('success', trans('admin/custom_fields/message.fieldset.create.success')); } diff --git a/app/Http/Requests/CustomFieldRequest.php b/app/Http/Requests/CustomFieldRequest.php index 7c6ba1e97e..0c2ec0ae60 100644 --- a/app/Http/Requests/CustomFieldRequest.php +++ b/app/Http/Requests/CustomFieldRequest.php @@ -26,6 +26,8 @@ class CustomFieldRequest extends FormRequest { $rules = []; + $rules['associate_fieldsets.*'] = 'nullable|integer|exists:custom_fieldsets,id'; + switch ($this->method()) { // Brand new @@ -54,4 +56,11 @@ class CustomFieldRequest extends FormRequest return $rules; } + + public function messages() + { + return [ + 'associate_fieldsets.*.exists' => trans('admin/custom_fields/message/does_not_exist'), + ]; + } } diff --git a/app/Http/Transformers/CustomFieldsTransformer.php b/app/Http/Transformers/CustomFieldsTransformer.php index 9ada5183ab..db467be0bd 100644 --- a/app/Http/Transformers/CustomFieldsTransformer.php +++ b/app/Http/Transformers/CustomFieldsTransformer.php @@ -48,6 +48,7 @@ class CustomFieldsTransformer 'type' => e($field->element), 'required' => (($field->pivot) && ($field->pivot->required=='1')) ? true : false, 'display_in_user_view' => ($field->display_in_user_view =='1') ? true : false, + 'auto_add_to_fieldsets' => ($field->auto_add_to_fieldsets == '1') ? true : false, 'created_at' => Helper::getFormattedDateObject($field->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($field->updated_at, 'datetime'), ]; diff --git a/app/Models/CustomField.php b/app/Models/CustomField.php index fcab5b25ff..b39650e74b 100644 --- a/app/Models/CustomField.php +++ b/app/Models/CustomField.php @@ -52,6 +52,7 @@ class CustomField extends Model 'name' => 'required|unique:custom_fields', 'element' => 'required|in:text,listbox,textarea,checkbox,radio', 'field_encrypted' => 'nullable|boolean', + 'auto_add_to_fieldsets' => 'boolean', ]; /** @@ -69,6 +70,8 @@ class CustomField extends Model 'show_in_email', 'is_unique', 'display_in_user_view', + 'auto_add_to_fieldsets', + ]; /** diff --git a/database/factories/CustomFieldFactory.php b/database/factories/CustomFieldFactory.php index bfa41b4d8d..adcca9cae1 100644 --- a/database/factories/CustomFieldFactory.php +++ b/database/factories/CustomFieldFactory.php @@ -25,6 +25,7 @@ class CustomFieldFactory extends Factory 'name' => $this->faker->catchPhrase(), 'format' => '', 'element' => 'text', + 'auto_add_to_fieldsets' => '0', ]; } diff --git a/database/migrations/2023_04_25_085912_add_autoadd_to_customfields.php b/database/migrations/2023_04_25_085912_add_autoadd_to_customfields.php new file mode 100644 index 0000000000..918bec9c5c --- /dev/null +++ b/database/migrations/2023_04_25_085912_add_autoadd_to_customfields.php @@ -0,0 +1,34 @@ +boolean('auto_add_to_fieldsets')->nullable()->default(0); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('custom_fields', function (Blueprint $table) { + if (Schema::hasColumn('custom_fields', 'auto_add_to_fieldsets')) { + $table->dropColumn('auto_add_to_fieldsets'); + } + }); + } +} diff --git a/resources/lang/en/admin/custom_fields/general.php b/resources/lang/en/admin/custom_fields/general.php index 9dae380aa5..1923aa7f4a 100644 --- a/resources/lang/en/admin/custom_fields/general.php +++ b/resources/lang/en/admin/custom_fields/general.php @@ -49,4 +49,6 @@ return [ 'unique' => 'Unique', 'display_in_user_view' => 'Allow the checked out user to view these values in their View Assigned Assets page', 'display_in_user_view_table' => 'Visible to User', + 'auto_add_to_fieldsets' => 'Automatically add this to every new fieldset', + 'add_to_preexisting_fieldsets' => 'Add to any existing fieldsets', ]; diff --git a/resources/views/custom_fields/fields/edit.blade.php b/resources/views/custom_fields/fields/edit.blade.php index 8e025e4b6b..9d51138442 100644 --- a/resources/views/custom_fields/fields/edit.blade.php +++ b/resources/views/custom_fields/fields/edit.blade.php @@ -1,8 +1,8 @@ -@php - use App\Models\CustomField; -@endphp +@extends('layouts/default', [ + 'helpText' => trans('admin/custom_fields/general.about_fieldsets_text'), + 'helpPosition' => 'right', +]) -@extends('layouts/default') {{-- Page title --}} @section('title') @@ -21,24 +21,31 @@ {{-- Page content --}} @section('content') -
-
- @if ($field->id) - {{ Form::open(['route' => ['fields.update', $field->id], 'class'=>'form-horizontal']) }} - {{ method_field('PUT') }} - @else - {{ Form::open(['route' => 'fields.store', 'class'=>'form-horizontal']) }} - @endif + @if ($field->id) + {{ Form::open(['route' => ['fields.update', $field->id], 'class'=>'form-horizontal']) }} + {{ method_field('PUT') }} + @else + {{ Form::open(['route' => 'fields.store', 'class'=>'form-horizontal']) }} + @endif + @csrf +
+
+
+ +
+ +
+
-