From 9596142a4f52785530ec93cdcce28e6bb1b8a81a Mon Sep 17 00:00:00 2001 From: Adam Bradley Date: Fri, 18 Dec 2015 12:31:32 -0600 Subject: [PATCH 01/11] feat(button): add color input Closes #742 --- ionic/components/button/button.ts | 45 ++++++++++++++------ ionic/components/button/test/basic/index.ts | 10 +++++ ionic/components/button/test/basic/main.html | 5 +++ 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/ionic/components/button/button.ts b/ionic/components/button/button.ts index 9c270c49c3..504d54c87e 100644 --- a/ionic/components/button/button.ts +++ b/ionic/components/button/button.ts @@ -21,6 +21,7 @@ import {Toolbar} from '../toolbar/toolbar'; * @property [fab-center] - position a fab button towards the center * @property [fab-top] - position a fab button towards the top * @property [fab-bottom] - position a fab button towards the bottom + * @property [color] - Dynamically set which color attribute this button should use. * @description * Buttons are simple components in Ionic, can consist of text, an icon, or both, and can be enhanced with a wide range of attributes. * @demo /docs/v2/demos/buttons/ @@ -28,28 +29,30 @@ import {Toolbar} from '../toolbar/toolbar'; */ @Directive({ - selector: 'button,[button]' + selector: 'button,[button]', + inputs: ['color'] }) export class Button { constructor( config: Config, - private elementRef: ElementRef, - private renderer: Renderer + private _elementRef: ElementRef, + private _renderer: Renderer ) { this._role = 'button'; // bar-button/item-button this._size = null; // large/small this._style = 'default'; // outline/clear/solid this._shape = null; // round/fab this._display = null; // block/full + this._lastColor = null; this._colors = []; // primary/secondary this._icon = null; // left/right/only this._disabled = false; // disabled - let element = elementRef.nativeElement; + let element = _elementRef.nativeElement; if (config.get('hoverCSS') === false) { - renderer.setElementClass(elementRef, 'disable-hover', true); + _renderer.setElementClass(_elementRef, 'disable-hover', true); } if (element.hasAttribute('ion-item')) { @@ -66,16 +69,32 @@ export class Button { this._readIcon(element); } -/** - * @private - */ + /** + * @private + */ ngAfterContentInit() { + this._lastColor = this.color; + if (this.color) { + this._colors = [this.color]; + } this._assignCss(true); } -/** - * @private - */ + /** + * @private + */ + ngAfterContentChecked() { + if (this._lastColor !== this.color) { + this._assignCss(false); + this._lastColor = this.color; + this._colors = [this.color]; + this._assignCss(true); + } + } + + /** + * @private + */ setRole(val) { this._role = val; } @@ -147,7 +166,7 @@ export class Button { _assignCss(assignCssClass) { let role = this._role; if (role) { - this.renderer.setElementClass(this.elementRef, role, assignCssClass); // button + this._renderer.setElementClass(this._elementRef, role, assignCssClass); // button this._setClass(this._style, assignCssClass); // button-clear this._setClass(this._shape, assignCssClass); // button-round @@ -164,7 +183,7 @@ export class Button { _setClass(type, assignCssClass) { if (type) { - this.renderer.setElementClass(this.elementRef, this._role + '-' + type, assignCssClass); + this._renderer.setElementClass(this._elementRef, this._role + '-' + type, assignCssClass); } } diff --git a/ionic/components/button/test/basic/index.ts b/ionic/components/button/test/basic/index.ts index ff6f299c59..01b30a6221 100644 --- a/ionic/components/button/test/basic/index.ts +++ b/ionic/components/button/test/basic/index.ts @@ -7,5 +7,15 @@ import {App, IonicApp} from 'ionic/ionic'; class E2EApp { constructor(app: IonicApp) { app.setTitle('Basic Buttons'); + + this.testingColors = ['primary', 'secondary', 'danger', 'dark']; + this.testingColorIndex = 0; + this.chgColor(); + } + + chgColor() { + this.btnColor = this.testingColors[this.testingColorIndex]; + console.log('dynamic btnColor', this.btnColor); + this.testingColorIndex = (this.testingColorIndex >= this.testingColors.length - 1 ? 0 : this.testingColorIndex + 1); } } diff --git a/ionic/components/button/test/basic/main.html b/ionic/components/button/test/basic/main.html index 634fabca7b..0a1b3214e1 100644 --- a/ionic/components/button/test/basic/main.html +++ b/ionic/components/button/test/basic/main.html @@ -39,4 +39,9 @@

