cronapp-framework-mobile-js 2.8.8 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/components/crn-button-bar.components.json +1 -1
  2. package/components/crn-button.components.json +1 -1
  3. package/components/crn-chart.components.json +1 -0
  4. package/components/crn-checkbox.components.json +2 -1
  5. package/components/crn-dynamic-image.components.json +9 -0
  6. package/components/crn-header-button.components.json +1 -1
  7. package/components/crn-input-floating.components.json +4 -4
  8. package/components/crn-ion-footer-bar.components.json +3 -3
  9. package/components/crn-ion-header-bar.components.json +1 -1
  10. package/components/crn-ion-list.components.json +0 -31
  11. package/components/crn-ion-segment-item.components.json +68 -0
  12. package/components/crn-ion-segment.components.json +974 -0
  13. package/components/crn-ion-tab.components.json +1 -0
  14. package/components/crn-item-swipe.components.json +3 -3
  15. package/components/crn-list-item-icon.components.json +7 -20
  16. package/components/crn-list-swipe.components.json +2 -2
  17. package/components/crn-list.components.json +1 -1
  18. package/components/crn-multiselect.components.json +1 -1
  19. package/components/crn-navbar.components.json +1 -0
  20. package/components/crn-range.components.json +1 -1
  21. package/components/crn-signature-pad.components.json +36 -0
  22. package/components/crn-slider-item.components.json +104 -5
  23. package/components/crn-slider.components.json +6 -6
  24. package/components/crn-textarea.components.json +1 -1
  25. package/components/css/app.css +78 -0
  26. package/components/css/background-color.css +39 -1
  27. package/components/css/color-default.css +0 -28
  28. package/components/css/crn-ion-segment.css +786 -0
  29. package/components/css/icon-size.css +4 -4
  30. package/components/templates/advanced.list.designtime.html +0 -24
  31. package/components/templates/checkbox.template.html +6 -7
  32. package/components/templates/crn-ion-segment-item.template.html +6 -0
  33. package/components/templates/crn-ion-segment.template.html +27 -0
  34. package/components/templates/crn-signature-pad.designtime.html +31 -0
  35. package/components/templates/crn-signature-pad.template.html +1 -0
  36. package/components/templates/ion-footer-bar.template.html +11 -5
  37. package/components/templates/ion-header-bar.template.html +2 -2
  38. package/components/templates/item.slider.template.html +3 -3
  39. package/components/templates/item.swipe.template.html +2 -2
  40. package/components/templates/slider.template.html +14 -18
  41. package/css/app.css +124 -34
  42. package/css/signup.css +13 -0
  43. package/dist/components/css/app.css +1 -0
  44. package/dist/components/css/background-color.css +1 -1
  45. package/dist/components/css/color-default.css +1 -1
  46. package/dist/components/css/crn-ion-segment.css +1 -0
  47. package/dist/components/templates/advanced.list.designtime.html +1 -1
  48. package/dist/components/templates/checkbox.template.html +1 -1
  49. package/dist/components/templates/crn-ion-segment-item.template.html +1 -0
  50. package/dist/components/templates/crn-ion-segment.template.html +1 -0
  51. package/dist/components/templates/crn-signature-pad.designtime.html +22 -0
  52. package/dist/components/templates/crn-signature-pad.template.html +1 -0
  53. package/dist/components/templates/ion-footer-bar.template.html +1 -1
  54. package/dist/components/templates/ion-header-bar.template.html +1 -1
  55. package/dist/components/templates/item.slider.template.html +1 -1
  56. package/dist/components/templates/item.swipe.template.html +1 -1
  57. package/dist/components/templates/slider.template.html +1 -1
  58. package/dist/css/app.css +1 -1
  59. package/dist/css/signup.css +1 -0
  60. package/dist/i18n/locale_en_us.json +3 -1
  61. package/dist/i18n/locale_pt_br.json +4 -1
  62. package/dist/img/cron-icon/crn-signature-pad.svg +1 -0
  63. package/dist/img/cron-icon/crn-tabs.svg +1 -1
  64. package/dist/img/placehold-300x200.png +0 -0
  65. package/dist/js/app.authentication.js +1 -1
  66. package/dist/js/controllers.authentication.js +1 -1
  67. package/dist/js/directives.js +17 -1
  68. package/dist/js/reports/reports.service.js +1 -1
  69. package/i18n/locale_en_us.json +3 -1
  70. package/i18n/locale_pt_br.json +4 -1
  71. package/img/cron-icon/crn-signature-pad.svg +27 -0
  72. package/img/cron-icon/crn-tabs.svg +17 -18
  73. package/img/placehold-300x200.png +0 -0
  74. package/js/app.authentication.js +8 -1
  75. package/js/controllers.authentication.js +87 -4
  76. package/js/directives.js +216 -122
  77. package/js/reports/reports.service.js +6 -26
  78. package/lib/ionic/js/ionic.bundle.js +4 -2
  79. package/package.json +4 -2
  80. package/postupdate.json +11 -0
