Files
ERP/sophal/js/view/view.custom.js

259 lines
6.7 KiB
JavaScript

/*
* Axelor Business Solutions
*
* Copyright (C) 2005-2019 Axelor (<http://axelor.com>).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
(function() {
"use strict";
var ui = angular.module("axelor.ui");
CustomViewCtrl.$inject = ['$scope', '$http', 'DataSource', 'ViewService'];
function CustomViewCtrl($scope, $http, DataSource, ViewService) {
ui.ViewCtrl.call(this, $scope, DataSource, ViewService);
var view = $scope._views.custom || {};
var viewPromise = null;
$scope.show = function() {
if (!viewPromise) {
viewPromise = $scope.loadView('custom', view.name);
viewPromise.then(function(meta) {
var schema = meta.view;
$scope.schema = schema;
$scope.schema.loaded = true;
});
}
$scope.onShow(viewPromise);
};
$scope.onShow = function(viewPromise) {
// it will be refreshed by dashlet
if ($scope.dashlet) {
return;
}
viewPromise.then(function () {
$scope.onRefresh();
});
};
$scope.getRouteOptions = function() {
return {
mode: 'custom'
};
};
$scope.setRouteOptions = function(options) {
var opts = options || {};
if (opts.mode === "custom") {
return $scope.updateRoute();
}
var params = $scope._viewParams;
if (params.viewType !== "custom") {
return $scope.show();
}
};
$scope.getContext = function () {
var context = $scope._context || {};
if ($scope.$parent.getContext) {
context = _.extend({}, $scope.$parent.getContext(), context);
}
return context;
};
$scope.onRefresh = function() {
var context = $scope.getContext();
var params = {
data: context
};
return $http.post('ws/meta/custom/' + view.name, params).then(function(response) {
var res = response.data;
$scope.data = (res.data||{}).dataset;
});
};
}
var customDirective = ["$compile", function ($compile) {
return {
controller: CustomViewCtrl,
link: function (scope, element, attrs, ctrl) {
var evalScope = axelor.$evalScope(scope);
function render(template) {
var elem = $('<span>' + axelor.sanitize(template.trim()) + '</span>');
if (elem.children().length === 1) {
elem = elem.children().first();
}
if (scope.schema && scope.schema.css) {
element.parents(".dashlet:first").addClass(scope.schema.css);
}
elem = $compile(elem)(evalScope);
element.append(elem);
}
var unwatch = scope.$watch('schema.template', function customTemplateWatch(template) {
if (template) {
unwatch();
render(template);
}
});
scope.showToggle = false;
scope.$watch('data', function customDataWatch(data) {
evalScope.data = data;
evalScope.first = _.first(data);
});
}
};
}];
ui.directive('uiCustomView', customDirective);
ui.directive('uiPortletCustom', customDirective);
// helper directives
ui.directive('reportBox', function() {
return {
scope: {
value: '=',
label: '@',
percent: '=',
up: '=',
tag: '=',
tagCss: '='
},
link: function (scope, element, attrs) {
setTimeout(function () {
element.parents('.dashlet:first')
.addClass("report-box");
});
},
replace: true,
template:
"<div class='report-box'>" +
"<h1>{{value}}</h1>" +
"<small>{{label}}</small>" +
"<div class='font-bold text-info pull-right' ng-show='percent'>" +
"<span>{{percent}}</span> <i class='fa fa-level-up'></i>" +
"</div>" +
"<div class='report-tags' ng-if='tag'><span class='label' ng-class='tagCss'>{{tag}}</span></div>" +
"</div>"
};
});
ui.directive('reportTable', function() {
return {
scope: {
data: '=',
columns: '@',
sums: '@'
},
link: function (scope, element, attrs) {
var cols = [];
var sums = (scope.sums||'').split(',');
var fields = {};
var schema = scope.$parent.$parent.schema;
function makeColumns(names) {
cols = [];
fields = {};
_.each(names, function (name) {
var field = _.findWhere(schema.items, { name: name }) || {};
var col = _.extend({}, field, field.widgetAttrs, {
name: name,
title: _.humanize(name)
});
fields[name] = col;
cols.push(col);
});
scope.cols = cols;
}
if (scope.columns) {
makeColumns((scope.columns||'').split(','));
} else {
var unwatch = scope.$watch('data', function reportDataWatch(data) {
if (data) {
unwatch();
var first = _.first(data) || {};
var names = _.keys(first).filter(function (name) { return name !== '$$hashKey'; });
makeColumns(names.sort());
}
});
}
scope.sums = sums;
scope.format = function(value, name) {
if (value === null || value === undefined) {
return "";
}
var field = fields[name];
if (field && field.scale) {
var val = +(value);
if (_.isNumber(val)) {
return val.toFixed(field.scale);
}
}
return value;
};
scope.sum = function (name) {
if (sums.indexOf(name) === -1) {
return "";
}
var res = 0.0;
_.each(scope.data, function (row) {
var val = +(row[name]) || 0;
res += val;
});
return scope.format(res, name);
};
setTimeout(function () {
element.parents('.dashlet:first')
.addClass("report-table");
});
},
replace: true,
template:
"<table class='table table-striped'>" +
"<thead>" +
"<tr>" +
"<th ng-repeat='col in cols'>{{col.title}}</th>" +
"</tr>" +
"</thead>" +
"<tbody>" +
"<tr ng-repeat='row in data'>" +
"<td ng-repeat='col in cols'>{{format(row[col.name], col.name)}}</td>" +
"</tr>" +
"</tbody>" +
"<tfoot ng-if='sums.length'>" +
"<tr>" +
"<td ng-repeat='col in cols'>{{sum(col.name)}}</td>" +
"</tr>" +
"</tfoot>" +
"</table>"
};
});
})();