Files
redash/client/app/services/widget.js
2017-11-06 21:50:11 +02:00

83 lines
2.6 KiB
JavaScript

import { truncate } from 'underscore.string';
import { omit, flatten, extend, isObject } from 'underscore';
function Widget($resource, $http, Query, Visualization, dashboardGridOptions) {
function prepareForSave(data) {
return omit(data, 'query');
}
const WidgetResource = $resource('api/widgets/:id', { id: '@id' }, {
get: { method: 'GET' },
save: {
method: 'POST',
transformRequest: flatten([prepareForSave, $http.defaults.transformRequest]),
},
query: { method: 'GET', isArray: true },
remove: { method: 'DELETE' },
delete: { method: 'DELETE' },
});
WidgetResource.prototype.getQuery = function getQuery() {
if (!this.query && this.visualization) {
this.query = new Query(this.visualization.query);
}
return this.query;
};
WidgetResource.prototype.getName = function getName() {
if (this.visualization) {
return `${this.visualization.query.name} (${this.visualization.name})`;
}
return truncate(this.text, 20);
};
function WidgetConstructor(widget) {
widget.width = 1; // Backward compatibility, user on back-end
const visualizationOptions = {};
const visualization = widget.visualization ?
Visualization.visualizations[widget.visualization.type] : null;
if (isObject(visualization)) {
const options = extend({}, visualization.defaultOptions);
// Width constraints
const minColumns = parseInt(options.minColumns, 10);
if (isFinite(minColumns) && (minColumns >= 0)) {
visualizationOptions.minSizeX = minColumns;
}
const maxColumns = parseInt(options.maxColumns, 10);
if (isFinite(maxColumns) && (maxColumns >= 0)) {
visualizationOptions.maxSizeX = Math.min(maxColumns, dashboardGridOptions.columns);
}
// Height constraints
// `minRows` is preferred, but it should be kept for backward compatibility
const height = parseInt(options.height, 10);
if (isFinite(height)) {
visualizationOptions.minSizeY = Math.ceil(height / dashboardGridOptions.rowHeight);
}
const minRows = parseInt(options.minRows, 10);
if (isFinite(minRows)) {
visualizationOptions.minSizeY = minRows;
}
const maxRows = parseInt(options.maxRows, 10);
if (isFinite(maxRows) && (maxRows >= 0)) {
visualizationOptions.maxSizeY = maxRows;
}
}
widget.options = widget.options || {};
widget.options.position = extend({}, visualizationOptions, widget.options.position);
return new WidgetResource(widget);
}
return WidgetConstructor;
}
export default function init(ngModule) {
ngModule.factory('Widget', Widget);
}