diff --git a/app/sprinkles/account/src/Database/Migrations/v430/UpdateUsersTable.php b/app/sprinkles/account/src/Database/Migrations/v430/UpdateUsersTable.php index 724e357ed..94a61e64e 100644 --- a/app/sprinkles/account/src/Database/Migrations/v430/UpdateUsersTable.php +++ b/app/sprinkles/account/src/Database/Migrations/v430/UpdateUsersTable.php @@ -40,7 +40,7 @@ public function up() { if ($this->schema->hasTable('users')) { $this->schema->table('users', function (Blueprint $table) { - $table->unsignedInteger('group_id')->comment('The id of the user group.')->nullable()->change(); + $table->unsignedInteger('group_id')->default(null)->comment('The id of the user group.')->nullable()->change(); }); } } diff --git a/app/sprinkles/admin/assets/userfrosting/js/widgets/users.js b/app/sprinkles/admin/assets/userfrosting/js/widgets/users.js index 6adbf32df..9f57d7c5c 100644 --- a/app/sprinkles/admin/assets/userfrosting/js/widgets/users.js +++ b/app/sprinkles/admin/assets/userfrosting/js/widgets/users.js @@ -6,7 +6,7 @@ * Set up the form in a modal after being successfully attached to the body. */ function attachUserForm() { - $("body").on('renderSuccess.ufModal', function (data) { + $("body").on('renderSuccess.ufModal', function(data) { var modal = $(this).ufModal('getModal'); var form = modal.find('.js-form'); @@ -15,11 +15,7 @@ function attachUserForm() { width: '100%' }); - // Needed to allow select2 to render a 'empty' list item. - form.find(".js-select2-group").select2({ - width: '100%', - templateResult: item => item.text || '\u200B' - }); + // Set up the form for submission form.ufForm({ @@ -48,14 +44,14 @@ function toggleChangePasswordMode(el, userName, changePasswordMode) { if (validator) { //Iterate through named elements inside of the form, and mark them as error free el.find("input[type='password']").each(function() { - validator.successList.push(this); //mark as error free + validator.successList.push(this); //mark as error free }); - validator.resetForm();//remove error class on name elements and clear history - validator.reset();//remove all error and success data + validator.resetForm(); //remove error class on name elements and clear history + validator.reset(); //remove all error and success data } el.find("input[type='password']").closest('.form-group') - .removeClass('has-error has-success'); - el.find('.form-control-feedback').each(function () { + .removeClass('has-error has-success'); + el.find('.form-control-feedback').each(function() { $(this).remove(); }); } else { @@ -72,7 +68,7 @@ function toggleChangePasswordMode(el, userName, changePasswordMode) { * Update user field(s) */ function updateUser(userName, fieldName, fieldValue) { - var data = { + var data = { 'value': fieldValue }; @@ -98,19 +94,19 @@ function updateUser(userName, fieldName, fieldValue) { return $.parseJSON(result); } } catch (e) { - // statements to handle any exceptions - console.log("Warning: Could not parse expected JSON response."); - return {}; + // statements to handle any exceptions + console.log("Warning: Could not parse expected JSON response."); + return {}; } } } - }).fail(function (jqXHR) { + }).fail(function(jqXHR) { // Error messages if (debugAjax && jqXHR.responseText) { document.write(jqXHR.responseText); document.close(); } else { - console.log("Error (" + jqXHR.status + "): " + jqXHR.responseText ); + console.log("Error (" + jqXHR.status + "): " + jqXHR.responseText); // Display errors on failure // TODO: ufAlerts widget should have a 'destroy' method @@ -124,7 +120,7 @@ function updateUser(userName, fieldName, fieldValue) { } return jqXHR; - }).done(function (response) { + }).done(function(response) { window.location.reload(); }); } @@ -134,8 +130,8 @@ function updateUser(userName, fieldName, fieldValue) { * @param {module:jQuery} el jQuery wrapped element to target. * @param {{delete_redirect: string}} options Options used to modify behaviour of button actions. */ - function bindUserButtons(el, options) { - if (!options) options = {}; +function bindUserButtons(el, options) { + if (!options) options = {}; /** * Buttons that launch a modal dialog @@ -168,38 +164,38 @@ function updateUser(userName, fieldName, fieldValue) { msgTarget: $("#alerts-page") }); - $("body").on('renderSuccess.ufModal', function (data) { + $("body").on('renderSuccess.ufModal', function(data) { var modal = $(this).ufModal('getModal'); var form = modal.find('.js-form'); // Set up collection widget var roleWidget = modal.find('.js-form-roles'); roleWidget.ufCollection({ - dropdown : { + dropdown: { ajax: { - url : site.uri.public + '/api/roles' + url: site.uri.public + '/api/roles' }, - placeholder : "Select a role" + placeholder: "Select a role" }, dropdownTemplate: modal.find('#user-roles-select-option').html(), - rowTemplate : modal.find('#user-roles-row').html() + rowTemplate: modal.find('#user-roles-row').html() }); // Get current roles and add to widget $.getJSON(site.uri.public + '/api/users/u/' + userName + '/roles') - .done(function (data) { - $.each(data.rows, function (idx, role) { - role.text = role.name; - roleWidget.ufCollection('addRow', role); + .done(function(data) { + $.each(data.rows, function(idx, role) { + role.text = role.name; + roleWidget.ufCollection('addRow', role); + }); }); - }); // Set up form for submission form.ufForm() - .on("submitSuccess.ufForm", function() { - // Reload page on success - window.location.reload(); - }); + .on("submitSuccess.ufForm", function() { + // Reload page on success + window.location.reload(); + }); }); }); @@ -216,7 +212,7 @@ function updateUser(userName, fieldName, fieldValue) { msgTarget: $("#alerts-page") }); - $("body").on('renderSuccess.ufModal', function () { + $("body").on('renderSuccess.ufModal', function() { var modal = $(this).ufModal('getModal'); var form = modal.find('.js-form'); @@ -252,16 +248,16 @@ function updateUser(userName, fieldName, fieldValue) { msgTarget: $("#alerts-page") }); - $("body").on('renderSuccess.ufModal', function () { + $("body").on('renderSuccess.ufModal', function() { var modal = $(this).ufModal('getModal'); var form = modal.find('.js-form'); form.ufForm() - .on("submitSuccess.ufForm", function() { - // Navigate or reload page on success - if (options.delete_redirect) window.location.href = options.delete_redirect; - else window.location.reload(); - }); + .on("submitSuccess.ufForm", function() { + // Navigate or reload page on success + if (options.delete_redirect) window.location.href = options.delete_redirect; + else window.location.reload(); + }); }); }); @@ -275,12 +271,12 @@ function updateUser(userName, fieldName, fieldValue) { updateUser(btn.data('user_name'), 'flag_verified', '1'); }); - el.find('.js-user-enable').click(function () { + el.find('.js-user-enable').click(function() { var btn = $(this); updateUser(btn.data('user_name'), 'flag_enabled', '1'); }); - el.find('.js-user-disable').click(function () { + el.find('.js-user-disable').click(function() { var btn = $(this); updateUser(btn.data('user_name'), 'flag_enabled', '0'); }); @@ -298,4 +294,4 @@ function bindUserCreationButton(el) { attachUserForm(); }); -}; +}; \ No newline at end of file diff --git a/app/sprinkles/admin/src/Controller/UserController.php b/app/sprinkles/admin/src/Controller/UserController.php index cb7b2944b..ac8adccf5 100644 --- a/app/sprinkles/admin/src/Controller/UserController.php +++ b/app/sprinkles/admin/src/Controller/UserController.php @@ -1219,9 +1219,10 @@ public function updateInfo(Request $request, Response $response, $args) return $response->withJson([], 400); } - if ($data['group_id'] == 0) { + if (isset($data['group_id']) && $data['group_id'] == 0) { $data['group_id'] = null; } + // Begin transaction - DB will be rolled back if an exception occurs Capsule::transaction(function () use ($data, $user, $currentUser) { // Update the user and generate success messages diff --git a/app/sprinkles/admin/templates/forms/user.html.twig b/app/sprinkles/admin/templates/forms/user.html.twig index 1aab5a94b..707d0c1ae 100644 --- a/app/sprinkles/admin/templates/forms/user.html.twig +++ b/app/sprinkles/admin/templates/forms/user.html.twig @@ -25,7 +25,7 @@ {% else %}