Initial commit
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
const _ = require('underscore');
|
||||
const $ = require('jquery');
|
||||
const Backbone = require('backbone');
|
||||
const checkAndBuildOpts = require('builder/helpers/required-opts');
|
||||
|
||||
const REQUIRED_OPTS = [
|
||||
'userModel'
|
||||
];
|
||||
|
||||
const PUBLIC_PRIVACIES = ['PUBLIC', 'LINK'];
|
||||
|
||||
const DEFAULT_ATTRS = {
|
||||
select: false,
|
||||
update: false,
|
||||
insert: false,
|
||||
delete: false
|
||||
};
|
||||
|
||||
const STATUS = {
|
||||
fetching: 'fetching',
|
||||
fetched: 'fetched',
|
||||
errored: 'errored'
|
||||
};
|
||||
|
||||
module.exports = Backbone.Model.extend({
|
||||
|
||||
initialize: function (attrs, options) {
|
||||
checkAndBuildOpts(options, REQUIRED_OPTS, this);
|
||||
|
||||
this.stateModel = new Backbone.Model({
|
||||
status: STATUS.fetching
|
||||
});
|
||||
|
||||
this.paramsModel = new Backbone.Model({
|
||||
tag_name: '',
|
||||
q: '',
|
||||
page: 1,
|
||||
type: '',
|
||||
exclude_shared: true,
|
||||
tags: '',
|
||||
shared: 'no',
|
||||
only_liked: false,
|
||||
order: 'updated_at',
|
||||
types: 'table',
|
||||
deepInsights: false
|
||||
});
|
||||
|
||||
this._initBinds();
|
||||
},
|
||||
|
||||
_initBinds: function () {
|
||||
this.listenTo(this.paramsModel, 'change:q change:privacy', () => this.fetch());
|
||||
|
||||
this.on('sync', () => this.stateModel.set({ status: STATUS.fetched }));
|
||||
this.on('error', () => this.stateModel.set({ status: STATUS.errored }));
|
||||
},
|
||||
|
||||
url: function () {
|
||||
return `${this._userModel.get('base_url')}/api/v1/viz?${this.generateParams()}`;
|
||||
},
|
||||
|
||||
generateParams: function () {
|
||||
return $.param(this.paramsModel.attributes);
|
||||
},
|
||||
|
||||
fetch: function () {
|
||||
this.stateModel.set({ status: STATUS.fetching });
|
||||
return Backbone.Model.prototype.fetch.apply(this, arguments);
|
||||
},
|
||||
|
||||
parse: function (response) {
|
||||
this.attributes = {};
|
||||
|
||||
const tables = response.visualizations;
|
||||
|
||||
return tables.reduce((total, table) => ({
|
||||
...total,
|
||||
[table.name]: {
|
||||
permissions: {
|
||||
...DEFAULT_ATTRS,
|
||||
select: this.paramsModel.get('privacy') ? _.contains(PUBLIC_PRIVACIES, table.privacy) : false
|
||||
}
|
||||
}
|
||||
}), {});
|
||||
},
|
||||
|
||||
setQuery: function (q) {
|
||||
this.paramsModel.set({ q });
|
||||
},
|
||||
|
||||
clearParams: function () {
|
||||
this.paramsModel.set({ q: '' });
|
||||
this.paramsModel.unset('privacy');
|
||||
},
|
||||
|
||||
getStateModel: function () {
|
||||
return this.stateModel;
|
||||
},
|
||||
|
||||
isFetched: function () {
|
||||
return this.stateModel.get('status') === STATUS.fetched;
|
||||
},
|
||||
|
||||
hasQuery: function () {
|
||||
return !!this.paramsModel.get('q');
|
||||
},
|
||||
|
||||
isEmpty: function () {
|
||||
return _.isEmpty(this.attributes);
|
||||
},
|
||||
|
||||
fetchPublicDatasets: function () {
|
||||
this.paramsModel.set({
|
||||
privacy: ['public', 'link'],
|
||||
per_page: 200 // TODO: how do we show everything?
|
||||
});
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user