{"version":3,"sources":["jsdelivr-header.js","/npm/iguazio.dashboard-controls-custom@0.23.12-p1/dist/js/iguazio.dashboard-controls.js"],"names":[],"mappings":"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","file":"/npm/iguazio.dashboard-controls-custom@0.23.12-p1/dist/js/iguazio.dashboard-controls.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/iguazio.dashboard-controls-custom@0.23.12-p1/dist/js/iguazio.dashboard-controls.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\n\n(function () {\n    'use strict';\n\n    angular.module('iguazio.dashboard-controls', ['iguazio.dashboard-controls.templates', 'ui.router', 'ui.bootstrap', 'ngFileUpload', 'ngDialog', 'ngSanitize', 'download', 'angular-yamljs', 'jm.i18next', 'angular-i18next']);\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    angular.module('iguazio.dashboard-controls').directive('igzInputBlurOnEnter', igzInputBlurOnEnter);\n\n    function igzInputBlurOnEnter() {\n        return {\n            restrict: 'A',\n            link: link\n        };\n\n        function link(scope, element) {\n            activate();\n\n            //\n            // Private methods\n            //\n\n            /**\n             * Constructor method\n             */\n            function activate() {\n                initInput();\n\n                scope.$on('$destroy', destructor);\n            }\n\n            /**\n             * Submit Rule name input on Enter key press\n             */\n            function initInput() {\n                element.on('keydown', blurOnEnterKey);\n            }\n\n            /**\n             * Set element to blur on Enter key press\n             * @param {Object} e - event\n             */\n            function blurOnEnterKey(e) {\n                if (e.keyCode === 13) {\n                    element.blur();\n                }\n            }\n\n            /**\n             * Destructor method\n             */\n            function destructor() {\n                element.off('keydown', blurOnEnterKey);\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    igzInputOnlyValidCharacters.$inject = ['$timeout'];\n    angular.module('iguazio.dashboard-controls').directive('igzInputOnlyValidCharacters', igzInputOnlyValidCharacters);\n\n    function igzInputOnlyValidCharacters($timeout) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                pattern: '=igzInputOnlyValidCharacters',\n                onlyValidCharacters: '=onlyValidCharacters'\n            },\n            link: link\n        };\n\n        function link(scope, element, attr, ngModelCtrl) {\n            var REGEXP = scope.pattern;\n            var onlyValidCharacters = scope.onlyValidCharacters;\n            var lastValidViewValue;\n\n            activate();\n\n            //\n            // Private methods\n            //\n\n            /**\n             * Constructor method\n             */\n            function activate() {\n                $timeout(function () {\n                    lastValidViewValue = ngModelCtrl.$viewValue;\n                });\n\n                ngModelCtrl.$parsers.unshift(validation);\n            }\n\n            /**\n             * Checks whether entered value is valid\n             * @param {string} viewValue - entered view value\n             * @returns {string} the last valid entered value\n             */\n            function validation(viewValue) {\n                if (onlyValidCharacters) {\n                    if (REGEXP.test(viewValue)) {\n                        lastValidViewValue = viewValue;\n                    } else {\n\n                        // Renders the last valid input in the field\n                        ngModelCtrl.$viewValue = lastValidViewValue;\n                        ngModelCtrl.$commitViewValue();\n                        ngModelCtrl.$render();\n                    }\n                    return lastValidViewValue;\n                } else {\n                    return viewValue;\n                }\n            }\n        }\n    }\n})();\n'use strict';\n\n/**\n * Angular directive to truncate multi-line text to visible height\n * @param bind (angular bound value to append) REQUIRED\n * @param ellipsisAppend (string) string to append at end of truncated text after ellipsis, can be HTML OPTIONAL\n * @param ellipsisAppendClick (function) function to call if ellipsisAppend is clicked (ellipsisAppend must be clicked) OPTIONAL\n * @param ellipsisSymbol (string) string to use as ellipsis, replaces default '...' OPTIONAL\n * @param ellipsisSeparator (string) separator to split string, replaces default ' ' OPTIONAL\n *\n * @example <p data-igz-multiline-ellipsis data-ng-bind=\"boundData\"></p>\n * @example <p data-igz-multiline-ellipsis data-ng-bind=\"boundData\" data-ellipsis-symbol=\"---\"></p>\n * @example <p data-igz-multiline-ellipsis data-ng-bind=\"boundData\" data-ellipsis-append=\"read more\"></p>\n * @example <p data-igz-multiline-ellipsis data-ng-bind=\"boundData\" data-ellipsis-append=\"read more\" data-ellipsis-append-click=\"displayFull()\"></p>\n */\n/* eslint complexity: [\"error\", 27] */\n(function () {\n    'use strict';\n\n    igzMultilineEllipsis.$inject = ['$sce', '$timeout', '$window'];\n    angular.module('iguazio.dashboard-controls').directive('igzMultilineEllipsis', igzMultilineEllipsis);\n\n    function igzMultilineEllipsis($sce, $timeout, $window) {\n        return {\n            restrict: 'A',\n            scope: {\n                ngBind: '=',\n                ngBindHtml: '=?',\n                ellipsisAppend: '@?',\n                ellipsisAppendClick: '&?',\n                ellipsisSymbol: '@?',\n                ellipsisSeparator: '@?',\n                ellipsisSeparatorReg: '=?',\n                useParent: '@?'\n            },\n            link: link\n        };\n\n        function link(scope, element, attributes) {\n            var AsyncDigest = function AsyncDigest(delay) {\n                var timeout = null;\n                var queue = [];\n\n                this.remove = function (fn) {\n                    if (queue.indexOf(fn) !== -1) {\n                        queue.splice(queue.indexOf(fn), 1);\n                        if (queue.length === 0) {\n                            $timeout.cancel(timeout);\n                            timeout = null;\n                        }\n                    }\n                };\n                this.add = function (fn) {\n                    if (queue.indexOf(fn) === -1) {\n                        queue.push(fn);\n                    }\n                    if (!timeout) {\n                        timeout = $timeout(function () {\n                            var copy = queue.slice();\n                            timeout = null;\n\n                            // reset scheduled array first in case one of the functions throws an error\n                            queue.length = 0;\n                            copy.forEach(function (fnc) {\n                                fnc();\n                            });\n                        }, delay);\n                    }\n                };\n            };\n\n            var asyncDigestImmediate = new AsyncDigest(0);\n            var asyncDigestDebounced = new AsyncDigest(75);\n\n            // Window Resize Variables\n            attributes.lastWindowResizeTime = 0;\n            attributes.lastWindowResizeWidth = 0;\n            attributes.lastWindowResizeHeight = 0;\n            attributes.lastWindowTimeoutEvent = null;\n\n            //State Variables\n            attributes.isTruncated = false;\n\n            var $win = angular.element($window);\n            $win.bind('resize', onResize);\n\n            //\n            // Private methods\n            //\n\n            /**\n             * Builds ellipsis\n             */\n            function buildEllipsis() {\n                var binding = scope.ngBind || scope.ngBindHtml;\n                var isTrustedHTML = false;\n                if ($sce.isEnabled() && angular.isObject(binding) && $sce.getTrustedHtml(binding)) {\n                    isTrustedHTML = true;\n                    binding = $sce.getTrustedHtml(binding);\n                }\n                if (binding) {\n                    var isHtml = !Boolean(scope.ngBind) && Boolean(scope.ngBindHtml);\n                    var i = 0,\n                        ellipsisSymbol = angular.isDefined(attributes.ellipsisSymbol) ? attributes.ellipsisSymbol : '&hellip;',\n                        ellipsisSeparator = angular.isDefined(scope.ellipsisSeparator) ? attributes.ellipsisSeparator : ' ',\n                        ellipsisSeparatorReg = angular.isDefined(scope.ellipsisSeparatorReg) ? scope.ellipsisSeparatorReg : false,\n                        appendString = angular.isDefined(scope.ellipsisAppend) && scope.ellipsisAppend !== '' ? ellipsisSymbol + '<span>' + scope.ellipsisAppend + '</span>' : ellipsisSymbol,\n                        bindArray = ellipsisSeparatorReg ? binding.match(ellipsisSeparatorReg) : binding.split(ellipsisSeparator);\n\n                    attributes.isTruncated = false;\n                    if (isHtml) {\n                        element.html(binding);\n                    } else {\n                        element.text(binding);\n                    }\n\n                    // If text has overflow\n                    if (isOverflowed(element, scope.useParent)) {\n                        var bindArrayStartingLength = bindArray.length,\n                            initialMaxHeight = scope.useParent ? getParentHeight(element) : element[0].clientHeight;\n\n                        if (isHtml) {\n                            element.html(binding + appendString);\n                        } else {\n                            element.text(binding).html(element.html() + appendString);\n                        }\n\n                        // Set data-overflow on element for targeting\n                        element.attr('data-overflowed', 'true');\n\n                        // Set complete text and remove one word at a time, until there is no overflow\n                        for (; i < bindArrayStartingLength; i++) {\n                            bindArray.pop();\n\n                            if (isHtml) {\n                                element.html(bindArray.join(ellipsisSeparator) + appendString);\n                            } else {\n                                element.text(bindArray.join(ellipsisSeparator)).html(element.html() + appendString);\n                            }\n\n                            if ((scope.useParent ? element.parent()[0] : element[0]).scrollHeight < initialMaxHeight || isOverflowed(element, scope.useParent) === false) {\n                                attributes.isTruncated = true;\n                                break;\n                            }\n                        }\n\n                        // If append string was passed and append click function included\n                        if (ellipsisSymbol !== appendString && angular.isDefined(scope.ellipsisAppendClick) && scope.ellipsisAppendClick !== '') {\n                            element.find('span').bind('click', function (e) {\n                                scope.$apply(function () {\n                                    scope.ellipsisAppendClick.call(scope, {\n                                        event: e\n                                    });\n                                });\n                            });\n                        }\n\n                        if (!isTrustedHTML && $sce.isEnabled()) {\n                            $sce.trustAsHtml(binding);\n                        }\n                    } else {\n                        element.attr('data-overflowed', 'false');\n                    }\n                }\n            }\n\n            /**\n             * Checks window's dimensions for rebuilding ellipsis\n             */\n            function checkWindowForRebuild() {\n                if (attributes.lastWindowResizeWidth !== window.innerWidth || attributes.lastWindowResizeHeight !== window.innerHeight) {\n                    buildEllipsis();\n                }\n\n                attributes.lastWindowResizeWidth = window.innerWidth;\n                attributes.lastWindowResizeHeight = window.innerHeight;\n            }\n\n            /**\n             * Gets parents's height\n             * @param {Object} el\n             * @returns {number}\n             */\n            function getParentHeight(el) {\n                var heightOfChildren = 0;\n                angular.forEach(el.parent().children(), function (child) {\n                    if (child !== el[0]) {\n                        heightOfChildren += child.clientHeight;\n                    }\n                });\n                return el.parent()[0].clientHeight - heightOfChildren;\n            }\n\n            /**\n             * Test if element has overflow of text beyond height or max-height\n             * @param {Object} thisElement\n             * @param {boolean} useParent\n             * @returns {boolean}\n             */\n            function isOverflowed(thisElement, useParent) {\n                thisElement = useParent ? thisElement.parent() : thisElement;\n                return thisElement[0].scrollHeight > thisElement[0].clientHeight;\n            }\n\n            /**\n             * When window width or height changes - re-init truncation\n             */\n            function onResize() {\n                asyncDigestDebounced.add(checkWindowForRebuild);\n            }\n\n            //\n            // Watchers\n            //\n\n            /**\n             * Execute ellipsis truncate on ngBind update\n             */\n            scope.$watch('ngBind', function () {\n                asyncDigestImmediate.add(buildEllipsis);\n            });\n\n            /**\n             * Execute ellipsis truncate on ngBindHtml update\n             */\n            scope.$watch('ngBindHtml', function () {\n                asyncDigestImmediate.add(buildEllipsis);\n            });\n\n            /**\n             * Execute ellipsis truncate on ngBind update\n             */\n            scope.$watch('ellipsisAppend', function () {\n                buildEllipsis();\n            });\n\n            /**\n             * Execute ellipsis truncate when element becomes visible\n             */\n            scope.$watch(function () {\n                return element[0].offsetWidth !== 0 && element[0].offsetHeight !== 0;\n            }, function () {\n                asyncDigestDebounced.add(buildEllipsis);\n            });\n\n            var unbindRefreshEllipsis = scope.$on('multiline-ellipsis_refresh', function () {\n                asyncDigestImmediate.add(buildEllipsis);\n            });\n\n            /**\n             * Destructor method\n             */\n            scope.$on('$destroy', function () {\n                $win.unbind('resize', onResize);\n                asyncDigestImmediate.remove(buildEllipsis);\n                asyncDigestDebounced.remove(checkWindowForRebuild);\n                if (unbindRefreshEllipsis) {\n                    unbindRefreshEllipsis();\n                    unbindRefreshEllipsis = null;\n                }\n            });\n        }\n    }\n})();\n'use strict';\n\n/**\n * Directive adds max-height for scrollbar container\n * @param igzNgScrollbarsConfig.maxElementsCount (number) maximum number of children elements that fit into the scrollbar container\n * @param igzNgScrollbarsConfig.childrenSelector (string) selector for children elements\n */\n(function () {\n    'use strict';\n\n    igzNgScrollbarsConfig.$inject = ['$timeout', 'lodash'];\n    angular.module('iguazio.dashboard-controls').directive('igzNgScrollbarsConfig', igzNgScrollbarsConfig);\n\n    function igzNgScrollbarsConfig($timeout, lodash) {\n        return {\n            restrict: 'A',\n            link: link\n        };\n\n        function link(scope, element, attrs) {\n            var config = angular.fromJson(attrs.igzNgScrollbarsConfig);\n\n            $timeout(function () {\n                activate();\n            });\n            scope.$watch(function () {\n                return element.find(config.childrenSelector).length;\n            }, activate);\n\n            /**\n             * Constructor method\n             */\n            function activate() {\n                var childrenElements = element.find(config.childrenSelector);\n                var maxElementsCount = config.maxElementsCount;\n                var scrollbarContainerHeight = 0;\n\n                if (childrenElements.length > maxElementsCount) {\n                    scrollbarContainerHeight = lodash.chain(childrenElements).take(maxElementsCount).map(function (child) {\n                        var styles = window.getComputedStyle(child);\n                        var margin = parseFloat(styles['marginTop']) + parseFloat(styles['marginBottom']);\n\n                        return child.offsetHeight + margin;\n                    }).sum().value();\n                }\n\n                element.css({ 'max-height': scrollbarContainerHeight > 0 ? scrollbarContainerHeight : 'unset' });\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    angular.module('iguazio.dashboard-controls').directive('igzNgScrollbarsMethods', igzNgScrollbarsMethods);\n\n    function igzNgScrollbarsMethods() {\n        return {\n            restrict: 'A',\n            link: link\n        };\n\n        function link(scope, element, attr) {\n            activate();\n\n            /**\n             * Constructor method\n             */\n            function activate() {\n                scope.$on('ng-scrollbars-methods_scroll-to', scrollToTarget);\n            }\n\n            /**\n             * Scrolls to specified element (selected by id) inside ng-scrollbars container\n             * Used in broadcast\n             * @param {Object} event - broadcast event\n             * @param {Object} data - broadcast data\n             */\n            function scrollToTarget(event, data) {\n\n                // Check if current directive was demanded\n                if (attr.igzNgScrollbarsMethods === data.scrollContainerName) {\n                    element.mCustomScrollbar('scrollTo', '#' + data.target);\n                }\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    igzResizableRowCells.$inject = ['$rootScope', '$timeout', 'lodash', 'CommonTableService'];\n    angular.module('iguazio.dashboard-controls').directive('igzResizableRowCells', igzResizableRowCells);\n\n    function igzResizableRowCells($rootScope, $timeout, lodash, CommonTableService) {\n        return {\n            restrict: 'A',\n            link: link\n        };\n\n        function link(scope, element) {\n            onInit();\n\n            /**\n             * Constructor method\n             */\n            function onInit() {\n                scope.$on('resize-cells', resizeCells);\n                scope.$on('autofit-col', autoFitColumn);\n                scope.$on('$destroy', onDestroy);\n\n                $timeout.cancel(CommonTableService.rowInitTimer);\n\n                CommonTableService.rowInitTimer = $timeout(function () {\n                    $rootScope.$broadcast('reload-columns');\n\n                    CommonTableService.rowInitTimer = null;\n                }, 100);\n            }\n\n            /**\n             * Destructor method\n             */\n            function onDestroy() {\n                if (CommonTableService.rowInitTimer) {\n                    CommonTableService.rowInitTimer = null;\n                }\n            }\n\n            //\n            // Private methods\n            //\n\n            /**\n             * Checks width of cells column auto-fit\n             * @param {Object} event - broadcast event\n             * @param {Object} data - information about column name\n             */\n            function autoFitColumn(event, data) {\n                var currentCell = element.find('.' + data.colClass)[0];\n\n                if (!lodash.isNil(currentCell)) {\n                    var currentWidth = currentCell.offsetWidth;\n\n                    // temporary set auto width to get data for auto-fit\n                    currentCell.style.width = 'auto';\n                    var newWidth = currentCell.offsetWidth;\n                    currentCell.style.width = currentWidth + 'px';\n\n                    if (newWidth > currentWidth) {\n                        var colDifference = newWidth - currentWidth + 2;\n\n                        if (angular.isFunction(data.callbackFunction)) {\n                            data.callbackFunction(colDifference);\n                        }\n                    }\n                }\n            }\n\n            /**\n             * Resize cells according to igz-resize-table-column directive move\n             * @param {Object} event - broadcast event\n             * @param {Object} data - information about column name and size\n             */\n            function resizeCells(event, data) {\n\n                // search for cell which should be resized\n                var currentCell = element.find('.' + data.colClass)[0];\n                if (!lodash.isNil(currentCell)) {\n                    var nextCell = currentCell.nextElementSibling;\n\n                    // set new value for cells width\n                    currentCell.style.width = data.columnWidth;\n\n                    if (!lodash.isNil(nextCell)) {\n                        nextCell.style.width = data.nextColumnWidth;\n                    }\n                }\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    igzResizableTableColumn.$inject = ['$document', '$rootScope', '$timeout', '$window', 'lodash'];\n    angular.module('iguazio.dashboard-controls').directive('igzResizableTableColumn', igzResizableTableColumn);\n\n    function igzResizableTableColumn($document, $rootScope, $timeout, $window, lodash) {\n        IgzResizeTableController.$inject = ['$element', '$scope'];\n\n        return {\n            restrict: 'A',\n            replace: true,\n            scope: {\n                colClass: '@'\n            },\n            template: '<div class=\"resize-block\" data-ng-mousedown=\"$ctrl.onMouseDown($event)\" data-ng-click=\"$ctrl.onClick($event)\" data-ng-dblclick=\"$ctrl.onDoubleClick($event)\"></div>',\n            controller: IgzResizeTableController,\n            controllerAs: '$ctrl',\n            bindToController: true\n        };\n\n        function IgzResizeTableController($element, $scope) {\n            var ctrl = this;\n            var timeout = null;\n\n            ctrl.minWidth = 100;\n            ctrl.startPosition = 0;\n\n            ctrl.onClick = onClick;\n            ctrl.onDoubleClick = onDoubleClick;\n            ctrl.onMouseDown = onMouseDown;\n\n            onInit();\n\n            //\n            // Hook methods\n            //\n\n            /**\n             * Constructor method\n             */\n            function onInit() {\n\n                // set header widths of the resizing columns\n                $timeout(initColumnsWidths);\n                $timeout(initElements);\n\n                angular.element($window).on('resize', reloadColumns);\n                $scope.$on('reload-columns', reloadColumns);\n                $scope.$on('resizable-table-column_reset-data', resetData);\n                $scope.$on('$destroy', onDestroy);\n            }\n\n            /**\n             * Destructor method\n             */\n            function onDestroy() {\n                $timeout(function () {\n                    angular.element($window).off('resize', reloadColumns);\n                    ctrl.parentElement.off('mouseenter', onMouseEnter).off('mouseleave', onMouseLeave);\n                });\n            }\n\n            //\n            // Public methods\n            //\n\n            /**\n             * Prevents click propagation\n             * @param {Object} event\n             */\n            function onClick(event) {\n                event.stopPropagation();\n            }\n\n            /**\n             * Prevents click propagation\n             * @param {Object} event\n             */\n            function onDoubleClick(event) {\n\n                // set min width for selected column\n                if (ctrl.columnHeadMinWidth < ctrl.columnHeadWidth) {\n                    var colDifference = ctrl.columnHeadMinWidth - ctrl.columnHeadWidth;\n                    resizeColumn(colDifference);\n                }\n\n                // set width of the column to fit the content\n                $rootScope.$broadcast('autofit-col', { colClass: ctrl.colClass, callbackFunction: resizeColumn });\n            }\n\n            /**\n             * On mouse down handler\n             * @param {Object} event\n             */\n            function onMouseDown(event) {\n\n                // prevent default dragging of selected content\n                event.preventDefault();\n                event.stopPropagation();\n\n                // saves start position of resize\n                ctrl.startPosition = event.clientX;\n\n                // adds event listeners\n                $document.on('mousemove', onMouseMove);\n                $document.on('mouseup', onMouseUp);\n\n                // Sets extra classes for correct displaying resizing elements\n                ctrl.allElements.addClass('resizing');\n                ctrl.prevElement.addClass('active');\n                if (ctrl.isNeedBorder) {\n                    $element.addClass('active');\n                }\n\n                return false;\n            }\n\n            //\n            // Private methods\n            //\n\n            /**\n             * Initialises columns and their min width\n             */\n            function initColumnsWidths() {\n\n                // get block which will be resized\n                ctrl.columnHead = $element[0].parentElement;\n                ctrl.columnHeadMinWidth = ctrl.minWidth;\n\n                if (ctrl.columnHead.offsetWidth > 0) {\n                    ctrl.columnHeadMinWidth = lodash.min([ctrl.columnHead.offsetWidth, ctrl.minWidth]);\n                }\n\n                // get parent container of the header\n                ctrl.parentBlock = ctrl.columnHead.parentElement;\n\n                // get block which is next to resizing block\n                ctrl.nextBlock = ctrl.columnHead.nextElementSibling;\n                ctrl.nextBlockMinWidth = ctrl.minWidth;\n\n                if (!lodash.isNil(ctrl.nextBlock) && ctrl.nextBlock.offsetWidth > 0) {\n                    ctrl.nextBlockMinWidth = lodash.min([ctrl.nextBlock.offsetWidth, ctrl.minWidth]);\n                }\n\n                resetColumnsWidths();\n            }\n\n            /**\n             * Initialises elements and register callbacks for events\n             */\n            function initElements() {\n                ctrl.parentElement = $element.parent();\n                ctrl.prevElement = ctrl.parentElement.prev().find('.resize-block');\n                ctrl.allElements = ctrl.parentElement.parent().find('.resize-block');\n\n                var lastElement = ctrl.allElements.last()[0];\n                var lastColumn = ctrl.parentElement.parent()[0].lastElementChild;\n                ctrl.isNeedBorder = lastElement !== $element[0] || lastElement.parentElement !== lastColumn;\n\n                !ctrl.isNeedBorder ? $element.addClass('last') : $element.removeClass('last');\n\n                ctrl.parentElement.on('mouseenter', onMouseEnter).on('mouseleave', onMouseLeave);\n            }\n\n            /**\n             * On mouse enter handler\n             */\n            function onMouseEnter() {\n                timeout = $timeout(function () {\n                    ctrl.prevElement.addClass('hover');\n                    if (ctrl.isNeedBorder) {\n                        $element.addClass('hover');\n                    }\n                }, 250);\n            }\n\n            /**\n             * On mouse leave handler\n             */\n            function onMouseLeave() {\n                $timeout.cancel(timeout);\n\n                ctrl.prevElement.removeClass('hover');\n\n                if (ctrl.isNeedBorder) {\n                    $element.removeClass('hover');\n                }\n            }\n\n            /**\n             * On mouse move handler\n             * @param {Object} event\n             */\n            function onMouseMove(event) {\n                var colDifference = event.clientX - ctrl.startPosition;\n                ctrl.startPosition = event.clientX;\n\n                resetColumnsWidths();\n                resizeColumn(colDifference);\n\n                $rootScope.$broadcast('multiline-ellipsis_refresh');\n            }\n\n            /**\n             * On mouse up handlers\n             * @param {Object} event\n             */\n            function onMouseUp(event) {\n\n                // detaches even listeners\n                $document.off('mousemove', onMouseMove);\n                $document.off('mouseup', onMouseUp);\n\n                // prevent default dragging of selected content\n                event.preventDefault();\n                event.stopPropagation();\n\n                // Removes extra classes\n                ctrl.prevElement.removeClass('active');\n                ctrl.allElements.removeClass('resizing');\n\n                if (ctrl.isNeedBorder) {\n                    $element.removeClass('active');\n                }\n\n                $rootScope.$broadcast('resize-tags-cells');\n            }\n\n            /**\n             * Reloads column cells in the table according to column width\n             */\n            function reloadColumns() {\n                if (!lodash.isNil(ctrl.nextBlock)) {\n                    $timeout(function () {\n                        resetColumnsWidths();\n\n                        $rootScope.$broadcast('resize-cells', {\n                            colClass: ctrl.colClass,\n                            columnWidth: ctrl.columnHeadWidth + 'px',\n                            nextColumnWidth: ctrl.nextBlockWidth + 'px'\n                        });\n                    });\n                }\n            }\n\n            /**\n             * Resets columns widths\n             */\n            function resetColumnsWidths() {\n                ctrl.columnHeadWidth = ctrl.columnHead.offsetWidth;\n                ctrl.parentBlockWidth = ctrl.parentBlock.offsetWidth;\n\n                if (!lodash.isNil(ctrl.nextBlock)) {\n                    ctrl.nextBlockWidth = ctrl.nextBlock.offsetWidth;\n                }\n            }\n\n            /**\n             * Reset initial data\n             */\n            function resetData() {\n                ctrl.parentElement.off('mouseenter', onMouseEnter).off('mouseleave', onMouseLeave);\n\n                initColumnsWidths();\n                initElements();\n            }\n\n            /**\n             * Resize cells in the table rows according to column width\n             * @param {Object} colDifference - information about column difference\n             */\n            function resizeColumn(colDifference) {\n                if (!lodash.isNil(ctrl.nextBlock)) {\n\n                    // calculate new width for the block which need to be resized\n                    var maxColumnHeadDifference = ctrl.columnHeadWidth - ctrl.columnHeadMinWidth;\n\n                    // calculate new width for the  block which is next to resizing block\n                    var maxNextBlockDifference = ctrl.nextBlockWidth - ctrl.nextBlockMinWidth;\n\n                    // calculate maximum resizing value of columns\n                    var newDifference = 0;\n\n                    if (colDifference > 0 && maxNextBlockDifference > 0) {\n                        newDifference = lodash.min([colDifference, maxNextBlockDifference]);\n                    } else if (colDifference < 0 && maxColumnHeadDifference > 0) {\n                        newDifference = lodash.max([colDifference, -maxColumnHeadDifference]);\n                    }\n\n                    if (newDifference !== 0) {\n                        ctrl.columnHeadWidth = ctrl.columnHeadWidth + newDifference;\n                        ctrl.nextBlockWidth = ctrl.nextBlockWidth - newDifference;\n\n                        setElementWidth(ctrl.columnHead, ctrl.columnHeadWidth);\n                        setElementWidth(ctrl.nextBlock, ctrl.nextBlockWidth);\n\n                        $rootScope.$broadcast('resize-cells', {\n                            colClass: ctrl.colClass,\n                            columnWidth: ctrl.columnHeadWidth + 'px',\n                            nextColumnWidth: ctrl.nextBlockWidth + 'px'\n                        });\n                        $rootScope.$broadcast('resize-size-cells');\n                    }\n                }\n            }\n\n            /**\n             * Sets header element width in percentage\n             * @param {Object} element - element object\n             * @param {number} widthInPixels - new width value\n             */\n            function setElementWidth(element, widthInPixels) {\n                element.style.width = widthInPixels / ctrl.parentBlockWidth * 100 + '%';\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    igzValidateElevation.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').directive('igzValidateElevation', igzValidateElevation);\n\n    function igzValidateElevation(lodash) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                compareVal: '=',\n                compareValUnit: '=',\n                currentValUnit: '='\n            },\n            link: link\n        };\n\n        function link(scope, element, attributes, ngModel) {\n            activate();\n\n            function activate() {\n                if (angular.isDefined(scope.compareVal)) {\n                    ngModel.$validators.validateElevation = function (modelValue) {\n                        return lodash.isNil(modelValue) || lodash.isNil(scope.compareVal) || calcValue(modelValue, scope.currentValUnit) <= calcValue(scope.compareVal, scope.compareValUnit);\n\n                        function calcValue(value, unit) {\n                            return (Number(unit) || 1) * Number(value);\n                        }\n                    };\n\n                    scope.$watch('compareVal', function () {\n                        ngModel.$validate();\n                    });\n\n                    if (angular.isDefined(scope.compareValUnit) && angular.isDefined(scope.currentValUnit)) {\n                        scope.$watchGroup(['compareValUnit', 'currentValUnit'], function () {\n                            ngModel.$validate();\n                        });\n                    }\n                }\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    igzValidatePasswordConfirmation.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').directive('igzValidatePasswordConfirmation', igzValidatePasswordConfirmation);\n\n    function igzValidatePasswordConfirmation(lodash) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                compareVal: '=igzValidatePasswordConfirmation'\n            },\n            link: link\n        };\n\n        function link(scope, element, attributes, ngModel) {\n            activate();\n\n            //\n            // Private methods\n            //\n\n            /**\n             * Constructor\n             */\n            function activate() {\n                initValidator();\n            }\n\n            /**\n             * Method to add validators\n             */\n            function initValidator() {\n                if (angular.isDefined(scope.compareVal)) {\n                    ngModel.$validators.validatePasswordConfirmation = isValueValid;\n\n                    scope.$watch('compareVal', function () {\n                        ngModel.$validate();\n                    });\n                }\n            }\n\n            /**\n             * Method checks if passed value is valid\n             * @param {string} value - current changed value\n             * @returns {boolean} return true if value is valid\n             */\n            function isValueValid(value) {\n                return lodash.isEmpty(value) || value === scope.compareVal;\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    /*\n     * Watch window resizing event to set new window dimensions,\n     * and broadcast the event to the app (use in html tag)\n     */\n\n    igzWatchWindowResize.$inject = ['$window', '$timeout', '$rootScope', 'WindowDimensionsService'];\n    angular.module('iguazio.dashboard-controls').directive('igzWatchWindowResize', igzWatchWindowResize);\n\n    function igzWatchWindowResize($window, $timeout, $rootScope, WindowDimensionsService) {\n        return {\n            link: link\n        };\n\n        function link() {\n            activate();\n\n            function activate() {\n                var resizing;\n\n                // On window resize...\n                angular.element($window).on('resize', function () {\n\n                    // Reset timeout\n                    $timeout.cancel(resizing);\n                    WindowDimensionsService.removeOverflow();\n\n                    // Add a timeout to not call the resizing function every pixel\n                    resizing = $timeout(function () {\n                        getDimensions();\n                    }, 300);\n                });\n            }\n\n            // Get window's dimensions\n            function getDimensions() {\n\n                // Namespacing events with name of directive + event to avoid collisions\n                // http://stackoverflow.com/questions/23272169/what-is-the-best-way-to-bind-to-a-global-event-in-a-angularjs-directive\n                $rootScope.$broadcast('igzWatchWindowResize::resize', {\n                    height: WindowDimensionsService.height(),\n                    width: WindowDimensionsService.width()\n                });\n            }\n        }\n    }\n})();\n'use strict';\n\nangular.module('angular-base64', []).provider('Base64', function () {\n    this.$get = ['$window', function ($window) {\n        return $window.Base64;\n    }];\n});\n'use strict';\n\nangular.module('angular-moment', []).provider('moment', function () {\n    this.$get = ['$window', function ($window) {\n        return $window.moment;\n    }];\n});\n'use strict';\n\nangular.module('angular-yamljs', []).provider('YAML', function () {\n    this.$get = ['$window', function ($window) {\n        return $window.YAML;\n    }];\n});\n'use strict';\n\n(function () {\n    'use strict';\n\n    CloseDialogService.$inject = ['$document', '$rootScope', 'lodash', 'ngDialog', 'EventHelperService'];\n    angular.module('iguazio.dashboard-controls').factory('CloseDialogService', CloseDialogService);\n\n    function CloseDialogService($document, $rootScope, lodash, ngDialog, EventHelperService) {\n        var scope = $rootScope.$new();\n        var isUploadImageWindowOpen = false;\n        var isChangesHaveBeenMade = false;\n\n        activate();\n\n        return {\n            toggleIsUploadImageWindowOpen: toggleIsUploadImageWindowOpen\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Toggles flag of isUploadImageWindowOpen\n         */\n        function toggleIsUploadImageWindowOpen() {\n            isUploadImageWindowOpen = !isUploadImageWindowOpen;\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Constructor method\n         */\n        function activate() {\n            scope.$on('wizard_changes-have-been-made', onChanges);\n            scope.$on('text-edit_changes-have-been-made', onChanges);\n\n            // array of the IDs of opened ndDialogs\n            // will change if some ngDialog have been opened or closed\n            scope.ngDialogs = ngDialog.getOpenDialogs();\n\n            scope.$watchCollection('ngDialogs', function (newVal, oldVal) {\n                if (lodash.isEmpty(oldVal) && newVal.length === 1) {\n                    $document.on('keyup', onKeyUp);\n                } else if (lodash.isEmpty(newVal)) {\n                    $document.off('keyup', onKeyUp);\n\n                    isChangesHaveBeenMade = false;\n                }\n            });\n        }\n\n        /**\n         * Closes last opened dialog\n         */\n        function onKeyUp(event) {\n            if (event.keyCode === EventHelperService.ESCAPE) {\n                if (isUploadImageWindowOpen || isChangesHaveBeenMade) {\n                    isUploadImageWindowOpen = false;\n                    $rootScope.$broadcast('close-dialog-service_close-dialog', { dialogId: lodash.last(scope.ngDialogs) });\n                } else {\n                    ngDialog.close(lodash.last(scope.ngDialogs));\n\n                    if (lodash.isEmpty(scope.ngDialogs)) {\n                        $document.off('keyup', onKeyUp);\n                    }\n                }\n\n                scope.$digest();\n            }\n        }\n\n        /**\n         * Broadcast callback which should be called when wizards has some changes\n         * Sends from such wizards: new container wizard, new storage pool wizard\n         * @param {Object} event - broadcast event object\n         * @param {boolean} data - broadcast data\n         */\n        function onChanges(event, data) {\n            isChangesHaveBeenMade = data;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    angular.module('iguazio.dashboard-controls').factory('CommonTableService', CommonTableService);\n\n    function CommonTableService() {\n        return {\n            getColumnSortingClasses: getColumnSortingClasses,\n\n            rowInitTimer: null\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Checks whether the passed column name equals the last sorted column name\n         * @param {string} columnName\n         * @param {string} lastSortedColumnName\n         * @param {boolean} isReversed\n         * @returns {{sorted: boolean, reversed: boolean}} - an object with css class names suitable for `ng-class`\n         */\n        function getColumnSortingClasses(columnName, lastSortedColumnName, isReversed) {\n            var classes = {\n                'sorted': false,\n                'reversed': false\n            };\n            if (columnName === lastSortedColumnName) {\n                classes.sorted = true;\n                classes.reversed = isReversed;\n            }\n            return classes;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    DialogsService.$inject = ['$document', '$q', '$timeout', '$i18next', 'i18next', 'lodash', 'ngDialog', 'EventHelperService', 'FormValidationService'];\n    angular.module('iguazio.dashboard-controls').factory('DialogsService', DialogsService);\n\n    function DialogsService($document, $q, $timeout, $i18next, i18next, lodash, ngDialog, EventHelperService, FormValidationService) {\n        return {\n            alert: alert,\n            confirm: confirm,\n            customConfirm: customConfirm,\n            iframe: iframe,\n            image: image,\n            oopsAlert: oopsAlert,\n            prompt: prompt,\n            text: text\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Show alert message\n         *\n         * @param {string|Array.<string>} [alertText] - alert content\n         * @param {string} [buttonText=OK] - text displayed on Ok button\n         * @returns {Promise} a promise that resolves on closing dialog\n         */\n        function alert(alertText, buttonText) {\n            buttonText = lodash.defaultTo(buttonText, $i18next.t('common:OK', { lng: i18next.language }));\n\n            if (lodash.isArray(alertText)) {\n                alertText = alertText.length === 1 ? lodash.first(alertText) : '<ul class=\"error-list\"><li class=\"error-list-item\">' + alertText.join('</li><li class=\"error-list-item\">') + '</li></ul>';\n            }\n\n            return ngDialog.open({\n                template: '<div class=\"notification-text title igz-scrollable-container\" data-ng-scrollbars>' + alertText + '</div>' + '<div class=\"buttons\">' + '<button class=\"igz-button-primary\" data-ng-click=\"closeThisDialog() || $event.stopPropagation()\" ' + 'data-test-id=\"general.alert_ok.button\">' + buttonText + '</button></div>',\n                plain: true,\n                className: 'ngdialog-theme-iguazio alert-dialog'\n            }).closePromise;\n        }\n\n        /**\n         * Show confirmation dialog\n         *\n         * @param {string|Object} confirmText that will be shown in pop-up\n         * @param {string} [confirmText.message] the text of the dialog body\n         * @param {string} [confirmText.description] additional info\n         * @param {string} confirmButton Text displayed on Confirm button\n         * @param {string} [cancelButton=Cancel] Text displayed on Cancel button\n         * @param {string} type - type of popup dialog\n         * @returns {Object}\n         */\n        function confirm(confirmText, confirmButton, cancelButton, type) {\n            var confirmMessage = type === 'nuclio_alert' && lodash.isPlainObject(confirmText) ? confirmText.message : confirmText;\n\n            var confirmButtonClass = lodash.includes(['critical_alert', 'nuclio_alert'], type) ? 'igz-button-remove' : type === 'text-edit' ? 'igz-button-just-text' : 'igz-button-primary';\n\n            var cancelButtonClass = type === 'text-edit' ? 'igz-button-primary' : 'igz-button-just-text';\n\n            var cancelButtonCaption = lodash.defaultTo(cancelButton, $i18next.t('common:CANCEL', {\n                lng: i18next.language\n            }));\n            var noDescription = type !== 'nuclio_alert' || lodash.isEmpty(confirmText.description);\n\n            var template = '<div class=\"close-button igz-icon-close\" data-ng-click=\"closeThisDialog()\"></div>' + '<div class=\"nuclio-alert-icon\"></div><div class=\"notification-text title\">' + confirmMessage + '</div>' + (noDescription ? '' : '<div class=\"notification-text description\">' + confirmText.description + '</div>') + '<div class=\"buttons\" data-ng-class=\"{\\'igz-grouped-buttons-reverse\\': ' + (type === 'text-edit') + '}\">' + '<button class=\"' + cancelButtonClass + '\" tabindex=\"0\" data-ng-click=\"closeThisDialog(0)\" ' + 'data-test-id=\"general.confirm_cancel.button\" ' + 'data-ng-keydown=\"$event.keyCode === 13 && closeThisDialog(0)\">' + cancelButtonCaption + '</button>' + '<button class=\"' + confirmButtonClass + '\" tabindex=\"0\" data-ng-click=\"confirm(1)\" ' + 'data-test-id=\"general.confirm_confirm.button\" data-ng-keydown=\"$event.keyCode === 13 && confirm(1)\">' + confirmButton + '</button>' + '</div>';\n\n            return ngDialog.openConfirm({\n                template: template,\n                plain: true,\n                name: 'confirm',\n                className: (type === 'nuclio_alert' ? 'ngdialog-theme-nuclio delete-entity-dialog-wrapper' : 'ngdialog-theme-iguazio') + ' confirm-dialog'\n            });\n        }\n\n        /**\n         * Show confirmation dialog with custom number of buttons\n         * @param {string} confirmText that will be shown in pop-up\n         * @param {string} cancelButton Text displayed on Cancel button\n         * @param {Array} actionButtons Array of action buttons\n         * @returns {Object}\n         */\n        function customConfirm(confirmText, cancelButton, actionButtons) {\n            var template = '<div class=\"notification-text title\">' + confirmText + '</div>' + '<div class=\"buttons\">' + '<button class=\"igz-button-just-text\" tabindex=\"0\" data-ng-click=\"closeThisDialog(-1)\" ' + 'data-test-id=\"general.confirm_cancel.button\" ' + 'data-ng-keydown=\"$event.keyCode === 13 && closeThisDialog(-1)\">' + cancelButton + '</button>';\n            lodash.each(actionButtons, function (button, index) {\n                template += '<button class=\"igz-button-primary\" tabindex=\"0\" data-ng-click=\"confirm(' + index + ')\" data-test-id=\"general.confirm_confirm_' + index + '.button\" ' + 'data-ng-keydown=\"$event.keyCode === 13 && confirm(' + index + ')\">' + button + '</button>';\n            });\n            template += '</div>';\n\n            return ngDialog.openConfirm({\n                template: template,\n                plain: true,\n                trapFocus: false\n            });\n        }\n\n        /**\n         * Shows iframe with content in a dialog\n         *\n         * @param {string} content that will be shown in pop-up\n         * @param {string} [title='']\n         * @returns {Promise}\n         */\n        function iframe(content, title) {\n            var data = {\n                buttonText: $i18next.t('common:CLOSE', { lng: i18next.language }),\n                content: content,\n                title: lodash.defaultTo(title, '')\n            };\n\n            var ifarmeDialog = ngDialog.open({\n                template: '<div class=\"iframe-dialog-content\">' + '<div class=\"close-button igz-icon-close\" data-ng-click=\"closeThisDialog()\"></div>' + '<div class=\"title\">{{ngDialogData.title}}</div>' + '<div class=\"main-content\">' + '<iframe id=\"iframeDialog\" class=\"frame\" srcdoc=\"{{ngDialogData.content}}\"></iframe>' + '</div>' + '<div class=\"buttons\">' + '<button class=\"igz-button-primary\" data-ng-click=\"closeThisDialog()\">{{ngDialogData.buttonText}}</button>' + '</div>' + '</div>',\n                plain: true,\n                data: data,\n                className: 'ngdialog-theme-iguazio iframe-dialog'\n            });\n\n            $timeout(function () {\n                var iframeContent = document.getElementById('iframeDialog');\n\n                iframeContent.contentWindow.document.addEventListener('keyup', function (event) {\n                    if (event.keyCode === EventHelperService.ESCAPE) {\n                        ifarmeDialog.close();\n                    }\n                });\n            }, 300);\n\n            return ifarmeDialog.closePromise;\n        }\n\n        /**\n         * Show image\n         *\n         * @param {string} src that will be shown in pop-up\n         * @param {string} [label] actual filename to be shown in title\n         * @returns {Promise}\n         */\n        function image(src, label) {\n            label = angular.isString(label) ? label : $i18next.t('common:TOOLTIP.IMAGE_PREVIEW', { lng: i18next.language }) + ':';\n\n            return ngDialog.open({\n                template: '<div class=\"title text-ellipsis\"' + 'data-uib-tooltip=\"' + label + '\"' + 'data-tooltip-popup-delay=\"400\"' + 'data-tooltip-append-to-body=\"true\"' + 'data-tooltip-placement=\"bottom-left\">' + label + '</div>' + '<div class=\"close-button igz-icon-close\" data-ng-click=\"closeThisDialog()\"></div>' + '<div class=\"image-preview-container\">' + '<img class=\"image-preview\" src=\"' + src + '\" alt=\"' + $i18next.t('common:HAVE_NO_PERMISSIONS_TO_READ_FILE', { lng: i18next.language }) + '\"/></div>',\n                plain: true,\n                className: 'ngdialog-theme-iguazio image-dialog'\n            }).closePromise;\n        }\n\n        /**\n         * Show oops alert message when server is unreachable\n         * @param {string} alertText that will be shown in pop-up\n         * @param {string} buttonText displayed on Ok button\n         * @returns {Promise}\n         */\n        function oopsAlert(alertText, buttonText) {\n            return ngDialog.open({\n                template: '<div class=\"header\"></div><div class=\"notification-text\">' + alertText + '</div>' + '<div class=\"buttons\">' + '<button class=\"refresh-button no-padding\" data-ng-click=\"closeThisDialog()\" ' + 'data-test-id=\"general.oops_refresh.button\" ' + '<span class=\"igz-icon-refresh\"></span>' + buttonText + '</button>' + '</div>',\n                plain: true,\n                className: 'ngdialog-theme-iguazio oops-dialog'\n            }).closePromise;\n        }\n\n        /**\n         * Show confirmation dialog with input field\n         *\n         * @param {string} promptText that will be shown in pop-up\n         * @param {string} [okButton='OK'] Text displayed on Confirm button\n         * @param {string} [cancelButton='Cancel'] Text displayed on Cancel button\n         * @param {string} [defaultValue=''] Value that should be shown in text input after prompt is opened\n         * @param {string} [placeholder=''] Text input placeholder\n         * @param {Object} [validation] Validation pattern\n         * @param {boolean} [required=false] Should input be required or not\n         * @returns {Object}\n         */\n        function prompt(promptText, okButton, cancelButton, defaultValue, placeholder, validation, required) {\n            var lng = i18next.language;\n            var okButtonCaption = lodash.defaultTo(okButton, $i18next.t('common:OK', { lng: lng }));\n            var cancelButtonCaption = lodash.defaultTo(cancelButton, $i18next.t('common:CANCEL', { lng: lng }));\n            var data = {\n                value: lodash.defaultTo(defaultValue, ''),\n                igzDialogPromptForm: {},\n                checkInput: function checkInput() {\n                    if (angular.isDefined(validation) || required) {\n                        data.igzDialogPromptForm.$setSubmitted();\n                    }\n                    return data.igzDialogPromptForm.$valid;\n                },\n                inputValueCallback: function inputValueCallback(newData) {\n                    data.value = newData;\n                }\n            };\n\n            if (angular.isDefined(validation) || required) {\n                lodash.assign(data, {\n                    validation: validation,\n                    inputName: 'promptName',\n                    isShowFieldInvalidState: FormValidationService.isShowFieldInvalidState\n                });\n            }\n\n            var promptDialog = ngDialog.open({\n                template: '<div data-ng-form=\"ngDialogData.igzDialogPromptForm\">' + '<div class=\"close-button igz-icon-close\" data-ng-click=\"closeThisDialog()\"></div>' + '<div class=\"notification-text title\">' + promptText + '</div>' + '<div class=\"main-content\">' + '<div class=\"field-group\">' + '<div class=\"field-input\">' + '<igz-validating-input-field ' + 'data-field-type=\"input\" ' + 'data-input-name=\"promptName\" ' + 'data-input-value=\"ngDialogData.value\" ' + 'data-form-object=\"ngDialogData.igzDialogPromptForm\" ' + 'data-is-focused=\"true\" ' + (angular.isUndefined(validation) ? '' : 'data-validation-pattern=\"ngDialogData.validation\" ' + 'data-only-valid-characters=\"true\" data-trim=\"false\" ') + (lodash.isEmpty(placeholder) ? '' : 'data-placeholder-text=\"' + placeholder + '\" ') + (lodash.defaultTo(required, false) ? 'data-validation-is-required=\"true\" ' : '') + 'data-update-data-callback=\"ngDialogData.inputValueCallback(newData)\"' + '></igz-validating-input-field>' + (angular.isDefined(validation) ? '<div class=\"error-text\" data-ng-show=\"ngDialogData.isShowFieldInvalidState(ngDialogData.igzDialogPromptForm, ngDialogData.inputName)\">' + $i18next.t('common:ERROR_MSG.INVALID_INPUT_PLEASE_TRY_AGAIN', { lng: lng }) + '</div>' : '') + '</div>' + '</div>' + '</div>' + '</div>' + '<div class=\"buttons\">' + '<button class=\"igz-button-just-text\" data-ng-click=\"closeThisDialog()\" ' + 'data-test-id=\"general.prompt_cancel.button\">' + cancelButtonCaption + '</button>' + '<button class=\"igz-button-primary\" ' + 'data-ng-click=\"ngDialogData.checkInput() && closeThisDialog(ngDialogData.value)\" ' + 'data-test-id=\"general.prompt_ok.button\">' + okButtonCaption + '</button>' + '</div>',\n                plain: true,\n                data: data,\n                className: 'ngdialog-theme-iguazio prompt-dialog'\n            });\n\n            function confirmCallback(event) {\n                if (event.keyCode === EventHelperService.ENTER) {\n                    data.checkInput() && promptDialog.close(data.value);\n                }\n            }\n\n            $document.on('keypress', confirmCallback);\n\n            return promptDialog.closePromise.then(function (dialog) {\n                // if Cancel is clicked, reject the promise\n                $document.off('keypress', confirmCallback);\n\n                return angular.isDefined(dialog.value) ? dialog.value : $q.reject($i18next.t('common:ERROR_MSG.CANCELLED', { lng: lng }));\n            });\n        }\n\n        /**\n         * Shows text\n         *\n         * @param {string} content that will be shown in pop-up\n         * @param {Object} [node] actual node to be shown\n         * @param {function} submitData function for submitting data\n         * @param {string} language the language to use in text editor\n         * @returns {Promise}\n         */\n        function text(content, node, submitData, language) {\n            var lng = i18next.language;\n            var data = {\n                closeButtonText: $i18next.t('common:CLOSE', { lng: lng }),\n                submitButtonText: $i18next.t('common:SAVE', { lng: lng }),\n                submitData: submitData,\n                label: angular.isString(node.label) ? node.label : 'Text preview:',\n                node: node,\n                content: content,\n                language: language\n            };\n\n            return ngDialog.open({\n                template: '<igz-text-edit data-label=\"{{ngDialogData.label}}\" data-ng-dialog-id=\"{{ngDialogData.ngDialogId}}\" data-language=\"{{ngDialogData.language}}\" data-content=\"{{ngDialogData.content}}\"' + 'data-submit-button-text=\"{{ngDialogData.submitButtonText}}\" data-submit-data=\"ngDialogData.submitData(newContent)\"' + 'data-close-button-text=\"{{ngDialogData.closeButtonText}}\" data-close-dialog=\"closeThisDialog(value)\">' + '</igz-text-edit>',\n                plain: true,\n                data: data,\n                className: 'ngdialog-theme-iguazio text-edit'\n            }).closePromise;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    ElementLoadingStatusService.$inject = ['$rootScope'];\n    angular.module('iguazio.dashboard-controls').factory('ElementLoadingStatusService', ElementLoadingStatusService);\n\n    function ElementLoadingStatusService($rootScope) {\n        return {\n            showSpinner: showSpinner,\n            hideSpinner: hideSpinner,\n            showSpinnerGroup: showSpinnerGroup,\n            hideSpinnerGroup: hideSpinnerGroup,\n\n            showLoadingError: showLoadingError,\n            hideLoadingError: hideLoadingError,\n            showLoadingErrorGroup: showLoadingErrorGroup,\n            hideLoadingErrorGroup: hideLoadingErrorGroup\n        };\n\n        /**\n         * Send event to show loading spinner\n         * @param {string} name - spinner name\n         */\n        function showSpinner(name) {\n            $rootScope.$broadcast('element-loading-status_show-spinner', { name: name });\n        }\n\n        /**\n         * Send event to hide loading spinner\n         * @param {string} name - spinner name\n         */\n        function hideSpinner(name) {\n            $rootScope.$broadcast('element-loading-status_hide-spinner', { name: name });\n        }\n\n        /**\n         * Send event to show group of loading spinners\n         * @param {Array} names - array of strings representing spinners names\n         */\n        function showSpinnerGroup(names) {\n            angular.forEach(names, showSpinner);\n        }\n\n        /**\n         * Send event to hide group of loading spinners\n         * @param {Array} names - array of strings representing spinners names\n         */\n        function hideSpinnerGroup(names) {\n            angular.forEach(names, hideSpinner);\n        }\n\n        /**\n         * Send event to show loading error\n         * @param {string} name - spinner name\n         */\n        function showLoadingError(name) {\n            $rootScope.$broadcast('element-loading-status_show-error', { name: name });\n        }\n\n        /**\n         * Send event to hide loading error\n         * @param {string} name - spinner name\n         */\n        function hideLoadingError(name) {\n            $rootScope.$broadcast('element-loading-status_hide-error', { name: name });\n        }\n\n        /**\n         * Send event to show group of loading errors\n         * @param {Array} names - array of strings representing errors names\n         */\n        function showLoadingErrorGroup(names) {\n            angular.forEach(names, showLoadingError);\n        }\n\n        /**\n         * Send event to show group of loading errors\n         * @param {Array} names - array of strings representing errors names\n         */\n        function hideLoadingErrorGroup(names) {\n            angular.forEach(names, hideLoadingError);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    EventHelperService.$inject = ['$q', '$timeout', 'lodash'];\n    angular.module('iguazio.dashboard-controls').factory('EventHelperService', EventHelperService);\n\n    function EventHelperService($q, $timeout, lodash) {\n        return {\n            BACKSPACE: 8,\n            DOWN: 40,\n            ENTER: 13,\n            ESCAPE: 27,\n            SPACE: 32,\n            TABKEY: 9,\n            UP: 38,\n            getFocusedElement: getFocusedElement,\n            isLeftMousePressed: isLeftMousePressed,\n            isRightMousePressed: isRightMousePressed,\n            isCtrlOrCmdPressed: isCtrlOrCmdPressed,\n            isShiftPressed: isShiftPressed\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Gets the HTML element that is receiving the focus after this `blur` event.\n         * New browsers support `event.relatedEvent`.\n         * Older browsers do not support it, but they do support `document.activeElement` which is updated only\n         * on next event-loop \"tick\".\n         * @param {FocusEvent} event - The `blur` event.\n         * @returns {Promise.<HTMLElement>} A promise that resolves to the HTML element that is receiving the focus\n         *     on this `blur` event.\n         */\n        function getFocusedElement(event) {\n            return lodash.hasIn(event, 'relatedTarget') ? $q.when(event.relatedTarget) : $timeout(function () {\n                return document.activeElement;\n            });\n        }\n\n        /**\n         * Checks whether the event invoked by left mouse click\n         * @param {MouseEvent} event\n         * @returns {boolean}\n         */\n        function isLeftMousePressed(event) {\n            return event.which === 1;\n        }\n\n        /**\n         * Checks whether the event invoked by left mouse click\n         * @param {MouseEvent} event\n         * @returns {boolean}\n         */\n        function isRightMousePressed(event) {\n            return event.which === 3;\n        }\n\n        /**\n         * Checks whether Shift key was pressed when the event invoked\n         * @param {MouseEvent} event\n         * @returns {boolean}\n         */\n        function isShiftPressed(event) {\n            return event.shiftKey;\n        }\n\n        /**\n         * Checks whether Ctrl or Cmd key was pressed when the event invoked\n         * @param {MouseEvent} event\n         * @returns {boolean}\n         */\n        function isCtrlOrCmdPressed(event) {\n            return event.ctrlKey || event.metaKey;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    FormValidationService.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').factory('FormValidationService', FormValidationService);\n\n    // Service with helpers methods for form validation needs\n    function FormValidationService(lodash) {\n        return {\n            isShowFormInvalidState: isShowFormInvalidState,\n            isShowFieldInvalidState: isShowFieldInvalidState,\n            isShowFieldError: isShowFieldError,\n            isFormValid: isFormValid,\n            isFieldValid: isFieldValid,\n            validateAllFields: validateAllFields\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Check if the form is in an invalid state\n         * @param {Object} form - form to check\n         * @returns {boolean}\n         */\n        function isShowFormInvalidState(form) {\n            return !form ? false : lodash.some(form, function (property) {\n                return property.charAt(0) !== '$' && // skip AngularJS native properties\n                Object.prototype.hasOwnProperty.call(form[property], '$dirty') && Object.prototype.hasOwnProperty.call(form[property], '$invalid') && isShowFieldInvalidState(form, property);\n            });\n        }\n\n        /**\n         * Check if the field is in an invalid state\n         * @param {Object} form - form which owns the field\n         * @param {string} elementName - field name\n         * @returns {boolean}\n         */\n        function isShowFieldInvalidState(form, elementName) {\n            return !form || !form[elementName] ? false : (form.$submitted || form[elementName].$dirty) && form[elementName].$invalid;\n        }\n\n        /**\n         * Check if the field has a specific error\n         * @param {Object} form - form which owns the field\n         * @param {string} elementName - field name\n         * @param {string} errorName - error name\n         * @returns {boolean}\n         */\n        function isShowFieldError(form, elementName, errorName) {\n            return !form || !form[elementName] ? false : form[elementName].$error[errorName];\n        }\n\n        /**\n         * Check if the form is valid\n         * @param {Object} form - form to check\n         * @returns {boolean}\n         */\n        function isFormValid(form) {\n            return !form ? true : lodash.every(form, function (property) {\n                return property.charAt(0) === '$' || // skip AngularJS native properties\n                !Object.prototype.hasOwnProperty.call(form[property], '$valid') || isFieldValid(form, property);\n            });\n        }\n\n        /**\n         * Check if the field of the form is valid\n         * @param {Object} form - form which owns the field\n         * @param {string} elementName - name of the field to check\n         * @param {boolean} [validateOnSubmit=false] - if this parameter was passed, that means next -\n         *     validate field only if form was submitted. Otherwise validates field all the time\n         * @returns {boolean}\n         */\n        function isFieldValid(form, elementName, validateOnSubmit) {\n            var formSubmitted = lodash.get(form, '$submitted', false);\n            var elementValid = lodash.get(form, elementName + '.$valid', true);\n\n            return lodash.defaultTo(validateOnSubmit, false) && !formSubmitted || elementValid;\n        }\n\n        /**\n         * Validates all the fields of a form. Recursively validates fields in nested forms (both immediate and deep).\n         * @param {Object} form - The form controller (`ngForm`).\n         */\n        function validateAllFields(form) {\n            lodash.invokeMap(getFields(form), '$validate');\n        }\n\n        //\n        // Private functions\n        //\n\n        /**\n         * Returns a list of all controls (immediate and nested) of the provided control in case it is a form\n         * (`ngForm`), or the control itself in case it is a field (`ngModel`).\n         * @param {Object} control - The form controller (`ngForm`) or the model controller (`ngForm`).\n         * @returns {Array.<Object>} An array of model controllers (`ngModel`) of all the fields of `control` in case it\n         *     is a form, or an array with `control` only in case it is a field.\n         */\n        function getFields(control) {\n            var controls = lodash.hasIn(control, '$getControls') ? lodash.map(control.$getControls(), getFields) : [control];\n            return lodash.flattenDeep(controls);\n        }\n    }\n})();\n'use strict';\n\nangular.module('angular-i18next', []).provider('i18next', [function () {\n    this.$get = ['$window', function ($window) {\n        return $window.i18next;\n    }];\n}]);\n'use strict';\n\n(function () {\n    'use strict';\n\n    LocalStorageService.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').factory('LocalStorageService', LocalStorageService);\n\n    function LocalStorageService(lodash) {\n        return {\n            clearAll: clearAll,\n            getItem: getItem,\n            removeItem: removeItem,\n            setItem: setItem\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Removes all data from local storage\n         */\n        function clearAll() {\n            localStorage.clear();\n        }\n\n        /**\n         * Directly gets a value from local storage\n         * @param {string} namespace - localStorage namespace (e.g.: 'login', 'session')\n         * @param {string} key - key nested in namespace\n         * @returns {*} value stored at `key` in `namespace` object stored at `namespace` in `localStorage`, or\n         *     the entire namespace as a plain object\n         */\n        function getItem(namespace, key) {\n            var namespaceObject = getNamespace(namespace);\n            return arguments.length === 1 ? namespaceObject : lodash.get(namespaceObject, key, null);\n        }\n\n        /**\n         * Removes keys from localStorage\n         * @param {string} namespace - localStorage namespace (e.g.: 'login', 'session')\n         * @param {Array.<string>|string} keys - key(s) to be removed; if not provided, removes the entire namespace\n         */\n        function removeItem(namespace, keys) {\n            if (arguments.length === 1) {\n                localStorage.removeItem(namespace);\n            } else {\n                var namespaceObject = getNamespace(namespace);\n\n                if (!lodash.isNil(namespaceObject)) {\n\n                    // omit provided keys from provided namespace,\n                    var reducedNamespace = lodash.omit(getNamespace(namespace), keys);\n\n                    // update the provided namespace with the result\n                    localStorage.setItem(namespace, angular.toJson(reducedNamespace));\n                }\n            }\n        }\n\n        /**\n         * Directly adds a value to local storage\n         * @param {string} namespace - localStorage namespace (e.g.: 'login', 'session')\n         * @param {string|Object} key - key to be set. If key is object then set whole object to localStorage.\n         *     Otherwise add/set key-value pair to existing localStorage object.\n         * @param {string} value - value to be set\n         */\n        function setItem(namespace, key, value) {\n            if (arguments.length === 2 && lodash.isObject(key)) {\n                localStorage.setItem(namespace, angular.toJson(key));\n            } else if (arguments.length > 2 && lodash.isString(key) && !lodash.isNil(value)) {\n                var localStorageObject = getNamespace(namespace);\n\n                if (lodash.isNil(localStorageObject)) {\n                    localStorageObject = {};\n                }\n\n                lodash.set(localStorageObject, [key], value);\n                localStorage.setItem(namespace, angular.toJson(localStorageObject));\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Retrieves the value of `namespace` in local storage as a plain object\n         * @param {string} namespace - the namespace to retrieve\n         * @returns {?Object} the de-serialized JSON string in `namespace` key in `localStorage`\n         *     or `null` if `namespace` does not exist in `localStorage` or if its content is not a serialized JSON\n         */\n        function getNamespace(namespace) {\n            try {\n                return angular.fromJson(localStorage.getItem(namespace));\n            } catch (error) {\n                return null;\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    /*\n     * Increase/set-back scrollable mCSB_container height if needed\n     * to be able to scroll it down to see dropdown hidden by container's overflow\n     *\n     * Usage:\n     * 1) Init method with passed needed element and class selectors (inside link-function)\n     * preventDropdownCutOff(element, '.dropdown-element-class', '.scrollable-element-class');\n     *\n     * !!!Please note that service is using \"enter\" and \"leave\" animation events of `$animate` service.\n     * The following directives support these events:\n     * - ngRepeat\n     * - ngView\n     * - ngInclude\n     * - ngSwitch\n     * - ngIf\n     * - ngMessage\n     */\n\n    PreventDropdownCutOffService.$inject = ['$animate', '$document'];\n    angular.module('iguazio.dashboard-controls').factory('PreventDropdownCutOffService', PreventDropdownCutOffService);\n\n    function PreventDropdownCutOffService($animate, $document) {\n\n        // Margin for the better look\n        var MARGIN_BOTTOM = 15;\n\n        return {\n            preventDropdownCutOff: preventDropdownCutOff,\n            resizeScrollBarContainer: resizeScrollBarContainer,\n            onShowPreventDropdownCutOff: onShowPreventDropdownCutOff\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Increase/set-back scrollable mCSB_container height if needed to be able to scroll down it to see dropdown\n         * hidden by container's overflow\n         * @param {Object} currentElement - dropdown directive element\n         * @param {string} dropdownElementClass - dropdown menu element class selector\n         * @param {?string} scrollableElementClass - scrollable container element class selector. Note that \"scrollableElementClass\"\n         * class should be in one class together with \".mCSB_container\" class\n         */\n        function preventDropdownCutOff(currentElement, dropdownElementClass, scrollableElementClass) {\n            var dropdownElement;\n            var scrollableElement;\n\n            $animate.on('enter', currentElement, function (element, phase) {\n                dropdownElement = currentElement.find(dropdownElementClass).last();\n\n                if (dropdownElement[0] === element[0]) {\n                    scrollableElement = resizeElement(currentElement, dropdownElement, scrollableElementClass, phase);\n                }\n            });\n\n            $animate.on('leave', currentElement, function (element, phase) {\n                if (angular.isElement(scrollableElement) && phase === 'close') {\n                    scrollableElement.height('auto');\n                }\n            });\n        }\n\n        /**\n         * Resize scrollBar container('.mCSB_container') regarding target element.\n         * If targetElement does not visible through cutOff then resize scrollBar container to needed height.\n         * @param {Object} currentElement - contains target element\n         * @param {Object} targetElement - scrollBar container should be resized regarding this element\n         */\n        function resizeScrollBarContainer(currentElement, targetElement) {\n            var scrollbarContainer = currentElement.closest('.mCSB_container');\n            var target = currentElement.find(targetElement);\n\n            if (scrollbarContainer.length === 1 && target.length === 1) {\n                var newHeight = target.offset().top + target.height();\n\n                scrollbarContainer.css('height', (newHeight > scrollbarContainer.height() ? newHeight : scrollbarContainer.height()) + 'px');\n            }\n        }\n\n        /**\n         * Increase/set-back scrollable mCSB_container height and it's parent\n         * to be able to scroll down it to see dropdown hidden by container's overflow\n         * should be used with ng-show\n         * @param {Object} currentElement - dropdown directive element\n         * @param {string} dropdownElementClass - dropdown menu element class selector\n         * @param {?string} scrollableElementClass - scrollable container element class selector. Note that \"scrollableElementClass\"\n         * class should be in one class together with \".mCSB_container\" class\n         */\n        function onShowPreventDropdownCutOff(currentElement, dropdownElementClass, scrollableElementClass) {\n            $animate.on('removeClass', currentElement, function (element, phase) {\n                var dropdownElement = currentElement.find(dropdownElementClass).last();\n\n                if (dropdownElement[0] === element[0]) {\n                    resizeElement(currentElement, dropdownElement, scrollableElementClass, phase);\n                }\n            });\n        }\n\n        /**\n         * Resize element and parent to prevent dropdown cutoff\n         * @param {Object} currentElement - dropdown directive element\n         * @param {Object} dropdownElement - dropdown menu directive element\n         * @param {?string} scrollableElementClass - scrollable container element class selector. Note that \"scrollableElementClass\"\n         * @param {string} phase - current phase from the event\n         */\n        function resizeElement(currentElement, dropdownElement, scrollableElementClass, phase) {\n            var scrollableElement;\n            var parentScrollableElement;\n\n            // Set default scrollable container class if undefined\n            scrollableElementClass = scrollableElementClass || '.mCSB_container';\n\n            scrollableElement = currentElement.closest(scrollableElementClass);\n            if (scrollableElement.length > 0 && (phase === 'close' || phase === 'start')) {\n                parentScrollableElement = scrollableElement.parent();\n\n                var dropDownOffsetBottom = $document.height() - dropdownElement.outerHeight(true) - dropdownElement.offset().top;\n                var containerOffsetBottom = $document.height() - scrollableElement.outerHeight(true) - scrollableElement.offset().top;\n                var newHeight = scrollableElement.outerHeight(true) + (containerOffsetBottom - dropDownOffsetBottom) + MARGIN_BOTTOM;\n\n                if (dropDownOffsetBottom < containerOffsetBottom) {\n\n                    // Set scrollableElement's height to needed value\n                    scrollableElement.height(newHeight);\n                    if (parentScrollableElement.height() < newHeight) {\n                        parentScrollableElement.height(newHeight);\n                    }\n                }\n            } else {\n                scrollableElement.height('auto');\n            }\n\n            return scrollableElement;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    PriorityDropdownService.$inject = ['$i18next', 'i18next'];\n    angular.module('iguazio.dashboard-controls').factory('PriorityDropdownService', PriorityDropdownService);\n\n    function PriorityDropdownService($i18next, i18next) {\n        return {\n            getName: getName,\n            getPrioritiesArray: getPrioritiesArray\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Gets array of priority types\n         * @returns {Array}\n         */\n        function getPrioritiesArray() {\n            var lng = i18next.language;\n\n            return [{\n                name: $i18next.t('common:REAL_TIME', { lng: lng }),\n                type: 'realtime',\n                icon: {\n                    name: 'igz-icon-priority-realtime'\n                }\n            }, {\n                name: $i18next.t('common:HIGH', { lng: lng }),\n                type: 'high',\n                icon: {\n                    name: 'igz-icon-priority-high'\n                }\n            }, {\n                name: $i18next.t('common:STANDARD', { lng: lng }),\n                type: 'standard',\n                icon: {\n                    name: 'igz-icon-priority-standard'\n                }\n            }, {\n                name: $i18next.t('common:LOW', { lng: lng }),\n                type: 'low',\n                icon: {\n                    name: 'igz-icon-priority-low'\n                }\n            }];\n        }\n\n        /**\n         * Gets name of priority depends on type\n         * @param {string} type\n         * @returns {string}\n         */\n        function getName(type) {\n            var lng = i18next.language;\n\n            return type === 'realtime' ? $i18next.t('common:REAL_TIME', { lng: lng }) : type === 'high' ? $i18next.t('common:HIGH', { lng: lng }) : type === 'standard' ? $i18next.t('common:STANDARD', { lng: lng }) : type === 'low' ? $i18next.t('common:LOW', { lng: lng }) : '';\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    scale.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').filter('scale', scale);\n\n    function scale(lodash) {\n        var unitsConfig = {\n            'nanos': [{ threshold: 1000000000, unit: '' }, { threshold: 1000000, unit: 'm' }, { threshold: 1000, unit: 'µ' }, { threshold: 0.05, unit: 'n', divisor: 1 }, '0'],\n            'default': [{ threshold: 1000000000, unit: ' G', precision: 2 }, { threshold: 1000000, unit: ' M', precision: 2 }, { threshold: 1000, unit: ' K', precision: 2 }, { threshold: 1, unit: '', precision: 0 }, { threshold: 0.05, unit: '', precision: 1, divisor: 1 }, '0']\n        };\n\n        return function (value, precision, type) {\n            var units = lodash.defaultTo(unitsConfig[type], unitsConfig.default);\n            var step = lodash.find(units, function (item) {\n                return value >= item.threshold;\n            });\n\n            if (lodash.isUndefined(step)) {\n                return lodash.last(units);\n            }\n\n            var precisionToUse = lodash.defaultTo(lodash.defaultTo(precision, step.precision), 0);\n\n            return (value / lodash.defaultTo(step.divisor, step.threshold)).toFixed(precisionToUse) + step.unit;\n        };\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    SeverityDropdownService.$inject = ['$i18next', 'i18next'];\n    angular.module('iguazio.dashboard-controls').factory('SeverityDropdownService', SeverityDropdownService);\n\n    function SeverityDropdownService($i18next, i18next) {\n        return {\n            getSeveritiesArray: getSeveritiesArray\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Gets array of severity types\n         * @returns {Array}\n         */\n        function getSeveritiesArray() {\n            var lng = i18next.language;\n            return [{\n                name: $i18next.t('common:ERROR', { lng: lng }),\n                type: 'error',\n                icon: {\n                    name: 'igz-icon-warning severity-icon critical'\n                }\n            }, {\n                name: $i18next.t('common:DEBUG', { lng: lng }),\n                type: 'debug',\n                icon: {\n                    name: 'igz-icon-warning severity-icon major'\n                }\n            }, {\n                name: $i18next.t('common:WARNING', { lng: lng }),\n                type: 'warning',\n                icon: {\n                    name: 'igz-icon-warning severity-icon warning'\n                }\n            }, {\n                name: $i18next.t('common:INFO', { lng: lng }),\n                type: 'info',\n                icon: {\n                    name: 'igz-icon-info-round severity-icon info'\n                }\n            }];\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    TableSizeService.$inject = ['lodash', 'ConfigService'];\n    angular.module('iguazio.dashboard-controls').factory('TableSizeService', TableSizeService);\n\n    function TableSizeService(lodash, ConfigService) {\n        var clustersTableColSizes = {\n            name: '15',\n            status: '10',\n            alerts: '7-5',\n            nodes: '7',\n            sessions: ConfigService.isStagingMode() ? '5' : '6',\n            cpu: '17-5',\n            size: '10',\n            bandwidth: ConfigService.isStagingMode() ? '7' : '9',\n            io: ConfigService.isStagingMode() ? '7' : '9',\n            latency: ConfigService.isStagingMode() ? '7' : '9',\n            scannedItems: ConfigService.isStagingMode() ? '7' : null,\n            emptyBlock: '58'\n        };\n        var containersTableColSizes = {\n            name: {\n                production: '28',\n                demo: '12',\n                staging: '25'\n            },\n            usedCapacity: {\n                production: '28',\n                demo: '20',\n                staging: '25'\n            },\n            bandwidth: {\n                production: '15',\n                demo: '12',\n                staging: '12-5'\n            },\n            iops: {\n                production: '15',\n                demo: '10',\n                staging: '12-5'\n            },\n            latency: {\n                production: '14',\n                demo: '11',\n                staging: '12-5'\n            },\n            scannedItems: {\n                production: null,\n                demo: '10',\n                staging: '12-5'\n            }\n        };\n        var eventsTableColSizes = {\n            time: {\n                'event-log': {\n                    default: '25',\n                    demo: '17-5'\n                },\n                'communication': {\n                    default: '25',\n                    demo: '17-5'\n                },\n                'audit': {\n                    default: '20',\n                    demo: '20'\n                }\n            },\n            severity: {\n                'event-log': {\n                    default: '2-5',\n                    demo: '2-5'\n                },\n                'communication': {\n                    default: '2-5',\n                    demo: '2-5'\n                },\n                'audit': {\n                    default: '5',\n                    demo: '5'\n                }\n            },\n            kind: {\n                'event-log': {\n                    default: '25',\n                    demo: '16'\n                },\n                'communication': {\n                    default: '25',\n                    demo: '16'\n                },\n                'audit': {\n                    default: '20',\n                    demo: '20'\n                }\n            },\n            classification: {\n                'event-log': {\n                    default: '12-5',\n                    demo: '10'\n                },\n                'communication': {\n                    default: '12-5',\n                    demo: '10'\n                },\n                'audit': {\n                    default: '20',\n                    demo: '20'\n                }\n            },\n            source: {\n                'event-log': {\n                    default: '14',\n                    demo: '14'\n                },\n                'communication': {\n                    default: '14',\n                    demo: '14'\n                }\n            },\n            tags: {\n                'event-log': {\n                    default: '12-5',\n                    demo: '12-5'\n                },\n                'communication': {\n                    default: '12-5',\n                    demo: '12-5'\n                }\n            },\n            objects: {\n                'event-log': {\n                    default: '12-5',\n                    demo: '12-5'\n                },\n                'communication': {\n                    default: '12-5',\n                    demo: '12-5'\n                }\n            },\n            description: {\n                'event-log': {\n                    default: '35',\n                    demo: '15'\n                },\n                'communication': {\n                    default: '35',\n                    demo: '15'\n                },\n                'audit': {\n                    default: '35',\n                    demo: '35'\n                }\n            }\n        };\n        var functionsTableColSizes = {\n            headerName: {\n                default: '17-5',\n                demo: '12-5'\n            },\n            rowName: {\n                default: '17-5',\n                demo: '12-5'\n            },\n            status: {\n                default: '10',\n                demo: '7-5'\n            },\n            replicas: {\n                default: '5',\n                demo: '5'\n            }\n        };\n\n        return {\n            getClustersTableColSize: getClustersTableColSize,\n            getContainersTableColSize: getContainersTableColSize,\n            getEventsTableColSize: getEventsTableColSize,\n            getFunctionsTableColSize: getFunctionsTableColSize\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Gets the size of clusters table column\n         * @param {string} column - name of the column\n         * @returns {string} column class\n         */\n        function getClustersTableColSize(column) {\n            return 'igz-col-' + lodash.get(clustersTableColSizes, column);\n        }\n\n        /**\n         * Gets the size of containers table column\n         * @param {string} column - name of the column\n         * @returns {string} column class\n         */\n        function getContainersTableColSize(column) {\n            var columnSizes = lodash.get(containersTableColSizes, column);\n            var columnSize = '';\n\n            if (ConfigService.isDemoMode()) {\n                columnSize = lodash.get(columnSizes, 'demo');\n            } else if (ConfigService.isStagingMode()) {\n                columnSize = lodash.get(columnSizes, 'staging');\n            } else {\n                columnSize = lodash.get(columnSizes, 'production');\n            }\n\n            return 'igz-col-' + columnSize;\n        }\n\n        /**\n         * Gets the size of events table column\n         * @param {string} column - name of the column\n         * @param {string} tabName - name of the tab\n         * @returns {string} css class\n         */\n        function getEventsTableColSize(column, tabName) {\n            return 'igz-col-' + lodash.get(eventsTableColSizes, [column, tabName, ConfigService.isDemoMode() ? 'demo' : 'default']);\n        }\n\n        /**\n         * Gets the size of functions table column\n         * @param {string} column - name of the column\n         * @returns {string} css class\n         */\n        function getFunctionsTableColSize(column) {\n            return 'igz-col-' + lodash.get(functionsTableColSizes, [column, ConfigService.isDemoMode() ? 'demo' : 'default']);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    UnloadPageService.$inject = ['$window'];\n    angular.module('iguazio.dashboard-controls').factory('UnloadPageService', UnloadPageService);\n\n    function UnloadPageService($window) {\n        return {\n            registerBeforeUnloadPageCallback: registerBeforeUnloadPageCallback\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Registers beforeunload page callback.\n         * It calls isDataChanged callback to track if changes has been made on the page.\n         * If yes - then show confirmation dialog which prevents from user to lose unsaved data\n         * @param {Function} isDataChanged - callback which tracks if changes has been made\n         */\n        function registerBeforeUnloadPageCallback(isDataChanged) {\n\n            // @if !IGZ_E2E_TESTING\n            $window.addEventListener('beforeunload', function (e) {\n                if (isDataChanged()) {\n\n                    // Cancel the event\n                    e.preventDefault();\n\n                    // Chrome requires returnValue to be set\n                    e.returnValue = true;\n                }\n            });\n            // @endif\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    ValidationService.$inject = ['$i18next', 'i18next', 'lodash'];\n    angular.module('iguazio.dashboard-controls').factory('ValidationService', ValidationService);\n\n    function ValidationService($i18next, i18next, lodash) {\n        var lng = i18next.language;\n\n        var lengths = {\n            default: 128,\n            k8s: {\n                configMapKey: 253,\n                dns1035Label: 63,\n                dns1123Label: 63,\n                dns1123Subdomain: 253,\n                prefixedQualifiedName: 253,\n                qualifiedName: 63,\n                wildcardDns1123Subdomain: 253\n            },\n            function: {\n                name: 56,\n                label: {\n                    key: 250\n                },\n                eventName: 128,\n                imageName: 255,\n                itemPath: 255,\n                containerSubPath: 255,\n                triggerName: 128,\n                v3ioConsumerGroupName: 256\n            },\n            service: {\n                name: 53,\n                resources: 253,\n                persistentVolumeClaims: {\n                    value: 255\n                }\n            },\n            container: {\n                name: 128,\n                description: 150,\n                alias: 40,\n                ruleName: 128,\n                email: 100,\n                http: 100,\n                sms: 19,\n                stream: -1,\n                attribute: {\n                    name: 256,\n                    string: 512\n                },\n                fileEdit: {\n                    fieldName: 128,\n                    fieldDescription: 128,\n                    geohash: 8,\n                    id: 36,\n                    negativeInteger: 9,\n                    email: 40,\n                    custom: 100\n                }\n            },\n            cluster: {\n                name: 128,\n                description: 150,\n                node: {\n                    name: 128,\n                    description: 128\n                }\n            },\n            storagePool: {\n                name: 30,\n                description: 150,\n                url: 100\n            },\n            network: {\n                name: 30,\n                description: 150\n            },\n            identity: {\n                user: {\n                    name: 30,\n                    username: 32,\n                    email: 128,\n                    position: 128,\n                    department: 128\n                },\n                group: {\n                    name: 128,\n                    description: 128\n                }\n            },\n            tenant: {\n                name: 31,\n                email: 128\n            },\n            events: {\n                escalation: {\n                    name: 40\n                }\n            },\n            phone: 17\n        };\n        var generateRule = {\n            beginWith: function beginWith(chars) {\n                return {\n                    name: 'begin',\n                    label: $i18next.t('common:BEGIN_WITH', { lng: lng }) + ': ' + convertToLabel(chars),\n                    pattern: new RegExp('^[' + convertToPattern(chars) + ']')\n                };\n            },\n            beginNotWith: function beginNotWith(chars) {\n                return {\n                    name: 'beginNot',\n                    label: $i18next.t('common:BEGIN_NOT_WITH', { lng: lng }) + ': ' + convertToLabel(chars),\n                    pattern: new RegExp('^[^' + convertToPattern(chars) + ']')\n                };\n            },\n            endWith: function endWith(chars) {\n                return {\n                    name: 'end',\n                    label: $i18next.t('common:END_WITH', { lng: lng }) + ': ' + convertToLabel(chars),\n                    pattern: new RegExp('[' + convertToPattern(chars) + ']$')\n                };\n            },\n            beginEndWith: function beginEndWith(chars) {\n                var convertedPattern = convertToPattern(chars);\n\n                return {\n                    name: 'beginEnd',\n                    label: $i18next.t('common:BEGIN_END_WITH', { lng: lng }) + ': ' + convertToLabel(chars),\n                    pattern: new RegExp('^([' + convertedPattern + '].*)?[' + convertedPattern + ']$')\n                };\n            },\n            beginEndNotWith: function beginEndNotWith(chars) {\n                var convertedPattern = convertToPattern(chars);\n\n                return {\n                    name: 'beginEndNot',\n                    label: $i18next.t('common:BEGIN_END_NOT_WITH', { lng: lng }) + ': ' + convertToLabel(chars),\n                    pattern: new RegExp('^([^' + convertedPattern + '].*)?[^' + convertedPattern + ']$')\n                };\n            },\n            validCharacters: function validCharacters(chars) {\n                return {\n                    name: 'validCharacters',\n                    label: $i18next.t('common:VALID_CHARACTERS', { lng: lng }) + ': ' + convertToLabel(chars),\n                    pattern: new RegExp('^[' + convertToPattern(chars) + ']+$')\n                };\n            },\n            length: function length(options) {\n                var min = Number.isSafeInteger(options.min) ? options.min : 0;\n                var max = Number.isSafeInteger(options.max) ? options.max : '';\n\n                if (min || max) {\n                    var label = $i18next.t('common:LENGTH', { lng: lng }) + ' – ' + (min ? 'min: ' + options.min + '\\xa0\\xa0' : '') + (max ? 'max: ' + options.max : '');\n\n                    return {\n                        name: 'length',\n                        label: label,\n                        pattern: new RegExp('^[\\\\S\\\\s]{' + min + ',' + max + '}$')\n                    };\n                }\n            },\n            noConsecutiveCharacters: function noConsecutiveCharacters(chars) {\n                var convertedPattern = chars.split(' ').map(function (charPair) {\n                    var charsPairArray = charPair.split('');\n\n                    return '(?!.*' + '\\\\' + charsPairArray[0] + '\\\\' + charsPairArray[1] + ')';\n                }).join('');\n\n                return {\n                    name: 'noConsecutiveCharacters',\n                    label: $i18next.t('common:NO_CONSECUTIVE_CHARACTER', { lng: lng }) + ': ' + convertToLabel(chars),\n                    pattern: new RegExp('^' + convertedPattern)\n                };\n            },\n            onlyAtTheBeginning: function onlyAtTheBeginning(chars) {\n                var convertedPattern = convertToPattern(chars);\n\n                return {\n                    name: 'onlyAtTheBeginning',\n                    label: $i18next.t('common:ONLY_AT_THE_BEGINNING', { lng: lng }) + ': ' + convertToLabel(chars),\n                    pattern: new RegExp('^([' + convertedPattern + '])?[^' + convertedPattern + ']+$')\n                };\n            }\n        };\n        var commonRules = {\n            integer: [generateRule.validCharacters('0-9'), {\n                name: 'beginNot',\n                label: $i18next.t('common:BEGIN_NOT_WITH', { lng: lng }) + ': 0',\n                pattern: /^(?!0.+)/\n            }],\n            negativeInteger: [generateRule.validCharacters('0-9 -'), generateRule.onlyAtTheBeginning('-'), {\n                name: 'beginNot',\n                label: $i18next.t('common:BEGIN_NOT_WITH', { lng: lng }) + ': 0',\n                pattern: /^(?![-]0)(?!0.+)/\n            }],\n            email: [generateRule.beginEndNotWith('@ .'), {\n                name: 'exactlyOne',\n                label: $i18next.t('common:MUST_CONTAIN_EXACTLY_ONE', { lng: lng }) + ': @',\n                pattern: /^[^@]+@[^@]+$/\n            }, {\n                name: 'dotAfterAt',\n                label: $i18next.t('common:MUST_HAVE_DOT_AFTER_AT', { lng: lng }),\n                pattern: /@.+\\..+$/\n            }],\n            dns1035Label: [generateRule.validCharacters('a-z 0-9 -'), generateRule.beginWith('a-z'), generateRule.endWith('a-z 0-9')],\n            prefixedQualifiedName: [{\n                name: 'nameValidCharacters',\n                label: '[' + $i18next.t('common:NAME', { lng: lng }) + '] ' + $i18next.t('common:VALID_CHARACTERS', { lng: lng }) + ': a–z, A–Z, 0–9, –, _, .',\n                pattern: /^([^/]+\\/)?[\\w.-]+$/\n            }, {\n                name: 'nameBeginEnd',\n                label: '[' + $i18next.t('common:NAME', { lng: lng }) + '] ' + $i18next.t('common:BEGIN_END_WITH', { lng: lng }) + ': a–z, A–Z, 0–9',\n                pattern: /^([^/]+\\/)?([A-Za-z0-9][^/]*)?[A-Za-z0-9]$/\n            }, {\n                name: 'nameMaxLength',\n                label: '[' + $i18next.t('common:NAME', { lng: lng }) + '] ' + $i18next.t('common:MAX_LENGTH_CHARACTERS', { lng: lng, count: 63 }),\n                pattern: /^([^/]+\\/)?[^/]{1,63}$/\n            }, {\n                name: 'prefixValidCharacters',\n                label: '[' + $i18next.t('functions:PREFIX', { lng: lng }) + '] ' + $i18next.t('common:VALID_CHARACTERS', { lng: lng }) + ': a–z, 0–9, –, .',\n                pattern: /^([a-z0-9.-]+\\/)?[^/]+$/\n            }, {\n                name: 'prefixBeginEnd',\n                label: '[' + $i18next.t('functions:PREFIX', { lng: lng }) + '] ' + $i18next.t('common:BEGIN_END_WITH', { lng: lng }) + ': a–z, 0–9',\n                pattern: /^([a-z0-9]([^/]*[a-z0-9])?\\/)?[^/]+$/\n            }, {\n                name: 'prefixNotStart',\n                label: '[' + $i18next.t('functions:PREFIX', { lng: lng }) + '] ' + $i18next.t('functions:NOT_START_WITH_FORBIDDEN_WORDS', { lng: lng }),\n                pattern: /^(?!kubernetes\\.io\\/)(?!k8s\\.io\\/)/\n            }, {\n                name: 'prefixMaxLength',\n                label: '[' + $i18next.t('functions:PREFIX', { lng: lng }) + '] ' + $i18next.t('common:MAX_LENGTH_CHARACTERS', { lng: lng, count: lengths.k8s.prefixedQualifiedName }),\n                pattern: /^(?![^/]{254,}\\/)/\n            }]\n        };\n        var validationRules = {\n            k8s: {\n                configMapKey: [generateRule.validCharacters('a-z A-Z 0-9 - _ .'), generateRule.length({ max: lengths.k8s.configMapKey })],\n                dns1035Label: commonRules.dns1035Label.concat(generateRule.length({ max: lengths.k8s.dns1035Label })),\n                dns1123Label: [generateRule.validCharacters('a-z 0-9 -'), generateRule.beginEndWith('a-z 0-9'), generateRule.length({ max: lengths.k8s.dns1123Label })],\n                dns1123Subdomain: [generateRule.validCharacters('a-z 0-9 - .'), generateRule.beginEndWith('a-z 0-9'), generateRule.noConsecutiveCharacters('.. .- -.'), generateRule.length({ max: lengths.k8s.dns1123Subdomain })],\n                envVarName: [generateRule.validCharacters('a-z A-Z 0-9 - _ .'), generateRule.beginNotWith('0-9 .')],\n                prefixedQualifiedName: commonRules.prefixedQualifiedName,\n                qualifiedName: [generateRule.validCharacters('a-z A-Z 0-9 - _ .'), generateRule.beginEndWith('a-z A-Z 0-9'), generateRule.length({ max: lengths.k8s.qualifiedName })],\n                wildcardDns1123Subdomain: [generateRule.validCharacters('a-z A-Z 0-9 - . *'), {\n                    name: 'begin',\n                    label: $i18next.t('common:BEGIN_WITH', { lng: lng }) + ': *.',\n                    pattern: /^\\*\\..*$/\n                }, generateRule.onlyAtTheBeginning('*'), generateRule.endWith('a-z 0-9'), generateRule.noConsecutiveCharacters('.. .- -.'), generateRule.length({ max: lengths.k8s.wildcardDns1123Subdomain })]\n            },\n            function: {\n                name: commonRules.dns1035Label.concat(generateRule.length({ max: lengths.function.name })),\n                label: {\n                    key: commonRules.prefixedQualifiedName.concat(generateRule.length({\n                        max: lengths.function.label.key\n                    }))\n                },\n                itemPath: [generateRule.length({ max: lengths.function.itemPath })],\n                subscriptionQoS: [generateRule.validCharacters('0-2'), generateRule.length({ max: 1 })],\n                arrayInt: [generateRule.validCharacters('0-9 - ,'), generateRule.beginEndWith('0-9'), generateRule.noConsecutiveCharacters(',-')],\n                interval: [{\n                    name: 'validCharacters',\n                    label: $i18next.t('common:VALID_CHARACTERS', { lng: lng }) + ': 0–9, m, s, h',\n                    pattern: /^[0-9msh]+$/\n                }, generateRule.beginWith('0-9'), {\n                    name: 'end',\n                    label: $i18next.t('common:END_WITH', { lng: lng }) + ': ms, s, m, h',\n                    pattern: /\\d+(ms|[smh])$/\n                }],\n                triggerName: [generateRule.validCharacters('a-z A-Z 0-9 - _'), generateRule.beginWith('a-z A-Z'), generateRule.length({ max: lengths.function.triggerName })],\n                v3ioConsumerGroupName: [generateRule.validCharacters('a-z A-Z 0-9 _'), generateRule.beginWith('a-z A-Z _'), generateRule.length({ max: lengths.function.v3ioConsumerGroupName })]\n            },\n            service: {\n                name: [generateRule.validCharacters('a-z 0-9 -'), generateRule.beginWith('a-z'), generateRule.endWith('a-z 0-9'), generateRule.length({ max: lengths.service.name })],\n                resources: {\n                    configuration: [generateRule.validCharacters('a-z A-Z 0-9 - _ .'), generateRule.beginNotWith('.'), generateRule.length({ max: lengths.service.resources })],\n                    catalog: [generateRule.validCharacters('a-z 0-9 - _ .'), generateRule.beginNotWith('.'), generateRule.length({ max: lengths.service.resources })]\n                },\n                persistentVolumeClaims: {\n                    value: [generateRule.length({ max: lengths.service.persistentVolumeClaims.value })]\n                }\n            },\n            container: {\n                name: [generateRule.validCharacters('a-z 0-9 - _'), generateRule.beginEndWith('a-z 0-9'), generateRule.noConsecutiveCharacters('--'), generateRule.noConsecutiveCharacters('__'), {\n                    name: 'atLeastOneLowercaseLetter',\n                    label: $i18next.t('common:CONTAIN_LOWERCASE_LETTER', { lng: lng }) + ': a–z',\n                    pattern: /^(?=.*[a-z])/\n                }, generateRule.length({ max: lengths.container.name })],\n                attribute: {\n                    name: [generateRule.validCharacters('a-z A-Z 0-9 _'), generateRule.beginWith('a-z A-Z _'), generateRule.length({ max: lengths.container.attribute.name })]\n                },\n                fileEdit: {\n                    geohash: [generateRule.validCharacters('a-z 0-9'), generateRule.length({ max: lengths.container.fileEdit.geohash })],\n                    id: [generateRule.validCharacters('a-z A-Z 0-9 -'), generateRule.length({ max: lengths.container.fileEdit.id })],\n                    negativeInteger: commonRules.negativeInteger.concat(generateRule.length({\n                        max: lengths.container.fileEdit.negativeInteger\n                    })),\n                    email: commonRules.email.concat(generateRule.length({ max: lengths.container.fileEdit.email })),\n                    custom: [generateRule.validCharacters('a-z A-Z 0-9 - _ . , s'), generateRule.length({ max: lengths.container.fileEdit.custom })]\n                },\n                email: commonRules.email.concat(generateRule.length({ max: lengths.container.email })),\n                minTimeToHoldInNewTier: commonRules.integer.concat(generateRule.length({ max: 3 })),\n                fullBackupOnEvery: commonRules.integer.concat(generateRule.length({ max: 2 })),\n                deleteFilesOlderThan: commonRules.integer.concat(generateRule.length({ max: 3 })),\n                alias: [generateRule.validCharacters('a-z A-Z 0-9 - _'), generateRule.length({ max: lengths.container.alias })]\n            },\n            storagePool: {\n                name: [generateRule.validCharacters('a-z A-Z 0-9 _'), generateRule.length({ max: lengths.storagePool.name })]\n            },\n            network: {\n                name: [generateRule.validCharacters('a-z A-Z 0-9 - . ( ) \\\\ / : s'), generateRule.length({ max: lengths.network.name })]\n            },\n            identity: {\n                user: {\n                    name: [generateRule.validCharacters('a-z A-Z - s'), generateRule.beginWith('a-z A-Z'), generateRule.length({ max: lengths.identity.user.name })],\n                    username: [generateRule.validCharacters('a-z A-Z 0-9 - _'), generateRule.beginWith('a-z A-Z'), generateRule.length({ max: lengths.identity.user.username })],\n                    email: commonRules.email.concat(generateRule.length({ max: lengths.identity.user.email })),\n                    position: [generateRule.length({ max: lengths.identity.user.position })],\n                    department: [generateRule.length({ max: lengths.identity.user.department })]\n                },\n                address: [{\n                    name: 'begin',\n                    label: $i18next.t('common:BEGIN_WITH', { lng: lng }) + ': ldaps://, ldap://',\n                    pattern: /^ldaps?:\\/\\//\n                }]\n            },\n            tenant: {\n                name: [generateRule.validCharacters('a-z A-Z 0-9 _'), generateRule.beginWith('a-z A-Z'), generateRule.endWith('a-z A-Z 0-9'), generateRule.length({ max: lengths.tenant.name })],\n                email: commonRules.email.concat(generateRule.length({ max: lengths.tenant.email }))\n            },\n            events: {\n                escalation: {\n                    name: [generateRule.validCharacters('a-z A-Z 0-9 - . ( ) \\\\ / : s'), generateRule.length({ max: lengths.events.escalation.name })]\n                }\n            },\n            integer: commonRules.integer,\n            negativeInteger: commonRules.negativeInteger,\n            negativeFloat: [generateRule.validCharacters('0-9 . -'), generateRule.onlyAtTheBeginning('-'), generateRule.endWith('0-9'), {\n                name: 'maxLengthWholePart',\n                label: $i18next.t('common:MAX_LENGTH_WHOLE_PART', { lng: lng, length: 9 }),\n                pattern: /^[-]?[\\d]{1,9}(\\..*)?$/\n            }, {\n                name: 'maxLengthDecimalPart',\n                label: $i18next.t('common:MAX_LENGTH_DECIMAL_PART', { lng: lng, length: 2 }),\n                pattern: /^[-]?(\\d+(\\.\\d{1,2})?)$/\n            }],\n            floatingPoint: [generateRule.validCharacters('0-9 . + - e E'), {\n                name: 'onlyAtTheBeginning',\n                label: $i18next.t('common:ONLY_AT_THE_BEGINNING_AND_EXPONENT', { lng: lng }),\n                pattern: /^[-+]?[^-+]+([eE].+)?$/\n            }, generateRule.beginWith('0-9 + -'), generateRule.endWith('0-9'), {\n                name: 'invalidExponent',\n                label: $i18next.t('common:EXPONENT_IS_INVALID', { lng: lng }),\n                pattern: /^[-+]?[^eE]+([eE][-+]?[0-9]+)?$/\n            }],\n            number: [generateRule.validCharacters('0-9')],\n            email: commonRules.email,\n            path: [generateRule.validCharacters('a-z A-Z - _ /'), generateRule.beginWith('/'), generateRule.endWith('a-z A-Z')],\n            phone: [generateRule.validCharacters('0-9 + -'), generateRule.onlyAtTheBeginning('+'), generateRule.beginWith('0-9 +'), generateRule.endWith('0-9'), generateRule.length({ min: 4, max: lengths.phone })]\n        };\n\n        return {\n            storage: /^[a-zA-Z0-9]+?:\\/\\/[a-zA-Z0-9_.-]+?:[a-zA-Z0-9_./-]+?@[a-zA-Z0-9_.-]+?$/,\n            url: /^[a-zA-Z0-9]+?:\\/\\/[a-zA-Z0-9_.-]+?:[a-zA-Z0-9_\\-.]+?@[a-zA-Z0-9_.-]+?$/,\n            timestamp: /^(?:\\d{4})-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2]\\d|3[0-1])T(?:[0-1]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?((?:[+-](?:[0-1]\\d|2[0-3]):[0-5]\\d)|Z)?$/,\n            ip: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\n            mask: /^(((255\\.){3}(255|254|252|248|240|224|192|128|0+))|((255\\.){2}(255|254|252|248|240|224|192|128|0+)\\.0)|((255\\.)(255|254|252|248|240|224|192|128|0+)(\\.0+){2})|((255|254|252|248|240|224|192|128|0+)(\\.0+){3}))$/,\n            hostName_IpAddress: /(^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$)|(^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9])\\.)+([A-Za-z]|[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9])$)/,\n            dockerReference: /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*(:\\d+)?\\/)?[a-z0-9]+(([._]|__|[-]*)[a-z0-9]+)*(\\/[a-z0-9]+(([._]|__|[-]*)[a-z0-9]+)*)*(:[\\w][\\w.-]{0,127})?(@[A-Za-z][A-Za-z0-9]*([-_+.][A-Za-z][A-Za-z0-9]*)*:[0-9a-fA-F]{32,})?$/,\n\n            getMaxLength: getMaxLength,\n            getValidationRules: getValidationRules\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Provides maximum length of text that can be filled in input\n         * @param {string} path - path to field\n         * @returns {number}\n         */\n        function getMaxLength(path) {\n            return lodash.cloneDeep(lodash.get(lengths, path, lengths.default));\n        }\n\n        /**\n         * Returns the list of validation rules for `type`, optionally appending provided additional rules.\n         * @param {string} type - The property path to the list of validation rules.\n         * @param {Array.<Object>} [additionalRules] - Additional rules to append.\n         * @returns {Array.<Object>} the rule list of type `type` with `additionalRules` appended to it if provided.\n         */\n        function getValidationRules(type, additionalRules) {\n            return lodash.chain(validationRules).get(type).defaultTo([]).cloneDeep().concat(lodash.defaultTo(additionalRules, [])).value();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Converts characters string to readable format\n         * Note: converts Hyphens to En Dashes, replaces one space with comma and space,\n         *       replaces letter `s` with `spaces` word\n         * @param {string} chars - characters to convert\n         * @returns {string} - converted string\n         * @example\n         * convertToLabel('a-z A-Z - _ *');\n         * // => 'a–z, A–Z, –, _, *'\n         */\n        function convertToLabel(chars) {\n            return chars.replace(/-/g, '–').replace(/\\s/g, ', ').replace(/\\bs\\b/, $i18next.t('common:SPACES', { lng: lng }));\n        }\n\n        /**\n         * Converts characters string to valid RegExp string that will be placed into RegExp pattern\n         * @param {string} chars - characters to convert\n         * @returns {string} - converted string\n         * @example\n         * convertToPattern('a-z A-Z - _ *');\n         * // => 'a-zA-Z\\-\\_\\*'\n         */\n        function convertToPattern(chars) {\n            return chars.split(' ').map(function (patternItem) {\n                return patternItem.length === 1 ? '\\\\' + patternItem : patternItem;\n            }).join('');\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    /*\n     * Gets window height and width\n     */\n\n    WindowDimensionsService.$inject = ['$document', '$window'];\n    angular.module('iguazio.dashboard-controls').factory('WindowDimensionsService', WindowDimensionsService);\n\n    function WindowDimensionsService($document, $window) {\n        return {\n            height: height,\n            width: width,\n            addOverflow: addOverflow,\n            removeOverflow: removeOverflow,\n            getElementPosition: getElementPosition\n        };\n\n        //\n        // Public methods\n        //\n\n        function height() {\n            var doc = $document[0];\n            return $window.innerHeight || doc.documentElement.clientHeight || doc.body.clientHeight;\n        }\n\n        function width() {\n            var doc = $document[0];\n            return $window.innerWidth || doc.documentElement.clientWidth || doc.body.clientWidth;\n        }\n\n        /**\n         * Method removes class which sets overflow to hidden\n         */\n        function addOverflow() {\n            $document.find('body').removeClass('no-overflow');\n        }\n\n        /**\n         * Method adds class which sets overflow to hidden\n         */\n        function removeOverflow() {\n            $document.find('body').addClass('no-overflow');\n        }\n\n        /**\n         * Calculates offset position of element according to its parent\n         * @param {HTMLElement} el\n         * @param {HTMLElement} parent\n         * @returns {{left: number, top: number, right: number, bottom: number}}\n         */\n        function getElementPosition(el, parent) {\n            var pos = {\n                left: 0,\n                top: 0,\n                right: el.offsetWidth,\n                bottom: el.offsetHeight\n            };\n\n            while (el.offsetParent && el.offsetParent !== parent) {\n                pos.left += el.offsetLeft;\n                pos.top += el.offsetTop;\n                el = el.offsetParent;\n            }\n\n            pos.right += pos.left;\n            pos.bottom += pos.top;\n\n            return pos;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzActionCheckbox.$inject = ['$scope', '$rootScope', 'lodash'];\n    angular.module('iguazio.dashboard-controls').component('igzActionCheckbox', {\n        bindings: {\n            item: '<',\n            itemType: '@?',\n            onClickCallback: '&?'\n        },\n        templateUrl: 'igz_controls/components/action-checkbox/action-checkbox.tpl.html',\n        controller: IgzActionCheckbox\n    });\n\n    function IgzActionCheckbox($scope, $rootScope, lodash) {\n        var ctrl = this;\n\n        ctrl.$onInit = onInit;\n\n        ctrl.onCheck = onCheck;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Constructor method\n         */\n        function onInit() {\n            $scope.$on('action-checkbox-all_check-all', toggleCheckedAll);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Handles mouse click on checkbox\n         * @param {Object} $event - event object\n         */\n        function onCheck($event) {\n            ctrl.item.ui.checked = !ctrl.item.ui.checked;\n\n            if (angular.isFunction(ctrl.onClickCallback)) {\n                $event.stopPropagation();\n                ctrl.onClickCallback();\n            }\n\n            $rootScope.$broadcast('action-checkbox_item-checked', {\n                item: ctrl.item,\n                itemType: !lodash.isEmpty(ctrl.itemType) ? ctrl.itemType : null,\n                checked: ctrl.item.ui.checked\n            });\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Triggers on Check all button clicked\n         * @param {Object} event\n         * @param {Object} data\n         */\n        function toggleCheckedAll(event, data) {\n            var isTypeValid = lodash.isNil(data.itemsType) || data.itemsType === ctrl.itemType;\n\n            if (ctrl.item.ui.checked !== data.checked && isTypeValid) {\n                ctrl.item.ui.checked = !ctrl.item.ui.checked;\n            }\n\n            if (angular.isFunction(ctrl.onClickCallback) && isTypeValid) {\n                ctrl.onClickCallback();\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzActionCheckboxAllController.$inject = ['$scope', '$rootScope', 'lodash'];\n    angular.module('iguazio.dashboard-controls').component('igzActionCheckboxAll', {\n        bindings: {\n            itemsCountOriginal: '<itemsCount',\n            itemsType: '@?',\n            checkedItemsCount: '<?',\n            onCheckChange: '&?'\n        },\n        templateUrl: 'igz_controls/components/action-checkbox-all/action-checkbox-all.tpl.html',\n        controller: IgzActionCheckboxAllController\n    });\n\n    function IgzActionCheckboxAllController($scope, $rootScope, lodash) {\n        var ctrl = this;\n\n        ctrl.allItemsChecked = false;\n\n        ctrl.$onInit = onInit;\n        ctrl.$onChanges = onChanges;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.onCheckAll = onCheckAll;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.checkedItemsCount = angular.isUndefined(ctrl.checkedItemsCount) ? 0 : ctrl.checkedItemsCount;\n            ctrl.itemsCount = angular.isUndefined(ctrl.itemsCount) ? 0 : ctrl.itemsCount;\n\n            $scope.$on('action-checkbox_item-checked', toggleCheckedItem);\n            $scope.$on('action-checkbox-all_change-checked-items-count', changeItemsCheckedCount);\n            $scope.$on('action-checkbox-all_set-checked-items-count', setCheckedItemsCount);\n        }\n\n        /**\n         * Changes method\n         * @param {Object} changes\n         */\n        function onChanges(changes) {\n            if (angular.isDefined(changes.itemsCountOriginal)) {\n                ctrl.itemsCount = ctrl.itemsCountOriginal;\n                testAllItemsChecked();\n            }\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            ctrl.checkedItemsCount = 0;\n\n            $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {\n                checkedCount: ctrl.checkedItemsCount\n            });\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Calls when Check all button is clicked.\n         */\n        function onCheckAll() {\n            ctrl.allItemsChecked = !ctrl.allItemsChecked;\n            ctrl.checkedItemsCount = ctrl.allItemsChecked ? ctrl.itemsCount : 0;\n\n            $rootScope.$broadcast('action-checkbox-all_check-all', {\n                checked: ctrl.allItemsChecked,\n                checkedCount: ctrl.checkedItemsCount,\n                itemsType: !lodash.isEmpty(ctrl.itemsType) ? ctrl.itemsType : null\n            });\n\n            if (angular.isFunction(ctrl.onCheckChange)) {\n                ctrl.onCheckChange({ checkedCount: ctrl.checkedItemsCount });\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Calls on checked items count change\n         * @param {Object} event\n         * @param {Object} data\n         */\n        function changeItemsCheckedCount(event, data) {\n            if (data.changedCheckedItemsCount === 0) {\n                ctrl.checkedItemsCount = 0;\n            } else {\n                ctrl.checkedItemsCount += data.changedCheckedItemsCount;\n            }\n\n            $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {\n                checkedCount: ctrl.checkedItemsCount\n            });\n        }\n\n        /**\n         * Sets checked items count\n         * @param {Object} event\n         * @param {number} newCheckedItemsCount\n         */\n        function setCheckedItemsCount(event, newCheckedItemsCount) {\n            ctrl.checkedItemsCount = newCheckedItemsCount;\n\n            testAllItemsChecked();\n\n            $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {\n                checkedCount: ctrl.checkedItemsCount\n            });\n        }\n\n        /**\n         * Calls on checkbox check/uncheck\n         * @param {Object} event\n         * @param {Object} data\n         */\n        function toggleCheckedItem(event, data) {\n            if (data.checked) {\n                ctrl.checkedItemsCount++;\n            } else {\n                ctrl.checkedItemsCount--;\n            }\n\n            $rootScope.$broadcast('action-checkbox-all_checked-items-count-change', {\n                checkedCount: ctrl.checkedItemsCount\n            });\n\n            testAllItemsChecked();\n\n            // callback function is called to inform about checked items count\n            if (angular.isFunction(ctrl.onCheckChange)) {\n                ctrl.onCheckChange({ checkedCount: ctrl.checkedItemsCount });\n            }\n        }\n\n        /**\n         * Updates items count and toggle allItemsChecked flag\n         */\n        function testAllItemsChecked() {\n            ctrl.allItemsChecked = ctrl.itemsCount > 0 && ctrl.checkedItemsCount === ctrl.itemsCount;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    ActionCheckboxAllService.$inject = ['$rootScope'];\n    angular.module('iguazio.dashboard-controls').factory('ActionCheckboxAllService', ActionCheckboxAllService);\n\n    function ActionCheckboxAllService($rootScope) {\n        return {\n            changeCheckedItemsCount: changeCheckedItemsCount,\n            setCheckedItemsCount: setCheckedItemsCount\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Sends broadcast with count of changed checked items\n         * @param {number} changedCheckedItemsCount - number of changed checked items\n         */\n        function changeCheckedItemsCount(changedCheckedItemsCount) {\n            $rootScope.$broadcast('action-checkbox-all_change-checked-items-count', {\n                changedCheckedItemsCount: changedCheckedItemsCount\n            });\n        }\n\n        /**\n         * Sends broadcast with count of checked items\n         * @param {number} checkedItemsCount\n         */\n        function setCheckedItemsCount(checkedItemsCount) {\n            $rootScope.$broadcast('action-checkbox-all_set-checked-items-count', checkedItemsCount);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzActionItemSubtemplateController.$inject = ['$compile', '$element'];\n    angular.module('iguazio.dashboard-controls').component('igzActionItemSubtemplate', {\n        bindings: {\n            action: '<'\n        },\n        template: '<div class=\"igz-action-item-subtemplate\"></div>',\n        controller: IgzActionItemSubtemplateController\n    });\n\n    function IgzActionItemSubtemplateController($compile, $element) {\n        var ctrl = this;\n\n        ctrl.newScope = null;\n\n        ctrl.$postLink = postLink;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n            var subTemplate = angular.element(ctrl.action.template);\n            $element.find('.igz-action-item-subtemplate').append(subTemplate);\n\n            ctrl.newScope = ctrl.action.scope.$new();\n            ctrl.newScope.action = ctrl.action;\n            $compile(subTemplate)(ctrl.newScope);\n\n            ctrl.action.destroyNewScope = destroyNewScope;\n        }\n\n        //\n        // Private method\n        //\n\n        /**\n         * Destroy new created scope. Scope needs to be removed to prevent errors when viewing tags on the browse page.\n         * And it needs to be done when updating panel actions\n         */\n        function destroyNewScope() {\n            ctrl.newScope.$destroy();\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzActionItem.$inject = ['$document', '$element', '$rootScope', '$scope', '$timeout', 'lodash', 'DialogsService'];\n    angular.module('iguazio.dashboard-controls').component('igzActionItem', {\n        bindings: {\n            action: '<',\n            actions: '<?',\n            template: '@',\n            onFilesDropped: '<?'\n        },\n        templateUrl: 'igz_controls/components/action-item/action-item.tpl.html',\n        controller: IgzActionItem\n    });\n\n    function IgzActionItem($document, $element, $rootScope, $scope, $timeout, lodash, DialogsService) {\n        var ctrl = this;\n\n        ctrl.$onInit = onInit();\n        ctrl.$onDestroy = onDestroy();\n\n        ctrl.getIconClass = getIconClass;\n        ctrl.getTooltipText = getTooltipText;\n        ctrl.isItemVisible = isItemVisible;\n        ctrl.onClickAction = onClickAction;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            $timeout(function () {\n                lodash.defaults(ctrl.action, {\n                    visible: true\n                });\n            });\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            if (angular.isDefined(ctrl.action) && angular.isDefined(ctrl.action.template)) {\n                detachDocumentEvent();\n            }\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Gets icon css class\n         * @returns {string}\n         */\n        function getIconClass() {\n            return ctrl.action.icon ? ctrl.action.icon : ctrl.actions && lodash.some(ctrl.actions, 'icon') ? 'fake-icon' : '';\n        }\n\n        function getTooltipText() {\n            return ctrl.action.label + (lodash.isEmpty(ctrl.action.tooltip) ? '' : ' - ' + ctrl.action.tooltip);\n        }\n\n        /**\n         * Checks if the action item should be shown\n         * @param {Object} action\n         * @returns {boolean}\n         */\n        function isItemVisible(action) {\n            return lodash.get(action, 'visible', true);\n        }\n\n        /**\n         * Handles mouse click on action item\n         * @param {MouseEvent} event\n         */\n        function onClickAction(event) {\n            if (ctrl.action.active) {\n                if (!lodash.isNil(ctrl.action.popupText)) {\n                    $rootScope.$broadcast('browse-action_change-loading-text', { textToDisplay: ctrl.action.popupText });\n                }\n\n                // shows confirmation dialog if action.confirm is true\n                if (lodash.isNonEmpty(ctrl.action.confirm)) {\n                    showConfirmDialog(event);\n                } else {\n                    ctrl.action.handler(ctrl.action, event);\n                }\n\n                // if action has sub-templates shows/hides it\n                if (angular.isDefined(ctrl.action.template)) {\n                    toggleTemplate();\n                }\n\n                // calls callback if defined\n                if (angular.isFunction(ctrl.action.callback)) {\n                    ctrl.action.callback(ctrl.action);\n                }\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Attaches on click event handler to the document\n         */\n        function attachDocumentEvent() {\n            $document.on('click', hideSubtemplate);\n        }\n\n        /**\n         * Removes on click event handler attached to the document\n         */\n        function detachDocumentEvent() {\n            $document.off('click', hideSubtemplate);\n        }\n\n        /**\n         * Hides sub-template dropdown when user clicks outside it\n         * @param {MouseEvent} event\n         */\n        function hideSubtemplate(event) {\n            $scope.$apply(function () {\n                if (event.target !== $element[0] && $element.find(event.target).length === 0) {\n                    ctrl.action.subTemplateProps.isShown = false;\n                    detachDocumentEvent();\n                }\n            });\n        }\n\n        /**\n         * Shows confirm dialog\n         * @param {MouseEvent} event\n         */\n        function showConfirmDialog(event) {\n            var message = lodash.isNil(ctrl.action.confirm.description) ? ctrl.action.confirm.message : {\n                message: ctrl.action.confirm.message,\n                description: ctrl.action.confirm.description\n            };\n\n            DialogsService.confirm(message, ctrl.action.confirm.yesLabel, ctrl.action.confirm.noLabel, ctrl.action.confirm.type).then(function () {\n                ctrl.action.handler(ctrl.action, event);\n            });\n        }\n\n        /**\n         * Shows/hides sub-template\n         */\n        function toggleTemplate() {\n            ctrl.action.subTemplateProps.isShown = !ctrl.action.subTemplateProps.isShown;\n            if (ctrl.action.subTemplateProps.isShown) {\n                attachDocumentEvent();\n            } else {\n                detachDocumentEvent();\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzActionMenuController.$inject = ['$element', '$document', '$i18next', '$rootScope', '$scope', '$timeout', 'i18next', 'lodash', 'ConfigService', 'PreventDropdownCutOffService'];\n    angular.module('iguazio.dashboard-controls').component('igzActionMenu', {\n        bindings: {\n            actions: '<',\n            shortcuts: '<',\n            onFireAction: '<?',\n            onClickShortcut: '<?',\n            isMenuShown: '<?',\n            iconClass: '@?',\n            listClass: '<?',\n            tooltipEnabled: '<?',\n            tooltipText: '@?'\n        },\n        templateUrl: 'igz_controls/components/action-menu/action-menu.tpl.html',\n        controller: IgzActionMenuController\n    });\n\n    function IgzActionMenuController($element, $document, $i18next, $rootScope, $scope, $timeout, i18next, lodash, ConfigService, PreventDropdownCutOffService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.isMenuShown = false;\n        ctrl.preventDropdownCutOff = null;\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n        ctrl.$onDestroy = onDestroy;\n        ctrl.$onChanges = onChanges;\n\n        ctrl.isDemoMode = ConfigService.isDemoMode;\n        ctrl.showDetails = showDetails;\n        ctrl.toggleMenu = toggleMenu;\n        ctrl.isVisible = isVisible;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialize method\n         */\n        function onInit() {\n            ctrl.iconClass = lodash.defaultTo(ctrl.iconClass, 'igz-icon-context-menu');\n\n            $scope.$on('close-all-action-menus', closeActionMenu);\n        }\n\n        /**\n         * On changes hook method\n         * @param {Object} changes\n         */\n        function onChanges(changes) {\n            var actions = lodash.get(changes, 'actions.currentValue');\n            var shortcuts = lodash.get(changes, 'shortcuts.currentValue');\n            var iconClass = lodash.get(changes, 'iconClass.currentValue');\n\n            if (angular.isDefined(actions)) {\n                ctrl.actions = lodash.chain(actions).filter(function (action) {\n                    return !lodash.has(action, 'visible') || action.visible;\n                }).map(function (action) {\n                    if (!angular.isFunction(action.handler)) {\n                        action.handler = defaultAction;\n\n                        if (action.id === 'delete' && angular.isUndefined(action.confirm)) {\n                            action.confirm = {\n                                message: $i18next.t('common:DELETE_SELECTED_ITEM_CONFIRM', { lng: lng }),\n                                yesLabel: $i18next.t('common:YES_DELETE', { lng: lng }),\n                                noLabel: $i18next.t('common:CANCEL', { lng: lng }),\n                                type: 'critical_alert'\n                            };\n                        }\n                    }\n\n                    return action;\n                }).value();\n            }\n\n            if (angular.isDefined(shortcuts)) {\n                ctrl.shortcuts = lodash.filter(shortcuts, function (shortcut) {\n                    return !lodash.has(shortcut, 'visible') || shortcut.visible;\n                });\n            }\n        }\n\n        /**\n         * Destructor\n         */\n        function onDestroy() {\n            detachDocumentEvent();\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n\n            // Bind DOM-related preventDropdownCutOff method to component's controller\n            PreventDropdownCutOffService.preventDropdownCutOff($element, '.menu-dropdown');\n\n            attachDocumentEvent();\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Handles mouse click on  a shortcut\n         * @param {MouseEvent} event\n         * @param {string} state - absolute state name or relative state path\n         */\n        function showDetails(event, state) {\n            if (angular.isFunction(ctrl.onClickShortcut)) {\n                ctrl.onClickShortcut(event, state);\n            }\n        }\n\n        /**\n         * Handles mouse click on the button of menu\n         * @param {Object} event\n         * Show/hides the action dropdown\n         */\n        function toggleMenu(event) {\n            if (!ctrl.isMenuShown) {\n                $rootScope.$broadcast('close-all-action-menus');\n                ctrl.isMenuShown = true;\n                attachDocumentEvent();\n\n                if (angular.isDefined(ctrl.listClass)) {\n                    checkOpeningSide(ctrl.listClass);\n                } else {\n                    $timeout(function () {\n                        angular.element('.menu-dropdown').css('visibility', 'visible');\n                    });\n                }\n            } else {\n                detachDocumentEvent();\n                ctrl.isMenuShown = false;\n            }\n\n            event.stopPropagation();\n        }\n\n        /**\n         * Checks if action menu is visible (not empty)\n         */\n        function isVisible() {\n            return !lodash.isEmpty(ctrl.actions) || !lodash.isEmpty(ctrl.shortcuts);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Attaches on click event handler to the document\n         */\n        function attachDocumentEvent() {\n            $document.on('click', onDocumentClick);\n        }\n\n        /**\n         * Closes action menu\n         */\n        function closeActionMenu() {\n            ctrl.isMenuShown = false;\n            detachDocumentEvent();\n        }\n\n        /**\n         * Default action handler\n         * @param {Object} action\n         */\n        function defaultAction(action) {\n            if (angular.isFunction(ctrl.onFireAction)) {\n                ctrl.onFireAction(action.id);\n            }\n        }\n\n        /**\n         * Removes on click event handler attached to the document\n         */\n        function detachDocumentEvent() {\n            $document.off('click', onDocumentClick);\n        }\n\n        /**\n         * Closes action menu\n         * @param {MouseEvent} event\n         */\n        function onDocumentClick(event) {\n            $scope.$apply(function () {\n                if (event.target !== $element[0] && $element.find(event.target).length === 0) {\n                    closeActionMenu();\n                }\n            });\n        }\n\n        /**\n         * Checks how to open drop-down menu in key-value list\n         * @param {string} elementClass - class of parental block of key-value list\n         */\n        function checkOpeningSide(elementClass) {\n            var parentalBlock = $document.find('.' + elementClass)[0];\n            var parentalRect = parentalBlock.getBoundingClientRect();\n            var dropdown;\n            var dropdownBottom;\n\n            $timeout(function () {\n                dropdown = angular.element($element).find('.menu-dropdown')[0];\n                dropdownBottom = dropdown.getBoundingClientRect().bottom;\n                dropdown = angular.element(dropdown);\n            });\n\n            if (lodash.includes(elementClass, 'scrollable')) {\n                var parentalHeight = parentalBlock.clientHeight;\n                var parentalTop = parentalRect.top;\n\n                $timeout(function () {\n                    dropdownBottom - parentalTop > parentalHeight ? dropdown.addClass('upward-menu') : dropdown.css({ 'visibility': 'visible' });\n\n                    angular.element('.' + elementClass + ' .mCSB_container').css({ 'height': 'auto' });\n                });\n            } else {\n                var parentalBottom = parentalRect.bottom;\n\n                $timeout(function () {\n                    dropdownBottom > parentalBottom ? dropdown.addClass('upward-menu') : dropdown.css({ 'visibility': 'visible' });\n                });\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzActionPanel.$inject = ['$scope', '$rootScope', '$i18next', 'i18next', 'lodash'];\n    angular.module('iguazio.dashboard-controls').component('igzActionPanel', {\n        bindings: {\n            actions: '<',\n            onItemsCheckedCount: '&?'\n        },\n        templateUrl: 'igz_controls/components/action-panel/action-panel.tpl.html',\n        controller: IgzActionPanel,\n        transclude: true\n    });\n\n    function IgzActionPanel($scope, $rootScope, $i18next, i18next, lodash) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        var checkedItemsCount = 0;\n        var mainActionsCount = 5;\n\n        ctrl.mainActions = [];\n        ctrl.remainActions = [];\n\n        ctrl.$onInit = onInit;\n        ctrl.$onChanges = onChanges;\n\n        ctrl.isActionPanelShown = isActionPanelShown;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            $scope.$on('action-checkbox-all_checked-items-count-change', onUpdateCheckedItemsCount);\n            $scope.$on('action-checkbox-all_check-all', onUpdateCheckedItemsCount);\n\n            refreshActions();\n        }\n\n        /**\n         * On changes hook method\n         */\n        function onChanges() {\n            refreshActions();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Default action handler\n         * @param {Object} action\n         * @param {string} action.id - an action ID (e.g. delete, clone etc.)\n         */\n        function defaultAction(action) {\n            $rootScope.$broadcast('action-panel_fire-action', {\n                action: action.id\n            });\n        }\n\n        /**\n         * Checks whether the action panel can be shown\n         * @returns {boolean}\n         */\n        function isActionPanelShown() {\n            return checkedItemsCount > 0;\n        }\n\n        /**\n         * Called when 'Check all' checkbox is clicked or checked some item.\n         * @param {Event} event - $broadcast-ed event\n         * @param {Object} data - $broadcast-ed data\n         * @param {Object} data.checkedCount - count of checked items\n         */\n        function onUpdateCheckedItemsCount(event, data) {\n            checkedItemsCount = data.checkedCount;\n\n            if (angular.isFunction(ctrl.onItemsCheckedCount)) {\n                ctrl.onItemsCheckedCount({ checkedCount: checkedItemsCount });\n            }\n\n            var visibleActions = lodash.filter(ctrl.actions, ['visible', true]);\n\n            ctrl.mainActions = lodash.slice(visibleActions, 0, mainActionsCount);\n            ctrl.remainingActions = lodash.slice(visibleActions, mainActionsCount, visibleActions.length);\n        }\n\n        /**\n         * Refreshes actions list\n         */\n        function refreshActions() {\n            ctrl.actions = lodash.filter(ctrl.actions, function (action) {\n                return !lodash.has(action, 'visible') || action.visible;\n            });\n\n            angular.forEach(ctrl.actions, function (action) {\n                if (!angular.isFunction(action.handler)) {\n                    action.handler = defaultAction;\n\n                    if (action.id === 'delete' && angular.isUndefined(action.confirm)) {\n                        action.confirm = {\n                            message: $i18next.t('common:DELETE_SELECTED_ITEMS_CONFIRM', { lng: lng }),\n                            yesLabel: $i18next.t('common:YES_DELETE', { lng: lng }),\n                            noLabel: $i18next.t('common:CANCEL', { lng: lng }),\n                            type: 'critical_alert'\n                        };\n                    }\n                }\n            });\n            ctrl.mainActions = lodash.slice(ctrl.actions, 0, mainActionsCount);\n            ctrl.remainingActions = lodash.slice(ctrl.actions, mainActionsCount, ctrl.actions.length);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzActionsPanesController.$inject = ['lodash', 'ConfigService'];\n    angular.module('iguazio.dashboard-controls').component('igzActionsPanes', {\n        bindings: {\n            infoPaneDisable: '<?',\n            isInfoPaneOpened: '<?',\n            filtersToggleMethod: '&?',\n            filtersCounter: '<?',\n            isFiltersOpened: '<?',\n            showFilterIcon: '@?',\n            infoPaneToggleMethod: '&?',\n            closeInfoPane: '&?'\n        },\n        templateUrl: 'igz_controls/components/actions-panes/actions-panes.tpl.html',\n        controller: IgzActionsPanesController\n    });\n\n    function IgzActionsPanesController(lodash, ConfigService) {\n        var ctrl = this;\n\n        ctrl.callToggleMethod = null;\n\n        ctrl.$onInit = onInit;\n\n        ctrl.isShowFilterActionIcon = isShowFilterActionIcon;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.callToggleMethod = angular.isFunction(ctrl.closeInfoPane) ? ctrl.closeInfoPane : ctrl.infoPaneToggleMethod;\n        }\n\n        //\n        // Public method\n        //\n\n        /**\n         * Checks if filter toggles method exists and if filter pane should toggle only in demo mode\n         * @returns {boolean}\n         */\n        function isShowFilterActionIcon() {\n            return angular.isFunction(ctrl.filtersToggleMethod) && (lodash.isEqual(ctrl.showFilterIcon, 'true') || ConfigService.isDemoMode());\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzCopyToClipboard.$inject = ['$i18next', 'i18next', 'lodash', 'DialogsService'];\n    angular.module('iguazio.dashboard-controls').component('igzCopyToClipboard', {\n        bindings: {\n            tooltipPlacement: '@?',\n            tooltipText: '@?',\n            value: '<'\n        },\n        templateUrl: 'igz_controls/components/copy-to-clipboard/copy-to-clipboard.tpl.html',\n        controller: IgzCopyToClipboard\n    });\n\n    function IgzCopyToClipboard($i18next, i18next, lodash, DialogsService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.$onInit = onInit;\n\n        ctrl.copyToClipboard = copyToClipboard;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            lodash.defaults(ctrl, {\n                tooltipPlacement: 'top'\n            });\n        }\n\n        //\n        // Public method\n        //\n\n        /**\n         * Copies a string to the clipboard.\n         */\n        function copyToClipboard() {\n            if (document.queryCommandSupported && document.queryCommandSupported('copy')) {\n                var textarea = document.createElement('textarea');\n                textarea.textContent = ctrl.value;\n                textarea.style.position = 'fixed';\n                document.body.appendChild(textarea);\n                textarea.select();\n\n                try {\n                    return document.execCommand('copy'); // Security exception may be thrown by some browsers.\n                } catch (ex) {\n                    DialogsService.alert($i18next.t('common:COPY_TO_CLIPBOARD_FAILED', { lng: lng }), ex);\n                } finally {\n                    document.body.removeChild(textarea);\n                }\n            }\n        }\n    }\n})();\n'use strict';\n\n/* eslint max-statements: [\"error\", 100] */\n/* eslint complexity: [\"error\", 12] */\n(function () {\n    'use strict';\n\n    /**\n     * @name igzDefaultDropdown\n     * @description\n     * Default drop down component. This component is a toggleable menu that allows the user to choose one value from a\n     * predefined list. It can also become a combo-box where the user can enter text. It can also auto-complete the\n     * option by the partially enetered value.\n     *\n     * @param {Object|string} selectedItem - an object/string to be set by the component.\n     *     The value that will be set as selected item from predefined list.\n     *     Note: if `enableTyping` is equal to `true` it means that the user can mutate this value. In this case\n     *     after modifying the value the new list item will be created.\n     * @param {Array.<Object>} valuesArray - an array of objects describing the available options that user can select.\n     * @param {boolean} [additionalClass] - optionally add another CSS class name to the containing HTML element of the drop-down.\n     * @param {boolean} [autocomplete=false] - set to `true` to allow filtering of options by entered text.\n     * @param {boolean} [autocompleteIgnoreCase=false] - set to `true` to ignore case while filtering options.\n     * @param {boolean} [autocompleteMatch='prefix'] - set to `'prefix'` to match the entered text as a prefix of an\n     *     option, or `'contains'` to match it as a substring anywhere in the option.\n     * @param {function} [bottomButtonCallback] - callback on toggleable menu's bottom button click.\n     * @param {string} [bottomButtonText] - the text of the toggleable menu's bottom button.\n     * @param {string} [dropdownType='regular'] - type of the predefined dropdown (`'regular'`, `'badges-dropdown'`,\n     *     `'priority'`).\n     * @param {boolean} [enableTyping=false] - set to `true` to allow typing new value in the collapsed dropdown input.\n     *     In case the entered value does not match any of the options in `valuesArray`, the `item` parameter passed\n     *     to `itemSelectCallback` will have a `typed` property of `true`.\n     * @param {boolean} [enableOverlap=false] - set to `true` to dropdown overlap the parental block (please set z-index\n     *     for `.default-container` if it needed).\n     * @param {Object} [formObject] - form object.\n     * @param {string} [inputName] - name of the input.\n     * @param {boolean} [iconClass='igz-icon-dropdown'] - a CSS class name to use for the drop-down arrow icon.\n     * @param {boolean} [isDisabled=false] - set to `true` to make this instance of the component read-only.\n     * @param {boolean} [isFocused=false] - should input be focused when screen is displayed\n     * @param {boolean} [isCapitalized=false] - set to `true` to make capitalized all text from listing and selected\n     *     value.\n     * @param {boolean} [isPagination=false] - set to `true` to remove check mark from selected list`s item.\n     *     Note: only for pagination dropdown.\n     * @param {boolean} [isRequired=false] - set to `true` to make required selection of a value.\n     * @param {string} [itemSelectField] - name of the field that should be set from the selected value.\n     * @param {function} [itemSelectCallback] - callback on selecting item from a list.\n     * @param {Object} [matchPattern] - pattern for validating typed value if enableTyping is `true`.\n     * @param {string} [nameKey] - name of the list`s item which should be shown.\n     * @param {function} [onOpenDropdown] - callback on opening dropdown menu.\n     * @param {function} [onCloseDropdown] - callback on closing dropdown menu.\n     * @param {boolean} [readOnly=false] - marked dropdown as `readonly`.\n     * @param {boolean} [preventDropUp=false] - set to `true` to prevent drop up the menu.\n     * @param {string} [placeholder] - text which should be shown if no value is selected.\n     * @param {string} [selectPropertyOnly] - name of the property which should be set to selectedItem.\n     *     Note: in that case ctrl.selectedItem will be a string value.\n     * @param {boolean} [skipSelection=false] - make the dropdown unselectable. On selecting any item, dropdown doesn't\n     *     select it, and always shows placeholder.\n     * @param {boolean} [trim=true] - whether the input value will automatically trim\n     */\n\n    IgzDefaultDropdownController.$inject = ['$scope', '$element', '$document', '$timeout', '$transclude', '$window', 'lodash', 'EventHelperService', 'FormValidationService', 'PreventDropdownCutOffService', 'PriorityDropdownService', 'SeverityDropdownService'];\n    angular.module('iguazio.dashboard-controls').component('igzDefaultDropdown', {\n        bindings: {\n            additionalClass: '@?',\n            autocomplete: '<?',\n            autocompleteIgnoreCase: '<?',\n            autocompleteMatch: '@?',\n            selectedItem: '<',\n            valuesArray: '<',\n            bottomButtonCallback: '<?',\n            bottomButtonText: '@?',\n            dropdownType: '@?',\n            enableTyping: '<?',\n            enableOverlap: '<?',\n            formObject: '<?',\n            iconClass: '@?',\n            inputName: '@?',\n            isDisabled: '<?',\n            isFocused: '<?',\n            isCapitalized: '<?',\n            isPagination: '<?',\n            isRequired: '<?',\n            itemSelectField: '@?',\n            itemSelectCallback: '&?',\n            matchPattern: '<?',\n            nameKey: '@?',\n            onOpenDropdown: '&?',\n            onCloseDropdown: '&?',\n            readOnly: '<?',\n            preventDropUp: '<?',\n            placeholder: '@?',\n            selectPropertyOnly: '@?',\n            skipSelection: '<?',\n            trim: '<?'\n        },\n        templateUrl: 'igz_controls/components/default-dropdown/default-dropdown.tpl.html',\n        transclude: true,\n        controller: IgzDefaultDropdownController\n    });\n\n    function IgzDefaultDropdownController($scope, $element, $document, $timeout, $transclude, $window, lodash, EventHelperService, FormValidationService, PreventDropdownCutOffService, PriorityDropdownService, SeverityDropdownService) {\n        var ctrl = this;\n\n        var valuesArrayCopy = [];\n\n        ctrl.topPosition = 'inherit';\n        ctrl.typedValue = '';\n        ctrl.isDropdownContainerShown = false;\n        ctrl.isDropUp = false;\n        ctrl.selectedItemDescription = '';\n        ctrl.isTranscludePassed = false;\n\n        ctrl.$onInit = onInit;\n        ctrl.$onChanges = onChanges;\n        ctrl.$onDestroy = onDestroy;\n        ctrl.$postLink = postLink;\n\n        ctrl.checkIsRequired = checkIsRequired;\n        ctrl.getDescription = getDescription;\n        ctrl.getName = getName;\n        ctrl.getIcon = getIcon;\n        ctrl.getTooltip = getTooltip;\n        ctrl.getValuesArray = getValuesArray;\n        ctrl.isItemSelected = isItemSelected;\n        ctrl.isPlaceholderClass = isPlaceholderClass;\n        ctrl.isShowDropdownError = isShowDropdownError;\n        ctrl.isTypingEnabled = isTypingEnabled;\n        ctrl.onChangeTypingInput = onChangeTypingInput;\n        ctrl.onDropDownKeydown = onDropDownKeydown;\n        ctrl.onItemKeydown = onItemKeydown;\n        ctrl.selectItem = selectItem;\n        ctrl.showSelectedItem = showSelectedItem;\n        ctrl.toggleDropdown = toggleDropdown;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            lodash.defaults(ctrl, {\n                autocomplete: false,\n                autocompleteIgnoreCase: false,\n                autocompleteMatch: 'prefix',\n                dropdownType: 'regular',\n                enableOverlap: false,\n                enableTyping: false,\n                iconClass: 'igz-icon-dropdown',\n                isCapitalized: false,\n                isDisabled: false,\n                isFocused: false,\n                isPagination: false,\n                isRequired: false,\n                preventDropUp: false,\n                readOnly: false,\n                skipSelection: false,\n                trim: true\n            });\n\n            valuesArrayCopy = angular.copy(ctrl.valuesArray);\n\n            if (ctrl.dropdownType === 'priority') {\n                ctrl.valuesArray = PriorityDropdownService.getPrioritiesArray();\n            }\n\n            if (ctrl.dropdownType === 'severity') {\n                ctrl.valuesArray = SeverityDropdownService.getSeveritiesArray();\n            }\n\n            setDefaultInputValue();\n\n            setDefaultPlaceholder();\n\n            setEmptyObjectIfNullSelected();\n\n            setValuesVisibility();\n\n            if (ctrl.enableOverlap) {\n                resizeDropdownContainer();\n                angular.element($window).on('resize', resizeDropdownContainer);\n            }\n\n            // checks if transclude template was passed\n            $transclude(function (transclude) {\n                ctrl.isTranscludePassed = transclude.length > 0;\n            });\n\n            // set focus (for using keyboard) if ctrl.isFocused is true\n            $timeout(function () {\n                if (ctrl.isFocused) {\n                    var elementToFocus = ctrl.isTypingEnabled() ? '.default-dropdown-field input' : '.default-dropdown-field';\n\n                    $element.find(elementToFocus).first().focus();\n                }\n            }, 500);\n\n            $scope.$on('close-drop-down', unselectDropdown);\n        }\n\n        /**\n         * On changes hook method\n         * @param {Object} changes\n         */\n        function onChanges(changes) {\n            if (angular.isDefined(changes.selectedItem)) {\n                if (!changes.selectedItem.isFirstChange()) {\n                    setDefaultInputValue();\n                }\n            }\n\n            if (angular.isDefined(changes.valuesArray)) {\n                if (!changes.valuesArray.isFirstChange()) {\n                    valuesArrayCopy = angular.copy(changes.valuesArray.currentValue);\n\n                    setDefaultInputValue();\n                }\n            }\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n            if (!ctrl.enableOVerlap) {\n                PreventDropdownCutOffService.preventDropdownCutOff($element, '.default-dropdown-container');\n            }\n            $document.on('click', unselectDropdown);\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            $document.off('click', unselectDropdown);\n            angular.element($window).off('resize', resizeDropdownContainer);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Sets required flag\n         */\n        function checkIsRequired() {\n            return Boolean(ctrl.isRequired);\n        }\n\n        /**\n         * Returns the description of the provided item. Searches for a direct `description` property, or a\n         * `description` property inside an `attr` property\n         * @param {Object} item - the item whose description should be returned\n         * @returns {string}\n         */\n        function getDescription(item) {\n            return lodash.get(item, 'description', lodash.get(item, 'attr.description'), '');\n        }\n\n        /**\n         * Returns the tooltip of the provided item\n         * @param {Object} item - the item whose tooltip should be returned\n         * @returns {string}\n         */\n        function getTooltip(item) {\n            return lodash.get(item, 'tooltip', '');\n        }\n\n        /**\n         * Returns the icon of the provided item.\n         * @param {Object} item - the item whose icon should be returned\n         * @returns {string}\n         */\n        function getIcon(item) {\n            return lodash.get(item, 'icon', '');\n        }\n\n        /**\n         * Returns the name of the provided item. Searches for a direct `name` property, or searches `name` property by\n         * `nameKey`\n         * @param {Object} item - the item whose name should be returned\n         * @returns {string}\n         */\n        function getName(item) {\n            return lodash.get(item, 'name', lodash.get(item, ctrl.nameKey, ''));\n        }\n\n        /**\n         * Gets array of available values\n         * @returns {Array}\n         */\n        function getValuesArray() {\n            return ctrl.valuesArray;\n        }\n\n        /**\n         * Determines whether current item selected\n         * @param {Object} item - current item\n         * @returns {boolean}\n         */\n        function isItemSelected(item) {\n            return angular.isDefined(ctrl.selectPropertyOnly) ? ctrl.selectedItem === lodash.get(item, ctrl.selectPropertyOnly) : lodash.isEqual(ctrl.selectedItem, item);\n        }\n\n        /**\n         * Checks if placeholder class should be set on input field\n         * @returns {boolean}\n         */\n        function isPlaceholderClass() {\n            return angular.isDefined(ctrl.selectPropertyOnly) ? ctrl.selectedItem === null : ctrl.selectedItem.id === null;\n        }\n\n        /**\n         * Checks whether show error if custom dropdown is invalid or on whole form validation (on submit, tab switch)\n         * @param {Object} form\n         * @param {string} elementName\n         * @returns {boolean|undefined}\n         */\n        function isShowDropdownError(form, elementName) {\n            return ctrl.isRequired ? FormValidationService.isShowFieldInvalidState(form, elementName) : undefined;\n        }\n\n        /**\n         * Checks if the typing in dropdown's field is enabled\n         * @returns {boolean}\n         */\n        function isTypingEnabled() {\n            return ctrl.enableTyping || ctrl.autocomplete;\n        }\n\n        /**\n         * Changes selected item depending on typed value\n         */\n        /* eslint complexity: [\"error\", 13] */\n        function onChangeTypingInput() {\n            ctrl.isDropdownContainerShown = false;\n\n            if ((ctrl.enableTyping || ctrl.autocomplete) && lodash.isEmpty(ctrl.typedValue)) {\n                ctrl.valuesArray = valuesArrayCopy;\n\n                ctrl.formObject[ctrl.inputName].$setValidity('text', true);\n\n                if (!ctrl.isRequired) {\n                    ctrl.selectItem({\n                        id: '',\n                        name: '',\n                        visible: true\n                    });\n                }\n\n                // emulate a click to open drop-down menu in case the user cleared the text input field\n                $element.find('.default-dropdown-field')[0].dispatchEvent(new Event('click'));\n            } else {\n                if (ctrl.autocomplete) {\n                    var typedValue = ctrl.autocompleteIgnoreCase ? ctrl.typedValue.toLowerCase() : ctrl.typedValue;\n\n                    ctrl.valuesArray = lodash.filter(valuesArrayCopy, function (item) {\n                        var itemName = ctrl.autocompleteIgnoreCase ? item.name.toLowerCase() : item.name;\n\n                        return ctrl.autocompleteMatch === 'contains' ? lodash.includes(itemName, typedValue) : lodash.startsWith(itemName, typedValue);\n                    });\n\n                    if (ctrl.valuesArray.length > 0) {\n                        $element.find('.default-dropdown-field')[0].dispatchEvent(new Event('click'));\n                        if (ctrl.formObject[ctrl.inputName].$invalid) {\n                            ctrl.formObject[ctrl.inputName].$setValidity('text', true);\n                        }\n                    } else if (!ctrl.enableTyping) {\n                        ctrl.formObject[ctrl.inputName].$setValidity('text', false);\n                    }\n                }\n\n                if (ctrl.enableTyping) {\n                    var newItem = {\n                        id: ctrl.typedValue,\n                        typed: true,\n                        visible: true\n                    };\n                    lodash.set(newItem, ctrl.nameKey || 'name', ctrl.typedValue);\n\n                    ctrl.selectItem(lodash.find(ctrl.valuesArray, ['name', ctrl.typedValue]) || newItem);\n                }\n            }\n        }\n\n        /**\n         * Handles keydown events on dropdown\n         * @param {Object} event\n         */\n        function onDropDownKeydown(event) {\n            switch (event.keyCode) {\n                case EventHelperService.UP:\n                case EventHelperService.DOWN:\n                    if (!ctrl.isDropdownContainerShown) {\n                        ctrl.isDropdownContainerShown = true;\n                    }\n                    var firstListItem = $element.find('.default-dropdown-container .list-item').first();\n                    firstListItem.focus();\n                    break;\n                case EventHelperService.TABKEY:\n                    ctrl.isDropdownContainerShown = false;\n                    break;\n                case EventHelperService.SPACE:\n                    if (ctrl.trim) {\n                        ctrl.isDropdownContainerShown = !ctrl.isDropdownContainerShown;\n                    }\n                    break;\n                case EventHelperService.ENTER:\n                    ctrl.isDropdownContainerShown = !ctrl.isDropdownContainerShown;\n                    break;\n                default:\n                    break;\n            }\n            event.stopPropagation();\n        }\n\n        /**\n         * Handles keydown events on dropdown items\n         * @param {Object} event\n         * @param {Object} item - current item\n         */\n        function onItemKeydown(event, item) {\n            var dropdownField = $element.find('.default-dropdown-field').first();\n            switch (event.keyCode) {\n                case EventHelperService.UP:\n                    if (!lodash.isNull(event.target.previousElementSibling)) {\n                        event.target.previousElementSibling.focus();\n                        event.stopPropagation();\n                    }\n                    break;\n                case EventHelperService.DOWN:\n                    if (!lodash.isNull(event.target.nextElementSibling)) {\n                        event.target.nextElementSibling.focus();\n                        event.stopPropagation();\n                    }\n                    break;\n                case EventHelperService.SPACE:\n                case EventHelperService.ENTER:\n                    dropdownField.focus();\n                    ctrl.selectItem(item, event);\n                    break;\n                case EventHelperService.ESCAPE:\n                case EventHelperService.TABKEY:\n                    dropdownField.focus();\n                    ctrl.isDropdownContainerShown = false;\n                    break;\n                default:\n                    break;\n            }\n            event.preventDefault();\n            event.stopPropagation();\n        }\n\n        function resizeDropdownContainer() {\n            var dropdown = $element.find('.default-dropdown-field')[0];\n            var dropdownWidth = lodash.get(window.getComputedStyle(dropdown), 'width');\n\n            angular.element($element.find('.default-dropdown-container')[0]).css('width', dropdownWidth);\n        }\n\n        /**\n         * Sets current item as selected\n         * @param {Object} item - current item\n         * @param {Object} [event]\n         */\n        function selectItem(item, event) {\n            if (!item.disabled) {\n                var previousItem = angular.copy(ctrl.selectedItem);\n\n                if (!ctrl.skipSelection) {\n                    if (angular.isDefined(ctrl.selectPropertyOnly)) {\n                        ctrl.selectedItem = lodash.get(item, ctrl.selectPropertyOnly);\n                        ctrl.selectedItemDescription = item.description;\n                    } else {\n                        ctrl.selectedItem = item;\n                    }\n                    ctrl.typedValue = ctrl.getName(item);\n                }\n\n                if (angular.isFunction(ctrl.itemSelectCallback)) {\n                    $timeout(function () {\n                        ctrl.itemSelectCallback({\n                            item: item,\n                            isItemChanged: !lodash.isEqual(previousItem, ctrl.selectedItem),\n                            field: angular.isDefined(ctrl.itemSelectField) ? ctrl.itemSelectField : null\n                        });\n                    });\n                }\n\n                if (angular.isDefined(event)) {\n                    ctrl.isDropdownContainerShown = false;\n\n                    if (ctrl.autocomplete) {\n                        ctrl.valuesArray = valuesArrayCopy;\n                    }\n                }\n            }\n\n            if (!lodash.isNil(event)) {\n                event.stopPropagation();\n            }\n        }\n\n        /**\n         * Displays selected item name in dropdown. If model is set to null, set default object\n         * @returns {string}\n         */\n        function showSelectedItem() {\n            if (!ctrl.selectedItem) {\n                setEmptyObjectIfNullSelected();\n                ctrl.hiddenInputValue = '';\n            }\n\n            if (angular.isDefined(ctrl.selectPropertyOnly) && angular.isDefined(ctrl.valuesArray)) {\n\n                // Set description for selected item\n                var selectedItemUiValue = lodash.find(ctrl.valuesArray, function (item) {\n                    return lodash.get(item, ctrl.selectPropertyOnly) === ctrl.selectedItem;\n                });\n\n                ctrl.selectedItemDescription = lodash.get(selectedItemUiValue, 'description', null);\n\n                // Return temporary object used for selected item name displaying on UI input field\n                return {\n                    name: lodash.get(selectedItemUiValue, 'name', lodash.get(selectedItemUiValue, ctrl.nameKey, ctrl.placeholder)),\n                    icon: {\n                        name: lodash.get(selectedItemUiValue, 'icon.name', ''),\n                        class: lodash.get(selectedItemUiValue, 'icon.class', '')\n                    },\n                    description: ctrl.selectedItemDescription\n                };\n            }\n            return ctrl.selectedItem;\n        }\n\n        /**\n         * Shows dropdown element\n         * @params {Object} $event\n         */\n        function toggleDropdown($event) {\n            var dropdownContainer = $event.currentTarget;\n            var buttonHeight = dropdownContainer.getBoundingClientRect().height;\n            var position = dropdownContainer.getBoundingClientRect().top;\n            var positionLeft = dropdownContainer.getBoundingClientRect().left;\n\n            ctrl.isDropUp = false;\n\n            if (!ctrl.preventDropUp) {\n                if (!ctrl.isDropdownContainerShown) {\n                    $timeout(function () {\n                        var dropdownMenu = $element.find('.default-dropdown-container');\n                        var menuHeight = dropdownMenu.height();\n\n                        if (position > menuHeight && $window.innerHeight - position < buttonHeight + menuHeight) {\n                            ctrl.isDropUp = true;\n                            ctrl.topPosition = -menuHeight + 'px';\n                        } else {\n                            ctrl.isDropUp = false;\n                            ctrl.topPosition = 'inherit';\n                        }\n\n                        if ($window.innerWidth - positionLeft < dropdownMenu.width()) {\n                            dropdownMenu.css('right', '0');\n                        }\n                    });\n                }\n            }\n            ctrl.isDropdownContainerShown = !ctrl.isDropdownContainerShown;\n\n            if (ctrl.isDropdownContainerShown) {\n                setValuesVisibility();\n\n                $timeout(function () {\n                    setWidth();\n\n                    if (angular.isFunction(ctrl.onOpenDropdown)) {\n                        ctrl.onOpenDropdown({ element: $element });\n                    }\n\n                    if (ctrl.enableOverlap) {\n                        resizeDropdownContainer();\n                    }\n                });\n\n                if (!ctrl.enableOverlap) {\n                    PreventDropdownCutOffService.preventDropdownCutOff($element, '.default-dropdown-container');\n                }\n            } else {\n                if (angular.isFunction(ctrl.onCloseDropdown)) {\n                    ctrl.onCloseDropdown();\n                }\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Sets default input value\n         */\n        function setDefaultInputValue() {\n            if (!lodash.isNil(ctrl.selectedItem)) {\n                ctrl.typedValue = ctrl.getName(angular.isDefined(ctrl.selectPropertyOnly) ? lodash.find(ctrl.valuesArray, [ctrl.selectPropertyOnly, ctrl.selectedItem]) : ctrl.selectedItem);\n\n                if (ctrl.typedValue === '' && ctrl.enableTyping) {\n                    ctrl.typedValue = ctrl.selectedItem;\n                }\n            }\n        }\n\n        /**\n         * Sets default placeholder for drop-down if it's value is not defined\n         */\n        function setDefaultPlaceholder() {\n            if (!ctrl.placeholder) {\n                ctrl.placeholder = 'Please select...';\n            }\n        }\n\n        /**\n         * Sets default empty value if any other object has not been defined earlier\n         */\n        function setEmptyObjectIfNullSelected() {\n            if (!ctrl.selectedItem) {\n                ctrl.selectedItem = angular.isDefined(ctrl.selectPropertyOnly) ? null : {\n                    id: null,\n                    name: null\n                };\n            }\n        }\n\n        /**\n         * Sets `visible` property for all array items into true if it is not already defined.\n         * `visible` property determines whether item will be shown in drop-down list.\n         */\n        function setValuesVisibility() {\n            lodash.forEach(ctrl.valuesArray, function (value) {\n                lodash.defaults(value, { visible: true });\n            });\n        }\n\n        /**\n         * Handle click on the document and not on the dropdown field and close the dropdown\n         * @param {Object} e - event\n         */\n        function unselectDropdown(e) {\n            if ($element.find(e.target).length === 0) {\n                $scope.$evalAsync(function () {\n                    ctrl.isDropdownContainerShown = false;\n                    ctrl.isDropUp = false;\n\n                    if (angular.isFunction(ctrl.onCloseDropdown)) {\n                        ctrl.onCloseDropdown();\n                    }\n                });\n            }\n        }\n\n        /**\n         * Takes the largest element and sets him width as min-width to all elements (needed to style drop-down list)\n         */\n        function setWidth() {\n            var labels = $element.find('.default-dropdown-container ul li').find('.list-item-label');\n            var minWidth = lodash(labels).map(function (label) {\n                return angular.element(label)[0].clientWidth;\n            }).min();\n\n            lodash.forEach(labels, function (label) {\n                angular.element(label).css('min-width', minWidth);\n            });\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzElementLoadingStatusController.$inject = ['$scope', '$element', '$timeout', '$state', 'lodash'];\n    angular.module('iguazio.dashboard-controls').component('igzElementLoadingStatus', {\n        bindings: {\n            loadingStatusSize: '@?',\n            name: '@',\n            tooltipLabel: '@?'\n        },\n        templateUrl: 'igz_controls/components/element-loading-status/element-loading-status.tpl.html',\n        controller: IgzElementLoadingStatusController,\n        transclude: true\n    });\n\n    function IgzElementLoadingStatusController($scope, $element, $timeout, $state, lodash) {\n        var ctrl = this;\n        var defaultHeight = 0;\n\n        ctrl.isShowSpinner = true;\n        ctrl.isShowContent = false;\n        ctrl.isShowError = false;\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n\n        ctrl.checkSize = checkSize;\n        ctrl.refreshPage = refreshPage;\n        ctrl.setWrapperHeight = setWrapperHeight;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            lodash.defaults(ctrl, {\n                loadingStatusSize: 'default',\n                tooltipLabel: ''\n            });\n            defaultHeight = ctrl.loadingStatusSize === 'small' ? 20 : 40;\n\n            $scope.$on('element-loading-status_show-spinner', showSpinner);\n            $scope.$on('element-loading-status_hide-spinner', hideSpinner);\n\n            $scope.$on('element-loading-status_show-error', showError);\n            $scope.$on('element-loading-status_hide-error', hideError);\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n\n            // Set height of spinner wrapper\n            setWrapperHeight();\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Check if given size is actual\n         * @param {string} size - size name ('small', 'default')\n         */\n        function checkSize(size) {\n            return ctrl.loadingStatusSize === size;\n        }\n\n        /**\n         * Refresh current page (ui-router state)\n         * @param {Object} $event - angular event object\n         */\n        function refreshPage($event) {\n\n            // Prevent 'upper' events to be triggered\n            $event.stopPropagation();\n\n            $state.go($state.current, {}, { reload: true });\n        }\n\n        /**\n         * Set height of spinner wrapper\n         */\n        function setWrapperHeight() {\n            $timeout(function () {\n                var elementHeight = $element.height() > 0 ? $element.height() : defaultHeight;\n                var elementParentHeight = $element.parent().height() > 0 ? $element.parent().height() : defaultHeight;\n\n                if (ctrl.isShowSpinner) {\n                    $element.find('.loader-wrapper').height(elementParentHeight || elementHeight);\n                    $element.find('.loader-wrapper').addClass('appeared');\n                }\n\n                if (ctrl.isShowError) {\n                    $element.find('.loading-error').height(elementHeight || elementParentHeight);\n                    $element.find('.loading-error').addClass('appeared');\n                }\n            });\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Show given loading spinner\n         * @param {Object} ev - angular event object\n         * @param {Object} args - arguments passed from $broadcast\n         */\n        function showSpinner(ev, args) {\n            if (args.name === ctrl.name) {\n                ctrl.isShowError = false;\n                ctrl.isShowContent = false;\n                ctrl.isShowSpinner = true;\n                ctrl.setWrapperHeight();\n            }\n        }\n\n        /**\n         * Hide given loading spinner\n         * @param {Object} ev - angular event object\n         * @param {Object} args - arguments passed from $broadcast\n         */\n        function hideSpinner(ev, args) {\n            if (args.name === ctrl.name) {\n                ctrl.isShowSpinner = false;\n                $timeout(function () {\n                    ctrl.isShowContent = true;\n                }, 2);\n            }\n        }\n\n        /**\n         * Show given loading error\n         * @param {Object} ev - angular event object\n         * @param {Object} args - arguments passed from $broadcast\n         */\n        function showError(ev, args) {\n            if (args.name === ctrl.name) {\n                ctrl.isShowError = true;\n                ctrl.isShowSpinner = false;\n                ctrl.setWrapperHeight();\n            }\n        }\n\n        /**\n         * Hide given loading error\n         * @param {Object} ev - angular event object\n         * @param {Object} args - arguments passed from $broadcast\n         */\n        function hideError(ev, args) {\n            if (args.name === ctrl.name) {\n                ctrl.isShowError = false;\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzImportProjectDialogController.$inject = ['$scope', '$i18next', 'i18next', 'lodash'];\n    angular.module('iguazio.dashboard-controls').component('igzImportProjectDialog', {\n        bindings: {\n            closeDialog: '&',\n            dialogTitle: '<',\n            displayAllOptions: '<'\n        },\n        templateUrl: 'igz_controls/components/import-project-dialog/import-project-dialog.tpl.html',\n        controller: IgzImportProjectDialogController\n    });\n\n    function IgzImportProjectDialogController($scope, $i18next, i18next, lodash) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        var checkedItem = 'singleFunction';\n\n        ctrl.option = [];\n        ctrl.optionList = [{\n            label: $i18next.t('common:APPLY_TO_ALL_FUNCTIONS_IN_THIS_PROJECT', { lng: lng }),\n            id: 'singleProject',\n            value: 'singleProject',\n            disabled: false,\n            visibility: true\n        }, {\n            label: $i18next.t('common:APPLY_TO_ALL_FUNCTIONS_IN_ALL_PROJECT', { lng: lng }),\n            id: 'allProjects',\n            value: 'allProjects',\n            disabled: false,\n            visibility: true\n        }];\n\n        ctrl.$onInit = onInit;\n\n        ctrl.onClose = onClose;\n        ctrl.onCheckboxChange = onCheckboxChange;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            lodash.set(ctrl.optionList, '[1].visibility', ctrl.displayAllOptions);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Handles checking/un-checking checkbox\n         */\n        function onCheckboxChange() {\n            if (!lodash.isNil(ctrl.option)) {\n                if (lodash.includes(ctrl.option, 'allProjects')) {\n                    lodash.set(ctrl.optionList, '[0].disabled', true);\n\n                    if (ctrl.option.length === 1) {\n                        ctrl.option.unshift('singleProject');\n                    }\n                } else {\n                    lodash.set(ctrl.optionList, '[0].disabled', false);\n                }\n                ctrl.optionList = angular.copy(ctrl.optionList);\n                ctrl.option = angular.copy(ctrl.option);\n                checkedItem = lodash.get(ctrl.option, [ctrl.option.length - 1]);\n            } else {\n                checkedItem = 'singleFunction';\n            }\n        }\n\n        /**\n         * Closes dialog\n         * @param {string} action\n         */\n        function onClose(action) {\n            ctrl.closeDialog({ action: action, option: checkedItem });\n            ctrl.option = [];\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzMoreInfoController.$inject = ['$document', '$element', '$timeout', 'lodash'];\n    angular.module('iguazio.dashboard-controls').component('igzMoreInfo', {\n        bindings: {\n            description: '@',\n            isDisabled: '<?',\n            trigger: '@?',\n            iconType: '@?',\n            isHtmlEnabled: '<?',\n            isDefaultTooltipEnabled: '<?',\n            isOpen: '<?',\n            defaultTooltipPlacement: '@?',\n            defaultTooltipPopupDelay: '@?'\n        },\n        templateUrl: 'igz_controls/components/more-info/more-info.tpl.html',\n        controller: IgzMoreInfoController\n    });\n\n    function IgzMoreInfoController($document, $element, $timeout, lodash) {\n        var ctrl = this;\n\n        ctrl.iconTypes = {\n            INFO: 'info',\n            WARN: 'warn'\n        };\n\n        ctrl.selectedIconType = ctrl.iconTypes.INFO;\n\n        ctrl.$onInit = onInit;\n        ctrl.$onChanges = onChanges;\n        ctrl.isClickMode = isClickMode;\n        ctrl.onQuestionMarkClick = onQuestionMarkClick;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            lodash.defaults(ctrl, {\n                defaultTooltipPlacement: ctrl.isDefaultTooltipEnabled ? 'auto' : 'right',\n                defaultTooltipPopupDelay: '0',\n                isDefaultTooltipEnabled: false,\n                isDisabled: false,\n                isHtmlEnabled: false\n            });\n\n            // Defaults trigger method to 'mouseenter'. Available 2 modes: `mouseenter` (hover) and `click`.\n            if (ctrl.trigger !== 'click') {\n                ctrl.trigger = 'mouseenter';\n            }\n        }\n\n        /**\n         * On changes hook method.\n         * @param {Object} changes\n         */\n        function onChanges(changes) {\n            if (lodash.has(changes, 'isOpen')) {\n                ctrl.isDescriptionVisible = changes.isOpen.currentValue;\n                if (isClickMode()) {\n                    toggleClickListener();\n                }\n            }\n\n            if (lodash.has(changes, 'iconType')) {\n                var valueIsValid = lodash.includes(ctrl.iconTypes, changes.iconType.currentValue);\n                ctrl.selectedIconType = valueIsValid ? changes.iconType.currentValue : ctrl.iconTypes.INFO;\n            }\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Determine whether the trigger method is `click`\n         * @returns {boolean}\n         */\n        function isClickMode() {\n            return ctrl.trigger === 'click';\n        }\n\n        /**\n         * Handles click on question mark. Shows/hides tooltip. Works only for 'click' trigger.\n         */\n        function onQuestionMarkClick() {\n            if (ctrl.isClickMode()) {\n                ctrl.isDescriptionVisible = !ctrl.isDescriptionVisible;\n                toggleClickListener();\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Hides tooltip by clicking anywhere outside of the tooltip or the question mark icon.\n         * @param {Event} event\n         */\n        function hideTooltip(event) {\n            if (!event.target.closest('.row-description') && $element.find('.question-mark')[0] !== event.target) {\n                ctrl.isDescriptionVisible = false;\n\n                $document.off('click', hideTooltip);\n            }\n        }\n\n        /**\n         * Adds or removes event listener for `click` event on the document for closing pop-over.\n         */\n        function toggleClickListener() {\n            $timeout(function () {\n                ctrl.isDescriptionVisible ? $document.on('click', hideTooltip) : $document.off('click', hideTooltip);\n            });\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    /**\n     * @name igzMultipleCheckboxes\n     * @description\n     * Multiple checkboxes input component. This component is composed of a list of options. Each option has a label\n     * and a value. This list is rendered in the view as a list of checkboxes with labels. The model is an array of\n     * strings. On checking a checkbox, its corresponding option's value is added to the model array. On un-checking\n     * a checkbox, its corresponding option's value is removed from the model array. If `required` is specified on the\n     * component's element, it means that an empty array is not allowed, i.e. if all checkboxes are un-checked, the\n     * element is invalid.\n     *\n     * @param {Array.<string>} ng-model - an array of strings to be set by the component.\n     *     Replacing this array (by reference) will update the state of the options' checkboxes accordingly.\n     *     Mutating it will have no effect (e.g. pushing new items to it, pulling items from it or mutating the items).\n     *     Note: string values in the assigned array model that do not match some option's `value` property will be\n     *     filtered out of the model array.\n     * @param {Array.<Object>} options - an array of objects describing the available options.\n     *     Replacing this array (by reference) will update the option list and re-rendered it in the view.\n     *     Mutating it will have no effect (e.g. pushing new items to it, pulling items from it, or mutating the items).\n     *     Note: string values in the assigned array model that do not match some option's `value` property will be\n     *     filtered out of the model array.\n     *     Note: properties other than `value`, `label` and `disabled` of objects in `options` array are ignored.\n     * @param {string} options[].value - the string value to be add to/remove from model on checking/un-checking this\n     *     option.\n     * @param {string} options[].label - the text of the label to display next to the checkbox.\n     * @param {boolean} [options[].disabled=false] - `true` if this option should be disabled, `false` or omitted\n     *     otherwise.\n     * @param {string} [options[].id] - if provided this string will be used as the HTML `id` attribute of the\n     *     `<option>` element.\n     * @param {string} [options[].tooltipText] - text to display in tooltip when hovering on this option.\n     * @param {boolean} [options[].enableTooltip=false] - `true` if tooltip should be display. Defaults to `false`.\n     * @param {boolean} [options[].visibility=true] - `true` if checkbox should be display. Defaults to `true`.\n     * @param {string} [baseId] - a string used for the `id` attribute of `<input type=\"checkbox\">` element and `for`\n     *     attribute of the `<label>` element, so clicking on the label will toggle the checkbox. If omitted, the\n     *     component will supply an id of itself.\n     * @param {boolean} [disabled=false] - set to `true` to make this instance of the component read-only. This property\n     *     overrides the per-option `disabled` property.\n     * @param {string} [labelPath='label'] - path to the string property inside each object of `options` array to be\n     *     used as label.\n     * @param {string} [valuePath='value'] - path to the string property inside each object of `options` array to be\n     *     used as value.\n     * @param {string} [disabledPath='disabled'] - path to the string property inside each object of `options` array to\n     *     be used as disabled indicator.\n     *\n     * @example:\n     * ```js\n     * angular.module('iguazio.dashboard-controls')\n     *     .component('someComponent', {\n     *         template: '<igz-multiple-checkboxes data-ng-model=\"$ctrl.interfacesKinds\" ' +\n     *                                            'data-options=\"$ctrl.interfaceList\" ' +\n     *                                            'data-base-id=\"interface-kind\"></igz-multiple-checkboxes>',\n     *         controller: function () {\n     *             var ctrl = this;\n     *\n     *             ctrl.interfaceKinds = [];\n     *             ctrl.interfaceList = [\n     *                 {\n     *                     value: 'web',\n     *                     label: 'Web'\n     *                 },\n     *                 {\n     *                     value: 'spark',\n     *                     label: 'Spark & Hadoop',\n     *                     disabled: false\n     *                 },\n     *                 {\n     *                     value: 'fuse',\n     *                     label: 'File'\n     *                 },\n     *                 {\n     *                     value: 'presto',\n     *                     label: 'Presto\n     *                 }\n     *             ];\n     *         }\n     *     });\n     * ```\n     *\n     * ```js\n     * angular.module('iguazio.dashboard-controls')\n     *     .component('someComponent', {\n     *         template: '<igz-multiple-checkboxes data-ng-model=\"$ctrl.interfacesKinds\" ' +\n     *                                            'data-options=\"$ctrl.interfaceList\" ' +\n     *                                            'data-base-id=\"interface-kind\" ' +\n     *                                            'data-label-path=\"ui.label\" ' +\n     *                                            'data-value-path=\"attr.kind ' +\n     *                                            'data-disabled-path=\"attr.disabled\"></igz-multiple-checkboxes>',\n     *         controller: function () {\n     *             var ctrl = this;\n     *\n     *             ctrl.interfaceKinds = [];\n     *             ctrl.interfaceList = [\n     *                 {\n     *                     attr: {\n     *                         name: 'web'\n     *                     },\n     *                     ui: {\n     *                         label: 'Web'\n     *                     }\n     *                 },\n     *                 {\n     *                     attr: {\n     *                         value: 'spark',\n     *                         disabled: true\n     *                     },\n     *                     ui: {\n     *                         label: 'Spark & Hadoop'\n     *                     }\n     *                 },\n     *                 {\n     *                     attr: {\n     *                         value: 'fuse'\n     *                     },\n     *                     ui: {\n     *                         label: 'File'\n     *                     }\n     *                 },\n     *                 {\n     *                     attr: {\n     *                         value: 'presto'\n     *                     },\n     *                     ui: {\n     *                         label: 'Presto\n     *                     }\n     *                 }\n     *             ];\n     *         }\n     *     });\n     * ```\n     */\n\n    IgzMultipleCheckboxes.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').component('igzMultipleCheckboxes', {\n        require: {\n            ngModelCtrl: 'ngModel'\n        },\n        bindings: {\n            baseId: '@?',\n            disabled: '<?',\n            disabledPath: '@?',\n            dropdown: '<',\n            dropdownApply: '<',\n            dropdownApplyCallback: '&?',\n            groups: '<',\n            labelPath: '@?',\n            options: '<',\n            selectAllNone: '<',\n            stringArray: '=ngModel',\n            title: '@?',\n            valuePath: '@?'\n        },\n        templateUrl: 'igz_controls/components/multiple-checkboxes/multiple-checkboxes.tpl.html',\n        controller: IgzMultipleCheckboxes\n    });\n\n    function IgzMultipleCheckboxes(lodash) {\n        var ctrl = this;\n\n        var LABEL_PATH_DEFAULT = 'label';\n        var VALUE_PATH_DEFAULT = 'value';\n        var DISABLED_PATH_DEFAULT = 'disabled';\n        var TOOLTIP_ENABLED = 'enableTooltip';\n        var TOOLTIP_TEXT = 'tooltipText';\n        var BASE_ID_DEFAULT = 'igz_multiple_checkboxes_' + Date.now() + '_';\n        var VISIBILITY_DEFAULT = 'visibility';\n\n        ctrl.checkedItemsCount = 0;\n        ctrl.isAllItemsChecked = false;\n        ctrl.isDropdownOpened = false;\n        ctrl.isSearchInputFocused = false;\n\n        // stores the inner copy of the option list (so parent copy is not mutated by this component)\n        ctrl.optionList = null;\n\n        ctrl.$onInit = onInit;\n        ctrl.$onChanges = onChanges;\n\n        ctrl.addItem = addItem;\n        ctrl.onApply = onApply;\n        ctrl.onCancel = onCancel;\n        ctrl.onCheckAllItems = onCheckAllItems;\n        ctrl.onSearchInputChange = onSearchInputChange;\n        ctrl.toggleAddItemField = toggleAddItemField;\n        ctrl.toggleDropdown = toggleDropdown;\n        ctrl.toggleSearchInputFocus = toggleSearchInputFocus;\n        ctrl.updateViewValue = updateViewValue;\n        ctrl.isDisabled = isDisabled;\n\n        //\n        // Hook methods\n        //\n\n        function onInit() {\n            lodash.defaults(ctrl, {\n                disabled: false,\n                dropdown: false,\n                dropdownApply: false,\n                groups: false,\n                selectAllNone: false\n            });\n\n            if (lodash.isNil(ctrl.optionList)) {\n                ctrl.optionList = ctrl.groups ? {} : [];\n            }\n\n            // register $isEmpty to make \"required\" work properly for empty array\n            ctrl.ngModelCtrl.$isEmpty = lodash.isEmpty;\n\n            // on model-value change, update view: set each checkbox state (checked/un-checked) according to model\n            ctrl.ngModelCtrl.$render = function () {\n                updateOptionsState();\n                // ctrl.updateViewValue();\n            };\n        }\n\n        /**\n         * Updates the internal `ctrl.optionList` according to and on change of the assigned bindings: `options`,\n         * `labelPath` and `valuePath`\n         * @param {Object} changesObject - AngularJS's changes-object\n         */\n        function onChanges(changesObject) {\n\n            // take the new value for bindings that were changed, and take the stored value for the ones that did not\n            var newOptionsValue = lodash.get(changesObject, 'options.currentValue', ctrl.options);\n            var newLabelPath = lodash.get(changesObject, 'labelPath.currentValue', ctrl.labelPath);\n            var newValuePath = lodash.get(changesObject, 'valuePath.currentValue', ctrl.valuePath);\n            var newDisabledPath = lodash.get(changesObject, 'disabledPath.currentValue', ctrl.disabledPath);\n            var newBaseId = lodash.get(changesObject, 'baseId.currentValue', lodash.defaultTo(ctrl.baseId, ''));\n\n            if (ctrl.groups) {\n                lodash.forEach(newOptionsValue, function (group, name) {\n                    lodash.set(ctrl.optionList, name, lodash.omit(newOptionsValue[name], 'options'));\n\n                    var options = lodash.map(group.options, function (option, index) {\n                        var id = lodash.defaultTo(option.id, '');\n\n                        return {\n                            label: fetchOptionProperty(option, newLabelPath, LABEL_PATH_DEFAULT),\n                            value: fetchOptionProperty(option, newValuePath, VALUE_PATH_DEFAULT),\n                            disabled: fetchOptionProperty(option, newDisabledPath, DISABLED_PATH_DEFAULT, false),\n                            enableTooltip: fetchOptionProperty(option, TOOLTIP_ENABLED, TOOLTIP_ENABLED, false),\n                            tooltipText: fetchOptionProperty(option, TOOLTIP_TEXT, TOOLTIP_TEXT),\n                            id: generateOptionId(newBaseId, id, index),\n                            checked: option.checked,\n                            filtered: option.filtered,\n                            visibility: fetchOptionProperty(option, VISIBILITY_DEFAULT, VISIBILITY_DEFAULT, true)\n                        };\n                    });\n\n                    lodash.set(ctrl.optionList, name + '.options', options);\n                });\n            } else {\n\n                // populate option list using the provided options, label path, value path and disabled path\n                // (if any of `labelPath`, `valuePath` or `disabledPath` is empty, or point to an undefined path in option\n                // object - then the default value for that path is used)\n                ctrl.optionList = lodash.map(newOptionsValue, function (option, index) {\n                    var id = lodash.defaultTo(option.id, '');\n\n                    return {\n                        label: fetchOptionProperty(option, newLabelPath, LABEL_PATH_DEFAULT),\n                        value: fetchOptionProperty(option, newValuePath, VALUE_PATH_DEFAULT),\n                        disabled: fetchOptionProperty(option, newDisabledPath, DISABLED_PATH_DEFAULT, false),\n                        enableTooltip: fetchOptionProperty(option, TOOLTIP_ENABLED, TOOLTIP_ENABLED, false),\n                        tooltipText: fetchOptionProperty(option, TOOLTIP_TEXT, TOOLTIP_TEXT),\n                        id: generateOptionId(newBaseId, id, index),\n                        checked: option.checked,\n                        filtered: option.filtered,\n                        visibility: fetchOptionProperty(option, VISIBILITY_DEFAULT, VISIBILITY_DEFAULT, true)\n                    };\n                });\n            }\n            ctrl.ngModelCtrl.$render();\n\n            /**\n             * Returns the provided string value in case it is a non-empty string, or the default value otherwise (if it\n             * is an empty string, `null` or `undefined`)\n             * @param {string} stringValue - the string value\n             * @param {string} defaultValue - the default value to return in case `stringValue` is empty, `null` or\n             *     `undefined`\n             * @returns {string} `stringValue` if it is a non-empty string, or `defaultValue` in case `stringValue` is\n             *     either an empty string or a `null` or `undefined`\n             */\n            function getDefaultIfEmpty(stringValue, defaultValue) {\n                return lodash.isEmpty(stringValue) ? defaultValue : stringValue;\n            }\n\n            /**\n             * Fetches a property in an option item.\n             * First tries to use the user-defined path.\n             * If user-defined path is empty or it does not exist in option then uses default path.\n             * If even default path does not exist in option then returns the default value if such is defined.\n             * @param {Object} option - the option item from which to fetch the property\n             * @param {string} userPath - path to the property in `option`\n             * @param {string} defaultPath - the path to use in case `userPath` does not exist in `option`\n             * @param {*} [defaultValue] - the value to return in case both `userPath` and `defaultPath` do not exist\n             *     in `option`\n             * @returns {*} the value at `userPath` in `option` in case it exists, otherwise the value at `defaultPath`\n             *     in `option` in case it exists, otherwise `defaultValue`\n             */\n            function fetchOptionProperty(option, userPath, defaultPath, defaultValue) {\n\n                // use user-defined path if exists (not `null`, `undefined` or `''`), otherwise use default\n                var path = getDefaultIfEmpty(userPath, defaultPath);\n\n                // prepare the return value in case above path does not exist in provided option\n                var returnValueWhenPathNotFound = lodash.get(option, defaultPath);\n\n                // get the value at path in option\n                var returnValue = lodash.get(option, path, returnValueWhenPathNotFound);\n\n                // in case even default path does not exist in option - return the provided default value\n                return lodash.defaultTo(returnValue, defaultValue);\n            }\n\n            /**\n             * Generates the value for `id` attribute of `<input type=\"checkbox\">` element for an option.\n             * @param {string} baseId - the string to use as a base for the option id.\n             * @param {string} ownId - the specific id defined for the option.\n             * @param {number} index - the index of the option in the option list.\n             * @returns {string} concatenation of `baseId` and `ownId`. If `ownId` is empty, `index` is used instead.\n             *     If both `baseId` and `ownId` are empty, then some default base id is used instead of `baseId` and\n             *     `index` is used instead of `ownId`.\n             *\n             * @example\n             * generateOptionId('baseId_', 'ownId', 1);\n             * // => 'baseId_OwnId'\n             *\n             * @example\n             * generateOptionId('', 'ownId', 1);\n             * // => 'ownId'\n             *\n             * @example\n             * generateOptionId('baseId_', '', 1);\n             * // => 'baseId_1'\n             *\n             * @example\n             * generateOptionId('', '', 1);\n             * // => 'igz_multiple_checkboxes_1538567062180_1'\n             */\n            function generateOptionId(baseId, ownId, index) {\n                return lodash.isEmpty(baseId + ownId) ? BASE_ID_DEFAULT + index : lodash.isEmpty(ownId) ? newBaseId + index :\n                /* both are non-empty or only `newId` is non-empty */newBaseId + ownId;\n            }\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Adds new item to options list.\n         * Available only for groups mode in dropdown.\n         * @param {string} inputValue - new item value\n         * @param {Object} group - new item's group model\n         * @param {string} name - group name\n         */\n        function addItem(inputValue, group, name) {\n            if (group.addingEnabled && !lodash.isEmpty(inputValue)) {\n                lodash.get(ctrl.optionList, name + '.options').unshift({\n                    id: inputValue,\n                    label: inputValue,\n                    value: inputValue,\n                    enableTooltip: false,\n                    disabled: false,\n                    checked: true,\n                    filtered: false\n                });\n            }\n\n            ctrl.toggleAddItemField(group, name);\n            ctrl.updateViewValue();\n        }\n\n        /**\n         * Callback on 'Apply' changes.\n         */\n        function onApply() {\n            if (angular.isFunction(ctrl.dropdownApplyCallback)) {\n                toggleDropdown();\n\n                ctrl.dropdownApplyCallback({ data: ctrl.optionList });\n            }\n        }\n\n        /**\n         * Callback on 'Cancel' button\n         */\n        function onCancel() {\n            onSearchInputChange('');\n            toggleDropdown();\n        }\n\n        /**\n         * Callback on master checkbox state changes.\n         * @param {Event} event - event object\n         * @param {string} name - group name\n         */\n        function onCheckAllItems(event, name) {\n            if (ctrl.groups && !lodash.isNil(name)) {\n                var options = lodash.get(ctrl.optionList, name + '.options');\n                var isAllItemsChecked = !lodash.get(ctrl.optionList, name + '.allItemsChecked');\n\n                lodash.forEach(options, function (option) {\n                    lodash.set(option, 'checked', isAllItemsChecked);\n                });\n\n                lodash.assign(ctrl.optionList[name], {\n                    allItemsChecked: isAllItemsChecked,\n                    itemsChecked: isAllItemsChecked ? options.length : 0,\n                    options: options\n                });\n            } else {\n                ctrl.isAllItemsChecked = !ctrl.isAllItemsChecked;\n                ctrl.checkedItemsCount = ctrl.isAllItemsChecked ? ctrl.optionList.length : 0;\n\n                lodash.forEach(ctrl.optionList, function (option) {\n                    option.checked = ctrl.isAllItemsChecked;\n                });\n            }\n        }\n\n        /**\n         * Callback on search input changes.\n         * @param {string} searchData\n         */\n        function onSearchInputChange(searchData) {\n            if (lodash.isEmpty(searchData) || lodash.isNil(searchData)) {\n                lodash.forEach(ctrl.optionList, function (group) {\n                    lodash.forEach(group.options, function (option) {\n                        lodash.set(option, 'filtered', false);\n                    });\n                });\n            } else {\n                lodash.forEach(ctrl.optionList, function (item) {\n                    if (ctrl.groups) {\n                        lodash.forEach(item.options, function (option) {\n                            lodash.set(option, 'filtered', !lodash.startsWith(option.value.toLowerCase(), searchData));\n                        });\n                    } else {\n                        lodash.set(item, 'filtered', !lodash.startsWith(item.value.toLowerCase(), searchData));\n                    }\n                });\n            }\n        }\n\n        /**\n         * Toggles add new item field visibility\n         * @param {Object} group - new item's group model\n         * @param {string} name - group name\n         */\n        function toggleAddItemField(group, name) {\n            if (group.addingEnabled) {\n                var isVisible = !lodash.get(ctrl.optionList, name + '.addItemInputVisible', false);\n\n                lodash.set(ctrl.optionList, name + '.addItemInputVisible', isVisible);\n            }\n        }\n\n        /**\n         * Toggles dropdown visibility\n         */\n        function toggleDropdown() {\n            ctrl.isDropdownOpened = !ctrl.isDropdownOpened;\n        }\n\n        /**\n         * Toggles search input focus/blur for style changes\n         */\n        function toggleSearchInputFocus() {\n            ctrl.isSearchInputFocused = !ctrl.isSearchInputFocused;\n        }\n\n        /**\n         * Sets a new state to the view-value, which is an array of strings corresponding to the checked options\n         */\n        function updateViewValue() {\n            var newViewValue = ctrl.groups ? {} : [];\n\n            if (ctrl.groups) {\n                lodash.forEach(ctrl.optionList, function (group, key) {\n                    var checkedItems = lodash.filter(group.options, 'checked');\n\n                    group.allItemsChecked = checkedItems.length === group.options.length;\n\n                    lodash.set(ctrl.optionList, key + '.itemsChecked', checkedItems.length);\n                    lodash.set(newViewValue, key, lodash.map(checkedItems, 'value'));\n                });\n\n                if (!ctrl.dropdownApply && angular.isFunction(ctrl.dropdownApplyCallback)) {\n                    ctrl.dropdownApplyCallback({ data: ctrl.optionList });\n                }\n            } else {\n                var checkedItems = lodash.filter(ctrl.optionList, 'checked');\n\n                if (ctrl.selectAllNone) {\n                    ctrl.isAllItemsChecked = checkedItems.length === ctrl.optionList.length;\n                    ctrl.checkedItemsCount = checkedItems.length;\n                }\n\n                newViewValue = lodash.map(checkedItems, 'value');\n            }\n\n            ctrl.ngModelCtrl.$setViewValue(newViewValue, 'change');\n        }\n\n        /**\n         * Tests whether a provided option should be disabled or not.\n         * @param {{disabled: boolean}} option - the option to test\n         * @returns {boolean} `true` if this option should be disabled, or `false` otherwise\n         */\n        function isDisabled(option) {\n            return ctrl.disabled || option.disabled;\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Checks the options that correspond to the string values inside the model, and un-checks the rest.\n         */\n        function updateOptionsState() {\n            if (ctrl.groups) {\n                lodash.forEach(ctrl.optionList, function (group, name) {\n                    var viewValue = lodash.get(ctrl.ngModelCtrl.$viewValue, name, []);\n\n                    lodash.forEach(group.options, function (option) {\n                        option.checked = group.allItemsChecked ? true : lodash.includes(viewValue, option.value);\n                    });\n                });\n            } else {\n                lodash.forEach(ctrl.optionList, function (option) {\n                    option.checked = lodash.includes(ctrl.ngModelCtrl.$viewValue, option.value);\n                });\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    /**\n     * @name igzNumberInput\n     * @component\n     *\n     * @description\n     * An input field for numbers. It has up/down arrows to increase/decrease the value. The model is of type `number`\n     * by default, by can be changed to `string` by setting `asString` to `true`. You can optionally add prefix and/or\n     * suffix text to the input field.\n     * The `angular-money-directive` directive is used {@link https://github.com/fiestah/angular-money-directive}.\n     * The `igzValidateElevation` directive is used to allow easily comparing numeric inputs with some unit to another\n     * value with some unit (@see igzValidateElevation).\n     * @param {number|string} currentValue - The initial value of the field.\n     * @param {string} [valueStep='1'] - The size of step for increment/decrement when clicking on the up/down arrows\n     *     of this component.\n     * @param {boolean} [allowEmptyField=false] - Set to `true` to consider field valid when empty (and\n     *     `updateNumberInputCallback` will be invoked when changing input to empty)\n     * @param {boolean} [asString=false] - Set to `true` to receive value as type `string` instead of type `number`.\n     * @param {{power: number|string}} [currentValueUnit] - The unit scale of `currentValue`. Will be forwarded to\n     *     `currentValUnit` attribute of `igzValidateElevation`.\n     * @param {number|string} [defaultValue] - Default value which will be set on initialization and change in case\n     *     input is empty.\n     * @param {Object} [formObject] - The `<form>` or `<ng-form>` element/directive containing this input field.\n     * @param {string} [inputName] - The name of the filed, will be forwarded to the `name` attribute of the HTML\n     *     `<input>` element.\n     * @param {boolean} [isDisabled=false] - Set to `true` to make this field disabled.\n     * @param {boolean} [isFocused=false] - Set to `true` to give focus to this field once it finished initializing.\n     * @param {number} [maxValue=Infinity] - The maximum valid value.\n     * @param {number} [minValue=-Infinity] - The minimum valid value.\n     * @param {function} [itemBlurCallback] - A callback function for `blur` event. Invoked with `event`, `inputValue`\n     *     and `inputName` when the field loses focus.\n     * @param {function} [itemFocusCallback] - A callback function for `focus` event. Invoked with `event` and\n     *     `inputName` when the field becomes focused.\n     * @param {function} [onChange] - A callback function for `change` method on item changed\n     * @param {string} [placeholder] - Placeholder text to display when input is empty.\n     * @param {string} [precision=0] - The number of decimal places of value.\n     * @param {string} [prefixUnit] - Prefix text to show to the left of value (for example: \"$\").\n     * @param {string} [suffixUnit] - Suffix text to show to the right of the value (for example: \"GB\").\n     * @param {function} [updateNumberInputCallback] - A callback function for value changes. Invoked with `newData`\n     *     and `field`. When `isDataRevert` is set to `true` this function will be invoked on `blur` event.\n     * @param {string} [updateNumberInputField=inputName] - The field name to be passed as `field` parameter when\n     *     invoking `updateDataCallback` (defaults to `inputName`'s value).\n     * @param {boolean} [validationIsRequired=false] - Set to `true` to make this field mandatory. The field will be\n     *     invalid if it is empty.\n     * @param {number|string} [validationValue] - The value to compare `currentValue` to. Will be forwarded to\n     *     `compareVal` attribute of `igzValidateElevation`.\n     * @param {{power: number|string}} [validationValueUnit] - The unit scale of `validationValue`. Will be forwarded to\n     *     `compareValUnit` attribute of `igzValidateElevation`.\n     */\n\n    IgzNumberInputController.$inject = ['$element', '$timeout', 'lodash', 'FormValidationService'];\n    angular.module('iguazio.dashboard-controls').component('igzNumberInput', {\n        bindings: {\n            allowEmptyField: '<?',\n            asString: '<?',\n            currentValue: '<',\n            currentValueUnit: '<?',\n            defaultValue: '<?',\n            formObject: '<?',\n            inputName: '@?',\n            isDisabled: '<?',\n            isFocused: '<?',\n            itemBlurCallback: '&?',\n            itemFocusCallback: '&?',\n            maxValue: '<?',\n            minValue: '<?',\n            onChange: '<?',\n            placeholder: '@?',\n            precision: '@?',\n            prefixUnit: '@?',\n            suffixUnit: '@?',\n            updateNumberInputCallback: '&?',\n            updateNumberInputField: '@?',\n            validationIsRequired: '<?',\n            validationValue: '<?',\n            validationValueUnit: '<?',\n            valueStep: '@?'\n        },\n        templateUrl: 'igz_controls/components/number-input/number-input.tpl.html',\n        controller: IgzNumberInputController\n    });\n\n    function IgzNumberInputController($element, $timeout, lodash, FormValidationService) {\n        var ctrl = this;\n\n        var firstValidValue;\n\n        ctrl.inputFocused = false;\n        ctrl.numberInputChanged = false;\n        ctrl.numberInputValid = true;\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n\n        ctrl.isShowFieldInvalidState = FormValidationService.isShowFieldInvalidState;\n\n        ctrl.decreaseValue = decreaseValue;\n        ctrl.handleInputBlur = handleInputBlur;\n        ctrl.handleInputChange = handleInputChange;\n        ctrl.handleInputFocus = handleInputFocus;\n        ctrl.handleSuffixClick = handleSuffixClick;\n        ctrl.increaseValue = increaseValue;\n        ctrl.isShownUnit = isShownUnit;\n        ctrl.isValid = isValid;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            lodash.defaults(ctrl, {\n                allowEmptyField: false,\n                asString: false,\n                defaultValue: null,\n                isDisabled: false,\n                isFocused: false,\n                itemBlurCallback: angular.noop,\n                itemFocusCallback: angular.noop,\n                maxValue: Infinity,\n                minValue: -Infinity,\n                placeholder: '',\n                precision: lodash.defaultTo(Number(ctrl.precision), 0),\n                updateNumberInputCallback: angular.noop,\n                updateNumberInputField: ctrl.inputName,\n                validationIsRequired: false,\n                valueStep: '1'\n            });\n\n            if (lodash.isNil(ctrl.currentValue) && !lodash.isNil(ctrl.defaultValue)) {\n                ctrl.currentValue = ctrl.defaultValue;\n            }\n\n            firstValidValue = Math.max(ctrl.minValue, ctrl.maxValue) < 0 ? ctrl.maxValue : ctrl.minValue;\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n            var focused = String(ctrl.isFocused).toLowerCase() === 'true';\n            ctrl.inputFocused = focused;\n            if (focused) {\n                $element.find('.field').focus();\n            }\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Checks if the input value is invalid\n         * @returns {boolean}\n         */\n        function isValid() {\n            if (angular.isDefined(ctrl.formObject) && angular.isDefined(ctrl.formObject[ctrl.inputName])) {\n                var valid = !ctrl.validationIsRequired || !lodash.isNil(ctrl.currentValue) && ctrl.currentValue !== '';\n                ctrl.formObject[ctrl.inputName].$setValidity('text', valid);\n            }\n\n            return ctrl.isShowFieldInvalidState(ctrl.formObject, ctrl.inputName);\n        }\n\n        /**\n         * Method subtracts value from current value in input\n         */\n        function decreaseValue() {\n            var nextValue = isCurrentValueEmpty() ? -Number(ctrl.valueStep) : -Number(ctrl.valueStep) + Number(ctrl.currentValue);\n\n            // when input is empty set firstValidValue\n            ctrl.currentValue = lodash.defaultTo(getDecreasedValue(nextValue), firstValidValue);\n\n            onCurrentValueChange();\n        }\n\n        /**\n         * Method adds value to current value in input\n         */\n        function increaseValue() {\n            var nextValue = isCurrentValueEmpty() ? Number(ctrl.valueStep) : Number(ctrl.valueStep) + Number(ctrl.currentValue);\n\n            // when input is empty set firstValidValue\n            ctrl.currentValue = lodash.defaultTo(getIncreasedValue(nextValue), firstValidValue);\n\n            onCurrentValueChange();\n        }\n\n        /**\n         * Method checks if passed value is defined\n         * @param {string} [unitValue] - passed string unit value\n         * @returns {boolean} returns true if defined\n         */\n        function isShownUnit(unitValue) {\n            return angular.isDefined(unitValue);\n        }\n\n        /**\n         * Handles on change event\n         */\n        function handleInputChange() {\n            ctrl.numberInputChanged = true;\n            onCurrentValueChange();\n\n            if (lodash.isNil(ctrl.currentValue) && !lodash.isNull(ctrl.defaultValue) && !ctrl.allowEmptyField) {\n                ctrl.currentValue = ctrl.defaultValue;\n            }\n        }\n\n        /**\n         * Handles the `click` event of the suffix.\n         * @param {Event} event - The `click` event.\n         */\n        function handleSuffixClick(event) {\n            $element.find('.field').focus();\n            ctrl.handleInputFocus(event);\n        }\n\n        /**\n         * Handles the `focus` event of the input field.\n         * @param {Event} event - The `focus` event on the input field or the `click` event on the suffix.\n         */\n        function handleInputFocus(event) {\n            ctrl.inputFocused = true;\n\n            ctrl.itemFocusCallback({\n                event: event,\n                inputName: ctrl.inputName\n            });\n        }\n\n        /**\n         * Handles the `blur` event of the input field.\n         * @param {FocusEvent} event - The `blur` event.\n         */\n        function handleInputBlur(event) {\n            ctrl.inputFocused = false;\n\n            if (angular.isFunction(ctrl.itemFocusCallback)) {\n                ctrl.itemBlurCallback({\n                    event: event,\n                    inputValue: ctrl.currentValue,\n                    inputName: ctrl.inputName\n                });\n            }\n\n            onCurrentValueChange();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Checks if `nextValue` is inside the range [ctrl.minValue, ctrl.maxValue].\n         * Returns valid value.\n         * @param {number} nextValue\n         * @returns {number|null}\n         */\n        function getDecreasedValue(nextValue) {\n            var validValue = ctrl.currentValue;\n\n            // range is [ctrl.minValue, ctrl.maxValue]\n            if (lodash.inRange(nextValue, ctrl.minValue, ctrl.maxValue)) {\n                // nextValue is inside range --> valid --> nextValue\n                validValue = nextValue;\n            } else if (lodash.inRange(nextValue, ctrl.maxValue, Infinity)) {\n                // nextValue is to right of the range --> not valid --> end of range\n                validValue = ctrl.maxValue;\n            } else if (lodash.inRange(nextValue, ctrl.minValue, ctrl.minValue - Number(ctrl.valueStep))) {\n                // nextValue is to left of the range, but not more then ctrl.valueStep --> not valid --> start of range\n                validValue = ctrl.minValue;\n            }\n\n            // other cases --> nothing changes\n            // when input is empty, ctrl.currentValue is null --> return null\n\n            return validValue;\n        }\n\n        /**\n         * Checks if `nextValue` is inside the range [ctrl.minValue, ctrl.maxValue].\n         * Returns valid value.\n         * @param {number} nextValue\n         * @returns {number|null}\n         */\n        function getIncreasedValue(nextValue) {\n            var validValue = ctrl.currentValue;\n\n            // range is [ctrl.minValue, ctrl.maxValue]\n            if (lodash.inRange(nextValue, ctrl.minValue, ctrl.maxValue)) {\n                // nextValue is inside range --> valid --> nextValue\n                validValue = nextValue;\n            } else if (lodash.inRange(nextValue, -Infinity, ctrl.minValue)) {\n                // nextValue is to the left of the range --> not valid --> start of range\n                validValue = ctrl.minValue;\n            } else if (lodash.inRange(nextValue, ctrl.maxValue, ctrl.maxValue + Number(ctrl.valueStep))) {\n                // nextValue is to right of the range, but not more then ctrl.valueStep --> not valid --> end of range\n                validValue = ctrl.maxValue;\n            }\n\n            // other cases --> nothing changes\n            // when input is empty, ctrl.currentValue is null --> return null\n\n            return validValue;\n        }\n\n        /**\n         * Checks if current value is empty (empty input)\n         * @returns {boolean}\n         */\n        function isCurrentValueEmpty() {\n            return lodash.isNil(ctrl.currentValue) || ctrl.currentValue === '';\n        }\n\n        /**\n         * Handles any changes of current value\n         */\n        function onCurrentValueChange() {\n            validateCurrentValue();\n            $timeout(function () {\n                lodash.get(ctrl, 'onChange', angular.noop)(ctrl.isValid());\n            });\n        }\n\n        /**\n         * Resets the input to default value if it is invalid\n         */\n        function validateCurrentValue() {\n            if (angular.isDefined(ctrl.updateNumberInputCallback)) {\n                var currentValueIsDefined = !lodash.isNil(ctrl.currentValue) && ctrl.currentValue !== '';\n\n                if (ctrl.allowEmptyField || currentValueIsDefined) {\n                    var newData = !currentValueIsDefined ? '' : ctrl.asString ? String(ctrl.currentValue) :\n                    /* else */Number(ctrl.currentValue);\n\n                    ctrl.updateNumberInputCallback({\n                        newData: newData,\n                        field: ctrl.updateNumberInputField\n                    });\n                }\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzPaginationController.$inject = ['$scope', '$timeout', 'lodash', 'EventHelperService', 'LocalStorageService', 'PaginationService'];\n    angular.module('iguazio.dashboard-controls').component('igzPagination', {\n        bindings: {\n            allowJumpToPage: '<?',\n            entityName: '@?',\n            pageData: '<',\n            paginationCallback: '&',\n            perPageValues: '<?',\n            isPerPageVisible: '<?',\n            sort: '<'\n        },\n        templateUrl: 'igz_controls/components/pagination/pagination.component.tpl.html',\n        controller: IgzPaginationController\n    });\n\n    function IgzPaginationController($scope, $timeout, lodash, EventHelperService, LocalStorageService, PaginationService) {\n        var ctrl = this;\n\n        ctrl.jumpPage = 1;\n        ctrl.maxPagesToDisplay = 9;\n        ctrl.page = 0;\n        ctrl.pages = [];\n        ctrl.perPage = null;\n        ctrl.jumpToPagePattern = new RegExp('^\\\\d+$');\n\n        ctrl.$onInit = onInit;\n\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.jumpToPage = jumpToPage;\n        ctrl.onPerPageChanged = onPerPageChanged;\n        ctrl.goToNextPage = goToNextPage;\n        ctrl.goToPage = goToPage;\n        ctrl.goToPrevPage = goToPrevPage;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Constructor\n         */\n        function onInit() {\n            lodash.defaults(ctrl, {\n                allowJumpToPage: true\n            });\n\n            if (angular.isUndefined(ctrl.perPageValues)) {\n                ctrl.perPageValues = PaginationService.perPageDefaults();\n            }\n\n            ctrl.perPage = lodash.some(ctrl.perPageValues, 'id', ctrl.pageData.size) ? ctrl.pageData.size : ctrl.perPageValues[0].id;\n\n            $scope.$watch('$ctrl.pageData.total', initValues);\n            $scope.$watch('$ctrl.pageData.number', updatePage);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Update data callback\n         * @param {string} newData\n         * @param {string} field\n         */\n        function inputValueCallback(newData, field) {\n            ctrl.jumpPage = newData;\n        }\n\n        /**\n         * Method to jump to page\n         */\n        function jumpToPage() {\n            $timeout(function () {\n                ctrl.jumpPage = parseInt(ctrl.jumpPage, 10);\n                if (ctrl.jumpPage > 0 && ctrl.jumpPage <= ctrl.pageData.total) {\n\n                    // ctrl.jumpToPage numbering begins from 1, not from 0\n                    ctrl.goToPage(ctrl.jumpPage - 1);\n                } else {\n                    ctrl.jumpPage = String(ctrl.page + 1);\n                }\n            });\n        }\n\n        /**\n         * Method selecting active page as first on changing rows per page\n         * @param {Object} item - new item\n         * @param {boolean} isItemChanged - was value changed or not\n         */\n        function onPerPageChanged(item, isItemChanged) {\n            if (isItemChanged) {\n                lodash.set(ctrl, 'perPage', item.id);\n            }\n\n            if (angular.isDefined(ctrl.entityName)) {\n                LocalStorageService.setItem('itemsPerPage', ctrl.entityName, ctrl.perPage);\n            }\n\n            ctrl.goToPage(0);\n        }\n\n        /**\n         * Go to next page by clicking Next button\n         * Or to first page if the last page is current\n         * @param {Object} event\n         */\n        function goToNextPage(event) {\n            if (angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) {\n                ctrl.goToPage((ctrl.page + 1) % ctrl.pageData.total);\n            }\n        }\n\n        /**\n         * Method to switch page\n         * @param {string|number} pageNumber\n         * @param {Object} [event]\n         * @returns {boolean}\n         */\n        function goToPage(pageNumber, event) {\n            if (angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) {\n                if (pageNumber === '...') {\n                    return false;\n                }\n                ctrl.page = pageNumber;\n                generatePagesArray();\n\n                if (angular.isFunction(ctrl.paginationCallback)) {\n                    ctrl.paginationCallback({\n                        page: ctrl.page,\n                        size: ctrl.perPage,\n                        additionalParams: {\n                            sort: ctrl.sort\n                        }\n                    });\n                }\n            }\n        }\n\n        /**\n         * Go to previous page by clicking Previous button\n         * @param {Object} event\n         */\n        function goToPrevPage(event) {\n            if (angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) {\n                ctrl.goToPage(ctrl.page === 0 ? ctrl.pageData.total - 1 : ctrl.page - 1);\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Generates pages array\n         */\n        function generatePagesArray() {\n\n            // The first page is always displayed\n            ctrl.pages = [0];\n\n            // if there are more pages than allowed, we need to exclude some pages:\n            // 1 2 3 4 5 6 7 ... 15\n            if (ctrl.pageData.total > ctrl.maxPagesToDisplay) {\n\n                // 4 is count of elements that should be present: '1 page', '...', '...', 'Last page'\n                var middleGroup = ctrl.maxPagesToDisplay - 4;\n\n                // if current page is in the beginning\n                // 1 2 3 4 5 6 7 ... 15\n                if (ctrl.page < middleGroup) {\n                    [].push.apply(ctrl.pages, lodash.range(1, middleGroup + 2));\n\n                    ctrl.pages.push('...');\n\n                    // if current page is in the end\n                    // 1 ... 9 10 11 12 13 14 15\n                } else if (ctrl.page >= ctrl.pageData.total - middleGroup) {\n                    ctrl.pages.push('...');\n                    [].push.apply(ctrl.pages, lodash.range(ctrl.pageData.total - middleGroup - 2, ctrl.pageData.total - 1));\n\n                    // if current page is in the middle\n                    // 1 ... 6 7 8 9 10 ... 15\n                } else {\n                    ctrl.pages.push('...');\n\n                    // calculate how many pages should be displayed before active page\n                    // for example, there are 9 pages max, so: 1 | ... | middle group | ... | last page\n                    // Middle group looks like: | visible1 | visible2 | current | visible3 | visible4\n                    var firstVisiblePage = ctrl.page - Math.ceil((middleGroup - 1) / 2);\n\n                    // calculate how many pages should be displayed after active page\n                    var lastVisiblePage = ctrl.page + Math.floor((middleGroup - 1) / 2);\n\n                    [].push.apply(ctrl.pages, lodash.range(firstVisiblePage, lastVisiblePage + 1));\n\n                    ctrl.pages.push('...');\n                }\n\n                // Add the last page\n                ctrl.pages.push(ctrl.pageData.total - 1);\n            } else {\n\n                // if there are less pages, than max allowed, display them all\n                [].push.apply(ctrl.pages, lodash.range(1, ctrl.pageData.total));\n            }\n        }\n\n        /**\n         * Initialise values\n         */\n        function initValues() {\n            updatePage();\n            ctrl.jumpPage = String(Math.floor(ctrl.pageData.total / 2));\n\n            if (ctrl.pageData.total > 0) {\n                ctrl.jumpToPagePattern = createNumberPattern(ctrl.pageData.total);\n            }\n\n            generatePagesArray();\n        }\n\n        /**\n         * Updates current page value from pageData object\n         */\n        function updatePage() {\n            ctrl.page = ctrl.pageData.number;\n        }\n\n        /**\n         * Creates a RegExp pattern that validates only numbers in the range from 1 to `upperBound`.\n         * @param {number} upperBound - the maximum number to consider valid by the returned RegExp pattern.\n         * @returns {RegExp} a RegExp pattern as a string, that validates a given string to be a number in the range\n         *     from 1 to `upperBound`, or the empty-string (`''`) if `upperBound` is not of type `number` or if it is\n         *     a non-positive number.\n         */\n        function createNumberPattern(upperBound) {\n            var str = String(upperBound);\n            var len = str.length;\n\n            if (!angular.isNumber(upperBound) || upperBound <= 0) {\n                return '';\n            }\n\n            if (len === 1) {\n                return '^[1-' + str + ']$';\n            }\n\n            var patterns = ['\\\\d{1,' + (len - 1) + '}'];\n            var lastDigits = '';\n            lodash.forEach(lodash.initial(str), function (digit, index) {\n                var upper = Number(digit) - 1;\n                if (upper >= 0) {\n                    patterns.push(lastDigits + '[0-' + upper + ']\\\\d{' + (len - 1 - index) + '}');\n                }\n                lastDigits += digit;\n            });\n            patterns.push(lastDigits + '[0-' + upperBound % 10 + ']');\n            return new RegExp('^(?!0+$)(' + patterns.join('|') + ')$');\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    PaginationController.$inject = ['$i18next', '$injector', '$location', '$rootScope', '$stateParams', '$timeout', 'i18next', 'lodash', 'ActionCheckboxAllService', 'PaginationService', 'entitiesType', 'onChangePageCallback', 'dataServiceName', 'vm', 'emptyOnPageChange'];\n    angular.module('iguazio.dashboard-controls').controller('PaginationController', PaginationController);\n\n    /*eslint no-shadow: 0*/\n    function PaginationController($i18next, $injector, $location, $rootScope, $stateParams, $timeout, i18next, lodash, ActionCheckboxAllService, PaginationService, entitiesType, onChangePageCallback, dataServiceName, vm, emptyOnPageChange) {\n\n        // entityId - id of nested entity\n        var entityId = lodash.defaultTo($location.search().entityId, $stateParams.id);\n        var selectedItemId = $stateParams.selectedItemId || $location.search().id;\n        var dataService = null;\n        var lng = i18next.language;\n\n        vm.sort = '';\n        vm.entityUiConfig = [];\n\n        vm.changePage = changePage;\n        vm.updatePagination = updatePagination;\n\n        activate();\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Changes entities by getting new portion of data from the back-end.\n         * @param {number} pageNumber - new page number to get data from.\n         * @param {number} perPage - how many items should be present on a page.\n         * @param {Object} [additionalParams] - additional parameters that should be passed to data service method\n         *     (e.g. filter, include, sort, etc.).\n         */\n        function changePage(pageNumber, perPage, additionalParams) {\n            var pageAdditionalParams = lodash.cloneDeep(additionalParams);\n            selectedItemId = lodash.defaultTo($stateParams.selectedItemId, $location.search().id);\n            selectedItemId = isNumeric(selectedItemId) ? lodash.toInteger(selectedItemId) : selectedItemId;\n\n            vm.isSplashShowed.value = lodash.get(additionalParams, 'isSplashShowed', true);\n\n            if (lodash.isFunction(vm.closeInfoPane)) {\n                vm.closeInfoPane();\n            }\n\n            vm.page.size = perPage;\n            vm.page.number = lodash.isNil(selectedItemId) ? pageNumber : 0;\n\n            if (!lodash.defaultTo(vm.preventModifyURL, false)) {\n                $location.search('pageSize', vm.page.size);\n\n                if (lodash.isNil($location.search().id)) {\n                    $location.search('pageNumber', vm.page.number + 1);\n                }\n            }\n\n            // save entities ui state\n            vm.entityUiConfig = lodash.map(vm[entitiesType], function (el) {\n                return lodash.pick(el, ['id', 'ui']);\n            });\n\n            if (lodash.defaultTo(emptyOnPageChange, true)) {\n                vm[entitiesType] = [];\n            }\n\n            // abort all pending statistics requests\n            $rootScope.$broadcast('statistics-data_abort-requests');\n\n            var methodName = entitiesType + 'Paginated';\n            return dataService[methodName](lodash.isNil(selectedItemId) ? vm.page.number : null, vm.page.size, fillAdditionalParams(pageAdditionalParams), entityId).then(function (response) {\n                vm[entitiesType] = response;\n\n                // restore entities ui.checked state after page changing\n                if (vm.entityUiConfig.length > 0) {\n                    lodash.forEach(vm[entitiesType], function (el) {\n                        lodash.merge(el, {\n                            ui: {\n                                checked: lodash.chain(vm.entityUiConfig).find({ id: el.id }).get('ui.checked').defaultTo(false).value()\n                            }\n                        });\n                    });\n                    var checkedItems = lodash.filter(vm[entitiesType], ['ui.checked', true]);\n                    ActionCheckboxAllService.setCheckedItemsCount(checkedItems.length);\n                }\n\n                vm.page.total = lodash.get(vm[entitiesType], 'total_pages', 1);\n                vm.page.number = lodash.get(vm[entitiesType], 'page_number', vm.page.number);\n\n                if (!lodash.defaultTo(vm.preventModifyURL, false) && lodash.isNil($location.search().id)) {\n                    $location.search('pageNumber', vm.page.number + 1);\n                }\n\n                checkPageNumber(additionalParams);\n\n                if (!lodash.isNil(selectedItemId)) {\n                    $timeout(function () {\n                        var selectedItem = lodash.find(vm[entitiesType], { id: selectedItemId });\n\n                        $rootScope.$broadcast(entitiesType.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase() + '-table-row_on-select-row', selectedItem);\n                        $stateParams.selectedItemId = null;\n                    });\n                }\n\n                checkSearchStates();\n\n                // if some additional processing required\n                if (lodash.isFunction(onChangePageCallback)) {\n                    onChangePageCallback();\n                }\n\n                // Hide loading splash screen\n                vm.isSplashShowed.value = false;\n            }).catch(function (error) {\n                var errorMessages = {\n                    '400': $i18next.t('common:ERROR_MSG.PAGINATION.400', { lng: lng }),\n                    '403': $i18next.t('common:ERROR_MSG.PAGINATION.403', { lng: lng }),\n                    '500': $i18next.t('common:ERROR_MSG.ERROR_ON_SERVER_SIDE', { lng: lng }),\n                    'default': $i18next.t('common:ERROR_MSG.UNKNOWN_ERROR', { lng: lng })\n                };\n                var message = lodash.get(errorMessages, String(error.status), errorMessages.default);\n\n                $rootScope.$broadcast('splash-screen_show-error', {\n                    alertText: message + ' ' + $i18next.t('common:ERROR_MSG.YOU_CAN_TRY_TO_REFRESH_PAGE', { lng: lng })\n                });\n            });\n        }\n\n        /**\n         * Updates current page by reloading it with the same page number and page size.\n         * @param {Object} additionalParams -\n         */\n        function updatePagination(additionalParams) {\n            return vm.changePage(vm.page.number, vm.page.size, additionalParams);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Constructor method.\n         */\n        function activate() {\n            initializePageInfo();\n\n            dataService = $injector.get(lodash.defaultTo(dataServiceName, lodash.upperFirst(entitiesType) + 'DataService'));\n        }\n\n        /**\n         * Checks if page number (from response) is out of bounds. If it is, goes to last page.\n         * @param {Object} [additionalParams] - additional parameters that should be passed to data service method.\n         */\n        function checkPageNumber(additionalParams) {\n            var oldPageNumber = vm.page.number;\n            vm.page.number = lodash.clamp(vm.page.number, 0, vm.page.total - 1);\n            if (oldPageNumber !== vm.page.number) {\n                vm.updatePagination(additionalParams);\n            }\n        }\n\n        /**\n         * Toggles `searchNotFound` state on or off according to the list being empty or not.\n         */\n        function checkSearchStates() {\n            if (!lodash.isNil(vm.searchStates)) {\n                vm.searchStates.searchNotFound = vm[entitiesType].length === 0 && vm.page.number === 0;\n            }\n        }\n\n        /**\n         * Returns additional params with items id, filtering and sorting if it exists\n         * @param {Object} [additionalParams={}]\n         * @returns {Object}\n         */\n        function fillAdditionalParams(additionalParams) {\n            if (!lodash.isObject(additionalParams)) {\n                additionalParams = {};\n            }\n\n            additionalParams.sort = (vm.isReverseSorting ? '-' : '') + vm.sortedColumnName;\n\n            if (!lodash.isNil(selectedItemId)) {\n                additionalParams['page[of]'] = selectedItemId;\n            }\n\n            if (lodash.isFunction(vm.clearFilters) && !lodash.isNil(selectedItemId)) {\n                vm.clearFilters();\n            }\n\n            if (lodash.isFunction(vm.getActiveFilters)) {\n                lodash.defaultsDeep(additionalParams, vm.getActiveFilters());\n            }\n\n            return additionalParams;\n        }\n\n        /**\n         * Initializes page info.\n         */\n        function initializePageInfo() {\n            lodash.defaultsDeep(vm, {\n                page: {\n                    number: 0,\n                    size: 10,\n                    total: 0\n                }\n            });\n\n            // Get data provided in url\n            var providedData = $location.search();\n            var pageSize = Number.parseInt(lodash.get(providedData, 'pageSize'));\n            var providedPageSizeValue = Number.isInteger(pageSize) ? pageSize : vm.page.size;\n\n            // Set page size\n            var perPageOptions = lodash.isNil(vm.perPageValues) ? PaginationService.perPageDefaults() : vm.perPageValues;\n            var perPage = lodash.chain(perPageOptions).sortBy('id').map('id').find(function (option) {\n                return option >= providedPageSizeValue;\n            }).defaultTo(lodash.maxBy(perPageOptions, 'id').id).value();\n\n            vm.page.size = PaginationService.getPageSize(entitiesType, perPage);\n\n            // Set page number\n            var providedPageNumber = Number.parseInt(lodash.get(providedData, 'pageNumber'));\n            vm.page.number = !lodash.isInteger(providedPageNumber) ? vm.page.number : Math.max(providedPageNumber - 1, 0);\n        }\n    }\n\n    /**\n     * Checks if a string is a whole number (i.e. consists of digits only).\n     * @param {string} value - the string to test.\n     * @returns {boolean} `ture` if `value` consists of digit characters only, or `false` otherwise.\n     */\n    function isNumeric(value) {\n        return (/^\\d+$/.test(value)\n        );\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    PaginationService.$inject = ['$controller', 'lodash', 'LocalStorageService'];\n    angular.module('iguazio.dashboard-controls').factory('PaginationService', PaginationService);\n\n    function PaginationService($controller, lodash, LocalStorageService) {\n        return {\n            addPagination: addPagination,\n            perPageDefaults: perPageDefaults,\n            getPageSize: getPageSize\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Initialize new Pagination controller and bind it's method to another controller\n         * @param {Object} controller vm\n         * @param {string} entitiesType name of entities type\n         * @param {string} [dataServiceName] Name of DataService\n         * @param {function} [onChangePageCallback] Additional code that should be executed after page changed\n         * @param {boolean} [emptyOnPageChange=true] Set to `false` to prevent list from emptying before repopulating\n         */\n        function addPagination(controller, entitiesType, dataServiceName, onChangePageCallback, emptyOnPageChange) {\n            $controller('PaginationController', {\n                entitiesType: entitiesType,\n                onChangePageCallback: onChangePageCallback,\n                dataServiceName: dataServiceName,\n                vm: controller,\n                emptyOnPageChange: emptyOnPageChange\n            });\n        }\n\n        /**\n         * Returns default values for perPage dropdown\n         * @returns {Array.<Object>}\n         */\n        function perPageDefaults() {\n            return [{\n                id: 10,\n                name: '10'\n            }, {\n                id: 20,\n                name: '20'\n            }, {\n                id: 30,\n                name: '30'\n            }, {\n                id: 40,\n                name: '40'\n            }];\n        }\n\n        /**\n         * Gets page size from localStorage if it exist there.\n         * If no - set default page size to localStorage and return it\n         * @param {string} entity - entity name\n         * @param {number} pageSize - default value of page size\n         * @returns {number}\n         */\n        function getPageSize(entity, pageSize) {\n            var storedPerPage = angular.copy(LocalStorageService.getItem('itemsPerPage', entity));\n\n            if (lodash.isNil(storedPerPage)) {\n                LocalStorageService.setItem('itemsPerPage', entity, pageSize);\n                storedPerPage = pageSize;\n            }\n\n            return storedPerPage;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    SearchHelperService.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').factory('SearchHelperService', SearchHelperService);\n\n    function SearchHelperService(lodash) {\n        return {\n            makeSearch: makeSearch\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Perform search of data based on text query\n         * @param {string} searchQuery - text query entered to a search input\n         * @param {Array.<Object>} data - array of data\n         * @param {Array.<string>} pathsForSearchArray - array of keys in which search will be made\n         * @param {boolean} isHierarchical - flag which indicates if passed data has hierarchical structure\n         * @param {string} ruleType - string representing the type of rule resource\n         * @param {Object} searchStates\n         * @param {string} [multiSearchName] - unique name of the search input\n         */\n        function makeSearch(searchQuery, data, pathsForSearchArray, isHierarchical, ruleType, searchStates, multiSearchName) {\n            searchStates.searchNotFound = false;\n            searchStates.searchInProgress = false;\n\n            if (isHierarchical) {\n                data = data.ui.children;\n            } else {\n                ruleType = '';\n            }\n            if (searchQuery === '') {\n                showAllChildren(data, multiSearchName);\n            } else if (angular.isString(searchQuery)) {\n                searchStates.searchNotFound = true;\n                searchStates.searchInProgress = true;\n                findBySearchQuery(searchQuery, data, pathsForSearchArray, isHierarchical, ruleType, searchStates, multiSearchName);\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Loop through all given data to show/hide them depending on query match criteria (recursively)\n         * @param {string} searchQuery - text query entered to a search input\n         * @param {Array.<Object>} children - array of child data\n         * @param {Array.<string>} pathsForSearch - array of strings, representing data's properties keys to search from\n         * @param {boolean} isHierarchical - flag which indicates if passed data has hierarchical structure\n         * @param {string} ruleType - string representing the type of rule resource\n         * @param {Object} searchStates\n         * @param {string} [multiSearchName] - unique name of the search input\n         */\n        function findBySearchQuery(searchQuery, children, pathsForSearch, isHierarchical, ruleType, searchStates, multiSearchName) {\n            angular.forEach(children, function (child) {\n                // Search by text in data without children data only\n                if (angular.isString(child.type) && child.type !== ruleType && isHierarchical) {\n                    // Hide all parent data while search among children and proceed recursively\n                    child.ui.isFitQuery = false;\n                    findBySearchQuery(searchQuery, child.ui.children, pathsForSearch, isHierarchical, ruleType, searchStates, multiSearchName);\n                } else {\n                    showRelevantItem(searchQuery, child, pathsForSearch, searchStates, multiSearchName);\n                }\n            });\n        }\n\n        /**\n         * Get all current item's properties string values and push to stringValuesArray (recursively)\n         * @param {string} itemPropertyValue - item's attribute value\n         * @param {Array} stringValuesArray - array to collect current item's all properties string values\n         */\n        function getStringValuesFromItem(itemPropertyValue, stringValuesArray) {\n            if (angular.isObject(itemPropertyValue)) {\n                angular.forEach(itemPropertyValue, function (value) {\n                    getStringValuesFromItem(value, stringValuesArray);\n                });\n            } else if (angular.isString(itemPropertyValue) && itemPropertyValue.length > 0 || angular.isNumber(itemPropertyValue)) {\n                stringValuesArray.push(itemPropertyValue.toString());\n            }\n\n            return stringValuesArray;\n        }\n\n        /**\n         * Sets isFitQuery value for data item\n         * @param {Object} dataItem - current item\n         * @param {string} [multiSearchName] - unique name of the search input\n         * @param {boolean} isFitQuery - `true` if item is matched with search query\n         */\n        function setFitQueryValue(dataItem, multiSearchName, isFitQuery) {\n            var filterPath = lodash.isEmpty(multiSearchName) ? 'isFitQuery' : ['filters', multiSearchName, 'isFitQuery'];\n\n            lodash.set(dataItem.ui, filterPath, isFitQuery);\n        }\n\n        /**\n         * Show all data item's children chain (recursively)\n         * @param {Array.<Object>} data - child items\n         * @param {string} [multiSearchName] - unique name of the search input\n         */\n        function showAllChildren(data, multiSearchName) {\n            angular.forEach(data, function (value) {\n                var children = value.ui.children;\n\n                setFitQueryValue(value, multiSearchName, true);\n\n                if (!lodash.isEmpty(children)) {\n                    showAllChildren(children);\n                }\n            });\n        }\n\n        /**\n         * Show item's all direct ancestors chain (recursively)\n         * @param {Object} dataItem - current item\n         */\n        function showAllParents(dataItem) {\n            var parent = dataItem.ui.parent;\n            if (angular.isDefined(parent)) {\n                parent.ui.isFitQuery = true;\n                showAllParents(parent);\n            }\n        }\n\n        /**\n         * Loop through all given data's properties and show/hide current data depending on query match criteria\n         * @param {string} searchQuery - query entered to a search input\n         * @param {Object} dataItem - current item\n         * @param {Array} pathsForSearch - array of strings, representing paths to item's properties to search from\n         * @param {Object} searchStates\n         * @param {string} [multiSearchName] - unique name of the search input\n         */\n        function showRelevantItem(searchQuery, dataItem, pathsForSearch, searchStates, multiSearchName) {\n            var isFitQuery;\n            var stringValuesArray = [];\n\n            angular.forEach(pathsForSearch, function (pathForSearch) {\n                getStringValuesFromItem(lodash.get(dataItem, pathForSearch), stringValuesArray);\n            });\n\n            // If at least one value in item's properties string values matched - show current item and all its direct ancestors chain\n            isFitQuery = stringValuesArray.some(function (value) {\n                return lodash.includes(value.toLowerCase(), searchQuery.toLowerCase());\n            });\n\n            setFitQueryValue(dataItem, multiSearchName, isFitQuery);\n\n            if (dataItem.ui.isFitQuery) {\n                searchStates.searchNotFound = false;\n                showAllParents(dataItem);\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzSearchInputController.$inject = ['$scope', '$timeout', 'lodash', 'SearchHelperService'];\n    angular.module('iguazio.dashboard-controls').component('igzSearchInput', {\n        bindings: {\n            dataSet: '<',\n            initSearchQuery: '@?',\n            isSearchHierarchically: '@?',\n            liveSearch: '<?',\n            multiSearchName: '@?',\n            onSearchSubmit: '&?',\n            placeholder: '@',\n            ruleType: '@?',\n            searchCallback: '&?',\n            searchKeys: '<',\n            searchStates: '<',\n            searchType: '@?',\n            type: '@?'\n        },\n        templateUrl: 'igz_controls/components/search-input/search-input.tpl.html',\n        controller: IgzSearchInputController\n    });\n\n    function IgzSearchInputController($scope, $timeout, lodash, SearchHelperService) {\n        var ctrl = this;\n\n        ctrl.isInputFocused = false;\n        ctrl.isSearchHierarchically = String(ctrl.isSearchHierarchically) === 'true';\n        ctrl.searchQuery = '';\n\n        ctrl.$onInit = onInit;\n        ctrl.onPressEnter = onPressEnter;\n        ctrl.clearInputField = clearInputField;\n        ctrl.toggleInputFocus = toggleInputFocus;\n\n        //\n        // Hook method\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.searchStates.searchNotFound = false;\n            ctrl.searchStates.searchInProgress = false;\n\n            if (!lodash.isUndefined(ctrl.initSearchQuery)) {\n                ctrl.searchQuery = ctrl.initSearchQuery;\n            }\n\n            if (angular.isUndefined(ctrl.searchType)) {\n                ctrl.searchType = 'infoPage';\n            }\n\n            if (angular.isUndefined(ctrl.liveSearch) || ctrl.liveSearch) {\n                $scope.$watch('$ctrl.searchQuery', onChangeSearchQuery);\n            }\n\n            $scope.$on('search-input_refresh-search', onDataChanged);\n            $scope.$on('search-input_reset', resetSearch);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Initializes search and apply filters on press enter\n         * @param {Event} e\n         */\n        function onPressEnter(e) {\n            if (e.keyCode === 13) {\n                makeSearch();\n\n                if (angular.isFunction(ctrl.onSearchSubmit) && ctrl.isInputFocused) {\n                    ctrl.onSearchSubmit();\n                }\n            }\n        }\n\n        /**\n         * Clear search input field\n         */\n        function clearInputField() {\n            ctrl.searchQuery = '';\n        }\n\n        /**\n         * Toggles input focus\n         */\n        function toggleInputFocus() {\n            ctrl.isInputFocused = !ctrl.isInputFocused;\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Calls service method for search\n         */\n        function makeSearch() {\n            if (angular.isFunction(ctrl.searchCallback)) {\n\n                // call custom search method\n                ctrl.searchCallback(lodash.pick(ctrl, ['searchQuery', 'dataSet', 'searchKeys', 'isSearchHierarchically', 'ruleType', 'searchStates', 'multiSearchName']));\n            }\n\n            if (angular.isUndefined(ctrl.type)) {\n\n                // default search functionality\n                SearchHelperService.makeSearch(ctrl.searchQuery, ctrl.dataSet, ctrl.searchKeys, ctrl.isSearchHierarchically, ctrl.ruleType, ctrl.searchStates, ctrl.multiSearchName);\n            }\n        }\n\n        /**\n         * Tracks input changing and initializes search\n         */\n        function onChangeSearchQuery(newValue, oldValue) {\n            if (angular.isDefined(newValue) && newValue !== oldValue) {\n                makeSearch();\n            }\n        }\n\n        /**\n         * Initializes search when all html has been rendered\n         */\n        function onDataChanged() {\n            $timeout(makeSearch);\n        }\n\n        /**\n         * Resets search query and initializes search\n         */\n        function resetSearch() {\n            ctrl.searchQuery = '';\n            $timeout(makeSearch);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    igzShowHideSearchItem.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').directive('igzShowHideSearchItem', igzShowHideSearchItem);\n\n    function igzShowHideSearchItem(lodash) {\n        return {\n            restrict: 'A',\n            scope: {\n                dataItem: '=igzShowHideSearchItem'\n            },\n            link: link\n        };\n\n        function link(scope, element) {\n            activate();\n\n            //\n            // Private methods\n            //\n\n            /**\n             * Constructor method\n             */\n            function activate() {\n                scope.$watch('dataItem.ui.isFitQuery', changeVisibility);\n                scope.$watch('dataItem.ui.filters', changeVisibility, true);\n            }\n\n            /**\n             * Method sets display property of element to false if it doesn't fit the query in search otherwise removes these property\n             * @param {boolean} newValue - value displays if current element fit search query\n             */\n            function changeVisibility(newValue) {\n                var displayValue = '';\n\n                if (lodash.isObject(newValue)) {\n                    displayValue = lodash.some(newValue, { isFitQuery: false }) ? 'none' : '';\n                } else {\n                    displayValue = newValue === false ? 'none' : '';\n                }\n\n                element.css('display', displayValue);\n            }\n        }\n    }\n})();\n'use strict';\n\n/* eslint complexity: [\"error\", 14] */\n(function () {\n    'use strict';\n\n    IgzSizeController.$inject = ['$filter', '$scope', '$i18next', '$timeout', 'i18next', 'lodash', 'moment', 'ConfigService', 'PaletteService'];\n    angular.module('iguazio.dashboard-controls').component('igzSize', {\n        bindings: {\n            entity: '<',\n            type: '@'\n        },\n        templateUrl: 'igz_controls/components/size/size.tpl.html',\n        controller: IgzSizeController\n    });\n\n    function IgzSizeController($filter, $scope, $i18next, $timeout, i18next, lodash, moment, ConfigService, PaletteService) {\n        var ctrl = this;\n        var lng = i18next.language;\n        var timeout = null;\n\n        var TOOLTIP_ARROW_SIZE = 7;\n        var tooltipByType = {\n            container: $i18next.t('common:TOOLTIP.LAST_MONTH', { lng: lng }),\n            service: $i18next.t('common:TOOLTIP.LAST_HOUR', { lng: lng }),\n            function: $i18next.t('common:TOOLTIP.LAST_HOUR', { lng: lng }),\n            storage_pool: $i18next.t('common:TOOLTIP.LAST_MONTH', { lng: lng }),\n            cluster: $i18next.t('common:TOOLTIP.LAST_10_MINUTES', { lng: lng }),\n            node: $i18next.t('common:TOOLTIP.LAST_10_MINUTES', { lng: lng }),\n            tenant: $i18next.t('common:TOOLTIP.LAST_MONTH', { lng: lng })\n        };\n\n        var CPU_TYPES = ['nodes', 'clusters'];\n        var CPU_CORES_TYPES = ['services_cpu', 'functions_cpu'];\n        var SIZE_TYPES = ['containers', 'storage-pools', 'tenants', 'services_memory', 'functions_memory'];\n        var COUNT_TYPES = ['functions_events'];\n\n        ctrl.outOf = '';\n\n        ctrl.$onInit = onInit;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.isDemoMode = ConfigService.isDemoMode;\n        ctrl.getDisplayValue = getDisplayValue;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.chartObjName = ctrl.type + '-chartObj';\n            ctrl.tooltip = tooltipByType[ctrl.entity.type];\n\n            if (lodash.startsWith(ctrl.type, 'services')) {\n                ctrl.tooltip = tooltipByType['service'];\n            } else if (lodash.startsWith(ctrl.type, 'functions')) {\n                ctrl.tooltip = tooltipByType['function'];\n            }\n\n            prepareData(ctrl.type);\n\n            ctrl.metricType = isCpu() ? 'cpuLineChartData' : isCpuCores() ? 'cpuCoresLineChartData' : isSize() ? 'sizeLineChartData' : 'countLineChartData';\n\n            ctrl.displayValueWithTooltip = lodash.includes(['containers', 'tenants'], ctrl.type);\n            ctrl.justDisplayValue = lodash.includes(['clusters', 'nodes', 'functions_cpu', 'functions_memory', 'functions_events', 'services_cpu', 'services_memory'], ctrl.type);\n\n            ctrl.displayValueClasses = {\n                'short': lodash.includes(['functions_memory'], ctrl.type),\n                'shorten': lodash.includes(['functions_events'], ctrl.type),\n                'shortest': lodash.includes(['clusters', 'nodes', 'services_cpu', 'functions_cpu'], ctrl.type)\n            };\n\n            lodash.defaults(ctrl.entity.ui, {\n                lineChartOptions: {}\n            });\n\n            ctrl.entity.ui.lineChartOptions[ctrl.type] = {\n                options: {\n                    chart: {\n                        backgroundColor: 'transparent',\n                        borderWidth: 0,\n                        style: {\n                            overflow: 'visible'\n                        },\n                        spacing: [0, 0, 0, 0],\n                        type: 'areaspline'\n                    },\n                    title: {\n                        text: ''\n                    },\n                    credits: {\n                        enabled: false\n                    },\n                    xAxis: {\n                        lineWidth: 0,\n                        labels: {\n                            enabled: false\n                        },\n                        title: {\n                            text: null\n                        },\n                        type: 'datetime',\n                        startOnTick: false,\n                        endOnTick: false,\n                        tickPositions: []\n                    },\n                    yAxis: {\n                        min: 0,\n                        endOnTick: false,\n                        startOnTick: false,\n                        labels: {\n                            enabled: false\n                        },\n                        title: {\n                            text: null\n                        },\n                        tickPositions: []\n                    },\n                    legend: {\n                        enabled: false\n                    },\n                    tooltip: {\n                        enabled: false\n                    },\n                    plotOptions: {\n                        series: {\n                            animation: false,\n                            color: PaletteService.sizeChartPlotOptionsSeriesColor,\n                            fillColor: {\n                                linearGradient: { x1: 0, y1: -1, x2: 0, y2: 1 },\n                                stops: [[0, PaletteService.sizeChartPlotOptionsSeriesFillColorOne], [1, PaletteService.sizeChartPlotOptionsSeriesFillColorTwo]]\n                            },\n                            lineWidth: 2,\n                            marker: {\n                                enabled: false,\n                                states: {\n                                    hover: {\n                                        enabled: false\n                                    }\n                                }\n                            },\n                            shadow: false,\n                            states: {\n                                hover: {\n                                    lineWidth: 2\n                                }\n                            }\n                        },\n                        column: {\n                            negativeColor: PaletteService.sizeChartPlotOptionsColumnNegativeColor,\n                            borderColor: 'silver'\n                        }\n                    },\n                    navigation: {\n                        buttonOptions: {\n                            enabled: false\n                        }\n                    }\n                },\n                title: {\n                    text: ''\n                },\n                loading: false,\n                useHighStocks: false,\n                func: function func(chart) {\n                    ctrl.entity.ui[ctrl.chartObjName] = chart;\n                }\n            };\n\n            ctrl.entity.ui.lineChartOptions[ctrl.type].series = [{\n                data: ctrl.entity.ui.metrics[ctrl.metricType],\n                name: 'Volume (GB)'\n            }];\n\n            if (ctrl.type === 'storage-pools') {\n                ctrl.entity.ui.lineChartOptions[ctrl.type].options.tooltip = {\n                    backgroundColor: 'none',\n                    borderWidth: 0,\n                    enabled: true,\n                    hideDelay: 0,\n                    shadow: false,\n                    shared: true,\n                    style: {\n                        padding: 0\n                    },\n                    useHTML: true,\n                    positioner: function positioner(tooltipWidth, tooltipHeight, point) {\n                        var sizeContainerPosition = this.chart.container.getClientRects()[0];\n                        var left = point.plotX - tooltipWidth / 2 + sizeContainerPosition.left;\n                        var top = point.plotY - tooltipHeight + sizeContainerPosition.top - TOOLTIP_ARROW_SIZE;\n\n                        return { x: left, y: top };\n                    },\n                    formatter: function formatter() {\n                        var sizePercentage = '';\n                        if (lodash.isNumber(ctrl.entity.attr.usable_capacity)) {\n                            sizePercentage = Math.floor(100 * this.y / ctrl.entity.attr.usable_capacity);\n                            sizePercentage = '(' + (sizePercentage < 1 ? '~0' : sizePercentage) + '%)';\n                        }\n                        return '<div class=\"igz-tooltip-wrapper\">' + '<div class=\"igz-row\">' + '<div class=\"tooltip-label igz-col-40\">' + $i18next.t('common:TOTAL', { lng: lng }) + '</div>' + '<div class=\"tooltip-value igz-col-60\">' + $filter('bytes')(ctrl.entity.attr.usable_capacity, 2) + '</div>' + '</div>' + '<div class=\"igz-row\">' + '<div class=\"tooltip-label igz-col-40\">' + $i18next.t('common:USED', { lng: lng }) + '</div>' + '<div class=\"tooltip-value igz-col-60\">' + '<span>' + $filter('bytes')(this.y, 1) + '</span>' + '&nbsp;<span class=\"tooltip-value-highlighted\">' + sizePercentage + '</span>' + '</div>' + '</div>' + '<div class=\"igz-row\">' + '<div class=\"tooltip-label igz-col-40\">' + $i18next.t('common:FREE', { lng: lng }) + '</div>' + '<div class=\"tooltip-value igz-col-60\">' + $filter('bytes')(ctrl.entity.attr.usable_capacity - this.y, 2) + '</div>' + '</div>' + '</div><div class=\"igz-tooltip-arrow-down\"></div>';\n                    }\n                };\n\n                $scope.$on('size_hide-tooltip', hideChartTooltip);\n            }\n\n            if (isCpu()) {\n                ctrl.entity.ui.lineChartOptions[ctrl.type].options.tooltip = {\n                    backgroundColor: 'none',\n                    borderWidth: 0,\n                    enabled: true,\n                    hideDelay: 0,\n                    shadow: false,\n                    shared: true,\n                    style: {\n                        padding: 0\n                    },\n                    useHTML: true,\n                    positioner: function positioner(tooltipWidth, tooltipHeight, point) {\n                        var sizeContainerPosition = this.chart.container.getClientRects()[0];\n                        var left = point.plotX - tooltipWidth / 2 + sizeContainerPosition.left;\n                        var top = point.plotY - tooltipHeight + sizeContainerPosition.top - TOOLTIP_ARROW_SIZE;\n\n                        return { x: left, y: top };\n                    },\n                    formatter: function formatter() {\n                        var formattedDate = moment(this.points[0].key).format('DD MMM, YYYY, hh:mm:ss A');\n\n                        return '<div class=\"igz-tooltip-wrapper\">' + '<div class=\"tooltip-header\">' + formattedDate + '</div>' + '<div class=\"igz-row\">' + '<div class=\"tooltip-label igz-col-40\">' + $i18next.t('common:CPU_USED', { lng: lng }) + '</div>' + '<div class=\"tooltip-value igz-col-60\">' + this.y.toFixed(1) + '%</div>' + '</div>' + '</div>' + '<div class=\"igz-tooltip-arrow-down\"></div>';\n                    }\n                };\n\n                $scope.$on('size_hide-tooltip', hideChartTooltip);\n            } else if (isTooltipEnabled()) {\n                ctrl.entity.ui.lineChartOptions[ctrl.type].options.tooltip = {\n                    backgroundColor: 'none',\n                    borderWidth: 0,\n                    enabled: true,\n                    hideDelay: 0,\n                    shadow: false,\n                    shared: true,\n                    style: {\n                        padding: 0\n                    },\n                    useHTML: true,\n                    positioner: function positioner(tooltipWidth, tooltipHeight, point) {\n                        var sizeContainerPosition = this.chart.container.getClientRects()[0];\n                        var left = point.plotX - tooltipWidth / 2 + sizeContainerPosition.left;\n                        var top = point.plotY - tooltipHeight + sizeContainerPosition.top - TOOLTIP_ARROW_SIZE;\n\n                        return { x: left, y: top };\n                    },\n                    formatter: function formatter() {\n                        var formattedDate = moment(this.points[0].key).format('DD MMM, YYYY, hh:mm:ss A');\n                        var tooltipValue = isCount() ? $filter('scale')(this.y) : isCpuCores() ? $filter('scale')(this.y, 0, 'nanos') : $filter('bytes')(this.y, 2);\n                        var label = isCount() ? $i18next.t('common:VALUE', { lng: lng }) : $i18next.t('common:USED', { lng: lng });\n\n                        return '<div class=\"igz-tooltip-wrapper used-capacity-tooltip-wrapper\">' + '<div class=\"tooltip-header\">' + formattedDate + '</div>' + '<div class=\"igz-row\">' + '<div class=\"tooltip-label igz-col-30\">' + label + '</div>' + '<div class=\"tooltip-value igz-col-70\">' + tooltipValue + '</div>' + '</div>' + '</div>' + '<div class=\"igz-tooltip-arrow-down\"></div>';\n                    }\n                };\n\n                $scope.$on('size_hide-tooltip', hideChartTooltip);\n            }\n\n            if (ctrl.type === 'storage-pools_containers' && angular.isDefined(ctrl.entity.attr.quota) && ctrl.entity.attr.quota !== 0 && isMaxQuotaValueAppropriate()) {\n\n                ctrl.entity.ui.lineChartOptions[ctrl.type].options.yAxis.plotLines = [{\n                    color: PaletteService.sizeChartLineChartOptionsYAxisPlotLinesColor,\n                    width: 1,\n                    value: ctrl.entity.attr.quota,\n                    zIndex: 5\n                }];\n\n                ctrl.entity.ui.lineChartOptions[ctrl.type].options.yAxis.max = ctrl.entity.attr.quota;\n            }\n\n            if (isCpu()) {\n                ctrl.entity.ui.lineChartOptions[ctrl.type].options.yAxis.max = 100;\n            }\n\n            $scope.$on('size_update-charts', updateChart);\n            $scope.$on('info-page-pane_toggled', updateChart);\n            $scope.$on('resize-size-cells', updateChart);\n\n            timeout = $timeout(updateChart);\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            if (!lodash.isNil(timeout)) {\n                $timeout.cancel(timeout);\n            }\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Gets display value\n         * @returns {string}\n         */\n        function getDisplayValue() {\n            var defaultValue = isCpu() ? '0%' : isSize() ? '0 bytes' : '0';\n            var metricName = isCpu() ? 'cpu.idle' : isCpuCores() ? 'cpu.cores' : isSize() ? 'size' : 'count';\n            var value = ctrl.entity.ui.metrics[metricName];\n            var sizePercentage = ctrl.entity.ui.metrics.sizePercentage;\n            sizePercentage = lodash.isUndefined(sizePercentage) ? '' : ' (' + sizePercentage + '%)';\n\n            return lodash.isNil(value) ? defaultValue : isCpu() ? $filter('number')(value > 0 ? 100 - value : 0, 0) + '%' : isCpuCores() ? $filter('scale')(value, 0, 'nanos') : isSize() ? $filter('bytes')(value, 2) + sizePercentage : $filter('scale')(value);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Hides chart tooltip\n         */\n        function hideChartTooltip() {\n            if (!ctrl.entity.ui[ctrl.chartObjName].tooltip.isHidden) {\n                ctrl.entity.ui[ctrl.chartObjName].tooltip.hide();\n            }\n        }\n\n        /**\n         * Determines whether this chart is for Count\n         * @returns {boolean} `true` if this chart is for Count or `false` otherwise\n         */\n        function isCount() {\n            return lodash.includes(COUNT_TYPES, ctrl.type);\n        }\n\n        /**\n         * Determines whether this chart is for CPU\n         * @returns {boolean} `true` if this chart is for CPU or `false` otherwise\n         */\n        function isCpu() {\n            return lodash.includes(CPU_TYPES, ctrl.type);\n        }\n\n        /**\n         * Determines whether this chart is for CPU cores\n         * @returns {boolean} `true` if this chart is for CPU cores or `false` otherwise\n         */\n        function isCpuCores() {\n            return lodash.includes(CPU_CORES_TYPES, ctrl.type);\n        }\n\n        /**\n         * Defines if max quota value and max point in chart data has difference less than 20%\n         * @returns {boolean}\n         */\n        function isMaxQuotaValueAppropriate() {\n            var maxGraphicPoint = lodash.maxBy(lodash.values(ctrl.entity.ui.metrics.sizeLineChartData), function (point) {\n                return point[1];\n            });\n\n            return (ctrl.entity.attr.quota - maxGraphicPoint[1]) / ctrl.entity.attr.quota * 100 <= 20;\n        }\n\n        /**\n         * Determines whether this chart is for Size\n         * @returns {boolean} `true` if this chart is for Size or `false` otherwise\n         */\n        function isSize() {\n            return lodash.includes(SIZE_TYPES, ctrl.type);\n        }\n\n        /**\n         * Checks if chart should have a tooltip\n         * @returns {boolean}\n         */\n        function isTooltipEnabled() {\n            return lodash.includes(['containers', 'storage-pools', 'tenants', 'services_memory', 'services_cpu', 'functions_memory', 'functions_cpu', 'functions_events'], ctrl.type);\n        }\n\n        /**\n         * Initializes data according to passed page type\n         * @param {string} type - page type\n         */\n        function prepareData(type) {\n            var dataTypes = {\n                'clusters': prepareCpuData,\n                'containers': prepareSizeData,\n                'nodes': prepareCpuData,\n                'functions_cpu': prepareCpuCoresData,\n                'functions_memory': prepareSizeData,\n                'functions_events': prepareCountData,\n                'services_cpu': prepareCpuData,\n                'services_memory': prepareSizeData,\n                'storage-pools': prepareStoragePoolsData,\n                'storage-pools_containers': prepareStoragePoolsContainersData,\n                'tenants': prepareSizeData\n            };\n\n            dataTypes[type]();\n\n            function prepareCpuData() {\n                lodash.defaults(ctrl.entity.ui.metrics, { 'cpu.idle': 0 });\n            }\n\n            function prepareCpuCoresData() {\n                lodash.defaults(ctrl.entity.ui.metrics, { 'cpu.cores': 0 });\n            }\n\n            function prepareSizeData() {\n                lodash.defaults(ctrl.entity.ui.metrics, { size: 0 });\n            }\n\n            function prepareCountData() {\n                lodash.defaults(ctrl.entity.ui.metrics, { count: 0 });\n            }\n\n            function prepareStoragePoolsData() {\n                lodash.defaults(ctrl.entity.ui.metrics, { size: 0 });\n                updateOutOf();\n            }\n\n            function prepareStoragePoolsContainersData() {\n                lodash.defaults(ctrl.entity.ui.metrics, { size: 0 });\n\n                ctrl.reserved = angular.isDefined(ctrl.entity.attr.reserved) ? $filter('bytes')(ctrl.entity.attr.reserved, 2) : 0;\n                ctrl.quota = angular.isDefined(ctrl.entity.attr.quota) ? $filter('bytes')(ctrl.entity.attr.quota, 2) : -1;\n            }\n        }\n\n        /**\n         * Updates chart on broadcasted event\n         */\n        function updateChart() {\n            var reflow = lodash.get(ctrl.entity.ui, ctrl.chartObjName + '.reflow');\n            if (angular.isFunction(reflow)) {\n                ctrl.entity.ui[ctrl.chartObjName].reflow();\n            }\n        }\n\n        function updateOutOf() {\n            var usableCapacity = ctrl.entity.attr.usable_capacity;\n            ctrl.outOf = lodash.isNil(usableCapacity) ? '-' : $filter('bytes')(usableCapacity, 2);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzSliderInputBlockController.$inject = ['$rootScope', '$scope', '$timeout', 'lodash', 'ConverterService'];\n    angular.module('iguazio.dashboard-controls').component('igzSliderInputBlock', {\n        bindings: {\n            allowFullRange: '<',\n            onChangeCallback: '<',\n            onSliderChanging: '<?',\n            sliderConfig: '<',\n            sliderBlockUpdatingBroadcast: '@',\n            measureUnits: '<?',\n            valueUnit: '<?',\n            updateSliderInput: '@?'\n        },\n        templateUrl: 'igz_controls/components/slider-input-block/slider-input-block.tpl.html',\n        controller: IgzSliderInputBlockController\n    });\n\n    function IgzSliderInputBlockController($rootScope, $scope, $timeout, lodash, ConverterService) {\n        var ctrl = this;\n\n        var defaultMeasureUnits = [{\n            pow: 1,\n            name: 'KB/s'\n        }, {\n            pow: 2,\n            name: 'MB/s'\n        }, {\n            pow: 3,\n            name: 'GB/s'\n        }];\n\n        ctrl.$onInit = onInit;\n\n        ctrl.changeTrafficUnit = changeTrafficUnit;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n\n            // Set default measureUnits if undefined\n            if (angular.isUndefined(ctrl.measureUnits)) {\n                ctrl.measureUnits = defaultMeasureUnits;\n            }\n\n            $scope.$on(ctrl.sliderBlockUpdatingBroadcast, setData);\n\n            $timeout(function () {\n\n                // Bind needed callbacks to configuration objects with updated `ctrl.selectedData` values (for rz-slider library usage)\n                ctrl.sliderConfig.options.onEnd = setValue;\n                ctrl.sliderConfig.options.onChange = checkIfUnlimited;\n            });\n\n            ctrl.selectedItem = lodash.find(ctrl.measureUnits, ['name', ctrl.sliderConfig.unitLabel]);\n\n            // Update data with values from external scope\n            fillRange();\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Method changes measurement unit\n         * @param {Object} trafficUnit - selected measurement unit value\n         */\n        function changeTrafficUnit(trafficUnit) {\n            ctrl.sliderConfig.unitLabel = trafficUnit.name;\n            ctrl.sliderConfig.pow = trafficUnit.pow;\n\n            setValue();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Method checks current value in slider. If it's maximum available then 'U/L'(unlimited) sets in label which displays data.\n         * If it's not maximum - label sets with new value.\n         * Calls onSliderChanging method if it was defined\n         */\n        function checkIfUnlimited() {\n            ctrl.sliderConfig.valueLabel = ctrl.sliderConfig.value === ctrl.sliderConfig.options.ceil && !ctrl.allowFullRange ? 'U/L' : ctrl.sliderConfig.value;\n\n            if (angular.isFunction(ctrl.onSliderChanging) && ctrl.sliderConfig.value !== ctrl.sliderConfig.options.ceil) {\n                ctrl.onSliderChanging(ctrl.sliderConfig.value, ctrl.updateSliderInput);\n            }\n\n            $timeout(function () {\n                $rootScope.$broadcast('rzSliderForceRender');\n            });\n        }\n\n        /**\n         * Update slider data with values from external scope\n         */\n        function fillRange() {\n            if (ctrl.selectedData) {\n                var result = ConverterService.getConvertedBytes(ctrl.selectedData[ctrl.sliderConfig.options.id]);\n\n                ctrl.sliderConfig.value = result.value;\n                ctrl.sliderConfig.valueLabel = result.value;\n                ctrl.sliderConfig.unitLabel = result.label;\n                ctrl.sliderConfig.pow = result.pow;\n\n                ctrl.selectedItem = lodash.find(defaultMeasureUnits, ['name', ctrl.sliderConfig.unitLabel]);\n\n                checkIfUnlimited();\n            }\n        }\n\n        /**\n         * Set slider data with a value passed through broadcast.\n         * Set current selected rule to bind data properly.\n         * @param {Object} event - triggering event\n         * @param {Object} data - passed data\n         */\n        function setData(event, data) {\n            ctrl.selectedData = data.item.attr;\n\n            fillRange();\n        }\n\n        /**\n         * Method sets new value in bytes\n         */\n        function setValue() {\n            if (!lodash.isNil(ctrl.onChangeCallback)) {\n                ctrl.onChangeCallback(ctrl.sliderConfig.value === ctrl.sliderConfig.options.ceil ? null : ctrl.sliderConfig.value * Math.pow(1024, ctrl.sliderConfig.pow), ctrl.updateSliderInput);\n            }\n\n            if (!lodash.isNil(ctrl.selectedData)) {\n                ctrl.selectedData[ctrl.sliderConfig.options.id] = ctrl.sliderConfig.value === ctrl.sliderConfig.options.ceil ? 0 : ctrl.sliderConfig.value * Math.pow(1024, ctrl.sliderConfig.pow);\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    /**\n     * An option on the dropdown.\n     * @typedef {Object} SortOption\n     * @property {boolean} active - Indicates whether the option is active (selected).\n     * @property {boolean} desc - Indicates whether the sort order is descending.\n     * @property {string} label - The label of the option for display.\n     * @property {string} value - Unique identifier of the option (will not be displayed).\n     * @property {boolean} visible - Indicates whether the option is visible.\n     *\n     * @name igzSortDropdown\n     * @component\n     *\n     * @description\n     * An icon button with a drop-down menu consisting of names for sorting. The selected option has a checkmark.\n     * Re-selecting the selected option will change its sort order (ascending/descending).\n     * Selecting a different option always starts from ascending order.\n     *\n     * @param {Array.<SortOption>} sortOptions - The list of options.\n     * @param {SortOption} selectedOption - Set this to the value of the option to select. Use this attribute to\n     *     programmatically set the selected option.\n     * @param {boolean} reverseSorting - Set to `true` to apply descending order of the selected option. Set to `false`\n     *     or omit to apply ascending order of the selected option. Use this to programmatically set the sorting order.\n     * @param {function} [onSortChange] - A callback handler function for selecting a sorting option. It will be invoked\n     *     with _option_ (the selected element from `sortOptions` array).\n     */\n\n    IgzSortDropdownController.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').component('igzSortDropdown', {\n        bindings: {\n            reverseSorting: '<?',\n            sortOptions: '<',\n            selectedOption: '<?',\n            onSortChange: '&?'\n        },\n        templateUrl: 'igz_controls/components/sort-dropdown/sort-dropdown.tpl.html',\n        controller: IgzSortDropdownController\n    });\n\n    function IgzSortDropdownController(lodash) {\n        var ctrl = this;\n\n        ctrl.$onChanges = onChanges;\n        ctrl.$onInit = onInit;\n\n        ctrl.handleOptionClick = handleOptionClick;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * On changes hook method.\n         * @param {Object} changes\n         */\n        function onChanges(changes) {\n            // fill default values for missing properties of dropdown options when a new array is set to `sortOptions`\n            if (lodash.has(changes, 'sortOptions')) {\n                setOptionsDefaults();\n            }\n\n            // programmatically change the selected option\n            if (lodash.has(changes, 'selectedOption')) {\n                lodash.forEach(ctrl.sortOptions, function (option) {\n                    option.active = option.value === changes.selectedOption.currentValue;\n                    option.desc = ctrl.reverseSorting;\n                });\n            }\n\n            // programmatically change the selected option's order (ascending/descending)\n            if (lodash.has(changes, 'reverseSorting')) {\n                var selectedOption = findSelectedOption();\n                selectedOption.desc = changes.reverseSorting.currentValue;\n            }\n        }\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.isOpen = false;\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Handles `click` event on an option.\n         * @param {SortOption} option - The selected option.\n         */\n        function handleOptionClick(option) {\n            var previousOption = findSelectedOption();\n\n            // if an already-selected option is selected again - swap its sorting order (ascending <--> descending)\n            // otherwise, select the new option and de-select the previous option and set it to ascending for next time\n            if (option.active) {\n                option.desc = !option.desc;\n            } else {\n                previousOption.desc = false;\n                previousOption.active = false;\n                option.active = true;\n            }\n\n            if (angular.isFunction(ctrl.onSortChange)) {\n                ctrl.onSortChange({ option: option });\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Finds and returns the selected option.\n         * @returns {SortOption} The option whose `active` property is `true`.\n         */\n        function findSelectedOption() {\n            return lodash.find(ctrl.sortOptions, ['active', true]);\n        }\n\n        /**\n         * Sets `visible` property for all array items into true if it is not already defined.\n         * `visible` property determines whether item will be shown in the sort options list.\n         */\n        function setOptionsDefaults() {\n            lodash.forEach(ctrl.sortOptions, function (option) {\n                lodash.defaults(option, {\n                    active: false,\n                    desc: false,\n                    value: lodash.uniqueId(),\n                    visible: true\n                });\n            });\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzSplashScreenController.$inject = ['$scope', '$state', '$i18next', 'i18next'];\n    angular.module('iguazio.dashboard-controls').component('igzSplashScreen', {\n        bindings: {\n            isSplashShowed: '<'\n        },\n        templateUrl: 'igz_controls/components/splash-screen/splash-screen.tpl.html',\n        controller: IgzSplashScreenController\n    });\n\n    function IgzSplashScreenController($scope, $state, $i18next, i18next) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        // public properties\n        ctrl.isLoading = true;\n        ctrl.isAlertShowing = false;\n        ctrl.textToDisplay = $i18next.t('common:LOADING_CAPITALIZE_ELLIPSIS', { lng: lng });\n\n        ctrl.$onInit = onInit;\n\n        // public methods\n        ctrl.refreshPage = refreshPage;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            $scope.$on('splash-screen_show-error', showError);\n            $scope.$on('browse-action_change-loading-text', changeLoadingText);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Sends broadcast to refresh browse page\n         */\n        function refreshPage() {\n            ctrl.isLoading = true;\n            ctrl.isAlertShowing = false;\n\n            $state.reload();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Changes displayed text on loading spinner\n         * @param {Object} event - broadcast event\n         * @param {Object} data - broadcast data with text to be displayed\n         */\n        function changeLoadingText(event, data) {\n            ctrl.textToDisplay = data.textToDisplay;\n        }\n\n        /**\n         * Shows error text\n         * @param {Object} event - native broadcast event\n         * @param {string} data - broadcast data\n         */\n        function showError(event, data) {\n            if (angular.isDefined(data.textToDisplay)) {\n                ctrl.textToDisplay = data.textToDisplay;\n            }\n\n            if (angular.isDefined(data.alertText)) {\n                ctrl.alertText = data.alertText;\n            }\n\n            ctrl.isLoading = false;\n            ctrl.isAlertShowing = true;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    /**\n     * @name igzTextEdit\n     * @description\n     * Text edit component. This component is a text editor based on `Monaco code editor`\n     * https://github.com/Microsoft/monaco-editor\n     *\n     * @param {string} content - main text content which can be edited.\n     * @param {Object} closeDialog - callback on closing editor dialog.\n     * @param {Object} closeButtonText - name of the bottom close/cancel button.\n     * @param {string} label - name of the text file.\n     * @param {string} language - language of the current content (`plain text`, `javascript` etc.).\n     *     Note: uses for updating node after submitting\n     * @param {string} submitButtonText - name of the bottom submit/apply button.\n     * @param {Object} submitData - callback on submitting data.\n     */\n\n    IgzTextPreviewController.$inject = ['$i18next', '$rootScope', '$scope', '$timeout', 'i18next', 'ngDialog', 'lodash', 'DialogsService'];\n    angular.module('iguazio.dashboard-controls').component('igzTextEdit', {\n        bindings: {\n            content: '@',\n            closeDialog: '&',\n            closeButtonText: '@',\n            ngDialogId: '@',\n            label: '@',\n            language: '@',\n            submitButtonText: '@',\n            submitData: '&'\n        },\n        templateUrl: 'igz_controls/components/text-edit/text-edit.tpl.html',\n        controller: IgzTextPreviewController\n    });\n\n    function IgzTextPreviewController($i18next, $rootScope, $scope, $timeout, i18next, ngDialog, lodash, DialogsService) {\n        var ctrl = this;\n        var lng = i18next.language;\n        var contentCopy = '';\n\n        ctrl.enableWordWrap = false;\n        ctrl.fileChanged = false;\n        ctrl.isLoadingState = false;\n        ctrl.serverError = '';\n\n        ctrl.$onInit = onInit;\n\n        ctrl.onChangeText = onChangeText;\n        ctrl.onClose = onClose;\n        ctrl.onSubmit = onSubmit;\n\n        //\n        // Hook method\n        //\n\n        /**\n         * Init method\n         */\n        function onInit() {\n            contentCopy = angular.copy(ctrl.content);\n\n            $scope.$on('close-dialog-service_close-dialog', ctrl.onClose);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Sets file changed flag to true\n         * @param {string} sourceCode - changed file content\n         */\n        function onChangeText(sourceCode) {\n            var isFileChanged = !lodash.isEqual(contentCopy, sourceCode);\n\n            ctrl.content = sourceCode;\n\n            $timeout(function () {\n                ctrl.fileChanged = isFileChanged;\n            });\n\n            $rootScope.$broadcast('text-edit_changes-have-been-made', isFileChanged);\n        }\n\n        /**\n         * Closes dialog\n         * @param {Object} event\n         * @param {Object} data - broadcast data\n         */\n        function onClose(event, data) {\n            if (angular.isUndefined(event)) {\n                if (ctrl.fileChanged) {\n                    openConfirmDialog();\n                } else {\n                    ctrl.closeDialog();\n                }\n            } else if (event.name === 'close-dialog-service_close-dialog') {\n                if (ctrl.fileChanged && ctrl.ngDialogId === data.dialogId) {\n                    openConfirmDialog();\n                } else if (!ctrl.fileChanged && ctrl.ngDialogId === data.dialogId || lodash.includes(data.dialogId, 'confirm-dialog')) {\n                    ngDialog.close(data.dialogId);\n                }\n            }\n        }\n\n        /**\n         * Handle click on Submit Data button\n         */\n        function onSubmit() {\n            contentCopy = angular.copy(ctrl.content);\n\n            if (ctrl.fileChanged) {\n                if (angular.isFunction(ctrl.submitData)) {\n                    ctrl.isLoadingState = true;\n                    ctrl.submitData({ newContent: ctrl.content }).then(function (data) {\n                        ctrl.closeDialog({ value: data });\n                    }).catch(function (error) {\n                        ctrl.serverError = error.statusText;\n                    }).finally(function () {\n                        ctrl.isLoadingState = false;\n                    });\n                }\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Open confirm dialog\n         */\n        function openConfirmDialog() {\n            DialogsService.confirm($i18next.t('common:CHANGES_WERENT_SAVED_CONFIRM', { lng: lng }), $i18next.t('common:DONT_SAVE', { lng: lng }), $i18next.t('common:KEEP_EDITING', { lng: lng }), 'text-edit').then(function () {\n                ctrl.closeDialog();\n            });\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    /**\n     * @name igzValidatingInputField\n     * @component\n     *\n     * @description\n     * An input field that wraps around regular `<input>` or `<textarea>` elements and enriches them with validation\n     * capabilities. Validation rules could be provided to display a menu of validation rules to the user on demand, and\n     * mark which of them passes and which fails. The field is styled according to its validity.\n     *\n     * @param {string} [bordersMode='always'] - Determines when to show borders. Could be one of:\n     *     - `'always'` (default): always show borders (like a regular input field)\n     *     - `'hover'`: hide borders when idle (unless placeholder is shown), show them on hover (and on focus)\n     *     - `'focus'`: hide borders when idle (unless placeholder is shown) and on hover, show them only on focus\n     *     Note: this attribute is ignored when `readOnly` attribute is set to `true`.\n     * @param {string} [compareInputValue] - If provided, the input will be valid if it matches this, or otherwise it\n     *     will be invalid.\n     * @param {string} [fieldType='input'] - Determines the type of field:\n     *     - `'input'` (default): a text box\n     *     - `'password'`: a text box with concealed characters\n     *     - `'textarea'`: a multi-line text-area\n     *     - `'schedule'`: a mix of multiple drop-down menu fields to conveniently create a recurring schedule\n     *                     (generating a CRON string @see {@link https://crontab.guru/})\n     * @param {Object} [formObject] - The `<form>` or `<ng-form>` element/directive containing this input field.\n     * @param {boolean} [hideCounter=false] - Set to `true` to hide the remaining characters counter when\n     *     `validationMaxLength` is used.\n     * @param {Object} [inputModelOptions] - A `ngModelOptions` object to forward to `ng-model-options` attribute of\n     *     the HTML `<input>` or `<textarea>` element. Some options may be ignored/overridden by this component to make\n     *     some of its features work properly.\n     * @param {string} inputName - The name of the filed, will be forwarded to the `name` attribute of the HTML\n     *     `<input>` element.\n     * @param {*} inputValue - The initial value of the field. This is a one-way binding that is watched for changes.\n     * @param {function} [itemBlurCallback] - A callback function for `blur` event. Invoked with `inputValue` and\n     *     `inputName` when the field loses focus. Note that when `is-data-revert` attribute is `false` and blur event\n     *     happened prior to `ngChange` invocation (could happen with debounced or future events via `ngModelOptions`)\n     *     then the value of `inputValue` might not reflect the up-to-date _view_ value, but the _model_ value (which\n     *     might be different in this case).\n     * @param {function} [itemFocusCallback] - A callback function for `focus` event. Invoked with `inputName` when the\n     *     field becomes focused.\n     * @param {boolean} [isDataRevert=false] - Set to `true` to revert to last valid value on losing focus. This will\n     *     invoke `updateDataCallback` on `blur` event in case the value was successfully changed, and will not invoke\n     *     it in case the value was reverted. `itemBlurCallback` will be invoked on `blur` event regardless.\n     * @param {boolean} [isDisabled=false] - Set to `true` to make this field disabled.\n     * @param {boolean} [isFocused=false] - Set to `true` to give focus to this field once it finished initializing.\n     *     This is a one-way binding that is watched for changes.\n     * @param {string} [tabindex=0] - Indicates where the field participates in sequential keyboard navigation.\n     *     Forwarded to the `tabindex` attribute of the HTML element.\n     * @param {{text: string, placement: string, delay: number}} [tooltip] - Allows a tooltip hint to open when hovering\n     *     the input field. This is useful for not setting a tooltip on the entire `<igz-validating-input-field>`\n     *     component, which includes the validation rule pop-over too, and it is not desired to show the tooltip when\n     *     hovering on that pop-over, but only when hovering the input field itself.\n     * @param {boolean} [trim=true] - Set to `false` to prevent automatic removal of leading and trailing spaces from\n     *     entered value.\n     * @param {boolean} [onlyValidCharacters=false] - Set to `true` to allow only characters that match the RegExp\n     *     pattern passed in `validation-pattern` attribute.\n     * @param {string} [placeholderText] - Placeholder text to display when input is empty.\n     * @param {boolean} [readOnly=false] - Set to `true` to make this field read-only. If `true`, ignores `borderMode`.\n     * @param {boolean} [spellcheck=true] - Set to `false` to disable spell-check to this field (for example when the\n     *     value of s Base64 string which clearly does not need spell checking).\n     * @param {function} [updateDataCallback] - A callback function for value changes. Invoked with `newData` and\n     *     `field`. When `isDataRevert` is set to `true` this function will be invoked on `blur` event.\n     * @param {string} [updateDataField=inputName] - The field name to be passed as `field` parameter when invoking\n     *     `updateDataCallback` (defaults to `inputName`'s value).\n     * @param {boolean} [validationIsRequired=false] - Set to `true` to make this field mandatory. The field will be\n     *     invalid if it is empty.\n     * @param {string} [validationMaxLength] - Maximum length for this field's input (will add a counter of remaining\n     *     characters, unless `hideCounter` is set to `true`). The field will be invalid if its value is longer.\n     * @param {string} [validationPattern] - Regex pattern to test the field's input. The field will be invalid if the\n     *     value does not match the pattern.\n     * @param {boolean} [autoComplete='off'] - A hint to the web browser's auto-fill feature. Forwarded to the\n     *     `autocomplete` attribute of HTML `<input>` element.\n     * @param {function} [enterCallback] - A callback function for the `keydown` event when the Enter key is down.\n     *     Invoked without parameters.\n     * @param {string} [inputIcon] - A CSS class name to use for displaying an icon inside the box before the input.\n     * @param {boolean} [isClearIcon=false] - Set to `true` to display a \"Clear\" action icon for emptying the input.\n     * @param {Array} [validationRules] - A list of validation rules to check against as input changes. The field will\n     *     be invalid if the input does not match any of the rules.\n     * @param {string} validationRules[].label - The text to display as the description of the rule. For example:\n     *     \"Must begin with: A-Z, a-z, 0-9, -\".\n     * @param {RegExp|function} validationRules[].pattern - The regex pattern to test input against, or a function that\n     *     should return `true` in case rule is valid or `false` otherwise. The function will be invoked with the\n     *     current input value, the input field name and the `ngForm` (if provided to `formObject` attribute).\n     * @param {string} [validationRules[].name] - A unique name for the rule among the list.\n     */\n\n    IgzValidatingInputFieldController.$inject = ['$document', '$element', '$scope', '$timeout', '$window', 'lodash', 'EventHelperService'];\n    angular.module('iguazio.dashboard-controls').component('igzValidatingInputField', {\n        bindings: {\n            autoComplete: '@?',\n            bordersMode: '@?',\n            compareInputValue: '<?',\n            enterCallback: '&?',\n            fieldType: '@?',\n            formObject: '<?',\n            hideCounter: '<?',\n            inputIcon: '@',\n            inputModelOptions: '<?',\n            inputName: '@',\n            inputValue: '<',\n            isClearIcon: '<?',\n            isDataRevert: '<?',\n            isDisabled: '<?',\n            isFocused: '<?',\n            itemBlurCallback: '&?',\n            itemFocusCallback: '&?',\n            onlyValidCharacters: '<?',\n            placeholderText: '@',\n            readOnly: '<?',\n            spellcheck: '<?',\n            tabindex: '@?',\n            tooltip: '<?',\n            trim: '<?',\n            updateDataCallback: '&?',\n            updateDataField: '@?',\n            validationIsRequired: '<?',\n            validationMaxLength: '@?',\n            validationPattern: '<?',\n            validationRules: '<*?'\n        },\n        templateUrl: 'igz_controls/components/validating-input-field/validating-input-field.tpl.html',\n        controller: IgzValidatingInputFieldController\n    });\n\n    function IgzValidatingInputFieldController($document, $element, $scope, $timeout, $window, lodash, EventHelperService) {\n        var ctrl = this;\n\n        var BORDER_MODES = {\n            ALWAYS: 'always',\n            HOVER: 'hover',\n            FOCUS: 'focus'\n        };\n        var FIELD_TYPES = {\n            INPUT: 'input',\n            PASSWORD: 'password',\n            TEXTAREA: 'textarea',\n            SCHEDULE: 'schedule'\n        };\n        var BORDERS_CLASS_BASE = 'borders-';\n        var defaultBorderMode = BORDER_MODES.ALWAYS;\n        var defaultInputModelOptions = {\n            updateOn: 'default blur',\n            debounce: {\n                'default': 250,\n                '*': 0\n            },\n            allowInvalid: true\n        };\n        var fieldElement = {};\n        var lastValidValue = '';\n        var ngModel = null;\n        var showPopUpOnTop = false;\n\n        ctrl.bordersModeClass = '';\n        ctrl.data = '';\n        ctrl.inputFocused = false;\n        ctrl.inputIsTouched = false;\n        ctrl.isValidationPopUpShown = false;\n        ctrl.preventInputBlur = false;\n        ctrl.selectedFieldType = FIELD_TYPES.INPUT;\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n        ctrl.$onChanges = onChanges;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.clearInputField = clearInputField;\n        ctrl.getRemainingCharactersCount = getRemainingCharactersCount;\n        ctrl.hasInvalidRule = hasInvalidRule;\n        ctrl.isCounterVisible = isCounterVisible;\n        ctrl.isFieldInvalid = isFieldInvalid;\n        ctrl.isOverflowed = isOverflowed;\n        ctrl.onBlur = onBlur;\n        ctrl.onChange = onChange;\n        ctrl.onFocus = onFocus;\n        ctrl.onKeyDown = onKeyDown;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            // set default values for optional component attributes (`<?`, `@?`, `&?`) that are not updated when the\n            // scope expression changes (those that change get default values in `$onChanges` lifecycle hook)\n            lodash.defaults(ctrl, {\n                autoComplete: 'off',\n                bordersMode: defaultBorderMode,\n                enterCallback: angular.noop,\n                fieldType: ctrl.selectedFieldType,\n                hideCounter: false,\n                inputModelOptions: {},\n                isClearIcon: false,\n                isDataRevert: false,\n                isDisabled: false,\n                itemBlurCallback: angular.noop,\n                itemFocusCallback: angular.noop,\n                onlyValidCharacters: false,\n                readOnly: false,\n                spellcheck: true,\n                tabindex: '0',\n                tooltip: {\n                    text: '',\n                    placement: 'auto',\n                    duration: '200'\n                },\n                trim: true,\n                updateDataCallback: angular.noop,\n                updateDataField: ctrl.inputName,\n                validationIsRequired: false\n            });\n\n            // if provided `fieldType` attribute is one of the available values, assign it\n            // otherwise `ctrl.selectedFieldType` will remain set to the default value\n            if (lodash.includes(FIELD_TYPES, ctrl.fieldType)) {\n                ctrl.selectedFieldType = ctrl.fieldType;\n            }\n\n            // if provided `bordersMode` attribute is not one of the available values, set it to a default\n            if (!lodash.includes(BORDER_MODES, ctrl.bordersMode)) {\n                ctrl.bordersMode = defaultBorderMode;\n            }\n            ctrl.bordersModeClass = BORDERS_CLASS_BASE + ctrl.bordersMode;\n\n            lodash.defaultsDeep(ctrl.inputModelOptions, defaultInputModelOptions);\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n            $document.on('click', handleValidationIconClick);\n\n            $scope.$applyAsync(function () {\n                fieldElement = $element.find('.field');\n                ngModel = fieldElement.controller('ngModel');\n\n                ngModel.$validators.validationRules = function (modelValue) {\n                    if (!ctrl.validationIsRequired && ctrl.data === '') {\n                        resetPatternsValidity();\n                        return true;\n                    } else {\n                        return checkPatternsValidity(modelValue);\n                    }\n                };\n\n                // validate on init in case the input field starts with an invalid value\n                // important for cases when for example you have an invalid field due to failed rule and then switch to\n                // another tab and back to the failed field, it might be re-initialized, but we want it to be displayed\n                // with the \"failed validation rule\" icon\n                ngModel.$validate();\n\n                // set focus to the input field in case `is-focused` attribute is `true`\n                // if the input field is inside a dialog, await the dialog's animation\n                if (ctrl.isFocused) {\n                    var timer = $element.closest('.ngdialog').length > 0 ? 300 : 0;\n\n                    $timeout(function () {\n                        fieldElement.focus();\n                    }, timer);\n                }\n            });\n        }\n\n        /**\n         * On changes hook method.\n         * @param {Object} changes\n         */\n        function onChanges(changes) {\n            if (angular.isDefined(changes.inputValue)) {\n                ctrl.data = lodash.defaultTo(changes.inputValue.currentValue, '');\n\n                // update `lastValidValue` to later use it on `blur` event in case `is-data-revert` attribute is `true`\n                // and the input field is invalid (so the input field could be reverted to the last valid value)\n                lastValidValue = angular.copy(ctrl.data);\n            }\n\n            if (angular.isDefined(changes.isFocused)) {\n                ctrl.inputFocused = lodash.defaultTo(changes.isFocused.currentValue, false);\n                if (!changes.isFocused.isFirstChange()) {\n                    $timeout(function () {\n                        fieldElement.focus();\n                    });\n                }\n            }\n\n            if (angular.isDefined(changes.validationRules)) {\n                ctrl.validationRules = angular.copy(lodash.defaultTo(changes.validationRules.currentValue, []));\n            }\n        }\n\n        /**\n         * Destructor\n         */\n        function onDestroy() {\n            angular.element($window).off('animationend');\n            $document.off('click', handleValidationIconClick);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Clears search input field.\n         */\n        function clearInputField() {\n            if (ctrl.selectedFieldType === 'schedule') {\n                ngModel.$setViewValue('');\n                ngModel.$commitViewValue();\n            } else {\n                ctrl.data = '';\n                onChange();\n            }\n        }\n\n        /**\n         * Gets count of the remaining characters for the field.\n         * @returns {number} count of the remaining characters for the field.\n         */\n        function getRemainingCharactersCount() {\n            var maxLength = Number.parseInt(ctrl.validationMaxLength);\n            var currentLength = ctrl.data.length;\n\n            return maxLength <= 0 ? null : (maxLength - currentLength).toString();\n        }\n\n        /**\n         * Checks whether there is at least one failed validation rule.\n         * @returns {boolean} `true` in case there is at least one failed validation rule, or `false` otherwise.\n         */\n        function hasInvalidRule() {\n            return lodash.some(ctrl.validationRules, ['isValid', false]);\n        }\n\n        /**\n         * Checks whether the counter should be visible.\n         * @returns {boolean} `true` in case the counter should be visible, or `false` otherwise.\n         */\n        function isCounterVisible() {\n            return !ctrl.isDisabled && !ctrl.onlyValidCharacters && !ctrl.hideCounter && !ctrl.readOnly && !lodash.isNil(ctrl.validationMaxLength);\n        }\n\n        /**\n         * Checks whether the field is invalid.\n         * Do not validate field if `onlyValidCharacters` component attribute was passed.\n         * @returns {boolean} `true` in case the field is valid, or `false` otherwise.\n         */\n        function isFieldInvalid() {\n            return ctrl.onlyValidCharacters ? false : (lodash.get(ctrl.formObject, '$submitted') || lodash.get(ngModel, '$dirty')) && lodash.get(ngModel, '$invalid');\n        }\n\n        /**\n         * Checks whether validation-rule pop-up has overflowed.\n         * @returns {boolean} `ture` in case of overflow, or `false` otherwise.\n         */\n        function isOverflowed() {\n            var popUp = $element.find('.validation-pop-up');\n\n            if (!showPopUpOnTop && ctrl.isValidationPopUpShown) {\n                showPopUpOnTop = $window.innerHeight - popUp.offset().top - popUp.outerHeight() < 0;\n            }\n\n            return showPopUpOnTop;\n        }\n\n        /**\n         * Loses focus from input field.\n         * @param {FocusEvent} event - the `blur` event object.\n         */\n        function onBlur(event) {\n            if (ctrl.preventInputBlur) {\n                ctrl.preventInputBlur = false;\n                ctrl.inputFocused = true;\n                event.target.focus();\n            } else {\n                ctrl.inputFocused = false;\n\n                // in case model update is debounced using `ngModelOptions`, this means `$viewValue` and `$modelValue`\n                // might be different at this point (for example, when blur event happened prior to `ngChange`\n                // invocation). before proceeding with the logic hereafter we must make sure to commit the current\n                // view-value, so the model-value gets updated accordingly, and the field also gets validated (meaning\n                // `$valid` and `$invalid` are up-to-date). If the above case is true, this will also trigger `ngChange`\n                // for the input.\n                ngModel.$commitViewValue();\n\n                // in case `is-data-revert` attribute is `true` - set or revert outer model value\n                if (ctrl.isDataRevert) {\n                    setOrRevertInputValue();\n                }\n\n                ctrl.itemBlurCallback({\n                    event: event,\n                    inputValue: ctrl.data,\n                    inputName: ctrl.inputName\n                });\n            }\n        }\n\n        /**\n         * Updates outer model value on inner model value change.\n         */\n        function onChange() {\n            ngModel.$validate();\n            if (ctrl.isDataRevert) {\n                if (ngModel.$valid) {\n                    // update `lastValidValue` to later use it on `blur` event in case `is-data-revert` attribute is\n                    // `true` and the input field is invalid (so the input field could be reverted to the last valid\n                    // value)\n                    lastValidValue = ctrl.data;\n                }\n            } else {\n                ctrl.updateDataCallback({\n                    newData: ctrl.data,\n                    field: ctrl.updateDataField\n                });\n            }\n        }\n\n        /**\n         * Puts focus on input field.\n         * @param {Event} event - The `focus` event object.\n         */\n        function onFocus(event) {\n            ctrl.inputFocused = true;\n\n            if (!lodash.isEmpty(ctrl.validationRules)) {\n                ctrl.inputIsTouched = true;\n            }\n\n            ctrl.itemFocusCallback({\n                event: event,\n                inputValue: ctrl.data,\n                inputName: ctrl.inputName\n            });\n        }\n\n        /**\n         * Handles the 'keyDown' event.\n         * @param {Event} event - The `keydown` event object.\n         */\n        function onKeyDown(event) {\n            if (event.keyCode === EventHelperService.ENTER) {\n                $timeout(ctrl.enterCallback);\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Checks and sets validity based on `ctrl.validationRules`\n         * @param {string} value - current input value\n         */\n        function checkPatternsValidity(value) {\n            lodash.forEach(ctrl.validationRules, function (rule) {\n                rule.isValid = lodash.isFunction(rule.pattern) ? rule.pattern(value, ctrl.inputName, ctrl.formObject) :\n                /* else, it is a RegExp */rule.pattern.test(value);\n            });\n\n            return !hasInvalidRule();\n        }\n\n        /**\n         * Handles click on validation icon and show/hide validation pop-up.\n         * @param {Event} event - The `click` event.\n         */\n        function handleValidationIconClick(event) {\n            var popUp = $element.find('.validation-pop-up-wrapper');\n            if (event.target === $element.find('.validation-icon')[0]) {\n                if (!lodash.isEmpty(ctrl.validationRules)) {\n                    ctrl.isValidationPopUpShown = !ctrl.isValidationPopUpShown;\n\n                    $timeout(function () {\n                        fieldElement.focus();\n                        ctrl.inputFocused = true;\n                        popUp.css('height', popUp.outerHeight() > 0 ? popUp.outerHeight().toString() : 'auto');\n                    });\n                }\n            } else if (showPopUpOnTop && event.target === popUp[0] || $element.find(event.target).length === 0) {\n                // when `showPopUpOnTop` is `true`, the `.validation-pop-up-wrapper` stays with `position: fixed` below\n                // the input field, and only its child `.validation-pop-up` moves above the input field with\n                // `position: relative`.\n                // so clicking below the input field seems like clicking outside of it, but actually you might be\n                // clicking on this invisible wrapper that is nested in `$element`.\n                // that's why `showPopUpOnTop && event.target === popUp[0]` condition means the user intended to close\n                // the validation pop-up.\n                //\n                // ----------------------------\n                // |                          |\n                // |    .validation-pop-up    |\n                // |    position: relative    |\n                // ----------------------------\n                // ----------------------------\n                // |      .input-field        |\n                // ----------------------------\n                // ----------------------------\n                // |                          |  <-- clicking here means the pop-up should be closed\n                // |.validation-pop-up-wrapper|\n                // |     position: fixed      |\n                // ----------------------------\n                ctrl.isValidationPopUpShown = false;\n            }\n\n            if (!ctrl.isValidationPopUpShown) {\n                showPopUpOnTop = false;\n            }\n        }\n\n        /**\n         * Sets all validation rules to be valid\n         */\n        function resetPatternsValidity() {\n            lodash.forEach(ctrl.validationRules, function (rule) {\n                rule.isValid = true;\n            });\n        }\n\n        /**\n         * Sets or reverts outer model value\n         */\n        function setOrRevertInputValue() {\n            // if the input value is invalid - revert it to the last valid value\n            // otherwise, notify the parent about the value change\n            if (ngModel.$invalid) {\n                ctrl.data = lastValidValue;\n            } else {\n                ctrl.updateDataCallback({\n                    newData: ctrl.data,\n                    field: ctrl.updateDataField\n                });\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzActionItemMore.$inject = ['$element', '$document', '$scope'];\n    angular.module('iguazio.dashboard-controls').component('igzActionItemMore', {\n        bindings: {\n            actions: '<?',\n            onFilesDropped: '<?'\n        },\n        templateUrl: 'igz_controls/components/action-item/action-item-more/action-item-more.tpl.html',\n        controller: IgzActionItemMore,\n        transclude: true\n    });\n\n    function IgzActionItemMore($element, $document, $scope) {\n        var ctrl = this;\n\n        ctrl.isDropdownShown = false;\n\n        ctrl.toggleTemplate = toggleTemplate;\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Shows/hides sub-template\n         */\n        function toggleTemplate() {\n            ctrl.isDropdownShown = !ctrl.isDropdownShown;\n            if (ctrl.isDropdownShown) {\n                attachDocumentEvent();\n            } else {\n                detachDocumentEvent();\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Attaches on click event handler to the document\n         */\n        function attachDocumentEvent() {\n            $document.on('click', hideSubtemplate);\n        }\n\n        /**\n         * Removes on click event handler attached to the document\n         */\n        function detachDocumentEvent() {\n            $document.off('click', hideSubtemplate);\n        }\n\n        /**\n         * Hides sub-template dropdown when user clicks outside it\n         * @param {MouseEvent} event\n         */\n        function hideSubtemplate(event) {\n            $scope.$apply(function () {\n                if (event.target !== $element[0] && $element.find(event.target).length === 0) {\n                    ctrl.isDropdownShown = false;\n                    detachDocumentEvent();\n                }\n            });\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    angular.module('iguazio.dashboard-controls').component('igzActionItemRefresh', {\n        bindings: {\n            isDisabled: '<',\n            refresh: '&'\n        },\n        templateUrl: 'igz_controls/components/action-item/action-item-refresh/action-item-refresh.tpl.html'\n    });\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzInfoPageActionsBarController.$inject = ['$scope'];\n    angular.module('iguazio.dashboard-controls').component('igzInfoPageActionsBar', {\n        bindings: {\n            watchId: '@?'\n        },\n        templateUrl: 'igz_controls/components/info-page/info-page-actions-bar/info-page-actions-bar.tpl.html',\n        transclude: true,\n        controller: IgzInfoPageActionsBarController\n    });\n\n    function IgzInfoPageActionsBarController($scope) {\n        var ctrl = this;\n\n        ctrl.isUpperPaneShowed = false;\n        ctrl.isFiltersShowed = false;\n        ctrl.isInfoPaneShowed = false;\n\n        ctrl.$onInit = onInit;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Init method\n         */\n        function onInit() {\n            var watchId = angular.isDefined(ctrl.watchId) ? '-' + ctrl.watchId : '';\n\n            $scope.$on('info-page-upper-pane_toggle-start' + watchId, onUpperPaneToggleStart);\n            $scope.$on('info-page-filters_toggle-start' + watchId, onFiltersPaneToggleStart);\n            $scope.$on('info-page-pane_toggle-start' + watchId, onInfoPaneToggleStart);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Upper pane toggle start $broadcast listener\n         * @param {Object} e - broadcast event\n         * @param {boolean} isShown - represents upper pane state\n         */\n        function onUpperPaneToggleStart(e, isShown) {\n            ctrl.isUpperPaneShowed = isShown;\n        }\n\n        /**\n         * Filters pane toggle start $broadcast listener\n         * @param {Object} e - broadcast event\n         * @param {boolean} isShown - represents filters pane state\n         */\n        function onFiltersPaneToggleStart(e, isShown) {\n            ctrl.isFiltersShowed = isShown;\n        }\n\n        /**\n         * Info pane toggle start $broadcast listener\n         * @param {Object} e - broadcast event\n         * @param {boolean} isShown - represents info pane state\n         */\n        function onInfoPaneToggleStart(e, isShown) {\n            ctrl.isInfoPaneShowed = isShown;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzInfoPageContentController.$inject = ['$scope', '$timeout', '$window', '$element'];\n    angular.module('iguazio.dashboard-controls').component('igzInfoPageContent', {\n        bindings: {\n            scrolled: '<',\n            watchId: '@?'\n        },\n        templateUrl: 'igz_controls/components/info-page/info-page-content/info-page-content.tpl.html',\n        transclude: true,\n        controller: IgzInfoPageContentController\n    });\n\n    function IgzInfoPageContentController($scope, $timeout, $window, $element) {\n        var ctrl = this;\n\n        ctrl.isFiltersShowed = false;\n        ctrl.isInfoPaneShowed = false;\n\n        // Config for horizontal scrollbar on containers view\n        ctrl.scrollConfigHorizontal = {\n            axis: 'x',\n            scrollInertia: 0\n        };\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Init method\n         */\n        function onInit() {\n            var watchId = angular.isDefined(ctrl.watchId) ? '-' + ctrl.watchId : '';\n\n            $scope.$on('info-page-upper-pane_toggle-start' + watchId, onUpperPaneToggleStart);\n            $scope.$on('info-page-filters_toggle-start' + watchId, onFiltersPaneToggleStart);\n            $scope.$on('info-page-pane_toggle-start' + watchId, onInfoPaneToggleStart);\n            $scope.$on('info-page-pane_toggled', dispatchResize);\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n            $timeout(function () {\n                manageHorizontalScroll();\n\n                $scope.$on('info-page-filters_toggled', manageHorizontalScroll);\n\n                $scope.$on('info-page-pane_toggled', manageHorizontalScroll);\n\n                $scope.$on('igzWatchWindowResize::resize', manageHorizontalScroll);\n            });\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Manages x-scrollbar behavior\n         * Needed to get rid of accidental wrong content width calculations made by 'ng-scrollbars' library\n         * We just control x-scrollbar with lib's native enable/disable methods\n         */\n        function manageHorizontalScroll() {\n            var $scrollXContainer = $element.find('.igz-scrollable-container.horizontal').first();\n            var contentWrapperWidth = $element.find('.igz-info-page-content-wrapper').first().width();\n            var contentMinWidth = parseInt($element.find('.igz-info-page-content').css('min-width'));\n\n            if ($scrollXContainer.length && contentWrapperWidth < (contentMinWidth || 946)) {\n                $scrollXContainer.mCustomScrollbar('update');\n            } else if ($scrollXContainer.length) {\n                $scrollXContainer.mCustomScrollbar('disable', true);\n                $element.find('.mCSB_container').first().width('100%');\n            }\n        }\n\n        /**\n         * Upper pane toggle start $broadcast listener\n         * @param {Object} e - broadcast event\n         * @param {boolean} isShown - represents upper pane state\n         */\n        function onUpperPaneToggleStart(e, isShown) {\n            ctrl.isUpperPaneShowed = isShown;\n        }\n\n        /**\n         * Filters pane toggle start $broadcast listener\n         * @param {Object} e - broadcast event\n         * @param {boolean} isShown - represents filters pane state\n         */\n        function onFiltersPaneToggleStart(e, isShown) {\n            ctrl.isFiltersShowed = isShown;\n        }\n\n        /**\n         * Info pane toggle start $broadcast listener\n         * @param {Object} e - broadcast event\n         * @param {boolean} isShown - represents info pane state\n         */\n        function onInfoPaneToggleStart(e, isShown) {\n            ctrl.isInfoPaneShowed = isShown;\n        }\n\n        /**\n         * Updates Ui-Layout library's containers size\n         */\n        function dispatchResize() {\n            $timeout(function () {\n                $window.dispatchEvent(new Event('resize'));\n            }, 0);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    IgzInfoPageFiltersController.$inject = ['$rootScope', '$scope', '$animate', '$element', 'EventHelperService'];\n    angular.module('iguazio.dashboard-controls').component('igzInfoPageFilters', {\n        bindings: {\n            isFiltersShowed: '<',\n            changeStateCallback: '&',\n            toggleMethod: '&',\n            resetFilters: '&?',\n            applyFilters: '&?',\n            getBadgeValue: '&?',\n            watchId: '@?'\n        },\n        templateUrl: 'igz_controls/components/info-page/info-page-filters/info-page-filters.tpl.html',\n        transclude: true,\n        controller: IgzInfoPageFiltersController\n    });\n\n    function IgzInfoPageFiltersController($rootScope, $scope, $animate, $element, EventHelperService) {\n        var ctrl = this;\n\n        var appliedFiltersCount = 0;\n\n        ctrl.isUpperPaneShowed = false;\n        ctrl.scrollbarConfig = {\n            callbacks: {\n                whileScrolling: whileScrolling\n            }\n        };\n\n        ctrl.$onInit = onInit;\n        ctrl.$onChanges = onChanges;\n\n        ctrl.onApplyFilters = onApplyFilters;\n        ctrl.onResetFilters = onResetFilters;\n        ctrl.isShowFooterButtons = isShowFooterButtons;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Init method\n         */\n        function onInit() {\n            var watchId = angular.isDefined(ctrl.watchId) ? '-' + ctrl.watchId : '';\n\n            ctrl.getBadgeValue = ctrl.getBadgeValue || getBadgeValue;\n\n            $scope.$on('info-page-filters_change-badge', onChangeBadge);\n            $scope.$on('info-page-upper-pane_toggle-start' + watchId, onUpperPaneToggleStart);\n            $scope.$on('info-page-pane_toggle-start' + watchId, hideIfInfoPaneOpened);\n        }\n\n        /**\n         * Bindings changes watcher method\n         */\n        function onChanges(changes) {\n            if (angular.isDefined(changes.isFiltersShowed)) {\n                reportStateBetweenPanes(changes.isFiltersShowed.currentValue);\n            }\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Handles mouse click on 'Apply' button\n         * @param {Object} event\n         */\n        function onApplyFilters(event) {\n            if (angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) {\n                $rootScope.$broadcast('info-page-filters_on-apply');\n                if (angular.isFunction(ctrl.applyFilters)) {\n                    ctrl.applyFilters();\n                }\n            }\n        }\n\n        /**\n         * Handles mouse click on 'Reset' button\n         * @param {Object} event\n         */\n        function onResetFilters(event) {\n            if (angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) {\n                $rootScope.$broadcast('info-page-filters_on-reset');\n                if (angular.isFunction(ctrl.resetFilters)) {\n                    ctrl.resetFilters();\n                }\n            }\n        }\n\n        /**\n         * Checks whether the footer buttons is shown\n         * @returns {boolean}\n         */\n        function isShowFooterButtons() {\n            return angular.isFunction(ctrl.resetFilters) || angular.isFunction(ctrl.applyFilters);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Returns a quantity of applied filters\n         * @returns {number}\n         */\n        function getBadgeValue() {\n            return appliedFiltersCount;\n        }\n\n        /**\n         * Changes count of applied filters on badge\n         * @param {Event} event\n         * @param {number} count\n         */\n        function onChangeBadge(event, count) {\n            appliedFiltersCount = Math.max(appliedFiltersCount + count, 0);\n        }\n\n        /**\n         * Upper pane toggle start $broadcast listener\n         * @param {Object} e - broadcast event\n         * @param {boolean} isShown - represents upper pane state\n         */\n        function onUpperPaneToggleStart(e, isShown) {\n            ctrl.isUpperPaneShowed = isShown;\n        }\n\n        /**\n         * Hides filters pane if filters pane has been opened\n         * @param {Object} e - broadcast event\n         * @param {boolean} isShown - represents pane state\n         */\n        function hideIfInfoPaneOpened(e, isShown) {\n            if (isShown) {\n                ctrl.changeStateCallback({ newVal: false });\n            }\n        }\n\n        /**\n         * Manages communication between panes for proper interactions\n         * @param {boolean} isShown - represents pane state\n         */\n        function reportStateBetweenPanes(isShown) {\n            $rootScope.$broadcast('info-page-filters_toggle-start' + (angular.isDefined(ctrl.watchId) ? '-' + ctrl.watchId : ''), isShown);\n\n            $animate[isShown ? 'addClass' : 'removeClass']($element.find('.info-page-filters'), 'info-page-filters-shown').then(function () {\n                $rootScope.$broadcast('reload-columns');\n                $rootScope.$broadcast('info-page-filters_toggled', isShown);\n            });\n        }\n\n        /**\n         * Callback on scroll event of ng-scrollbars directive\n         */\n        function whileScrolling() {\n            $rootScope.$broadcast('scrollable-container_on-scrolling');\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    InfoPageFiltersService.$inject = ['$rootScope'];\n    angular.module('iguazio.dashboard-controls').factory('InfoPageFiltersService', InfoPageFiltersService);\n\n    function InfoPageFiltersService($rootScope) {\n        return {\n            changeBadge: changeBadge\n        };\n\n        /**\n         * Changes a quantity of applied filters on the badge of filters pane\n         * @param {number} delta\n         */\n        function changeBadge(delta) {\n            $rootScope.$broadcast('info-page-filters_change-badge', delta);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    /**\n     * Extend white background to the bottom of the view port\n     */\n\n    igzExtendBackground.$inject = ['$timeout'];\n    angular.module('iguazio.dashboard-controls').directive('igzExtendBackground', igzExtendBackground);\n\n    function igzExtendBackground($timeout) {\n        return {\n            restrict: 'A',\n            link: link\n        };\n\n        function link(scope, element, attrs) {\n            var timeout = 0;\n            var containerPath = 'body';\n\n            activate();\n\n            //\n            // Private methods\n            //\n\n            /**\n             * Constructor method\n             */\n            function activate() {\n                timeout = Number(attrs.igzExtendBackground) || 0;\n                containerPath = attrs.containerPath || 'body';\n\n                $timeout(elementMinHeight, timeout);\n                scope.$on('igzWatchWindowResize::resize', elementMinHeight);\n            }\n\n            /**\n             * Calculate and change element height\n             */\n            function elementMinHeight() {\n                var container = angular.element(containerPath);\n                var containerBox = container[0].getBoundingClientRect();\n                var paddingBottom = parseInt(container.css('padding-bottom'), 10);\n                var box = element[0].getBoundingClientRect();\n\n                if (containerBox.height === 0) {\n                    element.css('height', '100%');\n                    element.css('padding-bottom', '45px');\n                } else {\n                    element.css('padding-bottom', '0');\n                    element.css('height', containerBox.bottom + paddingBottom - box.top + 'px');\n                }\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclFunctionFromTemplateDialogController.$inject = ['$i18next', 'i18next', 'lodash', 'EventHelperService'];\n    angular.module('iguazio.dashboard-controls').component('nclFunctionFromTemplateDialog', {\n        bindings: {\n            closeDialog: '&',\n            template: '<'\n        },\n        templateUrl: 'nuclio/common/screens/create-function/function-from-template/function-from-template-dialog/function-from-template-dialog.tpl.html',\n        controller: NclFunctionFromTemplateDialogController\n    });\n\n    function NclFunctionFromTemplateDialogController($i18next, i18next, lodash, EventHelperService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        var FILED_KINDS = ['string', 'number', 'choice'];\n\n        var defaultAttributes = {\n            string: {\n                defaultValue: '',\n                password: false\n            },\n            number: {\n                defaultValue: 0,\n                step: 1,\n                minValue: -Infinity,\n                allowZero: false,\n                allowNegative: false,\n                allowDecimal: false\n            },\n            choice: {\n                choices: [],\n                defaultValue: '' // currently assuming \"choice\" to be a list of strings only\n            }\n        };\n        var templateData = {};\n\n        ctrl.dropdownOptions = {};\n        ctrl.fields = [];\n        ctrl.templateForm = null;\n\n        ctrl.$onInit = onInit;\n\n        ctrl.dropdownCallback = dropdownCallback;\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.isFormFilled = isFormFilled;\n        ctrl.onApply = onApply;\n        ctrl.onClose = onClose;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.fields = lodash.chain(ctrl.template.values).cloneDeep().forIn(function (field, key) {\n                field.name = key;\n            }).filter(function (field) {\n                var kind = lodash.get(field, 'kind');\n                return lodash.isString(kind) ? lodash.includes(FILED_KINDS, kind.toLowerCase()) : false;\n            }).map(function (field) {\n\n                // converting `kind` property to lower-case in order to be more flexible, allowing the user to\n                // specify kind in case-insensitive.\n                field.kind = field.kind.toLowerCase();\n\n                // setting default values to various properties\n                lodash.defaults(field, {\n                    displayName: $i18next.t('functions:UNSPECIFIED_FIELD_NAME', { lng: lng }),\n                    description: '',\n                    required: false,\n                    order: Infinity,\n                    attributes: lodash.defaults(field.attributes, defaultAttributes[field.kind])\n                });\n\n                if (field.kind === 'number') {\n                    if (!field.attributes.allowNegative && field.attributes.minValue < 0) {\n                        field.attributes.minValue = field.attributes.allowZero ? 0 : 1;\n                    }\n                }\n\n                if (field.kind === 'choice') {\n                    lodash.update(field, 'attributes.choices', function (choices) {\n                        return !lodash.isArray(choices) ? [] : lodash.map(choices, function (choice) {\n                            return lodash.isString(choice) ? {\n                                id: choice,\n                                name: choice,\n                                visible: true\n                            } : choice;\n                        });\n                    });\n                }\n\n                return field;\n            }).uniqBy('name') // prevent `ngRepeat` from breaking on duplicates.\n            .sortBy('order').forEach(function (field) {\n                lodash.set(templateData, field.name, field.attributes.defaultValue);\n            }).value();\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Closes dialog\n         * @param {Event} [event]\n         */\n        function onClose(event) {\n            if ((angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) && !ctrl.isLoadingState) {\n                ctrl.closeDialog();\n            }\n        }\n\n        /**\n         * Closes dialog and pass the dialog data\n         * @param {Event} [event]\n         */\n        function onApply(event) {\n            if (isFormFilled()) {\n                if ((angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) && !ctrl.isLoadingState) {\n                    ctrl.closeDialog({ template: templateData });\n                }\n            }\n        }\n\n        /**\n         * Checks if form valid\n         */\n        function isFormFilled() {\n            return lodash.isEmpty(ctrl.templateForm.$error);\n        }\n\n        /**\n         * Update data callback\n         * @param {string} newData\n         * @param {string} field\n         */\n        function inputValueCallback(newData, field) {\n            lodash.set(templateData, field, newData);\n        }\n\n        /**\n         * Sets new selected value from dropdown\n         * @param {Object} newData\n         * @param {boolean} isChanged\n         * @param {string} field\n         */\n        function dropdownCallback(newData, isChanged, field) {\n            if (isChanged) {\n                lodash.set(templateData, field, newData.id);\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclTestEventsLogsController.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').component('nclTestEventsLogs', {\n        bindings: {\n            logs: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-code/function-event-pane/test-events-logs/test-events-logs.tpl.html',\n        controller: NclTestEventsLogsController\n    });\n\n    function NclTestEventsLogsController(lodash) {\n        var ctrl = this;\n        var REQUIRED_PARAMETERS = ['level', 'name', 'time', 'err', 'message', 'ui'];\n\n        ctrl.$onInit = onInit;\n\n        ctrl.collapseRow = collapseRow;\n        ctrl.expandAllRows = expandAllRows;\n        ctrl.getLevelIconClass = getLevelIconClass;\n        ctrl.getParameters = getParameters;\n        ctrl.hasAdditionalParameters = hasAdditionalParameters;\n\n        //\n        // Hook method\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            lodash.forEach(ctrl.logs, function (log) {\n                lodash.set(log, 'ui.collapsed', true);\n            });\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Collapse/expand row depending on `collapse` value\n         * @param {Object} log\n         * @param {boolean} collapse\n         */\n        function collapseRow(log, collapse) {\n            lodash.set(log, 'ui.collapsed', collapse);\n        }\n\n        /**\n         * Collapse/expand all rows depending on `expand` value\n         * @param {boolean} expand\n         */\n        function expandAllRows(expand) {\n            lodash.forEach(ctrl.logs, function (log) {\n                lodash.set(log, 'ui.collapsed', !expand);\n            });\n        }\n\n        /**\n         * Gets css class depending on log.level\n         * @param {Object} log\n         * @returns {string}\n         */\n        function getLevelIconClass(log) {\n            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' : '';\n        }\n\n        /**\n         * Gets additional parameters\n         * @param {Object} log\n         * @returns {Object}\n         */\n        function getParameters(log) {\n            return lodash.omit(log, REQUIRED_PARAMETERS);\n        }\n\n        /**\n         * Checks if log has additional parameters\n         * @param {Object} log\n         * @returns {boolean}\n         */\n        function hasAdditionalParameters(log) {\n            return !lodash.isEmpty(getParameters(log));\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclTestEventsNavigationTabsController.$inject = ['$i18next', 'i18next'];\n    angular.module('iguazio.dashboard-controls').component('nclTestEventsNavigationTabs', {\n        bindings: {\n            activeTab: '<',\n            tabItems: '<',\n            selectedLogLevel: '<?',\n            onChangeActiveTab: '&',\n            onChangeLogLevel: '&?'\n        },\n        templateUrl: 'nuclio/functions/version/version-code/function-event-pane/test-events-navigation-tabs/test-events-navigation-tabs.tpl.html',\n        controller: NclTestEventsNavigationTabsController\n    });\n\n    function NclTestEventsNavigationTabsController($i18next, i18next) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.logLevelValues = [{\n            id: 'error',\n            name: $i18next.t('common:ERROR', { lng: lng }),\n            visible: true\n        }, {\n            id: 'warn',\n            name: $i18next.t('common:WARNING', { lng: lng }),\n            visible: true\n        }, {\n            id: 'info',\n            name: $i18next.t('common:INFO', { lng: lng }),\n            visible: true\n        }, {\n            id: 'debug',\n            name: $i18next.t('common:DEBUG', { lng: lng }),\n            visible: true\n        }];\n\n        ctrl.changeActiveTab = changeActiveTab;\n        ctrl.isActiveTab = isActiveTab;\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Changes active nav tab\n         * @param {Object} item - current status\n         */\n        function changeActiveTab(item) {\n            ctrl.activeTab = item;\n\n            ctrl.onChangeActiveTab({ activeTab: item });\n        }\n\n        /**\n         * Checks if it is an active tab\n         * @param {Object} item - current tab\n         */\n        function isActiveTab(item) {\n            return ctrl.activeTab.id === item.id;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionConfigurationAnnotationsController.$inject = ['$element', '$i18next', '$rootScope', '$timeout', 'i18next', 'lodash', 'FormValidationService', 'PreventDropdownCutOffService', 'ValidationService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationAnnotations', {\n        bindings: {\n            version: '<',\n            onChangeCallback: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-annotations/version-configuration-annotations.tpl.html',\n        controller: NclVersionConfigurationAnnotationsController\n    });\n\n    function NclVersionConfigurationAnnotationsController($element, $i18next, $rootScope, $timeout, i18next, lodash, FormValidationService, PreventDropdownCutOffService, ValidationService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.annotationsForm = null;\n        ctrl.igzScrollConfig = {\n            maxElementsCount: 10,\n            childrenSelector: '.table-body'\n        };\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                updateOnContentResize: true\n            }\n        };\n        ctrl.tooltip = '<a class=\"link\" target=\"_blank\" ' + 'href=\"https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/\">' + $i18next.t('functions:TOOLTIP.ANNOTATIONS.HEAD', { lng: lng }) + '</a> ' + $i18next.t('functions:TOOLTIP.ANNOTATIONS.REST', { lng: lng });\n\n        ctrl.keyTooltip = $i18next.t('functions:TOOLTIP.PREFIXED_NAME', {\n            lng: lng,\n            name: $i18next.t('functions:TOOLTIP.ANNOTATION', { lng: lng })\n        });\n        ctrl.validationRules = {\n            key: ValidationService.getValidationRules('k8s.prefixedQualifiedName', [{\n                name: 'uniqueness',\n                label: $i18next.t('functions:UNIQUENESS', { lng: lng }),\n                pattern: validateUniqueness\n            }])\n        };\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n\n        ctrl.addNewAnnotation = addNewAnnotation;\n        ctrl.handleAction = handleAction;\n        ctrl.onChangeData = onChangeData;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            var annotations = lodash.get(ctrl.version, 'metadata.annotations', []);\n\n            ctrl.annotations = lodash.map(annotations, function (value, key) {\n                return {\n                    name: key,\n                    value: value,\n                    ui: {\n                        editModeActive: false,\n                        isFormValid: false,\n                        name: 'annotation'\n                    }\n                };\n            });\n\n            $timeout(function () {\n                if (ctrl.annotationsForm.$invalid) {\n                    ctrl.annotationsForm.$setSubmitted();\n                    $rootScope.$broadcast('change-state-deploy-button', { component: 'annotation', isDisabled: true });\n                }\n            });\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n\n            // Bind DOM-related preventDropdownCutOff method to component's controller\n            PreventDropdownCutOffService.preventDropdownCutOff($element, '.three-dot-menu');\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Adds new annotation\n         */\n        function addNewAnnotation(event) {\n            $timeout(function () {\n                if (ctrl.annotations.length < 1 || lodash.last(ctrl.annotations).ui.isFormValid) {\n                    ctrl.annotations.push({\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'annotation'\n                        }\n                    });\n\n                    $rootScope.$broadcast('change-state-deploy-button', {\n                        component: 'annotation',\n                        isDisabled: true\n                    });\n                    event.stopPropagation();\n                }\n            }, 50);\n        }\n\n        /**\n         * Handler on specific action type\n         * @param {string} actionType\n         * @param {number} index - index of label in array\n         */\n        function handleAction(actionType, index) {\n            if (actionType === 'delete') {\n                ctrl.annotations.splice(index, 1);\n\n                $timeout(function () {\n                    updateAnnotations();\n                });\n            }\n        }\n\n        /**\n         * Changes annotations data\n         * @param {Object} label\n         * @param {number} index\n         */\n        function onChangeData(label, index) {\n            ctrl.annotations[index] = lodash.cloneDeep(label);\n\n            updateAnnotations();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Updates function`s annotations\n         */\n        function updateAnnotations() {\n            var isFormValid = true;\n            var newAnnotations = {};\n\n            lodash.forEach(ctrl.annotations, function (annotation) {\n                if (!annotation.ui.isFormValid) {\n                    isFormValid = false;\n                }\n\n                newAnnotations[annotation.name] = annotation.value;\n            });\n\n            // since uniqueness validation rule of some fields is dependent on the entire annotation list, then whenever\n            // the list is modified - the rest of the annotations need to be re-validated\n            FormValidationService.validateAllFields(ctrl.annotationsForm);\n\n            $rootScope.$broadcast('change-state-deploy-button', {\n                component: 'annotation',\n                isDisabled: !isFormValid\n            });\n\n            lodash.set(ctrl.version, 'metadata.annotations', newAnnotations);\n            ctrl.onChangeCallback();\n        }\n\n        /**\n         * Determines `uniqueness` validation for `Key` field\n         * @param {string} value - value to validate\n         */\n        function validateUniqueness(value) {\n            return lodash.filter(ctrl.annotations, ['name', value]).length === 1;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionConfigurationBasicSettingsController.$inject = ['$rootScope', '$timeout', '$i18next', 'i18next', 'lodash', 'ConfigService', 'DialogsService', 'ValidationService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationBasicSettings', {\n        bindings: {\n            version: '<',\n            onChangeCallback: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-basic-settings/version-configuration-basic-settings.tpl.html',\n        controller: NclVersionConfigurationBasicSettingsController\n    });\n\n    function NclVersionConfigurationBasicSettingsController($rootScope, $timeout, $i18next, i18next, lodash, ConfigService, DialogsService, ValidationService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.enableFunction = false;\n        ctrl.enableTimeout = false;\n        ctrl.timeout = {\n            min: 0,\n            sec: 0\n        };\n        ctrl.logLevelValues = [{\n            id: 'error',\n            name: $i18next.t('common:ERROR', { lng: lng })\n        }, {\n            id: 'warn',\n            name: $i18next.t('common:WARNING', { lng: lng })\n        }, {\n            id: 'info',\n            name: $i18next.t('common:INFO', { lng: lng })\n        }, {\n            id: 'debug',\n            name: $i18next.t('common:DEBUG', { lng: lng })\n        }];\n\n        ctrl.$onInit = onInit;\n\n        ctrl.isDemoMode = ConfigService.isDemoMode;\n        ctrl.validationRules = {\n            integer: ValidationService.getValidationRules('integer')\n        };\n\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.setPriority = setPriority;\n        ctrl.updateEnableStatus = updateEnableStatus;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            if (ctrl.isDemoMode()) {\n                var timeoutSeconds = lodash.get(ctrl.version, 'spec.timeoutSeconds');\n\n                if (lodash.isNumber(timeoutSeconds)) {\n                    ctrl.timeout.min = Math.floor(timeoutSeconds / 60);\n                    ctrl.timeout.sec = Math.floor(timeoutSeconds % 60);\n                }\n            }\n\n            lodash.defaultsDeep(ctrl.version, {\n                spec: {\n                    loggerSinks: [{ level: 'debug' }]\n                }\n            });\n\n            ctrl.enableFunction = !lodash.get(ctrl.version, 'spec.disable', false);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Update data callback\n         * @param {string} newData\n         * @param {string} field\n         */\n        function inputValueCallback(newData, field) {\n            lodash.set(ctrl, field, lodash.includes(field, 'timeout') ? Number(newData) : newData);\n\n            $timeout(function () {\n                if (ctrl.basicSettingsForm.$valid) {\n                    if (lodash.includes(field, 'timeout')) {\n                        lodash.set(ctrl.version, 'spec.timeoutSeconds', ctrl.timeout.min * 60 + ctrl.timeout.sec);\n                    } else {\n                        lodash.set(ctrl.version, field, newData);\n                    }\n\n                    $rootScope.$broadcast('change-state-deploy-button', { component: 'settings', isDisabled: false });\n\n                    ctrl.onChangeCallback();\n                } else {\n                    $rootScope.$broadcast('change-state-deploy-button', { component: 'settings', isDisabled: true });\n                }\n            });\n        }\n\n        /**\n         * Sets logger level\n         * @param {Object} item\n         */\n        function setPriority(item) {\n            lodash.set(ctrl.version, 'spec.loggerSinks[0].level', item.id);\n\n            ctrl.onChangeCallback();\n        }\n\n        /**\n         * Switches enable/disable function status\n         */\n        function updateEnableStatus() {\n            var apiGateways = lodash.get(ctrl.version, 'status.apiGateways', []);\n\n            if (!lodash.isEmpty(apiGateways) && !ctrl.enableFunction) {\n                DialogsService.alert($i18next.t('functions:ERROR_MSG.DISABLE_API_GW_FUNCTION', { lng: lng, apiGatewayName: apiGateways[0] }));\n\n                // return checkbox to enabled state\n                ctrl.enableFunction = true;\n            } else {\n                lodash.set(ctrl.version, 'spec.disable', !ctrl.enableFunction);\n\n                ctrl.onChangeCallback();\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionConfigurationBuildController.$inject = ['$rootScope', '$scope', '$timeout', '$i18next', 'i18next', 'lodash', 'ngDialog', 'Upload', 'ConfigService', 'ValidationService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationBuild', {\n        bindings: {\n            version: '<',\n            onChangeCallback: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-build/version-configuration-build.tpl.html',\n        controller: NclVersionConfigurationBuildController\n    });\n\n    function NclVersionConfigurationBuildController($rootScope, $scope, $timeout, $i18next, i18next, lodash, ngDialog, Upload, ConfigService, ValidationService) {\n        var ctrl = this;\n        var lng = i18next.language;\n        var uploadType = '';\n\n        ctrl.actions = initActions();\n        ctrl.build = {\n            runtimeAttributes: {}\n        };\n        ctrl.script = {\n            uploading: false,\n            uploaded: false,\n            progress: '0%',\n            icon: 'ncl-icon-script',\n            name: ''\n        };\n        ctrl.file = {\n            uploading: false,\n            uploaded: false,\n            progress: '0%',\n            icon: 'ncl-icon-file',\n            name: ''\n        };\n        ctrl.disabled = true;\n        ctrl.platformKindIsKube = false;\n\n        ctrl.defaultFunctionConfig = lodash.get(ConfigService, 'nuclio.defaultFunctionConfig.attributes', {});\n        ctrl.imageNameValidationPattern = ValidationService.dockerReference;\n        ctrl.maxLengths = {\n            imageName: ValidationService.getMaxLength('function.imageName')\n        };\n\n        ctrl.$onInit = onInit;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.deleteFile = deleteFile;\n        ctrl.getFileConfig = getFileConfig;\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.isDemoMode = ConfigService.isDemoMode;\n        ctrl.onFireAction = onFireAction;\n        ctrl.uploadFile = uploadFile;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.platformKindIsKube = lodash.get(ConfigService, 'nuclio.platformKind') === 'kube';\n            ctrl.disabled = lodash.get(ctrl.version, 'spec.build.codeEntryType') === 'image';\n            ctrl.build.commands = lodash.get(ctrl.version, 'spec.build.commands', []);\n            ctrl.build.commands = ctrl.build.commands.join('\\n').replace(/''/g, '\\'');\n\n            ctrl.build.dependencies = lodash.get(ctrl.version, 'spec.build.dependencies', []).join('\\n');\n            ctrl.build.runtimeAttributes.repositories = lodash.get(ctrl.version, 'spec.build.runtimeAttributes.repositories', []).join('\\n');\n\n            $timeout(function () {\n                if (ctrl.buildForm.$invalid) {\n                    ctrl.buildForm.$setSubmitted();\n                    $rootScope.$broadcast('change-state-deploy-button', { component: 'build', isDisabled: true });\n                }\n            });\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            $rootScope.$broadcast('change-state-deploy-button', {\n                component: 'build',\n                isDisabled: lodash.get(ctrl.buildForm, '$invalid', false)\n            });\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Update spec.buildCommands value\n         * @param {string} newData\n         * @param {string} field\n         */\n        function inputValueCallback(newData, field) {\n            if (lodash.includes(['commands', 'dependencies', 'runtimeAttributes.repositories'], field)) {\n                if (lodash.isEmpty(newData)) {\n                    lodash.unset(ctrl.build, field);\n                    lodash.unset(ctrl.version, 'spec.build.' + field);\n                } else {\n                    var commands = newData.replace(/\\r/g, '\\n').split(/\\n+/);\n\n                    lodash.set(ctrl.build, field, newData);\n                    lodash.set(ctrl.version, 'spec.build.' + field, commands);\n                }\n            } else {\n                lodash.set(ctrl.version, field, newData);\n            }\n\n            $timeout(function () {\n                $rootScope.$broadcast('change-state-deploy-button', {\n                    component: 'build',\n                    isDisabled: lodash.get(ctrl.buildForm, '$invalid', false)\n                });\n            });\n\n            ctrl.onChangeCallback();\n        }\n\n        /**\n         * Returns uploading file config object\n         * @returns {Object}\n         */\n        function getFileConfig() {\n            return ctrl[uploadType];\n        }\n\n        /**\n         * According to given action name calls proper action handler\n         * @param {string} fileType - a type of uploading file\n         * @returns {boolean} if file of this fileType already uploaded\n         */\n        function onFireAction(fileType) {\n\n            // this if is a temporary solution as at the moment we don't know the maximum quantity of the uploading files\n            if (fileType === 'file' && ctrl.file.uploaded || fileType === 'script' && ctrl.script.uploaded) {\n                return false;\n            }\n\n            uploadType = fileType;\n\n            ngDialog.open({\n                template: '<ncl-version-configuration-build-dialog data-close-dialog=\"closeThisDialog(file)\"></ncl-version-configuration-build-dialog>',\n                plain: true,\n                scope: $scope,\n                className: 'ngdialog-theme-nuclio version-configuration-build-dialog-wrapper'\n            }).closePromise.then(function (data) {\n                if (!lodash.isNil(data.value)) {\n                    ctrl.uploadFile(data.value);\n                }\n            });\n        }\n\n        /**\n         * Upload selected file on server\n         * @param {Object} file - selected file\n         */\n        function uploadFile(file) {\n            var uploadingData = getFileConfig();\n\n            Upload.upload({\n                url: '', // TODO\n                data: { file: file }\n            }).then(function (response) {\n                // on success\n                if (!uploadingData.uploaded && !lodash.isNil(response.config.data.file)) {\n                    uploadingData.uploading = false;\n                    uploadingData.uploaded = true;\n                    uploadingData.name = response.config.data.file.name;\n                    uploadingData.progress = '100%';\n                }\n            }, function (response) {\n                // on error\n                uploadingData.uploading = false;\n                uploadingData.uploaded = false;\n            }, function (load) {\n                // on progress\n                if (!lodash.isNil(load.config.data.file)) {\n                    var progressPercentage = parseInt(100.0 * load.loaded / load.total);\n\n                    uploadingData.uploading = true;\n                    uploadingData.progress = progressPercentage + '%';\n                    uploadingData.name = load.config.data.file.name;\n                }\n            });\n\n            uploadingData.uploading = false;\n        }\n\n        /**\n         * Delete file button handler\n         * @param {string} type - type of file\n         */\n        function deleteFile(type) {\n            ctrl[type] = {\n                uploading: false,\n                uploaded: false,\n                progress: '0%',\n                icon: 'ncl-icon-' + type,\n                name: ''\n            };\n            ctrl.onChangeCallback();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Initializes actions\n         * @returns {Object[]} - list of actions\n         */\n        function initActions() {\n            return [{\n                id: 'script',\n                label: $i18next.t('functions:SCRIPT', { lng: lng }),\n                icon: 'ncl-icon-script',\n                active: true\n            }, {\n                id: 'file',\n                label: $i18next.t('common:FILE', { lng: lng }),\n                icon: 'ncl-icon-file',\n                active: true\n            }];\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionConfigurationEnvironmentVariablesController.$inject = ['$element', '$i18next', '$rootScope', '$timeout', 'i18next', 'lodash', 'FormValidationService', 'PreventDropdownCutOffService', 'ValidationService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationEnvironmentVariables', {\n        bindings: {\n            version: '<',\n            onChangeCallback: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-environment-variables/version-configuration-environment-variables.tpl.html',\n        controller: NclVersionConfigurationEnvironmentVariablesController\n    });\n\n    function NclVersionConfigurationEnvironmentVariablesController($element, $i18next, $rootScope, $timeout, i18next, lodash, FormValidationService, PreventDropdownCutOffService, ValidationService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.environmentVariablesForm = null;\n        ctrl.igzScrollConfig = {\n            maxElementsCount: 10,\n            childrenSelector: '.table-body'\n        };\n        ctrl.validationRules = {\n            key: ValidationService.getValidationRules('k8s.envVarName', [{\n                name: 'uniqueness',\n                label: $i18next.t('functions:UNIQUENESS', { lng: lng }),\n                pattern: validateUniqueness.bind(null, 'name')\n            }]),\n            secretKey: ValidationService.getValidationRules('k8s.configMapKey'),\n            secret: ValidationService.getValidationRules('k8s.dns1123Subdomain'),\n            configmapKey: ValidationService.getValidationRules('k8s.configMapKey', [{\n                name: 'uniqueness',\n                label: $i18next.t('functions:UNIQUENESS', { lng: lng }),\n                pattern: validateUniqueness.bind(null, 'valueFrom.configMapKeyRef.key')\n            }])\n        };\n        ctrl.variables = [];\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                updateOnContentResize: true\n            }\n        };\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n\n        ctrl.addNewVariable = addNewVariable;\n        ctrl.handleAction = handleAction;\n        ctrl.onChangeData = onChangeData;\n        ctrl.onChangeType = onChangeType;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.variables = lodash.chain(ctrl.version).get('spec.env', []).map(function (variable) {\n                variable.ui = {\n                    editModeActive: false,\n                    isFormValid: false,\n                    name: 'variable'\n                };\n\n                return variable;\n            }).value();\n\n            ctrl.isOnlyValueTypeInputs = !lodash.some(ctrl.variables, 'valueFrom');\n\n            $timeout(function () {\n                if (ctrl.environmentVariablesForm.$invalid) {\n                    ctrl.environmentVariablesForm.$setSubmitted();\n                    $rootScope.$broadcast('change-state-deploy-button', { component: 'variable', isDisabled: true });\n                }\n            });\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n\n            // Bind DOM-related preventDropdownCutOff method to component's controller\n            PreventDropdownCutOffService.preventDropdownCutOff($element, '.three-dot-menu');\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Adds new variable\n         */\n        function addNewVariable(event) {\n            $timeout(function () {\n                if (ctrl.variables.length < 1 || lodash.chain(ctrl.variables).last().get('ui.isFormValid', true).value()) {\n                    ctrl.variables.push({\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'variable'\n                        }\n                    });\n\n                    ctrl.environmentVariablesForm.$setPristine();\n\n                    $rootScope.$broadcast('change-state-deploy-button', {\n                        component: 'variable',\n                        isDisabled: true\n                    });\n                    event.stopPropagation();\n                }\n            }, 50);\n        }\n\n        /**\n         * Handler on specific action type\n         * @param {string} actionType\n         * @param {number} index - index of variable in array\n         */\n        function handleAction(actionType, index) {\n            if (actionType === 'delete') {\n                ctrl.variables.splice(index, 1);\n\n                $timeout(function () {\n                    updateVariables();\n                });\n            }\n        }\n\n        /**\n         * Changes data of specific variable\n         * @param {Object} variable\n         * @param {number} index\n         */\n        function onChangeData(variable, index) {\n            ctrl.variables[index] = lodash.cloneDeep(variable);\n\n            updateVariables();\n        }\n\n        /**\n         * Handles a change of variables type\n         * @param {Object} newType\n         * @param {number} index\n         */\n        function onChangeType(newType, index) {\n            var variablesCopy = angular.copy(ctrl.variables);\n\n            variablesCopy[index] = newType.id === 'value' ? {} : { valueFrom: {} };\n            ctrl.isOnlyValueTypeInputs = !lodash.some(variablesCopy, 'valueFrom');\n\n            if (newType.id === 'secret') {\n                var form = lodash.get(ctrl.environmentVariablesForm, '$$controls[' + index + '][value-key]');\n\n                if (angular.isDefined(form)) {\n                    lodash.forEach(ctrl.validationRules.configmapKey, function (rule) {\n                        form.$setValidity(rule.name, true);\n                    });\n                }\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Updates function's variables\n         */\n        function updateVariables() {\n            var isFormValid = true;\n            var variables = lodash.map(ctrl.variables, function (variable) {\n                if (!variable.ui.isFormValid) {\n                    isFormValid = false;\n                }\n\n                return lodash.omit(variable, 'ui');\n            });\n\n            // since uniqueness validation rule of some fields is dependent on the entire environment variable list,\n            // then whenever the list is modified - the rest of the environment variables need to be re-validated\n            FormValidationService.validateAllFields(ctrl.environmentVariablesForm);\n\n            $rootScope.$broadcast('change-state-deploy-button', {\n                component: 'variable',\n                isDisabled: !isFormValid\n            });\n\n            lodash.set(ctrl.version, 'spec.env', variables);\n            ctrl.onChangeCallback();\n        }\n\n        /**\n         * Determines `uniqueness` validation for `Key` and `ConfigMap key` fields\n         * @param {string} path\n         * @param {string} value\n         */\n        function validateUniqueness(path, value) {\n            return lodash.filter(ctrl.variables, [path, value]).length === 1;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionConfigurationLabelsController.$inject = ['$element', '$i18next', '$rootScope', '$timeout', 'i18next', 'lodash', 'FormValidationService', 'PreventDropdownCutOffService', 'ValidationService', 'VersionHelperService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationLabels', {\n        bindings: {\n            version: '<',\n            onChangeCallback: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-labels/version-configuration-labels.tpl.html',\n        controller: NclVersionConfigurationLabelsController\n    });\n\n    function NclVersionConfigurationLabelsController($element, $i18next, $rootScope, $timeout, i18next, lodash, FormValidationService, PreventDropdownCutOffService, ValidationService, VersionHelperService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.igzScrollConfig = {\n            maxElementsCount: 10,\n            childrenSelector: '.table-body'\n        };\n        ctrl.labelsForm = null;\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                updateOnContentResize: true\n            }\n        };\n        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 });\n\n        ctrl.keyTooltip = $i18next.t('functions:TOOLTIP.PREFIXED_NAME', {\n            lng: lng,\n            name: $i18next.t('common:LABEL', { lng: lng })\n        });\n        ctrl.validationRules = {\n            key: ValidationService.getValidationRules('function.label.key', [{\n                name: 'uniqueness',\n                label: $i18next.t('functions:UNIQUENESS', { lng: lng }),\n                pattern: validateUniqueness\n            }]),\n            value: ValidationService.getValidationRules('k8s.qualifiedName')\n        };\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n\n        ctrl.isVersionDeployed = VersionHelperService.isVersionDeployed;\n\n        ctrl.addNewLabel = addNewLabel;\n        ctrl.handleAction = handleAction;\n        ctrl.onChangeData = onChangeData;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            var labels = lodash.get(ctrl.version, 'metadata.labels', []);\n\n            ctrl.labels = lodash.chain(labels).omitBy(function (value, key) {\n                return lodash.startsWith(key, 'nuclio.io/');\n            }).map(function (value, key) {\n                return {\n                    name: key,\n                    value: value,\n                    ui: {\n                        editModeActive: false,\n                        isFormValid: false,\n                        name: 'label'\n                    }\n                };\n            }).value();\n            ctrl.labels = lodash.compact(ctrl.labels);\n            ctrl.addNewLabelTooltip = ctrl.isVersionDeployed(ctrl.version) ? $i18next.t('functions:TOOLTIP.ADD_LABELS', { lng: lng }) : '';\n\n            $timeout(function () {\n                if (ctrl.labelsForm.$invalid) {\n                    ctrl.labelsForm.$setSubmitted();\n                    $rootScope.$broadcast('change-state-deploy-button', { component: 'label', isDisabled: true });\n                }\n            });\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n\n            // Bind DOM-related preventDropdownCutOff method to component's controller\n            PreventDropdownCutOffService.preventDropdownCutOff($element, '.three-dot-menu');\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Adds new label\n         */\n        function addNewLabel(event) {\n            // prevent adding labels for deployed functions\n            if (ctrl.isVersionDeployed(ctrl.version)) {\n                return;\n            }\n\n            $timeout(function () {\n                if (ctrl.labels.length < 1 || lodash.last(ctrl.labels).ui.isFormValid) {\n                    ctrl.labels.push({\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'label'\n                        }\n                    });\n\n                    $rootScope.$broadcast('change-state-deploy-button', { component: 'label', isDisabled: true });\n                    event.stopPropagation();\n                }\n            }, 50);\n        }\n\n        /**\n         * Handler on specific action type\n         * @param {string} actionType\n         * @param {number} index - index of label in array\n         */\n        function handleAction(actionType, index) {\n            if (actionType === 'delete') {\n                ctrl.labels.splice(index, 1);\n\n                $timeout(function () {\n                    updateLabels();\n                });\n            }\n        }\n\n        /**\n         * Changes labels data\n         * @param {Object} label\n         * @param {number} index\n         */\n        function onChangeData(label, index) {\n            ctrl.labels[index] = lodash.cloneDeep(label);\n\n            updateLabels();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Updates function`s labels\n         */\n        function updateLabels() {\n            var isFormValid = true;\n            var labels = lodash.get(ctrl.version, 'metadata.labels', []);\n            var nuclioLabels = lodash.pickBy(labels, function (value, key) {\n                return lodash.includes(key, 'nuclio.io/');\n            });\n            var newLabels = {};\n\n            lodash.forEach(ctrl.labels, function (label) {\n                if (!label.ui.isFormValid) {\n                    isFormValid = false;\n                }\n\n                newLabels[label.name] = label.value;\n            });\n\n            // since uniqueness validation rule of some fields is dependent on the entire label list, then whenever\n            // the list is modified - the rest of the labels need to be re-validated\n            FormValidationService.validateAllFields(ctrl.labelsForm);\n\n            $rootScope.$broadcast('change-state-deploy-button', {\n                component: 'label',\n                isDisabled: !isFormValid\n            });\n\n            newLabels = lodash.merge(newLabels, nuclioLabels);\n\n            lodash.set(ctrl.version, 'metadata.labels', newLabels);\n            ctrl.onChangeCallback();\n        }\n\n        /**\n         * Determines `uniqueness` validation for `Key` field\n         * @param {string} value - value to validate\n         */\n        function validateUniqueness(value) {\n            return lodash.filter(ctrl.labels, ['name', value]).length === 1;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionConfigurationLoggingController.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationLogging', {\n        bindings: {\n            version: '<',\n            onChangeCallback: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-logging/version-configuration-logging.tpl.html',\n        controller: NclVersionConfigurationLoggingController\n    });\n\n    function NclVersionConfigurationLoggingController(lodash) {\n        var ctrl = this;\n\n        ctrl.inputValueCallback = inputValueCallback;\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Update data callback\n         * @param {string} newData\n         * @param {string} field\n         */\n        function inputValueCallback(newData, field) {\n            lodash.set(ctrl.version, field, newData);\n\n            ctrl.onChangeCallback();\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionConfigurationResourcesController.$inject = ['$rootScope', '$scope', '$timeout', 'lodash', 'ConfigService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationResources', {\n        bindings: {\n            version: '<',\n            onChangeCallback: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-resources/version-configuration-resources.tpl.html',\n        controller: NclVersionConfigurationResourcesController\n    });\n\n    function NclVersionConfigurationResourcesController($rootScope, $scope, $timeout, lodash, ConfigService) {\n        var ctrl = this;\n\n        var defaultUnit = {\n            id: 'gb',\n            name: 'GB',\n            unit: 'G',\n            root: 1000,\n            power: 3\n        };\n        var scaleResourcesCopy = [];\n        var scaleToZero = {};\n\n        ctrl.cpuDropdownOptions = [{\n            id: 'millicores',\n            name: 'millicpu',\n            unit: 'm',\n            precision: '0',\n            step: '100',\n            minValue: 1,\n            placeholder: '1500',\n            onChange: function onChange(value) {\n                return parseFloat(value) * 1000;\n            },\n            convertValue: function convertValue(value) {\n                return parseInt(value);\n            }\n        }, {\n            id: 'cpu',\n            name: 'cpu',\n            unit: '',\n            precision: '3',\n            step: '0.1',\n            minValue: 0.1,\n            placeholder: '1.5',\n            onChange: function onChange(value) {\n                return parseInt(value) / 1000;\n            },\n            convertValue: function convertValue(value) {\n                return parseFloat(value) * 1000;\n            }\n        }];\n\n        ctrl.defaultFunctionConfig = lodash.get(ConfigService, 'nuclio.defaultFunctionConfig.attributes', {});\n\n        ctrl.dropdownOptions = [{ id: 'bytes', name: 'Bytes', unit: '', root: 0, power: 0 }, { id: 'kb', name: 'KB', unit: 'k', root: 1000, power: 1 }, { id: 'kib', name: 'KiB', unit: 'Ki', root: 1024, power: 1 }, { id: 'mb', name: 'MB', unit: 'M', root: 1000, power: 2 }, { id: 'mib', name: 'MiB', unit: 'Mi', root: 1024, power: 2 }, { id: 'gb', name: 'GB', unit: 'G', root: 1000, power: 3 }, { id: 'gib', name: 'GiB', unit: 'Gi', root: 1024, power: 3 }, { id: 'tb', name: 'TB', unit: 'T', root: 1000, power: 4 }, { id: 'tib', name: 'TiB', unit: 'Ti', root: 1024, power: 4 }, { id: 'pb', name: 'PB', unit: 'P', root: 1000, power: 5 }, { id: 'pib', name: 'PiB', unit: 'Pi', root: 1024, power: 5 }, { id: 'eb', name: 'EB', unit: 'E', root: 1000, power: 6 }, { id: 'eib', name: 'EiB', unit: 'Ei', root: 1024, power: 6 }];\n        ctrl.windowSizeSlider = {};\n\n        ctrl.$onInit = onInit;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.numberInputCallback = numberInputCallback;\n        ctrl.sliderInputCallback = sliderInputCallback;\n\n        ctrl.cpuDropdownCallback = cpuDropdownCallback;\n        ctrl.memoryInputCallback = memoryInputCallback;\n        ctrl.memoryDropdownCallback = memoryDropdownCallback;\n        ctrl.inputGpuValueCallback = inputGpuValueCallback;\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.isInactivityWindowShown = isInactivityWindowShown;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            initParametersData();\n            initTargetCpuSlider();\n\n            ctrl.memoryWarningOpen = false;\n            ctrl.minReplicas = lodash.get(ctrl.version, 'spec.minReplicas');\n            ctrl.maxReplicas = lodash.get(ctrl.version, 'spec.maxReplicas');\n\n            initScaleToZeroData();\n\n            $timeout(function () {\n                setFormValidity();\n                checkIfCpuInputsValid();\n\n                $scope.$watch('$ctrl.resourcesForm.$invalid', function (value) {\n                    $rootScope.$broadcast('change-state-deploy-button', {\n                        component: 'resources',\n                        isDisabled: value\n                    });\n                });\n            });\n        }\n\n        /**\n         * On destroy method\n         */\n        function onDestroy() {\n            $rootScope.$broadcast('change-state-deploy-button', {\n                component: 'resources',\n                isDisabled: lodash.get(ctrl.resourcesForm, '$invalid', false)\n            });\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * CPU dropdown callback\n         * @param {Object} item\n         * @param {boolean} isItemChanged\n         * @param {string} field\n         */\n        function cpuDropdownCallback(item, isItemChanged, field) {\n            if (!lodash.isEqual(item, ctrl[field])) {\n                if (isRequestsInput(field)) {\n                    if (ctrl.requestsCpuValue) {\n                        ctrl.requestsCpuValue = item.onChange(ctrl.requestsCpuValue);\n                        lodash.set(ctrl.version, 'spec.resources.requests.cpu', ctrl.requestsCpuValue + item.unit);\n                    }\n                } else if (ctrl.limitsCpuValue) {\n                    ctrl.limitsCpuValue = item.onChange(ctrl.limitsCpuValue);\n                    lodash.set(ctrl.version, 'spec.resources.limits.cpu', ctrl.limitsCpuValue + item.unit);\n                }\n\n                lodash.set(ctrl, field, item);\n\n                checkIfCpuInputsValid();\n            }\n        }\n\n        /**\n         * Number input callback for GPU fields\n         * @param {number} newData\n         * @param {string} field\n         */\n        function inputGpuValueCallback(newData, field) {\n            if (angular.isNumber(newData)) {\n                ctrl.limitsGpuValue = newData;\n\n                lodash.set(ctrl.version, ['spec', 'resources', field, 'nvidia.com/gpu'], String(newData));\n                ctrl.onChangeCallback();\n            } else {\n                lodash.unset(ctrl.version, ['spec', 'resources', field, 'nvidia.com/gpu']);\n                ctrl.limitsGpuValue = null;\n            }\n        }\n\n        /**\n         * Number input callback\n         * @param {number} newData\n         * @param {string} field\n         */\n        function inputValueCallback(newData, field) {\n            if (angular.isNumber(newData)) {\n                if (isRequestsInput(field)) {\n                    ctrl.requestsCpuValue = newData;\n                    newData = newData + ctrl.selectedCpuRequestItem.unit;\n                } else {\n                    ctrl.limitsCpuValue = newData;\n                    newData = newData + ctrl.selectedCpuLimitItem.unit;\n                }\n\n                lodash.set(ctrl.version, 'spec.' + field, newData);\n                ctrl.onChangeCallback();\n            } else {\n                lodash.unset(ctrl.version, 'spec.' + field);\n                ctrl[isRequestsInput(field) ? 'requestsCpuValue' : 'limitsCpuValue'] = null;\n            }\n\n            checkIfCpuInputsValid();\n        }\n\n        /**\n         * Checks whether the inactivity window can be shown\n         * @returns {boolean}\n         */\n        function isInactivityWindowShown() {\n            return lodash.get(scaleToZero, 'mode') === 'enabled';\n        }\n\n        /**\n         * Memory number input callback\n         * @param {number} newData\n         * @param {string} field\n         */\n        function memoryInputCallback(newData, field) {\n            var newValue, sizeUnit;\n\n            sizeUnit = isRequestsInput(field) ? lodash.get(ctrl.selectedRequestUnit, 'unit', 'G') : lodash.get(ctrl.selectedLimitUnit, 'unit', 'G');\n\n            if (!angular.isNumber(newData)) {\n                lodash.unset(ctrl.version, field);\n\n                // if new value isn't number that both fields will be valid, because one of them is empty\n                ctrl.resourcesForm.requestMemory.$setValidity('equality', true);\n                ctrl.resourcesForm.limitsMemory.$setValidity('equality', true);\n            } else {\n                newValue = newData + sizeUnit;\n                lodash.set(ctrl.version, field, newValue);\n\n                checkIfMemoryInputsValid(newValue, field);\n            }\n\n            ctrl.memoryWarningOpen = !lodash.isNil(lodash.get(ctrl.version, 'spec.resources.limits.memory')) && lodash.isNil(lodash.get(ctrl.version, 'spec.resources.requests.memory'));\n\n            ctrl.onChangeCallback();\n        }\n\n        /**\n         * Memory dropdown callback\n         * @param {Object} item\n         * @param {boolean} isItemChanged\n         * @param {string} field\n         */\n        function memoryDropdownCallback(item, isItemChanged, field) {\n            var sizeValue = lodash.parseInt(lodash.get(ctrl.version, field, ' 0G'));\n            var newValue;\n\n            if (lodash.includes(field, 'requests')) {\n                ctrl.selectedRequestUnit = item;\n            } else if (lodash.includes(field, 'limits')) {\n                ctrl.selectedLimitUnit = item;\n            }\n\n            if (!angular.isNumber(sizeValue) || lodash.isNaN(sizeValue)) {\n                lodash.unset(ctrl.version, field);\n            } else {\n                newValue = sizeValue + item.unit;\n                lodash.set(ctrl.version, field, newValue);\n\n                checkIfMemoryInputsValid(newValue, field);\n            }\n\n            ctrl.onChangeCallback();\n        }\n\n        /**\n         * Update data callback\n         * @param {string|number} newData\n         * @param {string} field\n         */\n        function numberInputCallback(newData, field) {\n            if (lodash.isNil(newData) || newData === '') {\n                lodash.unset(ctrl.version.spec, field);\n            } else {\n                lodash.set(ctrl.version.spec, field, newData);\n            }\n\n            lodash.set(ctrl, field, newData);\n\n            if (field === 'minReplicas' && isInactivityWindowShown()) {\n                updateScaleToZeroParameters();\n            }\n\n            if (lodash.includes(['minReplicas', 'maxReplicas'], field)) {\n                updateTargetCpuSlider();\n            }\n\n            ctrl.onChangeCallback();\n        }\n\n        /**\n         * Update limits callback\n         * @param {number} newValue\n         * @param {string} field\n         */\n        function sliderInputCallback(newValue, field) {\n            if (lodash.isNil(newValue)) {\n                lodash.unset(ctrl.version, field);\n            } else {\n                lodash.set(ctrl.version, field, Number(newValue));\n            }\n\n            ctrl.onChangeCallback();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Checks if cpu number inputs and drop-downs valid\n         * Example:\n         * Request: \"400m\" - Limit: \"0.6\" are valid\n         * Request: \"300m\" - Limit: \"0.2\" are invalid\n         */\n        function checkIfCpuInputsValid() {\n            var requestsCpu = lodash.get(ctrl.version, 'spec.resources.requests.cpu');\n            var limitsCpu = lodash.get(ctrl.version, 'spec.resources.limits.cpu');\n            var isFieldsValid;\n\n            if (lodash.isNil(requestsCpu) || lodash.isNil(limitsCpu)) {\n                isFieldsValid = true;\n            } else {\n                isFieldsValid = ctrl.selectedCpuRequestItem.convertValue(requestsCpu) <= ctrl.selectedCpuLimitItem.convertValue(limitsCpu);\n            }\n\n            ctrl.resourcesForm.requestCpu.$setValidity('equality', isFieldsValid);\n            ctrl.resourcesForm.limitsCpu.$setValidity('equality', isFieldsValid);\n        }\n\n        /**\n         * Checks if memory number inputs and drop-downs valid\n         * Example:\n         * Request: \"4GB\" - Limit: \"6GB\" are valid\n         * Request: \"4TB\" - Limit: \"6GB\" are invalid\n         * @param {string} value\n         * @param {string} field\n         */\n        function checkIfMemoryInputsValid(value, field) {\n\n            // oppositeValue is a variable for opposite field of current value\n            // if value argument is a value of 'Request' field that 'oppositeValue' will contain value of 'Limit' field\n            var oppositeValue;\n            var isFieldsValid;\n\n            if (lodash.includes(field, 'requests')) {\n                oppositeValue = lodash.get(ctrl.version, 'spec.resources.limits.memory');\n\n                // compare 'Request' and 'Limit' fields values converted in bytes\n                isFieldsValid = lodash.isNil(oppositeValue) ? true : convertToBytes(value) <= convertToBytes(oppositeValue);\n            } else if (lodash.includes(field, 'limits')) {\n                oppositeValue = lodash.get(ctrl.version, 'spec.resources.requests.memory');\n\n                // compare 'Request' and 'Limit' fields values converted in bytes\n                isFieldsValid = lodash.isNil(oppositeValue) ? true : convertToBytes(value) >= convertToBytes(oppositeValue);\n            }\n\n            ctrl.resourcesForm.requestMemory.$setValidity('equality', isFieldsValid);\n            ctrl.resourcesForm.limitsMemory.$setValidity('equality', isFieldsValid);\n        }\n\n        /**\n         * Converts megabytes, gigabytes and terabytes into bytes\n         * @param {string} value\n         * @returns {number}\n         */\n        function convertToBytes(value) {\n            var unit = extractUnit(value);\n            var unitData = lodash.find(ctrl.dropdownOptions, ['unit', unit]);\n\n            return parseInt(value) * Math.pow(unitData.root, unitData.power);\n        }\n\n        /**\n         * Extracts the unit part of a string consisting of a numerical value then a unit.\n         * @param {string} str - the string with value and unit.\n         * @returns {string} the unit, or the empty-string if unit does not exist in the `str`.\n         * @example\n         * extractUnit('100 GB');\n         * // => 'GB'\n         *\n         * extractUnit('100GB');\n         * // => 'GB'\n         *\n         * extractUnit('100');\n         * // => ''\n         */\n        function extractUnit(str) {\n            return lodash.get(str.match(/[a-zA-Z]+/), '[0]', '');\n        }\n\n        /**\n         * Init default common parameters for new version\n         */\n        function initParametersData() {\n            var requestsMemory = lodash.get(ctrl.version, 'spec.resources.requests.memory');\n            var limitsMemory = lodash.get(ctrl.version, 'spec.resources.limits.memory');\n            var requestsCpu = lodash.get(ctrl.version, 'spec.resources.requests.cpu');\n            var limitsCpu = lodash.get(ctrl.version, 'spec.resources.limits.cpu');\n            var limitsGpu = lodash.get(ctrl.version, ['spec', 'resources', 'limits', 'nvidia.com/gpu']);\n\n            ctrl.requestsMemoryValue = parseValue(requestsMemory);\n            ctrl.limitsMemoryValue = parseValue(limitsMemory);\n            ctrl.requestsCpuValue = parseValue(requestsCpu);\n            ctrl.limitsCpuValue = parseValue(limitsCpu);\n            ctrl.limitsGpuValue = parseValue(limitsGpu);\n\n            // get size unit from memory values into int or set default, example: '15G' -> 'G'\n            ctrl.selectedRequestUnit = lodash.isNil(requestsMemory) ? defaultUnit : lodash.find(ctrl.dropdownOptions, ['unit', extractUnit(requestsMemory)]);\n            ctrl.selectedLimitUnit = lodash.isNil(limitsMemory) ? defaultUnit : lodash.find(ctrl.dropdownOptions, ['unit', extractUnit(limitsMemory)]);\n\n            ctrl.selectedCpuRequestItem = lodash.isNil(requestsCpu) ? ctrl.cpuDropdownOptions[0] : lodash.find(ctrl.cpuDropdownOptions, ['unit', extractUnit(requestsCpu)]);\n            ctrl.selectedCpuLimitItem = lodash.isNil(limitsCpu) ? ctrl.cpuDropdownOptions[0] : lodash.find(ctrl.cpuDropdownOptions, ['unit', extractUnit(limitsCpu)]);\n\n            function parseValue(value) {\n                if (lodash.isNil(value)) {\n                    return null;\n                }\n                var parsedValue = parseFloat(value);\n\n                return parsedValue > 0 ? parsedValue : null;\n            }\n        }\n\n        /**\n         * Initializes Target CPU slider.\n         */\n        function initTargetCpuSlider() {\n            ctrl.targetCpuValueUnit = '';\n            ctrl.targetCpuSliderConfig = {\n                value: lodash.get(ctrl.defaultFunctionConfig, 'spec.resources.targetCPU', 75),\n                valueLabel: 'disabled',\n                pow: 0,\n                unitLabel: '%',\n                labelHelpIcon: false,\n                options: {\n                    disabled: true,\n                    floor: 1,\n                    id: 'targetCPU',\n                    ceil: 100,\n                    step: 1,\n                    showSelectionBar: true\n                }\n            };\n\n            updateTargetCpuSlider();\n        }\n\n        /**\n         * Updates Target CPU slider state (enabled/disabled) and display value.\n         */\n        function updateTargetCpuSlider() {\n            var minReplicas = lodash.get(ctrl.version, 'spec.minReplicas');\n            var maxReplicas = lodash.get(ctrl.version, 'spec.maxReplicas');\n            var disabled = !lodash.isNumber(minReplicas) || !lodash.isNumber(maxReplicas) || maxReplicas <= 1 || minReplicas === maxReplicas;\n            var targetCpuValue = lodash.get(ctrl.version, 'spec.targetCPU', 75);\n\n            ctrl.targetCpuValueUnit = disabled ? '' : '%';\n            lodash.merge(ctrl.targetCpuSliderConfig, {\n                value: targetCpuValue,\n                valueLabel: disabled ? 'disabled' : targetCpuValue,\n                options: {\n                    disabled: disabled\n                }\n            });\n        }\n\n        /**\n         * Initializes data for \"Scale to zero\" section\n         */\n        function initScaleToZeroData() {\n            scaleToZero = lodash.get(ConfigService, 'nuclio.scaleToZero', {});\n\n            if (!lodash.isEmpty(scaleToZero)) {\n                scaleResourcesCopy = lodash.get(ctrl.version, 'spec.scaleToZero.scaleResources', scaleToZero.scaleResources);\n\n                updateScaleToZeroParameters();\n            }\n        }\n\n        /**\n         * Checks if input is related to `CPU Request`\n         * @param {string} field\n         */\n        function isRequestsInput(field) {\n            return lodash.includes(field.toLowerCase(), 'request');\n        }\n\n        /**\n         * Show form errors if form is invalid\n         */\n        function setFormValidity() {\n            lodash.forEach(['requestMemory', 'limitsMemory', 'requestCpu', 'limitsCpu', 'limitsGpu', 'minReplicas', 'maxReplicas'], prepareToValidity);\n\n            var path = 'spec.resources.requests.memory';\n            checkIfMemoryInputsValid(lodash.get(ctrl.version, path, '0'), path);\n\n            /**\n             * Set `dirty` to true and `ctrl.numberInputChanged` of `number-input.component` to true\n             * for remove `pristine` css class\n             */\n            function prepareToValidity(field) {\n                if (angular.isDefined(ctrl.resourcesForm[field])) {\n                    ctrl.resourcesForm[field].$dirty = true;\n                    ctrl.resourcesForm[field].$$element.scope().$ctrl.numberInputChanged = true;\n                }\n            }\n        }\n\n        /**\n         * Updates parameters for \"Scale to zero\" section\n         */\n        function updateScaleToZeroParameters() {\n            lodash.defaultsDeep(ctrl.version, {\n                ui: {\n                    scaleToZero: {\n                        scaleResources: scaleResourcesCopy\n                    }\n                }\n            });\n\n            var scaleResources = lodash.get(ctrl.version, 'ui.scaleToZero.scaleResources');\n\n            if (ctrl.minReplicas === 0) {\n                lodash.set(ctrl.version, 'spec.scaleToZero.scaleResources', scaleResources);\n            } else {\n                lodash.unset(ctrl.version, 'spec.scaleToZero');\n            }\n\n            var maxWindowSize = lodash.chain(scaleResources).maxBy(function (value) {\n                return parseInt(value.windowSize);\n            }).get('windowSize').value();\n\n            ctrl.windowSizeSlider = {\n                value: maxWindowSize,\n                options: {\n                    stepsArray: scaleToZero.inactivityWindowPresets,\n                    showTicks: true,\n                    showTicksValues: true,\n                    disabled: !Number.isSafeInteger(ctrl.minReplicas) || ctrl.minReplicas > 0,\n                    onChange: function onChange(_, newValue) {\n                        lodash.forEach(scaleResources, function (value) {\n                            value.windowSize = newValue;\n                        });\n\n                        if (ctrl.minReplicas === 0) {\n                            lodash.set(ctrl.version, 'spec.scaleToZero.scaleResources', scaleResources);\n                        }\n                    }\n                }\n            };\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionConfigurationRuntimeAttributesController.$inject = ['$element', '$rootScope', '$timeout', 'lodash', 'PreventDropdownCutOffService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationRuntimeAttributes', {\n        bindings: {\n            version: '<',\n            onChangeCallback: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-runtime-attributes/version-configuration-runtime-attributes.tpl.html',\n        controller: NclVersionConfigurationRuntimeAttributesController\n    });\n\n    function NclVersionConfigurationRuntimeAttributesController($element, $rootScope, $timeout, lodash, PreventDropdownCutOffService) {\n        var ctrl = this;\n\n        ctrl.igzScrollConfig = {\n            maxElementsCount: 10,\n            childrenSelector: '.table-body'\n        };\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                updateOnContentResize: true\n            }\n        };\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.addNewAttribute = addNewAttribute;\n        ctrl.handleAction = handleAction;\n        ctrl.onChangeData = onChangeData;\n\n        ctrl.runtimeAttributes = {};\n\n        //\n        // Hook method\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n\n            // Set attributes from ctrl.version to local ctrl.runtimeAttributes.\n            // The attributes stored in arrays are converted to a string by using `join('\\n')` method\n            lodash.assign(ctrl.runtimeAttributes, {\n                jvmOptions: lodash.get(ctrl.version, 'spec.runtimeAttributes.jvmOptions', []).join('\\n'),\n                arguments: lodash.get(ctrl.version, 'spec.runtimeAttributes.arguments', '')\n            });\n\n            // Set attributes stored in key-value inputs\n            var attributes = lodash.get(ctrl.version, 'spec.runtimeAttributes.responseHeaders', []);\n            ctrl.attributes = lodash.chain(attributes).map(function (value, key) {\n                return {\n                    name: key,\n                    value: value,\n                    ui: {\n                        editModeActive: false,\n                        isFormValid: false,\n                        name: 'runtime-attribute'\n                    }\n                };\n            }).value();\n            ctrl.attributes = lodash.compact(ctrl.attributes);\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n\n            // Bind DOM-related preventDropdownCutOff method to component's controller\n            PreventDropdownCutOffService.preventDropdownCutOff($element, '.three-dot-menu');\n        }\n\n        //\n        // Public method\n        //\n\n        /**\n         * Update spec.runtimeAttributes value\n         * @param {string} newData\n         * @param {string} field\n         */\n        function inputValueCallback(newData, field) {\n            if (field === 'jvmOptions') {\n                ctrl.runtimeAttributes.jvmOptions = newData;\n                lodash.set(ctrl.version, 'spec.runtimeAttributes.jvmOptions', newData.replace(/\\r/g, '\\n').split(/\\n+/));\n            } else {\n                lodash.set(ctrl.version, 'spec.runtimeAttributes.' + field, newData);\n            }\n\n            ctrl.onChangeCallback();\n        }\n\n        /**\n         * Adds new Attribute\n         */\n        function addNewAttribute(event) {\n            $timeout(function () {\n                if (ctrl.attributes.length < 1 || lodash.last(ctrl.attributes).ui.isFormValid) {\n                    ctrl.attributes.push({\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'runtime-attribute'\n                        }\n                    });\n\n                    $rootScope.$broadcast('change-state-deploy-button', {\n                        component: 'runtime-attribute',\n                        isDisabled: true\n                    });\n                    event.stopPropagation();\n                }\n            }, 50);\n        }\n\n        /**\n         * Handler on specific action type\n         * @param {string} actionType\n         * @param {number} index - index of label in array\n         */\n        function handleAction(actionType, index) {\n            if (actionType === 'delete') {\n                ctrl.attributes.splice(index, 1);\n\n                updateAttributes();\n            }\n        }\n\n        /**\n         * Changes labels data\n         * @param {Object} attribute\n         * @param {number} index\n         */\n        function onChangeData(attribute, index) {\n            ctrl.attributes[index] = attribute;\n\n            updateAttributes();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Updates function`s labels\n         */\n        function updateAttributes() {\n            var newAttributes = {};\n            var isFormValid = true;\n\n            lodash.forEach(ctrl.attributes, function (attribute) {\n                if (!attribute.ui.isFormValid) {\n                    isFormValid = false;\n                }\n\n                newAttributes[attribute.name] = attribute.value;\n            });\n\n            $rootScope.$broadcast('change-state-deploy-button', {\n                component: 'runtime-attribute',\n                isDisabled: !isFormValid\n            });\n\n            lodash.set(ctrl.version, 'spec.runtimeAttributes.responseHeaders', newAttributes);\n\n            ctrl.onChangeCallback();\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionConfigurationVolumesController.$inject = ['$rootScope', '$scope', '$timeout', '$i18next', 'i18next', 'lodash', 'DialogsService', 'FormValidationService', 'FunctionsService', 'ValidationService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationVolumes', {\n        bindings: {\n            version: '<',\n            onChangeCallback: '&'\n        },\n        templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-volumes/version-configuration-volumes.tpl.html',\n        controller: NclVersionConfigurationVolumesController\n    });\n\n    function NclVersionConfigurationVolumesController($rootScope, $scope, $timeout, $i18next, i18next, lodash, DialogsService, FormValidationService, FunctionsService, ValidationService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.isCreateModeActive = false;\n        ctrl.volumes = [];\n        ctrl.volumesForm = null;\n        ctrl.igzScrollConfig = {\n            maxElementsCount: 5,\n            childrenSelector: '.ncl-collapsing-row'\n        };\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                updateOnContentResize: true\n            }\n        };\n        ctrl.validationRules = {\n            itemName: [],\n            itemPath: ValidationService.getValidationRules('function.itemPath', [{\n                label: $i18next.t('functions:UNIQUENESS', { lng: lng }),\n                pattern: validateUniqueness.bind(null, 'volumeMount.mountPath')\n            }]),\n            containerName: ValidationService.getValidationRules('container.name')\n        };\n        ctrl.maxLengths = {\n            containerSubPath: ValidationService.getMaxLength('function.containerSubPath')\n        };\n\n        ctrl.$onInit = onInit;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.createVolume = createVolume;\n        ctrl.editVolumeCallback = editVolumeCallback;\n        ctrl.handleAction = handleAction;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.validationRules.itemName = ValidationService.getValidationRules('k8s.dns1123Label').concat([{\n                label: $i18next.t('functions:UNIQUENESS', { lng: lng }),\n                pattern: validateUniqueness.bind(null, 'volume.name')\n            }]);\n\n            // get volumes list\n            ctrl.volumes = lodash.map(lodash.get(ctrl.version, 'spec.volumes', []), function (value) {\n                var volumeItem = angular.copy(value);\n\n                volumeItem.ui = {\n                    changed: false,\n                    editModeActive: false,\n                    isFormValid: true,\n                    name: 'volume'\n                };\n\n                return volumeItem;\n            });\n\n            ctrl.classList = FunctionsService.getClassesList('volume');\n\n            $scope.$on('edit-item-has-been-changed', updateVolumesChangesState);\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            $rootScope.$broadcast('change-state-deploy-button', { component: 'volume', isDisabled: false });\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Toggle create volume mode\n         * @param {Event} event\n         */\n        function createVolume(event) {\n            $timeout(function () {\n                if (!isVolumeInEditMode()) {\n                    ctrl.volumes.push({\n                        volumeMount: {\n                            name: ''\n                        },\n                        volume: {\n                            name: ''\n                        },\n                        ui: {\n                            changed: true,\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'volume'\n                        }\n                    });\n\n                    ctrl.volumesForm.$setPristine();\n\n                    event.stopPropagation();\n                    $rootScope.$broadcast('change-state-deploy-button', { component: 'volume', isDisabled: true });\n                }\n            }, 100);\n        }\n\n        /**\n         * Edit item callback function\n         * @param {Object} item - selected item\n         */\n        function editVolumeCallback(item) {\n            ctrl.handleAction('update', item);\n        }\n\n        /**\n         * According to given action name calls proper action handler\n         * @param {string} actionType - e.g. `'delete'`, `'edit'`, `'update'`\n         * @param {Object} selectedItem - an object of selected volume\n         * @param {number} [index] - index of variable in array\n         */\n        function handleAction(actionType, selectedItem, index) {\n            if (actionType === 'delete') {\n                deleteHandler(index);\n            } else if (actionType === 'edit') {\n                editHandler(selectedItem);\n            } else if (actionType === 'update') {\n                updateHandler(selectedItem);\n            } else {\n                DialogsService.alert($i18next.t('functions:ERROR_MSG.FUNCTIONALITY_IS_NOT_IMPLEMENTED', { lng: lng }));\n            }\n\n            $rootScope.$broadcast('change-state-deploy-button', { component: 'volume', isDisabled: false });\n            lodash.forEach(ctrl.volumes, function (volume) {\n                if (!volume.ui.isFormValid) {\n                    $rootScope.$broadcast('change-state-deploy-button', { component: volume.ui.name, isDisabled: true });\n                }\n            });\n\n            ctrl.onChangeCallback();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Checks validation of volumes\n         */\n        function checkValidation() {\n            if (lodash.some(ctrl.volumes, ['ui.isFormValid', false])) {\n                FormValidationService.validateAllFields(ctrl.volumesForm);\n            }\n        }\n\n        /**\n         * Deletes selected item\n         * @param {number} index - index of variable in array\n         */\n        function deleteHandler(index) {\n            ctrl.volumes.splice(index, 1);\n\n            // since uniqueness validation rule of some fields is dependent on the entire volume list, whenever a volume\n            // is removed, the rest of the volumes needs to be re-validated\n            checkValidation();\n\n            var workingCopy = lodash.map(ctrl.volumes, function (volume) {\n                return lodash.omit(volume, 'ui');\n            });\n\n            lodash.set(ctrl.version, 'spec.volumes', workingCopy);\n        }\n\n        /**\n         * Toggles item to edit mode\n         * @param {Object} selectedItem - an object of selected volume\n         */\n        function editHandler(selectedItem) {\n            var volume = lodash.find(ctrl.volumes, ['volume.name', selectedItem.volume.name]);\n            volume.ui.editModeActive = true;\n        }\n\n        /**\n         * Checks if volume is in edit mode\n         * @returns {boolean}\n         */\n        function isVolumeInEditMode() {\n            return lodash.some(ctrl.volumes, ['ui.editModeActive', true]);\n        }\n\n        /**\n         * Updates data in selected item\n         * @param {Object} selectedItem - an object of selected volume\n         */\n        function updateHandler(selectedItem) {\n            var workingCopy = angular.copy(ctrl.volumes);\n            var currentVolume = lodash.find(ctrl.volumes, ['volume.name', selectedItem.volume.name]);\n            var indexOfEditableElement = lodash.findIndex(ctrl.volumes, ['volume.name', selectedItem.volume.name]);\n\n            if (angular.isDefined(currentVolume)) {\n                workingCopy[indexOfEditableElement] = {\n                    volumeMount: selectedItem.volumeMount,\n                    volume: selectedItem.volume\n                };\n\n                // since uniqueness validation rule of some fields is dependent on the entire volume list, whenever a\n                // volume is updated, the rest of the volumes needs to be re-validated\n                checkValidation();\n\n                lodash.forEach(workingCopy, function (volume) {\n                    delete volume.ui;\n                });\n\n                lodash.set(ctrl.version, 'spec.volumes', workingCopy);\n            }\n        }\n\n        /**\n         * Checks volumes and updates `ctrl.version.ui.isVolumesChanged` if there is some changed and unsaved trigger.\n         */\n        function updateVolumesChangesState() {\n            var isSomeVolumeChanged = lodash.some(ctrl.volumes, ['ui.changed', true]);\n            var isSomeVolumeInEditMode = lodash.some(ctrl.volumes, ['ui.editModeActive', true]);\n\n            lodash.set(ctrl.version, 'ui.isVolumesChanged', isSomeVolumeChanged && isSomeVolumeInEditMode);\n        }\n\n        /**\n         * Determines `uniqueness` validation for `Name` and `Mount Path` fields\n         * @param {string} path\n         * @param {string} value\n         */\n        function validateUniqueness(path, value) {\n            return lodash.filter(ctrl.volumes, [path, value]).length === 1;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionConfigurationBuildDialogController.$inject = ['EventHelperService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionConfigurationBuildDialog', {\n        bindings: {\n            closeDialog: '&'\n        },\n        templateUrl: 'nuclio/functions/version/version-configuration/tabs/version-configuration-build/version-configuration-build-dialog/version-configuration-build-dialog.tpl.html',\n        controller: NclVersionConfigurationBuildDialogController\n    });\n\n    function NclVersionConfigurationBuildDialogController(EventHelperService) {\n        var ctrl = this;\n\n        ctrl.onClose = onClose;\n        ctrl.uploadFile = uploadFile;\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Closes dialog\n         * @param {Event} [event]\n         */\n        function onClose(event) {\n            if ((angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) && !ctrl.isLoadingState) {\n                ctrl.closeDialog();\n            }\n        }\n\n        /**\n         * Closes dialog and pass selected file for further work\n         * @param {Object} file - uploading file\n         */\n        function uploadFile(file) {\n            ctrl.closeDialog({ file: file });\n        }\n    }\n})();\n'use strict';\n\n/* eslint max-statements: [\"error\", 100] */\n/* eslint max-params: [\"error\", 25] */\n/* eslint complexity: [\"error\", 15] */\n(function () {\n    'use strict';\n\n    FunctionsController.$inject = ['$filter', '$interval', '$q', '$rootScope', '$scope', '$state', '$stateParams', '$timeout', '$transitions', '$i18next', 'i18next', 'lodash', 'CommonTableService', 'ConfigService', 'DialogsService', 'ElementLoadingStatusService', 'FunctionsService', 'NuclioHeaderService', 'TableSizeService'];\n    angular.module('iguazio.dashboard-controls').component('nclFunctions', {\n        bindings: {\n            createFunction: '&',\n            createFunctionWhenEmpty: '<?',\n            deleteFunction: '&',\n            getFunction: '&',\n            getFunctions: '&',\n            getProject: '&',\n            getStatistics: '&',\n            updateFunction: '&'\n        },\n        templateUrl: 'nuclio/functions/functions.tpl.html',\n        controller: FunctionsController\n    });\n\n    function FunctionsController($filter, $interval, $q, $rootScope, $scope, $state, $stateParams, $timeout, $transitions, $i18next, i18next, lodash, CommonTableService, ConfigService, DialogsService, ElementLoadingStatusService, FunctionsService, NuclioHeaderService, TableSizeService) {\n        var ctrl = this;\n        var lng = i18next.language;\n        var title = {}; // breadcrumbs config\n        var updatingFunctionsInterval = null;\n        var updatingFunctionsIntervalTime = 10000;\n        var updatingStatisticsInterval = null;\n        var updatingStatisticsIntervalTime = 30000;\n\n        var METRICS = {\n            FUNCTION_CPU: 'nuclio_function_cpu',\n            FUNCTION_MEMORY: 'nuclio_function_mem',\n            FUNCTION_EVENTS: 'nuclio_processor_handled_events_total'\n        };\n\n        ctrl.checkedItemsCount = 0;\n        ctrl.filtersCounter = 0;\n        ctrl.functions = [];\n        ctrl.sortedFunctions = [];\n        ctrl.isFiltersShowed = {\n            value: false,\n            changeValue: function changeValue(newVal) {\n                this.value = newVal;\n            }\n        };\n        ctrl.isReverseSorting = false;\n        ctrl.isSplashShowed = {\n            value: true\n        };\n        ctrl.project = {};\n        ctrl.searchKeys = ['metadata.name', 'spec.description'];\n        ctrl.searchStates = {};\n        ctrl.sortOptions = [{\n            label: $i18next.t('common:NAME', { lng: lng }),\n            value: 'metadata.name',\n            active: true\n        }, {\n            label: $i18next.t('common:STATUS', { lng: lng }),\n            value: 'ui.convertedStatus',\n            active: false\n        }, {\n            label: $i18next.t('common:REPLICAS', { lng: lng }),\n            value: 'spec.replicas',\n            active: false,\n            visible: ConfigService.isDemoMode()\n        }, {\n            label: $i18next.t('functions:RUNTIME', { lng: lng }),\n            value: 'spec.runtime',\n            active: false\n        }, {\n            label: $i18next.t('functions:INVOCATION_PER_SEC', { lng: lng }),\n            value: 'ui.metrics.invocationPerSec',\n            active: false\n        }, {\n            label: $i18next.t('common:CPU_CORES', { lng: lng }),\n            value: 'ui.metrics[\\'cpu.cores\\']',\n            active: false\n        }, {\n            label: $i18next.t('common:MEMORY', { lng: lng }),\n            value: 'ui.metrics.size',\n            active: false\n        }, {\n            label: $i18next.t('functions:INVOCATION', { lng: lng }) + ' #',\n            value: 'ui.metrics.count',\n            active: false\n        }];\n        ctrl.sortedColumnName = 'metadata.name';\n        ctrl.versionActions = [];\n\n        ctrl.$onInit = onInit;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.getVersions = getVersions;\n        ctrl.handleFunctionVersionAction = handleFunctionVersionAction;\n        ctrl.isFunctionsListEmpty = isFunctionsListEmpty;\n        ctrl.onApplyFilters = onApplyFilters;\n        ctrl.onResetFilters = onResetFilters;\n        ctrl.onSortOptionsChange = onSortOptionsChange;\n        ctrl.onUpdateFiltersCounter = onUpdateFiltersCounter;\n        ctrl.openNewFunctionScreen = openNewFunctionScreen;\n        ctrl.refreshFunctions = refreshFunctions;\n        ctrl.sortTableByColumn = sortTableByColumn;\n        ctrl.toggleFilters = toggleFilters;\n\n        ctrl.functionsService = FunctionsService;\n        ctrl.getColumnSortingClasses = CommonTableService.getColumnSortingClasses;\n        ctrl.getFunctionsTableColSize = TableSizeService.getFunctionsTableColSize;\n        ctrl.isDemoMode = ConfigService.isDemoMode;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.isSplashShowed.value = true;\n\n            lodash.defaults(ctrl, { createFunctionWhenEmpty: true });\n\n            initFunctions();\n\n            // initializes function actions array\n            ctrl.functionActions = angular.copy(FunctionsService.initFunctionActions());\n\n            // initializes version actions array\n            ctrl.versionActions = angular.copy(FunctionsService.initVersionActions());\n\n            $scope.$on('action-checkbox-all_check-all', onCheckAll);\n            $scope.$on('action-checkbox-all_checked-items-count-change', onItemsCountChange);\n            $scope.$on('action-checkbox_item-checked', onItemChecked);\n            $scope.$on('action-panel_fire-action', onFireAction);\n\n            $transitions.onStart({}, stateChangeStart);\n\n            updatePanelActions();\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            stopAutoUpdate();\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Gets list of function versions\n         * @returns {string[]}\n         */\n        function getVersions() {\n            return lodash.chain(ctrl.functions).map(function (functionItem) {\n\n                // TODO\n                return functionItem.version === -1 ? [] : functionItem.versions;\n            }).flatten().value();\n        }\n\n        /**\n         * According to given action name calls proper action handler\n         * @param {string} actionType - ex. `delete`\n         * @param {Array} checkedItems - an array of checked projects\n         * @returns {Promise}\n         */\n        function handleFunctionVersionAction(actionType, checkedItems) {\n            var promises = [];\n\n            lodash.forEach(checkedItems, function (checkedItem) {\n                var actionHandler = checkedItem.ui[actionType];\n\n                if (lodash.isFunction(actionHandler)) {\n                    promises.push(actionHandler());\n                }\n            });\n\n            return $q.all(promises).then(function () {\n                if (angular.isDefined(checkedItems[0].metadata) && actionType === 'delete') {\n                    return initFunctions().then(function () {\n                        ctrl.isSplashShowed.value = false;\n                    });\n                }\n            });\n        }\n\n        /**\n         * Checks if functions list is empty\n         * @returns {boolean}\n         */\n        function isFunctionsListEmpty() {\n            return lodash.isEmpty(ctrl.functions);\n        }\n\n        /**\n         * Updates projects/functions list depends on filters value\n         */\n        function onApplyFilters() {\n            $rootScope.$broadcast('search-input_refresh-search');\n        }\n\n        /**\n         * Handles on reset filters event\n         */\n        function onResetFilters() {\n            $rootScope.$broadcast('search-input_reset');\n\n            ctrl.filtersCounter = 0;\n        }\n\n        /**\n         * Sorts the table by column name depends on selected option.\n         * @param {Object} option - The selected option.\n         */\n        function onSortOptionsChange(option) {\n            ctrl.isReverseSorting = option.desc;\n            ctrl.sortedColumnName = option.value;\n\n            sortTable();\n        }\n\n        /**\n         * Handles on update filters counter\n         * @param {string} searchQuery\n         */\n        function onUpdateFiltersCounter(searchQuery) {\n            ctrl.filtersCounter = lodash.isEmpty(searchQuery) ? 0 : 1;\n        }\n\n        /**\n         * Navigates to New Function screen\n         */\n        function openNewFunctionScreen() {\n            $state.go('app.project.create-function');\n        }\n\n        /**\n         * Refreshes function list\n         * @returns {Promise}\n         */\n        function refreshFunctions(autoRefresh) {\n            ctrl.isSplashShowed.value = !autoRefresh;\n\n            return ctrl.getFunctions({ id: ctrl.project.metadata.name }).then(function (functions) {\n                ctrl.functions = lodash.map(functions, function (functionFromResponse) {\n                    var foundFunction = lodash.find(ctrl.functions, ['metadata.name', functionFromResponse.metadata.name]);\n                    var ui = lodash.get(foundFunction, 'ui');\n                    functionFromResponse.ui = lodash.defaultTo(ui, functionFromResponse.ui);\n\n                    return functionFromResponse;\n                });\n\n                if (ctrl.createFunctionWhenEmpty && lodash.isEmpty(ctrl.functions) && !$stateParams.createCancelled) {\n                    ctrl.isSplashShowed.value = false;\n                    openNewFunctionScreen();\n                } else {\n                    // TODO: unmock versions data\n                    lodash.forEach(ctrl.functions, function (functionItem) {\n                        lodash.set(functionItem, 'versions', [{\n                            name: '$LATEST',\n                            invocation: '30'\n                        }]);\n                        lodash.set(functionItem, 'spec.version', 1);\n                    });\n                }\n\n                sortTable();\n            }).then(function () {\n                if (!autoRefresh) {\n                    updateStatistics();\n                }\n            }).catch(function (error) {\n                var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_FUNCTIONS', { lng: lng });\n\n                DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n            }).finally(function () {\n                ctrl.isSplashShowed.value = false;\n            });\n        }\n\n        /**\n         * Sorts the table by column.\n         * @param {string} columnName - The name of the column to sort by.\n         */\n        function sortTableByColumn(columnName) {\n            // set the sorting order (ascending if selected a different column, or toggle if selected the same column)\n            ctrl.isReverseSorting = columnName === ctrl.sortedColumnName ? !ctrl.isReverseSorting : false;\n\n            // save the name of the column to sort by\n            ctrl.sortedColumnName = columnName;\n\n            sortTable();\n        }\n\n        /**\n         * Shows/hides filters panel\n         */\n        function toggleFilters() {\n            ctrl.isFiltersShowed.value = !ctrl.isFiltersShowed.value;\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Initializes functions list\n         */\n        function initFunctions() {\n            ctrl.getProject({ id: $stateParams.projectId }).then(function (project) {\n                ctrl.project = project;\n                title.project = project;\n                title.tab = $i18next.t('common:FUNCTIONS', { lng: lng });\n\n                NuclioHeaderService.updateMainHeader('common:PROJECTS', title, $state.current.name);\n\n                return ctrl.refreshFunctions();\n            }).then(function () {\n                sortTable();\n                startAutoUpdate();\n            }).finally(function () {\n                $timeout(function () {\n                    $rootScope.$broadcast('igzWatchWindowResize::resize');\n                });\n            }).catch(function (error) {\n                ctrl.isSplashShowed.value = false;\n                var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_FUNCTIONS', { lng: lng });\n\n                DialogsService.alert(lodash.get(error, 'data.error', defaultMsg)).then(function () {\n                    $state.go('app.projects');\n                });\n            });\n        }\n\n        /**\n         * Handler on action-panel broadcast\n         * @param {Event} event - $broadcast-ed event\n         * @param {Object} data - $broadcast-ed data\n         */\n        function onFireAction(event, data) {\n            if (FunctionsService.checkedItem === 'functions' || !ctrl.isDemoMode()) {\n                var checkedFunctions = lodash.filter(ctrl.functions, 'ui.checked');\n\n                ctrl.handleFunctionVersionAction(data.action, checkedFunctions);\n            } else if (FunctionsService.checkedItem === 'versions') {\n                var checkedVersions = lodash.chain(ctrl.functions).map(function (functionItem) {\n                    return lodash.filter(functionItem.versions, 'ui.checked');\n                }).flatten().value();\n\n                ctrl.handleFunctionVersionAction(data.action, checkedVersions);\n            }\n        }\n\n        /**\n         * Handler on `checkbox-all` click\n         * @param {Event} event - broadcast event\n         * @param {Object} data - broadcast data\n         */\n        function onCheckAll(event, data) {\n            if (data.checkedCount === 0) {\n                FunctionsService.checkedItem = '';\n            }\n\n            $timeout(updatePanelActions);\n        }\n\n        /**\n         * Handler on checkbox click\n         * @param {Event} event - broadcast event\n         * @param {Object} data - broadcast data\n         */\n        function onItemChecked(event, data) {\n            if (!lodash.isEmpty(data.itemType)) {\n                FunctionsService.checkedItem = data.itemType;\n            }\n        }\n\n        /**\n         * Handler on change checked items count\n         * @param {Event} event - broadcast event\n         * @param {Object} data - broadcast data\n         */\n        function onItemsCountChange(event, data) {\n            if (data.checkedCount === 0) {\n                FunctionsService.checkedItem = '';\n            }\n\n            updatePanelActions();\n        }\n\n        /**\n         * Sorts table according to the current sort-by column and sorting order (ascending/descending).\n         */\n        function sortTable() {\n            ctrl.sortedFunctions = lodash.orderBy(ctrl.functions, [ctrl.sortedColumnName], ctrl.isReverseSorting ? ['desc'] : ['asc']);\n        }\n\n        /**\n         * Starts auto-update statistics.\n         */\n        function startAutoUpdate() {\n            if (lodash.isNull(updatingFunctionsInterval)) {\n                updatingFunctionsInterval = $interval(refreshFunctions.bind(null, true), updatingFunctionsIntervalTime);\n            }\n\n            if (lodash.isNull(updatingStatisticsInterval)) {\n                updatingStatisticsInterval = $interval(updateStatistics, updatingStatisticsIntervalTime);\n            }\n        }\n\n        /**\n         * Opens a splash screen on start change state\n         */\n        function stateChangeStart() {\n            ctrl.isSplashShowed.value = true;\n        }\n\n        /**\n         * Stops auto-update statistics\n         */\n        function stopAutoUpdate() {\n            if (!lodash.isNull(updatingFunctionsInterval)) {\n                $interval.cancel(updatingFunctionsInterval);\n                updatingFunctionsInterval = null;\n            }\n\n            if (!lodash.isNull(updatingStatisticsInterval)) {\n                $interval.cancel(updatingStatisticsInterval);\n                updatingStatisticsInterval = null;\n            }\n        }\n\n        /**\n         * Updates actions of action panel according to selected nodes\n         */\n        function updatePanelActions() {\n            if (FunctionsService.checkedItem === 'functions' || !ctrl.isDemoMode()) {\n                updatePanelFunctionActions();\n            } else if (FunctionsService.checkedItem === 'versions') {\n                updatePanelVersionActions();\n            }\n\n            /**\n             * Updates function actions\n             */\n            function updatePanelFunctionActions() {\n                var checkedRows = lodash.filter(ctrl.functions, 'ui.checked');\n                var checkedRowsCount = checkedRows.length;\n\n                if (checkedRowsCount > 0) {\n\n                    // sets visibility status of `duplicate, export, viewConfig` actions\n                    // visible if only one function is checked\n                    var duplicateAction = lodash.find(ctrl.functionActions, { id: 'duplicate' });\n                    var exportAction = lodash.find(ctrl.functionActions, { id: 'export' });\n                    var viewConfigAction = lodash.find(ctrl.functionActions, { id: 'viewConfig' });\n\n                    if (!lodash.isNil(duplicateAction)) {\n                        duplicateAction.visible = checkedRowsCount === 1;\n                    }\n\n                    if (!lodash.isNil(exportAction)) {\n                        exportAction.visible = checkedRowsCount === 1;\n                    }\n\n                    if (!lodash.isNil(viewConfigAction)) {\n                        viewConfigAction.visible = checkedRowsCount === 1;\n                    }\n\n                    // sets confirm message for `delete action` depending on count of checked rows\n                    var deleteAction = lodash.find(ctrl.functionActions, { id: 'delete' });\n                    var isApiGatewayFunction = lodash.some(checkedRows, function (row) {\n                        var apiGateways = lodash.get(row, 'status.apiGateways', []);\n\n                        return !lodash.isEmpty(apiGateways);\n                    });\n\n                    if (!lodash.isNil(deleteAction) && !isApiGatewayFunction) {\n                        var functionName = checkedRows[0].metadata.name;\n                        deleteAction.confirm = {\n                            message: checkedRowsCount === 1 ? $i18next.t('functions:DELETE_FUNCTION', { lng: lng }) + ' “' + functionName + '”?' : $i18next.t('functions:DELETE_FUNCTIONS_CONFIRM', { lng: lng }),\n                            description: checkedRowsCount === 1 ? $i18next.t('functions:DELETE_FUNCTION_DESCRIPTION', { lng: lng }) : null,\n                            yesLabel: $i18next.t('common:YES_DELETE', { lng: lng }),\n                            noLabel: $i18next.t('common:CANCEL', { lng: lng }),\n                            type: 'nuclio_alert'\n                        };\n                        deleteAction.handler = function (action) {\n                            $rootScope.$broadcast('action-panel_fire-action', {\n                                action: action.id\n                            });\n                        };\n                    } else if (isApiGatewayFunction) {\n                        var message = $i18next.t('functions:ERROR_MSG.DELETE_API_GW_FUNCTIONS', { lng: lng });\n\n                        if (checkedRowsCount === 1) {\n                            var apiGatewayName = lodash.get(checkedRows[0], 'status.apiGateways[0]', '');\n\n                            message = $i18next.t('functions:ERROR_MSG.DELETE_API_GW_FUNCTION', {\n                                lng: lng,\n                                apiGatewayName: apiGatewayName\n                            });\n                        }\n\n                        deleteAction.confirm = {};\n                        deleteAction.handler = function () {\n                            DialogsService.alert(message);\n                        };\n                    }\n                }\n            }\n\n            /**\n             * Updates version actions\n             */\n            function updatePanelVersionActions() {\n                var checkedRows = lodash.chain(ctrl.functions).map(function (functionItem) {\n                    return lodash.filter(functionItem.versions, 'ui.checked');\n                }).flatten().value();\n                var checkedRowsCount = checkedRows.length;\n\n                if (checkedRowsCount > 0) {\n\n                    // sets visibility status of `edit action`\n                    // visible if only one version is checked\n                    var editAction = lodash.find(ctrl.versionActions, { id: 'edit' });\n\n                    if (!lodash.isNil(editAction)) {\n                        editAction.visible = checkedRowsCount === 1;\n                    }\n\n                    // sets confirm message for `delete action` depending on count of checked rows\n                    var deleteAction = lodash.find(ctrl.versionActions, { id: 'delete' });\n\n                    if (!lodash.isNil(deleteAction)) {\n                        deleteAction.confirm.message = checkedRowsCount === 1 ? $i18next.t('functions:DELETE_VERSION', { lng: lng }) + ' “' + checkedRows[0].name + '”?' : $i18next.t('functions:DELETE_VERSIONS_CONFIRM', { lng: lng });\n                    }\n                }\n            }\n        }\n\n        /**\n         * Gets and parses data for Invocation #, CPU and Memory columns\n         */\n        function updateStatistics() {\n            var MILLIS_IN_AN_HOUR = 60 * 60 * 1000;\n            var now = Date.now();\n            var from = new Date(now - MILLIS_IN_AN_HOUR).toISOString();\n            var until = new Date(now).toISOString();\n            var args = {\n                metric: METRICS.FUNCTION_EVENTS,\n                from: from,\n                until: until,\n                interval: '5m'\n            };\n\n            ctrl.getStatistics(args).then(parseData.bind(null, args.metric)).catch(handleError.bind(null, args.metric));\n\n            args.metric = METRICS.FUNCTION_CPU;\n            ctrl.getStatistics(args).then(parseData.bind(null, args.metric)).catch(handleError.bind(null, args.metric));\n\n            args.metric = METRICS.FUNCTION_MEMORY;\n            ctrl.getStatistics(args).then(parseData.bind(null, args.metric)).catch(handleError.bind(null, args.metric));\n\n            /**\n             * Sets error message to the relevant function\n             */\n            function handleError(type, error) {\n                lodash.forEach(ctrl.functions, function (aFunction) {\n                    lodash.set(aFunction, 'ui.error.' + type, error.msg);\n\n                    $timeout(function () {\n                        $rootScope.$broadcast('element-loading-status_hide-spinner', {\n                            name: type + '-' + aFunction.metadata.name\n                        });\n                    });\n                });\n            }\n\n            /**\n             * Parses data for charts\n             * @param {string} type\n             * @param {Object} data\n             */\n            function parseData(type, data) {\n                var results = lodash.get(data, 'result', []);\n\n                lodash.forEach(ctrl.functions, function (aFunction) {\n                    var funcStats = [];\n\n                    lodash.forEach(results, function (result) {\n                        var functionName = lodash.get(aFunction, 'metadata.name');\n                        var metric = lodash.get(result, 'metric', {});\n                        var resultName = lodash.defaultTo(metric.function, metric.function_name);\n\n                        if (resultName === functionName) {\n                            funcStats.push(result);\n                        }\n                    });\n\n                    if (lodash.isObject(funcStats)) {\n                        var latestValue = lodash.sum(lodash.map(funcStats, function (stat) {\n                            return Number(lodash.last(stat.values)[1]);\n                        }));\n\n                        // calculating of invocation per second regarding last timestamps\n                        var invocationPerSec = lodash.chain(funcStats).map(function (stat) {\n                            var firstValue;\n                            var secondValue;\n\n                            if (stat.values.length < 2) {\n                                return 0;\n                            }\n\n                            // handle array of length 2\n                            firstValue = stat.values[0];\n                            secondValue = stat.values[1];\n\n                            // when querying up to current time prometheus\n                            // may duplicate the last value, so we calculate an earlier\n                            // interval [pre-last] to get a meaningful value\n                            if (stat.values.length > 2) {\n                                firstValue = stat.values[stat.values.length - 3];\n                                secondValue = stat.values[stat.values.length - 2];\n                            }\n\n                            var valuesDiff = Number(secondValue[1]) - Number(firstValue[1]);\n                            var timestampsDiff = secondValue[0] - firstValue[0];\n\n                            return valuesDiff / timestampsDiff;\n                        }).sum().value();\n\n                        var funcValues = lodash.get(funcStats, '[0].values', []);\n\n                        if (funcStats.length > 1) {\n                            funcValues = lodash.fromPairs(funcValues);\n\n                            for (var i = 1; i < funcStats.length; i++) {\n                                var values = lodash.get(funcStats, '[' + i + '].values', []);\n\n                                lodash.forEach(values, function (value) {\n                                    // eslint-disable-line no-loop-func\n                                    var timestamp = value[0];\n\n                                    lodash.set(funcValues, timestamp, lodash.has(funcValues, timestamp) ? Number(funcValues[timestamp]) + Number(value[1]) : Number(value[1]));\n                                });\n                            }\n\n                            funcValues = lodash.chain(funcValues).toPairs().sortBy(function (value) {\n                                return value[0];\n                            }).value();\n                        }\n\n                        if (type === METRICS.FUNCTION_CPU) {\n                            lodash.merge(aFunction.ui, {\n                                metrics: {\n                                    'cpu.cores': latestValue,\n                                    cpuCoresLineChartData: lodash.map(funcValues, function (dataPoint) {\n                                        return [dataPoint[0] * 1000, Number(dataPoint[1])]; // [time, value]\n                                    })\n                                }\n                            });\n                        } else if (type === METRICS.FUNCTION_MEMORY) {\n                            lodash.merge(aFunction.ui, {\n                                metrics: {\n                                    size: Number(latestValue),\n                                    sizeLineChartData: lodash.map(funcValues, function (dataPoint) {\n                                        return [dataPoint[0] * 1000, Number(dataPoint[1])]; // [time, value]\n                                    })\n                                }\n                            });\n                        } else {\n                            // type === METRICS.FUNCTION_COUNT\n                            lodash.merge(aFunction.ui, {\n                                metrics: {\n                                    count: Number(latestValue),\n                                    countLineChartData: lodash.map(funcValues, function (dataPoint) {\n                                        return [dataPoint[0] * 1000, Number(dataPoint[1])]; // [time, value]\n                                    }),\n                                    invocationPerSec: $filter('scale')(invocationPerSec, Number.isInteger(invocationPerSec) ? 0 : 2)\n                                }\n                            });\n                        }\n                    }\n                });\n\n                ElementLoadingStatusService.hideSpinnerGroup(lodash.map(ctrl.functions, function (aFunction) {\n                    return type + '-' + lodash.get(aFunction, 'metadata.name');\n                }));\n\n                // if the column values have just been updated, and the table is sorted by this column - update sort\n                if (type === METRICS.FUNCTION_CPU && ctrl.sortedColumnName === 'ui.metrics[\\'cpu.cores\\']' || type === METRICS.FUNCTION_MEMORY && ctrl.sortedColumnName === 'ui.metrics.size' || type === METRICS.FUNCTION_EVENTS && lodash.includes(['ui.metrics.invocationPerSec', 'ui.metrics.count'], ctrl.sortedColumnName)) {\n                    sortTable();\n                }\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    FunctionsService.$inject = ['$i18next', 'i18next', 'lodash', 'ConfigService'];\n    angular.module('iguazio.dashboard-controls').factory('FunctionsService', FunctionsService);\n\n    function FunctionsService($i18next, i18next, lodash, ConfigService) {\n        return {\n            checkedItem: '',\n            getClassesList: getClassesList,\n            getHandler: getHandler,\n            initFunctionActions: initFunctionActions,\n            initVersionActions: initVersionActions\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Returns classes list by type.\n         * @param {string} type - Determines which class list to return (e.g. `'volume'`, `'trigger'`).\n         * @param {Object} [additionalData] - May include additional data for populating the list.\n         * @returns {Object[]} - array of classes\n         */\n        function getClassesList(type, additionalData) {\n            var lng = i18next.language;\n            var defaultFunctionConfig = lodash.get(ConfigService, 'nuclio.defaultFunctionConfig.attributes', {});\n            var platformKindIsKube = lodash.get(ConfigService, 'nuclio.platformKind') === 'kube';\n            var classesList = {\n                trigger: [{\n                    id: 'kafka-cluster',\n                    name: 'Kafka',\n                    tooltip: 'Kafka',\n                    tooltipOriginal: 'Kafka',\n                    tooltipPlacement: 'right',\n                    fields: [{\n                        name: 'kafka-topics',\n                        path: 'attributes.topics',\n                        values: {\n                            topic: {\n                                name: 'topic',\n                                type: 'input'\n                            }\n                        }\n                    }, {\n                        name: 'kafka-brokers',\n                        path: 'attributes.brokers',\n                        values: {\n                            topic: {\n                                name: 'brokers',\n                                type: 'input'\n                            }\n                        }\n                    }, {\n                        name: 'saslUsername',\n                        label: $i18next.t('functions:SASL_USERNAME', { lng: lng }),\n                        type: 'input',\n                        path: 'attributes.sasl.user',\n                        allowEmpty: true,\n                        defaultValue: ''\n                    }, {\n                        name: 'saslPassword',\n                        label: $i18next.t('functions:SASL_PASSWORD', { lng: lng }),\n                        type: 'input',\n                        fieldType: 'password',\n                        path: 'attributes.sasl.password',\n                        allowEmpty: true,\n                        defaultValue: '',\n                        autocomplete: 'new-password'\n                    }, {\n                        name: 'consumerGroup',\n                        label: $i18next.t('functions:CONSUMER_GROUP_NAME', { lng: lng }),\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.consumerGroup',\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_CONSUMER_GROUP_NAME', { lng: lng }),\n                        allowEmpty: false\n                    }, {\n                        name: 'initialOffset',\n                        values: [{\n                            id: 'earliest',\n                            name: 'Earliest',\n                            visible: true\n                        }, {\n                            id: 'latest',\n                            name: 'Latest',\n                            visible: true\n                        }],\n                        defaultValue: 'latest',\n                        path: 'attributes.initialOffset',\n                        type: 'dropdown'\n                    }, {\n                        name: 'workerAllocationMode',\n                        values: [{\n                            id: 'pool',\n                            name: 'Pool',\n                            visible: true\n                        }, {\n                            id: 'static',\n                            name: 'Static',\n                            visible: true\n                        }],\n                        defaultValue: 'pool',\n                        path: 'attributes.workerAllocationMode',\n                        type: 'dropdown'\n                    }, {\n                        name: 'maxWorkers',\n                        type: 'number-input',\n                        allowEmpty: true,\n                        min: 1,\n                        max: 100000,\n                        defaultValue: 1\n                    }, {\n                        name: 'sessionTimeout',\n                        pattern: 'interval',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.sessionTimeout',\n                        allowEmpty: true,\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_DURATION', { lng: lng }),\n                        defaultValue: '10s'\n                    }, {\n                        name: 'heartbeatInterval',\n                        pattern: 'interval',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.heartbeatInterval',\n                        allowEmpty: true,\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_DURATION', { lng: lng }),\n                        defaultValue: '3s'\n                    }, {\n                        name: 'fetchDefault',\n                        label: $i18next.t('functions:BYTES_TO_FETCH_DEFAULT', { lng: lng }),\n                        type: 'number-input',\n                        path: 'attributes.fetchDefault',\n                        allowEmpty: true,\n                        unit: $i18next.t('common:BYTES', { lng: lng }),\n                        min: 1,\n                        max: 67108864, // 64 * 1024 * 1024 bytes = 64 MiB\n                        defaultValue: 1048576\n                    }, {\n                        name: 'rebalanceTimeout',\n                        label: $i18next.t('functions:REBALANCE_TIMEOUT', { lng: lng }),\n                        pattern: 'interval',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.rebalanceTimeout',\n                        allowEmpty: true,\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_DURATION', { lng: lng }),\n                        defaultValue: '60s'\n                    }, {\n                        name: 'maxWaitHandlerDuringRebalance',\n                        label: $i18next.t('functions:REBALANCING_GRACE_PERIOD', { lng: lng }),\n                        pattern: 'interval',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.maxWaitHandlerDuringRebalance',\n                        allowEmpty: true,\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_DURATION', { lng: lng }),\n                        defaultValue: '5s'\n                    }, {\n                        name: 'workerAllocatorName',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: true\n                    }]\n                }, {\n                    id: 'rabbit-mq',\n                    name: 'RabbitMQ',\n                    tooltip: 'RabbitMQ',\n                    tooltipOriginal: 'RabbitMQ',\n                    tooltipPlacement: 'right',\n                    fields: [{\n                        name: 'url',\n                        label: 'URL',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: false\n                    }, {\n                        name: 'exchangeName',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.exchangeName',\n                        allowEmpty: false\n                    }, {\n                        name: 'queueName',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.queueName',\n                        allowEmpty: true,\n                        placeholder: $i18next.t('functions:PLACEHOLDER.DEFAULT_PROVIDED_WHEN_EMPTY', { lng: lng })\n                    }, {\n                        name: 'topics',\n                        pattern: 'arrayStr',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.topics',\n                        allowEmpty: true,\n                        placeholder: $i18next.t('functions:PLACEHOLDER.REQUIRED_IF_QUEUE_NAME_IS_EMPTY', { lng: lng })\n                    }, {\n                        name: 'workerAllocatorName',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: true\n                    }]\n                }, {\n                    id: 'nats',\n                    name: 'NATS',\n                    tooltip: 'NATS',\n                    tooltipOriginal: 'NATS',\n                    tooltipPlacement: 'right',\n                    fields: [{\n                        name: 'url',\n                        label: 'URL',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: false\n                    }, {\n                        name: 'topic',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.topic',\n                        allowEmpty: false\n                    }, {\n                        name: 'queueName',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.queueName',\n                        allowEmpty: true\n                    }, {\n                        name: 'workerAllocatorName',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: true\n                    }]\n                }, {\n                    id: 'cron',\n                    name: 'Cron',\n                    tooltip: 'Cron',\n                    tooltipOriginal: 'Cron',\n                    tooltipPlacement: 'right',\n                    fields: [{\n                        name: 'maxWorkers',\n                        type: 'number-input',\n                        allowEmpty: true,\n                        min: 1,\n                        max: 100000,\n                        defaultValue: 1,\n                        visible: !platformKindIsKube\n                    }, {\n                        name: 'workerAvailabilityTimeoutMilliseconds',\n                        type: 'number-input',\n                        allowEmpty: true,\n                        min: 1,\n                        placeholder: $i18next.t('common:DEFAULT', { lng: lng }),\n                        moreInfoDescription: $i18next.t('functions:WORKER_AVAILABILITY_TIMEOUT_MILLISECONDS_DESCRIPTION', {\n                            lng: lng,\n                            default: lodash.get(defaultFunctionConfig, 'spec.triggers.cron.workerAvailabilityTimeoutMilliseconds', '')\n                        }),\n                        visible: !platformKindIsKube\n                    }, {\n                        name: 'interval',\n                        pattern: 'cronInterval',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.interval',\n                        allowEmpty: true,\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_DURATION', { lng: lng })\n                    }, {\n                        name: 'schedule',\n                        moreInfoDescription: $i18next.t('functions:TOOLTIP.INTERVAL_SCHEDULE_ONLY_ONE', { lng: lng }),\n                        moreInfoIconType: 'info',\n                        moreInfoOpen: false,\n                        type: 'input',\n                        fieldType: 'schedule',\n                        path: 'attributes.schedule',\n                        allowEmpty: false\n                    }, {\n                        name: 'eventBody',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.event.body',\n                        allowEmpty: true\n                    }, {\n                        name: 'eventHeaders',\n                        defaultValue: {}\n                    }, {\n                        name: 'workerAllocatorName',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: true,\n                        visible: !platformKindIsKube\n                    }]\n                }, {\n                    id: 'eventhub',\n                    name: 'Azure Event Hubs',\n                    tooltip: 'Azure Event Hubs',\n                    tooltipOriginal: 'Azure Event Hubs',\n                    tooltipPlacement: 'right',\n                    fields: [{\n                        name: 'sharedAccessKeyName',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.sharedAccessKeyName',\n                        allowEmpty: false\n                    }, {\n                        name: 'sharedAccessKeyValue',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.sharedAccessKeyValue',\n                        allowEmpty: false\n                    }, {\n                        name: 'namespace',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.namespace',\n                        allowEmpty: false\n                    }, {\n                        name: 'eventHubName',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.eventHubName',\n                        allowEmpty: false\n                    }, {\n                        name: 'consumerGroup',\n                        label: $i18next.t('functions:CONSUMER_GROUP_NAME', { lng: lng }),\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.consumerGroup',\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_CONSUMER_GROUP_NAME', { lng: lng }),\n                        allowEmpty: false\n                    }, {\n                        name: 'partitions',\n                        type: 'arrayInt',\n                        path: 'attributes.partitions',\n                        placeholder: $i18next.t('common:PLACEHOLDER.COMMA_DELIMITED_LIST_OF_NUMBERS', { lng: lng }),\n                        allowEmpty: false\n                    }, {\n                        name: 'workerAllocatorName',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: true\n                    }]\n                }, {\n                    id: 'http',\n                    name: 'HTTP',\n                    tooltip: 'HTTP',\n                    tooltipOriginal: 'HTTP',\n                    tooltipPlacement: 'right',\n                    fields: [{\n                        name: 'maxWorkers',\n                        type: 'number-input',\n                        allowEmpty: true,\n                        min: 1,\n                        max: 100000,\n                        defaultValue: 1\n                    }, {\n                        name: 'workerAvailabilityTimeoutMilliseconds',\n                        type: 'number-input',\n                        allowEmpty: true,\n                        min: 1,\n                        placeholder: $i18next.t('common:DEFAULT', { lng: lng }),\n                        moreInfoDescription: $i18next.t('functions:WORKER_AVAILABILITY_TIMEOUT_MILLISECONDS_DESCRIPTION', {\n                            lng: lng,\n                            default: lodash.get(defaultFunctionConfig, 'spec.triggers.http.workerAvailabilityTimeoutMilliseconds', '')\n                        })\n                    }, {\n                        name: 'port',\n                        pattern: 'number',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.port',\n                        allowEmpty: true\n                    }, {\n                        name: 'ingresses',\n                        type: 'key-value',\n                        path: 'attributes.ingresses'\n                    }, {\n                        name: 'workerAllocatorName',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: true\n                    }, {\n                        name: 'annotations',\n                        type: 'key-value'\n                    }]\n                }, {\n                    id: 'v3ioStream',\n                    name: 'V3IO stream',\n                    tooltip: 'V3IO stream',\n                    tooltipOriginal: 'V3IO stream',\n                    tooltipPlacement: 'right',\n                    fields: [{\n                        name: 'containerName',\n                        type: 'dropdown',\n                        enableTyping: true,\n                        path: 'attributes.containerName',\n                        values: lodash.get(additionalData, 'containers', []),\n                        defaultValue: lodash.get(additionalData, 'containers[0].id', ''),\n                        placeholder: $i18next.t('common:PLACEHOLDER.SELECT_OR_ENTER', { lng: lng }),\n                        moreInfoDescription: $i18next.t('functions:TOOLTIP.V3IO_STREAM_CONTAINER', { lng: lng }),\n                        moreInfoHtml: true,\n                        allowEmpty: false\n                    }, {\n                        name: 'url',\n                        label: $i18next.t('common:URL', { lng: lng }),\n                        type: 'input',\n                        fieldType: 'input',\n                        defaultValue: lodash.get(ConfigService, 'nuclio.defaultFunctionConfig.attributes.spec.triggers.v3ioStream.url', ''),\n                        placeholder: $i18next.t('common:PLACEHOLDER.ENTER_URL', { lng: lng }),\n                        moreInfoDescription: $i18next.t('functions:TOOLTIP.V3IO_STREAM_URL', { lng: lng }),\n                        moreInfoHtml: true,\n                        allowEmpty: false\n                    }, {\n                        name: 'password',\n                        label: $i18next.t('functions:ACCESS_KEY', { lng: lng }),\n                        type: 'input',\n                        fieldType: 'password',\n                        path: 'password',\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_ACCESS_KEY', { lng: lng }),\n                        allowEmpty: false,\n                        autocomplete: 'new-password'\n                    }, {\n                        name: 'streamPath',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.streamPath',\n                        allowEmpty: false\n                    }, {\n                        name: 'consumerGroup',\n                        label: $i18next.t('functions:CONSUMER_GROUP_NAME', { lng: lng }),\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.consumerGroup',\n                        pattern: 'v3ioConsumerGroupName',\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_CONSUMER_GROUP_NAME', { lng: lng }),\n                        allowEmpty: false\n                    }, {\n                        name: 'seekTo',\n                        label: $i18next.t('functions:INITIAL_OFFSET', { lng: lng }),\n                        values: [{\n                            id: 'earliest',\n                            name: 'Earliest',\n                            visible: true\n                        }, {\n                            id: 'latest',\n                            name: 'Latest',\n                            visible: true\n                        }],\n                        defaultValue: 'latest',\n                        path: 'attributes.seekTo',\n                        type: 'dropdown'\n                    }, {\n                        name: 'workerAllocationMode',\n                        values: [{\n                            id: 'pool',\n                            name: 'Pool',\n                            visible: true\n                        }, {\n                            id: 'static',\n                            name: 'Static',\n                            visible: true\n                        }],\n                        defaultValue: 'pool',\n                        path: 'attributes.workerAllocationMode',\n                        type: 'dropdown'\n                    }, {\n                        name: 'maxWorkers',\n                        type: 'number-input',\n                        allowEmpty: true,\n                        min: 1,\n                        max: 100000,\n                        defaultValue: 1\n                    }, {\n                        name: 'readBatchSize',\n                        type: 'number-input',\n                        path: 'attributes.readBatchSize',\n                        allowEmpty: true,\n                        unit: $i18next.t('common:BYTES', { lng: lng }),\n                        min: 1,\n                        max: 16384, // 16 * 1024 = 16 KiB\n                        defaultValue: 64\n                    }, {\n                        name: 'pollingIntervalMs',\n                        label: $i18next.t('functions:POLLING_INTERVAL', { lng: lng }),\n                        unit: 'ms',\n                        type: 'number-input',\n                        path: 'attributes.pollingIntervalMs',\n                        allowEmpty: true,\n                        defaultValue: 500\n                    }, {\n                        name: 'sessionTimeout',\n                        pattern: 'interval',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.sessionTimeout',\n                        allowEmpty: true,\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_DURATION', { lng: lng }),\n                        defaultValue: '10s'\n                    }, {\n                        name: 'heartbeatInterval',\n                        pattern: 'interval',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.heartbeatInterval',\n                        allowEmpty: true,\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_DURATION', { lng: lng }),\n                        defaultValue: '3s'\n                    }, {\n                        name: 'sequenceNumberCommitInterval',\n                        pattern: 'interval',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.sequenceNumberCommitInterval',\n                        allowEmpty: true,\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_DURATION', { lng: lng }),\n                        defaultValue: '1s'\n                    }, {\n                        name: 'workerAllocatorName',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: true\n                    }]\n                }, {\n                    id: 'kinesis',\n                    name: 'Kinesis',\n                    tooltip: 'Kinesis',\n                    tooltipOriginal: 'Kinesis',\n                    tooltipPlacement: 'right',\n                    fields: [{\n                        name: 'accessKeyID',\n                        label: $i18next.t('functions:ACCESS_KEY_ID', { lng: lng }),\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.accessKeyID',\n                        placeholder: $i18next.t('functions:PLACEHOLDER.ENTER_ACCESS_KEY_ID', { lng: lng }),\n                        allowEmpty: false\n                    }, {\n                        name: 'secretAccessKey',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.secretAccessKey',\n                        allowEmpty: false\n                    }, {\n                        name: 'regionName',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.regionName',\n                        allowEmpty: false\n                    }, {\n                        name: 'streamName',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.streamName',\n                        allowEmpty: false\n                    }, {\n                        name: 'shards',\n                        pattern: 'arrayStr',\n                        type: 'input',\n                        fieldType: 'input',\n                        path: 'attributes.shards',\n                        placeholder: $i18next.t('common:PLACEHOLDER.COMMA_DELIMITED_LIST_OF_STRINGS', { lng: lng }),\n                        allowEmpty: false\n                    }, {\n                        name: 'workerAllocatorName',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: true\n                    }]\n                }, {\n                    id: 'mqtt',\n                    name: 'MQTT',\n                    tooltip: 'MQTT',\n                    tooltipOriginal: 'MQTT',\n                    tooltipPlacement: 'right',\n                    fields: [{\n                        name: 'url',\n                        label: 'URL',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: false\n                    }, {\n                        name: 'username',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: true\n                    }, {\n                        name: 'password',\n                        type: 'input',\n                        fieldType: 'password',\n                        allowEmpty: true,\n                        autocomplete: 'new-password'\n                    }, {\n                        name: 'subscriptions',\n                        values: {\n                            topic: {\n                                name: 'topic',\n                                type: 'input'\n                            },\n                            qos: {\n                                name: 'QoS',\n                                type: 'input',\n                                pattern: 'number'\n                            }\n                        }\n                    }, {\n                        name: 'workerAllocatorName',\n                        type: 'input',\n                        fieldType: 'input',\n                        allowEmpty: true\n                    }]\n                }],\n                volume: [{\n                    id: 'v3io',\n                    name: 'V3IO',\n                    tooltip: $i18next.t('functions:TOOLTIP.V3IO', { lng: lng }),\n                    moreInfoDescription: $i18next.t('functions:TOOLTIP.V3IO', { lng: lng })\n                }, {\n                    id: 'secret',\n                    name: 'Secret',\n                    tooltip: $i18next.t('functions:TOOLTIP.SECRET.HEAD', { lng: lng }) + ' ' + $i18next.t('functions:TOOLTIP.SECRET.REST', { lng: lng }),\n                    moreInfoDescription: 'A <a class=\"link\" target=\"_blank\" ' + 'href=\"https://kubernetes.io/docs/concepts/configuration/secret/\">' + $i18next.t('functions:TOOLTIP.SECRET.HEAD', { lng: lng }) + '</a> ' + $i18next.t('functions:TOOLTIP.SECRET.REST', { lng: lng })\n                }, {\n                    id: 'configMap',\n                    name: 'ConfigMap',\n                    tooltip: $i18next.t('functions:TOOLTIP.CONFIG_MAP.HEAD', { lng: lng }) + ' ' + $i18next.t('functions:TOOLTIP.CONFIG_MAP.REST', { lng: lng }),\n                    moreInfoDescription: 'A <a class=\"link\" target=\"_blank\" ' + 'href=\"https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/\">' + $i18next.t('functions:TOOLTIP.CONFIG_MAP.HEAD', { lng: lng }) + '</a> ' + $i18next.t('functions:TOOLTIP.CONFIG_MAP.REST', { lng: lng })\n                }, {\n                    id: 'persistentVolumeClaim',\n                    name: 'PVC'\n                }]\n            };\n\n            return classesList[type];\n        }\n\n        /**\n         * Returns the appropriate handler regarding runtime\n         * @param {string} runtime\n         * @returns {string} handler\n         */\n        function getHandler(runtime) {\n            var handlers = {\n                'golang': 'main:Handler',\n                'java': 'Handler',\n                'shell': 'main.sh'\n            };\n\n            return lodash.get(handlers, runtime, 'main:handler');\n        }\n\n        /**\n         * Function actions\n         * @returns {Object[]} - array of actions\n         */\n        function initFunctionActions() {\n            var lng = i18next.language;\n\n            return [{\n                label: $i18next.t('common:DELETE', { lng: lng }),\n                id: 'delete',\n                icon: 'igz-icon-trash',\n                active: true,\n                confirm: {}\n            }, {\n                label: $i18next.t('common:DUPLICATE', { lng: lng }),\n                id: 'duplicate',\n                icon: 'igz-icon-duplicate',\n                active: true\n            }, {\n                label: $i18next.t('common:EXPORT', { lng: lng }),\n                id: 'export',\n                icon: 'igz-icon-export-yml',\n                active: true\n            }, {\n                label: $i18next.t('functions:VIEW_YAML', { lng: lng }),\n                id: 'viewConfig',\n                icon: 'igz-icon-view-file',\n                active: true\n            }];\n        }\n\n        /**\n         * Version actions\n         * @returns {Object[]} - array of actions\n         */\n        function initVersionActions() {\n            var lng = i18next.language;\n\n            return [{\n                label: $i18next.t('common:EDIT', { lng: lng }),\n                id: 'edit',\n                icon: 'igz-icon-edit',\n                active: true\n            }, {\n                label: $i18next.t('common:DELETE', { lng: lng }),\n                id: 'delete',\n                icon: 'igz-icon-trash',\n                active: true,\n                confirm: {\n                    message: $i18next.t('functions:DELETE_VERSIONS_CONFIRM', { lng: lng }),\n                    yesLabel: $i18next.t('common:YES_DELETE', { lng: lng }),\n                    noLabel: $i18next.t('common:CANCEL', { lng: lng }),\n                    type: 'nuclio_alert'\n                }\n            }];\n        }\n    }\n})();\n'use strict';\n\n/* eslint-disable */\n\n(function () {\n    'use strict';\n\n    ConverterService.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').factory('ConverterService', ConverterService);\n\n    function ConverterService(lodash) {\n        return {\n            getConvertedBytes: getConvertedBytes,\n            fromNumberArray: fromNumberArray,\n            toNumberArray: toNumberArray,\n            toStringArray: toStringArray\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Method converts bytes into appropriate value\n         * @param {number} bytes - number of bytes\n         * @param {Array} [unit] - units\n         * @returns {Object} object witch contains converted value, label for converted value and pow number\n         */\n        function getConvertedBytes(bytes, unit) {\n            if (bytes === 0 || !angular.isNumber(bytes) || !isFinite(bytes)) {\n                if (angular.isDefined(unit)) {\n                    return {\n                        value: 0,\n                        label: lodash.first(unit),\n                        pow: 0\n                    };\n                }\n\n                return {\n                    value: 1025,\n                    label: angular.isDefined(unit) ? lodash.last(unit) : 'GB/s',\n                    pow: 3\n                };\n            }\n\n            var units = lodash.defaultTo(unit, ['bytes', 'KB/s', 'MB/s', 'GB/s']);\n            var number = Math.floor(Math.log(bytes) / Math.log(1024));\n\n            // max available value is 1024 GB/s\n            if (number > 3) {\n                number = 3;\n                bytes = Math.pow(1024, Math.floor(number + 1));\n            }\n\n            return { value: Math.round(bytes / Math.pow(1024, Math.floor(number))), label: units[number], pow: number };\n        }\n\n        /**\n         * Converts an array of `Number`s to a comma-delimited string of numbers and number ranges (X-Y).\n         * @param {Array.<Number>} array - A list of natural numbers.\n         * @returns {string} a comma-delimited string of numbers and number ranges representing `array`.\n         * @example\n         * fromNumberArray([1, 2, 3, 4, 7, 9, 10, 12]);\n         * // => '1-4,7,9-10,12'\n         *\n         * fromNumberArray([3, 5, 7]);\n         * // => '3,5,7'\n         *\n         * fromNumberArray([5, 6, 7, 8, 9, 10, 11]);\n         * // => '5-11'\n         */\n        function fromNumberArray(array) {\n            var sorted = lodash.sortBy(lodash.uniq(array));\n            var result = [];\n            var start = 0;\n\n            while (start < sorted.length) {\n                var range = lodash.takeWhile(sorted.slice(start), function (value, index, collection) {\n                    return index === 0 || value - collection[index - 1] === 1;\n                });\n                result.push(lodash.head(range) + (range.length > 1 ? '-' + lodash.last(range) : ''));\n                start += range.length;\n            }\n\n            return result.join(',');\n        }\n\n        /**\n         * Converts a comma-delimited string of numbers and number ranges (X-Y) to an array of `Number`s\n         * @param {string} ranges - a comma-separated string (might pad commas with spaces) consisting of either\n         *     a single number, or two numbers with a hyphen between them, where the smaller number comes first\n         *     (ranges where the first number is smaller than the second number will be ignored)\n         * @returns {Array.<number>} an array of numbers representing all the numbers referenced in `ranges` param\n         **/\n        function toNumberArray(ranges) {\n            return lodash.chain(ranges).replace(/\\s+/g, '') // get rid of all white-space characters\n            .trim(',') // get rid of leading and trailing commas\n            .split(',') // get an array of strings, for each string that is between two comma delimiters\n            .map(function (range) {\n                // for each string - convert it to a number or an array of numbers\n                // if it is a sequence of digits - convert it to a `Number` value and return it\n                if (/^\\d+$/g.test(range)) {\n                    return Number(range);\n                }\n\n                // otherwise, attempt to parse it as a range of numbers (two sequences of digits delimited by a\n                // single hyphen)\n                var matches = range.match(/^(\\d+)-(\\d+)$/);\n\n                // attempt to convert both sequences of digits to `Number` values\n                var start = Number(lodash.get(matches, '[1]'));\n                var end = Number(lodash.get(matches, '[2]'));\n\n                // if any attempt above fails - return `null` to indicate a value that needs to be ignored later\n                // otherwise, return a range of `Number`s represented by that range\n                // (e.g. `'1-3'` is `[1, 2, 3]`)\n                return Number.isNaN(start) || Number.isNaN(end) || start > end ? null : lodash.range(start, end + 1);\n            }).flatten() // make a single flat array (e.g. `[1, [2, 3], 4, [5, 6]]` to `[1, 2, 3, 4, 5, 6]`)\n            .without(false, null, '', undefined, NaN) // get rid of `null` values (e.g. `[null, 1, null, 2, 3, null]` to `[1, 2, 3]`)\n            .uniq() // get rid of duplicate values (e.g. `[1, 2, 2, 3, 4, 4, 5]` to `[1, 2, 3, 4, 5]`)\n            .sortBy() // sort the list in ascending order (e.g. `[4, 1, 5, 3, 2, 6]` to`[1, 2, 3, 4, 5, 6]`)\n            .value();\n        }\n\n        /**\n         * Converts a `string` consisting of a comma-delimited list into an array of strings (whitespace is trimmed).\n         * If `value` is not a `string`, it will be returned as-is.\n         * @param {string|*} value - the string to convert.\n         * @returns {Array.<string>|*} an array of strings representing the comma-delimited list in `value`, or `value`\n         *     as-is if it is not a `string`.\n         * @example\n         * toStringArray('  foo,bar   ,  baz,  waz  ,bla  ');\n         * // => ['foo', 'bar', 'baz', 'waz', 'bla']\n         *\n         * toStringArray('  ,  ');\n         * // => []\n         *\n         * toStringArray('    ');\n         * // => []\n         *\n         * toStringArray('');\n         * // => []\n         *\n         * toStringArray(123);\n         * // => 123\n         *\n         * toStringArray(false);\n         * // => false\n         *\n         * toStringArray({ foo: 'bar' });\n         * // => { foo: 'bar' }\n         *\n         * toStringArray([123, 456]);\n         * // => [123, 456]\n         *\n         * toStringArray(/abc/g);\n         * // => abc/g\n         *\n         * toStringArray(null);\n         * // => null\n         *\n         * toStringArray(undefined);\n         * // => undefined\n         */\n        function toStringArray(value) {\n            return lodash.isString(value) ? lodash.without(value.trim().split(/\\s*,\\s*/), '') : value;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    ExportService.$inject = ['$i18next', '$q', '$timeout', '$window', 'i18next', 'lodash', 'YAML', 'DialogsService'];\n    angular.module('iguazio.dashboard-controls').factory('ExportService', ExportService);\n\n    function ExportService($i18next, $q, $timeout, $window, i18next, lodash, YAML, DialogsService) {\n        return {\n            exportFunction: exportFunction,\n            getFunctionConfig: getFunctionConfig,\n            exportProject: exportProject,\n            exportProjects: exportProjects\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Exports the function\n         * @param {Object} version\n         */\n        function exportFunction(version) {\n            var functionToExport = prepareFunctionData(version);\n            var blob = prepareBlobObject(functionToExport);\n\n            downloadExportedFunction(blob, version.metadata.name);\n        }\n\n        /**\n         * Returns function config\n         * @param {Object} version\n         * @returns {string} YAML object\n         */\n        function getFunctionConfig(version) {\n            var functionConfig = prepareFunctionData(version);\n\n            return prepareYamlObject(functionConfig);\n        }\n\n        /**\n         * Exports the project\n         * @param {Object} project\n         * @param {Function} getFunctions\n         */\n        function exportProject(project, getFunctions) {\n            getFunctions(project.metadata.name).then(function (functions) {\n                var functionsList = lodash.map(functions, function (functionItem) {\n                    return lodash.chain(functionItem).set('spec.version', 1).omit(['status', 'metadata.namespace']).value();\n                });\n\n                var projectToExport = {\n                    project: {\n                        metadata: {\n                            name: lodash.defaultTo(project.spec.displayName, project.metadata.name)\n                        },\n                        spec: {\n                            functions: functionsList\n                        }\n                    }\n                };\n\n                var blob = prepareBlobObject(projectToExport);\n\n                downloadExportedFunction(blob, lodash.defaultTo(project.spec.displayName, project.metadata.name));\n            }).catch(function (error) {\n                var defaultMsg = $i18next.t('functions:ERROR_MSG.EXPORT_PROJECT', { lng: i18next.language });\n\n                DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n            });\n        }\n\n        /**\n         * Exports projects\n         * @param {Object} projects\n         * @param {Function} getFunctions\n         */\n        function exportProjects(projects, getFunctions) {\n            var promises = lodash.map(projects, function (project) {\n                return getFunctions(project.metadata.name).then(function (functions) {\n                    return lodash.map(functions, function (functionItem) {\n                        return lodash.chain(functionItem).set('spec.version', 1).omit(['status', 'metadata.namespace']).value();\n                    });\n                }).catch(angular.noop).then(function (functionsList) {\n                    return {\n                        metadata: {\n                            name: lodash.defaultTo(project.spec.displayName, project.metadata.name)\n                        },\n                        spec: {\n                            functions: lodash.defaultTo(functionsList, [])\n                        }\n                    };\n                });\n            });\n\n            $q.all(promises).then(function (projectsToExport) {\n                var blob = prepareBlobObject({\n                    projects: lodash.compact(projectsToExport)\n                });\n\n                downloadExportedFunction(blob, 'projects');\n            }).catch(function (error) {\n                var defaultMsg = $i18next.t('functions:ERROR_MSG.EXPORT_PROJECTS', { lng: i18next.language });\n\n                DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n            });\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Creates artificial link and starts downloading of exported function.\n         * Downloaded .yaml file will be saved in user's default folder for downloads.\n         * @param {Blob} data - exported function config parsed to YAML\n         * @param {string} fileName - name of the file\n         */\n        function downloadExportedFunction(data, fileName) {\n            var url = $window.URL.createObjectURL(data);\n            var link = document.createElement('a');\n\n            link.href = url;\n            link.download = fileName + '.yaml';\n            document.body.appendChild(link);\n\n            $timeout(function () {\n                link.click();\n                document.body.removeChild(link);\n                $window.URL.revokeObjectURL(url);\n            });\n        }\n\n        /**\n         * Returns valid YAML string.\n         * First RegExp deletes all excess lines in YAML string created by issue in yaml.js package.\n         * It is necessary to generate valid YAML.\n         * Example:\n         * -\n         *   name: name\n         *   value: value\n         * -\n         *   name: name\n         *   value: value\n         * Will transform in:\n         * - name: name\n         *   value: value\n         * - name: name\n         *   value: value\n         * Second and Third RegExp replaces all double quotes with single quotes outside the value.\n         * Example:\n         * 'key': \"\" -> 'key': ''\n         * 'key': \"some \"string\" value\" -> 'key': 'some \"string\" value'\n         * Fourth RegExp transform all double quotes to escaped double quotes inside the value.\n         * Example:\n         * 'key': 'some \"string\" value' -> 'key': 'some \\\"string\\\" value'\n         * Fifth, Sixth and Seventh replaces all single quotes with double quotes outside the value.\n         * Example:\n         * 'key': 'value' -> \"key\": \"value\"\n         * Eighth RegExp replaces all pairs of single quotes with one single quote.\n         * It needs because property name or property value is a string which contains single quote\n         * will parsed by yaml.js package in string with pair of single quotes.\n         * Example:\n         * \"ke'y\": \"val'ue\"\n         * After will parse will be -> \"ke''y\": \"val''ue\"\n         * This RegExp will transform it to normal view -> \"ke'y\": \"val'ue\"\n         * @param {string} data - incoming YAML-string\n         * @returns {string}\n         */\n        function getValidYaml(data) {\n            function replacer(match, captureGroup1, captureGroup2) {\n                return captureGroup1 + captureGroup2.replace(/\"/g, '\\\\\"');\n            }\n\n            return data.replace(/(\\s+-)\\s*\\n\\s+/g, '$1 ').replace(/(:\\s)\"(.+)\"/g, '$1\\'$2\\'').replace(/(:\\s)\"{2}/g, '$1\\'\\'').replace(/([^\\\\\"])(\"+)/g, replacer).replace(/'(.+)'(:)/g, '\"$1\"$2').replace(/(:\\s)'(.+)'/g, '$1\"$2\"').replace(/(:\\s)'{2}/g, '$1\"\"').replace(/'{2}/g, '\\'');\n        }\n\n        /**\n         * Prepare function data\n         * @param {Object} version\n         * @returns {Object} data for export\n         */\n        function prepareFunctionData(version) {\n            var versionCopy = angular.copy(version);\n\n            if (lodash.has(versionCopy, 'spec.build.commands')) {\n                lodash.forEach(versionCopy.spec.build.commands, function (command, index) {\n                    versionCopy.spec.build.commands[index] = command.replace(/'/g, '\\'\\'');\n                });\n            }\n\n            // using `angular.fromJson` & `angular.toJson` to easily get rid of `$$hashKey` property in all levels\n            return angular.fromJson(angular.toJson({\n                metadata: lodash.omit(versionCopy.metadata, 'namespace'),\n                spec: lodash.omit(versionCopy.spec, 'build.noBaseImagesPull')\n            }));\n        }\n\n        /**\n         * Prepare YAML object\n         * @param {Object} objectToParse\n         * @returns {string} YAML object\n         */\n        function prepareYamlObject(objectToParse) {\n            var parsedObject = YAML.stringify(objectToParse, Infinity, 2);\n\n            return getValidYaml(parsedObject);\n        }\n        /**\n         * Prepare blob object for downloading\n         * @param {Object} objectToParse\n         * @returns {Blob} Blob object\n         */\n        function prepareBlobObject(objectToParse) {\n            var parsedObject = prepareYamlObject(objectToParse);\n\n            return new Blob([parsedObject], {\n                type: 'application/json'\n            });\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NuclioHeaderService.$inject = ['$rootScope', '$state', 'lodash'];\n    angular.module('iguazio.dashboard-controls').factory('NuclioHeaderService', NuclioHeaderService);\n\n    function NuclioHeaderService($rootScope, $state, lodash) {\n        return {\n            updateMainHeader: updateMainHeader\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Sends broadcast with needed data object to dynamically update main header title\n         * @param {string} title\n         * @param {string} subtitles\n         * @param {string} state\n         */\n        function updateMainHeader(title, subtitles, state) {\n            var mainHeaderState = lodash.find($state.get(), function (mainState) {\n                return mainState.url === lodash.trim($state.$current.url.prefix, '/');\n            }).name;\n\n            var mainHeaderTitle = {\n                title: title,\n                project: subtitles.project,\n                function: lodash.defaultTo(subtitles.function, null),\n                version: lodash.defaultTo(subtitles.version, null),\n                tab: lodash.defaultTo(subtitles.tab, null),\n                state: state,\n                mainHeaderState: mainHeaderState\n            };\n\n            $rootScope.$broadcast('update-main-header-title', mainHeaderTitle);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    VersionHelperService.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').factory('VersionHelperService', VersionHelperService);\n\n    function VersionHelperService(lodash) {\n        return {\n            isVersionDeployed: isVersionDeployed,\n            updateIsVersionChanged: updateIsVersionChanged\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Tests whether the version is deployed.\n         * @param {Object} version\n         * @returns {boolean} `true` in case version is deployed, or `false` otherwise.\n         */\n        function isVersionDeployed(version) {\n            var state = lodash.get(version, 'status.state', '');\n            return !lodash.isEmpty(state);\n        }\n\n        /**\n         * Updates \"version changed\" indicator of `version`. Sets it to `true` in case working version differs from\n         * deployed one, or `false` otherwise.\n         * @param {Object} version - the working function's version.\n         * @param {Object} version.ui.deployedVersion - latest deployed function's version.\n         */\n        function updateIsVersionChanged(version) {\n            var working = cloneObject(lodash.omit(version, 'ui'));\n            var deployed = cloneObject(lodash.omit(version.ui.deployedVersion, 'ui'));\n            version.ui.versionChanged = !lodash.isEqual(working, deployed);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Creates objects copy\n         * Recursively copies all properties which are not empty objects or empty strings\n         * as they are not needed for comparison\n         * @param {Object} obj - an object which must be copied\n         * @returns {Object} newObj - copy of obj without empty objects and strings\n         */\n        function cloneObject(obj) {\n\n            // omits all empty values\n            var newObj = lodash.omitBy(obj, function (value) {\n                return lodash.isObject(value) || lodash.isString(value) ? lodash.isEmpty(value) : false;\n            });\n\n            lodash.forOwn(newObj, function (value, key) {\n\n                // recursively copies nested objects\n                if (lodash.isObject(value)) {\n                    newObj[key] = cloneObject(value);\n                }\n            });\n\n            return newObj;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    DuplicateFunctionDialogController.$inject = ['$state', '$i18next', 'i18next', 'lodash', 'DialogsService', 'EventHelperService', 'FormValidationService', 'ValidationService'];\n    angular.module('iguazio.dashboard-controls').component('nclDuplicateFunctionDialog', {\n        bindings: {\n            closeDialog: '&',\n            getFunctions: '&',\n            getFunction: '&',\n            project: '<',\n            version: '<'\n        },\n        templateUrl: 'nuclio/functions/duplicate-function-dialog/duplicate-function-dialog.tpl.html',\n        controller: DuplicateFunctionDialogController\n    });\n\n    function DuplicateFunctionDialogController($state, $i18next, i18next, lodash, DialogsService, EventHelperService, FormValidationService, ValidationService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.duplicateFunctionForm = {};\n        ctrl.inputModelOptions = {\n            debounce: {\n                'default': 0\n            }\n        };\n        ctrl.maxLengths = {\n            functionName: ValidationService.getMaxLength('function.name')\n        };\n        ctrl.nameTakenError = false;\n        ctrl.newFunctionName = '';\n        ctrl.validationRules = {\n            functionName: ValidationService.getValidationRules('function.name')\n        };\n\n        ctrl.duplicateFunction = duplicateFunction;\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.onClose = onClose;\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Duplicates selected function with a new name\n         * @param {Object} event\n         */\n        function duplicateFunction(event) {\n            if (angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) {\n                ctrl.nameTakenError = false;\n                ctrl.duplicateFunctionForm.$setSubmitted();\n\n                if (ctrl.duplicateFunctionForm.$valid) {\n                    var newFunction = lodash.pick(ctrl.version, 'spec');\n                    var projectID = lodash.get(ctrl.project, 'metadata.name');\n\n                    lodash.set(newFunction, 'metadata.name', ctrl.newFunctionName);\n\n                    ctrl.getFunction({ metadata: { name: ctrl.newFunctionName } }).then(function () {\n                        DialogsService.alert($i18next.t('functions:ERROR_MSG.FUNCTION_NAME_ALREADY_IN_USE', { lng: lng }));\n                    }).catch(function (error) {\n                        if (error.status === 404) {\n                            ctrl.closeDialog();\n\n                            $state.go('app.project.function.edit.code', {\n                                isNewFunction: true,\n                                id: ctrl.project.metadata.name,\n                                functionId: newFunction.metadata.name,\n                                projectId: projectID,\n                                projectNamespace: ctrl.project.metadata.namespace,\n                                functionData: newFunction\n                            });\n                        }\n                    });\n                }\n            }\n        }\n\n        /**\n         * Sets new data from input field as a name of the duplicated function\n         * @param {string} newData - new string value which should be set\n         */\n        function inputValueCallback(newData) {\n            ctrl.newFunctionName = newData;\n        }\n\n        /**\n         * Closes dialog\n         * @param {Event} [event]\n         */\n        function onClose(event) {\n            if (angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) {\n                ctrl.closeDialog();\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclFunctionCollapsingRowController.$inject = ['$interval', '$state', '$i18next', 'i18next', 'lodash', 'ngDialog', 'ActionCheckboxAllService', 'ConfigService', 'DialogsService', 'ExportService', 'FunctionsService', 'NuclioHeaderService', 'TableSizeService'];\n    angular.module('iguazio.dashboard-controls').component('nclFunctionCollapsingRow', {\n        bindings: {\n            actionHandlerCallback: '&',\n            function: '<',\n            functionsList: '<',\n            getFunction: '&',\n            getFunctions: '&',\n            handleDeleteFunction: '&',\n            isSplashShowed: '<',\n            project: '<',\n            refreshFunctionsList: '&',\n            updateFunction: '&'\n        },\n        templateUrl: 'nuclio/functions/function-collapsing-row/function-collapsing-row.tpl.html',\n        controller: NclFunctionCollapsingRowController\n    });\n\n    function NclFunctionCollapsingRowController($interval, $state, $i18next, i18next, lodash, ngDialog, ActionCheckboxAllService, ConfigService, DialogsService, ExportService, FunctionsService, NuclioHeaderService, TableSizeService) {\n        var ctrl = this;\n\n        var apiGateways = [];\n        var tempFunctionCopy = null;\n        var interval = null;\n        var lng = i18next.language;\n\n        ctrl.functionActions = [];\n        ctrl.functionNameTooltip = '';\n        ctrl.invocationUrl = {\n            text: '',\n            valid: false\n        };\n        ctrl.isFunctionCollapsed = true;\n        ctrl.runtimes = {\n            'golang': 'Go',\n            'python:2.7': 'Python 2.7',\n            'python:3.6': 'Python 3.6',\n            'dotnetcore': '.NET Core',\n            'java': 'Java',\n            'nodejs': 'NodeJS',\n            'shell': 'Shell',\n            'ruby': 'Ruby'\n        };\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                updateOnContentResize: true\n            }\n        };\n        ctrl.statusIcon = null;\n        ctrl.title = null;\n\n        ctrl.$onInit = onInit;\n        ctrl.$onDestroy = onDestroy;\n        ctrl.$onChanges = onChanges;\n\n        ctrl.getTooltip = getTooltip;\n        ctrl.handleAction = handleAction;\n        ctrl.isFunctionShowed = isFunctionShowed;\n        ctrl.onFireAction = onFireAction;\n        ctrl.onSelectRow = onSelectRow;\n        ctrl.toggleFunctionRow = toggleFunctionRow;\n        ctrl.toggleFunctionState = toggleFunctionState;\n\n        ctrl.functionsService = FunctionsService;\n        ctrl.getFunctionsTableColSize = TableSizeService.getFunctionsTableColSize;\n        ctrl.isDemoMode = ConfigService.isDemoMode;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.title = {\n                project: ctrl.project,\n                function: ctrl.function.metadata.name\n            };\n            ctrl.functionNameTooltip = '<b>' + ctrl.function.metadata.name + '</b>' + (ctrl.function.spec.description ? '<br><br>' + ctrl.function.spec.description : '');\n\n            lodash.defaultsDeep(ctrl.function, {\n                ui: {\n                    metrics: {\n                        count: null,\n                        'cpu.idle': null,\n                        size: null\n                    }\n                }\n            });\n\n            lodash.merge(ctrl.function, {\n                ui: {\n                    checked: false,\n                    delete: deleteFunction,\n                    duplicate: duplicateFunction,\n                    export: exportFunction,\n                    viewConfig: viewConfig\n                }\n            });\n\n            apiGateways = lodash.get(ctrl.function, 'status.apiGateways', []);\n\n            initFunctionActions();\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            terminateInterval();\n\n            if (lodash.get(ctrl.function, 'ui.checked')) {\n                lodash.set(ctrl.function, 'ui.checked', false);\n\n                ActionCheckboxAllService.changeCheckedItemsCount(-1);\n            }\n        }\n\n        /**\n         * On changes hook method\n         * @param {Object} changes\n         */\n        function onChanges(changes) {\n            var httpPort = lodash.get(ctrl.function, 'status.httpPort', 0);\n            if (lodash.has(changes, 'function')) {\n                var externalAddress = ConfigService.nuclio.externalIPAddress;\n\n                convertStatusState();\n                setStatusIcon();\n\n                ctrl.invocationUrl = {\n                    text: lodash.isEmpty(externalAddress) ? $i18next.t('common:N_A', { lng: lng }) : lodash.toFinite(httpPort) === 0 ? $i18next.t('functions:NOT_YET_DEPLOYED', { lng: lng }) : 'http://' + externalAddress + ':' + httpPort,\n                    valid: !lodash.isEmpty(externalAddress) && lodash.toFinite(httpPort) !== 0\n                };\n            }\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Returns appropriate tooltip for functions status.\n         * @returns {string} - tooltip\n         */\n        function getTooltip() {\n            return ctrl.function.spec.disable ? $i18next.t('functions:TOOLTIP.RUN_FUNCTION', { lng: lng }) : $i18next.t('functions:TOOLTIP.STOP_FUNCTION', { lng: lng });\n        }\n\n        /**\n         * According to given action name calls proper action handler\n         * @param {string} actionType\n         * @param {Array} checkedItems\n         * @returns {Promise}\n         */\n        function handleAction(actionType, checkedItems) {\n            ctrl.actionHandlerCallback({ actionType: actionType, checkedItems: checkedItems });\n        }\n\n        /**\n         * Determines whether the current layer is showed\n         * @returns {boolean}\n         */\n        function isFunctionShowed() {\n            return ctrl.function.ui.isShowed;\n        }\n\n        /**\n         * According to given action name calls proper action handler\n         * @param {string} actionType - a type of action\n         */\n        function onFireAction(actionType) {\n            ctrl.actionHandlerCallback({ actionType: actionType, checkedItems: [ctrl.function] });\n        }\n\n        /**\n         * Handles mouse click on a table row and navigates to Code page of latest version\n         * @param {MouseEvent} event\n         * @param {string} state - absolute state name or relative state path\n         */\n        function onSelectRow(event, state) {\n            if (lodash.isNil(event.target.closest('.igz-action-item'))) {\n                if (!angular.isString(state)) {\n                    state = 'app.project.function.edit.code';\n                }\n\n                event.preventDefault();\n                event.stopPropagation();\n\n                $state.go(state, {\n                    id: ctrl.project.metadata.name,\n                    projectId: ctrl.project.metadata.name,\n                    functionId: ctrl.function.metadata.name,\n                    projectNamespace: ctrl.project.metadata.namespace\n                });\n\n                NuclioHeaderService.updateMainHeader('common:PROJECTS', ctrl.title, $state.current.name);\n            }\n        }\n\n        /**\n         * Toggles function row\n         * @param {MouseEvent} event\n         */\n        function toggleFunctionRow(event) {\n            if (angular.isDefined(event) && event.target.closest('.function-row-collapse')) {\n                event.stopPropagation();\n\n                if (event.target.closest('.collapse-icon')) {\n                    ctrl.isFunctionCollapsed = !ctrl.isFunctionCollapsed;\n                }\n            }\n        }\n\n        /**\n         * Toggles function 'disabled' property and updates it on back-end\n         * @param {MouseEvent} event\n         */\n        function toggleFunctionState(event) {\n            event.preventDefault();\n            event.stopPropagation();\n\n            if (!ctrl.function.spec.disable && !lodash.isEmpty(apiGateways)) {\n                DialogsService.alert($i18next.t('functions:ERROR_MSG.DISABLE_API_GW_FUNCTION', { lng: lng, apiGatewayName: apiGateways[0] }));\n            } else if (!ctrl.function.spec.disable) {\n                disableFunction();\n            } else {\n                enableFunction();\n            }\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Converts function status state.\n         */\n        function convertStatusState() {\n            var status = lodash.chain(ctrl.function.status.state).lowerCase().upperFirst().value();\n\n            ctrl.convertedStatusState = status === 'Error' ? 'Error' : status === 'Scaled to zero' ? 'Scaled to zero' : status === 'Ready' && ctrl.function.spec.disable ? 'Standby' : status === 'Ready' && !ctrl.function.spec.disable ? 'Running' : status === 'Imported' ? 'Imported' :\n            /* else */'Building';\n\n            lodash.set(ctrl.function, 'ui.convertedStatus', ctrl.convertedStatusState);\n        }\n\n        /**\n         * Deletes function from functions list\n         * @returns {Promise}\n         */\n        function deleteFunction() {\n            if (lodash.isEmpty(apiGateways)) {\n                ctrl.isSplashShowed.value = true;\n\n                return ctrl.handleDeleteFunction({ functionData: ctrl.function.metadata }).then(function () {\n                    lodash.remove(ctrl.functionsList, ['metadata.name', ctrl.function.metadata.name]);\n                }).catch(function (error) {\n                    ctrl.isSplashShowed.value = false;\n                    var defaultMsg = $i18next.t('functions:ERROR_MSG.DELETE_FUNCTION', { lng: lng });\n\n                    return DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n                });\n            } else {\n                DialogsService.alert($i18next.t('functions:ERROR_MSG.DELETE_API_GW_FUNCTION', { lng: lng, apiGatewayName: apiGateways[0] }));\n            }\n        }\n\n        /**\n         * Disables function.\n         * Sends request to change `spec.disable` property\n         */\n        function disableFunction() {\n\n            // in case failed request, modified function object will be restored from that copy\n            tempFunctionCopy = lodash.cloneDeep(ctrl.function);\n\n            var propertiesToDisableFunction = {\n                spec: {\n                    disable: true,\n                    build: {\n                        mode: 'neverBuild'\n                    }\n                }\n            };\n\n            lodash.merge(ctrl.function, propertiesToDisableFunction);\n\n            updateFunction('Disabling…');\n        }\n\n        function duplicateFunction() {\n            ngDialog.open({\n                template: '<ncl-duplicate-function-dialog data-close-dialog=\"closeThisDialog()\" ' + 'data-get-functions=\"ngDialogData.getFunctions({id: id})\" ' + 'data-get-function=\"ngDialogData.getFunction({metadata: metadata})\" ' + 'data-project=\"ngDialogData.project\" data-version=\"ngDialogData.version\">' + '</ncl-duplicate-function-dialog>',\n                plain: true,\n                data: {\n                    getFunctions: ctrl.getFunctions,\n                    getFunction: ctrl.getFunction,\n                    project: ctrl.project,\n                    version: ctrl.function\n                },\n                className: 'ngdialog-theme-iguazio duplicate-function-dialog-wrapper'\n            });\n        }\n\n        /**\n         * Enables function.\n         * Sends request to change `spec.disable` property\n         */\n        function enableFunction() {\n\n            // in case failed request, modified function object will be restored from that copy\n            tempFunctionCopy = lodash.cloneDeep(ctrl.function);\n\n            var propertiesToEnableFunction = {\n                spec: {\n                    disable: false,\n                    build: {\n                        mode: 'neverBuild'\n                    }\n                }\n            };\n\n            lodash.merge(ctrl.function, propertiesToEnableFunction);\n\n            updateFunction('Enabling…');\n        }\n\n        /**\n         * Exports the function\n         */\n        function exportFunction() {\n            ExportService.exportFunction(ctrl.function);\n        }\n\n        /**\n         * Initializes function actions\n         * @returns {Object[]} - list of actions\n         */\n        function initFunctionActions() {\n            ctrl.functionActions = angular.copy(FunctionsService.initFunctionActions());\n\n            var deleteAction = lodash.find(ctrl.functionActions, { 'id': 'delete' });\n\n            if (!lodash.isNil(deleteAction) && lodash.isEmpty(apiGateways)) {\n                deleteAction.confirm = {\n                    message: $i18next.t('functions:DELETE_FUNCTION', { lng: lng }) + ' “' + ctrl.function.metadata.name + '”?',\n                    description: $i18next.t('functions:DELETE_FUNCTION_DESCRIPTION', { lng: lng }),\n                    yesLabel: $i18next.t('common:YES_DELETE', { lng: lng }),\n                    noLabel: $i18next.t('common:CANCEL', { lng: lng }),\n                    type: 'nuclio_alert'\n                };\n            }\n        }\n\n        /**\n         * Pulls function status.\n         * Periodically sends request to get function's state, until state will not be 'ready' or 'error'.\n         * @param {string} [status='Building'] - The text to display in \"Status\" cell of the function while polling.\n         */\n        function pullFunctionState(status) {\n            ctrl.convertedStatusState = lodash.defaultTo(status, 'Building');\n            setStatusIcon();\n\n            interval = $interval(function () {\n                ctrl.getFunction({ metadata: ctrl.function.metadata, projectID: ctrl.project.metadata.name }).then(function (response) {\n                    if (response.status.state === 'ready' || response.status.state === 'error') {\n                        terminateInterval();\n                        convertStatusState();\n                        setStatusIcon();\n                    }\n                }).catch(function (error) {\n                    var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_FUNCTION', { lng: lng });\n\n                    terminateInterval();\n                    convertStatusState();\n                    setStatusIcon();\n\n                    return DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n                });\n            }, 2000);\n        }\n\n        /**\n         * Returns appropriate css icon class for functions status.\n         * @returns {string} - icon class\n         */\n        function setStatusIcon() {\n            ctrl.statusIcon = ctrl.convertedStatusState === 'Running' ? 'igz-icon-pause' : ctrl.convertedStatusState === 'Standby' ? 'igz-icon-play' :\n            /* else */'';\n        }\n\n        /**\n         * Terminates the interval of function state polling.\n         */\n        function terminateInterval() {\n            if (!lodash.isNil(interval)) {\n                $interval.cancel(interval);\n                interval = null;\n            }\n        }\n\n        /**\n         * Sends request to update function state\n         * @param {string} [status='Building'] - The text to display in \"Status\" cell of the function while polling.\n         */\n        function updateFunction(status) {\n            ctrl.isSplashShowed.value = true;\n\n            var pathsToExcludeOnDeploy = ['status', 'ui', 'versions'];\n            var functionCopy = lodash.omit(ctrl.function, pathsToExcludeOnDeploy);\n\n            // set `nuclio.io/project-name` label to relate this function to its project\n            lodash.set(functionCopy, ['metadata', 'labels', 'nuclio.io/project-name'], ctrl.project.metadata.name);\n\n            ctrl.updateFunction({ 'function': functionCopy, projectID: ctrl.project.metadata.name }).then(function () {\n                tempFunctionCopy = null;\n\n                pullFunctionState(status);\n            }).catch(function (error) {\n                ctrl.function = tempFunctionCopy;\n\n                var defaultMsg = $i18next.t('functions:ERROR_MSG.UPDATE_FUNCTION', { lng: lng });\n\n                return DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n            }).finally(function () {\n                ctrl.isSplashShowed.value = false;\n            });\n        }\n\n        /**\n         * Show dialog with YAML function config\n         */\n        function viewConfig() {\n            ngDialog.open({\n                template: '<ncl-function-config-dialog data-close-dialog=\"closeThisDialog()\" ' + '                            data-function=\"ngDialogData.function\">' + '</ncl-function-config-dialog>',\n                plain: true,\n                data: {\n                    function: ctrl.function\n                },\n                className: 'ngdialog-theme-iguazio view-yaml-dialog-wrapper'\n            });\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    angular.module('iguazio.dashboard-controls').component('nclFunction', {\n        bindings: {},\n        templateUrl: 'nuclio/functions/function/ncl-function.tpl.html',\n        controller: NclFunctionController\n    });\n\n    function NclFunctionController() {\n        var ctrl = this;\n    }\n})();\n'use strict';\n\n/* eslint max-statements: [\"error\", 100] */\n(function () {\n    'use strict';\n\n    NclVersionController.$inject = ['$i18next', '$interval', '$rootScope', '$scope', '$state', '$stateParams', '$transitions', '$timeout', 'i18next', 'lodash', 'ngDialog', 'ConfigService', 'DialogsService', 'ExportService', 'NuclioHeaderService', 'VersionHelperService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersion', {\n        bindings: {\n            project: '<',\n            version: '<',\n            createVersion: '&',\n            deleteFunction: '&',\n            getProject: '&',\n            getFunction: '&',\n            getFunctions: '&',\n            onEditCallback: '&?',\n            updateVersion: '&'\n        },\n        templateUrl: 'nuclio/functions/version/version.tpl.html',\n        controller: NclVersionController\n    });\n\n    function NclVersionController($i18next, $interval, $rootScope, $scope, $state, $stateParams, $transitions, $timeout, i18next, lodash, ngDialog, ConfigService, DialogsService, ExportService, NuclioHeaderService, VersionHelperService) {\n        var ctrl = this;\n        var deregisterFunction = null;\n        var interval = null;\n        var lng = i18next.language;\n\n        ctrl.action = null;\n        ctrl.isDemoMode = ConfigService.isDemoMode;\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                updateOnContentResize: true\n            }\n        };\n        ctrl.deployResult = {};\n        ctrl.isSplashShowed = {\n            value: false\n        };\n        ctrl.rowIsCollapsed = {\n            statusCode: false,\n            headers: false,\n            body: false,\n            deployBlock: false\n        };\n\n        ctrl.isDeployDisabled = false;\n        ctrl.isLayoutCollapsed = true;\n\n        ctrl.$onDestroy = onDestroy;\n        ctrl.$onInit = onInit;\n\n        ctrl.deployButtonClick = deployButtonClick;\n        ctrl.getCurrentStateName = getCurrentStateName;\n        ctrl.getDeployStatusState = getDeployStatusState;\n        ctrl.isDeployButtonDisabled = isDeployButtonDisabled;\n        ctrl.isInValidDeployState = isInValidDeployState;\n        ctrl.onRowCollapse = onRowCollapse;\n        ctrl.onSelectAction = onSelectAction;\n        ctrl.toggleDeployResult = toggleDeployResult;\n\n        //\n        // Hook method\n        //\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            terminateInterval();\n        }\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            setDeployResult(lodash.get(ctrl.version, 'status.state', 'ready'));\n\n            ctrl.isFunctionDeployed = !$stateParams.isNewFunction;\n            ctrl.actions = [{\n                id: 'exportFunction',\n                name: $i18next.t('functions:EXPORT_FUNCTION', { lng: lng })\n            }, {\n                id: 'deleteFunction',\n                name: $i18next.t('functions:DELETE_FUNCTION', { lng: lng }),\n                dialog: {\n                    message: {\n                        message: $i18next.t('functions:DELETE_FUNCTION', { lng: lng }) + ' “' + ctrl.version.metadata.name + '”?',\n                        description: $i18next.t('functions:DELETE_FUNCTION_DESCRIPTION', { lng: lng })\n                    },\n                    yesLabel: $i18next.t('common:YES_DELETE', { lng: lng }),\n                    noLabel: $i18next.t('common:CANCEL', { lng: lng }),\n                    type: 'nuclio_alert'\n                }\n            }, {\n                id: 'duplicateFunction',\n                name: $i18next.t('functions:DUPLICATE_FUNCTION', { lng: lng })\n            }, {\n                id: 'viewConfig',\n                name: $i18next.t('functions:VIEW_YAML', { lng: lng })\n            }];\n\n            ctrl.navigationTabsConfig = [{\n                tabName: $i18next.t('common:CODE', { lng: lng }),\n                id: 'code',\n                uiRoute: 'app.project.function.edit.code'\n            }, {\n                tabName: $i18next.t('common:CONFIGURATION', { lng: lng }),\n                id: 'configuration',\n                uiRoute: 'app.project.function.edit.configuration'\n            }, {\n                tabName: $i18next.t('common:TRIGGERS', { lng: lng }),\n                id: 'triggers',\n                uiRoute: 'app.project.function.edit.triggers'\n            }, {\n                tabName: $i18next.t('common:STATUS', { lng: lng }),\n                id: 'status',\n                uiRoute: 'app.project.function.edit.monitoring',\n                status: VersionHelperService.isVersionDeployed(ctrl.version) ? lodash.get(ctrl.version, 'status.state') : 'not yet deployed'\n            }];\n\n            ctrl.requiredComponents = {};\n\n            ctrl.getProject({ id: $stateParams.projectId }).then(function (response) {\n\n                // set projects data\n                ctrl.project = response;\n\n                // breadcrumbs config\n                var title = {\n                    project: ctrl.project,\n                    function: $stateParams.functionId,\n                    version: '$LATEST'\n                };\n\n                NuclioHeaderService.updateMainHeader('common:PROJECTS', title, $state.current.name);\n            }).then(setIngressHost).then(setImageNamePrefixTemplate).catch(function (error) {\n                var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_PROJECT', { lng: lng });\n\n                DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n            });\n\n            $scope.$on('change-state-deploy-button', changeStateDeployButton);\n\n            deregisterFunction = $transitions.onStart({}, stateChangeStart);\n\n            if (ctrl.isInValidDeployState()) {\n                ctrl.isFunctionDeployed = false;\n                ctrl.isDeployResultShown = true;\n                ctrl.rowIsCollapsed.deployBlock = true;\n\n                pullFunctionState();\n            }\n\n            ctrl.isLayoutCollapsed = true;\n\n            lodash.defaultsDeep(ctrl.version, {\n                spec: {\n                    build: {\n                        image: '',\n                        noCache: false,\n                        offline: false,\n                        dependencies: [],\n                        runtimeAttributes: {\n                            repositories: []\n                        }\n                    }\n                },\n                ui: {\n                    versionCode: '',\n                    isTriggersChanged: false,\n                    isVolumesChanged: false\n                }\n            });\n\n            if (lodash.get(ConfigService, 'nuclio.platformKind') === 'kube') {\n                lodash.defaults(ctrl.version.spec, {\n                    waitReadinessTimeoutBeforeFailure: false\n                });\n            }\n\n            lodash.merge(ctrl.version, {\n                ui: {\n                    deployedVersion: VersionHelperService.isVersionDeployed(ctrl.version) ? getVersionCopy() : null,\n                    versionChanged: false\n                }\n            });\n\n            setInvocationUrl();\n            setIngressHost();\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Deploys changed version\n         * @param {MouseEvent} event\n         */\n        function deployButtonClick(event) {\n            if (!ctrl.isDeployDisabled) {\n                ctrl.isFunctionDeployed = false;\n                $rootScope.$broadcast('deploy-function-version', { event: event });\n\n                var versionCopy = lodash.omit(ctrl.version, ['status', 'ui']);\n\n                // set `nuclio.io/project-name` label to relate this function to its project\n                lodash.set(versionCopy, ['metadata', 'labels', 'nuclio.io/project-name'], ctrl.project.metadata.name);\n                lodash.set(versionCopy, 'spec.build.mode', 'alwaysBuild');\n\n                ctrl.isTestResultShown = false;\n                ctrl.isDeployResultShown = false;\n                ctrl.rowIsCollapsed.deployBlock = true;\n                ctrl.isLayoutCollapsed = false;\n                ctrl.isSplashShowed.value = true;\n\n                var method = VersionHelperService.isVersionDeployed(ctrl.version) ? ctrl.updateVersion : ctrl.createVersion;\n                method({ version: versionCopy, projectID: ctrl.project.metadata.name }).then(function () {\n                    pullFunctionState();\n\n                    $timeout(function () {\n                        $rootScope.$broadcast('igzWatchWindowResize::resize');\n                    });\n                }).catch(function (error) {\n                    var defaultMsg = $i18next.t('common:ERROR_MSG.UNKNOWN_ERROR', { lng: lng });\n\n                    DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n                }).finally(function () {\n                    ctrl.isSplashShowed.value = false;\n                });\n            }\n        }\n\n        function getCurrentStateName() {\n            return $state.current.name;\n        }\n\n        /**\n         * Gets current status state\n         * @param {string} state\n         * @returns {string}\n         */\n        function getDeployStatusState(state) {\n            return state === 'ready' ? $i18next.t('functions:SUCCESSFULLY_DEPLOYED', { lng: lng }) : state === 'error' ? $i18next.t('functions:FAILED_TO_DEPLOY', { lng: lng }) :\n            /* else */$i18next.t('functions:DEPLOYING', { lng: lng });\n        }\n\n        /**\n         * Checks if \"Deploy\" button is disabled\n         * @returns {boolean}\n         */\n        function isDeployButtonDisabled() {\n            return ctrl.isInValidDeployState() || lodash.get(ctrl.version, 'ui.isTriggersChanged', false) || lodash.get(ctrl.version, 'ui.isVolumesChanged', false) || ctrl.isDeployDisabled;\n        }\n\n        /**\n         * Checks if state of deploy is valid\n         * @returns {boolean}\n         */\n        function isInValidDeployState() {\n            var validStates = ['building', 'waitingForResourceConfiguration', 'waitingForBuild', 'configuringResources'];\n\n            return lodash.includes(validStates, ctrl.deployResult.status.state);\n        }\n\n        /**\n         * Called when row is collapsed/expanded\n         * @param {string} row - name of expanded/collapsed row\n         */\n        function onRowCollapse(row) {\n            ctrl.rowIsCollapsed[row] = !ctrl.rowIsCollapsed[row];\n\n            $timeout(function () {\n                $rootScope.$broadcast('igzWatchWindowResize::resize');\n            }, 350);\n        }\n\n        /**\n         * Called when action is selected\n         * @param {Object} item - selected action\n         */\n        function onSelectAction(item) {\n            if (item.id === 'deleteFunction') {\n                var apiGateways = lodash.get(ctrl.version, 'status.apiGateways', []);\n\n                if (lodash.isEmpty(apiGateways)) {\n                    DialogsService.confirm(item.dialog.message, item.dialog.yesLabel, item.dialog.noLabel, item.dialog.type).then(function () {\n                        ctrl.isSplashShowed.value = true;\n\n                        ctrl.deleteFunction({ functionData: ctrl.version.metadata }).then(function () {\n                            $state.go('app.project.functions');\n                        }).catch(function (error) {\n                            ctrl.isSplashShowed.value = false;\n                            var defaultMsg = $i18next.t('functions:ERROR_MSG.DELETE_FUNCTION', { lng: lng });\n\n                            DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n                        });\n                    });\n                } else {\n                    DialogsService.alert($i18next.t('functions:ERROR_MSG.DELETE_API_GW_FUNCTION', { lng: lng, apiGatewayName: apiGateways[0] }));\n                }\n            } else if (item.id === 'exportFunction') {\n                ExportService.exportFunction(ctrl.version);\n            } else if (item.id === 'viewConfig') {\n                ngDialog.open({\n                    template: '<ncl-function-config-dialog data-close-dialog=\"closeThisDialog()\" ' + 'data-function=\"ngDialogData.function\"></ncl-function-config-dialog>',\n                    plain: true,\n                    data: {\n                        function: ctrl.version\n                    },\n                    className: 'ngdialog-theme-iguazio view-yaml-dialog-wrapper'\n                });\n            } else if (item.id === 'duplicateFunction') {\n                ngDialog.open({\n                    template: '<ncl-duplicate-function-dialog data-close-dialog=\"closeThisDialog()\" ' + 'data-get-functions=\"ngDialogData.getFunctions({id: id})\" ' + 'data-get-function=\"ngDialogData.getFunction({metadata: metadata})\" ' + 'data-project=\"ngDialogData.project\" data-version=\"ngDialogData.version\">' + '</ncl-duplicate-function-dialog>',\n                    plain: true,\n                    data: {\n                        getFunctions: ctrl.getFunctions,\n                        getFunction: ctrl.getFunction,\n                        project: ctrl.project,\n                        version: ctrl.version\n                    },\n                    className: 'ngdialog-theme-iguazio duplicate-function-dialog-wrapper'\n                });\n            }\n        }\n\n        /**\n         * Shows/hides deploy version result\n         */\n        function toggleDeployResult() {\n            ctrl.isDeployResultShown = !ctrl.isDeployResultShown;\n\n            $timeout(function () {\n                $rootScope.$broadcast('igzWatchWindowResize::resize');\n            });\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Disable deploy button if forms invalid\n         * @param {Object} event\n         * @param {Object} args\n         * @param {string} args.component\n         * @param {boolean} args.isDisabled\n         */\n        function changeStateDeployButton(event, args) {\n            if (lodash.isString(args.component)) {\n                ctrl.requiredComponents[args.component] = args.isDisabled;\n\n                // disable the \"Deploy\" button if at least one component is invalid\n                // enable the \"Deploy\" button if all components are valid\n                ctrl.isDeployDisabled = lodash.some(ctrl.requiredComponents);\n            } else {\n                ctrl.isDeployDisabled = args.isDisabled;\n            }\n        }\n\n        /**\n         * Fills template parameters with actual values.\n         * @param {string} template - The template with parameters to fill.\n         * @param {Object.<string, string>} parameters - An object with parameter name as keys and their corresponding\n         *     replacements as values.\n         * @returns {string} the resulting string of replacing each template parameter with its corresponding value (if\n         *     any).\n         * @example\n         * fillTemplate({ '{{what}}': 'JS', '{{how}}': 'awesome' }, '{{what}} is {{how}}!');\n         * // => 'JS is awesome!'\n         */\n        function fillTemplate(template, parameters) {\n            return lodash.reduce(parameters, function (result, value, key) {\n                return lodash.isEmpty(value) ? result : result.replace(key, value);\n            }, template);\n        }\n\n        /**\n         * Gets copy of ctrl.version without `ui` property\n         */\n        function getVersionCopy() {\n            return angular.copy(lodash.omit(ctrl.version, 'ui'));\n        }\n\n        /**\n         * Pulls function status.\n         * Periodically sends request to get function's state, until state will not be 'ready' or 'error'\n         */\n        function pullFunctionState() {\n            ctrl.isDeployResultShown = true;\n            setDeployResult('building');\n\n            interval = $interval(function () {\n                ctrl.getFunction({ metadata: ctrl.version.metadata, projectID: lodash.get(ctrl.project, 'metadata.name') }).then(function (response) {\n                    if (response.status.state === 'ready' || response.status.state === 'error') {\n                        terminateInterval();\n\n                        ctrl.versionDeployed = true;\n\n                        ctrl.version.status = response.status;\n                        ctrl.version.ui = {\n                            deployedVersion: getVersionCopy(),\n                            versionChanged: false\n                        };\n\n                        ctrl.version.metadata.resourceVersion = response.metadata.resourceVersion;\n                        lodash.assign(ctrl.version.spec, response.spec);\n\n                        setInvocationUrl();\n                        setIngressHost();\n\n                        ctrl.isFunctionDeployed = true;\n                    }\n\n                    ctrl.version.ui.deployResult = response;\n\n                    ctrl.deployResult = response;\n\n                    $rootScope.$broadcast('deploy-result-changed');\n\n                    lodash.set(lodash.find(ctrl.navigationTabsConfig, 'status'), 'status', response.status.state);\n\n                    $timeout(function () {\n                        angular.element('.log-panel').mCustomScrollbar('scrollTo', 'bottom');\n                    });\n                }).catch(function (error) {\n                    if (error.status !== 404) {\n                        ctrl.isSplashShowed.value = false;\n                    }\n                });\n            }, 2000);\n        }\n\n        /**\n         * Sets deploying results\n         * @param {string} value\n         */\n        function setDeployResult(value) {\n            ctrl.deployResult = {\n                status: {\n                    state: value\n                }\n            };\n            lodash.set(lodash.find(ctrl.navigationTabsConfig, 'status'), 'status', value);\n        }\n\n        /**\n         * Sets image name prefix and default image name based on template\n         */\n        function setImageNamePrefixTemplate() {\n            var functionName = lodash.get(ctrl.version, 'metadata.name');\n            var imageNamePrefixTemplate = lodash.get(ConfigService, 'nuclio.imageNamePrefixTemplate', '');\n            var parameters = {\n                '{{ .FunctionName }}': functionName,\n                '{{ .ProjectName }}': lodash.get(ctrl.project, 'metadata.name')\n            };\n            var imageNamePrefix = fillTemplate(imageNamePrefixTemplate, parameters);\n            var defaultImageName = lodash.isEmpty(imageNamePrefixTemplate) ? 'processor-' + functionName : imageNamePrefix + 'processor';\n\n            lodash.assign(ctrl.version.ui, {\n                defaultImageName: defaultImageName,\n                imageNamePrefix: imageNamePrefix\n            });\n        }\n\n        /**\n         * Sets the invocation URL of the function\n         */\n        function setInvocationUrl() {\n            var ip = ConfigService.nuclio.externalIPAddress;\n            var port = lodash.defaultTo(lodash.get(ctrl.version, 'ui.deployResult.status.httpPort'), lodash.get(ctrl.version, 'status.httpPort'));\n\n            ctrl.version.ui.invocationUrl = lodash.isEmpty(ip) || lodash.toFinite(port) === 0 ? '' : 'http://' + ip + ':' + port;\n        }\n\n        /**\n         * Sets ingress host based on template\n         */\n        function setIngressHost() {\n            var ingressHostTemplate = lodash.get(ConfigService, 'nuclio.ingressHostTemplate', '');\n            var parameters = {\n                '{{ .ResourceName }}': lodash.get(ctrl.version, 'metadata.name'),\n                '{{ .ProjectName }}': lodash.get(ctrl.project, 'metadata.name'),\n                '{{ .Namespace }}': lodash.get(ctrl.project, 'metadata.namespace')\n            };\n\n            ctrl.version.ui.ingressHost = fillTemplate(ingressHostTemplate, parameters);\n        }\n\n        /**\n         * Prevents change state if there are unsaved data\n         * @param {Event} transition\n         */\n        function stateChangeStart(transition) {\n            var toState = transition.$to();\n            if (lodash.get($state, 'params.functionId') !== transition.params('to').functionId && !VersionHelperService.isVersionDeployed(ctrl.version)) {\n\n                transition.abort();\n\n                DialogsService.confirm($i18next.t('common:LEAVE_PAGE_CONFIRM', { lng: lng }), $i18next.t('common:LEAVE', { lng: lng }), $i18next.t('common:DONT_LEAVE', { lng: lng })).then(function () {\n\n                    // unsubscribe from broadcast event\n                    deregisterFunction();\n                    $state.go(toState.name, transition.params('to'));\n                });\n            }\n        }\n\n        /**\n         * Terminates the interval of function state polling.\n         */\n        function terminateInterval() {\n            if (!lodash.isNil(interval)) {\n                $interval.cancel(interval);\n                interval = null;\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclBreadcrumbsController.$inject = ['$scope', '$state', '$transitions', 'lodash', 'NavigationTabsService'];\n    angular.module('iguazio.dashboard-controls').component('nclBreadcrumbs', {\n        bindings: {\n            getProjects: '&',\n            getFunctions: '&'\n        },\n        templateUrl: 'nuclio/common/components/breadcrumbs/breadcrumbs.tpl.html',\n        controller: NclBreadcrumbsController\n    });\n\n    function NclBreadcrumbsController($scope, $state, $transitions, lodash, NavigationTabsService) {\n        var ctrl = this;\n\n        ctrl.mainHeaderTitle = {};\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n\n        ctrl.goToProjectsList = goToProjectsList;\n        ctrl.goToFunctionsList = goToFunctionsList;\n        ctrl.goToFunctionScreen = goToFunctionScreen;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization function\n         */\n        function onInit() {\n            setMainHeaderTitle();\n\n            $scope.$on('update-main-header-title', setMainHeaderTitle);\n\n            $transitions.onSuccess({}, onStateChangeSuccess);\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n            ctrl.navigationTabsConfig = NavigationTabsService.getNavigationTabsConfig($state.current.name);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Changes state when the main header title is clicked\n         */\n        function goToProjectsList() {\n            $state.go('app.projects');\n        }\n\n        /**\n         * Changes state when the Project subtitle is clicked\n         */\n        function goToFunctionsList() {\n            $state.go('app.project.functions');\n        }\n\n        function goToFunctionScreen() {\n            $state.go('app.project.function.edit.code');\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Dynamically set Main Header Title on broadcast and on initial page load\n         * @param {Object} [event]\n         * @param {Object} [data]\n         */\n        function setMainHeaderTitle(event, data) {\n            if (!lodash.isNil(data)) {\n                lodash.assign(ctrl.mainHeaderTitle, data);\n            } else {\n                ctrl.mainHeaderTitle = { title: $state.current.data.mainHeaderTitle };\n            }\n        }\n\n        /**\n         * Dynamically pre-set Main Header Title on UI router state change, sets position of main wrapper and navigation\n         * tabs config\n         * Needed for better UX - header title changes correctly even before controller data resolved and broadcast\n         * have been sent\n         * @param {Object} transition\n         */\n        function onStateChangeSuccess(transition) {\n            var toState = transition.$to();\n            ctrl.navigationTabsConfig = NavigationTabsService.getNavigationTabsConfig(toState.name);\n\n            // Check to exclude prototypical inheritance of the `mainHeaderTitle` property from parent router state\n            if (Object.prototype.hasOwnProperty.call(toState.data, 'mainHeaderTitle')) {\n\n                ctrl.mainHeaderTitle = {\n                    title: toState.data.mainHeaderTitle\n                };\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclBreadcrumbsDropdown.$inject = ['$document', '$element', '$scope', '$state', '$i18next', 'i18next', 'lodash', 'DialogsService'];\n    angular.module('iguazio.dashboard-controls').component('nclBreadcrumbsDropdown', {\n        bindings: {\n            state: '<',\n            title: '<',\n            project: '<',\n            type: '@',\n            getFunctions: '&',\n            getProjects: '&'\n        },\n        templateUrl: 'nuclio/common/components/breadcrumbs-dropdown/breadcrumbs-dropdown.tpl.html',\n        controller: NclBreadcrumbsDropdown\n    });\n\n    function NclBreadcrumbsDropdown($document, $element, $scope, $state, $i18next, i18next, lodash, DialogsService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.itemsList = [];\n        ctrl.showDropdownList = false;\n        ctrl.placeholder = $i18next.t('common:PLACEHOLDER.SEARCH', { lng: lng });\n\n        ctrl.$onInit = onInit;\n\n        ctrl.showDropdown = showDropdown;\n        ctrl.showDetails = showDetails;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            if (ctrl.type === 'projects') {\n                ctrl.getProjects().then(setNuclioItemsList).catch(function (error) {\n                    var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_PROJECTS', { lng: lng });\n\n                    DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n                });\n            } else if (ctrl.type === 'functions') {\n                ctrl.getFunctions({ id: ctrl.project.metadata.name }).then(setNuclioItemsList).catch(function (error) {\n                    var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_FUNCTIONS', { lng: lng });\n\n                    DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n                });\n            }\n\n            $document.on('click', unselectDropdown);\n        }\n\n        //\n        // Public method\n        //\n\n        /**\n         * Opens/closes dropdown\n         */\n        function showDropdown() {\n            $document.on('click', unselectDropdown);\n\n            if (!ctrl.showDropdownList) {\n                $element.find('.breadcrumb-arrow').css('background-color', '#c9c9cd');\n            }\n\n            ctrl.showDropdownList = !ctrl.showDropdownList;\n\n            if (!ctrl.showDropdownList) {\n                ctrl.searchText = '';\n\n                $element.find('.breadcrumb-arrow').css('background-color', '');\n\n                $document.off('click', unselectDropdown);\n            }\n        }\n\n        /**\n         * Handles mouse click on a item's name\n         * Navigates to selected page\n         * @param {Event} event\n         * @param {Object} item\n         */\n        function showDetails(event, item) {\n            var params = {};\n\n            ctrl.showDropdownList = !ctrl.showDropdownList;\n            ctrl.searchText = '';\n\n            $document.off('click', unselectDropdown);\n\n            $element.find('.breadcrumb-arrow').css('background-color', '');\n\n            if (ctrl.type === 'projects') {\n                lodash.set(params, 'projectId', item.id);\n\n                $state.go('app.project.functions', params);\n            } else if (ctrl.type === 'functions') {\n                params = {\n                    isNewFunction: false,\n                    id: ctrl.project.metadata.name,\n                    functionId: item.id,\n                    projectNamespace: ctrl.project.metadata.namespace\n                };\n\n                $state.go('app.project.function.edit.code', params);\n            }\n        }\n\n        //\n        // Private method\n        //\n\n        /**\n         * Handles promise\n         * Sets projects list for dropdown in Nuclio breadcrumbs\n         * @param {Object} data\n         */\n        function setProjectsItemList(data) {\n            ctrl.itemsList = lodash.map(data, function (item) {\n                return {\n                    id: item.metadata.name,\n                    name: lodash.defaultTo(item.spec.displayName, item.metadata.name),\n                    isNuclioState: true\n                };\n            });\n        }\n\n        /**\n         * Handles promise\n         * Sets functions list for dropdown in Nuclio breadcrumbs\n         * @param {Object} data\n         */\n        function setFunctionsItemList(data) {\n            ctrl.itemsList = lodash.map(data, function (item) {\n                return {\n                    id: item.metadata.name,\n                    name: item.metadata.name,\n                    isNuclioState: true\n                };\n            });\n        }\n\n        /**\n         * Checks what item list need to set for dropdown in Nuclio breadcrumbs\n         * @param {Object} data\n         */\n        function setNuclioItemsList(data) {\n            if (ctrl.type === 'projects') {\n                setProjectsItemList(data);\n            } else if (ctrl.type === 'functions') {\n                setFunctionsItemList(lodash.defaultTo(data.data, data));\n            }\n        }\n\n        /**\n         * Handle click on the document and not on the dropdown field and close the dropdown\n         * @param {Object} e - event\n         */\n        function unselectDropdown(e) {\n            if ($element.find(e.target).length === 0) {\n                $scope.$evalAsync(function () {\n                    ctrl.showDropdownList = false;\n                    ctrl.searchText = '';\n\n                    $document.off('click', unselectDropdown);\n\n                    $element.find('.breadcrumb-arrow').css('background-color', '');\n                });\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclCollapsingRowController.$inject = ['$i18next', '$timeout', 'i18next', 'lodash', 'DialogsService', 'FunctionsService'];\n    angular.module('iguazio.dashboard-controls').component('nclCollapsingRow', {\n        bindings: {\n            actionHandlerCallback: '&',\n            item: '<',\n            itemIndex: '<?',\n            type: '@',\n            listClass: '@?'\n        },\n        templateUrl: 'nuclio/common/components/collapsing-row/collapsing-row.tpl.html',\n        controller: NclCollapsingRowController,\n        transclude: true\n    });\n\n    function NclCollapsingRowController($i18next, $timeout, i18next, lodash, DialogsService, FunctionsService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.actions = [];\n        ctrl.isEditModeActive = false;\n\n        ctrl.$onInit = onInit;\n\n        ctrl.isNil = lodash.isNil;\n        ctrl.isNumber = lodash.isNumber;\n\n        ctrl.getAttributeValue = getAttributeValue;\n        ctrl.isVolumeType = isVolumeType;\n        ctrl.onCollapse = onCollapse;\n        ctrl.onClickAction = onClickAction;\n        ctrl.onFireAction = onFireAction;\n        ctrl.showDotMenu = showDotMenu;\n        ctrl.toggleItem = toggleItem;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            lodash.defaultsDeep(ctrl.item, {\n                ui: {\n                    editModeActive: false,\n                    expandable: true\n                }\n            });\n\n            ctrl.classList = FunctionsService.getClassesList(ctrl.type);\n\n            if (!lodash.isEmpty(ctrl.item.kind)) {\n                ctrl.selectedClass = lodash.find(ctrl.classList, ['id', ctrl.item.kind]);\n                ctrl.item.ui.selectedClass = ctrl.selectedClass;\n            }\n\n            ctrl.actions = initActions();\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Returns attribute value\n         * @param {string} key - attribute key\n         * @param {string|Object} value - attribute value\n         * @returns {string|Object}\n         */\n        function getAttributeValue(key, value) {\n            return key === 'schedule' ? '0 ' + value : value;\n        }\n\n        /**\n         * Checks if input have to be visible for specific item type\n         * @returns {boolean}\n         */\n        function isVolumeType() {\n            return ctrl.type === 'volume';\n        }\n\n        /**\n         * Changes item's expanded state\n         */\n        function onCollapse(event) {\n            if (!ctrl.item.ui.editModeActive) {\n                ctrl.actionHandlerCallback({ actionType: 'edit', selectedItem: ctrl.item });\n                event.stopPropagation();\n            } else {\n                $timeout(function () {\n                    if (ctrl.item.ui.expandable) {\n                        ctrl.item.ui.editModeActive = false;\n                    }\n                });\n            }\n        }\n\n        /**\n         * Handler on action click\n         * @param {Object} action - action that was clicked (e.g. `delete`)\n         */\n        function onClickAction(action) {\n            if (lodash.isNonEmpty(action.confirm)) {\n                showConfirmDialog(action);\n            } else {\n                onFireAction(action.id);\n            }\n        }\n\n        /**\n         * According to given action name calls proper action handler\n         * @param {string} actionType - a type of action\n         */\n        function onFireAction(actionType) {\n            ctrl.actionHandlerCallback({ actionType: actionType, selectedItem: ctrl.item, index: ctrl.itemIndex });\n        }\n\n        /**\n         * Checks if show dot menu\n         */\n        function showDotMenu() {\n            return ctrl.actions.length > 1;\n        }\n\n        /**\n         * Enables/disables item\n         */\n        function toggleItem() {\n            ctrl.item.enable = !ctrl.item.enable;\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Shows confirm dialog\n         * @param {Object} action - e.g. `delete`\n         */\n        function showConfirmDialog(action) {\n            var message = lodash.isNil(action.confirm.description) ? action.confirm.message : {\n                message: action.confirm.message,\n                description: action.confirm.description\n            };\n\n            DialogsService.confirm(message, action.confirm.yesLabel, action.confirm.noLabel, action.confirm.type).then(function () {\n                onFireAction(action.id);\n            });\n        }\n\n        /**\n         * Initializes actions\n         * @returns {Object[]} - list of actions\n         */\n        function initActions() {\n            return [{\n                label: $i18next.t('common:DELETE', { lng: lng }),\n                id: 'delete',\n                icon: 'igz-icon-trash',\n                active: true,\n                confirm: {\n                    message: $i18next.t('functions:DELETE_ITEM', { lng: lng }),\n                    description: $i18next.t('functions:DELETE_DESCRIPTION', { lng: lng }),\n                    yesLabel: $i18next.t('common:YES_DELETE', { lng: lng }),\n                    noLabel: $i18next.t('common:CANCEL', { lng: lng }),\n                    type: 'nuclio_alert'\n                }\n            }];\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclDeployLogController.$inject = ['lodash'];\n    angular.module('iguazio.dashboard-controls').component('nclDeployLog', {\n        bindings: {\n            logEntries: '<'\n        },\n        templateUrl: 'nuclio/common/components/deploy-log/deploy-log.tpl.html',\n        controller: NclDeployLogController\n    });\n\n    function NclDeployLogController(lodash) {\n        var ctrl = this;\n\n        ctrl.scrollCofig = {\n            advanced: {\n                updateOnContentResize: true\n            },\n            theme: 'light-thin'\n        };\n\n        ctrl.lodash = lodash;\n\n        ctrl.getLogLevel = getLogLevel;\n        ctrl.getLogParams = getLogParams;\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Get log level display value\n         * @param {string} level - the level model value (one of: 'debug', 'info', 'warn', 'error')\n         * @returns {string} the log level display value\n         */\n        function getLogLevel(level) {\n            return lodash.first(level).toUpperCase();\n        }\n\n        /**\n         * Get log parameters display value\n         * @param {string} logEntry - the log entry that includes the parameters\n         * @returns {string} the log level display value\n         */\n        function getLogParams(logEntry) {\n            var params = lodash.omit(logEntry, ['name', 'time', 'level', 'message', 'err']);\n\n            return lodash.isEmpty(params) ? '' : '[' + lodash.map(params, function (value, key) {\n                return key + ': ' + angular.toJson(value);\n            }).join(', ').replace(/\\\\n/g, '\\n').replace(/\\\\\"/g, '\"') + ']';\n        }\n    }\n})();\n'use strict';\n\n/* eslint max-statements: [\"error\", 93] */\n(function () {\n    'use strict';\n\n    NclEditItemController.$inject = ['$document', '$element', '$i18next', '$rootScope', '$scope', '$timeout', 'i18next', 'lodash', 'ConfigService', 'ConverterService', 'EventHelperService', 'FormValidationService', 'PreventDropdownCutOffService', 'ValidationService'];\n    angular.module('iguazio.dashboard-controls').component('nclEditItem', {\n        bindings: {\n            item: '<',\n            classList: '<',\n            classPlaceholder: '@?',\n            type: '@',\n            onSelectClassCallback: '&?',\n            onSubmitCallback: '&',\n            validationRules: '<?',\n            maxLengths: '<?',\n            defaultFields: '<?'\n        },\n        templateUrl: 'nuclio/common/components/edit-item/edit-item.tpl.html',\n        controller: NclEditItemController\n    });\n\n    function NclEditItemController($document, $element, $i18next, $rootScope, $scope, $timeout, i18next, lodash, ConfigService, ConverterService, EventHelperService, FormValidationService, PreventDropdownCutOffService, ValidationService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        var itemCopy = {};\n\n        ctrl.editItemForm = {};\n        ctrl.selectedClass = {};\n\n        ctrl.igzScrollConfig = {\n            maxElementsCount: 10,\n            childrenSelector: '.table-body'\n        };\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                updateOnContentResize: true\n            }\n        };\n\n        ctrl.fieldTypeValidationRules = {\n            arrayInt: ValidationService.getValidationRules('function.arrayInt')\n        };\n\n        ctrl.isShowFieldError = FormValidationService.isShowFieldError;\n        ctrl.isShowFieldInvalidState = FormValidationService.isShowFieldInvalidState;\n        ctrl.isNil = lodash.isNil;\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.addNewAnnotation = addNewAnnotation;\n        ctrl.addNewBroker = addNewBroker;\n        ctrl.addNewEventHeader = addNewEventHeader;\n        ctrl.addNewIngress = addNewIngress;\n        ctrl.addNewSubscription = addNewSubscription;\n        ctrl.addNewTopic = addNewTopic;\n        ctrl.convertFromCamelCase = convertFromCamelCase;\n        ctrl.getFieldPlaceholderText = getFieldPlaceholderText;\n        ctrl.getFieldValue = getFieldValue;\n        ctrl.getItemName = getItemName;\n        ctrl.getSelectedClassMoreInfo = getSelectedClassMoreInfo;\n        ctrl.handleAnnotationAction = handleAnnotationAction;\n        ctrl.handleBrokerAction = handleBrokerAction;\n        ctrl.handleEventHeaderAction = handleEventHeaderAction;\n        ctrl.handleIngressAction = handleIngressAction;\n        ctrl.handleSubscriptionAction = handleSubscriptionAction;\n        ctrl.handleTopicAction = handleTopicAction;\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.isCronTrigger = isCronTrigger;\n        ctrl.isFieldVisible = isFieldVisible;\n        ctrl.isHttpTrigger = isHttpTrigger;\n        ctrl.isKafkaTrigger = isKafkaTrigger;\n        ctrl.isMqttTrigger = isMqttTrigger;\n        ctrl.isSelectedClassMoreInfoVisible = isSelectedClassMoreInfoVisible;\n        ctrl.isTriggerType = isTriggerType;\n        ctrl.isVolumeType = isVolumeType;\n        ctrl.numberInputCallback = numberInputCallback;\n        ctrl.onChangeKeyValueData = onChangeKeyValueData;\n        ctrl.onClearButtonClick = onClearButtonClick;\n        ctrl.onSelectClass = onSelectClass;\n        ctrl.onSelectDropdownValue = onSelectDropdownValue;\n        ctrl.onSubmitForm = onSubmitForm;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        // eslint-disable-next-line\n        function onInit() {\n            lodash.defaults(ctrl, {\n                classPlaceholder: $i18next.t('functions:PLACEHOLDER.SELECT_CLASS', { lng: lng })\n            });\n\n            if (!lodash.isEmpty(ctrl.item.kind)) {\n                ctrl.selectedClass = lodash.find(ctrl.classList, ['id', ctrl.item.kind]);\n                ctrl.item.ui.selectedClass = ctrl.selectedClass;\n\n                $timeout(validateValues);\n            }\n\n            if (ctrl.isVolumeType()) {\n                var selectedTypeName = !lodash.isNil(ctrl.item.volume.flexVolume) ? 'v3io' : !lodash.isNil(ctrl.item.volume.secret) ? 'secret' : !lodash.isNil(ctrl.item.volume.configMap) ? 'configMap' : !lodash.isNil(ctrl.item.volume.persistentVolumeClaim) ? 'persistentVolumeClaim' : null;\n\n                if (!lodash.isNil(selectedTypeName)) {\n                    ctrl.selectedClass = lodash.find(ctrl.classList, ['id', selectedTypeName]);\n                }\n            }\n\n            if (ctrl.isTriggerType() && ctrl.isHttpTrigger()) {\n                ctrl.ingresses = lodash.chain(ctrl.item.attributes.ingresses).defaultTo({}).map(function (ingress) {\n                    return {\n                        name: ingress.host,\n                        value: ingress.paths.join(','),\n                        additionalValue: ingress.secretName,\n                        ui: {\n                            editModeActive: false,\n                            isFormValid: true,\n                            name: 'ingress'\n                        }\n                    };\n                }).value();\n\n                ctrl.annotations = lodash.chain(ctrl.item.annotations).defaultTo([]).map(function (value, key) {\n                    return {\n                        name: key,\n                        value: value,\n                        ui: {\n                            editModeActive: false,\n                            isFormValid: true,\n                            name: 'trigger.annotation'\n                        }\n                    };\n                }).value();\n            }\n\n            if (ctrl.isTriggerType() && ctrl.isKafkaTrigger()) {\n                lodash.defaultsDeep(ctrl.item.attributes, {\n                    sasl: {\n                        user: '',\n                        password: ''\n                    }\n                });\n                ctrl.item.attributes.sasl.enable = !lodash.isEmpty(ctrl.item.attributes.sasl.user) && !lodash.isEmpty(ctrl.item.attributes.sasl.password);\n\n                ctrl.topics = lodash.chain(ctrl.item.attributes.topics).defaultTo([]).map(function (value, index) {\n                    return {\n                        name: index,\n                        value: value,\n                        ui: {\n                            editModeActive: false,\n                            isFormValid: true,\n                            name: 'topic'\n                        }\n                    };\n                }).value();\n\n                ctrl.brokers = lodash.chain(ctrl.item.attributes.brokers).defaultTo([]).map(function (value, index) {\n                    return {\n                        name: index,\n                        value: value,\n                        ui: {\n                            editModeActive: false,\n                            isFormValid: true,\n                            name: 'broker'\n                        }\n                    };\n                }).value();\n            }\n\n            if (ctrl.isTriggerType() && ctrl.isMqttTrigger()) {\n                ctrl.subscriptions = lodash.chain(ctrl.item.attributes.subscriptions).defaultTo([]).map(function (value) {\n                    return {\n                        name: value.topic,\n                        value: value.qos,\n                        ui: {\n                            editModeActive: false,\n                            isFormValid: true,\n                            name: 'subscription'\n                        }\n                    };\n                }).value();\n            }\n\n            if (ctrl.isTriggerType() && ctrl.isCronTrigger()) {\n                lodash.defaultsDeep(ctrl.item.attributes, {\n                    event: {\n                        body: '',\n                        headers: {}\n                    }\n                });\n\n                ctrl.eventHeaders = lodash.chain(ctrl.item).get('attributes.event.headers').defaultTo({}).map(function (value, key) {\n                    return {\n                        name: key,\n                        value: value,\n                        ui: {\n                            editModeActive: false,\n                            isFormValid: true,\n                            name: 'event.headers'\n                        }\n                    };\n                }).value();\n            }\n\n            var fields = lodash.get(ctrl.selectedClass, 'fields');\n            lodash.forEach(fields, function (field) {\n                var path = lodash.defaultTo(field.path, field.name);\n                if (field.type === 'arrayInt') {\n                    lodash.update(ctrl.item, path, ConverterService.fromNumberArray);\n                }\n            });\n\n            if (!lodash.isEmpty(ctrl.item.id)) {\n                lodash.set(ctrl.item, 'ui.changed', false);\n            }\n\n            itemCopy = lodash.cloneDeep(lodash.omit(ctrl.item, 'ui'));\n\n            $scope.$on('deploy-function-version', onFunctionDeploy);\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n            $document.on('click', submitOnClick);\n\n            // Bind DOM-related preventDropdownCutOff method to component's controller\n            PreventDropdownCutOffService.preventDropdownCutOff($element, '.three-dot-menu');\n        }\n\n        /**\n         * Destructor\n         */\n        function onDestroy() {\n            lodash.set(ctrl.item, 'ui.changed', false);\n\n            $rootScope.$broadcast('edit-item-has-been-changed', {});\n\n            $document.off('click', submitOnClick);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Converts field names in class list from camel case.\n         * @param {string} str - The string to convert.\n         */\n        function convertFromCamelCase(str) {\n            return lodash.upperFirst(lodash.lowerCase(str));\n        }\n\n        /**\n         * Adds new ingress\n         * @param {Event} event\n         */\n        function addNewIngress(event) {\n            $timeout(function () {\n                if (ctrl.ingresses.length < 1 || lodash.chain(ctrl.ingresses).last().get('ui.isFormValid', true).value()) {\n                    ctrl.ingresses.push({\n                        name: lodash.get(ctrl.defaultFields, 'ingressHost', ''),\n                        value: '/',\n                        additionalValue: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'ingress'\n                        }\n                    });\n                    event.stopPropagation();\n                }\n            }, 50);\n        }\n\n        /**\n         * Adds new annotation\n         * @param {Event} event\n         */\n        function addNewAnnotation(event) {\n            $timeout(function () {\n                if (ctrl.annotations.length < 1 || lodash.last(ctrl.annotations).ui.isFormValid) {\n                    ctrl.annotations.push({\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'trigger.annotation'\n                        }\n                    });\n                    event.stopPropagation();\n                }\n            }, 50);\n        }\n\n        /**\n         * Adds new subscription\n         * @param {Event} event\n         */\n        function addNewSubscription(event) {\n            $timeout(function () {\n                if (ctrl.subscriptions.length < 1 || lodash.last(ctrl.subscriptions).ui.isFormValid) {\n                    ctrl.subscriptions.push({\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'subscription'\n                        }\n                    });\n                    event.stopPropagation();\n                }\n            }, 50);\n        }\n\n        /**\n         * Adds new topic\n         * @param {Event} event\n         */\n        function addNewTopic(event) {\n            $timeout(function () {\n                if (ctrl.topics.length < 1 || lodash.last(ctrl.topics).ui.isFormValid) {\n                    ctrl.topics.push({\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'topic'\n                        }\n                    });\n                    event.stopPropagation();\n                }\n            }, 50);\n        }\n\n        /**\n         * Adds new broker\n         * @param {Event} event\n         */\n        function addNewBroker(event) {\n            $timeout(function () {\n                if (ctrl.brokers.length < 1 || lodash.last(ctrl.brokers).ui.isFormValid) {\n                    ctrl.brokers.push({\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'broker'\n                        }\n                    });\n                    event.stopPropagation();\n                }\n            }, 50);\n        }\n\n        /**\n         * Adds new event header\n         * @param {Event} event - native event object\n         */\n        function addNewEventHeader(event) {\n            $timeout(function () {\n                if (ctrl.eventHeaders.length < 1 || lodash.last(ctrl.eventHeaders).ui.isFormValid) {\n                    ctrl.eventHeaders.push({\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'event.headers'\n                        }\n                    });\n                    event.stopPropagation();\n                }\n            }, 50);\n        }\n\n        /**\n         * Returns the value of a field.\n         * @param {Object} field - The field.\n         * @param {string} field.name - The name of the field.\n         * @param {string} field.path - The path in item this field is bound to.\n         * @returns {*} the value of the field.\n         */\n        function getFieldValue(field) {\n            return lodash.get(ctrl.item, lodash.defaultTo(field.path, field.name));\n        }\n\n        /**\n         * Returns value for Name input.\n         * Value could has different path depends on item type.\n         * @returns {string}\n         */\n        function getItemName() {\n            return ctrl.type === 'volume' ? ctrl.item.volume.name : ctrl.item.name;\n        }\n\n        /**\n         * Gets corresponding tooltip description\n         * @returns {string}\n         */\n        function getSelectedClassMoreInfo() {\n            return lodash.get(ctrl.selectedClass, 'moreInfoDescription');\n        }\n\n        /**\n         * Handler on specific action type of trigger's ingress\n         * @param {string} actionType\n         * @param {number} index - index of variable in array\n         */\n        function handleIngressAction(actionType, index) {\n            if (actionType === 'delete') {\n                ctrl.ingresses.splice(index, 1);\n                lodash.unset(ctrl.item, 'attributes.ingresses.' + index);\n\n                checkValidation('ingresses');\n            }\n        }\n\n        /**\n         * Handler on specific action type of trigger's event header\n         * @param {string} actionType\n         * @param {number} index - index of variable in array\n         */\n        function handleEventHeaderAction(actionType, index) {\n            if (actionType === 'delete') {\n                ctrl.eventHeaders.splice(index, 1);\n                lodash.unset(ctrl.item, 'attributes.event.headers.' + index);\n\n                checkValidation('eventHeaders');\n            }\n        }\n\n        /**\n         * Handler on specific action type of trigger's annotation\n         * @param {string} actionType\n         * @param {number} index - index of variable in array\n         */\n        function handleAnnotationAction(actionType, index) {\n            if (actionType === 'delete') {\n                var deletedItems = ctrl.annotations.splice(index, 1);\n                lodash.unset(ctrl.item, 'annotations.' + lodash.head(deletedItems).name);\n\n                checkValidation('annotations');\n            }\n        }\n\n        /**\n         * Handler on specific action type of trigger's subscription\n         * @param {string} actionType\n         * @param {number} index - index of variable in array\n         */\n        function handleSubscriptionAction(actionType, index) {\n            if (actionType === 'delete') {\n                lodash.pullAt(ctrl.subscriptions, index);\n                lodash.pullAt(ctrl.item.attributes.subscriptions, index);\n\n                checkValidation('subscriptions');\n            }\n        }\n\n        /**\n         * Handler on specific action type of trigger's topic\n         * @param {string} actionType\n         * @param {number} index - index of variable in array\n         */\n        function handleTopicAction(actionType, index) {\n            if (actionType === 'delete') {\n                lodash.pullAt(ctrl.topics, index);\n                lodash.pullAt(ctrl.item.attributes.topics, index);\n\n                checkValidation('topics');\n            }\n        }\n\n        /**\n         * Handler on specific action type of trigger's broker\n         * @param {string} actionType\n         * @param {number} index - index of variable in array\n         */\n        function handleBrokerAction(actionType, index) {\n            if (actionType === 'delete') {\n                lodash.pullAt(ctrl.brokers, index);\n                lodash.pullAt(ctrl.item.attributes.brokers, index);\n\n                checkValidation('brokers');\n            }\n        }\n\n        /**\n         * Update data callback\n         * @param {string} newData\n         * @param {string} field\n         */\n        function inputValueCallback(newData, field) {\n            if (ctrl.isVolumeType() && field === 'name') {\n                lodash.set(ctrl.item, 'volumeMount.name', newData);\n                lodash.set(ctrl.item, 'volume.name', newData);\n            } else {\n                lodash.set(ctrl.item, field, newData);\n            }\n\n            validateValues();\n            updateChangesState();\n        }\n\n        /**\n         * Determines whether or not a field should be displayed.\n         * @param {Object} field - The field to test.\n         * @param {string} field.type - The type of the field.\n         * @param {boolean} field.visible - The visibility of the field.\n         * @returns {boolean} `true` in case the field should be displayed, or `false` otherwise.\n         */\n        function isFieldVisible(field) {\n            return lodash.defaultTo(field.visible, true) && lodash.includes(['input', 'dropdown', 'number-input', 'arrayInt'], field.type);\n        }\n\n        /**\n         * Checks for `http` triggers\n         * @returns {boolean}\n         */\n        function isHttpTrigger() {\n            return ctrl.selectedClass.id === 'http';\n        }\n\n        /**\n         * Checks for `kafka` triggers\n         * @returns {boolean}\n         */\n        function isKafkaTrigger() {\n            return ctrl.selectedClass.id === 'kafka-cluster';\n        }\n\n        /**\n         * Checks for `cron` triggers\n         * @returns {boolean}\n         */\n        function isCronTrigger() {\n            return ctrl.selectedClass.id === 'cron';\n        }\n\n        /**\n         * Checks if tooltip is visible.\n         * @returns {boolean}\n         */\n        function isSelectedClassMoreInfoVisible() {\n            return lodash.has(ctrl.selectedClass, 'moreInfoDescription');\n        }\n\n        /**\n         * Returns `true` if item is a trigger.\n         * @returns {boolean} `true` if item is a trigger, or `false` otherwise.\n         */\n        function isTriggerType() {\n            return ctrl.type === 'trigger';\n        }\n\n        /**\n         * Checks is input have to be visible for specific item type\n         * @returns {boolean}\n         */\n        function isVolumeType() {\n            return ctrl.type === 'volume';\n        }\n\n        /**\n         * Checks for `mqtt` triggers\n         * @returns {boolean}\n         */\n        function isMqttTrigger() {\n            return ctrl.selectedClass.id === 'mqtt';\n        }\n\n        /**\n         * Changes data of specific variable\n         * @param {Object} variable\n         * @param {number} index\n         */\n        function onChangeKeyValueData(variable, index) {\n            if (variable.ui.name === 'trigger.annotation') {\n                ctrl.annotations[index] = variable;\n\n                checkValidation('annotations');\n            } else if (variable.ui.name === 'ingress') {\n                ctrl.ingresses[index] = variable;\n\n                checkValidation('ingresses');\n            } else if (variable.ui.name === 'event.headers') {\n                ctrl.eventHeaders[index] = variable;\n\n                checkValidation('eventHeaders');\n            } else if (variable.ui.name === 'subscription') {\n                ctrl.subscriptions[index] = variable;\n\n                checkValidation('subscriptions');\n            } else if (variable.ui.name === 'topic') {\n                ctrl.topics[index] = variable;\n\n                checkValidation('topics');\n            } else if (variable.ui.name === 'broker') {\n                ctrl.brokers[index] = variable;\n\n                checkValidation('brokers');\n            }\n\n            updateChangesState();\n        }\n\n        /**\n         * Set empty string to `schedule` field of `cron` trigger\n         */\n        function onClearButtonClick() {\n            lodash.set(ctrl.item, 'attributes.schedule', '');\n\n            $timeout(function () {\n                updateChangesState();\n                validateValues();\n            });\n        }\n\n        /**\n         * Update item class callback\n         * @param {Object} item - item class/kind\n         */\n        // eslint-disable-next-line\n        function onSelectClass(item) {\n            ctrl.selectedClass = item;\n\n            if (ctrl.isVolumeType()) {\n                lodash.defaultsDeep(ctrl.item, {\n                    volume: {\n                        name: ''\n                    },\n                    volumeMount: {\n                        name: '',\n                        mountPath: ''\n                    }\n                });\n\n                if (item.id === 'v3io') {\n                    // see https://github.com/v3io/flex-fuse\n                    lodash.defaultsDeep(ctrl.item, {\n                        volume: {\n                            flexVolume: {\n                                driver: 'v3io/fuse',\n                                options: {\n                                    accessKey: '',\n                                    container: '',\n                                    subPath: ''\n                                }\n                            }\n                        }\n                    });\n\n                    cleanOtherVolumeClasses('flexVolume');\n                } else if (item.id === 'secret') {\n                    lodash.defaultsDeep(ctrl.item.volume, {\n                        secret: {\n                            secretName: ''\n                        }\n                    });\n\n                    cleanOtherVolumeClasses('secret');\n                } else if (item.id === 'configMap') {\n                    lodash.defaultsDeep(ctrl.item.volume, {\n                        configMap: {\n                            name: ''\n                        }\n                    });\n\n                    cleanOtherVolumeClasses('configMap');\n                } else if (item.id === 'persistentVolumeClaim') {\n                    lodash.defaultsDeep(ctrl.item.volume, {\n                        persistentVolumeClaim: {\n                            claimName: ''\n                        }\n                    });\n\n                    cleanOtherVolumeClasses('persistentVolumeClaim');\n                }\n\n                return;\n            }\n\n            ctrl.item = lodash.omit(ctrl.item, ['maxWorkers', 'url', 'secret', 'annotations', 'workerAvailabilityTimeoutMilliseconds', 'username', 'password', 'workerAllocatorName']);\n\n            ctrl.item.kind = item.id;\n            ctrl.item.attributes = {};\n            ctrl.item.ui.selectedClass = ctrl.selectedClass;\n\n            lodash.forEach(item.fields, function (field) {\n                lodash.set(ctrl.item, lodash.defaultTo(field.path, field.name), field.defaultValue);\n\n                if (field.name === 'ingresses') {\n                    ctrl.ingresses = [];\n                } else if (field.name === 'eventHeaders') {\n                    ctrl.eventHeaders = [];\n                } else if (field.name === 'subscriptions') {\n                    ctrl.subscriptions = [];\n                } else if (field.name === 'kafka-topics') {\n                    ctrl.topics = [{\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'topic'\n                        }\n                    }];\n                } else if (field.name === 'kafka-brokers') {\n                    ctrl.brokers = [{\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'broker'\n                        }\n                    }];\n                } else if (field.name === 'annotations') {\n                    ctrl.annotations = [];\n                }\n            });\n\n            var nameDirty = ctrl.editItemForm.itemName.$dirty;\n            var nameInvalid = ctrl.editItemForm.itemName.$invalid;\n\n            // set form pristine to not validate new form fields after class changed\n            ctrl.editItemForm.$setPristine();\n\n            // if itemName was invalid before - set it dirty to show invalid message after class changed\n            if (nameDirty && nameInvalid) {\n                ctrl.editItemForm.itemName.$setDirty();\n            }\n\n            if (lodash.isFunction(ctrl.onSelectClassCallback)) {\n                ctrl.onSelectClassCallback();\n            }\n\n            updateChangesState();\n        }\n\n        /**\n         * Sets new selected value from dropdown\n         * @param {Object} item - The selected item from dropdown menu.\n         * @param {string} field - The path of the model.\n         */\n        function onSelectDropdownValue(item, field) {\n            lodash.set(ctrl.item, field, item.id);\n\n            if (!item.typed && field === 'attributes.containerName') {\n                ctrl.item.url = lodash.get(ConfigService, 'nuclio.defaultFunctionConfig.attributes.spec.triggers.v3ioStream.url', '');\n            }\n\n            validateValues();\n            updateChangesState();\n        }\n\n        /**\n         * Changes value from number input\n         * @param {number} item\n         * @param {string} field\n         */\n        function numberInputCallback(item, field) {\n            lodash.set(ctrl.item, field, item);\n\n            validateValues();\n            updateChangesState();\n        }\n\n        /**\n         * On submit form handler\n         * Hides the item create/edit mode\n         * @param {MouseEvent|KeyboardEvent} event\n         */\n        function onSubmitForm(event) {\n            ctrl.item.ui.expandable = !ctrl.editItemForm.$invalid;\n\n            if (lodash.isUndefined(event.keyCode) || event.keyCode === EventHelperService.ENTER) {\n                if (event.target !== $element[0] && $element.find(event.target).length === 0 && (ctrl.isVolumeType() || areElementsValidOnSubmit(event))) {\n                    if (ctrl.editItemForm.$invalid) {\n                        ctrl.item.ui.isFormValid = false;\n\n                        $rootScope.$broadcast('change-state-deploy-button', {\n                            component: ctrl.item.ui.name,\n                            isDisabled: true\n                        });\n\n                        ctrl.editItemForm.itemName.$setDirty();\n\n                        // set form as submitted\n                        ctrl.editItemForm.$setSubmitted();\n                    } else {\n                        $timeout(function () {\n                            ctrl.item.ui.isFormValid = true;\n\n                            if (!lodash.includes(lodash.get(event.target, 'parentElement.classList'), 'row-collapse')) {\n                                ctrl.item.ui.editModeActive = false;\n                            }\n\n                            submitForm();\n                        });\n                    }\n                }\n            }\n        }\n\n        /**\n         * Return placeholder text for a field.\n         * @param {Object} field - The field.\n         * @returns {string} the placeholder text for the field.\n         */\n        function getFieldPlaceholderText(field) {\n            var fieldName = lodash.defaultTo(field.label, ctrl.convertFromCamelCase(field.name).toLowerCase());\n            var defaultPlaceholder = field.type === 'dropdown' ? $i18next.t('common:PLACEHOLDER.SELECT', { lng: lng }) : $i18next.t('common:PLACEHOLDER.ENTER_GENERIC', { lng: lng, fieldName: fieldName });\n            return lodash.defaultTo(field.placeholder, defaultPlaceholder);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Checks if click wasn't on one of the elements from the list\n         * @param {MouseEvent|KeyboardEvent} event - DOM event\n         * @returns {boolean} Returns `true` if click wasn't on one of elements from the list\n         */\n        function areElementsValidOnSubmit(event) {\n            var elementsForValidation = ['ncl-edit-item', '.actions-menu', '.single-action', '.ngdialog', '.mCustomScrollBox'];\n\n            return lodash.every(elementsForValidation, function (element) {\n                return element === '.mCustomScrollBox' && event.target.closest('.row-collapse') || !event.target.closest(element);\n            });\n        }\n\n        /**\n         * Checks validation of function's variables\n         * @param {string} variableName\n         */\n        function checkValidation(variableName) {\n            lodash.forEach(ctrl[variableName], function (variable) {\n                if (!variable.ui.isFormValid) {\n                    $rootScope.$broadcast('change-state-deploy-button', {\n                        component: variable.ui.name,\n                        isDisabled: true\n                    });\n                }\n            });\n        }\n\n        /**\n         * Removes volume classes except `selectedClass`\n         * @param {string} selectedClass\n         */\n        function cleanOtherVolumeClasses(selectedClass) {\n            var removeVolume = lodash.unset.bind(null, ctrl.item.volume);\n\n            lodash.chain(['flexVolume', 'secret', 'configMap', 'persistentVolumeClaim']).without(selectedClass).forEach(removeVolume).value();\n        }\n\n        /**\n         * Broadcast's callback to deploy function\n         * @param {Object} event - native `$rootScope.$broadcast` event object\n         * @param {{event: MouseEvent|KeyboardEvent}} data - broadcast data with DOM event\n         */\n        function onFunctionDeploy(event, data) {\n            ctrl.onSubmitForm(data.event);\n        }\n\n        /**\n         * Submits form\n         */\n        function submitForm() {\n            lodash.forEach(ctrl.selectedClass.fields, function (field) {\n                var path = lodash.defaultTo(field.path, field.name);\n                var fieldValue = lodash.get(ctrl.item, path);\n                if (field.pattern === 'number') {\n                    var emptyValue = lodash.isNil(fieldValue) || fieldValue === '';\n                    var numberValue = field.allowEmpty && emptyValue ? '' : Number(fieldValue);\n\n                    lodash.set(ctrl.item, path, numberValue);\n                }\n\n                if (field.pattern === 'arrayStr') {\n                    lodash.update(ctrl.item, path, ConverterService.toStringArray);\n                }\n\n                if (field.type === 'arrayInt' && !lodash.isArray(fieldValue)) {\n                    lodash.update(ctrl.item, path, ConverterService.toNumberArray);\n                }\n\n                if (field.name === 'ingresses') {\n                    var newIngresses = {};\n\n                    lodash.forEach(ctrl.ingresses, function (ingress, index) {\n                        newIngresses[index.toString()] = {\n                            paths: ingress.value.split(',')\n                        };\n\n                        if (!lodash.isEmpty(ingress.name)) {\n                            newIngresses[index.toString()].host = ingress.name;\n                        }\n\n                        if (!lodash.isEmpty(ingress.additionalValue)) {\n                            newIngresses[index.toString()].secretName = ingress.additionalValue;\n                        }\n                    });\n\n                    lodash.set(ctrl.item, path, newIngresses);\n                }\n\n                if (field.name === 'eventHeaders') {\n                    var newEventHeader = {};\n\n                    lodash.forEach(ctrl.eventHeaders, function (headers) {\n                        newEventHeader[headers.name] = headers.value;\n                    });\n\n                    lodash.set(ctrl.item, 'attributes.event.headers', newEventHeader);\n                }\n            });\n\n            if (ctrl.isHttpTrigger()) {\n                updateAnnotations();\n            }\n\n            if (ctrl.isMqttTrigger()) {\n                updateSubscriptions();\n            }\n\n            if (ctrl.isKafkaTrigger()) {\n                updateTopics();\n                updateBrokers();\n            }\n\n            $rootScope.$broadcast('change-state-deploy-button', {\n                component: ctrl.item.ui.name,\n                isDisabled: false\n            });\n\n            ctrl.onSubmitCallback({ item: ctrl.item });\n        }\n\n        /**\n         * Submits the form on clicking on the document outside of this element.\n         * @param {MouseEvent} event - The `click` event.\n         */\n        function submitOnClick(event) {\n            if (!lodash.isNil(ctrl.editItemForm)) {\n                onSubmitForm(event);\n            }\n        }\n\n        /**\n         * Updates annotations fields\n         */\n        function updateAnnotations() {\n            var newAnnotations = {};\n\n            lodash.forEach(ctrl.annotations, function (label) {\n                newAnnotations[label.name] = label.value;\n            });\n\n            lodash.set(ctrl.item, 'annotations', newAnnotations);\n        }\n\n        /**\n         * Updates `ctrl.item.ui.changed` property when user updates trigger\n         */\n        function updateChangesState() {\n            var currentChangesState = lodash.get(ctrl.item, 'ui.changed', false);\n\n            ctrl.item.ui.changed = !lodash.chain(ctrl.item).omit(['$$hashKey', 'ui']).isEqual(itemCopy).value();\n\n            if (currentChangesState !== ctrl.item.ui.changed) {\n                $rootScope.$broadcast('edit-item-has-been-changed', {});\n            }\n        }\n\n        /**\n         * Updates subscriptions fields\n         */\n        function updateSubscriptions() {\n            var newSubscriptions = lodash.map(ctrl.subscriptions, function (subscription) {\n                return {\n                    topic: subscription.name,\n                    qos: Number(subscription.value)\n                };\n            });\n\n            lodash.set(ctrl.item, 'attributes.subscriptions', newSubscriptions);\n        }\n\n        /**\n         * Updates topics fields\n         */\n        function updateTopics() {\n            var newTopics = lodash.map(ctrl.topics, 'value');\n\n            lodash.set(ctrl.item, 'attributes.topics', newTopics);\n        }\n\n        /**\n         * Updates Brokers fields\n         */\n        function updateBrokers() {\n            var newBrokers = lodash.map(ctrl.brokers, 'value');\n\n            lodash.set(ctrl.item, 'attributes.brokers', newBrokers);\n        }\n\n        /**\n         * Validate interval and schedule fields\n         */\n        /* eslint complexity: [\"error\", 11] */\n        function validateValues() {\n            if (ctrl.item.kind === 'cron') {\n                var scheduleField = lodash.find(ctrl.selectedClass.fields, { name: 'schedule' });\n                var intervalInputIsFilled = !lodash.isEmpty(ctrl.editItemForm.item_interval.$viewValue);\n                var scheduleInputIsFilled = !lodash.isEmpty(ctrl.editItemForm.item_schedule.$viewValue);\n                var bothFilled = intervalInputIsFilled && scheduleInputIsFilled;\n\n                scheduleField.allowEmpty = intervalInputIsFilled;\n                lodash.assign(scheduleField, {\n                    moreInfoIconType: bothFilled ? 'warn' : 'info',\n                    moreInfoOpen: bothFilled\n                });\n                ctrl.editItemForm.item_interval.$validate();\n                if (intervalInputIsFilled) {\n                    ctrl.editItemForm.item_interval.$setDirty();\n                }\n            } else if (ctrl.item.kind === 'rabbit-mq') {\n                var queueName = lodash.find(ctrl.selectedClass.fields, { name: 'queueName' });\n                var topics = lodash.find(ctrl.selectedClass.fields, { name: 'topics' });\n                var queueNameIsFilled = !lodash.isEmpty(ctrl.editItemForm.item_queueName.$viewValue);\n                var topicsIsFilled = !lodash.isEmpty(ctrl.editItemForm.item_topics.$viewValue);\n\n                // Queue Name and Topics cannot be both empty at the same time\n                // at least one of them should be filled\n                // if one of them is filled, the other is allowed to be empty\n                queueName.allowEmpty = topicsIsFilled;\n                topics.allowEmpty = queueNameIsFilled;\n\n                // update validity: if empty is not allowed and value is currently empty - mark invalid, otherwise valid\n                ctrl.editItemForm.item_queueName.$setValidity('text', queueName.allowEmpty || queueNameIsFilled);\n                ctrl.editItemForm.item_topics.$setValidity('text', topics.allowEmpty || topicsIsFilled);\n            } else if (ctrl.item.kind === 'kafka-cluster') {\n                ctrl.item.attributes.sasl.enable = !lodash.isEmpty(ctrl.item.attributes.sasl.user) && !lodash.isEmpty(ctrl.item.attributes.sasl.password);\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclFunctionConfigDialogController.$inject = ['ExportService'];\n    angular.module('iguazio.dashboard-controls').component('nclFunctionConfigDialog', {\n        bindings: {\n            closeDialog: '&',\n            function: '<'\n        },\n        templateUrl: 'nuclio/common/components/function-config-dialog/function-config-dialog.tpl.html',\n        controller: NclFunctionConfigDialogController\n    });\n\n    function NclFunctionConfigDialogController(ExportService) {\n        var ctrl = this;\n\n        ctrl.$onInit = onInit;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.title = ctrl.function.metadata.name + ' - configuration';\n            ctrl.sourceCode = ExportService.getFunctionConfig(ctrl.function);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclKeyValueInputController.$inject = ['$document', '$element', '$i18next', '$rootScope', '$scope', '$timeout', 'i18next', 'lodash', 'DialogsService', 'EventHelperService'];\n    angular.module('iguazio.dashboard-controls').component('nclKeyValueInput', {\n        bindings: {\n            actionHandlerCallback: '&',\n            additionalValueOptional: '<?',\n            allowSelection: '<?',\n            allValueTypes: '<',\n            changeDataCallback: '&',\n            changeStateBroadcast: '@?',\n            changeTypeCallback: '&?',\n            dropdownOverlap: '<?',\n            isDisabled: '<?',\n            itemIndex: '<',\n            keyList: '<?',\n            keyOptional: '<?',\n            keyPlaceholder: '@?',\n            keyTooltip: '<?',\n            keyValidationPattern: '<?',\n            listClass: '@?',\n            noDelete: '<?',\n            onlyValueInput: '<?',\n            rowData: '<',\n            submitOnFly: '<?',\n            useAdditionalValue: '<?',\n            useLabels: '<',\n            useType: '<',\n            validationRules: '<?',\n            valueOptional: '<?',\n            valuePlaceholder: '@?',\n            valueTooltip: '<?',\n            valueValidationPattern: '<?'\n        },\n        templateUrl: 'nuclio/common/components/key-value-input/key-value-input.tpl.html',\n        controller: NclKeyValueInputController\n    });\n\n    function NclKeyValueInputController($document, $element, $i18next, $rootScope, $scope, $timeout, i18next, lodash, DialogsService, EventHelperService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.data = {};\n        ctrl.keyValueInputForm = null;\n        ctrl.typesList = [];\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n        ctrl.$onDestroy = onDestroy;\n        ctrl.$onChanges = onChanges;\n\n        ctrl.onEditInput = onEditInput;\n        ctrl.getInputValue = getInputValue;\n        ctrl.getInputKey = getInputKey;\n        ctrl.getSelectedItem = getSelectedItem;\n        ctrl.getType = getType;\n        ctrl.isVisibleByType = isVisibleByType;\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.inputKeyCallback = inputKeyCallback;\n        ctrl.onClickAction = onClickAction;\n        ctrl.onFireAction = onFireAction;\n        ctrl.onKeyChanged = onKeyChanged;\n        ctrl.onTypeChanged = onTypeChanged;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.actions = initActions();\n            ctrl.data = lodash.cloneDeep(ctrl.rowData);\n            ctrl.editMode = lodash.get(ctrl.data, 'ui.editModeActive', false);\n            ctrl.typesList = getTypesList();\n\n            lodash.defaults(ctrl, {\n                allowSelection: false,\n                dropdownOverlap: false,\n                keyOptional: false,\n                keyPlaceholder: $i18next.t('functions:PLACEHOLDER.ENTER_KEY', { lng: lng }),\n                onlyValueInput: false,\n                isDisabled: false,\n                submitOnFly: false,\n                useAdditionalValue: false,\n                valuePlaceholder: $i18next.t('functions:PLACEHOLDER.ENTER_VALUE', { lng: lng })\n            });\n\n            $scope.$on('action-checkbox_item-checked', function () {\n                if (angular.isFunction(ctrl.changeDataCallback)) {\n                    ctrl.changeDataCallback({\n                        newData: ctrl.data,\n                        index: ctrl.itemIndex\n                    });\n                }\n            });\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n            $document.on('click', saveChanges);\n            $document.on('keypress', saveChanges);\n            ctrl.keyValueInputForm.$setPristine();\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            $document.off('click', saveChanges);\n            $document.off('keypress', saveChanges);\n\n            if (angular.isDefined(ctrl.changeStateBroadcast)) {\n                $rootScope.$broadcast(ctrl.changeStateBroadcast, {\n                    component: ctrl.data.ui.name,\n                    isDisabled: ctrl.keyValueInputForm.$invalid\n                });\n            }\n        }\n\n        /**\n         * On changes hook method\n         * @param {Object} changes\n         */\n        function onChanges(changes) {\n            if (lodash.has(changes, 'noDelete')) {\n                lodash.defaults(ctrl, {\n                    noDelete: false\n                });\n                ctrl.actions = initActions();\n            }\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Gets model for value input\n         * @returns {string}\n         */\n        function getInputValue() {\n            if (ctrl.useType) {\n                var specificType = ctrl.getType() === 'value' ? 'value' : ctrl.getType() === 'configmap' ? 'valueFrom.configMapKeyRef' :\n                /* else */'valueFrom.secretKeyRef';\n                var value = lodash.get(ctrl.data, specificType);\n\n                return specificType === 'value' ? value : value.name;\n            } else {\n                return ctrl.data.value;\n            }\n        }\n\n        /**\n         * Gets model for value-key input\n         * @returns {?string}\n         */\n        function getInputKey() {\n            if (ctrl.useType && ctrl.getType() !== 'value') {\n                var specificType = ctrl.getType() === 'configmap' ? 'valueFrom.configMapKeyRef' :\n                /* else */'valueFrom.secretKeyRef';\n                var value = lodash.get(ctrl.data, specificType);\n\n                return value.key;\n            } else {\n                return null;\n            }\n        }\n\n        /**\n         * Gets selected item in dropdown\n         * @returns {Object}\n         */\n        function getSelectedItem() {\n            return lodash.get(ctrl.data, 'name') === '' ? lodash.find(ctrl.keyList, ['disabled', false]) : ctrl.data;\n        }\n\n        /**\n         * Gets selected type\n         * @returns {string}\n         */\n        function getType() {\n            return !ctrl.useType || lodash.isNil(ctrl.data.valueFrom) ? 'value' : lodash.isNil(ctrl.data.valueFrom.secretKeyRef) ? 'configmap' :\n            /* else */'secret';\n        }\n\n        /**\n         * Check whether the block visibility match the given type\n         * @param {string} type\n         * @returns {boolean}\n         */\n        function isVisibleByType(type) {\n            return type === ctrl.getType();\n        }\n\n        /**\n         * Update data callback\n         * @param {string} newData\n         * @param {string} field\n         */\n        function inputValueCallback(newData, field) {\n            if (lodash.includes(field, 'value') && ctrl.getType() !== 'value') {\n\n                lodash.assign(lodash.get(ctrl.data, getValueField()), {\n                    name: newData\n                });\n            } else {\n                ctrl.data[field] = newData;\n\n                if (ctrl.keyList) {\n                    var keyData = getSelectedItem();\n                    lodash.set(ctrl.data, 'name', keyData.name);\n                }\n            }\n\n            if (ctrl.submitOnFly) {\n                saveChanges();\n            }\n        }\n\n        /**\n         * Update data callback\n         * @param {string} newData\n         */\n        function inputKeyCallback(newData) {\n            lodash.assign(lodash.get(ctrl.data, getValueField()), {\n                key: newData\n            });\n\n            if (ctrl.submitOnFly) {\n                saveChanges();\n            }\n        }\n\n        /**\n         * Handler on action click\n         * @param {Object} action - action that was clicked (e.g. `delete`)\n         */\n        function onClickAction(action) {\n            if (lodash.isNonEmpty(action.confirm)) {\n                showConfirmDialog(action);\n            } else {\n                onFireAction(action.id);\n            }\n        }\n\n        /**\n         * According to given action name calls proper action handler\n         * @param {string} actionType - a type of action\n         */\n        function onFireAction(actionType) {\n            ctrl.actionHandlerCallback({\n                actionType: actionType,\n                index: ctrl.itemIndex\n            });\n            ctrl.editMode = false;\n        }\n\n        /**\n         * Handles changing value of field Key in case it is a drop-down menu (on selecting an option).\n         * @param {Object} newKey - type selected in dropdown\n         */\n        function onKeyChanged(newKey) {\n            ctrl.data = lodash.omit(ctrl.data, 'valueFrom');\n            lodash.set(ctrl.data, 'name', newKey.name);\n\n            if (ctrl.submitOnFly) {\n                $timeout(saveChanges);\n            }\n        }\n\n        /**\n         * Callback method which handles field type changing\n         * @param {Object} newType - type selected in dropdown\n         * @param {boolean} isItemChanged - shows whether item was changed\n         */\n        function onTypeChanged(newType, isItemChanged) {\n            if (isItemChanged) {\n                if (newType.id === 'secret' || newType.id === 'configmap') {\n                    var specificType = newType.id === 'secret' ? 'secretKeyRef' : 'configMapKeyRef';\n                    var value = {\n                        key: '',\n                        name: ''\n                    };\n\n                    ctrl.data = lodash.omit(ctrl.data, ['value', 'valueFrom']);\n                    lodash.set(ctrl.data, 'valueFrom.' + specificType, value);\n                } else {\n                    ctrl.data = lodash.omit(ctrl.data, 'valueFrom');\n                    lodash.set(ctrl.data, 'value', '');\n                }\n\n                if (angular.isFunction(ctrl.changeTypeCallback)) {\n                    ctrl.changeTypeCallback({\n                        newType: newType,\n                        index: ctrl.itemIndex\n                    });\n                }\n\n                if (ctrl.submitOnFly) {\n                    $timeout(saveChanges);\n                }\n            }\n        }\n\n        /**\n         * Enables edit mode\n         */\n        function onEditInput() {\n            ctrl.editMode = true;\n\n            $document.on('click', saveChanges);\n            $document.on('keypress', saveChanges);\n        }\n\n        //\n        // Private method\n        //\n\n        /**\n         * Shows confirm dialog\n         * @param {Object} action - e.g. `delele`\n         */\n        function showConfirmDialog(action) {\n            var message = lodash.isNil(action.confirm.description) ? action.confirm.message : {\n                message: action.confirm.message,\n                description: action.confirm.description\n            };\n\n            DialogsService.confirm(message, action.confirm.yesLabel, action.confirm.noLabel, action.confirm.type).then(function () {\n                onFireAction(action.id);\n            });\n        }\n\n        /**\n         * Gets types list\n         * @returns {Array.<Object>}\n         */\n        function getTypesList() {\n            return [{\n                id: 'value',\n                name: $i18next.t('common:VALUE', { lng: lng })\n            }, {\n                id: 'secret',\n                name: $i18next.t('functions:SECRET', { lng: lng })\n            }, {\n                id: 'configmap',\n                name: $i18next.t('functions:CONFIGMAP', { lng: lng })\n            }];\n        }\n\n        /**\n         * Gets field which should be setted from value input\n         * @returns {string}\n         */\n        function getValueField() {\n            return !ctrl.useType || ctrl.getType() === 'value' ? 'value' : ctrl.getType() === 'configmap' ? 'valueFrom.configMapKeyRef' :\n            /* else */'valueFrom.secretKeyRef';\n        }\n\n        /**\n         * Gets actions\n         * @returns {Array.<Object>}\n         */\n        function initActions() {\n            return ctrl.noDelete ? [] : [{\n                label: $i18next.t('common:DELETE', { lng: lng }),\n                id: 'delete',\n                icon: 'igz-icon-trash',\n                active: true,\n                confirm: {\n                    message: $i18next.t('common:DELETE_SELECTED_ITEM_CONFIRM', { lng: lng }),\n                    yesLabel: $i18next.t('common:YES_DELETE', { lng: lng }),\n                    noLabel: $i18next.t('common:CANCEL', { lng: lng }),\n                    type: 'critical_alert'\n                }\n            }];\n        }\n\n        /**\n         * Calls callback with new data\n         * @param {Event} [event]\n         */\n        function saveChanges(event) {\n            if (angular.isUndefined(event) || $element.find(event.target).length === 0 || event.keyCode === EventHelperService.ENTER) {\n\n                $scope.$evalAsync(function () {\n\n                    // when the user attempts to apply the key-value item by clicking outside of it or pressing the\n                    // Enter key - the rest of the fields on the form should be re-validated, so invalid ones should\n                    // be displayed as invalid\n                    if (angular.isDefined(event)) {\n                        lodash.forEach(ctrl.keyValueInputForm.$getControls(), function (control) {\n                            control.$setDirty();\n                            control.$validate();\n                        });\n                    }\n\n                    if (ctrl.keyValueInputForm.$valid) {\n                        lodash.assign(ctrl.data.ui, {\n                            editModeActive: false,\n                            isFormValid: true\n                        });\n\n                        if (angular.isDefined(ctrl.changeStateBroadcast)) {\n                            $rootScope.$broadcast(ctrl.changeStateBroadcast, {\n                                component: ctrl.data.ui.name,\n                                isDisabled: false\n                            });\n                        }\n\n                        ctrl.editMode = false;\n\n                        $document.off('click', saveChanges);\n                        $document.off('keypress', saveChanges);\n                    } else {\n                        lodash.assign(ctrl.data.ui, {\n                            editModeActive: true,\n                            isFormValid: false\n                        });\n\n                        if (angular.isDefined(ctrl.changeStateBroadcast)) {\n                            $rootScope.$broadcast(ctrl.changeStateBroadcast, {\n                                component: ctrl.data.ui.name,\n                                isDisabled: true\n                            });\n                        }\n                    }\n\n                    ctrl.changeDataCallback({\n                        newData: ctrl.data,\n                        index: ctrl.itemIndex\n                    });\n                });\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclMonacoController.$inject = ['$scope', 'lodash'];\n    angular.module('iguazio.dashboard-controls').component('nclMonaco', {\n        bindings: {\n            language: '<',\n            functionSourceCode: '<',\n            onChangeSourceCodeCallback: '&',\n            selectedTheme: '<',\n            miniMonaco: '<?',\n            noTopPadding: '<?',\n            showLineNumbers: '<?',\n            showTextSizeDropdown: '<?',\n            readOnly: '<?',\n            wordWrap: '<?',\n            name: '@?'\n        },\n        templateUrl: 'nuclio/common/components/monaco/monaco.tpl.html',\n        controller: NclMonacoController\n    });\n\n    function NclMonacoController($scope, lodash) {\n        var ctrl = this;\n\n        ctrl.$onInit = onInit;\n        ctrl.$onChanges = onChanges;\n\n        ctrl.onCodeChange = onCodeChange;\n        ctrl.onTextSizeChange = onTextSizeChange;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.noTopPadding = lodash.defaultTo(ctrl.noTopPadding, ctrl.showTextSizeDropdown);\n\n            $scope.selectedCodeFile = {\n                code: ctrl.functionSourceCode\n            };\n\n            $scope.selectedFileLanguage = {\n                language: ctrl.language\n            };\n        }\n\n        /**\n         * On changes method\n         * @param {Object} changes\n         */\n        function onChanges(changes) {\n            if (angular.isDefined(changes.language) && !changes.language.isFirstChange()) {\n                $scope.selectedCodeFile = {\n                    code: $scope.selectedCodeFile.code\n                };\n\n                $scope.selectedFileLanguage = {\n                    language: changes.language.currentValue\n                };\n            }\n\n            if (angular.isDefined(changes.functionSourceCode) && !changes.functionSourceCode.isFirstChange()) {\n                $scope.selectedCodeFile = {\n                    code: changes.functionSourceCode.currentValue\n                };\n            }\n        }\n\n        /**\n         * On code change callback.\n         * igz-monaco-editor directive calls this callback with new changed content\n         * @param {string} newCode - changed code\n         */\n        function onCodeChange(newCode) {\n            if (angular.isFunction(ctrl.onChangeSourceCodeCallback)) {\n                ctrl.onChangeSourceCodeCallback({\n                    sourceCode: newCode,\n                    language: $scope.selectedCodeFile.language\n                });\n            }\n        }\n\n        /**\n         * On text size dropdown change\n         * @param {string} newTextSize\n         */\n        function onTextSizeChange(newTextSize) {\n            if (!lodash.isNil(newTextSize)) {\n                ctrl.selectedTextSize = newTextSize;\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclNavigationTabsController.$inject = ['$rootScope', '$state', '$timeout', 'lodash'];\n    angular.module('iguazio.dashboard-controls').component('nclNavigationTabs', {\n        bindings: {\n            tabItems: '<'\n        },\n        templateUrl: 'nuclio/common/components/navigation-tabs/navigation-tabs.tpl.html',\n        controller: NclNavigationTabsController\n    });\n\n    function NclNavigationTabsController($rootScope, $state, $timeout, lodash) {\n        var ctrl = this;\n        var isTestPaneToggled = true;\n\n        ctrl.isTestPaneClosed = false;\n        ctrl.isFunctionBuilding = isFunctionBuilding;\n        ctrl.isToggleButtonVisible = isToggleButtonVisible;\n        ctrl.toggleTestPane = toggleTestPane;\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Checks if it's 'building' state.\n         * @param {string} status - current status\n         * @returns {boolean}\n         */\n        function isFunctionBuilding(status) {\n            return !lodash.includes(['ready', 'error', 'not yet deployed'], status);\n        }\n\n        /**\n         * Checks if 'toggle test pane' button should be visible.\n         * It should, only when 'code' tab is reached.\n         * @returns {boolean}\n         */\n        function isToggleButtonVisible() {\n            var isButtonVisible = lodash.get($state.$current, 'self.url', null) === '/code';\n\n            if (!isButtonVisible) {\n                ctrl.isTestPaneClosed = false;\n\n                $rootScope.$broadcast('navigation-tabs_toggle-test-pane', { closeTestPane: ctrl.isTestPaneClosed });\n            }\n\n            return isButtonVisible;\n        }\n\n        /**\n         * Sends broadcast to toggle test pane.\n         */\n        function toggleTestPane() {\n            if (isTestPaneToggled) {\n                ctrl.isTestPaneClosed = !ctrl.isTestPaneClosed;\n                isTestPaneToggled = false;\n\n                $rootScope.$broadcast('navigation-tabs_toggle-test-pane', { closeTestPane: ctrl.isTestPaneClosed });\n\n                // wait until toggling animation will be completed\n                $timeout(function () {\n                    isTestPaneToggled = true;\n                }, 600);\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NavigationTabsService.$inject = ['$i18next', 'i18next', 'lodash', 'ConfigService'];\n    angular.module('iguazio.dashboard-controls').factory('NavigationTabsService', NavigationTabsService);\n\n    function NavigationTabsService($i18next, i18next, lodash, ConfigService) {\n        return {\n            getNavigationTabsConfig: getNavigationTabsConfig\n        };\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Returns navigation tabs config depending on current state\n         * @param {string} state\n         * @returns {Array}\n         */\n        function getNavigationTabsConfig(state) {\n            var navigationTabsConfigs = {\n                'app.container': getContainersConfig(),\n                'app.cluster': getClustersConfig(),\n                'app.events': getEventsConfig(),\n                'app.storage-pool': getStoragePoolsConfig(),\n                'app.identity': getIdentityConfig(),\n                'app.control-panel': getControlPanelConfig()\n            };\n            var stateTest = state.match(/^[^.]*.[^.]*/);\n\n            return lodash.get(navigationTabsConfigs, stateTest[0], []);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Returns containers navigation tabs config\n         * @returns {Array.<Object>}\n         */\n        function getContainersConfig() {\n            var lng = i18next.language;\n\n            var config = [{\n                tabName: $i18next.t('common:OVERVIEW', { lng: lng }),\n                id: 'overview',\n                uiRoute: 'app.container.overview',\n                capability: 'containers.overview'\n            }, {\n                tabName: $i18next.t('common:BROWSE', { lng: lng }),\n                id: 'browse',\n                uiRoute: 'app.container.browser',\n                capability: 'containers.browse'\n            }, {\n                tabName: $i18next.t('common:DATA_ACCESS_POLICY', { lng: lng }),\n                id: 'dataAccessPolicy',\n                uiRoute: 'app.container.data-access-policy',\n                capability: 'containers.dataPolicy'\n            }];\n\n            if (ConfigService.isStagingMode()) {\n                config.push({\n                    tabName: $i18next.t('common:DATA_LIFECYCLE', { lng: lng }),\n                    id: 'dataLifecycle',\n                    uiRoute: 'app.container.data-lifecycle',\n                    capability: 'containers.dataLifecycle'\n                });\n            }\n\n            if (ConfigService.isDemoMode()) {\n                config.splice(1, 0, {\n                    tabName: $i18next.t('common:ANALYTICS', { lng: lng }),\n                    id: 'analytics',\n                    uiRoute: 'app.container.analytics',\n                    capability: 'containers.analytics'\n                });\n            }\n\n            return config;\n        }\n\n        /**\n         * Returns clusters navigation tabs config\n         * @returns {Array.<Object>}\n         */\n        function getClustersConfig() {\n            var lng = i18next.language;\n\n            return [{\n                tabName: $i18next.t('common:NODES', { lng: lng }),\n                id: 'nodes',\n                uiRoute: 'app.cluster.nodes',\n                capability: 'clusters.nodes'\n            }];\n        }\n\n        /**\n         * Returns storage pools navigation tabs config\n         * @returns {Array.<Object>}\n         */\n        function getStoragePoolsConfig() {\n            var lng = i18next.language;\n\n            var config = [{\n                tabName: $i18next.t('common:OVERVIEW', { lng: lng }),\n                id: 'overview',\n                uiRoute: 'app.storage-pool.overview',\n                capability: 'storagePools.overview'\n            }, {\n                tabName: $i18next.t('common:DEVICES', { lng: lng }),\n                id: 'devices',\n                uiRoute: 'app.storage-pool.devices',\n                capability: 'storagePools.listDevices'\n            }];\n\n            if (ConfigService.isStagingMode()) {\n                config.splice(1, 0, {\n                    tabName: $i18next.t('common:CONTAINERS', { lng: lng }),\n                    id: 'containers',\n                    uiRoute: 'app.storage-pool.containers',\n                    capability: 'storagePools.listContainers'\n                });\n            }\n\n            return config;\n        }\n\n        /**\n         * Returns control panel navigation tabs config\n         * @returns {Array.<Object>}\n         */\n        function getControlPanelConfig() {\n            var lng = i18next.language;\n\n            return [{\n                tabName: $i18next.t('common:LOGS', { lng: lng }),\n                id: 'logs',\n                uiRoute: 'app.control-panel.logs'\n            }];\n        }\n\n        /**\n         * Returns identity navigation tabs config\n         * @returns {Array.<Object>}\n         */\n        function getIdentityConfig() {\n            var lng = i18next.language;\n\n            var config = [{\n                tabName: $i18next.t('common:USERS', { lng: lng }),\n                id: 'users',\n                uiRoute: 'app.identity.users',\n                capability: 'identity.users'\n            }, {\n                tabName: $i18next.t('common:GROUPS', { lng: lng }),\n                id: 'groups',\n                uiRoute: 'app.identity.groups',\n                capability: 'identity.groups'\n            }];\n\n            if (ConfigService.isStagingMode()) {\n                config.push({\n                    tabName: $i18next.t('common:IDP', { lng: lng }),\n                    id: 'idp',\n                    uiRoute: 'app.identity.idp',\n                    capability: 'identity.idp'\n                });\n            }\n\n            return config;\n        }\n\n        /**\n         * Returns events navigation tabs config\n         * @returns {Array.<Object>}\n         */\n        function getEventsConfig() {\n            var lng = i18next.language;\n\n            var config = [{\n                tabName: $i18next.t('common:EVENT_LOG', { lng: lng }),\n                id: 'eventLog',\n                uiRoute: 'app.events.event-log',\n                capability: 'events.eventLog'\n            }, {\n                tabName: $i18next.t('common:ALERTS', { lng: lng }),\n                id: '',\n                uiRoute: 'app.events.alerts',\n                capability: 'events.alerts'\n            }];\n\n            if (ConfigService.isStagingMode()) {\n                config.push({\n                    tabName: $i18next.t('common:ESCALATION', { lng: lng }),\n                    id: 'escalation',\n                    uiRoute: 'app.events.escalation',\n                    capability: 'events.escalations'\n                }, {\n                    tabName: $i18next.t('common:TASKS', { lng: lng }),\n                    id: 'tasks',\n                    uiRoute: 'app.events.tasks',\n                    capability: 'events.tasks'\n                });\n            }\n\n            return config;\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    SearchInputController.$inject = ['$scope', '$timeout'];\n    angular.module('iguazio.dashboard-controls').component('nclSearchInput', {\n        bindings: {\n            dataSet: '<',\n            searchKeys: '<',\n            searchStates: '<',\n            searchCallback: '&?',\n            isSearchHierarchically: '@?',\n            placeholder: '@',\n            type: '@?',\n            ruleType: '@?',\n            searchType: '@?'\n        },\n        templateUrl: 'nuclio/common/components/nuclio-search-input/search-input.tpl.html',\n        controller: SearchInputController\n    });\n\n    function SearchInputController($scope, $timeout) {\n        var ctrl = this;\n\n        ctrl.searchQuery = '';\n\n        ctrl.$onInit = onInit;\n        ctrl.onPressEnter = onPressEnter;\n        ctrl.clearInputField = clearInputField;\n\n        //\n        // Hook method\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            $scope.$watch('$ctrl.searchQuery', onChangeSearchQuery);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Initializes search on press enter\n         * @param {Event} e\n         */\n        function onPressEnter(e) {\n            if (e.keyCode === 13) {\n                makeSearch();\n            }\n        }\n\n        /**\n         * Clear search input field\n         */\n        function clearInputField() {\n            ctrl.searchQuery = '';\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Calls service method for search\n         */\n        function makeSearch() {}\n        // TODO\n\n\n        /**\n         * Tracks input changing and initializes search\n         */\n        function onChangeSearchQuery(newValue, oldValue) {\n            if (angular.isDefined(newValue) && newValue !== oldValue) {\n                makeSearch();\n            }\n        }\n\n        /**\n         * Initializes search when all html has been rendered\n         */\n        function onDataChanged() {\n            $timeout(makeSearch);\n        }\n\n        /**\n         * Resets search query and initializes search\n         */\n        function resetSearch() {\n            ctrl.searchQuery = '';\n            $timeout(makeSearch);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    require.config({ paths: { 'vs': '/assets/monaco-editor/min/vs' } });\n\n    angular.module('iguazio.dashboard-controls').directive('igzMonacoEditor', ['lodash', function (lodash) {\n        function link(scope, element, attrs) {\n            var editorElement = element[0];\n            require(['vs/editor/editor.main'], function () {\n                var editorContext = {\n                    scope: scope,\n                    element: element,\n                    attrs: attrs,\n                    onThemeChanged: function onThemeChanged(newValue, oldValue) {\n                        window.monaco.editor.setTheme(lodash.defaultTo(newValue, 'vs-dark'));\n                    },\n                    onFileLanguageChanged: function onFileLanguageChanged(newValue) {\n                        // update the language model (and set `insertSpaces`)\n                        var newModel = window.monaco.editor.createModel('', newValue.language);\n                        newModel.updateOptions({ insertSpaces: lodash.defaultTo(newValue.useSpaces, true) });\n                        this.editor.setModel(newModel);\n\n                        // update the code\n                        this.editor.setValue(scope.codeFile.code);\n                    },\n                    onCodeFileChanged: function onCodeFileChanged() {\n                        if (!lodash.isEqual(this.editor.getValue(), scope.codeFile.code)) {\n                            this.editor.setValue(scope.codeFile.code);\n                        }\n                    },\n                    onReadOnlyCodeFileChanged: function onReadOnlyCodeFileChanged() {\n                        this.editor.setValue(scope.codeFile.code);\n                    },\n                    onWrapStateChanged: function onWrapStateChanged(newState) {\n                        this.editor.updateOptions({ wordWrap: newState ? 'on' : 'off' });\n                    },\n                    onFontSizeChanged: function onFontSizeChanged(newFontSize) {\n                        this.editor.updateOptions({ fontSize: newFontSize });\n                    }\n                };\n\n                editorContext.editor = window.monaco.editor.defineTheme('custom-vs', {\n                    base: 'vs',\n                    inherit: true,\n                    rules: [{ token: '', foreground: '474056', background: 'ffffff' }, { token: 'number', foreground: '474056' }, { token: 'delimiter', foreground: '474056' }, { token: 'string', foreground: '21d4ac' }],\n                    colors: {\n                        'editor.foreground': '#474056',\n                        'editor.background': '#ffffff',\n                        'editorLineNumber.foreground': '#474056',\n                        'editorGutter.background': '#e1e0e5',\n                        'textBlockQuote.border': '#ffffff',\n                        'editorCursor.foreground': '#8B0000',\n                        'editor.lineHighlightBackground': '#e1e0e5',\n                        'editorMarkerNavigation.background': '#000000',\n                        'editor.selectionBackground': '#239bca',\n                        'editorIndentGuide.background': '#e1e0e5'\n                    }\n                });\n\n                editorContext.editor = window.monaco.editor.create(editorElement, {\n                    value: scope.codeFile.code,\n                    language: scope.fileLanguage.language,\n                    theme: 'vs',\n                    automaticLayout: true,\n                    dragAndDrop: true,\n                    lineNumbersMinChars: scope.miniMonaco ? 2 : 5,\n                    lineNumbers: scope.miniMonaco && !scope.showLineNumbers ? 'off' : 'on', // hide line number if it's a mini-monaco\n                    minimap: {\n                        enabled: !scope.miniMonaco // hide mini-map if it's a mini-monaco\n                    },\n                    readOnly: scope.readOnly,\n                    wordWrap: scope.wordWrap ? 'on' : 'off'\n                });\n\n                // change content callback\n                editorContext.editor.onDidChangeModelContent(function () {\n\n                    // call callback from upper scope (monaco component) with new changed code\n                    scope.onCodeChange(editorContext.editor.getValue());\n                });\n\n                // set up watch for codeFile changes to reflect updates\n                scope.$watch('fileLanguage', editorContext.onFileLanguageChanged.bind(editorContext));\n                scope.$watch('editorTheme', editorContext.onThemeChanged.bind(editorContext));\n                scope.$watch('wordWrap', editorContext.onWrapStateChanged.bind(editorContext));\n                scope.$watch('codeFile', editorContext.onCodeFileChanged.bind(editorContext));\n                scope.$watch('fontSize', editorContext.onFontSizeChanged.bind(editorContext));\n\n                scope.$on('function-import-source-code', editorContext.onReadOnlyCodeFileChanged.bind(editorContext));\n            });\n        }\n\n        return {\n            link: link,\n            scope: {\n                codeFile: '=codeFile',\n                editorTheme: '=editorTheme',\n                fontSize: '=fontSize',\n                fileLanguage: '=fileLanguage',\n                miniMonaco: '=miniMonaco',\n                showLineNumbers: '=showLineNumbers',\n                onCodeChange: '=onCodeChange',\n                readOnly: '=readOnly',\n                wordWrap: '=wordWrap'\n            }\n        };\n    }]);\n\n    require(['vs/editor/editor.main'], function () {\n        window.monaco.languages.registerCompletionItemProvider('python', {\n            provideCompletionItems: function provideCompletionItems() {\n                return [{\n                    label: 'def',\n                    kind: window.monaco.languages.CompletionItemKind.Keyword,\n                    insertText: {\n                        value: 'def ${1:name}():\\r\\t$0'\n                    }\n                }];\n            }\n        });\n    });\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    CreateFunctionController.$inject = ['$element', '$rootScope', '$scope', '$state', '$stateParams', '$i18next', 'i18next', 'ngDialog', 'lodash', 'DialogsService', 'NuclioHeaderService'];\n    angular.module('iguazio.dashboard-controls').component('nclCreateFunction', {\n        bindings: {\n            createProject: '&',\n            getFunction: '&',\n            getProject: '&',\n            getProjects: '&',\n            getTemplates: '&',\n            renderTemplate: '&',\n            templates: '<'\n        },\n        templateUrl: 'nuclio/common/screens/create-function/create-function.tpl.html',\n        controller: CreateFunctionController\n    });\n\n    function CreateFunctionController($element, $rootScope, $scope, $state, $stateParams, $i18next, i18next, ngDialog, lodash, DialogsService, NuclioHeaderService) {\n        var ctrl = this;\n        var lng = i18next.language;\n        var selectedFunctionType = 'from_template';\n\n        ctrl.isSplashShowed = {\n            value: true\n        };\n        ctrl.project = {};\n        ctrl.projects = [];\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                updateOnContentResize: true\n            },\n            callbacks: {\n                onUpdate: onContainerResize\n            }\n        };\n        ctrl.selectedProject = null;\n        ctrl.horizontalScrollConfig = {\n            axis: 'x',\n            advanced: {\n                updateOnContentResize: true\n            }\n        };\n\n        ctrl.$onInit = onInit;\n\n        ctrl.cancelCreating = cancelCreating;\n        ctrl.createNewProject = createNewProject;\n        ctrl.toggleSplashScreen = toggleSplashScreen;\n        ctrl.isTypeSelected = isTypeSelected;\n        ctrl.selectFunctionType = selectFunctionType;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n\n            // get all projects, only if project wasn't selected before. In other words:\n            // whether New Function screen was opened from Projects or Functions screen.\n            if (lodash.includes(['home-page', 'projects', '/', ''], $stateParams.navigatedFrom)) {\n                ctrl.getProjects().then(function (response) {\n                    ctrl.projects = response;\n\n                    // breadcrumbs config\n                    var title = {\n                        function: 'Create function'\n                    };\n\n                    if (!lodash.isEmpty(ctrl.projects)) {\n\n                        // get first project\n                        var project = lodash.find(ctrl.projects);\n\n                        ctrl.selectedProject = {\n                            id: project.metadata.name,\n                            name: lodash.defaultTo(project.spec.displayName, project.metadata.name)\n                        };\n                    }\n\n                    $rootScope.$broadcast('update-main-header-title', title);\n                }).catch(function (error) {\n                    var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_PROJECTS', { lng: lng });\n\n                    DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n\n                    $state.go($stateParams.navigatedFrom === 'home-page' ? 'app.home' : 'app.projects');\n                }).finally(function () {\n                    ctrl.isSplashShowed.value = false;\n                });\n            } else {\n                ctrl.getProject({ id: $stateParams.projectId }).then(function (project) {\n                    ctrl.project = project;\n\n                    // breadcrumbs config\n                    var title = {\n                        project: project,\n                        function: 'Create function'\n                    };\n\n                    NuclioHeaderService.updateMainHeader('common:PROJECTS', title, $state.current.name);\n                }).catch(function (error) {\n                    var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_PROJECT', { lng: lng });\n\n                    DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n\n                    $state.go('app.projects');\n                }).finally(function () {\n                    ctrl.isSplashShowed.value = false;\n                });\n            }\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Cancels creating a function\n         */\n        function cancelCreating(event) {\n            event.preventDefault();\n\n            if (!lodash.isEmpty(ctrl.project)) {\n                $state.go('app.project.functions', {\n                    projectId: ctrl.project.metadata.name,\n                    createCancelled: true\n                });\n            } else {\n                $state.go('app.projects');\n            }\n        }\n\n        /**\n         * New project dialog\n         */\n        function createNewProject() {\n            ctrl.createProject().then(function (data) {\n                if (!lodash.isNil(data.value)) {\n                    ctrl.isSplashShowed.value = true;\n\n                    ctrl.getProjects().then(function (response) {\n                        ctrl.projects = response;\n                        var createdProject = lodash.find(ctrl.projects, ['metadata.name', data.value.metadata.name]);\n\n                        ctrl.selectedProject = {\n                            id: createdProject.metadata.name,\n                            name: createdProject.metadata.name\n                        };\n                    }).catch(function (error) {\n                        var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_PROJECTS', { lng: lng });\n\n                        DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n                    }).finally(function () {\n                        ctrl.isSplashShowed.value = false;\n                    });\n\n                    $rootScope.$broadcast('close-drop-down');\n                }\n            });\n        }\n\n        /**\n         * Toggles splash screen.\n         * If value is undefined then sets opposite itself's value, otherwise sets provided value.\n         * @param {boolean} value - value to be set\n         */\n        function toggleSplashScreen(value) {\n            ctrl.isSplashShowed.value = lodash.defaultTo(value, !ctrl.isSplashShowed.value);\n        }\n\n        /**\n         * Checks which function type is visible.\n         * Returns true if 'functionType' is equal to 'selectedFunctionType'. Which means that function with type from\n         * argument 'functionType' should be visible.\n         * @param {string} functionType\n         * @returns {boolean}\n         */\n        function isTypeSelected(functionType) {\n            return lodash.isEqual(selectedFunctionType, functionType);\n        }\n\n        /**\n         * Sets selected function type\n         * @param {string} functionType\n         */\n        function selectFunctionType(functionType) {\n            if (!lodash.isEqual(functionType, selectedFunctionType)) {\n                selectedFunctionType = functionType;\n            }\n        }\n\n        /**\n         * Scrollbar callback.\n         * If we create function from template, then resize templates wrapper according to inner content.\n         * Needed to place 'Create function' button on right position.\n         */\n        function onContainerResize() {\n            var templatesWrapper = $element.find('.templates-wrapper');\n\n            // width of one template\n            var templateWidth = 368;\n\n            if (selectedFunctionType === 'from_template') {\n                templatesWrapper.css('width', '100%');\n\n                // count amount of templates in one line\n                var elementsPerLine = Math.floor(parseInt(templatesWrapper.css('width')) / templateWidth);\n\n                templatesWrapper.css('width', templateWidth * elementsPerLine + 'px');\n            }\n        }\n    }\n})();\n'use strict';\n\n/* eslint max-statements: [\"error\", 100] */\n(function () {\n    'use strict';\n\n    NclFunctionVersionRowController.$inject = ['$state', '$i18next', 'i18next', 'lodash', 'ActionCheckboxAllService', 'ConfigService', 'FunctionsService', 'NuclioHeaderService', 'TableSizeService'];\n    angular.module('iguazio.dashboard-controls').component('nclFunctionVersionRow', {\n        bindings: {\n            actionHandlerCallback: '&',\n            convertedStatusState: '<',\n            function: '<',\n            invocationUrl: '<',\n            isFunctionCollapsed: '<',\n            project: '<',\n            statusIcon: '<',\n            toggleFunctionState: '&',\n            version: '<',\n            versionsList: '<'\n        },\n        templateUrl: 'nuclio/functions/function-collapsing-row/function-version-row/function-version-row.tpl.html',\n        controller: NclFunctionVersionRowController\n    });\n\n    function NclFunctionVersionRowController($state, $i18next, i18next, lodash, ActionCheckboxAllService, ConfigService, FunctionsService, NuclioHeaderService, TableSizeService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.versionActions = [];\n        ctrl.runtimes = {\n            'golang': 'Go',\n            'python:2.7': 'Python 2.7',\n            'python:3.6': 'Python 3.6',\n            'dotnetcore': '.NET Core',\n            'java': 'Java',\n            'nodejs': 'NodeJS',\n            'shell': 'Shell',\n            'ruby': 'Ruby'\n        };\n        ctrl.title = null;\n\n        ctrl.$onInit = onInit;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.onFireAction = onFireAction;\n        ctrl.onSelectRow = onSelectRow;\n        ctrl.onToggleFunctionState = onToggleFunctionState;\n\n        ctrl.functionsService = FunctionsService;\n        ctrl.getFunctionsTableColSize = TableSizeService.getFunctionsTableColSize;\n        ctrl.isDemoMode = ConfigService.isDemoMode;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.title = {\n                project: ctrl.project,\n                function: ctrl.function.metadata.name,\n                version: ctrl.version.name\n            };\n\n            lodash.defaultsDeep(ctrl.version, {\n                ui: {\n                    checked: false,\n                    delete: deleteVersion,\n                    edit: editVersion\n                }\n            });\n\n            initVersionActions();\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            if (lodash.get(ctrl.version, 'ui.checked')) {\n                lodash.set(ctrl.version, 'ui.checked', false);\n\n                ActionCheckboxAllService.changeCheckedItemsCount(-1);\n            }\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * According to given action name calls proper action handler\n         * @param {string} actionType - a type of action\n         */\n        function onFireAction(actionType) {\n            ctrl.actionHandlerCallback({ actionType: actionType, checkedItems: [ctrl.version] });\n        }\n\n        /**\n         * Handles mouse click on a table row and navigates to Code page\n         * @param {MouseEvent} event\n         * @param {string} state - absolute state name or relative state path\n         */\n        function onSelectRow(event, state) {\n            if (lodash.isNil(event.target.closest('.igz-action-item'))) {\n                if (!angular.isString(state)) {\n                    state = 'app.project.function.edit.code';\n                }\n\n                event.preventDefault();\n                event.stopPropagation();\n\n                $state.go(state, {\n                    id: ctrl.project.metadata.name,\n                    projectId: ctrl.project.metadata.name,\n                    functionId: ctrl.function.metadata.name,\n                    projectNamespace: ctrl.project.metadata.namespace\n                });\n\n                NuclioHeaderService.updateMainHeader('common:PROJECTS', ctrl.title, $state.current.name);\n            }\n        }\n\n        /**\n         * Handles mouse click on toggle function state\n         * @param {MouseEvent} event\n         */\n        function onToggleFunctionState(event) {\n            ctrl.toggleFunctionState({ event: event });\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Deletes project from projects list\n         */\n        function deleteVersion() {}\n        // TODO no versions till now\n\n\n        /**\n         * Opens `Edit project` dialog\n         */\n        function editVersion() {\n            $state.go('app.project.function.edit.code', {\n                projectId: ctrl.project.metadata.name,\n                functionId: ctrl.function.metadata.name,\n                projectNamespace: ctrl.project.metadata.namespace\n            });\n        }\n\n        /**\n         * Initializes version actions\n         */\n        function initVersionActions() {\n            ctrl.versionActions = angular.copy(FunctionsService.initVersionActions());\n\n            var deleteAction = lodash.find(ctrl.versionActions, { 'id': 'delete' });\n\n            if (!lodash.isNil(deleteAction)) {\n                deleteAction.confirm.message = $i18next.t('functions:DELETE_VERSION', { lng: lng }) + ' “' + ctrl.version.name + '”?';\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclFunctionEventDialogController.$inject = ['$timeout', '$i18next', 'i18next', 'lodash', 'EventHelperService'];\n    angular.module('iguazio.dashboard-controls').component('nclFunctionEventDialog', {\n        bindings: {\n            closeDialog: '&',\n            createEvent: '<',\n            selectedEvent: '<',\n            version: '<',\n            createFunctionEvent: '&'\n        },\n        templateUrl: 'nuclio/functions/version/function-event-dialog/function-event-dialog.tpl.html',\n        controller: NclFunctionEventDialogController\n    });\n\n    function NclFunctionEventDialogController($timeout, $i18next, i18next, lodash, EventHelperService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.inputModelOptions = {\n            debounce: {\n                'default': 0\n            }\n        };\n        ctrl.buttonText = $i18next.t('common:CREATE', { lng: lng });\n        ctrl.errorText = $i18next.t('functions:ERROR_MSG.CREATE_FUNCTION_EVENT', { lng: lng });\n        ctrl.titleText = $i18next.t('functions:CREATE_FUNCTION_EVENT', { lng: lng });\n        ctrl.contentType = 'application/json';\n        ctrl.bodyTheme = 'vs-light';\n        ctrl.isLoadingState = false;\n        ctrl.isDeployFailed = false;\n        ctrl.isFormChanged = false;\n        ctrl.methods = [{\n            id: 'POST',\n            visible: true,\n            name: 'POST'\n        }, {\n            id: 'GET',\n            visible: true,\n            name: 'GET'\n        }, {\n            id: 'PUT',\n            visible: true,\n            name: 'PUT'\n        }, {\n            id: 'PATCH',\n            visible: true,\n            name: 'PATCH'\n        }, {\n            id: 'DELETE',\n            visible: true,\n            name: 'DELETE'\n        }];\n        ctrl.headers = [{\n            id: 'application/json',\n            visible: true,\n            name: 'JSON'\n        }, {\n            id: 'text/plain',\n            visible: true,\n            name: 'Plain text'\n        }];\n        ctrl.selectedMethod = null;\n        ctrl.selectedHeader = null;\n        ctrl.workingCopy = null;\n\n        ctrl.$onInit = onInit;\n\n        ctrl.applyChanges = applyChanges;\n        ctrl.closeEventDialog = closeEventDialog;\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.onChangeBody = onChangeBody;\n        ctrl.onChangeSourceCode = onChangeSourceCode;\n        ctrl.onSelectHeader = onSelectHeader;\n        ctrl.onSelectMethod = onSelectMethod;\n\n        //\n        // Hooks method\n        //\n\n        /**\n         * Init method\n         */\n        function onInit() {\n\n            // check if dialog was opened to create event, or edit existing event.\n            // if ctrl.createEvent is 'true', that mean dialog was open to create new event.\n            // otherwise, for edit existing event, so need to change all corresponding labels.\n            if (!ctrl.createEvent) {\n                ctrl.titleText = $i18next.t('functions:EDIT_FUNCTION_EVENT', { lng: lng });\n                ctrl.buttonText = $i18next.t('common:APPLY', { lng: lng });\n                ctrl.errorText = $i18next.t('functions:ERROR_MSG.UPDATE_FUNCTION_EVENT', { lng: lng });\n            }\n\n            // if ctrl.selectedEvent hasn't specific fields, that means event was not deployed before, so fill it with default data\n            lodash.defaultsDeep(ctrl.selectedEvent, {\n                metadata: {\n                    namespace: lodash.get(ctrl.version, 'metadata.namespace'),\n                    labels: {\n                        'nuclio.io/function-name': lodash.get(ctrl.version, 'metadata.name')\n                    }\n                },\n                spec: {\n                    displayName: '',\n                    triggerKind: 'http',\n                    attributes: {\n                        method: 'POST',\n                        headers: {\n                            'Content-Type': 'application/json'\n                        },\n                        path: ''\n                    },\n                    body: ''\n                }\n            });\n\n            // copy event to prevent modifying the original object\n            ctrl.workingCopy = angular.copy(ctrl.selectedEvent);\n\n            // get method from event.\n            ctrl.selectedMethod = lodash.find(ctrl.methods, ['id', lodash.get(ctrl.selectedEvent, 'spec.attributes.method')]);\n\n            // get content type from event.\n            ctrl.contentType = lodash.get(ctrl.selectedEvent, 'spec.attributes.headers.Content-Type');\n\n            // get header from event.\n            ctrl.selectedHeader = lodash.find(ctrl.headers, ['id', ctrl.contentType]);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Saves newly created event on beck-end.\n         * If error occurs while saving event, then dialog remains open.\n         * @param {Event} event - JS event object\n         */\n        function applyChanges(event) {\n            ctrl.functionEventForm.$setSubmitted();\n\n            if ((angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) && ctrl.functionEventForm.$valid && ctrl.isFormChanged) {\n\n                // show 'Loading...' button\n                ctrl.isLoadingState = true;\n\n                // save created event on beck-end\n                ctrl.createFunctionEvent({ eventData: ctrl.workingCopy, isNewEvent: ctrl.createEvent }).then(function () {\n                    ctrl.isDeployFailed = false;\n\n                    // close dialog with newly created or updated event data, and state of event.\n                    ctrl.closeDialog({\n                        result: {\n                            isEventDeployed: true, // If isEventDeployed is 'true' that mean - dialog was closed after creating event, not by pressing 'X' button.\n                            selectedEvent: ctrl.workingCopy\n                        }\n                    });\n                }).catch(function () {\n\n                    // dialog remains open.\n                    // show error text\n                    ctrl.isDeployFailed = true;\n\n                    // hide 'Loading...' button\n                    ctrl.isLoadingState = false;\n                });\n            }\n        }\n\n        /**\n         * Closes dialog\n         */\n        function closeEventDialog() {\n\n            // close dialog only if event is not deploying. Means event was deployed / failed / not changed\n            if (!ctrl.isLoadingState) {\n                ctrl.closeDialog({\n                    result: {\n                        isEventDeployed: false,\n                        selectedEvent: ctrl.selectedEvent\n                    }\n                });\n            }\n        }\n\n        /**\n         * Sets new data from \"Name\" field to event object\n         * @param {string} newData - data to be set\n         * @param {string} field - field which was changed\n         */\n        function inputValueCallback(newData, field) {\n            lodash.set(ctrl.workingCopy.spec, field === 'path' ? 'attributes.path' : field, newData);\n\n            isFormChanged();\n        }\n\n        /**\n         * Callback from method drop-down\n         * Sets new selected method\n         * @param {Object} item - new selected item\n         */\n        function onSelectMethod(item) {\n            lodash.set(ctrl.workingCopy, 'spec.attributes.method', item.id);\n\n            isFormChanged();\n        }\n\n        /**\n         * Callback from Content Type drop-down\n         * Sets new selected header\n         * @param {Object} item - new selected item\n         */\n        function onSelectHeader(item) {\n            lodash.set(ctrl.workingCopy, 'spec.attributes.headers.Content-Type', item.id);\n            ctrl.contentType = item.id;\n\n            isFormChanged();\n        }\n\n        /**\n         * Callback from body field.\n         */\n        function onChangeBody() {\n            isFormChanged();\n        }\n\n        function onChangeSourceCode(sourceCode) {\n            lodash.set(ctrl.workingCopy, 'spec.body', sourceCode);\n\n            isFormChanged();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Compares original object and working object to get know if fields was changed\n         * Also check if form valid and set result to corresponding variable\n         */\n        function isFormChanged() {\n            $timeout(function () {\n                ctrl.isFormChanged = !lodash.isEqual(ctrl.workingCopy, ctrl.selectedEvent) && lodash.isEmpty(ctrl.functionEventForm.$error);\n            });\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionCodeController.$inject = ['$element', '$rootScope', '$scope', '$timeout', '$i18next', 'i18next', 'lodash', 'Base64', 'ConfigService', 'DialogsService', 'VersionHelperService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionCode', {\n        bindings: {\n            version: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-code/version-code.tpl.html',\n        controller: NclVersionCodeController\n    });\n\n    function NclVersionCodeController($element, $rootScope, $scope, $timeout, $i18next, i18next, lodash, Base64, ConfigService, DialogsService, VersionHelperService) {\n        var ctrl = this;\n        var scrollContainer = null;\n        var previousEntryType = null;\n        var testPaneWidth = 650;\n        var isAnimationCompleted = true;\n        var lng = i18next.language;\n\n        ctrl.githubToken = '';\n        ctrl.scrollConfig = {\n            axis: 'xy',\n            advanced: {\n                autoScrollOnFocus: false\n            }\n        };\n        ctrl.scrollConfigHorizontal = {\n            axis: 'x',\n            advanced: {\n                autoScrollOnFocus: false\n            },\n            callbacks: {\n                onCreate: function onCreate() {\n                    scrollContainer = this.querySelector('.mCSB_container');\n                    scrollContainer.style.height = '100%';\n                }\n            }\n        };\n        ctrl.codeEntryTypeArray = [{\n            id: 'sourceCode',\n            visible: true,\n            name: 'Source code (edit online)',\n            tooltip: 'Provide the function source code in the dashboard',\n            tooltipPlacement: 'right'\n        }, {\n            id: 'image',\n            visible: true,\n            name: 'Image',\n            defaultValues: {\n                spec: {\n                    image: ''\n                }\n            },\n            tooltip: 'Deploy the function from an existing image',\n            tooltipPlacement: 'right'\n        }, {\n            id: 'archive',\n            visible: true,\n            name: 'Archive',\n            defaultValues: {\n                spec: {\n                    build: {\n                        path: '',\n                        codeEntryAttributes: {\n                            headers: {\n                                'X-V3io-Session-Key': ''\n                            },\n                            workDir: ''\n                        }\n                    }\n                }\n            },\n            tooltip: 'Download a function-code archive file from an Iguazio Data Science Platform (with authentication) or from any other URL (without authentication)',\n            tooltipPlacement: 'right'\n        }, {\n            id: 'github',\n            visible: true,\n            name: 'GitHub',\n            defaultValues: {\n                spec: {\n                    build: {\n                        path: '',\n                        codeEntryAttributes: {\n                            branch: '',\n                            headers: {\n                                'Authorization': ''\n                            },\n                            workDir: ''\n                        }\n                    }\n                }\n            },\n            tooltip: 'Download the function code from a GitHub repository',\n            tooltipPlacement: 'right'\n        }, {\n            id: 'jar',\n            visible: lodash.get(ctrl.version, 'spec.runtime') === 'java',\n            name: 'Jar',\n            defaultValues: {\n                spec: {\n                    build: {\n                        path: ''\n                    }\n                }\n            }\n        }, {\n            id: 's3',\n            visible: true,\n            name: 'S3',\n            defaultValues: {\n                spec: {\n                    build: {\n                        codeEntryAttributes: {\n                            s3Bucket: '',\n                            s3ItemKey: '',\n                            s3AccessKeyId: '',\n                            s3SecretAccessKey: '',\n                            s3Region: '',\n                            s3SessionToken: '',\n                            workDir: ''\n                        }\n                    }\n                }\n            },\n            tooltip: 'Download the function code from an AWS S3 bucket',\n            tooltipPlacement: 'right'\n        }];\n        ctrl.themesArray = [{\n            id: 'vs',\n            name: 'Light',\n            visible: true\n        }, {\n            id: 'vs-dark',\n            name: 'Dark',\n            visible: true\n        }];\n        ctrl.selectedTheme = lodash.get(ctrl.version, 'ui.editorTheme', ctrl.themesArray[0]);\n\n        ctrl.$onInit = onInit;\n        ctrl.$postLink = postLink;\n\n        ctrl.isDemoMode = ConfigService.isDemoMode;\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.onChangeGithubToken = onChangeGithubToken;\n        ctrl.onChangeSourceCode = onChangeSourceCode;\n        ctrl.selectEntryTypeValue = selectEntryTypeValue;\n        ctrl.selectRuntimeValue = selectRuntimeValue;\n        ctrl.selectThemeValue = selectThemeValue;\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.runtimeArray = getRuntimes();\n            ctrl.selectedRuntime = lodash.find(ctrl.runtimeArray, ['id', ctrl.version.spec.runtime]);\n            ctrl.editorLanguage = ctrl.selectedRuntime.language;\n\n            var sourceCode = lodash.get(ctrl.version, 'spec.build.functionSourceCode', '');\n            if (lodash.isEmpty(sourceCode)) {\n                ctrl.sourceCode = lodash.get(ctrl.version, 'ui.versionCode', sourceCode);\n            } else {\n                ctrl.sourceCode = Base64.decode(sourceCode);\n\n                lodash.set(ctrl.version, 'ui.versionCode', sourceCode);\n            }\n\n            if (lodash.has(ctrl.version, 'spec.build.codeEntryType')) {\n                ctrl.selectedEntryType = lodash.find(ctrl.codeEntryTypeArray, ['id', ctrl.version.spec.build.codeEntryType]);\n                if (ctrl.selectedEntryType.id === 'github') {\n                    ctrl.githubToken = lodash.chain(ctrl.version.spec.build).get('codeEntryAttributes.headers', {}).find(function (value, key) {\n                        return key.toLowerCase() === 'authorization';\n                    }).defaultTo('token ').value().split(/\\s+/g)[1];\n                }\n            } else {\n                ctrl.selectedEntryType = ctrl.codeEntryTypeArray[0];\n                lodash.set(ctrl.version, 'spec.build.codeEntryType', ctrl.selectedEntryType.id);\n            }\n\n            previousEntryType = ctrl.selectedEntryType;\n\n            $scope.$on('ui.layout.resize', onLayoutResize);\n            $scope.$on('navigation-tabs_toggle-test-pane', toggleTestPane);\n        }\n\n        /**\n         * Post linking method\n         */\n        function postLink() {\n            $timeout(onDragNDropFile);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Sets new value to entity type and prepares the relevant fields for this type.\n         * @param {Object} item - the selected option of \"Code Entry Type\" drop-down field.\n         */\n        function selectEntryTypeValue(item) {\n            ctrl.selectedEntryType = item;\n\n            lodash.set(ctrl.version, 'spec.build.codeEntryType', ctrl.selectedEntryType.id);\n            var functionSourceCode = lodash.get(ctrl.version, 'spec.build.functionSourceCode', '');\n\n            // delete the following paths ...\n            lodash.forEach(['spec.image', 'spec.build.codeEntryAttributes', 'spec.build.path', 'spec.build.functionSourceCode'], lodash.unset.bind(lodash, ctrl.version));\n\n            // ... then fill only the relevant ones with default value according to the selected option\n            lodash.merge(ctrl.version, item.defaultValues);\n\n            if (item.id === 'sourceCode') {\n\n                // restore source code that was preserved in memory - if such exists\n                var savedSourceCode = lodash.get(ctrl.version, 'ui.versionCode', '');\n                lodash.set(ctrl.version, 'spec.build.functionSourceCode', savedSourceCode);\n                ctrl.sourceCode = Base64.decode(savedSourceCode);\n\n                if (!lodash.isNil(scrollContainer)) {\n                    $timeout(function () {\n                        scrollContainer.style.height = '100%';\n                    });\n                }\n\n                $rootScope.$broadcast('change-state-deploy-button', { component: 'code', isDisabled: false });\n            } else {\n\n                // preserve source code (for later using it if the user selects \"Edit Online\" option)\n                if (previousEntryType.id === 'sourceCode') {\n                    lodash.set(ctrl.version, 'ui.versionCode', functionSourceCode);\n                }\n\n                // disable \"Deploy\" button if required fields of the selected option are empty\n                if (item.id === 'image' && lodash.isEmpty(ctrl.version.spec.image) || item.id !== 'image' && lodash.isEmpty(ctrl.version.spec.build.path)) {\n                    $rootScope.$broadcast('change-state-deploy-button', { component: 'code', isDisabled: true });\n                }\n            }\n\n            previousEntryType = ctrl.selectedEntryType;\n        }\n\n        /**\n         * Sets new selected theme for editor\n         * @param {Object} item\n         */\n        function selectThemeValue(item) {\n            ctrl.version.ui.editorTheme = item;\n            ctrl.selectedTheme = item;\n        }\n\n        /**\n         * Sets new value to runtime\n         * @param {Object} item\n         */\n        function selectRuntimeValue(item) {\n            ctrl.selectedRuntime = item;\n            ctrl.editorLanguage = ctrl.selectedRuntime.language;\n\n            lodash.set(ctrl.version, 'spec.runtime', item.id);\n            lodash.set(ctrl.version, 'spec.build.functionSourceCode', item.sourceCode);\n            lodash.set(ctrl.version, 'ui.versionCode', item.sourceCode);\n\n            VersionHelperService.updateIsVersionChanged(ctrl.version);\n        }\n\n        function onChangeGithubToken(newData) {\n            ctrl.githubToken = newData;\n            lodash.unset(ctrl.version, 'spec.build.codeEntryAttributes.headers.authorization');\n            lodash.set(ctrl.version, 'spec.build.codeEntryAttributes.headers.Authorization', 'token ' + newData);\n        }\n\n        /**\n         * Changes function`s source code\n         * @param {string} sourceCode\n         */\n        function onChangeSourceCode(sourceCode) {\n            lodash.set(ctrl.version, 'spec.build.functionSourceCode', Base64.encode(sourceCode));\n            lodash.set(ctrl.version, 'ui.versionCode', Base64.encode(sourceCode));\n\n            ctrl.sourceCode = sourceCode;\n\n            VersionHelperService.updateIsVersionChanged(ctrl.version);\n        }\n\n        /**\n         * Update data callback\n         * @param {string} newData\n         * @param {string} field\n         */\n        function inputValueCallback(newData, field) {\n            lodash.set(ctrl.version, field, newData);\n            VersionHelperService.updateIsVersionChanged(ctrl.version);\n\n            $timeout(function () {\n                $rootScope.$broadcast('change-state-deploy-button', {\n                    component: 'code',\n                    isDisabled: ctrl.versionCodeForm.$invalid\n                });\n            });\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Extracts a file name from a provided path\n         * @param {string} path - the path including a file name (delimiters: '/' or '\\' or both, can be consecutive)\n         * @param {boolean} [includeExtension=true] - set to `true` to include extension, or `false` to exclude it\n         * @param {boolean} [onlyExtension=false] - set to `true` to include extension only, or `false` to include file\n         *     name\n         * @returns {string} the file name at the end of the given path with or without its extension (depending on the\n         *     value of `extension` parameter)\n         *\n         * @example\n         * ```js\n         * extractFileName('/path/to/file/file.name.ext');\n         * // => 'file.name.ext'\n         *\n         * extractFileName('\\\\path/to\\\\file/file.name.ext', false);\n         * // => 'file.name'\n         *\n         * extractFileName('file.name.ext', false);\n         * // => 'file.name'\n         *\n         * extractFileName('/path/to/////file\\\\\\\\\\\\\\\\file.name.ext', true);\n         * // => 'file.name.ext'\n         *\n         * extractFileName('/path/to/file\\file.name.ext', true, true);\n         * // => 'ext'\n         *\n         * extractFileName('/path/to/file/file.name.ext', false, true);\n         * // => '.'\n         *\n         * extractFileName('');\n         * // => ''\n         *\n         * extractFileName(undefined);\n         * // => ''\n         *\n         * extractFileName(null);\n         * // => ''\n         * ```\n         */\n        function extractFileName(path, includeExtension, onlyExtension) {\n            var start = path.lastIndexOf(lodash.defaultTo(onlyExtension, false) ? '.' : '/') + 1;\n            var end = lodash.defaultTo(includeExtension, true) ? path.length : path.lastIndexOf('.');\n\n            return lodash.defaultTo(path, '').replace('\\\\', '/').substring(start, end);\n        }\n\n        /**\n         * Gets all runtimes\n         * @returns {Array}\n         */\n        function getRuntimes() {\n\n            // language identifiers for monaco editor are taken from:\n            // https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers\n            return [{\n                id: 'golang',\n                ext: 'go',\n                name: 'Go',\n                language: 'go',\n                sourceCode: 'cGFja2FnZSBtYWluDQoNCmltcG9ydCAoDQogICAgImdpdGh1Yi5jb20vbnVjbGlvL251Y2xpby1zZGstZ28iDQo' + 'pDQoNCmZ1bmMgSGFuZGxlcihjb250ZXh0ICpudWNsaW8uQ29udGV4dCwgZXZlbnQgbnVjbGlvLkV2ZW50KSAoaW50ZXJmYWNle3' + '0sIGVycm9yKSB7DQogICAgcmV0dXJuIG5pbCwgbmlsDQp9', // source code in base64\n                visible: true\n            }, {\n                id: 'python:2.7',\n                ext: 'py',\n                name: 'Python 2.7',\n                language: 'python',\n                sourceCode: 'ZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpOg0KICAgIHJldHVybiAiIg==', // source code in base64\n                visible: true\n            }, {\n                id: 'python:3.6',\n                ext: 'py',\n                name: 'Python 3.6',\n                language: 'python',\n                sourceCode: 'ZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpOg0KICAgIHJldHVybiAiIg==', // source code in base64\n                visible: true\n            }, {\n                id: 'dotnetcore',\n                ext: 'cs',\n                name: '.NET Core',\n                language: 'csharp',\n                sourceCode: 'dXNpbmcgU3lzdGVtOw0KdXNpbmcgTnVjbGlvLlNkazsNCg0KcHVibGljIGNsYXNzIG1haW4NCnsNCiAgICBwdWJ' + 'saWMgb2JqZWN0IGhhbmRsZXIoQ29udGV4dCBjb250ZXh0LCBFdmVudCBldmVudEJhc2UpDQogICAgew0KICAgICAgICByZXR1cm' + '4gbmV3IFJlc3BvbnNlKCkNCiAgICAgICAgew0KICAgICAgICAgICAgU3RhdHVzQ29kZSA9IDIwMCwNCiAgICAgICAgICAgIENvb' + 'nRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3RleHQiLA0KICAgICAgICAgICAgQm9keSA9ICIiDQogICAgICAgIH07DQogICAgfQ0K' + 'fQ==', // source code in base64\n                visible: true\n            }, {\n                id: 'java',\n                ext: 'java',\n                name: 'Java',\n                language: 'java',\n                sourceCode: 'aW1wb3J0IGlvLm51Y2xpby5Db250ZXh0Ow0KaW1wb3J0IGlvLm51Y2xpby5FdmVudDsNCmltcG9ydCBpby5udWN' + 'saW8uRXZlbnRIYW5kbGVyOw0KaW1wb3J0IGlvLm51Y2xpby5SZXNwb25zZTsNCg0KcHVibGljIGNsYXNzIEhhbmRsZXIgaW1wbG' + 'VtZW50cyBFdmVudEhhbmRsZXIgew0KDQogICAgQE92ZXJyaWRlDQogICAgcHVibGljIFJlc3BvbnNlIGhhbmRsZUV2ZW50KENvb' + 'nRleHQgY29udGV4dCwgRXZlbnQgZXZlbnQpIHsNCiAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCkuc2V0Qm9keSgiIik7DQog' + 'ICAgfQ0KfQ==',\n                visible: true\n            }, {\n                id: 'nodejs',\n                ext: 'js',\n                language: 'javascript',\n                sourceCode: 'ZXhwb3J0cy5oYW5kbGVyID0gZnVuY3Rpb24oY29udGV4dCwgZXZlbnQpIHsNCiAgICBjb250ZXh0LmNhbGxiYWN' + 'rKCcnKTsNCn07', // source code in base64\n                name: 'NodeJS',\n                visible: true\n            }, {\n                id: 'shell',\n                ext: 'sh',\n                name: 'Shell',\n                language: 'shellscript',\n                sourceCode: '',\n                visible: true\n            }, {\n                id: 'ruby',\n                ext: 'rb',\n                name: 'Ruby',\n                language: 'ruby',\n                sourceCode: 'ZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpDQplbmQ=', // source code in base64\n                visible: true\n            }];\n        }\n\n        /**\n         * Tests whether a file is valid for dropping in code editor according to its MIME type and its extension\n         * @param {string} type - the MIME type of the file (e.g. 'text/plain', 'application/javascript')\n         * @param {string} extension - the extension of the file (e.g. 'txt', 'py', 'html')\n         * @returns {boolean} `true` if the file is valid for dropping in code editor, or `false` otherwise\n         */\n        function isFileDropValid(type, extension) {\n\n            // Drag'n'Drop textual files into the code editor\n            var validFileExtensions = ['cs', 'py', 'go', 'sh', 'txt', 'js', 'java'];\n\n            return lodash(type).startsWith('text/') || validFileExtensions.includes(extension);\n        }\n\n        /**\n         * Sets informational background over monaco editor before dropping a file\n         */\n        function onDragNDropFile() {\n            var codeEditor = $element.find('.monaco-code-editor');\n            var nclMonaco = $element.find('.ncl-monaco');\n            var codeEditorDropZone = $element.find('.code-editor-drop-zone');\n\n            // Register event handlers for drag'n'drop of files to code editor\n            codeEditor.on('dragover', null, false).on('dragenter', null, function (event) {\n                codeEditorDropZone.addClass('dragover');\n\n                codeEditor.css('opacity', '0.4');\n                event.preventDefault();\n            }).on('dragleave', null, function (event) {\n                var monacoCoords = nclMonaco[0].getBoundingClientRect();\n\n                if (event.originalEvent.pageX <= monacoCoords.left || event.originalEvent.pageX >= monacoCoords.right || event.originalEvent.pageY >= monacoCoords.bottom || event.originalEvent.pageY <= monacoCoords.top) {\n                    codeEditorDropZone.removeClass('dragover');\n                    codeEditor.css('opacity', '');\n                }\n\n                event.preventDefault();\n            }).on('drop', null, function (event) {\n                var itemType = lodash.get(event, 'originalEvent.dataTransfer.items[0].type');\n                var file = lodash.get(event, 'originalEvent.dataTransfer.files[0]');\n                var extension = extractFileName(file.name, true, true);\n\n                if (isFileDropValid(itemType, extension)) {\n                    var reader = new FileReader();\n\n                    reader.onload = function (onloadEvent) {\n                        var functionSource = {\n                            language: lodash.chain(ctrl.runtimeArray).find(['ext', extension]).defaultTo({\n                                language: 'plaintext'\n                            }).value().language,\n                            code: onloadEvent.target.result\n                        };\n                        ctrl.sourceCode = functionSource.code;\n                        ctrl.editorLanguage = functionSource.language;\n                        $scope.$apply();\n\n                        codeEditorDropZone.removeClass('dragover');\n                        codeEditor.css('opacity', '');\n                    };\n                    reader.onerror = function () {\n                        DialogsService.alert($i18next.t('functions.ERROR_MSG:COULD_NOT_READ_FILE', { lng: lng }));\n                    };\n                    reader.readAsText(file);\n                } else {\n                    codeEditorDropZone.removeClass('dragover');\n                    codeEditor.css('opacity', '');\n\n                    DialogsService.alert($i18next.t('common:INVALID_FILE_TYPE_EXTENSION', { lng: lng }));\n                }\n                event.preventDefault();\n            });\n        }\n\n        /**\n         * Broadcast callback from angular-ui-layout.\n         * Sets new width of test pane.\n         * @param event\n         * @param beforeContainerResize\n         * @param afterContainerResize\n         */\n        function onLayoutResize(event, beforeContainerResize, afterContainerResize) {\n            testPaneWidth = afterContainerResize.size;\n\n            resizeScrollBar(100);\n        }\n\n        /**\n         * Resize scrollbar container.\n         * Layout directive (splitter) makes changes to width of scrollbar container. But scrollbar doesn't handle\n         * those changes in correct way. So we have to set width manually\n         * @param {number} timeout - function invocation delay\n         */\n        function resizeScrollBar(timeout) {\n            $timeout(function () {\n                var CODE_CONTAINER_MIN_WIDTH = 700;\n\n                // if scrollbar container is wider than minimal code container width (scrollbar is not needed)\n                if (angular.element($element.find('.code-scrollable-container')).width() >= CODE_CONTAINER_MIN_WIDTH) {\n                    // make sure that scrollbar container takes all available width\n                    angular.element($element.find('.mCSB_container')[0]).css('width', '100%');\n\n                    // hide scrollbar (make it disabled)\n                    angular.element($element.find('.igz-scrollable-container')[0]).mCustomScrollbar('disable', true);\n                } else {\n                    // set code's container minimal width to scrollbar container\n                    angular.element($element.find('.mCSB_container')[0]).css('width', CODE_CONTAINER_MIN_WIDTH + 'px');\n                }\n\n                $timeout(function () {\n                    // Enable scrolling again or show scrollbar\n                    angular.element($element.find('.igz-scrollable-container')[0]).mCustomScrollbar('update');\n                }, 100);\n            }, timeout);\n        }\n\n        /**\n         * Broadcast's callback to toggle test pane\n         * @param {Event} event - native broadcast event object\n         * @param {Object} data - contains data of test pane state (closed/opened)\n         */\n        function toggleTestPane(event, data) {\n            if (isAnimationCompleted) {\n                if (data.closeTestPane) {\n                    closeTestPane();\n                } else {\n                    openTestPane();\n                }\n            }\n\n            /**\n             * Closes Test pane\n             */\n            function closeTestPane() {\n                isAnimationCompleted = false;\n                var testPaneLeftPosition = parseInt(angular.element('.event-pane-section').css('left'));\n                var codeSectionWidth = parseInt(angular.element('.code-section').css('width'));\n\n                // move Test pane to left\n                angular.element('.event-pane-section').animate({\n                    'left': testPaneLeftPosition + testPaneWidth\n                }, {\n                    complete: onCloseCompleteAnimation\n                });\n\n                // resize code section to full width\n                angular.element('.code-section').animate({\n                    'width': codeSectionWidth + testPaneWidth + 'px'\n                }, 500);\n\n                // hide splitter\n                angular.element(angular.element('.ui-splitbar')[0]).css('display', 'none');\n\n                resizeScrollBar(500);\n\n                /**\n                 * jQuery complete animation callback.\n                 * Hide Test pane when animation is completed\n                 */\n                function onCloseCompleteAnimation() {\n\n                    // hide Test pane\n                    angular.element('.event-pane-section').css('display', 'none');\n\n                    isAnimationCompleted = true;\n                }\n            }\n\n            /**\n             * Opens Test pane\n             */\n            function openTestPane() {\n                isAnimationCompleted = false;\n                var codeSectionWidth = parseInt(angular.element('.code-section').css('width'));\n\n                // show Test pane\n                angular.element('.event-pane-section').css('display', 'block');\n\n                var testPaneLeftPosition = parseInt(angular.element('.event-pane-section').css('left'));\n\n                // resize code section\n                angular.element('.code-section').animate({\n                    'width': codeSectionWidth - testPaneWidth + 'px'\n                });\n\n                // move Test pane to be visible on the screen\n                angular.element('.event-pane-section').animate({\n                    'left': testPaneLeftPosition - testPaneWidth\n                }, {\n                    complete: onOpenCompleteAnimation\n                });\n\n                resizeScrollBar(500);\n\n                /**\n                 * jQuery complete animation callback.\n                 * Shows splitter, when animation is completed\n                 */\n                function onOpenCompleteAnimation() {\n                    angular.element(angular.element('.ui-splitbar')[0]).css('display', 'block');\n\n                    isAnimationCompleted = true;\n                }\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionConfigurationController.$inject = ['lodash', 'ConfigService', 'VersionHelperService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionConfiguration', {\n        bindings: {\n            version: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-configuration/version-configuration.tpl.html',\n        controller: NclVersionConfigurationController\n    });\n\n    function NclVersionConfigurationController(lodash, ConfigService, VersionHelperService) {\n        var ctrl = this;\n\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                autoScrollOnFocus: false,\n                updateOnContentResize: true\n            }\n        };\n\n        ctrl.isDemoMode = ConfigService.isDemoMode;\n\n        ctrl.isRuntimeBlockVisible = isRuntimeBlockVisible;\n        ctrl.onConfigurationChangeCallback = onConfigurationChangeCallback;\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Checks if `Runtime Attributes` block is visible\n         * @returns {boolean}\n         */\n        function isRuntimeBlockVisible() {\n            return lodash.includes(['shell', 'java'], lodash.get(ctrl.version, 'spec.runtime'));\n        }\n\n        /**\n         * Checks if version's configuration was changed\n         */\n        function onConfigurationChangeCallback() {\n            VersionHelperService.updateIsVersionChanged(ctrl.version);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionMonitoringController.$inject = ['$rootScope', '$scope', '$timeout', 'lodash', 'ConfigService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionMonitoring', {\n        bindings: {\n            version: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-monitoring/version-monitoring.tpl.html',\n        controller: NclVersionMonitoringController\n    });\n\n    function NclVersionMonitoringController($rootScope, $scope, $timeout, lodash, ConfigService) {\n        var ctrl = this;\n\n        ctrl.versionStatus = {};\n        ctrl.scrollConfig = {\n            advanced: {\n                updateOnContentResize: true\n            }\n        };\n        ctrl.loggerScrollConfig = {\n            advanced: {\n                updateOnContentResize: true\n            },\n            theme: 'light-thin'\n        };\n        ctrl.rowIsCollapsed = {\n            buildLog: false,\n            errorLog: false\n        };\n\n        ctrl.$onInit = onInit;\n\n        ctrl.isDemoMode = ConfigService.isDemoMode;\n\n        ctrl.checkIsErrorState = checkIsErrorState;\n        ctrl.onRowCollapse = onRowCollapse;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            setVersionStatus();\n\n            $scope.$on('deploy-result-changed', setVersionStatus);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Checks if current version status is `error`\n         * @returns {boolean}\n         */\n        function checkIsErrorState() {\n            return lodash.get(ctrl.versionStatus, 'state') === 'error';\n        }\n\n        /**\n         * Called when row is collapsed/expanded\n         * @param {string} row - name of expanded/collapsed row\n         */\n        function onRowCollapse(row) {\n            ctrl.rowIsCollapsed[row] = !ctrl.rowIsCollapsed[row];\n\n            $timeout(function () {\n                $rootScope.$broadcast('igzWatchWindowResize::resize');\n            }, 350);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Sets actual deploying status in `ctrl.versionStatus`\n         */\n        function setVersionStatus() {\n            if (lodash.isEmpty(lodash.get(ctrl.version, 'ui.deployResult'))) {\n                ctrl.versionStatus = lodash.get(ctrl.version, 'status');\n            } else {\n                ctrl.versionStatus = lodash.get(ctrl.version, 'ui.deployResult.status');\n            }\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclVersionTriggersController.$inject = ['$i18next', '$rootScope', '$scope', '$timeout', 'i18next', 'lodash', 'DialogsService', 'FunctionsService', 'ValidationService', 'VersionHelperService'];\n    angular.module('iguazio.dashboard-controls').component('nclVersionTriggers', {\n        bindings: {\n            containers: '<?',\n            version: '<'\n        },\n        templateUrl: 'nuclio/functions/version/version-triggers/version-triggers.tpl.html',\n        controller: NclVersionTriggersController\n    });\n\n    function NclVersionTriggersController($i18next, $rootScope, $scope, $timeout, i18next, lodash, DialogsService, FunctionsService, ValidationService, VersionHelperService) {\n        var ctrl = this;\n        var lng = i18next.language;\n        var uniqueClasses = ['http'];\n\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                autoScrollOnFocus: false,\n                updateOnContentResize: true\n            }\n        };\n\n        ctrl.isCreateModeActive = false;\n        ctrl.validationRules = {\n            arrayInt: ValidationService.getValidationRules('function.arrayInt'),\n            host: {\n                key: ValidationService.getValidationRules('k8s.dns1123Subdomain')\n            },\n            itemName: ValidationService.getValidationRules('function.triggerName'),\n            cronInterval: ValidationService.getValidationRules('function.interval', [{\n                name: 'scheduleIsEmpty',\n                label: $i18next.t('functions:TRIGGER_CRON_INTERVAL_NO_SCHEDULE', { lng: lng }),\n                pattern: function pattern(value, inputName, formObject) {\n                    return lodash.isEmpty(lodash.get(formObject, 'item_schedule.$modelValue'));\n                }\n            }]),\n            interval: ValidationService.getValidationRules('function.interval'),\n            number: ValidationService.getValidationRules('number'),\n            subscriptionQoS: {\n                value: ValidationService.getValidationRules('function.subscriptionQoS')\n            },\n            v3ioConsumerGroupName: ValidationService.getValidationRules('function.v3ioConsumerGroupName')\n        };\n        ctrl.triggers = [];\n\n        ctrl.$onInit = onInit;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.checkClassUniqueness = checkClassUniqueness;\n        ctrl.createTrigger = createTrigger;\n        ctrl.editTriggerCallback = editTriggerCallback;\n        ctrl.handleAction = handleAction;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            var additionalData = {};\n            if (lodash.isArray(ctrl.containers) && !lodash.isEmpty(ctrl.containers)) {\n                additionalData.containers = lodash.chain(ctrl.containers).cloneDeep().sortBy('name').value();\n            }\n\n            ctrl.triggers = lodash.map(ctrl.version.spec.triggers, function (value, key) {\n                var triggersItem = angular.copy(value);\n                triggersItem.id = key;\n                triggersItem.name = key;\n\n                triggersItem.ui = {\n                    changed: false,\n                    editModeActive: false,\n                    isFormValid: true,\n                    name: 'trigger'\n                };\n\n                triggersItem.attributes = lodash.defaultTo(triggersItem.attributes, {});\n\n                if (value.kind === 'cron') {\n                    var scheduleValueArray = lodash.chain(triggersItem).get('attributes.schedule', '').split(' ').value();\n\n                    if (scheduleValueArray.length === 6) {\n                        triggersItem.attributes.schedule = lodash.chain(scheduleValueArray).takeRight(5).join(' ').value();\n                    }\n                }\n\n                return triggersItem;\n            });\n            ctrl.classList = FunctionsService.getClassesList('trigger', additionalData);\n\n            $scope.$on('edit-item-has-been-changed', updateTriggersChangesState);\n\n            $timeout(function () {\n                ctrl.defaultFields = {\n                    ingressHost: ctrl.version.ui.ingressHost\n                };\n\n                checkClassUniqueness();\n\n                $rootScope.$broadcast('igzWatchWindowResize::resize');\n            }, 1000);\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            $rootScope.$broadcast('change-state-deploy-button', { component: 'trigger', isDisabled: false });\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Checks if classes should be disabled\n         */\n        function checkClassUniqueness() {\n            lodash.forEach(uniqueClasses, function (classId) {\n                var classData = lodash.find(ctrl.classList, ['id', classId]);\n                var classIsUsed = lodash.some(ctrl.triggers, ['ui.selectedClass.id', classId]);\n\n                lodash.merge(classData, {\n                    tooltip: classIsUsed ? classData.tooltipOriginal + ' - ' + $i18next.t('functions:CANNOT_CREATE_TRIGGER', { lng: lng }) : classData.tooltipOriginal,\n                    disabled: classIsUsed\n                });\n            });\n        }\n\n        /**\n         * Toggle create trigger mode\n         * @returns {Promise}\n         */\n        function createTrigger(event) {\n            $timeout(function () {\n                if (!isTriggerInEditMode()) {\n                    ctrl.triggers.push({\n                        id: '',\n                        name: '',\n                        kind: '',\n                        attributes: {},\n                        ui: {\n                            changed: true,\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'trigger'\n                        }\n                    });\n                    $rootScope.$broadcast('change-state-deploy-button', { component: 'trigger', isDisabled: true });\n                    event.stopPropagation();\n                }\n            }, 100);\n        }\n\n        /**\n         * Edit trigger callback function\n         * @returns {Promise}\n         */\n        function editTriggerCallback(item) {\n            ctrl.handleAction('update', item);\n        }\n\n        /**\n         * According to given action name calls proper action handler\n         * @param {string} actionType - ex. `delete`\n         * @param {Array} selectedItem - an object of selected trigger\n         * @returns {Promise}\n         */\n        function handleAction(actionType, selectedItem) {\n            if (actionType === 'delete') {\n                deleteHandler(selectedItem);\n            } else if (actionType === 'edit') {\n                editHandler(selectedItem);\n            } else if (actionType === 'update') {\n                updateHandler(selectedItem);\n            } else {\n                DialogsService.alert($i18next.t('functions:ERROR_MSG.FUNCTIONALITY_IS_NOT_IMPLEMENTED', { lng: lng }));\n            }\n\n            $rootScope.$broadcast('change-state-deploy-button', { component: 'trigger', isDisabled: false });\n            lodash.forEach(ctrl.triggers, function (trigger) {\n                if (!trigger.ui.isFormValid) {\n                    $rootScope.$broadcast('change-state-deploy-button', { component: trigger.ui.name, isDisabled: true });\n                }\n            });\n\n            VersionHelperService.updateIsVersionChanged(ctrl.version);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Deletes selected item\n         * @param {Array} selectedItem - an object of selected trigger\n         */\n        function deleteHandler(selectedItem) {\n            lodash.remove(ctrl.triggers, ['id', selectedItem.id]);\n            lodash.unset(ctrl.version, 'spec.triggers.' + selectedItem.id);\n\n            checkClassUniqueness();\n\n            $rootScope.$broadcast('igzWatchWindowResize::resize');\n        }\n\n        /**\n         * Toggles item to edit mode\n         * @param {Array} selectedItem - an object of selected trigger\n         */\n        function editHandler(selectedItem) {\n            var aTrigger = lodash.find(ctrl.triggers, ['id', selectedItem.id]);\n            aTrigger.ui.editModeActive = true;\n        }\n\n        /**\n         * Updates data in selected item\n         * @param {Array} selectedItem - an object of selected trigger\n         */\n        // eslint-disable-next-line\n        function updateHandler(selectedItem) {\n            var currentTrigger = lodash.find(ctrl.triggers, ['id', selectedItem.id]);\n\n            if (!lodash.isEmpty(selectedItem.id)) {\n                lodash.unset(ctrl.version, 'spec.triggers.' + selectedItem.id);\n            }\n\n            var triggerItem = {\n                kind: selectedItem.kind,\n                name: selectedItem.name,\n                attributes: selectedItem.attributes\n            };\n\n            if (angular.isDefined(selectedItem.workerAllocatorName)) {\n                triggerItem.workerAllocatorName = selectedItem.workerAllocatorName;\n            }\n\n            if (angular.isDefined(selectedItem.url)) {\n                triggerItem.url = selectedItem.url;\n            }\n\n            if (angular.isDefined(selectedItem.maxWorkers)) {\n                triggerItem.maxWorkers = Number(selectedItem.maxWorkers);\n            }\n\n            if (angular.isNumber(selectedItem.workerAvailabilityTimeoutMilliseconds)) {\n                triggerItem.workerAvailabilityTimeoutMilliseconds = selectedItem.workerAvailabilityTimeoutMilliseconds;\n            }\n\n            if (angular.isDefined(selectedItem.username)) {\n                triggerItem.username = selectedItem.username;\n            }\n\n            if (angular.isDefined(selectedItem.password)) {\n                triggerItem.password = selectedItem.password;\n            }\n\n            if (angular.isDefined(selectedItem.attributes.event)) {\n                if (lodash.isEmpty(triggerItem.attributes.event.body)) {\n                    delete triggerItem.attributes.event.body;\n                }\n\n                if (!lodash.isEmpty(selectedItem.attributes.event.body)) {\n                    triggerItem.attributes.event.body = selectedItem.attributes.event.body;\n                }\n\n                if (lodash.isEmpty(triggerItem.attributes.event.headers)) {\n                    delete triggerItem.attributes.event.headers;\n                }\n\n                if (!lodash.isEmpty(selectedItem.attributes.event.headers)) {\n                    triggerItem.attributes.event.headers = angular.copy(selectedItem.attributes.event.headers);\n                }\n            }\n\n            if (angular.isDefined(triggerItem.attributes)) {\n                triggerItem.attributes = lodash.omitBy(triggerItem.attributes, function (attribute) {\n                    return !lodash.isNumber(attribute) && lodash.isEmpty(attribute);\n                });\n\n                if (angular.isDefined(triggerItem.attributes.schedule)) {\n                    triggerItem.attributes.schedule = '0 ' + triggerItem.attributes.schedule;\n                }\n\n                if (lodash.isEmpty(triggerItem.attributes)) {\n                    triggerItem = lodash.omit(triggerItem, 'attributes');\n                }\n            }\n\n            if (angular.isDefined(selectedItem.annotations)) {\n                triggerItem.annotations = selectedItem.annotations;\n            }\n\n            lodash.set(ctrl.version, ['spec', 'triggers', selectedItem.name], triggerItem);\n\n            selectedItem.id = selectedItem.name;\n\n            if (!lodash.isEqual(currentTrigger, selectedItem)) {\n                angular.copy(selectedItem, currentTrigger);\n            }\n\n            checkClassUniqueness();\n        }\n\n        /**\n         * Check if trigger is in edit mode\n         * @returns {boolean}\n         */\n        function isTriggerInEditMode() {\n            return lodash.some(ctrl.triggers, ['ui.editModeActive', true]);\n        }\n\n        /**\n         * Checks triggers and updates `ctrl.version.ui.isTriggersChanged` if there is some changed and unsaved trigger.\n         */\n        function updateTriggersChangesState() {\n            var isSomeTriggerChanged = lodash.some(ctrl.triggers, ['ui.changed', true]);\n            var isSomeTriggerInEditMode = lodash.some(ctrl.triggers, ['ui.editModeActive', true]);\n\n            lodash.set(ctrl.version, 'ui.isTriggersChanged', isSomeTriggerChanged && isSomeTriggerInEditMode);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    NclTextSizeDropdownController.$inject = ['$i18next', 'i18next', 'lodash'];\n    angular.module('iguazio.dashboard-controls').component('nclTextSizeDropdown', {\n        bindings: {\n            updateDataCallback: '&?'\n        },\n        templateUrl: 'nuclio/common/components/monaco/text-size-dropdown/text-size-dropdown.tpl.html',\n        controller: NclTextSizeDropdownController\n    });\n\n    function NclTextSizeDropdownController($i18next, i18next, lodash) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.textSizes = [{\n            label: $i18next.t('functions:SMALL', { lng: lng }),\n            id: 'small',\n            value: '8px'\n        }, {\n            label: $i18next.t('functions:NORMAL', { lng: lng }),\n            id: 'normal',\n            value: '12px'\n        }, {\n            label: $i18next.t('functions:LARGE', { lng: lng }),\n            id: 'large',\n            value: '16px'\n        }, {\n            label: $i18next.t('functions:HUGE', { lng: lng }),\n            id: 'huge',\n            value: '20px'\n        }];\n\n        ctrl.$onInit = onInit;\n\n        ctrl.changeTextSize = changeTextSize;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Init method\n         */\n        function onInit() {\n            ctrl.selectedTextSize = lodash.get(lodash.find(ctrl.textSizes, { id: 'normal' }), 'value');\n\n            if (angular.isDefined(ctrl.updateDataCallback)) {\n                ctrl.updateDataCallback({ newTextSize: ctrl.selectedTextSize });\n            }\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Changes text size in monaco editor\n         * @param {string} textSize\n         */\n        function changeTextSize(textSize) {\n            ctrl.selectedTextSize = textSize;\n\n            if (angular.isDefined(ctrl.updateDataCallback)) {\n                ctrl.updateDataCallback({ newTextSize: ctrl.selectedTextSize });\n            }\n        }\n    }\n})();\n'use strict';\n\n/* eslint max-statements: [\"error\", 100] */\n(function () {\n    'use strict';\n\n    FunctionFromTemplateController.$inject = ['$element', '$window', '$scope', '$state', '$timeout', '$i18next', 'i18next', 'lodash', 'ngDialog', 'DialogsService', 'ValidationService'];\n    angular.module('iguazio.dashboard-controls').component('nclFunctionFromTemplate', {\n        bindings: {\n            project: '<',\n            projects: '<',\n            toggleSplashScreen: '&',\n            getFunction: '&',\n            getFunctionTemplates: '&',\n            createNewProject: '<',\n            renderTemplate: '&',\n            selectedProject: '<'\n        },\n        templateUrl: 'nuclio/common/screens/create-function/function-from-template/function-from-template.tpl.html',\n        controller: FunctionFromTemplateController\n    });\n\n    function FunctionFromTemplateController($element, $window, $scope, $state, $timeout, $i18next, i18next, lodash, ngDialog, DialogsService, ValidationService) {\n        var ctrl = this;\n        var lng = i18next.language;\n        var templatesOriginalObject = {}; // will always save original templates\n\n        ctrl.duplicateFunctionForm = {};\n        ctrl.functionData = {};\n        ctrl.functionFromTemplateForm = {};\n        ctrl.functionName = '';\n        ctrl.inputModelOptions = {\n            debounce: {\n                'default': 300\n            }\n        };\n        ctrl.maxLengths = {\n            functionName: ValidationService.getMaxLength('function.name')\n        };\n        ctrl.page = {};\n        ctrl.runtimeFilters = [];\n        ctrl.searchQuery = '';\n        ctrl.selectedRuntimeFilter = {\n            id: 'all',\n            name: $i18next.t('common:ALL', { lng: lng }),\n            visible: true\n        };\n        ctrl.selectedTemplate = '';\n        ctrl.templatesWorkingCopy = {};\n        ctrl.validationRules = {\n            functionName: ValidationService.getValidationRules('function.name')\n        };\n\n        ctrl.$onInit = onInit;\n        ctrl.$onChanges = onChanges;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.createFunction = createFunction;\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.isCreateFunctionAllowed = isCreateFunctionAllowed;\n        ctrl.isTemplateSelected = isTemplateSelected;\n        ctrl.isProjectsDropDownVisible = isProjectsDropDownVisible;\n        ctrl.onChangeSearchQuery = onChangeSearchQuery;\n        ctrl.onRuntimeFilterChange = onRuntimeFilterChange;\n        ctrl.onProjectChange = onProjectChange;\n        ctrl.paginationCallback = paginationCallback;\n        ctrl.selectTemplate = selectTemplate;\n        ctrl.unselectTemplate = unselectTemplate;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.toggleSplashScreen({ value: true });\n\n            initFunctionData();\n\n            angular.element($window).on('resize', paginateTemplates);\n        }\n\n        /**\n         * Bindings changes hook\n         * @param {Object} changes - changed bindings\n         */\n        function onChanges(changes) {\n            if (angular.isDefined(changes.projects)) {\n                prepareProjects();\n            }\n        }\n\n        /**\n         * Destructor\n         */\n        function onDestroy() {\n            angular.element($window).off('resize', paginateTemplates);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Callback handler for 'create function' button\n         * Creates function with defined data.\n         */\n        function createFunction() {\n\n            // create function only when form is valid\n            if (ctrl.functionFromTemplateForm.$valid && !lodash.isNil(ctrl.selectedTemplate)) {\n                lodash.assign(ctrl.functionData.rendered.metadata, {\n                    name: ctrl.functionName\n                });\n\n                if (lodash.isEmpty(ctrl.project) && ctrl.selectedProject.id !== 'new_project') {\n                    ctrl.project = lodash.find(ctrl.projects, ['metadata.name', ctrl.selectedProject.id]);\n                }\n\n                if (lodash.has(ctrl.functionData, 'template')) {\n                    ngDialog.open({\n                        template: '<ncl-function-from-template-dialog data-close-dialog=\"closeThisDialog(template)\" data-template=\"$ctrl.functionData\"></ncl-function-from-template-dialog>',\n                        plain: true,\n                        scope: $scope,\n                        className: 'ngdialog-theme-nuclio function-from-template-dialog-wrapper'\n                    }).closePromise.then(function (data) {\n                        if (!lodash.isNil(data.value)) {\n                            lodash.set(ctrl.functionData, 'values', data.value);\n\n                            ctrl.renderTemplate({ template: lodash.omit(ctrl.functionData, ['rendered', 'metadata', 'ui']) }).then(function (response) {\n                                lodash.set(ctrl.functionData, 'rendered.spec', response.spec);\n\n                                goToEditCodeScreen();\n                            });\n                        }\n                    });\n                } else {\n                    goToEditCodeScreen();\n                }\n            }\n        }\n\n        /**\n         * Set data returned by validating input component\n         * @param {string} data - data to be set\n         */\n        function inputValueCallback(data) {\n            $timeout(function () {\n                if (!lodash.isNil(data)) {\n                    lodash.set(ctrl, 'functionName', data);\n                }\n            });\n        }\n\n        /**\n         * Checks if function creation is allowed\n         * @returns {boolean}\n         */\n        function isCreateFunctionAllowed() {\n            return lodash.isEmpty(lodash.get(ctrl, 'functionFromTemplateForm.$error'));\n        }\n\n        /**\n         * Checks which template type is selected.\n         * Returns true if 'template' is equal to 'selectedTemplate'.\n         * Which means that template from argument 'template' should be selected now.\n         * @param {Object} templateName\n         * @returns {boolean}\n         */\n        function isTemplateSelected(templateName) {\n            return lodash.isEqual(templateName, ctrl.selectedTemplate);\n        }\n\n        /**\n         * Hides or shows projects drop-down.\n         * Show drop-down if 'Create Function' screen was reached from 'Projects' screen. Otherwise - hide drop-down\n         * @returns {boolean}\n         */\n        function isProjectsDropDownVisible() {\n            return $state.current.name === 'app.create-function';\n        }\n\n        /**\n         * Search input callback\n         */\n        function onChangeSearchQuery() {\n            paginateTemplates();\n        }\n\n        /**\n         * Runtime filter drop-down callback\n         * @param {Object} runtime - selected runtime\n         */\n        function onRuntimeFilterChange(runtime) {\n\n            // set new runtime filter\n            ctrl.selectedRuntimeFilter = runtime;\n\n            paginateTemplates();\n        }\n\n        /**\n         * Projects drop-down callback.\n         * Sets selected project to function.\n         * @param {Object} item - new selected project\n         */\n        function onProjectChange(item) {\n            ctrl.project = lodash.find(ctrl.projects, ['metadata.name', item.id]);\n        }\n\n        /**\n         * Change pagination page callback\n         * @param {number} page - page number\n         */\n        function paginationCallback(page) {\n            ctrl.page.number = page;\n\n            paginateTemplates();\n\n            $timeout(function () {\n                setReadMoreButtonsState(ctrl.templatesWorkingCopy);\n            });\n        }\n\n        /**\n         * Selects template.\n         * Sets new template as selected\n         * @param {Object} templateName - name of the template to be set\n         */\n        function selectTemplate(templateName) {\n            if (!lodash.isEqual(templateName, ctrl.selectedTemplate)) {\n                ctrl.selectedTemplate = templateName;\n\n                // assign new template\n                ctrl.functionData = angular.copy(ctrl.templatesWorkingCopy[ctrl.selectedTemplate]);\n            }\n        }\n\n        /**\n         * Unselects template.\n         * @param {Event} event\n         */\n        function unselectTemplate(event) {\n            ctrl.selectedTemplate = null;\n            ctrl.functionData = null;\n\n            event.preventDefault();\n            event.stopPropagation();\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Returns true if template's runtime is matched a selected runtime filter\n         * @param {Object} template - template to filter.\n         * @returns {boolean}\n         */\n        function filterByRuntime(template) {\n            if (ctrl.selectedRuntimeFilter.id === 'all') {\n                return ['python:2.7', 'python:3.6', 'java', 'nodejs', 'shell'].includes(template.rendered.spec.runtime);\n            } else {\n                return template.rendered.spec.runtime === ctrl.selectedRuntimeFilter.id;\n            }\n        }\n\n        /**\n         * Returns true if template's title or description is matched a search query.\n         * @param {Object} template - template to filter.\n         * @returns {boolean}\n         */\n        function filterByTitleAndDescription(template) {\n            var title = template.rendered.metadata.name.split(':')[0];\n            var description = template.rendered.spec.description;\n\n            // reset pagination to first page if one of the filters was applied\n            if (!lodash.isEmpty(ctrl.searchQuery) || ctrl.selectedRuntimeFilter.id !== 'all') {\n                ctrl.page.number = 0;\n            }\n\n            return lodash.isEmpty(ctrl.searchQuery) || lodash.includes(title, ctrl.searchQuery) || lodash.includes(description, ctrl.searchQuery);\n        }\n\n        /**\n         * Go to `app.project.function.edit.code` screen\n         */\n        function goToEditCodeScreen() {\n            ctrl.toggleSplashScreen({ value: true });\n\n            ctrl.getFunction({ metadata: { name: ctrl.functionName } }).then(function () {\n                ctrl.toggleSplashScreen({ value: false });\n                DialogsService.alert($i18next.t('functions:ERROR_MSG.FUNCTION_NAME_ALREADY_IN_USE', { lng: lng }));\n            }).catch(function (error) {\n                if (error.status === 404) {\n                    ctrl.toggleSplashScreen({ value: true });\n\n                    $state.go('app.project.function.edit.code', {\n                        isNewFunction: true,\n                        id: ctrl.project.metadata.name,\n                        functionId: ctrl.functionData.rendered.metadata.name,\n                        projectId: ctrl.project.metadata.name,\n                        projectNamespace: ctrl.project.metadata.namespace,\n                        functionData: ctrl.functionData.rendered\n                    });\n                }\n            });\n        }\n\n        /**\n         * Initialize object for function from template\n         */\n        function initFunctionData() {\n\n            // gets all available function templates\n            ctrl.getFunctionTemplates().then(function (response) {\n                ctrl.templatesWorkingCopy = response;\n\n                templatesOriginalObject = angular.copy(ctrl.templatesWorkingCopy);\n                ctrl.runtimeFilters = getRuntimeFilters();\n\n                initPagination();\n\n                $timeout(function () {\n                    setReadMoreButtonsState(ctrl.templatesWorkingCopy);\n                });\n            }).catch(function (error) {\n                var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_FUNCTIONS_TEMPLATE', { lng: lng });\n\n                DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n            }).finally(function () {\n                ctrl.toggleSplashScreen({ value: false });\n            });\n        }\n\n        /**\n         * Init data for pagination\n         */\n        function initPagination() {\n            ctrl.page = {\n                number: 0,\n                size: 8\n            };\n\n            paginateTemplates();\n        }\n\n        /**\n         * Gets runtime filters\n         * @returns {Array.<{id: string, name: string, visible: boolean}>}\n         */\n        function getRuntimeFilters() {\n            return [{\n                id: 'all',\n                name: $i18next.t('common:ALL', { lng: lng }),\n                visible: true\n            }, {\n                id: 'golang',\n                name: 'Go',\n                visible: false\n            }, {\n                id: 'python:2.7',\n                name: 'Python 2.7',\n                visible: true\n            }, {\n                id: 'python:3.6',\n                name: 'Python 3.6',\n                visible: true\n            }, {\n                id: 'dotnetcore',\n                name: '.NET Core',\n                visible: false\n            }, {\n                id: 'java',\n                name: 'Java',\n                visible: true\n            }, {\n                id: 'nodejs',\n                name: 'NodeJS',\n                visible: true\n            }, {\n                id: 'shell',\n                name: 'Shell',\n                visible: true\n            }, {\n                id: 'ruby',\n                name: 'Ruby',\n                visible: false\n            }];\n        }\n\n        /**\n         * Paginates function's templates\n         */\n        function paginateTemplates() {\n\n            // amount of visible items on one page\n            var pageSize = $window.innerWidth > 1453 && $window.innerWidth < 1822 ? 9 : 8;\n\n            ctrl.templatesWorkingCopy = lodash.chain(templatesOriginalObject).filter(filterByRuntime).filter(filterByTitleAndDescription).thru(function (filteredTemplates) {\n                ctrl.page.total = Math.ceil(lodash.size(filteredTemplates) / pageSize);\n\n                return lodash.slice(filteredTemplates, ctrl.page.number * pageSize, ctrl.page.number * pageSize + pageSize);\n            }).keyBy(function (template) {\n                return template.rendered.metadata.name.split(':')[0] + ' (' + template.rendered.spec.runtime + ')';\n            }).value();\n\n            $timeout(setLastLineClass);\n        }\n\n        /**\n         * Converts projects for project drop-down.\n         */\n        function prepareProjects() {\n            var newProject = {\n                id: 'new_project',\n                name: $i18next.t('functions:NEW_PROJECT', { lng: lng })\n            };\n\n            ctrl.selectedProject = lodash.isNil(ctrl.selectedProject) ? newProject : ctrl.selectedProject;\n\n            ctrl.projectsList = lodash.chain(ctrl.projects).map(function (project) {\n                return {\n                    id: project.metadata.name,\n                    name: lodash.defaultTo(project.spec.displayName, project.metadata.name)\n                };\n            }).sortBy(['name']).value();\n\n            ctrl.selectedProject = lodash.isEmpty(ctrl.projectsList) ? newProject : ctrl.selectedProject.id !== 'new_project' ? ctrl.selectedProject : lodash.first(ctrl.projectsList);\n        }\n\n        /**\n         * Sets class `last-line` to elements from the last row of the templates list.\n         */\n        function setLastLineClass() {\n            var TEMPLATE_WIDTH = 368;\n            var templates = $element.find('.function-template-wrapper');\n            var templatesWrapper = $element.find('.templates-wrapper');\n            var elementsPerLine = Math.floor(parseInt(templatesWrapper.css('width')) / TEMPLATE_WIDTH);\n            var countLastLineElements = lodash.size(templates) % elementsPerLine || elementsPerLine;\n            var lastLineElements = lodash.takeRight(templates, countLastLineElements);\n\n            templates.removeClass('last-line');\n            angular.element(lastLineElements).addClass('last-line');\n        }\n\n        /**\n         * Sets the flag to show `Read more...` in the end of template's description\n         * when it is bigger than template's block can contain.\n         * @param {Array} templates\n         */\n        function setReadMoreButtonsState(templates) {\n            var templatesElements = $element.find('.template-description');\n\n            lodash.forEach(templates, function (template) {\n                var description = lodash.get(template, 'rendered.spec.description');\n                var templateElement = lodash.find(templatesElements, ['innerHTML', description]);\n\n                lodash.set(template, 'ui.readMore', templateElement.scrollHeight > angular.element(templateElement).height());\n            });\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    FunctionImportController.$inject = ['$document', '$rootScope', '$scope', '$state', '$timeout', '$i18next', 'i18next', 'YAML', 'lodash', 'DialogsService', 'EventHelperService'];\n    angular.module('iguazio.dashboard-controls').component('nclFunctionImport', {\n        bindings: {\n            project: '<',\n            projects: '<',\n            toggleSplashScreen: '&',\n            createNewProject: '<',\n            selectedProject: '<'\n        },\n        templateUrl: 'nuclio/common/screens/create-function/function-import/function-import.tpl.html',\n        controller: FunctionImportController\n    });\n\n    function FunctionImportController($document, $rootScope, $scope, $state, $timeout, $i18next, i18next, YAML, lodash, DialogsService, EventHelperService) {\n        var ctrl = this;\n\n        var importedFunction = null;\n        var file = null;\n        var lng = i18next.language;\n\n        ctrl.functionImportForm = {};\n        ctrl.sourceCode = null;\n\n        ctrl.$onInit = onInit;\n        ctrl.$onChanges = onChanges;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.createFunction = createFunction;\n        ctrl.importFunction = importFunction;\n        ctrl.isCreateFunctionAllowed = isCreateFunctionAllowed;\n        ctrl.isProjectsDropDownVisible = isProjectsDropDownVisible;\n        ctrl.onProjectChange = onProjectChange;\n\n        //\n        // Hook methods\n        //\n\n        /**\n         * Initialization function\n         * Adds event listener on file input and when some file is loaded call importFunction()\n         */\n        function onInit() {\n            $document.on('keypress', createFunction);\n            $document.find('.function-import-input').on('change', importFunction);\n        }\n\n        /**\n         * Bindings changes hook\n         * @param {Object} changes - changed bindings\n         */\n        function onChanges(changes) {\n            if (angular.isDefined(changes.projects)) {\n                prepareProjects();\n            }\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            $document.off('keypress', createFunction);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Callback handler for 'create function' button\n         * Creates function with imported data.\n         */\n        function createFunction(event) {\n            $timeout(function () {\n                if ((angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) && ctrl.isCreateFunctionAllowed()) {\n\n                    // create function only when imported file is .yml\n                    if (isYamlFile(file.name)) {\n                        ctrl.toggleSplashScreen({ value: true });\n\n                        lodash.defaults(importedFunction, {\n                            metadata: {}\n                        });\n\n                        if (lodash.isEmpty(ctrl.project) && ctrl.selectedProject.id !== 'new_project') {\n                            ctrl.project = lodash.find(ctrl.projects, ['metadata.name', ctrl.selectedProject.id]);\n                        }\n\n                        $state.go('app.project.function.edit.code', {\n                            isNewFunction: true,\n                            id: ctrl.project.metadata.name,\n                            functionId: importedFunction.metadata.name,\n                            projectId: ctrl.project.metadata.name,\n                            projectNamespace: ctrl.project.metadata.namespace,\n                            functionData: importedFunction\n                        });\n                    }\n                }\n            }, 100);\n        }\n\n        /**\n         * Checks permissibility creation of new function.\n         * Checks if source code of function exists into ctrl.sourceCode, and if function import form is valid\n         * @returns {boolean}\n         */\n        function isCreateFunctionAllowed() {\n            return !lodash.isNil(ctrl.sourceCode) && lodash.isEmpty(ctrl.functionImportForm.$error);\n        }\n\n        /**\n         * Import of selected YAML file from file system and parse it to JS object\n         * @param event\n         */\n        function importFunction(event) {\n            file = event.target.files[0];\n\n            var reader = new FileReader();\n\n            reader.onload = function () {\n                try {\n                    importedFunction = YAML.parse(reader.result);\n\n                    if (lodash.has(importedFunction, 'metadata.name')) {\n                        ctrl.sourceCode = reader.result;\n\n                        $scope.$apply();\n                        $rootScope.$broadcast('function-import-source-code', ctrl.sourceCode);\n                    } else {\n                        throw new Error('invalid yaml');\n                    }\n                } catch (error) {\n                    DialogsService.alert($i18next.t('common:ERROR_MSG.IMPORT_YAML_FILE', { lng: lng }));\n                }\n            };\n\n            reader.readAsText(file);\n        }\n\n        /**\n         * Projects drop-down callback.\n         * Sets selected project to function.\n         * @param {Object} item - new selected project\n         */\n        function onProjectChange(item) {\n            ctrl.project = lodash.find(ctrl.projects, ['metadata.name', item.id]);\n        }\n\n        /**\n         * Hides or shows projects drop-down.\n         * Show drop-down if 'Create Function' screen was reached from 'Projects' screen. Otherwise - hide drop-down\n         * @returns {boolean}\n         */\n        function isProjectsDropDownVisible() {\n            return $state.current.name === 'app.create-function';\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Checks if file imported from file system is YAML extension.\n         * Example: 'filename.yml'\n         * @returns {boolean}\n         */\n        function isYamlFile(filename) {\n            return lodash.includes(filename, '.yml') || lodash.includes(filename, '.yaml');\n        }\n\n        /**\n         * Converts projects for project drop-down.\n         */\n        function prepareProjects() {\n            var newProject = {\n                id: 'new_project',\n                name: $i18next.t('functions:NEW_PROJECT', { lng: lng })\n            };\n\n            ctrl.selectedProject = lodash.isNil(ctrl.selectedProject) ? newProject : ctrl.selectedProject;\n\n            ctrl.projectsList = lodash.chain(ctrl.projects).map(function (project) {\n                return {\n                    id: project.metadata.name,\n                    name: lodash.defaultTo(project.spec.displayName, project.metadata.name)\n                };\n            }).sortBy(['name']).value();\n\n            ctrl.selectedProject = lodash.isEmpty(ctrl.projectsList) ? newProject : ctrl.selectedProject.id !== 'new_project' ? ctrl.selectedProject :\n            /* else */lodash.first(ctrl.projectsList);\n        }\n    }\n})();\n'use strict';\n\n(function () {\n    'use strict';\n\n    FunctionFromScratchController.$inject = ['$document', '$state', '$timeout', '$i18next', 'i18next', 'lodash', 'ConfigService', 'DialogsService', 'EventHelperService', 'FunctionsService', 'ValidationService'];\n    angular.module('iguazio.dashboard-controls').component('nclFunctionFromScratch', {\n        bindings: {\n            project: '<',\n            projects: '<',\n            getFunction: '&',\n            toggleSplashScreen: '&',\n            createNewProject: '<',\n            selectedProject: '<'\n        },\n        templateUrl: 'nuclio/common/screens/create-function/function-from-scratch/function-from-scratch.tpl.html',\n        controller: FunctionFromScratchController\n    });\n\n    function FunctionFromScratchController($document, $state, $timeout, $i18next, i18next, lodash, ConfigService, DialogsService, EventHelperService, FunctionsService, ValidationService) {\n        var ctrl = this;\n        var lng = i18next.language;\n\n        ctrl.functionData = {};\n        ctrl.functionFromScratchForm = {};\n        ctrl.inputModelOptions = {\n            debounce: {\n                'default': 0\n            }\n        };\n        ctrl.maxLengths = {\n            functionName: ValidationService.getMaxLength('function.name')\n        };\n        ctrl.runtimes = [];\n        ctrl.selectedRuntime = null;\n        ctrl.validationRules = {\n            functionName: ValidationService.getValidationRules('function.name')\n        };\n\n        ctrl.$onInit = onInit;\n        ctrl.$onChanges = onChanges;\n        ctrl.$onDestroy = onDestroy;\n\n        ctrl.createFunction = createFunction;\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.isCreateFunctionAllowed = isCreateFunctionAllowed;\n        ctrl.isProjectsDropDownVisible = isProjectsDropDownVisible;\n        ctrl.onRuntimeChange = onRuntimeChange;\n        ctrl.onProjectChange = onProjectChange;\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.runtimes = getRuntimes();\n            ctrl.selectedRuntime = getDefaultRuntime();\n\n            $document.on('keypress', createFunction);\n\n            initFunctionData();\n        }\n\n        /**\n         * Bindings changes hook\n         * @param {Object} changes - changed bindings\n         */\n        function onChanges(changes) {\n            if (angular.isDefined(changes.projects)) {\n                prepareProjects();\n            }\n        }\n\n        /**\n         * Destructor method\n         */\n        function onDestroy() {\n            $document.off('keypress', createFunction);\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Callback handler for 'create function' button\n         * Creates function with defined data.\n         */\n        function createFunction(event) {\n            $timeout(function () {\n                if ((angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) && ctrl.isCreateFunctionAllowed()) {\n\n                    // create function only when form is valid\n                    if (ctrl.functionFromScratchForm.$valid) {\n                        ctrl.toggleSplashScreen({ value: true });\n\n                        ctrl.getFunction({ metadata: { name: ctrl.functionData.metadata.name } }).then(function () {\n                            ctrl.toggleSplashScreen({ value: false });\n                            DialogsService.alert($i18next.t('functions:ERROR_MSG.FUNCTION_NAME_ALREADY_IN_USE', { lng: lng }));\n                        }).catch(function (error) {\n                            if (error.status === 404) {\n                                ctrl.toggleSplashScreen({ value: true });\n\n                                lodash.defaultsDeep(ctrl, {\n                                    functionData: {\n                                        metadata: {}\n                                    }\n                                });\n\n                                if (lodash.isEmpty(ctrl.project) && ctrl.selectedProject.id !== 'new_project') {\n                                    ctrl.project = lodash.find(ctrl.projects, ['metadata.name', ctrl.selectedProject.id]);\n                                }\n\n                                $state.go('app.project.function.edit.code', {\n                                    isNewFunction: true,\n                                    id: ctrl.project.metadata.name,\n                                    functionId: ctrl.functionData.metadata.name,\n                                    projectId: ctrl.project.metadata.name,\n                                    projectNamespace: ctrl.project.metadata.namespace,\n                                    functionData: ctrl.functionData\n                                });\n                            }\n                        });\n                    }\n                }\n            }, 100);\n        }\n\n        /**\n         * Set data returned by validating input component\n         * @param {string} data - data to be set\n         * @param {string} field - field which should be filled\n         */\n        function inputValueCallback(data, field) {\n            $timeout(function () {\n                if (!lodash.isNil(data)) {\n                    lodash.set(ctrl, 'functionData.metadata.' + field, data);\n                }\n            });\n        }\n\n        /**\n         * Checks permissibility creation of new function.\n         * @returns {boolean}\n         */\n        function isCreateFunctionAllowed() {\n            return lodash.isEmpty(ctrl.functionFromScratchForm.$error);\n        }\n\n        /**\n         * Hides or shows projects drop-down.\n         * Show drop-down if 'Create Function' screen was reached from 'Projects' screen. Otherwise - hide drop-down\n         * @returns {boolean}\n         */\n        function isProjectsDropDownVisible() {\n            return $state.current.name === 'app.create-function';\n        }\n\n        /**\n         * Set data returned by default drop-down component\n         * @param {Object} item - the new data\n         * @param {boolean} isItemChanged - was value changed or not\n         */\n        function onRuntimeChange(item, isItemChanged) {\n            if (!lodash.isNil(item) && isItemChanged) {\n                lodash.assign(ctrl.functionData.spec, {\n                    runtime: item.id,\n                    handler: FunctionsService.getHandler(item.id),\n                    build: {\n                        functionSourceCode: item.sourceCode\n                    }\n                });\n            }\n        }\n\n        /**\n         * Projects drop-down callback.\n         * Sets selected project to function.\n         * @param {Object} item - new selected project\n         */\n        function onProjectChange(item) {\n            ctrl.project = lodash.find(ctrl.projects, ['metadata.name', item.id]);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Gets all runtimes\n         * @returns {Array}\n         */\n        function getRuntimes() {\n            return [{\n                id: 'golang',\n                name: 'Go',\n                sourceCode: 'cGFja2FnZSBtYWluDQoNCmltcG9ydCAoDQogICAgImdpdGh1Yi5jb20vbnVjbGlvL251Y2xpby1zZGstZ28iDQo' + 'pDQoNCmZ1bmMgSGFuZGxlcihjb250ZXh0ICpudWNsaW8uQ29udGV4dCwgZXZlbnQgbnVjbGlvLkV2ZW50KSAoaW50ZXJmYWNle3' + '0sIGVycm9yKSB7DQogICAgcmV0dXJuIG5pbCwgbmlsDQp9', // source code in base64\n                visible: false\n            }, {\n                id: 'python:2.7',\n                name: 'Python 2.7',\n                sourceCode: 'ZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpOg0KICAgIHJldHVybiAiIg==', // source code in base64\n                visible: true\n            }, {\n                id: 'python:3.6',\n                name: 'Python 3.6',\n                sourceCode: 'ZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpOg0KICAgIHJldHVybiAiIg==', // source code in base64\n                visible: true\n            }, {\n                id: 'dotnetcore',\n                name: '.NET Core',\n                sourceCode: 'dXNpbmcgU3lzdGVtOw0KdXNpbmcgTnVjbGlvLlNkazsNCg0KcHVibGljIGNsYXNzIG1haW4NCnsNCiAgICBwdWJ' + 'saWMgb2JqZWN0IGhhbmRsZXIoQ29udGV4dCBjb250ZXh0LCBFdmVudCBldmVudEJhc2UpDQogICAgew0KICAgICAgICByZXR1cm' + '4gbmV3IFJlc3BvbnNlKCkNCiAgICAgICAgew0KICAgICAgICAgICAgU3RhdHVzQ29kZSA9IDIwMCwNCiAgICAgICAgICAgIENvb' + 'nRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3RleHQiLA0KICAgICAgICAgICAgQm9keSA9ICIiDQogICAgICAgIH07DQogICAgfQ0K' + 'fQ==', // source code in base64\n                visible: false\n            }, {\n                id: 'java',\n                name: 'Java',\n                sourceCode: 'aW1wb3J0IGlvLm51Y2xpby5Db250ZXh0Ow0KaW1wb3J0IGlvLm51Y2xpby5FdmVudDsNCmltcG9ydCBpby5udWN' + 'saW8uRXZlbnRIYW5kbGVyOw0KaW1wb3J0IGlvLm51Y2xpby5SZXNwb25zZTsNCg0KcHVibGljIGNsYXNzIEhhbmRsZXIgaW1wbG' + 'VtZW50cyBFdmVudEhhbmRsZXIgew0KDQogICAgQE92ZXJyaWRlDQogICAgcHVibGljIFJlc3BvbnNlIGhhbmRsZUV2ZW50KENvb' + 'nRleHQgY29udGV4dCwgRXZlbnQgZXZlbnQpIHsNCiAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCkuc2V0Qm9keSgiIik7DQog' + 'ICAgfQ0KfQ==',\n                visible: true\n            }, {\n                id: 'nodejs',\n                sourceCode: 'ZXhwb3J0cy5oYW5kbGVyID0gZnVuY3Rpb24oY29udGV4dCwgZXZlbnQpIHsNCiAgICBjb250ZXh0LmNhbGxiYWN' + 'rKCcnKTsNCn07', // source code in base64\n                name: 'NodeJS',\n                visible: true\n            }, {\n                id: 'shell',\n                name: 'Shell',\n                sourceCode: 'ZWNobyAiSGVsbG8gZnJvbSBOdWNsaW8i',\n                visible: true\n            }, {\n                id: 'ruby',\n                name: 'Ruby',\n                sourceCode: 'ZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpDQplbmQ=', // source code in base64\n                visible: false\n            }];\n        }\n\n        /**\n         * Gets default runtime\n         * @returns {object} default runtime\n         */\n        function getDefaultRuntime() {\n            return lodash.find(ctrl.runtimes, ['id', 'python:3.6']);\n        }\n\n        /**\n         * Initialize object for function from scratch\n         */\n        function initFunctionData() {\n            ctrl.functionData = {\n                metadata: {\n                    name: '',\n                    namespace: '',\n                    labels: {},\n                    annotations: {}\n                },\n                spec: {\n                    description: '',\n                    disable: false,\n                    triggers: {},\n                    env: [],\n                    loggerSinks: [{\n                        level: 'debug',\n                        sink: ''\n                    }],\n                    handler: FunctionsService.getHandler(ctrl.selectedRuntime.id),\n                    runtime: ctrl.selectedRuntime.id,\n                    version: 0,\n                    build: {\n                        functionSourceCode: ctrl.selectedRuntime.sourceCode\n                    }\n                }\n            };\n\n            if (ConfigService.isDemoMode()) {\n                ctrl.functionData.spec.timeoutSeconds = 0;\n            }\n        }\n\n        /**\n         * Converts projects for project drop-down.\n         */\n        function prepareProjects() {\n            var newProject = {\n                id: 'new_project',\n                name: 'New project'\n            };\n\n            ctrl.selectedProject = lodash.isNil(ctrl.selectedProject) ? newProject : ctrl.selectedProject;\n\n            ctrl.projectsList = lodash.chain(ctrl.projects).map(function (project) {\n                return {\n                    id: project.metadata.name,\n                    name: lodash.defaultTo(project.spec.displayName, project.metadata.name)\n                };\n            }).sortBy(['name']).value();\n\n            ctrl.selectedProject = lodash.isEmpty(ctrl.projectsList) ? newProject : ctrl.selectedProject.id !== 'new_project' ? ctrl.selectedProject : lodash.first(ctrl.projectsList);\n        }\n    }\n})();\n'use strict';\n\n/* eslint max-statements: [\"error\", 100] */\n/* eslint complexity: [\"error\", 15] */\n(function () {\n    'use strict';\n\n    NclFunctionEventPaneController.$inject = ['$element', '$i18next', '$timeout', '$q', 'download', 'i18next', 'lodash', 'moment', 'ConfigService', 'ConverterService', 'DialogsService', 'EventHelperService', 'ValidationService', 'VersionHelperService'];\n    angular.module('iguazio.dashboard-controls').component('nclFunctionEventPane', {\n        bindings: {\n            version: '<',\n            createFunctionEvent: '&',\n            getFunctionEvents: '&',\n            deleteFunctionEvent: '&',\n            invokeFunction: '&'\n        },\n        templateUrl: 'nuclio/functions/version/version-code/function-event-pane/function-event-pane.tpl.html',\n        controller: NclFunctionEventPaneController\n    });\n\n    function NclFunctionEventPaneController($element, $i18next, $timeout, $q, download, i18next, lodash, moment, ConfigService, ConverterService, DialogsService, EventHelperService, ValidationService, VersionHelperService) {\n        var ctrl = this;\n\n        var canceler = null;\n        var canceledInvocation = false;\n        var HISTORY_LIMIT = 100;\n        var lng = i18next.language;\n\n        ctrl.createEvent = true;\n        ctrl.testEventsForm = null;\n        ctrl.headers = [];\n        ctrl.isSplashShowed = {\n            value: false\n        };\n        ctrl.leftBarNavigationTabs = [{\n            id: 'saved',\n            tabName: $i18next.t('functions:SAVED', { lng: lng })\n        }, {\n            id: 'history',\n            tabName: $i18next.t('functions:HISTORY', { lng: lng })\n        }];\n        ctrl.logs = [];\n        ctrl.requestMethods = [{\n            id: 'post',\n            name: 'POST',\n            visible: true\n        }, {\n            id: 'get',\n            name: 'GET',\n            visible: true\n        }, {\n            id: 'put',\n            name: 'PUT',\n            visible: true\n        }, {\n            id: 'gelete',\n            name: 'DELETE',\n            visible: true\n        }, {\n            id: 'patch',\n            name: 'PATCH',\n            visible: true\n        }];\n        ctrl.requestNavigationTabs = [{\n            id: 'body',\n            tabName: $i18next.t('functions:BODY', { lng: lng })\n        }, {\n            id: 'headers',\n            tabName: $i18next.t('functions:HEADERS', { lng: lng })\n        }];\n        ctrl.requestBodyTypes = [{\n            id: 'text',\n            name: 'Text',\n            visible: true\n        }, {\n            id: 'json',\n            name: 'JSON',\n            visible: true\n        }, {\n            id: 'file',\n            name: 'File',\n            visible: ConfigService.isDemoMode()\n        }];\n        ctrl.requestBodyType = ctrl.requestBodyTypes[0];\n        ctrl.requestSourceCodeLanguage = 'plaintext';\n        ctrl.requestSourceCode = '';\n        ctrl.responseNavigationTabs = [{\n            id: 'body',\n            tabName: $i18next.t('functions:BODY', { lng: lng })\n        }, {\n            id: 'headers',\n            tabName: $i18next.t('functions:HEADERS', { lng: lng }),\n            badge: 0\n        }, {\n            id: 'logs',\n            tabName: $i18next.t('common:LOGS', { lng: lng }),\n            badge: 0\n        }];\n        ctrl.responseImage = null;\n        ctrl.selectedEvent = {};\n        ctrl.selectedRequestTab = ctrl.responseNavigationTabs[0];\n        ctrl.selectedResponseTab = ctrl.responseNavigationTabs[0];\n        ctrl.selectedLeftBarTab = ctrl.leftBarNavigationTabs[0];\n        ctrl.showLeftBar = false;\n        ctrl.maxLengths = {\n            eventName: ValidationService.getMaxLength('function.eventName')\n        };\n        ctrl.igzScrollConfig = {\n            maxElementsCount: 4,\n            childrenSelector: '.table-body'\n        };\n        ctrl.scrollConfig = {\n            axis: 'y',\n            advanced: {\n                updateOnContentResize: true\n            }\n        };\n        ctrl.showResponse = false;\n        ctrl.testResult = {};\n        ctrl.uploadingData = {\n            uploading: false,\n            uploaded: false,\n            progress: '0%',\n            name: ''\n        };\n\n        ctrl.$onInit = onInit;\n\n        ctrl.addNewHeader = addNewHeader;\n        ctrl.cancelInvocation = cancelInvocation;\n        ctrl.downloadResponseFile = downloadResponseFile;\n        ctrl.deleteEvent = deleteEvent;\n        ctrl.deleteFile = deleteFile;\n        ctrl.fixLeftBar = fixLeftBar;\n        ctrl.getInvocationUrl = getInvocationUrl;\n        ctrl.getMethodColor = getMethodColor;\n        ctrl.handleAction = handleAction;\n        ctrl.inputValueCallback = inputValueCallback;\n        ctrl.isDisabledTestButton = isDisabledTestButton;\n        ctrl.onChangeData = onChangeData;\n        ctrl.onChangeLogLevel = onChangeLogLevel;\n        ctrl.onChangeRequestBodyType = onChangeRequestBodyType;\n        ctrl.onChangeRequestMethod = onChangeRequestMethod;\n        ctrl.onChangeRequestSourceCode = onChangeRequestSourceCode;\n        ctrl.onChangeTab = onChangeTab;\n        ctrl.resetData = resetData;\n        ctrl.saveEvent = saveEvent;\n        ctrl.selectEvent = selectEvent;\n        ctrl.testEvent = testEvent;\n        ctrl.toggleLeftBar = toggleLeftBar;\n        ctrl.uploadFile = uploadFile;\n\n        //\n        // Hook method\n        //\n\n        /**\n         * Initialization method\n         */\n        function onInit() {\n            ctrl.isSplashShowed.value = true;\n            ctrl.eventLogLevel = 'debug';\n\n            if (lodash.isNil(ctrl.version.ui.deployedVersion)) {\n                VersionHelperService.updateIsVersionChanged(ctrl.version);\n            }\n\n            updateHistory();\n\n            lodash.defaultsDeep(ctrl.selectedEvent, {\n                metadata: {\n                    namespace: lodash.get(ctrl.version, 'metadata.namespace'),\n                    labels: {\n                        'nuclio.io/function-name': lodash.get(ctrl.version, 'metadata.name')\n                    }\n                },\n                spec: {\n                    displayName: '',\n                    triggerKind: 'http',\n                    attributes: {\n                        method: 'POST',\n                        headers: {\n                            'Content-Type': 'text/plain'\n                        },\n                        path: ''\n                    },\n                    body: ''\n                }\n            });\n\n            ctrl.getFunctionEvents({ functionData: ctrl.version }).then(function (response) {\n                ctrl.savedEvents = response;\n            }).catch(function (error) {\n                var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_EVENTS', { lng: lng });\n\n                DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n            }).finally(function () {\n                ctrl.isSplashShowed.value = false;\n            });\n\n            updateRequestHeaders();\n        }\n\n        //\n        // Public methods\n        //\n\n        /**\n         * Adds new header\n         */\n        function addNewHeader(event) {\n            $timeout(function () {\n                if (ctrl.headers.length < 1 || lodash.last(ctrl.headers).ui.isFormValid) {\n                    ctrl.headers.push({\n                        name: '',\n                        value: '',\n                        ui: {\n                            editModeActive: true,\n                            isFormValid: false,\n                            name: 'header',\n                            checked: true\n                        }\n                    });\n\n                    event.stopPropagation();\n                }\n            }, 50);\n        }\n\n        /**\n         * Cancels invoke request\n         */\n        function cancelInvocation() {\n            if (canceler !== null) {\n                canceler.resolve();\n                canceler = null;\n            }\n            canceledInvocation = true;\n        }\n\n        /**\n         * Downloads response body file\n         */\n        function downloadResponseFile() {\n            var fileName = ctrl.selectedEvent.spec.displayName + '_' + moment.utc().format('YYYY-MM-DDThh-mm-ss');\n            var contentType = lodash.get(ctrl.testResult.headers, 'content-type', lodash.get(ctrl.testResult.headers, 'Content-Type', null));\n            var textualFile = lodash.includes(contentType, 'text') || contentType === 'application/json';\n\n            if (textualFile) {\n                download.fromData(ctrl.testResult.body, contentType, fileName);\n            } else {\n                download.fromBlob(ctrl.testResult.body, fileName);\n            }\n        }\n\n        /**\n         * Deletes selected event\n         * @param {Object} event\n         */\n        function deleteEvent(event) {\n            var dialogConfig = {\n                message: {\n                    message: $i18next.t('functions:DELETE_EVENT', { lng: lng }) + ' “' + event.spec.displayName + '”?',\n                    description: $i18next.t('functions:DELETE_EVENT_DESCRIPTION', { lng: lng })\n                },\n                yesLabel: $i18next.t('common:YES_DELETE', { lng: lng }),\n                noLabel: $i18next.t('common:CANCEL', { lng: lng }),\n                type: 'nuclio_alert'\n            };\n\n            DialogsService.confirm(dialogConfig.message, dialogConfig.yesLabel, dialogConfig.noLabel, dialogConfig.type).then(function () {\n                var eventData = {\n                    metadata: {\n                        name: event.metadata.name,\n                        namespace: event.metadata.namespace\n                    }\n                };\n                ctrl.isSplashShowed.value = true;\n\n                ctrl.deleteFunctionEvent({ eventData: eventData }).then(function () {\n\n                    // update test events list\n                    ctrl.getFunctionEvents({ functionData: ctrl.version }).then(function (response) {\n                        ctrl.savedEvents = response;\n\n                        if (event.metadata.name === ctrl.selectedEvent.metadata.name) {\n                            resetData();\n                        }\n                    }).catch(function (error) {\n                        var defaultMsg = $i18next.t('functions:ERROR_MSG.GET_EVENTS', { lng: lng });\n\n                        DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n                    });\n                }).catch(function (error) {\n                    var defaultMsg = $i18next.t('functions:ERROR_MSG.DELETE_EVENTS', { lng: lng });\n\n                    DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n                }).finally(function () {\n                    ctrl.isSplashShowed.value = false;\n                });\n            });\n        }\n\n        /**\n         * Deletes uploaded file\n         */\n        function deleteFile() {\n            ctrl.uploadingData = {\n                uploading: false,\n                uploaded: false,\n                progress: '0%',\n                name: ''\n            };\n\n            ctrl.selectedEvent.spec.body = '';\n            ctrl.selectedEvent.spec.attributes.headers['Content-Type'] = '';\n\n            updateRequestHeaders();\n        }\n\n        /**\n         * Sets left bar as fixed\n         */\n        function fixLeftBar() {\n            ctrl.fixedLeftBar = true;\n        }\n\n        /**\n         * Gets invocation url\n         * @returns {string}\n         */\n        function getInvocationUrl() {\n            var status = lodash.defaultTo(lodash.get(ctrl.version, 'ui.deployResult.status'), lodash.get(ctrl.version, 'status', {}));\n\n            if (lodash.toFinite(status.httpPort) === 0 || !lodash.includes(['ready', 'scaledToZero'], status.state)) {\n                status.httpPort = null;\n            }\n\n            setInvocationUrl(ConfigService.nuclio.externalIPAddress, status.httpPort);\n\n            return lodash.isNull(status.httpPort) ? $i18next.t('functions:NOT_YET_DEPLOYED', { lng: lng }) : lodash.trimEnd(ctrl.version.ui.invocationUrl, '/') + '/';\n        }\n\n        /**\n         * Gets color depends on request method type\n         * @param {string} method\n         * @returns {string}\n         */\n        function getMethodColor(method) {\n            return method === 'POST' ? '#fdbc5a' : method === 'GET' ? '#21d4ac' : method === 'PUT' ? '#239bca' : method === 'DELETE' ? '#e54158' : '#96a8d3';\n        }\n\n        /**\n         * Handler on specific action type for key-value input\n         * @param {string} actionType\n         * @param {number} index - index of label in array\n         */\n        function handleAction(actionType, index) {\n            if (actionType === 'delete') {\n                ctrl.headers.splice(index, 1);\n\n                updateHeaders();\n            }\n        }\n\n        /**\n         * Update data callback\n         * @param {string} newData\n         * @param {string} field\n         */\n        function inputValueCallback(newData, field) {\n            lodash.set(ctrl.selectedEvent, field, newData);\n\n            updateRequestHeaders();\n        }\n\n        /**\n         * Checks if `Test` button should be disabled\n         * @returns {boolean}\n         */\n        function isDisabledTestButton() {\n            var httpPort = lodash.get(ctrl.version, 'ui.deployResult.status.httpPort', null);\n\n            if (lodash.get(ctrl.version, 'status.state') === 'ready' && lodash.get(ctrl.version, 'spec.disable')) {\n                return true;\n            }\n\n            if (lodash.isNil(httpPort)) {\n                httpPort = lodash.get(ctrl.version, 'status.httpPort', null);\n            }\n\n            var state = lodash.get(ctrl.version, 'ui.deployResult.status.state');\n            if (httpPort && lodash.includes(['imported', 'building', 'error'], state)) {\n                httpPort = null;\n            }\n\n            return lodash.isNull(httpPort) || ctrl.uploadingData.uploading || ctrl.testing;\n        }\n\n        /**\n         * Changes headers data\n         * @param {Object} label\n         * @param {number} index\n         */\n        function onChangeData(label, index) {\n            ctrl.headers[index] = label;\n\n            updateHeaders();\n        }\n\n        /**\n         * Changes log level data\n         * @param {Object} selectedLogLevel - selected log level\n         */\n        function onChangeLogLevel(selectedLogLevel) {\n            ctrl.eventLogLevel = selectedLogLevel.id;\n        }\n\n        /**\n         * Changes function's test request type of body (text, json, file)\n         * @param {Object} bodyType\n         */\n        function onChangeRequestBodyType(bodyType) {\n            ctrl.requestBodyType = bodyType;\n            ctrl.selectedEvent.spec.body = '';\n\n            if (bodyType.id === 'file') {\n                $timeout(onDragNDropFileToBody);\n            } else {\n                ctrl.uploadingData = {\n                    uploading: false,\n                    uploaded: false,\n                    progress: '0%',\n                    name: ''\n                };\n\n                ctrl.requestSourceCodeLanguage = bodyType.id === 'json' ? 'json' : 'textplain';\n                ctrl.selectedEvent.spec.attributes.headers['Content-Type'] = bodyType.id === 'json' ? 'application/json' : 'text/plain';\n\n                updateRequestHeaders();\n            }\n        }\n\n        /**\n         * Changes function's test request method\n         * @param {Object} requestMethod\n         */\n        function onChangeRequestMethod(requestMethod) {\n            lodash.set(ctrl.selectedEvent, 'spec.attributes.method', requestMethod.name);\n        }\n\n        /**\n         * Changes request's source code\n         * @param {string} sourceCode\n         */\n        function onChangeRequestSourceCode(sourceCode) {\n            lodash.set(ctrl.selectedEvent, 'spec.body', sourceCode);\n        }\n\n        /**\n         * Changes function's test tab\n         * @param {Object} tab\n         * @param {string} field\n         */\n        function onChangeTab(tab, field) {\n            ctrl[field] = tab;\n        }\n\n        /**\n         * Resets all changes\n         */\n        function resetData() {\n            ctrl.testEventsForm.$setPristine();\n            ctrl.selectedEvent = {\n                metadata: {\n                    namespace: lodash.get(ctrl.version, 'metadata.namespace'),\n                    labels: {\n                        'nuclio.io/function-name': lodash.get(ctrl.version, 'metadata.name')\n                    }\n                },\n                spec: {\n                    displayName: '',\n                    triggerKind: 'http',\n                    attributes: {\n                        method: 'POST',\n                        headers: {\n                            'Content-Type': 'text/plain'\n                        },\n                        path: ''\n                    },\n                    body: ''\n                }\n            };\n            ctrl.createEvent = true;\n            ctrl.testResult = null;\n            ctrl.showResponse = false;\n            ctrl.requestBodyType = ctrl.requestBodyTypes[0];\n            ctrl.selectedResponseTab = ctrl.responseNavigationTabs[0];\n            ctrl.headers = null;\n            ctrl.eventLogLevel = 'debug';\n\n            updateRequestHeaders();\n        }\n\n        /**\n         * Saves created event\n         * @param {Object} event\n         */\n        function saveEvent(event) {\n            if (lodash.isEmpty(lodash.get(ctrl.selectedEvent, 'spec.displayName', ''))) {\n                ctrl.testEventsForm['spec.displayName'].$setValidity('text', false);\n\n                return false;\n            } else {\n                ctrl.testEventsForm['spec.displayName'].$setValidity('text', true);\n            }\n\n            ctrl.testEventsForm.$setSubmitted();\n\n            if ((angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) && ctrl.testEventsForm.$valid) {\n\n                var eventToSave = angular.copy(ctrl.selectedEvent);\n                if (ctrl.requestBodyType === 'file') {\n                    eventToSave.spec.body = '';\n                }\n\n                // set `nuclio.io/function-name` label to relate this function event to its function\n                lodash.set(eventToSave, ['metadata', 'labels', 'nuclio.io/function-name'], ctrl.version.metadata.name);\n\n                ctrl.isSplashShowed.value = true;\n\n                // save created event on beck-end\n                ctrl.createFunctionEvent({ eventData: eventToSave, isNewEvent: ctrl.createEvent }).then(function (newEvent) {\n                    ctrl.getFunctionEvents({ functionData: ctrl.version }).then(function (response) {\n                        ctrl.savedEvents = response;\n                    });\n\n                    if (ctrl.createEvent && angular.isDefined(newEvent)) {\n                        ctrl.selectedEvent = newEvent;\n                        ctrl.selectedEvent.spec.body = lodash.defaultTo(ctrl.selectedEvent.spec.body, '');\n                    }\n\n                    ctrl.createEvent = false;\n                    ctrl.isSplashShowed.value = false;\n                }).catch(function (error) {\n                    var defaultMsg = $i18next.t('functions:ERROR_MSG.CREATE_UPDATE_FUNCTION_EVENT', { lng: lng });\n\n                    DialogsService.alert(lodash.get(error, 'data.error', defaultMsg));\n                    ctrl.isSplashShowed.value = false;\n                });\n            }\n        }\n\n        /**\n         * Selects specific event from list of saved events\n         * @param {Object} event\n         * @param {string} [location] - location of event(ex. history)\n         */\n        function selectEvent(event, location) {\n            if (location === 'history') {\n                lodash.set(event, 'spec.displayName', '');\n            }\n\n            ctrl.selectedEvent = angular.copy(event);\n            ctrl.selectedEvent.spec.body = lodash.defaultTo(ctrl.selectedEvent.spec.body, '');\n            ctrl.createEvent = false;\n            ctrl.showResponse = false;\n            ctrl.testResult = null;\n            ctrl.showLeftBar = ctrl.fixedLeftBar;\n            ctrl.selectedResponseTab = ctrl.responseNavigationTabs[0];\n\n            var contentType = ctrl.selectedEvent.spec.attributes.headers['Content-Type'];\n            ctrl.requestSourceCodeLanguage = contentType === 'application/json' ? 'json' : 'textplain';\n            updateRequestHeaders();\n\n            // 2020-02-10 Eran Nussbam:\n            // File is not in production until further notice, and there is no way to figure out if a function event is\n            // of type 'file' anymore. If back-end supports this in the future, we will figure out what to do here.\n            var requestType = contentType === 'application/json' ? 'json' : 'text';\n            ctrl.requestBodyType = lodash.find(ctrl.requestBodyTypes, ['id', requestType]);\n        }\n\n        /**\n         * Invokes event\n         * @param {Object} event\n         */\n        function testEvent(event) {\n            ctrl.testEventsForm.$setPristine();\n            var httpPort = lodash.get(ctrl.version, 'status.httpPort', null);\n\n            if ((angular.isUndefined(event) || event.keyCode === EventHelperService.ENTER) && !ctrl.testing && !lodash.isNull(httpPort) && !ctrl.uploadingData.uploading && !ctrl.isDisabledTestButton()) {\n                var startTime = moment();\n                canceler = $q.defer();\n                canceledInvocation = false;\n                ctrl.testing = true;\n                ctrl.testResult = {};\n                ctrl.responseImage = null;\n\n                var eventData = angular.copy(ctrl.selectedEvent);\n                lodash.set(eventData, 'spec.attributes.logLevel', ctrl.eventLogLevel);\n\n                ctrl.invokeFunction({ eventData: eventData, canceler: canceler.promise }).then(function (response) {\n                    return $q.reject(response);\n                }).catch(function (invocationData) {\n                    if (angular.isDefined(invocationData.status) && invocationData.status !== -1) {\n                        var lowerCaseHeaders = lodash.mapKeys(invocationData.headers, function (value, key) {\n                            return key.toLowerCase();\n                        });\n\n                        ctrl.invokeTime = convertTime(moment().diff(startTime));\n\n                        ctrl.testResult = {\n                            status: {\n                                statusCode: invocationData.status,\n                                statusText: invocationData.statusText\n                            },\n\n                            // not using `lowerCaseHeaders` here so the headers will be displayed as-is\n                            headers: lodash.omit(invocationData.headers, ['x-nuclio-logs', 'X-Nuclio-Logs']),\n                            body: invocationData.body\n                        };\n\n                        var responseHeadersTab = lodash.find(ctrl.responseNavigationTabs, ['id', 'headers']);\n                        responseHeadersTab.badge = lodash.size(ctrl.testResult.headers);\n\n                        saveEventToHistory();\n\n                        var logs = lodash.get(lowerCaseHeaders, 'x-nuclio-logs', null);\n                        var responseLogsTab = lodash.find(ctrl.responseNavigationTabs, ['id', 'logs']);\n                        ctrl.logs = lodash.isNull(logs) ? [] : angular.fromJson(logs);\n                        responseLogsTab.badge = ctrl.logs.length;\n\n                        var size = lodash.get(lowerCaseHeaders, 'content-length', null);\n                        ctrl.responseSize = lodash.isNull(size) ? size : ConverterService.getConvertedBytes(Number(size), ['B', 'KB', 'MB', 'GB']);\n\n                        var contentType = lodash.get(lowerCaseHeaders, 'content-type', null);\n\n                        var textualFile = lodash.includes(contentType, 'text') || contentType === 'application/json';\n\n                        // if content type is \"application/json\" then attempt to pretty-print JSON. The body could\n                        // be either a serialized-JSON string, or an object.\n                        // monaco editor must be assigned a string, not an object, then even if the content type is\n                        // not \"application/json\" but for any reason the body is an object, attempt to pretty-print\n                        // it as JSON.\n                        if (contentType === 'application/json' || lodash.isObject(invocationData.body)) {\n                            ctrl.testResult.body = formatJson(invocationData.body);\n                        }\n\n                        var imageFile = lodash.startsWith(contentType, 'image/');\n                        if (imageFile) {\n                            var reader = new FileReader();\n                            reader.readAsDataURL(ctrl.testResult.body);\n                            reader.onload = function () {\n                                ctrl.responseImage = reader.result;\n                                ctrl.testing = false;\n                            };\n                        } else {\n                            ctrl.testing = false;\n                        }\n\n                        ctrl.responseBodyType = textualFile ? 'code' : imageFile ? 'image' : $i18next.t('common:N_A', { lng: lng });\n\n                        ctrl.showResponse = true;\n                    } else {\n                        if (!canceledInvocation) {\n                            var statusText = angular.isDefined(invocationData.error) ? invocationData.error : invocationData.status + ' ' + invocationData.statusText;\n                            DialogsService.alert($i18next.t('functions:ERROR_MSG.INVOKE_FUNCTION', { lng: lng }) + statusText);\n                        }\n\n                        ctrl.testing = false;\n                        ctrl.showResponse = false;\n                    }\n\n                    ctrl.isInvocationSuccess = lodash.startsWith(invocationData.status, '2');\n                });\n            }\n        }\n\n        /**\n         * Toggles left bar\n         * @param {boolean} [displayLeftBar]\n         */\n        function toggleLeftBar(displayLeftBar) {\n            ctrl.showLeftBar = lodash.defaultTo(displayLeftBar, !ctrl.showLeftBar);\n            ctrl.fixedLeftBar = false;\n        }\n\n        /**\n         * Upload selected file\n         * @param {Object} file - selected file\n         */\n        function uploadFile(file) {\n            var reader = new FileReader();\n            var size = ConverterService.getConvertedBytes(file.size, ['B', 'KB', 'MB', 'GB']);\n\n            ctrl.uploadingData.size = size.value + size.label;\n            ctrl.uploadingData.name = file.name;\n            ctrl.uploadingData.uploading = true;\n\n            reader.onload = function (onloadEvent) {\n                if (!ctrl.uploadingData.uploaded) {\n                    ctrl.uploadingData.name = file.name;\n                    ctrl.uploadingData.progress = '100%';\n\n                    if (onloadEvent.target.result === '') {\n                        DialogsService.alert($i18next.t('functions:ERROR_MSG.UPLOAD_FILE.UNKNOWN', { lng: lng }));\n\n                        deleteFile();\n                    } else {\n                        try {\n                            ctrl.selectedEvent.spec.body = b64toBlob(onloadEvent.target.result.split(',')[1], file.type);\n\n                            ctrl.selectedEvent.spec.attributes.headers['Content-Type'] = file.type;\n                            updateRequestHeaders();\n                        } catch (ex) {\n                            DialogsService.alert($i18next.t('functions:ERROR_MSG.UPLOAD_FILE.DEFAULT', { lng: lng }) + ex);\n\n                            deleteFile();\n                        }\n                    }\n\n                    $timeout(function () {\n                        ctrl.uploadingData.uploading = false;\n                        ctrl.uploadingData.uploaded = true;\n                    }, 500);\n                }\n            };\n            reader.onerror = function () {\n                ctrl.uploadingData.uploading = false;\n                ctrl.uploadingData.uploaded = false;\n                ctrl.uploadingData.name = '';\n            };\n            reader.onprogress = function (load) {\n                if (!lodash.isNil(load.target.result)) {\n                    var progressPercentage = parseInt(100.0 * load.loaded / load.total);\n\n                    ctrl.uploadingData.uploading = true;\n                    ctrl.uploadingData.progress = progressPercentage + '%';\n                }\n            };\n            reader.readAsDataURL(file);\n        }\n\n        //\n        // Private methods\n        //\n\n        /**\n         * Converts base64 to Blob and returns it\n         * @param {string} b64Data\n         * @param {string} contentType\n         * @param {number} sliceSize\n         * @returns {Blob}\n         */\n        function b64toBlob(b64Data, contentType, sliceSize) {\n            contentType = lodash.defaultTo(contentType, '');\n            sliceSize = lodash.defaultTo(sliceSize, 512);\n\n            var byteCharacters = atob(b64Data);\n            var byteArrays = [];\n\n            for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {\n                var slice = byteCharacters.slice(offset, offset + sliceSize);\n\n                var byteNumbers = new Array(slice.length);\n                for (var i = 0; i < slice.length; i++) {\n                    byteNumbers[i] = slice.charCodeAt(i);\n                }\n\n                var byteArray = new Uint8Array(byteNumbers);\n\n                byteArrays.push(byteArray);\n            }\n\n            return new Blob(byteArrays, { type: contentType });\n        }\n\n        /**\n         * Converts time to milliseconds, seconds, minutes depends on value\n         * @param {number} millisec\n         * @returns {string}\n         */\n        function convertTime(millisec) {\n            var seconds = (millisec / 1000).toFixed(1);\n            var minutes = (millisec / (1000 * 60)).toFixed(1);\n\n            return millisec < 1000 ? millisec + ' ms' : seconds < 60 ? seconds + ' s' : minutes + ' min';\n        }\n\n        /**\n         * Formats an object as a formatted JSON.\n         * @param {*} value - the object or a JSON-serialized string to format.\n         * @returns {*} JSON-serialized string representation of `value` formatted with newlines and indentation.\n         *      In case of an error in JSON conversion or if `value` is not a string nor an object, returns `value`\n         *      as-is.\n         */\n        function formatJson(value) {\n            try {\n                if (lodash.isString(value)) {\n                    value = angular.fromJson(value);\n                }\n\n                if (!lodash.isObject(value)) {\n                    return returnValue();\n                }\n\n                return angular.toJson(value, 4);\n            } catch (error) {\n                return returnValue();\n            }\n\n            /**\n             * Returns `value`.\n             * @returns {*} `value` as-is.\n             */\n            function returnValue() {\n                return value;\n            }\n        }\n\n        /**\n         * Handler on drag-n-dropping a file\n         */\n        function onDragNDropFileToBody() {\n            var dropSection = $element.find('.drop-section');\n\n            // Register event handlers for drag'n'drop of files\n            dropSection.on('dragover', null, false).on('dragenter', null, function (event) {\n                event.preventDefault();\n\n                $element.find('.upload-file-section').css('padding', '3px');\n                $element.find('.drop-section').css('border-color', '#239bca');\n            }).on('dragleave', null, function (event) {\n                event.preventDefault();\n\n                $element.find('.upload-file-section').css('padding', '8px');\n                $element.find('.drop-section').css('border-color', '#c9c9cd');\n            }).on('drop', null, function (event) {\n                event.preventDefault();\n\n                if (!ctrl.uploadingData.uploading) {\n                    ctrl.uploadingData = {\n                        uploading: true,\n                        uploaded: false,\n                        progress: '0%',\n                        name: ''\n                    };\n\n                    var file = lodash.get(event, 'originalEvent.dataTransfer.files[0]');\n\n                    uploadFile(file);\n                }\n\n                $element.find('.upload-file-section').css('padding', '8px');\n                $element.find('.drop-section').css('border-color', '#c9c9cd');\n            });\n        }\n\n        /**\n         * Saves tested event to local storage history\n         */\n        function saveEventToHistory() {\n            var updatedHistory = lodash.defaultTo(angular.fromJson(localStorage.getItem('test-events')), []);\n            if (updatedHistory.length === HISTORY_LIMIT) {\n                updatedHistory.splice(0, 1);\n            }\n            var eventToSave = angular.copy(ctrl.selectedEvent);\n            delete eventToSave.spec.displayName;\n            updatedHistory.push(eventToSave);\n\n            localStorage.setItem('test-events', angular.toJson(updatedHistory));\n            updateHistory();\n        }\n\n        /**\n         * Sets the invocation URL of the function\n         * @param {string} ip - external IP address\n         * @param {number} port - HTTP port\n         */\n        function setInvocationUrl(ip, port) {\n            ctrl.version.ui.invocationUrl = lodash.isEmpty(ip) || lodash.toFinite(port) === 0 ? '' : 'http://' + ip + ':' + port;\n        }\n\n        /**\n         * Updates headers after changing request body type or path\n         */\n        function updateRequestHeaders() {\n            var requestHeaders = lodash.get(ctrl.selectedEvent, 'spec.attributes.headers', {});\n\n            ctrl.headers = lodash.map(requestHeaders, function (value, key) {\n                var header = {\n                    name: key,\n                    value: value,\n                    ui: {\n                        editModeActive: false,\n                        isFormValid: true,\n                        name: 'label',\n                        checked: true\n                    }\n                };\n                var existedHeader = lodash.find(ctrl.headers, ['name', key]);\n\n                if (angular.isDefined(existedHeader)) {\n                    header.ui = lodash.assign(header.ui, existedHeader.ui);\n                }\n\n                return header;\n            });\n            ctrl.headers = lodash.compact(ctrl.headers);\n        }\n\n        /**\n         * Updates request's headers\n         */\n        function updateHeaders() {\n            var newHeaders = {};\n\n            lodash.forEach(ctrl.headers, function (header) {\n                if (header.ui.checked) {\n                    newHeaders[header.name] = header.value;\n                }\n            });\n\n            lodash.set(ctrl.selectedEvent, 'spec.attributes.headers', newHeaders);\n        }\n\n        /**\n         * Updates invoking history\n         */\n        function updateHistory() {\n            var nameField = 'metadata.labels[\\'nuclio.io/function-name\\']';\n            ctrl.history = lodash.defaultTo(angular.fromJson(localStorage.getItem('test-events')), []);\n            ctrl.history = lodash.filter(ctrl.history, [nameField, ctrl.version.metadata.name]);\n        }\n    }\n})();\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/functions.tpl.html',\n    '<div class=\"ncl-functions-wrapper\"><igz-splash-screen data-is-splash-showed=\"$ctrl.isSplashShowed\"></igz-splash-screen><igz-info-page-filters data-is-filters-showed=\"$ctrl.isFiltersShowed.value\" data-apply-filters=\"$ctrl.onApplyFilters(false)\" data-reset-filters=\"$ctrl.onResetFilters(false)\" data-change-state-callback=\"$ctrl.isFiltersShowed.changeValue(newVal)\" data-toggle-method=\"$ctrl.toggleFilters()\"><igz-search-input class=\"info-page-filters-item igz-component\" data-data-set=\"$ctrl.functions\" data-search-keys=\"$ctrl.searchKeys\" data-search-callback=\"$ctrl.onUpdateFiltersCounter(searchQuery)\" data-placeholder=\"{{ \\'functions:PLACEHOLDER.SEARCH_FUNCTIONS\\' | i18next }}\" data-live-search=\"false\" data-search-states=\"$ctrl.searchStates\"></igz-search-input></igz-info-page-filters><igz-info-page-actions-bar class=\"igz-component\"><div class=\"actions-bar-left\"><igz-action-panel data-actions=\"$ctrl.functionsService.checkedItem === \\'functions\\' || !$ctrl.isDemoMode() ?\\n' +\n    '                                            $ctrl.functionActions : $ctrl.versionActions\"></igz-action-panel></div><div class=\"actions-bar-right\"><div class=\"actions-bar-left actions-buttons-block\"><button class=\"ncl-new-entity-button igz-button-primary\" data-ng-click=\"$ctrl.openNewFunctionScreen()\">{{ \\'functions:NEW_FUNCTION\\' | i18next }}</button></div><div class=\"actions-bar-left actions-content-block\"><div class=\"igz-action-panel\"><div class=\"actions-list\"><igz-action-item-refresh data-refresh=\"$ctrl.refreshFunctions()\"></igz-action-item-refresh><igz-sort-dropdown class=\"igz-component pull-left\" data-sort-options=\"$ctrl.sortOptions\" data-selected-option=\"$ctrl.sortedColumnName\" data-reverse-sorting=\"$ctrl.isReverseSorting\" data-on-sort-change=\"$ctrl.onSortOptionsChange(option)\"></igz-sort-dropdown></div></div></div><igz-actions-panes data-filters-toggle-method=\"$ctrl.toggleFilters()\" data-filters-counter=\"$ctrl.filtersCounter\" data-show-filter-icon=\"true\" data-is-filters-opened=\"$ctrl.isFiltersShowed.value\"></igz-actions-panes></div></igz-info-page-actions-bar><igz-info-page-content class=\"igz-component\"><div class=\"common-table\"><div class=\"common-table-header\"><div class=\"common-table-cell igz-col-3\"><igz-action-checkbox-all class=\"check-all-rows\" data-ng-show=\"!$ctrl.isDemoMode() || $ctrl.functionsService.checkedItem !== \\'\\'\" data-items-count=\"$ctrl.functions.length\" data-items-type=\"{{$ctrl.functionsService.checkedItem}}\"></igz-action-checkbox-all></div><div class=\"igz-col-3 common-table-cell\"></div><div class=\"igz-row common-table-cells-container\"><div class=\"common-table-cell sortable\" data-ng-class=\"[$ctrl.getColumnSortingClasses(\\'metadata.name\\', $ctrl.sortedColumnName, $ctrl.isReverseSorting),\\n' +\n    '                                         $ctrl.getFunctionsTableColSize(\\'headerName\\')]\" data-ng-click=\"$ctrl.sortTableByColumn(\\'metadata.name\\')\">{{ \\'common:NAME\\' | i18next }}<span class=\"sort-arrow\"></span></div><div class=\"common-table-cell sortable function-status\" data-ng-class=\"[$ctrl.getColumnSortingClasses(\\'ui.convertedStatus\\', $ctrl.sortedColumnName, $ctrl.isReverseSorting),\\n' +\n    '                                         $ctrl.getFunctionsTableColSize(\\'status\\')]\" data-ng-click=\"$ctrl.sortTableByColumn(\\'ui.convertedStatus\\')\">{{ \\'common:STATUS\\' | i18next }}<span class=\"sort-arrow\"></span></div><div class=\"common-table-cell sortable\" data-ng-if=\"$ctrl.isDemoMode()\" data-ng-class=\"[$ctrl.getColumnSortingClasses(\\'spec.replicas\\', $ctrl.sortedColumnName, $ctrl.isReverseSorting),\\n' +\n    '                                         $ctrl.getFunctionsTableColSize(\\'replicas\\')]\" data-ng-click=\"$ctrl.sortTableByColumn(\\'spec.replicas\\')\">{{ \\'common:REPLICAS\\' | i18next }}<span class=\"sort-arrow\"></span></div><div class=\"igz-col-10-5 common-table-cell sortable\" data-ng-class=\"$ctrl.getColumnSortingClasses(\\'spec.runtime\\', $ctrl.sortedColumnName, $ctrl.isReverseSorting)\" data-ng-click=\"$ctrl.sortTableByColumn(\\'spec.runtime\\')\">{{ \\'functions:RUNTIME\\' | i18next }}<span class=\"sort-arrow\"></span></div><div class=\"igz-col-16-5 common-table-cell\">{{ \\'functions:INVOCATION_URL\\' | i18next }}</div></div><div class=\"common-table-cell actions-menu\">&nbsp;</div></div><div class=\"search-input-not-found\" data-ng-if=\"$ctrl.isFunctionsListEmpty()\">{{ \\'functions:FUNCTIONS_NOT_FOUND\\' | i18next }}</div><div class=\"common-table-body\" data-igz-extend-background><div class=\"igz-scrollable-container\" data-ng-scrollbars><div class=\"sortable-wrapper\" data-ng-hide=\"$ctrl.searchStates.searchNotFound && $ctrl.searchStates.searchInProgress\" data-ng-model=\"$ctrl.data.working.ui.children\"><div data-ng-repeat=\"aFunction in $ctrl.sortedFunctions track by aFunction.metadata.name\"><div data-igz-show-hide-search-item=\"aFunction\"><ncl-function-collapsing-row data-action-handler-callback=\"$ctrl.handleFunctionVersionAction(actionType, checkedItems)\" data-function=\"aFunction\" data-functions-list=\"$ctrl.functions\" data-get-function=\"$ctrl.getFunction({metadata: metadata, projectID: projectID})\" data-get-functions=\"$ctrl.getFunctions({id: id})\" data-handle-delete-function=\"$ctrl.deleteFunction({functionData: functionData})\" data-is-splash-showed=\"$ctrl.isSplashShowed\" data-project=\"$ctrl.project\" data-refresh-functions-list=\"$ctrl.refreshFunctions()\" data-update-function=\"$ctrl.updateFunction({function: function, projectID: projectID})\"></ncl-function-collapsing-row></div></div></div></div></div></div></igz-info-page-content></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/duplicate-function-dialog/duplicate-function-dialog.tpl.html',\n    '<div class=\"close-button igz-icon-close\" data-ng-click=\"$ctrl.onClose()\"></div><div class=\"title\">{{ \\'functions:DUPLICATE_FUNCTION\\' | i18next }}</div><div class=\"main-content\"><form name=\"$ctrl.duplicateFunctionForm\" novalidate data-ng-keydown=\"$ctrl.duplicateFunction($event)\"><div class=\"field-group function-name-group\"><div class=\"field-label function-name-label\">{{ \\'common:FUNCTION_NAME\\' | i18next }}</div><div class=\"field-input function-name-input\"><igz-validating-input-field data-field-type=\"input\" data-input-name=\"spec.displayName\" data-input-value=\"$ctrl.newFunctionName\" data-is-focused=\"true\" data-form-object=\"$ctrl.duplicateFunctionForm\" data-update-data-callback=\"$ctrl.inputValueCallback(newData)\" data-validation-is-required=\"true\" data-validation-rules=\"$ctrl.validationRules.functionName\" data-validation-max-length=\"{{$ctrl.maxLengths.functionName}}\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_FUNCTION_NAME\\' | i18next }}\"></igz-validating-input-field></div></div></form></div><div class=\"buttons\"><button class=\"ncl-secondary-button igz-button-just-text\" data-test-id=\"functions.duplicate_function_cancel.button\" tabindex=\"0\" data-ng-click=\"$ctrl.onClose()\" data-ng-keydown=\"$ctrl.onClose($event)\">{{ \\'common:CANCEL\\' | i18next }}</button><button class=\"ncl-primary-button igz-button-primary\" data-test-id=\"functions.duplicate_function_duplicate.button\" tabindex=\"0\" data-ng-click=\"$ctrl.duplicateFunction()\" data-ng-keydown=\"$ctrl.duplicateFunction($event)\" data-ng-hide=\"$ctrl.isLoadingState\">{{ \\'common:DUPLICATE\\' | i18next }}</button><button class=\"ncl-primary-button igz-button-primary\" data-ng-show=\"$ctrl.isLoadingState\">{{ \\'common:LOADING_CAPITALIZE_ELLIPSIS\\' | i18next }}</button></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/function-collapsing-row/function-collapsing-row.tpl.html',\n    '<div class=\"ncl-function-collapsing-row items-wrapper\"><div class=\"scrolling-row\"></div><div class=\"function-title-block common-table-row\"><div class=\"common-table-cell igz-col-3\"><igz-action-checkbox data-ng-class=\"{\\'visible\\': !$ctrl.isDemoMode() || $ctrl.functionsService.checkedItem === \\'functions\\',\\n' +\n    '                                    \\'invisible\\': $ctrl.functionsService.checkedItem !== \\'functions\\' &&\\n' +\n    '                                                 $ctrl.functionsService.checkedItem !== \\'\\'}\" data-item=\"$ctrl.function\" data-item-type=\"functions\"></igz-action-checkbox></div><div class=\"common-table-cell igz-col-3 function-row-collapse\"><span data-ng-if=\"$ctrl.function.spec.version > -1\" class=\"collapse-icon\" data-ng-click=\"$ctrl.isFunctionCollapsed = !$ctrl.isFunctionCollapsed\" data-ng-class=\"{\\'collapsed igz-icon-right\\': $ctrl.isFunctionCollapsed, \\'igz-icon-down\\': !$ctrl.isFunctionCollapsed}\"></span></div><div class=\"igz-row common-table-cells-container\" data-ng-click=\"$ctrl.onSelectRow($event)\"><div class=\"common-table-cell\" data-test-id=\"functions.item-name\" data-ng-class=\"[$ctrl.getFunctionsTableColSize(\\'rowName\\')]\"><div class=\"function-name text-ellipsis\"><span data-test-id=\"functions.item-name_name.text\" data-uib-tooltip-html=\"$ctrl.functionNameTooltip\" data-tooltip-append-to-body=\"true\" data-tooltip-placement=\"top\" data-tooltip-popup-delay=\"200\">{{$ctrl.function.metadata.name}}</span><span data-test-id=\"functions.item-name_version.text\" class=\"version-text item-cell-sub-text\">{{$ctrl.isFunctionCollapsed ? \\'$LATEST\\' : \\'\\'}}</span></div><span class=\"ncl-icon-api-gateway\" data-test-id=\"functions.item-name_api-gw.icon\" data-ng-if=\"$ctrl.function.status.apiGateways.length > 0\" data-uib-tooltip=\"{{ \\'functions:TOOLTIP.USED_BY_API_GATEWAY\\' | i18next:{apiGatewayName: $ctrl.function.status.apiGateways[0]} }}\" data-tooltip-placement=\"top\" data-tooltip-append-to-body=\"true\" data-tooltip-popup-delay=\"200\"></span></div><div class=\"common-table-cell function-status\" data-test-id=\"functions.item-status\" data-ng-class=\"[$ctrl.getFunctionsTableColSize(\\'status\\')]\" data-ng-show=\"$ctrl.isFunctionCollapsed\">{{$ctrl.convertedStatusState}}<div class=\"status-icon\" data-uib-tooltip=\"{{$ctrl.getTooltip()}}\" data-tooltip-append-to-body=\"true\" data-tooltip-placement=\"top\" data-ng-class=\"$ctrl.statusIcon\" data-ng-click=\"$ctrl.toggleFunctionState($event)\"></div></div><div data-ng-if=\"$ctrl.isDemoMode()\" data-ng-show=\"$ctrl.isFunctionCollapsed\" class=\"common-table-cell\" data-ng-class=\"[$ctrl.getFunctionsTableColSize(\\'replicas\\')]\">{{$ctrl.function.spec.replicas}}</div><div class=\"igz-col-10-5 common-table-cell\" data-test-id=\"functions.item-runtime\" data-ng-show=\"$ctrl.isFunctionCollapsed\">{{$ctrl.runtimes[$ctrl.function.spec.runtime]}}</div><div class=\"igz-col-16-5 common-table-cell\" data-test-id=\"functions.item-invocation-url\" data-ng-show=\"$ctrl.isFunctionCollapsed\" data-uib-tooltip=\"{{$ctrl.invocationUrl.text}}\" data-tooltip-append-to-body=\"true\" data-tooltip-placement=\"top\"><span class=\"common-table-cell-content\">{{$ctrl.invocationUrl.text}}</span><div class=\"igz-action-panel\" data-ng-if=\"$ctrl.invocationUrl.valid\"><div class=\"actions-list\"><igz-copy-to-clipboard data-value=\"$ctrl.invocationUrl.text\"></igz-copy-to-clipboard></div></div></div></div><div class=\"common-table-cell actions-menu\" data-test-id=\"functions.item-actions\"><igz-action-menu data-actions=\"$ctrl.functionActions\" data-on-fire-action=\"$ctrl.onFireAction\"></igz-action-menu></div></div><div class=\"items-wrapper\" data-uib-collapse=\"$ctrl.isFunctionCollapsed\"><div data-ng-repeat=\"version in $ctrl.function.versions track by version.name\"><ncl-function-version-row class=\"function-version-wrapper\" data-action-handler-callback=\"$ctrl.handleAction(actionType, checkedItems)\" data-converted-status-state=\"$ctrl.convertedStatusState\" data-function=\"$ctrl.function\" data-invocation-url=\"$ctrl.invocationUrl\" data-is-function-collapsed=\"$ctrl.isFunctionCollapsed\" data-project=\"$ctrl.project\" data-status-icon=\"$ctrl.statusIcon\" data-toggle-function-state=\"$ctrl.toggleFunctionState(event)\" data-version=\"version\" data-versions-list=\"$ctrl.function.attr.versions\"></ncl-function-version-row></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/function/ncl-function.tpl.html',\n    '<section data-ui-view=\"function\"></section>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version.tpl.html',\n    '<div class=\"ncl-edit-version\"><igz-splash-screen data-is-splash-showed=\"$ctrl.isSplashShowed\"></igz-splash-screen><igz-info-page-actions-bar class=\"igz-component border-top\"><div class=\"actions-bar-right\"><div class=\"actions-bar-left actions-buttons-block actions-dropdown-block\"><igz-default-dropdown data-select-property-only=\"id\" data-placeholder=\"{{ \\'functions:PLACEHOLDER.ACTIONS\\' | i18next }}\" data-values-array=\"$ctrl.actions\" data-is-disabled=\"!$ctrl.isFunctionDeployed\" data-item-select-callback=\"$ctrl.onSelectAction(item)\" data-skip-selection=\"true\"></igz-default-dropdown></div><div class=\"actions-bar-left actions-buttons-block\"><button class=\"ncl-new-entity-button igz-button-primary\" data-ng-class=\"{\\'disabled\\': $ctrl.isDeployButtonDisabled()}\" data-ng-click=\"$ctrl.isInValidDeployState() || $ctrl.deployButtonClick($event)\" data-uib-tooltip=\"{{ ($ctrl.deployResult.status.state === \\'building\\' ? \\'functions:TOOLTIP.DEPLOY_IN_PROGRESS\\' :\\n' +\n    '                                              $ctrl.version.ui.isTriggersChanged || $ctrl.version.ui.isVolumesChanged ? \\'functions:TOOLTIP.APPLY_CHANGES_TO_DEPLOY\\' :\\n' +\n    '                                              \\'functions:TOOLTIP.DEPLOY_INVALID_CONFIG\\') | i18next }}\" data-tooltip-enable=\"$ctrl.isDeployButtonDisabled()\" data-tooltip-placement=\"left\" data-tooltip-append-to-body=\"true\" data-tooltip-popup-delay=\"200\">{{ \\'functions:DEPLOY\\' | i18next }}</button></div></div></igz-info-page-actions-bar><div data-ng-if=\"$ctrl.isDeployResultShown\" class=\"ncl-edit-version-execution-result deploy-result\" data-ng-class=\"{\\'in-progress\\': $ctrl.isInValidDeployState(),\\n' +\n    '                         \\'failed\\'     : $ctrl.deployResult.status.state === \\'error\\'}\"><div class=\"btn-close igz-icon-close\" data-ng-if=\"!$ctrl.isInValidDeployState()\" data-ng-click=\"$ctrl.toggleDeployResult()\"></div><div class=\"icon-collapsed general-content\" data-ng-class=\"$ctrl.rowIsCollapsed.deployBlock ? \\'igz-icon-right\\' : \\'igz-icon-down\\'\" data-ng-click=\"$ctrl.onRowCollapse(\\'deployBlock\\')\"></div><div class=\"ncl-execution-result-status\" data-ng-class=\"{\\'succeeded\\'  : $ctrl.deployResult.status.state === \\'ready\\',\\n' +\n    '                             \\'in-progress\\': $ctrl.isInValidDeployState(),\\n' +\n    '                             \\'collapsed\\'  : $ctrl.rowIsCollapsed.deployBlock}\"><span class=\"result-status-icon\" data-ng-class=\"{\\'igz-icon-tick-round\\' : $ctrl.deployResult.status.state === \\'ready\\',\\n' +\n    '                                  \\'igz-icon-properties\\' : $ctrl.isInValidDeployState(),\\n' +\n    '                                  \\'igz-icon-block\\'      : $ctrl.deployResult.status.state === \\'error\\'}\"></span><span class=\"result-state\">{{$ctrl.getDeployStatusState($ctrl.deployResult.status.state)}}</span></div><div class=\"ncl-execution-result-block collapsed-block-content-wrapper\" data-uib-collapse=\"$ctrl.rowIsCollapsed.deployBlock\"><div class=\"collapsed-block-title without-collapse\">{{ \\'common:LOGS\\' | i18next }}</div><ncl-deploy-log data-log-entries=\"$ctrl.deployResult.status.state === \\'error\\' ?\\n' +\n    '                                                        $ctrl.deployResult.status.message :\\n' +\n    '                                                        $ctrl.deployResult.status.logs\"></ncl-deploy-log></div></div><ncl-navigation-tabs data-tab-items=\"$ctrl.navigationTabsConfig\" data-version=\"$ctrl.version\" data-ng-class=\"{\\'ncl-version-configuration-tabs\\': $ctrl.getCurrentStateName() === \\'app.project.function.edit.configuration\\'}\"></ncl-navigation-tabs><section class=\"ncl-edit-version-view\" data-ui-view=\"version\"></section></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/action-checkbox/action-checkbox.tpl.html',\n    '<div class=\"action-checkbox\"><div class=\"check-item igz-icon-checkbox-unchecked\" data-ng-class=\"{\\'igz-icon-checkbox-checked\\': $ctrl.item.ui.checked}\" data-ng-click=\"$ctrl.onCheck($event)\" data-ng-dblclick=\"$event.stopPropagation()\"></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/action-checkbox-all/action-checkbox-all.tpl.html',\n    '<div class=\"action-checkbox-all\"><div class=\"check-item\" data-ng-class=\"{\\'igz-icon-checkbox-checked\\': $ctrl.allItemsChecked,\\n' +\n    '                        \\'igz-icon-checkbox-checked-few\\': $ctrl.checkedItemsCount > 0 && !$ctrl.allItemsChecked,\\n' +\n    '                        \\'igz-icon-checkbox-unchecked\\': $ctrl.checkedItemsCount === 0}\" data-ng-click=\"$ctrl.onCheckAll()\"></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/action-item/action-item.tpl.html',\n    '<div class=\"igz-action-item\" data-ng-class=\"{\\'inactive\\': !$ctrl.action.active,\\n' +\n    '     \\'subtemplate-show\\': $ctrl.action.subTemplateProps.isShown,\\n' +\n    '     \\'ng-hide\\': !$ctrl.isItemVisible($ctrl.action),\\n' +\n    '     \\'divider\\': $ctrl.action.id === \\'divider\\'}\" data-ng-click=\"$ctrl.onClickAction($event)\" data-ng-if=\"$ctrl.template !== \\'additional\\'\" data-test-id=\"{{$ctrl.action.testId}}\" data-uib-tooltip=\"{{$ctrl.getTooltipText()}}\" data-tooltip-popup-delay=\"1000\" data-tooltip-placement=\"bottom\" data-tooltip-append-to-body=\"true\"><div data-ng-if=\"$ctrl.action.id === \\'upload\\'\" class=\"upload-action\" data-ngf-select data-ngf-multiple=\"true\" data-ngf-change=\"$ctrl.onFilesDropped($files)\"><div class=\"action-icon {{$ctrl.action.icon}}\"></div><div class=\"action-label\">{{$ctrl.action.label}}</div></div><div data-ng-if=\"$ctrl.action.id !== \\'upload\\'\"><div class=\"action-icon {{$ctrl.getIconClass()}}\" data-ng-style=\"$ctrl.action.iconColor && {\\'color\\': $ctrl.action.iconColor}\"></div><div class=\"action-label\">{{$ctrl.action.label}}</div><igz-action-item-subtemplate class=\"action-subtemplate igz-component\" data-ng-if=\"$ctrl.action.template\" data-ng-show=\"$ctrl.action.subTemplateProps.isShown\" action=\"$ctrl.action\" data-ng-click=\"$event.stopPropagation()\"></igz-action-item-subtemplate></div></div><li data-ng-if=\"$ctrl.template === \\'additional\\'\" data-ng-click=\"$ctrl.onClickAction($event)\"><div class=\"action-icon {{$ctrl.getIconClass()}}\" data-ng-style=\"$ctrl.action.iconColor && {\\'color\\': $ctrl.action.iconColor}\"></div><div class=\"action-label\">{{$ctrl.action.label}}</div><igz-action-item-subtemplate class=\"action-subtemplate igz-component\" data-ng-if=\"$ctrl.action.template\" data-ng-show=\"$ctrl.action.subTemplateProps.isShown\" action=\"$ctrl.action\" data-ng-click=\"$event.stopPropagation()\"></igz-action-item-subtemplate></li>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/action-menu/action-menu.tpl.html',\n    '<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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/action-panel/action-panel.tpl.html',\n    '<div class=\"igz-action-panel\" data-igz-right-click data-ng-show=\"$ctrl.isActionPanelShown()\"><div class=\"actions-list clearfix\" data-ng-show=\"$ctrl.mainActions.length > 0 || $ctrl.remainingActions.length > 0\"><igz-action-item data-ng-repeat=\"action in $ctrl.mainActions\" data-action=\"action\"></igz-action-item><igz-action-item-more data-ng-if=\"$ctrl.remainingActions.length !== 0\" data-actions=\"$ctrl.remainingActions\"><div class=\"transclude-container\" data-ng-transclude></div></igz-action-item-more></div><div class=\"actions-list empty\" data-ng-show=\"$ctrl.mainActions.length === 0 && $ctrl.remainingActions.length === 0\">{{ \\'common:NO_ACTIONS\\' | i18next }}</div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/actions-panes/actions-panes.tpl.html',\n    '<div class=\"actions-bar-left actions-panes-block\"><div class=\"igz-action-panel\"><div class=\"actions-list\"><div class=\"igz-action-item\" data-ng-class=\"{active: $ctrl.isFiltersOpened}\" data-ng-if=\"$ctrl.isShowFilterActionIcon()\" data-uib-tooltip=\"{{ \\'common:FILTER\\' | i18next }}\" data-tooltip-append-to-body=\"true\" data-tooltip-placement=\"bottom\" data-tooltip-popup-delay=\"1000\" data-ng-click=\"$ctrl.filtersToggleMethod()\"><div class=\"action-icon igz-icon-filter\"></div><span data-ng-if=\"$ctrl.filtersCounter\" class=\"filter-counter\">{{$ctrl.filtersCounter}}</span></div><div class=\"igz-action-item last-item\" data-ng-class=\"{inactive: (!$ctrl.isInfoPaneOpened && !$ctrl.infoPaneToggleMethod) || $ctrl.infoPaneDisable,\\n' +\n    '                                 active: $ctrl.isInfoPaneOpened}\" data-ng-if=\"$ctrl.closeInfoPane || $ctrl.infoPaneToggleMethod\" data-uib-tooltip=\"{{ \\'common:INFO_PANE\\' | i18next }}\" data-tooltip-append-to-body=\"true\" data-tooltip-placement=\"bottom\" data-tooltip-popup-delay=\"1000\" data-ng-click=\"$ctrl.callToggleMethod()\"><div class=\"action-icon igz-icon-info-round\"></div></div></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/copy-to-clipboard/copy-to-clipboard.tpl.html',\n    '<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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/default-dropdown/default-dropdown.tpl.html',\n    '<div class=\"default-dropdown\" data-ng-class=\"{\\'dropdown-input-invalid\\': $ctrl.isShowDropdownError($ctrl.formObject, $ctrl.inputName),\\n' +\n    '                     \\'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' +\n    '                         disabled: $ctrl.isDisabled,\\n' +\n    '                         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' +\n    '                                \\'active\\': $ctrl.isItemSelected(item),\\n' +\n    '                                \\'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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/element-loading-status/element-loading-status.tpl.html',\n    '<div class=\"element-loading-status\" data-ng-class=\"\\'loading-status-\\' + $ctrl.loadingStatusSize\"><div class=\"loader-wrapper\" data-ng-if=\"$ctrl.isShowSpinner\"><div class=\"loader-fading-circle\" data-uib-tooltip=\"{{$ctrl.tooltipLabel}}\" data-tooltip-placement=\"top\" data-tooltip-popup-delay=\"100\" data-tooltip-append-to-body=\"true\"><div class=\"loader-circle1 loader-circle\"></div><div class=\"loader-circle2 loader-circle\"></div><div class=\"loader-circle3 loader-circle\"></div><div class=\"loader-circle4 loader-circle\"></div><div class=\"loader-circle5 loader-circle\"></div><div class=\"loader-circle6 loader-circle\"></div><div class=\"loader-circle7 loader-circle\"></div><div class=\"loader-circle8 loader-circle\"></div><div class=\"loader-circle9 loader-circle\"></div><div class=\"loader-circle10 loader-circle\"></div><div class=\"loader-circle11 loader-circle\"></div><div class=\"loader-circle12 loader-circle\"></div></div></div><div data-ng-if=\"$ctrl.isShowContent && !$ctrl.isShowError\"><div data-ng-transclude></div></div><div class=\"loading-error\" data-ng-if=\"$ctrl.isShowError && $ctrl.checkSize(\\'default\\')\"><div class=\"sad-icon\"></div><div class=\"loading-error-title\">{{ \\'common:OOPS\\' | i18next }}</div><div class=\"loading-error-message\"><span>{{ \\'common:ERROR_MSG.ELEMENT_LOADING_DEFAULT_1\\' | i18next }}</span>&nbsp;<span class=\"refresh-page\" data-ng-click=\"$ctrl.refreshPage($event)\">{{ \\'common:ERROR_MSG.ELEMENT_LOADING_DEFAULT_2\\' | i18next }}</span>.</div></div><div class=\"loading-error\" data-ng-if=\"$ctrl.isShowError && $ctrl.checkSize(\\'small\\')\"><div class=\"loading-error-title\"></div><div class=\"loading-error-message\"><div>{{ \\'common:ERROR_MSG.ELEMENT_LOADING_SMALL_1\\' | i18next }}</div><div class=\"refresh-page\" data-ng-click=\"$ctrl.refreshPage($event)\" title=\"{{ \\'common:ERROR_MSG.ELEMENT_LOADING_SMALL_2\\' | i18next }}\">{{ \\'common:ERROR_MSG.ELEMENT_LOADING_SMALL_2\\' | i18next }}</div></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/import-project-dialog/import-project-dialog.tpl.html',\n    '<div class=\"import-project-dialog\">{{$ctrl.dialogTitle}}</div><igz-multiple-checkboxes data-ng-model=\"$ctrl.option\" data-options=\"$ctrl.optionList\" data-ng-change=\"$ctrl.onCheckboxChange($event)\" data-ng-required=\"true\" data-base-id=\"import-project-option_\"></igz-multiple-checkboxes><div class=\"buttons\"><button class=\"igz-button-just-text\" data-ng-click=\"$ctrl.onClose(\\'skip\\')\">{{ \\'functions:SKIP\\' | i18next }}</button><button class=\"igz-button-primary\" data-ng-click=\"$ctrl.onClose(\\'replace\\')\">{{ \\'functions:REPLACE\\' | i18next }}</button></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/more-info/more-info.tpl.html',\n    '<div class=\"more-info-wrapper\"><div data-ng-if=\"!$ctrl.isDefaultTooltipEnabled\"><div data-ng-class=\"{\\n' +\n    '                 \\'click-trigger\\': $ctrl.isClickMode(),\\n' +\n    '                 \\'disabled\\': $ctrl.isDisabled,\\n' +\n    '                 \\'igz-icon-alert-message\\': $ctrl.selectedIconType === $ctrl.iconTypes.WARN,\\n' +\n    '                 \\'igz-icon-help-round\\': $ctrl.selectedIconType === $ctrl.iconTypes.INFO,\\n' +\n    '                 \\'open\\': $ctrl.isDescriptionVisible\\n' +\n    '             }\" data-ng-click=\"$ctrl.onQuestionMarkClick()\" class=\"question-mark\"></div><div class=\"row-description\" data-ng-if=\"$ctrl.isHtmlEnabled\" data-ng-class=\"$ctrl.defaultTooltipPlacement\" data-ng-bind-html=\"$ctrl.description\"></div><div class=\"row-description\" data-ng-if=\"!$ctrl.isHtmlEnabled\" data-ng-class=\"$ctrl.defaultTooltipPlacement\">{{$ctrl.description}}</div></div><div data-ng-if=\"$ctrl.isDefaultTooltipEnabled\"><div data-ng-if=\"!$ctrl.isHtmlEnabled\" class=\"question-mark igz-icon-help-round\" data-ng-class=\"{\\'disabled\\': $ctrl.isDisabled}\" data-tooltip-class=\"more-info-tooltip\" data-uib-tooltip=\"{{$ctrl.description}}\" data-tooltip-is-open=\"{{$ctrl.isOpen}}\" data-tooltip-placement=\"{{$ctrl.defaultTooltipPlacement}}\" data-tooltip-popup-delay=\"{{$ctrl.defaultTooltipPopupDelay}}\" data-tooltip-trigger=\"$ctrl.trigger\" data-tooltip-append-to-body=\"true\"></div><div data-ng-if=\"$ctrl.isHtmlEnabled\" class=\"question-mark igz-icon-help-round\" data-ng-class=\"{\\'disabled\\': $ctrl.isDisabled}\" data-tooltip-class=\"more-info-tooltip\" data-uib-tooltip-html=\"$ctrl.description\" data-tooltip-is-open=\"{{$ctrl.isOpen}}\" data-tooltip-placement=\"{{$ctrl.defaultTooltipPlacement}}\" data-tooltip-popup-delay=\"{{$ctrl.defaultTooltipPopupDelay}}\" data-tooltip-trigger=\"$ctrl.trigger\" data-tooltip-append-to-body=\"true\"></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/multiple-checkboxes/multiple-checkboxes.tpl.html',\n    '<div class=\"igz-multiple-checkboxes\"><div class=\"checkboxes-dropdown-field\" tabindex=\"0\" data-ng-if=\"$ctrl.dropdown\" data-ng-click=\"$ctrl.toggleDropdown($event)\" data-ng-class=\"{\\'opened\\': $ctrl.isDropdownOpened}\"><div class=\"checkboxes-dropdown-title\">{{$ctrl.title}}</div><div class=\"checkboxes-dropdown-arrow\"><span class=\"igz-icon-dropdown\" data-ng-class=\"{\\'rotate-arrow\\': $ctrl.isDropUp}\"></span></div></div><div class=\"checkboxes-dropdown-container\" data-ng-if=\"$ctrl.dropdown && $ctrl.isDropdownOpened\"><div class=\"checkboxes-dropdown-scrollbar-container\" data-ng-scrollbars><div class=\"search-input-wrapper\"><igz-validating-input-field class=\"checkboxes-search-input\" data-field-type=\"input\" data-input-icon=\"igz-icon-search\" data-is-focused=\"false\" data-ng-class=\"{\\'active\\': $ctrl.isSearchInputFocused}\" data-item-blur-callback=\"$ctrl.toggleSearchInputFocus()\" data-item-focus-callback=\"$ctrl.toggleSearchInputFocus()\" data-update-data-callback=\"$ctrl.onSearchInputChange(newData)\" data-placeholder-text=\"{{ \\'common:PLACEHOLDER.SEARCH\\' | i18next }}\"></igz-validating-input-field></div><div data-ng-if=\"$ctrl.groups\" class=\"checkboxes-groups-wrapper\"><div data-ng-repeat=\"(name, group) in $ctrl.optionList\" class=\"checkboxes-groups\"><div data-ng-if=\"$ctrl.selectAllNone && group.visible\" class=\"group-title\"><div class=\"master-checkbox\" data-ng-class=\"{\\'igz-icon-checkbox-checked\\': group.allItemsChecked,\\n' +\n    '                                         \\'igz-icon-checkbox-checked-few\\': group.itemsChecked > 0 && !group.allItemsChecked,\\n' +\n    '                                         \\'igz-icon-checkbox-unchecked\\': group.itemsChecked === 0}\" data-ng-click=\"$ctrl.onCheckAllItems($event, name)\"></div><div class=\"checkboxes-group-name\">{{group.name}}</div><div data-ng-if=\"group.addingEnabled\" class=\"checkboxes-add-item\"><button class=\"checkboxes-add-item-button igz-icon-add\" data-ng-click=\"$ctrl.toggleAddItemField(group, name)\" data-uib-tooltip=\"{{ \\'common:TOOLTIP.ADD_NEW\\' | i18next }}\" data-tooltip-enable=\"true\" data-tooltip-placement=\"top\" data-tooltip-popup-delay=\"200\" data-tooltip-append-to-body=\"true\"></button></div></div><ul data-ng-if=\"group.visible\" class=\"checkboxes-list\"><li data-ng-if=\"group.addingEnabled && group.addItemInputVisible\" class=\"checkboxes-add-item\"><igz-validating-input-field class=\"add-item-input\" data-field-type=\"input\" data-is-focused=\"true\" data-ng-class=\"{\\'active\\': $ctrl.isSearchInputFocused}\" data-item-blur-callback=\"$ctrl.addItem(inputValue, group, name)\"></igz-validating-input-field></li><li class=\"multiple-checkboxes-option\" data-ng-if=\"item.visibility\" data-ng-repeat=\"item in group.options track by $index\"><input class=\"multiple-checkboxes-option-input\" id=\"{{item.id}}\" type=\"checkbox\" data-ng-model=\"item.checked\" data-ng-change=\"$ctrl.updateViewValue()\" data-ng-disabled=\"$ctrl.isDisabled(item)\" data-ng-show=\"!item.filtered\"><label class=\"multiple-checkboxes-option-label\" for=\"{{item.id}}\" data-ng-class=\"{\\'disabled\\': $ctrl.isDisabled(item)}\" data-ng-show=\"!item.filtered\" data-tooltip-enable=\"{{item.enableTooltip}}\" data-uib-tooltip=\"{{item.tooltipText}}\" data-tooltip-placement=\"left\" data-tooltip-popup-delay=\"200\" data-tooltip-append-to-body=\"true\">{{item.label}}</label></li></ul></div></div><div data-ng-if=\"!$ctrl.groups && $ctrl.selectAllNone\" class=\"checkboxes-header\"><div class=\"master-checkbox\" data-ng-class=\"{\\'igz-icon-checkbox-checked\\': $ctrl.isAllItemsChecked,\\n' +\n    '                                 \\'igz-icon-checkbox-checked-few\\': $ctrl.checkedItemsCount > 0 && !$ctrl.isAllItemsChecked,\\n' +\n    '                                 \\'igz-icon-checkbox-unchecked\\': $ctrl.checkedItemsCount === 0}\" data-ng-click=\"$ctrl.onCheckAllItems($event)\"></div></div><ul data-ng-if=\"!$ctrl.groups && !$ctrl.gropdown\" class=\"checkboxes-list checkboxes-regular-list\"><li class=\"multiple-checkboxes-option\" data-ng-if=\"item.visibility\" data-ng-repeat=\"item in $ctrl.optionList track by $index\"><input class=\"multiple-checkboxes-option-input\" id=\"{{item.id}}\" type=\"checkbox\" data-ng-model=\"item.checked\" data-ng-show=\"!item.filtered\" data-ng-change=\"$ctrl.updateViewValue()\" data-ng-disabled=\"$ctrl.isDisabled(item)\"><label class=\"multiple-checkboxes-option-label\" for=\"{{item.id}}\" data-ng-class=\"{\\'disabled\\': $ctrl.isDisabled(item)}\" data-tooltip-enable=\"{{item.enableTooltip}}\" data-uib-tooltip=\"{{item.tooltipText}}\" data-ng-show=\"!item.filtered\" data-tooltip-placement=\"left\" data-tooltip-popup-delay=\"200\" data-tooltip-append-to-body=\"true\">{{item.label}}</label></li></ul></div><div data-ng-if=\"$ctrl.dropdownApply\" class=\"checkboxes-bottom-bar\"><button class=\"igz-button-just-text small\" data-ng-click=\"$ctrl.onCancel($event)\">{{ \\'common:CANCEL\\' | i18next }}</button><button class=\"igz-button-primary small\" data-ng-click=\"$ctrl.onApply($event)\">{{ \\'common:APPLY\\' | i18next }}</button></div></div><div data-ng-if=\"!$ctrl.dropdown && !$ctrl.groups && $ctrl.selectAllNone\" class=\"checkboxes-header\"><div class=\"master-checkbox\" data-ng-class=\"{\\'igz-icon-checkbox-checked\\': $ctrl.isAllItemsChecked,\\n' +\n    '                             \\'igz-icon-checkbox-checked-few\\': $ctrl.checkedItemsCount > 0 && !$ctrl.isAllItemsChecked,\\n' +\n    '                             \\'igz-icon-checkbox-unchecked\\': $ctrl.checkedItemsCount === 0}\" data-ng-click=\"$ctrl.onCheckAllItems($event)\"></div></div><ul class=\"igz-multiple-checkboxes-list\" data-ng-if=\"!$ctrl.dropdown && !$ctrl.groups\"><li class=\"multiple-checkboxes-option\" data-ng-if=\"item.visibility\" data-ng-repeat=\"item in $ctrl.optionList track by $index\"><input class=\"multiple-checkboxes-option-input\" id=\"{{item.id}}\" type=\"checkbox\" data-ng-model=\"item.checked\" data-ng-change=\"$ctrl.updateViewValue()\" data-ng-disabled=\"$ctrl.isDisabled(item)\"><label class=\"multiple-checkboxes-option-label\" for=\"{{item.id}}\" data-ng-class=\"{\\'disabled\\': $ctrl.isDisabled(item)}\" data-tooltip-enable=\"{{item.enableTooltip}}\" data-uib-tooltip=\"{{item.tooltipText}}\" data-tooltip-placement=\"left\" data-tooltip-popup-delay=\"200\" data-tooltip-append-to-body=\"true\">{{item.label}}</label></li></ul><div data-ng-if=\"$ctrl.groups && !$ctrl.dropdown\" class=\"checkboxes-groups-wrapper\"><div data-ng-repeat=\"(name, group) in $ctrl.optionList\" class=\"checkboxes-groups\"><div data-ng-if=\"$ctrl.selectAllNone && group.visible\" class=\"group-title\"><div class=\"master-checkbox\" data-ng-class=\"{\\'igz-icon-checkbox-checked\\': group.allItemsChecked,\\n' +\n    '                                     \\'igz-icon-checkbox-checked-few\\': group.itemsChecked > 0 && !group.allItemsChecked,\\n' +\n    '                                     \\'igz-icon-checkbox-unchecked\\': group.itemsChecked === 0}\" data-ng-click=\"$ctrl.onCheckAllItems($event, name)\"></div><div class=\"checkboxes-group-name\">{{group.name}}</div></div><ul data-ng-if=\"group.visible\" class=\"checkboxes-list\"><li class=\"multiple-checkboxes-option\" data-ng-if=\"item.visibility\" data-ng-repeat=\"item in group.options track by $index\"><input class=\"multiple-checkboxes-option-input\" id=\"{{item.id}}\" type=\"checkbox\" data-ng-model=\"item.checked\" data-ng-change=\"$ctrl.updateViewValue()\" data-ng-disabled=\"$ctrl.isDisabled(item)\"><label class=\"multiple-checkboxes-option-label\" for=\"{{item.id}}\" data-ng-class=\"{\\'disabled\\': $ctrl.isDisabled(item)}\" data-tooltip-enable=\"{{item.enableTooltip}}\" data-uib-tooltip=\"{{item.tooltipText}}\" data-tooltip-placement=\"left\" data-tooltip-popup-delay=\"200\" data-tooltip-append-to-body=\"true\">{{item.label}}</label></li></ul></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/number-input/number-input.tpl.html',\n    '<div class=\"igz-number-input\" data-ng-class=\"{\\n' +\n    '         disabled: $ctrl.isDisabled,\\n' +\n    '         focused: $ctrl.inputFocused,\\n' +\n    '         invalid: $ctrl.isValid(),\\n' +\n    '         pristine: !$ctrl.numberInputChanged,\\n' +\n    '         submitted: $ctrl.formObject.$submitted\\n' +\n    '     }\"><div class=\"additional-left-block flex-none\"><span class=\"prefix-unit\" data-ng-show=\"$ctrl.isShownUnit($ctrl.prefixUnit)\">{{$ctrl.prefixUnit}}</span></div><input class=\"input-field additional-right-padding field flex-auto\" data-ng-class=\"{\\'additional-left-padding\\': $ctrl.isShownUnit($ctrl.prefixUnit)}\" type=\"text\" name=\"{{$ctrl.inputName}}\" data-ng-model=\"$ctrl.currentValue\" data-ng-model-options=\"{allowInvalid: true}\" data-money min=\"{{$ctrl.minValue}}\" max=\"{{$ctrl.maxValue}}\" size=\"1\" placeholder=\"{{$ctrl.placeholder}}\" data-precision=\"{{$ctrl.precision}}\" data-ng-focus=\"$ctrl.handleInputFocus($event)\" data-ng-blur=\"$ctrl.handleInputBlur($event)\" data-ng-change=\"$ctrl.handleInputChange()\" data-ng-disabled=\"$ctrl.isDisabled\" data-ng-required=\"$ctrl.validationIsRequired\" data-igz-validate-elevation data-compare-val=\"$ctrl.validationValue\" data-compare-val-unit=\"$ctrl.validationValueUnit.power\" data-current-val-unit=\"$ctrl.currentValueUnit.power\"><span class=\"suffix-unit flex-none\" data-ng-show=\"$ctrl.isShownUnit($ctrl.suffixUnit)\" data-ng-click=\"$ctrl.handleSuffixClick($event)\">{{$ctrl.suffixUnit}}</span><div class=\"arrow-block flex-none\"><span tabindex=\"-1\" class=\"igz-icon-dropup\" data-ng-click=\"$ctrl.isDisabled || $ctrl.increaseValue()\"></span><span tabindex=\"-1\" class=\"igz-icon-dropdown\" data-ng-click=\"$ctrl.isDisabled || $ctrl.decreaseValue()\"></span></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/pagination/pagination.component.tpl.html',\n    '<div class=\"igz-pagination\"><div class=\"rows-title\" data-ng-if=\"!$ctrl.isPerPageVisible\">{{ \\'common:ROWS_PER_PAGE\\' | i18next }}:</div><div class=\"per-page\" data-ng-if=\"!$ctrl.isPerPageVisible\"><igz-default-dropdown data-values-array=\"$ctrl.perPageValues\" data-selected-item=\"$ctrl.perPage\" data-select-property-only=\"id\" data-item-select-callback=\"$ctrl.onPerPageChanged(item, isItemChanged)\" class=\"per-page-dropdown\" data-is-pagination=\"true\"></igz-default-dropdown></div><div class=\"jump-to-page\" data-ng-form=\"jumpToPageForm\" data-ng-if=\"$ctrl.pageData.total > 1\"><button class=\"to-page-prev igz-button-basic igz-icon-left\" tabindex=\"0\" data-uib-tooltip=\"{{$ctrl.page <= 0 ? \\'\\' : (\\'common:PREVIOUS_PAGE\\' | i18next)}}\" data-tooltip-placement=\"top\" data-ng-class=\"{\\'disabled\\' : $ctrl.page <= 0}\" data-ng-click=\"$ctrl.page <= 0 || $ctrl.goToPrevPage()\" data-ng-keydown=\"$ctrl.goToPrevPage($event)\"></button><igz-validating-input-field data-ng-if=\"$ctrl.allowJumpToPage\" data-field-type=\"input\" data-input-name=\"jumpToPage\" data-input-value=\"$ctrl.page + 1\" data-is-data-revert=\"true\" data-form-object=\"jumpToPageForm\" data-validation-pattern=\"$ctrl.jumpToPagePattern\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-item-blur-callback=\"$ctrl.jumpToPage()\" data-validation-is-required=\"true\" data-hide-counter=\"true\" class=\"jump-to-page-input\"></igz-validating-input-field><div class=\"page-number rows-title\" data-ng-if=\"!$ctrl.allowJumpToPage\">{{$ctrl.page + 1}}</div><button class=\"to-page-next igz-button-basic igz-icon-right\" tabindex=\"0\" data-uib-tooltip=\"{{$ctrl.pageData.total <= $ctrl.page + 1 ? \\'\\' : (\\'common:NEXT_PAGE\\' | i18next)}}\" data-tooltip-placement=\"top\" data-ng-class=\"{\\'disabled\\' : $ctrl.pageData.total <= $ctrl.page + 1}\" data-ng-click=\"($ctrl.pageData.total <= $ctrl.page + 1) || $ctrl.goToNextPage()\" data-ng-keydown=\"$ctrl.goToNextPage($event)\"></button><div class=\"rows-title title\">&nbsp;{{ \\'common:OF_PAGES\\' | i18next:{pagesTotal: $ctrl.pageData.total} }}</div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/search-input/search-input.tpl.html',\n    '<div data-ng-class=\"{\\'search-input\\': $ctrl.searchType === \\'infoPage\\', \\'search-input-actions-bar\\': $ctrl.searchType === \\'actionsBar\\'}\"><input type=\"text\" class=\"container-search-input\" placeholder=\"{{$ctrl.placeholder}}\" data-ng-focus=\"$ctrl.toggleInputFocus()\" data-ng-blur=\"$ctrl.toggleInputFocus()\" 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><span class=\"clear-button igz-icon-close\" data-ng-show=\"$ctrl.searchQuery\" data-ng-click=\"$ctrl.clearInputField()\"></span></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/size/size.tpl.html',\n    '<div class=\"igz-size\"><div data-ng-if=\"$ctrl.justDisplayValue\" class=\"size-value text-ellipsis\" data-ng-class=\"$ctrl.displayValueClasses\">{{$ctrl.getDisplayValue()}}</div><div data-ng-if=\"$ctrl.displayValueWithTooltip\" class=\"size-value text-ellipsis\"><span data-uib-tooltip=\"{{$ctrl.getDisplayValue()}}\" data-tooltip-append-to-body=\"true\">{{$ctrl.getDisplayValue()}}</span></div><div data-ng-if=\"$ctrl.type === \\'storage-pools\\'\" class=\"size-value text-ellipsis\"><span data-uib-tooltip=\"{{$ctrl.getDisplayValue()}}\" data-tooltip-append-to-body=\"true\">{{$ctrl.getDisplayValue()}}</span><div data-ng-if=\"$ctrl.outOf !== \\'\\'\" class=\"size-reserved text-ellipsis\">{{ \\'common:OF\\' | i18next }} {{$ctrl.outOf}}</div></div><div data-ng-if=\"$ctrl.type === \\'storage-pools_containers\\'\" class=\"size-value\"><div class=\"text-centered text-ellipsis\"><span data-uib-tooltip=\"{{$ctrl.getDisplayValue()}}\" data-tooltip-append-to-body=\"true\">{{$ctrl.getDisplayValue()}}</span><div data-ng-if=\"$ctrl.type === \\'storage-pools_containers\\'\" class=\"size-reserved text-ellipsis\"><span data-uib-tooltip=\"{{$ctrl.reserved}}\" data-tooltip-append-to-body=\"true\">{{$ctrl.reserved}}</span><span data-ng-if=\"$ctrl.quota === -1\" class=\"size-quota icon-font-arrow-right\"></span><span data-ng-if=\"$ctrl.quota === -1\" class=\"size-quota icon-font-infinity\" data-uib-tooltip=\"{{ \\'common:TOOLTIP.INFINITY\\' | i18next }}\" data-tooltip-append-to-body=\"true\"></span><span data-ng-if=\"$ctrl.quota !== -1\" class=\"size-quota icon-font-arrow-right text-ellipsis\" data-uib-tooltip=\"{{$ctrl.quota}}\" data-tooltip-append-to-body=\"true\">{{$ctrl.quota}}</span></div></div></div><div class=\"size-chart\" id=\"size-chart-{{$ctrl.entity.id}}\"><highchart data-config=\"$ctrl.entity.ui.lineChartOptions[$ctrl.type]\" class=\"igz-highcharts-wrapper\" data-uib-tooltip=\"{{$ctrl.tooltip}}\" data-tooltip-append-to-body=\"true\" data-tooltip-placement=\"bottom\" data-tooltip-popup-delay=\"500\"></highchart></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/slider-input-block/slider-input-block.tpl.html',\n    '<div class=\"igz-slider-input-block clearfix\"><div class=\"igz-slider-input-title igz-col-50\"><div class=\"igz-slider-input-title-text\"><i data-ng-if=\"$ctrl.sliderConfig.iconType\" data-ng-class=\"($ctrl.sliderConfig.iconType | lowercase)\"></i>{{$ctrl.sliderConfig.name}}&nbsp;<i data-ng-if=\"$ctrl.sliderConfig.labelHelpIcon\" class=\"igz-icon-help-round\"></i></div></div><div class=\"igz-col-16\"></div><div class=\"igz-slider-input-current-value igz-col-34\" data-ng-class=\"{\\'with-value-unit\\': $ctrl.valueUnit,\\n' +\n    '                         \\'with-measure-units\\': $ctrl.measureUnits}\"><div class=\"igz-slider-input-current-value-text\">{{$ctrl.sliderConfig.valueLabel}}</div></div><div class=\"igz-slider-input-unit-label\" data-ng-if=\"!$ctrl.measureUnits\"><div class=\"igz-slider-input-current-value-text\">{{$ctrl.valueUnit}}</div></div><div class=\"igz-slider-input-units-dropdown igz-col-16\" data-ng-if=\"$ctrl.measureUnits\"><igz-default-dropdown data-values-array=\"$ctrl.measureUnits\" data-selected-item=\"$ctrl.selectedItem\" data-item-select-callback=\"$ctrl.changeTrafficUnit(item)\"></igz-default-dropdown></div><div class=\"igz-slider-input-rz-slider igz-col-100\"><rzslider class=\"rzslider\" data-rz-slider-model=\"$ctrl.sliderConfig.value\" data-rz-slider-options=\"$ctrl.sliderConfig.options\"></rzslider></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/sort-dropdown/sort-dropdown.tpl.html',\n    '<div class=\"igz-custom-dropdown dropdown\" data-uib-dropdown data-is-open=\"$ctrl.isOpen\"><div class=\"igz-action-item\" data-ng-class=\"{ \\'subtemplate-show\\': $ctrl.isOpen }\" data-uib-dropdown-toggle data-uib-tooltip=\"{{ \\'common:TOOLTIP.SORT\\' | i18next }}\" data-tooltip-append-to-body=\"true\" data-tooltip-placement=\"top\"><span class=\"action-icon igz-icon-sort\"></span></div><ul class=\"dropdown-menu dropdown-list\" data-ng-if=\"$ctrl.isOpen\"><li class=\"dropdown-menu-item\" data-ng-repeat=\"option in $ctrl.sortOptions track by option.value\" data-ng-show=\"option.visible\" data-ng-click=\"$ctrl.handleOptionClick(option)\"><span class=\"item-name\" data-ng-class=\"{ \\'active-item\\': option.active }\">{{option.label}}</span><span class=\"igz-icon-sort-{{option.desc ? \\'down\\' : \\'up\\'}}\" data-ng-show=\"option.active\"></span></li></ul></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/splash-screen/splash-screen.tpl.html',\n    '<div class=\"splash-screen\" data-ng-hide=\"!$ctrl.isSplashShowed.value\"><div class=\"loading-splash-screen\" data-ng-if=\"$ctrl.isLoading\"><div class=\"splash-logo-wrapper\"><div class=\"loader-fading-circle\"><div class=\"loader-circle1 loader-circle\"></div><div class=\"loader-circle2 loader-circle\"></div><div class=\"loader-circle3 loader-circle\"></div><div class=\"loader-circle4 loader-circle\"></div><div class=\"loader-circle5 loader-circle\"></div><div class=\"loader-circle6 loader-circle\"></div><div class=\"loader-circle7 loader-circle\"></div><div class=\"loader-circle8 loader-circle\"></div><div class=\"loader-circle9 loader-circle\"></div><div class=\"loader-circle10 loader-circle\"></div><div class=\"loader-circle11 loader-circle\"></div><div class=\"loader-circle12 loader-circle\"></div></div></div><div class=\"loading-text\">{{$ctrl.textToDisplay}}</div></div><div class=\"alert-splash-screen\" data-ng-if=\"$ctrl.isAlertShowing\"><div class=\"header\"></div><div class=\"notification-text\">{{$ctrl.alertText}}</div><div class=\"buttons\"><div class=\"refresh-button\" data-ng-click=\"$ctrl.refreshPage()\"><span class=\"igz-icon-refresh\"></span>{{ \\'common:REFRESH\\' | i18next }}</div></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/text-edit/text-edit.tpl.html',\n    '<div class=\"text-preview-directive-wrapper\"><div class=\"title text-ellipsis\" tooltip=\"{{::$ctrl.label}}\" data-tooltip-append-to-body=\"true\" data-tooltip-popup-delay=\"400\" data-tooltip-placement=\"bottom-left\">{{::$ctrl.label}}</div><div class=\"text-preview-wrapper\"><div class=\"word-wrap-checkbox-wrapper\"><div class=\"word-wrap-checkbox col-50 col-checkbox\"><input id=\"wrap-checkbox\" type=\"checkbox\" data-ng-model=\"$ctrl.enableWordWrap\"><label for=\"wrap-checkbox\">{{ \\'common:WRAP\\' | i18next }}</label></div></div><ncl-monaco class=\"monaco-code-editor\" data-function-source-code=\"$ctrl.content\" data-selected-theme=\"\\'vs-light\\'\" data-language=\"$ctrl.language\" data-on-change-source-code-callback=\"$ctrl.onChangeText(sourceCode)\" data-word-wrap=\"$ctrl.enableWordWrap\"></ncl-monaco></div><div class=\"close-button igz-icon-close\" data-ng-click=\"$ctrl.onClose()\"></div><div class=\"buttons\"><button class=\"igz-button-just-text\" tabindex=\"0\" data-ng-hide=\"$ctrl.isLoadingState\" data-ng-click=\"$ctrl.onClose()\" data-ng-keydown=\"$ctrl.onClose($event)\" data-test-id=\"general.text-edit_close.button\">{{::$ctrl.closeButtonText}}</button><button class=\"igz-button-primary\" tabindex=\"0\" data-ng-hide=\"$ctrl.isLoadingState\" data-ng-class=\"{\\'disabled\\': !$ctrl.fileChanged}\" data-ng-click=\"$ctrl.onSubmit()\" data-test-id=\"general.text-edit_save.button\">{{::$ctrl.submitButtonText}}</button><button class=\"igz-button-primary\" data-ng-show=\"$ctrl.isLoadingState\">{{ \\'common:LOADING_CAPITALIZE_ELLIPSIS\\' | i18next }}</button><button class=\"error-text text-centered error-relative\" data-ng-hide=\"$ctrl.serverError === \\'\\'\">{{ \\'common:ERROR_COLON\\' | i18next }} {{$ctrl.serverError}}</button></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/validating-input-field/validating-input-field.tpl.html',\n    '<div class=\"validating-input-field\" data-ng-class=\"{\\'focused\\': $ctrl.inputFocused, \\'with-counter\\': $ctrl.isCounterVisible()}\"><div data-ng-if=\"$ctrl.selectedFieldType === \\'input\\'\"><div class=\"validation-icon\" data-ng-if=\"$ctrl.validationRules.length > 0 && !$ctrl.readOnly && ($ctrl.inputFocused || $ctrl.isFieldInvalid())\" data-ng-mousedown=\"$ctrl.preventInputBlur = true\" data-ng-class=\"[$ctrl.inputFocused ? \\'\\' : $ctrl.bordersModeClass, {\\n' +\n    '                 \\'igz-icon-verify-info\\': $ctrl.inputIsTouched && $ctrl.data === \\'\\',\\n' +\n    '                 \\'igz-icon-verify-error\\': $ctrl.hasInvalidRule() && $ctrl.data !== \\'\\',\\n' +\n    '                 \\'igz-icon-verify-ok\\': !$ctrl.hasInvalidRule() && $ctrl.data !== \\'\\'\\n' +\n    '             }]\"></div><div class=\"input-counter\" data-ng-class=\"[$ctrl.inputFocused ? \\'\\' : $ctrl.bordersModeClass, {\\'invalid\\': $ctrl.getRemainingCharactersCount() < 0}]\" data-ng-if=\"$ctrl.isCounterVisible()\">{{$ctrl.getRemainingCharactersCount()}}</div><input class=\"input-field field\" data-ng-class=\"[$ctrl.bordersModeClass, {\\n' +\n    '                   \\'invalid\\': $ctrl.isFieldInvalid(),\\n' +\n    '                   \\'with-icon\\': $ctrl.inputIcon,\\n' +\n    '                   \\'with-validation-icon\\': $ctrl.validationRules.length > 0\\n' +\n    '               }]\" name=\"{{$ctrl.inputName}}\" placeholder=\"{{$ctrl.placeholderText}}\" tabindex=\"{{$ctrl.tabindex}}\" data-ng-readonly=\"$ctrl.readOnly\" data-ng-model=\"$ctrl.data\" data-ng-trim=\"{{$ctrl.trim}}\" data-ng-model-options=\"$ctrl.inputModelOptions\" data-ng-required=\"$ctrl.validationIsRequired\" data-ng-maxlength=\"$ctrl.validationMaxLength\" data-ng-pattern=\"$ctrl.validationPattern\" data-ng-focus=\"$ctrl.onFocus($event)\" data-ng-blur=\"$ctrl.onBlur($event)\" data-ng-change=\"$ctrl.onChange()\" data-ng-disabled=\"$ctrl.isDisabled\" data-ng-keydown=\"$ctrl.onKeyDown($event)\" data-igz-input-only-valid-characters=\"$ctrl.validationPattern\" data-only-valid-characters=\"$ctrl.onlyValidCharacters\" data-uib-tooltip=\"{{ $ctrl.tooltip.text }}\" data-tooltip-placement=\"{{ $ctrl.tooltip.placement }}\" data-tooltip-popup-delay=\"{{ $ctrl.tooltip.delay }}\" data-tooltip-append-to-body=\"true\" spellcheck=\"{{$ctrl.spellcheck}}\" autocomplete=\"{{$ctrl.autoComplete}}\" data-igz-input-blur-on-enter><span data-ng-if=\"$ctrl.inputIcon\" class=\"input-icon {{$ctrl.inputIcon}}\"></span><span class=\"clear-button igz-icon-close\" data-ng-show=\"$ctrl.data && $ctrl.isClearIcon\" data-ng-click=\"$ctrl.clearInputField()\"></span><div class=\"validation-pop-up-wrapper\"><div class=\"validation-pop-up\" data-ng-show=\"$ctrl.isValidationPopUpShown\" data-ng-class=\"$ctrl.isOverflowed() ? \\'validation-pop-up-top\\' : \\'validation-pop-up-bottom\\'\"><div class=\"validation-rule\" data-ng-repeat=\"rule in $ctrl.validationRules\"><span class=\"validation-rule-icon\" data-ng-class=\"rule.isValid ? \\'igz-icon-verify-ok\\' : \\'ncl-icon-close\\'\"></span><span class=\"validation-rule-label\" data-ng-class=\"rule.isValid ? \\'validation-rule-valid\\' : \\'validation-rule-invalid\\'\">{{rule.label}}</span></div></div></div></div><div data-ng-if=\"$ctrl.selectedFieldType === \\'textarea\\'\"><div class=\"textarea-counter\" data-ng-class=\"[$ctrl.inputFocused ? \\'\\' : $ctrl.bordersModeClass, {\\'invalid\\': $ctrl.getRemainingCharactersCount() < 0}]\" data-ng-if=\"$ctrl.isCounterVisible()\">{{$ctrl.getRemainingCharactersCount()}}</div><textarea class=\"textarea-field field\" data-ng-class=\"[$ctrl.bordersModeClass, {\\'invalid\\': $ctrl.isFieldInvalid()}]\" name=\"{{$ctrl.inputName}}\" placeholder=\"{{$ctrl.placeholderText}}\" tabindex=\"{{$ctrl.tabindex}}\" data-ng-model=\"$ctrl.data\" data-ng-model-options=\"$ctrl.inputModelOptions\" data-ng-required=\"$ctrl.validationIsRequired\" data-ng-maxlength=\"$ctrl.validationMaxLength\" data-ng-pattern=\"$ctrl.validationPattern\" data-ng-focus=\"$ctrl.onFocus($event)\" data-ng-blur=\"$ctrl.onBlur($event)\" data-ng-change=\"$ctrl.onChange()\" data-ng-disabled=\"$ctrl.isDisabled\" data-ng-readonly=\"$ctrl.readOnly\" spellcheck=\"{{$ctrl.spellcheck}}\">\\n' +\n    '        </textarea></div><div data-ng-if=\"$ctrl.selectedFieldType === \\'password\\'\"><div class=\"validation-icon\" data-ng-if=\"$ctrl.validationRules.length > 0 && !$ctrl.readOnly && ($ctrl.inputFocused || $ctrl.isFieldInvalid())\" data-ng-mousedown=\"$ctrl.preventInputBlur = true\" data-ng-class=\"[$ctrl.inputFocused ? \\'\\' : $ctrl.bordersModeClass, {\\n' +\n    '                 \\'igz-icon-verify-info\\': $ctrl.inputIsTouched && $ctrl.data === \\'\\',\\n' +\n    '                 \\'igz-icon-verify-error\\': $ctrl.hasInvalidRule() && $ctrl.data !== \\'\\',\\n' +\n    '                 \\'igz-icon-verify-ok\\': !$ctrl.hasInvalidRule() && $ctrl.data !== \\'\\'\\n' +\n    '             }]\"></div><input class=\"input-field field\" data-ng-class=\"[$ctrl.bordersModeClass, {\\n' +\n    '                   \\'invalid\\': $ctrl.isFieldInvalid(),\\n' +\n    '                   \\'with-icon\\': $ctrl.inputIcon,\\n' +\n    '                   \\'with-validation-icon\\': $ctrl.validationRules.length > 0\\n' +\n    '               }]\" data-igz-validate-password-confirmation=\"$ctrl.compareInputValue\" type=\"password\" name=\"{{$ctrl.inputName}}\" placeholder=\"{{$ctrl.placeholderText}}\" tabindex=\"{{$ctrl.tabindex}}\" data-ng-model=\"$ctrl.data\" data-ng-model-options=\"$ctrl.inputModelOptions\" data-ng-required=\"$ctrl.validationIsRequired\" data-ng-maxlength=\"$ctrl.validationMaxLength\" data-ng-pattern=\"$ctrl.validationPattern\" data-ng-focus=\"$ctrl.onFocus($event)\" data-ng-blur=\"$ctrl.onBlur($event)\" data-ng-change=\"$ctrl.onChange()\" data-ng-disabled=\"$ctrl.isDisabled\" data-ng-readonly=\"$ctrl.readOnly\" data-ng-keydown=\"$ctrl.onKeyDown($event)\" data-uib-tooltip=\"{{ $ctrl.tooltip.text }}\" data-tooltip-placement=\"{{ $ctrl.tooltip.placement }}\" data-tooltip-popup-delay=\"{{ $ctrl.tooltip.delay }}\" data-tooltip-append-to-body=\"true\" spellcheck=\"{{$ctrl.spellcheck}}\" autocomplete=\"{{$ctrl.autoComplete}}\" data-igz-input-blur-on-enter><span data-ng-if=\"$ctrl.inputIcon\" class=\"input-icon {{$ctrl.inputIcon}}\"></span><div class=\"validation-pop-up-wrapper\"><div class=\"validation-pop-up validation-pop-up-top\" data-ng-show=\"$ctrl.isValidationPopUpShown\"><div class=\"validation-rule\" data-ng-repeat=\"rule in $ctrl.validationRules\"><span class=\"validation-rule-icon\" data-ng-class=\"rule.isValid ? \\'igz-icon-verify-ok\\' : \\'ncl-icon-close\\'\"></span><span class=\"validation-rule-label\" data-ng-class=\"rule.isValid ? \\'validation-rule-valid\\' : \\'validation-rule-invalid\\'\">{{rule.label}}</span></div></div></div></div><div data-ng-if=\"$ctrl.selectedFieldType === \\'schedule\\'\" class=\"schedule-input-wrapper\"><cron-selection class=\"field\" data-ng-class=\"{invalid: $ctrl.isFieldInvalid()}\" data-ng-model=\"$ctrl.data\" data-ng-change=\"$ctrl.onChange()\" data-ng-required=\"$ctrl.validationIsRequired\" name=\"{{$ctrl.inputName}}\"></cron-selection><div class=\"clear-button\" data-ng-show=\"$ctrl.data !== \\'\\'\"><a class=\"link\" data-ng-click=\"$ctrl.clearInputField()\">{{ \\'common:CLEAR\\' | i18next }}</a></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/components/breadcrumbs/breadcrumbs.tpl.html',\n    '<span class=\"main-header-title\"><span class=\"main-header-title-text\" data-ng-click=\"$ctrl.goToProjectsList()\" data-ng-class=\"{\\'disable-behavior\\': !$ctrl.mainHeaderTitle.project && $ctrl.mainHeaderTitle.function !== \\'Create function\\'}\">{{ $ctrl.mainHeaderTitle.title | i18next }}</span><span class=\"igz-icon-right ncl-header-subtitle\"></span></span><span class=\"main-header-title\" data-ng-if=\"$ctrl.mainHeaderTitle.project.spec.displayName || $ctrl.mainHeaderTitle.project.metadata.name\"><span class=\"main-header-title-text\" data-ng-click=\"$ctrl.goToFunctionsList()\">{{$ctrl.mainHeaderTitle.project.spec.displayName || $ctrl.mainHeaderTitle.project.metadata.name}}</span><ncl-breadcrumbs-dropdown data-state=\"$ctrl.mainHeaderTitle.state\" data-title=\"$ctrl.mainHeaderTitle.project.spec.displayName || $ctrl.mainHeaderTitle.project.metadata.name\" data-project=\"$ctrl.mainHeaderTitle.project\" data-type=\"projects\" data-get-functions=\"$ctrl.getFunctions({id: id})\" data-get-projects=\"$ctrl.getProjects()\"></ncl-breadcrumbs-dropdown></span><span class=\"main-header-title\" data-ng-if=\"$ctrl.mainHeaderTitle.function && $ctrl.mainHeaderTitle.version\"><span class=\"main-header-title-text\" data-ng-click=\"$ctrl.goToFunctionScreen()\">{{$ctrl.mainHeaderTitle.function}}</span><ncl-breadcrumbs-dropdown data-ng-if=\"$ctrl.mainHeaderTitle.version\" data-state=\"$ctrl.mainHeaderTitle.state\" data-title=\"$ctrl.mainHeaderTitle.function\" data-project=\"$ctrl.mainHeaderTitle.project\" data-type=\"functions\" data-get-functions=\"$ctrl.getFunctions({id: id})\" data-get-projects=\"$ctrl.getProjects()\"></ncl-breadcrumbs-dropdown></span><span data-ng-if=\"$ctrl.mainHeaderTitle.tab\" class=\"ncl-bold-subtitle\">{{$ctrl.mainHeaderTitle.tab}}</span><span data-ng-if=\"$ctrl.mainHeaderTitle.function === \\'Create function\\'\" class=\"ncl-bold-subtitle\">{{$ctrl.mainHeaderTitle.function}}</span><span data-ng-if=\"$ctrl.mainHeaderTitle.version\" class=\"ncl-bold-subtitle\">{{$ctrl.mainHeaderTitle.version}}</span>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/components/breadcrumbs-dropdown/breadcrumbs-dropdown.tpl.html',\n    '<div class=\"ncl-breadcrumbs-dropdown dropdown\" data-ng-class=\"{\\'open\\': $ctrl.showDropdownList}\"><span class=\"breadcrumb-toggle\" data-ng-click=\"$ctrl.showDropdown()\"><span class=\"breadcrumb-arrow\" data-ng-class=\"{\\'ncl-dropdown-expanded\\': $ctrl.showDropdownList}\"><span class=\"igz-icon-right\"></span></span></span><div class=\"dropdown-menu\"><div class=\"search-input\"><input type=\"text\" placeholder=\"{{$ctrl.placeholder}}\" data-ng-model=\"$ctrl.searchText\"><span class=\"igz-icon-search\"></span></div><ul class=\"dropdown-list\" data-ng-scrollbars><li data-ng-repeat=\"item in $ctrl.itemsList | filter: $ctrl.searchText\"><a class=\"item-name\" data-ng-click=\"$ctrl.showDetails($event, item)\">{{item.name}}</a><span class=\"igz-icon-tick\" data-ng-show=\"$ctrl.title === item.name\"></span></li></ul></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/components/collapsing-row/collapsing-row.tpl.html',\n    '<div class=\"ncl-collapsing-row\"><div class=\"title-block common-table-row\" data-ng-class=\"{\\'collapsed\\': !$ctrl.item.ui.editModeActive}\"><div class=\"common-table-cell row-collapse\"><span class=\"collapse-icon\" data-ng-click=\"$ctrl.onCollapse($event)\" data-ng-class=\"{\\'collapsed igz-icon-right\\': !$ctrl.item.ui.editModeActive,\\n' +\n    '                                  \\'igz-icon-down\\': $ctrl.item.ui.editModeActive}\"></span></div><div data-ng-show=\"!$ctrl.item.ui.editModeActive\" class=\"igz-row common-table-cells-container item-row\"><div class=\"text-ellipsis item-name\" data-ng-if=\"!$ctrl.isNil($ctrl.item.name)\">{{$ctrl.item.name}}</div><div class=\"text-ellipsis item-name\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volumeMount.name)\">{{ $ctrl.item.volumeMount.name }}</div><div class=\"item-class\" data-ng-if=\"!$ctrl.isNil($ctrl.item.ui.selectedClass)\">{{$ctrl.item.ui.selectedClass.name}}</div><div class=\"item-class\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.flexVolume)\">{{ \\'functions:V3IO\\' | i18next }}</div><div class=\"item-class\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.secret.secretName)\">{{ \\'functions:SECRET\\' | i18next }}</div><div class=\"item-class\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.configMap.name)\">{{ \\'functions:CONFIG_MAP\\' | i18next }}</div><div class=\"item-class\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.persistentVolumeClaim.claimName)\">{{ \\'functions:PVC\\' | i18next }}</div><div class=\"igz-col-70 item-info\"><div data-ng-hide=\"$ctrl.item.ui.editModeActive\" class=\"collapsed-item-info-block\"><span data-ng-if=\"!$ctrl.isNil($ctrl.item.url)\"><span class=\"field-label\">{{ \\'common:URL\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.url }};&nbsp;</span><span data-ng-if=\"!$ctrl.isNil($ctrl.item.maxWorkers)\"><span class=\"field-label\">{{ \\'functions:MAX_WORKERS\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.maxWorkers }};&nbsp;</span><span data-ng-if=\"$ctrl.isNumber($ctrl.item.workerAvailabilityTimeoutMilliseconds)\"><span class=\"field-label\">{{ \\'functions:WORKER_AVAILABILITY_TIMEOUT\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.workerAvailabilityTimeoutMilliseconds }};&nbsp;</span><span data-ng-if=\"!$ctrl.isNil($ctrl.item.secret)\"><span class=\"field-label\">{{ \\'functions:SECRET\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.secret }};&nbsp;</span><span data-ng-repeat=\"(key, value) in $ctrl.item.attributes\"><span class=\"field-label\">{{ key }}</span>:&nbsp;{{ $ctrl.getAttributeValue(key, value) }};&nbsp;</span><span data-ng-if=\"!$ctrl.isNil($ctrl.item.annotations)\"><span class=\"field-label\">{{ \\'functions:ANNOTATIONS\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.annotations }};&nbsp;</span><span data-ng-if=\"!$ctrl.isNil($ctrl.item.username)\"><span class=\"field-label\">{{ \\'common:USERNAME\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.username }};&nbsp;</span><span data-ng-if=\"!$ctrl.isNil($ctrl.item.password)\"><span class=\"field-label\">{{ \\'common:PASSWORD\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.password }};&nbsp;</span><span data-ng-if=\"!$ctrl.isNil($ctrl.item.volumeMount.mountPath)\"><span class=\"field-label\">{{ \\'functions:MOUNT_PATH\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.volumeMount.mountPath }};&nbsp;</span><span data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.flexVolume.options.container)\"><span class=\"field-label\">{{ \\'functions:CONTAINER_NAME\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.volume.flexVolume.options.container }};&nbsp;</span><span data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.flexVolume.options.subPath)\"><span class=\"field-label\">{{ \\'functions:SUB_PATH\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.volume.flexVolume.options.subPath }};&nbsp;</span><span data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.configMap.name)\"><span class=\"field-label\">{{ \\'functions:CONFIG_MAP_NAME\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.volume.configMap.name }};&nbsp;</span><span data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.persistentVolumeClaim.claimName)\"><span class=\"field-label\">{{ \\'functions:PERSISTENT_VOLUME_CLAIM_NAME\\' | i18next }}</span>: &nbsp;{{ $ctrl.item.volume.persistentVolumeClaim.claimName }};&nbsp;</span><span data-ng-if=\"!$ctrl.isNil($ctrl.item.workerAllocatorName)\"><span class=\"field-label\">{{ \\'functions:WORKER_ALLOCATOR_NAME\\' | i18next }}</span>:&nbsp;{{ $ctrl.item.workerAllocatorName }};&nbsp;</span></div><div data-ng-hide=\"!$ctrl.item.ui.expanded\" class=\"expanded-item-info-block\"><div class=\"igz-row common-table-cells-container item-info-row\" data-ng-if=\"!$ctrl.isNil($ctrl.item.url)\"><div class=\"igz-col-30 common-table-cell field-label\">{{ \\'common:URL\\' | i18next }}:</div><div class=\"igz-col-70 common-table-cell\">{{ $ctrl.item.url }}</div></div><div class=\"igz-row common-table-cells-container item-info-row\" data-ng-if=\"!$ctrl.isNil($ctrl.item.maxWorkers)\"><div class=\"igz-col-30 common-table-cell field-label\">{{ \\'functions:MAX_WORKERS\\' | i18next }}:</div><div class=\"igz-col-70 common-table-cell\">{{ $ctrl.item.maxWorkers }}</div></div><div class=\"igz-row common-table-cells-container item-info-row\" data-ng-if=\"!$ctrl.isNil($ctrl.item.secret)\"><div class=\"igz-col-30 common-table-cell field-label\">{{ \\'functions:SECRET\\' | i18next }}:</div><div class=\"igz-col-70 common-table-cell\">{{ $ctrl.item.secret }}</div></div><div class=\"igz-row common-table-cells-container item-info-row\" data-ng-repeat=\"(key, value) in $ctrl.item.attributes\"><div class=\"igz-col-30 common-table-cell field-label\">{{ key }}:</div><div class=\"igz-col-70 common-table-cell\">{{ value }}</div></div></div></div></div><div data-ng-transclude class=\"igz-col-100\" data-ng-if=\"$ctrl.item.ui.editModeActive\"></div><div class=\"common-table-cell actions-menu\" data-ng-if=\"::$ctrl.showDotMenu()\"><igz-action-menu data-actions=\"$ctrl.actions\" data-list-class=\"$ctrl.listClass\" data-on-fire-action=\"$ctrl.onFireAction\"></igz-action-menu></div><div class=\"common-table-cell single-action\" data-ng-if=\"::!$ctrl.showDotMenu()\"><div class=\"igz-action-panel\"><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></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/components/deploy-log/deploy-log.tpl.html',\n    '<div class=\"ncl-deploy-log-wrapper\"><div class=\"log-panel igz-scrollable-container\" data-ng-scrollbars data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"log-entry\" data-ng-if=\"$ctrl.lodash.isArray($ctrl.logEntries)\" data-ng-repeat=\"log in $ctrl.logEntries track by $index\"><span class=\"log-entry-time\" data-ng-if=\"log.time\">[{{log.time | date:\\'HH:mm:ss.sss\\'}}]</span><span class=\"log-entry-level-{{log.level}}\" data-ng-if=\"log.level\">&nbsp;({{$ctrl.getLogLevel(log.level)}})</span><span class=\"log-entry-message\">&nbsp;{{log.message}}</span><span class=\"log-entry-error\" data-ng-if=\"log.err\">&nbsp;{{log.err}}</span><span class=\"log-entry-params\">&nbsp;{{$ctrl.getLogParams(log)}}</span></div><div class=\"log-entry\" data-ng-if=\"!$ctrl.lodash.isArray($ctrl.logEntries)\">{{$ctrl.logEntries}}</div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/components/edit-item/edit-item.tpl.html',\n    '<div class=\"ncl-edit-item\" data-ng-keydown=\"$ctrl.onSubmitForm($event)\"><form name=\"$ctrl.editItemForm\" novalidate autocomplete=\"off\"><div class=\"igz-row title-field-row\"><div class=\"igz-col-20 name-field\"><igz-validating-input-field data-field-type=\"input\" data-input-name=\"itemName\" data-input-value=\"$ctrl.getItemName()\" data-is-focused=\"true\" data-form-object=\"$ctrl.editItemForm\" data-validation-is-required=\"true\" data-validation-rules=\"$ctrl.validationRules.itemName\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_NAME\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"name\" autocomplete=\"off\"></igz-validating-input-field><div class=\"error\" data-ng-show=\"$ctrl.isShowFieldInvalidState($ctrl.editItemForm, \\'itemName\\') &&\\n' +\n    '                                   $ctrl.isShowFieldError($ctrl.editItemForm, \\'itemName\\', \\'required\\')\">{{ \\'common:NAME_IS_REQUIRED\\' | i18next }}</div></div><div class=\"igz-col-12-5 class-field\"><igz-default-dropdown data-select-property-only=\"id\" data-input-name=\"itemClass\" data-is-required=\"true\" data-placeholder=\"{{ $ctrl.classPlaceholder }}\" data-prevent-drop-up=\"true\" data-values-array=\"$ctrl.classList\" data-selected-item=\"$ctrl.selectedClass.id\" data-form-object=\"$ctrl.editItemForm\" data-item-select-callback=\"$ctrl.onSelectClass(item)\" data-enable-overlap=\"true\"></igz-default-dropdown></div><div class=\"igz-col-65 tooltip-wrapper\" data-ng-if=\"$ctrl.isSelectedClassMoreInfoVisible()\"><igz-more-info data-description=\"{{$ctrl.getSelectedClassMoreInfo()}}\" data-trigger=\"click\" data-is-html-enabled=\"true\"></igz-more-info></div></div><div class=\"igz-row\" data-ng-if=\"$ctrl.isNil($ctrl.selectedClass.id)\"><div class=\"igz-col-100 no-class-selected\">{{ $ctrl.classPlaceholder }}</div></div><div class=\"igz-row\" data-ng-if=\"!$ctrl.isNil($ctrl.selectedClass.id)\"><div class=\"igz-col-45 attribute-field\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volumeMount.mountPath)\"><div class=\"field-label\"><span class=\"asterisk\">{{ \\'functions:MOUNT_PATH\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:MOUNT_PATH_DESCRIPTION\\' | i18next }}\" data-trigger=\"click\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"itemPath\" data-input-value=\"$ctrl.item.volumeMount.mountPath\" data-is-focused=\"false\" data-form-object=\"$ctrl.editItemForm\" data-validation-is-required=\"true\" data-validation-rules=\"$ctrl.validationRules.itemPath\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_MOUNT_PATH\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"volumeMount.mountPath\" data-auto-complete=\"off\"></igz-validating-input-field></div><div class=\"igz-col-45 attribute-field\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.flexVolume.options.accessKey)\"><div class=\"field-label\"><span class=\"asterisk\">{{ \\'functions:ACCESS_KEY\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:ACCESS_KEY_DESCRIPTION\\' | i18next }}\" data-trigger=\"click\"></igz-more-info></div><igz-validating-input-field data-field-type=\"password\" data-input-name=\"secretRef\" data-input-value=\"$ctrl.item.volume.flexVolume.options.accessKey\" data-is-focused=\"false\" data-form-object=\"$ctrl.editItemForm\" data-validation-is-required=\"true\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_ACCESS_KEY\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"volume.flexVolume.options.accessKey\" data-auto-complete=\"current-password\"></igz-validating-input-field></div><div class=\"igz-col-45 attribute-field\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.flexVolume.options.container)\"><div class=\"field-label\"><span class=\"asterisk\">{{ \\'functions:CONTAINER_NAME\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:CONTAINER_NAME_DESCRIPTION\\' | i18next }}\" data-trigger=\"click\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"containerName\" data-input-value=\"$ctrl.item.volume.flexVolume.options.container\" data-is-focused=\"false\" data-form-object=\"$ctrl.editItemForm\" data-validation-is-required=\"true\" data-validation-rules=\"$ctrl.validationRules.containerName\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_CONTAINER_NAME\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"volume.flexVolume.options.container\" data-auto-complete=\"off\"></igz-validating-input-field></div><div class=\"igz-col-45 attribute-field\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.flexVolume.options.subPath)\"><div class=\"field-label\"><span>{{ \\'common:PATH\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:PATH_DESCRIPTION\\' | i18next }}\" data-trigger=\"click\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"containerSubPath\" data-input-value=\"$ctrl.item.volume.flexVolume.options.subPath\" data-is-focused=\"false\" data-form-object=\"$ctrl.editItemForm\" data-validation-is-required=\"false\" data-validation-max-length=\"{{$ctrl.maxLengths.containerSubPath}}\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_PATH_IN_CONTAINER\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"volume.flexVolume.options.subPath\" data-auto-complete=\"off\"></igz-validating-input-field></div><div class=\"igz-col-45 attribute-field\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.secret.secretName)\"><div class=\"field-label\"><span class=\"asterisk\">{{ \\'functions:SECRET_NAME\\' | i18next }}</span></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"secretName\" data-input-value=\"$ctrl.item.volume.secret.secretName\" data-is-focused=\"false\" data-form-object=\"$ctrl.editItemForm\" data-validation-is-required=\"true\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_SECRET_NAME\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"volume.secret.secretName\"></igz-validating-input-field></div><div class=\"igz-col-45 attribute-field\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.configMap.name)\"><div class=\"field-label\"><span class=\"asterisk\">{{ \\'functions:CONFIG_MAP_NAME\\' | i18next }}</span></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"configMap\" data-input-value=\"$ctrl.item.volume.configMap.name\" data-is-focused=\"false\" data-form-object=\"$ctrl.editItemForm\" data-validation-is-required=\"true\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_CONFIG_MAP_NAME\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"volume.configMap.name\"></igz-validating-input-field></div><div class=\"igz-col-45 attribute-field\" data-ng-if=\"!$ctrl.isNil($ctrl.item.volume.persistentVolumeClaim.claimName)\"><div class=\"field-label text-ellipsis\"><span class=\"asterisk\">{{ \\'functions:PERSISTENT_VOLUME_CLAIM_NAME\\' | i18next }}</span></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"persistentVolumeClaim\" data-input-value=\"$ctrl.item.volume.persistentVolumeClaim.claimName\" data-form-object=\"$ctrl.editItemForm\" data-validation-is-required=\"true\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_PERSISTENT_VOLUME_CLAIM_NAME\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"volume.persistentVolumeClaim.claimName\"></igz-validating-input-field></div><div class=\"igz-col-45 attribute-field brokers-wrapper\" data-ng-if=\"$ctrl.isKafkaTrigger()\"><div class=\"field-label asterisk\">{{ \\'functions:BROKERS\\' | i18next }}</div><div><div class=\"table-body\" data-ng-repeat=\"broker in $ctrl.brokers\"><ncl-key-value-input class=\"new-label-input\" data-list-class=\"brokers-wrapper\" data-change-state-broadcast=\"change-state-deploy-button\" data-row-data=\"broker\" data-use-type=\"false\" data-submit-on-fly=\"true\" data-no-delete=\"$ctrl.brokers.length <= 1\" data-item-index=\"$index\" data-only-value-input=\"true\" data-action-handler-callback=\"$ctrl.handleBrokerAction(actionType, index)\" data-change-data-callback=\"$ctrl.onChangeKeyValueData(newData, index)\"></ncl-key-value-input></div></div><div class=\"igz-create-button create-broker-button\" data-ng-click=\"$ctrl.addNewBroker($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:ADD_BROKER\\' | i18next }}</div></div><div class=\"igz-col-45 attribute-field topics-wrapper\" data-ng-if=\"$ctrl.isKafkaTrigger()\"><div class=\"field-label asterisk\">{{ \\'functions:TOPICS\\' | i18next }}</div><div><div class=\"table-body\" data-ng-repeat=\"topic in $ctrl.topics\"><ncl-key-value-input class=\"new-label-input\" data-list-class=\"topics-wrapper\" data-change-state-broadcast=\"change-state-deploy-button\" data-row-data=\"topic\" data-use-type=\"false\" data-submit-on-fly=\"true\" data-no-delete=\"$ctrl.topics.length <= 1\" data-item-index=\"$index\" data-only-value-input=\"true\" data-action-handler-callback=\"$ctrl.handleTopicAction(actionType, index)\" data-change-data-callback=\"$ctrl.onChangeKeyValueData(newData, index)\"></ncl-key-value-input></div></div><div class=\"igz-create-button create-topic-button\" data-ng-click=\"$ctrl.addNewTopic($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:ADD_TOPIC\\' | i18next }}</div></div><div class=\"igz-col-{{field.fieldType === \\'schedule\\' ? \\'91\\' : \\'45\\'}} attribute-field\" data-ng-repeat=\"field in $ctrl.selectedClass.fields | filter:$ctrl.isFieldVisible track by field.name\"><div class=\"field-label\"><span data-ng-class=\"{ asterisk: field.allowEmpty === false }\">{{field.label || $ctrl.convertFromCamelCase(field.name)}}</span><igz-more-info data-ng-if=\"field.moreInfoDescription\" data-description=\"{{field.moreInfoDescription}}\" data-icon-type=\"{{field.moreInfoIconType}}\" data-is-html-enabled=\"field.moreInfoHtml\" data-is-open=\"field.moreInfoOpen\" data-trigger=\"click\"></igz-more-info></div><igz-validating-input-field data-ng-if=\"field.type === \\'input\\'\" data-field-type=\"{{field.fieldType}}\" data-input-name=\"item_{{field.name}}\" data-input-value=\"$ctrl.getFieldValue(field)\" data-is-focused=\"false\" data-form-object=\"$ctrl.editItemForm\" data-validation-rules=\"$ctrl.validationRules[field.pattern]\" data-validation-is-required=\"!field.allowEmpty\" data-placeholder-text=\"{{$ctrl.getFieldPlaceholderText(field)}}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"{{field.path || field.name}}\" data-auto-complete=\"{{field.autocomplete || \\'off\\'}}\"></igz-validating-input-field><igz-validating-input-field data-ng-if=\"field.type === \\'arrayInt\\'\" data-field-type=\"input\" data-input-name=\"item_{{field.name}}\" data-input-value=\"$ctrl.getFieldValue(field)\" data-is-focused=\"false\" data-form-object=\"$ctrl.editItemForm\" data-validation-rules=\"$ctrl.fieldTypeValidationRules.arrayInt\" data-validation-is-required=\"!field.allowEmpty\" data-placeholder-text=\"{{$ctrl.getFieldPlaceholderText(field)}}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"{{field.path || field.name}}\" data-auto-complete=\"{{field.autocomplete || \\'off\\'}}\"></igz-validating-input-field><igz-default-dropdown data-ng-if=\"field.type === \\'dropdown\\'\" data-select-property-only=\"id\" data-placeholder=\"{{$ctrl.getFieldPlaceholderText(field)}}\" data-values-array=\"field.values\" data-form-object=\"$ctrl.editItemForm\" data-is-required=\"!field.allowEmpty\" data-prevent-drop-up=\"true\" data-input-name=\"item_{{field.name}}\" data-selected-item=\"$ctrl.getFieldValue(field)\" data-item-select-callback=\"$ctrl.onSelectDropdownValue(item, field)\" data-item-select-field=\"{{field.path || field.name}}\" data-enable-overlap=\"true\" data-enable-typing=\"field.enableTyping\"></igz-default-dropdown><igz-number-input data-ng-if=\"field.type === \\'number-input\\'\" data-form-object=\"$ctrl.editItemForm\" data-input-name=\"item_{{field.name}}\" data-current-value=\"$ctrl.getFieldValue(field)\" data-update-number-input-callback=\"$ctrl.numberInputCallback(newData, field)\" data-update-number-input-field=\"{{field.path || field.name}}\" data-placeholder=\"{{$ctrl.getFieldPlaceholderText(field)}}\" data-precision=\"0\" data-value-step=\"1\" data-suffix-unit=\"{{field.unit}}\" data-validation-is-required=\"!field.allowEmpty\" data-allow-empty-field=\"field.allowEmpty\" data-min-value=\"field.min\" data-max-value=\"field.max\"></igz-number-input></div><div class=\"igz-col-91 attribute-field ingresses-wrapper\" data-ng-if=\"$ctrl.isHttpTrigger()\"><div class=\"field-label\">{{ \\'functions:INGRESSES_HOSTS\\' | i18next }}</div><div data-ng-if=\"$ctrl.ingresses.length > 0\" class=\"table-headers ingresses-table-headers\"><div class=\"host-header asterisk\">{{ \\'functions:HOST\\' | i18next }}</div><div class=\"paths-header asterisk\">{{ \\'common:PATH\\' | i18next }}</div><div class=\"secret-header\">{{ \\'functions:SECRET\\' | i18next }}</div></div><div class=\"igz-scrollable-container scrollable-ingresses\" data-ng-scrollbars data-igz-ng-scrollbars-config=\"{{$ctrl.igzScrollConfig}}\" data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"table-body\" data-ng-repeat=\"ingress in $ctrl.ingresses\"><ncl-key-value-input class=\"new-label-input\" data-list-class=\"scrollable-ingresses\" data-change-state-broadcast=\"change-state-deploy-button\" data-row-data=\"ingress\" data-use-type=\"false\" data-use-additional-value=\"true\" data-additional-value-optional=\"true\" data-submit-on-fly=\"true\" data-item-index=\"$index\" data-validation-rules=\"$ctrl.validationRules.host\" data-action-handler-callback=\"$ctrl.handleIngressAction(actionType, index)\" data-change-data-callback=\"$ctrl.onChangeKeyValueData(newData, index)\"></ncl-key-value-input></div></div><div class=\"igz-create-button create-ingress-button\" data-ng-click=\"$ctrl.addNewIngress($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:CREATE_NEW_HOST\\' | i18next }}</div></div><div class=\"igz-col-91 attribute-field annotations-wrapper\" data-ng-if=\"$ctrl.isHttpTrigger()\"><div class=\"field-label\">{{ \\'functions:ANNOTATIONS\\' | i18next }}</div><div data-ng-if=\"$ctrl.annotations.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 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-list-class=\"scrollable-annotations\" data-change-state-broadcast=\"change-state-deploy-button\" data-row-data=\"annotation\" data-use-type=\"false\" data-submit-on-fly=\"true\" data-item-index=\"$index\" data-action-handler-callback=\"$ctrl.handleAnnotationAction(actionType, index)\" data-change-data-callback=\"$ctrl.onChangeKeyValueData(newData, index)\"></ncl-key-value-input></div></div><div class=\"igz-create-button create-annotation-button\" data-ng-click=\"$ctrl.addNewAnnotation($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:CREATE_NEW_ANNOTATION\\' | i18next }}</div></div><div class=\"igz-col-91 attribute-field event-headers-wrapper\" data-ng-if=\"$ctrl.isCronTrigger()\"><div class=\"field-label\">{{ \\'functions:EVENT_HEADERS\\' | i18next }}</div><div data-ng-if=\"$ctrl.eventHeaders.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 scrollable-event-headers\" data-ng-scrollbars data-igz-ng-scrollbars-config=\"{{$ctrl.igzScrollConfig}}\" data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"table-body\" data-ng-repeat=\"header in $ctrl.eventHeaders\"><ncl-key-value-input class=\"new-label-input\" data-list-class=\"scrollable-event-headers\" data-change-state-broadcast=\"change-state-deploy-button\" data-row-data=\"header\" data-use-type=\"false\" data-submit-on-fly=\"true\" data-item-index=\"$index\" data-action-handler-callback=\"$ctrl.handleEventHeaderAction(actionType, index)\" data-change-data-callback=\"$ctrl.onChangeKeyValueData(newData, index)\"></ncl-key-value-input></div></div><div class=\"igz-create-button create-event-header\" data-ng-click=\"$ctrl.addNewEventHeader($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:CREATE_NEW_EVENT_HEADER\\' | i18next }}</div></div><div class=\"igz-col-91 attribute-field subscriptions-wrapper\" data-ng-if=\"$ctrl.isMqttTrigger()\"><div class=\"field-label\">{{ \\'functions:SUBSCRIPTIONS\\' | i18next }}</div><div data-ng-if=\"$ctrl.subscriptions.length > 0\" class=\"table-headers\"><div class=\"key-header\">{{ \\'functions:TOPIC\\' | i18next }}</div><div class=\"value-header\">{{ \\'functions:QOS\\' | i18next }}</div></div><div><div class=\"table-body\" data-ng-repeat=\"subscription in $ctrl.subscriptions\"><ncl-key-value-input class=\"new-label-input\" data-list-class=\"subscriptions-wrapper\" data-change-state-broadcast=\"change-state-deploy-button\" data-key-optional=\"false\" data-row-data=\"subscription\" data-use-type=\"false\" data-submit-on-fly=\"true\" data-item-index=\"$index\" data-validation-rules=\"$ctrl.validationRules.subscriptionQoS\" data-value-placeholder=\"0, 1 or 2\" data-action-handler-callback=\"$ctrl.handleSubscriptionAction(actionType, index)\" data-change-data-callback=\"$ctrl.onChangeKeyValueData(newData, index)\"></ncl-key-value-input></div></div><div class=\"igz-create-button create-subscription-button\" data-ng-click=\"$ctrl.addNewSubscription($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:CREATE_NEW_SUBSCRIPTION\\' | i18next }}</div></div></div></form></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/components/function-config-dialog/function-config-dialog.tpl.html',\n    '<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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/components/key-value-input/key-value-input.tpl.html',\n    '<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' +\n    '                                 \\'only-value-input\\': $ctrl.onlyValueInput,\\n' +\n    '                                 \\'only-key-value-input\\': $ctrl.isVisibleByType(\\'value\\'),\\n' +\n    '                                 \\'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\" data-list-class=\"$ctrl.listClass\"></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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/components/monaco/monaco.tpl.html',\n    '<div class=\"ncl-monaco\"><div class=\"ncl-monaco-wrapper\" data-ng-class=\"{\\'ncl-monaco-dark\\': $ctrl.selectedTheme === \\'vs-dark\\',\\n' +\n    '                         \\'no-top-padding\\': $ctrl.noTopPadding}\"><div data-ng-if=\"$ctrl.showTextSizeDropdown\" class=\"ncl-monaco-top-row\"><ncl-text-size-dropdown data-update-data-callback=\"$ctrl.onTextSizeChange(newTextSize)\"></ncl-text-size-dropdown></div><div class=\"ncl-monaco-editor\" igz-monaco-editor data-font-size=\"$ctrl.selectedTextSize\" data-code-file=\"selectedCodeFile\" data-editor-theme=\"$ctrl.selectedTheme\" data-file-language=\"selectedFileLanguage\" data-mini-monaco=\"$ctrl.miniMonaco\" data-show-line-numbers=\"$ctrl.showLineNumbers\" data-read-only=\"$ctrl.readOnly\" data-on-code-change=\"$ctrl.onCodeChange\" data-word-wrap=\"$ctrl.wordWrap\"></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/components/navigation-tabs/navigation-tabs.tpl.html',\n    '<div class=\"ncl-navigation-tabs-wrapper\"><div class=\"ncl-navigation-tabs clearfix\"><div class=\"navigation-tab\" data-ng-repeat=\"item in $ctrl.tabItems\" data-ui-sref=\"{{item.uiRoute}}\" data-ui-sref-active=\"active\" data-ng-class=\"{\\'ncl-status-monitoring\\': item.id === \\'status\\'}\">{{item.tabName | uppercase}}<div class=\"ncl-status-light\" data-ng-if=\"item.status\" data-ng-class=\"{\\'ncl-status-ready\\': item.status === \\'ready\\',\\n' +\n    '                             \\'ncl-status-error\\': item.status === \\'error\\',\\n' +\n    '                             \\'ncl-status-building\\': $ctrl.isFunctionBuilding(item.status)}\"><div class=\"ncl-status-tooltip\" data-ng-if=\"item.status\" data-ng-class=\"{\\'ncl-status-tooltip-ready\\': item.status === \\'ready\\',\\n' +\n    '                                 \\'ncl-status-tooltip-error\\': item.status === \\'error\\',\\n' +\n    '                                 \\'ncl-status-tooltip-building\\': $ctrl.isFunctionBuilding(item.status)}\"><div class=\"ncl-status-icon\" data-ng-if=\"item.status !== \\'not yet deployed\\'\" data-ng-class=\"{\\'ncl-icon-ready\\': item.status === \\'ready\\',\\n' +\n    '                                     \\'ncl-icon-error\\': item.status === \\'error\\',\\n' +\n    '                                     \\'ncl-icon-building\\': $ctrl.isFunctionBuilding(item.status)}\"></div><div class=\"ncl-status-title\">{{item.status}}</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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/components/nuclio-search-input/search-input.tpl.html',\n    '<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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/screens/create-function/create-function.tpl.html',\n    '<igz-splash-screen data-is-splash-showed=\"$ctrl.isSplashShowed\"></igz-splash-screen><div class=\"igz-scrollable-container\" data-ng-scrollbars data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"new-function-wrapper\"><div class=\"igz-scrollable-container\" data-ng-scrollbars data-ng-scrollbars-config=\"$ctrl.horizontalScrollConfig\"><div class=\"new-function-header\"><div class=\"title-wrapper\"><div class=\"title\">{{ \\'functions:START_NEW_FUNCTION\\' | i18next }}</div><div class=\"igz-icon-close\" data-ng-click=\"$ctrl.cancelCreating($event)\"></div></div><div class=\"new-function-types\"><div class=\"type-wrapper\"><div class=\"type-template function-from-template\" data-ng-click=\"$ctrl.selectFunctionType(\\'from_template\\')\" data-ng-class=\"{\\'selected\\': $ctrl.isTypeSelected(\\'from_template\\')}\"><div class=\"function-type-icon\"><ng-include src=\"\\'/assets/images/background-circle.svg\\'\"></ng-include><span class=\"ncl-icon-template icon\"></span></div><div class=\"function-type-info\"><div class=\"type-title\">{{ \\'functions:TEMPLATES\\' | i18next }}</div><div class=\"type-description\">{{ \\'functions:CREATE_FUNCTION_DESCRIPTION\\' | i18next }}</div></div></div></div><div class=\"type-wrapper\"><div class=\"type-template\" data-ng-click=\"$ctrl.selectFunctionType(\\'from_scratch\\')\" data-ng-class=\"{\\'selected\\': $ctrl.isTypeSelected(\\'from_scratch\\')}\"><div class=\"function-type-icon\"><ng-include src=\"\\'/assets/images/background-circle.svg\\'\"></ng-include><span class=\"ncl-icon-add icon\"></span></div><div class=\"function-type-info\"><div class=\"type-title\">{{ \\'functions:START_FROM_SCRATCH\\' | i18next }}</div><div class=\"type-description\">{{ \\'functions:START_FROM_SCRATCH_DESCRIPTION\\' | i18next }}</div></div></div></div><div class=\"type-wrapper\"><div class=\"type-template\" data-ng-click=\"$ctrl.selectFunctionType(\\'import\\')\" data-ng-class=\"{\\'selected\\': $ctrl.isTypeSelected(\\'import\\')}\"><div class=\"function-type-icon\"><ng-include src=\"\\'/assets/images/background-circle.svg\\'\"></ng-include><span class=\"ncl-icon-import icon\"></span></div><div class=\"function-type-info function-import\"><div class=\"type-title\">{{ \\'functions:IMPORT\\' | i18next }}</div><div class=\"type-description\">{{ \\'functions:IMPORT_FUNCTION_DESCRIPTION\\' | i18next }}</div></div></div></div></div></div></div></div><div class=\"function-type-content-wrapper\"><div class=\"new-function-type-content\"><ncl-function-from-scratch data-ng-if=\"$ctrl.isTypeSelected(\\'from_scratch\\')\" data-toggle-splash-screen=\"$ctrl.toggleSplashScreen(value)\" data-project=\"$ctrl.project\" data-get-function=\"$ctrl.getFunction({metadata: metadata})\" data-create-new-project=\"$ctrl.createNewProject\" data-selected-project=\"$ctrl.selectedProject\" data-projects=\"$ctrl.projects\"></ncl-function-from-scratch><ncl-function-from-template data-ng-if=\"$ctrl.isTypeSelected(\\'from_template\\')\" data-get-function=\"$ctrl.getFunction({metadata: metadata})\" data-get-function-templates=\"$ctrl.getTemplates()\" data-templates=\"$ctrl.templates\" data-toggle-splash-screen=\"$ctrl.toggleSplashScreen(value)\" data-project=\"$ctrl.project\" data-create-new-project=\"$ctrl.createNewProject\" data-render-template=\"$ctrl.renderTemplate({template: template})\" data-selected-project=\"$ctrl.selectedProject\" data-projects=\"$ctrl.projects\"></ncl-function-from-template><ncl-function-import data-ng-if=\"$ctrl.isTypeSelected(\\'import\\')\" data-toggle-splash-screen=\"$ctrl.toggleSplashScreen(value)\" data-project=\"$ctrl.project\" data-selected-project=\"$ctrl.selectedProject\" data-create-new-project=\"$ctrl.createNewProject\" data-projects=\"$ctrl.projects\"></ncl-function-import></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/function-collapsing-row/function-version-row/function-version-row.tpl.html',\n    '<div class=\"ncl-function-version-row common-table-row\"><div class=\"common-table-cell igz-col-3\"><igz-action-checkbox data-ng-class=\"{\\'visible\\': $ctrl.functionsService.checkedItem === \\'versions\\',\\n' +\n    '                                \\'invisible\\': !$ctrl.isDemoMode() || ($ctrl.functionsService.checkedItem !== \\'versions\\' &&\\n' +\n    '                                             $ctrl.functionsService.checkedItem !== \\'\\')}\" data-item=\"$ctrl.version\" data-item-type=\"versions\"></igz-action-checkbox></div><div class=\"common-table-cell igz-col-3\"></div><div class=\"igz-row common-table-cells-container\" data-ng-click=\"$ctrl.onSelectRow($event)\"><div class=\"common-table-cell\" data-ng-class=\"[$ctrl.getFunctionsTableColSize(\\'rowName\\')]\">{{$ctrl.version.name}}</div><div class=\"common-table-cell function-status\" data-ng-class=\"[$ctrl.getFunctionsTableColSize(\\'status\\')]\">{{$ctrl.convertedStatusState}}<div class=\"status-icon\" data-uib-tooltip=\"{{$ctrl.getTooltip()}}\" data-tooltip-append-to-body=\"true\" data-tooltip-placement=\"top\" data-ng-class=\"$ctrl.statusIcon\" data-ng-click=\"$ctrl.onToggleFunctionState($event)\"></div></div><div data-ng-if=\"$ctrl.isDemoMode()\" class=\"common-table-cell\" data-ng-class=\"[$ctrl.getFunctionsTableColSize(\\'replicas\\')]\">{{$ctrl.function.spec.replicas}}</div><div class=\"igz-col-10-5 common-table-cell\">{{$ctrl.runtimes[$ctrl.function.spec.runtime]}}</div><div class=\"igz-col-16-5 common-table-cell\" data-uib-tooltip=\"{{$ctrl.invocationUrl.text}}\" data-tooltip-append-to-body=\"true\" data-tooltip-placement=\"top\"><span class=\"common-table-cell-content\">{{$ctrl.invocationUrl.text}}</span><div class=\"igz-action-panel\" data-ng-if=\"$ctrl.invocationUrl.valid\"><div class=\"actions-list\"><igz-copy-to-clipboard data-value=\"$ctrl.invocationUrl.text\"></igz-copy-to-clipboard></div></div></div></div><div class=\"common-table-cell actions-menu\"><igz-action-menu data-ng-if=\"$ctrl.isDemoMode()\" data-actions=\"$ctrl.versionActions\" data-on-fire-action=\"$ctrl.onFireAction\"></igz-action-menu></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/function-event-dialog/function-event-dialog.tpl.html',\n    '<div class=\"function-event-wrapper\"><div class=\"header\"><div class=\"title\">{{$ctrl.titleText}}</div><div class=\"close-button igz-icon-close\" data-ng-click=\"$ctrl.closeEventDialog()\"></div></div><div class=\"content\"><form name=\"$ctrl.functionEventForm\" class=\"event-form\" novalidate><div class=\"field-wrapper\"><div class=\"field-label\">{{ \\'common:NAME\\' | i18next }}</div><div class=\"field-content\"><igz-validating-input-field data-field-type=\"input\" data-input-name=\"displayName\" data-input-model-options=\"$ctrl.inputModelOptions\" data-input-value=\"$ctrl.workingCopy.spec.displayName\" data-validation-is-required=\"true\" data-form-object=\"$ctrl.functionEventForm\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, \\'displayName\\')\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_NAME_OF_EVENT\\' | i18next }}\"></igz-validating-input-field></div></div><div class=\"field-wrapper\"><div class=\"field-label\">{{ \\'functions:METHOD\\' | i18next }}</div><div class=\"field-content\"><igz-default-dropdown data-values-array=\"$ctrl.methods\" data-selected-item=\"$ctrl.selectedMethod\" data-item-select-callback=\"$ctrl.onSelectMethod(item, isItemChanged, field)\" data-is-required=\"true\" data-form-object=\"$ctrl.functionEventForm\"></igz-default-dropdown></div></div><div class=\"field-wrapper\"><div class=\"field-label\">{{ \\'common:PATH\\' | i18next }}</div><div class=\"field-content\"><igz-validating-input-field data-field-type=\"input\" data-input-name=\"path\" data-input-model-options=\"$ctrl.inputModelOptions\" data-input-value=\"$ctrl.workingCopy.spec.attributes.path\" data-form-object=\"$ctrl.functionEventForm\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, \\'path\\')\" data-placeholder-text=\"{{ \\'common:PLACEHOLDER.ENTER_PATH\\' | i18next }}\"></igz-validating-input-field></div></div><div class=\"field-wrapper\"><div class=\"field-label\">{{ \\'functions:CONTENT_TYPE\\' | i18next }}</div><div class=\"field-content\"><igz-default-dropdown data-values-array=\"$ctrl.headers\" data-selected-item=\"$ctrl.selectedHeader\" data-item-select-callback=\"$ctrl.onSelectHeader(item, isItemChanged, field)\" data-is-required=\"true\" data-form-object=\"$ctrl.functionEventForm\"></igz-default-dropdown></div></div><div class=\"field-wrapper\"><div class=\"field-label\">{{ \\'functions:BODY\\' | i18next }}</div><div data-ng-if=\"$ctrl.contentType === \\'application/json\\'\" class=\"field-content code-edit-section\"><ncl-monaco data-function-source-code=\"$ctrl.workingCopy.spec.body\" data-selected-theme=\"$ctrl.bodyTheme\" data-language=\"\\'json\\'\" data-mini-monaco=\"true\" data-on-change-source-code-callback=\"$ctrl.onChangeSourceCode(sourceCode)\" data-read-only=\"false\"></ncl-monaco></div><div data-ng-if=\"$ctrl.contentType === \\'text/plain\\'\" class=\"field-content\"><textarea class=\"event-body\" data-ng-model=\"$ctrl.workingCopy.spec.body\" data-ng-change=\"$ctrl.onChangeBody()\" data-form-object=\"$ctrl.functionEventForm\" placeholder=\"{{ \\'functions:PLACEHOLDER.ENTER_BODY_OF_EVENT\\' | i18next }}\">\\n' +\n    '                    </textarea></div></div></form><div class=\"event-error\" data-ng-if=\"$ctrl.isDeployFailed\">{{$ctrl.errorText}}</div></div><div class=\"bottom-bar\"><button class=\"ncl-secondary-button igz-button-secondary\" data-ng-click=\"$ctrl.closeEventDialog()\">{{ \\'common:CANCEL\\' | i18next }}</button><button class=\"ncl-primary-button igz-button-primary\" tabindex=\"0\" data-ng-class=\"{\\'disabled\\' : !$ctrl.isFormChanged}\" data-ng-disabled=\"!$ctrl.isFormChanged\" data-ng-click=\"$ctrl.applyChanges()\" data-ng-keydown=\"$ctrl.applyChanges($event)\" data-ng-hide=\"$ctrl.isLoadingState\">{{$ctrl.buttonText}}</button><div class=\"ncl-primary-button igz-button-primary\" data-ng-show=\"$ctrl.isLoadingState\">{{ \\'common:LOADING_CAPITALIZE_ELLIPSIS\\' | i18next }}</div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-code/version-code.tpl.html',\n    '<div data-igz-extend-background data-ui-layout=\"{ flow : \\'column\\', dividerSize: 3 }\" class=\"ncl-edit-version-code ncl-version\"><div ui-layout-container min-size=\"200px\" class=\"code-section\"><form name=\"$ctrl.versionCodeForm\" class=\"code-wrapper-block\" novalidate><div data-ng-if=\"$ctrl.selectedEntryType.id === \\'sourceCode\\'\" class=\"igz-scrollable-container code-scrollable-container\" data-ng-scrollbars data-ng-scrollbars-config=\"$ctrl.scrollConfigHorizontal\"><div class=\"ncl-edit-version-code-wrapper\"><div class=\"section-wrapper code-entry-section\"><div class=\"code-entry-row\"><div class=\"code-entry-col code-entry-type-col\"><div class=\"col-label code-entry-type\">{{ \\'functions:CODE_ENTRY_TYPE\\' | i18next }}</div><igz-default-dropdown data-values-array=\"$ctrl.codeEntryTypeArray\" data-item-select-callback=\"$ctrl.selectEntryTypeValue(item, isItemChanged, field)\" data-selected-item=\"$ctrl.selectedEntryType\"></igz-default-dropdown></div><div class=\"code-entry-col code-entry-runtime-col\"><div class=\"col-label runtime\">{{ \\'functions:RUNTIME\\' | i18next }}</div><igz-default-dropdown data-values-array=\"$ctrl.runtimeArray\" data-item-select-callback=\"$ctrl.selectRuntimeValue(item, isItemChanged, field)\" data-selected-item=\"$ctrl.selectedRuntime\" data-is-disabled=\"true\"></igz-default-dropdown></div><div class=\"code-entry-col code-entry-handler-col\"><div class=\"col-label handler\">{{ \\'functions:HANDLER\\' | i18next }}</div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"handler\" data-input-value=\"$ctrl.version.spec.handler\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.handler\" data-form-object=\"$ctrl.versionCodeForm\" data-placeholder-text=\"{{ \\'functions:HANDLER\\' | i18next }}\"></igz-validating-input-field></div><div class=\"code-entry-col code-entry-runtime-col\"><div class=\"col-label\">Version</div><span>{{ $ctrl.version.spec.version }}</span></div><div class=\"code-entry-col code-entry-theme-col\" data-ng-if=\"$ctrl.isDemoMode()\"><div class=\"col-label runtime\">{{ \\'functions:THEME\\' | i18next }}</div><igz-default-dropdown data-values-array=\"$ctrl.themesArray\" data-item-select-callback=\"$ctrl.selectThemeValue(item, isItemChanged, field)\" data-selected-item=\"$ctrl.selectedTheme\" data-on-close-dropdown=\"$ctrl.onCloseDropdown()\"></igz-default-dropdown></div></div></div><div class=\"code-edit-section\"><div class=\"field-label asterisk\">{{ \\'functions:SOURCE_CODE\\' | i18next }}</div><div class=\"code-editor-drop-zone\"></div><ncl-monaco class=\"monaco-code-editor\" igz-extend-background data-function-source-code=\"$ctrl.sourceCode\" data-mini-monaco=\"false\" data-selected-theme=\"$ctrl.selectedTheme.id\" data-show-text-size-dropdown=\"true\" data-language=\"$ctrl.editorLanguage\" data-on-change-source-code-callback=\"$ctrl.onChangeSourceCode(sourceCode, language)\" data-read-only=\"false\"></ncl-monaco></div></div></div><div data-ng-if=\"$ctrl.selectedEntryType.id !== \\'sourceCode\\'\" class=\"igz-scrollable-container code-scrollable-container\" data-ng-scrollbars data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"ncl-edit-version-code-wrapper\"><div class=\"section-wrapper code-entry-section\"><div class=\"code-entry-row\"><div class=\"code-entry-col code-entry-type-col\"><div class=\"col-label code-entry-type\">{{ \\'functions:CODE_ENTRY_TYPE\\' | i18next }}</div><igz-default-dropdown data-values-array=\"$ctrl.codeEntryTypeArray\" data-item-select-callback=\"$ctrl.selectEntryTypeValue(item, isItemChanged, field)\" data-selected-item=\"$ctrl.selectedEntryType\"></igz-default-dropdown></div><div class=\"code-entry-col code-entry-runtime-col\"><div class=\"col-label runtime\">{{ \\'functions:RUNTIME\\' | i18next }}</div><igz-default-dropdown data-values-array=\"$ctrl.runtimeArray\" data-item-select-callback=\"$ctrl.selectRuntimeValue(item, isItemChanged, field)\" data-selected-item=\"$ctrl.selectedRuntime\" data-is-disabled=\"true\"></igz-default-dropdown></div><div class=\"code-entry-col code-entry-handler-col\"><div class=\"col-label handler\">{{ \\'functions:HANDLER\\' | i18next }}</div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"handler\" data-input-value=\"$ctrl.version.spec.handler\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.handler\" data-form-object=\"$ctrl.versionCodeForm\" data-placeholder-text=\"{{ \\'functions:HANDLER\\' | i18next }}\"></igz-validating-input-field></div></div></div><div data-ng-if=\"$ctrl.selectedEntryType.id === \\'image\\'\" class=\"ncl-code-entry-url\"><div class=\"field-label\"><span class=\"asterisk\">{{ \\'functions:IMAGE_NAME\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.IMAGE_NAME\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"image\" data-input-value=\"$ctrl.version.spec.image\" data-is-focused=\"true\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"true\" data-placeholder-text=\"{{ \\'common:FOR_EXAMPLE\\' | i18next }}: mydockeruser/my-func:latest\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.image\"></igz-validating-input-field></div><div data-ng-if=\"$ctrl.selectedEntryType.id === \\'archive\\' || $ctrl.selectedEntryType.id === \\'jar\\'\" class=\"ncl-code-entry-url\"><div class=\"field-label\"><span class=\"asterisk\">{{ \\'common:URL\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.URL\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"archive\" data-input-value=\"$ctrl.version.spec.build.path\" data-is-focused=\"true\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"true\" data-placeholder-text=\"{{ \\'common:FOR_EXAMPLE\\' | i18next }}: https://v3io-webapi/users/iguazio/myfunction.zip\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.path\"></igz-validating-input-field></div><div data-ng-if=\"$ctrl.selectedEntryType.id === \\'archive\\'\" class=\"ncl-code-entry-url\"><div class=\"field-label\"><span>{{ \\'functions:ACCESS_KEY_V3IO_ONLY\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.V3IO_ACCESS_KEY\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"password\" data-input-name=\"sessionKey\" data-input-value=\"$ctrl.version.spec.build.codeEntryAttributes.headers[\\'X-V3io-Session-Key\\']\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"false\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_ACCESS_KEY\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.codeEntryAttributes.headers[\\'X-V3io-Session-Key\\']\"></igz-validating-input-field><div class=\"field-label\"><span>{{ \\'functions:WORK_DIRECTORY\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.WORK_DIR\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"archiveWorkDir\" data-input-value=\"$ctrl.version.spec.build.codeEntryAttributes.workDir\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"false\" data-placeholder-text=\"{{ \\'common:FOR_EXAMPLE\\' | i18next }}: /nuclio-functions/myfunc\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.codeEntryAttributes.workDir\"></igz-validating-input-field></div><div data-ng-if=\"$ctrl.selectedEntryType.id === \\'github\\'\" class=\"ncl-code-entry-url\"><div class=\"field-label\"><span class=\"asterisk\">{{ \\'common:URL\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.GITHUB.URL\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"githubUrl\" data-input-value=\"$ctrl.version.spec.build.path\" data-is-focused=\"true\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"true\" data-placeholder-text=\"{{ \\'common:FOR_EXAMPLE\\' | i18next }}: https://github.com/my-organization/my-repository\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.path\"></igz-validating-input-field></div><div data-ng-if=\"$ctrl.selectedEntryType.id === \\'github\\'\" class=\"ncl-code-entry-url\"><div class=\"field-label\"><span class=\"asterisk\">{{ \\'functions:BRANCH\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.GITHUB.BRANCH\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"githubBranch\" data-input-value=\"$ctrl.version.spec.build.codeEntryAttributes.branch\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"true\" data-placeholder-text=\"{{ \\'common:FOR_EXAMPLE\\' | i18next }}: master\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.codeEntryAttributes.branch\"></igz-validating-input-field></div><div data-ng-if=\"$ctrl.selectedEntryType.id === \\'github\\'\" class=\"ncl-code-entry-url\"><div class=\"field-label\"><span>{{ \\'functions:TOKEN\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.GITHUB.TOKEN\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"githubToken\" data-input-value=\"$ctrl.githubToken\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"false\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_TOKEN\\' | i18next }}\" data-update-data-callback=\"$ctrl.onChangeGithubToken(newData)\"></igz-validating-input-field></div><div data-ng-if=\"$ctrl.selectedEntryType.id === \\'github\\'\" class=\"ncl-code-entry-url\"><div class=\"field-label\"><span>{{ \\'functions:WORK_DIRECTORY\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.GITHUB.WORK_DIR\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"githubWorkDir\" data-input-value=\"$ctrl.version.spec.build.codeEntryAttributes.workDir\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"false\" data-placeholder-text=\"{{ \\'common:FOR_EXAMPLE\\' | i18next }}: /nuclio-functions/myfunc\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.codeEntryAttributes.workDir\"></igz-validating-input-field></div><div data-ng-if=\"$ctrl.selectedEntryType.id === \\'s3\\'\" class=\"ncl-code-entry-s3\"><div class=\"field-label\"><span class=\"asterisk\">{{ \\'functions:BUCKET\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.S3.BUCKET\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"s3Bucket\" data-input-value=\"$ctrl.version.spec.build.codeEntryAttributes.s3Bucket\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"true\" data-placeholder-text=\"{{ \\'common:FOR_EXAMPLE\\' | i18next }}: my-s3-bucket\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.codeEntryAttributes.s3Bucket\"></igz-validating-input-field><div class=\"field-label\"><span class=\"asterisk\">{{ \\'functions:ITEM_KEY\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.S3.ITEM_KEY\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"s3ItemKey\" data-input-value=\"$ctrl.version.spec.build.codeEntryAttributes.s3ItemKey\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"true\" data-placeholder-text=\"{{ \\'common:FOR_EXAMPLE\\' | i18next }}: my-dir/nuclio_funcs.zip\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.codeEntryAttributes.s3ItemKey\"></igz-validating-input-field><div class=\"field-label\"><span>{{ \\'functions:ACCESS_KEY_ID\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.S3.ACCESS_KEY_ID\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"s3AccessKeyID\" data-input-value=\"$ctrl.version.spec.build.codeEntryAttributes.s3AccessKeyId\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"false\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_ACCESS_KEY_ID\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.codeEntryAttributes.s3AccessKeyId\"></igz-validating-input-field><div class=\"field-label\"><span>{{ \\'functions:SECRET_ACCESS_KEY\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.S3.SECRET_ACCESS_KEY\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"password\" data-input-name=\"s3SecretAccessKey\" data-input-value=\"$ctrl.version.spec.build.codeEntryAttributes.s3SecretAccessKey\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"false\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_SECRET_ACCESS_KEY\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.codeEntryAttributes.s3SecretAccessKey\"></igz-validating-input-field><div class=\"field-label\"><span>{{ \\'functions:SESSION_TOKEN\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.S3.SESSION_TOKEN\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"password\" data-input-name=\"s3SessionToken\" data-input-value=\"$ctrl.version.spec.build.codeEntryAttributes.s3SessionToken\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"false\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_SESSION_TOKEN\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.codeEntryAttributes.s3SessionToken\"></igz-validating-input-field><div class=\"field-label\"><span>{{ \\'functions:REGION\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.S3.REGION\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"s3Region\" data-input-value=\"$ctrl.version.spec.build.codeEntryAttributes.s3Region\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"false\" data-placeholder-text=\"{{ \\'common:FOR_EXAMPLE\\' | i18next }}: us-east-1\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.codeEntryAttributes.s3Region\"></igz-validating-input-field><div class=\"field-label\"><span>{{ \\'functions:WORK_DIRECTORY\\' | i18next }}</span><igz-more-info data-description=\"{{ \\'functions:TOOLTIP.S3.WORK_DIR\\' | i18next }}\"></igz-more-info></div><igz-validating-input-field data-field-type=\"input\" data-input-name=\"workDir\" data-input-value=\"$ctrl.version.spec.build.codeEntryAttributes.workDir\" data-is-focused=\"false\" data-form-object=\"$ctrl.versionCodeForm\" data-validation-is-required=\"false\" data-placeholder-text=\"{{ \\'common:FOR_EXAMPLE\\' | i18next }}: /nuclio-functions/myfunc\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.codeEntryAttributes.workDir\"></igz-validating-input-field></div></div></div></form></div><div ui-layout-container size=\"650px\" min-size=\"200px\" class=\"event-pane-section\"><function-events-data-wrapper data-version=\"$ctrl.version\"></function-events-data-wrapper></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-configuration/version-configuration.tpl.html',\n    '<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-on-change-callback=\"$ctrl.onConfigurationChangeCallback\"></ncl-version-configuration-basic-settings><ncl-version-configuration-resources class=\"configuration-block\" data-version=\"$ctrl.version\" 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-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-on-change-callback=\"$ctrl.onConfigurationChangeCallback\"></ncl-version-configuration-labels><ncl-version-configuration-annotations class=\"configuration-block\" data-version=\"$ctrl.version\" 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-on-change-callback=\"$ctrl.onConfigurationChangeCallback()\"></ncl-version-configuration-volumes><ncl-version-configuration-build class=\"configuration-block\" data-version=\"$ctrl.version\" 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-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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-monitoring/version-monitoring.tpl.html',\n    '<div class=\"ncl-version-monitoring ncl-version\" data-igz-extend-background><div class=\"igz-scrollable-container\" data-ng-scrollbars data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"ncl-version-monitoring-wrapper\"><div class=\"row\"><div class=\"monitoring-block\"><span class=\"monitoring-block-title\">{{ \\'functions:INVOCATION_URL\\' | i18next }}:</span><div class=\"monitoring-invocation-url-wrapper\" data-ng-if=\"($ctrl.version.status.state === \\'ready\\' || $ctrl.version.status.state === \\'scaledToZero\\') && $ctrl.version.ui.invocationUrl !== \\'\\'\"><a class=\"monitoring-invocation-url\" href=\"{{$ctrl.version.ui.invocationUrl}}\">{{$ctrl.version.ui.invocationUrl}}</a><div class=\"igz-action-panel\"><div class=\"actions-list\"><igz-copy-to-clipboard data-value=\"$ctrl.version.ui.invocationUrl\"></igz-copy-to-clipboard></div></div></div><span data-ng-if=\"($ctrl.version.status.state === \\'ready\\' || $ctrl.version.status.state === \\'scaledToZero\\') && $ctrl.version.ui.invocationUrl === \\'\\'\" class=\"monitoring-invocation-field-invalid\">{{ \\'common:N_A\\' | i18next }}</span><span data-ng-if=\"$ctrl.version.status.state !== \\'ready\\' && $ctrl.version.status.state !== \\'scaledToZero\\'\" class=\"monitoring-invocation-field-invalid\">{{ \\'functions:NOT_YET_DEPLOYED\\' | i18next }}</span></div><div class=\"monitoring-block\" data-ng-if=\"$ctrl.isDemoMode()\"><span class=\"monitoring-block-title\">{{ \\'common:REPLICAS\\' | i18next }}:</span><span data-ng-if=\"$ctrl.version.status.state === \\'ready\\' && $ctrl.version.spec.maxReplicas !== 0\" class=\"monitoring-replicas\">{{$ctrl.version.status.replicas}}/{{$ctrl.version.spec.maxReplicas}}</span><span data-ng-if=\"$ctrl.version.status.state === \\'ready\\' && $ctrl.version.spec.maxReplicas === 0\" class=\"monitoring-replicas\">{{$ctrl.version.status.replicas}}/{{$ctrl.version.status.replicas}}</span><span data-ng-if=\"$ctrl.version.status.state !== \\'ready\\'\" class=\"monitoring-invocation-field-invalid\">{{ \\'functions:NOT_YET_DEPLOYED\\' | i18next }}</span></div></div><div class=\"row\"><div class=\"monitoring-block ncl-monitoring-build-logger\"><span class=\"icon-collapsed general-content\" data-ng-class=\"$ctrl.rowIsCollapsed.buildLog ? \\'igz-icon-right\\' : \\'igz-icon-down\\'\" data-ng-click=\"$ctrl.onRowCollapse(\\'buildLog\\')\"></span><span class=\"monitoring-block-title\">{{ \\'functions:BUILD_LOG\\' | i18next }}</span><div class=\"ncl-monitoring-build-logs collapsed-block-content-wrapper\" data-uib-collapse=\"$ctrl.rowIsCollapsed.buildLog\"><ncl-deploy-log data-log-entries=\"$ctrl.versionStatus.logs\"></ncl-deploy-log></div></div></div><div class=\"row\" data-ng-if=\"$ctrl.checkIsErrorState()\"><div class=\"monitoring-block ncl-monitoring-error-logger\"><span class=\"icon-collapsed general-content\" data-ng-class=\"$ctrl.rowIsCollapsed.errorLog ? \\'igz-icon-right\\' : \\'igz-icon-down\\'\" data-ng-click=\"$ctrl.onRowCollapse(\\'errorLog\\')\"></span><span class=\"monitoring-block-title\">{{ \\'common:ERROR\\' | i18next }}</span><div class=\"ncl-monitoring-error-logs collapsed-block-content-wrapper\" data-uib-collapse=\"$ctrl.rowIsCollapsed.errorLog\"><div class=\"error-panel igz-scrollable-container\" data-ng-scrollbars data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"log-entry\"><span class=\"log-entry-error\">{{$ctrl.versionStatus.message}}</span></div></div></div></div></div></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-triggers/version-triggers.tpl.html',\n    '<div class=\"ncl-version-trigger ncl-version\"><div class=\"common-table\"><div class=\"common-table-header header-row\"><div class=\"common-table-cell header-name\">{{ \\'common:NAME\\' | i18next }}</div><div class=\"common-table-cell header-class\">{{ \\'common:CLASS\\' | i18next }}</div><div class=\"igz-col-70 common-table-cell\">{{ \\'common:INFO\\' | i18next }}</div></div><div class=\"search-input-not-found\" data-ng-if=\"$ctrl.triggers.length === 0\"><div class=\"search-message\">{{ \\'functions:TRIGGERS_NOT_FOUND\\' | i18next }}</div></div><div class=\"common-table-body\" data-igz-extend-background><div class=\"igz-scrollable-container\" data-ng-scrollbars data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><ncl-collapsing-row data-ng-repeat=\"trigger in $ctrl.triggers\" data-item=\"trigger\" data-type=\"trigger\" data-action-handler-callback=\"$ctrl.handleAction(actionType, selectedItem)\"><ncl-edit-item class=\"common-table-cells-container edit-trigger-row\" data-item=\"trigger\" data-class-list=\"$ctrl.classList\" data-type=\"trigger\" data-validation-rules=\"$ctrl.validationRules\" data-default-fields=\"$ctrl.defaultFields\" data-on-select-class-callback=\"$ctrl.checkClassUniqueness()\" data-on-submit-callback=\"$ctrl.editTriggerCallback(item)\"></ncl-edit-item></ncl-collapsing-row><div class=\"common-table-row create-trigger-button igz-create-button\" data-ng-click=\"$ctrl.createTrigger($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:CREATE_NEW_TRIGGER\\' | i18next }}</div></div></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/action-item/action-item-more/action-item-more.tpl.html',\n    '<div class=\"igz-action-item\" data-ng-class=\"{\\'subtemplate-show\\': $ctrl.isDropdownShown}\" data-ng-click=\"$ctrl.toggleTemplate()\"><div data-uib-tooltip=\"{{ \\'common:MORE_OPTIONS\\' | i18next }}\" data-tooltip-popup-delay=\"1000\" data-tooltip-placement=\"bottom\"><div class=\"action-icon igz-icon-context-menu\"></div></div><div class=\"item-dropdown-menu igz-component\" data-ng-show=\"$ctrl.isDropdownShown\"><ul class=\"item-dropdown-menu-list\"><igz-action-item data-ng-repeat=\"action in $ctrl.actions\" data-action=\"action\" data-on-files-dropped=\"$ctrl.onFilesDropped\" data-template=\"additional\" data-ng-click=\"action.template ? \\'\\' : $ctrl.toggleTemplate()\"></igz-action-item></ul><div class=\"transclude-container\" data-ng-transclude></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/action-item/action-item-refresh/action-item-refresh.tpl.html',\n    '<div class=\"igz-action-item\" data-ng-class=\"{\\'inactive\\': $ctrl.isDisabled}\" data-uib-tooltip=\"{{ \\'common:REFRESH\\' | i18next }}\" data-tooltip-append-to-body=\"true\" data-tooltip-placement=\"bottom\" data-tooltip-popup-delay=\"1000\" data-ng-click=\"$ctrl.refresh()\"><div class=\"action-icon igz-icon-refresh\"></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/info-page/info-page-actions-bar/info-page-actions-bar.tpl.html',\n    '<div class=\"igz-info-page-actions-bar\" data-ng-class=\"{\\'filters-opened\\' : $ctrl.isFiltersShowed, \\'info-pane-opened\\' : $ctrl.isInfoPaneShowed, \\'upper-pane-opened\\' : $ctrl.isUpperPaneShowed}\"><div data-ng-transclude></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/info-page/info-page-content/info-page-content.tpl.html',\n    '<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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('igz_controls/components/info-page/info-page-filters/info-page-filters.tpl.html',\n    '<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-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-if=\"$ctrl.applyFilters\">{{ \\'common:APPLY\\' | i18next }}</button></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/components/monaco/text-size-dropdown/text-size-dropdown.tpl.html',\n    '<div class=\"igz-action-panel\"><div class=\"actions-list\"><div class=\"igz-custom-dropdown ncl-text-size-dropdown dropdown\" data-uib-dropdown data-is-open=\"$ctrl.isOpen\"><div class=\"igz-action-item text-size-action-item\" data-ng-class=\"{\\'subtemplate-show\\': $ctrl.isOpen}\" data-uib-dropdown-toggle data-uib-tooltip=\"{{ \\'functions:TOOLTIP.CHANGE_TEXT_SIZE\\' | i18next }}\" data-tooltip-append-to-body=\"true\" data-tooltip-placement=\"bottom\" data-tooltip-popup-delay=\"1000\"><span class=\"action-icon igz-icon-format-size\"></span><span class=\"action-icon igz-icon-decrease\"></span></div><ul class=\"dropdown-menu dropdown-list\" data-ng-if=\"$ctrl.isOpen\"><li class=\"dropdown-menu-item\" data-ng-repeat=\"textSize in $ctrl.textSizes\" data-ng-click=\"$ctrl.changeTextSize(textSize.value)\"><span class=\"item-name\" data-ng-class=\"{\\'active-item\\': $ctrl.selectedTextSize === textSize.value}\">{{textSize.label}}</span></li></ul></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/screens/create-function/function-from-template/function-from-template.tpl.html',\n    '<div class=\"function-from-template-content\"><div class=\"templates-wrapper\"><span class=\"title\">{{ \\'functions:CHOOSE_TEMPLATE\\' | i18next }}</span><div class=\"templates-controls\"><div class=\"templates-search-input\"><div class=\"igz-icon-search search-icon\"></div><input class=\"input-field field\" tabindex=\"0\" data-ng-model=\"$ctrl.searchQuery\" data-ng-change=\"$ctrl.onChangeSearchQuery()\" placeholder=\"{{ \\'functions:PLACEHOLDER.SEARCH_TEMPLATE\\' | i18next }}\" data-igz-input-blur-on-enter></div><div class=\"templates-runtime-drop-down\"><span class=\"input-label\">{{ \\'functions:RUNTIME\\' | i18next }}</span><igz-default-dropdown data-values-array=\"$ctrl.runtimeFilters\" data-selected-item=\"$ctrl.selectedRuntimeFilter\" data-item-select-callback=\"$ctrl.onRuntimeFilterChange(item, isItemChanged)\"></igz-default-dropdown></div><div class=\"templates-pagination\"><igz-pagination data-page-data=\"$ctrl.page\" data-is-per-page-visible=\"true\" data-pagination-callback=\"$ctrl.paginationCallback(page, size)\"></igz-pagination></div></div><div class=\"function-templates\"><form name=\"$ctrl.functionFromTemplateForm\" class=\"function-templates-form\" novalidate><div class=\"function-template-wrapper\" data-ng-repeat=\"(key, value) in $ctrl.templatesWorkingCopy track by $index\" data-ng-class=\"{\\'selected\\': $ctrl.isTemplateSelected(key)}\" data-ng-click=\"$ctrl.selectTemplate(key)\"><div class=\"function-template\"><div data-ng-show=\"!$ctrl.isTemplateSelected(key)\" class=\"function-template-content\"><div class=\"template-title\">{{key}}</div><div class=\"template-description\">{{value.rendered.spec.description}}</div><div data-ng-if=\"value.ui.readMore\" class=\"template-read-more\">{{ \\'functions:READ_MORE\\' | i18next }}...</div></div><div data-ng-show=\"$ctrl.isTemplateSelected(key)\" class=\"function-template-content\"><ng-form name=\"templateForm{{$index}}\"><div data-ng-if=\"$ctrl.isProjectsDropDownVisible()\" class=\"projects-drop-down\"><span class=\"input-label asterisk\">{{ \\'common:PROJECT\\' | i18next }}</span><igz-default-dropdown data-is-required=\"true\" data-values-array=\"$ctrl.projectsList\" data-selected-item=\"$ctrl.selectedProject\" data-item-select-callback=\"$ctrl.onProjectChange(item, isItemChanged)\" data-form-object=\"$ctrl.functionFromTemplateForm[\\'templateForm\\' + $index]\" data-input-name=\"project\"><div class=\"transcluded-item\" data-ng-click=\"$ctrl.createNewProject()\">{{ \\'functions:NEW_PROJECT\\' | i18next }}</div></igz-default-dropdown></div><div class=\"function-name\"><span class=\"input-label asterisk\">{{ \\'common:NAME\\' | i18next }}</span><igz-validating-input-field data-field-type=\"input\" data-input-name=\"function-name-{{$index}}\" data-input-value=\"$ctrl.functionName\" data-form-object=\"$ctrl.functionFromTemplateForm[\\'templateForm\\' + $index]\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-validation-is-required=\"true\" data-validation-rules=\"$ctrl.validationRules.functionName\" data-validation-max-length=\"{{$ctrl.maxLengths.functionName}}\" data-input-model-options=\"$ctrl.inputModelOptions\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_FUNCTION_NAME\\' | i18next }}...\"></igz-validating-input-field></div><div class=\"buttons-wrapper\"><button class=\"ncl-secondary-button igz-button-just-text\" data-ng-click=\"$ctrl.unselectTemplate($event)\">{{ \\'common:CANCEL\\' | i18next }}</button><button class=\"ncl-primary-button igz-button-primary\" data-ng-click=\"$ctrl.createFunction()\" data-ng-class=\"{\\'disabled\\': !$ctrl.isCreateFunctionAllowed()}\">{{ \\'common:CREATE\\' | i18next }}</button></div></ng-form></div></div></div></form></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/screens/create-function/function-import/function-import.tpl.html',\n    '<div class=\"function-import-wrapper-content\"><form name=\"$ctrl.functionImportForm\" class=\"function-import-form\" novalidate><div class=\"projects-drop-down\" data-ng-if=\"$ctrl.isProjectsDropDownVisible()\"><span class=\"input-label\">{{ \\'functions:PROJECT\\' | i18next }}*</span><igz-default-dropdown data-is-required=\"true\" data-values-array=\"$ctrl.projectsList\" data-selected-item=\"$ctrl.selectedProject\" data-item-select-callback=\"$ctrl.onProjectChange(item, isItemChanged)\" data-form-object=\"$ctrl.functionImportForm\" data-input-name=\"project\"><div class=\"transcluded-item\" data-ng-click=\"$ctrl.createNewProject()\">{{ \\'functions:NEW_PROJECT\\' | i18next }}</div></igz-default-dropdown></div><div class=\"function-import-actions-bar\"><div class=\"function-import-file-picker\"><label class=\"file-picker-wrapper ncl-primary-button igz-button-secondary\" for=\"function-import\"><span class=\"igz-icon-upload\"></span>{{ \\'functions:IMPORT\\' | i18next }}</label><input class=\"function-import-input\" type=\"file\" id=\"function-import\" accept=\".yml, .yaml\"></div><button class=\"ncl-primary-button igz-button-primary\" data-ng-click=\"$ctrl.createFunction()\" data-ng-disabled=\"!$ctrl.isCreateFunctionAllowed()\" data-ng-class=\"{\\'disabled\\': !$ctrl.isCreateFunctionAllowed()}\">{{ \\'common:CREATE\\' | i18next }}</button></div></form><div class=\"function-import-monaco\"><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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/screens/create-function/function-from-scratch/function-from-scratch.tpl.html',\n    '<div class=\"function-from-scratch-content\"><div class=\"title-wrapper\"><span class=\"title\">{{ \\'functions:START_FROM_SCRATCH\\' | i18next }}</span></div><div class=\"function-configuration\"><form name=\"$ctrl.functionFromScratchForm\" class=\"configuration-form\" novalidate><div class=\"function-name-wrapper\"><div class=\"projects-drop-down\" data-ng-if=\"$ctrl.isProjectsDropDownVisible()\"><span class=\"input-label asterisk\">{{ \\'common:PROJECT\\' | i18next }}</span><igz-default-dropdown data-is-required=\"true\" data-values-array=\"$ctrl.projectsList\" data-selected-item=\"$ctrl.selectedProject\" data-item-select-callback=\"$ctrl.onProjectChange(item, isItemChanged)\" data-form-object=\"$ctrl.functionFromScratchForm\" data-input-name=\"project\"><div class=\"transcluded-item\" data-ng-click=\"$ctrl.createNewProject()\">{{ \\'functions:NEW_PROJECT\\' | i18next }}</div></igz-default-dropdown></div><div class=\"function-name\"><span class=\"input-label asterisk\">{{ \\'common:NAME\\' | i18next }}</span><igz-validating-input-field data-field-type=\"input\" data-input-name=\"name\" data-input-value=\"$ctrl.functionData.metadata.name\" data-validation-is-required=\"true\" data-validation-rules=\"$ctrl.validationRules.functionName\" data-validation-max-length=\"{{$ctrl.maxLengths.functionName}}\" data-input-model-options=\"$ctrl.inputModelOptions\" data-form-object=\"$ctrl.functionFromScratchForm\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_FUNCTION_NAME\\' | i18next }}\"></igz-validating-input-field></div></div><div class=\"function-runtime-wrapper\"><div class=\"function-runtime\"><span class=\"input-label asterisk\">{{ \\'functions:RUNTIME\\' | i18next }}</span><igz-default-dropdown data-is-required=\"true\" data-values-array=\"$ctrl.runtimes\" data-selected-item=\"$ctrl.selectedRuntime\" data-item-select-callback=\"$ctrl.onRuntimeChange(item, isItemChanged)\" data-form-object=\"$ctrl.functionFromScratchForm\" data-input-name=\"runtime\"></igz-default-dropdown><div class=\"bottom-bar\"><button class=\"ncl-primary-button igz-button-primary\" data-ng-click=\"$ctrl.createFunction()\" data-ng-disabled=\"!$ctrl.isCreateFunctionAllowed()\" data-ng-class=\"{\\'disabled\\': !$ctrl.isCreateFunctionAllowed()}\">{{ \\'common:CREATE\\' | i18next }}</button></div></div></div></form></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-code/function-event-pane/function-event-pane.tpl.html',\n    '<div class=\"test-events-pane-wrapper\"><div class=\"test-events-pane\" data-ng-class=\"{\\'fixed-left-bar\\': $ctrl.fixedLeftBar}\"><igz-splash-screen data-is-splash-showed=\"$ctrl.isSplashShowed\"></igz-splash-screen><div data-ng-class=\"{\\'visible\\': $ctrl.showLeftBar}\" class=\"left-bar\"><div class=\"header\"><div class=\"igz-icon-close\" data-ng-click=\"$ctrl.toggleLeftBar(false)\"></div>{{ \\'common:EVENTS\\' | i18next }}<div class=\"ncl-icon-pin\" data-ng-if=\"!$ctrl.fixedLeftBar\" data-ng-click=\"$ctrl.fixLeftBar()\"></div></div><ncl-test-events-navigation-tabs data-active-tab=\"$ctrl.selectedLeftBarTab\" data-tab-items=\"$ctrl.leftBarNavigationTabs\" data-on-change-active-tab=\"$ctrl.onChangeTab(activeTab, \\'selectedLeftBarTab\\')\"></ncl-test-events-navigation-tabs><div class=\"saved-tabs-list\" data-igz-extend-background><div class=\"igz-scrollable-container\" data-ng-scrollbars data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"list-item\" data-ng-if=\"$ctrl.selectedLeftBarTab.id === \\'saved\\'\" data-ng-repeat=\"savedEvent in $ctrl.savedEvents\"><div class=\"text-ellipsis\" data-ng-click=\"$ctrl.selectEvent(savedEvent)\"><div class=\"method-icon\" data-ng-style=\"{\\'background-color\\': $ctrl.getMethodColor(savedEvent.spec.attributes.method)}\">{{savedEvent.spec.attributes.method}}</div>{{savedEvent.spec.displayName}}</div><div class=\"igz-icon-close\" data-ng-click=\"$ctrl.deleteEvent(savedEvent)\"></div></div><div class=\"list-item text-ellipsis\" data-ng-if=\"$ctrl.selectedLeftBarTab.id === \\'history\\'\" data-ng-repeat=\"savedEvent in $ctrl.history | orderBy:\\'-\\'\" data-ng-click=\"$ctrl.selectEvent(savedEvent, \\'history\\')\"><span class=\"method-icon\" data-ng-style=\"{\\'background-color\\': $ctrl.getMethodColor(savedEvent.spec.attributes.method)}\">{{savedEvent.spec.attributes.method}}</span>{{savedEvent.spec.attributes.path === \\'\\' ? \\'/\\' : savedEvent.spec.attributes.path}}</div></div></div></div><div class=\"main-section-wrapper\"><form name=\"$ctrl.testEventsForm\" novalidate><div class=\"main-header\"><div class=\"left-side-elements\"><span class=\"igz-icon-hamburger-menu\" data-ng-if=\"!$ctrl.fixedLeftBar\" data-ng-click=\"$ctrl.toggleLeftBar()\"></span><igz-validating-input-field data-input-name=\"spec.displayName\" data-field-type=\"input\" data-input-value=\"$ctrl.selectedEvent.spec.displayName\" data-form-object=\"$ctrl.testEventsForm\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.EVENT_NAME\\' | i18next }}\" data-borders-mode=\"hover\" data-validation-max-length=\"{{$ctrl.maxLengths.eventName}}\" data-hide-counter=\"true\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\"></igz-validating-input-field></div><div class=\"right-side-elements\"><button class=\"new-test-event\" data-ng-click=\"$ctrl.resetData()\" data-uib-tooltip=\"{{ \\'functions:TOOLTIP.NEW_TEST\\' | i18next }}\" data-tooltip-popup-delay=\"300\" data-tooltip-placement=\"left\" data-tooltip-append-to-body=\"true\"><span class=\"ncl-icon-add\"></span></button><button class=\"igz-button-secondary small\" data-ng-class=\"{\\'disabled\\': $ctrl.isDisabledTestButton()}\" data-ng-click=\"$ctrl.isDisabledTestButton() ? angular.noop : $ctrl.testEvent()\" data-tooltip-enable=\"$ctrl.version.status.state !== \\'ready\\' || $ctrl.version.spec.disable\" data-uib-tooltip=\"{{ \\'functions:TOOLTIP.DISABLED_FUNCTION\\' | i18next }}\" data-tooltip-popup-delay=\"300\" data-tooltip-placement=\"top\" data-tooltip-append-to-body=\"true\">{{ \\'common:TEST\\' | i18next }}</button><button class=\"ncl-secondary-button igz-button-basic small\" data-ng-class=\"{\\'disabled\\': $ctrl.uploadingData.name !== \\'\\'}\" data-ng-disabled=\"$ctrl.uploadingData.name !== \\'\\'\" data-ng-click=\"$ctrl.uploadingData.name !== \\'\\' || $ctrl.saveEvent()\">{{ \\'common:SAVE\\' | i18next }}</button></div></div><div data-ui-layout=\"{ flow : \\'row\\', dividerSize: 3 }\"><div ui-layout-container data-size=\"45%\" data-min-size=\"100px\" class=\"request-section\" data-ng-class=\"{\\'left-bar-pinned\\': $ctrl.fixedLeftBar}\"><div class=\"igz-scrollable-container scrollable-request-section\" data-ng-scrollbars data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"request-method\"><igz-default-dropdown data-values-array=\"$ctrl.requestMethods\" data-select-property-only=\"name\" data-selected-item=\"$ctrl.selectedEvent.spec.attributes.method\" data-item-select-callback=\"$ctrl.onChangeRequestMethod(item)\" data-enable-overlap=\"true\"></igz-default-dropdown><div class=\"path\">{{$ctrl.getInvocationUrl()}}<igz-validating-input-field data-field-type=\"input\" data-input-value=\"$ctrl.selectedEvent.spec.attributes.path\" data-update-data-field=\"spec.attributes.path\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\"></igz-validating-input-field></div></div><div class=\"request-body\"><ncl-test-events-navigation-tabs data-active-tab=\"$ctrl.selectedRequestTab\" data-tab-items=\"$ctrl.requestNavigationTabs\" data-on-change-active-tab=\"$ctrl.onChangeTab(activeTab, \\'selectedRequestTab\\')\" data-selected-log-level=\"$ctrl.eventLogLevel\" data-on-change-log-level=\"$ctrl.onChangeLogLevel(selectedLogLevel)\"></ncl-test-events-navigation-tabs><div class=\"body\" data-ng-if=\"$ctrl.selectedRequestTab.id === \\'body\\'\"><div class=\"body-types\"><igz-default-dropdown data-values-array=\"$ctrl.requestBodyTypes\" data-selected-item=\"$ctrl.requestBodyType\" data-item-select-callback=\"$ctrl.onChangeRequestBodyType(item)\" data-enable-overlap=\"true\"></igz-default-dropdown></div><div class=\"main-block\"><div class=\"upload-file-section\" data-ng-class=\"{\\'uploaded\\': $ctrl.uploadingData.uploaded}\" data-ng-if=\"$ctrl.requestBodyType.id === \\'file\\'\"><div class=\"drop-section\" data-ng-class=\"{\\'uploaded\\': $ctrl.uploadingData.uploaded}\"><div class=\"drop-message\" data-ng-class=\"{\\'uploading\\': $ctrl.uploadingData.uploading,\\n' +\n    '                                                         \\'uploaded\\': $ctrl.uploadingData.uploaded}\"><div data-ng-if=\"!$ctrl.uploadingData.uploaded && !$ctrl.uploadingData.uploading\"><div class=\"ncl-icon-drop-file\"></div>{{ \\'functions:DROP_FILE_HERE_OR\\' | i18next }}<span class=\"browse\" ngf-select=\"$ctrl.uploadFile($file)\">{{ \\'functions:BROWSE\\' | i18next }}</span></div><div data-ng-if=\"$ctrl.uploadingData.uploading\"><div class=\"ncl-icon-drop-file\"></div><div class=\"file-name\">{{$ctrl.uploadingData.name}}<span class=\"size\">&nbsp;({{$ctrl.uploadingData.size}})</span></div><div class=\"progress\"><div class=\"progress-bar\" role=\"uib-progressbar\" aria-valuemin=\"0\" aria-valuemax=\"100\" data-ng-style=\"{\\'width\\': $ctrl.uploadingData.progress}\"></div></div></div><div data-ng-if=\"$ctrl.uploadingData.uploaded\"><div class=\"file\"><span class=\"ncl-icon-file\"></span><div class=\"name text-ellipsis\" data-uib-tooltip=\"{{$ctrl.uploadingData.name}}\" data-tooltip-popup-delay=\"300\" data-tooltip-placement=\"top\">{{$ctrl.uploadingData.name}}</div><span class=\"size\">&nbsp;({{$ctrl.uploadingData.size}})</span><div class=\"igz-icon-close\" data-ng-click=\"$ctrl.deleteFile()\"></div></div></div></div></div></div><div data-ng-if=\"$ctrl.requestBodyType.id !== \\'file\\'\" class=\"code-edit-section\"><ncl-monaco class=\"monaco-code-editor\" data-function-source-code=\"$ctrl.selectedEvent.spec.body\" data-language=\"$ctrl.requestSourceCodeLanguage\" data-on-change-source-code-callback=\"$ctrl.onChangeRequestSourceCode(sourceCode)\" data-selected-theme=\"\\'vs-light\\'\" data-show-line-numbers=\"true\" data-mini-monaco=\"true\" data-name=\"eventRequestBody\" data-read-only=\"false\"></ncl-monaco></div></div></div><div class=\"headers\" data-ng-if=\"$ctrl.selectedRequestTab.id === \\'headers\\'\"><div data-ng-if=\"$ctrl.headers.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 scrollable-headers table-body-wrapper\" data-ng-scrollbars data-igz-ng-scrollbars-config=\"{{$ctrl.igzScrollConfig}}\" data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"table-body\" data-ng-repeat=\"header in $ctrl.headers\"><ncl-key-value-input class=\"new-header-input\" data-list-class=\"scrollable-headers\" data-row-data=\"header\" data-item-index=\"$index\" data-use-type=\"false\" data-allow-selection=\"true\" data-value-optional=\"true\" data-on-select-item-callback=\"$ctrl.onSelectHeader\" data-action-handler-callback=\"$ctrl.handleAction(actionType, index)\" data-change-data-callback=\"$ctrl.onChangeData(newData, index)\"></ncl-key-value-input></div></div><div class=\"igz-create-button create-header-button\" data-ng-click=\"$ctrl.addNewHeader($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:CREATE_NEW_HEADER\\' | i18next }}</div></div></div></div></div><div ui-layout-container size=\"55%\" min-size=\"100px\" class=\"response-section\" data-ng-class=\"{\\'left-bar-pinned\\': $ctrl.fixedLeftBar}\"><div class=\"igz-scrollable-container scrollable-response-section\" data-ng-scrollbars data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"response-header\"><div class=\"left-side-elements\">{{ \\'functions:RESPONSE\\' | i18next }}</div><div class=\"right-side-elements\" data-ng-if=\"$ctrl.testResult.status\"><div>{{ \\'common:STATUS\\' | i18next }}:<div class=\"text-ellipsis status {{$ctrl.isInvocationSuccess ? \\'success\\' : \\'fail\\'}}\" data-uib-tooltip=\"{{$ctrl.testResult.status.statusCode}} {{$ctrl.testResult.status.statusText}}\" data-tooltip-placement=\"top\" data-tooltip-popup-delay=\"300\">{{$ctrl.testResult.status.statusCode}} {{$ctrl.testResult.status.statusText}}</div></div><div>{{ \\'common:TIME\\' | i18next }}:<span class=\"time\">{{$ctrl.invokeTime}}</span></div><div data-ng-if=\"$ctrl.responseSize\">{{ \\'common:SIZE\\' | i18next }}:<span class=\"size\">{{$ctrl.responseSize.value + $ctrl.responseSize.label}}</span></div></div></div><div class=\"response-body\"><ncl-test-events-navigation-tabs data-ng-if=\"$ctrl.showResponse\" data-active-tab=\"$ctrl.selectedResponseTab\" data-tab-items=\"$ctrl.responseNavigationTabs\" data-on-change-active-tab=\"$ctrl.onChangeTab(activeTab, \\'selectedResponseTab\\')\"></ncl-test-events-navigation-tabs><div class=\"body\" data-ng-if=\"$ctrl.selectedResponseTab.id === \\'body\\'\"><div class=\"no-response\" data-ng-if=\"!$ctrl.showResponse && !$ctrl.testing\"><div class=\"circle\"><div class=\"ncl-icon-test\"></div><div class=\"ncl-icon-hand\"></div></div><div class=\"message\">{{ \\'functions:EVENT_RESPONSE_MSG\\' | i18next }}</div></div><div class=\"testing\" data-ng-if=\"$ctrl.testing\"><span class=\"message\">{{ \\'common:LOADING_CAPITALIZE_ELLIPSIS\\' | i18next }}</span><div class=\"loader-wrapper\"><div class=\"loader-fading-circle\"><div class=\"loader-circle1 loader-circle\"></div><div class=\"loader-circle2 loader-circle\"></div><div class=\"loader-circle3 loader-circle\"></div><div class=\"loader-circle4 loader-circle\"></div><div class=\"loader-circle5 loader-circle\"></div><div class=\"loader-circle6 loader-circle\"></div><div class=\"loader-circle7 loader-circle\"></div><div class=\"loader-circle8 loader-circle\"></div><div class=\"loader-circle9 loader-circle\"></div><div class=\"loader-circle10 loader-circle\"></div><div class=\"loader-circle11 loader-circle\"></div><div class=\"loader-circle12 loader-circle\"></div></div></div><button class=\"ncl-secondary-button igz-button-secondary\" data-ng-click=\"$ctrl.cancelInvocation()\">{{ \\'common:CANCEL\\' | i18next }}</button></div><div class=\"code-section\" data-ng-if=\"$ctrl.showResponse && !$ctrl.testing\"><div class=\"igz-action-panel\"><div class=\"actions-list\"><div class=\"igz-action-item\" data-ng-click=\"$ctrl.downloadResponseFile()\" data-uib-tooltip=\"{{ \\'common:TOOLTIP.DOWNLOAD_TO_FILE\\' | i18next }}\" data-tooltip-placement=\"left\" data-tooltip-popup-delay=\"300\" data-tooltip-append-to-body=\"true\"><div class=\"action-icon igz-icon-download\"></div></div><igz-copy-to-clipboard data-value=\"$ctrl.testResult.body\"></igz-copy-to-clipboard></div></div><div class=\"code-edit-section\" data-ng-if=\"$ctrl.responseBodyType === \\'code\\'\"><ncl-monaco class=\"monaco-code-editor\" data-function-source-code=\"$ctrl.testResult.body\" data-language=\"\\'plaintext\\'\" data-selected-theme=\"\\'vs-light\\'\" data-show-line-numbers=\"true\" data-mini-monaco=\"true\" data-no-top-padding=\"true\" data-name=\"eventResponseBody\" data-read-only=\"true\"></ncl-monaco></div><div class=\"image-section\" data-ng-if=\"$ctrl.responseBodyType === \\'image\\'\"><img class=\"response-body-img\" data-ng-src=\"{{$ctrl.responseImage}}\" alt=\"{{ \\'functions:RESPONSE_IMAGE\\' | i18next }}\"></div><div class=\"no-content-section\" data-ng-if=\"$ctrl.responseBodyType !== \\'code\\' && $ctrl.responseBodyType !== \\'image\\'\">{{ \\'functions:YOU_CAN_DOWNLOAD_RESPONSE_BODY\\' | i18next }}</div></div></div><div class=\"headers\" data-ng-if=\"$ctrl.selectedResponseTab.id === \\'headers\\'\"><div data-ng-repeat=\"(key, value) in $ctrl.testResult.headers\"><div class=\"text-ellipsis labels\" data-uib-tooltip=\"{{key}}\" data-tooltip-placement=\"left\" data-tooltip-popup-delay=\"300\" data-tooltip-append-to-body=\"true\">{{key}}</div><div class=\"text-ellipsis values\" data-uib-tooltip=\"{{value}}\" data-tooltip-placement=\"left\" data-tooltip-popup-delay=\"300\">{{value}}</div></div></div><div class=\"logs\" data-ng-if=\"$ctrl.selectedResponseTab.id === \\'logs\\'\"><ncl-test-events-logs data-logs=\"$ctrl.logs\"></ncl-test-events-logs></div></div></div></div></div></form></div></div></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/common/screens/create-function/function-from-template/function-from-template-dialog/function-from-template-dialog.tpl.html',\n    '<div class=\"close-button ncl-icon-close\" data-ng-click=\"$ctrl.onClose()\"></div><div class=\"title\"><span>{{ \\'functions:TEMPLATE_PARAMETERS\\' | i18next }}</span></div><div class=\"main-content igz-scrollable-container\" data-ng-scrollbars><form name=\"$ctrl.templateForm\" novalidate><div class=\"field-group align-items-center\" data-ng-repeat=\"field in $ctrl.fields track by field.name\"><div class=\"igz-col-40 field-label\">{{ field.displayName }}<span class=\"asterisk\" data-ng-if=\"field.required\"></span></div><div class=\"igz-col-55\"><igz-validating-input-field data-ng-if=\"field.kind === \\'string\\'\" data-field-type=\"{{field.attributes.password ? \\'password\\' : \\'input\\'}}\" data-validation-is-required=\"field.required\" data-input-value=\"field.attributes.defaultValue\" data-input-name=\"{{field.name}}\" data-form-object=\"$ctrl.templateForm\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\"></igz-validating-input-field><igz-number-input data-ng-if=\"field.kind === \\'number\\'\" data-min-value=\"field.attributes.minValue\" data-max-value=\"field.attributes.maxValue\" data-value-step=\"{{field.attributes.step}}\" data-precision=\"{{field.attributes.allowDecimal ? 2 : 0}}\" data-default-value=\"field.attributes.defaultValue\" data-validation-is-required=\"field.required\" data-form-object=\"$ctrl.templateForm\" data-allow-empty-field=\"true\" data-update-number-input-callback=\"$ctrl.inputValueCallback(newData, field)\" data-input-name=\"{{field.name}}\"></igz-number-input><igz-default-dropdown data-ng-if=\"field.kind === \\'choice\\'\" data-values-array=\"field.attributes.choices\" data-selected-item=\"field.attributes.defaultValue\" data-select-property-only=\"id\" data-is-required=\"field.required\" data-item-select-field=\"{{field.name}}\" data-item-select-callback=\"$ctrl.dropdownCallback(item, isItemChanged, field)\" data-form-object=\"$ctrl.templateForm\" data-input-name=\"{{field.name}}\"></igz-default-dropdown></div><div class=\"igz-col-5\"><igz-more-info data-ng-if=\"field.description\" data-is-default-tooltip-enabled=\"true\" data-default-tooltip-placement=\"bottom\" data-default-tooltip-popup-delay=\"200\" data-description=\"{{field.description}}\"></igz-more-info></div></div></form></div><div class=\"buttons\"><button class=\"ncl-secondary-button igz-button-secondary\" data-ng-click=\"$ctrl.onClose()\" data-ng-keydown=\"$ctrl.onClose($event)\">{{ \\'common:CANCEL\\' | i18next }}</button><button class=\"ncl-primary-button igz-button-primary\" data-ng-class=\"{disabled: !$ctrl.isFormFilled()}\" data-ng-disabled=\"!$ctrl.isFormFilled()\" data-ng-click=\"$ctrl.onApply()\" data-ng-keydown=\"$ctrl.onApply($event)\">{{ \\'common:APPLY\\' | i18next }}</button></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-code/function-event-pane/test-events-logs/test-events-logs.tpl.html',\n    '<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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-code/function-event-pane/test-events-navigation-tabs/test-events-navigation-tabs.tpl.html',\n    '<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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-annotations/version-configuration-annotations.tpl.html',\n    '<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-list-class=\"scrollable-annotations\" data-row-data=\"annotation\" data-use-type=\"false\" 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-click=\"$ctrl.addNewAnnotation($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:CREATE_NEW_ANNOTATION\\' | i18next }}</div></form></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-basic-settings/version-configuration-basic-settings.tpl.html',\n    '<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-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-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-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-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-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-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=\"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-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-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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-build/version-configuration-build.tpl.html',\n    '<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\" 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.version.spec.build.image\" data-is-focused=\"false\" data-form-object=\"$ctrl.buildForm\" data-placeholder-text=\"{{ \\'functions:PLACEHOLDER.ENTER_IMAGE_NAME\\' | i18next }}\" data-update-data-callback=\"$ctrl.inputValueCallback(newData, field)\" data-update-data-field=\"spec.build.image\" 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-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=\"{{ \\'functions:ONBUILD_IMAGE_DESCRIPTION\\' | i18next }}\" 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-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-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\"></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-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-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\"><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\"><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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-environment-variables/version-configuration-environment-variables.tpl.html',\n    '<div class=\"ncl-version-configuration-environment-variables\"><div class=\"title\">{{ \\'functions:ENVIRONMENT_VARIABLES\\' | i18next }}</div><form name=\"$ctrl.environmentVariablesForm\" class=\"resources-wrapper\" novalidate><div class=\"igz-scrollable-container scrollable-environment-variables\" data-ng-scrollbars data-igz-ng-scrollbars-config=\"{{$ctrl.igzScrollConfig}}\" data-ng-scrollbars-config=\"$ctrl.scrollConfig\"><div class=\"table-body\" data-ng-repeat=\"variable in $ctrl.variables\"><ncl-key-value-input class=\"new-label-input\" data-list-class=\"scrollable-environment-variables\" data-row-data=\"variable\" data-item-index=\"$index\" data-use-type=\"true\" data-use-labels=\"true\" data-validation-rules=\"$ctrl.validationRules\" data-all-value-types=\"$ctrl.isOnlyValueTypeInputs\" data-action-handler-callback=\"$ctrl.handleAction(actionType, index)\" data-change-data-callback=\"$ctrl.onChangeData(newData, index)\" data-change-type-callback=\"$ctrl.onChangeType(newType, index)\" data-dropdown-overlap=\"true\" data-submit-on-fly=\"true\"></ncl-key-value-input></div></div><div class=\"igz-create-button create-variable-button\" data-ng-click=\"$ctrl.addNewVariable($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:CREATE_NEW_ENVIRONMENT_VARIABLE\\' | i18next }}</div></form></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-labels/version-configuration-labels.tpl.html',\n    '<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-list-class=\"scrollable-labels\" data-row-data=\"label\" data-item-index=\"$index\" data-use-type=\"false\" data-validation-rules=\"$ctrl.validationRules\" data-is-disabled=\"$ctrl.isVersionDeployed($ctrl.version)\" 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.addNewLabelTooltip\" data-value-tooltip=\"$ctrl.addNewLabelTooltip\"></ncl-key-value-input></div></div><div class=\"igz-create-button create-label-button\" data-ng-class=\"{\\'disabled\\': $ctrl.isVersionDeployed($ctrl.version)}\" data-ng-click=\"$ctrl.addNewLabel($event)\" data-uib-tooltip=\"{{$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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-logging/version-configuration-logging.tpl.html',\n    '<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>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-resources/version-configuration-resources.tpl.html',\n    '<div class=\"ncl-version-configuration-resources\"><div class=\"title\">{{ \\'common:RESOURCES\\' | i18next }}</div><form name=\"$ctrl.resourcesForm\" class=\"resources-wrapper\" novalidate><div class=\"row\"><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-form-object=\"$ctrl.resourcesForm\" data-input-name=\"requestMemory\" data-update-number-input-callback=\"$ctrl.memoryInputCallback(newData, field)\" data-update-number-input-field=\"spec.resources.requests.memory\" data-min-value=\"1\" data-current-value=\"$ctrl.requestsMemoryValue;\" data-value-step=\"1\"></igz-number-input></div><div class=\"row-input memory-input memory-size-dropdown\"><igz-default-dropdown 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-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=\"spec.resources.limits.memory\" data-current-value=\"$ctrl.limitsMemoryValue;\" data-value-step=\"1\"></igz-number-input></div><div class=\"row-input memory-input memory-size-dropdown\"><igz-default-dropdown 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-form-object=\"$ctrl.resourcesForm\" data-input-name=\"requestCpu\" data-placeholder=\"{{ $ctrl.selectedCpuRequestItem.placeholder }}\" data-update-number-input-callback=\"$ctrl.inputValueCallback(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.requestsCpuValue\"></igz-number-input></div><div class=\"row-input cpu-dropdown\"><igz-default-dropdown 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-form-object=\"$ctrl.resourcesForm\" data-input-name=\"limitsCpu\" data-placeholder=\"{{ $ctrl.selectedCpuLimitItem.placeholder }}\" data-update-number-input-callback=\"$ctrl.inputValueCallback(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.limitsCpuValue\"></igz-number-input></div><div class=\"row-input cpu-dropdown\"><igz-default-dropdown 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-form-object=\"$ctrl.resourcesForm\" data-input-name=\"limitsGpu\" data-update-number-input-callback=\"$ctrl.inputGpuValueCallback(newData, field)\" data-update-number-input-field=\"limits\" data-min-value=\"1\" data-max-value=\"4\" data-value-step=\"1\" data-current-value=\"$ctrl.limitsGpuValue\"></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.numberInputCallback(newData, field)\" data-update-number-input-field=\"minReplicas\" data-allow-empty-field=\"true\" data-placeholder=\"\" data-precision=\"0\" data-value-step=\"1\" data-validation-is-required=\"false\" 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.numberInputCallback(newData, field)\" data-update-number-input-field=\"maxReplicas\" data-allow-empty-field=\"true\" 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\"></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></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-runtime-attributes/version-configuration-runtime-attributes.tpl.html',\n    '<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-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-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-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-click=\"$ctrl.addNewAttribute($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:CREATE_NEW_RUNTIME_ATTRIBUTE\\' | i18next }}</div></div></form></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-volumes/version-configuration-volumes.tpl.html',\n    '<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=\"igz-col-70 common-table-cell\">{{ \\'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-list-class=\"scrollable-volumes\" 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-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=\"create-volume-button igz-create-button\" data-ng-click=\"$ctrl.createVolume($event)\"><span class=\"igz-icon-add-round\"></span>{{ \\'functions:CREATE_NEW_VOLUME\\' | i18next }}</div></form></div>');\n}]);\n})();\n\n(function(module) {\ntry {\n  module = angular.module('iguazio.dashboard-controls.templates');\n} catch (e) {\n  module = angular.module('iguazio.dashboard-controls.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n  $templateCache.put('nuclio/functions/version/version-configuration/tabs/version-configuration-build/version-configuration-build-dialog/version-configuration-build-dialog.tpl.html',\n    '<div class=\"close-button ncl-icon-close\" data-ng-click=\"$ctrl.onClose()\"></div><div class=\"title\"><span>{{ \\'functions:ATTACH_FILE\\' | i18next }}</span></div><div class=\"main-content\"><form name=\"attachFileForm\" novalidate><div class=\"field-group\"><div class=\"field-label\">{{ \\'functions:REMOTE_PATH\\' | i18next }}</div><igz-validating-input-field data-field-type=\"input\" data-is-focused=\"true\" data-placeholder-text=\"{{ \\'common:PLACEHOLDER.ENTER_PATH\\' | i18next }}\"></igz-validating-input-field></div></form></div><div class=\"buttons\"><button class=\"ncl-secondary-button igz-button-secondary\" tabindex=\"0\" data-ng-click=\"$ctrl.onClose()\" data-ng-keydown=\"$ctrl.onClose($event)\">{{ \\'common:CANCEL\\' | i18next }}</button><button class=\"ncl-primary-button igz-button-primary\" tabindex=\"0\" ngf-select=\"$ctrl.uploadFile($file)\">{{ \\'common:BROWSE\\' | i18next }}</button></div>');\n}]);\n})();\n"]}