1 (function(angular
, $, _
) {
3 angular
.module('crmDashboard').component('crmDashlet', {
10 templateUrl
: '~/crmDashboard/Dashlet.html',
11 controller: function ($scope
, $element
, $timeout
, $interval
) {
12 var ts
= $scope
.ts
= CRM
.ts(),
18 return CRM
.cache
.get('dashboard', {})[ctrl
.dashlet
.id
] || {};
21 function setCache(content
) {
22 var data
= CRM
.cache
.get('dashboard', {}),
23 cached
= data
[ctrl
.dashlet
.id
] || {};
24 data
[ctrl
.dashlet
.id
] = {
25 content
: content
|| cached
.content
|| null,
26 collapsed
: ctrl
.collapsed
,
27 lastLoaded
: content
? $.now() : (cached
.lastLoaded
|| null)
29 CRM
.cache
.set('dashboard', data
);
30 lastLoaded
= data
[ctrl
.dashlet
.id
].lastLoaded
;
34 return lastLoaded
&& (ctrl
.dashlet
.cache_minutes
* 60000 + lastLoaded
) > $.now();
37 function setChecker() {
38 if (angular
.isUndefined(checker
)) {
39 checker
= $interval(function() {
40 if (!ctrl
.collapsed
&& !isFresh() && (!document
.hasFocus
|| document
.hasFocus())) {
42 reload(ctrl
.dashlet
.url
);
48 function stopChecker() {
49 if (angular
.isDefined(checker
)) {
50 $interval
.cancel(checker
);
55 this.toggleCollapse = function() {
56 ctrl
.collapsed
= !ctrl
.collapsed
;
60 this.forceRefresh = function() {
61 if (ctrl
.dashlet
.url
) {
62 reload(ctrl
.dashlet
.url
);
63 } else if (ctrl
.dashlet
.directive
) {
64 var directive
= ctrl
.dashlet
.directive
;
65 ctrl
.dashlet
.directive
= null;
67 ctrl
.dashlet
.directive
= directive
;
72 function reload(path
) {
73 var extern
= path
.slice(0, 1) === '/' || path
.slice(0, 4) === 'http',
74 url
= extern
? path
: CRM
.url(path
);
75 CRM
.loadPage(url
, {target
: $('.crm-dashlet-content', $element
)});
78 this.$onInit = function() {
79 if (this.isFullscreen
&& this.dashlet
.fullscreen_url
) {
80 reload(this.dashlet
.fullscreen_url
);
84 var cache
= getCache();
85 lastLoaded
= cache
.lastLoaded
;
86 ctrl
.collapsed
= !this.fullscreen
&& !!cache
.collapsed
;
88 if (ctrl
.dashlet
.url
) {
89 var fresh
= cache
.content
&& isFresh();
91 $('.crm-dashlet-content', $element
).html(cache
.content
).trigger('crmLoad');
95 $element
.on('crmLoad', function(event
, data
) {
96 if ($(event
.target
).is('.crm-dashlet-content')) {
97 setCache(data
.content
);
103 reload(ctrl
.dashlet
.url
);
109 this.$onDestroy = function() {
115 })(angular
, CRM
.$, CRM
._
);