http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/components/dag-view/tip.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/components/dag-view/tip.js b/tez-ui/src/main/webapp/app/scripts/components/dag-view/tip.js deleted file mode 100644 index 44c8bb5..0000000 --- a/tez-ui/src/main/webapp/app/scripts/components/dag-view/tip.js +++ /dev/null @@ -1,191 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * 'License'); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an 'AS IS' BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Displays a tooltip over an svg element. - */ -App.DagViewComponent.tip = (function () { - - var _element = null, // jQuery tooltip DOM element - _bubble = null, // Tooltip bubble in _element - _svg = null, // HTML svg tag that contains the element - _svgPoint = null, // A SVGPoint object - _window = $(window), - - _data = null, // Last displayed data, for re-render - _node = null; // Last node over which tooltip was displayed - - /** - * Converts the provided list object into a tabular form. - * @param list {Object} : An object with properties to be displayed as key value pairs - * { - * propertyName1: "property value 1", - * .. - * propertyNameN: "property value N", - * } - */ - function _createList(list) { - var listContent = [], - properties; - - if(list) { - listContent.push("<table>"); - - $.each(list, function (property, value) { - listContent.push( - "<tr><td>", - property, - "</td><td>", - value, - "</td></tr>" - ); - }); - listContent.push("</table>"); - - return listContent.join(""); - } - } - - /** - * Tip supports 3 visual entities in the tooltip. Title, description text and a list. - * _setData sets all these based on the passed data object - * @param data {Object} An object of the format - * { - * title: "tip title", - * text: "tip description text", - * kvList: { - * propertyName1: "property value 1", - * .. - * propertyNameN: "property value N", - * } - * } - */ - function _setData(data) { - _element.find('.tip-title').html(data.title || ""); - _element.find('.tip-text').html(data.text || ""); - _element.find('.tip-text')[data.text ? 'show' : 'hide'](); - _element.find('.tip-list').html(_createList(data.kvList) || ""); - } - - return { - /** - * Set the tip defaults - * @param tipElement {$} jQuery reference to the tooltip DOM element. - * The element must contain 3 children with class tip-title, tip-text & tip-list. - * @param svg {$} jQuery reference to svg html element - */ - init: function (tipElement, svg) { - _element = tipElement, - _bubble = _element.find('.bubble'), - _svg = svg, - _svgPoint = svg[0].createSVGPoint(); - }, - /** - * Display a tooltip over an svg element. - * @param node {SVG Element} Svg element over which tooltip must be displayed. - * @param data {Object} An object of the format - * { - * title: "tip title", - * text: "tip description text", - * kvList: { - * propertyName1: "property value 1", - * .. - * propertyNameN: "property value N", - * } - * } - * @param event {MouseEvent} Event that triggered the tooltip. - */ - show: function (node, data, event) { - var point = data.position || (node.getScreenCTM ? _svgPoint.matrixTransform( - node.getScreenCTM() - ) : { - x: event.x, - y: event.y - }), - - windMid = _window.height() >> 1, - winWidth = _window.width(), - - showAbove = point.y < windMid, - offsetX = 0, - width = 0, - - svgLeft = _svg.offset().left; - - if(_data !== data) { - _data = data, - _node = node; - - _setData(data); - } - - if(point.x > svgLeft && point.x < svgLeft + _svg.width()) { - if(showAbove) { - _element.removeClass('below'); - _element.addClass('above'); - } - else { - _element.removeClass('above'); - _element.addClass('below'); - - point.y -= _element.height(); - } - - width = _element.width(); - offsetX = (width - 11) >> 1; - - if(point.x - offsetX < 0) { - offsetX = point.x - 20; - } - else if(point.x + offsetX > winWidth) { - offsetX = point.x - (winWidth - 10 - width); - } - - _bubble.css({ - left: -offsetX - }); - - _element.addClass('show'); - - _element.css({ - left: point.x, - top: point.y - }); - } - else { - _element.removeClass('show'); - } - }, - /** - * Reposition the tooltip based on last passed data & node. - */ - reposition: function () { - if(_data) { - this.show(_node, _data); - } - }, - /** - * Hide the tooltip. - */ - hide: function () { - _data = _node = null; - _element.removeClass('show'); - } - }; - -})();
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/components/extended-table.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/components/extended-table.js b/tez-ui/src/main/webapp/app/scripts/components/extended-table.js deleted file mode 100644 index dd72935..0000000 --- a/tez-ui/src/main/webapp/app/scripts/components/extended-table.js +++ /dev/null @@ -1,297 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.ExTable = Ember.Namespace.create(); - -Ember.Table.BodyTableContainer.reopen({ - width: Ember.computed.alias('tableComponent._tableContainerWidth'), - didInsertElement: function () { - this._super(); - this.$().unbind(); - } -}); - -App.ExTable.FilterTextField = Em.TextField.extend({ - classNames: ['filter'], - classNameBindings: ['isPopulated','isInputDirty:input-dirty'], - type: 'search', - results: 1, - attributeBindings: ['autofocus', 'results'], - valueBinding: Em.Binding.oneWay('filterValue'), - isPopulated: function() { - return !Em.isEmpty(this.get('value')); - }.property('value'), - - insertNewline: function(event) { - if (this.get('isInputDirty')) { - this.set('filterValue', this.get('value')); - this.get('parentView.controller').send('filterUpdated', - this.get('parentView.content'), this.get('value')); - } - }, - cancel: function() { - // cancel is ignored. user needs to press enter. This is done in order to avoid - // two requests when user wants to clear the current input and enter new value. - }, - isInputDirty: function() { - return $.trim(this.get('value')) != $.trim(this.get('filterValue')); - }.property('value', 'filterValue') -}); - -App.ExTable.FilterDropdownField = Em.Select.extend({ - valueBinding: Em.Binding.oneWay('filterValue'), - change: function(key) { - if (this.get('isInputDirty')) { - this.set('filterValue', this.get('value')); - this.get('parentView.controller') - .send('filterUpdated', this.get('parentView.content'), this.get('value')); - } - }, - isInputDirty: function() { - return $.trim(this.get('value')) != $.trim(this.get('filterValue')); - }.property('value', 'filterValue') -}); - -App.ExTable.FilterRow = Ember.View.extend(Ember.AddeparMixins.StyleBindingsMixin, { - templateName: 'components/extended-table/filter-row', - classNames: ['ember-table-table-row', 'ember-table-header-row'], - styleBindings: ['width'], - columns: Ember.computed.alias('content'), - width: Ember.computed.alias('controller._rowWidth'), - scrollLeft: Ember.computed.alias('controller._tableScrollLeft'), - onScrollLeftDidChange: function() { - return this.$().scrollLeft(this.get('scrollLeft')); - }.observes('scrollLeft'), - onScroll: function(event) { - this.set('scrollLeft', event.target.scrollLeft); - return event.preventDefault(); - } -}); - -App.ExTable.FilterBlock = Ember.Table.TableBlock.extend({ - classNames: ['ember-table-header-block'], - itemViewClass: 'App.ExTable.FilterRow', - content: function() { - return [this.get('columns')]; - }.property('columns') -}); - -App.ExTable.FilterTableContainer = Ember.Table.TableContainer.extend( - Ember.Table.ShowHorizontalScrollMixin, { - templateName: 'components/extended-table/filter-container', - classNames: [ - 'ember-table-table-container', - 'ember-table-fixed-table-container', - 'ember-table-header-container' - ], - height: Ember.computed.alias('controller._filterHeight'), - width: Ember.computed.alias('controller._tableContainerWidth') -}); - -App.ExTable.FilterCell = Ember.View.extend(Ember.AddeparMixins.StyleBindingsMixin, { - init: function() { - var inputFieldView = null; - if (this.get('content.isFilterable')) { - var filterType = this.get('content.filterType'); - switch (filterType) { - case 'dropdown': - inputFieldView = App.ExTable.FilterDropdownField.create({ - content: this.get('content.dropdownValues'), - optionValuePath: 'content.id', - optionLabelPath: 'content.label', - classNames: 'inline-display', - filterValueBinding: '_parentView.content.columnFilterValue' - }); - break; - case 'textbox': - inputFieldView = App.ExTable.FilterTextField.create({ - classNames: 'inline-display', - filterValueBinding: '_parentView.content.columnFilterValue' - }); - break; - default: - console.log('Unknown filter type ' + filterType + ' defined on column ' + - this.get('content.headerCellName') + '.Will be ignored'); - break; - } - } - if (!inputFieldView) { - // if no filter is specified or type is unknown, use empty view. - inputFieldView = Em.View.create(); - } - this.set('inputFieldView', inputFieldView); - this._super(); - }, - templateName: 'components/extended-table/filter-cell', - classNames: ['ember-table-cell', 'ember-table-header-cell'], - classNameBindings: ['column.textAlign'], - styleBindings: ['width', 'height'], - column: Ember.computed.alias('content'), - width: Ember.computed.alias('column.columnWidth'), - height: function() { - return this.get('controller._filterHeight'); - }.property('controller._filterHeight'), - // Currently resizing is not handled automatically. if required will need to do here. -}); - -App.ExTable.ColumnDefinition = Ember.Table.ColumnDefinition.extend({ - init: function() { - if (!!this.filterID) { - var columnFilterValueBinding = Em.Binding - .oneWay('controller._parentView.context.' + this.filterID) - .to('columnFilterValue'); - columnFilterValueBinding.connect(this); - } - this._super(); - }, - filterType: 'textbox', // default is textbox - textAlign: 'text-align-left', - filterCellView: 'App.ExTable.FilterCell', - filterCellViewClass: Ember.computed.alias('filterCellView'), - filterID: null, -}); - -App.ExTable.TableComponent = Ember.Table.EmberTableComponent.extend({ - layoutName: 'components/extended-table/extable', - filters: {}, - styleBindings: ['height', 'width'], - hasFilter: true, - minFilterHeight: 30, //TODO: less changes - - enableContentSelection: false, - selectionMode: 'none', - - width: function () { - return Math.max(this.get('_width'), this._getTotalWidth(this.get('tableColumns'))); - }.property('tableColumns', '_tableColumnsWidth', '_width'), - - _tableContainerWidth: Ember.computed.alias('width'), - - actions: { - filterUpdated: function(columnDef, value) { - var filterID = columnDef.get('filterID'); - filterID = filterID || columnDef.get('headerCellName').underscore(); - if (this.get('onFilterUpdated')) { - this.sendAction('onFilterUpdated', filterID, value); - } - }, - }, - - updateLayout: function () { - if ((this.get('_state') || this.get('state')) !== 'inDOM') { - return; - } - return this.doForceFillColumns(); - }, - - doForceFillColumns: function() { - var additionWidthPerColumn, availableContentWidth, columnsToResize, contentWidth, fixedColumnsWidth, remainingWidth, tableColumns, totalWidth; - totalWidth = this.get('_width'); - - fixedColumnsWidth = this.get('_fixedColumnsWidth'); - tableColumns = this.get('tableColumns'); - contentWidth = this._getTotalWidth(tableColumns); - - availableContentWidth = totalWidth - fixedColumnsWidth; - remainingWidth = availableContentWidth - contentWidth; - columnsToResize = tableColumns.filterProperty('canAutoResize'); - - if(totalWidth < contentWidth) { - return []; - } - additionWidthPerColumn = Math.floor(remainingWidth / columnsToResize.length); - if(availableContentWidth <= this._getTotalWidth(tableColumns, 'minWidth')) { - return columnsToResize; - } - return columnsToResize.forEach(function(column) { - var columnWidth = column.get('columnWidth') + additionWidthPerColumn; - return column.set('columnWidth', columnWidth); - }); - }, - - // private variables - // Dynamic filter height that adjusts according to the filter content height - _contentFilterHeight: null, - - _onColumnsChange: Ember.observer(function() { - return Ember.run.next(this, function() { - return Ember.run.once(this, this.updateLayout); - }); - }, 'columns.length', '_tableContentHeight'), - - _filterHeight: function() { - var minHeight = this.get('minFilterHeight'); - var contentFilterHeight = this.get('_contentFilterHeight'); - if (contentFilterHeight < minHeight) { - return minHeight; - } else { - return contentFilterHeight; - } - }.property('_contentFilterHeight', 'minFilterHeight'), - - // some of these below are private functions extend. however to add the filterrow we need them. - // tables-container height adjusts to the content height - _tablesContainerHeight: function() { - var contentHeight, height; - height = this.get('_height'); - contentHeight = this.get('_tableContentHeight') + this.get('_headerHeight') + this.get('_footerHeight') - + this.get('_filterHeight'); - return height && contentHeight; - }.property('_height', '_tableContentHeight', '_headerHeight', '_footerHeight', '_filterHeight'), - - _bodyHeight: function() { - var bodyHeight; - bodyHeight = this.get('_tablesContainerHeight'); - if (this.get('hasHeader')) { - bodyHeight -= this.get('_headerHeight'); - } - if (this.get('hasFilter')) { - bodyHeight -= this.get('_filterHeight'); - } - if (this.get('hasFooter')) { - bodyHeight -= this.get('footerHeight'); - } - return bodyHeight; - }.property('_tablesContainerHeight', '_hasHorizontalScrollbar', '_headerHeight', 'footerHeight', '_filterHeight', - 'hasHeader', 'hasFooter', 'hasFilter'), - - _hasVerticalScrollbar: function() { - var contentHeight, height; - height = this.get('_height'); - contentHeight = this.get('_tableContentHeight') + this.get('_headerHeight') + this.get('_footerHeight') - + this.get('_filterHeight'); - if (height < contentHeight) { - return true; - } else { - return false; - } - }.property('_height', '_tableContentHeight', '_headerHeight', '_footerHeight', '_filterHeight'), - - _tableContentHeight: function() { - return this.get('rowHeight') * this.get('bodyContent.length'); - }.property('rowHeight', 'bodyContent.length') -}); - -App.ExTable.FilterColumnMixin = Ember.Mixin.create({ - isFilterable: true, - filterPresent: function() { - return !Em.isEmpty(this.get('columnFilterValue')); - }.property('columnFilterValue'), -}); - -Ember.Handlebars.helper('extended-table-component', App.ExTable.TableComponent); http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/components/kv-table.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/components/kv-table.js b/tez-ui/src/main/webapp/app/scripts/components/kv-table.js deleted file mode 100644 index 5e433ea..0000000 --- a/tez-ui/src/main/webapp/app/scripts/components/kv-table.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.KvTableComponent = Em.Component.extend({ - layoutName: 'components/kv-table', - filterExp: null, - showAllButtonClass: '', - errorMsgClass: '', - - actions: { - showAllButtonClicked: function() { - this.set('filterExp', null); - } - }, - - showError: function(show) { - this.set('errorMsgClass', show ? '' : 'no-display'); - }, - - filteredKVs: function() { - var filterExp = this.get('filterExp'); - var kvList = this.get('data') || [], - filteredKvs = [], - filterStringRegex; - - if (filterExp) { - this.set('showAllButtonClass', ''); - } else { - this.set('showAllButtonClass', 'hidden'); - } - - try { - filterStringRegex = new RegExp(filterExp, 'i'); - } catch(e) { - this.showError(true); - Em.Logger.debug("Invalid regex " + e); - return; - } - - this.showError(false); - if (Em.isEmpty(filterExp)) { - return kvList; - } - - kvList.forEach(function (kv) { - if (filterStringRegex.test(kv.get('key')) || filterStringRegex.test(kv.get('value'))) { - filteredKvs.push(kv); - } - }); - - return filteredKvs; - }.property('data', 'filterExp') -}); - -Em.Handlebars.helper('kv-table-component', App.KvTableComponent); http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/components/load-time-component.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/components/load-time-component.js b/tez-ui/src/main/webapp/app/scripts/components/load-time-component.js deleted file mode 100644 index 648a395..0000000 --- a/tez-ui/src/main/webapp/app/scripts/components/load-time-component.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.LoadTimeComponent = Em.Component.extend({ - layoutName: 'components/load-time', - - actions: { - refresh: function() { - this.sendAction('refresh'); - } - }, - - displayTime: function() { - var time = this.get('time'); - return time ? App.Helpers.date.dateFormat(time.getTime(), true) : null; - }.property('time') -}); - -Em.Handlebars.helper('load-time-component', App.LoadTimeComponent); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/components/page-nav.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/components/page-nav.js b/tez-ui/src/main/webapp/app/scripts/components/page-nav.js deleted file mode 100644 index c6d302c..0000000 --- a/tez-ui/src/main/webapp/app/scripts/components/page-nav.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.PageNavComponent = Em.Component.extend({ - layoutName: 'components/page-nav', - - classNames: ['inline-block', 'page-nav-link'], - - actions: { - gotoNext: function() { - this.sendAction('navNext'); - }, - gotoPrev: function() { - this.sendAction('navPrev'); - }, - gotoFirst: function() { - this.sendAction('navFirst'); - } - } -}); - -Em.Handlebars.helper('page-nav-component', App.PageNavComponent); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/configs.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/configs.js b/tez-ui/src/main/webapp/app/scripts/configs.js deleted file mode 100644 index 49046a5..0000000 --- a/tez-ui/src/main/webapp/app/scripts/configs.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.setConfigs({ - - /* Environment configurations */ - envDefaults: { - version: "${version}", - /* - * By default TEZ UI looks for timeline server at http://localhost:8188, uncomment and change - * the following value for pointing to a different domain. - */ - // timelineBaseUrl: 'http://localhost:8188', - - /* - * By default RM web interface is expected to be at http://localhost:8088, uncomment and change - * the following value to point to a different domain. - */ - // RMWebUrl: 'http://localhost:8088', - - /* - * Ensures that some of the UI features work with old versions of Tez - */ - compatibilityMode: false, - - /* - * Default time zone for UI display. Set to undefined for local timezone - * For configuration see http://momentjs.com/timezone/docs/ - */ - //timezone: "UTC", - - /* - * yarnProtocol: - * If specified, this protocol would be used to construct node manager log links. - * Possible values: http, https - * Default value: If not specified, protocol of RMWebUrl will be used - */ - //yarnProtocol: "<value>", - }, - - /* - * Visibility of table columns can be controlled using the column selector. Also an optional set of - * file system counters can be enabled as columns for most of the tables. For adding more counters - * as columns edit the following 'tables' object. Counters must be added as configuration objects - * of the following format. - * { - * counterName: '<Counter ID>', - * counterGroupName: '<Group ID>', - * } - * - * Note: Till 0.6.0 the properties were counterId and groupId, their use is deprecated now. - */ - tables: { - /* - * Entity specific columns must be added into the respective array. - */ - entity: { - dag: [ - // { // Following is a sample configuration object. - // counterName: 'FILE_BYTES_READ', - // counterGroupName: 'org.apache.tez.common.counters.FileSystemCounter', - // } - ], - vertex: [], - task: [], - taskAttempt: [], - tezApp: [], - }, - /* - * User sharedColumns to add counters that must be displayed in all tables. - */ - sharedColumns:[] - } - -}); - http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/controllers/base-controller.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/base-controller.js b/tez-ui/src/main/webapp/app/scripts/controllers/base-controller.js deleted file mode 100644 index e0461dc..0000000 --- a/tez-ui/src/main/webapp/app/scripts/controllers/base-controller.js +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.BaseController = Em.ObjectController.extend({ - controllerName: null, // Must be set by the respective controllers - - isActive: false, - - setup: function () { - this.set('isActive', true); - }, - reset: function () { - this.set('isActive', false); - }, - - getStoreKey: function (subKey) { - return "%@:%@".fmt(this.get('controllerName'), subKey); - }, - storeConfig: function (key, value) { - try { - localStorage.setItem(this.getStoreKey(key) , JSON.stringify(value)); - }catch(e){ - return e; - } - return value; - }, - fetchConfig: function (key) { - try { - return JSON.parse(localStorage.getItem(this.getStoreKey(key))); - }catch(e){} - return undefined; - }, - -}); http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/controllers/dag-task-attempts-controller.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/dag-task-attempts-controller.js b/tez-ui/src/main/webapp/app/scripts/controllers/dag-task-attempts-controller.js deleted file mode 100644 index 7a7af91..0000000 --- a/tez-ui/src/main/webapp/app/scripts/controllers/dag-task-attempts-controller.js +++ /dev/null @@ -1,275 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.DagTaskAttemptsController = App.TablePageController.extend({ - - controllerName: 'DagTaskAttemptsController', - needs: "dag", - - entityType: 'dagTaskAttempt', - filterEntityType: 'dag', - filterEntityId: Ember.computed.alias('controllers.dag.id'), - - cacheDomain: Ember.computed.alias('controllers.dag.id'), - - pollingType: 'attemptInfo', - - pollsterControl: function () { - if(this.get('status') == 'RUNNING' && - this.get('amWebServiceVersion') != '1' && - !this.get('loading') && - this.get('isActive') && - this.get('pollingEnabled') && - this. get('rowsDisplayed.length') > 0) { - this.get('pollster').start(); - } - else { - this.get('pollster').stop(); - } - }.observes('status', 'amWebServiceVersion', 'rowsDisplayed', 'loading', 'isActive', 'pollingEnabled'), - - pollsterOptionsObserver: function () { - this.set('pollster.options', { - appID: this.get('applicationId'), - dagID: this.get('idx'), - counters: this.get('countersDisplayed'), - attemptID: this.get('rowsDisplayed').map(function (row) { - var attemptIndex = App.Helpers.misc.getIndexFromId(row.get('id')), - taskIndex = App.Helpers.misc.getIndexFromId(row.get('taskID')), - vertexIndex = App.Helpers.misc.getIndexFromId(row.get('vertexID')); - return '%@_%@_%@'.fmt(vertexIndex, taskIndex, attemptIndex); - }).join(',') - }); - }.observes('applicationId', 'idx', 'rowsDisplayed'), - - countersDisplayed: function () { - return App.Helpers.misc.getCounterQueryParam(this.get('columns')); - }.property('columns'), - - beforeLoad: function () { - var dagController = this.get('controllers.dag'), - model = dagController.get('model'); - return model.reload().then(function () { - return dagController.loadAdditional(model); - }); - }, - - afterLoad: function () { - var data = this.get('data'), - isUnsuccessfulDag = App.Helpers.misc.isStatusInUnsuccessful( - this.get('controllers.dag.status') - ); - - data.forEach(function (attempt) { - var attemptStatus = App.Helpers.misc - .getFixedupDisplayStatus(attempt.get('status')); - if (attemptStatus == 'RUNNING' && isUnsuccessfulDag) { - attemptStatus = 'KILLED' - } - if (attemptStatus != attempt.get('status')) { - attempt.set('status', attemptStatus); - } - }); - - return this._super(); - }, - - defaultColumnConfigs: function() { - var that = this, - vertexIdToNameMap = this.get('controllers.dag.vertexIdToNameMap') || {}; - return [ - { - id: 'taskId', - headerCellName: 'Task Index', - templateName: 'components/basic-table/linked-cell', - contentPath: 'taskID', - getCellContent: function (row) { - var taskId = row.get('taskID'), - idPrefix = 'task_%@_'.fmt(row.get('dagID').substr(4)); - return { - linkTo: 'task', - entityId: taskId, - displayText: taskId.indexOf(idPrefix) == 0 ? taskId.substr(idPrefix.length) : taskId - }; - }, - getSearchValue: function (row) { - var id = row.get('taskID'), - idPrefix = 'task_%@_'.fmt(row.get('dagID').substr(4)); - return id.indexOf(idPrefix) == 0 ? id.substr(idPrefix.length) : id; - } - }, - { - id: 'attemptNo', - headerCellName: 'Attempt No', - templateName: 'components/basic-table/linked-cell', - contentPath: 'id', - getCellContent: function(row) { - var attemptID = row.get('id') || ''; - return { - linkTo: 'taskAttempt', - displayText: attemptID.split(/[_]+/).pop(), - entityId: attemptID - }; - }, - getSearchValue: function (row) { - var attemptID = row.get('id') || ''; - return attemptID.split(/[_]+/).pop(); - }, - getSortValue: function (row) { - var attemptID = row.get('id') || ''; - return attemptID.split(/[_]+/).pop(); - } - }, - { - id: 'status', - headerCellName: 'Status', - templateName: 'components/basic-table/status-cell', - contentPath: 'status', - observePath: true, - onSort: this.onInProgressColumnSort.bind(this), - getCellContent: function(row) { - var status = App.Helpers.misc.getFixedupDisplayStatus(row.get('status')); - return { - status: status, - statusIcon: App.Helpers.misc.getStatusClassForEntity(status) - }; - } - }, - { - id: 'progress', - headerCellName: 'Progress', - contentPath: 'progress', - observePath: true, - onSort: this.onInProgressColumnSort.bind(this), - templateName: 'components/basic-table/progress-cell' - }, - { - id: 'vertexName', - headerCellName: 'Vertex Name', - templateName: 'components/basic-table/linked-cell', - contentPath: 'vertexID', - getCellContent: function(row) { - var vertexId = row.get('vertexID') || ''; - return { - linkTo: 'vertex', - displayText: vertexIdToNameMap[vertexId] || vertexId, - entityId: vertexId - }; - }, - getSearchValue: function (row) { - var vertexId = row.get('vertexID'); - return vertexIdToNameMap[vertexId] || vertexId; - }, - getSortValue: function (row) { - var vertexId = row.get('vertexID'); - return vertexIdToNameMap[vertexId] || vertexId; - } - }, - { - id: 'startTime', - headerCellName: 'Start Time', - contentPath: 'startTime', - getCellContent: function(row) { - return App.Helpers.date.dateFormat(row.get('startTime')); - }, - getSearchValue: function(row) { - return App.Helpers.date.dateFormat(row.get('startTime')); - } - }, - { - id: 'endTime', - headerCellName: 'End Time', - contentPath: 'endTime', - getCellContent: function(row) { - return App.Helpers.date.dateFormat(row.get('endTime')); - }, - getSearchValue: function(row) { - return App.Helpers.date.dateFormat(row.get('endTime')); - }, - }, - { - id: 'duration', - headerCellName: 'Duration', - contentPath: 'duration', - getCellContent: function(row) { - return App.Helpers.date.timingFormat(row.get('duration'), 1); - }, - getSearchValue: function(row) { - return App.Helpers.date.timingFormat(row.get('duration'), 1); - }, - }, - { - id: 'containerId', - headerCellName: 'Container', - contentPath: 'containerId' - }, - { - id: 'nodeId', - headerCellName: 'Node', - contentPath: 'nodeId' - }, - { - id: 'actions', - headerCellName: 'Actions', - templateName: 'components/basic-table/linked-cell', - searchAndSortable: false, - contentPath: 'id', - getCellContent: function(row) { - var attemptID = row.get('id') || ''; - return { - linkTo: 'taskAttempt.counters', - displayText: 'counters', - entityId: attemptID - }; - } - }, - { - id: 'logs', - headerCellName: 'Logs', - templateName: 'components/basic-table/logs-cell', - searchAndSortable: false, - getCellContent: function(row) { - var cellContent = App.Helpers.misc.constructLogLinks( - row, - that.get('controllers.dag.yarnAppState'), - that.get('controllers.dag.tezApp.user') - ); - - cellContent.notAvailable = cellContent.viewUrl || cellContent.downloadUrl; - return cellContent; - } - } - ]; - }.property( - 'controllers.dag.vertexIdToNameMap', - 'controllers.dag.yarnAppState', - 'controllers.dag.tezApp.user' - ), - - columnConfigs: function() { - return this.get('defaultColumnConfigs').concat( - App.Helpers.misc.normalizeCounterConfigs( - App.get('Configs.defaultCounters').concat( - App.get('Configs.tables.entity.taskAttempt') || [], - App.get('Configs.tables.sharedColumns') || [] - ) - , this) - ); - }.property('defaultColumnConfigs'), - -}); http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/controllers/dag-view-controller.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/dag-view-controller.js b/tez-ui/src/main/webapp/app/scripts/controllers/dag-view-controller.js deleted file mode 100644 index 9456fb7..0000000 --- a/tez-ui/src/main/webapp/app/scripts/controllers/dag-view-controller.js +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.DagViewController = App.TablePageController.extend({ - controllerName: 'DagViewController', - needs: ["dag", "dagVertices"], - - entityType: 'dagVertex', - filterEntityType: 'dag', - filterEntityId: Ember.computed.alias('controllers.dag.id'), - - cacheDomain: Ember.computed.alias('controllers.dag.id'), - - showAutoUpdate: false, - - columnSelectorTitle: 'Customize vertex tooltip', - - beforeLoad: function () { - var dagController = this.get('controllers.dag'), - model = dagController.get('model'); - return model.reload().then(function () { - return dagController.loadAdditional(model); - }); - }, - - afterLoad: function () { - var data = this.get('data'), - runningVerticesIdx, - isUnsuccessfulDag = App.Helpers.misc.isStatusInUnsuccessful( - this.get('controllers.dag.status') - ); - - if(isUnsuccessfulDag) { - data.filterBy('status', 'RUNNING').forEach(function (vertex) { - vertex.set('status', 'KILLED'); - }); - } - - return this._super(); - }, - - redirect: function (details) { - switch(details.type) { - case 'vertex': - this.transitionToRoute('vertex', details.d.get('data.id')); - break; - case 'task': - this.transitionToRoute('vertex.tasks', details.d.get('data.id')); - break; - case 'io': - this.transitionToRoute('vertex.additionals', details.d.get('data.id')); - break; - case 'input': - this.transitionToRoute('input.configs', details.d.get('parent.data.id'), details.d.entity); - break; - case 'output': - this.transitionToRoute('output.configs', details.d.get('vertex.data.id'), details.d.entity); - break; - } - }, - - actions: { - modalConfirmed: function () { - this.redirect(this.get('redirectionDetails')); - }, - modalCanceled: function () { - }, - entityClicked: function (details) { - - /** - * In IE 11 under Windows 7, mouse events are not delivered to the page - * anymore at all after a SVG use element that was under the mouse is - * removed from the DOM in the event listener in response to a mouse click. - * See https://connect.microsoft.com/IE/feedback/details/796745 - * - * This condition and related actions must be removed once the bug is fixed - * in all supported IE versions - */ - if(App.env.isIE) { - this.set('redirectionDetails', details); - Bootstrap.ModalManager.confirm( - this, - 'Confirmation Required!', - 'You will be redirected to %@ page'.fmt( - details.type == "io" ? "additionals" : details.type - ) - ); - } - else { - this.redirect(details); - } - } - }, - - defaultColumnConfigs: function() { - return this.get('controllers.dagVertices.defaultColumnConfigs'); - }.property(), - - columnConfigs: function() { - var configs = this.get('controllers.dagVertices.columnConfigs'); - return configs.filter(function (config) { - return (config.contentPath) || - (config.getCellContent && config.searchAndSortable != false); - }); - }.property(), - - viewData: function () { - var vertices = this.get('controllers.dag.vertices') || [], - entities = this.get('data') || [], - finalVertex, - dagStatus = this.get('controllers.dag.status'), - needsStatusFixup = App.Helpers.misc.isStatusInUnsuccessful(dagStatus); - - entities = entities.reduce(function (obj, vertexData) { - obj[vertexData.get('name')] = vertexData; - return obj; - }, {}); - - vertices.forEach(function (vertex) { - vertex.data = entities[vertex.vertexName]; - if (needsStatusFixup && vertex.data && vertex.data.get('status') == 'RUNNING') { - vertex.data.set('status', 'KILLED'); - } - }); - - return { - vertices: vertices, - edges: this.get('controllers.dag.edges'), - vertexGroups: this.get('controllers.dag.vertexGroups') - }; - }.property('data', 'controllers.dag.vertices', 'controllers.dag') -}); http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/controllers/dag_controller.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/dag_controller.js b/tez-ui/src/main/webapp/app/scripts/controllers/dag_controller.js deleted file mode 100644 index ddf6221..0000000 --- a/tez-ui/src/main/webapp/app/scripts/controllers/dag_controller.js +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.DagController = App.PollingController.extend(App.Helpers.DisplayHelper, { - controllerName: 'DagController', - pageTitle: 'Dag', - - loading: true, - - pollingType: 'dagInfo', - persistConfigs: false, - - pollsterControl: function () { - if(this.get('status') == 'RUNNING' && - this.get('amWebServiceVersion') != '1' && - this.get('pollingEnabled') && - this.get('isActive')) { - this.get('pollster').start(); - } - else { - this.get('pollster').stop(); - } - }.observes('status', 'amWebServiceVersion', 'isActive', 'pollingEnabled'), - - pollsterOptionsObserver: function () { - var model = this.get('model'); - - this.get('pollster').setProperties( (model && model.get('status') != 'SUCCEEDED') ? { - targetRecords: [model], - options: { - appID: this.get('applicationId'), - dagID: App.Helpers.misc.getIndexFromId(this.get('id')), - } - } : { - targetRecords: [], - options: null - }); - }.observes('applicationId', 'model', 'model.status', 'id'), - - loadAdditional: function(dag) { - var that = this; - var loaders = []; - var applicationId = dag.get('applicationId'); - - var appDetailLoader = App.Helpers.misc.loadApp(this.store, applicationId) - .then(function(app){ - dag.set('appDetail', app); - var status = app.get('status'); - if (status) { - dag.set('yarnAppState', status); - } - dag.set('status', App.Helpers.misc.getRealStatus(dag.get('status'), app.get('status'), app.get('finalStatus'))); - }).catch(function(){}); - App.Helpers.misc.removeRecord(this.store, 'tezApp', 'tez_' + applicationId); - var tezAppLoader = this.store.find('tezApp', 'tez_' + applicationId) - .then(function(app){ - dag.set('tezApp', app); - }).catch(function(){}); - - loaders.push(appDetailLoader); - loaders.push(tezAppLoader); - - Em.RSVP.allSettled(loaders).then(function(){ - that.set('loading', false); - }); - - if (!dag.get('appContextInfo.info') && App.get('env.compatibilityMode')) { - var dagName = dag.getWithDefault('name', ''); - var hiveQueryId = dagName.replace(/([^:]*):.*/, '$1'); - if (dagName != hiveQueryId && !!hiveQueryId) { - this.store.find('hiveQuery', hiveQueryId).then(function (hiveQueryData) { - var queryInfoStr = Em.get(hiveQueryData || {}, 'query') || '{}'; - var queryInfo = $.parseJSON(queryInfoStr); - dag.set('appContextInfo', { - appType: 'Hive', - info: queryInfo['queryText'] - }); - }).catch(function (e) { - // ignore. - }); - } - } - - var allLoaders = Em.RSVP.all(loaders); - allLoaders.then(function(){ - if (dag.get('status') === 'RUNNING') { - // update the progress info if available. this need not block the UI - if (dag.get('amWebServiceVersion') == '1' || !that.get('pollingEnabled')) { - that.updateInfoFromAM(dag); - } - } - else if(dag.get('status') == 'SUCCEEDED') { - dag.set('progress', 1); - } - }); - - return allLoaders; - }, - - // called only for v1 version of am api. - updateInfoFromAM: function(dag) { - var that = this; - App.Helpers.misc.removeRecord(this.get('store'), 'dagProgress', dag.get('id')); - var aminfoLoader = this.store.find('dagProgress', dag.get('id'), { - appId: dag.get('applicationId'), - dagIdx: dag.get('idx') - }).then(function(dagProgressInfo) { - that.set('progress', dagProgressInfo.get('progress')); - }).catch(function (error) { - error.message = "Failed to fetch dagProgress. Application Master (AM) is out of reach. Either it's down, or CORS is not enabled for YARN ResourceManager."; - Em.Logger.error(error); - var err = App.Helpers.misc.formatError(error); - var msg = 'Error code: %@, message: %@'.fmt(err.errCode, err.msg); - App.Helpers.ErrorBar.getInstance().show(msg, err.details); - }); - }, - - enableAppIdLink: function() { - return !!this.get('tezApp'); - }.property('applicationId', 'tezApp'), - - childDisplayViews: [ - Ember.Object.create({title: 'DAG Details', linkTo: 'dag.index'}), - Ember.Object.create({title: 'DAG Counters', linkTo: 'dag.counters'}), - Ember.Object.create({title: 'Graphical View', linkTo: 'dag.view'}), - Ember.Object.create({title: 'All Vertices', linkTo: 'dag.vertices'}), - Ember.Object.create({title: 'All Tasks', linkTo: 'dag.tasks'}), - Ember.Object.create({title: 'All TaskAttempts', linkTo: 'dag.taskAttempts'}), - Ember.Object.create({title: 'Swimlane', linkTo: 'dag.swimlane'}) - ], - -}); http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/controllers/dag_counters_controller.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/dag_counters_controller.js b/tez-ui/src/main/webapp/app/scripts/controllers/dag_counters_controller.js deleted file mode 100644 index 59c21d5..0000000 --- a/tez-ui/src/main/webapp/app/scripts/controllers/dag_counters_controller.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.DagCountersController = App.PollingController.extend(App.Helpers.DisplayHelper, App.ModelRefreshMixin, { - controllerName: 'DagCountersController', - - pollingType: 'dagInfo', - - pollsterControl: function () { - if(this.get('status') == 'RUNNING' && - this.get('amWebServiceVersion') != '1' && - this.get('pollingEnabled') && - this.get('isActive')) { - this.get('pollster').start(); - } - else { - this.get('pollster').stop(); - } - }.observes('status', 'amWebServiceVersion', 'isActive', 'pollingEnabled'), - - pollsterOptionsObserver: function () { - var model = this.get('model'); - - this.get('pollster').setProperties( (model && model.get('status') != 'SUCCEEDED') ? { - targetRecords: [model], - options: { - appID: this.get('applicationId'), - dagID: App.Helpers.misc.getIndexFromId(this.get('id')), - counters: '*' - } - } : { - targetRecords: [], - options: null - }); - }.observes('applicationId', 'model', 'model.status', 'id'), - - applicationComplete: function () { - this.get('pollster').stop(); - this.set('pollster.polledRecords', null); - } -}); http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/controllers/dag_index_controller.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/dag_index_controller.js b/tez-ui/src/main/webapp/app/scripts/controllers/dag_index_controller.js deleted file mode 100644 index 847b6a6..0000000 --- a/tez-ui/src/main/webapp/app/scripts/controllers/dag_index_controller.js +++ /dev/null @@ -1,390 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.DagIndexController = App.TablePageController.extend({ - controllerName: 'DagIndexController', - needs: "dag", - - entityType: 'dagVertex', - filterEntityType: 'dag', - filterEntityId: Ember.computed.alias('controllers.dag.id'), - - cacheDomain: Ember.computed.alias('controllers.dag.id'), - - pollingType: 'vertexInfo', - - _isRunning: false, - _autoReloaded: false, - - init: function () { - this._super(); - this.set('pollster.mergeProperties', ['progress', 'status', 'runningTasks', 'pendingTasks', - 'sucessfulTasks', 'failedTaskAttempts', 'killedTaskAttempts']); - }, - - reset: function () { - this._super(); - this.set('data', null); - this.set('_autoReloaded', false); - }, - - _statusObserver: function () { - var rowsDisplayed, - isRunning = false; - - if(this.get('status') == 'RUNNING') { - isRunning = true; - } - else if(rowsDisplayed = this.get('rowsDisplayed')){ - rowsDisplayed.forEach(function (row) { - if(row.get('status') == 'RUNNING') { - isRunning = true; - } - }); - } - - this.set('_isRunning', isRunning); - }.observes('status', '[email protected]'), - - pollingObserver: function () { - if(this.get('pollingEnabled')) { - this.set('_autoReloaded', false); - } - }.observes('pollingEnabled'), - - pollsterControl: function () { - if(this.get('_isRunning') && - this.get('amWebServiceVersion') != '1' && - !this.get('loading') && - this.get('isActive') && - this.get('pollingEnabled') && - this.get('rowsDisplayed.length') > 0) { - this.get('pollster').start(!this.get('_autoReloaded')); - } - else { - this.get('pollster').stop(); - } - }.observes('_isRunning', 'amWebServiceVersion', 'loading', 'isActive', 'pollingEnabled', 'rowsDisplayed'), - - parentStatusObserver: function () { - var parentStatus = this.get('status'), - previousStatus = this.get('parentStatus'); - - if(parentStatus != previousStatus && previousStatus == 'RUNNING' && this.get('pollingEnabled')) { - this.get('pollster').stop(); - this.set('_autoReloaded', true); - this.loadData(true); - } - this.set('parentStatus', parentStatus); - }.observes('status'), - - applicationComplete: function () { - this.set('_autoReloaded', true); - this._super(); - if(this.get('controllers.dag.status') == 'SUCCEEDED') { - this.set('controllers.dag.progress', 1); - } - }, - - pollsterOptionsObserver: function () { - this.set('pollster.options', { - appID: this.get('applicationId'), - dagID: this.get('idx') - }); - }.observes('applicationId', 'idx').on('init'), - - progressDetails: null, - - progressObserver: function () { - var vertexInfoContent = this.get('pollster.polledRecords.content'), - progressDetails = null, - succeededTasks = null, - totalTasks = null, - completedVertices = null; - - if(vertexInfoContent && vertexInfoContent.length) { - liveData = vertexInfoContent, - succeededTasks = 0, - totalTasks = 0, - completedVertices = 0; - - liveData.forEach(function (vertex) { - succeededTasks += parseInt(vertex.get('sucessfulTasks')); - totalTasks += parseInt(vertex.get('numTasks')); - if(vertex.get('progress') >= 1) { - completedVertices++; - } - }); - - progressDetails = { - succeededTasks: succeededTasks, - completedVertices: completedVertices, - totalTasks: totalTasks - }; - } - - this.set('progressDetails', progressDetails); - }.observes('pollster.polledRecords'), - - dataObserver: function () { - var data = this.get('data.content'); - this.set('rowsDisplayed', data ? data.slice(0) : null); - }.observes('data'), - - beforeLoad: function () { - var dagController = this.get('controllers.dag'), - model = dagController.get('model'); - return model.reload().then(function () { - return dagController.loadAdditional(model); - }); - }, - - afterLoad: function () { - var data = this.get('data'), - runningVerticesIdx, - isUnsuccessfulDag = App.Helpers.misc.isStatusInUnsuccessful( - this.get('controllers.dag.status') - ); - - if(isUnsuccessfulDag) { - data.filterBy('status', 'RUNNING').forEach(function (vertex) { - vertex.set('status', 'KILLED'); - }); - } - - if (this.get('controllers.dag.amWebServiceVersion') == '1') { - this._loadProgress(data); - } - - return this._super(); - }, - - // Load progress in parallel for v1 version of the api - _loadProgress: function (vertices) { - var that = this, - runningVerticesIdx = vertices - .filterBy('status', 'RUNNING') - .map(function(item) { - return item.get('id').split('_').splice(-1).pop(); - }); - - if (runningVerticesIdx.length > 0) { - this.store.unloadAll('vertexProgress'); - this.store.findQuery('vertexProgress', { - metadata: { - appId: that.get('applicationId'), - dagIdx: that.get('idx'), - vertexIds: runningVerticesIdx.join(',') - } - }).then(function(vertexProgressInfo) { - App.Helpers.emData.mergeRecords( - that.get('rowsDisplayed'), - vertexProgressInfo, - ['progress'] - ); - }).catch(function(error) { - error.message = "Failed to fetch vertexProgress. Application Master (AM) is out of reach. Either it's down, or CORS is not enabled for YARN ResourceManager."; - Em.Logger.error(error); - var err = App.Helpers.misc.formatError(error); - var msg = 'Error code: %@, message: %@'.fmt(err.errCode, err.msg); - App.Helpers.ErrorBar.getInstance().show(msg, err.details); - }); - } - }, - - defaultColumnConfigs: function() { - var vertexIdToNameMap = this.get('vertexIdToNameMap'); - - return App.Helpers.misc.createColumnDescription([ - { - id: 'vertexName', - headerCellName: 'Vertex Name', - templateName: 'components/basic-table/linked-cell', - contentPath: 'name', - getCellContent: function(row) { - return { - linkTo: 'vertex', - entityId: row.get('id'), - displayText: vertexIdToNameMap[row.get('id')] - }; - } - }, - { - id: 'status', - headerCellName: 'Status', - templateName: 'components/basic-table/status-cell', - contentPath: 'status', - observePath: true, - getCellContent: function(row) { - var status = row.get('status'); - return { - status: status, - statusIcon: App.Helpers.misc.getStatusClassForEntity(status, - row.get('hasFailedTaskAttempts')) - }; - } - }, - { - id: 'progress', - headerCellName: 'Progress', - contentPath: 'progress', - observePath: true, - templateName: 'components/basic-table/progress-cell' - }, - { - id: 'totalTasks', - headerCellName: 'Total Tasks', - contentPath: 'numTasks', - observePath: true, - }, - { - id: 'succeededTasks', - headerCellName: 'Succeeded Tasks', - contentPath: 'sucessfulTasks', - observePath: true, - }, - { - id: 'runningTasks', - headerCellName: 'Running Tasks', - contentPath: 'runningTasks', - observePath: true, - }, - { - id: 'pendingTasks', - headerCellName: 'Pending Tasks', - contentPath: 'pendingTasks', - observePath: true, - }, - { - id: 'failedTasks', - headerCellName: 'Failed Task Attempts', - contentPath: 'failedTaskAttempts', - observePath: true, - }, - { - id: 'killedTasks', - headerCellName: 'Killed Task Attempts', - contentPath: 'killedTaskAttempts', - observePath: true, - } - ]); - }.property('vertexIdToNameMap'), - - actions: { - downloadDagJson: function() { - var dagID = this.get('id'); - var downloader = App.Helpers.misc.downloadDAG(this.get('id'), { - batchSize: 500, - onSuccess: function() { - Bootstrap.ModalManager.close('downloadModal'); - }, - onFailure: function() { - $('#modalMessage').html('<i class="fa fa-lg fa-exclamation-circle margin-small-horizontal" ' + - 'style="color:red"></i> Error downloading data'); - } - }); - this.set('tmpDownloader', downloader); - var modalDialogView = Ember.View.extend({ - template: Em.Handlebars.compile( - '<p id="modalMessage"><i class="fa fa-lg fa-spinner fa-spin margin-small-horizontal" ' + - 'style="color:green"></i>Downloading data for dag %@</p>'.fmt(dagID) - ) - }); - var buttons = [ - Ember.Object.create({title: 'Cancel', dismiss: 'modal', clicked: 'cancelDownload'}) - ]; - Bootstrap.ModalManager.open('downloadModal', 'Download data', - modalDialogView, buttons, this); - }, - - cancelDownload: function() { - var currentDownloader = this.get('tmpDownloader'); - if (!!currentDownloader) { - currentDownloader.cancel(); - } - this.set('tmpDownloader', undefined); - } - }, - - dagRunning: function () { - var progress = this.get('dagProgress'); - return progress != null && progress < 1; - }.property('dagProgress'), - - taskIconStatus: function() { - return App.Helpers.misc.getStatusClassForEntity(this.get('model.status'), - this.get('hasFailedTaskAttempts')); - }.property('id', 'model.status', 'hasFailedTaskAttempts'), - - progressStr: function() { - var pct; - if (Ember.typeOf(this.get('progress')) === 'number' && this.get('status') == 'RUNNING') { - pct = App.Helpers.number.fractionToPercentage(this.get('progress')); - } - return pct; - }.property('id', 'status', 'progress'), - - totalTasks: function() { - return App.Helpers.misc.getCounterValueForDag(this.get('counterGroups'), - this.get('id'), 'org.apache.tez.common.counters.DAGCounter', 'TOTAL_LAUNCHED_TASKS') - }.property('id', 'counterGroups'), - - sucessfulTasks: function() { - return App.Helpers.misc.getCounterValueForDag(this.get('counterGroups'), this.get('id'), - 'org.apache.tez.common.counters.DAGCounter', 'NUM_SUCCEEDED_TASKS') - }.property('id', 'counterGroups'), - - failedTasks: function() { - return App.Helpers.misc.getCounterValueForDag(this.get('counterGroups'), this.get('id'), - 'org.apache.tez.common.counters.DAGCounter', 'NUM_FAILED_TASKS') - }.property('id', 'counterGroups'), - - killedTasks: function() { - return App.Helpers.misc.getCounterValueForDag(this.get('counterGroups'), this.get('id'), - 'org.apache.tez.common.counters.DAGCounter', 'NUM_KILLED_TASKS') - }.property('id', 'counterGroups'), - - failedTasksLink: function() { - return '#/dag/%@/tasks?searchText=Status%3AFAILED'.fmt(this.get('id')); - }.property('id'), - - failedTaskAttemptsLink: function() { - return '#/dag/%@/taskAttempts?searchText=Status%3AFAILED'.fmt(this.get('id')); - }.property('id'), - - appContext: function() { - return this.get('appContextInfo.info') - }.property('appContextInfo.info'), - - appContextHeading: function() { - var appContextType = this.get('appContextInfo.appType'); - return 'Additional Info' + (!!appContextType ? ' from ' + appContextType : ''); - }.property('appContextInfo.appType'), - - appInfoContextType: function() { - switch (this.get('appContextInfo.appType')) { - case 'Hive': - return 'text/x-hive'; - case 'Pig': - return 'text/x-pig'; - default: - return 'text/x-sql'; - } - }.property('appContextInfo.appType'), - -}); http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/controllers/dag_swimlane_controller.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/dag_swimlane_controller.js b/tez-ui/src/main/webapp/app/scripts/controllers/dag_swimlane_controller.js deleted file mode 100644 index 9edb5dd..0000000 --- a/tez-ui/src/main/webapp/app/scripts/controllers/dag_swimlane_controller.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.DagSwimlaneController = Em.ArrayController.extend({ - needs: "dag", - controllerName: "DagSwimlaneController", - pageTitle: "Task Attempts", - pageSubTitle: "All Task Attempts", - dag_id: Em.computed.alias('controllers.dag.id'), - - getFilterParams: function(params) { - var dag_id = this.get('dag_id'); - var filterParams = {}; - if (dag_id) { - filterParams['primaryFilter'] = 'TEZ_DAG_ID:' + dag_id; - } - - return filterParams; - }, - - actions: { - taskAttemptClicked: function (id) { - this.transitionToRoute('taskAttempt', id); - }, - }, -}); http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/controllers/dag_tasks.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/dag_tasks.js b/tez-ui/src/main/webapp/app/scripts/controllers/dag_tasks.js deleted file mode 100644 index 2413a24..0000000 --- a/tez-ui/src/main/webapp/app/scripts/controllers/dag_tasks.js +++ /dev/null @@ -1,244 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.DagTasksController = App.TablePageController.extend({ - controllerName: 'DagTasksController', - needs: "dag", - - entityType: 'dagTask', - filterEntityType: 'dag', - filterEntityId: Ember.computed.alias('controllers.dag.id'), - - cacheDomain: Ember.computed.alias('controllers.dag.id'), - - pollingType: 'taskInfo', - - pollsterControl: function () { - if(this.get('status') == 'RUNNING' && - this.get('amWebServiceVersion') != '1' && - !this.get('loading') && - this.get('isActive') && - this.get('pollingEnabled') && - this. get('rowsDisplayed.length') > 0) { - this.get('pollster').start(); - } - else { - this.get('pollster').stop(); - } - }.observes('status', 'amWebServiceVersion', 'rowsDisplayed', 'loading', 'isActive', 'pollingEnabled'), - - pollsterOptionsObserver: function () { - this.set('pollster.options', { - appID: this.get('applicationId'), - dagID: this.get('idx'), - counters: this.get('countersDisplayed'), - taskID: this.get('rowsDisplayed').map(function (row) { - var taskIndex = App.Helpers.misc.getIndexFromId(row.get('id')), - vertexIndex = App.Helpers.misc.getIndexFromId(row.get('vertexID')); - return '%@_%@'.fmt(vertexIndex, taskIndex); - }).join(',') - }); - }.observes('applicationId', 'idx', 'rowsDisplayed'), - - countersDisplayed: function () { - return App.Helpers.misc.getCounterQueryParam(this.get('columns')); - }.property('columns'), - - beforeLoad: function () { - var dagController = this.get('controllers.dag'), - model = dagController.get('model'); - return model.reload().then(function () { - return dagController.loadAdditional(model); - }); - }, - - afterLoad: function () { - var data = this.get('data'), - isUnsuccessfulDag = App.Helpers.misc.isStatusInUnsuccessful( - this.get('controllers.dag.status') - ); - - data.forEach(function (task) { - var taskStatus = App.Helpers.misc.getFixedupDisplayStatus(task.get('status')); - - if (taskStatus == 'RUNNING' && isUnsuccessfulDag) { - taskStatus = 'KILLED' - } - if (taskStatus != task.get('status')) { - task.set('status', taskStatus); - } - }); - - return this._super(); - }, - - defaultColumnConfigs: function() { - var that = this, - vertexIdToNameMap = this.get('controllers.dag.vertexIdToNameMap') || {}; - - function getLogContent(attempt) { - var cellContent = App.Helpers.misc.constructLogLinks( - attempt, - that.get('controllers.dag.yarnAppState'), - that.get('controllers.dag.tezApp.user') - ); - - cellContent.notAvailable = cellContent.viewUrl || cellContent.downloadUrl; - return cellContent; - } - - return [ - { - id: 'id', - headerCellName: 'Task Index', - templateName: 'components/basic-table/linked-cell', - contentPath: 'id', - getCellContent: function (row) { - var id = row.get('id'), - idPrefix = 'task_%@_'.fmt(row.get('dagID').substr(4)); - return { - linkTo: 'task', - entityId: id, - displayText: id.indexOf(idPrefix) == 0 ? id.substr(idPrefix.length) : id - }; - }, - getSearchValue: function (row) { - var id = row.get('id'), - idPrefix = 'task_%@_'.fmt(row.get('dagID').substr(4)); - return id.indexOf(idPrefix) == 0 ? id.substr(idPrefix.length) : id; - } - }, - { - id: 'vertexName', - headerCellName: 'Vertex Name', - templateName: 'components/basic-table/linked-cell', - contentPath: 'vertexID', - getCellContent: function(row) { - var vertexId = row.get('vertexID') || ''; - return { - linkTo: 'vertex', - displayText: vertexIdToNameMap[vertexId] || vertexId, - entityId: vertexId - }; - }, - getSearchValue: function(row) { - var vertexId = row.get('vertexID'); - return vertexIdToNameMap[vertexId] || vertexId; - }, - getSortValue: function(row) { - var vertexId = row.get('vertexID'); - return vertexIdToNameMap[vertexId] || vertexId; - } - }, - { - id: 'status', - headerCellName: 'Status', - templateName: 'components/basic-table/status-cell', - contentPath: 'status', - observePath: true, - onSort: this.onInProgressColumnSort.bind(this), - getCellContent: function(row) { - var status = row.get('status'); - return { - status: status, - statusIcon: App.Helpers.misc.getStatusClassForEntity(status, - row.get('hasFailedTaskAttempts')) - }; - } - }, - { - id: 'progress', - headerCellName: 'Progress', - contentPath: 'progress', - observePath: true, - onSort: this.onInProgressColumnSort.bind(this), - templateName: 'components/basic-table/progress-cell' - }, - { - id: 'startTime', - headerCellName: 'Start Time', - contentPath: 'startTime', - getCellContent: function(row) { - return App.Helpers.date.dateFormat(row.get('startTime')); - }, - getSearchValue: function(row) { - return App.Helpers.date.dateFormat(row.get('startTime')); - } - }, - { - id: 'endTime', - headerCellName: 'End Time', - contentPath: 'endTime', - getCellContent: function(row) { - return App.Helpers.date.dateFormat(row.get('endTime')); - }, - getSearchValue: function(row) { - return App.Helpers.date.dateFormat(row.get('endTime')); - }, - }, - { - id: 'duration', - headerCellName: 'Duration', - contentPath: 'duration', - getCellContent: function(row) { - return App.Helpers.date.timingFormat(row.get('duration'), 1); - }, - getSearchValue: function(row) { - return App.Helpers.date.timingFormat(row.get('duration'), 1); - }, - }, - { - id: 'actions', - headerCellName: 'Actions', - templateName: 'components/basic-table/task-actions-cell', - contentPath: 'id', - searchAndSortable: false - }, - { - id: 'logs', - headerCellName: 'Logs', - templateName: 'components/basic-table/logs-cell', - searchAndSortable: false, - getCellContent: function(row) { - var taskAttemptId = row.get('successfulAttemptId') || row.get('attempts.lastObject'), - store = that.get('store'); - - if (taskAttemptId) { - return store.find('taskAttempt', taskAttemptId).then(getLogContent); - } - } - } - ]; - }.property( - 'controllers.dag.vertexIdToNameMap', - 'controllers.dag.yarnAppState', - 'controllers.dag.tezApp.user' - ), - - columnConfigs: function() { - return this.get('defaultColumnConfigs').concat( - App.Helpers.misc.normalizeCounterConfigs( - App.get('Configs.defaultCounters').concat( - App.get('Configs.tables.entity.task') || [], - App.get('Configs.tables.sharedColumns') || [] - ) - , this) - ); - }.property('defaultColumnConfigs'), - -}); http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/scripts/controllers/dag_vertices.js ---------------------------------------------------------------------- diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/dag_vertices.js b/tez-ui/src/main/webapp/app/scripts/controllers/dag_vertices.js deleted file mode 100644 index 2f5e8e3..0000000 --- a/tez-ui/src/main/webapp/app/scripts/controllers/dag_vertices.js +++ /dev/null @@ -1,265 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -App.DagVerticesController = App.TablePageController.extend({ - controllerName: 'DagVerticesController', - needs: "dag", - - entityType: 'dagVertex', - filterEntityType: 'dag', - filterEntityId: Ember.computed.alias('controllers.dag.id'), - - cacheDomain: Ember.computed.alias('controllers.dag.id'), - - pollingType: 'vertexInfo', - - pollsterControl: function () { - - if(this.get('status') == 'RUNNING' && - this.get('amWebServiceVersion') != '1' && - !this.get('loading') && - this.get('isActive') && - this.get('pollingEnabled') && - this. get('rowsDisplayed.length') > 0) { - this.get('pollster').start(); - } - else { - this.get('pollster').stop(); - } - }.observes('status', 'amWebServiceVersion', 'rowsDisplayed', 'loading', 'isActive', 'pollingEnabled'), - - pollsterOptionsObserver: function () { - this.set('pollster.options', { - appID: this.get('applicationId'), - dagID: this.get('idx'), - counters: this.get('countersDisplayed'), - vertexID: this.get('rowsDisplayed').map(function (row) { - return App.Helpers.misc.getIndexFromId(row.get('id')); - }).join(',') - }); - }.observes('applicationId', 'idx', 'rowsDisplayed'), - - countersDisplayed: function () { - return App.Helpers.misc.getCounterQueryParam(this.get('columns')); - }.property('columns'), - - beforeLoad: function () { - var dagController = this.get('controllers.dag'), - model = dagController.get('model'); - return model.reload().then(function () { - return dagController.loadAdditional(model); - }); - }, - - afterLoad: function () { - var data = this.get('data'), - runningVerticesIdx, - isUnsuccessfulDag = App.Helpers.misc.isStatusInUnsuccessful( - this.get('controllers.dag.status') - ); - - if(isUnsuccessfulDag) { - data.filterBy('status', 'RUNNING').forEach(function (vertex) { - vertex.set('status', 'KILLED'); - }); - } - - if (this.get('controllers.dag.amWebServiceVersion') == '1') { - this._loadProgress(data); - } - - return this._super(); - }, - - // Load progress in parallel for v1 version of the api - _loadProgress: function (vertices) { - var that = this, - runningVerticesIdx = vertices - .filterBy('status', 'RUNNING') - .map(function(item) { - return item.get('id').split('_').splice(-1).pop(); - }); - - if (runningVerticesIdx.length > 0) { - this.store.unloadAll('vertexProgress'); - this.store.findQuery('vertexProgress', { - metadata: { - appId: that.get('applicationId'), - dagIdx: that.get('idx'), - vertexIds: runningVerticesIdx.join(',') - } - }).then(function(vertexProgressInfo) { - App.Helpers.emData.mergeRecords( - that.get('rowsDisplayed'), - vertexProgressInfo, - ['progress'] - ); - }).catch(function(error) { - error.message = "Failed to fetch vertexProgress. Application Master (AM) is out of reach. Either it's down, or CORS is not enabled for YARN ResourceManager."; - Em.Logger.error(error); - var err = App.Helpers.misc.formatError(error); - var msg = 'Error code: %@, message: %@'.fmt(err.errCode, err.msg); - App.Helpers.ErrorBar.getInstance().show(msg, err.details); - }); - } - }, - - defaultColumnConfigs: function() { - function onProgressChange() { - var progress = this.get('vertex.progress'), - pct, - status; - status = this.get('vertex.status'); - if (Ember.typeOf(progress) === 'number' && status == 'RUNNING') { - pct = App.Helpers.number.fractionToPercentage(progress); - } - this.setProperties({ - progress: pct, - status: status, - statusIcon: App.Helpers.misc.getStatusClassForEntity(status, - this.get('vertex.hasFailedTaskAttempts')) - }); - } - - return [ - { - id: 'vertexName', - headerCellName: 'Vertex Name', - templateName: 'components/basic-table/linked-cell', - contentPath: 'name', - getCellContent: function(row) { - return { - linkTo: 'vertex', - entityId: row.get('id'), - displayText: row.get('name') - }; - } - }, - { - id: 'id', - headerCellName: 'Vertex ID', - contentPath: 'id', - }, - { - id: 'status', - headerCellName: 'Status', - templateName: 'components/basic-table/status-cell', - contentPath: 'status', - observePath: true, - getCellContent: function(row) { - var status = row.get('status'); - return { - status: status, - statusIcon: App.Helpers.misc.getStatusClassForEntity(status) - }; - } - }, - { - id: 'progress', - headerCellName: 'Progress', - contentPath: 'progress', - observePath: true, - templateName: 'components/basic-table/progress-cell' - }, - { - id: 'startTime', - headerCellName: 'Start Time', - contentPath: 'startTime', - getCellContent: function(row) { - return App.Helpers.date.dateFormat(row.get('startTime')); - }, - getSearchValue: function(row) { - return App.Helpers.date.dateFormat(row.get('startTime')); - } - }, - { - id: 'endTime', - headerCellName: 'End Time', - contentPath: 'endTime', - getCellContent: function(row) { - return App.Helpers.date.dateFormat(row.get('endTime')); - }, - getSearchValue: function(row) { - return App.Helpers.date.dateFormat(row.get('endTime')); - }, - }, - { - id: 'duration', - headerCellName: 'Duration', - contentPath: 'duration', - getCellContent: function(row) { - return App.Helpers.date.timingFormat(row.get('duration'), 1); - }, - getSearchValue: function(row) { - return App.Helpers.date.timingFormat(row.get('duration'), 1); - } - }, - { - id: 'firstTaskStartTime', - headerCellName: 'First Task Start Time', - contentPath: 'firstTaskStartTime', - getCellContent: function(row) { - return App.Helpers.date.dateFormat(row.get('firstTaskStartTime')); - }, - getSearchValue: function(row) { - return App.Helpers.date.dateFormat(row.get('firstTaskStartTime')); - } - }, - { - id: 'tasks', - headerCellName: 'Tasks', - contentPath: 'numTasks' - }, - { - id: 'processorClass', - headerCellName: 'Processor Class', - contentPath: 'processorClassName' - }, - { - id: 'configurations', - headerCellName: 'Source/Sink Configs', - templateName: 'components/basic-table/vertex-configurations-cell', - searchAndSortable: false, - getCellContent: function(row) { - var firstInputId = row.get('inputs.content.0.id'), - firstOutputId = row.get('outputs.content.0.id'); - return { - linkToAdditionals: row.get('inputs.content.length') > 1 || - row.get('outputs.content.length') > 1 || - (firstInputId != undefined && firstOutputId != undefined), - inputId: firstInputId, - outputId: firstOutputId, - vertexId: row.get('id') - }; - } - } - ]; - }.property(), - - columnConfigs: function() { - return this.get('defaultColumnConfigs').concat( - App.Helpers.misc.normalizeCounterConfigs( - App.get('Configs.defaultCounters').concat( - App.get('Configs.tables.entity.vertex') || [], - App.get('Configs.tables.sharedColumns') || [] - ) - ) - ); - }.property('defaultColumnConfigs'), - -});
