diff --git a/demo/index.html b/demo/index.html
index fda5bb3e..cc345dc4 100644
--- a/demo/index.html
+++ b/demo/index.html
@@ -16,6 +16,7 @@
+
diff --git a/src/util.js b/src/util.js
index 45e4f2a3..97e5c82d 100755
--- a/src/util.js
+++ b/src/util.js
@@ -150,16 +150,31 @@ var util = function() {
// TODO: remove (commented out as part of Backbon-i-fication
// if (template in app.after) app.after[template]();
}
-
- function notify( message, options ) {
- if (!options) var options = {};
- $('.data-explorer .notification-container').show();
- $('.data-explorer .notification-message').text(message);
- if (!options.loader) $('.data-explorer .notification-loader').hide();
- if (options.loader) $('.data-explorer .notification-loader').show();
- if (!options.persist) setTimeout(function() { $('.data-explorer .notification-container').hide() }, 3000);
- }
+ function notify(message, options) {
+ if (!options) var options = {};
+ var tmplData = _.extend({
+ msg: message,
+ category: 'warning'
+ },
+ options);
+ var _template = ' \
+
× \
+
{{msg}} \
+ {{#loader}} \
+
\
+ {{/loader}} \
+
\
+
';
+ var _templated = $.mustache(_template, tmplData);
+ _templated = $(_templated).appendTo($('.data-explorer .alert-messages'));
+ if (!options.persist) {
+ setTimeout(function() {
+ $(_templated).remove();
+ }, 3000);
+ }
+ }
+
function formatMetadata(data) {
out = '';
$.each(data, function(key, val) {
diff --git a/src/view.js b/src/view.js
index 5a2e7a01..025e6f3d 100644
--- a/src/view.js
+++ b/src/view.js
@@ -46,6 +46,8 @@ function parseQueryString(q) {
my.DataExplorer = Backbone.View.extend({
template: ' \
\
- \
-
\
-
Loading... \
-
\
-
\
\
',
@@ -402,12 +399,15 @@ my.DataTableRow = Backbone.View.extend({
var newData = {};
newData[header] = newValue;
this.model.set(newData);
- util.notify("Updating row...", {persist: true, loader: true});
+ util.notify("Updating row...", {loader: true});
this.model.save().then(function(response) {
- util.notify("Row updated successfully");
+ util.notify("Row updated successfully", {category: 'success'});
})
.fail(function() {
- alert('error saving');
+ util.notify('Error saving row', {
+ category: 'error',
+ persist: true
+ });
});
},
diff --git a/vendor/bootstrap/1.4.0/bootstrap-alerts.js b/vendor/bootstrap/1.4.0/bootstrap-alerts.js
new file mode 100644
index 00000000..37bb430a
--- /dev/null
+++ b/vendor/bootstrap/1.4.0/bootstrap-alerts.js
@@ -0,0 +1,113 @@
+/* ==========================================================
+ * bootstrap-alerts.js v1.4.0
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
+ * ==========================================================
+ * Copyright 2011 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function( $ ){
+
+ "use strict"
+
+ /* CSS TRANSITION SUPPORT (https://gist.github.com/373874)
+ * ======================================================= */
+
+ var transitionEnd
+
+ $(document).ready(function () {
+
+ $.support.transition = (function () {
+ var thisBody = document.body || document.documentElement
+ , thisStyle = thisBody.style
+ , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined
+ return support
+ })()
+
+ // set CSS transition event type
+ if ( $.support.transition ) {
+ transitionEnd = "TransitionEnd"
+ if ( $.browser.webkit ) {
+ transitionEnd = "webkitTransitionEnd"
+ } else if ( $.browser.mozilla ) {
+ transitionEnd = "transitionend"
+ } else if ( $.browser.opera ) {
+ transitionEnd = "oTransitionEnd"
+ }
+ }
+
+ })
+
+ /* ALERT CLASS DEFINITION
+ * ====================== */
+
+ var Alert = function ( content, options ) {
+ this.settings = $.extend({}, $.fn.alert.defaults, options)
+ this.$element = $(content)
+ .delegate(this.settings.selector, 'click', this.close)
+ }
+
+ Alert.prototype = {
+
+ close: function (e) {
+ var $element = $(this).parent('.alert-message')
+
+ e && e.preventDefault()
+ $element.removeClass('in')
+
+ function removeElement () {
+ $element.remove()
+ }
+
+ $.support.transition && $element.hasClass('fade') ?
+ $element.bind(transitionEnd, removeElement) :
+ removeElement()
+ }
+
+ }
+
+
+ /* ALERT PLUGIN DEFINITION
+ * ======================= */
+
+ $.fn.alert = function ( options ) {
+
+ if ( options === true ) {
+ return this.data('alert')
+ }
+
+ return this.each(function () {
+ var $this = $(this)
+
+ if ( typeof options == 'string' ) {
+ return $this.data('alert')[options]()
+ }
+
+ $(this).data('alert', new Alert( this, options ))
+
+ })
+ }
+
+ $.fn.alert.defaults = {
+ selector: '.close'
+ }
+
+ $(document).ready(function () {
+ new Alert($('body'), {
+ selector: '.alert-message[data-alert] .close'
+ })
+ })
+
+}( window.jQuery || window.ender );
\ No newline at end of file