package/js/directives.js CHANGED
@@ -615,87 +615,85 @@ window.addEventListener('message', function(event) {
615
615
  }
616
616
  }
617
617
  }
618
- })
619
-
620
- .directive('crnAllowNullValues', [function () {
621
- return {
622
- restrict: 'A',
623
- require: '?ngModel',
624
- link: function (scope, el, attrs, ctrl) {
625
- ctrl.$formatters = [];
626
- ctrl.$parsers = [];
627
- let falseValue = attrs.ngFalseValue ? attrs.ngFalseValue.split("'").join("") : "false";
628
- let trueValue = attrs.ngTrueValue ? attrs.ngTrueValue.split("'").join("") : "true";
629
-
630
- if (attrs.crnAllowNullValues == 'true') {
631
- ctrl.$render = function () {
632
- let viewValue = ctrl.$viewValue;
633
- el.data('checked', viewValue);
634
- switch (viewValue) {
635
- case true:
636
- case trueValue:
637
- el.removeAttr('indeterminate');
638
- el.prop('checked', true);
639
- break;
640
- case false:
641
- case falseValue:
642
- el.removeAttr('indeterminate');
643
- el.prop('checked', false);
644
- break;
645
- default:
646
- el.attr('indeterminate', true);
647
- }
648
- };
649
- el.bind('click', function () {
650
- let checked;
651
- switch (el.data('checked')) {
652
- case false:
653
- case falseValue:
654
- checked = attrs.ngTrueValue ? trueValue : true;
655
- break;
656
- default:
657
- checked = attrs.ngFalseValue ? falseValue : false;
658
- }
659
- ctrl.$setViewValue(checked);
660
- scope.$apply(ctrl.$render);
661
- });
662
- } else if (attrs.crnAllowNullValues == 'false'){
663
- ctrl.$render = function () {
664
- let viewValue = ctrl.$viewValue;
665
- if(viewValue === undefined || viewValue === null){
666
- ctrl.$setViewValue(false);
667
- viewValue = false;
668
- }
669
- el.data('checked', viewValue);
670
- switch (viewValue) {
671
- case true:
672
- case trueValue:
673
- el.removeAttr('indeterminate');
674
- el.prop('checked', true);
675
- break;
676
- default:
677
- el.removeAttr('indeterminate');
678
- el.prop('checked', false);
679
- break;
680
- }
681
- };
682
- el.bind('click', function () {
683
- let checked;
684
- switch (el.data('checked')) {
685
- case false:
686
- case falseValue:
687
- checked = attrs.ngTrueValue ? trueValue : true;
688
- break;
689
- default:
690
- checked = attrs.ngFalseValue ? falseValue : false;
691
- }
692
- ctrl.$setViewValue(checked);
693
- scope.$apply(ctrl.$render);
694
- });
695
- }
696
- }
697
- };
698
- }])
618
+ })
619
+
620
+ .directive('crnAllowNullValues', [function () {
621
+ return {
622
+ restrict: 'A',
623
+ require: '?ngModel',
624
+ link: function (scope, el, attrs, ctrl) {
625
+ ctrl.$formatters = [];
626
+ ctrl.$parsers = [];
627
+ let falseValue = attrs.ngFalseValue ? attrs.ngFalseValue.split("'").join("") : false;
628
+ let trueValue = attrs.ngTrueValue ? attrs.ngTrueValue.split("'").join("") : true;
629
+
630
+ if (attrs.crnAllowNullValues == 'false') {
631
+ ctrl.$render = function () {
632
+ let viewValue = ctrl.$viewValue;
633
+ if (ctrl.$viewValue === undefined || ctrl.$viewValue === null) {
634
+ ctrl.$setViewValue(false);
635
+ viewValue = false;
636
+ }
637
+ if (viewValue === falseValue) {
638
+ let modelForEval = `${el.attr('ng-model')}=${attrs.ngFalseValue}`;
639
+ scope.$eval(modelForEval);
640
+ }
641
+ el.data('checked', viewValue);
642
+ switch (viewValue) {
643
+ case true:
644
+ case trueValue:
645
+ el.removeAttr('indeterminate');
646
+ el.prop('checked', true);
647
+ viewValue = trueValue;
648
+ break;
649
+ default:
650
+ el.removeAttr('indeterminate');
651
+ el.prop('checked', false);
652
+ viewValue = falseValue;
653
+ break;
654
+ }
655
+ setTimeout(() => ctrl.$setViewValue(viewValue));
656
+ };
657
+ } else { // true é o padrão
658
+ ctrl.$render = function () {
659
+ let viewValue = ctrl.$viewValue;
660
+ el.data('checked', viewValue);
661
+ switch (viewValue) {
662
+ case true:
663
+ case trueValue:
664
+ el.removeAttr('indeterminate');
665
+ el.prop('checked', true);
666
+ viewValue = trueValue;
667
+ break;
668
+ case false:
669
+ case falseValue:
670
+ el.removeAttr('indeterminate');
671
+ el.prop('checked', false);
672
+ viewValue = falseValue;
673
+ break;
674
+ default:
675
+ viewValue = null;
676
+ el.attr('indeterminate', true);
677
+ }
678
+ setTimeout(() => ctrl.$setViewValue(viewValue));
679
+ };
680
+ }
681
+ el.bind('click', function () {
682
+ let checked;
683
+ switch (el.data('checked')) {
684
+ case false:
685
+ case falseValue:
686
+ checked = attrs.ngTrueValue ? trueValue : true;
687
+ break;
688
+ default:
689
+ checked = attrs.ngFalseValue ? falseValue : false;
690
+ }
691
+ ctrl.$setViewValue(checked);
692
+ scope.$apply(ctrl.$render);
693
+ });
694
+ }
695
+ };
696
+ }])
699
697
 
