iguazio.dashboard-controls 0.38.9 → 0.38.10-patch3

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.
@@ -3647,65 +3647,104 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
3647
3647
  (function () {
3648
3648
  'use strict';
3649
3649
 
3650
- IgzActionCheckboxAllController.$inject = ['$scope', '$rootScope', 'lodash'];
3651
- angular.module('iguazio.dashboard-controls').component('igzActionCheckboxAll', {
3650
+ IgzActionMenuController.$inject = ['$element', '$document', '$i18next', '$rootScope', '$scope', '$timeout', '$window', 'i18next', 'lodash', 'ConfigService', 'PreventDropdownCutOffService'];
3651
+ angular.module('iguazio.dashboard-controls').component('igzActionMenu', {
3652
3652
  bindings: {
3653
- itemsCountOriginal: '<itemsCount',
3654
- itemsType: '@?',
3655
- checkedItemsCount: '<?',
3656
- onCheckChange: '&?'
3653
+ actions: '<',
3654
+ shortcuts: '<',
3655
+ onFireAction: '<?',
3656
+ onClickShortcut: '<?',
3657
+ isMenuShown: '<?',
3658
+ iconClass: '@?',
3659
+ tooltipEnabled: '<?',
3660
+ tooltipText: '@?'
3657
3661
  },
3658
- templateUrl: 'igz_controls/components/action-checkbox-all/action-checkbox-all.tpl.html',
3659
- controller: IgzActionCheckboxAllController
3662
+ templateUrl: 'igz_controls/components/action-menu/action-menu.tpl.html',
3663
+ controller: IgzActionMenuController
3660
3664
  });
3661
3665
 
3662
- function IgzActionCheckboxAllController($scope, $rootScope, lodash) {
3666
+ function IgzActionMenuController($element, $document, $i18next, $rootScope, $scope, $timeout, $window, i18next, lodash, ConfigService, PreventDropdownCutOffService) {
3663
3667
  var ctrl = this;
3668
+ var lng = i18next.language;
3664
3669
 
3665
- ctrl.allItemsChecked = false;
3670
+ ctrl.isMenuShown = false;
3671
+ ctrl.preventDropdownCutOff = null;
3666
3672
 
3667
3673
  ctrl.$onInit = onInit;
3668
- ctrl.$onChanges = onChanges;
3674
+ ctrl.$postLink = postLink;
3669
3675
  ctrl.$onDestroy = onDestroy;
3676
+ ctrl.$onChanges = onChanges;
3670
3677
 
3671
- ctrl.onCheckAll = onCheckAll;
3678
+ ctrl.isDemoMode = ConfigService.isDemoMode;
3679
+ ctrl.showDetails = showDetails;
3680
+ ctrl.toggleMenu = toggleMenu;
3681
+ ctrl.isVisible = isVisible;
3672
3682
 
3673
3683
  //
3674
3684
  // Hook methods
3675
3685
  //
3676
3686
 
3677
3687
  /**
3678
- * Initialization method
3688
+ * Initialize method
3679
3689
  */
3680
3690
  function onInit() {
3681
- ctrl.checkedItemsCount = angular.isUndefined(ctrl.checkedItemsCount) ? 0 : ctrl.checkedItemsCount;
3682
- ctrl.itemsCount = angular.isUndefined(ctrl.itemsCount) ? 0 : ctrl.itemsCount;
3691
+ ctrl.iconClass = lodash.defaultTo(ctrl.iconClass, 'igz-icon-context-menu');
3683
3692
 
3684
- $scope.$on('action-checkbox_item-checked', toggleCheckedItem);
3685
- $scope.$on('action-checkbox-all_change-checked-items-count', changeItemsCheckedCount);
3686
- $scope.$on('action-checkbox-all_set-checked-items-count', setCheckedItemsCount);
3693
+ $scope.$on('close-all-action-menus', closeActionMenu);
3687
3694
  }
3688
3695
 
3689
3696
  /**
3690
- * Changes method
3697
+ * On changes hook method
3691
3698
  * @param {Object} changes
3692
3699
  */
3693
3700
  function onChanges(changes) {
3694
- if (angular.isDefined(changes.itemsCountOriginal)) {
3695
- ctrl.itemsCount = ctrl.itemsCountOriginal;
3696
- testAllItemsChecked();
3701
+ var actions = lodash.get(changes, 'actions.currentValue');
3702
+ var shortcuts = lodash.get(changes, 'shortcuts.currentValue');
3703
+
3704
+ if (angular.isDefined(actions)) {
3705
+ ctrl.actions = lodash.chain(actions).filter(function (action) {
3706
+ return !lodash.has(action, 'visible') || action.visible;
3707
+ }).map(function (action) {
3708
+ if (!angular.isFunction(action.handler)) {
3709
+ action.handler = defaultAction;
3710
+
3711
+ if (action.id === 'delete' && angular.isUndefined(action.confirm)) {
3712
+ action.confirm = {
3713
+ message: $i18next.t('common:DELETE_SELECTED_ITEM_CONFIRM', { lng: lng }),
3714
+ yesLabel: $i18next.t('common:YES_DELETE', { lng: lng }),
3715
+ noLabel: $i18next.t('common:CANCEL', { lng: lng }),
3716
+ type: 'critical_alert'
3717
+ };
3718
+ }
3719
+ }
3720
+
3721
+ return action;
3722
+ }).value();
3723
+ }
3724
+
3725
+ if (angular.isDefined(shortcuts)) {
3726
+ ctrl.shortcuts = lodash.filter(shortcuts, function (shortcut) {
3727
+ return !lodash.has(shortcut, 'visible') || shortcut.visible;
3728
+ });
3697
3729
  }
3698
3730
  }
3699
3731
 
3700
3732
  /**
3701
- * Destructor method
3733
+ * Destructor
3702
3734
  */
3703
3735
  function onDestroy() {
3704
- ctrl.checkedItemsCount = 0;
3736
+ detachDocumentEvent();
3737
+ }
3705
3738
 
3706
- $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {
3707
- checkedCount: ctrl.checkedItemsCount
3708
- });
3739
+ /**
3740
+ * Post linking method
3741
+ */
3742
+ function postLink() {
3743
+
3744
+ // Bind DOM-related preventDropdownCutOff method to component's controller
3745
+ PreventDropdownCutOffService.preventDropdownCutOff($element, '.menu-dropdown');
3746
+
3747
+ attachDocumentEvent();
3709
3748
  }
3710
3749
 
3711
3750
  //
@@ -3713,127 +3752,115 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
3713
3752
  //
3714
3753
 
3715
3754
  /**
3716
- * Calls when Check all button is clicked.
3755
+ * Handles mouse click on a shortcut
3756
+ * @param {MouseEvent} event
3757
+ * @param {string} state - absolute state name or relative state path
3717
3758
  */
3718
- function onCheckAll() {
3719
- ctrl.allItemsChecked = !ctrl.allItemsChecked;
3720
- ctrl.checkedItemsCount = ctrl.allItemsChecked ? ctrl.itemsCount : 0;
3721
-
3722
- $rootScope.$broadcast('action-checkbox-all_check-all', {
3723
- checked: ctrl.allItemsChecked,
3724
- checkedCount: ctrl.checkedItemsCount,
3725
- itemsType: !lodash.isEmpty(ctrl.itemsType) ? ctrl.itemsType : null
3726
- });
3727
-
3728
- if (angular.isFunction(ctrl.onCheckChange)) {
3729
- ctrl.onCheckChange({ checkedCount: ctrl.checkedItemsCount });
3759
+ function showDetails(event, state) {
3760
+ if (angular.isFunction(ctrl.onClickShortcut)) {
3761
+ ctrl.onClickShortcut(event, state);
3730
3762
  }
3731
3763
  }
3732
3764
 
3733
- //
3734
- // Private methods
3735
- //
3736
-
3737
3765
  /**
3738
- * Calls on checked items count change
3766
+ * Handles mouse click on the button of menu
3739
3767
  * @param {Object} event
3740
- * @param {Object} data
3768
+ * Show/hides the action dropdown
3741
3769
  */
3742
- function changeItemsCheckedCount(event, data) {
3743
- if (data.changedCheckedItemsCount === 0) {
3744
- ctrl.checkedItemsCount = 0;
3770
+ function toggleMenu(event) {
3771
+ if (!ctrl.isMenuShown) {
3772
+ $rootScope.$broadcast('close-all-action-menus');
3773
+ ctrl.isMenuShown = true;
3774
+ attachDocumentEvent();
3775
+ showMenu();
3745
3776
  } else {
3746
- ctrl.checkedItemsCount += data.changedCheckedItemsCount;
3777
+ detachDocumentEvent();
3778
+ ctrl.isMenuShown = false;
3747
3779
  }
3748
3780
 
3749
- testAllItemsChecked();
3750
-
3751
- $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {
3752
- checkedCount: ctrl.checkedItemsCount
3753
- });
3781
+ event.stopPropagation();
3754
3782
  }
3755
3783
 
3756
3784
  /**
3757
- * Sets checked items count
3758
- * @param {Object} event
3759
- * @param {number} newCheckedItemsCount
3785
+ * Checks if action menu is visible (not empty)
3760
3786
  */
3761
- function setCheckedItemsCount(event, newCheckedItemsCount) {
3762
- ctrl.checkedItemsCount = newCheckedItemsCount;
3763
-
3764
- testAllItemsChecked();
3765
-
3766
- $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {
3767
- checkedCount: ctrl.checkedItemsCount
3768
- });
3787
+ function isVisible() {
3788
+ return !lodash.isEmpty(ctrl.actions) || !lodash.isEmpty(ctrl.shortcuts);
3769
3789
  }
3770
3790
 
3791
+ //
3792
+ // Private methods
3793
+ //
3794
+
3771
3795
  /**
3772
- * Calls on checkbox check/uncheck
3773
- * @param {Object} event
3774
- * @param {Object} data
3796
+ * Shows the dropdown. If there is not enough space from below,
3797
+ * adds 'upward-menu' class to open the dropdown from above
3775
3798
  */
3776
- function toggleCheckedItem(event, data) {
3777
- if (data.checked) {
3778
- ctrl.checkedItemsCount++;
3779
- } else {
3780
- ctrl.checkedItemsCount--;
3781
- }
3799
+ function showMenu() {
3800
+ $timeout(function () {
3801
+ var windowHeight = $window.innerHeight;
3802
+ var menu = $document.find('.menu-dropdown')[0];
3803
+ var menuTotalHeight = menu.clientHeight;
3804
+ var menuPosition = menu.getBoundingClientRect();
3805
+ var menuHighestPoint = menuPosition.top;
3806
+ var menuLowestPoint = menuPosition.bottom;
3807
+ var menuWrapper = menu.closest('.igz-scrollable-container');
3782
3808
 
3783
- $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {
3784
- checkedCount: ctrl.checkedItemsCount
3785
- });
3809
+ if (menuWrapper) {
3810
+ windowHeight = menuWrapper.getBoundingClientRect().bottom;
3811
+ menuHighestPoint -= menuWrapper.getBoundingClientRect().top;
3812
+ }
3786
3813
 
3787
- testAllItemsChecked();
3814
+ if (windowHeight - menuLowestPoint < 0 && menuHighestPoint > menuTotalHeight) {
3815
+ menu.classList.add('upward-menu');
3816
+ }
3788
3817
 
3789
- // callback function is called to inform about checked items count
3790
- if (angular.isFunction(ctrl.onCheckChange)) {
3791
- ctrl.onCheckChange({ checkedCount: ctrl.checkedItemsCount });
3792
- }
3818
+ angular.element('.menu-dropdown').css('visibility', 'visible');
3819
+ });
3793
3820
  }
3794
3821
 
3795
3822
  /**
3796
- * Updates items count and toggle allItemsChecked flag
3823
+ * Attaches on click event handler to the document
3797
3824
  */
3798
- function testAllItemsChecked() {
3799
- ctrl.allItemsChecked = ctrl.itemsCount > 0 && ctrl.checkedItemsCount === ctrl.itemsCount;
3825
+ function attachDocumentEvent() {
3826
+ $document.on('click', onDocumentClick);
3800
3827
  }
3801
- }
3802
- })();
3803
- 'use strict';
3804
-
3805
- (function () {
3806
- 'use strict';
3807
-
3808
- ActionCheckboxAllService.$inject = ['$rootScope'];
3809
- angular.module('iguazio.dashboard-controls').factory('ActionCheckboxAllService', ActionCheckboxAllService);
3810
3828
 
3811
- function ActionCheckboxAllService($rootScope) {
3812
- return {
3813
- changeCheckedItemsCount: changeCheckedItemsCount,
3814
- setCheckedItemsCount: setCheckedItemsCount
3815
- };
3829
+ /**
3830
+ * Closes action menu
3831
+ */
3832
+ function closeActionMenu() {
3833
+ ctrl.isMenuShown = false;
3834
+ detachDocumentEvent();
3835
+ }
3816
3836
 
3817
- //
3818
- // Public methods
3819
- //
3837
+ /**
3838
+ * Default action handler
3839
+ * @param {Object} action
3840
+ */
3841
+ function defaultAction(action) {
3842
+ if (angular.isFunction(ctrl.onFireAction)) {
3843
+ ctrl.onFireAction(action.id);
3844
+ }
3845
+ }
3820
3846
 
3821
3847
  /**
3822
- * Sends broadcast with count of changed checked items
3823
- * @param {number} changedCheckedItemsCount - number of changed checked items
3848
+ * Removes on click event handler attached to the document
3824
3849
  */
3825
- function changeCheckedItemsCount(changedCheckedItemsCount) {
3826
- $rootScope.$broadcast('action-checkbox-all_change-checked-items-count', {
3827
- changedCheckedItemsCount: changedCheckedItemsCount
3828
- });
3850
+ function detachDocumentEvent() {
3851
+ $document.off('click', onDocumentClick);
3829
3852
  }
3830
3853
 
3831
3854
  /**
3832
- * Sends broadcast with count of checked items
3833
- * @param {number} checkedItemsCount
3855
+ * Closes action menu
3856
+ * @param {MouseEvent} event
3834
3857
  */
3835
- function setCheckedItemsCount(checkedItemsCount) {
3836
- $rootScope.$broadcast('action-checkbox-all_set-checked-items-count', checkedItemsCount);
3858
+ function onDocumentClick(event) {
3859
+ $scope.$apply(function () {
3860
+ if (event.target !== $element[0] && $element.find(event.target).length === 0) {
3861
+ closeActionMenu();
3862
+ }
3863
+ });
3837
3864
  }
3838
3865
  }
3839
3866
  })();
@@ -4056,104 +4083,65 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
4056
4083
  (function () {
4057
4084
  'use strict';
4058
4085
 
4059
- IgzActionMenuController.$inject = ['$element', '$document', '$i18next', '$rootScope', '$scope', '$timeout', '$window', 'i18next', 'lodash', 'ConfigService', 'PreventDropdownCutOffService'];
4060
- angular.module('iguazio.dashboard-controls').component('igzActionMenu', {
4061
- bindings: {
4062
- actions: '<',
4063
- shortcuts: '<',
4064
- onFireAction: '<?',
4065
- onClickShortcut: '<?',
4066
- isMenuShown: '<?',
4067
- iconClass: '@?',
4068
- tooltipEnabled: '<?',
4069
- tooltipText: '@?'
4086
+ IgzActionCheckboxAllController.$inject = ['$scope', '$rootScope', 'lodash'];
4087
+ angular.module('iguazio.dashboard-controls').component('igzActionCheckboxAll', {
4088
+ bindings: {
4089
+ itemsCountOriginal: '<itemsCount',
4090
+ itemsType: '@?',
4091
+ checkedItemsCount: '<?',
4092
+ onCheckChange: '&?'
4070
4093
  },
4071
- templateUrl: 'igz_controls/components/action-menu/action-menu.tpl.html',
4072
- controller: IgzActionMenuController
4094
+ templateUrl: 'igz_controls/components/action-checkbox-all/action-checkbox-all.tpl.html',
4095
+ controller: IgzActionCheckboxAllController
4073
4096
  });
4074
4097
 
4075
- function IgzActionMenuController($element, $document, $i18next, $rootScope, $scope, $timeout, $window, i18next, lodash, ConfigService, PreventDropdownCutOffService) {
4098
+ function IgzActionCheckboxAllController($scope, $rootScope, lodash) {
4076
4099
  var ctrl = this;
4077
- var lng = i18next.language;
4078
4100
 
4079
- ctrl.isMenuShown = false;
4080
- ctrl.preventDropdownCutOff = null;
4101
+ ctrl.allItemsChecked = false;
4081
4102
 
4082
4103
  ctrl.$onInit = onInit;
4083
- ctrl.$postLink = postLink;
4084
- ctrl.$onDestroy = onDestroy;
4085
4104
  ctrl.$onChanges = onChanges;
4105
+ ctrl.$onDestroy = onDestroy;
4086
4106
 
4087
- ctrl.isDemoMode = ConfigService.isDemoMode;
4088
- ctrl.showDetails = showDetails;
4089
- ctrl.toggleMenu = toggleMenu;
4090
- ctrl.isVisible = isVisible;
4107
+ ctrl.onCheckAll = onCheckAll;
4091
4108
 
4092
4109
  //
4093
4110
  // Hook methods
4094
4111
  //
4095
4112
 
4096
4113
  /**
4097
- * Initialize method
4114
+ * Initialization method
4098
4115
  */
4099
4116
  function onInit() {
4100
- ctrl.iconClass = lodash.defaultTo(ctrl.iconClass, 'igz-icon-context-menu');
4117
+ ctrl.checkedItemsCount = angular.isUndefined(ctrl.checkedItemsCount) ? 0 : ctrl.checkedItemsCount;
4118
+ ctrl.itemsCount = angular.isUndefined(ctrl.itemsCount) ? 0 : ctrl.itemsCount;
4101
4119
 
4102
- $scope.$on('close-all-action-menus', closeActionMenu);
4120
+ $scope.$on('action-checkbox_item-checked', toggleCheckedItem);
4121
+ $scope.$on('action-checkbox-all_change-checked-items-count', changeItemsCheckedCount);
4122
+ $scope.$on('action-checkbox-all_set-checked-items-count', setCheckedItemsCount);
4103
4123
  }
4104
4124
 
4105
4125
  /**
4106
- * On changes hook method
4126
+ * Changes method
4107
4127
  * @param {Object} changes
4108
4128
  */
4109
4129
  function onChanges(changes) {
4110
- var actions = lodash.get(changes, 'actions.currentValue');
4111
- var shortcuts = lodash.get(changes, 'shortcuts.currentValue');
4112
-
4113
- if (angular.isDefined(actions)) {
4114
- ctrl.actions = lodash.chain(actions).filter(function (action) {
4115
- return !lodash.has(action, 'visible') || action.visible;
4116
- }).map(function (action) {
4117
- if (!angular.isFunction(action.handler)) {
4118
- action.handler = defaultAction;
4119
-
4120
- if (action.id === 'delete' && angular.isUndefined(action.confirm)) {
4121
- action.confirm = {
4122
- message: $i18next.t('common:DELETE_SELECTED_ITEM_CONFIRM', { lng: lng }),
4123
- yesLabel: $i18next.t('common:YES_DELETE', { lng: lng }),
4124
- noLabel: $i18next.t('common:CANCEL', { lng: lng }),
4125
- type: 'critical_alert'
4126
- };
4127
- }
4128
- }
4129
-
4130
- return action;
4131
- }).value();
4132
- }
4133
-
4134
- if (angular.isDefined(shortcuts)) {
4135
- ctrl.shortcuts = lodash.filter(shortcuts, function (shortcut) {
4136
- return !lodash.has(shortcut, 'visible') || shortcut.visible;
4137
- });
4130
+ if (angular.isDefined(changes.itemsCountOriginal)) {
4131
+ ctrl.itemsCount = ctrl.itemsCountOriginal;
4132
+ testAllItemsChecked();
4138
4133
  }
4139
4134
  }
4140
4135
 
4141
4136
  /**
4142
- * Destructor
4137
+ * Destructor method
4143
4138
  */
4144
4139
  function onDestroy() {
4145
- detachDocumentEvent();
4146
- }
4147
-
4148
- /**
4149
- * Post linking method
4150
- */
4151
- function postLink() {
4152
-
4153
- // Bind DOM-related preventDropdownCutOff method to component's controller
4154
- PreventDropdownCutOffService.preventDropdownCutOff($element, '.menu-dropdown');
4140
+ ctrl.checkedItemsCount = 0;
4155
4141
 
4156
- attachDocumentEvent();
4142
+ $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {
4143
+ checkedCount: ctrl.checkedItemsCount
4144
+ });
4157
4145
  }
4158
4146
 
4159
4147
  //
@@ -4161,115 +4149,127 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
4161
4149
  //
4162
4150
 
4163
4151
  /**
4164
- * Handles mouse click on a shortcut
4165
- * @param {MouseEvent} event
4166
- * @param {string} state - absolute state name or relative state path
4152
+ * Calls when Check all button is clicked.
4167
4153
  */
4168
- function showDetails(event, state) {
4169
- if (angular.isFunction(ctrl.onClickShortcut)) {
4170
- ctrl.onClickShortcut(event, state);
4154
+ function onCheckAll() {
4155
+ ctrl.allItemsChecked = !ctrl.allItemsChecked;
4156
+ ctrl.checkedItemsCount = ctrl.allItemsChecked ? ctrl.itemsCount : 0;
4157
+
4158
+ $rootScope.$broadcast('action-checkbox-all_check-all', {
4159
+ checked: ctrl.allItemsChecked,
4160
+ checkedCount: ctrl.checkedItemsCount,
4161
+ itemsType: !lodash.isEmpty(ctrl.itemsType) ? ctrl.itemsType : null
4162
+ });
4163
+
4164
+ if (angular.isFunction(ctrl.onCheckChange)) {
4165
+ ctrl.onCheckChange({ checkedCount: ctrl.checkedItemsCount });
4171
4166
  }
4172
4167
  }
4173
4168
 
4169
+ //
4170
+ // Private methods
4171
+ //
4172
+
4174
4173
  /**
4175
- * Handles mouse click on the button of menu
4174
+ * Calls on checked items count change
4176
4175
  * @param {Object} event
4177
- * Show/hides the action dropdown
4176
+ * @param {Object} data
4178
4177
  */
4179
- function toggleMenu(event) {
4180
- if (!ctrl.isMenuShown) {
4181
- $rootScope.$broadcast('close-all-action-menus');
4182
- ctrl.isMenuShown = true;
4183
- attachDocumentEvent();
4184
- showMenu();
4178
+ function changeItemsCheckedCount(event, data) {
4179
+ if (data.changedCheckedItemsCount === 0) {
4180
+ ctrl.checkedItemsCount = 0;
4185
4181
  } else {
4186
- detachDocumentEvent();
4187
- ctrl.isMenuShown = false;
4182
+ ctrl.checkedItemsCount += data.changedCheckedItemsCount;
4188
4183
  }
4189
4184
 
4190
- event.stopPropagation();
4191
- }
4185
+ testAllItemsChecked();
4192
4186
 
4193
- /**
4194
- * Checks if action menu is visible (not empty)
4195
- */
4196
- function isVisible() {
4197
- return !lodash.isEmpty(ctrl.actions) || !lodash.isEmpty(ctrl.shortcuts);
4187
+ $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {
4188
+ checkedCount: ctrl.checkedItemsCount
4189
+ });
4198
4190
  }
4199
4191
 
4200
- //
4201
- // Private methods
4202
- //
4203
-
4204
4192
  /**
4205
- * Shows the dropdown. If there is not enough space from below,
4206
- * adds 'upward-menu' class to open the dropdown from above
4193
+ * Sets checked items count
4194
+ * @param {Object} event
4195
+ * @param {number} newCheckedItemsCount
4207
4196
  */
4208
- function showMenu() {
4209
- $timeout(function () {
4210
- var windowHeight = $window.innerHeight;
4211
- var menu = $document.find('.menu-dropdown')[0];
4212
- var menuTotalHeight = menu.clientHeight;
4213
- var menuPosition = menu.getBoundingClientRect();
4214
- var menuHighestPoint = menuPosition.top;
4215
- var menuLowestPoint = menuPosition.bottom;
4216
- var menuWrapper = menu.closest('.igz-scrollable-container');
4217
-
4218
- if (menuWrapper) {
4219
- windowHeight = menuWrapper.getBoundingClientRect().bottom;
4220
- menuHighestPoint -= menuWrapper.getBoundingClientRect().top;
4221
- }
4197
+ function setCheckedItemsCount(event, newCheckedItemsCount) {
4198
+ ctrl.checkedItemsCount = newCheckedItemsCount;
4222
4199
 
4223
- if (windowHeight - menuLowestPoint < 0 && menuHighestPoint > menuTotalHeight) {
4224
- menu.classList.add('upward-menu');
4225
- }
4200
+ testAllItemsChecked();
4226
4201
 
4227
- angular.element('.menu-dropdown').css('visibility', 'visible');
4202
+ $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {
4203
+ checkedCount: ctrl.checkedItemsCount
4228
4204
  });
4229
4205
  }
4230
4206
 
4231
4207
  /**
4232
- * Attaches on click event handler to the document
4208
+ * Calls on checkbox check/uncheck
4209
+ * @param {Object} event
4210
+ * @param {Object} data
4233
4211
  */
4234
- function attachDocumentEvent() {
4235
- $document.on('click', onDocumentClick);
4236
- }
4212
+ function toggleCheckedItem(event, data) {
4213
+ if (data.checked) {
4214
+ ctrl.checkedItemsCount++;
4215
+ } else {
4216
+ ctrl.checkedItemsCount--;
4217
+ }
4237
4218
 
4238
- /**
4239
- * Closes action menu
4240
- */
4241
- function closeActionMenu() {
4242
- ctrl.isMenuShown = false;
4243
- detachDocumentEvent();
4219
+ $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {
4220
+ checkedCount: ctrl.checkedItemsCount
4221
+ });
4222
+
4223
+ testAllItemsChecked();
4224
+
4225
+ // callback function is called to inform about checked items count
4226
+ if (angular.isFunction(ctrl.onCheckChange)) {
4227
+ ctrl.onCheckChange({ checkedCount: ctrl.checkedItemsCount });
4228
+ }
4244
4229
  }
4245
4230
 
4246
4231
  /**
4247
- * Default action handler
4248
- * @param {Object} action
4232
+ * Updates items count and toggle allItemsChecked flag
4249
4233
  */
4250
- function defaultAction(action) {
4251
- if (angular.isFunction(ctrl.onFireAction)) {
4252
- ctrl.onFireAction(action.id);
4253
- }
4234
+ function testAllItemsChecked() {
4235
+ ctrl.allItemsChecked = ctrl.itemsCount > 0 && ctrl.checkedItemsCount === ctrl.itemsCount;
4254
4236
  }
4237
+ }
4238
+ })();
4239
+ 'use strict';
4240
+
4241
+ (function () {
4242
+ 'use strict';
4243
+
4244
+ ActionCheckboxAllService.$inject = ['$rootScope'];
4245
+ angular.module('iguazio.dashboard-controls').factory('ActionCheckboxAllService', ActionCheckboxAllService);
4246
+
4247
+ function ActionCheckboxAllService($rootScope) {
4248
+ return {
4249
+ changeCheckedItemsCount: changeCheckedItemsCount,
4250
+ setCheckedItemsCount: setCheckedItemsCount
4251
+ };
4252
+
4253
+ //
4254
+ // Public methods
4255
+ //
4255
4256
 
4256
4257
  /**
4257
- * Removes on click event handler attached to the document
4258
+ * Sends broadcast with count of changed checked items
4259
+ * @param {number} changedCheckedItemsCount - number of changed checked items
4258
4260
  */
4259
- function detachDocumentEvent() {
4260
- $document.off('click', onDocumentClick);
4261
+ function changeCheckedItemsCount(changedCheckedItemsCount) {
4262
+ $rootScope.$broadcast('action-checkbox-all_change-checked-items-count', {
4263
+ changedCheckedItemsCount: changedCheckedItemsCount
4264
+ });
4261
4265
  }
4262
4266
 
4263
4267
  /**
4264
- * Closes action menu
4265
- * @param {MouseEvent} event
4268
+ * Sends broadcast with count of checked items
4269
+ * @param {number} checkedItemsCount
4266
4270
  */
4267
- function onDocumentClick(event) {
4268
- $scope.$apply(function () {
4269
- if (event.target !== $element[0] && $element.find(event.target).length === 0) {
4270
- closeActionMenu();
4271
- }
4272
- });
4271
+ function setCheckedItemsCount(checkedItemsCount) {
4272
+ $rootScope.$broadcast('action-checkbox-all_set-checked-items-count', checkedItemsCount);
4273
4273
  }
4274
4274
  }
4275
4275
  })();
@@ -4898,13 +4898,76 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
4898
4898
  })();
4899
4899
  'use strict';
4900
4900
 
4901
- /* eslint max-statements: ["error", 100] */
4902
- /* eslint complexity: ["error", 12] */
4903
4901
  (function () {
4904
4902
  'use strict';
4905
4903
 
4906
- /**
4907
- * @name igzDefaultDropdown
4904
+ IgzCopyToClipboard.$inject = ['$i18next', 'i18next', 'lodash', 'DialogsService'];
4905
+ angular.module('iguazio.dashboard-controls').component('igzCopyToClipboard', {
4906
+ bindings: {
4907
+ tooltipPlacement: '@?',
4908
+ tooltipText: '@?',
4909
+ value: '<'
4910
+ },
4911
+ templateUrl: 'igz_controls/components/copy-to-clipboard/copy-to-clipboard.tpl.html',
4912
+ controller: IgzCopyToClipboard
4913
+ });
4914
+
4915
+ function IgzCopyToClipboard($i18next, i18next, lodash, DialogsService) {
4916
+ var ctrl = this;
4917
+ var lng = i18next.language;
4918
+
4919
+ ctrl.$onInit = onInit;
4920
+
4921
+ ctrl.copyToClipboard = copyToClipboard;
4922
+
4923
+ //
4924
+ // Hook methods
4925
+ //
4926
+
4927
+ /**
4928
+ * Initialization method
4929
+ */
4930
+ function onInit() {
4931
+ lodash.defaults(ctrl, {
4932
+ tooltipPlacement: 'top'
4933
+ });
4934
+ }
4935
+
4936
+ //
4937
+ // Public method
4938
+ //
4939
+
4940
+ /**
4941
+ * Copies a string to the clipboard.
4942
+ */
4943
+ function copyToClipboard() {
4944
+ if (document.queryCommandSupported && document.queryCommandSupported('copy')) {
4945
+ var textarea = document.createElement('textarea');
4946
+ textarea.textContent = ctrl.value;
4947
+ textarea.style.position = 'fixed';
4948
+ document.body.appendChild(textarea);
4949
+ textarea.select();
4950
+
4951
+ try {
4952
+ return document.execCommand('copy'); // Security exception may be thrown by some browsers.
4953
+ } catch (ex) {
4954
+ DialogsService.alert($i18next.t('common:COPY_TO_CLIPBOARD_FAILED', { lng: lng }), ex);
4955
+ } finally {
4956
+ document.body.removeChild(textarea);
4957
+ }
4958
+ }
4959
+ }
4960
+ }
4961
+ })();
4962
+ 'use strict';
4963
+
4964
+ /* eslint max-statements: ["error", 100] */
4965
+ /* eslint complexity: ["error", 12] */
4966
+ (function () {
4967
+ 'use strict';
4968
+
4969
+ /**
4970
+ * @name igzDefaultDropdown
4908
4971
  * @description
4909
4972
  * Default drop down component. This component is a toggleable menu that allows the user to choose one value from a
4910
4973
  * predefined list. It can also become a combo-box where the user can enter text. It can also auto-complete the
@@ -5014,8 +5077,8 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
5014
5077
 
5015
5078
  ctrl.checkIsRequired = checkIsRequired;
5016
5079
  ctrl.getDescription = getDescription;
5017
- ctrl.getName = getName;
5018
5080
  ctrl.getIcon = getIcon;
5081
+ ctrl.getNameTemplate = getNameTemplate;
5019
5082
  ctrl.getTooltip = getTooltip;
5020
5083
  ctrl.getValuesArray = getValuesArray;
5021
5084
  ctrl.isItemSelected = isItemSelected;
@@ -5178,13 +5241,12 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
5178
5241
  }
5179
5242
 
5180
5243
  /**
5181
- * Returns the name of the provided item. Searches for a direct `name` property, or searches `name` property by
5182
- * `nameKey`
5244
+ * Returns the name of the provided item. Searches for a direct `nameTemplate` property
5183
5245
  * @param {Object} item - the item whose name should be returned
5184
5246
  * @returns {string}
5185
5247
  */
5186
- function getName(item) {
5187
- return lodash.get(item, 'name', lodash.get(item, ctrl.nameKey, ''));
5248
+ function getNameTemplate(item) {
5249
+ return lodash.get(item, 'nameTemplate', getName(item));
5188
5250
  }
5189
5251
 
5190
5252
  /**
@@ -5376,7 +5438,7 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
5376
5438
  } else {
5377
5439
  ctrl.selectedItem = item;
5378
5440
  }
5379
- ctrl.typedValue = ctrl.getName(item);
5441
+ ctrl.typedValue = getName(item);
5380
5442
  }
5381
5443
 
5382
5444
  if (angular.isFunction(ctrl.itemSelectCallback)) {
@@ -5498,12 +5560,22 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
5498
5560
  // Private methods
5499
5561
  //
5500
5562
 
5563
+ /**
5564
+ * Returns the name of the provided item. Searches for a direct `name` property, or searches `name` property by
5565
+ * `nameKey`
5566
+ * @param {Object} item - the item whose name should be returned
5567
+ * @returns {string}
5568
+ */
5569
+ function getName(item) {
5570
+ return lodash.get(item, 'name', lodash.get(item, ctrl.nameKey, ''));
5571
+ }
5572
+
5501
5573
  /**
5502
5574
  * Sets default input value
5503
5575
  */
5504
5576
  function setDefaultInputValue() {
5505
5577
  if (!lodash.isNil(ctrl.selectedItem)) {
5506
- ctrl.typedValue = ctrl.getName(angular.isDefined(ctrl.selectPropertyOnly) ? lodash.find(ctrl.valuesArray, [ctrl.selectPropertyOnly, ctrl.selectedItem]) : ctrl.selectedItem);
5578
+ ctrl.typedValue = getName(angular.isDefined(ctrl.selectPropertyOnly) ? lodash.find(ctrl.valuesArray, [ctrl.selectPropertyOnly, ctrl.selectedItem]) : ctrl.selectedItem);
5507
5579
 
5508
5580
  if (ctrl.typedValue === '' && ctrl.enableTyping) {
5509
5581
  ctrl.typedValue = ctrl.selectedItem;
@@ -5542,23 +5614,6 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
5542
5614
  });
5543
5615
  }
5544
5616
 
5545
- /**
5546
- * Handle click on the document and not on the dropdown field and close the dropdown
5547
- * @param {Object} e - event
5548
- */
5549
- function unselectDropdown(e) {
5550
- if ($element.find(e.target).length === 0) {
5551
- $scope.$evalAsync(function () {
5552
- ctrl.isDropdownContainerShown = false;
5553
- ctrl.isDropUp = false;
5554
-
5555
- if (angular.isFunction(ctrl.onCloseDropdown)) {
5556
- ctrl.onCloseDropdown();
5557
- }
5558
- });
5559
- }
5560
- }
5561
-
5562
5617
  /**
5563
5618
  * Takes the largest element and sets him width as min-width to all elements (needed to style drop-down list)
5564
5619
  */
@@ -5572,67 +5627,21 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
5572
5627
  angular.element(label).css('min-width', minWidth);
5573
5628
  });
5574
5629
  }
5575
- }
5576
- })();
5577
- 'use strict';
5578
-
5579
- (function () {
5580
- 'use strict';
5581
-
5582
- IgzCopyToClipboard.$inject = ['$i18next', 'i18next', 'lodash', 'DialogsService'];
5583
- angular.module('iguazio.dashboard-controls').component('igzCopyToClipboard', {
5584
- bindings: {
5585
- tooltipPlacement: '@?',
5586
- tooltipText: '@?',
5587
- value: '<'
5588
- },
5589
- templateUrl: 'igz_controls/components/copy-to-clipboard/copy-to-clipboard.tpl.html',
5590
- controller: IgzCopyToClipboard
5591
- });
5592
-
5593
- function IgzCopyToClipboard($i18next, i18next, lodash, DialogsService) {
5594
- var ctrl = this;
5595
- var lng = i18next.language;
5596
-
5597
- ctrl.$onInit = onInit;
5598
-
5599
- ctrl.copyToClipboard = copyToClipboard;
5600
-
5601
- //
5602
- // Hook methods
5603
- //
5604
-
5605
- /**
5606
- * Initialization method
5607
- */
5608
- function onInit() {
5609
- lodash.defaults(ctrl, {
5610
- tooltipPlacement: 'top'
5611
- });
5612
- }
5613
-
5614
- //
5615
- // Public method
5616
- //
5617
5630
 
5618
5631
  /**
5619
- * Copies a string to the clipboard.
5632
+ * Handle click on the document and not on the dropdown field and close the dropdown
5633
+ * @param {Object} e - event
5620
5634
  */
5621
- function copyToClipboard() {
5622
- if (document.queryCommandSupported && document.queryCommandSupported('copy')) {
5623
- var textarea = document.createElement('textarea');
5624
- textarea.textContent = ctrl.value;
5625
- textarea.style.position = 'fixed';
5626
- document.body.appendChild(textarea);
5627
- textarea.select();
5635
+ function unselectDropdown(e) {
5636
+ if ($element.find(e.target).length === 0) {
5637
+ $scope.$evalAsync(function () {
5638
+ ctrl.isDropdownContainerShown = false;
5639
+ ctrl.isDropUp = false;
5628
5640
 
5629
- try {
5630
- return document.execCommand('copy'); // Security exception may be thrown by some browsers.
5631
- } catch (ex) {
5632
- DialogsService.alert($i18next.t('common:COPY_TO_CLIPBOARD_FAILED', { lng: lng }), ex);
5633
- } finally {
5634
- document.body.removeChild(textarea);
5635
- }
5641
+ if (angular.isFunction(ctrl.onCloseDropdown)) {
5642
+ ctrl.onCloseDropdown();
5643
+ }
5644
+ });
5636
5645
  }
5637
5646
  }
5638
5647
  }
@@ -9931,41 +9940,31 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
9931
9940
  (function () {
9932
9941
  'use strict';
9933
9942
 
9934
- IgzInfoPageFiltersController.$inject = ['$rootScope', '$scope', '$animate', '$element', 'EventHelperService'];
9935
- angular.module('iguazio.dashboard-controls').component('igzInfoPageFilters', {
9943
+ IgzInfoPageContentController.$inject = ['$scope', '$timeout', '$window', '$element'];
9944
+ angular.module('iguazio.dashboard-controls').component('igzInfoPageContent', {
9936
9945
  bindings: {
9937
- isDisabled: '<?',
9938
- isFiltersShowed: '<',
9939
- changeStateCallback: '&',
9940
- toggleMethod: '&',
9941
- resetFilters: '&?',
9942
- applyFilters: '&?',
9943
- getBadgeValue: '&?',
9946
+ scrolled: '<',
9944
9947
  watchId: '@?'
9945
9948
  },
9946
- templateUrl: 'igz_controls/components/info-page/info-page-filters/info-page-filters.tpl.html',
9949
+ templateUrl: 'igz_controls/components/info-page/info-page-content/info-page-content.tpl.html',
9947
9950
  transclude: true,
9948
- controller: IgzInfoPageFiltersController
9951
+ controller: IgzInfoPageContentController
9949
9952
  });
9950
9953
 
9951
- function IgzInfoPageFiltersController($rootScope, $scope, $animate, $element, EventHelperService) {
9954
+ function IgzInfoPageContentController($scope, $timeout, $window, $element) {
9952
9955
  var ctrl = this;
9953
9956
 
9954
- var appliedFiltersCount = 0;
9957
+ ctrl.isFiltersShowed = false;
9958
+ ctrl.isInfoPaneShowed = false;
9955
9959
 
9956
- ctrl.isUpperPaneShowed = false;
9957
- ctrl.scrollbarConfig = {
9958
- callbacks: {
9959
- whileScrolling: whileScrolling
9960
- }
9960
+ // Config for horizontal scrollbar on containers view
9961
+ ctrl.scrollConfigHorizontal = {
9962
+ axis: 'x',
9963
+ scrollInertia: 0
9961
9964
  };
9962
9965
 
9963
9966
  ctrl.$onInit = onInit;
9964
- ctrl.$onChanges = onChanges;
9965
-
9966
- ctrl.onApplyFilters = onApplyFilters;
9967
- ctrl.onResetFilters = onResetFilters;
9968
- ctrl.isShowFooterButtons = isShowFooterButtons;
9967
+ ctrl.$postLink = postLink;
9969
9968
 
9970
9969
  //
9971
9970
  // Hook methods
@@ -9977,46 +9976,177 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
9977
9976
  function onInit() {
9978
9977
  var watchId = angular.isDefined(ctrl.watchId) ? '-' + ctrl.watchId : '';
9979
9978
 
9980
- ctrl.getBadgeValue = ctrl.getBadgeValue || getBadgeValue;
9981
-
9982
- $scope.$on('info-page-filters_change-badge', onChangeBadge);
9983
9979
  $scope.$on('info-page-upper-pane_toggle-start' + watchId, onUpperPaneToggleStart);
9984
- $scope.$on('info-page-pane_toggle-start' + watchId, hideIfInfoPaneOpened);
9980
+ $scope.$on('info-page-filters_toggle-start' + watchId, onFiltersPaneToggleStart);
9981
+ $scope.$on('info-page-pane_toggle-start' + watchId, onInfoPaneToggleStart);
9982
+ $scope.$on('info-page-pane_toggled', dispatchResize);
9985
9983
  }
9986
9984
 
9987
9985
  /**
9988
- * Bindings changes watcher method
9986
+ * Post linking method
9989
9987
  */
9990
- function onChanges(changes) {
9991
- if (angular.isDefined(changes.isFiltersShowed)) {
9992
- reportStateBetweenPanes(changes.isFiltersShowed.currentValue);
9993
- }
9988
+ function postLink() {
9989
+ $timeout(function () {
9990
+ manageHorizontalScroll();
9991
+
9992
+ $scope.$on('info-page-filters_toggled', manageHorizontalScroll);
9993
+
9994
+ $scope.$on('info-page-pane_toggled', manageHorizontalScroll);
9995
+
9996
+ $scope.$on('igzWatchWindowResize::resize', manageHorizontalScroll);
9997
+ });
9994
9998
  }
9995
9999
 
9996
10000
  //
9997
- // Public methods
10001
+ // Private methods
9998
10002
  //
9999
10003
 
10000
10004
  /**
10001
- * Handles mouse click on 'Apply' button
10002
- * @param {Object} event
10005
+ * Manages x-scrollbar behavior
10006
+ * Needed to get rid of accidental wrong content width calculations made by 'ng-scrollbars' library
10007
+ * We just control x-scrollbar with lib's native enable/disable methods
10003
10008
  */
10004
- function onApplyFilters(event) {
10005
- if (angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) {
10006
- $rootScope.$broadcast('info-page-filters_on-apply');
10007
- if (angular.isFunction(ctrl.applyFilters)) {
10008
- ctrl.applyFilters();
10009
- }
10009
+ function manageHorizontalScroll() {
10010
+ var $scrollXContainer = $element.find('.igz-scrollable-container.horizontal').first();
10011
+ var contentWrapperWidth = $element.find('.igz-info-page-content-wrapper').first().width();
10012
+ var contentMinWidth = parseInt($element.find('.igz-info-page-content').css('min-width'));
10013
+
10014
+ if ($scrollXContainer.length && contentWrapperWidth < (contentMinWidth || 946)) {
10015
+ $scrollXContainer.mCustomScrollbar('update');
10016
+ } else if ($scrollXContainer.length) {
10017
+ $scrollXContainer.mCustomScrollbar('disable', true);
10018
+ $element.find('.mCSB_container').first().width('100%');
10010
10019
  }
10011
10020
  }
10012
10021
 
10013
10022
  /**
10014
- * Handles mouse click on 'Reset' button
10015
- * @param {Object} event
10023
+ * Upper pane toggle start $broadcast listener
10024
+ * @param {Object} e - broadcast event
10025
+ * @param {boolean} isShown - represents upper pane state
10016
10026
  */
10017
- function onResetFilters(event) {
10018
- if (angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) {
10019
- $rootScope.$broadcast('info-page-filters_on-reset');
10027
+ function onUpperPaneToggleStart(e, isShown) {
10028
+ ctrl.isUpperPaneShowed = isShown;
10029
+ }
10030
+
10031
+ /**
10032
+ * Filters pane toggle start $broadcast listener
10033
+ * @param {Object} e - broadcast event
10034
+ * @param {boolean} isShown - represents filters pane state
10035
+ */
10036
+ function onFiltersPaneToggleStart(e, isShown) {
10037
+ ctrl.isFiltersShowed = isShown;
10038
+ }
10039
+
10040
+ /**
10041
+ * Info pane toggle start $broadcast listener
10042
+ * @param {Object} e - broadcast event
10043
+ * @param {boolean} isShown - represents info pane state
10044
+ */
10045
+ function onInfoPaneToggleStart(e, isShown) {
10046
+ ctrl.isInfoPaneShowed = isShown;
10047
+ }
10048
+
10049
+ /**
10050
+ * Updates Ui-Layout library's containers size
10051
+ */
10052
+ function dispatchResize() {
10053
+ $timeout(function () {
10054
+ $window.dispatchEvent(new Event('resize'));
10055
+ }, 0);
10056
+ }
10057
+ }
10058
+ })();
10059
+ 'use strict';
10060
+
10061
+ (function () {
10062
+ 'use strict';
10063
+
10064
+ IgzInfoPageFiltersController.$inject = ['$rootScope', '$scope', '$animate', '$element', 'EventHelperService'];
10065
+ angular.module('iguazio.dashboard-controls').component('igzInfoPageFilters', {
10066
+ bindings: {
10067
+ isDisabled: '<?',
10068
+ isFiltersShowed: '<',
10069
+ changeStateCallback: '&',
10070
+ toggleMethod: '&',
10071
+ resetFilters: '&?',
10072
+ applyFilters: '&?',
10073
+ getBadgeValue: '&?',
10074
+ watchId: '@?'
10075
+ },
10076
+ templateUrl: 'igz_controls/components/info-page/info-page-filters/info-page-filters.tpl.html',
10077
+ transclude: true,
10078
+ controller: IgzInfoPageFiltersController
10079
+ });
10080
+
10081
+ function IgzInfoPageFiltersController($rootScope, $scope, $animate, $element, EventHelperService) {
10082
+ var ctrl = this;
10083
+
10084
+ var appliedFiltersCount = 0;
10085
+
10086
+ ctrl.isUpperPaneShowed = false;
10087
+ ctrl.scrollbarConfig = {
10088
+ callbacks: {
10089
+ whileScrolling: whileScrolling
10090
+ }
10091
+ };
10092
+
10093
+ ctrl.$onInit = onInit;
10094
+ ctrl.$onChanges = onChanges;
10095
+
10096
+ ctrl.onApplyFilters = onApplyFilters;
10097
+ ctrl.onResetFilters = onResetFilters;
10098
+ ctrl.isShowFooterButtons = isShowFooterButtons;
10099
+
10100
+ //
10101
+ // Hook methods
10102
+ //
10103
+
10104
+ /**
10105
+ * Init method
10106
+ */
10107
+ function onInit() {
10108
+ var watchId = angular.isDefined(ctrl.watchId) ? '-' + ctrl.watchId : '';
10109
+
10110
+ ctrl.getBadgeValue = ctrl.getBadgeValue || getBadgeValue;
10111
+
10112
+ $scope.$on('info-page-filters_change-badge', onChangeBadge);
10113
+ $scope.$on('info-page-upper-pane_toggle-start' + watchId, onUpperPaneToggleStart);
10114
+ $scope.$on('info-page-pane_toggle-start' + watchId, hideIfInfoPaneOpened);
10115
+ }
10116
+
10117
+ /**
10118
+ * Bindings changes watcher method
10119
+ */
10120
+ function onChanges(changes) {
10121
+ if (angular.isDefined(changes.isFiltersShowed)) {
10122
+ reportStateBetweenPanes(changes.isFiltersShowed.currentValue);
10123
+ }
10124
+ }
10125
+
10126
+ //
10127
+ // Public methods
10128
+ //
10129
+
10130
+ /**
10131
+ * Handles mouse click on 'Apply' button
10132
+ * @param {Object} event
10133
+ */
10134
+ function onApplyFilters(event) {
10135
+ if (angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) {
10136
+ $rootScope.$broadcast('info-page-filters_on-apply');
10137
+ if (angular.isFunction(ctrl.applyFilters)) {
10138
+ ctrl.applyFilters();
10139
+ }
10140
+ }
10141
+ }
10142
+
10143
+ /**
10144
+ * Handles mouse click on 'Reset' button
10145
+ * @param {Object} event
10146
+ */
10147
+ function onResetFilters(event) {
10148
+ if (angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) {
10149
+ $rootScope.$broadcast('info-page-filters_on-reset');
10020
10150
  if (angular.isFunction(ctrl.resetFilters)) {
10021
10151
  ctrl.resetFilters();
10022
10152
  }
@@ -10117,127 +10247,6 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
10117
10247
  })();
10118
10248
  'use strict';
10119
10249
 
10120
- (function () {
10121
- 'use strict';
10122
-
10123
- IgzInfoPageContentController.$inject = ['$scope', '$timeout', '$window', '$element'];
10124
- angular.module('iguazio.dashboard-controls').component('igzInfoPageContent', {
10125
- bindings: {
10126
- scrolled: '<',
10127
- watchId: '@?'
10128
- },
10129
- templateUrl: 'igz_controls/components/info-page/info-page-content/info-page-content.tpl.html',
10130
- transclude: true,
10131
- controller: IgzInfoPageContentController
10132
- });
10133
-
10134
- function IgzInfoPageContentController($scope, $timeout, $window, $element) {
10135
- var ctrl = this;
10136
-
10137
- ctrl.isFiltersShowed = false;
10138
- ctrl.isInfoPaneShowed = false;
10139
-
10140
- // Config for horizontal scrollbar on containers view
10141
- ctrl.scrollConfigHorizontal = {
10142
- axis: 'x',
10143
- scrollInertia: 0
10144
- };
10145
-
10146
- ctrl.$onInit = onInit;
10147
- ctrl.$postLink = postLink;
10148
-
10149
- //
10150
- // Hook methods
10151
- //
10152
-
10153
- /**
10154
- * Init method
10155
- */
10156
- function onInit() {
10157
- var watchId = angular.isDefined(ctrl.watchId) ? '-' + ctrl.watchId : '';
10158
-
10159
- $scope.$on('info-page-upper-pane_toggle-start' + watchId, onUpperPaneToggleStart);
10160
- $scope.$on('info-page-filters_toggle-start' + watchId, onFiltersPaneToggleStart);
10161
- $scope.$on('info-page-pane_toggle-start' + watchId, onInfoPaneToggleStart);
10162
- $scope.$on('info-page-pane_toggled', dispatchResize);
10163
- }
10164
-
10165
- /**
10166
- * Post linking method
10167
- */
10168
- function postLink() {
10169
- $timeout(function () {
10170
- manageHorizontalScroll();
10171
-
10172
- $scope.$on('info-page-filters_toggled', manageHorizontalScroll);
10173
-
10174
- $scope.$on('info-page-pane_toggled', manageHorizontalScroll);
10175
-
10176
- $scope.$on('igzWatchWindowResize::resize', manageHorizontalScroll);
10177
- });
10178
- }
10179
-
10180
- //
10181
- // Private methods
10182
- //
10183
-
10184
- /**
10185
- * Manages x-scrollbar behavior
10186
- * Needed to get rid of accidental wrong content width calculations made by 'ng-scrollbars' library
10187
- * We just control x-scrollbar with lib's native enable/disable methods
10188
- */
10189
- function manageHorizontalScroll() {
10190
- var $scrollXContainer = $element.find('.igz-scrollable-container.horizontal').first();
10191
- var contentWrapperWidth = $element.find('.igz-info-page-content-wrapper').first().width();
10192
- var contentMinWidth = parseInt($element.find('.igz-info-page-content').css('min-width'));
10193
-
10194
- if ($scrollXContainer.length && contentWrapperWidth < (contentMinWidth || 946)) {
10195
- $scrollXContainer.mCustomScrollbar('update');
10196
- } else if ($scrollXContainer.length) {
10197
- $scrollXContainer.mCustomScrollbar('disable', true);
10198
- $element.find('.mCSB_container').first().width('100%');
10199
- }
10200
- }
10201
-
10202
- /**
10203
- * Upper pane toggle start $broadcast listener
10204
- * @param {Object} e - broadcast event
10205
- * @param {boolean} isShown - represents upper pane state
10206
- */
10207
- function onUpperPaneToggleStart(e, isShown) {
10208
- ctrl.isUpperPaneShowed = isShown;
10209
- }
10210
-
10211
- /**
10212
- * Filters pane toggle start $broadcast listener
10213
- * @param {Object} e - broadcast event
10214
- * @param {boolean} isShown - represents filters pane state
10215
- */
10216
- function onFiltersPaneToggleStart(e, isShown) {
10217
- ctrl.isFiltersShowed = isShown;
10218
- }
10219
-
10220
- /**
10221
- * Info pane toggle start $broadcast listener
10222
- * @param {Object} e - broadcast event
10223
- * @param {boolean} isShown - represents info pane state
10224
- */
10225
- function onInfoPaneToggleStart(e, isShown) {
10226
- ctrl.isInfoPaneShowed = isShown;
10227
- }
10228
-
10229
- /**
10230
- * Updates Ui-Layout library's containers size
10231
- */
10232
- function dispatchResize() {
10233
- $timeout(function () {
10234
- $window.dispatchEvent(new Event('resize'));
10235
- }, 0);
10236
- }
10237
- }
10238
- })();
10239
- 'use strict';
10240
-
10241
10250
  (function () {
10242
10251
  'use strict';
10243
10252
 
@@ -10464,171 +10473,15 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
10464
10473
  (function () {
10465
10474
  'use strict';
10466
10475
 
10467
- NclTestEventsLogsController.$inject = ['lodash'];
10468
- angular.module('iguazio.dashboard-controls').component('nclTestEventsLogs', {
10476
+ NclVersionConfigurationAnnotationsController.$inject = ['$element', '$i18next', '$rootScope', '$timeout', 'i18next', 'lodash', 'FormValidationService', 'PreventDropdownCutOffService', 'ValidationService'];
10477
+ angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationAnnotations', {
10469
10478
  bindings: {
10470
- logs: '<'
10479
+ version: '<',
10480
+ onChangeCallback: '<',
10481
+ isFunctionDeploying: '&'
10471
10482
  },
10472
- templateUrl: 'nuclio/functions/version/version-code/function-event-pane/test-events-logs/test-events-logs.tpl.html',
10473
- controller: NclTestEventsLogsController
10474
- });
10475
-
10476
- function NclTestEventsLogsController(lodash) {
10477
- var ctrl = this;
10478
- var REQUIRED_PARAMETERS = ['level', 'name', 'time', 'err', 'message', 'ui'];
10479
-
10480
- ctrl.$onInit = onInit;
10481
-
10482
- ctrl.collapseRow = collapseRow;
10483
- ctrl.expandAllRows = expandAllRows;
10484
- ctrl.getLevelIconClass = getLevelIconClass;
10485
- ctrl.getParameters = getParameters;
10486
- ctrl.hasAdditionalParameters = hasAdditionalParameters;
10487
-
10488
- //
10489
- // Hook method
10490
- //
10491
-
10492
- /**
10493
- * Initialization method
10494
- */
10495
- function onInit() {
10496
- lodash.forEach(ctrl.logs, function (log) {
10497
- lodash.set(log, 'ui.collapsed', true);
10498
- });
10499
- }
10500
-
10501
- //
10502
- // Public methods
10503
- //
10504
-
10505
- /**
10506
- * Collapse/expand row depending on `collapse` value
10507
- * @param {Object} log
10508
- * @param {boolean} collapse
10509
- */
10510
- function collapseRow(log, collapse) {
10511
- lodash.set(log, 'ui.collapsed', collapse);
10512
- }
10513
-
10514
- /**
10515
- * Collapse/expand all rows depending on `expand` value
10516
- * @param {boolean} expand
10517
- */
10518
- function expandAllRows(expand) {
10519
- lodash.forEach(ctrl.logs, function (log) {
10520
- lodash.set(log, 'ui.collapsed', !expand);
10521
- });
10522
- }
10523
-
10524
- /**
10525
- * Gets css class depending on log.level
10526
- * @param {Object} log
10527
- * @returns {string}
10528
- */
10529
- function getLevelIconClass(log) {
10530
- return log.level === 'debug' ? 'ncl-icon-debug' : log.level === 'info' ? 'igz-icon-info-round' : log.level === 'warn' ? 'igz-icon-warning' : log.level === 'error' ? 'igz-icon-cancel-path' : '';
10531
- }
10532
-
10533
- /**
10534
- * Gets additional parameters
10535
- * @param {Object} log
10536
- * @returns {Object}
10537
- */
10538
- function getParameters(log) {
10539
- return lodash.omit(log, REQUIRED_PARAMETERS);
10540
- }
10541
-
10542
- /**
10543
- * Checks if log has additional parameters
10544
- * @param {Object} log
10545
- * @returns {boolean}
10546
- */
10547
- function hasAdditionalParameters(log) {
10548
- return !lodash.isEmpty(getParameters(log));
10549
- }
10550
- }
10551
- })();
10552
- 'use strict';
10553
-
10554
- (function () {
10555
- 'use strict';
10556
-
10557
- NclTestEventsNavigationTabsController.$inject = ['$i18next', 'i18next'];
10558
- angular.module('iguazio.dashboard-controls').component('nclTestEventsNavigationTabs', {
10559
- bindings: {
10560
- activeTab: '<',
10561
- tabItems: '<',
10562
- selectedLogLevel: '<?',
10563
- onChangeActiveTab: '&',
10564
- onChangeLogLevel: '&?'
10565
- },
10566
- templateUrl: 'nuclio/functions/version/version-code/function-event-pane/test-events-navigation-tabs/test-events-navigation-tabs.tpl.html',
10567
- controller: NclTestEventsNavigationTabsController
10568
- });
10569
-
10570
- function NclTestEventsNavigationTabsController($i18next, i18next) {
10571
- var ctrl = this;
10572
- var lng = i18next.language;
10573
-
10574
- ctrl.logLevelValues = [{
10575
- id: 'error',
10576
- name: $i18next.t('common:ERROR', { lng: lng }),
10577
- visible: true
10578
- }, {
10579
- id: 'warn',
10580
- name: $i18next.t('common:WARNING', { lng: lng }),
10581
- visible: true
10582
- }, {
10583
- id: 'info',
10584
- name: $i18next.t('common:INFO', { lng: lng }),
10585
- visible: true
10586
- }, {
10587
- id: 'debug',
10588
- name: $i18next.t('common:DEBUG', { lng: lng }),
10589
- visible: true
10590
- }];
10591
-
10592
- ctrl.changeActiveTab = changeActiveTab;
10593
- ctrl.isActiveTab = isActiveTab;
10594
-
10595
- //
10596
- // Public methods
10597
- //
10598
-
10599
- /**
10600
- * Changes active nav tab
10601
- * @param {Object} item - current status
10602
- */
10603
- function changeActiveTab(item) {
10604
- ctrl.activeTab = item;
10605
-
10606
- ctrl.onChangeActiveTab({ activeTab: item });
10607
- }
10608
-
10609
- /**
10610
- * Checks if it is an active tab
10611
- * @param {Object} item - current tab
10612
- */
10613
- function isActiveTab(item) {
10614
- return ctrl.activeTab.id === item.id;
10615
- }
10616
- }
10617
- })();
10618
- 'use strict';
10619
-
10620
- (function () {
10621
- 'use strict';
10622
-
10623
- NclVersionConfigurationAnnotationsController.$inject = ['$element', '$i18next', '$rootScope', '$timeout', 'i18next', 'lodash', 'FormValidationService', 'PreventDropdownCutOffService', 'ValidationService'];
10624
- angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationAnnotations', {
10625
- bindings: {
10626
- version: '<',
10627
- onChangeCallback: '<',
10628
- isFunctionDeploying: '&'
10629
- },
10630
- templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-annotations/version-configuration-annotations.tpl.html',
10631
- controller: NclVersionConfigurationAnnotationsController
10483
+ templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-annotations/version-configuration-annotations.tpl.html',
10484
+ controller: NclVersionConfigurationAnnotationsController
10632
10485
  });
10633
10486
 
10634
10487
  function NclVersionConfigurationAnnotationsController($element, $i18next, $rootScope, $timeout, i18next, lodash, FormValidationService, PreventDropdownCutOffService, ValidationService) {
@@ -11239,55 +11092,91 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
11239
11092
  (function () {
11240
11093
  'use strict';
11241
11094
 
11242
- NclVersionConfigurationEnvironmentVariablesController.$inject = ['$element', '$i18next', '$rootScope', '$timeout', 'i18next', 'lodash', 'FormValidationService', 'PreventDropdownCutOffService', 'ValidationService'];
11243
- angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationEnvironmentVariables', {
11095
+ NclVersionConfigurationLoggingController.$inject = ['lodash'];
11096
+ angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationLogging', {
11097
+ bindings: {
11098
+ version: '<',
11099
+ onChangeCallback: '<'
11100
+ },
11101
+ templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-logging/version-configuration-logging.tpl.html',
11102
+ controller: NclVersionConfigurationLoggingController
11103
+ });
11104
+
11105
+ function NclVersionConfigurationLoggingController(lodash) {
11106
+ var ctrl = this;
11107
+
11108
+ ctrl.inputValueCallback = inputValueCallback;
11109
+
11110
+ //
11111
+ // Public methods
11112
+ //
11113
+
11114
+ /**
11115
+ * Update data callback
11116
+ * @param {string} newData
11117
+ * @param {string} field
11118
+ */
11119
+ function inputValueCallback(newData, field) {
11120
+ lodash.set(ctrl.version, field, newData);
11121
+
11122
+ ctrl.onChangeCallback();
11123
+ }
11124
+ }
11125
+ })();
11126
+ 'use strict';
11127
+
11128
+ (function () {
11129
+ 'use strict';
11130
+
11131
+ NclVersionConfigurationLabelsController.$inject = ['$element', '$i18next', '$rootScope', '$timeout', 'i18next', 'lodash', 'FormValidationService', 'FunctionsService', 'PreventDropdownCutOffService', 'ValidationService', 'VersionHelperService'];
11132
+ angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationLabels', {
11244
11133
  bindings: {
11245
11134
  version: '<',
11246
11135
  onChangeCallback: '<',
11247
11136
  isFunctionDeploying: '&'
11248
11137
  },
11249
- templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-environment-variables/version-configuration-environment-variables.tpl.html',
11250
- controller: NclVersionConfigurationEnvironmentVariablesController
11138
+ templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-labels/version-configuration-labels.tpl.html',
11139
+ controller: NclVersionConfigurationLabelsController
11251
11140
  });
11252
11141
 
11253
- function NclVersionConfigurationEnvironmentVariablesController($element, $i18next, $rootScope, $timeout, i18next, lodash, FormValidationService, PreventDropdownCutOffService, ValidationService) {
11142
+ function NclVersionConfigurationLabelsController($element, $i18next, $rootScope, $timeout, i18next, lodash, FormValidationService, FunctionsService, PreventDropdownCutOffService, ValidationService, VersionHelperService) {
11254
11143
  var ctrl = this;
11255
11144
  var lng = i18next.language;
11256
11145
 
11257
- ctrl.environmentVariablesForm = null;
11258
11146
  ctrl.igzScrollConfig = {
11259
11147
  maxElementsCount: 10,
11260
11148
  childrenSelector: '.table-body'
11261
11149
  };
11262
- ctrl.validationRules = {
11263
- key: ValidationService.getValidationRules('k8s.envVarName', [{
11264
- name: 'uniqueness',
11265
- label: $i18next.t('functions:UNIQUENESS', { lng: lng }),
11266
- pattern: validateUniqueness.bind(null, 'name')
11267
- }]),
11268
- secretKey: ValidationService.getValidationRules('k8s.configMapKey'),
11269
- secret: ValidationService.getValidationRules('k8s.secretName'),
11270
- configmapKey: ValidationService.getValidationRules('k8s.configMapKey', [{
11271
- name: 'uniqueness',
11272
- label: $i18next.t('functions:UNIQUENESS', { lng: lng }),
11273
- pattern: validateUniqueness.bind(null, 'valueFrom.configMapKeyRef.key')
11274
- }])
11275
- };
11276
- ctrl.variables = [];
11150
+ ctrl.isKubePlatform = false;
11151
+ ctrl.labelsForm = null;
11277
11152
  ctrl.scrollConfig = {
11278
11153
  axis: 'y',
11279
11154
  advanced: {
11280
11155
  updateOnContentResize: true
11281
11156
  }
11282
11157
  };
11158
+ ctrl.tooltip = '<a class="link" target="_blank" ' + 'href="https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/">' + $i18next.t('functions:TOOLTIP.LABELS.HEAD', { lng: lng }) + '</a> ' + $i18next.t('functions:TOOLTIP.LABELS.REST', { lng: lng });
11159
+
11160
+ ctrl.keyTooltip = $i18next.t('functions:TOOLTIP.PREFIXED_NAME', {
11161
+ lng: lng,
11162
+ name: $i18next.t('common:LABEL', { lng: lng })
11163
+ });
11164
+ ctrl.validationRules = {
11165
+ key: ValidationService.getValidationRules('function.label.key', [{
11166
+ name: 'uniqueness',
11167
+ label: $i18next.t('functions:UNIQUENESS', { lng: lng }),
11168
+ pattern: validateUniqueness
11169
+ }]),
11170
+ value: ValidationService.getValidationRules('k8s.qualifiedName')
11171
+ };
11283
11172
 
11284
11173
  ctrl.$postLink = postLink;
11285
11174
  ctrl.$onChanges = onChanges;
11286
11175
 
11287
- ctrl.addNewVariable = addNewVariable;
11176
+ ctrl.addNewLabel = addNewLabel;
11288
11177
  ctrl.handleAction = handleAction;
11178
+ ctrl.isLabelsDisabled = isLabelsDisabled;
11289
11179
  ctrl.onChangeData = onChangeData;
11290
- ctrl.onChangeType = onChangeType;
11291
11180
 
11292
11181
  //
11293
11182
  // Hook methods
@@ -11297,6 +11186,7 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
11297
11186
  * Post linking method
11298
11187
  */
11299
11188
  function postLink() {
11189
+ ctrl.isKubePlatform = FunctionsService.isKubePlatform();
11300
11190
 
11301
11191
  // Bind DOM-related preventDropdownCutOff method to component's controller
11302
11192
  PreventDropdownCutOffService.preventDropdownCutOff($element, '.three-dot-menu');
@@ -11307,21 +11197,226 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
11307
11197
  * @param {Object} changes
11308
11198
  */
11309
11199
  function onChanges(changes) {
11310
- if (angular.isDefined(changes.version)) {
11311
- ctrl.variables = lodash.chain(ctrl.version).get('spec.env', []).map(function (variable) {
11312
- variable.ui = {
11313
- editModeActive: false,
11314
- isFormValid: false,
11315
- name: 'variable'
11316
- };
11317
-
11318
- return variable;
11319
- }).value();
11320
-
11321
- ctrl.isOnlyValueTypeInputs = !lodash.some(ctrl.variables, 'valueFrom');
11322
-
11323
- $timeout(function () {
11324
- if (ctrl.environmentVariablesForm.$invalid) {
11200
+ if (lodash.has(changes, 'version')) {
11201
+ ctrl.labels = lodash.chain(ctrl.version).get('metadata.labels', {}).omitBy(function (value, key) {
11202
+ return lodash.startsWith(key, 'nuclio.io/');
11203
+ }).map(function (value, key) {
11204
+ return {
11205
+ name: key,
11206
+ value: value,
11207
+ ui: {
11208
+ editModeActive: false,
11209
+ isFormValid: false,
11210
+ name: 'label'
11211
+ }
11212
+ };
11213
+ }).value();
11214
+ ctrl.labels = lodash.compact(ctrl.labels);
11215
+ ctrl.addNewLabelTooltip = VersionHelperService.isVersionDeployed(ctrl.version) ? $i18next.t('functions:TOOLTIP.ADD_LABELS', { lng: lng }) : '';
11216
+
11217
+ $timeout(function () {
11218
+ if (ctrl.labelsForm.$invalid) {
11219
+ ctrl.labelsForm.$setSubmitted();
11220
+ $rootScope.$broadcast('change-state-deploy-button', { component: 'label', isDisabled: true });
11221
+ }
11222
+ });
11223
+ }
11224
+ }
11225
+
11226
+ //
11227
+ // Public methods
11228
+ //
11229
+
11230
+ /**
11231
+ * Adds new label
11232
+ */
11233
+ function addNewLabel(event) {
11234
+ // prevent adding labels for deployed functions
11235
+ if (ctrl.isLabelsDisabled() || ctrl.isFunctionDeploying()) {
11236
+ return;
11237
+ }
11238
+
11239
+ $timeout(function () {
11240
+ if (ctrl.labels.length < 1 || lodash.last(ctrl.labels).ui.isFormValid) {
11241
+ ctrl.labels.push({
11242
+ name: '',
11243
+ value: '',
11244
+ ui: {
11245
+ editModeActive: true,
11246
+ isFormValid: false,
11247
+ name: 'label'
11248
+ }
11249
+ });
11250
+
11251
+ $rootScope.$broadcast('change-state-deploy-button', { component: 'label', isDisabled: true });
11252
+ event.stopPropagation();
11253
+ }
11254
+ }, 50);
11255
+ }
11256
+
11257
+ /**
11258
+ * Handler on specific action type
11259
+ * @param {string} actionType
11260
+ * @param {number} index - index of label in array
11261
+ */
11262
+ function handleAction(actionType, index) {
11263
+ if (actionType === 'delete') {
11264
+ ctrl.labels.splice(index, 1);
11265
+
11266
+ $timeout(function () {
11267
+ updateLabels();
11268
+ });
11269
+ }
11270
+ }
11271
+
11272
+ /**
11273
+ * Checks if labels should be disabled
11274
+ * @returns {boolean}
11275
+ */
11276
+ function isLabelsDisabled() {
11277
+ return ctrl.isKubePlatform && VersionHelperService.isVersionDeployed(ctrl.version);
11278
+ }
11279
+
11280
+ /**
11281
+ * Changes labels data
11282
+ * @param {Object} label
11283
+ * @param {number} index
11284
+ */
11285
+ function onChangeData(label, index) {
11286
+ ctrl.labels[index] = lodash.cloneDeep(label);
11287
+
11288
+ updateLabels();
11289
+ }
11290
+
11291
+ //
11292
+ // Private methods
11293
+ //
11294
+
11295
+ /**
11296
+ * Updates function`s labels
11297
+ */
11298
+ function updateLabels() {
11299
+ var isFormValid = true;
11300
+ var newLabels = {};
11301
+
11302
+ lodash.forEach(ctrl.labels, function (label) {
11303
+ if (!label.ui.isFormValid) {
11304
+ isFormValid = false;
11305
+ }
11306
+
11307
+ newLabels[label.name] = label.value;
11308
+ });
11309
+
11310
+ // since uniqueness validation rule of some fields is dependent on the entire label list, then whenever
11311
+ // the list is modified - the rest of the labels need to be re-validated
11312
+ FormValidationService.validateAllFields(ctrl.labelsForm);
11313
+
11314
+ $rootScope.$broadcast('change-state-deploy-button', {
11315
+ component: 'label',
11316
+ isDisabled: !isFormValid
11317
+ });
11318
+
11319
+ lodash.set(ctrl.version, 'metadata.labels', newLabels);
11320
+ ctrl.onChangeCallback();
11321
+ }
11322
+
11323
+ /**
11324
+ * Determines `uniqueness` validation for `Key` field
11325
+ * @param {string} value - value to validate
11326
+ */
11327
+ function validateUniqueness(value) {
11328
+ return lodash.filter(ctrl.labels, ['name', value]).length === 1;
11329
+ }
11330
+ }
11331
+ })();
11332
+ 'use strict';
11333
+
11334
+ (function () {
11335
+ 'use strict';
11336
+
11337
+ NclVersionConfigurationEnvironmentVariablesController.$inject = ['$element', '$i18next', '$rootScope', '$timeout', 'i18next', 'lodash', 'FormValidationService', 'PreventDropdownCutOffService', 'ValidationService'];
11338
+ angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationEnvironmentVariables', {
11339
+ bindings: {
11340
+ version: '<',
11341
+ onChangeCallback: '<',
11342
+ isFunctionDeploying: '&'
11343
+ },
11344
+ templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-environment-variables/version-configuration-environment-variables.tpl.html',
11345
+ controller: NclVersionConfigurationEnvironmentVariablesController
11346
+ });
11347
+
11348
+ function NclVersionConfigurationEnvironmentVariablesController($element, $i18next, $rootScope, $timeout, i18next, lodash, FormValidationService, PreventDropdownCutOffService, ValidationService) {
11349
+ var ctrl = this;
11350
+ var lng = i18next.language;
11351
+
11352
+ ctrl.environmentVariablesForm = null;
11353
+ ctrl.igzScrollConfig = {
11354
+ maxElementsCount: 10,
11355
+ childrenSelector: '.table-body'
11356
+ };
11357
+ ctrl.validationRules = {
11358
+ key: ValidationService.getValidationRules('k8s.envVarName', [{
11359
+ name: 'uniqueness',
11360
+ label: $i18next.t('functions:UNIQUENESS', { lng: lng }),
11361
+ pattern: validateUniqueness.bind(null, 'name')
11362
+ }]),
11363
+ secretKey: ValidationService.getValidationRules('k8s.configMapKey'),
11364
+ secret: ValidationService.getValidationRules('k8s.secretName'),
11365
+ configmapKey: ValidationService.getValidationRules('k8s.configMapKey', [{
11366
+ name: 'uniqueness',
11367
+ label: $i18next.t('functions:UNIQUENESS', { lng: lng }),
11368
+ pattern: validateUniqueness.bind(null, 'valueFrom.configMapKeyRef.key')
11369
+ }])
11370
+ };
11371
+ ctrl.variables = [];
11372
+ ctrl.scrollConfig = {
11373
+ axis: 'y',
11374
+ advanced: {
11375
+ updateOnContentResize: true
11376
+ }
11377
+ };
11378
+
11379
+ ctrl.$postLink = postLink;
11380
+ ctrl.$onChanges = onChanges;
11381
+
11382
+ ctrl.addNewVariable = addNewVariable;
11383
+ ctrl.handleAction = handleAction;
11384
+ ctrl.onChangeData = onChangeData;
11385
+ ctrl.onChangeType = onChangeType;
11386
+
11387
+ //
11388
+ // Hook methods
11389
+ //
11390
+
11391
+ /**
11392
+ * Post linking method
11393
+ */
11394
+ function postLink() {
11395
+
11396
+ // Bind DOM-related preventDropdownCutOff method to component's controller
11397
+ PreventDropdownCutOffService.preventDropdownCutOff($element, '.three-dot-menu');
11398
+ }
11399
+
11400
+ /**
11401
+ * On changes hook method.
11402
+ * @param {Object} changes
11403
+ */
11404
+ function onChanges(changes) {
11405
+ if (angular.isDefined(changes.version)) {
11406
+ ctrl.variables = lodash.chain(ctrl.version).get('spec.env', []).map(function (variable) {
11407
+ variable.ui = {
11408
+ editModeActive: false,
11409
+ isFormValid: false,
11410
+ name: 'variable'
11411
+ };
11412
+
11413
+ return variable;
11414
+ }).value();
11415
+
11416
+ ctrl.isOnlyValueTypeInputs = !lodash.some(ctrl.variables, 'valueFrom');
11417
+
11418
+ $timeout(function () {
11419
+ if (ctrl.environmentVariablesForm.$invalid) {
11325
11420
  ctrl.environmentVariablesForm.$setSubmitted();
11326
11421
  $rootScope.$broadcast('change-state-deploy-button', { component: 'variable', isDisabled: true });
11327
11422
  }
@@ -11454,42 +11549,6 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
11454
11549
  })();
11455
11550
  'use strict';
11456
11551
 
11457
- (function () {
11458
- 'use strict';
11459
-
11460
- NclVersionConfigurationLoggingController.$inject = ['lodash'];
11461
- angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationLogging', {
11462
- bindings: {
11463
- version: '<',
11464
- onChangeCallback: '<'
11465
- },
11466
- templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-logging/version-configuration-logging.tpl.html',
11467
- controller: NclVersionConfigurationLoggingController
11468
- });
11469
-
11470
- function NclVersionConfigurationLoggingController(lodash) {
11471
- var ctrl = this;
11472
-
11473
- ctrl.inputValueCallback = inputValueCallback;
11474
-
11475
- //
11476
- // Public methods
11477
- //
11478
-
11479
- /**
11480
- * Update data callback
11481
- * @param {string} newData
11482
- * @param {string} field
11483
- */
11484
- function inputValueCallback(newData, field) {
11485
- lodash.set(ctrl.version, field, newData);
11486
-
11487
- ctrl.onChangeCallback();
11488
- }
11489
- }
11490
- })();
11491
- 'use strict';
11492
-
11493
11552
  /* eslint max-statements: ["error", 80] */
11494
11553
  (function () {
11495
11554
  'use strict';
@@ -12323,68 +12382,67 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
12323
12382
  (function () {
12324
12383
  'use strict';
12325
12384
 
12326
- NclVersionConfigurationLabelsController.$inject = ['$element', '$i18next', '$rootScope', '$timeout', 'i18next', 'lodash', 'FormValidationService', 'FunctionsService', 'PreventDropdownCutOffService', 'ValidationService', 'VersionHelperService'];
12327
- angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationLabels', {
12385
+ NclVersionConfigurationVolumesController.$inject = ['$rootScope', '$scope', '$timeout', '$i18next', 'i18next', 'lodash', 'DialogsService', 'FormValidationService', 'FunctionsService', 'ValidationService'];
12386
+ angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationVolumes', {
12328
12387
  bindings: {
12329
12388
  version: '<',
12330
- onChangeCallback: '<',
12389
+ onChangeCallback: '&',
12331
12390
  isFunctionDeploying: '&'
12332
12391
  },
12333
- templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-labels/version-configuration-labels.tpl.html',
12334
- controller: NclVersionConfigurationLabelsController
12392
+ templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-volumes/version-configuration-volumes.tpl.html',
12393
+ controller: NclVersionConfigurationVolumesController
12335
12394
  });
12336
12395
 
12337
- function NclVersionConfigurationLabelsController($element, $i18next, $rootScope, $timeout, i18next, lodash, FormValidationService, FunctionsService, PreventDropdownCutOffService, ValidationService, VersionHelperService) {
12396
+ function NclVersionConfigurationVolumesController($rootScope, $scope, $timeout, $i18next, i18next, lodash, DialogsService, FormValidationService, FunctionsService, ValidationService) {
12338
12397
  var ctrl = this;
12339
12398
  var lng = i18next.language;
12340
12399
 
12400
+ ctrl.isCreateModeActive = false;
12401
+ ctrl.volumes = [];
12402
+ ctrl.volumesForm = null;
12341
12403
  ctrl.igzScrollConfig = {
12342
- maxElementsCount: 10,
12343
- childrenSelector: '.table-body'
12404
+ maxElementsCount: 5,
12405
+ childrenSelector: '.ncl-collapsing-row'
12344
12406
  };
12345
- ctrl.isKubePlatform = false;
12346
- ctrl.labelsForm = null;
12347
12407
  ctrl.scrollConfig = {
12348
12408
  axis: 'y',
12349
12409
  advanced: {
12350
12410
  updateOnContentResize: true
12351
12411
  }
12352
12412
  };
12353
- ctrl.tooltip = '<a class="link" target="_blank" ' + 'href="https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/">' + $i18next.t('functions:TOOLTIP.LABELS.HEAD', { lng: lng }) + '</a> ' + $i18next.t('functions:TOOLTIP.LABELS.REST', { lng: lng });
12354
-
12355
- ctrl.keyTooltip = $i18next.t('functions:TOOLTIP.PREFIXED_NAME', {
12356
- lng: lng,
12357
- name: $i18next.t('common:LABEL', { lng: lng })
12358
- });
12359
12413
  ctrl.validationRules = {
12360
- key: ValidationService.getValidationRules('function.label.key', [{
12361
- name: 'uniqueness',
12414
+ itemName: [],
12415
+ itemPath: ValidationService.getValidationRules('function.itemPath', [{
12362
12416
  label: $i18next.t('functions:UNIQUENESS', { lng: lng }),
12363
- pattern: validateUniqueness
12417
+ pattern: validateUniqueness.bind(null, 'volumeMount.mountPath')
12364
12418
  }]),
12365
- value: ValidationService.getValidationRules('k8s.qualifiedName')
12419
+ containerName: ValidationService.getValidationRules('container.name')
12420
+ };
12421
+ ctrl.maxLengths = {
12422
+ containerSubPath: ValidationService.getMaxLength('function.containerSubPath')
12366
12423
  };
12367
12424
 
12368
- ctrl.$postLink = postLink;
12425
+ ctrl.$onInit = onInit;
12369
12426
  ctrl.$onChanges = onChanges;
12427
+ ctrl.$onDestroy = onDestroy;
12370
12428
 
12371
- ctrl.addNewLabel = addNewLabel;
12429
+ ctrl.createVolume = createVolume;
12430
+ ctrl.editVolumeCallback = editVolumeCallback;
12372
12431
  ctrl.handleAction = handleAction;
12373
- ctrl.isLabelsDisabled = isLabelsDisabled;
12374
- ctrl.onChangeData = onChangeData;
12375
12432
 
12376
12433
  //
12377
12434
  // Hook methods
12378
12435
  //
12379
12436
 
12380
12437
  /**
12381
- * Post linking method
12438
+ * Initialization method
12382
12439
  */
12383
- function postLink() {
12384
- ctrl.isKubePlatform = FunctionsService.isKubePlatform();
12440
+ function onInit() {
12441
+ ctrl.validationRules.itemName = ValidationService.getValidationRules('k8s.dns1123Label');
12385
12442
 
12386
- // Bind DOM-related preventDropdownCutOff method to component's controller
12387
- PreventDropdownCutOffService.preventDropdownCutOff($element, '.three-dot-menu');
12443
+ ctrl.classList = FunctionsService.getClassesList('volume');
12444
+
12445
+ $scope.$on('edit-item-has-been-changed', updateVolumesChangesState);
12388
12446
  }
12389
12447
 
12390
12448
  /**
@@ -12392,135 +12450,195 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
12392
12450
  * @param {Object} changes
12393
12451
  */
12394
12452
  function onChanges(changes) {
12395
- if (lodash.has(changes, 'version')) {
12396
- ctrl.labels = lodash.chain(ctrl.version).get('metadata.labels', {}).omitBy(function (value, key) {
12397
- return lodash.startsWith(key, 'nuclio.io/');
12398
- }).map(function (value, key) {
12399
- return {
12400
- name: key,
12401
- value: value,
12402
- ui: {
12403
- editModeActive: false,
12404
- isFormValid: false,
12405
- name: 'label'
12406
- }
12453
+ if (angular.isDefined(changes.version)) {
12454
+
12455
+ // get volumes list
12456
+ ctrl.volumes = lodash.map(lodash.get(ctrl.version, 'spec.volumes', []), function (value) {
12457
+ var volumeItem = angular.copy(value);
12458
+
12459
+ volumeItem.ui = {
12460
+ changed: false,
12461
+ editModeActive: false,
12462
+ isFormValid: true,
12463
+ name: 'volume'
12407
12464
  };
12408
- }).value();
12409
- ctrl.labels = lodash.compact(ctrl.labels);
12410
- ctrl.addNewLabelTooltip = VersionHelperService.isVersionDeployed(ctrl.version) ? $i18next.t('functions:TOOLTIP.ADD_LABELS', { lng: lng }) : '';
12411
12465
 
12412
- $timeout(function () {
12413
- if (ctrl.labelsForm.$invalid) {
12414
- ctrl.labelsForm.$setSubmitted();
12415
- $rootScope.$broadcast('change-state-deploy-button', { component: 'label', isDisabled: true });
12416
- }
12466
+ return volumeItem;
12417
12467
  });
12418
12468
  }
12419
12469
  }
12420
12470
 
12471
+ /**
12472
+ * Destructor method
12473
+ */
12474
+ function onDestroy() {
12475
+ $rootScope.$broadcast('change-state-deploy-button', { component: 'volume', isDisabled: false });
12476
+ }
12477
+
12421
12478
  //
12422
12479
  // Public methods
12423
12480
  //
12424
12481
 
12425
12482
  /**
12426
- * Adds new label
12483
+ * Toggle create volume mode
12484
+ * @param {Event} event
12427
12485
  */
12428
- function addNewLabel(event) {
12429
- // prevent adding labels for deployed functions
12430
- if (ctrl.isLabelsDisabled() || ctrl.isFunctionDeploying()) {
12486
+ function createVolume(event) {
12487
+ if (ctrl.isFunctionDeploying()) {
12431
12488
  return;
12432
12489
  }
12433
12490
 
12434
12491
  $timeout(function () {
12435
- if (ctrl.labels.length < 1 || lodash.last(ctrl.labels).ui.isFormValid) {
12436
- ctrl.labels.push({
12437
- name: '',
12438
- value: '',
12492
+ if (!isVolumeInEditMode()) {
12493
+ ctrl.volumes.push({
12494
+ volumeMount: {
12495
+ name: ''
12496
+ },
12497
+ volume: {
12498
+ name: ''
12499
+ },
12439
12500
  ui: {
12501
+ changed: true,
12440
12502
  editModeActive: true,
12441
12503
  isFormValid: false,
12442
- name: 'label'
12504
+ name: 'volume'
12443
12505
  }
12444
12506
  });
12445
12507
 
12446
- $rootScope.$broadcast('change-state-deploy-button', { component: 'label', isDisabled: true });
12508
+ ctrl.volumesForm.$setPristine();
12509
+
12447
12510
  event.stopPropagation();
12511
+ $rootScope.$broadcast('change-state-deploy-button', { component: 'volume', isDisabled: true });
12448
12512
  }
12449
- }, 50);
12513
+ }, 100);
12450
12514
  }
12451
12515
 
12452
12516
  /**
12453
- * Handler on specific action type
12454
- * @param {string} actionType
12455
- * @param {number} index - index of label in array
12517
+ * Edit item callback function
12518
+ * @param {Object} item - selected item
12456
12519
  */
12457
- function handleAction(actionType, index) {
12458
- if (actionType === 'delete') {
12459
- ctrl.labels.splice(index, 1);
12520
+ function editVolumeCallback(item) {
12521
+ ctrl.handleAction('update', item);
12522
+ }
12460
12523
 
12461
- $timeout(function () {
12462
- updateLabels();
12463
- });
12524
+ /**
12525
+ * According to given action name calls proper action handler
12526
+ * @param {string} actionType - e.g. `'delete'`, `'edit'`, `'update'`
12527
+ * @param {Object} selectedItem - an object of selected volume
12528
+ * @param {number} [index] - index of variable in array
12529
+ */
12530
+ function handleAction(actionType, selectedItem, index) {
12531
+ if (actionType === 'delete') {
12532
+ deleteHandler(index);
12533
+ } else if (actionType === 'edit') {
12534
+ editHandler(selectedItem);
12535
+ } else if (actionType === 'update') {
12536
+ updateHandler(selectedItem);
12537
+ } else {
12538
+ DialogsService.alert($i18next.t('functions:ERROR_MSG.FUNCTIONALITY_IS_NOT_IMPLEMENTED', { lng: lng }));
12464
12539
  }
12540
+
12541
+ $rootScope.$broadcast('change-state-deploy-button', { component: 'volume', isDisabled: false });
12542
+ lodash.forEach(ctrl.volumes, function (volume) {
12543
+ if (!volume.ui.isFormValid) {
12544
+ $rootScope.$broadcast('change-state-deploy-button', { component: volume.ui.name, isDisabled: true });
12545
+ }
12546
+ });
12547
+
12548
+ ctrl.onChangeCallback();
12465
12549
  }
12466
12550
 
12551
+ //
12552
+ // Private methods
12553
+ //
12554
+
12467
12555
  /**
12468
- * Checks if labels should be disabled
12469
- * @returns {boolean}
12556
+ * Checks validation of volumes
12470
12557
  */
12471
- function isLabelsDisabled() {
12472
- return ctrl.isKubePlatform && VersionHelperService.isVersionDeployed(ctrl.version);
12558
+ function checkValidation() {
12559
+ if (lodash.some(ctrl.volumes, ['ui.isFormValid', false])) {
12560
+ FormValidationService.validateAllFields(ctrl.volumesForm);
12561
+ }
12473
12562
  }
12474
12563
 
12475
12564
  /**
12476
- * Changes labels data
12477
- * @param {Object} label
12478
- * @param {number} index
12565
+ * Deletes selected item
12566
+ * @param {number} index - index of variable in array
12479
12567
  */
12480
- function onChangeData(label, index) {
12481
- ctrl.labels[index] = lodash.cloneDeep(label);
12568
+ function deleteHandler(index) {
12569
+ ctrl.volumes.splice(index, 1);
12482
12570
 
12483
- updateLabels();
12571
+ // since uniqueness validation rule of some fields is dependent on the entire volume list, whenever a volume
12572
+ // is removed, the rest of the volumes needs to be re-validated
12573
+ checkValidation();
12574
+
12575
+ var workingCopy = lodash.map(ctrl.volumes, function (volume) {
12576
+ return lodash.omit(volume, 'ui');
12577
+ });
12578
+
12579
+ lodash.set(ctrl.version, 'spec.volumes', workingCopy);
12484
12580
  }
12485
12581
 
12486
- //
12487
- // Private methods
12488
- //
12582
+ /**
12583
+ * Toggles item to edit mode
12584
+ * @param {Object} selectedItem - an object of selected volume
12585
+ */
12586
+ function editHandler(selectedItem) {
12587
+ selectedItem.ui.editModeActive = true;
12588
+ }
12489
12589
 
12490
12590
  /**
12491
- * Updates function`s labels
12591
+ * Checks if volume is in edit mode
12592
+ * @returns {boolean}
12492
12593
  */
12493
- function updateLabels() {
12494
- var isFormValid = true;
12495
- var newLabels = {};
12594
+ function isVolumeInEditMode() {
12595
+ return lodash.some(ctrl.volumes, ['ui.editModeActive', true]);
12596
+ }
12496
12597
 
12497
- lodash.forEach(ctrl.labels, function (label) {
12498
- if (!label.ui.isFormValid) {
12499
- isFormValid = false;
12500
- }
12598
+ /**
12599
+ * Updates data in selected item
12600
+ * @param {Object} selectedItem - an object of selected volume
12601
+ */
12602
+ function updateHandler(selectedItem) {
12603
+ var workingCopy = angular.copy(ctrl.volumes);
12604
+ var currentVolume = lodash.find(ctrl.volumes, ['volumeMount.mountPath', selectedItem.volumeMount.mountPath]);
12605
+ var indexOfEditableElement = lodash.findIndex(ctrl.volumes, ['volumeMount.mountPath', selectedItem.volumeMount.mountPath]);
12501
12606
 
12502
- newLabels[label.name] = label.value;
12503
- });
12607
+ if (angular.isDefined(currentVolume)) {
12608
+ workingCopy[indexOfEditableElement] = {
12609
+ volumeMount: selectedItem.volumeMount,
12610
+ volume: selectedItem.volume
12611
+ };
12504
12612
 
12505
- // since uniqueness validation rule of some fields is dependent on the entire label list, then whenever
12506
- // the list is modified - the rest of the labels need to be re-validated
12507
- FormValidationService.validateAllFields(ctrl.labelsForm);
12613
+ // since uniqueness validation rule of some fields is dependent on the entire volume list, whenever a
12614
+ // volume is updated, the rest of the volumes needs to be re-validated
12615
+ checkValidation();
12508
12616
 
12509
- $rootScope.$broadcast('change-state-deploy-button', {
12510
- component: 'label',
12511
- isDisabled: !isFormValid
12512
- });
12617
+ lodash.forEach(workingCopy, function (volume) {
12618
+ delete volume.ui;
12619
+ });
12513
12620
 
12514
- lodash.set(ctrl.version, 'metadata.labels', newLabels);
12515
- ctrl.onChangeCallback();
12621
+ lodash.set(ctrl.version, 'spec.volumes', workingCopy);
12622
+ }
12516
12623
  }
12517
12624
 
12518
12625
  /**
12519
- * Determines `uniqueness` validation for `Key` field
12520
- * @param {string} value - value to validate
12626
+ * Checks volumes and updates `ctrl.version.ui.isVolumesChanged` if there is some changed and unsaved trigger.
12521
12627
  */
12522
- function validateUniqueness(value) {
12523
- return lodash.filter(ctrl.labels, ['name', value]).length === 1;
12628
+ function updateVolumesChangesState() {
12629
+ var isSomeVolumeChanged = lodash.some(ctrl.volumes, ['ui.changed', true]);
12630
+ var isSomeVolumeInEditMode = lodash.some(ctrl.volumes, ['ui.editModeActive', true]);
12631
+
12632
+ lodash.set(ctrl.version, 'ui.isVolumesChanged', isSomeVolumeChanged && isSomeVolumeInEditMode);
12633
+ }
12634
+
12635
+ /**
12636
+ * Determines `uniqueness` validation for `Name` and `Mount Path` fields
12637
+ * @param {string} path
12638
+ * @param {string} value
12639
+ */
12640
+ function validateUniqueness(path, value) {
12641
+ return lodash.filter(ctrl.volumes, [path, value]).length === 1;
12524
12642
  }
12525
12643
  }
12526
12644
  })();
@@ -12717,97 +12835,38 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
12717
12835
  (function () {
12718
12836
  'use strict';
12719
12837
 
12720
- NclVersionConfigurationVolumesController.$inject = ['$rootScope', '$scope', '$timeout', '$i18next', 'i18next', 'lodash', 'DialogsService', 'FormValidationService', 'FunctionsService', 'ValidationService'];
12721
- angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationVolumes', {
12838
+ NclTestEventsLogsController.$inject = ['lodash'];
12839
+ angular.module('iguazio.dashboard-controls').component('nclTestEventsLogs', {
12722
12840
  bindings: {
12723
- version: '<',
12724
- onChangeCallback: '&',
12725
- isFunctionDeploying: '&'
12841
+ logs: '<'
12726
12842
  },
12727
- templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-volumes/version-configuration-volumes.tpl.html',
12728
- controller: NclVersionConfigurationVolumesController
12843
+ templateUrl: 'nuclio/functions/version/version-code/function-event-pane/test-events-logs/test-events-logs.tpl.html',
12844
+ controller: NclTestEventsLogsController
12729
12845
  });
12730
12846
 
12731
- function NclVersionConfigurationVolumesController($rootScope, $scope, $timeout, $i18next, i18next, lodash, DialogsService, FormValidationService, FunctionsService, ValidationService) {
12847
+ function NclTestEventsLogsController(lodash) {
12732
12848
  var ctrl = this;
12733
- var lng = i18next.language;
12734
-
12735
- ctrl.isCreateModeActive = false;
12736
- ctrl.volumes = [];
12737
- ctrl.volumesForm = null;
12738
- ctrl.igzScrollConfig = {
12739
- maxElementsCount: 5,
12740
- childrenSelector: '.ncl-collapsing-row'
12741
- };
12742
- ctrl.scrollConfig = {
12743
- axis: 'y',
12744
- advanced: {
12745
- updateOnContentResize: true
12746
- }
12747
- };
12748
- ctrl.validationRules = {
12749
- itemName: [],
12750
- itemPath: ValidationService.getValidationRules('function.itemPath', [{
12751
- label: $i18next.t('functions:UNIQUENESS', { lng: lng }),
12752
- pattern: validateUniqueness.bind(null, 'volumeMount.mountPath')
12753
- }]),
12754
- containerName: ValidationService.getValidationRules('container.name')
12755
- };
12756
- ctrl.maxLengths = {
12757
- containerSubPath: ValidationService.getMaxLength('function.containerSubPath')
12758
- };
12849
+ var REQUIRED_PARAMETERS = ['level', 'name', 'time', 'err', 'message', 'ui'];
12759
12850
 
12760
12851
  ctrl.$onInit = onInit;
12761
- ctrl.$onChanges = onChanges;
12762
- ctrl.$onDestroy = onDestroy;
12763
12852
 
12764
- ctrl.createVolume = createVolume;
12765
- ctrl.editVolumeCallback = editVolumeCallback;
12766
- ctrl.handleAction = handleAction;
12853
+ ctrl.collapseRow = collapseRow;
12854
+ ctrl.expandAllRows = expandAllRows;
12855
+ ctrl.getLevelIconClass = getLevelIconClass;
12856
+ ctrl.getParameters = getParameters;
12857
+ ctrl.hasAdditionalParameters = hasAdditionalParameters;
12767
12858
 
12768
12859
  //
12769
- // Hook methods
12860
+ // Hook method
12770
12861
  //
12771
12862
 
12772
12863
  /**
12773
12864
  * Initialization method
12774
12865
  */
12775
12866
  function onInit() {
12776
- ctrl.validationRules.itemName = ValidationService.getValidationRules('k8s.dns1123Label');
12777
-
12778
- ctrl.classList = FunctionsService.getClassesList('volume');
12779
-
12780
- $scope.$on('edit-item-has-been-changed', updateVolumesChangesState);
12781
- }
12782
-
12783
- /**
12784
- * On changes hook method.
12785
- * @param {Object} changes
12786
- */
12787
- function onChanges(changes) {
12788
- if (angular.isDefined(changes.version)) {
12789
-
12790
- // get volumes list
12791
- ctrl.volumes = lodash.map(lodash.get(ctrl.version, 'spec.volumes', []), function (value) {
12792
- var volumeItem = angular.copy(value);
12793
-
12794
- volumeItem.ui = {
12795
- changed: false,
12796
- editModeActive: false,
12797
- isFormValid: true,
12798
- name: 'volume'
12799
- };
12800
-
12801
- return volumeItem;
12802
- });
12803
- }
12804
- }
12805
-
12806
- /**
12807
- * Destructor method
12808
- */
12809
- function onDestroy() {
12810
- $rootScope.$broadcast('change-state-deploy-button', { component: 'volume', isDisabled: false });
12867
+ lodash.forEach(ctrl.logs, function (log) {
12868
+ lodash.set(log, 'ui.collapsed', true);
12869
+ });
12811
12870
  }
12812
12871
 
12813
12872
  //
@@ -12815,165 +12874,115 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
12815
12874
  //
12816
12875
 
12817
12876
  /**
12818
- * Toggle create volume mode
12819
- * @param {Event} event
12820
- */
12821
- function createVolume(event) {
12822
- if (ctrl.isFunctionDeploying()) {
12823
- return;
12824
- }
12825
-
12826
- $timeout(function () {
12827
- if (!isVolumeInEditMode()) {
12828
- ctrl.volumes.push({
12829
- volumeMount: {
12830
- name: ''
12831
- },
12832
- volume: {
12833
- name: ''
12834
- },
12835
- ui: {
12836
- changed: true,
12837
- editModeActive: true,
12838
- isFormValid: false,
12839
- name: 'volume'
12840
- }
12841
- });
12842
-
12843
- ctrl.volumesForm.$setPristine();
12844
-
12845
- event.stopPropagation();
12846
- $rootScope.$broadcast('change-state-deploy-button', { component: 'volume', isDisabled: true });
12847
- }
12848
- }, 100);
12849
- }
12850
-
12851
- /**
12852
- * Edit item callback function
12853
- * @param {Object} item - selected item
12877
+ * Collapse/expand row depending on `collapse` value
12878
+ * @param {Object} log
12879
+ * @param {boolean} collapse
12854
12880
  */
12855
- function editVolumeCallback(item) {
12856
- ctrl.handleAction('update', item);
12881
+ function collapseRow(log, collapse) {
12882
+ lodash.set(log, 'ui.collapsed', collapse);
12857
12883
  }
12858
12884
 
12859
12885
  /**
12860
- * According to given action name calls proper action handler
12861
- * @param {string} actionType - e.g. `'delete'`, `'edit'`, `'update'`
12862
- * @param {Object} selectedItem - an object of selected volume
12863
- * @param {number} [index] - index of variable in array
12886
+ * Collapse/expand all rows depending on `expand` value
12887
+ * @param {boolean} expand
12864
12888
  */
12865
- function handleAction(actionType, selectedItem, index) {
12866
- if (actionType === 'delete') {
12867
- deleteHandler(index);
12868
- } else if (actionType === 'edit') {
12869
- editHandler(selectedItem);
12870
- } else if (actionType === 'update') {
12871
- updateHandler(selectedItem);
12872
- } else {
12873
- DialogsService.alert($i18next.t('functions:ERROR_MSG.FUNCTIONALITY_IS_NOT_IMPLEMENTED', { lng: lng }));
12874
- }
12875
-
12876
- $rootScope.$broadcast('change-state-deploy-button', { component: 'volume', isDisabled: false });
12877
- lodash.forEach(ctrl.volumes, function (volume) {
12878
- if (!volume.ui.isFormValid) {
12879
- $rootScope.$broadcast('change-state-deploy-button', { component: volume.ui.name, isDisabled: true });
12880
- }
12889
+ function expandAllRows(expand) {
12890
+ lodash.forEach(ctrl.logs, function (log) {
12891
+ lodash.set(log, 'ui.collapsed', !expand);
12881
12892
  });
12882
-
12883
- ctrl.onChangeCallback();
12884
- }
12885
-
12886
- //
12887
- // Private methods
12888
- //
12889
-
12890
- /**
12891
- * Checks validation of volumes
12892
- */
12893
- function checkValidation() {
12894
- if (lodash.some(ctrl.volumes, ['ui.isFormValid', false])) {
12895
- FormValidationService.validateAllFields(ctrl.volumesForm);
12896
- }
12897
12893
  }
12898
12894
 
12899
12895
  /**
12900
- * Deletes selected item
12901
- * @param {number} index - index of variable in array
12902
- */
12903
- function deleteHandler(index) {
12904
- ctrl.volumes.splice(index, 1);
12905
-
12906
- // since uniqueness validation rule of some fields is dependent on the entire volume list, whenever a volume
12907
- // is removed, the rest of the volumes needs to be re-validated
12908
- checkValidation();
12909
-
12910
- var workingCopy = lodash.map(ctrl.volumes, function (volume) {
12911
- return lodash.omit(volume, 'ui');
12912
- });
12913
-
12914
- lodash.set(ctrl.version, 'spec.volumes', workingCopy);
12896
+ * Gets css class depending on log.level
12897
+ * @param {Object} log
12898
+ * @returns {string}
12899
+ */
12900
+ function getLevelIconClass(log) {
12901
+ return log.level === 'debug' ? 'ncl-icon-debug' : log.level === 'info' ? 'igz-icon-info-round' : log.level === 'warn' ? 'igz-icon-warning' : log.level === 'error' ? 'igz-icon-cancel-path' : '';
12915
12902
  }
12916
12903
 
12917
12904
  /**
12918
- * Toggles item to edit mode
12919
- * @param {Object} selectedItem - an object of selected volume
12905
+ * Gets additional parameters
12906
+ * @param {Object} log
12907
+ * @returns {Object}
12920
12908
  */
12921
- function editHandler(selectedItem) {
12922
- selectedItem.ui.editModeActive = true;
12909
+ function getParameters(log) {
12910
+ return lodash.omit(log, REQUIRED_PARAMETERS);
12923
12911
  }
12924
12912
 
12925
12913
  /**
12926
- * Checks if volume is in edit mode
12914
+ * Checks if log has additional parameters
12915
+ * @param {Object} log
12927
12916
  * @returns {boolean}
12928
12917
  */
12929
- function isVolumeInEditMode() {
12930
- return lodash.some(ctrl.volumes, ['ui.editModeActive', true]);
12918
+ function hasAdditionalParameters(log) {
12919
+ return !lodash.isEmpty(getParameters(log));
12931
12920
  }
12921
+ }
12922
+ })();
12923
+ 'use strict';
12932
12924
 
12933
- /**
12934
- * Updates data in selected item
12935
- * @param {Object} selectedItem - an object of selected volume
12936
- */
12937
- function updateHandler(selectedItem) {
12938
- var workingCopy = angular.copy(ctrl.volumes);
12939
- var currentVolume = lodash.find(ctrl.volumes, ['volumeMount.mountPath', selectedItem.volumeMount.mountPath]);
12940
- var indexOfEditableElement = lodash.findIndex(ctrl.volumes, ['volumeMount.mountPath', selectedItem.volumeMount.mountPath]);
12925
+ (function () {
12926
+ 'use strict';
12941
12927
 
12942
- if (angular.isDefined(currentVolume)) {
12943
- workingCopy[indexOfEditableElement] = {
12944
- volumeMount: selectedItem.volumeMount,
12945
- volume: selectedItem.volume
12946
- };
12928
+ NclTestEventsNavigationTabsController.$inject = ['$i18next', 'i18next'];
12929
+ angular.module('iguazio.dashboard-controls').component('nclTestEventsNavigationTabs', {
12930
+ bindings: {
12931
+ activeTab: '<',
12932
+ tabItems: '<',
12933
+ selectedLogLevel: '<?',
12934
+ onChangeActiveTab: '&',
12935
+ onChangeLogLevel: '&?'
12936
+ },
12937
+ templateUrl: 'nuclio/functions/version/version-code/function-event-pane/test-events-navigation-tabs/test-events-navigation-tabs.tpl.html',
12938
+ controller: NclTestEventsNavigationTabsController
12939
+ });
12947
12940
 
12948
- // since uniqueness validation rule of some fields is dependent on the entire volume list, whenever a
12949
- // volume is updated, the rest of the volumes needs to be re-validated
12950
- checkValidation();
12941
+ function NclTestEventsNavigationTabsController($i18next, i18next) {
12942
+ var ctrl = this;
12943
+ var lng = i18next.language;
12951
12944
 
12952
- lodash.forEach(workingCopy, function (volume) {
12953
- delete volume.ui;
12954
- });
12945
+ ctrl.logLevelValues = [{
12946
+ id: 'error',
12947
+ name: $i18next.t('common:ERROR', { lng: lng }),
12948
+ visible: true
12949
+ }, {
12950
+ id: 'warn',
12951
+ name: $i18next.t('common:WARNING', { lng: lng }),
12952
+ visible: true
12953
+ }, {
12954
+ id: 'info',
12955
+ name: $i18next.t('common:INFO', { lng: lng }),
12956
+ visible: true
12957
+ }, {
12958
+ id: 'debug',
12959
+ name: $i18next.t('common:DEBUG', { lng: lng }),
12960
+ visible: true
12961
+ }];
12955
12962
 
12956
- lodash.set(ctrl.version, 'spec.volumes', workingCopy);
12957
- }
12958
- }
12963
+ ctrl.changeActiveTab = changeActiveTab;
12964
+ ctrl.isActiveTab = isActiveTab;
12965
+
12966
+ //
12967
+ // Public methods
12968
+ //
12959
12969
 
12960
12970
  /**
12961
- * Checks volumes and updates `ctrl.version.ui.isVolumesChanged` if there is some changed and unsaved trigger.
12971
+ * Changes active nav tab
12972
+ * @param {Object} item - current status
12962
12973
  */
12963
- function updateVolumesChangesState() {
12964
- var isSomeVolumeChanged = lodash.some(ctrl.volumes, ['ui.changed', true]);
12965
- var isSomeVolumeInEditMode = lodash.some(ctrl.volumes, ['ui.editModeActive', true]);
12974
+ function changeActiveTab(item) {
12975
+ ctrl.activeTab = item;
12966
12976
 
12967
- lodash.set(ctrl.version, 'ui.isVolumesChanged', isSomeVolumeChanged && isSomeVolumeInEditMode);
12977
+ ctrl.onChangeActiveTab({ activeTab: item });
12968
12978
  }
12969
12979
 
12970
12980
  /**
12971
- * Determines `uniqueness` validation for `Name` and `Mount Path` fields
12972
- * @param {string} path
12973
- * @param {string} value
12981
+ * Checks if it is an active tab
12982
+ * @param {Object} item - current tab
12974
12983
  */
12975
- function validateUniqueness(path, value) {
12976
- return lodash.filter(ctrl.volumes, [path, value]).length === 1;
12984
+ function isActiveTab(item) {
12985
+ return ctrl.activeTab.id === item.id;
12977
12986
  }
12978
12987
  }
12979
12988
  })();
@@ -14298,10 +14307,11 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
14298
14307
  var now = Date.now();
14299
14308
  var from = new Date(now - MILLIS_IN_AN_HOUR).toISOString();
14300
14309
  var until = new Date(now).toISOString();
14301
- var projectName = '{project="' + ctrl.project.metadata.name + '"}';
14302
- var gpuUtilizationMetric = ' * on (pod) group_left(function_name)(nuclio_function_pod_labels{project="' + ctrl.project.metadata.name + '"})';
14310
+ var functionEventsProjectName = '{project="' + ctrl.project.metadata.name + '"}';
14311
+ var projectName = '{project_name="' + ctrl.project.metadata.name + '"}';
14312
+ var gpuUtilizationMetric = ' * on (pod) group_left(function_name)(nuclio_function_pod_labels{project_name="' + ctrl.project.metadata.name + '"})';
14303
14313
  var args = {
14304
- metric: ctrl.functionEventsMetric + projectName,
14314
+ metric: ctrl.functionEventsMetric + functionEventsProjectName,
14305
14315
  from: from,
14306
14316
  until: until,
14307
14317
  interval: '5m'
@@ -17377,7 +17387,8 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
17377
17387
  runtimeAttributes: {
17378
17388
  repositories: []
17379
17389
  }
17380
- }
17390
+ },
17391
+ resources: $stateParams.isNewFunction ? lodash.get(ConfigService, 'nuclio.defaultFunctionPodResources', {}) : {}
17381
17392
  },
17382
17393
  ui: {
17383
17394
  versionCode: '',
@@ -17830,134 +17841,6 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
17830
17841
  })();
17831
17842
  'use strict';
17832
17843
 
17833
- (function () {
17834
- 'use strict';
17835
-
17836
- require.config({ paths: { 'vs': '/assets/monaco-editor/min/vs' } });
17837
-
17838
- angular.module('iguazio.dashboard-controls').directive('igzMonacoEditor', ['lodash', function (lodash) {
17839
- function link(scope, element, attrs) {
17840
- var editorElement = element[0];
17841
- require(['vs/editor/editor.main'], function () {
17842
- var editorContext = {
17843
- scope: scope,
17844
- element: element,
17845
- attrs: attrs,
17846
- onThemeChanged: function onThemeChanged(newValue, oldValue) {
17847
- window.monaco.editor.setTheme(lodash.defaultTo(newValue, 'vs-dark'));
17848
- },
17849
- onFileLanguageChanged: function onFileLanguageChanged(newValue) {
17850
- // update the language model (and set `insertSpaces`)
17851
- var newModel = window.monaco.editor.createModel('', newValue.language);
17852
- newModel.updateOptions({ insertSpaces: lodash.defaultTo(newValue.useSpaces, true) });
17853
- this.editor.setModel(newModel);
17854
-
17855
- // update the code
17856
- this.editor.setValue(scope.codeFile.code);
17857
- },
17858
- onCodeFileChanged: function onCodeFileChanged() {
17859
- if (!lodash.isEqual(this.editor.getValue(), scope.codeFile.code)) {
17860
- this.editor.setValue(scope.codeFile.code);
17861
- }
17862
- },
17863
- onReadOnlyCodeFileChanged: function onReadOnlyCodeFileChanged() {
17864
- this.editor.setValue(scope.codeFile.code);
17865
- },
17866
- onWrapStateChanged: function onWrapStateChanged(newState) {
17867
- this.editor.updateOptions({ wordWrap: newState ? 'on' : 'off' });
17868
- },
17869
- onFontSizeChanged: function onFontSizeChanged(newFontSize) {
17870
- this.editor.updateOptions({ fontSize: newFontSize });
17871
- },
17872
- onReadOnlyChanged: function onReadOnlyChanged(newReadOnly) {
17873
- this.editor.updateOptions({ readOnly: newReadOnly });
17874
- }
17875
- };
17876
-
17877
- editorContext.editor = window.monaco.editor.defineTheme('custom-vs', {
17878
- base: 'vs',
17879
- inherit: true,
17880
- rules: [{ token: '', foreground: '474056', background: 'ffffff' }, { token: 'number', foreground: '474056' }, { token: 'delimiter', foreground: '474056' }, { token: 'string', foreground: '21d4ac' }],
17881
- colors: {
17882
- 'editor.foreground': '#474056',
17883
- 'editor.background': '#ffffff',
17884
- 'editorLineNumber.foreground': '#474056',
17885
- 'editorGutter.background': '#e1e0e5',
17886
- 'textBlockQuote.border': '#ffffff',
17887
- 'editorCursor.foreground': '#8B0000',
17888
- 'editor.lineHighlightBackground': '#e1e0e5',
17889
- 'editorMarkerNavigation.background': '#000000',
17890
- 'editor.selectionBackground': '#239bca',
17891
- 'editorIndentGuide.background': '#e1e0e5'
17892
- }
17893
- });
17894
-
17895
- editorContext.editor = window.monaco.editor.create(editorElement, {
17896
- value: scope.codeFile.code,
17897
- language: scope.fileLanguage.language,
17898
- theme: 'vs',
17899
- automaticLayout: true,
17900
- dragAndDrop: true,
17901
- lineNumbersMinChars: scope.miniMonaco ? 2 : 5,
17902
- lineNumbers: scope.miniMonaco && !scope.showLineNumbers ? 'off' : 'on', // hide line number if it's a mini-monaco
17903
- minimap: {
17904
- enabled: !scope.miniMonaco // hide mini-map if it's a mini-monaco
17905
- },
17906
- readOnly: scope.readOnly,
17907
- wordWrap: scope.wordWrap ? 'on' : 'off'
17908
- });
17909
-
17910
- // change content callback
17911
- editorContext.editor.onDidChangeModelContent(function () {
17912
-
17913
- // call callback from upper scope (monaco component) with new changed code
17914
- scope.onCodeChange(editorContext.editor.getValue());
17915
- });
17916
-
17917
- // set up watch for codeFile changes to reflect updates
17918
- scope.$watch('fileLanguage', editorContext.onFileLanguageChanged.bind(editorContext));
17919
- scope.$watch('editorTheme', editorContext.onThemeChanged.bind(editorContext));
17920
- scope.$watch('wordWrap', editorContext.onWrapStateChanged.bind(editorContext));
17921
- scope.$watch('codeFile', editorContext.onCodeFileChanged.bind(editorContext));
17922
- scope.$watch('fontSize', editorContext.onFontSizeChanged.bind(editorContext));
17923
- scope.$watch('readOnly', editorContext.onReadOnlyChanged.bind(editorContext));
17924
-
17925
- scope.$on('function-import-source-code', editorContext.onReadOnlyCodeFileChanged.bind(editorContext));
17926
- });
17927
- }
17928
-
17929
- return {
17930
- link: link,
17931
- scope: {
17932
- codeFile: '=codeFile',
17933
- editorTheme: '=editorTheme',
17934
- fontSize: '=fontSize',
17935
- fileLanguage: '=fileLanguage',
17936
- miniMonaco: '=miniMonaco',
17937
- showLineNumbers: '=showLineNumbers',
17938
- onCodeChange: '=onCodeChange',
17939
- readOnly: '=readOnly',
17940
- wordWrap: '=wordWrap'
17941
- }
17942
- };
17943
- }]);
17944
-
17945
- require(['vs/editor/editor.main'], function () {
17946
- window.monaco.languages.registerCompletionItemProvider('python', {
17947
- provideCompletionItems: function provideCompletionItems() {
17948
- return [{
17949
- label: 'def',
17950
- kind: window.monaco.languages.CompletionItemKind.Keyword,
17951
- insertText: {
17952
- value: 'def ${1:name}():\r\t$0'
17953
- }
17954
- }];
17955
- }
17956
- });
17957
- });
17958
- })();
17959
- 'use strict';
17960
-
17961
17844
  (function () {
17962
17845
  'use strict';
17963
17846
 
@@ -19607,18 +19490,53 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
19607
19490
  var queueNameIsFilled = !lodash.isEmpty(ctrl.editItemForm.item_queueName.$viewValue);
19608
19491
  var topicsIsFilled = !lodash.isEmpty(ctrl.editItemForm.item_topics.$viewValue);
19609
19492
 
19610
- // Queue Name and Topics cannot be both empty at the same time
19611
- // at least one of them should be filled
19612
- // if one of them is filled, the other is allowed to be empty
19613
- queueName.allowEmpty = topicsIsFilled;
19614
- topics.allowEmpty = queueNameIsFilled;
19493
+ // Queue Name and Topics cannot be both empty at the same time
19494
+ // at least one of them should be filled
19495
+ // if one of them is filled, the other is allowed to be empty
19496
+ queueName.allowEmpty = topicsIsFilled;
19497
+ topics.allowEmpty = queueNameIsFilled;
19498
+
19499
+ // update validity: if empty is not allowed and value is currently empty - mark invalid, otherwise valid
19500
+ ctrl.editItemForm.item_queueName.$setValidity('text', queueName.allowEmpty || queueNameIsFilled);
19501
+ ctrl.editItemForm.item_topics.$setValidity('text', topics.allowEmpty || topicsIsFilled);
19502
+ } else if (ctrl.item.kind === 'kafka-cluster') {
19503
+ ctrl.item.attributes.sasl.enable = !lodash.isEmpty(ctrl.item.attributes.sasl.user) && !lodash.isEmpty(ctrl.item.attributes.sasl.password);
19504
+ }
19505
+ }
19506
+ }
19507
+ })();
19508
+ 'use strict';
19509
+
19510
+ (function () {
19511
+ 'use strict';
19512
+
19513
+ NclFunctionConfigDialogController.$inject = ['ExportService', 'MaskService'];
19514
+ angular.module('iguazio.dashboard-controls').component('nclFunctionConfigDialog', {
19515
+ bindings: {
19516
+ closeDialog: '&',
19517
+ function: '<'
19518
+ },
19519
+ templateUrl: 'nuclio/common/components/function-config-dialog/function-config-dialog.tpl.html',
19520
+ controller: NclFunctionConfigDialogController
19521
+ });
19522
+
19523
+ function NclFunctionConfigDialogController(ExportService, MaskService) {
19524
+ var ctrl = this;
19615
19525
 
19616
- // update validity: if empty is not allowed and value is currently empty - mark invalid, otherwise valid
19617
- ctrl.editItemForm.item_queueName.$setValidity('text', queueName.allowEmpty || queueNameIsFilled);
19618
- ctrl.editItemForm.item_topics.$setValidity('text', topics.allowEmpty || topicsIsFilled);
19619
- } else if (ctrl.item.kind === 'kafka-cluster') {
19620
- ctrl.item.attributes.sasl.enable = !lodash.isEmpty(ctrl.item.attributes.sasl.user) && !lodash.isEmpty(ctrl.item.attributes.sasl.password);
19621
- }
19526
+ ctrl.$onInit = onInit;
19527
+
19528
+ //
19529
+ // Hook methods
19530
+ //
19531
+
19532
+ /**
19533
+ * Initialization method
19534
+ */
19535
+ function onInit() {
19536
+ var functionWithMask = MaskService.getObjectWithMask(ctrl.function);
19537
+ ctrl.title = ctrl.function.metadata.name + ' - configuration';
19538
+
19539
+ ctrl.sourceCode = ExportService.getFunctionConfig(functionWithMask);
19622
19540
  }
19623
19541
  }
19624
19542
  })();
@@ -20067,41 +19985,6 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
20067
19985
  })();
20068
19986
  'use strict';
20069
19987
 
20070
- (function () {
20071
- 'use strict';
20072
-
20073
- NclFunctionConfigDialogController.$inject = ['ExportService', 'MaskService'];
20074
- angular.module('iguazio.dashboard-controls').component('nclFunctionConfigDialog', {
20075
- bindings: {
20076
- closeDialog: '&',
20077
- function: '<'
20078
- },
20079
- templateUrl: 'nuclio/common/components/function-config-dialog/function-config-dialog.tpl.html',
20080
- controller: NclFunctionConfigDialogController
20081
- });
20082
-
20083
- function NclFunctionConfigDialogController(ExportService, MaskService) {
20084
- var ctrl = this;
20085
-
20086
- ctrl.$onInit = onInit;
20087
-
20088
- //
20089
- // Hook methods
20090
- //
20091
-
20092
- /**
20093
- * Initialization method
20094
- */
20095
- function onInit() {
20096
- var functionWithMask = MaskService.getObjectWithMask(ctrl.function);
20097
- ctrl.title = ctrl.function.metadata.name + ' - configuration';
20098
-
20099
- ctrl.sourceCode = ExportService.getFunctionConfig(functionWithMask);
20100
- }
20101
- }
20102
- })();
20103
- 'use strict';
20104
-
20105
19988
  (function () {
20106
19989
  'use strict';
20107
19990
 
@@ -20201,6 +20084,67 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
20201
20084
  })();
20202
20085
  'use strict';
20203
20086
 
20087
+ (function () {
20088
+ 'use strict';
20089
+
20090
+ NclNavigationTabsController.$inject = ['$rootScope', '$state', '$timeout', 'lodash'];
20091
+ angular.module('iguazio.dashboard-controls').component('nclNavigationTabs', {
20092
+ bindings: {
20093
+ tabItems: '<'
20094
+ },
20095
+ templateUrl: 'nuclio/common/components/navigation-tabs/navigation-tabs.tpl.html',
20096
+ controller: NclNavigationTabsController
20097
+ });
20098
+
20099
+ function NclNavigationTabsController($rootScope, $state, $timeout, lodash) {
20100
+ var ctrl = this;
20101
+ var isTestPaneToggled = true;
20102
+
20103
+ ctrl.isTestPaneClosed = false;
20104
+ ctrl.isToggleButtonVisible = isToggleButtonVisible;
20105
+ ctrl.toggleTestPane = toggleTestPane;
20106
+
20107
+ //
20108
+ // Public methods
20109
+ //
20110
+
20111
+ /**
20112
+ * Checks if 'toggle test pane' button should be visible.
20113
+ * It should, only when 'code' tab is reached.
20114
+ * @returns {boolean}
20115
+ */
20116
+ function isToggleButtonVisible() {
20117
+ var isButtonVisible = lodash.get($state.$current, 'self.url') === '/code';
20118
+
20119
+ if (!isButtonVisible) {
20120
+ ctrl.isTestPaneClosed = false;
20121
+
20122
+ $rootScope.$broadcast('navigation-tabs_toggle-test-pane', { closeTestPane: ctrl.isTestPaneClosed });
20123
+ }
20124
+
20125
+ return isButtonVisible;
20126
+ }
20127
+
20128
+ /**
20129
+ * Sends broadcast to toggle test pane.
20130
+ */
20131
+ function toggleTestPane() {
20132
+ if (isTestPaneToggled) {
20133
+ ctrl.isTestPaneClosed = !ctrl.isTestPaneClosed;
20134
+ isTestPaneToggled = false;
20135
+
20136
+ $rootScope.$broadcast('navigation-tabs_toggle-test-pane', { closeTestPane: ctrl.isTestPaneClosed });
20137
+
20138
+ // wait until toggling animation will be completed
20139
+ $timeout(function () {
20140
+ isTestPaneToggled = true;
20141
+ }, 600);
20142
+ }
20143
+ }
20144
+ }
20145
+ })();
20146
+ 'use strict';
20147
+
20204
20148
  (function () {
20205
20149
  'use strict';
20206
20150
 
@@ -20303,61 +20247,128 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
20303
20247
  (function () {
20304
20248
  'use strict';
20305
20249
 
20306
- NclNavigationTabsController.$inject = ['$rootScope', '$state', '$timeout', 'lodash'];
20307
- angular.module('iguazio.dashboard-controls').component('nclNavigationTabs', {
20308
- bindings: {
20309
- tabItems: '<'
20310
- },
20311
- templateUrl: 'nuclio/common/components/navigation-tabs/navigation-tabs.tpl.html',
20312
- controller: NclNavigationTabsController
20313
- });
20250
+ require.config({ paths: { 'vs': '/assets/monaco-editor/min/vs' } });
20314
20251
 
20315
- function NclNavigationTabsController($rootScope, $state, $timeout, lodash) {
20316
- var ctrl = this;
20317
- var isTestPaneToggled = true;
20252
+ angular.module('iguazio.dashboard-controls').directive('igzMonacoEditor', ['lodash', function (lodash) {
20253
+ function link(scope, element, attrs) {
20254
+ var editorElement = element[0];
20255
+ require(['vs/editor/editor.main'], function () {
20256
+ var editorContext = {
20257
+ scope: scope,
20258
+ element: element,
20259
+ attrs: attrs,
20260
+ onThemeChanged: function onThemeChanged(newValue, oldValue) {
20261
+ window.monaco.editor.setTheme(lodash.defaultTo(newValue, 'vs-dark'));
20262
+ },
20263
+ onFileLanguageChanged: function onFileLanguageChanged(newValue) {
20264
+ // update the language model (and set `insertSpaces`)
20265
+ var newModel = window.monaco.editor.createModel('', newValue.language);
20266
+ newModel.updateOptions({ insertSpaces: lodash.defaultTo(newValue.useSpaces, true) });
20267
+ this.editor.setModel(newModel);
20318
20268
 
20319
- ctrl.isTestPaneClosed = false;
20320
- ctrl.isToggleButtonVisible = isToggleButtonVisible;
20321
- ctrl.toggleTestPane = toggleTestPane;
20269
+ // update the code
20270
+ this.editor.setValue(scope.codeFile.code);
20271
+ },
20272
+ onCodeFileChanged: function onCodeFileChanged() {
20273
+ if (!lodash.isEqual(this.editor.getValue(), scope.codeFile.code)) {
20274
+ this.editor.setValue(scope.codeFile.code);
20275
+ }
20276
+ },
20277
+ onReadOnlyCodeFileChanged: function onReadOnlyCodeFileChanged() {
20278
+ this.editor.setValue(scope.codeFile.code);
20279
+ },
20280
+ onWrapStateChanged: function onWrapStateChanged(newState) {
20281
+ this.editor.updateOptions({ wordWrap: newState ? 'on' : 'off' });
20282
+ },
20283
+ onFontSizeChanged: function onFontSizeChanged(newFontSize) {
20284
+ this.editor.updateOptions({ fontSize: newFontSize });
20285
+ },
20286
+ onReadOnlyChanged: function onReadOnlyChanged(newReadOnly) {
20287
+ this.editor.updateOptions({ readOnly: newReadOnly });
20288
+ }
20289
+ };
20322
20290
 
20323
- //
20324
- // Public methods
20325
- //
20291
+ editorContext.editor = window.monaco.editor.defineTheme('custom-vs', {
20292
+ base: 'vs',
20293
+ inherit: true,
20294
+ rules: [{ token: '', foreground: '474056', background: 'ffffff' }, { token: 'number', foreground: '474056' }, { token: 'delimiter', foreground: '474056' }, { token: 'string', foreground: '21d4ac' }],
20295
+ colors: {
20296
+ 'editor.foreground': '#474056',
20297
+ 'editor.background': '#ffffff',
20298
+ 'editorLineNumber.foreground': '#474056',
20299
+ 'editorGutter.background': '#e1e0e5',
20300
+ 'textBlockQuote.border': '#ffffff',
20301
+ 'editorCursor.foreground': '#8B0000',
20302
+ 'editor.lineHighlightBackground': '#e1e0e5',
20303
+ 'editorMarkerNavigation.background': '#000000',
20304
+ 'editor.selectionBackground': '#239bca',
20305
+ 'editorIndentGuide.background': '#e1e0e5'
20306
+ }
20307
+ });
20326
20308
 
20327
- /**
20328
- * Checks if 'toggle test pane' button should be visible.
20329
- * It should, only when 'code' tab is reached.
20330
- * @returns {boolean}
20331
- */
20332
- function isToggleButtonVisible() {
20333
- var isButtonVisible = lodash.get($state.$current, 'self.url') === '/code';
20309
+ editorContext.editor = window.monaco.editor.create(editorElement, {
20310
+ value: scope.codeFile.code,
20311
+ language: scope.fileLanguage.language,
20312
+ theme: 'vs',
20313
+ automaticLayout: true,
20314
+ dragAndDrop: true,
20315
+ lineNumbersMinChars: scope.miniMonaco ? 2 : 5,
20316
+ lineNumbers: scope.miniMonaco && !scope.showLineNumbers ? 'off' : 'on', // hide line number if it's a mini-monaco
20317
+ minimap: {
20318
+ enabled: !scope.miniMonaco // hide mini-map if it's a mini-monaco
20319
+ },
20320
+ readOnly: scope.readOnly,
20321
+ wordWrap: scope.wordWrap ? 'on' : 'off'
20322
+ });
20334
20323
 
20335
- if (!isButtonVisible) {
20336
- ctrl.isTestPaneClosed = false;
20324
+ // change content callback
20325
+ editorContext.editor.onDidChangeModelContent(function () {
20337
20326
 
20338
- $rootScope.$broadcast('navigation-tabs_toggle-test-pane', { closeTestPane: ctrl.isTestPaneClosed });
20327
+ // call callback from upper scope (monaco component) with new changed code
20328
+ scope.onCodeChange(editorContext.editor.getValue());
20329
+ });
20330
+
20331
+ // set up watch for codeFile changes to reflect updates
20332
+ scope.$watch('fileLanguage', editorContext.onFileLanguageChanged.bind(editorContext));
20333
+ scope.$watch('editorTheme', editorContext.onThemeChanged.bind(editorContext));
20334
+ scope.$watch('wordWrap', editorContext.onWrapStateChanged.bind(editorContext));
20335
+ scope.$watch('codeFile', editorContext.onCodeFileChanged.bind(editorContext));
20336
+ scope.$watch('fontSize', editorContext.onFontSizeChanged.bind(editorContext));
20337
+ scope.$watch('readOnly', editorContext.onReadOnlyChanged.bind(editorContext));
20338
+
20339
+ scope.$on('function-import-source-code', editorContext.onReadOnlyCodeFileChanged.bind(editorContext));
20340
+ });
20341
+ }
20342
+
20343
+ return {
20344
+ link: link,
20345
+ scope: {
20346
+ codeFile: '=codeFile',
20347
+ editorTheme: '=editorTheme',
20348
+ fontSize: '=fontSize',
20349
+ fileLanguage: '=fileLanguage',
20350
+ miniMonaco: '=miniMonaco',
20351
+ showLineNumbers: '=showLineNumbers',
20352
+ onCodeChange: '=onCodeChange',
20353
+ readOnly: '=readOnly',
20354
+ wordWrap: '=wordWrap'
20339
20355
  }
20356
+ };
20357
+ }]);
20340
20358
 
20341
- return isButtonVisible;
20342
- }
20343
-
20344
- /**
20345
- * Sends broadcast to toggle test pane.
20346
- */
20347
- function toggleTestPane() {
20348
- if (isTestPaneToggled) {
20349
- ctrl.isTestPaneClosed = !ctrl.isTestPaneClosed;
20350
- isTestPaneToggled = false;
20351
-
20352
- $rootScope.$broadcast('navigation-tabs_toggle-test-pane', { closeTestPane: ctrl.isTestPaneClosed });
20353
-
20354
- // wait until toggling animation will be completed
20355
- $timeout(function () {
20356
- isTestPaneToggled = true;
20357
- }, 600);
20359
+ require(['vs/editor/editor.main'], function () {
20360
+ window.monaco.languages.registerCompletionItemProvider('python', {
20361
+ provideCompletionItems: function provideCompletionItems() {
20362
+ return [{
20363
+ label: 'def',
20364
+ kind: window.monaco.languages.CompletionItemKind.Keyword,
20365
+ insertText: {
20366
+ value: 'def ${1:name}():\r\t$0'
20367
+ }
20368
+ }];
20358
20369
  }
20359
- }
20360
- }
20370
+ });
20371
+ });
20361
20372
  })();
20362
20373
  'use strict';
20363
20374
 
@@ -21002,6 +21013,57 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
21002
21013
  })();
21003
21014
  'use strict';
21004
21015
 
21016
+ (function () {
21017
+ 'use strict';
21018
+
21019
+ NclVersionConfigurationController.$inject = ['lodash', 'ConfigService', 'VersionHelperService'];
21020
+ angular.module('iguazio.dashboard-controls').component('nclVersionConfiguration', {
21021
+ bindings: {
21022
+ version: '<',
21023
+ isFunctionDeploying: '&'
21024
+ },
21025
+ templateUrl: 'nuclio/functions/version/version-configuration/version-configuration.tpl.html',
21026
+ controller: NclVersionConfigurationController
21027
+ });
21028
+
21029
+ function NclVersionConfigurationController(lodash, ConfigService, VersionHelperService) {
21030
+ var ctrl = this;
21031
+
21032
+ ctrl.scrollConfig = {
21033
+ axis: 'y',
21034
+ advanced: {
21035
+ autoScrollOnFocus: false,
21036
+ updateOnContentResize: true
21037
+ }
21038
+ };
21039
+
21040
+ ctrl.isDemoMode = ConfigService.isDemoMode;
21041
+
21042
+ ctrl.isRuntimeBlockVisible = isRuntimeBlockVisible;
21043
+ ctrl.onConfigurationChangeCallback = onConfigurationChangeCallback;
21044
+
21045
+ //
21046
+ // Public methods
21047
+ //
21048
+
21049
+ /**
21050
+ * Checks if `Runtime Attributes` block is visible
21051
+ * @returns {boolean}
21052
+ */
21053
+ function isRuntimeBlockVisible() {
21054
+ return lodash.includes(['shell', 'java'], lodash.get(ctrl.version, 'spec.runtime'));
21055
+ }
21056
+
21057
+ /**
21058
+ * Checks if version's configuration was changed
21059
+ */
21060
+ function onConfigurationChangeCallback() {
21061
+ VersionHelperService.updateIsVersionChanged(ctrl.version);
21062
+ }
21063
+ }
21064
+ })();
21065
+ 'use strict';
21066
+
21005
21067
  (function () {
21006
21068
  'use strict';
21007
21069
 
@@ -21593,57 +21655,6 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
21593
21655
  })();
21594
21656
  'use strict';
21595
21657
 
21596
- (function () {
21597
- 'use strict';
21598
-
21599
- NclVersionConfigurationController.$inject = ['lodash', 'ConfigService', 'VersionHelperService'];
21600
- angular.module('iguazio.dashboard-controls').component('nclVersionConfiguration', {
21601
- bindings: {
21602
- version: '<',
21603
- isFunctionDeploying: '&'
21604
- },
21605
- templateUrl: 'nuclio/functions/version/version-configuration/version-configuration.tpl.html',
21606
- controller: NclVersionConfigurationController
21607
- });
21608
-
21609
- function NclVersionConfigurationController(lodash, ConfigService, VersionHelperService) {
21610
- var ctrl = this;
21611
-
21612
- ctrl.scrollConfig = {
21613
- axis: 'y',
21614
- advanced: {
21615
- autoScrollOnFocus: false,
21616
- updateOnContentResize: true
21617
- }
21618
- };
21619
-
21620
- ctrl.isDemoMode = ConfigService.isDemoMode;
21621
-
21622
- ctrl.isRuntimeBlockVisible = isRuntimeBlockVisible;
21623
- ctrl.onConfigurationChangeCallback = onConfigurationChangeCallback;
21624
-
21625
- //
21626
- // Public methods
21627
- //
21628
-
21629
- /**
21630
- * Checks if `Runtime Attributes` block is visible
21631
- * @returns {boolean}
21632
- */
21633
- function isRuntimeBlockVisible() {
21634
- return lodash.includes(['shell', 'java'], lodash.get(ctrl.version, 'spec.runtime'));
21635
- }
21636
-
21637
- /**
21638
- * Checks if version's configuration was changed
21639
- */
21640
- function onConfigurationChangeCallback() {
21641
- VersionHelperService.updateIsVersionChanged(ctrl.version);
21642
- }
21643
- }
21644
- })();
21645
- 'use strict';
21646
-
21647
21658
  (function () {
21648
21659
  'use strict';
21649
21660
 
@@ -22961,7 +22972,8 @@ angular.module('angular-i18next', []).provider('i18next', [function () {
22961
22972
  visible: true
22962
22973
  }, {
22963
22974
  id: 'python:3.6',
22964
- name: 'Python 3.6',
22975
+ name: 'Python 3.6 ' + $i18next.t('functions:DEPRECATED_SOON_LABEL', { lng: lng }),
22976
+ nameTemplate: 'Python 3.6 ' + '<b>' + $i18next.t('functions:DEPRECATED_SOON_LABEL', { lng: lng }) + '</b>',
22965
22977
  visible: true
22966
22978
  }, {
22967
22979
  id: 'python:3.7',
@@ -24293,10 +24305,8 @@ try {
24293
24305
  module = angular.module('iguazio.dashboard-controls.templates', []);
24294
24306
  }
24295
24307
  module.run(['$templateCache', function($templateCache) {
24296
- $templateCache.put('igz_controls/components/action-checkbox-all/action-checkbox-all.tpl.html',
24297
- '<div class="action-checkbox-all"> <div class="check-item" data-ng-class="{\'igz-icon-checkbox-checked\': $ctrl.allItemsChecked,\n' +
24298
- ' \'igz-icon-checkbox-checked-few\': $ctrl.checkedItemsCount > 0 && !$ctrl.allItemsChecked,\n' +
24299
- ' \'igz-icon-checkbox-unchecked\': $ctrl.checkedItemsCount === 0}" data-ng-click="$ctrl.onCheckAll()"></div> </div> ');
24308
+ $templateCache.put('igz_controls/components/action-menu/action-menu.tpl.html',
24309
+ '<div class="igz-action-menu" data-ng-if="$ctrl.isVisible()"> <div class="menu-button {{$ctrl.iconClass}}" data-ng-class="{active: $ctrl.isMenuShown}" data-ng-click="$ctrl.toggleMenu($event)" data-uib-tooltip="{{ $ctrl.tooltipText }}" data-tooltip-enable="$ctrl.tooltipEnabled" data-tooltip-placement="top" data-tooltip-popup-delay="300" data-tooltip-append-to-body="true"> </div> <div class="menu-dropdown" data-ng-if="$ctrl.isMenuShown"> <div class="actions-list" data-ng-click="$ctrl.toggleMenu($event)"> <igz-action-item data-ng-repeat="action in $ctrl.actions track by action.id" data-action="action" data-actions="$ctrl.actions"> </igz-action-item> </div> <div class="shortcuts-list" data-ng-if="$ctrl.shortcuts && $ctrl.shortcuts.length > 0" data-ng-class="{\'first-block\': $ctrl.actions.length === 0}"> <div class="shortcuts-header">{{ \'common:SHORTCUTS\' | i18next }}</div> <div class="shortcuts-item" data-ng-repeat="shortcut in $ctrl.shortcuts" data-ng-click="$ctrl.showDetails($event, shortcut.state)"> {{shortcut.label}} </div> </div> </div> </div> ');
24300
24310
  }]);
24301
24311
  })();
24302
24312
 
@@ -24322,8 +24332,10 @@ try {
24322
24332
  module = angular.module('iguazio.dashboard-controls.templates', []);
24323
24333
  }
24324
24334
  module.run(['$templateCache', function($templateCache) {
24325
- $templateCache.put('igz_controls/components/action-menu/action-menu.tpl.html',
24326
- '<div class="igz-action-menu" data-ng-if="$ctrl.isVisible()"> <div class="menu-button {{$ctrl.iconClass}}" data-ng-class="{active: $ctrl.isMenuShown}" data-ng-click="$ctrl.toggleMenu($event)" data-uib-tooltip="{{ $ctrl.tooltipText }}" data-tooltip-enable="$ctrl.tooltipEnabled" data-tooltip-placement="top" data-tooltip-popup-delay="300" data-tooltip-append-to-body="true"> </div> <div class="menu-dropdown" data-ng-if="$ctrl.isMenuShown"> <div class="actions-list" data-ng-click="$ctrl.toggleMenu($event)"> <igz-action-item data-ng-repeat="action in $ctrl.actions track by action.id" data-action="action" data-actions="$ctrl.actions"> </igz-action-item> </div> <div class="shortcuts-list" data-ng-if="$ctrl.shortcuts && $ctrl.shortcuts.length > 0" data-ng-class="{\'first-block\': $ctrl.actions.length === 0}"> <div class="shortcuts-header">{{ \'common:SHORTCUTS\' | i18next }}</div> <div class="shortcuts-item" data-ng-repeat="shortcut in $ctrl.shortcuts" data-ng-click="$ctrl.showDetails($event, shortcut.state)"> {{shortcut.label}} </div> </div> </div> </div> ');
24335
+ $templateCache.put('igz_controls/components/action-checkbox-all/action-checkbox-all.tpl.html',
24336
+ '<div class="action-checkbox-all"> <div class="check-item" data-ng-class="{\'igz-icon-checkbox-checked\': $ctrl.allItemsChecked,\n' +
24337
+ ' \'igz-icon-checkbox-checked-few\': $ctrl.checkedItemsCount > 0 && !$ctrl.allItemsChecked,\n' +
24338
+ ' \'igz-icon-checkbox-unchecked\': $ctrl.checkedItemsCount === 0}" data-ng-click="$ctrl.onCheckAll()"></div> </div> ');
24327
24339
  }]);
24328
24340
  })();
24329
24341
 
@@ -24371,13 +24383,8 @@ try {
24371
24383
  module = angular.module('iguazio.dashboard-controls.templates', []);
24372
24384
  }
24373
24385
  module.run(['$templateCache', function($templateCache) {
24374
- $templateCache.put('igz_controls/components/default-dropdown/default-dropdown.tpl.html',
24375
- '<div class="default-dropdown" data-ng-class="{\'dropdown-input-invalid\': $ctrl.isShowDropdownError($ctrl.formObject, $ctrl.inputName),\n' +
24376
- ' \'dropdown-input-disabled\': $ctrl.isDisabled}"> <div class="default-dropdown-field" tabindex="0" data-ng-click="$ctrl.readOnly || $ctrl.toggleDropdown($event)" data-ng-keydown="$ctrl.onDropDownKeydown($event)" data-uib-tooltip="{{$ctrl.isDropdownContainerShown ? \'\' : $ctrl.typedValue}}" data-tooltip-append-to-body="true" data-tooltip-placement="top" data-tooltip-popup-delay="300" data-ng-class="{placeholder: $ctrl.isPlaceholderClass(),\n' +
24377
- ' disabled: $ctrl.isDisabled,\n' +
24378
- ' readonly: $ctrl.readOnly}"> <div class="dropdown-selected-item"> <div data-ng-if="$ctrl.showSelectedItem().icon.name" data-ng-class="{\'custom-color\': $ctrl.dropdownType === \'priority\'}" class="dropdown-icon {{$ctrl.getIcon($ctrl.showSelectedItem()).name}}"> </div> <div data-ng-if="$ctrl.showSelectedItem().badge" data-ng-class="{\'custom-color\': $ctrl.dropdownType === \'badges-dropdown\'}" class="{{$ctrl.showSelectedItem().badge.class}}"> {{$ctrl.showSelectedItem().badge.value}} </div> <input type="text" class="input-name text-ellipsis" data-ng-class="{\'non-editable\': !$ctrl.isTypingEnabled() && !$ctrl.isDisabled, capitalized: $ctrl.isCapitalized}" data-ng-model="$ctrl.typedValue" data-ng-change="$ctrl.onChangeTypingInput()" data-ng-readonly="!$ctrl.isTypingEnabled()" data-ng-required="$ctrl.checkIsRequired()" data-ng-disabled="$ctrl.isDisabled || !$ctrl.isTypingEnabled()" data-ng-pattern="$ctrl.matchPattern" data-ng-trim="{{$ctrl.trim}}" autocomplete="off" name="{{$ctrl.inputName}}" placeholder="{{$ctrl.placeholder}}"> <span data-ng-if="$ctrl.getDescription($ctrl.showSelectedItem().description)" class="description">{{$ctrl.getDescription($ctrl.showSelectedItem().description)}}</span> </div> <div class="dropdown-arrow" data-ng-if="!$ctrl.readOnly"> <span class="{{$ctrl.iconClass}}" data-ng-class="{\'rotate-arrow\': $ctrl.isDropUp}"></span> </div> </div> <div class="default-dropdown-container {{$ctrl.additionalClass}}" tabindex="-1" data-ng-if="$ctrl.isDropdownContainerShown" data-ng-style="{\'top\': $ctrl.topPosition}" data-ng-class="{\'dropdown-overlap\': $ctrl.enableOverlap}" data-ng-scrollbars> <ul class="list" tabindex="-1"> <li class="list-item" tabindex="0" data-ng-repeat="item in $ctrl.getValuesArray() track by $index" data-ng-click="$ctrl.selectItem(item, $event)" data-ng-keydown="$ctrl.onItemKeydown($event, item)" data-ng-class="{\'list-item-description\': $ctrl.getDescription(item),\n' +
24379
- ' \'active\': $ctrl.isItemSelected(item),\n' +
24380
- ' \'disabled\': item.disabled}" data-ng-show="item.visible" data-uib-tooltip="{{$ctrl.getTooltip(item)}}" data-tooltip-placement="{{item.tooltipPlacement || \'left\'}}" data-tooltip-append-to-body="true"> <div class="list-item-block text-ellipsis"> <div data-ng-if="$ctrl.getIcon(item).name" data-ng-class="{\'custom-color\': $ctrl.dropdownType === \'priority\'}" class="dropdown-icon {{$ctrl.getIcon(item).name}}"> </div> <div data-ng-if="item.badge" data-ng-class="{\'custom-color\': $ctrl.dropdownType === \'badges-dropdown\'}" class="{{item.badge.class}}"> {{item.badge.value}} </div> <div class="list-item-label"> <span class="list-item-name" data-ng-class="{\'capitalized\': $ctrl.isCapitalized}"> {{$ctrl.getName(item)}}</span> <span data-ng-show="$ctrl.getDescription(item)" class="description">{{$ctrl.getDescription(item)}}</span> </div> </div> <div class="igz-col-20 igz-icon-tick selected-item-icon" data-ng-show="$ctrl.isItemSelected(item) && !$ctrl.isPagination"></div> </li> </ul> <div class="add-button-wrapper" tabindex="0" data-ng-if="$ctrl.bottomButtonCallback"> <a href="#" class="add-button" data-ng-click="$ctrl.bottomButtonCallback()"> {{ $ctrl.bottomButtonText }} </a> </div> <div class="transclude-container align-items-center" data-ng-if="$ctrl.isTranscludePassed" data-ng-transclude> </div> </div> </div> ');
24386
+ $templateCache.put('igz_controls/components/copy-to-clipboard/copy-to-clipboard.tpl.html',
24387
+ '<div class="igz-action-item" data-ng-click="$ctrl.copyToClipboard()" data-uib-tooltip="{{ $ctrl.tooltipText ? $ctrl.tooltipText : \'common:TOOLTIP.COPY_TO_CLIPBOARD\' | i18next }}" data-tooltip-placement="{{ $ctrl.tooltipPlacement }}" data-tooltip-popup-delay="300" data-tooltip-append-to-body="true"> <div class="action-icon ncl-icon-copy"></div> </div> ');
24381
24388
  }]);
24382
24389
  })();
24383
24390
 
@@ -24388,8 +24395,13 @@ try {
24388
24395
  module = angular.module('iguazio.dashboard-controls.templates', []);
24389
24396
  }
24390
24397
  module.run(['$templateCache', function($templateCache) {
24391
- $templateCache.put('igz_controls/components/copy-to-clipboard/copy-to-clipboard.tpl.html',
24392
- '<div class="igz-action-item" data-ng-click="$ctrl.copyToClipboard()" data-uib-tooltip="{{ $ctrl.tooltipText ? $ctrl.tooltipText : \'common:TOOLTIP.COPY_TO_CLIPBOARD\' | i18next }}" data-tooltip-placement="{{ $ctrl.tooltipPlacement }}" data-tooltip-popup-delay="300" data-tooltip-append-to-body="true"> <div class="action-icon ncl-icon-copy"></div> </div> ');
24398
+ $templateCache.put('igz_controls/components/default-dropdown/default-dropdown.tpl.html',
24399
+ '<div class="default-dropdown" data-ng-class="{\'dropdown-input-invalid\': $ctrl.isShowDropdownError($ctrl.formObject, $ctrl.inputName),\n' +
24400
+ ' \'dropdown-input-disabled\': $ctrl.isDisabled}"> <div class="default-dropdown-field" tabindex="0" data-ng-click="$ctrl.readOnly || $ctrl.toggleDropdown($event)" data-ng-keydown="$ctrl.onDropDownKeydown($event)" data-uib-tooltip="{{$ctrl.isDropdownContainerShown ? \'\' : $ctrl.typedValue}}" data-tooltip-append-to-body="true" data-tooltip-placement="top" data-tooltip-popup-delay="300" data-ng-class="{placeholder: $ctrl.isPlaceholderClass(),\n' +
24401
+ ' disabled: $ctrl.isDisabled,\n' +
24402
+ ' readonly: $ctrl.readOnly}"> <div class="dropdown-selected-item"> <div data-ng-if="$ctrl.showSelectedItem().icon.name" data-ng-class="{\'custom-color\': $ctrl.dropdownType === \'priority\'}" class="dropdown-icon {{$ctrl.getIcon($ctrl.showSelectedItem()).name}}"> </div> <div data-ng-if="$ctrl.showSelectedItem().badge" data-ng-class="{\'custom-color\': $ctrl.dropdownType === \'badges-dropdown\'}" class="{{$ctrl.showSelectedItem().badge.class}}"> {{$ctrl.showSelectedItem().badge.value}} </div> <input type="text" class="input-name text-ellipsis" data-ng-class="{\'non-editable\': !$ctrl.isTypingEnabled() && !$ctrl.isDisabled, capitalized: $ctrl.isCapitalized}" data-ng-model="$ctrl.typedValue" data-ng-change="$ctrl.onChangeTypingInput()" data-ng-readonly="!$ctrl.isTypingEnabled()" data-ng-required="$ctrl.checkIsRequired()" data-ng-disabled="$ctrl.isDisabled || !$ctrl.isTypingEnabled()" data-ng-pattern="$ctrl.matchPattern" data-ng-trim="{{$ctrl.trim}}" autocomplete="off" name="{{$ctrl.inputName}}" placeholder="{{$ctrl.placeholder}}"> <span data-ng-if="$ctrl.getDescription($ctrl.showSelectedItem().description)" class="description">{{$ctrl.getDescription($ctrl.showSelectedItem().description)}}</span> </div> <div class="dropdown-arrow" data-ng-if="!$ctrl.readOnly"> <span class="{{$ctrl.iconClass}}" data-ng-class="{\'rotate-arrow\': $ctrl.isDropUp}"></span> </div> </div> <div class="default-dropdown-container {{$ctrl.additionalClass}}" tabindex="-1" data-ng-if="$ctrl.isDropdownContainerShown" data-ng-style="{\'top\': $ctrl.topPosition}" data-ng-class="{\'dropdown-overlap\': $ctrl.enableOverlap}" data-ng-scrollbars> <ul class="list" tabindex="-1"> <li class="list-item" tabindex="0" data-ng-repeat="item in $ctrl.getValuesArray() track by $index" data-ng-click="$ctrl.selectItem(item, $event)" data-ng-keydown="$ctrl.onItemKeydown($event, item)" data-ng-class="{\'list-item-description\': $ctrl.getDescription(item),\n' +
24403
+ ' \'active\': $ctrl.isItemSelected(item),\n' +
24404
+ ' \'disabled\': item.disabled}" data-ng-show="item.visible" data-uib-tooltip="{{$ctrl.getTooltip(item)}}" data-tooltip-placement="{{item.tooltipPlacement || \'left\'}}" data-tooltip-append-to-body="true"> <div class="list-item-block text-ellipsis"> <div data-ng-if="$ctrl.getIcon(item).name" data-ng-class="{\'custom-color\': $ctrl.dropdownType === \'priority\'}" class="dropdown-icon {{$ctrl.getIcon(item).name}}"> </div> <div data-ng-if="item.badge" data-ng-class="{\'custom-color\': $ctrl.dropdownType === \'badges-dropdown\'}" class="{{item.badge.class}}"> {{item.badge.value}} </div> <div class="list-item-label"> <span class="list-item-name" data-ng-class="{\'capitalized\': $ctrl.isCapitalized}" data-ng-bind-html="$ctrl.getNameTemplate(item)"></span> <span data-ng-show="$ctrl.getDescription(item)" class="description">{{$ctrl.getDescription(item)}}</span> </div> </div> <div class="igz-col-20 igz-icon-tick selected-item-icon" data-ng-show="$ctrl.isItemSelected(item) && !$ctrl.isPagination"></div> </li> </ul> <div class="add-button-wrapper" tabindex="0" data-ng-if="$ctrl.bottomButtonCallback"> <a href="#" class="add-button" data-ng-click="$ctrl.bottomButtonCallback()"> {{ $ctrl.bottomButtonText }} </a> </div> <div class="transclude-container align-items-center" data-ng-if="$ctrl.isTranscludePassed" data-ng-transclude> </div> </div> </div> ');
24393
24405
  }]);
24394
24406
  })();
24395
24407
 
@@ -24765,8 +24777,8 @@ try {
24765
24777
  module = angular.module('iguazio.dashboard-controls.templates', []);
24766
24778
  }
24767
24779
  module.run(['$templateCache', function($templateCache) {
24768
- $templateCache.put('igz_controls/components/info-page/info-page-filters/info-page-filters.tpl.html',
24769
- '<div class="info-page-filters-wrapper"> <div class="info-page-filters" data-ng-show="$ctrl.isFiltersShowed" data-ng-keyup="$ctrl.onApplyFilters($event)"> <div class="info-page-filters-title">{{ \'common:FILTER\' | i18next }}</div> <div class="close-button igz-icon-close" data-ng-click="$ctrl.changeStateCallback({newVal: false})" data-ng-show="$ctrl.changeStateCallback"> </div> <div class="info-page-filters-body" data-ng-class="{\'buttons-shown\' : $ctrl.isShowFooterButtons()}" data-ng-scrollbars data-ng-scrollbars-config="$ctrl.scrollbarConfig"> <div data-ng-transclude></div> </div> <div class="info-page-filters-footer" data-ng-if="$ctrl.isShowFooterButtons()"> <button class="igz-button-just-text" tabindex="0" data-ng-click="$ctrl.onResetFilters()" data-ng-keydown="$ctrl.onResetFilters($event)" data-ng-disabled="$ctrl.isDisabled" data-ng-if="$ctrl.resetFilters">{{ \'common:RESET\' | i18next }} </button> <button class="igz-button-primary" tabindex="0" data-ng-click="$ctrl.onApplyFilters()" data-ng-keydown="$ctrl.onApplyFilters($event)" data-ng-disabled="$ctrl.isDisabled" data-ng-if="$ctrl.applyFilters">{{ \'common:APPLY\' | i18next }} </button> </div> </div> </div> ');
24780
+ $templateCache.put('igz_controls/components/info-page/info-page-content/info-page-content.tpl.html',
24781
+ '<div class="igz-info-page-content-wrapper" data-ng-class="{\'info-pane-opened\' : $ctrl.isInfoPaneShowed, \'filters-opened\' : $ctrl.isFiltersShowed, \'upper-pane-opened\' : $ctrl.isUpperPaneShowed}"> <div data-ng-if="$ctrl.scrolled !== false" class="igz-scrollable-container horizontal" data-ng-scrollbars data-ng-scrollbars-config="$ctrl.scrollConfigHorizontal"> <div class="igz-info-page-content"> <div data-ng-transclude></div> </div> </div> <div data-ng-if="$ctrl.scrolled === false"> <div class="igz-info-page-content"> <div data-ng-transclude></div> </div> </div> </div>');
24770
24782
  }]);
24771
24783
  })();
24772
24784
 
@@ -24777,8 +24789,8 @@ try {
24777
24789
  module = angular.module('iguazio.dashboard-controls.templates', []);
24778
24790
  }
24779
24791
  module.run(['$templateCache', function($templateCache) {
24780
- $templateCache.put('igz_controls/components/info-page/info-page-content/info-page-content.tpl.html',
24781
- '<div class="igz-info-page-content-wrapper" data-ng-class="{\'info-pane-opened\' : $ctrl.isInfoPaneShowed, \'filters-opened\' : $ctrl.isFiltersShowed, \'upper-pane-opened\' : $ctrl.isUpperPaneShowed}"> <div data-ng-if="$ctrl.scrolled !== false" class="igz-scrollable-container horizontal" data-ng-scrollbars data-ng-scrollbars-config="$ctrl.scrollConfigHorizontal"> <div class="igz-info-page-content"> <div data-ng-transclude></div> </div> </div> <div data-ng-if="$ctrl.scrolled === false"> <div class="igz-info-page-content"> <div data-ng-transclude></div> </div> </div> </div>');
24792
+ $templateCache.put('igz_controls/components/info-page/info-page-filters/info-page-filters.tpl.html',
24793
+ '<div class="info-page-filters-wrapper"> <div class="info-page-filters" data-ng-show="$ctrl.isFiltersShowed" data-ng-keyup="$ctrl.onApplyFilters($event)"> <div class="info-page-filters-title">{{ \'common:FILTER\' | i18next }}</div> <div class="close-button igz-icon-close" data-ng-click="$ctrl.changeStateCallback({newVal: false})" data-ng-show="$ctrl.changeStateCallback"> </div> <div class="info-page-filters-body" data-ng-class="{\'buttons-shown\' : $ctrl.isShowFooterButtons()}" data-ng-scrollbars data-ng-scrollbars-config="$ctrl.scrollbarConfig"> <div data-ng-transclude></div> </div> <div class="info-page-filters-footer" data-ng-if="$ctrl.isShowFooterButtons()"> <button class="igz-button-just-text" tabindex="0" data-ng-click="$ctrl.onResetFilters()" data-ng-keydown="$ctrl.onResetFilters($event)" data-ng-disabled="$ctrl.isDisabled" data-ng-if="$ctrl.resetFilters">{{ \'common:RESET\' | i18next }} </button> <button class="igz-button-primary" tabindex="0" data-ng-click="$ctrl.onApplyFilters()" data-ng-keydown="$ctrl.onApplyFilters($event)" data-ng-disabled="$ctrl.isDisabled" data-ng-if="$ctrl.applyFilters">{{ \'common:APPLY\' | i18next }} </button> </div> </div> </div> ');
24782
24794
  }]);
24783
24795
  })();
24784
24796
 
@@ -24851,11 +24863,8 @@ try {
24851
24863
  module = angular.module('iguazio.dashboard-controls.templates', []);
24852
24864
  }
24853
24865
  module.run(['$templateCache', function($templateCache) {
24854
- $templateCache.put('nuclio/common/components/key-value-input/key-value-input.tpl.html',
24855
- '<div class="ncl-key-value-input"> <form name="$ctrl.keyValueInputForm" class="input-wrapper" data-ng-mousedown="$ctrl.onEditInput()" novalidate> <div class="check-row" data-ng-if="$ctrl.allowSelection"> <igz-action-checkbox data-item="$ctrl.data"></igz-action-checkbox> </div> <div class="inputs-container" data-ng-class="{\'use-type\': $ctrl.useType, \'use-checkbox\': $ctrl.allowSelection}"> <div class="input-container input-key-wrapper" data-ng-if="!$ctrl.onlyValueInput" data-ng-class="{\'use-type\': $ctrl.useType, \'all-value-types\': $ctrl.allValueTypes}"> <label class="key-label asterisk" data-ng-if="$ctrl.useLabels"> {{ \'common:KEY\' | i18next }}: </label> <igz-validating-input-field class="input-key" data-ng-if="!$ctrl.keyList" data-field-type="input" data-input-name="key" data-is-disabled="$ctrl.isDisabled" data-input-value="$ctrl.data.name" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="name" data-form-object="$ctrl.keyValueInputForm" data-validation-is-required="!$ctrl.keyOptional" data-validation-pattern="$ctrl.keyValidationPattern" data-validation-rules="$ctrl.validationRules[\'key\']" data-placeholder-text="{{$ctrl.keyPlaceholder}}" data-uib-tooltip="{{$ctrl.keyTooltip}}" data-tooltip-append-to-body="true" data-tooltip-placement="bottom" data-tooltip-popup-delay="100"> </igz-validating-input-field> <igz-default-dropdown class="input-key" data-ng-if="$ctrl.keyList" data-form-object="$ctrl.keyValueInputForm" data-prevent-drop-up="true" data-input-name="key" data-is-disabled="$ctrl.isDisabled" data-values-array="$ctrl.keyList" data-selected-item="$ctrl.getSelectedItem()" data-item-select-callback="$ctrl.onKeyChanged(item)" data-enable-overlap="$ctrl.dropdownOverlap"> </igz-default-dropdown> </div> <div class="input-container input-type-wrapper" data-ng-if="$ctrl.useType" data-ng-class="{\'use-type\': $ctrl.useType, \'all-value-types\': $ctrl.allValueTypes}"> <label data-ng-if="$ctrl.useLabels" class="type-label"> {{ \'common:TYPE\' | i18next }}: </label> <igz-default-dropdown class="input-type" data-form-object="$ctrl.keyValueInputForm" data-select-property-only="id" data-prevent-drop-up="true" data-input-name="type" data-is-disabled="$ctrl.isDisabled" data-values-array="$ctrl.typesList" data-selected-item="$ctrl.getType()" data-placeholder="{{ \'common:PLACEHOLDER.SELECT_TYPE\' | i18next }}" data-item-select-callback="$ctrl.onTypeChanged(item, isItemChanged)" data-enable-overlap="$ctrl.dropdownOverlap"> </igz-default-dropdown> </div> <div class="input-container input-value-key-wrapper" data-ng-if="!$ctrl.isVisibleByType(\'value\')" data-ng-class="{\'use-type\': $ctrl.useType}"> <label data-ng-if="$ctrl.useLabels"> <span data-ng-if="$ctrl.isVisibleByType(\'secret\')"> {{ \'functions:SECRET_KEY\' | i18next }}: </span> <span data-ng-if="$ctrl.isVisibleByType(\'configmap\')"> {{ \'functions:CONFIGMAP_KEY\' | i18next }}: </span> </label> <igz-validating-input-field class="input-value-key" data-field-type="input" data-input-name="value-key" data-input-value="$ctrl.getInputKey()" data-update-data-callback="$ctrl.inputKeyCallback(newData)" data-update-data-field="value-key" data-is-disabled="$ctrl.isDisabled" data-form-object="$ctrl.keyValueInputForm" data-validation-is-required="!$ctrl.valueOptional" data-validation-rules="$ctrl.validationRules[$ctrl.getType() + \'Key\']" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_KEY\' | i18next }}"> </igz-validating-input-field> </div> <div class="input-container input-value-wrapper" data-ng-class="{\'use-type\': $ctrl.useType,\n' +
24856
- ' \'only-value-input\': $ctrl.onlyValueInput,\n' +
24857
- ' \'only-key-value-input\': $ctrl.isVisibleByType(\'value\'),\n' +
24858
- ' \'all-value-types\': $ctrl.allValueTypes}"> <label data-ng-if="$ctrl.useLabels" class="asterisk"> <span data-ng-if="$ctrl.isVisibleByType(\'value\')"> {{ \'common:VALUE\' | i18next }}: </span> <span data-ng-if="$ctrl.isVisibleByType(\'secret\')"> {{ \'functions:SECRET_NAME\' | i18next }}: </span> <span data-ng-if="$ctrl.isVisibleByType(\'configmap\')"> {{ \'functions:CONFIGMAP_NAME\' | i18next }}: </span> </label> <igz-validating-input-field class="input-value" data-field-type="input" data-input-name="value" data-input-value="$ctrl.getInputValue()" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="value" data-is-disabled="$ctrl.isDisabled" data-form-object="$ctrl.keyValueInputForm" data-validation-is-required="!$ctrl.valueOptional" data-validation-pattern="$ctrl.valueValidationPattern" data-validation-rules="$ctrl.validationRules[$ctrl.getType()]" data-placeholder-text="{{$ctrl.valuePlaceholder}}" data-uib-tooltip="{{$ctrl.valueTooltip}}" data-tooltip-append-to-body="true" data-tooltip-placement="bottom" data-tooltip-popup-delay="100"> </igz-validating-input-field> <igz-validating-input-field class="input-additional-value" data-ng-if="$ctrl.useAdditionalValue && $ctrl.isVisibleByType(\'value\')" data-field-type="input" data-input-name="additionalValue" data-is-disabled="$ctrl.isDisabled" data-input-value="$ctrl.data.additionalValue" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="additionalValue" data-form-object="$ctrl.keyValueInputForm" data-validation-is-required="!$ctrl.additionalValueOptional"> </igz-validating-input-field> </div> </div> <div class="three-dot-menu" data-ng-if="$ctrl.actions.length > 1 && !$ctrl.isDisabled"> <igz-action-menu data-actions="$ctrl.actions" data-on-fire-action="$ctrl.onFireAction"> </igz-action-menu> </div> <div class="igz-action-panel" data-ng-if="$ctrl.actions.length === 1 && !$ctrl.isDisabled"> <div class="actions-list"> <div class="igz-action-item" data-ng-click="$ctrl.onClickAction($ctrl.actions[0])"> <span class="action-icon" data-ng-class="$ctrl.actions[0].icon"> </span> </div> </div> </div> </form> </div> ');
24866
+ $templateCache.put('nuclio/common/components/function-config-dialog/function-config-dialog.tpl.html',
24867
+ '<div class="view-yaml-dialog-container"> <div class="view-yaml-dialog-header"> <div class="title">{{ $ctrl.title }}</div> <igz-copy-to-clipboard data-value="$ctrl.sourceCode"></igz-copy-to-clipboard> <div class="close-button igz-icon-close" data-ng-click="$ctrl.closeDialog()"></div> </div> <div class="main-content"> <ncl-monaco class="monaco-code-editor" data-function-source-code="$ctrl.sourceCode" data-mini-monaco="false" data-selected-theme="\'vs-light\'" data-language="\'yaml\'" data-read-only="true"> </ncl-monaco> </div> <div class="buttons"> <button class="igz-button-primary" tabindex="0" data-ng-click="$ctrl.closeDialog()"> {{ \'common:CLOSE\' | i18next }} </button> </div> </div> ');
24859
24868
  }]);
24860
24869
  })();
24861
24870
 
@@ -24866,8 +24875,11 @@ try {
24866
24875
  module = angular.module('iguazio.dashboard-controls.templates', []);
24867
24876
  }
24868
24877
  module.run(['$templateCache', function($templateCache) {
24869
- $templateCache.put('nuclio/common/components/function-config-dialog/function-config-dialog.tpl.html',
24870
- '<div class="view-yaml-dialog-container"> <div class="view-yaml-dialog-header"> <div class="title">{{ $ctrl.title }}</div> <igz-copy-to-clipboard data-value="$ctrl.sourceCode"></igz-copy-to-clipboard> <div class="close-button igz-icon-close" data-ng-click="$ctrl.closeDialog()"></div> </div> <div class="main-content"> <ncl-monaco class="monaco-code-editor" data-function-source-code="$ctrl.sourceCode" data-mini-monaco="false" data-selected-theme="\'vs-light\'" data-language="\'yaml\'" data-read-only="true"> </ncl-monaco> </div> <div class="buttons"> <button class="igz-button-primary" tabindex="0" data-ng-click="$ctrl.closeDialog()"> {{ \'common:CLOSE\' | i18next }} </button> </div> </div> ');
24878
+ $templateCache.put('nuclio/common/components/key-value-input/key-value-input.tpl.html',
24879
+ '<div class="ncl-key-value-input"> <form name="$ctrl.keyValueInputForm" class="input-wrapper" data-ng-mousedown="$ctrl.onEditInput()" novalidate> <div class="check-row" data-ng-if="$ctrl.allowSelection"> <igz-action-checkbox data-item="$ctrl.data"></igz-action-checkbox> </div> <div class="inputs-container" data-ng-class="{\'use-type\': $ctrl.useType, \'use-checkbox\': $ctrl.allowSelection}"> <div class="input-container input-key-wrapper" data-ng-if="!$ctrl.onlyValueInput" data-ng-class="{\'use-type\': $ctrl.useType, \'all-value-types\': $ctrl.allValueTypes}"> <label class="key-label asterisk" data-ng-if="$ctrl.useLabels"> {{ \'common:KEY\' | i18next }}: </label> <igz-validating-input-field class="input-key" data-ng-if="!$ctrl.keyList" data-field-type="input" data-input-name="key" data-is-disabled="$ctrl.isDisabled" data-input-value="$ctrl.data.name" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="name" data-form-object="$ctrl.keyValueInputForm" data-validation-is-required="!$ctrl.keyOptional" data-validation-pattern="$ctrl.keyValidationPattern" data-validation-rules="$ctrl.validationRules[\'key\']" data-placeholder-text="{{$ctrl.keyPlaceholder}}" data-uib-tooltip="{{$ctrl.keyTooltip}}" data-tooltip-append-to-body="true" data-tooltip-placement="bottom" data-tooltip-popup-delay="100"> </igz-validating-input-field> <igz-default-dropdown class="input-key" data-ng-if="$ctrl.keyList" data-form-object="$ctrl.keyValueInputForm" data-prevent-drop-up="true" data-input-name="key" data-is-disabled="$ctrl.isDisabled" data-values-array="$ctrl.keyList" data-selected-item="$ctrl.getSelectedItem()" data-item-select-callback="$ctrl.onKeyChanged(item)" data-enable-overlap="$ctrl.dropdownOverlap"> </igz-default-dropdown> </div> <div class="input-container input-type-wrapper" data-ng-if="$ctrl.useType" data-ng-class="{\'use-type\': $ctrl.useType, \'all-value-types\': $ctrl.allValueTypes}"> <label data-ng-if="$ctrl.useLabels" class="type-label"> {{ \'common:TYPE\' | i18next }}: </label> <igz-default-dropdown class="input-type" data-form-object="$ctrl.keyValueInputForm" data-select-property-only="id" data-prevent-drop-up="true" data-input-name="type" data-is-disabled="$ctrl.isDisabled" data-values-array="$ctrl.typesList" data-selected-item="$ctrl.getType()" data-placeholder="{{ \'common:PLACEHOLDER.SELECT_TYPE\' | i18next }}" data-item-select-callback="$ctrl.onTypeChanged(item, isItemChanged)" data-enable-overlap="$ctrl.dropdownOverlap"> </igz-default-dropdown> </div> <div class="input-container input-value-key-wrapper" data-ng-if="!$ctrl.isVisibleByType(\'value\')" data-ng-class="{\'use-type\': $ctrl.useType}"> <label data-ng-if="$ctrl.useLabels"> <span data-ng-if="$ctrl.isVisibleByType(\'secret\')"> {{ \'functions:SECRET_KEY\' | i18next }}: </span> <span data-ng-if="$ctrl.isVisibleByType(\'configmap\')"> {{ \'functions:CONFIGMAP_KEY\' | i18next }}: </span> </label> <igz-validating-input-field class="input-value-key" data-field-type="input" data-input-name="value-key" data-input-value="$ctrl.getInputKey()" data-update-data-callback="$ctrl.inputKeyCallback(newData)" data-update-data-field="value-key" data-is-disabled="$ctrl.isDisabled" data-form-object="$ctrl.keyValueInputForm" data-validation-is-required="!$ctrl.valueOptional" data-validation-rules="$ctrl.validationRules[$ctrl.getType() + \'Key\']" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_KEY\' | i18next }}"> </igz-validating-input-field> </div> <div class="input-container input-value-wrapper" data-ng-class="{\'use-type\': $ctrl.useType,\n' +
24880
+ ' \'only-value-input\': $ctrl.onlyValueInput,\n' +
24881
+ ' \'only-key-value-input\': $ctrl.isVisibleByType(\'value\'),\n' +
24882
+ ' \'all-value-types\': $ctrl.allValueTypes}"> <label data-ng-if="$ctrl.useLabels" class="asterisk"> <span data-ng-if="$ctrl.isVisibleByType(\'value\')"> {{ \'common:VALUE\' | i18next }}: </span> <span data-ng-if="$ctrl.isVisibleByType(\'secret\')"> {{ \'functions:SECRET_NAME\' | i18next }}: </span> <span data-ng-if="$ctrl.isVisibleByType(\'configmap\')"> {{ \'functions:CONFIGMAP_NAME\' | i18next }}: </span> </label> <igz-validating-input-field class="input-value" data-field-type="input" data-input-name="value" data-input-value="$ctrl.getInputValue()" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="value" data-is-disabled="$ctrl.isDisabled" data-form-object="$ctrl.keyValueInputForm" data-validation-is-required="!$ctrl.valueOptional" data-validation-pattern="$ctrl.valueValidationPattern" data-validation-rules="$ctrl.validationRules[$ctrl.getType()]" data-placeholder-text="{{$ctrl.valuePlaceholder}}" data-uib-tooltip="{{$ctrl.valueTooltip}}" data-tooltip-append-to-body="true" data-tooltip-placement="bottom" data-tooltip-popup-delay="100"> </igz-validating-input-field> <igz-validating-input-field class="input-additional-value" data-ng-if="$ctrl.useAdditionalValue && $ctrl.isVisibleByType(\'value\')" data-field-type="input" data-input-name="additionalValue" data-is-disabled="$ctrl.isDisabled" data-input-value="$ctrl.data.additionalValue" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="additionalValue" data-form-object="$ctrl.keyValueInputForm" data-validation-is-required="!$ctrl.additionalValueOptional"> </igz-validating-input-field> </div> </div> <div class="three-dot-menu" data-ng-if="$ctrl.actions.length > 1 && !$ctrl.isDisabled"> <igz-action-menu data-actions="$ctrl.actions" data-on-fire-action="$ctrl.onFireAction"> </igz-action-menu> </div> <div class="igz-action-panel" data-ng-if="$ctrl.actions.length === 1 && !$ctrl.isDisabled"> <div class="actions-list"> <div class="igz-action-item" data-ng-click="$ctrl.onClickAction($ctrl.actions[0])"> <span class="action-icon" data-ng-class="$ctrl.actions[0].icon"> </span> </div> </div> </div> </form> </div> ');
24871
24883
  }]);
24872
24884
  })();
24873
24885
 
@@ -24891,8 +24903,8 @@ try {
24891
24903
  module = angular.module('iguazio.dashboard-controls.templates', []);
24892
24904
  }
24893
24905
  module.run(['$templateCache', function($templateCache) {
24894
- $templateCache.put('nuclio/common/components/nuclio-search-input/search-input.tpl.html',
24895
- '<div class="ncl-search-input"> <input type="text" class="container-search-input" placeholder="{{$ctrl.placeholder}}" data-ng-keydown="$ctrl.onPressEnter($event)" data-igz-input-blur-on-enter data-ng-model="$ctrl.searchQuery" data-ng-model-options="{ debounce: { \'default\': 500, \'blur\': 0 } }"> <span class="igz-icon-search"></span> </div> ');
24906
+ $templateCache.put('nuclio/common/components/navigation-tabs/navigation-tabs.tpl.html',
24907
+ '<div class="ncl-navigation-tabs-wrapper"> <div class="ncl-navigation-tabs clearfix"> <div class="navigation-tab" data-ng-repeat="item in $ctrl.tabItems track by item.id" data-ui-sref="{{item.uiRoute}}" data-ui-sref-active="active" data-ng-class="{\'ncl-status-indicator\': item.indicator}"> {{item.tabName | uppercase}} <div class="ncl-status-light" data-ng-if="item.indicator" data-ng-class="item.indicator.lightClass"> <div class="ncl-status-tooltip" data-ng-if="item.indicator.tooltipText" data-ng-class="item.indicator.tooltipClass"> <div class="ncl-status-icon" data-ng-if="item.indicator.tooltipIconClass" data-ng-class="item.indicator.tooltipIconClass"> </div> <div class="ncl-status-title"> {{item.indicator.tooltipText}} </div> </div> </div> </div> </div> <div class="test-pane-actions-wrapper"> <div class="igz-action-panel"> <div class="actions-list"> <div class="igz-action-item" data-ng-if="$ctrl.isToggleButtonVisible()" data-ng-class="{\'active\': !$ctrl.isTestPaneClosed}" data-ng-click="$ctrl.toggleTestPane()"> <div class="action-icon igz-icon-test-pane"></div> </div> </div> </div> </div> </div> ');
24896
24908
  }]);
24897
24909
  })();
24898
24910
 
@@ -24903,8 +24915,8 @@ try {
24903
24915
  module = angular.module('iguazio.dashboard-controls.templates', []);
24904
24916
  }
24905
24917
  module.run(['$templateCache', function($templateCache) {
24906
- $templateCache.put('nuclio/common/components/navigation-tabs/navigation-tabs.tpl.html',
24907
- '<div class="ncl-navigation-tabs-wrapper"> <div class="ncl-navigation-tabs clearfix"> <div class="navigation-tab" data-ng-repeat="item in $ctrl.tabItems track by item.id" data-ui-sref="{{item.uiRoute}}" data-ui-sref-active="active" data-ng-class="{\'ncl-status-indicator\': item.indicator}"> {{item.tabName | uppercase}} <div class="ncl-status-light" data-ng-if="item.indicator" data-ng-class="item.indicator.lightClass"> <div class="ncl-status-tooltip" data-ng-if="item.indicator.tooltipText" data-ng-class="item.indicator.tooltipClass"> <div class="ncl-status-icon" data-ng-if="item.indicator.tooltipIconClass" data-ng-class="item.indicator.tooltipIconClass"> </div> <div class="ncl-status-title"> {{item.indicator.tooltipText}} </div> </div> </div> </div> </div> <div class="test-pane-actions-wrapper"> <div class="igz-action-panel"> <div class="actions-list"> <div class="igz-action-item" data-ng-if="$ctrl.isToggleButtonVisible()" data-ng-class="{\'active\': !$ctrl.isTestPaneClosed}" data-ng-click="$ctrl.toggleTestPane()"> <div class="action-icon igz-icon-test-pane"></div> </div> </div> </div> </div> </div> ');
24918
+ $templateCache.put('nuclio/common/components/nuclio-search-input/search-input.tpl.html',
24919
+ '<div class="ncl-search-input"> <input type="text" class="container-search-input" placeholder="{{$ctrl.placeholder}}" data-ng-keydown="$ctrl.onPressEnter($event)" data-igz-input-blur-on-enter data-ng-model="$ctrl.searchQuery" data-ng-model-options="{ debounce: { \'default\': 500, \'blur\': 0 } }"> <span class="igz-icon-search"></span> </div> ');
24908
24920
  }]);
24909
24921
  })();
24910
24922
 
@@ -24947,6 +24959,18 @@ module.run(['$templateCache', function($templateCache) {
24947
24959
  }]);
24948
24960
  })();
24949
24961
 
24962
+ (function(module) {
24963
+ try {
24964
+ module = angular.module('iguazio.dashboard-controls.templates');
24965
+ } catch (e) {
24966
+ module = angular.module('iguazio.dashboard-controls.templates', []);
24967
+ }
24968
+ module.run(['$templateCache', function($templateCache) {
24969
+ $templateCache.put('nuclio/functions/version/version-configuration/version-configuration.tpl.html',
24970
+ '<div class="ncl-version-configuration ncl-version" data-igz-extend-background> <div class="igz-scrollable-container" data-ng-scrollbars data-ng-scrollbars-config="$ctrl.scrollConfig"> <div class="ncl-version-configuration-wrapper"> <div class="row"> <ncl-version-configuration-basic-settings class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-basic-settings> <ncl-version-configuration-resources class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-resources> </div> <div class="row"> <ncl-version-configuration-environment-variables class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-environment-variables> </div> <div class="row"> <ncl-version-configuration-labels class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-labels> <ncl-version-configuration-annotations class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-annotations> </div> <div class="row"> <ncl-version-configuration-volumes class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback()"> </ncl-version-configuration-volumes> <ncl-version-configuration-build class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-build> </div> <div class="row"> <ncl-version-configuration-logging data-ng-if="false" class="configuration-block" data-version="$ctrl.version" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-logging> <ncl-version-configuration-runtime-attributes data-ng-if="$ctrl.isRuntimeBlockVisible()" class="configuration-block runtime-attributes" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-runtime-attributes> <div data-ng-if="$ctrl.isRuntimeBlockVisible()" class="configuration-block invisible"></div> </div> </div> </div> </div> ');
24971
+ }]);
24972
+ })();
24973
+
24950
24974
  (function(module) {
24951
24975
  try {
24952
24976
  module = angular.module('iguazio.dashboard-controls.templates');
@@ -24971,18 +24995,6 @@ module.run(['$templateCache', function($templateCache) {
24971
24995
  }]);
24972
24996
  })();
24973
24997
 
24974
- (function(module) {
24975
- try {
24976
- module = angular.module('iguazio.dashboard-controls.templates');
24977
- } catch (e) {
24978
- module = angular.module('iguazio.dashboard-controls.templates', []);
24979
- }
24980
- module.run(['$templateCache', function($templateCache) {
24981
- $templateCache.put('nuclio/functions/version/version-configuration/version-configuration.tpl.html',
24982
- '<div class="ncl-version-configuration ncl-version" data-igz-extend-background> <div class="igz-scrollable-container" data-ng-scrollbars data-ng-scrollbars-config="$ctrl.scrollConfig"> <div class="ncl-version-configuration-wrapper"> <div class="row"> <ncl-version-configuration-basic-settings class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-basic-settings> <ncl-version-configuration-resources class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-resources> </div> <div class="row"> <ncl-version-configuration-environment-variables class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-environment-variables> </div> <div class="row"> <ncl-version-configuration-labels class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-labels> <ncl-version-configuration-annotations class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-annotations> </div> <div class="row"> <ncl-version-configuration-volumes class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback()"> </ncl-version-configuration-volumes> <ncl-version-configuration-build class="configuration-block" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-build> </div> <div class="row"> <ncl-version-configuration-logging data-ng-if="false" class="configuration-block" data-version="$ctrl.version" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-logging> <ncl-version-configuration-runtime-attributes data-ng-if="$ctrl.isRuntimeBlockVisible()" class="configuration-block runtime-attributes" data-version="$ctrl.version" data-is-function-deploying="$ctrl.isFunctionDeploying()" data-on-change-callback="$ctrl.onConfigurationChangeCallback"> </ncl-version-configuration-runtime-attributes> <div data-ng-if="$ctrl.isRuntimeBlockVisible()" class="configuration-block invisible"></div> </div> </div> </div> </div> ');
24983
- }]);
24984
- })();
24985
-
24986
24998
  (function(module) {
24987
24999
  try {
24988
25000
  module = angular.module('iguazio.dashboard-controls.templates');
@@ -25101,8 +25113,8 @@ try {
25101
25113
  module = angular.module('iguazio.dashboard-controls.templates', []);
25102
25114
  }
25103
25115
  module.run(['$templateCache', function($templateCache) {
25104
- $templateCache.put('nuclio/functions/version/version-code/function-event-pane/test-events-logs/test-events-logs.tpl.html',
25105
- '<div class="ncl-test-events-logs"> <div class="functional-buttons" data-ng-if="$ctrl.logs.length > 0"> <div class="ncl-icon-expand-all" data-ng-click="$ctrl.expandAllRows(true)" data-uib-tooltip="{{ \'functions:EXPAND_ALL\' | i18next }}" data-tooltip-popup-delay="300" data-tooltip-placement="left" data-tooltip-append-to-body="true"> </div> <div class="ncl-icon-collapse-all" data-ng-click="$ctrl.expandAllRows(false)" data-uib-tooltip="{{ \'functions:COLLAPSE_ALL\' | i18next }}" data-tooltip-popup-delay="300" data-tooltip-placement="left" data-tooltip-append-to-body="true"> </div> </div> <div data-ng-repeat="log in $ctrl.logs track by $index"> <div class="collapsed-row text-ellipsis" data-ng-if="log.ui.collapsed"> <span class="igz-icon-right" data-ng-click="$ctrl.collapseRow(log, false)"></span> <div class="level-icon {{$ctrl.getLevelIconClass(log)}}"></div> <span class="date">{{log.time | date: "EEE, MMM d, yyyy, HH:mm:ss\'GMT\'" : "+0000"}}</span> <div class="message text-ellipsis">{{log.message}}</div> <div class="ncl-icon-parameters" data-ng-if="$ctrl.hasAdditionalParameters(log)"></div> </div> <div class="expanded-row" data-ng-if="!log.ui.collapsed"> <div class="header"> <span class="igz-icon-down" data-ng-click="$ctrl.collapseRow(log, true)"></span> <div class="level-icon {{$ctrl.getLevelIconClass(log)}}"></div> <span class="date">{{log.time | date: "EEE, MMM d, yyyy, HH:mm:ss\'GMT\'" : "+0000"}}</span> <div class="ncl-icon-parameters" data-ng-if="$ctrl.hasAdditionalParameters(log)"></div> </div> <div class="expanded-body"> <div class="message">{{log.message}}</div> <div class="error" data-ng-if="log.err">{{log.err}}</div> <div class="parameters" data-ng-if="$ctrl.hasAdditionalParameters(log)"> <span class="parameters-header"> {{ \'common:PARAMETERS\' | i18next }} </span> <div data-ng-repeat="(key, value) in $ctrl.getParameters(log)"> <div class="text-ellipsis labels">{{key}}:</div> <div class="text-ellipsis values">{{value}}</div> </div> </div> </div> </div> </div> <div class="no-logs" data-ng-if="$ctrl.logs.length === 0"> {{ \'functions:NO_LOGS_HAVE_BEEN_FOUND\' | i18next }} </div> </div> ');
25116
+ $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-annotations/version-configuration-annotations.tpl.html',
25117
+ '<div class="ncl-version-configuration-annotations"> <div class="title"> <span>{{ \'functions:ANNOTATIONS\' | i18next }}</span> <igz-more-info data-description="{{$ctrl.tooltip}}" data-trigger="click" data-is-html-enabled="true"> </igz-more-info> </div> <form name="$ctrl.annotationsForm" class="annotations-wrapper" novalidate> <div data-ng-if="$ctrl.annotations.length > 0" class="table-headers"> <div class="key-header"> {{ \'common:KEY\' | i18next }} <igz-more-info data-description="{{$ctrl.keyTooltip}}" data-trigger="click" data-is-html-enabled="true"> </igz-more-info> </div> <div class="value-header"> {{ \'common:VALUE\' | i18next }} </div> </div> <div class="igz-scrollable-container scrollable-annotations" data-ng-scrollbars data-igz-ng-scrollbars-config="{{$ctrl.igzScrollConfig}}" data-ng-scrollbars-config="$ctrl.scrollConfig"> <div class="table-body" data-ng-repeat="annotation in $ctrl.annotations"> <ncl-key-value-input class="new-label-input" data-row-data="annotation" data-use-type="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-item-index="$index" data-validation-rules="$ctrl.validationRules" data-action-handler-callback="$ctrl.handleAction(actionType, index)" data-change-data-callback="$ctrl.onChangeData(newData, index)" data-submit-on-fly="true"> </ncl-key-value-input> </div> </div> <div class="igz-create-button create-annotation-button" data-ng-class="{\'disabled\': $ctrl.isFunctionDeploying()}" data-ng-click="$ctrl.addNewAnnotation($event)"> <span class="igz-icon-add-round"></span> {{ \'functions:CREATE_NEW_ANNOTATION\' | i18next }} </div> </form> </div> ');
25106
25118
  }]);
25107
25119
  })();
25108
25120
 
@@ -25113,8 +25125,8 @@ try {
25113
25125
  module = angular.module('iguazio.dashboard-controls.templates', []);
25114
25126
  }
25115
25127
  module.run(['$templateCache', function($templateCache) {
25116
- $templateCache.put('nuclio/functions/version/version-code/function-event-pane/test-events-navigation-tabs/test-events-navigation-tabs.tpl.html',
25117
- '<div class="ncl-test-events-navigation-tabs"> <div class="test-events-navigation-tab" data-ng-repeat="item in $ctrl.tabItems" data-ng-click="$ctrl.changeActiveTab(item)" data-ng-class="{\'active\': $ctrl.isActiveTab(item)}"> {{item.tabName | uppercase}} <span class="badge" data-ng-if="item.badge">{{item.badge}}</span> </div> <igz-default-dropdown data-ng-if="$ctrl.selectedLogLevel" data-values-array="$ctrl.logLevelValues" data-select-property-only="id" data-selected-item="$ctrl.selectedLogLevel" data-item-select-callback="$ctrl.onChangeLogLevel({selectedLogLevel: item})" data-enable-overlap="true"> </igz-default-dropdown> </div> ');
25128
+ $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-basic-settings/version-configuration-basic-settings.tpl.html',
25129
+ '<div class="ncl-version-configuration-basic-settings"> <div class="title">{{ \'common:BASIC_SETTINGS\' | i18next }}</div> <form name="$ctrl.basicSettingsForm" class="basic-settings-wrapper" novalidate> <div class="row enable-checkbox"> <input type="checkbox" class="small" id="enable" data-ng-disabled="$ctrl.isFunctionDeploying()" data-ng-model="$ctrl.enableFunction" data-ng-change="$ctrl.updateEnableStatus()"> <label for="enable" class="checkbox-inline">{{ \'common:ENABLED\' | i18next }}</label> </div> <div class="row" data-ng-if="$ctrl.isDemoMode()"> <div class="timeout-block"> <div class="label"> <div class="timeout-checkbox"> <input type="checkbox" class="small" id="timeout" data-ng-disabled="$ctrl.isFunctionDeploying()" data-ng-model="$ctrl.enableTimeout"> <label for="timeout" class="checkbox-inline">{{ \'functions:TIMEOUT\' | i18next }}</label> </div> </div> <div class="timeout-values"> <div class="inputs"> <igz-validating-input-field data-field-type="input" data-input-name="min" data-input-value="$ctrl.timeout.min" data-is-focused="false" data-is-disabled="!$ctrl.enableTimeout" data-read-only="$ctrl.isFunctionDeploying()" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="timeout.min" data-form-object="$ctrl.basicSettingsForm" data-validation-is-required="true" data-validation-rules="$ctrl.validationRules.integer" data-placeholder-text="{{ \'functions:MIN\' | i18next }}..."> </igz-validating-input-field> <div class="values-label">{{ \'functions:MIN\' | i18next }}</div> <igz-validating-input-field data-field-type="input" data-input-name="sec" data-input-value="$ctrl.timeout.sec" data-is-focused="false" data-is-disabled="!$ctrl.enableTimeout" data-read-only="$ctrl.isFunctionDeploying()" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="timeout.sec" data-form-object="$ctrl.basicSettingsForm" data-validation-is-required="true" data-validation-rules="$ctrl.validationRules.integer" data-placeholder-text="{{ \'functions:SEC\' | i18next }}..."> </igz-validating-input-field> <div class="values-label">{{ \'functions:SEC\' | i18next }}</div> </div> </div> </div> </div> <div class="row"> <div class="description-block"> <div class="label">{{ \'common:DESCRIPTION\' | i18next }}</div> <igz-validating-input-field data-field-type="input" data-input-name="description" data-input-value="$ctrl.version.spec.description" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="spec.description" data-form-object="$ctrl.basicSettingsForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_DESCRIPTION\' | i18next }}"> </igz-validating-input-field> </div> </div> <div class="row"> <div class="account-block"> <div class="label">{{ \'functions:SERVICE_ACCOUNT\' | i18next }}</div> <igz-validating-input-field data-field-type="input" data-input-name="serviceAccount" data-read-only="$ctrl.isFunctionDeploying()" data-input-value="$ctrl.version.spec.serviceAccount" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="spec.serviceAccount" data-form-object="$ctrl.basicSettingsForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.MY_SERVICE_ACCOUNT\' | i18next }}"> </igz-validating-input-field> </div> </div> <div class="row"> <div class="run-as-user-block"> <div class="label" data-ng-class="{asterisk: $ctrl.version.spec.securityContext.runAsGroup}"> {{ \'common:RUN_AS_USER\' | i18next }} </div> <igz-number-input data-allow-empty-field="true" data-validation-is-required="$ctrl.lodash.isNumber($ctrl.version.spec.securityContext.runAsGroup)" data-value-step="1" data-min-value="0" data-max-value="2147483647" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.basicSettingsForm" data-input-name="run_as_user" data-update-number-input-callback="$ctrl.inputValueCallback(newData, field)" data-update-number-input-field="spec.securityContext.runAsUser" data-current-value="$ctrl.version.spec.securityContext.runAsUser"> </igz-number-input> </div> <div class="run-as-group-block"> <div class="label">{{ \'common:RUN_AS_GROUP\' | i18next }}</div> <igz-number-input data-allow-empty-field="true" data-value-step="1" data-min-value="0" data-max-value="2147483647" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.basicSettingsForm" data-input-name="run_as_group" data-update-number-input-callback="$ctrl.inputValueCallback(newData, field)" data-update-number-input-field="spec.securityContext.runAsGroup" data-current-value="$ctrl.version.spec.securityContext.runAsGroup"> </igz-number-input> </div> <div class="fs-group-block" data-ng-if="!$ctrl.platformIsKube"> <div class="label">{{ \'common:FS_GROUP\' | i18next }}</div> <igz-number-input data-allow-empty-field="true" data-value-step="1" data-min-value="0" data-max-value="2147483647" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.basicSettingsForm" data-input-name="fs_group" data-update-number-input-callback="$ctrl.inputValueCallback(newData, field)" data-update-number-input-field="spec.securityContext.fsGroup" data-current-value="$ctrl.version.spec.securityContext.fsGroup"> </igz-number-input> </div> </div> <div class="row"> <div class="logger-block"> <div class="logger-dropdown"> <span class="label">{{ \'functions:LOGGER_LEVEL\' | i18next }}</span> <igz-default-dropdown data-selected-item="$ctrl.version.spec.loggerSinks[0].level" data-select-property-only="id" data-values-array="$ctrl.logLevelValues" data-item-select-callback="$ctrl.setPriority(item)" data-read-only="$ctrl.isFunctionDeploying()" data-enable-overlap="true" data-prevent-drop-up="true"> </igz-default-dropdown> </div> <div class="logger-input" data-ng-if="$ctrl.isDemoMode()"> <span class="label">{{ \'functions:LOGGER_DESTINATION\' | i18next }}</span> <igz-validating-input-field data-field-type="input" data-input-name="arguments" data-read-only="$ctrl.isFunctionDeploying()" data-input-value="$ctrl.version.spec.loggerSinks[0].sink" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="spec.loggerSinks[0].sink" data-form-object="$ctrl.basicSettingsForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_DESTINATION\' | i18next }}"> </igz-validating-input-field> </div> </div> </div> </form> </div> ');
25118
25130
  }]);
25119
25131
  })();
25120
25132
 
@@ -25125,8 +25137,8 @@ try {
25125
25137
  module = angular.module('iguazio.dashboard-controls.templates', []);
25126
25138
  }
25127
25139
  module.run(['$templateCache', function($templateCache) {
25128
- $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-annotations/version-configuration-annotations.tpl.html',
25129
- '<div class="ncl-version-configuration-annotations"> <div class="title"> <span>{{ \'functions:ANNOTATIONS\' | i18next }}</span> <igz-more-info data-description="{{$ctrl.tooltip}}" data-trigger="click" data-is-html-enabled="true"> </igz-more-info> </div> <form name="$ctrl.annotationsForm" class="annotations-wrapper" novalidate> <div data-ng-if="$ctrl.annotations.length > 0" class="table-headers"> <div class="key-header"> {{ \'common:KEY\' | i18next }} <igz-more-info data-description="{{$ctrl.keyTooltip}}" data-trigger="click" data-is-html-enabled="true"> </igz-more-info> </div> <div class="value-header"> {{ \'common:VALUE\' | i18next }} </div> </div> <div class="igz-scrollable-container scrollable-annotations" data-ng-scrollbars data-igz-ng-scrollbars-config="{{$ctrl.igzScrollConfig}}" data-ng-scrollbars-config="$ctrl.scrollConfig"> <div class="table-body" data-ng-repeat="annotation in $ctrl.annotations"> <ncl-key-value-input class="new-label-input" data-row-data="annotation" data-use-type="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-item-index="$index" data-validation-rules="$ctrl.validationRules" data-action-handler-callback="$ctrl.handleAction(actionType, index)" data-change-data-callback="$ctrl.onChangeData(newData, index)" data-submit-on-fly="true"> </ncl-key-value-input> </div> </div> <div class="igz-create-button create-annotation-button" data-ng-class="{\'disabled\': $ctrl.isFunctionDeploying()}" data-ng-click="$ctrl.addNewAnnotation($event)"> <span class="igz-icon-add-round"></span> {{ \'functions:CREATE_NEW_ANNOTATION\' | i18next }} </div> </form> </div> ');
25140
+ $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-build/version-configuration-build.tpl.html',
25141
+ '<div class="ncl-version-configuration-build" data-ng-class="{ disabled: $ctrl.disabled }"> <div class="configuration-build-title-wrapper"> <div class="title pull-left">{{ \'functions:BUILD\' | i18next }}</div> <igz-action-menu data-ng-if="$ctrl.isDemoMode() && !$ctrl.disabled && !$ctrl.isFunctionDeploying()" data-actions="$ctrl.actions" data-icon-class="ncl-icon-paperclip" data-on-fire-action="$ctrl.onFireAction"> </igz-action-menu> <small class="pull-right" data-ng-if="$ctrl.disabled">{{ \'functions:DISABLED_FOR_IMAGE_CODE_ENTRY_TYPE\' | i18next }}</small> </div> <form name="$ctrl.buildForm" class="build-wrapper" novalidate> <div class="igz-row"> <div class="igz-col-100 build-field build-image-field"> <div class="field-label"> <span>{{ \'functions:IMAGE_NAME\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:IMAGE_NAME_DESCRIPTION\' | i18next:{defaultImageName: $ctrl.version.ui.defaultImageName} }}" data-is-html-enabled="true" data-trigger="click"> </igz-more-info> </div> <div class="align-items-baseline"> <span class="flex-none">{{ $ctrl.version.ui.imageNamePrefix }}</span> <igz-validating-input-field data-field-type="input" data-input-name="imageName" data-input-value="$ctrl.imageName" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_IMAGE_NAME\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-validation-max-length="{{$ctrl.maxLengths.imageName}}" data-validation-pattern="$ctrl.imageNameValidationPattern" data-is-disabled="$ctrl.disabled" class="flex-auto"> </igz-validating-input-field> </div> </div> <div class="igz-col-50 build-field build-base-image-field"> <div class="field-label label-with-tooltip align-items-center"> <span>{{ \'functions:BASE_IMAGE\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:BASE_IMAGE_DESCRIPTION\' | i18next }}" data-trigger="click"> </igz-more-info> </div> <igz-validating-input-field data-field-type="input" data-input-name="baseImage" data-input-value="$ctrl.version.spec.build.baseImage" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_BASE_IMAGE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="spec.build.baseImage" data-is-disabled="$ctrl.disabled"> </igz-validating-input-field> </div> <div class="igz-col-50 build-field build-onbuild-image-field"> <div class="field-label label-with-tooltip align-items-center"> <span>{{ \'functions:ONBUILD_IMAGE\' | i18next }}</span> <igz-more-info data-description="{{$ctrl.onBuildImageDescription}}" data-default-tooltip-placement="left" data-trigger="click"> </igz-more-info> </div> <igz-validating-input-field data-field-type="input" data-input-name="onbuildImage" data-input-value="$ctrl.version.spec.build.onbuildImage" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_ONBUILD_IMAGE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="spec.build.onbuildImage" data-is-disabled="$ctrl.disabled"> </igz-validating-input-field> </div> <div class="igz-col-100 build-field"> <div class="field-label"> <span>{{ \'functions:BUILD_COMMANDS\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:BUILD_COMMANDS_DESCRIPTION\' | i18next }}" data-trigger="click"> </igz-more-info> </div> <igz-validating-input-field data-field-type="textarea" data-input-name="commands" data-input-value="$ctrl.build.commands" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_COMMAND_ON_EACH_LINE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="commands" data-is-disabled="$ctrl.disabled" class="build-textarea-input build-commands-input"> </igz-validating-input-field> </div> <div class="igz-col-100 build-field"> <div class="field-label label-with-tooltip align-items-center"> <span>{{ \'functions:READINESS_TIMEOUT_SECONDS\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:READINESS_TIMEOUT_SECONDS_DESCRIPTION\' | i18next:{default: $ctrl.defaultFunctionConfig.spec.readinessTimeoutSeconds} }}" data-trigger="click"> </igz-more-info> </div> <igz-number-input data-form-object="$ctrl.buildForm" data-input-name="readinessTimeoutSeconds" data-current-value="$ctrl.version.spec.readinessTimeoutSeconds" data-update-number-input-callback="$ctrl.inputValueCallback(newData, field)" data-update-number-input-field="spec.readinessTimeoutSeconds" data-allow-empty-field="true" data-value-step="1" data-validation-is-required="false" data-min-value="1" data-is-disabled="$ctrl.disabled || $ctrl.isFunctionDeploying()"> </igz-number-input> </div> <div class="igz-col-100 build-field" data-ng-if="$ctrl.version.spec.runtime === \'java\'"> <div class="field-label">{{ \'functions:REPOSITORIES\' | i18next }}</div> <igz-validating-input-field data-field-type="textarea" data-input-name="repositories" data-input-value="$ctrl.build.runtimeAttributes.repositories" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_REPOSITORY_ON_EACH_LINE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="runtimeAttributes.repositories" class="build-textarea-input" data-is-disabled="$ctrl.disabled"> </igz-validating-input-field> </div> <div class="igz-col-100 build-field" data-ng-if="$ctrl.version.spec.runtime === \'java\'"> <div class="field-label">{{ \'functions:DEPENDENCIES\' | i18next }}</div> <igz-validating-input-field data-field-type="textarea" data-input-name="dependencies" data-input-value="$ctrl.build.dependencies" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_DEPENDENCY_ON_EACH_LINE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="dependencies" class="build-textarea-input" data-is-disabled="$ctrl.disabled"> </igz-validating-input-field> </div> <div class="igz-col-100 build-field build-checkboxes"> <div class="checkbox-block"> <input type="checkbox" class="small" id="noCache" data-ng-model="$ctrl.version.spec.build.noCache" data-ng-disabled="$ctrl.disabled || $ctrl.isFunctionDeploying()"> <label for="noCache" class="checkbox-inline">{{ \'functions:DISABLE_CACHE\' | i18next }}</label> <igz-more-info data-description="{{ \'functions:TOOLTIP.DISABLE_CACHE\' | i18next }}" data-trigger="click" data-default-tooltip-placement="top"> </igz-more-info> </div> <div class="checkbox-block" data-ng-if="$ctrl.platformKindIsKube"> <input type="checkbox" class="small" id="wait-readiness-timeout-before-failure" data-ng-model="$ctrl.version.spec.waitReadinessTimeoutBeforeFailure" data-ng-disabled="$ctrl.disabled || $ctrl.isFunctionDeploying()"> <label for="wait-readiness-timeout-before-failure" class="checkbox-inline">{{ \'functions:ALWAYS_WAIT_FOR_READINESS_TIMEOUT_EXPIRATION\' | i18next }}</label> <igz-more-info data-description="{{ \'functions:TOOLTIP.ALWAYS_WAIT_FOR_READINESS_TIMEOUT_EXPIRATION\' | i18next }}" data-trigger="click" data-default-tooltip-placement="top-left"> </igz-more-info> </div> </div> <div class="igz-col-100 build-field files-field"> <div class="uploading-files"> <div class="uploading-proccess-wrapper" data-ng-class="{\'one-file-uploaded\': $ctrl.file.uploaded || $ctrl.script.uploaded}" data-ng-if="$ctrl.getFileConfig().uploading && $ctrl.getFileConfig().name"> <div class="file-block uploading text-ellipsis" data-ng-class="{\'uploading-file\': $ctrl.file.uploading}"> <span class="{{$ctrl.getFileConfig().icon}}"></span> <button class="build-close-button"> <span class="ncl-icon-close"></span> </button> <span class="file-name"> {{$ctrl.getFileConfig().name}} </span> <div class="progress"> <div class="progress-bar" role="uib-progressbar" aria-valuemin="0" aria-valuemax="100" data-ng-style="{\'width\': $ctrl.getFileConfig().progress}"> </div> </div> </div> </div> <div class="uploaded-wrapper" data-ng-if="$ctrl.file.uploaded|| $ctrl.script.uploaded"> <div class="file-block uploaded text-ellipsis" data-ng-if="$ctrl.script.uploaded" data-ng-class="{\'one-file-uploaded\': $ctrl.file.uploaded}"> <span class="ncl-icon-script"></span> <span class="file-name"> {{$ctrl.script.name}} <span class="uploaded-file-directory">(/usr/bin/mybinary)</span> </span> <button class="build-close-button" data-ng-click="$ctrl.deleteFile(\'script\')"> <span class="ncl-icon-close"></span> </button> </div> <div class="file-block uploaded text-ellipsis uploaded-file" data-ng-if="$ctrl.file.uploaded"> <span class="ncl-icon-file"></span> <span class="file-name"> {{$ctrl.file.name}} <span class="uploaded-file-directory">(/usr/bin/mybinary)</span> </span> <button class="build-close-button" data-ng-click="$ctrl.deleteFile(\'file\')"> <span class="ncl-icon-close"></span> </button> </div> </div> </div> </div> </div> </form> </div> ');
25130
25142
  }]);
25131
25143
  })();
25132
25144
 
@@ -25137,8 +25149,8 @@ try {
25137
25149
  module = angular.module('iguazio.dashboard-controls.templates', []);
25138
25150
  }
25139
25151
  module.run(['$templateCache', function($templateCache) {
25140
- $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-basic-settings/version-configuration-basic-settings.tpl.html',
25141
- '<div class="ncl-version-configuration-basic-settings"> <div class="title">{{ \'common:BASIC_SETTINGS\' | i18next }}</div> <form name="$ctrl.basicSettingsForm" class="basic-settings-wrapper" novalidate> <div class="row enable-checkbox"> <input type="checkbox" class="small" id="enable" data-ng-disabled="$ctrl.isFunctionDeploying()" data-ng-model="$ctrl.enableFunction" data-ng-change="$ctrl.updateEnableStatus()"> <label for="enable" class="checkbox-inline">{{ \'common:ENABLED\' | i18next }}</label> </div> <div class="row" data-ng-if="$ctrl.isDemoMode()"> <div class="timeout-block"> <div class="label"> <div class="timeout-checkbox"> <input type="checkbox" class="small" id="timeout" data-ng-disabled="$ctrl.isFunctionDeploying()" data-ng-model="$ctrl.enableTimeout"> <label for="timeout" class="checkbox-inline">{{ \'functions:TIMEOUT\' | i18next }}</label> </div> </div> <div class="timeout-values"> <div class="inputs"> <igz-validating-input-field data-field-type="input" data-input-name="min" data-input-value="$ctrl.timeout.min" data-is-focused="false" data-is-disabled="!$ctrl.enableTimeout" data-read-only="$ctrl.isFunctionDeploying()" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="timeout.min" data-form-object="$ctrl.basicSettingsForm" data-validation-is-required="true" data-validation-rules="$ctrl.validationRules.integer" data-placeholder-text="{{ \'functions:MIN\' | i18next }}..."> </igz-validating-input-field> <div class="values-label">{{ \'functions:MIN\' | i18next }}</div> <igz-validating-input-field data-field-type="input" data-input-name="sec" data-input-value="$ctrl.timeout.sec" data-is-focused="false" data-is-disabled="!$ctrl.enableTimeout" data-read-only="$ctrl.isFunctionDeploying()" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="timeout.sec" data-form-object="$ctrl.basicSettingsForm" data-validation-is-required="true" data-validation-rules="$ctrl.validationRules.integer" data-placeholder-text="{{ \'functions:SEC\' | i18next }}..."> </igz-validating-input-field> <div class="values-label">{{ \'functions:SEC\' | i18next }}</div> </div> </div> </div> </div> <div class="row"> <div class="description-block"> <div class="label">{{ \'common:DESCRIPTION\' | i18next }}</div> <igz-validating-input-field data-field-type="input" data-input-name="description" data-input-value="$ctrl.version.spec.description" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="spec.description" data-form-object="$ctrl.basicSettingsForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_DESCRIPTION\' | i18next }}"> </igz-validating-input-field> </div> </div> <div class="row"> <div class="account-block"> <div class="label">{{ \'functions:SERVICE_ACCOUNT\' | i18next }}</div> <igz-validating-input-field data-field-type="input" data-input-name="serviceAccount" data-read-only="$ctrl.isFunctionDeploying()" data-input-value="$ctrl.version.spec.serviceAccount" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="spec.serviceAccount" data-form-object="$ctrl.basicSettingsForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.MY_SERVICE_ACCOUNT\' | i18next }}"> </igz-validating-input-field> </div> </div> <div class="row"> <div class="run-as-user-block"> <div class="label" data-ng-class="{asterisk: $ctrl.version.spec.securityContext.runAsGroup}"> {{ \'common:RUN_AS_USER\' | i18next }} </div> <igz-number-input data-allow-empty-field="true" data-validation-is-required="$ctrl.lodash.isNumber($ctrl.version.spec.securityContext.runAsGroup)" data-value-step="1" data-min-value="0" data-max-value="2147483647" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.basicSettingsForm" data-input-name="run_as_user" data-update-number-input-callback="$ctrl.inputValueCallback(newData, field)" data-update-number-input-field="spec.securityContext.runAsUser" data-current-value="$ctrl.version.spec.securityContext.runAsUser"> </igz-number-input> </div> <div class="run-as-group-block"> <div class="label">{{ \'common:RUN_AS_GROUP\' | i18next }}</div> <igz-number-input data-allow-empty-field="true" data-value-step="1" data-min-value="0" data-max-value="2147483647" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.basicSettingsForm" data-input-name="run_as_group" data-update-number-input-callback="$ctrl.inputValueCallback(newData, field)" data-update-number-input-field="spec.securityContext.runAsGroup" data-current-value="$ctrl.version.spec.securityContext.runAsGroup"> </igz-number-input> </div> <div class="fs-group-block" data-ng-if="!$ctrl.platformIsKube"> <div class="label">{{ \'common:FS_GROUP\' | i18next }}</div> <igz-number-input data-allow-empty-field="true" data-value-step="1" data-min-value="0" data-max-value="2147483647" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.basicSettingsForm" data-input-name="fs_group" data-update-number-input-callback="$ctrl.inputValueCallback(newData, field)" data-update-number-input-field="spec.securityContext.fsGroup" data-current-value="$ctrl.version.spec.securityContext.fsGroup"> </igz-number-input> </div> </div> <div class="row"> <div class="logger-block"> <div class="logger-dropdown"> <span class="label">{{ \'functions:LOGGER_LEVEL\' | i18next }}</span> <igz-default-dropdown data-selected-item="$ctrl.version.spec.loggerSinks[0].level" data-select-property-only="id" data-values-array="$ctrl.logLevelValues" data-item-select-callback="$ctrl.setPriority(item)" data-read-only="$ctrl.isFunctionDeploying()" data-enable-overlap="true" data-prevent-drop-up="true"> </igz-default-dropdown> </div> <div class="logger-input" data-ng-if="$ctrl.isDemoMode()"> <span class="label">{{ \'functions:LOGGER_DESTINATION\' | i18next }}</span> <igz-validating-input-field data-field-type="input" data-input-name="arguments" data-read-only="$ctrl.isFunctionDeploying()" data-input-value="$ctrl.version.spec.loggerSinks[0].sink" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="spec.loggerSinks[0].sink" data-form-object="$ctrl.basicSettingsForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_DESTINATION\' | i18next }}"> </igz-validating-input-field> </div> </div> </div> </form> </div> ');
25152
+ $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-logging/version-configuration-logging.tpl.html',
25153
+ '<div class="ncl-version-configuration-logging"> <div class="title">{{ \'functions:LOGGING\' | i18next }}</div> <div class="row"> <form name="$ctrl.loggingForm" class="logging-wrapper" novalidate></form> </div> </div> ');
25142
25154
  }]);
25143
25155
  })();
25144
25156
 
@@ -25149,8 +25161,8 @@ try {
25149
25161
  module = angular.module('iguazio.dashboard-controls.templates', []);
25150
25162
  }
25151
25163
  module.run(['$templateCache', function($templateCache) {
25152
- $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-build/version-configuration-build.tpl.html',
25153
- '<div class="ncl-version-configuration-build" data-ng-class="{ disabled: $ctrl.disabled }"> <div class="configuration-build-title-wrapper"> <div class="title pull-left">{{ \'functions:BUILD\' | i18next }}</div> <igz-action-menu data-ng-if="$ctrl.isDemoMode() && !$ctrl.disabled && !$ctrl.isFunctionDeploying()" data-actions="$ctrl.actions" data-icon-class="ncl-icon-paperclip" data-on-fire-action="$ctrl.onFireAction"> </igz-action-menu> <small class="pull-right" data-ng-if="$ctrl.disabled">{{ \'functions:DISABLED_FOR_IMAGE_CODE_ENTRY_TYPE\' | i18next }}</small> </div> <form name="$ctrl.buildForm" class="build-wrapper" novalidate> <div class="igz-row"> <div class="igz-col-100 build-field build-image-field"> <div class="field-label"> <span>{{ \'functions:IMAGE_NAME\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:IMAGE_NAME_DESCRIPTION\' | i18next:{defaultImageName: $ctrl.version.ui.defaultImageName} }}" data-is-html-enabled="true" data-trigger="click"> </igz-more-info> </div> <div class="align-items-baseline"> <span class="flex-none">{{ $ctrl.version.ui.imageNamePrefix }}</span> <igz-validating-input-field data-field-type="input" data-input-name="imageName" data-input-value="$ctrl.imageName" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_IMAGE_NAME\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-validation-max-length="{{$ctrl.maxLengths.imageName}}" data-validation-pattern="$ctrl.imageNameValidationPattern" data-is-disabled="$ctrl.disabled" class="flex-auto"> </igz-validating-input-field> </div> </div> <div class="igz-col-50 build-field build-base-image-field"> <div class="field-label label-with-tooltip align-items-center"> <span>{{ \'functions:BASE_IMAGE\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:BASE_IMAGE_DESCRIPTION\' | i18next }}" data-trigger="click"> </igz-more-info> </div> <igz-validating-input-field data-field-type="input" data-input-name="baseImage" data-input-value="$ctrl.version.spec.build.baseImage" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_BASE_IMAGE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="spec.build.baseImage" data-is-disabled="$ctrl.disabled"> </igz-validating-input-field> </div> <div class="igz-col-50 build-field build-onbuild-image-field"> <div class="field-label label-with-tooltip align-items-center"> <span>{{ \'functions:ONBUILD_IMAGE\' | i18next }}</span> <igz-more-info data-description="{{$ctrl.onBuildImageDescription}}" data-default-tooltip-placement="left" data-trigger="click"> </igz-more-info> </div> <igz-validating-input-field data-field-type="input" data-input-name="onbuildImage" data-input-value="$ctrl.version.spec.build.onbuildImage" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_ONBUILD_IMAGE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="spec.build.onbuildImage" data-is-disabled="$ctrl.disabled"> </igz-validating-input-field> </div> <div class="igz-col-100 build-field"> <div class="field-label"> <span>{{ \'functions:BUILD_COMMANDS\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:BUILD_COMMANDS_DESCRIPTION\' | i18next }}" data-trigger="click"> </igz-more-info> </div> <igz-validating-input-field data-field-type="textarea" data-input-name="commands" data-input-value="$ctrl.build.commands" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_COMMAND_ON_EACH_LINE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="commands" data-is-disabled="$ctrl.disabled" class="build-textarea-input build-commands-input"> </igz-validating-input-field> </div> <div class="igz-col-100 build-field"> <div class="field-label label-with-tooltip align-items-center"> <span>{{ \'functions:READINESS_TIMEOUT_SECONDS\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:READINESS_TIMEOUT_SECONDS_DESCRIPTION\' | i18next:{default: $ctrl.defaultFunctionConfig.spec.readinessTimeoutSeconds} }}" data-trigger="click"> </igz-more-info> </div> <igz-number-input data-form-object="$ctrl.buildForm" data-input-name="readinessTimeoutSeconds" data-current-value="$ctrl.version.spec.readinessTimeoutSeconds" data-update-number-input-callback="$ctrl.inputValueCallback(newData, field)" data-update-number-input-field="spec.readinessTimeoutSeconds" data-allow-empty-field="true" data-value-step="1" data-validation-is-required="false" data-min-value="1" data-is-disabled="$ctrl.disabled || $ctrl.isFunctionDeploying()"> </igz-number-input> </div> <div class="igz-col-100 build-field" data-ng-if="$ctrl.version.spec.runtime === \'java\'"> <div class="field-label">{{ \'functions:REPOSITORIES\' | i18next }}</div> <igz-validating-input-field data-field-type="textarea" data-input-name="repositories" data-input-value="$ctrl.build.runtimeAttributes.repositories" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_REPOSITORY_ON_EACH_LINE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="runtimeAttributes.repositories" class="build-textarea-input" data-is-disabled="$ctrl.disabled"> </igz-validating-input-field> </div> <div class="igz-col-100 build-field" data-ng-if="$ctrl.version.spec.runtime === \'java\'"> <div class="field-label">{{ \'functions:DEPENDENCIES\' | i18next }}</div> <igz-validating-input-field data-field-type="textarea" data-input-name="dependencies" data-input-value="$ctrl.build.dependencies" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.buildForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_DEPENDENCY_ON_EACH_LINE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="dependencies" class="build-textarea-input" data-is-disabled="$ctrl.disabled"> </igz-validating-input-field> </div> <div class="igz-col-100 build-field build-checkboxes"> <div class="checkbox-block"> <input type="checkbox" class="small" id="noCache" data-ng-model="$ctrl.version.spec.build.noCache" data-ng-disabled="$ctrl.disabled || $ctrl.isFunctionDeploying()"> <label for="noCache" class="checkbox-inline">{{ \'functions:DISABLE_CACHE\' | i18next }}</label> <igz-more-info data-description="{{ \'functions:TOOLTIP.DISABLE_CACHE\' | i18next }}" data-trigger="click" data-default-tooltip-placement="top"> </igz-more-info> </div> <div class="checkbox-block" data-ng-if="$ctrl.platformKindIsKube"> <input type="checkbox" class="small" id="wait-readiness-timeout-before-failure" data-ng-model="$ctrl.version.spec.waitReadinessTimeoutBeforeFailure" data-ng-disabled="$ctrl.disabled || $ctrl.isFunctionDeploying()"> <label for="wait-readiness-timeout-before-failure" class="checkbox-inline">{{ \'functions:ALWAYS_WAIT_FOR_READINESS_TIMEOUT_EXPIRATION\' | i18next }}</label> <igz-more-info data-description="{{ \'functions:TOOLTIP.ALWAYS_WAIT_FOR_READINESS_TIMEOUT_EXPIRATION\' | i18next }}" data-trigger="click" data-default-tooltip-placement="top-left"> </igz-more-info> </div> </div> <div class="igz-col-100 build-field files-field"> <div class="uploading-files"> <div class="uploading-proccess-wrapper" data-ng-class="{\'one-file-uploaded\': $ctrl.file.uploaded || $ctrl.script.uploaded}" data-ng-if="$ctrl.getFileConfig().uploading && $ctrl.getFileConfig().name"> <div class="file-block uploading text-ellipsis" data-ng-class="{\'uploading-file\': $ctrl.file.uploading}"> <span class="{{$ctrl.getFileConfig().icon}}"></span> <button class="build-close-button"> <span class="ncl-icon-close"></span> </button> <span class="file-name"> {{$ctrl.getFileConfig().name}} </span> <div class="progress"> <div class="progress-bar" role="uib-progressbar" aria-valuemin="0" aria-valuemax="100" data-ng-style="{\'width\': $ctrl.getFileConfig().progress}"> </div> </div> </div> </div> <div class="uploaded-wrapper" data-ng-if="$ctrl.file.uploaded|| $ctrl.script.uploaded"> <div class="file-block uploaded text-ellipsis" data-ng-if="$ctrl.script.uploaded" data-ng-class="{\'one-file-uploaded\': $ctrl.file.uploaded}"> <span class="ncl-icon-script"></span> <span class="file-name"> {{$ctrl.script.name}} <span class="uploaded-file-directory">(/usr/bin/mybinary)</span> </span> <button class="build-close-button" data-ng-click="$ctrl.deleteFile(\'script\')"> <span class="ncl-icon-close"></span> </button> </div> <div class="file-block uploaded text-ellipsis uploaded-file" data-ng-if="$ctrl.file.uploaded"> <span class="ncl-icon-file"></span> <span class="file-name"> {{$ctrl.file.name}} <span class="uploaded-file-directory">(/usr/bin/mybinary)</span> </span> <button class="build-close-button" data-ng-click="$ctrl.deleteFile(\'file\')"> <span class="ncl-icon-close"></span> </button> </div> </div> </div> </div> </div> </form> </div> ');
25164
+ $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-labels/version-configuration-labels.tpl.html',
25165
+ '<div class="ncl-version-configuration-labels"> <div class="title"> <span>{{ \'common:LABELS\' | i18next }}</span> <igz-more-info data-description="{{$ctrl.tooltip}}" data-trigger="click" data-is-html-enabled="true"> </igz-more-info> </div> <form name="$ctrl.labelsForm" class="labels-wrapper" novalidate> <div data-ng-if="$ctrl.labels.length > 0" class="table-headers"> <div class="key-header"> {{ \'common:KEY\' | i18next }} <igz-more-info data-description="{{$ctrl.keyTooltip}}" data-trigger="click" data-is-html-enabled="true"> </igz-more-info> </div> <div class="value-header"> {{ \'common:VALUE\' | i18next }} </div> </div> <div class="igz-scrollable-container scrollable-labels" data-ng-scrollbars data-igz-ng-scrollbars-config="{{$ctrl.igzScrollConfig}}" data-ng-scrollbars-config="$ctrl.scrollConfig"> <div class="table-body" data-ng-repeat="label in $ctrl.labels"> <ncl-key-value-input class="new-label-input" data-row-data="label" data-item-index="$index" data-use-type="false" data-validation-rules="$ctrl.validationRules" data-is-disabled="$ctrl.isLabelsDisabled() || $ctrl.isFunctionDeploying()" data-action-handler-callback="$ctrl.handleAction(actionType, index)" data-change-data-callback="$ctrl.onChangeData(newData, index)" data-submit-on-fly="true" data-key-tooltip="$ctrl.isLabelsDisabled() ? $ctrl.addNewLabelTooltip : \'\'" data-value-tooltip="$ctrl.isLabelsDisabled() ? $ctrl.addNewLabelTooltip : \'\'"> </ncl-key-value-input> </div> </div> <div class="igz-create-button create-label-button" data-ng-class="{\'disabled\': $ctrl.isLabelsDisabled() || $ctrl.isFunctionDeploying()}" data-ng-click="$ctrl.addNewLabel($event)" data-uib-tooltip="{{$ctrl.isLabelsDisabled() ? $ctrl.addNewLabelTooltip : \'\'}}" data-tooltip-append-to-body="true" data-tooltip-placement="right" data-tooltip-popup-delay="100"> <span class="igz-icon-add-round"></span> {{ \'functions:CREATE_NEW_LABEL\' | i18next }} </div> </form> </div> ');
25154
25166
  }]);
25155
25167
  })();
25156
25168
 
@@ -25173,8 +25185,8 @@ try {
25173
25185
  module = angular.module('iguazio.dashboard-controls.templates', []);
25174
25186
  }
25175
25187
  module.run(['$templateCache', function($templateCache) {
25176
- $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-logging/version-configuration-logging.tpl.html',
25177
- '<div class="ncl-version-configuration-logging"> <div class="title">{{ \'functions:LOGGING\' | i18next }}</div> <div class="row"> <form name="$ctrl.loggingForm" class="logging-wrapper" novalidate></form> </div> </div> ');
25188
+ $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-resources/version-configuration-resources.tpl.html',
25189
+ '<div class="ncl-version-configuration-resources"> <form name="$ctrl.resourcesForm" class="resources-wrapper" novalidate> <div class="title">{{ \'common:RESOURCES\' | i18next }}</div> <div class="row"> <div class="igz-row form-row" data-ng-if="$ctrl.selectedPodTolerationOption"> <div class="igz-col-40 row-title">{{ \'functions:RUN_ON_SPOT_NODES\' | i18next }} <igz-more-info data-description="{{$ctrl.selectedPodTolerationOption.tooltip}}"></igz-more-info> </div> <div class="igz-col-20 input-wrapper"></div> <div class="igz-col-40 input-wrapper"> <div class="row-input preemtion-mode-input"> <igz-default-dropdown data-values-array="$ctrl.podTolerationsOptions" data-selected-item="$ctrl.selectedPodTolerationOption" data-is-disabled="$ctrl.isFunctionDeploying()" data-item-select-callback="$ctrl.podTolerationDropdownCallback(item, isItemChanged, field)" data-item-select-field="spec.preemptionMode"> </igz-default-dropdown> </div> </div> </div> <div class="igz-row form-row"> <div class="igz-col-40 row-title">{{ \'functions:PODS_PRIORITY\' | i18next }}</div> <div class="igz-col-20 input-wrapper"></div> <div class="igz-col-40 input-wrapper"> <div class="row-input priority-class-input"> <igz-default-dropdown data-values-array="$ctrl.podsPriorityOptions" data-selected-item="$ctrl.selectedPodsPriority" data-is-disabled="$ctrl.isFunctionDeploying()" data-item-select-callback="$ctrl.podsPriorityDropdownCallback(item, isItemChanged, field)" data-item-select-field="spec.priorityClassName"> </igz-default-dropdown> </div> </div> </div> <div class="igz-row form-row range-inputs-row"> <div class="igz-col-20 row-title">{{ \'common:MEMORY\' | i18next }} <igz-more-info data-trigger="click" data-is-html-enabled="true" data-is-open="$ctrl.memoryWarningOpen" data-icon-type="{{$ctrl.memoryWarningOpen ? \'warn\' : \'info\'}}" data-description="{{ \'common:RESOURCES_WARNING_LIMIT_FILLED_REQUEST_EMPTY\' | i18next:{ when: \'the function is deployed\' } }}"> </igz-more-info> </div> <div class="igz-col-40 input-wrapper"> <div class="input-title">{{ \'common:REQUEST\' | i18next }}</div> <div class="row-input memory-input memory-number-input"> <igz-number-input data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.resourcesForm" data-input-name="requestMemory" data-update-number-input-callback="$ctrl.memoryInputCallback(newData, field)" data-update-number-input-field="resources.requests.memory" data-min-value="1" data-current-value="$ctrl.resources.requests.memory" data-value-step="1"> </igz-number-input> </div> <div class="row-input memory-input memory-size-dropdown"> <igz-default-dropdown data-read-only="$ctrl.isFunctionDeploying()" data-values-array="$ctrl.dropdownOptions" data-selected-item="$ctrl.selectedRequestUnit" data-item-select-callback="$ctrl.memoryDropdownCallback(item, isItemChanges, field)" data-item-select-field="spec.resources.requests.memory"> </igz-default-dropdown> </div> </div> <div class="igz-col-40 input-wrapper"> <div class="input-title">{{ \'common:LIMIT\' | i18next }}</div> <div class="row-input memory-input memory-number-input"> <igz-number-input data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.resourcesForm" data-input-name="limitsMemory" data-min-value="1" data-update-number-input-callback="$ctrl.memoryInputCallback(newData, field)" data-update-number-input-field="resources.limits.memory" data-current-value="$ctrl.resources.limits.memory" data-value-step="1"> </igz-number-input> </div> <div class="row-input memory-input memory-size-dropdown"> <igz-default-dropdown data-read-only="$ctrl.isFunctionDeploying()" data-values-array="$ctrl.dropdownOptions" data-selected-item="$ctrl.selectedLimitUnit" data-item-select-callback="$ctrl.memoryDropdownCallback(item, isItemChanges, field)" data-item-select-field="spec.resources.limits.memory"> </igz-default-dropdown> </div> </div> </div> <div class="igz-row form-row range-inputs-row"> <div class="igz-col-20 row-title">{{ \'common:CPU\' | i18next }}</div> <div class="igz-col-40 input-wrapper"> <div class="input-title">{{ \'common:REQUEST\' | i18next }}</div> <div class="row-input cpu-number-input"> <igz-number-input data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.resourcesForm" data-input-name="requestCpu" data-placeholder="{{ $ctrl.selectedCpuRequestItem.placeholder }}" data-update-number-input-callback="$ctrl.cpuInputCallback(newData, field)" data-update-number-input-field="resources.requests.cpu" data-min-value="$ctrl.selectedCpuRequestItem.minValue" data-precision="{{ $ctrl.selectedCpuRequestItem.precision }}" data-value-step="{{ $ctrl.selectedCpuRequestItem.step }}" data-current-value="$ctrl.resources.requests.cpu"> </igz-number-input> </div> <div class="row-input cpu-dropdown"> <igz-default-dropdown data-read-only="$ctrl.isFunctionDeploying()" data-values-array="$ctrl.cpuDropdownOptions" data-selected-item="$ctrl.selectedCpuRequestItem" data-item-select-callback="$ctrl.cpuDropdownCallback(item, isItemChanged, field)" data-item-select-field="selectedCpuRequestItem"> </igz-default-dropdown> </div> </div> <div class="igz-col-40 input-wrapper"> <div class="input-title">{{ \'common:LIMIT\' | i18next }}</div> <div class="row-input cpu-number-input"> <igz-number-input data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.resourcesForm" data-input-name="limitsCpu" data-placeholder="{{ $ctrl.selectedCpuLimitItem.placeholder }}" data-update-number-input-callback="$ctrl.cpuInputCallback(newData, field)" data-update-number-input-field="resources.limits.cpu" data-min-value="$ctrl.selectedCpuLimitItem.minValue" data-precision="{{ $ctrl.selectedCpuLimitItem.precision }}" data-value-step="{{ $ctrl.selectedCpuLimitItem.step }}" data-current-value="$ctrl.resources.limits.cpu"> </igz-number-input> </div> <div class="row-input cpu-dropdown"> <igz-default-dropdown data-read-only="$ctrl.isFunctionDeploying()" data-values-array="$ctrl.cpuDropdownOptions" data-selected-item="$ctrl.selectedCpuLimitItem" data-item-select-callback="$ctrl.cpuDropdownCallback(item, isItemChanged, field)" data-item-select-field="selectedCpuLimitItem"> </igz-default-dropdown> </div> </div> </div> <div class="igz-row form-row range-inputs-row"> <div class="igz-col-20 row-title">{{ \'common:GPU\' | i18next }}</div> <div class="igz-col-40 input-wrapper"></div> <div class="igz-col-40 input-wrapper" data-uib-tooltip="{{ \'functions:TOOLTIP.GPU_LIMIT\' | i18next }}" data-tooltip-append-to-body="true" data-tooltip-placement="bottom" data-tooltip-popup-delay="500"> <div class="input-title">{{ \'common:LIMIT\' | i18next }}</div> <div class="row-input gpu-number-input"> <igz-number-input data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.resourcesForm" data-input-name="limitsGpu" data-update-number-input-callback="$ctrl.gpuInputCallback(newData, field)" data-update-number-input-field="limits" data-min-value="1" data-max-value="4" data-value-step="1" data-current-value="$ctrl.resources.limits.gpu"> </igz-number-input> </div> </div> </div> <div class="igz-row form-row range-inputs-row"> <div class="igz-col-20 row-title"> {{ \'common:REPLICAS\' | i18next }} </div> <div class="igz-col-40 input-wrapper"> <div class="input-title"> {{ \'functions:MIN\' | i18next }} <igz-more-info data-description="{{ \'functions:MIN_REPLICAS\' | i18next:{default: $ctrl.defaultFunctionConfig.spec.minReplicas} }}" data-default-tooltip-placement="top" data-trigger="click"> </igz-more-info> </div> <div class="row-input replicas-number-input"> <igz-number-input data-form-object="$ctrl.resourcesForm" data-input-name="minReplicas" data-current-value="$ctrl.minReplicas" data-update-number-input-callback="$ctrl.replicasInputCallback(newData, field)" data-update-number-input-field="minReplicas" data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-placeholder="" data-precision="0" data-value-step="1" data-min-value="0" data-max-value="$ctrl.maxReplicas || Infinity"> </igz-number-input> </div> </div> <div class="igz-col-40 input-wrapper"> <div class="input-title" data-ng-class="{ asterisk: $ctrl.minReplicas === 0 }"> {{ \'functions:MAX\' | i18next }} <igz-more-info data-description="{{ \'functions:MAX_REPLICAS\' | i18next:{default: $ctrl.defaultFunctionConfig.spec.maxReplicas} }}" data-default-tooltip-placement="top" data-trigger="click"> </igz-more-info> </div> <div class="row-input replicas-number-input"> <igz-number-input data-form-object="$ctrl.resourcesForm" data-input-name="maxReplicas" data-current-value="$ctrl.maxReplicas" data-update-number-input-callback="$ctrl.replicasInputCallback(newData, field)" data-update-number-input-field="maxReplicas" data-allow-empty-field="true" data-is-disabled="$ctrl.isFunctionDeploying()" data-placeholder="{{ $ctrl.minReplicas === 0 ? (\'functions:PLACEHOLDER.MAX_REQUIRED\' | i18next) : \'\' }}" data-precision="0" data-value-step="1" data-validation-is-required="$ctrl.minReplicas === 0" data-min-value="$ctrl.minReplicas || 1"> </igz-number-input> </div> </div> </div> <div class="igz-row form-row align-items-center slider-block" data-ng-if="$ctrl.isInactivityWindowShown()"> <div class="igz-col-25 row-title no-margin"> <span>{{ \'common:INACTIVITY_WINDOW\' | i18next }}</span> <igz-more-info data-description="{{ \'common:INACTIVITY_WINDOW_DESCRIPTION\' | i18next }}" data-trigger="click"> </igz-more-info> </div> <div class="igz-col-75 row-input slider" data-uib-tooltip="{{ \'functions:TOOLTIP.INACTIVITY_WINDOW\' | i18next }}" data-tooltip-enable="$ctrl.windowSizeSlider.options.disabled" data-tooltip-append-to-body="true" data-tooltip-placement="bottom" data-tooltip-popup-delay="500"> <rzslider class="rzslider" data-rz-slider-model="$ctrl.windowSizeSlider.value" data-rz-slider-options="$ctrl.windowSizeSlider.options"> </rzslider> </div> </div> <div class="igz-row form-row range-inputs-row slider-block"> <div class="igz-col-25 row-title no-margin target-cpu-title"> <span>{{ \'common:TARGET_CPU\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:TARGET_CPU_DESCRIPTION\' | i18next:{default: $ctrl.defaultFunctionConfig.spec.targetCPU} }}" data-trigger="click" data-is-html-enabled="true"> </igz-more-info> </div> <div class="igz-col-75 row-input slider"> <igz-slider-input-block data-slider-config="$ctrl.targetCpuSliderConfig" data-measure-units="null" data-value-unit="$ctrl.targetCpuValueUnit" data-slider-block-updating-broadcast="" data-on-change-callback="$ctrl.sliderInputCallback" data-update-slider-input="spec.targetCPU" data-allow-full-range="true" data-uib-tooltip="{{ \'functions:TOOLTIP.TARGET_CPU\' | i18next }}" data-tooltip-enable="$ctrl.targetCpuSliderConfig.options.disabled" data-tooltip-append-to-body="true" data-tooltip-placement="bottom" data-tooltip-popup-delay="500"> </igz-slider-input-block> </div> </div> </div> </form> <form name="$ctrl.nodeSelectorsForm" novalidate> <div class="igz-row-flex"> <div class="title">{{ \'functions:NODE_SELECTORS\' | i18next }}</div> <a class="link" data-ng-class="{ \'disabled\': $ctrl.isFunctionDeploying() }" data-ng-click="$ctrl.handleRevertToDefaultsClick()" data-ng-hide="$ctrl.revertToDefaultsBtnIsHidden"> {{ \'functions:REVERT_TO_DEFAULTS\' | i18next }} </a> </div> <div class="row"> <div class="igz-row form-row"> <div class="table-body" data-ng-repeat="nodeSelector in $ctrl.nodeSelectors"> <ncl-key-value-input class="node-selectors" data-row-data="nodeSelector" data-item-index="$index" data-use-type="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-validation-rules="$ctrl.nodeSelectorsValidationRules" data-action-handler-callback="$ctrl.handleNodeSelectorsAction(actionType, index)" data-change-data-callback="$ctrl.onChangeNodeSelectorsData(newData, index)" data-submit-on-fly="true"> </ncl-key-value-input> </div> <div class="igz-create-button" data-ng-class="{ \'disabled\': $ctrl.isFunctionDeploying() }" data-ng-click="$ctrl.addNewNodeSelector($event)"> <span class="igz-icon-add-round"></span> {{ \'common:CREATE_NEW_ENTRY\' | i18next }} </div> </div> </div> </form> </div> ');
25178
25190
  }]);
25179
25191
  })();
25180
25192
 
@@ -25185,8 +25197,8 @@ try {
25185
25197
  module = angular.module('iguazio.dashboard-controls.templates', []);
25186
25198
  }
25187
25199
  module.run(['$templateCache', function($templateCache) {
25188
- $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-resources/version-configuration-resources.tpl.html',
25189
- '<div class="ncl-version-configuration-resources"> <form name="$ctrl.resourcesForm" class="resources-wrapper" novalidate> <div class="title">{{ \'common:RESOURCES\' | i18next }}</div> <div class="row"> <div class="igz-row form-row" data-ng-if="$ctrl.selectedPodTolerationOption"> <div class="igz-col-40 row-title">{{ \'functions:RUN_ON_SPOT_NODES\' | i18next }} <igz-more-info data-description="{{$ctrl.selectedPodTolerationOption.tooltip}}"></igz-more-info> </div> <div class="igz-col-20 input-wrapper"></div> <div class="igz-col-40 input-wrapper"> <div class="row-input preemtion-mode-input"> <igz-default-dropdown data-values-array="$ctrl.podTolerationsOptions" data-selected-item="$ctrl.selectedPodTolerationOption" data-is-disabled="$ctrl.isFunctionDeploying()" data-item-select-callback="$ctrl.podTolerationDropdownCallback(item, isItemChanged, field)" data-item-select-field="spec.preemptionMode"> </igz-default-dropdown> </div> </div> </div> <div class="igz-row form-row"> <div class="igz-col-40 row-title">{{ \'functions:PODS_PRIORITY\' | i18next }}</div> <div class="igz-col-20 input-wrapper"></div> <div class="igz-col-40 input-wrapper"> <div class="row-input priority-class-input"> <igz-default-dropdown data-values-array="$ctrl.podsPriorityOptions" data-selected-item="$ctrl.selectedPodsPriority" data-is-disabled="$ctrl.isFunctionDeploying()" data-item-select-callback="$ctrl.podsPriorityDropdownCallback(item, isItemChanged, field)" data-item-select-field="spec.priorityClassName"> </igz-default-dropdown> </div> </div> </div> <div class="igz-row form-row range-inputs-row"> <div class="igz-col-20 row-title">{{ \'common:MEMORY\' | i18next }} <igz-more-info data-trigger="click" data-is-html-enabled="true" data-is-open="$ctrl.memoryWarningOpen" data-icon-type="{{$ctrl.memoryWarningOpen ? \'warn\' : \'info\'}}" data-description="{{ \'common:RESOURCES_WARNING_LIMIT_FILLED_REQUEST_EMPTY\' | i18next:{ when: \'the function is deployed\' } }}"> </igz-more-info> </div> <div class="igz-col-40 input-wrapper"> <div class="input-title">{{ \'common:REQUEST\' | i18next }}</div> <div class="row-input memory-input memory-number-input"> <igz-number-input data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.resourcesForm" data-input-name="requestMemory" data-update-number-input-callback="$ctrl.memoryInputCallback(newData, field)" data-update-number-input-field="resources.requests.memory" data-min-value="1" data-current-value="$ctrl.resources.requests.memory" data-value-step="1"> </igz-number-input> </div> <div class="row-input memory-input memory-size-dropdown"> <igz-default-dropdown data-read-only="$ctrl.isFunctionDeploying()" data-values-array="$ctrl.dropdownOptions" data-selected-item="$ctrl.selectedRequestUnit" data-item-select-callback="$ctrl.memoryDropdownCallback(item, isItemChanges, field)" data-item-select-field="spec.resources.requests.memory"> </igz-default-dropdown> </div> </div> <div class="igz-col-40 input-wrapper"> <div class="input-title">{{ \'common:LIMIT\' | i18next }}</div> <div class="row-input memory-input memory-number-input"> <igz-number-input data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.resourcesForm" data-input-name="limitsMemory" data-min-value="1" data-update-number-input-callback="$ctrl.memoryInputCallback(newData, field)" data-update-number-input-field="resources.limits.memory" data-current-value="$ctrl.resources.limits.memory" data-value-step="1"> </igz-number-input> </div> <div class="row-input memory-input memory-size-dropdown"> <igz-default-dropdown data-read-only="$ctrl.isFunctionDeploying()" data-values-array="$ctrl.dropdownOptions" data-selected-item="$ctrl.selectedLimitUnit" data-item-select-callback="$ctrl.memoryDropdownCallback(item, isItemChanges, field)" data-item-select-field="spec.resources.limits.memory"> </igz-default-dropdown> </div> </div> </div> <div class="igz-row form-row range-inputs-row"> <div class="igz-col-20 row-title">{{ \'common:CPU\' | i18next }}</div> <div class="igz-col-40 input-wrapper"> <div class="input-title">{{ \'common:REQUEST\' | i18next }}</div> <div class="row-input cpu-number-input"> <igz-number-input data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.resourcesForm" data-input-name="requestCpu" data-placeholder="{{ $ctrl.selectedCpuRequestItem.placeholder }}" data-update-number-input-callback="$ctrl.cpuInputCallback(newData, field)" data-update-number-input-field="resources.requests.cpu" data-min-value="$ctrl.selectedCpuRequestItem.minValue" data-precision="{{ $ctrl.selectedCpuRequestItem.precision }}" data-value-step="{{ $ctrl.selectedCpuRequestItem.step }}" data-current-value="$ctrl.resources.requests.cpu"> </igz-number-input> </div> <div class="row-input cpu-dropdown"> <igz-default-dropdown data-read-only="$ctrl.isFunctionDeploying()" data-values-array="$ctrl.cpuDropdownOptions" data-selected-item="$ctrl.selectedCpuRequestItem" data-item-select-callback="$ctrl.cpuDropdownCallback(item, isItemChanged, field)" data-item-select-field="selectedCpuRequestItem"> </igz-default-dropdown> </div> </div> <div class="igz-col-40 input-wrapper"> <div class="input-title">{{ \'common:LIMIT\' | i18next }}</div> <div class="row-input cpu-number-input"> <igz-number-input data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.resourcesForm" data-input-name="limitsCpu" data-placeholder="{{ $ctrl.selectedCpuLimitItem.placeholder }}" data-update-number-input-callback="$ctrl.cpuInputCallback(newData, field)" data-update-number-input-field="resources.limits.cpu" data-min-value="$ctrl.selectedCpuLimitItem.minValue" data-precision="{{ $ctrl.selectedCpuLimitItem.precision }}" data-value-step="{{ $ctrl.selectedCpuLimitItem.step }}" data-current-value="$ctrl.resources.limits.cpu"> </igz-number-input> </div> <div class="row-input cpu-dropdown"> <igz-default-dropdown data-read-only="$ctrl.isFunctionDeploying()" data-values-array="$ctrl.cpuDropdownOptions" data-selected-item="$ctrl.selectedCpuLimitItem" data-item-select-callback="$ctrl.cpuDropdownCallback(item, isItemChanged, field)" data-item-select-field="selectedCpuLimitItem"> </igz-default-dropdown> </div> </div> </div> <div class="igz-row form-row range-inputs-row"> <div class="igz-col-20 row-title">{{ \'common:GPU\' | i18next }}</div> <div class="igz-col-40 input-wrapper"></div> <div class="igz-col-40 input-wrapper" data-uib-tooltip="{{ \'functions:TOOLTIP.GPU_LIMIT\' | i18next }}" data-tooltip-append-to-body="true" data-tooltip-placement="bottom" data-tooltip-popup-delay="500"> <div class="input-title">{{ \'common:LIMIT\' | i18next }}</div> <div class="row-input gpu-number-input"> <igz-number-input data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.resourcesForm" data-input-name="limitsGpu" data-update-number-input-callback="$ctrl.gpuInputCallback(newData, field)" data-update-number-input-field="limits" data-min-value="1" data-max-value="4" data-value-step="1" data-current-value="$ctrl.resources.limits.gpu"> </igz-number-input> </div> </div> </div> <div class="igz-row form-row range-inputs-row"> <div class="igz-col-20 row-title"> {{ \'common:REPLICAS\' | i18next }} </div> <div class="igz-col-40 input-wrapper"> <div class="input-title"> {{ \'functions:MIN\' | i18next }} <igz-more-info data-description="{{ \'functions:MIN_REPLICAS\' | i18next:{default: $ctrl.defaultFunctionConfig.spec.minReplicas} }}" data-default-tooltip-placement="top" data-trigger="click"> </igz-more-info> </div> <div class="row-input replicas-number-input"> <igz-number-input data-form-object="$ctrl.resourcesForm" data-input-name="minReplicas" data-current-value="$ctrl.minReplicas" data-update-number-input-callback="$ctrl.replicasInputCallback(newData, field)" data-update-number-input-field="minReplicas" data-allow-empty-field="true" data-validation-is-required="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-placeholder="" data-precision="0" data-value-step="1" data-min-value="0" data-max-value="$ctrl.maxReplicas || Infinity"> </igz-number-input> </div> </div> <div class="igz-col-40 input-wrapper"> <div class="input-title" data-ng-class="{ asterisk: $ctrl.minReplicas === 0 }"> {{ \'functions:MAX\' | i18next }} <igz-more-info data-description="{{ \'functions:MAX_REPLICAS\' | i18next:{default: $ctrl.defaultFunctionConfig.spec.maxReplicas} }}" data-default-tooltip-placement="top" data-trigger="click"> </igz-more-info> </div> <div class="row-input replicas-number-input"> <igz-number-input data-form-object="$ctrl.resourcesForm" data-input-name="maxReplicas" data-current-value="$ctrl.maxReplicas" data-update-number-input-callback="$ctrl.replicasInputCallback(newData, field)" data-update-number-input-field="maxReplicas" data-allow-empty-field="true" data-is-disabled="$ctrl.isFunctionDeploying()" data-placeholder="{{ $ctrl.minReplicas === 0 ? (\'functions:PLACEHOLDER.MAX_REQUIRED\' | i18next) : \'\' }}" data-precision="0" data-value-step="1" data-validation-is-required="$ctrl.minReplicas === 0" data-min-value="$ctrl.minReplicas || 1"> </igz-number-input> </div> </div> </div> <div class="igz-row form-row align-items-center slider-block" data-ng-if="$ctrl.isInactivityWindowShown()"> <div class="igz-col-25 row-title no-margin"> <span>{{ \'common:INACTIVITY_WINDOW\' | i18next }}</span> <igz-more-info data-description="{{ \'common:INACTIVITY_WINDOW_DESCRIPTION\' | i18next }}" data-trigger="click"> </igz-more-info> </div> <div class="igz-col-75 row-input slider" data-uib-tooltip="{{ \'functions:TOOLTIP.INACTIVITY_WINDOW\' | i18next }}" data-tooltip-enable="$ctrl.windowSizeSlider.options.disabled" data-tooltip-append-to-body="true" data-tooltip-placement="bottom" data-tooltip-popup-delay="500"> <rzslider class="rzslider" data-rz-slider-model="$ctrl.windowSizeSlider.value" data-rz-slider-options="$ctrl.windowSizeSlider.options"> </rzslider> </div> </div> <div class="igz-row form-row range-inputs-row slider-block"> <div class="igz-col-25 row-title no-margin target-cpu-title"> <span>{{ \'common:TARGET_CPU\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:TARGET_CPU_DESCRIPTION\' | i18next:{default: $ctrl.defaultFunctionConfig.spec.targetCPU} }}" data-trigger="click" data-is-html-enabled="true"> </igz-more-info> </div> <div class="igz-col-75 row-input slider"> <igz-slider-input-block data-slider-config="$ctrl.targetCpuSliderConfig" data-measure-units="null" data-value-unit="$ctrl.targetCpuValueUnit" data-slider-block-updating-broadcast="" data-on-change-callback="$ctrl.sliderInputCallback" data-update-slider-input="spec.targetCPU" data-allow-full-range="true" data-uib-tooltip="{{ \'functions:TOOLTIP.TARGET_CPU\' | i18next }}" data-tooltip-enable="$ctrl.targetCpuSliderConfig.options.disabled" data-tooltip-append-to-body="true" data-tooltip-placement="bottom" data-tooltip-popup-delay="500"> </igz-slider-input-block> </div> </div> </div> </form> <form name="$ctrl.nodeSelectorsForm" novalidate> <div class="igz-row-flex"> <div class="title">{{ \'functions:NODE_SELECTORS\' | i18next }}</div> <a class="link" data-ng-class="{ \'disabled\': $ctrl.isFunctionDeploying() }" data-ng-click="$ctrl.handleRevertToDefaultsClick()" data-ng-hide="$ctrl.revertToDefaultsBtnIsHidden"> {{ \'functions:REVERT_TO_DEFAULTS\' | i18next }} </a> </div> <div class="row"> <div class="igz-row form-row"> <div class="table-body" data-ng-repeat="nodeSelector in $ctrl.nodeSelectors"> <ncl-key-value-input class="node-selectors" data-row-data="nodeSelector" data-item-index="$index" data-use-type="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-validation-rules="$ctrl.nodeSelectorsValidationRules" data-action-handler-callback="$ctrl.handleNodeSelectorsAction(actionType, index)" data-change-data-callback="$ctrl.onChangeNodeSelectorsData(newData, index)" data-submit-on-fly="true"> </ncl-key-value-input> </div> <div class="igz-create-button" data-ng-class="{ \'disabled\': $ctrl.isFunctionDeploying() }" data-ng-click="$ctrl.addNewNodeSelector($event)"> <span class="igz-icon-add-round"></span> {{ \'common:CREATE_NEW_ENTRY\' | i18next }} </div> </div> </div> </form> </div> ');
25200
+ $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-volumes/version-configuration-volumes.tpl.html',
25201
+ '<div class="ncl-version-configuration-volumes"> <div class="title"> <span>{{ \'functions:VOLUMES\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:TOOLTIP.VOLUMES\' | i18next }}" data-trigger="click"> </igz-more-info> </div> <form name="$ctrl.volumesForm" class="volumes-wrapper" novalidate> <div class="ncl-version-volume"> <div class="common-table"> <div data-ng-if="$ctrl.volumes.length > 0" class="common-table-header item-header"> <div class="common-table-cell item-name"> {{ \'common:NAME\' | i18next }} </div> <div class="common-table-cell item-class"> {{ \'common:TYPE\' | i18next }} </div> <div class="common-table-cell item-info"> {{ \'functions:MOUNT_PATH_PARAMS\' | i18next }} </div> </div> <div class="common-table-body"> <div class="igz-scrollable-container scrollable-volumes" data-ng-scrollbars data-igz-ng-scrollbars-config="{{$ctrl.igzScrollConfig}}" data-ng-scrollbars-config="$ctrl.scrollConfig"> <ncl-collapsing-row data-ng-repeat="volume in $ctrl.volumes" data-item="volume" data-item-index="$index" data-type="volume" data-read-only="$ctrl.isFunctionDeploying()" data-action-handler-callback="$ctrl.handleAction(actionType, selectedItem, index)"> <ncl-edit-item class="common-table-cells-container edit-volume-row" data-item="volume" data-class-list="$ctrl.classList" data-class-placeholder="{{ \'functions:PLACEHOLDER.SELECT_TYPE\' | i18next }}" data-type="volume" data-read-only="$ctrl.isFunctionDeploying()" data-validation-rules="$ctrl.validationRules" data-max-lengths="$ctrl.maxLengths" data-on-submit-callback="$ctrl.editVolumeCallback(item)"> </ncl-edit-item> </ncl-collapsing-row> </div> </div> </div> </div> <div class="igz-create-button create-volume-button" data-ng-class="{\'disabled\': $ctrl.isFunctionDeploying()}" data-ng-click="$ctrl.createVolume($event)"> <span class="igz-icon-add-round"></span> {{ \'functions:CREATE_NEW_VOLUME\' | i18next }} </div> </form> </div> ');
25190
25202
  }]);
25191
25203
  })();
25192
25204
 
@@ -25197,8 +25209,8 @@ try {
25197
25209
  module = angular.module('iguazio.dashboard-controls.templates', []);
25198
25210
  }
25199
25211
  module.run(['$templateCache', function($templateCache) {
25200
- $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-labels/version-configuration-labels.tpl.html',
25201
- '<div class="ncl-version-configuration-labels"> <div class="title"> <span>{{ \'functions:LABELS\' | i18next }}</span> <igz-more-info data-description="{{$ctrl.tooltip}}" data-trigger="click" data-is-html-enabled="true"> </igz-more-info> </div> <form name="$ctrl.labelsForm" class="labels-wrapper" novalidate> <div data-ng-if="$ctrl.labels.length > 0" class="table-headers"> <div class="key-header"> {{ \'common:KEY\' | i18next }} <igz-more-info data-description="{{$ctrl.keyTooltip}}" data-trigger="click" data-is-html-enabled="true"> </igz-more-info> </div> <div class="value-header"> {{ \'common:VALUE\' | i18next }} </div> </div> <div class="igz-scrollable-container scrollable-labels" data-ng-scrollbars data-igz-ng-scrollbars-config="{{$ctrl.igzScrollConfig}}" data-ng-scrollbars-config="$ctrl.scrollConfig"> <div class="table-body" data-ng-repeat="label in $ctrl.labels"> <ncl-key-value-input class="new-label-input" data-row-data="label" data-item-index="$index" data-use-type="false" data-validation-rules="$ctrl.validationRules" data-is-disabled="$ctrl.isLabelsDisabled() || $ctrl.isFunctionDeploying()" data-action-handler-callback="$ctrl.handleAction(actionType, index)" data-change-data-callback="$ctrl.onChangeData(newData, index)" data-submit-on-fly="true" data-key-tooltip="$ctrl.isLabelsDisabled() ? $ctrl.addNewLabelTooltip : \'\'" data-value-tooltip="$ctrl.isLabelsDisabled() ? $ctrl.addNewLabelTooltip : \'\'"> </ncl-key-value-input> </div> </div> <div class="igz-create-button create-label-button" data-ng-class="{\'disabled\': $ctrl.isLabelsDisabled() || $ctrl.isFunctionDeploying()}" data-ng-click="$ctrl.addNewLabel($event)" data-uib-tooltip="{{$ctrl.isLabelsDisabled() ? $ctrl.addNewLabelTooltip : \'\'}}" data-tooltip-append-to-body="true" data-tooltip-placement="right" data-tooltip-popup-delay="100"> <span class="igz-icon-add-round"></span> {{ \'functions:CREATE_NEW_LABEL\' | i18next }} </div> </form> </div> ');
25212
+ $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-runtime-attributes/version-configuration-runtime-attributes.tpl.html',
25213
+ '<div class="ncl-version-configuration-runtime-attributes"> <div class="title">{{ \'functions:RUNTIME_ATTRIBUTES\' | i18next }}</div> <form name="$ctrl.runtimeAttributesForm" class="runtime-attributes-wrapper" novalidate> <div class="row" data-ng-class="{\'info-row\': $ctrl.version.spec.runtime !== \'shell\'}" data-ng-if="$ctrl.version.spec.runtime !== \'java\'"> <div class="runtime-title"> <span class="label">{{ \'functions:RUNTIME\' | i18next }}</span> <div class="runtime"> {{$ctrl.version.spec.runtime}} </div> </div> <div class="arguments-input" data-ng-if="$ctrl.version.spec.runtime === \'shell\'"> <span class="label">{{ \'common:ARGUMENTS\' | i18next }}</span> <igz-validating-input-field data-field-type="input" data-input-name="arguments" data-input-value="$ctrl.runtimeAttributes.arguments" data-read-only="$ctrl.isFunctionDeploying()" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="arguments" data-form-object="$ctrl.runtimeAttributesForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_ARGUMENTS\' | i18next }}"> </igz-validating-input-field> </div> </div> <div class="row igz-col-100 info-row" data-ng-if="$ctrl.version.spec.runtime === \'java\'"> <div class="row igz-col-100 info-row"> <span class="field-label">{{ \'functions:JVM_OPTIONS\' | i18next }}</span> <igz-validating-input-field data-field-type="textarea" data-input-name="jvmOptions" data-input-value="$ctrl.runtimeAttributes.jvmOptions" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.runtimeAttributesForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_OPTION_ON_EACH_LINE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="jvmOptions" class="build-command-field java-attribute"> </igz-validating-input-field> </div> </div> <div class="row info-row" data-ng-if="$ctrl.version.spec.runtime === \'shell\'"> <span class="label">{{ \'functions:RESPONSE_HEADERS\' | i18next }}</span> <div data-ng-if="$ctrl.attributes.length > 0" class="table-headers"> <div class="key-header">{{ \'common:KEY\' | i18next }}</div> <div class="value-header">{{ \'common:VALUE\' | i18next }}</div> </div> <div class="igz-scrollable-container" data-ng-scrollbars data-igz-ng-scrollbars-config="{{$ctrl.igzScrollConfig}}" data-ng-scrollbars-config="$ctrl.scrollConfig"> <div class="table-body" data-ng-repeat="attribute in $ctrl.attributes"> <ncl-key-value-input class="new-label-input" data-row-data="attribute" data-use-type="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-item-index="$index" data-action-handler-callback="$ctrl.handleAction(actionType, index)" data-change-data-callback="$ctrl.onChangeData(newData, index)" data-submit-on-fly="true"> </ncl-key-value-input> </div> </div> <div class="igz-create-button create-label-button" data-ng-class="{\'disabled\': $ctrl.isFunctionDeploying()}" data-ng-click="$ctrl.addNewAttribute($event)"> <span class="igz-icon-add-round"></span> {{ \'functions:CREATE_NEW_RUNTIME_ATTRIBUTE\' | i18next }} </div> </div> </form> </div> ');
25202
25214
  }]);
25203
25215
  })();
25204
25216
 
@@ -25209,8 +25221,8 @@ try {
25209
25221
  module = angular.module('iguazio.dashboard-controls.templates', []);
25210
25222
  }
25211
25223
  module.run(['$templateCache', function($templateCache) {
25212
- $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-runtime-attributes/version-configuration-runtime-attributes.tpl.html',
25213
- '<div class="ncl-version-configuration-runtime-attributes"> <div class="title">{{ \'functions:RUNTIME_ATTRIBUTES\' | i18next }}</div> <form name="$ctrl.runtimeAttributesForm" class="runtime-attributes-wrapper" novalidate> <div class="row" data-ng-class="{\'info-row\': $ctrl.version.spec.runtime !== \'shell\'}" data-ng-if="$ctrl.version.spec.runtime !== \'java\'"> <div class="runtime-title"> <span class="label">{{ \'functions:RUNTIME\' | i18next }}</span> <div class="runtime"> {{$ctrl.version.spec.runtime}} </div> </div> <div class="arguments-input" data-ng-if="$ctrl.version.spec.runtime === \'shell\'"> <span class="label">{{ \'common:ARGUMENTS\' | i18next }}</span> <igz-validating-input-field data-field-type="input" data-input-name="arguments" data-input-value="$ctrl.runtimeAttributes.arguments" data-read-only="$ctrl.isFunctionDeploying()" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="arguments" data-form-object="$ctrl.runtimeAttributesForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_ARGUMENTS\' | i18next }}"> </igz-validating-input-field> </div> </div> <div class="row igz-col-100 info-row" data-ng-if="$ctrl.version.spec.runtime === \'java\'"> <div class="row igz-col-100 info-row"> <span class="field-label">{{ \'functions:JVM_OPTIONS\' | i18next }}</span> <igz-validating-input-field data-field-type="textarea" data-input-name="jvmOptions" data-input-value="$ctrl.runtimeAttributes.jvmOptions" data-is-focused="false" data-read-only="$ctrl.isFunctionDeploying()" data-form-object="$ctrl.runtimeAttributesForm" data-placeholder-text="{{ \'functions:PLACEHOLDER.ENTER_OPTION_ON_EACH_LINE\' | i18next }}" data-update-data-callback="$ctrl.inputValueCallback(newData, field)" data-update-data-field="jvmOptions" class="build-command-field java-attribute"> </igz-validating-input-field> </div> </div> <div class="row info-row" data-ng-if="$ctrl.version.spec.runtime === \'shell\'"> <span class="label">{{ \'functions:RESPONSE_HEADERS\' | i18next }}</span> <div data-ng-if="$ctrl.attributes.length > 0" class="table-headers"> <div class="key-header">{{ \'common:KEY\' | i18next }}</div> <div class="value-header">{{ \'common:VALUE\' | i18next }}</div> </div> <div class="igz-scrollable-container" data-ng-scrollbars data-igz-ng-scrollbars-config="{{$ctrl.igzScrollConfig}}" data-ng-scrollbars-config="$ctrl.scrollConfig"> <div class="table-body" data-ng-repeat="attribute in $ctrl.attributes"> <ncl-key-value-input class="new-label-input" data-row-data="attribute" data-use-type="false" data-is-disabled="$ctrl.isFunctionDeploying()" data-item-index="$index" data-action-handler-callback="$ctrl.handleAction(actionType, index)" data-change-data-callback="$ctrl.onChangeData(newData, index)" data-submit-on-fly="true"> </ncl-key-value-input> </div> </div> <div class="igz-create-button create-label-button" data-ng-class="{\'disabled\': $ctrl.isFunctionDeploying()}" data-ng-click="$ctrl.addNewAttribute($event)"> <span class="igz-icon-add-round"></span> {{ \'functions:CREATE_NEW_RUNTIME_ATTRIBUTE\' | i18next }} </div> </div> </form> </div> ');
25224
+ $templateCache.put('nuclio/functions/version/version-code/function-event-pane/test-events-logs/test-events-logs.tpl.html',
25225
+ '<div class="ncl-test-events-logs"> <div class="functional-buttons" data-ng-if="$ctrl.logs.length > 0"> <div class="ncl-icon-expand-all" data-ng-click="$ctrl.expandAllRows(true)" data-uib-tooltip="{{ \'functions:EXPAND_ALL\' | i18next }}" data-tooltip-popup-delay="300" data-tooltip-placement="left" data-tooltip-append-to-body="true"> </div> <div class="ncl-icon-collapse-all" data-ng-click="$ctrl.expandAllRows(false)" data-uib-tooltip="{{ \'functions:COLLAPSE_ALL\' | i18next }}" data-tooltip-popup-delay="300" data-tooltip-placement="left" data-tooltip-append-to-body="true"> </div> </div> <div data-ng-repeat="log in $ctrl.logs track by $index"> <div class="collapsed-row text-ellipsis" data-ng-if="log.ui.collapsed"> <span class="igz-icon-right" data-ng-click="$ctrl.collapseRow(log, false)"></span> <div class="level-icon {{$ctrl.getLevelIconClass(log)}}"></div> <span class="date">{{log.time | date: "EEE, MMM d, yyyy, HH:mm:ss\'GMT\'" : "+0000"}}</span> <div class="message text-ellipsis">{{log.message}}</div> <div class="ncl-icon-parameters" data-ng-if="$ctrl.hasAdditionalParameters(log)"></div> </div> <div class="expanded-row" data-ng-if="!log.ui.collapsed"> <div class="header"> <span class="igz-icon-down" data-ng-click="$ctrl.collapseRow(log, true)"></span> <div class="level-icon {{$ctrl.getLevelIconClass(log)}}"></div> <span class="date">{{log.time | date: "EEE, MMM d, yyyy, HH:mm:ss\'GMT\'" : "+0000"}}</span> <div class="ncl-icon-parameters" data-ng-if="$ctrl.hasAdditionalParameters(log)"></div> </div> <div class="expanded-body"> <div class="message">{{log.message}}</div> <div class="error" data-ng-if="log.err">{{log.err}}</div> <div class="parameters" data-ng-if="$ctrl.hasAdditionalParameters(log)"> <span class="parameters-header"> {{ \'common:PARAMETERS\' | i18next }} </span> <div data-ng-repeat="(key, value) in $ctrl.getParameters(log)"> <div class="text-ellipsis labels">{{key}}:</div> <div class="text-ellipsis values">{{value}}</div> </div> </div> </div> </div> </div> <div class="no-logs" data-ng-if="$ctrl.logs.length === 0"> {{ \'functions:NO_LOGS_HAVE_BEEN_FOUND\' | i18next }} </div> </div> ');
25214
25226
  }]);
25215
25227
  })();
25216
25228
 
@@ -25221,8 +25233,8 @@ try {
25221
25233
  module = angular.module('iguazio.dashboard-controls.templates', []);
25222
25234
  }
25223
25235
  module.run(['$templateCache', function($templateCache) {
25224
- $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-volumes/version-configuration-volumes.tpl.html',
25225
- '<div class="ncl-version-configuration-volumes"> <div class="title"> <span>{{ \'functions:VOLUMES\' | i18next }}</span> <igz-more-info data-description="{{ \'functions:TOOLTIP.VOLUMES\' | i18next }}" data-trigger="click"> </igz-more-info> </div> <form name="$ctrl.volumesForm" class="volumes-wrapper" novalidate> <div class="ncl-version-volume"> <div class="common-table"> <div data-ng-if="$ctrl.volumes.length > 0" class="common-table-header item-header"> <div class="common-table-cell item-name"> {{ \'common:NAME\' | i18next }} </div> <div class="common-table-cell item-class"> {{ \'common:TYPE\' | i18next }} </div> <div class="common-table-cell item-info"> {{ \'functions:MOUNT_PATH_PARAMS\' | i18next }} </div> </div> <div class="common-table-body"> <div class="igz-scrollable-container scrollable-volumes" data-ng-scrollbars data-igz-ng-scrollbars-config="{{$ctrl.igzScrollConfig}}" data-ng-scrollbars-config="$ctrl.scrollConfig"> <ncl-collapsing-row data-ng-repeat="volume in $ctrl.volumes" data-item="volume" data-item-index="$index" data-type="volume" data-read-only="$ctrl.isFunctionDeploying()" data-action-handler-callback="$ctrl.handleAction(actionType, selectedItem, index)"> <ncl-edit-item class="common-table-cells-container edit-volume-row" data-item="volume" data-class-list="$ctrl.classList" data-class-placeholder="{{ \'functions:PLACEHOLDER.SELECT_TYPE\' | i18next }}" data-type="volume" data-read-only="$ctrl.isFunctionDeploying()" data-validation-rules="$ctrl.validationRules" data-max-lengths="$ctrl.maxLengths" data-on-submit-callback="$ctrl.editVolumeCallback(item)"> </ncl-edit-item> </ncl-collapsing-row> </div> </div> </div> </div> <div class="igz-create-button create-volume-button" data-ng-class="{\'disabled\': $ctrl.isFunctionDeploying()}" data-ng-click="$ctrl.createVolume($event)"> <span class="igz-icon-add-round"></span> {{ \'functions:CREATE_NEW_VOLUME\' | i18next }} </div> </form> </div> ');
25236
+ $templateCache.put('nuclio/functions/version/version-code/function-event-pane/test-events-navigation-tabs/test-events-navigation-tabs.tpl.html',
25237
+ '<div class="ncl-test-events-navigation-tabs"> <div class="test-events-navigation-tab" data-ng-repeat="item in $ctrl.tabItems" data-ng-click="$ctrl.changeActiveTab(item)" data-ng-class="{\'active\': $ctrl.isActiveTab(item)}"> {{item.tabName | uppercase}} <span class="badge" data-ng-if="item.badge">{{item.badge}}</span> </div> <igz-default-dropdown data-ng-if="$ctrl.selectedLogLevel" data-values-array="$ctrl.logLevelValues" data-select-property-only="id" data-selected-item="$ctrl.selectedLogLevel" data-item-select-callback="$ctrl.onChangeLogLevel({selectedLogLevel: item})" data-enable-overlap="true"> </igz-default-dropdown> </div> ');
25226
25238
  }]);
25227
25239
  })();
25228
25240