cartodb-4.29/lib/assets/javascripts/builder/widgets-notifications.js
2020-06-15 10:58:47 +08:00

140 lines
4.2 KiB
JavaScript
Executable File

var _ = require('underscore');
var Notifier = require('builder/components/notifier/notifier');
var errorParser = require('builder/helpers/error-parser');
var NOTIFICATION_ERROR_TEMPLATE = _.template("<span class='u-errorTextColor'><%- title %></span>");
var ADD_NOTIFICATION_ID = 'add-notification';
var NOTIFICATION_STATUS = {
loading: 'loading',
updating: 'loading',
added: 'success',
removed: 'success',
replaced: 'success',
error: 'error'
};
var WidgetsNotifications = {
track: function (widgetsCollection) {
this._widgetDefinitionsCollection = widgetsCollection;
this._widgetDefinitionsCollection.on('successAdd', this._showAddNotification, this);
this._widgetDefinitionsCollection.on('successReplace', this._showReplaceNotification, this);
this._widgetDefinitionsCollection.on('destroy', this._showRemoveNotification, this);
this._widgetDefinitionsCollection.on('errorAdd', this._showErrorNotification, this);
this._widgetDefinitionsCollection.on('loading', this._showLoadingNotification, this);
this._widgetDefinitionsCollection.on('updating', this._showUpdatingNotification, this);
},
_showLoadingNotification: function (widgets) {
var notificationAttrs = {
status: NOTIFICATION_STATUS.loading,
info: _t('notifications.widgets.loading_pluralize', {
smart_count: widgets && widgets.length ? widgets.length : 1
}),
closable: false
};
this._addNotification(ADD_NOTIFICATION_ID, notificationAttrs);
},
_showUpdatingNotification: function (widgets) {
var notificationAttrs = {
status: NOTIFICATION_STATUS.updating,
info: _t('notifications.widgets.updating_pluralize', {
smart_count: widgets && widgets.length ? widgets.length : 1
}),
closable: false
};
this._addNotification(ADD_NOTIFICATION_ID, notificationAttrs);
},
_showRemoveNotification: function (widgetModel) {
if (widgetModel.get('avoidNotification') === true) {
return;
}
var notificationAttrs = {
status: NOTIFICATION_STATUS.removed,
info: _t('notifications.widgets.delete_pluralize', {
smart_count: 1
}),
closable: true,
delay: Notifier.DEFAULT_DELAY
};
this._addNotification(ADD_NOTIFICATION_ID, notificationAttrs);
},
_showAddNotification: function (widgets) {
var notificationAttrs = {
status: NOTIFICATION_STATUS.added,
info: _t('notifications.widgets.add_pluralize', {
smart_count: widgets && widgets.length ? widgets.length : 1
}),
closable: true
};
this._addOrUpdateNotification(ADD_NOTIFICATION_ID, notificationAttrs);
},
_showReplaceNotification: function (widgets) {
var notificationAttrs = {
status: NOTIFICATION_STATUS.replaced,
info: _t('notifications.widgets.replace_pluralize', {
smart_count: widgets && widgets.length ? widgets.length : 1
}),
closable: true
};
this._addOrUpdateNotification(ADD_NOTIFICATION_ID, notificationAttrs);
},
_showErrorNotification: function (data, error) {
if (this._isAbortion(error)) {
return;
}
var notificationAttrs = {
status: NOTIFICATION_STATUS.error,
info: _t('notifications.widgets.error.body', {
body: NOTIFICATION_ERROR_TEMPLATE({
title: _t('notifications.widgets.error.title')
}),
error: errorParser(error)
}),
closable: true
};
this._addOrUpdateNotification(ADD_NOTIFICATION_ID, notificationAttrs);
},
_addOrUpdateNotification: function (notificationId, notificationAttrs) {
var notification = this._getNotification(notificationId);
if (notification) {
notification.set(notificationAttrs);
} else {
this._addNotification(notificationId, notificationAttrs);
}
},
_addNotification: function (notificationId, notificationAttrs) {
notificationAttrs = _.extend({
id: notificationId
}, notificationAttrs);
Notifier.addNotification(notificationAttrs);
},
_getNotification: function (notificationId) {
return Notifier.getNotification(notificationId);
},
_isAbortion: function (error) {
return (error.status === 0 && error.statusText === 'abort');
}
};
module.exports = WidgetsNotifications;