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 %}