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