+

+ + +

+ From 344619d7d7ede21610e288cf59b7d1f6e26f3a72 Mon Sep 17 00:00:00 2001 From: Drew Rygh Date: Fri, 18 Dec 2015 13:53:50 -0600 Subject: [PATCH 02/11] docs(demos/slides): link to api demos --- ionic/components/slides/slides.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ionic/components/slides/slides.ts b/ionic/components/slides/slides.ts index 4260ee1171..303dd117e9 100644 --- a/ionic/components/slides/slides.ts +++ b/ionic/components/slides/slides.ts @@ -66,6 +66,7 @@ import {Scroll} from '../scroll/scroll'; * @property {Number} [index] - The slide index to start on * @property [pager] - add this property to enable the slide pager * @property {Any} [change] - expression to evaluate when a slide has been changed + * @demo /docs/v2/demos/slides/ * @see {@link /docs/v2/components#slides Slides Component Docs} */ @Component({ From 0f64bccc4335e4d3d9832666afd263d79f83ad15 Mon Sep 17 00:00:00 2001 From: mhartington Date: Fri, 18 Dec 2015 14:54:12 -0500 Subject: [PATCH 03/11] chore(): prefix private methods --- ionic/components/app/id.ts | 12 ++++++------ ionic/components/blur/blur.ts | 4 ++-- ionic/components/checkbox/checkbox.ts | 9 ++++----- ionic/components/icon/icon.ts | 12 ++++++------ ionic/components/item/item-sliding.ts | 6 +++--- ionic/components/label/label.ts | 10 +++++----- ionic/components/menu/menu-close.ts | 4 ++-- ionic/components/radio/radio.ts | 8 ++++---- ionic/components/toggle/toggle.ts | 6 +++--- 9 files changed, 35 insertions(+), 36 deletions(-) diff --git a/ionic/components/app/id.ts b/ionic/components/app/id.ts index f8bda41715..8efbe00f5e 100644 --- a/ionic/components/app/id.ts +++ b/ionic/components/app/id.ts @@ -42,23 +42,23 @@ import {IonicApp} from './app'; }) export class IdRef { - constructor(private app: IonicApp, private elementRef: ElementRef, private appViewManager: AppViewManager) { + constructor(private _app: IonicApp, private _elementRef: ElementRef, private _appViewManager: AppViewManager) { // Grab the component this directive is attached to - this.component = appViewManager.getComponent(elementRef); + this.component = _appViewManager.getComponent(_elementRef); } /** * @private */ ngOnInit() { - this.app.register(this.id, this.component); + this._app.register(this.id, this.component); } /** * @private */ ngOnDestroy() { - this.app.unregister(this.id); + this._app.unregister(this.id); } } @@ -80,12 +80,12 @@ export class IdRef { }) export class Attr { - constructor(private renderer: Renderer, private elementRef: ElementRef) {} + constructor(private _renderer: Renderer, private _elementRef: ElementRef) {} /** * @private */ ngOnInit() { - this.renderer.setElementAttribute(this.elementRef, this.attr, ''); + this._renderer.setElementAttribute(this._elementRef, this.attr, ''); } } diff --git a/ionic/components/blur/blur.ts b/ionic/components/blur/blur.ts index d70e3cccce..b2c62432f8 100644 --- a/ionic/components/blur/blur.ts +++ b/ionic/components/blur/blur.ts @@ -20,7 +20,7 @@ import {Directive, Renderer, ElementRef} from 'angular2/core'; selector: '[blur]' }) export class Blur { - constructor(private elementRef: ElementRef, private renderer: Renderer) { - renderer.setElementStyle(elementRef, '-webkit-backdrop-filter', 'blur(10px)'); + constructor(private _elementRef: ElementRef, private _renderer: Renderer) { + _renderer.setElementStyle(_elementRef, '-webkit-backdrop-filter', 'blur(10px)'); } } diff --git a/ionic/components/checkbox/checkbox.ts b/ionic/components/checkbox/checkbox.ts index 46f03486b6..dd7517d012 100644 --- a/ionic/components/checkbox/checkbox.ts +++ b/ionic/components/checkbox/checkbox.ts @@ -54,12 +54,11 @@ import {Form} from '../../util/form'; export class Checkbox { constructor( - private form: Form, + private _form: Form, @Optional() ngControl: NgControl, elementRef: ElementRef ) { - this.form = form; - form.register(this); + _form.register(this); this.onChange = (_) => {}; this.onTouched = (_) => {}; @@ -75,7 +74,7 @@ export class Checkbox { */ ngOnInit() { if (!this.id) { - this.id = 'chk-' + this.form.nextId(); + this.id = 'chk-' + this._form.nextId(); } this.labelId = 'lbl-' + this.id; @@ -132,6 +131,6 @@ export class Checkbox { * @private */ ngOnDestroy() { - this.form.deregister(this); + this._form.deregister(this); } } diff --git a/ionic/components/icon/icon.ts b/ionic/components/icon/icon.ts index d1f1a4abde..31f4962a96 100644 --- a/ionic/components/icon/icon.ts +++ b/ionic/components/icon/icon.ts @@ -40,9 +40,9 @@ import {Config} from '../../config/config'; export class Icon { constructor( - private elementRef: ElementRef, + private _elementRef: ElementRef, config: Config, - private renderer: Renderer + private _renderer: Renderer ) { this.config = config; this.mode = config.get('iconMode'); @@ -52,7 +52,7 @@ export class Icon { * @private */ ngOnInit() { - let ele = this.elementRef.nativeElement; + let ele = this._elementRef.nativeElement; if (this.mode == 'ios' && this.ios) { this.name = this.ios; @@ -113,12 +113,12 @@ export class Icon { if (this._name !== this.name) { if (this._name) { - this.renderer.setElementClass(this.elementRef, this._name, false); + this._renderer.setElementClass(this._elementRef, this._name, false); } this._name = this.name; - this.renderer.setElementClass(this.elementRef, this.name, true); + this._renderer.setElementClass(this._elementRef, this.name, true); - this.renderer.setElementAttribute(this.elementRef, 'aria-label', + this._renderer.setElementAttribute(this._elementRef, 'aria-label', this.name.replace('ion-', '').replace('ios-', '').replace('md-', '').replace('-', ' ')); } } diff --git a/ionic/components/item/item-sliding.ts b/ionic/components/item/item-sliding.ts index 7db35d546a..f653ee6fcf 100644 --- a/ionic/components/item/item-sliding.ts +++ b/ionic/components/item/item-sliding.ts @@ -34,8 +34,8 @@ import {List} from '../list/list'; }) export class ItemSliding { - constructor(@Optional() private list: List, elementRef: ElementRef) { - list.enableSlidingItems(true); + constructor(@Optional() private _list: List, elementRef: ElementRef) { + _list.enableSlidingItems(true); elementRef.nativeElement.$ionSlide = ++slideIds; } @@ -43,7 +43,7 @@ export class ItemSliding { * @private */ close() { - this.list.closeSlidingItems(); + this._list.closeSlidingItems(); } } diff --git a/ionic/components/label/label.ts b/ionic/components/label/label.ts index 668ed560a1..04f877b8b4 100644 --- a/ionic/components/label/label.ts +++ b/ionic/components/label/label.ts @@ -42,9 +42,9 @@ export class Label { constructor( config: Config, @Optional() container: TextInput, - private form: Form, - private elementRef: ElementRef, - private renderer: Renderer + private _form: Form, + private _elementRef: ElementRef, + private _renderer: Renderer ) { this.scrollAssist = config.get('scrollAssist'); this.container = container; @@ -55,7 +55,7 @@ export class Label { */ ngOnInit() { if (!this.id) { - this.id = 'lbl-' + this.form.nextId(); + this.id = 'lbl-' + this._form.nextId(); } this.container && this.container.registerLabel(this); } @@ -94,7 +94,7 @@ export class Label { * @private */ addClass(className) { - this.renderer.setElementClass(this.elementRef, className, true); + this._renderer.setElementClass(this._elementRef, className, true); } } diff --git a/ionic/components/menu/menu-close.ts b/ionic/components/menu/menu-close.ts index 7b3be9e232..e28ca26402 100644 --- a/ionic/components/menu/menu-close.ts +++ b/ionic/components/menu/menu-close.ts @@ -37,13 +37,13 @@ import {Menu} from './menu'; }) export class MenuClose { - constructor(private app: IonicApp) {} + constructor(private _app: IonicApp) {} /** * @private */ close() { - let menu = Menu.getById(this.app, this.menuClose); + let menu = Menu.getById(this._app, this.menuClose); menu && menu.close(); } diff --git a/ionic/components/radio/radio.ts b/ionic/components/radio/radio.ts index 808caa9ca7..a7fc3f8c0b 100644 --- a/ionic/components/radio/radio.ts +++ b/ionic/components/radio/radio.ts @@ -60,7 +60,7 @@ export class RadioGroup extends Ion { elementRef: ElementRef, config: Config, @Optional() ngControl: NgControl, - @Query(ListHeader) private headerQuery: QueryList + @Query(ListHeader) private _headerQuery: QueryList ) { super(elementRef, config); this.ngControl = ngControl; @@ -76,7 +76,7 @@ export class RadioGroup extends Ion { * @private */ ngOnInit() { - let header = this.headerQuery.first; + let header = this._headerQuery.first; if (header) { if (!header.id) { header.id = 'radio-header-' + this.id; @@ -203,7 +203,7 @@ export class RadioButton extends Ion { @Host() @Optional() group: RadioGroup, elementRef: ElementRef, config: Config, - private form: Form + private _form: Form ) { super(elementRef, config); @@ -217,7 +217,7 @@ export class RadioButton extends Ion { ngOnInit() { super.ngOnInit(); if (!this.id) { - this.id = 'rb-' + this.form.nextId(); + this.id = 'rb-' + this._form.nextId(); } this.labelId = 'lbl-' + this.id; diff --git a/ionic/components/toggle/toggle.ts b/ionic/components/toggle/toggle.ts index 900b4731ad..62f892a394 100644 --- a/ionic/components/toggle/toggle.ts +++ b/ionic/components/toggle/toggle.ts @@ -111,7 +111,7 @@ export class Toggle { form: Form, elementRef: ElementRef, config: Config, - @Optional() private ngControl: NgControl + @Optional() private _ngControl: NgControl ) { // deprecated warning if (elementRef.nativeElement.tagName == 'ION-SWITCH') { @@ -129,8 +129,8 @@ export class Toggle { this.onChange = (_) => {}; this.onTouched = (_) => {}; - if (ngControl) { - ngControl.valueAccessor = this; + if (_ngControl) { + _ngControl.valueAccessor = this; } let self = this; From b6ec5546951ba33a0da9a8d1c2ad3448da26b0a8 Mon Sep 17 00:00:00 2001 From: Drew Rygh Date: Fri, 18 Dec 2015 16:19:37 -0600 Subject: [PATCH 04/11] docs(actionSheet): don't document param object properties as params Closes #676 --- ionic/components/action-sheet/action-sheet.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ionic/components/action-sheet/action-sheet.ts b/ionic/components/action-sheet/action-sheet.ts index 1a122600c0..97472f903a 100644 --- a/ionic/components/action-sheet/action-sheet.ts +++ b/ionic/components/action-sheet/action-sheet.ts @@ -130,8 +130,8 @@ export class ActionSheet { * the action sheet, or false to keep it opened. * - `{function=}` `destructiveButtonClicked` Called when the destructive button is clicked. * Return true to close the action sheet, or false to keep it opened. - * @param {String} [opts.enterAnimation='action-sheet-slide-in'] The class used to animate an actionSheet that is entering. - * @param {String} [opts.leaveAnimation='action-sheet-slide-out'] The class used to animate an actionSheet that is leaving. + * - `{String}` `enterAnimation` The class used to animate an actionSheet that is entering. + * - `{String}` `leaveAnimation` The class used to animate an actionSheet that is leaving. * @return {Promise} Promise that resolves when the action sheet is open. */ open(opts={}) { From 3ab3de56e31994450c9fae319c5f53d68b68b680 Mon Sep 17 00:00:00 2001 From: Tim Lancina Date: Fri, 18 Dec 2015 17:55:18 -0600 Subject: [PATCH 05/11] chore(): have separate README for npm package --- README.md | 57 ------------------------------------------- gulpfile.js | 2 +- scripts/npm/README.md | 37 ++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 58 deletions(-) create mode 100644 scripts/npm/README.md diff --git a/README.md b/README.md index 67ddff606c..4ba33666bb 100644 --- a/README.md +++ b/README.md @@ -14,61 +14,4 @@ To try Ionic 2 today, visit the [Ionic 2 Docs](http://ionicframework.com/docs/v2 There are a few real Ionic 2 apps in the wild. The most complete is the [Ionic Conference App](https://github.com/driftyco/ionic-conference-app), a perfect starting point for building your own conference app. -## Distribution - - [npm: ionic-framework](https://www.npmjs.com/package/ionic-framework) - -## Ionic Framework Package - The ionic-framework package comes with both frontend dependencies, located in 'dist', and a Node API, located in 'tooling'. - -### Bundles: - - - `css/` - - the Ionic CSS stylesheet - - `fonts/` - - Ionicons and Roboto fonts - - `js/` - - `ionic.js` the Ionic module, in System register format - - `ionic.bundle.js` the Ionic bundle, contains: - - es6-module-loader.js - - system.js - - angular2.dev.js - - router.dev.js (angular2 router) - - ionic.js - - web-animations.min.js - - `web-animations.min.js` web animations API polyfill - -### Source files: - - - `src/es5` - Ionic ES5 source files in both CommonJS and System module formats - - `src/es6` - Ionic ES6 source files - - `src/ts` - Ionic TypeScript source files (typings still missing) - - `scss` - Ionic Sass source files - ---------- - -### Tooling - - At the moment, ionic-framework exports one function, `generate`, that can be used to scaffold new pages in an Ionic app. It is used by the [Ionic CLI's](https://github.com/driftyco/ionic-cli) `generate` command. - -#### Methods - -`generate(config)` - -Creates the js, html, and scss file for a new page, based on the supplied [Generator](#generators). - -- **config** (Object) Config object, with the following options: - - `appDirectory` - root directory of the Ionic project - - `generator` - which [generator](#generators) to use, default is `page`. - - `name` - the name of the component to generate. - -Example: - ``` - var ionic = require('ionic-framework'); - ionic.generate({ appDirectory: process.cwd(), generator: 'tabs', name: 'MyTabsPage' }) - ``` - -#### Generators -- `page`, a blank page -- `tabs`, a page with tab navigation - diff --git a/gulpfile.js b/gulpfile.js index 9ea32607a6..d1dd9f6cb1 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -401,7 +401,7 @@ gulp.task('package', ['src'], function(){ return gulp.src([ 'scripts/npm/.npmignore', 'scripts/npm/package.json', - 'README.md' + 'scripts/npm/README.md' ]) .pipe(gulp.dest('dist')); }); diff --git a/scripts/npm/README.md b/scripts/npm/README.md new file mode 100644 index 0000000000..2f42aeeaf3 --- /dev/null +++ b/scripts/npm/README.md @@ -0,0 +1,37 @@ +## Ionic Framework Package + The ionic-framework package comes with both Javascript and Sass frontend dependencies, located in `dist/`, and a Node API, located in `tooling/`. + +### Source files: + +ES5 sources in the CommonJS module format, their associated Typescript type definition files, and the Ionic Sass entry files are located in `dist/`. The Javascript sources are meant to be used by a bundler such as Webpack, SystemJS Builder, or Browserify. The type definitions provide support to Typescript tooling for things like type checking and code completion. + +### Bundles: + +Minified and unminified CommonJS and System.register module format bundles, as well as compiled CSS stylesheets for both Ionic iOS and Material Design are located `dist/bundles/`. These can also be used with bundlers to a certain extent, for example, using Webpack's [`externals option`](https://webpack.github.io/docs/configuration.html#externals). The SystemJS bundle is primarily meant to be included in a `