From fb6162f9f00a5b2069a9e117a3511242ee08e72d Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Wed, 23 Mar 2016 20:01:31 -0400 Subject: [PATCH 01/13] Fix deprecated `{{#each x in y}}` usage --- tests/unit/components/ivy-tabs-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/components/ivy-tabs-test.js b/tests/unit/components/ivy-tabs-test.js index 8e14cb6f..ceefa516 100644 --- a/tests/unit/components/ivy-tabs-test.js +++ b/tests/unit/components/ivy-tabs-test.js @@ -99,11 +99,11 @@ test('deselected panel attributes', function(assert) { var eachTemplate = '{{#ivy-tabs selected-index=selectedIndex}}' + ' {{#ivy-tab-list}}' + - ' {{#each item in items}}' + + ' {{#each items as |item|}}' + ' {{#ivy-tab}}{{item}}{{/ivy-tab}}' + ' {{/each}}' + ' {{/ivy-tab-list}}' + - ' {{#each item in items}}' + + ' {{#each items as |item|}}' + ' {{#ivy-tab-panel}}{{item}}{{/ivy-tab-panel}}' + ' {{/each}}' + '{{/ivy-tabs}}'; From 0d08f9e99eba0bdd29f319f61e868743d05299ec Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Wed, 23 Mar 2016 21:25:49 -0400 Subject: [PATCH 02/13] Use `htmlbars-inline-precompile` --- ember-cli-build.js | 4 --- tests/unit/components/ivy-tabs-test.js | 43 ++++++++++++++------------ 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/ember-cli-build.js b/ember-cli-build.js index 9f28b983..4695258c 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -16,10 +16,6 @@ module.exports = function(defaults) { behave. You most likely want to be modifying `./index.js` or app's build file */ - app.import(path.join(app.bowerDirectory, 'ember/ember-template-compiler.js'), { - type: 'test' - }); - var bootstrapTree = new Funnel(path.join(app.bowerDirectory, 'bootstrap/dist/css'), { destDir: '/assets' }); diff --git a/tests/unit/components/ivy-tabs-test.js b/tests/unit/components/ivy-tabs-test.js index ceefa516..21e1e431 100644 --- a/tests/unit/components/ivy-tabs-test.js +++ b/tests/unit/components/ivy-tabs-test.js @@ -1,19 +1,21 @@ import Ember from 'ember'; +import hbs from 'htmlbars-inline-precompile'; import { moduleForComponent, test } from 'ember-qunit'; moduleForComponent('ivy-tabs', { integration: true }); -var basicTemplate = - '{{#ivy-tabs selected-index=selectedIndex}}' + - ' {{#ivy-tab-list id="tablist"}}' + - ' {{#ivy-tab id="tab1"}}tab 1{{/ivy-tab}}' + - ' {{#ivy-tab id="tab2"}}tab 2{{/ivy-tab}}' + - ' {{/ivy-tab-list}}' + - ' {{#ivy-tab-panel id="panel1"}}panel 1{{/ivy-tab-panel}}' + - ' {{#ivy-tab-panel id="panel2"}}panel 2{{/ivy-tab-panel}}' + - '{{/ivy-tabs}}'; +var basicTemplate = hbs` + {{#ivy-tabs selected-index=selectedIndex}} + {{#ivy-tab-list id="tablist"}} + {{#ivy-tab id="tab1"}}tab 1{{/ivy-tab}} + {{#ivy-tab id="tab2"}}tab 2{{/ivy-tab}} + {{/ivy-tab-list}} + {{#ivy-tab-panel id="panel1"}}panel 1{{/ivy-tab-panel}} + {{#ivy-tab-panel id="panel2"}}panel 2{{/ivy-tab-panel}} + {{/ivy-tabs}} +`; test('selects first tab by default', function(assert) { this.render(basicTemplate); @@ -96,17 +98,18 @@ test('deselected panel attributes', function(assert) { assert.ok(!panel.is(':visible'), 'is not visible'); }); -var eachTemplate = - '{{#ivy-tabs selected-index=selectedIndex}}' + - ' {{#ivy-tab-list}}' + - ' {{#each items as |item|}}' + - ' {{#ivy-tab}}{{item}}{{/ivy-tab}}' + - ' {{/each}}' + - ' {{/ivy-tab-list}}' + - ' {{#each items as |item|}}' + - ' {{#ivy-tab-panel}}{{item}}{{/ivy-tab-panel}}' + - ' {{/each}}' + - '{{/ivy-tabs}}'; +var eachTemplate = hbs` + {{#ivy-tabs selected-index=selectedIndex}} + {{#ivy-tab-list}} + {{#each items as |item|}} + {{#ivy-tab}}{{item}}{{/ivy-tab}} + {{/each}} + {{/ivy-tab-list}} + {{#each items as |item|}} + {{#ivy-tab-panel}}{{item}}{{/ivy-tab-panel}} + {{/each}} + {{/ivy-tabs}} +`; test('selects previous tab if active tab is removed', function(assert) { this.set('selectedIndex', 1); From 48645f67655de25100297b557055fffbe022194c Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Wed, 23 Mar 2016 21:26:53 -0400 Subject: [PATCH 03/13] Move tests to `tests/integration` --- tests/{unit => integration}/components/ivy-tabs-test.js | 0 tests/unit/.gitkeep | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/{unit => integration}/components/ivy-tabs-test.js (100%) delete mode 100644 tests/unit/.gitkeep diff --git a/tests/unit/components/ivy-tabs-test.js b/tests/integration/components/ivy-tabs-test.js similarity index 100% rename from tests/unit/components/ivy-tabs-test.js rename to tests/integration/components/ivy-tabs-test.js diff --git a/tests/unit/.gitkeep b/tests/unit/.gitkeep deleted file mode 100644 index e69de29b..00000000 From f3898f9ed5ad79e213098f8f0e6adda3aa25d6ed Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Wed, 23 Mar 2016 21:31:36 -0400 Subject: [PATCH 04/13] Simplify build, remove `broccoli-funnel` --- ember-cli-build.js | 10 +++------- package.json | 1 - tests/dummy/app/index.html | 1 - 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/ember-cli-build.js b/ember-cli-build.js index 4695258c..cf0f9096 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -1,8 +1,6 @@ /*jshint node:true*/ /* global require, module */ var EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); -var Funnel = require('broccoli-funnel'); -var path = require('path'); module.exports = function(defaults) { var app = new EmberAddon(defaults, { @@ -15,10 +13,8 @@ module.exports = function(defaults) { This build file does *not* influence how the addon or the app using it behave. You most likely want to be modifying `./index.js` or app's build file */ + app.import('bower_components/bootstrap/dist/css/bootstrap.css'); + app.import('bower_components/bootstrap/dist/css/bootstrap.css.map'); - var bootstrapTree = new Funnel(path.join(app.bowerDirectory, 'bootstrap/dist/css'), { - destDir: '/assets' - }); - - return app.toTree([bootstrapTree]); + return app.toTree(); }; diff --git a/package.json b/package.json index c5609632..dfb8c82b 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,6 @@ }, "devDependencies": { "broccoli-asset-rev": "^2.2.0", - "broccoli-funnel": "^1.0.0", "ember-cli": "1.13.13", "ember-cli-app-version": "^1.0.0", "ember-cli-content-security-policy": "0.4.0", diff --git a/tests/dummy/app/index.html b/tests/dummy/app/index.html index 54cce3c8..4c77fb25 100644 --- a/tests/dummy/app/index.html +++ b/tests/dummy/app/index.html @@ -10,7 +10,6 @@ {{content-for 'head'}} - {{content-for 'head-footer'}} From 477d87d59d24f7f08c1078674a1d7b23b251a259 Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Wed, 23 Mar 2016 21:33:38 -0400 Subject: [PATCH 05/13] Replace `var` with `const` / `let` --- addon/components/ivy-tab-list.js | 6 ++--- addon/components/ivy-tab-panel.js | 2 +- addon/components/ivy-tabs.js | 2 +- tests/integration/components/ivy-tabs-test.js | 22 +++++++++---------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/addon/components/ivy-tab-list.js b/addon/components/ivy-tab-list.js index 28c4c25a..2c96186c 100644 --- a/addon/components/ivy-tab-list.js +++ b/addon/components/ivy-tab-list.js @@ -95,7 +95,7 @@ export default Ember.Component.extend({ * @method selectNextTab */ selectNextTab: function() { - var index = this.get('selected-index') + 1; + let index = this.get('selected-index') + 1; if (index === this.get('tabs.length')) { index = 0; } this.selectTabByIndex(index); }, @@ -106,7 +106,7 @@ export default Ember.Component.extend({ * @method selectPreviousTab */ selectPreviousTab: function() { - var index = this.get('selected-index') - 1; + let index = this.get('selected-index') - 1; // Previous from the first tab should select the last tab. if (index < 0) { index = this.get('tabs.length') - 1; } @@ -164,7 +164,7 @@ export default Ember.Component.extend({ * @param {IvyTabs.IvyTabComponent} tab */ unregisterTab: function(tab) { - var index = tab.get('index'); + const index = tab.get('index'); this.get('tabs').removeObject(tab); if (index < this.get('selected-index')) { diff --git a/addon/components/ivy-tab-panel.js b/addon/components/ivy-tab-panel.js index e989066c..a04c5792 100644 --- a/addon/components/ivy-tab-panel.js +++ b/addon/components/ivy-tab-panel.js @@ -102,7 +102,7 @@ export default Ember.Component.extend({ * @type IvyTabs.IvyTabComponent */ tab: Ember.computed(function() { - var tabs = this.get('tabs'); + const tabs = this.get('tabs'); if (tabs) { return tabs.objectAt(this.get('index')); } }).property('tabs.[]', 'index'), diff --git a/addon/components/ivy-tabs.js b/addon/components/ivy-tabs.js index 8bee516e..e6e2f6f9 100644 --- a/addon/components/ivy-tabs.js +++ b/addon/components/ivy-tabs.js @@ -74,7 +74,7 @@ export default Ember.Component.extend({ }, _selectTabByIndex: function() { - var selectedIndex = this.get('selected-index'); + let selectedIndex = this.get('selected-index'); if (Ember.isNone(selectedIndex)) { selectedIndex = 0; } this.get('tabList').selectTabByIndex(selectedIndex); } diff --git a/tests/integration/components/ivy-tabs-test.js b/tests/integration/components/ivy-tabs-test.js index 21e1e431..1e86a393 100644 --- a/tests/integration/components/ivy-tabs-test.js +++ b/tests/integration/components/ivy-tabs-test.js @@ -6,7 +6,7 @@ moduleForComponent('ivy-tabs', { integration: true }); -var basicTemplate = hbs` +const basicTemplate = hbs` {{#ivy-tabs selected-index=selectedIndex}} {{#ivy-tab-list id="tablist"}} {{#ivy-tab id="tab1"}}tab 1{{/ivy-tab}} @@ -47,15 +47,15 @@ test('selects tab on touchEnd', function(assert) { test('WAI-ARIA attributes', function(assert) { this.render(basicTemplate); - var tablist = this.$('#tablist'); + const tablist = this.$('#tablist'); assert.equal(tablist.attr('aria-multiselectable'), 'false', 'tablist: aria-multiselectable'); assert.equal(tablist.attr('role'), 'tablist', 'tablist: role'); - var tab = this.$('#tab1'); + const tab = this.$('#tab1'); assert.equal(tab.attr('role'), 'tab', 'tab1: role'); assert.equal(tab.attr('aria-controls'), 'panel1', 'tab1: aria-controls'); - var tabpanel = this.$('#panel1'); + const tabpanel = this.$('#panel1'); assert.equal(tabpanel.attr('role'), 'tabpanel', 'panel1: role'); assert.equal(tabpanel.attr('aria-labelledby'), 'tab1', 'panel1: aria-labelledby'); }); @@ -63,7 +63,7 @@ test('WAI-ARIA attributes', function(assert) { test('selected tab attributes', function(assert) { this.render(basicTemplate); - var tab = this.$('#tab1'); + const tab = this.$('#tab1'); assert.ok(tab.hasClass('active'), 'has "active" class'); assert.equal(tab.attr('selected'), 'selected', 'selected'); assert.equal(tab.attr('aria-selected'), 'true', 'aria-selected'); @@ -74,7 +74,7 @@ test('selected tab attributes', function(assert) { test('selected panel attributes', function(assert) { this.render(basicTemplate); - var panel = this.$('#panel1'); + const panel = this.$('#panel1'); assert.ok(panel.hasClass('active'), 'has "active" class'); assert.ok(panel.is(':visible'), 'is visible'); }); @@ -82,7 +82,7 @@ test('selected panel attributes', function(assert) { test('deselected tab attributes', function(assert) { this.render(basicTemplate); - var tab = this.$('#tab2'); + const tab = this.$('#tab2'); assert.ok(!tab.hasClass('active'), 'does not have "active" class'); assert.equal(tab.attr('selected'), undefined, 'selected'); assert.equal(tab.attr('aria-selected'), 'false', 'aria-selected'); @@ -93,12 +93,12 @@ test('deselected tab attributes', function(assert) { test('deselected panel attributes', function(assert) { this.render(basicTemplate); - var panel = this.$('#panel2'); + const panel = this.$('#panel2'); assert.ok(!panel.hasClass('active'), 'does not have "active" class'); assert.ok(!panel.is(':visible'), 'is not visible'); }); -var eachTemplate = hbs` +const eachTemplate = hbs` {{#ivy-tabs selected-index=selectedIndex}} {{#ivy-tab-list}} {{#each items as |item|}} @@ -162,8 +162,8 @@ test('selects the next tab when an active, first tab is removed', function(asser test('arrow keys navigate between tabs', function(assert) { this.render(basicTemplate); - var tab1 = this.$('#tab1'); - var tab2 = this.$('#tab2'); + const tab1 = this.$('#tab1'); + const tab2 = this.$('#tab2'); Ember.run(tab1, 'trigger', Ember.$.Event('keydown', { keyCode: 37 })); assert.equal(this.get('selectedIndex'), 1, 'left arrow - tab2 is selected'); From 903222cd98bdab826fd729a6fca1bc2321b291f7 Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Wed, 23 Mar 2016 21:48:45 -0400 Subject: [PATCH 06/13] Remove index file This was only being used by the (now removed) standalone builds. --- addon/index.js | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 addon/index.js diff --git a/addon/index.js b/addon/index.js deleted file mode 100644 index 1c2daedd..00000000 --- a/addon/index.js +++ /dev/null @@ -1,11 +0,0 @@ -import IvyTabComponent from './components/ivy-tab'; -import IvyTabListComponent from './components/ivy-tab-list'; -import IvyTabPanelComponent from './components/ivy-tab-panel'; -import IvyTabsComponent from './components/ivy-tabs'; - -export { - IvyTabComponent, - IvyTabListComponent, - IvyTabPanelComponent, - IvyTabsComponent -}; From 23d850dd02df4c485d15e746c0bdd388571d5755 Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Thu, 24 Mar 2016 12:03:07 -0400 Subject: [PATCH 07/13] Use block params instead of `parentView` The `parentView` property is slated to be removed, and doesn't appear to work properly in Ember 1.13. This change fixes that. Ideally we'll be able to use Ember 2.3's contextual components feature to make this even nicer. --- README.md | 28 ++++++++----------- addon/components/ivy-tab-list.js | 5 +++- addon/components/ivy-tab-panel.js | 2 +- addon/components/ivy-tab.js | 2 +- addon/components/ivy-tabs.js | 3 ++ addon/templates/components/ivy-tab-list.hbs | 1 + addon/templates/components/ivy-tabs.hbs | 1 + package.json | 4 +-- tests/integration/components/ivy-tabs-test.js | 20 ++++++------- 9 files changed, 35 insertions(+), 31 deletions(-) create mode 100644 addon/templates/components/ivy-tab-list.hbs create mode 100644 addon/templates/components/ivy-tabs.hbs diff --git a/README.md b/README.md index 78ec5c33..983c4777 100644 --- a/README.md +++ b/README.md @@ -8,33 +8,29 @@ Special thanks to [ic-tabs], which this addon is based on. ## Installation -### As an Ember CLI addon - -Use this addon in your ember-cli application: - ```sh -npm install --save-dev IvyApp/ivy-tabs +$ ember install ivy-tabs ``` ## Usage ```handlebars -{{#ivy-tabs}} - {{#ivy-tab-list}} - {{#ivy-tab}}Foo{{/ivy-tab}} - {{#ivy-tab}}Bar{{/ivy-tab}} - {{#ivy-tab}}Baz{{/ivy-tab}} +{{#ivy-tabs as |tabsContainer|}} + {{#ivy-tab-list tabsContainer=tabsContainer as |tabList|}} + {{#ivy-tab tabList=tabList}}Foo{{/ivy-tab}} + {{#ivy-tab tabList=tabList}}Bar{{/ivy-tab}} + {{#ivy-tab tabList=tabList}}Baz{{/ivy-tab}} {{/ivy-tab-list}} - {{#ivy-tab-panel}} + {{#ivy-tab-panel tabsContainer=tabsContainer}}

Foo

{{/ivy-tab-panel}} - {{#ivy-tab-panel}} + {{#ivy-tab-panel tabsContainer=tabsContainer}}

Bar

{{/ivy-tab-panel}} - {{#ivy-tab-panel}} + {{#ivy-tab-panel tabsContainer=tabsContainer}}

Baz

{{/ivy-tab-panel}} {{/ivy-tabs}} @@ -43,9 +39,9 @@ npm install --save-dev IvyApp/ivy-tabs Some things to note: * Associations between tabs and tab-panes are inferred by order. - * `ivy-tab-list` must be an immediate child of `ivy-tabs`. - * `ivy-tab` must be an immediate child of `ivy-tab-list`. - * `ivy-tab-panel` must be an immediate child of `ivy-tabs`. + * Both `ivy-tabs` and `ivy-tab-list` yield themselves as a parameter, which + should be passed down to their children as `tabsContainer` and `tabList`, + respectively. ## Contributing diff --git a/addon/components/ivy-tab-list.js b/addon/components/ivy-tab-list.js index 2c96186c..81c13b44 100644 --- a/addon/components/ivy-tab-list.js +++ b/addon/components/ivy-tab-list.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import layout from '../templates/components/ivy-tab-list'; /** * @module ivy-tabs @@ -10,6 +11,8 @@ import Ember from 'ember'; * @extends Ember.Component */ export default Ember.Component.extend({ + layout: layout, + tagName: 'ul', attributeBindings: ['aria-multiselectable', 'role'], classNames: ['ivy-tab-list'], @@ -155,7 +158,7 @@ export default Ember.Component.extend({ * @type IvyTabs.IvyTabsComponent * @readOnly */ - tabsContainer: Ember.computed.alias('parentView').readOnly(), + tabsContainer: Ember.computed.oneWay('parentView'), /** * Removes a tab from the `tabs` array. diff --git a/addon/components/ivy-tab-panel.js b/addon/components/ivy-tab-panel.js index a04c5792..77a08ee0 100644 --- a/addon/components/ivy-tab-panel.js +++ b/addon/components/ivy-tab-panel.js @@ -141,7 +141,7 @@ export default Ember.Component.extend({ * @type IvyTabs.IvyTabsComponent * @readOnly */ - tabsContainer: Ember.computed.alias('parentView').readOnly(), + tabsContainer: Ember.computed.oneWay('parentView'), _registerWithTabsContainer: function() { this.get('tabsContainer').registerTabPanel(this); diff --git a/addon/components/ivy-tab.js b/addon/components/ivy-tab.js index d21d1487..b5eadd12 100644 --- a/addon/components/ivy-tab.js +++ b/addon/components/ivy-tab.js @@ -151,7 +151,7 @@ export default Ember.Component.extend({ * @type IvyTabs.IvyTabListComponent * @readOnly */ - tabList: Ember.computed.alias('parentView').readOnly(), + tabList: Ember.computed.oneWay('parentView'), /** * The `ivy-tab-panel` associated with this tab. diff --git a/addon/components/ivy-tabs.js b/addon/components/ivy-tabs.js index e6e2f6f9..978f896b 100644 --- a/addon/components/ivy-tabs.js +++ b/addon/components/ivy-tabs.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import layout from '../templates/components/ivy-tabs'; /** * @module ivy-tabs @@ -10,6 +11,8 @@ import Ember from 'ember'; * @extends Ember.Component */ export default Ember.Component.extend({ + layout: layout, + classNames: ['ivy-tabs'], init: function() { diff --git a/addon/templates/components/ivy-tab-list.hbs b/addon/templates/components/ivy-tab-list.hbs new file mode 100644 index 00000000..f4a0b592 --- /dev/null +++ b/addon/templates/components/ivy-tab-list.hbs @@ -0,0 +1 @@ +{{yield this}} diff --git a/addon/templates/components/ivy-tabs.hbs b/addon/templates/components/ivy-tabs.hbs new file mode 100644 index 00000000..f4a0b592 --- /dev/null +++ b/addon/templates/components/ivy-tabs.hbs @@ -0,0 +1 @@ +{{yield this}} diff --git a/package.json b/package.json index dfb8c82b..1ad155d4 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "ember-cli-app-version": "^1.0.0", "ember-cli-content-security-policy": "0.4.0", "ember-cli-dependency-checker": "^1.1.0", - "ember-cli-htmlbars": "^1.0.1", "ember-cli-htmlbars-inline-precompile": "^0.3.1", "ember-cli-ic-ajax": "0.2.4", "ember-cli-inject-live-reload": "^1.3.1", @@ -45,7 +44,8 @@ "tabs" ], "dependencies": { - "ember-cli-babel": "^5.1.5" + "ember-cli-babel": "^5.1.5", + "ember-cli-htmlbars": "^1.0.1" }, "ember-addon": { "configPath": "tests/dummy/config" diff --git a/tests/integration/components/ivy-tabs-test.js b/tests/integration/components/ivy-tabs-test.js index 1e86a393..f6abe611 100644 --- a/tests/integration/components/ivy-tabs-test.js +++ b/tests/integration/components/ivy-tabs-test.js @@ -7,13 +7,13 @@ moduleForComponent('ivy-tabs', { }); const basicTemplate = hbs` - {{#ivy-tabs selected-index=selectedIndex}} - {{#ivy-tab-list id="tablist"}} - {{#ivy-tab id="tab1"}}tab 1{{/ivy-tab}} - {{#ivy-tab id="tab2"}}tab 2{{/ivy-tab}} + {{#ivy-tabs selected-index=selectedIndex as |tabsContainer|}} + {{#ivy-tab-list id="tablist" tabsContainer=tabsContainer as |tabList|}} + {{#ivy-tab id="tab1" tabList=tabList}}tab 1{{/ivy-tab}} + {{#ivy-tab id="tab2" tabList=tabList}}tab 2{{/ivy-tab}} {{/ivy-tab-list}} - {{#ivy-tab-panel id="panel1"}}panel 1{{/ivy-tab-panel}} - {{#ivy-tab-panel id="panel2"}}panel 2{{/ivy-tab-panel}} + {{#ivy-tab-panel id="panel1" tabsContainer=tabsContainer}}panel 1{{/ivy-tab-panel}} + {{#ivy-tab-panel id="panel2" tabsContainer=tabsContainer}}panel 2{{/ivy-tab-panel}} {{/ivy-tabs}} `; @@ -99,14 +99,14 @@ test('deselected panel attributes', function(assert) { }); const eachTemplate = hbs` - {{#ivy-tabs selected-index=selectedIndex}} - {{#ivy-tab-list}} + {{#ivy-tabs selected-index=selectedIndex as |tabsContainer|}} + {{#ivy-tab-list tabsContainer=tabsContainer as |tabList|}} {{#each items as |item|}} - {{#ivy-tab}}{{item}}{{/ivy-tab}} + {{#ivy-tab tabList=tabList}}{{item}}{{/ivy-tab}} {{/each}} {{/ivy-tab-list}} {{#each items as |item|}} - {{#ivy-tab-panel}}{{item}}{{/ivy-tab-panel}} + {{#ivy-tab-panel tabsContainer=tabsContainer}}{{item}}{{/ivy-tab-panel}} {{/each}} {{/ivy-tabs}} `; From faba37c3940d6b350dee813ef2f80284a21ed371 Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Thu, 24 Mar 2016 12:57:53 -0400 Subject: [PATCH 08/13] Remove unnecessary `init` hooks --- addon/components/ivy-tab-list.js | 8 ++++---- addon/components/ivy-tabs.js | 13 ++++--------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/addon/components/ivy-tab-list.js b/addon/components/ivy-tab-list.js index 81c13b44..0b5d9c83 100644 --- a/addon/components/ivy-tab-list.js +++ b/addon/components/ivy-tab-list.js @@ -151,6 +151,10 @@ export default Ember.Component.extend({ this.set('selected-index', index); }, + tabs: Ember.computed(function() { + return Ember.A(); + }).readOnly(), + /** * The `ivy-tabs` component. * @@ -179,10 +183,6 @@ export default Ember.Component.extend({ } }, - _initTabs: Ember.on('init', function() { - this.set('tabs', Ember.A()); - }), - _registerWithTabsContainer: function() { this.get('tabsContainer').registerTabList(this); }, diff --git a/addon/components/ivy-tabs.js b/addon/components/ivy-tabs.js index 978f896b..8ab8a010 100644 --- a/addon/components/ivy-tabs.js +++ b/addon/components/ivy-tabs.js @@ -15,11 +15,6 @@ export default Ember.Component.extend({ classNames: ['ivy-tabs'], - init: function() { - this._super(); - this._initTabPanels(); - }, - /** * Set this to the index of the tab you'd like to be selected. Usually it is * bound to a controller property that is used as a query parameter, but can @@ -52,6 +47,10 @@ export default Ember.Component.extend({ this.get('tabPanels').pushObject(tabPanel); }, + tabPanels: Ember.computed(function() { + return Ember.A(); + }).readOnly(), + /** * Removes the `ivy-tab-list` component. * @@ -72,10 +71,6 @@ export default Ember.Component.extend({ this.get('tabPanels').removeObject(tabPanel); }, - _initTabPanels: function() { - this.set('tabPanels', Ember.A()); - }, - _selectTabByIndex: function() { let selectedIndex = this.get('selected-index'); if (Ember.isNone(selectedIndex)) { selectedIndex = 0; } From e4ad353da4793493d007ac2b411f622bca9699de Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Thu, 24 Mar 2016 13:13:47 -0400 Subject: [PATCH 09/13] Use ES6 shorthand method syntax --- addon/components/ivy-tab-list.js | 22 +++++++++++----------- addon/components/ivy-tab-panel.js | 8 ++++---- addon/components/ivy-tab.js | 8 ++++---- addon/components/ivy-tabs.js | 10 +++++----- tests/dummy/app/components/ivy-tab.js | 2 +- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/addon/components/ivy-tab-list.js b/addon/components/ivy-tab-list.js index 0b5d9c83..ba1eadce 100644 --- a/addon/components/ivy-tab-list.js +++ b/addon/components/ivy-tab-list.js @@ -17,12 +17,12 @@ export default Ember.Component.extend({ attributeBindings: ['aria-multiselectable', 'role'], classNames: ['ivy-tab-list'], - init: function() { + init() { this._super(); Ember.run.once(this, this._registerWithTabsContainer); }, - willDestroy: function() { + willDestroy() { this._super(); Ember.run.once(this, this._unregisterWithTabsContainer); }, @@ -52,7 +52,7 @@ export default Ember.Component.extend({ * * @method focusSelectedTab */ - focusSelectedTab: function() { + focusSelectedTab() { this.get('selectedTab').$().focus(); }, @@ -88,7 +88,7 @@ export default Ember.Component.extend({ * @method registerTab * @param {IvyTabs.IvyTabComponent} tab */ - registerTab: function(tab) { + registerTab(tab) { this.get('tabs').pushObject(tab); }, @@ -97,7 +97,7 @@ export default Ember.Component.extend({ * * @method selectNextTab */ - selectNextTab: function() { + selectNextTab() { let index = this.get('selected-index') + 1; if (index === this.get('tabs.length')) { index = 0; } this.selectTabByIndex(index); @@ -108,7 +108,7 @@ export default Ember.Component.extend({ * * @method selectPreviousTab */ - selectPreviousTab: function() { + selectPreviousTab() { let index = this.get('selected-index') - 1; // Previous from the first tab should select the last tab. @@ -137,7 +137,7 @@ export default Ember.Component.extend({ * @method selectTab * @param {IvyTabs.IvyTabComponent} tab */ - selectTab: function(tab) { + selectTab(tab) { this.selectTabByIndex(this.get('tabs').indexOf(tab)); }, @@ -147,7 +147,7 @@ export default Ember.Component.extend({ * @method selectTabByIndex * @param {Number} index */ - selectTabByIndex: function(index) { + selectTabByIndex(index) { this.set('selected-index', index); }, @@ -170,7 +170,7 @@ export default Ember.Component.extend({ * @method unregisterTab * @param {IvyTabs.IvyTabComponent} tab */ - unregisterTab: function(tab) { + unregisterTab(tab) { const index = tab.get('index'); this.get('tabs').removeObject(tab); @@ -183,11 +183,11 @@ export default Ember.Component.extend({ } }, - _registerWithTabsContainer: function() { + _registerWithTabsContainer() { this.get('tabsContainer').registerTabList(this); }, - _unregisterWithTabsContainer: function() { + _unregisterWithTabsContainer() { this.get('tabsContainer').unregisterTabList(this); } }); diff --git a/addon/components/ivy-tab-panel.js b/addon/components/ivy-tab-panel.js index 77a08ee0..7b27f637 100644 --- a/addon/components/ivy-tab-panel.js +++ b/addon/components/ivy-tab-panel.js @@ -14,12 +14,12 @@ export default Ember.Component.extend({ classNames: ['ivy-tab-panel'], classNameBindings: ['active'], - init: function() { + init() { this._super(); Ember.run.once(this, this._registerWithTabsContainer); }, - willDestroy: function() { + willDestroy() { this._super(); Ember.run.once(this, this._unregisterWithTabsContainer); }, @@ -143,11 +143,11 @@ export default Ember.Component.extend({ */ tabsContainer: Ember.computed.oneWay('parentView'), - _registerWithTabsContainer: function() { + _registerWithTabsContainer() { this.get('tabsContainer').registerTabPanel(this); }, - _unregisterWithTabsContainer: function() { + _unregisterWithTabsContainer() { this.get('tabsContainer').unregisterTabPanel(this); } }); diff --git a/addon/components/ivy-tab.js b/addon/components/ivy-tab.js index b5eadd12..64dce715 100644 --- a/addon/components/ivy-tab.js +++ b/addon/components/ivy-tab.js @@ -15,12 +15,12 @@ export default Ember.Component.extend({ classNames: ['ivy-tab'], classNameBindings: ['active'], - init: function() { + init() { this._super(); Ember.run.once(this, this._registerWithTabList); }, - willDestroy: function() { + willDestroy() { this._super(); Ember.run.once(this, this._unregisterWithTabList); }, @@ -191,11 +191,11 @@ export default Ember.Component.extend({ */ tabsContainer: Ember.computed.alias('tabList.tabsContainer').readOnly(), - _registerWithTabList: function() { + _registerWithTabList() { this.get('tabList').registerTab(this); }, - _unregisterWithTabList: function() { + _unregisterWithTabList() { this.get('tabList').unregisterTab(this); } }); diff --git a/addon/components/ivy-tabs.js b/addon/components/ivy-tabs.js index 8ab8a010..cc7cbaa0 100644 --- a/addon/components/ivy-tabs.js +++ b/addon/components/ivy-tabs.js @@ -32,7 +32,7 @@ export default Ember.Component.extend({ * @method registerTabList * @param {IvyTabs.IvyTabListComponent} tabList */ - registerTabList: function(tabList) { + registerTabList(tabList) { this.set('tabList', tabList); Ember.run.once(this, this._selectTabByIndex); }, @@ -43,7 +43,7 @@ export default Ember.Component.extend({ * @method registerTabPanel * @param {IvyTabs.IvyTabPanelComponent} tabPanel */ - registerTabPanel: function(tabPanel) { + registerTabPanel(tabPanel) { this.get('tabPanels').pushObject(tabPanel); }, @@ -57,7 +57,7 @@ export default Ember.Component.extend({ * @method unregisterTabList * @param {IvyTabs.IvyTabListComponent} tabList */ - unregisterTabList: function(/* tabList */) { + unregisterTabList(/* tabList */) { this.set('tabList', null); }, @@ -67,11 +67,11 @@ export default Ember.Component.extend({ * @method unregisterTabPanel * @param {IvyTabs.IvyTabPanelComponent} tabPanel */ - unregisterTabPanel: function(tabPanel) { + unregisterTabPanel(tabPanel) { this.get('tabPanels').removeObject(tabPanel); }, - _selectTabByIndex: function() { + _selectTabByIndex() { let selectedIndex = this.get('selected-index'); if (Ember.isNone(selectedIndex)) { selectedIndex = 0; } this.get('tabList').selectTabByIndex(selectedIndex); diff --git a/tests/dummy/app/components/ivy-tab.js b/tests/dummy/app/components/ivy-tab.js index f43466ab..3398f43f 100644 --- a/tests/dummy/app/components/ivy-tab.js +++ b/tests/dummy/app/components/ivy-tab.js @@ -5,7 +5,7 @@ export default IvyTabComponent.extend({ tagName: 'li', actions: { - select: function() { + select() { this.select(); } }, From 72ffcfa14c98b957b45652a9807e20fba767f856 Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Thu, 24 Mar 2016 13:14:26 -0400 Subject: [PATCH 10/13] Pass arguments to `this._super` --- addon/components/ivy-tab-list.js | 4 ++-- addon/components/ivy-tab-panel.js | 4 ++-- addon/components/ivy-tab.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addon/components/ivy-tab-list.js b/addon/components/ivy-tab-list.js index ba1eadce..36e4df7d 100644 --- a/addon/components/ivy-tab-list.js +++ b/addon/components/ivy-tab-list.js @@ -18,12 +18,12 @@ export default Ember.Component.extend({ classNames: ['ivy-tab-list'], init() { - this._super(); + this._super(...arguments); Ember.run.once(this, this._registerWithTabsContainer); }, willDestroy() { - this._super(); + this._super(...arguments); Ember.run.once(this, this._unregisterWithTabsContainer); }, diff --git a/addon/components/ivy-tab-panel.js b/addon/components/ivy-tab-panel.js index 7b27f637..f3bcf3b7 100644 --- a/addon/components/ivy-tab-panel.js +++ b/addon/components/ivy-tab-panel.js @@ -15,12 +15,12 @@ export default Ember.Component.extend({ classNameBindings: ['active'], init() { - this._super(); + this._super(...arguments); Ember.run.once(this, this._registerWithTabsContainer); }, willDestroy() { - this._super(); + this._super(...arguments); Ember.run.once(this, this._unregisterWithTabsContainer); }, diff --git a/addon/components/ivy-tab.js b/addon/components/ivy-tab.js index 64dce715..5c9c6333 100644 --- a/addon/components/ivy-tab.js +++ b/addon/components/ivy-tab.js @@ -16,12 +16,12 @@ export default Ember.Component.extend({ classNameBindings: ['active'], init() { - this._super(); + this._super(...arguments); Ember.run.once(this, this._registerWithTabList); }, willDestroy() { - this._super(); + this._super(...arguments); Ember.run.once(this, this._unregisterWithTabList); }, From 04a397ed3c017ae656a478b4be017190b7bbd233 Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Thu, 24 Mar 2016 13:53:32 -0400 Subject: [PATCH 11/13] Upgrade `ember-cli` to 2.4.2 This also upgrades `ember` to 2.4.1. --- .npmignore | 20 +++++----- .travis.yml | 1 + LICENSE.md | 2 +- bower.json | 14 ++----- config/ember-try.js | 51 ++++++++++++++++++-------- ember-cli-build.js | 2 +- package.json | 19 +++++----- testem.json => testem.js | 5 ++- tests/dummy/app/app.js | 4 +- tests/dummy/app/index.html | 8 ++-- tests/dummy/app/resolver.js | 3 ++ tests/helpers/module-for-acceptance.js | 4 +- tests/helpers/resolver.js | 2 +- tests/index.html | 18 ++++----- 14 files changed, 87 insertions(+), 66 deletions(-) rename testem.json => testem.js (81%) create mode 100644 tests/dummy/app/resolver.js diff --git a/.npmignore b/.npmignore index 49996f5a..fa8b147a 100644 --- a/.npmignore +++ b/.npmignore @@ -1,14 +1,16 @@ -bower_components/ -tests/ -tmp/ -dist/ - +/bower_components +/config/ember-try.js +/dist +/tests +/tmp +**/.gitkeep .bowerrc .editorconfig .ember-cli +.gitignore +.jshintrc +.watchmanconfig .travis.yml -.npmignore -**/.gitkeep bower.json -Brocfile.js -testem.json +ember-cli-build.js +testem.js diff --git a/.travis.yml b/.travis.yml index 36d7bf72..dd54ffde 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ cache: env: - EMBER_TRY_SCENARIO=default + - EMBER_TRY_SCENARIO=ember-1-13 - EMBER_TRY_SCENARIO=ember-release - EMBER_TRY_SCENARIO=ember-beta - EMBER_TRY_SCENARIO=ember-canary diff --git a/LICENSE.md b/LICENSE.md index 6d4bd7fb..e6d06674 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015 Envy Labs, LLC. +Copyright (c) 2016 Envy Labs, LLC. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/bower.json b/bower.json index 51b7b54e..67f4e12c 100644 --- a/bower.json +++ b/bower.json @@ -1,16 +1,10 @@ { "name": "ivy-tabs", "dependencies": { - "ember": "1.13.11", - "ember-cli-shims": "0.0.6", - "ember-cli-test-loader": "0.2.1", - "ember-load-initializers": "0.1.7", - "ember-qunit": "0.4.16", - "ember-qunit-notifications": "0.1.0", - "ember-resolver": "~0.1.20", - "jquery": "^1.11.3", - "loader.js": "ember-cli/loader.js#3.4.0", "bootstrap": "~3.3.1", - "qunit": "~1.20.0" + "ember": "~2.4.1", + "ember-cli-shims": "0.1.0", + "ember-cli-test-loader": "0.2.2", + "ember-qunit-notifications": "0.1.0" } } diff --git a/config/ember-try.js b/config/ember-try.js index 3e88bc61..7ded6fc4 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -3,33 +3,52 @@ module.exports = { scenarios: [ { name: 'default', - dependencies: { } + bower: { + dependencies: { } + } + }, + { + name: 'ember-1-13', + bower: { + dependencies: { + 'ember': '~1.13.0' + }, + resolutions: { + 'ember': '~1.13.0' + } + } }, { name: 'ember-release', - dependencies: { - 'ember': 'components/ember#release' - }, - resolutions: { - 'ember': 'release' + bower: { + dependencies: { + 'ember': 'components/ember#release' + }, + resolutions: { + 'ember': 'release' + } } }, { name: 'ember-beta', - dependencies: { - 'ember': 'components/ember#beta' - }, - resolutions: { - 'ember': 'beta' + bower: { + dependencies: { + 'ember': 'components/ember#beta' + }, + resolutions: { + 'ember': 'beta' + } } }, { name: 'ember-canary', - dependencies: { - 'ember': 'components/ember#canary' - }, - resolutions: { - 'ember': 'canary' + bower: { + dependencies: { + 'ember': 'components/ember#canary' + }, + resolutions: { + 'ember': 'canary' + } } } ] diff --git a/ember-cli-build.js b/ember-cli-build.js index cf0f9096..6f2ffb9b 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -8,7 +8,7 @@ module.exports = function(defaults) { }); /* - This build file specifes the options for the dummy test app of this + This build file specifies the options for the dummy test app of this addon, located in `/tests/dummy` This build file does *not* influence how the addon or the app using it behave. You most likely want to be modifying `./index.js` or app's build file diff --git a/package.json b/package.json index 1ad155d4..0bf5206d 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,8 @@ "test": "tests" }, "scripts": { - "start": "ember server", "build": "ember build", + "start": "ember server", "test": "ember try:testall" }, "repository": "https://github.com/IvyApp/ivy-tabs", @@ -22,21 +22,22 @@ }, "devDependencies": { "broccoli-asset-rev": "^2.2.0", - "ember-cli": "1.13.13", + "ember-cli": "2.4.2", "ember-cli-app-version": "^1.0.0", - "ember-cli-content-security-policy": "0.4.0", - "ember-cli-dependency-checker": "^1.1.0", + "ember-cli-dependency-checker": "^1.2.0", "ember-cli-htmlbars-inline-precompile": "^0.3.1", - "ember-cli-ic-ajax": "0.2.4", "ember-cli-inject-live-reload": "^1.3.1", - "ember-cli-qunit": "^1.0.4", + "ember-cli-qunit": "^1.2.1", "ember-cli-release": "0.2.8", - "ember-cli-sri": "^1.2.0", + "ember-cli-sri": "^2.1.0", "ember-cli-uglify": "^1.2.0", - "ember-disable-prototype-extensions": "^1.0.0", + "ember-disable-prototype-extensions": "^1.1.0", "ember-disable-proxy-controllers": "^1.0.1", "ember-export-application-global": "^1.0.4", - "ember-try": "~0.0.8" + "ember-load-initializers": "^0.5.0", + "ember-resolver": "^2.0.3", + "ember-try": "^0.1.2", + "loader.js": "^4.0.0" }, "keywords": [ "ember", diff --git a/testem.json b/testem.js similarity index 81% rename from testem.json rename to testem.js index 0f35392c..26044b2f 100644 --- a/testem.json +++ b/testem.js @@ -1,4 +1,5 @@ -{ +/*jshint node:true*/ +module.exports = { "framework": "qunit", "test_page": "tests/index.html?hidepassed", "disable_watching": true, @@ -9,4 +10,4 @@ "PhantomJS", "Chrome" ] -} +}; diff --git a/tests/dummy/app/app.js b/tests/dummy/app/app.js index 8b234d6d..831ad610 100644 --- a/tests/dummy/app/app.js +++ b/tests/dummy/app/app.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -import Resolver from 'ember/resolver'; -import loadInitializers from 'ember/load-initializers'; +import Resolver from './resolver'; +import loadInitializers from 'ember-load-initializers'; import config from './config/environment'; let App; diff --git a/tests/dummy/app/index.html b/tests/dummy/app/index.html index 4c77fb25..5b870941 100644 --- a/tests/dummy/app/index.html +++ b/tests/dummy/app/index.html @@ -7,19 +7,19 @@ - {{content-for 'head'}} + {{content-for "head"}} - {{content-for 'head-footer'}} + {{content-for "head-footer"}} - {{content-for 'body'}} + {{content-for "body"}} - {{content-for 'body-footer'}} + {{content-for "body-footer"}} diff --git a/tests/dummy/app/resolver.js b/tests/dummy/app/resolver.js new file mode 100644 index 00000000..2fb563d6 --- /dev/null +++ b/tests/dummy/app/resolver.js @@ -0,0 +1,3 @@ +import Resolver from 'ember-resolver'; + +export default Resolver; diff --git a/tests/helpers/module-for-acceptance.js b/tests/helpers/module-for-acceptance.js index ed23003d..8c8b74ec 100644 --- a/tests/helpers/module-for-acceptance.js +++ b/tests/helpers/module-for-acceptance.js @@ -13,11 +13,11 @@ export default function(name, options = {}) { }, afterEach() { - destroyApp(this.application); - if (options.afterEach) { options.afterEach.apply(this, arguments); } + + destroyApp(this.application); } }); } diff --git a/tests/helpers/resolver.js b/tests/helpers/resolver.js index ebfb4e4d..b208d38d 100644 --- a/tests/helpers/resolver.js +++ b/tests/helpers/resolver.js @@ -1,4 +1,4 @@ -import Resolver from 'ember/resolver'; +import Resolver from '../../resolver'; import config from '../../config/environment'; const resolver = Resolver.create(); diff --git a/tests/index.html b/tests/index.html index 5e88e5e1..64cb47e3 100644 --- a/tests/index.html +++ b/tests/index.html @@ -7,28 +7,28 @@ - {{content-for 'head'}} - {{content-for 'test-head'}} + {{content-for "head"}} + {{content-for "test-head"}} - {{content-for 'head-footer'}} - {{content-for 'test-head-footer'}} + {{content-for "head-footer"}} + {{content-for "test-head-footer"}} - {{content-for 'body'}} - {{content-for 'test-body'}} + {{content-for "body"}} + {{content-for "test-body"}} + - - {{content-for 'body-footer'}} - {{content-for 'test-body-footer'}} + {{content-for "body-footer"}} + {{content-for "test-body-footer"}} From b702722608431976b2cd2fc16dc64212bb71d2bc Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Thu, 24 Mar 2016 14:19:59 -0400 Subject: [PATCH 12/13] Emit deprecation warnings when using `parentView` --- addon/components/ivy-tab-list.js | 10 +++++++++- addon/components/ivy-tab-panel.js | 10 +++++++++- addon/components/ivy-tab.js | 10 +++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/addon/components/ivy-tab-list.js b/addon/components/ivy-tab-list.js index 36e4df7d..74f50e48 100644 --- a/addon/components/ivy-tab-list.js +++ b/addon/components/ivy-tab-list.js @@ -155,6 +155,14 @@ export default Ember.Component.extend({ return Ember.A(); }).readOnly(), + _deprecatedParentViewBasedTabsContainer: Ember.computed('parentView', function() { + Ember.deprecate('Inferring `tabsContainer` from `parentView` on `{{ivy-tab-list}}` is deprecated. Please assign in an instance of `{{ivy-tabs}}` to the `tabsContainer` property.', false, { + id: 'ivy-tabs.ivy-tab-list.tabs-container-missing', + until: '2.0.0' + }); + return this.get('parentView'); + }).readOnly(), + /** * The `ivy-tabs` component. * @@ -162,7 +170,7 @@ export default Ember.Component.extend({ * @type IvyTabs.IvyTabsComponent * @readOnly */ - tabsContainer: Ember.computed.oneWay('parentView'), + tabsContainer: Ember.computed.oneWay('_deprecatedParentViewBasedTabsContainer'), /** * Removes a tab from the `tabs` array. diff --git a/addon/components/ivy-tab-panel.js b/addon/components/ivy-tab-panel.js index f3bcf3b7..9c2bcd0e 100644 --- a/addon/components/ivy-tab-panel.js +++ b/addon/components/ivy-tab-panel.js @@ -134,6 +134,14 @@ export default Ember.Component.extend({ */ tabs: Ember.computed.alias('tabList.tabs').readOnly(), + _deprecatedParentViewBasedTabsContainer: Ember.computed('parentView', function() { + Ember.deprecate('Inferring `tabsContainer` from `parentView` on `{{ivy-tab-panel}}` is deprecated. Please assign in an instance of `{{ivy-tabs}}` to the `tabsContainer` property.', false, { + id: 'ivy-tabs.ivy-tab-panel.tabs-container-missing', + until: '2.0.0' + }); + return this.get('parentView'); + }).readOnly(), + /** * The `ivy-tabs` component. * @@ -141,7 +149,7 @@ export default Ember.Component.extend({ * @type IvyTabs.IvyTabsComponent * @readOnly */ - tabsContainer: Ember.computed.oneWay('parentView'), + tabsContainer: Ember.computed.oneWay('_deprecatedParentViewBasedTabsContainer'), _registerWithTabsContainer() { this.get('tabsContainer').registerTabPanel(this); diff --git a/addon/components/ivy-tab.js b/addon/components/ivy-tab.js index 5c9c6333..62e4e822 100644 --- a/addon/components/ivy-tab.js +++ b/addon/components/ivy-tab.js @@ -144,6 +144,14 @@ export default Ember.Component.extend({ this.get('tabList').selectTab(this); }), + _deprecatedParentViewBasedTabList: Ember.computed('parentView', function() { + Ember.deprecate('Inferring `tabList` from `parentView` on `{{ivy-tab}}` is deprecated. Please assign in an instance of `{{ivy-tab-list}}` to the `tabList` property.', false, { + id: 'ivy-tabs.ivy-tab.tab-list-missing', + until: '2.0.0' + }); + return this.get('parentView'); + }).readOnly(), + /** * The `ivy-tab-list` component this tab belongs to. * @@ -151,7 +159,7 @@ export default Ember.Component.extend({ * @type IvyTabs.IvyTabListComponent * @readOnly */ - tabList: Ember.computed.oneWay('parentView'), + tabList: Ember.computed.oneWay('_deprecatedParentViewBasedTabList'), /** * The `ivy-tab-panel` associated with this tab. From e5c933b5fa22febccc0b0a638f093fbfd890f7ea Mon Sep 17 00:00:00 2001 From: Dray Lacy Date: Thu, 24 Mar 2016 14:23:30 -0400 Subject: [PATCH 13/13] Fix deprecation warnings in dummy app --- tests/dummy/app/templates/index.hbs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 7884bf00..90f2c26d 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,12 +1,12 @@ -{{#ivy-tabs}} - {{#ivy-tab-list}} - {{#ivy-tab}}Tab A{{/ivy-tab}} - {{#ivy-tab}}Tab B{{/ivy-tab}} - {{#ivy-tab}}Tab C{{/ivy-tab}} +{{#ivy-tabs as |tabsContainer|}} + {{#ivy-tab-list tabsContainer=tabsContainer as |tabList|}} + {{#ivy-tab tabList=tabList}}Tab A{{/ivy-tab}} + {{#ivy-tab tabList=tabList}}Tab B{{/ivy-tab}} + {{#ivy-tab tabList=tabList}}Tab C{{/ivy-tab}} {{/ivy-tab-list}}
- {{#ivy-tab-panel}} + {{#ivy-tab-panel tabsContainer=tabsContainer}}

Tab A

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod @@ -19,7 +19,7 @@

{{/ivy-tab-panel}} - {{#ivy-tab-panel}} + {{#ivy-tab-panel tabsContainer=tabsContainer}}

Tab B

Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim @@ -31,7 +31,7 @@

{{/ivy-tab-panel}} - {{#ivy-tab-panel}} + {{#ivy-tab-panel tabsContainer=tabsContainer}}

Tab C

Veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea