diff --git a/InvenTree/InvenTree/static/script/inventree/notification.js b/InvenTree/InvenTree/static/script/inventree/notification.js
index f6bdf3bc57..c4816d4b5c 100644
--- a/InvenTree/InvenTree/static/script/inventree/notification.js
+++ b/InvenTree/InvenTree/static/script/inventree/notification.js
@@ -37,7 +37,6 @@ function showAlertOrCache(message, cache, options={}) {
if (cache) {
addCachedAlert(message, options);
} else {
-
showMessage(message, options);
}
}
@@ -82,6 +81,8 @@ function showMessage(message, options={}) {
var timeout = options.timeout || 5000;
+ var target = options.target || $('#alerts');
+
var details = '';
if (options.details) {
@@ -111,7 +112,7 @@ function showMessage(message, options={}) {
`;
- $('#alerts').append(html);
+ target.append(html);
// Remove the alert automatically after a specified period of time
$(`#alert-${id}`).delay(timeout).slideUp(200, function() {
diff --git a/InvenTree/part/templates/part/category.html b/InvenTree/part/templates/part/category.html
index 4de0005672..e02c77509d 100644
--- a/InvenTree/part/templates/part/category.html
+++ b/InvenTree/part/templates/part/category.html
@@ -313,6 +313,10 @@
fields: fields,
groups: partGroups(),
title: '{% trans "Create Part" %}',
+ reloadFormAfterSuccess: true,
+ persist: true,
+ persistMessage: '{% trans "Create another part after this one" %}',
+ successMessage: '{% trans "Part created successfully" %}',
onSuccess: function(data) {
// Follow the new part
location.href = `/part/${data.pk}/`;
diff --git a/InvenTree/templates/js/translated/forms.js b/InvenTree/templates/js/translated/forms.js
index 9ee3dcace3..2946b77e4e 100644
--- a/InvenTree/templates/js/translated/forms.js
+++ b/InvenTree/templates/js/translated/forms.js
@@ -542,6 +542,11 @@ function constructFormBody(fields, options) {
insertConfirmButton(options);
}
+ // Insert "persist" button (if required)
+ if (options.persist) {
+ insertPersistButton(options);
+ }
+
// Display the modal
$(modal).modal('show');
@@ -616,6 +621,22 @@ function insertConfirmButton(options) {
}
+/* Add a checkbox to select if the modal will stay open after success */
+function insertPersistButton(options) {
+
+ var message = options.persistMessage || '{% trans "Keep this form open" %}';
+
+ var html = `
+
+
+
+
+ `;
+
+ $(options.modal).find('#modal-footer-buttons').append(html);
+}
+
+
/*
* Extract all specified form values as a single object
*/
@@ -934,19 +955,40 @@ function getFormFieldValue(name, field={}, options={}) {
*/
function handleFormSuccess(response, options) {
- // Close the modal
- if (!options.preventClose) {
- // Note: The modal will be deleted automatically after closing
- $(options.modal).modal('hide');
- }
-
// Display any required messages
// Should we show alerts immediately or cache them?
var cache = (options.follow && response.url) || options.redirect || options.reload;
+ // Should the form "persist"?
+ var persist = false;
+
+ if (options.persist && options.modal) {
+ // Determine if this form should "persist", or be dismissed?
+ var chk = $(options.modal).find('#modal-persist');
+
+ persist = chk.exists() && chk.prop('checked');
+ }
+
+ if (persist) {
+ cache = false;
+ }
+
+ var msg_target = null;
+
+ if (persist) {
+ // If the modal is persistant, the target for any messages should be the modal!
+ msg_target = $(options.modal).find('#pre-form-content');
+ }
+
// Display any messages
if (response && (response.success || options.successMessage)) {
- showAlertOrCache(response.success || options.successMessage, cache, {style: 'success'});
+ showAlertOrCache(
+ response.success || options.successMessage,
+ cache,
+ {
+ style: 'success',
+ target: msg_target,
+ });
}
if (response && response.info) {
@@ -961,20 +1003,41 @@ function handleFormSuccess(response, options) {
showAlertOrCache(response.danger, cache, {style: 'danger'});
}
- if (options.onSuccess) {
- // Callback function
- options.onSuccess(response, options);
- }
+ if (persist) {
+ // Instead of closing the form and going somewhere else,
+ // reload (empty) the form so the user can input more data
+
+ // Reset the status of the "submit" button
+ if (options.modal) {
+ $(options.modal).find('#modal-form-submit').prop('disabled', false);
+ }
- if (options.follow && response.url) {
- // Follow the returned URL
- window.location.href = response.url;
- } else if (options.reload) {
- // Reload the current page
- location.reload();
- } else if (options.redirect) {
- // Redirect to a specified URL
- window.location.href = options.redirect;
+ // Remove any error flags from the form
+ clearFormErrors(options);
+
+ } else {
+
+ // Close the modal
+ if (!options.preventClose) {
+ // Note: The modal will be deleted automatically after closing
+ $(options.modal).modal('hide');
+ }
+
+ if (options.onSuccess) {
+ // Callback function
+ options.onSuccess(response, options);
+ }
+
+ if (options.follow && response.url) {
+ // Follow the returned URL
+ window.location.href = response.url;
+ } else if (options.reload) {
+ // Reload the current page
+ location.reload();
+ } else if (options.redirect) {
+ // Redirect to a specified URL
+ window.location.href = options.redirect;
+ }
}
}
@@ -988,6 +1051,8 @@ function clearFormErrors(options={}) {
if (options && options.modal) {
// Remove the individual error messages
$(options.modal).find('.form-error-message').remove();
+
+ $(options.modal).find('.modal-content').removeClass('modal-error');
// Remove the "has error" class
$(options.modal).find('.form-field-error').removeClass('form-field-error');