Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Commit 25e10be

Browse files
feat(api, img-src): add ImgSrcDirective for responsive API for img elements
* add responsive API to img.src: src.md, src.lt-lg, src.gt-xs, etc. * repackage API classes to easily distinguish flexbox APIs and extended responsive APIs Closes #366, Fixes #376.
1 parent bbc1ba9 commit 25e10be

36 files changed

+787
-373
lines changed

LICENSE

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ copies of the Software, and to permit persons to whom the Software is
1010
furnished to do so, subject to the following conditions:
1111

1212
The above copyright notice and this permission notice shall be included in
13-
all copies or substantial portions of the Software.
13+
all copies or substantial portions of the Software.
1414

1515
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1616
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

src/lib/flexbox/api/base-adapter.ts renamed to src/lib/api/core/base-adapter.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import {ElementRef, Renderer2} from '@angular/core';
99

1010
import {BaseFxDirective} from './base';
11-
import {ResponsiveActivation} from './../responsive/responsive-activation';
11+
import {ResponsiveActivation} from './responsive-activation';
1212
import {MediaQuerySubscriber} from '../../media-query/media-change';
1313
import {MediaMonitor} from '../../media-query/media-monitor';
1414

src/lib/flexbox/api/base.ts renamed to src/lib/api/core/base.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
applyStyleToElements
2020
} from '../../utils/style-utils';
2121

22-
import {ResponsiveActivation, KeyOptions} from '../responsive/responsive-activation';
22+
import {ResponsiveActivation, KeyOptions} from '../core/responsive-activation';
2323
import {MediaMonitor} from '../../media-query/media-monitor';
2424
import {MediaQuerySubscriber} from '../../media-query/media-change';
2525

@@ -78,6 +78,10 @@ export abstract class BaseFxDirective implements OnDestroy, OnChanges {
7878
return this._elementRef.nativeElement.parentNode;
7979
}
8080

