From fb71eb12e6b4485b2ba70bd5043da492c0deeaee Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Mon, 21 Mar 2016 13:27:36 -0700 Subject: [PATCH] feat(list): add list component --- screenshots/demo page: index.screenshot.png | Bin 130 -> 25066 bytes screenshots/initial state.screenshot.png | Bin 0 -> 25066 bytes scripts/e2e.sh | 2 + src/components/list/list-item.html | 5 + src/components/list/list.scss | 138 +++++++++++++++ src/components/list/list.spec.ts | 180 ++++++++++++++++++++ src/components/list/list.ts | 63 +++++++ src/components/list/package.json | 27 +++ src/demo-app/demo-app.html | 1 + src/demo-app/demo-app.ts | 3 +- src/demo-app/list/list-demo.html | 68 ++++++++ src/demo-app/list/list-demo.scss | 23 +++ src/demo-app/list/list-demo.ts | 44 +++++ 13 files changed, 553 insertions(+), 1 deletion(-) create mode 100644 screenshots/initial state.screenshot.png create mode 100644 src/components/list/list-item.html create mode 100644 src/components/list/list.scss create mode 100644 src/components/list/list.spec.ts create mode 100644 src/components/list/list.ts create mode 100644 src/components/list/package.json create mode 100644 src/demo-app/list/list-demo.html create mode 100644 src/demo-app/list/list-demo.scss create mode 100644 src/demo-app/list/list-demo.ts diff --git a/screenshots/demo page: index.screenshot.png b/screenshots/demo page: index.screenshot.png index 7e15bbfe269ee297c69e2b3b564edb4fac7c80cb..8d255a9f617b264777838d295806171b26e29bf1 100644 GIT binary patch literal 25066 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

