First commit waiting for Budget Alert
This commit is contained in:
258
sophal/js/view/view.custom.js
Normal file
258
sophal/js/view/view.custom.js
Normal file
@ -0,0 +1,258 @@
|
||||
/*
|
||||
* 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>"
|
||||
};
|
||||
});
|
||||
|
||||
})();
|
||||
Reference in New Issue
Block a user