81+
protected get nativeElement(): any {
82+
return this._elementRef.nativeElement;
83+
}
84+
8185
/**
8286
* Access the current value (if any) of the @Input property.
8387
*/
@@ -130,7 +134,7 @@ export abstract class BaseFxDirective implements OnDestroy, OnChanges {
130134
* and optional restore it when the mediaQueries deactivate
131135
*/
132136
protected _getDisplayStyle(source?: HTMLElement): string {
133-
let element: HTMLElement = source || this._elementRef.nativeElement;
137+
let element: HTMLElement = source || this.nativeElement;
134138
return lookupStyle(element, 'display');
135139
}
136140

@@ -161,7 +165,7 @@ export abstract class BaseFxDirective implements OnDestroy, OnChanges {
161165
protected _applyStyleToElement(style: StyleDefinition,
162166
value?: string | number,
163167
nativeElement?: any) {
164-
let element = nativeElement || this._elementRef.nativeElement;
168+
let element = nativeElement || this.nativeElement;
165169
applyStyleToElement(this._renderer, element, style, value);
166170
}
167171

@@ -209,7 +213,7 @@ export abstract class BaseFxDirective implements OnDestroy, OnChanges {
209213
* Special accessor to query for all child 'element' nodes regardless of type, class, etc.
210214
*/
211215
protected get childrenNodes() {
212-
const obj = this._elementRef.nativeElement.children;
216+
const obj = this.nativeElement.children;
213217
const buffer = [];
214218

215219
// iterate backwards ensuring that length is an UInt32

src/lib/flexbox/responsive/responsive-activation.ts renamed to src/lib/api/core/responsive-activation.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,28 @@ export class KeyOptions {
4343
export class ResponsiveActivation {
4444
private _subscribers: SubscriptionList = [];
4545
private _activatedInputKey: string;
46+
private _registryMap: BreakPointX[];
4647

4748
/**
4849
* Constructor
4950
*/
5051
constructor(private _options: KeyOptions,
5152
private _mediaMonitor: MediaMonitor,
5253
private _onMediaChanges: MediaQuerySubscriber) {
54+
this._registryMap = this._buildRegistryMap();
5355
this._subscribers = this._configureChangeObservers();
5456
}
5557

58+
/**
59+
* Get a readonly sorted list of the breakpoints corresponding to the directive properties
60+
* defined in the HTML markup: the sorting is done from largest to smallest. The order is
61+
* important when several media queries are 'registered' and from which, the browser uses the
62+
* first matching media query.
63+
*/
64+
get registryFromLargest(): BreakPointX[] {
65+
return [...this._registryMap].reverse();
66+
}
67+
5668
/**
5769
* Accessor to the DI'ed directive property
5870
* Each directive instance has a reference to the MediaMonitor which is
@@ -107,7 +119,7 @@ export class ResponsiveActivation {
107119
private _configureChangeObservers(): SubscriptionList {
108120
let subscriptions = [];
109121

110-
this._buildRegistryMap().forEach((bp: BreakPointX) => {
122+
this._registryMap.forEach((bp: BreakPointX) => {
111123
if (this._keyInUse(bp.key)) {
112124
// Inject directive default property key name: to let onMediaChange() calls
113125
// know which property is being triggered...
File renamed without changes.

src/lib/flexbox/api/class.ts renamed to src/lib/api/ext/class.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ import {
2222
} from '@angular/core';
2323
import {NgClass} from '@angular/common';
2424

25-
import {BaseFxDirective} from './base';
26-
import {BaseFxDirectiveAdapter} from './base-adapter';
25+
import {BaseFxDirective} from '../core/base';
26+
import {BaseFxDirectiveAdapter} from '../core/base-adapter';
2727
import {MediaChange} from '../../media-query/media-change';
2828
import {MediaMonitor} from '../../media-query/media-monitor';
2929

src/lib/flexbox/api/hide.spec.ts renamed to src/lib/api/ext/hide.spec.ts

+36-36
Original file line numberDiff line numberDiff line change
@@ -69,38 +69,38 @@ describe('hide directive', () => {
6969

7070
it('should initial with component not visible as default', () => {
7171
createTestComponent(`<div fxHide></div>`);
72-
expectNativeEl(fixture).toHaveCssStyle({'display': 'none'});
72+
expectNativeEl(fixture).toHaveStyle({'display': 'none'});
7373
});
7474

7575
it('should initial with component visible when set to `false`', () => {
7676
createTestComponent(`<div fxHide="false"></div>`);
77-
expectNativeEl(fixture).toHaveCssStyle({'display': 'block'});
77+
expectNativeEl(fixture).toHaveStyle({'display': 'block'});
7878
});
7979

8080
it('should initial with component visible when set to `0`', () => {
8181
createTestComponent(`<div [fxHide]="isVisible"></div>`);
82-
expectNativeEl(fixture, {isVisible: 0}).toHaveCssStyle({'display': 'block'});
82+
expectNativeEl(fixture, {isVisible: 0}).toHaveStyle({'display': 'block'});
8383
});
8484

8585
it('should update styles with binding changes', () => {
8686
createTestComponent(`<div [fxHide]="menuHidden"></div>`);
87-
expectNativeEl(fixture).toHaveCssStyle({'display': 'none'});
87+
expectNativeEl(fixture).toHaveStyle({'display': 'none'});
8888
fixture.componentInstance.toggleMenu();
89-
expectNativeEl(fixture).toHaveCssStyle({'display': 'block'});
89+
expectNativeEl(fixture).toHaveStyle({'display': 'block'});
9090
fixture.componentInstance.toggleMenu();
91-
expectNativeEl(fixture).toHaveCssStyle({'display': 'none'});
91+
expectNativeEl(fixture).toHaveStyle({'display': 'none'});
9292
});
9393

9494
it('should use "block" display style when not explicitly defined', () => {
9595
createTestComponent(`<button [fxHide]="isHidden"></button>`);
96-
expectNativeEl(fixture, {isHidden: true}).toHaveCssStyle({'display': 'none'});
97-
expectNativeEl(fixture, {isHidden: false}).toHaveCssStyle({'display': 'inline-block'});
96+
expectNativeEl(fixture, {isHidden: true}).toHaveStyle({'display': 'none'});
97+
expectNativeEl(fixture, {isHidden: false}).toHaveStyle({'display': 'inline-block'});
9898
});
9999

100100
it('should use "flex" display style when the element also has an fxLayout', () => {
101101
createTestComponent(`<div fxLayout [fxHide]="isHidden"></div>`);
102-
expectNativeEl(fixture, {isHidden: true}).toHaveCssStyle({'display': 'none'});
103-
expectNativeEl(fixture, {isHidden: false}).toHaveCssStyle({'display': 'block'});
102+
expectNativeEl(fixture, {isHidden: true}).toHaveStyle({'display': 'none'});
103+
expectNativeEl(fixture, {isHidden: false}).toHaveStyle({'display': 'block'});
104104
});
105105

106106

@@ -111,73 +111,73 @@ describe('hide directive', () => {
111111
it('should show on `xs` viewports only when the default is included', () => {
112112
createTestComponent(`<div fxHide="" fxHide.xs="false"></div>`);
113113

114-
expectNativeEl(fixture).toHaveCssStyle({'display': 'none'});
114+
expectNativeEl(fixture).toHaveStyle({'display': 'none'});
115115
matchMedia.activate('xs');
116-
expectNativeEl(fixture).toHaveCssStyle({'display': 'block'});
116+
expectNativeEl(fixture).toHaveStyle({'display': 'block'});
117117
matchMedia.activate('md');
118-
expectNativeEl(fixture).toHaveCssStyle({'display': 'none'});
118+
expectNativeEl(fixture).toHaveStyle({'display': 'none'});
119119
});
120120

121121
it('should preserve display and update only on activated mediaQuery', () => {
122122
createTestComponent(`<div [fxHide.xs]="isHidden" style="display:inline-block"></div>`);
123-
expectNativeEl(fixture).toHaveCssStyle({'display': 'inline-block'});
123+
expectNativeEl(fixture).toHaveStyle({'display': 'inline-block'});
124124

125125
// should hide with this activation
126126
matchMedia.activate('xs');
127-
expectNativeEl(fixture).toHaveCssStyle({'display': 'none'});
127+
expectNativeEl(fixture).toHaveStyle({'display': 'none'});
128128

129129
// should reset to original display style
130130
matchMedia.activate('md');
131-
expectNativeEl(fixture).toHaveCssStyle({'display': 'inline-block'});
131+
expectNativeEl(fixture).toHaveStyle({'display': 'inline-block'});
132132
});
133133

134134
it('should restore original display when disabled', () => {
135135
createTestComponent(`<div [fxHide.xs]="isHidden" style="display:inline-block"></div>`);
136-
expectNativeEl(fixture).toHaveCssStyle({'display': 'inline-block'});
136+
expectNativeEl(fixture).toHaveStyle({'display': 'inline-block'});
137137

138138
// should hide with this activation
139139
matchMedia.activate('xs');
140-
expectNativeEl(fixture).toHaveCssStyle({'display': 'none'});
140+
expectNativeEl(fixture).toHaveStyle({'display': 'none'});
141141

142142
// should reset to original display style
143143
fixture.componentInstance.isHidden = false;
144-
expectNativeEl(fixture).toHaveCssStyle({'display': 'inline-block'});
144+
expectNativeEl(fixture).toHaveStyle({'display': 'inline-block'});
145145
});
146146

147147
it('should restore original display when the mediaQuery deactivates', () => {
148148
let originalDisplay = {'display': 'table'};
149149
createTestComponent(`<div [fxHide.xs]="isHidden" style="display:table"></div>`);
150-
expectNativeEl(fixture).toHaveCssStyle(originalDisplay);
150+
expectNativeEl(fixture).toHaveStyle(originalDisplay);
151151

152152
// should hide with this activation
153153
matchMedia.activate('xs');
154-
expectNativeEl(fixture).toHaveCssStyle({'display': 'none'});
154+
expectNativeEl(fixture).toHaveStyle({'display': 'none'});
155155

156156
// should reset to original display style
157157
matchMedia.activate('md');
158-
expectNativeEl(fixture).toHaveCssStyle(originalDisplay);
158+
expectNativeEl(fixture).toHaveStyle(originalDisplay);
159159
});
160160

161161
it('should support use of the `media` observable in templates ', () => {
162162
createTestComponent(`<div [fxHide]="media.isActive('xs')"></div>`);
163-
expectNativeEl(fixture).toHaveCssStyle({'display': 'block'});
163+
expectNativeEl(fixture).toHaveStyle({'display': 'block'});
164164

165165
matchMedia.activate('xs');
166-
expectNativeEl(fixture).toHaveCssStyle({'display': 'none'});
166+
expectNativeEl(fixture).toHaveStyle({'display': 'none'});
167167

168168
matchMedia.activate('lg');
169-
expectNativeEl(fixture).toHaveCssStyle({'display': 'block'});
169+
expectNativeEl(fixture).toHaveStyle({'display': 'block'});
170170
});
171171

172172
it('should support use of the `media` observable in adaptive templates ', () => {
173173
createTestComponent(`<div fxHide="false" [fxHide.md]="media.isActive('xs')"></div>`);
174-
expectNativeEl(fixture).toHaveCssStyle({'display': 'block'});
174+
expectNativeEl(fixture).toHaveStyle({'display': 'block'});
175175

176176
matchMedia.activate('xs');
177-
expectNativeEl(fixture).toHaveCssStyle({'display': 'block'});
177+
expectNativeEl(fixture).toHaveStyle({'display': 'block'});
178178

179179
matchMedia.activate('md');
180-
expectNativeEl(fixture).toHaveCssStyle({'display': 'block'});
180+
expectNativeEl(fixture).toHaveStyle({'display': 'block'});
181181
});
182182

183183
it('should hide when used with fxLayout and the ".md" breakpoint activates', () => {
@@ -198,8 +198,8 @@ describe('hide directive', () => {
198198
`;
199199
let expectActivation = makeExpectWithActivation(createTestComponent(template), '.hideOnMd');
200200

201-
expectActivation().toHaveCssStyle({'display': 'block'});
202-
expectActivation('md').toHaveCssStyle({'display': 'none'});
201+
expectActivation().toHaveStyle({'display': 'block'});
202+
expectActivation('md').toHaveStyle({'display': 'none'});
203203
});
204204

205205
it('should restore proper display mode when not hiding', () => {
@@ -210,9 +210,9 @@ describe('hide directive', () => {
210210
`;
211211
let expectActivation = makeExpectWithActivation(createTestComponent(template), '.hideOnXs');
212212

213-
expectActivation().toHaveCssStyle({'display': 'inline'});
214-
expectActivation('xs').toHaveCssStyle({'display': 'none'});
215-
expectActivation('md').toHaveCssStyle({'display': 'inline'});
213+
expectActivation().toHaveStyle({'display': 'inline'});
214+
expectActivation('xs').toHaveStyle({'display': 'none'});
215+
expectActivation('md').toHaveStyle({'display': 'inline'});
216216
});
217217
});
218218

@@ -222,13 +222,13 @@ describe('hide directive', () => {
222222
This content to be shown ONLY when gt-sm
223223
</div>
224224
`);
225-
expectNativeEl(fixture).toHaveCssStyle({'display': 'inline-block'});
225+
expectNativeEl(fixture).toHaveStyle({'display': 'inline-block'});
226226

227227
matchMedia.activate('md', true);
228-
expectNativeEl(fixture).toHaveCssStyle({'display': 'none'});
228+
expectNativeEl(fixture).toHaveStyle({'display': 'none'});
229229

230230
matchMedia.activate('xs', true);
231-
expectNativeEl(fixture).toHaveCssStyle({'display': 'inline-block'});
231+
expectNativeEl(fixture).toHaveStyle({'display': 'inline-block'});
232232
});
233233

234234
});

0 commit comments

Comments
 (0)