`H=0a!V>tW(zLog+FqS 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

`H=0a!V>tW(zLog+FqS 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 + +

+ + \ No newline at end of file diff --git a/src/components/list/list.scss b/src/components/list/list.scss new file mode 100644 index 000000000000..c26003d851f6 --- /dev/null +++ b/src/components/list/list.scss @@ -0,0 +1,138 @@ +@import "variables"; + +$md-list-side-padding: 16px; +$md-list-avatar-size: 40px; + +/* Normal list variables */ +$md-list-top-padding: 8px; +$md-list-font-size: 16px; +$md-list-secondary-font: 14px; +// height for single-line lists +$md-list-base-height: 48px; +// height for single-line lists with avatars +$md-list-avatar-height: 56px; +// spec requires two- and three-line lists be taller +$md-list-two-line-height: 72px; +$md-list-three-line-height: 88px; + +/* Dense list variables */ +$md-dense-top-padding: 4px; +$md-dense-font-size: 13px; +$md-dense-base-height: 40px; +$md-dense-avatar-height: 48px; +$md-dense-two-line-height: 60px; +$md-dense-three-line-height: 76px; + +/* +This mixin provides all list-item styles, changing font size and height +based on whether the list is in "dense" mode. +*/ +@mixin md-list-item-base($font-size, $base-height, $avatar-height, + $two-line-height, $three-line-height) { + + .md-list-item { + display: flex; + flex-direction: row; + align-items: center; + font-family: $md-font-family; + box-sizing: border-box; + font-size: $font-size; + height: $base-height; + padding: 0 $md-list-side-padding; + } + + &.md-list-avatar .md-list-item { + height: $avatar-height; + } + + &.md-2-line .md-list-item { + height: $two-line-height; + } + + &.md-3-line .md-list-item { + height: $three-line-height; + } + + .md-list-text { + display: flex; + flex-direction: column; + width: 100%; + padding: 0 $md-list-side-padding; + + &:first-child { + padding: 0; + } + + &:empty { + display: none; + } + + & > * { + margin: 0; + padding: 0; + font-weight: normal; + font-size: inherit; + } + } + + [md-list-avatar] { + width: $md-list-avatar-size; + height: $md-list-avatar-size; + } +} + +/* +This mixin provides all md-line styles, changing secondary font size +based on whether the list is in "dense" mode. +*/ +@mixin md-line-base($secondary-font-size) { + + [md-line] { + display: block; + white-space: nowrap; + overflow-x: hidden; + text-overflow: ellipsis; + box-sizing: border-box; + + // all lines but the top line should have smaller text + &:nth-child(n+2) { + font-size: $secondary-font-size; + } + } +} + +md-list { + padding-top: $md-list-top-padding; + display: block; + + md-list-item { + @include md-list-item-base( + $md-list-font-size, + $md-list-base-height, + $md-list-avatar-height, + $md-list-two-line-height, + $md-list-three-line-height + ); + + @include md-line-base($md-list-secondary-font); + } +} + + +md-list[dense] { + padding-top: $md-dense-top-padding; + display: block; + + + md-list-item { + @include md-list-item-base( + $md-dense-font-size, + $md-dense-base-height, + $md-dense-avatar-height, + $md-dense-two-line-height, + $md-dense-three-line-height + ); + + @include md-line-base($md-dense-font-size); + } +} \ No newline at end of file diff --git a/src/components/list/list.spec.ts b/src/components/list/list.spec.ts new file mode 100644 index 000000000000..16654b3c99b6 --- /dev/null +++ b/src/components/list/list.spec.ts @@ -0,0 +1,180 @@ +import { + inject, + TestComponentBuilder +} from 'angular2/testing'; +import { + it, + describe, + expect, + beforeEach, +} from '../../core/facade/testing'; +import {Component} from 'angular2/core'; +import {By} from 'angular2/platform/browser'; + +import {MD_LIST_DIRECTIVES} from './list'; + +export function main() { + describe('MdList', () => { + let builder: TestComponentBuilder; + + beforeEach(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { + builder = tcb; + })); + + it('should not apply any class to a list without lines', (done: () => void) => { + var template = ` + + + Paprika + + + `; + return builder.overrideTemplate(TestList, template) + .createAsync(TestList).then((fixture) => { + let listItem = fixture.debugElement.query(By.css('md-list-item')); + fixture.detectChanges(); + expect(listItem.nativeElement.className).toBe(''); + done(); + }); + }); + + it('should apply md-2-line class to lists with two lines', (done: () => void) => { + var template = ` + + + +

{{item.name}}

+

{{item.description}}

+
+
+ `; + return builder.overrideTemplate(TestList, template) + .createAsync(TestList).then((fixture) => { + fixture.detectChanges(); + let listItems = fixture.debugElement.children[0].queryAll(By.css('md-list-item')); + expect(listItems[0].nativeElement.className).toBe('md-2-line'); + expect(listItems[1].nativeElement.className).toBe('md-2-line'); + done(); + }); + }); + + it('should apply md-3-line class to lists with three lines', (done: () => void) => { + var template = ` + + +

{{item.name}}

+

{{item.description}}

+

Some other text

+
+
+ `; + return builder.overrideTemplate(TestList, template) + .createAsync(TestList).then((fixture) => { + fixture.detectChanges(); + let listItems = fixture.debugElement.children[0].queryAll(By.css('md-list-item')); + expect(listItems[0].nativeElement.className).toBe('md-3-line'); + expect(listItems[1].nativeElement.className).toBe('md-3-line'); + done(); + }); + }); + + it('should apply md-list-avatar class to list items with avatars', (done: () => void) => { + var template = ` + + + + Paprika + + + Pepper + + + `; + return builder.overrideTemplate(TestList, template) + .createAsync(TestList).then((fixture) => { + fixture.detectChanges(); + let listItems = fixture.debugElement.children[0].queryAll(By.css('md-list-item')); + expect(listItems[0].nativeElement.className).toBe('md-list-avatar'); + expect(listItems[1].nativeElement.className).toBe(''); + done(); + }); + }); + + it('should not clear custom classes provided by user', (done: () => void) => { + var template = ` + + +

{{item.name}}

+

{{item.description}}

+
+
+ `; + return builder.overrideTemplate(TestList, template) + .createAsync(TestList).then((fixture) => { + fixture.detectChanges(); + let listItems = fixture.debugElement.children[0].queryAll(By.css('md-list-item')); + expect(listItems[0].nativeElement.classList.contains('test-class')).toBe(true); + done(); + }); + }); + + it('should update classes if number of lines change', (done: () => void) => { + var template = ` + + +

{{item.name}}

+

{{item.description}}

+

Some other text

+
+
+ `; + return builder.overrideTemplate(TestList, template) + .createAsync(TestList).then((fixture) => { + fixture.debugElement.componentInstance.showThirdLine = false; + fixture.detectChanges(); + let listItem = fixture.debugElement.children[0].query(By.css('md-list-item')); + expect(listItem.nativeElement.className).toBe('md-2-line'); + + fixture.debugElement.componentInstance.showThirdLine = true; + fixture.detectChanges(); + setTimeout(() => { + expect(listItem.nativeElement.className).toBe('md-3-line'); + done(); + }); + }); + }); + + it('should add aria roles properly', (done: () => void) => { + var template = ` + + + {{item.name}} + + + `; + return builder.overrideTemplate(TestList, template) + .createAsync(TestList).then((fixture) => { + fixture.detectChanges(); + let list = fixture.debugElement.children[0]; + let listItem = fixture.debugElement.children[0].query(By.css('md-list-item')); + expect(list.nativeElement.getAttribute('role')).toBe('list'); + expect(listItem.nativeElement.getAttribute('role')).toBe('listitem'); + done(); + }); + }); + + }); +} + +@Component({ + selector: 'test-list', + template: ``, + directives: [MD_LIST_DIRECTIVES] +}) +class TestList { + items: any[] = [ + {'name': 'Paprika', 'description': 'A seasoning'}, + {'name': 'Pepper', 'description': 'Another seasoning'} + ]; + showThirdLine: boolean = false; +} diff --git a/src/components/list/list.ts b/src/components/list/list.ts new file mode 100644 index 000000000000..b1bb308ed627 --- /dev/null +++ b/src/components/list/list.ts @@ -0,0 +1,63 @@ +import {Component, ViewEncapsulation, ContentChildren, ContentChild, QueryList, Directive, + ElementRef, Renderer, AfterContentInit} from 'angular2/core'; +import {CONST_EXPR} from 'angular2/src/facade/lang'; + +@Component({ + selector: 'md-list', + host: {'role': 'list'}, + template: '', + styleUrls: ['./components/list/list.css'], + encapsulation: ViewEncapsulation.None +}) +export class MdList {} + +/* Need directive for a ContentChildren query in list-item */ +@Directive({ selector: '[md-line]' }) +export class MdLine {} + +/* Need directive for a ContentChild query in list-item */ +@Directive({ selector: '[md-list-avatar]' }) +export class MdListAvatar {} + +@Component({ + selector: 'md-list-item', + host: {'role': 'listitem'}, + templateUrl: './components/list/list-item.html', + encapsulation: ViewEncapsulation.None +}) +export class MdListItem implements AfterContentInit { + @ContentChildren(MdLine) _lines: QueryList; + + ngAfterContentInit() { + this._setLineClass(this._lines.length); + + this._lines.changes.subscribe(() => { + this._setLineClass(this._lines.length); + }); + } + + @ContentChild(MdListAvatar) + set _hasAvatar(avatar: MdListAvatar) { + this._setClass('md-list-avatar', avatar != null); + } + + constructor(private _renderer: Renderer, private _element: ElementRef) {} + + _setLineClass(count: number): void { + this._resetClasses(); + if (count === 2 || count === 3) { + this._setClass(`md-${count}-line`, true); + } + } + + _resetClasses(): void { + this._setClass('md-2-line', false); + this._setClass('md-3-line', false); + } + + _setClass(className: string, bool: boolean): void { + this._renderer.setElementClass(this._element.nativeElement, className, bool); + } +} + +export const MD_LIST_DIRECTIVES: any[] = CONST_EXPR([MdList, MdListItem, MdLine, MdListAvatar]); diff --git a/src/components/list/package.json b/src/components/list/package.json new file mode 100644 index 000000000000..cac25ac8e24d --- /dev/null +++ b/src/components/list/package.json @@ -0,0 +1,27 @@ +{ + "name": "@angular2-material/list", + "version": "2.0.0-alpha.1", + "description": "Angular 2 Material list", + "main": "./list.js", + "typings": "./list.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/angular/material2.git" + }, + "keywords": [ + "angular", + "material", + "material design", + "components", + "list" + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/material2/issues" + }, + "homepage": "https://github.com/angular/material2#readme", + "peerDependencies": { + "angular2": "^2.0.0-beta.8", + "@angular2-material/core": "2.0.0-alpha.1" + } +} diff --git a/src/demo-app/demo-app.html b/src/demo-app/demo-app.html index e1ad0b6cbacd..0ec37dfec0c3 100644 --- a/src/demo-app/demo-app.html +++ b/src/demo-app/demo-app.html @@ -9,6 +9,7 @@

Angular Material2 Demos

  • Checkbox demo
  • Toolbar demo
  • Radio demo
  • +
  • List demo
  • + +
    +
    +

    Normal lists

    + + + + {{item}} + + + + + + +

    {{contact.name}}

    +

    extra line

    +

    {{contact.headline}}

    +
    +
    + + + +

    {{message.from}}

    +

    + {{message.subject}} -- + {{message.message}} +

    +
    +
    + + + +

    {{message.from}}

    +

    {{message.subject}}

    +

    {{message.message}}

    +
    +
    +
    + +
    +

    Dense lists

    + + + {{item}} + + + + + + +

    {{contact.name}}

    +

    {{contact.headline}}

    +
    +
    + + + +

    {{message.from}}

    +

    {{message.subject}}

    +

    {{message.message}}

    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/demo-app/list/list-demo.scss b/src/demo-app/list/list-demo.scss new file mode 100644 index 000000000000..4cfc8d09903a --- /dev/null +++ b/src/demo-app/list/list-demo.scss @@ -0,0 +1,23 @@ + +.demo { + width: 350px; + display: flex; + + md-list { + border: 1px dotted gray; + width: 350px; + margin: 0 20px; + + } + h2 { + margin: 0 20px; + } +} + +.demo-button { + margin: 20px; +} + +.demo-secondary-text { + color: rgba(0, 0, 0, 0.54); +} \ No newline at end of file diff --git a/src/demo-app/list/list-demo.ts b/src/demo-app/list/list-demo.ts new file mode 100644 index 000000000000..57d8eaaec74f --- /dev/null +++ b/src/demo-app/list/list-demo.ts @@ -0,0 +1,44 @@ +import {Component} from 'angular2/core'; +import {MdButton} from '../../components/button/button'; +import {MD_LIST_DIRECTIVES} from '../../components/list/list'; + +@Component({ + selector: 'list-demo', + templateUrl: 'demo-app/list/list-demo.html', + styleUrls: ['demo-app/list/list-demo.css'], + directives: [MD_LIST_DIRECTIVES, MdButton] +}) +export class ListDemo { + items: string[] = [ + 'Pepper', + 'Salt', + 'Paprika' + ]; + + contacts: any[] = [ + {name: 'Nancy', headline: 'Software engineer'}, + {name: 'Mary', headline: 'TPM'}, + {name: 'Bobby', headline: 'UX designer'} + ]; + + messages: any[] = [ + { + from: 'Nancy', + subject: 'Brunch?', + message: 'Did you want to go on Sunday? I was thinking that might work.' + }, + { + from: 'Mary', + subject: 'Summer BBQ', + message: 'Wish I could come, but I have some prior obligations.' + }, + { + from: 'Bobby', + subject: 'Oui oui', + message: 'Do you have Paris reservations for the 15th? I just booked!' + } + ]; + + thirdLine: boolean = false; + +}