cartodb/lib/assets/javascripts/builder/data/layer-content-model.js
2020-06-15 10:58:47 +08:00

87 lines
2.4 KiB
JavaScript

var Backbone = require('backbone');
var checkAndBuildOpts = require('builder/helpers/required-opts');
var STATES = require('./query-base-status');
var CONTEXTS = {
map: 'map',
table: 'table'
};
var REQUIRED_OPTS = [
'querySchemaModel',
'queryGeometryModel',
'queryRowsCollection'
];
var LayerContentModel = Backbone.Model.extend({
defaults: {
context: CONTEXTS.map, // map or table
// This variable `state` is only used for the trigger change:state event.
// It lives in the model so, as long as the model is recreated with the view every time,
// this variable is not shared between views and can NOT use it to get the real state.
state: STATES.initial
},
initialize: function (attrs, opts) {
checkAndBuildOpts(opts, REQUIRED_OPTS, this);
this._initBinds();
},
_initBinds: function () {
this.listenTo(this._querySchemaModel, 'change:status', this._setState);
this.listenTo(this._queryGeometryModel, 'change:status', this._setState);
this.listenTo(this._queryRowsCollection.statusModel, 'change:status', this._setState);
},
_setState: function () {
this.set('state', this._getState());
},
_getState: function () {
if (this.isErrored()) return STATES.errored;
if (this.isFetched()) return STATES.fetched;
if (this.isFetching()) return STATES.fetching;
if (this.isInitial()) return STATES.initial;
return STATES.unavailable;
},
isErrored: function () {
return this._querySchemaModel.hasRepeatedErrors() ||
this._queryGeometryModel.hasRepeatedErrors() ||
this._queryRowsCollection.hasRepeatedErrors();
},
isFetching: function () {
return this._querySchemaModel.isFetching() ||
this._queryGeometryModel.isFetching() ||
this._queryRowsCollection.isFetching();
},
isFetched: function () {
return this._querySchemaModel.isFetched() &&
this._queryGeometryModel.isFetched() &&
this._queryRowsCollection.isFetched();
},
isInFinalStatus: function () {
return this._querySchemaModel.isInFinalStatus() &&
this._queryGeometryModel.isInFinalStatus() &&
this._queryRowsCollection.isInFinalStatus();
},
isInitial: function () {
return this.get('state') === STATES.initial;
},
isDone: function () {
return this.isFetched() || this.isErrored();
}
});
LayerContentModel.CONTEXTS = CONTEXTS;
LayerContentModel.STATES = STATES;
module.exports = LayerContentModel;