700
698
  .directive('cronappFilter', function($compile) {
701
699
  var setFilterInButton = function($element, bindedFilter, operator) {
@@ -1042,23 +1040,23 @@ window.addEventListener('message', function(event) {
1042
1040
  'use strict';
1043
1041
 
1044
1042
  const defaultAdvancedTemplate =
1045
- "<ion-list type=\"\" can-swipe=\"listCanSwipe\">\n" +
1046
- " <ion-item ng-class=\"{'cron-list-selected' : isChecked(rowData)}\" class=\"item {{options.editableButtonClass}} {{options.iconClassPosition}} {{options.imageClassPosition}}\" ng-repeat=\"rowData in datasource\">\n" +
1047
- " <ul ng-if=\"options.allowMultiselect\" class=\"checkbox-group component-holder {{'cron-list-multiselect-' + options.imageType}}\" data-component=\"crn-checkbox\"><label class=\"checkbox\"><input ng-checked=\"isChecked(rowData);\" type=\"checkbox\"></label></ul>\n" +
1048
- " <img alt='Thumbnail' ng-if=\"options.imageType !== 'do-not-show' && rowData[options.fields.image]\" \n" +
1049
- " ng-src=\"{{options.isImageFromDropbox ? '' : 'data:image/png;base64,'}}{{rowData[options.fields.image]}}\" class=\"{{options.imageToClassPosition}}\">\n" +
1050
- " <div class=\"{{options.xattrTextPosition}} {{options.textToClassPosition}}\">\n" +
1051
- " <h2 ng-if=\"rowData[options.fields.field0]\">{{rowData[options.fields.field0]|mask:options.fields.mask0:options.fields.type0}}</h2>\n" +
1052
- " <p class=\"dark\" ng-if=\"rowData[options.fields.field1]\">{{rowData[options.fields.field1]|mask:options.fields.mask1:options.fields.type1}}</p>\n" +
1053
- " <p class=\"dark\" ng-if=\"rowData[options.fields.field2]\">{{rowData[options.fields.field2]|mask:options.fields.mask2:options.fields.type2}}</p>\n" +
1054
- " <p class=\"dark\" ng-if=\"rowData[options.fields.field3]\">{{rowData[options.fields.field3]|mask:options.fields.mask3:options.fields.type3}}</p>\n" +
1055
- " <p class=\"dark\" ng-if=\"rowData[options.fields.field4]\">{{rowData[options.fields.field4]|mask:options.fields.mask4:options.fields.type4}}</p>\n" +
1056
- " <p class=\"dark\" ng-if=\"rowData[options.fields.field5]\">{{rowData[options.fields.field5]|mask:options.fields.mask5:options.fields.type5}}</p>\n" +
1057
- " <i ng-if=\"options.icon\" class=\"{{options.icon}}\" xattr-theme=\"dark\"></i>\n" +
1058
- " </div>\n" +
1059
- " </ion-item>\n" +
1060
- "</ion-list>\n" +
1061
- "<ion-infinite-scroll></ion-infinite-scroll>\n";
1043
+ `<ion-list type="" can-swipe="listCanSwipe">
1044
+ <ion-item ng-class="{'cron-list-selected' : isChecked(rowData)}" class="item {{options.editableButtonClass}} {{options.iconClassPosition}} {{options.imageClassPosition}}" ng-repeat="rowData in datasource">
1045
+ <ul ng-if="options.allowMultiselect" class="checkbox-group component-holder {{'cron-list-multiselect-' + options.imageType}}" data-component="crn-checkbox"><label class="checkbox"><input ng-checked="isChecked(rowData);" type="checkbox"></label></ul>
1046
+ <img alt='Thumbnail' ng-if="options.imageType !== 'do-not-show' && rowData[options.fields.image]"
1047
+ ng-src="{{options.isImageFromDropbox ? '' : 'data:image/png;base64,'}}{{rowData[options.fields.image]}}" class="{{options.imageToClassPosition}}">
1048
+ <div class="{{options.xattrTextPosition}} {{options.textToClassPosition}}">
1049
+ <h2 ng-if="rowData[options.fields.field0]">{{rowData[options.fields.field0]|mask:options.fields.mask0:options.fields.type0}}</h2>
1050
+ <p class="dark" ng-if="hasValue(rowData[options.fields.field1])">{{rowData[options.fields.field1]|mask:options.fields.mask1:options.fields.type1}}</p>
1051
+ <p class="dark" ng-if="hasValue(rowData[options.fields.field2])">{{rowData[options.fields.field2]|mask:options.fields.mask2:options.fields.type2}}</p>
1052
+ <p class="dark" ng-if="hasValue(rowData[options.fields.field3])">{{rowData[options.fields.field3]|mask:options.fields.mask3:options.fields.type3}}</p>
1053
+ <p class="dark" ng-if="hasValue(rowData[options.fields.field4])">{{rowData[options.fields.field4]|mask:options.fields.mask4:options.fields.type4}}</p>
1054
+ <p class="dark" ng-if="hasValue(rowData[options.fields.field5])">{{rowData[options.fields.field5]|mask:options.fields.mask5:options.fields.type5}}</p>
1055
+ <i ng-if="options.icon" class="{{options.icon}}" xattr-theme="dark"></i>
1056
+ </div>
1057
+ </ion-item>
1058
+ </ion-list>
1059
+ <ion-infinite-scroll></ion-infinite-scroll>`;
1062
1060
 
1063
1061
  const defaultSearchTemplate =
1064
1062
  "<div class=\"item item-input-inset\">\n" +
@@ -1179,6 +1177,7 @@ window.addEventListener('message', function(event) {
1179
1177
  terminal: true,
1180
1178
  link: function(scope, element, attrs, ngModelCtrl) {
1181
1179
 
1180
+ scope.hasValue = value => value !== null && value !== undefined;
1182
1181
  var optionsList = {};
1183
1182
  var dataSourceName = '';
1184
1183
  var buttons = '';
@@ -1735,34 +1734,129 @@ window.addEventListener('message', function(event) {
1735
1734
 
1736
1735
  element.html($templateDyn);
1737
1736
  $compile($templateDyn)(element.scope());
1738
- }
1739
1737
  }
1740
- })
1741
-
1742
- .directive('cronVideo', function ($compile) {
1743
- return {
1744
- restrict: 'AE',
1738
+ }
1739
+ })
1740
+
1741
+ .directive('signaturePad', function($compile, $window) {
1742
+ 'use strict';
1743
+
1744
+ var signaturePad, canvas, element, EMPTY_IMAGE = null;
1745
+ return {
1746
+ restrict: 'E',
1747
+ require: "ngModel",
1748
+ scope: true,
1745
1749
  replace: true,
1746
- link: function (scope, element, attrs) {
1747
-
1748
- var component = element.find('.cronVideo')[0];
1749
- $compile(component)(element.scope());
1750
-
1751
- var componentOptions = element.find('.cronVideoIframe')[0];
1752
- $compile(componentOptions)(element.scope());
1753
-
1754
- var $templateDyn = "";
1755
- var src = attrs.src;
1756
- var width = attrs.width;
1757
- var height = attrs.height;
1758
- var title = attrs.title;
1759
- $templateDyn = `<iframe class="cronVideoIframe" src="${src}" width="${width}" height="${height}" title="${title}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen> </iframe>`;
1760
-
1761
- element.html($templateDyn);
1762
- $compile($templateDyn)(element.scope());
1750
+ template: '<div>' +
1751
+ '<canvas style="width:100%" ng-click="mouseup()" ng-mouseup="mouseup()"></canvas>' +
1752
+ '<div>' +
1753
+ '<button type="button" style="margin-right:5px;margin-bottom:5px;" ng-click="clear()">{{"clear"|translate}}</button>' +
1754
+ '</div>' +
1755
+ '</div>',
1756
+ scope: {
1757
+ clear: '=',
1758
+ dataurl: '=',
1759
+ height: '@',
1760
+ width: '@',
1761
+ ngClick: '@',
1762
+ ngModel: '='
1763
+ },
1764
+ controller: [
1765
+ '$scope',
1766
+ function($scope) {
1767
+
1768
+ $scope.mouseup = function() {
1769
+
1770
+ var signature = {};
1771
+
1772
+ if (!$scope.signaturePad.isEmpty()) {
1773
+ signature.dataUrl = $scope.signaturePad.toDataURL();
1774
+ signature.isEmpty = false;
1775
+
1776
+ } else {
1777
+ signature.dataUrl = EMPTY_IMAGE;
1778
+ signature.isEmpty = true;
1779
+ }
1780
+
1781
+ if (signature.dataUrl == null) {
1782
+ return;
1783
+ }
1784
+ var binary = signature.dataUrl.split(',')[1];
1785
+ $scope.ngModel = binary;
1786
+ };
1787
+
1788
+ $scope.$watch('ngModel', function(value, old) {
1789
+
1790
+ var signature = $scope.signaturePad;
1791
+ var data = $scope.ngModel;
1792
+
1793
+ if (value !== old) {
1794
+
1795
+ signature.fromDataURL("data:image/png;base64," + value, {
1796
+ ratio: 1
1797
+ });
1798
+ $scope.ngModel = value;
1799
+ signature.clear();
1800
+ }
1801
+ }, true);
1802
+
1803
+ $scope.clear = function() {
1804
+ $scope.signaturePad.clear();
1805
+ $scope.ngModel = null;
1806
+ };
1807
+
1808
+ }
1809
+ ],
1810
+ link: function(scope, element, attrs, ngModelCtrl) {
1811
+
1812
+ canvas = element.find('canvas')[0];
1813
+
1814
+ scope.onResize = function() {
1815
+
1816
+ var canvas = element.find('canvas')[0];
1817
+ var ratio = Math.max($window.devicePixelRatio || 1, 1);
1818
+ canvas.width = canvas.offsetWidth * ratio;
1819
+ canvas.height = canvas.offsetHeight * ratio;
1820
+ canvas.getContext("2d").scale(ratio, ratio);
1821
+ }
1822
+
1823
+ scope.onResize();
1824
+
1825
+ scope.signaturePad = new SignaturePad(canvas);
1826
+
1827
+ angular.element($window).bind('resize', function() {
1828
+ scope.onResize();
1829
+ });
1830
+
1831
+ $compile(element)(element.scope());
1763
1832
  }
1833
+ };
1834
+ })
1835
+
1836
+ .directive('cronVideo', function ($compile) {
1837
+ return {
1838
+ restrict: 'AE',
1839
+ replace: true,
1840
+ link: function (scope, element, attrs) {
1841
+
1842
+ var component = element.find('.cronVideo')[0];
1843
+ $compile(component)(element.scope());
1844
+
1845
+ var componentOptions = element.find('.cronVideoIframe')[0];
1846
+ $compile(componentOptions)(element.scope());
1847
+
1848
+ var $templateDyn = "";
1849
+ var src = attrs.src;
1850
+ var width = attrs.width;
1851
+ var height = attrs.height;
1852
+ var title = attrs.title;
1853
+ $templateDyn = `<iframe class="cronVideoIframe" src="${src}" width="${width}" height="${height}" title="${title}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen> </iframe>`;
1854
+
1855
+ element.html($templateDyn);
1856
+ $compile($templateDyn)(element.scope());
1764
1857
  }
1765
- });
1858
+ }
1859
+ });
1766
1860
 
1767
1861
  app.directive("kendoChat", function ($compile, $timeout) {
1768
1862
  return {
@@ -50,31 +50,7 @@
50
50
 
51
51
  // open report
52
52
  this.openURLContent = function(url) {
53
- var include = function() {
54
- var frame = $('<iframe/>');
55
- frame.attr('frameborder', 0);
56
- var h = parseInt($(window).height());
57
-
58
- frame.attr('height', h - 200);
59
- frame.attr('width', '100%');
60
- frame.attr('src', url + "?download=false");
61
- var m = $('#reportView .modal-body');
62
- if(m.get(0)) {
63
- m.html(frame);
64
- $('#reportViewContext .modal-dialog').css('width', '95%');
65
- setTimeout(function() {
66
- console.log('open[#reportViewContext]');
67
- $('body').append(context);
68
- $('#reportView').modal();
69
- }, 100);
70
- }
71
- else {
72
- console.log('wait[#reportViewContext]');
73
- setTimeout(include, 200);
74
- }
75
- }
76
-
77
- setTimeout(include, 200);
53
+ openReportOnMobile(url)
78
54
  };
79
55
 
80
56
  this.initializeStimulsoft = function(language) {
@@ -461,6 +437,10 @@
461
437
  }
462
438
  }.bind(this));
463
439
  };
464
-
440
+
441
+ function openReportOnMobile(url) {
442
+ window.open(url, '_system');
443
+ }
444
+
465
445
  });
466
446
  }(app));
@@ -27,6 +27,8 @@ window.ionic = window.ionic || {};
27
27
  window.ionic.views = {};
28
28
  window.ionic.version = '1.3.1';
29
29
 
30
+ const isRunningOnIonic = document.URL.startsWith('http://localhost');
31
+
30
32
  (function (ionic) {
31
33
 
32
34
  ionic.DelegateService = function(methodNames) {
@@ -2968,7 +2970,7 @@ function tapClickGateKeeper(e) {
2968
2970
 
2969
2971
  if (!ionic.tap.isLabelWithTextInput(e.target)) {
2970
2972
  // labels clicks from native should not preventDefault othersize keyboard will not show on input focus
2971
- e.preventDefault();
2973
+ isRunningOnIonic && e.preventDefault();
2972
2974
  }
2973
2975
  return false;
2974
2976
  }
@@ -3069,7 +3071,7 @@ function tapTouchEnd(e) {
3069
3071
  tapClick(e);
3070
3072
 
3071
3073
  if (isSelectOrOption(e.target.tagName)) {
3072
- e.preventDefault();
3074
+ isRunningOnIonic && e.preventDefault();
3073
3075
  }
3074
3076
  }
3075
3077
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cronapp-framework-mobile-js",
3
- "version": "2.8.8",
3
+ "version": "2.9.0",
4
4
  "description": "Javascript library for CronApp's projects",
5
5
  "main": "cronapp.framework.mobile.js",
6
6
  "scripts": {
@@ -57,6 +57,8 @@
57
57
  "ng-file-upload": "12.2.13",
58
58
  "angular-moment": "1.2.0",
59
59
  "pace": "HubSpot/pace#v1.0.2",
60
- "moment": "2.24.0"
60
+ "moment": "2.24.0",
61
+ "cronapp-ion-tab-badge": "1.0.0",
62
+ "signature_pad": "^3.0.0-beta.4"
61
63
  }
62
64
  }
package/postupdate.json CHANGED
@@ -171,6 +171,11 @@
171
171
  "file": "index.html",
172
172
  "script": "node_modules/cronapp-framework-mobile-js/js/reports/reports.service.js",
173
173
  "type": "script"
174
+ },
175
+ {
176
+ "file": "index.html",
177
+ "script": "node_modules/cronapp-ion-tab-badge/dist/index.js",
178
+ "type": "script"
174
179
  }
175
180
  ],
176
181
  "removes": [
@@ -208,6 +213,12 @@
208
213
  "file": "index.html",
209
214
  "script": "plugins/angular-translate/angular-translate.min.js",
210
215
  "type": "script"
216
+ },
217
+ {
218
+ "file": "index.html",
219
+ "script": "node_modules/signature_pad/dist/signature_pad.umd.min.js",
220
+ "type": "script",
221
+ "onTop": true
211
222
  }
212
223
  ],
213
224
  "replaces": [