Package upgrades, Prettier alignment (#38)

- Package upgrades (non-breaking)
- Align repo to Prettier 1.15.3
  - [includes] Revert decorators to their previous position in components, before the change in 1.14.
This commit is contained in:
Ben Grynhaus 2018-12-01 21:25:27 +02:00 коммит произвёл GitHub
Родитель 13ff801cc7
Коммит 68f3581e9e
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
117 изменённых файлов: 12020 добавлений и 8105 удалений

Просмотреть файл

@ -14,6 +14,7 @@ For more information see the [Code of Conduct FAQ](https://opensource.microsoft.
or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
## Pull Requests Reviews
This is a simple guide to assist in reviewing Github pull requests locally within VS Code.
See: https://gist.github.com/piscisaureus/3342247
@ -66,4 +67,4 @@ Fast-forward
...
```
Note: "git pull" did not work for me by itself for the PR branch... Perhaps "git pull origin".
Note: "git pull" did not work for me by itself for the PR branch... Perhaps "git pull origin".

Просмотреть файл

@ -2,11 +2,12 @@
[![npm version](https://badge.fury.io/js/%40angular-react%2Fcore.svg)](https://www.npmjs.com/package/@angular-react/core)
Industry trends, organizational pressures, and other factors can lead to mandates regarding the use of component libraries or migration from one technology to another. In the case of [Office UI Fabric][fab], where its use is required, the client must be written in React (there is no Angular component library for the latest version). Rewrite from Angular to React may be cost-prohibitive or ill advised for other reasons.
Industry trends, organizational pressures, and other factors can lead to mandates regarding the use of component libraries or migration from one technology to another. In the case of [Office UI Fabric][fab], where its use is required, the client must be written in React (there is no Angular component library for the latest version). Rewrite from Angular to React may be cost-prohibitive or ill advised for other reasons.
Use of Angular-React allows consuming any React elements, but specifically Office UI Fabric, within an Angular [2+] application. The library of wrappers for Office UI Fabric simplifies the use of these components with Angular. However, any React code can make use of the custom Angular-React renderer.
Use of Angular-React allows consuming any React elements, but specifically Office UI Fabric, within an Angular [2+] application. The library of wrappers for Office UI Fabric simplifies the use of these components with Angular. However, any React code can make use of the custom Angular-React renderer.
### Quick links
[@angular-react/fabric](https://www.npmjs.com/package/@angular-react/fabric) |
[Documentation, quick start, and guides][ard] |
[Demo][ard-demo] |
@ -15,15 +16,18 @@ Use of Angular-React allows consuming any React elements, but specifically Offic
[Office UI Fabric](https://developer.microsoft.com/en-us/fabric)
### Typical Use Cases
- Use React component libraries with Angular
- Incrementally rewrite an Angular application into React (moving from atomic/leaf nodes upward into full features/pages until the entire app is re-written)
## Libraries
- [**core**][lib-core]: Includes the Renderer and supporting logic to render Angular components with React implementations as React components.
- [**fabric**][lib-fab]: The light-weight Angular component wrappers that expose the Fabric React component api through common Angular components (including both imperative AND declrative syntax in many cases).
# Roadmap
Initial work to prove the feasibility of adapting the Angular Renderer to output React managed components has concluded. We have moved beyond the initial simple Fabric components and expanded coverage to much of the available [Office UI Fabric][fab-c] component library.
Initial work to prove the feasibility of adapting the Angular Renderer to output React managed components has concluded. We have moved beyond the initial simple Fabric components and expanded coverage to much of the available [Office UI Fabric][fab-c] component library.
In the coming months we will continue to refine the component implementations as we use the angular-react core and fabric libraries in 2 real-world consumer facing production applications.

Просмотреть файл

@ -1,8 +1,7 @@
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) {
module.exports = function(config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
@ -11,15 +10,15 @@ module.exports = function (config) {
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular-devkit/build-angular/plugins/karma')
require('@angular-devkit/build-angular/plugins/karma'),
],
client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser
clearContext: false, // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, '../../coverage'),
reports: ['html', 'lcovonly'],
fixWebpackSourcePaths: true
fixWebpackSourcePaths: true,
},
reporters: ['progress', 'kjhtml'],
port: 9876,
@ -27,7 +26,6 @@ module.exports = function (config) {
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false
singleRun: false,
});
};

Просмотреть файл

@ -1,27 +1,19 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<head>
<meta charset="utf-8" />
<title>Angular-React Demo</title>
<title>Angular-React Demo</title>
<script>
// Store the URL the user was trying to access when receiving the 404.
sessionStorage.redirect = location.href;
</script>
<script>
// Store the URL the user was trying to access when receiving the 404.
sessionStorage.redirect = location.href;
</script>
<!-- Immediately redirect to the base URL so we can use the SPA routing. -->
<meta http-equiv="refresh" content="0;URL='https://microsoft.github.io/angular-react/demo/'"></meta>
</head>
<body>
<!-- IE required at least 512 bytes of data to show non-default 404. -->
</body>
</body>
<!-- Immediately redirect to the base URL so we can use the SPA routing. -->
<meta http-equiv="refresh" content="0;URL='https://microsoft.github.io/angular-react/demo/'" />
</head>
<body>
<!-- IE required at least 512 bytes of data to show non-default 404. -->
</body>
</html>

Просмотреть файл

@ -117,24 +117,56 @@
<fab-calendar [strings]="strings" (onSelectDate)="onSelectDate($event)"></fab-calendar>
<fab-marquee-selection [isEnabled]="marqueeEnabled" [selection]="selection">
<fab-details-list [selection]="selection" [items]="detailItems" (onColumnHeaderClick)="onColumnHeaderClicked($event)">
<fab-details-list
[selection]="selection"
[items]="detailItems"
(onColumnHeaderClick)="onColumnHeaderClicked($event)"
>
<columns>
<fab-details-list-column key="column-1" [minWidth]="150" name="Column #1" fieldName="field1" [isResizable]="true">
<fab-details-list-column
key="column-1"
[minWidth]="150"
name="Column #1"
fieldName="field1"
[isResizable]="true"
>
</fab-details-list-column>
<fab-details-list-column key="column-2" [minWidth]="150" name="Column #2" fieldName="field2" [isResizable]="true">
<fab-details-list-column
key="column-2"
[minWidth]="150"
name="Column #2"
fieldName="field2"
[isResizable]="true"
>
</fab-details-list-column>
<fab-details-list-column key="column-3" [minWidth]="150" name="Custom Column" fieldName="field3" [isResizable]="true">
<fab-details-list-column
key="column-3"
[minWidth]="150"
name="Custom Column"
fieldName="field3"
[isResizable]="true"
>
<render>
<ng-template let-index="index">
Custom content for index {{ index }}
</ng-template>
<ng-template let-index="index"> Custom content for index {{ index }} </ng-template>
</render>
</fab-details-list-column>
</columns>
<groups>
<fab-group-item key="group-1" name="Group #1" [count]="3" [startIndex]="0">
<fab-group-item [level]="1" key="group-1-1" name="Nested Group #1.1" [count]="1" [startIndex]="0"></fab-group-item>
<fab-group-item [level]="1" key="group-1-2" name="Nested Group #1.2" [count]="2" [startIndex]="1"></fab-group-item>
<fab-group-item
[level]="1"
key="group-1-1"
name="Nested Group #1.1"
[count]="1"
[startIndex]="0"
></fab-group-item>
<fab-group-item
[level]="1"
key="group-1-2"
name="Nested Group #1.2"
[count]="2"
[startIndex]="1"
></fab-group-item>
</fab-group-item>
<fab-group-item key="group-2" name="Group #2" [count]="1" [startIndex]="3"></fab-group-item>
<fab-group-item key="group-3" name="Group #3" [count]="1" [startIndex]="4"></fab-group-item>

Просмотреть файл

@ -8,8 +8,10 @@ import { ICalendarStrings, IContextualMenuProps, ISelection, Selection } from 'o
encapsulation: ViewEncapsulation.None,
})
export class AppComponent {
@ViewChild('customRange')
customRangeTemplate: TemplateRef<{ item: any; dismissMenu: (ev?: any, dismissAll?: boolean) => void }>;
@ViewChild('customRange') customRangeTemplate: TemplateRef<{
item: any;
dismissMenu: (ev?: any, dismissAll?: boolean) => void;
}>;
onClickEventHandler(ev) {
console.log('onClick', { ev });

Просмотреть файл

@ -72,7 +72,7 @@ import { CounterComponent } from './counter/counter.component';
FabCalendarModule,
FabDetailsListModule,
FabGroupModule,
FabMarqueeSelectionModule
FabMarqueeSelectionModule,
],
declarations: [AppComponent, CounterComponent],
bootstrap: [AppComponent],

Просмотреть файл

@ -4,7 +4,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/
selector: 'counter',
template: `
<fab-default-button [text]="count + '+'" (onClick)="onClick()"></fab-default-button>
`,
`,
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class CounterComponent {

Просмотреть файл

@ -1,14 +1,14 @@
<!doctype html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Angular-React Demo</title>
<base href="/">
<head>
<meta charset="utf-8" />
<title>Angular-React Demo</title>
<base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
</body>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" type="image/x-icon" href="favicon.ico" />
</head>
<body>
<app-root></app-root>
</body>
</html>

Просмотреть файл

@ -4,11 +4,6 @@
"outDir": "../../dist/out-tsc/apps/demo",
"module": "es2015"
},
"include": [
"**/*.ts"
],
"exclude": [
"**/*.spec.ts",
"src/test.ts"
]
"include": ["**/*.ts"],
"exclude": ["**/*.spec.ts", "src/test.ts"]
}

Просмотреть файл

@ -2,18 +2,9 @@
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc/apps/demo",
"types": [
"jasmine",
"node"
],
"types": ["jasmine", "node"],
"module": "commonjs"
},
"files": [
"src/test.ts",
"src/polyfills.ts"
],
"include": [
"**/*.spec.ts",
"**/*.d.ts"
]
"files": ["src/test.ts", "src/polyfills.ts"],
"include": ["**/*.spec.ts", "**/*.d.ts"]
}

Просмотреть файл

@ -1,17 +1,7 @@
{
"extends": "../../tslint.json",
"rules": {
"directive-selector": [
true,
"attribute",
"app",
"camelCase"
],
"component-selector": [
true,
"element",
"app",
"kebab-case"
]
"directive-selector": [true, "attribute", "app", "camelCase"],
"component-selector": [true, "element", "app", "kebab-case"]
}
}

Просмотреть файл

@ -1,8 +1,7 @@
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) {
module.exports = function(config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
@ -11,15 +10,15 @@ module.exports = function (config) {
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular-devkit/build-angular/plugins/karma')
require('@angular-devkit/build-angular/plugins/karma'),
],
client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser
clearContext: false, // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, '../../coverage'),
reports: ['html', 'lcovonly'],
fixWebpackSourcePaths: true
fixWebpackSourcePaths: true,
},
reporters: ['progress', 'kjhtml'],
port: 9876,
@ -27,7 +26,6 @@ module.exports = function (config) {
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false
singleRun: false,
});
};

Просмотреть файл

@ -1,27 +1,19 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<head>
<meta charset="utf-8" />
<title>Angular-React</title>
<title>Angular-React</title>
<script>
// Store the URL the user was trying to access when receiving the 404.
sessionStorage.redirect = location.href;
</script>
<script>
// Store the URL the user was trying to access when receiving the 404.
sessionStorage.redirect = location.href;
</script>
<!-- Immediately redirect to the base URL so we can use the SPA routing. -->
<meta http-equiv="refresh" content="0;URL='https://microsoft.github.io/angular-react/'"></meta>
</head>
<body>
<!-- IE required at least 512 bytes of data to show non-default 404. -->
</body>
</body>
<!-- Immediately redirect to the base URL so we can use the SPA routing. -->
<meta http-equiv="refresh" content="0;URL='https://microsoft.github.io/angular-react/'" />
</head>
<body>
<!-- IE required at least 512 bytes of data to show non-default 404. -->
</body>
</html>

Просмотреть файл

@ -8,24 +8,16 @@ import { ChangeDetectionStrategy, Component, Input, Output, EventEmitter } from
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class DotComponent {
@Input()
x: string;
@Input()
y: string;
@Input()
size: string;
@Input()
color: string;
@Input()
backgroundColor: string;
@Input()
textOverride: string;
@Input() x: string;
@Input() y: string;
@Input() size: string;
@Input() color: string;
@Input() backgroundColor: string;
@Input() textOverride: string;
@Output('onMouseEnter')
mouseEnter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
@Output('onMouseLeave')
mouseLeave: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
@Output('onMouseEnter') readonly mouseEnter = new EventEmitter<MouseEvent>();
@Output('onMouseLeave') readonly mouseLeave = new EventEmitter<MouseEvent>();
onMouseEnter = ev => this.mouseEnter.emit(ev as any);
onMouseLeave = ev => this.mouseLeave.emit(ev as any);
onMouseEnter = (ev: MouseEvent) => this.mouseEnter.emit(ev);
onMouseLeave = (ev: MouseEvent) => this.mouseLeave.emit(ev);
}

Просмотреть файл

@ -1,35 +1,38 @@
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="angular" aria-labelledby="simpleicons-angular-icon" role="img" viewBox="0 0 24 24">
<title id="simpleicons-angular-icon">Angular icon</title>
<path d="M9.93 12.645h4.134L11.996 7.74" />
<path d="M11.996.009L.686 3.988l1.725 14.76 9.585 5.243 9.588-5.238L23.308 3.99 11.996.01zm7.058 18.297h-2.636l-1.42-3.501H8.995l-1.42 3.501H4.937l7.06-15.648 7.057 15.648z"
<path
d="M11.996.009L.686 3.988l1.725 14.76 9.585 5.243 9.588-5.238L23.308 3.99 11.996.01zm7.058 18.297h-2.636l-1.42-3.501H8.995l-1.42 3.501H4.937l7.06-15.648 7.057 15.648z"
/>
</symbol>
<symbol id="react" aria-labelledby="simpleicons-react-icon" role="img" viewBox="0 0 24 24">
<title id="simpleicons-react-icon">React icon</title>
<circle cx="12" cy="12" r="2.139" />
<path d="M6.008 16.255l-.472-.12C2.018 15.246 0 13.737 0 11.996s2.018-3.25 5.536-4.139l.472-.119.133.468a23.53 23.53 0 0 0 1.363 3.578l.101.213-.101.213a23.307 23.307 0 0 0-1.363 3.578l-.133.467zM5.317 8.95c-2.674.751-4.315 1.9-4.315 3.046 0 1.145 1.641 2.294 4.315 3.046a24.95 24.95 0 0 1 1.182-3.046A24.752 24.752 0 0 1 5.317 8.95zM17.992 16.255l-.133-.469a23.357 23.357 0 0 0-1.364-3.577l-.101-.213.101-.213a23.42 23.42 0 0 0 1.364-3.578l.133-.468.473.119c3.517.889 5.535 2.398 5.535 4.14s-2.018 3.25-5.535 4.139l-.473.12zm-.491-4.259c.48 1.039.877 2.06 1.182 3.046 2.675-.752 4.315-1.901 4.315-3.046 0-1.146-1.641-2.294-4.315-3.046a24.788 24.788 0 0 1-1.182 3.046z"
<path
d="M6.008 16.255l-.472-.12C2.018 15.246 0 13.737 0 11.996s2.018-3.25 5.536-4.139l.472-.119.133.468a23.53 23.53 0 0 0 1.363 3.578l.101.213-.101.213a23.307 23.307 0 0 0-1.363 3.578l-.133.467zM5.317 8.95c-2.674.751-4.315 1.9-4.315 3.046 0 1.145 1.641 2.294 4.315 3.046a24.95 24.95 0 0 1 1.182-3.046A24.752 24.752 0 0 1 5.317 8.95zM17.992 16.255l-.133-.469a23.357 23.357 0 0 0-1.364-3.577l-.101-.213.101-.213a23.42 23.42 0 0 0 1.364-3.578l.133-.468.473.119c3.517.889 5.535 2.398 5.535 4.14s-2.018 3.25-5.535 4.139l-.473.12zm-.491-4.259c.48 1.039.877 2.06 1.182 3.046 2.675-.752 4.315-1.901 4.315-3.046 0-1.146-1.641-2.294-4.315-3.046a24.788 24.788 0 0 1-1.182 3.046z"
/>
<path d="M5.31 8.945l-.133-.467C4.188 4.992 4.488 2.494 6 1.622c1.483-.856 3.864.155 6.359 2.716l.34.349-.34.349a23.552 23.552 0 0 0-2.422 2.967l-.135.193-.235.02a23.657 23.657 0 0 0-3.785.61l-.472.119zm1.896-6.63c-.268 0-.505.058-.705.173-.994.573-1.17 2.565-.485 5.253a25.122 25.122 0 0 1 3.233-.501 24.847 24.847 0 0 1 2.052-2.544c-1.56-1.519-3.037-2.381-4.095-2.381zM16.795 22.677c-.001 0-.001 0 0 0-1.425 0-3.255-1.073-5.154-3.023l-.34-.349.34-.349a23.53 23.53 0 0 0 2.421-2.968l.135-.193.234-.02a23.63 23.63 0 0 0 3.787-.609l.472-.119.134.468c.987 3.484.688 5.983-.824 6.854a2.38 2.38 0 0 1-1.205.308zm-4.096-3.381c1.56 1.519 3.037 2.381 4.095 2.381h.001c.267 0 .505-.058.704-.173.994-.573 1.171-2.566.485-5.254a25.02 25.02 0 0 1-3.234.501 24.674 24.674 0 0 1-2.051 2.545z"
<path
d="M5.31 8.945l-.133-.467C4.188 4.992 4.488 2.494 6 1.622c1.483-.856 3.864.155 6.359 2.716l.34.349-.34.349a23.552 23.552 0 0 0-2.422 2.967l-.135.193-.235.02a23.657 23.657 0 0 0-3.785.61l-.472.119zm1.896-6.63c-.268 0-.505.058-.705.173-.994.573-1.17 2.565-.485 5.253a25.122 25.122 0 0 1 3.233-.501 24.847 24.847 0 0 1 2.052-2.544c-1.56-1.519-3.037-2.381-4.095-2.381zM16.795 22.677c-.001 0-.001 0 0 0-1.425 0-3.255-1.073-5.154-3.023l-.34-.349.34-.349a23.53 23.53 0 0 0 2.421-2.968l.135-.193.234-.02a23.63 23.63 0 0 0 3.787-.609l.472-.119.134.468c.987 3.484.688 5.983-.824 6.854a2.38 2.38 0 0 1-1.205.308zm-4.096-3.381c1.56 1.519 3.037 2.381 4.095 2.381h.001c.267 0 .505-.058.704-.173.994-.573 1.171-2.566.485-5.254a25.02 25.02 0 0 1-3.234.501 24.674 24.674 0 0 1-2.051 2.545z"
/>
<path d="M18.69 8.945l-.472-.119a23.479 23.479 0 0 0-3.787-.61l-.234-.02-.135-.193a23.414 23.414 0 0 0-2.421-2.967l-.34-.349.34-.349C14.135 1.778 16.515.767 18 1.622c1.512.872 1.812 3.37.824 6.855l-.134.468zM14.75 7.24c1.142.104 2.227.273 3.234.501.686-2.688.509-4.68-.485-5.253-.988-.571-2.845.304-4.8 2.208A24.849 24.849 0 0 1 14.75 7.24zM7.206 22.677A2.38 2.38 0 0 1 6 22.369c-1.512-.871-1.812-3.369-.823-6.854l.132-.468.472.119c1.155.291 2.429.496 3.785.609l.235.02.134.193a23.596 23.596 0 0 0 2.422 2.968l.34.349-.34.349c-1.898 1.95-3.728 3.023-5.151 3.023zm-1.19-6.427c-.686 2.688-.509 4.681.485 5.254.987.563 2.843-.305 4.8-2.208a24.998 24.998 0 0 1-2.052-2.545 24.976 24.976 0 0 1-3.233-.501z"
<path
d="M18.69 8.945l-.472-.119a23.479 23.479 0 0 0-3.787-.61l-.234-.02-.135-.193a23.414 23.414 0 0 0-2.421-2.967l-.34-.349.34-.349C14.135 1.778 16.515.767 18 1.622c1.512.872 1.812 3.37.824 6.855l-.134.468zM14.75 7.24c1.142.104 2.227.273 3.234.501.686-2.688.509-4.68-.485-5.253-.988-.571-2.845.304-4.8 2.208A24.849 24.849 0 0 1 14.75 7.24zM7.206 22.677A2.38 2.38 0 0 1 6 22.369c-1.512-.871-1.812-3.369-.823-6.854l.132-.468.472.119c1.155.291 2.429.496 3.785.609l.235.02.134.193a23.596 23.596 0 0 0 2.422 2.968l.34.349-.34.349c-1.898 1.95-3.728 3.023-5.151 3.023zm-1.19-6.427c-.686 2.688-.509 4.681.485 5.254.987.563 2.843-.305 4.8-2.208a24.998 24.998 0 0 1-2.052-2.545 24.976 24.976 0 0 1-3.233-.501z"
/>
<path d="M12 16.878c-.823 0-1.669-.036-2.516-.106l-.235-.02-.135-.193a30.388 30.388 0 0 1-1.35-2.122 30.354 30.354 0 0 1-1.166-2.228l-.1-.213.1-.213a30.3 30.3 0 0 1 1.166-2.228c.414-.716.869-1.43 1.35-2.122l.135-.193.235-.02a29.785 29.785 0 0 1 5.033 0l.234.02.134.193a30.006 30.006 0 0 1 2.517 4.35l.101.213-.101.213a29.6 29.6 0 0 1-2.517 4.35l-.134.193-.234.02c-.847.07-1.694.106-2.517.106zm-2.197-1.084c1.48.111 2.914.111 4.395 0a29.006 29.006 0 0 0 2.196-3.798 28.585 28.585 0 0 0-2.197-3.798 29.031 29.031 0 0 0-4.394 0 28.477 28.477 0 0 0-2.197 3.798 29.114 29.114 0 0 0 2.197 3.798z"
<path
d="M12 16.878c-.823 0-1.669-.036-2.516-.106l-.235-.02-.135-.193a30.388 30.388 0 0 1-1.35-2.122 30.354 30.354 0 0 1-1.166-2.228l-.1-.213.1-.213a30.3 30.3 0 0 1 1.166-2.228c.414-.716.869-1.43 1.35-2.122l.135-.193.235-.02a29.785 29.785 0 0 1 5.033 0l.234.02.134.193a30.006 30.006 0 0 1 2.517 4.35l.101.213-.101.213a29.6 29.6 0 0 1-2.517 4.35l-.134.193-.234.02c-.847.07-1.694.106-2.517.106zm-2.197-1.084c1.48.111 2.914.111 4.395 0a29.006 29.006 0 0 0 2.196-3.798 28.585 28.585 0 0 0-2.197-3.798 29.031 29.031 0 0 0-4.394 0 28.477 28.477 0 0 0-2.197 3.798 29.114 29.114 0 0 0 2.197 3.798z"
/>
</symbol>
<symbol id="microsoft" aria-labelledby="simpleicons-microsoft-icon" role="img" viewBox="0 0 24 24">
<title id="simpleicons-microsoft-icon">Microsoft icon</title>
<path d="M11.4 24H0V12.6h11.4V24zM24 24H12.6V12.6H24V24zM11.4 11.4H0V0h11.4v11.4zm12.6 0H12.6V0H24v11.4z"
/>
<path d="M11.4 24H0V12.6h11.4V24zM24 24H12.6V12.6H24V24zM11.4 11.4H0V0h11.4v11.4zm12.6 0H12.6V0H24v11.4z" />
</symbol>
<symbol id="google" aria-labelledby="simpleicons-google-icon" role="img" viewBox="0 0 24 24">
<title id="simpleicons-google-icon">Google icon</title>
<path d="M12.24 10.285V14.4h6.806c-.275 1.765-2.056 5.174-6.806 5.174-4.095 0-7.439-3.389-7.439-7.574s3.345-7.574 7.439-7.574c2.33 0 3.891.989 4.785 1.849l3.254-3.138C18.189 1.186 15.479 0 12.24 0c-6.635 0-12 5.365-12 12s5.365 12 12 12c6.926 0 11.52-4.869 11.52-11.726 0-.788-.085-1.39-.189-1.989H12.24z"
<path
d="M12.24 10.285V14.4h6.806c-.275 1.765-2.056 5.174-6.806 5.174-4.095 0-7.439-3.389-7.439-7.574s3.345-7.574 7.439-7.574c2.33 0 3.891.989 4.785 1.849l3.254-3.138C18.189 1.186 15.479 0 12.24 0c-6.635 0-12 5.365-12 12s5.365 12 12 12c6.926 0 11.52-4.869 11.52-11.726 0-.788-.085-1.39-.189-1.989H12.24z"
/>
</symbol>
</svg>

До

Ширина:  |  Высота:  |  Размер: 4.2 KiB

После

Ширина:  |  Высота:  |  Размер: 4.2 KiB

Просмотреть файл

@ -1,34 +1,52 @@
<nav mat-tab-nav-bar #primary class="primary">
<a mat-button routerLink=".">
<mat-icon>
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24">
<use xlink:href="#angular" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><use xlink:href="#angular" /></svg>
</mat-icon>
<b>~</b>
<mat-icon>
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24">
<use xlink:href="#react" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><use xlink:href="#react" /></svg>
</mat-icon>
</a>
<a mat-tab-link routerLink="performance" routerLinkActive #rla1="routerLinkActive" [active]="rla1.isActive" [routerLinkActiveOptions]="{ exact: false }">
<a
mat-tab-link
routerLink="performance"
routerLinkActive
#rla1="routerLinkActive"
[active]="rla1.isActive"
[routerLinkActiveOptions]="{ exact: false }"
>
<div>Performance</div>
</a>
<a mat-tab-link routerLink="components" routerLinkActive #rla2="routerLinkActive" [active]="rla2.isActive" [routerLinkActiveOptions]="{ exact: false }"><div>Components</div></a>
<a mat-tab-link routerLink="docs" routerLinkActive #rla3="routerLinkActive" [active]="rla3.isActive" [routerLinkActiveOptions]="{ exact: false }"><div>Docs</div></a>
<a
mat-tab-link
routerLink="components"
routerLinkActive
#rla2="routerLinkActive"
[active]="rla2.isActive"
[routerLinkActiveOptions]="{ exact: false }"
><div>Components</div></a
>
<a
mat-tab-link
routerLink="docs"
routerLinkActive
#rla3="routerLinkActive"
[active]="rla3.isActive"
[routerLinkActiveOptions]="{ exact: false }"
><div>Docs</div></a
>
<div class="spacer"></div>
<a mat-button href="https://github.com/microsoft/angular-react">
<mat-icon>
<svg xmlns="http://www.w3.org/2000/svg" aria-labelledby="simpleicons-github-icon" role="img" viewBox="0 0 24 24">
<title id="simpleicons-github-icon">GitHub icon</title>
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"
<path
d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"
/>
</svg>
</mat-icon>
</a>
</nav>
<nav class="secondary" [class.collapse]="collapseSecondaryNav">
<ng-container #container></ng-container>
</nav>
<nav class="secondary" [class.collapse]="collapseSecondaryNav"><ng-container #container></ng-container></nav>

Просмотреть файл

@ -47,7 +47,6 @@
background: $smoke;
/deep/ .mat-tab-nav-bar {
.mat-tab-links {
display: flex;
overflow-y: auto;
@ -104,11 +103,8 @@
}
&.collapse {
/deep/ .mat-tab-nav-bar {
.mat-tab-links {
.mat-tab-link {
height: $navSecondaryHeightCollapsed;
@ -123,9 +119,7 @@
}
&.stack {
svg {
&:first-child {
margin: -30%;
height: 70%;
@ -152,7 +146,6 @@
@include mediaMobile {
:host {
nav.primary {
/deep/ .mat-button:first-child {
.mat-button-wrapper {
b {
@ -171,7 +164,6 @@
}
/deep/ .mat-tab-links {
.mat-tab-link {
padding: 0 3%;
min-width: 0;
@ -180,11 +172,8 @@
}
nav.secondary {
/deep/ .mat-tab-nav-bar {
.mat-tab-links {
.mat-tab-link {
height: $navSecondaryHeightNarrow;

Просмотреть файл

@ -4,7 +4,12 @@
// justify-content: last-baseline;
/deep/ {
h1, h2, h3, h4, h5, h6 {
h1,
h2,
h3,
h4,
h5,
h6 {
display: inline-block;
margin: 0;
padding-bottom: 4px;
@ -19,5 +24,4 @@
margin-left: -8px;
}
}
}

Просмотреть файл

@ -4,7 +4,5 @@
<ng-container *ngFor="let dot of dots">
<ng-container *ngTemplateOutlet="dotTemplate; context: { dot: dot, text: counter }"></ng-container>
</ng-container>
<ng-container *ngIf="dots">
<ng-content></ng-content>
</ng-container>
<ng-container *ngIf="dots"> <ng-content></ng-content> </ng-container>
</div>

Просмотреть файл

@ -31,8 +31,10 @@ export interface TriangleConfig {
styleUrls: ['./triangle.component.scss'],
})
export class TriangleComponent implements OnInit, OnDestroy {
@ContentChild(TemplateRef)
dotTemplate;
@ContentChild(TemplateRef) readonly dotTemplate: TemplateRef<{
dot: SierpinskiTriangleDot;
text: number;
}>;
// These are initially undefined and default CONST is used unless another
// value is provided in hte config. Whether default of config value are used,

Просмотреть файл

@ -1,17 +1,13 @@
<app-sub-nav>
<div mat-tab-nav-bar>
<div mat-tab-nav-bar>
<a mat-tab-link routerLink="fabric" routerLinkActive #rla1="routerLinkActive" [active]="rla1.isActive">
<mat-icon>
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24">
<use xlink:href="#microsoft" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><use xlink:href="#microsoft" /></svg>
</mat-icon>
Fabric
</a>
<a mat-tab-link routerLink="semantic-ui" routerLinkActive #rla2="routerLinkActive" [active]="rla2.isActive">
<mat-icon>
apps
</mat-icon>
<mat-icon> apps </mat-icon>
Semantic UI
</a>
</div>

Просмотреть файл

@ -2,7 +2,11 @@
<h2>Button</h2>
<fab-default-button text="Toggle Disabled" (onClick)="toggle()"></fab-default-button>
<fab-default-button [disabled]="disabled" (onClick)="click()" text="Primary Button{{ disabled ? ' (0)' : ' (2)' }}"></fab-default-button>
<fab-default-button
[disabled]="disabled"
(onClick)="click()"
text="Primary Button{{ disabled ? ' (0)' : ' (2)' }}"
></fab-default-button>
<fab-default-button [primary]="false" (onClick)="click()" text="Secondary Button"></fab-default-button>
<h3 class="button-height">{{ sampleContent }}</h3>
@ -10,10 +14,15 @@
<h2>Dialog</h2>
<fab-default-button text="Toggle Dialog" (onClick)="toggleDialog()"></fab-default-button>
<fab-dialog [hidden]="dialogHidden" (onDismiss)="toggleDialog()" title="Fabric [React] Dialog" subText="Use Fabric React components inside your Angular app!">
<fab-dialog
[hidden]="dialogHidden"
(onDismiss)="toggleDialog()"
title="Fabric [React] Dialog"
subText="Use Fabric React components inside your Angular app!"
>
{{ sampleContent2 }} {{ sampleContent3 }}
<fab-dialog-footer>
<fab-default-button (onClick)="clickSave()" text='Save' contentStyle="margin-right: 10px;"></fab-default-button>
<fab-default-button (onClick)="toggleDialog()" text='Cancel'></fab-default-button>
<fab-default-button (onClick)="clickSave()" text="Save" contentStyle="margin-right: 10px;"></fab-default-button>
<fab-default-button (onClick)="toggleDialog()" text="Cancel"></fab-default-button>
</fab-dialog-footer>
</fab-dialog>

Просмотреть файл

@ -1,4 +1,3 @@
:host {
display: block;
}

Просмотреть файл

@ -1,15 +1,11 @@
<app-sub-nav>
<div mat-tab-nav-bar>
<a mat-tab-link routerLink="getting-started" routerLinkActive #rla1="routerLinkActive" [active]="rla1.isActive">
<mat-icon>
directions_run
</mat-icon>
<mat-icon> directions_run </mat-icon>
Quick Start
</a>
<a mat-tab-link routerLink="wrappers" routerLinkActive #rla2="routerLinkActive" [active]="rla2.isActive">
<mat-icon>
card_giftcard
</mat-icon>
<mat-icon> card_giftcard </mat-icon>
Wrappers
</a>
</div>

Просмотреть файл

@ -1,3 +1 @@
<p>
getting-started works!
</p>
<p>getting-started works!</p>

Просмотреть файл

@ -1,3 +1 @@
<p>
wrappers works!
</p>
<p>wrappers works!</p>

Просмотреть файл

@ -1,6 +1,4 @@
<h1>Angular React</h1>
<h2>React components inside Angular!</h2>
<p style="margin-top:2000px;">
landing works!
</p>
<p style="margin-top:2000px;">landing works!</p>

Просмотреть файл

@ -1,4 +1,3 @@
:host {
display: block;
}

Просмотреть файл

@ -4,9 +4,7 @@
<h3>Pure Angular View</h3>
</div>
<button mat-icon-button [matMenuTriggerFor]="menu">
<mat-icon>settings</mat-icon>
</button>
<button mat-icon-button [matMenuTriggerFor]="menu"><mat-icon>settings</mat-icon></button>
<mat-menu #menu="matMenu">
<button mat-menu-item (click)="toggleTriangle()">
<mat-icon *ngIf="!triangle.isActive">play_circle_outline</mat-icon>
@ -14,7 +12,14 @@
<span>{{ toggleTriangleLabel }}</span>
</button>
<div mat-menu-item>
<mat-slider [value]="DEFAULT_DOT_SIZE" max="60" min="10" step="10" tick-interval="1" (change)="dotSizeChanged($event)">
<mat-slider
[value]="DEFAULT_DOT_SIZE"
max="60"
min="10"
step="10"
tick-interval="1"
(change)="dotSizeChanged($event)"
>
</mat-slider>
<label>Dot size</label>
</div>
@ -23,8 +28,16 @@
<app-triangle>
<ng-template let-text="text" let-dot="dot">
<app-dot [size]="dot.size" [x]="dot.x" [y]="dot.y" [color]="dot.color" [textOverride]="dot.textOverride" [backgroundColor]="dot.backgroundColor"
(onMouseEnter)="dot.hover = true" (onMouseLeave)="dot.hover = false">
<app-dot
[size]="dot.size"
[x]="dot.x"
[y]="dot.y"
[color]="dot.color"
[textOverride]="dot.textOverride"
[backgroundColor]="dot.backgroundColor"
(onMouseEnter)="dot.hover = true"
(onMouseLeave)="dot.hover = false"
>
{{ text }}
</app-dot>
</ng-template>

Просмотреть файл

@ -11,8 +11,7 @@ import { TriangleComponent, DEFAULT_DOT_SIZE } from '../../../components/triangl
export class AngularPerfComponent {
DEFAULT_DOT_SIZE = DEFAULT_DOT_SIZE;
@ViewChild(TriangleComponent)
triangle: TriangleComponent;
@ViewChild(TriangleComponent) readonly triangle: TriangleComponent;
get toggleTriangleLabel() {
return this.triangle.isActive ? 'Stop' : 'Restart';

Просмотреть файл

@ -4,9 +4,7 @@
<h3>React Rendered Dots</h3>
</div>
<button mat-icon-button [matMenuTriggerFor]="menu">
<mat-icon>settings</mat-icon>
</button>
<button mat-icon-button [matMenuTriggerFor]="menu"><mat-icon>settings</mat-icon></button>
<mat-menu #menu="matMenu">
<button mat-menu-item (click)="toggleTriangle()">
<mat-icon *ngIf="!triangle.isActive">play_circle_outline</mat-icon>
@ -22,7 +20,14 @@
</mat-slide-toggle>
</div>
<div mat-menu-item>
<mat-slider [value]="DEFAULT_DOT_SIZE" max="60" min="10" step="10" tick-interval="1" (change)="dotSizeChanged($event)">
<mat-slider
[value]="DEFAULT_DOT_SIZE"
max="60"
min="10"
step="10"
tick-interval="1"
(change)="dotSizeChanged($event)"
>
</mat-slider>
<label>Dot size</label>
</div>
@ -30,17 +35,19 @@
</app-page-header>
<span class="content" [class.collapsed]="contentCollapsed">
Every dot is an Angular Component. The counter is {{ projectAsAngular ? 'projected by Angular' : 'rendered by React' }}
Within the component is a React Element that is rendered by the Angular-React renderer.<span class="spacer"><br /><br /></span>
Every dot is an Angular Component. The counter is
{{ projectAsAngular ? 'projected by Angular' : 'rendered by React' }} Within the component is a React Element that is
rendered by the Angular-React renderer.<span class="spacer"><br /><br /></span>
This performance demonstration visualizes the impact of DOM binging and re-rendering on the single-threaded javascript
process. In this case, the animation is interupted by the rendering of the text counter with each tick (second). React
and Angular both have advanced binding logic that schedules DOM updates when the thread is not busy (such as when rendering
a smooth animation). The toggle between "Angular projection" and "React rendering" of the text counter within each dot
(currently set for {{ projectAsAngular ? 'Angular projection' : 'React rendering' }}) demonstrates a limitation of the
React elements. Each dot that is rendered by React is discrete. React does not collectively render the dots, and therefore
cannot use a global scheduler to ensure that the thread is not blocked and that smooth animation is preserved. When smooth
rendering is required, projection of DOM rendering by Angular (through the React element) is more performant.
and Angular both have advanced binding logic that schedules DOM updates when the thread is not busy (such as when
rendering a smooth animation). The toggle between "Angular projection" and "React rendering" of the text counter
within each dot (currently set for {{ projectAsAngular ? 'Angular projection' : 'React rendering' }}) demonstrates a
limitation of the React elements. Each dot that is rendered by React is discrete. React does not collectively render
the dots, and therefore cannot use a global scheduler to ensure that the thread is not blocked and that smooth
animation is preserved. When smooth rendering is required, projection of DOM rendering by Angular (through the React
element) is more performant.
<div class="expand" (click)="contentCollapsed = false"></div>
<span class="collapse" (click)="contentCollapsed = true">[collapse]</span>
@ -48,9 +55,18 @@
<app-triangle>
<ng-template let-text="text" let-dot="dot">
<app-react-dot [size]="dot.size" [x]="dot.x" [y]="dot.y" [color]="dot.color" [textOverride]="dot.textOverride" [backgroundColor]="dot.backgroundColor"
(onMouseEnter)="dot.hover = true" (onMouseLeave)="dot.hover = false" [text]="projectAsAngular ? '' : text">
{{ projectAsAngular ? dot.textOverride ? dot.textOverride : text : '' }}
<app-react-dot
[size]="dot.size"
[x]="dot.x"
[y]="dot.y"
[color]="dot.color"
[textOverride]="dot.textOverride"
[backgroundColor]="dot.backgroundColor"
(onMouseEnter)="dot.hover = true"
(onMouseLeave)="dot.hover = false"
[text]="projectAsAngular ? '' : text"
>
{{ projectAsAngular ? (dot.textOverride ? dot.textOverride : text) : '' }}
</app-react-dot>
</ng-template>
<div class="message mat-h1">{{ triangle.dots?.length }} Dots</div>

Просмотреть файл

@ -27,7 +27,8 @@
bottom: 0;
}
.expand, .collapse {
.expand,
.collapse {
cursor: pointer;
}

Просмотреть файл

@ -11,8 +11,7 @@ import { TriangleComponent, DEFAULT_DOT_SIZE } from '../../../components/triangl
export class MixedPerfComponent {
DEFAULT_DOT_SIZE = DEFAULT_DOT_SIZE;
@ViewChild(TriangleComponent)
triangle: TriangleComponent;
@ViewChild(TriangleComponent) readonly triangle: TriangleComponent;
projectAsAngular = true;
contentCollapsed = true;

Просмотреть файл

@ -2,20 +2,14 @@
<div mat-tab-nav-bar>
<a mat-tab-link routerLink="angular" routerLinkActive #rla1="routerLinkActive" [active]="rla1.isActive">
<mat-icon>
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24">
<use xlink:href="#angular" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><use xlink:href="#angular" /></svg>
</mat-icon>
Angular
</a>
<a mat-tab-link routerLink="mixed" routerLinkActive #rla2="routerLinkActive" [active]="rla2.isActive">
<mat-icon class="stack">
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24">
<use xlink:href="#angular" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24">
<use xlink:href="#react" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><use xlink:href="#angular" /></svg>
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><use xlink:href="#react" /></svg>
</mat-icon>
Mixed
</a>

Просмотреть файл

@ -23,16 +23,16 @@
</mat-button-toggle-group>
<div class="perf-angular perf-image">
<img (click)="zoom1 = !zoom1" [class.zoom]="zoom1" src='assets/angular_perf.png' />
<img (click)="zoom1 = !zoom1" [class.zoom]="zoom1" src="assets/angular_perf.png" />
</div>
<h3>React Rendered Dots (Angular Counter)</h3>
<div class="perf-mixed perf-image">
<img (click)="zoom2 = !zoom2" [class.zoom]="zoom2" src='assets/angular_react_angular_perf.png' />
<img (click)="zoom2 = !zoom2" [class.zoom]="zoom2" src="assets/angular_react_angular_perf.png" />
</div>
<h3>React Rendered Dots (React Counter)</h3>
<div class="perf-react perf-image">
<img (click)="zoom3 = !zoom3" [class.zoom]="zoom3" src='assets/angular_react_perf.png' />
<img (click)="zoom3 = !zoom3" [class.zoom]="zoom3" src="assets/angular_react_perf.png" />
</div>
</div>

Просмотреть файл

@ -30,27 +30,27 @@
}
.perf-images.summary .perf-image img {
margin-top: -58.3%;
margin-bottom: -1%;
margin-top: -58.3%;
margin-bottom: -1%;
}
.perf-images.heap .perf-image img {
margin-top: -40.3%;
margin-bottom: -27.7%;
margin-top: -40.3%;
margin-bottom: -27.7%;
}
.perf-images.detail-zoom .perf-image img {
margin-top: -22.1%;
margin-bottom: -39%;
margin-top: -22.1%;
margin-bottom: -39%;
}
.perf-images.detail .perf-image img {
margin-bottom: -57.2%;
margin-bottom: -57.2%;
}
.perf-images .perf-image img.zoom {
margin-top: 0;
margin-bottom: 0;
margin-top: 0;
margin-bottom: 0;
}
}

Просмотреть файл

@ -3,8 +3,6 @@
[text]="text"
(onMouseEnter)="onMouseEnter($event)"
(onMouseLeave)="onMouseLeave($event)"
>
<react-content>
<ng-content></ng-content>
</react-content>
>
<react-content> <ng-content></ng-content> </react-content>
</ReactDot>

Просмотреть файл

@ -14,28 +14,19 @@ import * as ReactDOM from 'react-dom';
export class ReactDotComponent implements OnChanges {
style: ReactDotStyle;
@Input()
x: string;
@Input()
y: string;
@Input()
size: string;
@Input('text')
_text: string;
@Input()
color: string;
@Input()
backgroundColor: string;
@Input()
textOverride: string;
@Input() x: string;
@Input() y: string;
@Input() size: string;
@Input('text') _text: string;
@Input() color: string;
@Input() backgroundColor: string;
@Input() textOverride: string;
@Output('onMouseEnter')
mouseEnter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
@Output('onMouseLeave')
mouseLeave: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();
@Output('onMouseEnter') readonly mouseEnter = new EventEmitter<MouseEvent>();
@Output('onMouseLeave') readonly mouseLeave = new EventEmitter<MouseEvent>();
onMouseEnter = ev => this.mouseEnter.emit(ev as any);
onMouseLeave = ev => this.mouseLeave.emit(ev as any);
onMouseEnter = (ev: MouseEvent) => this.mouseEnter.emit(ev);
onMouseLeave = (ev: MouseEvent) => this.mouseLeave.emit(ev);
get text() {
return this.textOverride && this._text ? this.textOverride : this._text;

Просмотреть файл

@ -1,7 +1,7 @@
$navPrimaryHeight: 48px;
$navSecondaryHeight: $navPrimaryHeight * 2;
$navSecondaryHeightNarrow: $navPrimaryHeight * 1.3;
$navSecondaryHeightCollapsed: $navPrimaryHeight * 0.70;
$navSecondaryHeightCollapsed: $navPrimaryHeight * 0.7;
$rubberbandScrollBuffer: 200px;
$oil: rgba(30, 30, 30, 0.94);

Просмотреть файл

@ -1,20 +1,19 @@
<!doctype html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Angular-React</title>
<base href="/">
<head>
<meta charset="utf-8" />
<title>Angular-React</title>
<base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet">
</head>
<body>
<!-- Github Pages hack to allow SPA refresh without receiving 404. -->
<script>
(function () {
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500" rel="stylesheet" />
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" />
</head>
<body>
<!-- Github Pages hack to allow SPA refresh without receiving 404. -->
<script>
(function() {
// Retrieve the URL the user was trying to access when receiving the 404.
var redirect = sessionStorage.redirect;
// Remove the URL from sessionStorage.
@ -26,8 +25,8 @@
}
})();
</script>
<!-- /Github Pages hack. -->
<!-- /Github Pages hack. -->
<app-root class="mat-typography"></app-root>
</body>
<app-root class="mat-typography"></app-root>
</body>
</html>

Просмотреть файл

@ -2,7 +2,8 @@
@import '~@angular/material/prebuilt-themes/deeppurple-amber.css';
@import './app/styles/variables.scss';
html, body {
html,
body {
height: 100%;
margin: 0;
}

Просмотреть файл

@ -8,7 +8,5 @@
"**/*.ts"
/* add all lazy-loaded libraries here: "../../../libs/my-lib/index.ts" */
],
"exclude": [
"**/*.spec.ts"
]
"exclude": ["**/*.spec.ts"]
}

Просмотреть файл

@ -4,11 +4,6 @@
"outDir": "../../dist/out-tsc/apps/docs",
"module": "es2015"
},
"include": [
"**/*.ts"
],
"exclude": [
"**/*.spec.ts",
"src/test.ts"
]
"include": ["**/*.ts"],
"exclude": ["**/*.spec.ts", "src/test.ts"]
}

Просмотреть файл

@ -2,18 +2,9 @@
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc/apps/docs",
"types": [
"jasmine",
"node"
],
"types": ["jasmine", "node"],
"module": "commonjs"
},
"files": [
"src/test.ts",
"src/polyfills.ts"
],
"include": [
"**/*.spec.ts",
"**/*.d.ts"
]
"files": ["src/test.ts", "src/polyfills.ts"],
"include": ["**/*.spec.ts", "**/*.d.ts"]
}

Просмотреть файл

@ -1,17 +1,7 @@
{
"extends": "../../tslint.json",
"rules": {
"directive-selector": [
true,
"attribute",
"app",
"camelCase"
],
"component-selector": [
true,
"element",
"app",
"kebab-case"
]
"directive-selector": [true, "attribute", "app", "camelCase"],
"component-selector": [true, "element", "app", "kebab-case"]
}
}

Просмотреть файл

@ -7,7 +7,7 @@
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) {
module.exports = function(config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
@ -16,15 +16,15 @@ module.exports = function (config) {
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular-devkit/build-angular/plugins/karma')
require('@angular-devkit/build-angular/plugins/karma'),
],
client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser
clearContext: false, // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, '../../coverage'),
reports: ['html', 'lcovonly'],
fixWebpackSourcePaths: true
fixWebpackSourcePaths: true,
},
reporters: ['progress', 'kjhtml'],
port: 9876,
@ -32,7 +32,6 @@ module.exports = function (config) {
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false
singleRun: false,
});
};

Просмотреть файл

@ -1,3 +1,4 @@
// prettier-ignore
/**
* Get the known keys (i.e. no index signature) of T.
*
@ -17,4 +18,4 @@ type KnownKeysOfOptions = KnownKeys<Options>; // 'key' | 'title';
*/
type KnownKeys<T> = {
[K in keyof T]: string extends K ? never : number extends K ? never : K
} extends { [_ in keyof T]: infer U } ?U: never;
} extends { [_ in keyof T]: infer U } ? U : never;

Просмотреть файл

@ -2,16 +2,8 @@
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc/libs/core",
"types": [
"jasmine",
"node"
]
"types": ["jasmine", "node"]
},
"files": [
"src/test.ts"
],
"include": [
"**/*.spec.ts",
"**/*.d.ts"
]
"files": ["src/test.ts"],
"include": ["**/*.spec.ts", "**/*.d.ts"]
}

Просмотреть файл

@ -1,17 +1,7 @@
{
"extends": "../../tslint.json",
"rules": {
"directive-selector": [
true,
"attribute",
"app",
"camelCase"
],
"component-selector": [
true,
"element",
"app",
"kebab-case"
]
"directive-selector": [true, "attribute", "app", "camelCase"],
"component-selector": [true, "element", "app", "kebab-case"]
}
}

Просмотреть файл

@ -2,11 +2,12 @@
[![npm version](https://badge.fury.io/js/%40angular-react%2Ffabric.svg)](https://www.npmjs.com/package/@angular-react/fabric)
Industry trends, organizational pressures, and other factors can lead to mandates regarding the use of component libraries or migration from one technology to another. In the case of [Office UI Fabric][fab], where its use is required, the client must be written in React (there is no Angular component library for the latest version). Rewrite from Angular to React may be cost-prohibitive or ill advised for other reasons.
Industry trends, organizational pressures, and other factors can lead to mandates regarding the use of component libraries or migration from one technology to another. In the case of [Office UI Fabric][fab], where its use is required, the client must be written in React (there is no Angular component library for the latest version). Rewrite from Angular to React may be cost-prohibitive or ill advised for other reasons.
Use of Angular-React allows consuming any React elements, but specifically Office UI Fabric, within an Angular [2+] application. The library of wrappers for Office UI Fabric simplifies the use of these components with Angular. However, any React code can make use of the custom Angular-React renderer.
Use of Angular-React allows consuming any React elements, but specifically Office UI Fabric, within an Angular [2+] application. The library of wrappers for Office UI Fabric simplifies the use of these components with Angular. However, any React code can make use of the custom Angular-React renderer.
#### Quick links
[@angular-react/core](https://www.npmjs.com/package/@angular-react/core) |
[Documentation, quick start, and guides][ard] |
[Demo][ard-demo] |
@ -15,6 +16,7 @@ Use of Angular-React allows consuming any React elements, but specifically Offic
[Office Fabric](https://developer.microsoft.com/en-us/fabric)
### Typical Use Cases
- Use React component libraries with Angular
- Incrementally rewrite an Angular application into React (moving from atomic/leaf nodes upward into full features/pages until the entire app is re-written)
@ -27,54 +29,53 @@ If you'd like to contribute, you must follow our [contributing guidelines](https
You can look through the issues (which should be up-to-date on who is working on which features and which pieces are blocked) and make a comment.
High level stuff planned for Q2 2018 (April - June):
* Extend support for Fabric Buttons
* Extend support for Fabric Dialog
* Additional Fabric components TBD
* Table feature improvements
* Improve docs
- Extend support for Fabric Buttons
- Extend support for Fabric Dialog
- Additional Fabric components TBD
- Table feature improvements
- Improve docs
#### Available Fabric features
| Feature | Notes | Docs |
|------------------|--------------------------------------------------------|--------------|
| breadcrumb | Beta | [Docs][0] |
| button | Beta | [Docs][0] |
| callout | Beta | [Docs][0] |
| choice-group | Beta | [Docs][0] |
| combo-box | Beta | [Docs][0] |
| command-bar | Heavily tested, most scenarios covered. | [Docs][0] |
| contextual-menu | Beta | [Docs][0] |
| date-picker | Beta | [Docs][0] |
| dialog | Beta | [Docs][1] |
| divider | Beta | [Docs][0] |
| grouped-list | Beta | [Docs][0] |
| hover-card | Beta | [Docs][0] |
| icon | Beta | [Docs][0] |
| image | Beta | [Docs][0] |
| link | Beta | [Docs][0] |
| message-bar | Beta | [Docs][0] |
| modal | Beta | [Docs][0] |
| panel | Beta | [Docs][0] |
| persona | Beta | [Docs][0] |
| pickers | Beta | [Docs][0] |
| pivot | Beta | [Docs][0] |
| search-box | Beta | [Docs][0] |
| shimmer | Beta | [Docs][0] |
| slider | Beta | [Docs][0] |
| spinner | Beta | [Docs][0] |
| toggle | Beta | [Docs][0] |
| tooltip | Beta | [Docs][0] |
| Feature | Notes | Docs |
| --------------- | --------------------------------------- | --------- |
| breadcrumb | Beta | [Docs][0] |
| button | Beta | [Docs][0] |
| callout | Beta | [Docs][0] |
| choice-group | Beta | [Docs][0] |
| combo-box | Beta | [Docs][0] |
| command-bar | Heavily tested, most scenarios covered. | [Docs][0] |
| contextual-menu | Beta | [Docs][0] |
| date-picker | Beta | [Docs][0] |
| dialog | Beta | [Docs][1] |
| divider | Beta | [Docs][0] |
| grouped-list | Beta | [Docs][0] |
| hover-card | Beta | [Docs][0] |
| icon | Beta | [Docs][0] |
| image | Beta | [Docs][0] |
| link | Beta | [Docs][0] |
| message-bar | Beta | [Docs][0] |
| modal | Beta | [Docs][0] |
| panel | Beta | [Docs][0] |
| persona | Beta | [Docs][0] |
| pickers | Beta | [Docs][0] |
| pivot | Beta | [Docs][0] |
| search-box | Beta | [Docs][0] |
| shimmer | Beta | [Docs][0] |
| slider | Beta | [Docs][0] |
| spinner | Beta | [Docs][0] |
| toggle | Beta | [Docs][0] |
| tooltip | Beta | [Docs][0] |
#### In progress, planned, and non-planned Fabric features
| Feature | Status | Docs | Issue |
|------------------|-------------------------------------|--------------|----------------|
| bottom-nav | Not started, not planned | - | [TBD][0] |
| Feature | Status | Docs | Issue |
| ---------- | ------------------------ | ---- | -------- |
| bottom-nav | Not started, not planned | - | [TBD][0] |
[0]: https://microsoft.github.io/angular-react/docs/fabric
[1]: https://microsoft.github.io/angular-react/docs/fabric
[ard]: https://microsoft.github.io/angular-react
[ard-demo]: https://microsoft.github.io/angular-react/demo
[getting-started]: https://microsoft.github.io/angular-react/docs/getting-started

Просмотреть файл

@ -4,7 +4,7 @@
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) {
module.exports = function(config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
@ -13,15 +13,15 @@ module.exports = function (config) {
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular-devkit/build-angular/plugins/karma')
require('@angular-devkit/build-angular/plugins/karma'),
],
client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser
clearContext: false, // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, '../../coverage'),
reports: ['html', 'lcovonly'],
fixWebpackSourcePaths: true
fixWebpackSourcePaths: true,
},
reporters: ['progress', 'kjhtml'],
port: 9876,
@ -29,7 +29,6 @@ module.exports = function (config) {
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false
singleRun: false,
});
};

Просмотреть файл

@ -31,41 +31,29 @@ import { IBreadcrumbItem, IBreadcrumbProps } from 'office-ui-fabric-react/lib/Br
[styles]="styles"
[theme]="theme"
[RenderItem]="renderItem && onRenderItem"
[ReduceData]="onReduceData">
[ReduceData]="onReduceData"
>
</Breadcrumb>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabBreadcrumbComponent extends ReactWrapperComponent<IBreadcrumbProps> implements OnInit {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IBreadcrumbProps['componentRef'];
@Input()
items: IBreadcrumbProps['items'];
@Input()
className?: IBreadcrumbProps['className'];
@Input()
dividerAs?: IBreadcrumbProps['dividerAs'];
@Input()
maxDisplayedItems?: IBreadcrumbProps['maxDisplayedItems'];
@Input()
ariaLabel?: IBreadcrumbProps['ariaLabel'];
@Input()
overflowAriaLabel?: IBreadcrumbProps['overflowAriaLabel'];
@Input()
overflowIndex?: IBreadcrumbProps['overflowIndex'];
@Input()
styles?: IBreadcrumbProps['styles'];
@Input()
theme?: IBreadcrumbProps['theme'];
@Input() componentRef?: IBreadcrumbProps['componentRef'];
@Input() items: IBreadcrumbProps['items'];
@Input() className?: IBreadcrumbProps['className'];
@Input() dividerAs?: IBreadcrumbProps['dividerAs'];
@Input() maxDisplayedItems?: IBreadcrumbProps['maxDisplayedItems'];
@Input() ariaLabel?: IBreadcrumbProps['ariaLabel'];
@Input() overflowAriaLabel?: IBreadcrumbProps['overflowAriaLabel'];
@Input() overflowIndex?: IBreadcrumbProps['overflowIndex'];
@Input() styles?: IBreadcrumbProps['styles'];
@Input() theme?: IBreadcrumbProps['theme'];
@Input()
renderItem?: InputRendererOptions<IBreadcrumbItem>;
@Input('reduceData')
onReduceData?: IBreadcrumbProps['onReduceData'];
@Input() renderItem?: InputRendererOptions<IBreadcrumbItem>;
@Input('reduceData') onReduceData?: IBreadcrumbProps['onReduceData'];
onRenderItem: (props?: IBreadcrumbItem, defaultRender?: JsxRenderFunc<IBreadcrumbItem>) => JSX.Element;

Просмотреть файл

@ -54,7 +54,8 @@ import { FabBaseButtonComponent } from './base-button.component';
[RenderMenuIcon]="renderMenuIcon && onRenderMenuIcon"
[MenuClick]="onMenuClickHandler"
(onAfterMenuDismiss)="onAfterMenuDismiss.emit($event)"
(onClick)="onClickHandler($event)">
(onClick)="onClickHandler($event)"
>
<ReactContent><ng-content></ng-content></ReactContent>
</ActionButton>
`,
@ -62,8 +63,7 @@ import { FabBaseButtonComponent } from './base-button.component';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabActionButtonComponent extends FabBaseButtonComponent {
@ViewChild('reactNode')
reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -6,82 +6,45 @@ import { ChangeDetectorRef, ElementRef, EventEmitter, Input, NgZone, OnInit, Out
import { IButtonProps } from 'office-ui-fabric-react/lib/Button';
export abstract class FabBaseButtonComponent extends ReactWrapperComponent<IButtonProps> implements OnInit {
@Input()
componentRef?: IButtonProps['componentRef'];
@Input()
href?: IButtonProps['href'];
@Input()
primary?: IButtonProps['primary'];
@Input()
uniqueId?: IButtonProps['uniqueId'];
@Input()
disabled?: IButtonProps['disabled'];
@Input()
primaryDisabled?: IButtonProps['primaryDisabled'];
@Input()
styles?: IButtonProps['styles'];
@Input()
theme?: IButtonProps['theme'];
@Input()
checked?: IButtonProps['checked'];
@Input()
className?: IButtonProps['className'];
@Input()
ariaLabel?: IButtonProps['ariaLabel'];
@Input()
ariaDescription?: IButtonProps['ariaDescription'];
@Input()
ariaHidden?: IButtonProps['ariaHidden'];
@Input()
text?: IButtonProps['text'];
@Input()
iconProps?: IButtonProps['iconProps'];
@Input()
menuProps?: IButtonProps['menuProps'];
@Input()
split?: IButtonProps['split'];
@Input()
menuIconProps?: IButtonProps['menuIconProps'];
@Input()
splitButtonAriaLabel?: IButtonProps['splitButtonAriaLabel'];
@Input()
menuAs?: IButtonProps['menuAs'];
@Input()
secondaryText?: IButtonProps['secondaryText'];
@Input()
toggle?: IButtonProps['toggle'];
@Input()
data?: IButtonProps['data'];
@Input()
getClassNames?: IButtonProps['getClassNames'];
@Input()
getSplitButtonClassNames?: IButtonProps['getSplitButtonClassNames'];
@Input()
menuTriggerKeyCode?: IButtonProps['menuTriggerKeyCode'];
@Input()
keytipProps?: IButtonProps['keytipProps'];
@Input()
persistMenu?: IButtonProps['persistMenu'];
@Input() componentRef?: IButtonProps['componentRef'];
@Input() href?: IButtonProps['href'];
@Input() primary?: IButtonProps['primary'];
@Input() uniqueId?: IButtonProps['uniqueId'];
@Input() disabled?: IButtonProps['disabled'];
@Input() primaryDisabled?: IButtonProps['primaryDisabled'];
@Input() styles?: IButtonProps['styles'];
@Input() theme?: IButtonProps['theme'];
@Input() checked?: IButtonProps['checked'];
@Input() className?: IButtonProps['className'];
@Input() ariaLabel?: IButtonProps['ariaLabel'];
@Input() ariaDescription?: IButtonProps['ariaDescription'];
@Input() ariaHidden?: IButtonProps['ariaHidden'];
@Input() text?: IButtonProps['text'];
@Input() iconProps?: IButtonProps['iconProps'];
@Input() menuProps?: IButtonProps['menuProps'];
@Input() split?: IButtonProps['split'];
@Input() menuIconProps?: IButtonProps['menuIconProps'];
@Input() splitButtonAriaLabel?: IButtonProps['splitButtonAriaLabel'];
@Input() menuAs?: IButtonProps['menuAs'];
@Input() secondaryText?: IButtonProps['secondaryText'];
@Input() toggle?: IButtonProps['toggle'];
@Input() data?: IButtonProps['data'];
@Input() getClassNames?: IButtonProps['getClassNames'];
@Input() getSplitButtonClassNames?: IButtonProps['getSplitButtonClassNames'];
@Input() menuTriggerKeyCode?: IButtonProps['menuTriggerKeyCode'];
@Input() keytipProps?: IButtonProps['keytipProps'];
@Input() persistMenu?: IButtonProps['persistMenu'];
@Input()
renderIcon?: InputRendererOptions<IButtonProps>;
@Input()
renderText?: InputRendererOptions<IButtonProps>;
@Input()
renderDescription?: InputRendererOptions<IButtonProps>;
@Input()
renderAriaDescription?: InputRendererOptions<IButtonProps>;
@Input()
renderChildren?: InputRendererOptions<IButtonProps>;
@Input()
renderMenuIcon?: InputRendererOptions<IButtonProps>;
@Input() renderIcon?: InputRendererOptions<IButtonProps>;
@Input() renderText?: InputRendererOptions<IButtonProps>;
@Input() renderDescription?: InputRendererOptions<IButtonProps>;
@Input() renderAriaDescription?: InputRendererOptions<IButtonProps>;
@Input() renderChildren?: InputRendererOptions<IButtonProps>;
@Input() renderMenuIcon?: InputRendererOptions<IButtonProps>;
@Output()
readonly onClick = new EventEmitter<MouseEvent>();
@Output()
readonly onMenuClick = new EventEmitter<{ ev?: MouseEvent | KeyboardEvent; button?: IButtonProps }>();
@Output()
readonly onAfterMenuDismiss = new EventEmitter<void>();
@Output() readonly onClick = new EventEmitter<MouseEvent>();
@Output() readonly onMenuClick = new EventEmitter<{ ev?: MouseEvent | KeyboardEvent; button?: IButtonProps }>();
@Output() readonly onAfterMenuDismiss = new EventEmitter<void>();
onRenderIcon: (props?: IButtonProps, defaultRender?: JsxRenderFunc<IButtonProps>) => JSX.Element;
onRenderText: (props?: IButtonProps, defaultRender?: JsxRenderFunc<IButtonProps>) => JSX.Element;

Просмотреть файл

@ -54,7 +54,8 @@ import { FabBaseButtonComponent } from './base-button.component';
[RenderMenuIcon]="renderMenuIcon && onRenderMenuIcon"
[MenuClick]="onMenuClickHandler"
(onAfterMenuDismiss)="onAfterMenuDismiss.emit($event)"
(onClick)="onClickHandler($event)">
(onClick)="onClickHandler($event)"
>
<ReactContent><ng-content></ng-content></ReactContent>
</CommandBarButton>
`,
@ -62,8 +63,7 @@ import { FabBaseButtonComponent } from './base-button.component';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabCommandBarButtonComponent extends FabBaseButtonComponent {
@ViewChild('reactNode')
reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -54,7 +54,8 @@ import { FabBaseButtonComponent } from './base-button.component';
[RenderMenuIcon]="renderMenuIcon && onRenderMenuIcon"
[MenuClick]="onMenuClickHandler"
(onAfterMenuDismiss)="onAfterMenuDismiss.emit($event)"
(onClick)="onClickHandler($event)">
(onClick)="onClickHandler($event)"
>
<ReactContent><ng-content></ng-content></ReactContent>
</CompoundButton>
`,
@ -62,8 +63,7 @@ import { FabBaseButtonComponent } from './base-button.component';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabCompoundButtonComponent extends FabBaseButtonComponent {
@ViewChild('reactNode')
reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -54,7 +54,8 @@ import { FabBaseButtonComponent } from './base-button.component';
[RenderMenuIcon]="renderMenuIcon && onRenderMenuIcon"
[MenuClick]="onMenuClickHandler"
(onAfterMenuDismiss)="onAfterMenuDismiss.emit($event)"
(onClick)="onClickHandler($event)">
(onClick)="onClickHandler($event)"
>
<ReactContent><ng-content></ng-content></ReactContent>
</DefaultButton>
`,
@ -62,8 +63,7 @@ import { FabBaseButtonComponent } from './base-button.component';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabDefaultButtonComponent extends FabBaseButtonComponent {
@ViewChild('reactNode')
reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -54,7 +54,8 @@ import { FabBaseButtonComponent } from './base-button.component';
[RenderMenuIcon]="renderMenuIcon && onRenderMenuIcon"
[MenuClick]="onMenuClickHandler"
(onAfterMenuDismiss)="onAfterMenuDismiss.emit($event)"
(onClick)="onClickHandler($event)">
(onClick)="onClickHandler($event)"
>
<ReactContent><ng-content></ng-content></ReactContent>
</IconButton>
`,
@ -62,8 +63,7 @@ import { FabBaseButtonComponent } from './base-button.component';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabIconButtonComponent extends FabBaseButtonComponent {
@ViewChild('reactNode')
reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -54,7 +54,8 @@ import { FabBaseButtonComponent } from './base-button.component';
[RenderMenuIcon]="renderMenuIcon && onRenderMenuIcon"
[MenuClick]="onMenuClickHandler"
(onAfterMenuDismiss)="onAfterMenuDismiss.emit($event)"
(onClick)="onClickHandler($event)">
(onClick)="onClickHandler($event)"
>
<ReactContent><ng-content></ng-content></ReactContent>
</MessageBarButton>
`,
@ -62,8 +63,7 @@ import { FabBaseButtonComponent } from './base-button.component';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabMessageBarButtonComponent extends FabBaseButtonComponent {
@ViewChild('reactNode')
reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -54,7 +54,8 @@ import { FabBaseButtonComponent } from './base-button.component';
[RenderMenuIcon]="renderMenuIcon && onRenderMenuIcon"
[MenuClick]="onMenuClickHandler"
(onAfterMenuDismiss)="onAfterMenuDismiss.emit($event)"
(onClick)="onClickHandler($event)">
(onClick)="onClickHandler($event)"
>
<ReactContent><ng-content></ng-content></ReactContent>
</PrimaryButton>
`,
@ -62,8 +63,7 @@ import { FabBaseButtonComponent } from './base-button.component';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabPrimaryButtonComponent extends FabBaseButtonComponent {
@ViewChild('reactNode')
reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -54,7 +54,8 @@ import { FabBaseButtonComponent } from './base-button.component';
[RenderMenuIcon]="renderMenuIcon && onRenderMenuIcon"
[MenuClick]="onMenuClickHandler"
(onAfterMenuDismiss)="onAfterMenuDismiss.emit($event)"
(onClick)="onClickHandler($event)">
(onClick)="onClickHandler($event)"
>
<ReactContent><ng-content></ng-content></ReactContent>
</SplitButton>
`,
@ -62,8 +63,7 @@ import { FabBaseButtonComponent } from './base-button.component';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabSplitButtonComponent extends FabBaseButtonComponent {
@ViewChild('reactNode')
reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -47,71 +47,44 @@ import { ICalendarProps } from 'office-ui-fabric-react/lib/Calendar';
[showCloseButton]="showCloseButton"
[allFocusable]="allFocusable"
[SelectDate]="onSelectDateHandler"
[Dismiss]="onDismissHandler">
[Dismiss]="onDismissHandler"
>
</Calendar>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabCalendarComponent extends ReactWrapperComponent<ICalendarProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: ICalendarProps['componentRef'];
@Input()
className?: ICalendarProps['className'];
@Input()
isMonthPickerVisible?: ICalendarProps['isMonthPickerVisible'];
@Input()
isDayPickerVisible?: ICalendarProps['isDayPickerVisible'];
@Input()
showMonthPickerAsOverlay?: ICalendarProps['showMonthPickerAsOverlay'];
@Input()
today?: ICalendarProps['today'];
@Input()
value?: ICalendarProps['value'];
@Input()
firstDayOfWeek?: ICalendarProps['firstDayOfWeek'];
@Input()
dateRangeType?: ICalendarProps['dateRangeType'];
@Input()
autoNavigateOnSelection?: ICalendarProps['autoNavigateOnSelection'];
@Input()
showGoToToday?: ICalendarProps['showGoToToday'];
@Input()
strings: ICalendarProps['strings'];
@Input()
highlightCurrentMonth?: ICalendarProps['highlightCurrentMonth'];
@Input()
highlightSelectedMonth?: ICalendarProps['highlightSelectedMonth'];
@Input()
navigationIcons?: ICalendarProps['navigationIcons'];
@Input()
showWeekNumbers?: ICalendarProps['showWeekNumbers'];
@Input()
firstWeekOfYear?: ICalendarProps['firstWeekOfYear'];
@Input()
dateTimeFormatter?: ICalendarProps['dateTimeFormatter'];
@Input()
minDate?: ICalendarProps['minDate'];
@Input()
maxDate?: ICalendarProps['maxDate'];
@Input()
showSixWeeksByDefault?: ICalendarProps['showSixWeeksByDefault'];
@Input()
workWeekDays?: ICalendarProps['workWeekDays'];
@Input()
selectDateOnClick?: ICalendarProps['selectDateOnClick'];
@Input()
showCloseButton?: ICalendarProps['showCloseButton'];
@Input()
allFocusable?: ICalendarProps['allFocusable'];
@Input() componentRef?: ICalendarProps['componentRef'];
@Input() className?: ICalendarProps['className'];
@Input() isMonthPickerVisible?: ICalendarProps['isMonthPickerVisible'];
@Input() isDayPickerVisible?: ICalendarProps['isDayPickerVisible'];
@Input() showMonthPickerAsOverlay?: ICalendarProps['showMonthPickerAsOverlay'];
@Input() today?: ICalendarProps['today'];
@Input() value?: ICalendarProps['value'];
@Input() firstDayOfWeek?: ICalendarProps['firstDayOfWeek'];
@Input() dateRangeType?: ICalendarProps['dateRangeType'];
@Input() autoNavigateOnSelection?: ICalendarProps['autoNavigateOnSelection'];
@Input() showGoToToday?: ICalendarProps['showGoToToday'];
@Input() strings: ICalendarProps['strings'];
@Input() highlightCurrentMonth?: ICalendarProps['highlightCurrentMonth'];
@Input() highlightSelectedMonth?: ICalendarProps['highlightSelectedMonth'];
@Input() navigationIcons?: ICalendarProps['navigationIcons'];
@Input() showWeekNumbers?: ICalendarProps['showWeekNumbers'];
@Input() firstWeekOfYear?: ICalendarProps['firstWeekOfYear'];
@Input() dateTimeFormatter?: ICalendarProps['dateTimeFormatter'];
@Input() minDate?: ICalendarProps['minDate'];
@Input() maxDate?: ICalendarProps['maxDate'];
@Input() showSixWeeksByDefault?: ICalendarProps['showSixWeeksByDefault'];
@Input() workWeekDays?: ICalendarProps['workWeekDays'];
@Input() selectDateOnClick?: ICalendarProps['selectDateOnClick'];
@Input() showCloseButton?: ICalendarProps['showCloseButton'];
@Input() allFocusable?: ICalendarProps['allFocusable'];
@Output()
readonly onSelectDate = new EventEmitter<{ date: Date; selectedDateRangeArray?: Date[] }>();
@Output()
readonly onDismiss = new EventEmitter<void>();
@Output() readonly onSelectDate = new EventEmitter<{ date: Date; selectedDateRangeArray?: Date[] }>();
@Output() readonly onDismiss = new EventEmitter<void>();
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);

Просмотреть файл

@ -2,7 +2,17 @@
// Licensed under the MIT License.
import { ReactWrapperComponent } from '@angular-react/core';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild } from '@angular/core';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ElementRef,
EventEmitter,
Input,
Output,
Renderer2,
ViewChild,
} from '@angular/core';
import { ICalloutProps } from 'office-ui-fabric-react/lib/Callout';
import { ICalloutPositionedInfo } from 'office-ui-fabric-react/lib/utilities/positioning/positioning.types';
@ -43,7 +53,8 @@ import { ICalloutPositionedInfo } from 'office-ui-fabric-react/lib/utilities/pos
(onLayerMounted)="onLayerMounted.emit()"
(onPositioned)="onPositioned.emit($event)"
(onDismiss)="onDismiss.emit($event)"
(onScroll)="onScroll.emit()">
(onScroll)="onScroll.emit()"
>
<ReactContent><ng-content></ng-content></ReactContent>
</Callout>
`,
@ -51,74 +62,41 @@ import { ICalloutPositionedInfo } from 'office-ui-fabric-react/lib/utilities/pos
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabCalloutComponent extends ReactWrapperComponent<ICalloutProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: ICalloutProps['componentRef'];
@Input()
target?: ICalloutProps['target'];
@Input()
directionalHint?: ICalloutProps['directionalHint'];
@Input()
directionalHintForRTL?: ICalloutProps['directionalHintForRTL'];
@Input()
gapSpace?: ICalloutProps['gapSpace'];
@Input()
beakWidth?: ICalloutProps['beakWidth'];
@Input()
calloutWidth?: ICalloutProps['calloutWidth'];
@Input()
backgroundColor?: ICalloutProps['backgroundColor'];
@Input()
bounds?: ICalloutProps['bounds'];
@Input()
minPagePadding?: ICalloutProps['minPagePadding'];
@Input()
isBeakVisible?: ICalloutProps['isBeakVisible'];
@Input()
preventDismissOnScroll?: ICalloutProps['preventDismissOnScroll'];
@Input()
preventDismissOnLostFocus?: ICalloutProps['preventDismissOnLostFocus'];
@Input()
coverTarget?: ICalloutProps['coverTarget'];
@Input()
role?: ICalloutProps['role'];
@Input()
ariaLabel?: ICalloutProps['ariaLabel'];
@Input()
ariaLabelledBy?: ICalloutProps['ariaLabelledBy'];
@Input()
ariaDescribedBy?: ICalloutProps['ariaDescribedBy'];
@Input()
className?: ICalloutProps['className'];
@Input()
doNotLayer?: ICalloutProps['doNotLayer'];
@Input()
directionalHintFixed?: ICalloutProps['directionalHintFixed'];
@Input()
finalHeight?: ICalloutProps['finalHeight'];
@Input()
hideOverflow?: ICalloutProps['hideOverflow'];
@Input()
setInitialFocus?: ICalloutProps['setInitialFocus'];
@Input()
calloutMaxHeight?: ICalloutProps['calloutMaxHeight'];
@Input()
theme?: ICalloutProps['theme'];
@Input()
styles?: ICalloutProps['styles'];
@Input()
hidden?: ICalloutProps['hidden'];
@Input() componentRef?: ICalloutProps['componentRef'];
@Input() target?: ICalloutProps['target'];
@Input() directionalHint?: ICalloutProps['directionalHint'];
@Input() directionalHintForRTL?: ICalloutProps['directionalHintForRTL'];
@Input() gapSpace?: ICalloutProps['gapSpace'];
@Input() beakWidth?: ICalloutProps['beakWidth'];
@Input() calloutWidth?: ICalloutProps['calloutWidth'];
@Input() backgroundColor?: ICalloutProps['backgroundColor'];
@Input() bounds?: ICalloutProps['bounds'];
@Input() minPagePadding?: ICalloutProps['minPagePadding'];
@Input() isBeakVisible?: ICalloutProps['isBeakVisible'];
@Input() preventDismissOnScroll?: ICalloutProps['preventDismissOnScroll'];
@Input() preventDismissOnLostFocus?: ICalloutProps['preventDismissOnLostFocus'];
@Input() coverTarget?: ICalloutProps['coverTarget'];
@Input() role?: ICalloutProps['role'];
@Input() ariaLabel?: ICalloutProps['ariaLabel'];
@Input() ariaLabelledBy?: ICalloutProps['ariaLabelledBy'];
@Input() ariaDescribedBy?: ICalloutProps['ariaDescribedBy'];
@Input() className?: ICalloutProps['className'];
@Input() doNotLayer?: ICalloutProps['doNotLayer'];
@Input() directionalHintFixed?: ICalloutProps['directionalHintFixed'];
@Input() finalHeight?: ICalloutProps['finalHeight'];
@Input() hideOverflow?: ICalloutProps['hideOverflow'];
@Input() setInitialFocus?: ICalloutProps['setInitialFocus'];
@Input() calloutMaxHeight?: ICalloutProps['calloutMaxHeight'];
@Input() theme?: ICalloutProps['theme'];
@Input() styles?: ICalloutProps['styles'];
@Input() hidden?: ICalloutProps['hidden'];
@Output()
readonly onLayerMounted = new EventEmitter<void>();
@Output()
readonly onPositioned = new EventEmitter<{ positions?: ICalloutPositionedInfo }>();
@Output()
readonly onDismiss = new EventEmitter<{ ev?: any }>();
@Output()
readonly onScroll = new EventEmitter<void>();
@Output() readonly onLayerMounted = new EventEmitter<void>();
@Output() readonly onPositioned = new EventEmitter<{ positions?: ICalloutPositionedInfo }>();
@Output() readonly onDismiss = new EventEmitter<{ ev?: any }>();
@Output() readonly onScroll = new EventEmitter<void>();
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);

Просмотреть файл

@ -42,61 +42,41 @@ import { FormEvent } from 'react';
[keytipProps]="keytipProps"
[styles]="styles"
[RenderLabel]="renderLabel && onRenderLabel"
[Change]="onChangeHandler">
[Change]="onChangeHandler"
>
</Checkbox>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabCheckboxComponent extends ReactWrapperComponent<ICheckboxProps> implements OnInit {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: ICheckboxProps['componentRef'];
@Input()
className?: ICheckboxProps['className'];
@Input()
checked?: ICheckboxProps['checked'];
@Input()
defaultChecked?: ICheckboxProps['defaultChecked'];
@Input()
label?: ICheckboxProps['label'];
@Input()
disabled?: ICheckboxProps['disabled'];
@Input()
inputProps?: React.ButtonHTMLAttributes<HTMLElement | HTMLButtonElement>;
@Input()
boxSide?: ICheckboxProps['boxSide'];
@Input()
theme?: ICheckboxProps['theme'];
@Input()
ariaLabel?: ICheckboxProps['ariaLabel'];
@Input()
ariaLabelledBy?: ICheckboxProps['ariaLabelledBy'];
@Input()
ariaDescribedBy?: ICheckboxProps['ariaDescribedBy'];
@Input()
ariaPositionInSet?: ICheckboxProps['ariaPositionInSet'];
@Input()
ariaSetSize?: ICheckboxProps['ariaSetSize'];
@Input()
checkmarkIconProps?: ICheckboxProps['checkmarkIconProps'];
@Input()
keytipProps?: ICheckboxProps['keytipProps'];
@Input()
styles?: ICheckboxProps['styles'];
@Input() componentRef?: ICheckboxProps['componentRef'];
@Input() className?: ICheckboxProps['className'];
@Input() checked?: ICheckboxProps['checked'];
@Input() defaultChecked?: ICheckboxProps['defaultChecked'];
@Input() label?: ICheckboxProps['label'];
@Input() disabled?: ICheckboxProps['disabled'];
@Input() inputProps?: React.ButtonHTMLAttributes<HTMLElement | HTMLButtonElement>;
@Input() boxSide?: ICheckboxProps['boxSide'];
@Input() theme?: ICheckboxProps['theme'];
@Input() ariaLabel?: ICheckboxProps['ariaLabel'];
@Input() ariaLabelledBy?: ICheckboxProps['ariaLabelledBy'];
@Input() ariaDescribedBy?: ICheckboxProps['ariaDescribedBy'];
@Input() ariaPositionInSet?: ICheckboxProps['ariaPositionInSet'];
@Input() ariaSetSize?: ICheckboxProps['ariaSetSize'];
@Input() checkmarkIconProps?: ICheckboxProps['checkmarkIconProps'];
@Input() keytipProps?: ICheckboxProps['keytipProps'];
@Input() styles?: ICheckboxProps['styles'];
@Input()
renderLabel?: InputRendererOptions<ICheckboxProps>;
@Input() renderLabel?: InputRendererOptions<ICheckboxProps>;
@Output()
readonly onChange = new EventEmitter<{ ev?: Event; checked?: boolean }>();
@Output() readonly onChange = new EventEmitter<{ ev?: Event; checked?: boolean }>();
/* Non-React props, more native support for Angular */
// support for two-way data binding for `@Input() checked`.
@Output()
readonly checkedChange = new EventEmitter<boolean>();
@Output() readonly checkedChange = new EventEmitter<boolean>();
onRenderLabel: (props?: ICheckboxProps, defaultRender?: JsxRenderFunc<ICheckboxProps>) => JSX.Element;

Просмотреть файл

@ -32,41 +32,29 @@ import { IChoiceGroupOption, IChoiceGroupProps } from 'office-ui-fabric-react/li
[ariaLabelledBy]="ariaLabelledBy"
[Changed]="onChangedHandler"
[Change]="onChangeHandler"
>
>
</ChoiceGroup>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabChoiceGroupComponent extends ReactWrapperComponent<IChoiceGroupProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IChoiceGroupProps['componentRef'];
@Input()
options?: IChoiceGroupProps['options'];
@Input()
defaultSelectedKey?: IChoiceGroupProps['defaultSelectedKey'];
@Input()
selectedKey?: IChoiceGroupProps['selectedKey'];
@Input()
label?: IChoiceGroupProps['label'];
@Input()
theme?: IChoiceGroupProps['theme'];
@Input()
styles?: IChoiceGroupProps['styles'];
@Input()
ariaLabelledBy?: IChoiceGroupProps['ariaLabelledBy'];
@Input() componentRef?: IChoiceGroupProps['componentRef'];
@Input() options?: IChoiceGroupProps['options'];
@Input() defaultSelectedKey?: IChoiceGroupProps['defaultSelectedKey'];
@Input() selectedKey?: IChoiceGroupProps['selectedKey'];
@Input() label?: IChoiceGroupProps['label'];
@Input() theme?: IChoiceGroupProps['theme'];
@Input() styles?: IChoiceGroupProps['styles'];
@Input() ariaLabelledBy?: IChoiceGroupProps['ariaLabelledBy'];
/** HTML Input props */
@Input()
required?: IChoiceGroupProps['required'];
@Input() required?: IChoiceGroupProps['required'];
@Output()
readonly onChanged = new EventEmitter<{ option: IChoiceGroupOption; evt?: Event }>();
@Output()
readonly onChange = new EventEmitter<{ ev?: Event; option?: IChoiceGroupOption }>();
@Output() readonly onChanged = new EventEmitter<{ option: IChoiceGroupOption; evt?: Event }>();
@Output() readonly onChange = new EventEmitter<{ ev?: Event; option?: IChoiceGroupOption }>();
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);

Просмотреть файл

@ -6,61 +6,41 @@ import { ChangeDetectorRef, ElementRef, EventEmitter, Input, NgZone, OnInit, Out
import { IComboBox, IComboBoxOption, IComboBoxProps } from 'office-ui-fabric-react/lib/ComboBox';
export abstract class FabBaseComboBoxComponent extends ReactWrapperComponent<IComboBoxProps> implements OnInit {
@Input()
componentRef?: IComboBoxProps['componentRef'];
@Input()
options: IComboBoxProps['options'];
@Input()
allowFreeform?: IComboBoxProps['allowFreeform'];
@Input()
autoComplete?: IComboBoxProps['autoComplete'];
@Input()
text?: IComboBoxProps['text'];
@Input()
buttonIconProps?: IComboBoxProps['buttonIconProps'];
@Input()
theme?: IComboBoxProps['theme'];
@Input()
styles?: IComboBoxProps['styles'];
@Input()
getClassNames?: IComboBoxProps['getClassNames'];
@Input()
caretDownButtonStyles?: IComboBoxProps['caretDownButtonStyles'];
@Input()
comboBoxOptionStyles?: IComboBoxProps['comboBoxOptionStyles'];
@Input()
scrollSelectedToTop?: IComboBoxProps['scrollSelectedToTop'];
@Input()
dropdownWidth?: IComboBoxProps['dropdownWidth'];
@Input()
useComboBoxAsMenuWidth?: IComboBoxProps['useComboBoxAsMenuWidth'];
@Input()
multiSelect?: IComboBoxProps['multiSelect'];
@Input()
isButtonAriaHidden?: IComboBoxProps['isButtonAriaHidden'];
@Input()
keytipProps?: IComboBoxProps['keytipProps'];
@Input()
resolveOptions?: (options: IComboBoxOption[]) => IComboBoxOption[] | PromiseLike<IComboBoxOption[]>;
@Input() componentRef?: IComboBoxProps['componentRef'];
@Input() options: IComboBoxProps['options'];
@Input() allowFreeform?: IComboBoxProps['allowFreeform'];
@Input() autoComplete?: IComboBoxProps['autoComplete'];
@Input() text?: IComboBoxProps['text'];
@Input() buttonIconProps?: IComboBoxProps['buttonIconProps'];
@Input() theme?: IComboBoxProps['theme'];
@Input() styles?: IComboBoxProps['styles'];
@Input() getClassNames?: IComboBoxProps['getClassNames'];
@Input() caretDownButtonStyles?: IComboBoxProps['caretDownButtonStyles'];
@Input() comboBoxOptionStyles?: IComboBoxProps['comboBoxOptionStyles'];
@Input() scrollSelectedToTop?: IComboBoxProps['scrollSelectedToTop'];
@Input() dropdownWidth?: IComboBoxProps['dropdownWidth'];
@Input() useComboBoxAsMenuWidth?: IComboBoxProps['useComboBoxAsMenuWidth'];
@Input() multiSelect?: IComboBoxProps['multiSelect'];
@Input() isButtonAriaHidden?: IComboBoxProps['isButtonAriaHidden'];
@Input() keytipProps?: IComboBoxProps['keytipProps'];
@Input() resolveOptions?: (options: IComboBoxOption[]) => IComboBoxOption[] | PromiseLike<IComboBoxOption[]>;
@Input()
renderLowerContent?: InputRendererOptions<IComboBoxProps>;
@Input() renderLowerContent?: InputRendererOptions<IComboBoxProps>;
@Output()
readonly onChange = new EventEmitter<{
@Output() readonly onChange = new EventEmitter<{
event: Event;
option?: IComboBoxOption;
index?: number;
value?: string;
}>();
@Output()
readonly onPendingValueChanged = new EventEmitter<{ option?: IComboBoxOption; index?: number; value?: string }>();
@Output()
readonly onMenuOpen = new EventEmitter<void>();
@Output()
readonly onMenuDismissed = new EventEmitter<void>();
@Output()
readonly onScrollToItem = new EventEmitter<{ itemIndex: number }>();
@Output() readonly onPendingValueChanged = new EventEmitter<{
option?: IComboBoxOption;
index?: number;
value?: string;
}>();
@Output() readonly onMenuOpen = new EventEmitter<void>();
@Output() readonly onMenuDismissed = new EventEmitter<void>();
@Output() readonly onScrollToItem = new EventEmitter<{ itemIndex: number }>();
onRenderLowerContent: (props?: IComboBoxProps, defaultRender?: JsxRenderFunc<IComboBoxProps>) => JSX.Element;

Просмотреть файл

@ -41,15 +41,15 @@ import { FabBaseComboBoxComponent } from './base-combo-box.component';
[ResolveOptions]="resolveOptions"
[ScrollToItem]="onScrollToItemHandler"
(onMenuOpen)="onMenuOpen.emit()"
(onMenuDismissed)="onMenuDismissed.emit()">
(onMenuDismissed)="onMenuDismissed.emit()"
>
</ComboBox>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabComboBoxComponent extends FabBaseComboBoxComponent {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -41,15 +41,15 @@ import { FabBaseComboBoxComponent } from './base-combo-box.component';
[ResolveOptions]="resolveOptions"
[ScrollToItem]="onScrollToItemHandler"
(onMenuOpen)="onMenuOpen.emit()"
(onMenuDismissed)="onMenuDismissed.emit()">
(onMenuDismissed)="onMenuDismissed.emit()"
>
</VirtualizedComboBox>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabVirtualizedComboBoxComponent extends FabBaseComboBoxComponent {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -52,8 +52,9 @@ import {
[theme]="theme"
[ReduceData]="onReduceData"
[GrowData]="onGrowData"
(onDataReduced)="onDataReduced"
(onDataGrown)="onDataGrown">
(onDataReduced)="(onDataReduced)"
(onDataGrown)="(onDataGrown)"
>
</CommandBar>
`,
styles: ['react-renderer'],
@ -61,50 +62,30 @@ import {
})
export class FabCommandBarComponent extends ReactWrapperComponent<ICommandBarProps>
implements OnChanges<FabCommandBarComponent>, AfterContentInit, OnDestroy {
@ContentChild(CommandBarItemsDirective)
readonly itemsDirective?: CommandBarItemsDirective;
@ContentChild(CommandBarFarItemsDirective)
readonly farItemsDirective?: CommandBarFarItemsDirective;
@ContentChild(CommandBarOverflowItemsDirective)
readonly overflowItemsDirective?: CommandBarOverflowItemsDirective;
@ContentChild(CommandBarItemsDirective) readonly itemsDirective?: CommandBarItemsDirective;
@ContentChild(CommandBarFarItemsDirective) readonly farItemsDirective?: CommandBarFarItemsDirective;
@ContentChild(CommandBarOverflowItemsDirective) readonly overflowItemsDirective?: CommandBarOverflowItemsDirective;
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: ICommandBarProps['componentRef'];
@Input()
overflowButtonProps?: ICommandBarProps['overflowButtonProps'];
@Input()
overflowButtonAs?: ICommandBarProps['overflowButtonAs'];
@Input()
buttonAs?: ICommandBarProps['buttonAs'];
@Input()
shiftOnReduce?: ICommandBarProps['shiftOnReduce'];
@Input()
className?: ICommandBarProps['className'];
@Input()
ariaLabel?: ICommandBarProps['ariaLabel'];
@Input()
styles?: ICommandBarProps['styles'];
@Input()
theme?: ICommandBarProps['theme'];
@Input()
onReduceData?: ICommandBarProps['onReduceData'];
@Input()
onGrowData?: ICommandBarProps['onGrowData'];
@Input() componentRef?: ICommandBarProps['componentRef'];
@Input() overflowButtonProps?: ICommandBarProps['overflowButtonProps'];
@Input() overflowButtonAs?: ICommandBarProps['overflowButtonAs'];
@Input() buttonAs?: ICommandBarProps['buttonAs'];
@Input() shiftOnReduce?: ICommandBarProps['shiftOnReduce'];
@Input() className?: ICommandBarProps['className'];
@Input() ariaLabel?: ICommandBarProps['ariaLabel'];
@Input() styles?: ICommandBarProps['styles'];
@Input() theme?: ICommandBarProps['theme'];
@Input() onReduceData?: ICommandBarProps['onReduceData'];
@Input() onGrowData?: ICommandBarProps['onGrowData'];
@Input()
items: ReadonlyArray<ICommandBarItemOptions>;
@Input()
farItems: ReadonlyArray<ICommandBarItemOptions>;
@Input()
overflowItems: ReadonlyArray<ICommandBarItemOptions>;
@Input() items: ReadonlyArray<ICommandBarItemOptions>;
@Input() farItems: ReadonlyArray<ICommandBarItemOptions>;
@Input() overflowItems: ReadonlyArray<ICommandBarItemOptions>;
@Output()
readonly onDataReduced = new EventEmitter<{ movedItem: ICommandBarItemProps }>();
@Output()
readonly onDataGrown = new EventEmitter<{ movedItem: ICommandBarItemProps }>();
@Output() readonly onDataReduced = new EventEmitter<{ movedItem: ICommandBarItemProps }>();
@Output() readonly onDataGrown = new EventEmitter<{ movedItem: ICommandBarItemProps }>();
/** @internal */
transformedItems_: ReadonlyArray<ICommandBarItemProps>;

Просмотреть файл

@ -17,8 +17,7 @@ export type CommandBarItemChangedPayload = ItemChangedPayload<ICommandBarItemOpt
*/
@Directive({ selector: 'fab-command-bar-item > render' })
export class CommandBarItemRenderDirective {
@ContentChild(TemplateRef)
readonly templateRef: TemplateRef<ICommandBarItemOptionsRenderContext>;
@ContentChild(TemplateRef) readonly templateRef: TemplateRef<ICommandBarItemOptionsRenderContext>;
}
/**
@ -26,31 +25,22 @@ export class CommandBarItemRenderDirective {
*/
@Directive({ selector: 'fab-command-bar-item > render-icon' })
export class CommandBarItemRenderIconDirective {
@ContentChild(TemplateRef)
readonly templateRef: TemplateRef<ICommandBarItemOptionsRenderIconContext>;
@ContentChild(TemplateRef) readonly templateRef: TemplateRef<ICommandBarItemOptionsRenderIconContext>;
}
@Directive({ selector: 'fab-command-bar-item' })
export class CommandBarItemDirective extends ContextualMenuItemDirective
implements ICommandBarItemOptions, AfterContentInit {
@ContentChild(CommandBarItemRenderDirective)
readonly renderDirective: CommandBarItemRenderDirective;
@ContentChild(CommandBarItemRenderIconDirective)
readonly renderIconDirective: CommandBarItemRenderIconDirective;
@ContentChild(CommandBarItemRenderDirective) readonly renderDirective: CommandBarItemRenderDirective;
@ContentChild(CommandBarItemRenderIconDirective) readonly renderIconDirective: CommandBarItemRenderIconDirective;
// ICommandBarItemOptions implementation
@Input()
iconOnly?: ICommandBarItemOptions['iconOnly'];
@Input()
buttonStyles?: ICommandBarItemOptions['buttonStyles'];
@Input()
cacheKey?: ICommandBarItemOptions['cacheKey'];
@Input()
renderedInOverflow?: ICommandBarItemOptions['renderedInOverflow'];
@Input()
render: ICommandBarItemOptions['render'];
@Input()
renderIcon: ICommandBarItemOptions['renderIcon'];
@Input() iconOnly?: ICommandBarItemOptions['iconOnly'];
@Input() buttonStyles?: ICommandBarItemOptions['buttonStyles'];
@Input() cacheKey?: ICommandBarItemOptions['cacheKey'];
@Input() renderedInOverflow?: ICommandBarItemOptions['renderedInOverflow'];
@Input() render: ICommandBarItemOptions['render'];
@Input() renderIcon: ICommandBarItemOptions['renderIcon'];
ngAfterContentInit() {
super.ngAfterContentInit();

Просмотреть файл

@ -28,18 +28,15 @@ export abstract class CommandBarItemsDirectiveBase extends ChangeableItemsDirect
@Directive({ selector: 'fab-command-bar > items' })
export class CommandBarItemsDirective extends CommandBarItemsDirectiveBase {
@ContentChildren(CommandBarItemDirective)
readonly directiveItems: QueryList<CommandBarItemDirective>;
@ContentChildren(CommandBarItemDirective) readonly directiveItems: QueryList<CommandBarItemDirective>;
}
@Directive({ selector: 'fab-command-bar > far-items' })
export class CommandBarFarItemsDirective extends CommandBarItemsDirectiveBase {
@ContentChildren(CommandBarItemDirective)
readonly directiveItems: QueryList<CommandBarItemDirective>;
@ContentChildren(CommandBarItemDirective) readonly directiveItems: QueryList<CommandBarItemDirective>;
}
@Directive({ selector: 'fab-command-bar > overflow-items' })
export class CommandBarOverflowItemsDirective extends CommandBarItemsDirectiveBase {
@ContentChildren(CommandBarItemDirective)
readonly directiveItems: QueryList<CommandBarItemDirective>;
@ContentChildren(CommandBarItemDirective) readonly directiveItems: QueryList<CommandBarItemDirective>;
}

Просмотреть файл

@ -26,76 +26,42 @@ export class ContextualMenuItemDirective extends ChangeableItemDirective<IContex
IContextualMenuItem,
OnChanges<ContextualMenuItemDirective>,
OnDestroy {
@ContentChildren(ContextualMenuItemDirective)
readonly menuItemsDirectives: QueryList<ContextualMenuItemDirective>;
@ContentChildren(ContextualMenuItemDirective) readonly menuItemsDirectives: QueryList<ContextualMenuItemDirective>;
@Input()
componentRef?: IContextualMenuItem['componentRef'];
@Input()
text?: IContextualMenuItem['text'];
@Input()
secondaryText?: IContextualMenuItem['secondaryText'];
@Input()
itemType?: IContextualMenuItem['itemType'];
@Input()
iconProps?: IContextualMenuItem['iconProps'];
@Input()
onRenderIcon?: IContextualMenuItem['onRenderIcon'];
@Input()
submenuIconProps?: IContextualMenuItem['submenuIconProps'];
@Input()
disabled?: IContextualMenuItem['disabled'];
@Input()
primaryDisabled?: IContextualMenuItem['primaryDisabled'];
@Input()
shortCut?: IContextualMenuItem['shortCut'];
@Input()
canCheck?: IContextualMenuItem['canCheck'];
@Input()
checked?: IContextualMenuItem['checked'];
@Input()
split?: IContextualMenuItem['split'];
@Input()
data?: IContextualMenuItem['data'];
@Input()
href?: IContextualMenuItem['href'];
@Input()
target?: IContextualMenuItem['target'];
@Input()
rel?: IContextualMenuItem['rel'];
@Input()
subMenuProps?: IContextualMenuItem['subMenuProps'];
@Input()
getItemClassNames?: IContextualMenuItem['getItemClassNames'];
@Input()
getSplitButtonVerticalDividerClassNames?: IContextualMenuItem['getSplitButtonVerticalDividerClassNames'];
@Input()
sectionProps?: IContextualMenuItem['sectionProps'];
@Input()
className?: IContextualMenuItem['className'];
@Input()
style?: IContextualMenuItem['style'];
@Input()
ariaLabel?: IContextualMenuItem['ariaLabel'];
@Input()
title?: IContextualMenuItem['title'];
@Input()
onRender?: IContextualMenuItem['onRender'];
@Input()
onMouseDown?: IContextualMenuItem['onMouseDown'];
@Input()
role?: IContextualMenuItem['role'];
@Input()
customOnRenderListLength?: IContextualMenuItem['customOnRenderListLength'];
@Input()
keytipProps?: IContextualMenuItem['keytipProps'];
@Input()
inactive?: IContextualMenuItem['inactive'];
@Input()
name?: IContextualMenuItem['name'];
@Input() componentRef?: IContextualMenuItem['componentRef'];
@Input() text?: IContextualMenuItem['text'];
@Input() secondaryText?: IContextualMenuItem['secondaryText'];
@Input() itemType?: IContextualMenuItem['itemType'];
@Input() iconProps?: IContextualMenuItem['iconProps'];
@Input() onRenderIcon?: IContextualMenuItem['onRenderIcon'];
@Input() submenuIconProps?: IContextualMenuItem['submenuIconProps'];
@Input() disabled?: IContextualMenuItem['disabled'];
@Input() primaryDisabled?: IContextualMenuItem['primaryDisabled'];
@Input() shortCut?: IContextualMenuItem['shortCut'];
@Input() canCheck?: IContextualMenuItem['canCheck'];
@Input() checked?: IContextualMenuItem['checked'];
@Input() split?: IContextualMenuItem['split'];
@Input() data?: IContextualMenuItem['data'];
@Input() href?: IContextualMenuItem['href'];
@Input() target?: IContextualMenuItem['target'];
@Input() rel?: IContextualMenuItem['rel'];
@Input() subMenuProps?: IContextualMenuItem['subMenuProps'];
@Input() getItemClassNames?: IContextualMenuItem['getItemClassNames'];
@Input() getSplitButtonVerticalDividerClassNames?: IContextualMenuItem['getSplitButtonVerticalDividerClassNames'];
@Input() sectionProps?: IContextualMenuItem['sectionProps'];
@Input() className?: IContextualMenuItem['className'];
@Input() style?: IContextualMenuItem['style'];
@Input() ariaLabel?: IContextualMenuItem['ariaLabel'];
@Input() title?: IContextualMenuItem['title'];
@Input() onRender?: IContextualMenuItem['onRender'];
@Input() onMouseDown?: IContextualMenuItem['onMouseDown'];
@Input() role?: IContextualMenuItem['role'];
@Input() customOnRenderListLength?: IContextualMenuItem['customOnRenderListLength'];
@Input() keytipProps?: IContextualMenuItem['keytipProps'];
@Input() inactive?: IContextualMenuItem['inactive'];
@Input() name?: IContextualMenuItem['name'];
@Output()
readonly click = new EventEmitter<{ ev?: MouseEvent | KeyboardEvent; item?: IContextualMenuItem }>();
@Output() readonly click = new EventEmitter<{ ev?: MouseEvent | KeyboardEvent; item?: IContextualMenuItem }>();
@Output()
get onChildItemChanged(): EventEmitter<ItemChangedPayload<string, IContextualMenuItem>> {

Просмотреть файл

@ -11,8 +11,7 @@ import { ChangeableItemHelper } from './changeable-helper';
* Parent class for wrapper directive for single item with OnChanges
*/
export abstract class ChangeableItemDirective<TItem> implements OnChanges<ChangeableItemDirective<TItem>>, OnInit {
@Input()
key: string;
@Input() key: string;
@Output()
get onItemChanged(): EventEmitter<ItemChangedPayload<string, TItem>> {

Просмотреть файл

@ -12,8 +12,7 @@ import { ChangeableItemDirective } from './changeable-item.directive';
*/
export abstract class ChangeableItemsDirective<TItem>
implements AfterContentInit, IChangeableItemsContainer<TItem>, OnDestroy {
@ContentChildren(ChangeableItemDirective)
readonly directiveItems: QueryList<ChangeableItemDirective<TItem>>;
@ContentChildren(ChangeableItemDirective) readonly directiveItems: QueryList<ChangeableItemDirective<TItem>>;
@Output()
get onChildItemChanged(): EventEmitter<ItemChangedPayload<string, TItem>> {

Просмотреть файл

@ -54,85 +54,51 @@ import { IDatePickerProps } from 'office-ui-fabric-react';
[allFocusable]="allFocusable"
[showCloseButton]="showCloseButton"
[SelectDate]="onSelectDateHandler"
(onAfterMenuDismiss)="onAfterMenuDismiss.emit()">
(onAfterMenuDismiss)="onAfterMenuDismiss.emit()"
>
</DatePicker>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabDatePickerComponent extends ReactWrapperComponent<IDatePickerProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IDatePickerProps['componentRef'];
@Input()
calendarProps?: IDatePickerProps['calendarProps'];
@Input()
label?: IDatePickerProps['label'];
@Input()
isRequired?: IDatePickerProps['isRequired'];
@Input()
disabled?: IDatePickerProps['disabled'];
@Input()
ariaLabel?: IDatePickerProps['ariaLabel'];
@Input()
underlined?: IDatePickerProps['underlined'];
@Input()
pickerAriaLabel?: IDatePickerProps['pickerAriaLabel'];
@Input()
isMonthPickerVisible?: IDatePickerProps['isMonthPickerVisible'];
@Input()
showMonthPickerAsOverlay?: IDatePickerProps['showMonthPickerAsOverlay'];
@Input()
allowTextInput?: IDatePickerProps['allowTextInput'];
@Input()
disableAutoFocus?: IDatePickerProps['disableAutoFocus'];
@Input()
placeholder?: IDatePickerProps['placeholder'];
@Input()
today?: IDatePickerProps['today'];
@Input()
value?: IDatePickerProps['value'];
@Input()
formatDate?: IDatePickerProps['formatDate'];
@Input()
parseDateFromString?: IDatePickerProps['parseDateFromString'];
@Input()
firstDayOfWeek?: IDatePickerProps['firstDayOfWeek'];
@Input()
strings?: IDatePickerProps['strings'];
@Input()
highlightCurrentMonth?: IDatePickerProps['highlightCurrentMonth'];
@Input()
highlightSelectedMonth?: IDatePickerProps['highlightSelectedMonth'];
@Input()
showWeekNumbers?: IDatePickerProps['showWeekNumbers'];
@Input()
firstWeekOfYear?: IDatePickerProps['firstWeekOfYear'];
@Input()
showGoToToday?: IDatePickerProps['showGoToToday'];
@Input()
borderless?: IDatePickerProps['borderless'];
@Input()
className?: IDatePickerProps['className'];
@Input()
dateTimeFormatter?: IDatePickerProps['dateTimeFormatter'];
@Input()
minDate?: IDatePickerProps['minDate'];
@Input()
maxDate?: IDatePickerProps['maxDate'];
@Input()
initialPickerDate?: IDatePickerProps['initialPickerDate'];
@Input()
allFocusable?: IDatePickerProps['allFocusable'];
@Input()
showCloseButton?: IDatePickerProps['showCloseButton'];
@Input() componentRef?: IDatePickerProps['componentRef'];
@Input() calendarProps?: IDatePickerProps['calendarProps'];
@Input() label?: IDatePickerProps['label'];
@Input() isRequired?: IDatePickerProps['isRequired'];
@Input() disabled?: IDatePickerProps['disabled'];
@Input() ariaLabel?: IDatePickerProps['ariaLabel'];
@Input() underlined?: IDatePickerProps['underlined'];
@Input() pickerAriaLabel?: IDatePickerProps['pickerAriaLabel'];
@Input() isMonthPickerVisible?: IDatePickerProps['isMonthPickerVisible'];
@Input() showMonthPickerAsOverlay?: IDatePickerProps['showMonthPickerAsOverlay'];
@Input() allowTextInput?: IDatePickerProps['allowTextInput'];
@Input() disableAutoFocus?: IDatePickerProps['disableAutoFocus'];
@Input() placeholder?: IDatePickerProps['placeholder'];
@Input() today?: IDatePickerProps['today'];
@Input() value?: IDatePickerProps['value'];
@Input() formatDate?: IDatePickerProps['formatDate'];
@Input() parseDateFromString?: IDatePickerProps['parseDateFromString'];
@Input() firstDayOfWeek?: IDatePickerProps['firstDayOfWeek'];
@Input() strings?: IDatePickerProps['strings'];
@Input() highlightCurrentMonth?: IDatePickerProps['highlightCurrentMonth'];
@Input() highlightSelectedMonth?: IDatePickerProps['highlightSelectedMonth'];
@Input() showWeekNumbers?: IDatePickerProps['showWeekNumbers'];
@Input() firstWeekOfYear?: IDatePickerProps['firstWeekOfYear'];
@Input() showGoToToday?: IDatePickerProps['showGoToToday'];
@Input() borderless?: IDatePickerProps['borderless'];
@Input() className?: IDatePickerProps['className'];
@Input() dateTimeFormatter?: IDatePickerProps['dateTimeFormatter'];
@Input() minDate?: IDatePickerProps['minDate'];
@Input() maxDate?: IDatePickerProps['maxDate'];
@Input() initialPickerDate?: IDatePickerProps['initialPickerDate'];
@Input() allFocusable?: IDatePickerProps['allFocusable'];
@Input() showCloseButton?: IDatePickerProps['showCloseButton'];
@Output()
readonly onSelectDate = new EventEmitter<{ date: Date | null | undefined }>();
@Output()
readonly onAfterMenuDismiss = new EventEmitter<void>();
@Output() readonly onSelectDate = new EventEmitter<{ date: Date | null | undefined }>();
@Output() readonly onAfterMenuDismiss = new EventEmitter<void>();
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);

Просмотреть файл

@ -103,7 +103,8 @@ import { DetailsListGroupsDirective } from './directives/details-list-groups.dir
[ItemInvoked]="onItemInvokedHandler"
[RowDidMount]="onRowDidMountHandler"
[RowWillUnmount]="onRowWillUnmountHandler"
[ShouldVirtualize]="onShouldVirtualize">
[ShouldVirtualize]="onShouldVirtualize"
>
</DetailsList>
`,
styles: ['react-renderer'],
@ -111,140 +112,78 @@ import { DetailsListGroupsDirective } from './directives/details-list-groups.dir
})
export class FabDetailsListComponent extends ReactWrapperComponent<IDetailsListProps>
implements AfterContentInit, OnChanges<FabDetailsListComponent>, OnDestroy, OnInit {
@ContentChild(DetailsListColumnsDirective)
readonly columnsDirective?: DetailsListColumnsDirective;
@ContentChild(DetailsListGroupsDirective)
readonly groupsDirective?: DetailsListGroupsDirective;
@ContentChild(DetailsListColumnsDirective) readonly columnsDirective?: DetailsListColumnsDirective;
@ContentChild(DetailsListGroupsDirective) readonly groupsDirective?: DetailsListGroupsDirective;
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
theme?: IDetailsListProps['theme'];
@Input()
styles?: IDetailsListProps['styles'];
@Input()
componentRef?: IDetailsListProps['componentRef'];
@Input()
setKey?: IDetailsListProps['setKey'];
@Input()
items: IDetailsListProps['items'];
@Input()
listProps?: IDetailsListProps['listProps'];
@Input()
initialFocusedIndex?: IDetailsListProps['initialFocusedIndex'];
@Input()
className?: IDetailsListProps['className'];
@Input()
groupProps?: IDetailsListProps['groupProps'];
@Input()
indentWidth?: IDetailsListProps['indentWidth'];
@Input()
selection?: IDetailsListProps['selection'];
@Input()
selectionMode?: IDetailsListProps['selectionMode'];
@Input()
selectionPreservedOnEmptyClick?: IDetailsListProps['selectionPreservedOnEmptyClick'];
@Input()
selectionZoneProps?: IDetailsListProps['selectionZoneProps'];
@Input()
layoutMode?: IDetailsListProps['layoutMode'];
@Input()
checkboxVisibility?: IDetailsListProps['checkboxVisibility'];
@Input()
isHeaderVisible?: IDetailsListProps['isHeaderVisible'];
@Input()
constrainMode?: IDetailsListProps['constrainMode'];
@Input()
rowElementEventMap?: IDetailsListProps['rowElementEventMap'];
@Input()
dragDropEvents?: IDetailsListProps['dragDropEvents'];
@Input()
enableShimmer?: IDetailsListProps['enableShimmer'];
@Input()
viewport?: IDetailsListProps['viewport'];
@Input()
ariaLabelForListHeader?: IDetailsListProps['ariaLabelForListHeader'];
@Input()
ariaLabelForSelectAllCheckbox?: IDetailsListProps['ariaLabelForSelectAllCheckbox'];
@Input()
ariaLabelForSelectionColumn?: IDetailsListProps['ariaLabelForSelectionColumn'];
@Input()
getRowAriaLabel?: IDetailsListProps['getRowAriaLabel'];
@Input()
getRowAriaDescribedBy?: IDetailsListProps['getRowAriaDescribedBy'];
@Input()
getKey?: IDetailsListProps['getKey'];
@Input()
ariaLabel?: IDetailsListProps['ariaLabel'];
@Input()
checkButtonAriaLabel?: IDetailsListProps['checkButtonAriaLabel'];
@Input()
ariaLabelForGrid?: IDetailsListProps['ariaLabelForGrid'];
@Input()
shouldApplyApplicationRole?: IDetailsListProps['shouldApplyApplicationRole'];
@Input()
minimumPixelsForDrag?: IDetailsListProps['minimumPixelsForDrag'];
@Input()
compact?: IDetailsListProps['compact'];
@Input()
usePageCache?: IDetailsListProps['usePageCache'];
@Input()
onShouldVirtualize?: (props: IListProps) => boolean;
@Input()
checkboxCellClassName?: IDetailsListProps['checkboxCellClassName'];
@Input()
enterModalSelectionOnTouch?: IDetailsListProps['enterModalSelectionOnTouch'];
@Input()
columnReorderOptions?: IDetailsListProps['columnReorderOptions'];
@Input()
getGroupHeight?: IDetailsListProps['getGroupHeight'];
@Input()
useReducedRowRenderer?: IDetailsListProps['useReducedRowRenderer'];
@Input()
cellStyleProps?: IDetailsListProps['cellStyleProps'];
@Input()
disableSelectionZone?: IDetailsListProps['disableSelectionZone'];
@Input() theme?: IDetailsListProps['theme'];
@Input() styles?: IDetailsListProps['styles'];
@Input() componentRef?: IDetailsListProps['componentRef'];
@Input() setKey?: IDetailsListProps['setKey'];
@Input() items: IDetailsListProps['items'];
@Input() listProps?: IDetailsListProps['listProps'];
@Input() initialFocusedIndex?: IDetailsListProps['initialFocusedIndex'];
@Input() className?: IDetailsListProps['className'];
@Input() groupProps?: IDetailsListProps['groupProps'];
@Input() indentWidth?: IDetailsListProps['indentWidth'];
@Input() selection?: IDetailsListProps['selection'];
@Input() selectionMode?: IDetailsListProps['selectionMode'];
@Input() selectionPreservedOnEmptyClick?: IDetailsListProps['selectionPreservedOnEmptyClick'];
@Input() selectionZoneProps?: IDetailsListProps['selectionZoneProps'];
@Input() layoutMode?: IDetailsListProps['layoutMode'];
@Input() checkboxVisibility?: IDetailsListProps['checkboxVisibility'];
@Input() isHeaderVisible?: IDetailsListProps['isHeaderVisible'];
@Input() constrainMode?: IDetailsListProps['constrainMode'];
@Input() rowElementEventMap?: IDetailsListProps['rowElementEventMap'];
@Input() dragDropEvents?: IDetailsListProps['dragDropEvents'];
@Input() enableShimmer?: IDetailsListProps['enableShimmer'];
@Input() viewport?: IDetailsListProps['viewport'];
@Input() ariaLabelForListHeader?: IDetailsListProps['ariaLabelForListHeader'];
@Input() ariaLabelForSelectAllCheckbox?: IDetailsListProps['ariaLabelForSelectAllCheckbox'];
@Input() ariaLabelForSelectionColumn?: IDetailsListProps['ariaLabelForSelectionColumn'];
@Input() getRowAriaLabel?: IDetailsListProps['getRowAriaLabel'];
@Input() getRowAriaDescribedBy?: IDetailsListProps['getRowAriaDescribedBy'];
@Input() getKey?: IDetailsListProps['getKey'];
@Input() ariaLabel?: IDetailsListProps['ariaLabel'];
@Input() checkButtonAriaLabel?: IDetailsListProps['checkButtonAriaLabel'];
@Input() ariaLabelForGrid?: IDetailsListProps['ariaLabelForGrid'];
@Input() shouldApplyApplicationRole?: IDetailsListProps['shouldApplyApplicationRole'];
@Input() minimumPixelsForDrag?: IDetailsListProps['minimumPixelsForDrag'];
@Input() compact?: IDetailsListProps['compact'];
@Input() usePageCache?: IDetailsListProps['usePageCache'];
@Input() onShouldVirtualize?: (props: IListProps) => boolean;
@Input() checkboxCellClassName?: IDetailsListProps['checkboxCellClassName'];
@Input() enterModalSelectionOnTouch?: IDetailsListProps['enterModalSelectionOnTouch'];
@Input() columnReorderOptions?: IDetailsListProps['columnReorderOptions'];
@Input() getGroupHeight?: IDetailsListProps['getGroupHeight'];
@Input() useReducedRowRenderer?: IDetailsListProps['useReducedRowRenderer'];
@Input() cellStyleProps?: IDetailsListProps['cellStyleProps'];
@Input() disableSelectionZone?: IDetailsListProps['disableSelectionZone'];
// Inherited members (IWithViewportProps)
@Input()
skipViewportMeasures?: IDetailsListProps['skipViewportMeasures'];
@Input() skipViewportMeasures?: IDetailsListProps['skipViewportMeasures'];
// Render members
@Input()
renderDetailsFooter?: InputRendererOptions<IDetailsFooterProps>;
@Input()
renderDetailsHeader?: InputRendererOptions<IDetailsHeaderProps>;
@Input()
renderMissingItem?: InputRendererOptions<IMissingItemRenderContext>;
@Input()
renderRow?: InputRendererOptions<IDetailsRowProps>;
@Input() renderDetailsFooter?: InputRendererOptions<IDetailsFooterProps>;
@Input() renderDetailsHeader?: InputRendererOptions<IDetailsHeaderProps>;
@Input() renderMissingItem?: InputRendererOptions<IMissingItemRenderContext>;
@Input() renderRow?: InputRendererOptions<IDetailsRowProps>;
// Callback members
@Output()
readonly onActiveItemChanged = new EventEmitter<{ item?: any; index?: number; ev?: Event }>();
@Output()
readonly onColumnHeaderClick = new EventEmitter<{ ev?: Event; column?: IColumn }>();
@Output()
readonly onColumnHeaderContextMenu = new EventEmitter<{ column?: IColumn; ev?: Event }>();
@Output()
readonly onColumnResize = new EventEmitter<{ column?: IColumn; newWidth?: number; columnIndex?: number }>();
@Output()
readonly onDidUpdate = new EventEmitter<{ detailsList?: DetailsListBase }>();
@Output()
readonly onItemContextMenu = new EventEmitter<{ item?: any; index?: number; ev?: Event }>();
@Output()
readonly onItemInvoked = new EventEmitter<{ item?: any; index?: number; ev?: Event }>();
@Output()
readonly onRowDidMount = new EventEmitter<{ item?: any; index?: number }>();
@Output()
readonly onRowWillUnmount = new EventEmitter<{ item?: any; index?: number }>();
@Output() readonly onActiveItemChanged = new EventEmitter<{ item?: any; index?: number; ev?: Event }>();
@Output() readonly onColumnHeaderClick = new EventEmitter<{ ev?: Event; column?: IColumn }>();
@Output() readonly onColumnHeaderContextMenu = new EventEmitter<{ column?: IColumn; ev?: Event }>();
@Output() readonly onColumnResize = new EventEmitter<{ column?: IColumn; newWidth?: number; columnIndex?: number }>();
@Output() readonly onDidUpdate = new EventEmitter<{ detailsList?: DetailsListBase }>();
@Output() readonly onItemContextMenu = new EventEmitter<{ item?: any; index?: number; ev?: Event }>();
@Output() readonly onItemInvoked = new EventEmitter<{ item?: any; index?: number; ev?: Event }>();
@Output() readonly onRowDidMount = new EventEmitter<{ item?: any; index?: number }>();
@Output() readonly onRowWillUnmount = new EventEmitter<{ item?: any; index?: number }>();
// Directive members
@Input()
columns: ReadonlyArray<IDetailsListColumnOptions>;
@Input()
groups: ReadonlyArray<IGroup>;
@Input() columns: ReadonlyArray<IDetailsListColumnOptions>;
@Input() groups: ReadonlyArray<IGroup>;
/** @internal */
transformedColumns_: ReadonlyArray<IColumn>;

Просмотреть файл

@ -12,8 +12,7 @@ import { ChangeableItemDirective } from '../../core/shared/changeable-item.direc
*/
@Directive({ selector: 'fab-details-list-column > render' })
export class DetailsListColumnRenderDirective {
@ContentChild(TemplateRef)
readonly templateRef: TemplateRef<IDetailsListColumnOptionsRenderContext>;
@ContentChild(TemplateRef) readonly templateRef: TemplateRef<IDetailsListColumnOptionsRenderContext>;
}
/**
@ -22,79 +21,45 @@ export class DetailsListColumnRenderDirective {
@Directive({ selector: 'fab-details-list-column' })
export class DetailsListColumnDirective extends ChangeableItemDirective<IDetailsListColumnOptions>
implements AfterContentInit {
@ContentChild(DetailsListColumnRenderDirective)
readonly renderDirective: DetailsListColumnRenderDirective;
@ContentChild(DetailsListColumnRenderDirective) readonly renderDirective: DetailsListColumnRenderDirective;
@Input()
name: IColumn['name'];
@Input()
fieldName?: IColumn['fieldName'];
@Input()
className?: IColumn['className'];
@Input()
minWidth: IColumn['minWidth'];
@Input()
ariaLabel?: IColumn['ariaLabel'];
@Input()
isRowHeader?: IColumn['isRowHeader'];
@Input()
maxWidth?: IColumn['maxWidth'];
@Input()
columnActionsMode?: IColumn['columnActionsMode'];
@Input()
iconName?: IColumn['iconName'];
@Input()
isIconOnly?: IColumn['isIconOnly'];
@Input()
iconClassName?: IColumn['iconClassName'];
@Input()
isCollapsable?: IColumn['isCollapsable'];
@Input()
isSorted?: IColumn['isSorted'];
@Input()
isSortedDescending?: IColumn['isSortedDescending'];
@Input()
isResizable?: IColumn['isResizable'];
@Input()
isMultiline?: IColumn['isMultiline'];
@Input()
onRender?: IColumn['onRender'];
@Input()
onRenderDivider?: IColumn['onRenderDivider'];
@Input()
isFiltered?: IColumn['isFiltered'];
@Input()
isGrouped?: IColumn['isGrouped'];
@Input()
data?: IColumn['data'];
@Input()
calculatedWidth?: IColumn['calculatedWidth'];
@Input()
currentWidth?: IColumn['currentWidth'];
@Input()
headerClassName?: IColumn['headerClassName'];
@Input()
isPadded?: IColumn['isPadded'];
@Input()
sortAscendingAriaLabel?: IColumn['sortAscendingAriaLabel'];
@Input()
sortDescendingAriaLabel?: IColumn['sortDescendingAriaLabel'];
@Input()
groupAriaLabel?: IColumn['groupAriaLabel'];
@Input()
filterAriaLabel?: IColumn['filterAriaLabel'];
@Input() name: IColumn['name'];
@Input() fieldName?: IColumn['fieldName'];
@Input() className?: IColumn['className'];
@Input() minWidth: IColumn['minWidth'];
@Input() ariaLabel?: IColumn['ariaLabel'];
@Input() isRowHeader?: IColumn['isRowHeader'];
@Input() maxWidth?: IColumn['maxWidth'];
@Input() columnActionsMode?: IColumn['columnActionsMode'];
@Input() iconName?: IColumn['iconName'];
@Input() isIconOnly?: IColumn['isIconOnly'];
@Input() iconClassName?: IColumn['iconClassName'];
@Input() isCollapsable?: IColumn['isCollapsable'];
@Input() isSorted?: IColumn['isSorted'];
@Input() isSortedDescending?: IColumn['isSortedDescending'];
@Input() isResizable?: IColumn['isResizable'];
@Input() isMultiline?: IColumn['isMultiline'];
@Input() onRender?: IColumn['onRender'];
@Input() onRenderDivider?: IColumn['onRenderDivider'];
@Input() isFiltered?: IColumn['isFiltered'];
@Input() isGrouped?: IColumn['isGrouped'];
@Input() data?: IColumn['data'];
@Input() calculatedWidth?: IColumn['calculatedWidth'];
@Input() currentWidth?: IColumn['currentWidth'];
@Input() headerClassName?: IColumn['headerClassName'];
@Input() isPadded?: IColumn['isPadded'];
@Input() sortAscendingAriaLabel?: IColumn['sortAscendingAriaLabel'];
@Input() sortDescendingAriaLabel?: IColumn['sortDescendingAriaLabel'];
@Input() groupAriaLabel?: IColumn['groupAriaLabel'];
@Input() filterAriaLabel?: IColumn['filterAriaLabel'];
// Render members
@Input()
render: IDetailsListColumnOptions['render'];
@Input() render: IDetailsListColumnOptions['render'];
// Callback members
@Output()
readonly onColumnClick = new EventEmitter<{ ev: Event; column: IColumn }>();
@Output()
readonly onColumnContextMenu = new EventEmitter<{ column?: IColumn; ev?: Event }>();
@Output()
readonly onColumnResize = new EventEmitter<{ width?: number }>();
@Output() readonly onColumnClick = new EventEmitter<{ ev: Event; column: IColumn }>();
@Output() readonly onColumnContextMenu = new EventEmitter<{ column?: IColumn; ev?: Event }>();
@Output() readonly onColumnResize = new EventEmitter<{ width?: number }>();
ngAfterContentInit() {
if (this.renderDirective && this.renderDirective.templateRef) {

Просмотреть файл

@ -12,8 +12,7 @@ import { DetailsListColumnDirective, IDetailsListColumnOptions } from './details
*/
@Directive({ selector: 'fab-details-list > columns' })
export class DetailsListColumnsDirective extends ChangeableItemsDirective<IDetailsListColumnOptions> {
@ContentChildren(DetailsListColumnDirective)
readonly directiveItems: QueryList<DetailsListColumnDirective>;
@ContentChildren(DetailsListColumnDirective) readonly directiveItems: QueryList<DetailsListColumnDirective>;
get items() {
return this.directiveItems.map<IDetailsListColumnOptions>(directiveItem => ({

Просмотреть файл

@ -12,8 +12,7 @@ import { GroupItemDirective } from '../../group';
*/
@Directive({ selector: 'fab-details-list > groups' })
export class DetailsListGroupsDirective extends ChangeableItemsDirective<IGroup> {
@ContentChildren(GroupItemDirective)
readonly directiveItems: QueryList<GroupItemDirective>;
@ContentChildren(GroupItemDirective) readonly directiveItems: QueryList<GroupItemDirective>;
get items() {
return this.directiveItems.toArray();

Просмотреть файл

@ -19,6 +19,7 @@ import { IDialogContentProps, IDialogFooterProps, IDialogProps } from 'office-ui
selector: 'fab-dialog',
exportAs: 'fabDialog',
template: `
<!-- prettier-ignore -->
<Dialog
#reactNode
[responsiveMode]="responsiveMode"
@ -36,7 +37,8 @@ import { IDialogContentProps, IDialogFooterProps, IDialogProps } from 'office-ui
[modalProps]="modalProps"
[minWidth]="minWidth"
[maxWidth]="maxWidth"
(onDismiss)="onDismissHandler($event)">
(onDismiss)="onDismissHandler($event)"
>
<ReactContent><ng-content></ng-content></ReactContent>
</Dialog>
`,
@ -44,42 +46,25 @@ import { IDialogContentProps, IDialogFooterProps, IDialogProps } from 'office-ui
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabDialogComponent extends ReactWrapperComponent<IDialogProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
responsiveMode?: IDialogProps['responsiveMode'];
@Input()
elementToFocusOnDismiss?: IDialogProps['elementToFocusOnDismiss'];
@Input()
ignoreExternalFocusing?: IDialogProps['ignoreExternalFocusing'];
@Input()
forceFocusInsideTrap?: IDialogProps['forceFocusInsideTrap'];
@Input()
firstFocusableSelector?: IDialogProps['firstFocusableSelector'];
@Input()
closeButtonAriaLabel?: IDialogProps['closeButtonAriaLabel'];
@Input()
isClickableOutsideFocusTrap?: IDialogProps['isClickableOutsideFocusTrap'];
@Input()
componentRef?: IDialogProps['componentRef'];
@Input()
styles?: IDialogProps['styles'];
@Input()
theme?: IDialogProps['theme'];
@Input()
dialogContentProps?: IDialogProps['dialogContentProps'];
@Input()
hidden?: IDialogProps['hidden'];
@Input()
modalProps?: IDialogProps['modalProps'];
@Input()
minWidth?: IDialogProps['minWidth'];
@Input()
maxWidth?: IDialogProps['maxWidth'];
@Input() responsiveMode?: IDialogProps['responsiveMode'];
@Input() elementToFocusOnDismiss?: IDialogProps['elementToFocusOnDismiss'];
@Input() ignoreExternalFocusing?: IDialogProps['ignoreExternalFocusing'];
@Input() forceFocusInsideTrap?: IDialogProps['forceFocusInsideTrap'];
@Input() firstFocusableSelector?: IDialogProps['firstFocusableSelector'];
@Input() closeButtonAriaLabel?: IDialogProps['closeButtonAriaLabel'];
@Input() isClickableOutsideFocusTrap?: IDialogProps['isClickableOutsideFocusTrap'];
@Input() componentRef?: IDialogProps['componentRef'];
@Input() styles?: IDialogProps['styles'];
@Input() theme?: IDialogProps['theme'];
@Input() dialogContentProps?: IDialogProps['dialogContentProps'];
@Input() hidden?: IDialogProps['hidden'];
@Input() modalProps?: IDialogProps['modalProps'];
@Input() minWidth?: IDialogProps['minWidth'];
@Input() maxWidth?: IDialogProps['maxWidth'];
@Output()
readonly onDismiss = new EventEmitter<MouseEvent>();
@Output() readonly onDismiss = new EventEmitter<MouseEvent>();
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);
@ -96,12 +81,7 @@ export class FabDialogComponent extends ReactWrapperComponent<IDialogProps> {
selector: 'fab-dialog-footer',
exportAs: 'fabDialogFooter',
template: `
<DialogFooter
#reactNode
[componentRef]="componentRef"
[styles]="styles"
[theme]="theme"
[className]="className">
<DialogFooter #reactNode [componentRef]="componentRef" [styles]="styles" [theme]="theme" [className]="className">
<ReactContent><ng-content></ng-content></ReactContent>
</DialogFooter>
`,
@ -109,17 +89,12 @@ export class FabDialogComponent extends ReactWrapperComponent<IDialogProps> {
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabDialogFooterComponent extends ReactWrapperComponent<IDialogFooterProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IDialogFooterProps['componentRef'];
@Input()
styles?: IDialogFooterProps['styles'];
@Input()
theme?: IDialogFooterProps['theme'];
@Input()
className?: IDialogFooterProps['className'];
@Input() componentRef?: IDialogFooterProps['componentRef'];
@Input() styles?: IDialogFooterProps['styles'];
@Input() theme?: IDialogFooterProps['theme'];
@Input() className?: IDialogFooterProps['className'];
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);
@ -146,7 +121,8 @@ export class FabDialogFooterComponent extends ReactWrapperComponent<IDialogFoote
[responsiveMode]="responsiveMode"
[closeButtonAriaLabel]="closeButtonAriaLabel"
[type]="type"
(onDismiss)="onDismiss.emit($event && $event.nativeEvent)">
(onDismiss)="onDismiss.emit($event && $event.nativeEvent)"
>
<ReactContent><ng-content></ng-content></ReactContent>
</DialogContent>
`,
@ -154,40 +130,24 @@ export class FabDialogFooterComponent extends ReactWrapperComponent<IDialogFoote
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabDialogContentComponent extends ReactWrapperComponent<IDialogContentProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IDialogContentProps['componentRef'];
@Input()
styles?: IDialogContentProps['styles'];
@Input()
theme?: IDialogContentProps['theme'];
@Input()
isMultiline?: IDialogContentProps['isMultiline'];
@Input()
showCloseButton?: IDialogContentProps['showCloseButton'];
@Input()
topButtonsProps?: IDialogContentProps['topButtonsProps'];
@Input()
className?: IDialogContentProps['className'];
@Input()
subTextId?: IDialogContentProps['subTextId'];
@Input()
subText?: IDialogContentProps['subText'];
@Input()
titleId?: IDialogContentProps['titleId'];
@Input()
title?: IDialogContentProps['title'];
@Input()
responsiveMode?: IDialogContentProps['responsiveMode'];
@Input()
closeButtonAriaLabel?: IDialogContentProps['closeButtonAriaLabel'];
@Input()
type?: IDialogContentProps['type'];
@Input() componentRef?: IDialogContentProps['componentRef'];
@Input() styles?: IDialogContentProps['styles'];
@Input() theme?: IDialogContentProps['theme'];
@Input() isMultiline?: IDialogContentProps['isMultiline'];
@Input() showCloseButton?: IDialogContentProps['showCloseButton'];
@Input() topButtonsProps?: IDialogContentProps['topButtonsProps'];
@Input() className?: IDialogContentProps['className'];
@Input() subTextId?: IDialogContentProps['subTextId'];
@Input() subText?: IDialogContentProps['subText'];
@Input() titleId?: IDialogContentProps['titleId'];
@Input() title?: IDialogContentProps['title'];
@Input() responsiveMode?: IDialogContentProps['responsiveMode'];
@Input() closeButtonAriaLabel?: IDialogContentProps['closeButtonAriaLabel'];
@Input() type?: IDialogContentProps['type'];
@Output()
readonly onDismiss = new EventEmitter<MouseEvent>();
@Output() readonly onDismiss = new EventEmitter<MouseEvent>();
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);

Просмотреть файл

@ -2,27 +2,30 @@
// Licensed under the MIT License.
import { ReactWrapperComponent } from '@angular-react/core';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, Renderer2, ViewChild } from '@angular/core';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ElementRef,
Input,
Renderer2,
ViewChild,
} from '@angular/core';
import { IVerticalDividerProps } from 'office-ui-fabric-react/lib/Divider';
@Component({
selector: 'fab-vertical-divider',
exportAs: 'fabVerticalDivider',
template: `
<VerticalDivider
#reactNode
[getClassNames]="getClassNames">
</VerticalDivider>
<VerticalDivider #reactNode [getClassNames]="getClassNames"> </VerticalDivider>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabDividerComponent extends ReactWrapperComponent<IVerticalDividerProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
getClassNames?: IVerticalDividerProps['getClassNames'];
@Input() getClassNames?: IVerticalDividerProps['getClassNames'];
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);

Просмотреть файл

@ -2,17 +2,22 @@
// Licensed under the MIT License.
import { ReactWrapperComponent } from '@angular-react/core';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, Renderer2, ViewChild } from '@angular/core';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ElementRef,
Input,
Renderer2,
ViewChild,
} from '@angular/core';
import { IFabricProps } from 'office-ui-fabric-react/lib/Fabric';
@Component({
selector: 'fab-fabric',
exportAs: 'fabFabric',
template: `
<Fabric
#reactNode
[componentRef]="componentRef"
[theme]="theme">
<Fabric #reactNode [componentRef]="componentRef" [theme]="theme">
<ReactContent><ng-content></ng-content></ReactContent>
</Fabric>
`,
@ -20,13 +25,10 @@ import { IFabricProps } from 'office-ui-fabric-react/lib/Fabric';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabFabricComponent extends ReactWrapperComponent<IFabricProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IFabricProps['componentRef'];
@Input()
theme?: IFabricProps['theme'];
@Input() componentRef?: IFabricProps['componentRef'];
@Input() theme?: IFabricProps['theme'];
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);

Просмотреть файл

@ -20,31 +20,19 @@ import { ChangeableItemDirective } from '../../core/shared/changeable-item.direc
@Directive({ selector: 'fab-group-item' })
export class GroupItemDirective extends ChangeableItemDirective<IGroup>
implements AfterContentInit, IChangeableItemsContainer<IGroup>, IGroup, OnDestroy {
@ContentChildren(GroupItemDirective)
readonly groupItemsDirectives: QueryList<GroupItemDirective>;
@ContentChildren(GroupItemDirective) readonly groupItemsDirectives: QueryList<GroupItemDirective>;
@Input()
name: IGroup['name'];
@Input()
startIndex: IGroup['startIndex'];
@Input()
count: IGroup['count'];
@Input()
children?: IGroup['children'];
@Input()
level?: IGroup['level'];
@Input()
isCollapsed?: IGroup['isCollapsed'];
@Input()
isShowingAll?: IGroup['isShowingAll'];
@Input()
isDropEnabled?: IGroup['isDropEnabled'];
@Input()
data?: IGroup['data'];
@Input()
ariaLabel?: IGroup['ariaLabel'];
@Input()
hasMoreData?: IGroup['hasMoreData'];
@Input() name: IGroup['name'];
@Input() startIndex: IGroup['startIndex'];
@Input() count: IGroup['count'];
@Input() children?: IGroup['children'];
@Input() level?: IGroup['level'];
@Input() isCollapsed?: IGroup['isCollapsed'];
@Input() isShowingAll?: IGroup['isShowingAll'];
@Input() isDropEnabled?: IGroup['isDropEnabled'];
@Input() data?: IGroup['data'];
@Input() ariaLabel?: IGroup['ariaLabel'];
@Input() hasMoreData?: IGroup['hasMoreData'];
@Output()
get onChildItemChanged(): EventEmitter<ItemChangedPayload<string, IGroup>> {

Просмотреть файл

@ -40,50 +40,33 @@ import { IListProps } from 'office-ui-fabric-react/lib/List';
[groupProps]="groupProps"
[RenderCell]="renderCell && onRenderCell"
[GroupExpandStateChanged]="onGroupExpandStateChangedHandler"
>
>
</GroupedList>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabGroupedListComponent extends ReactWrapperComponent<IGroupedListProps> implements OnInit {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IGroupedListProps['componentRef'];
@Input()
className?: IGroupedListProps['className'];
@Input()
dragDropEvents?: IGroupedListProps['dragDropEvents'];
@Input()
dragDropHelper?: IGroupedListProps['dragDropHelper'];
@Input()
eventsToRegister?: IGroupedListProps['eventsToRegister'];
@Input()
groups?: IGroupedListProps['groups'];
@Input()
items: IGroupedListProps['items'];
@Input()
listProps?: IGroupedListProps['listProps'];
@Input()
selection?: IGroupedListProps['selection'];
@Input()
selectionMode?: IGroupedListProps['selectionMode'];
@Input()
viewport?: IGroupedListProps['viewport'];
@Input()
usePageCache?: IGroupedListProps['usePageCache'];
@Input()
shouldVirtualize?: (props: IListProps) => boolean;
@Input()
groupProps?: IGroupRenderProps;
@Input() componentRef?: IGroupedListProps['componentRef'];
@Input() className?: IGroupedListProps['className'];
@Input() dragDropEvents?: IGroupedListProps['dragDropEvents'];
@Input() dragDropHelper?: IGroupedListProps['dragDropHelper'];
@Input() eventsToRegister?: IGroupedListProps['eventsToRegister'];
@Input() groups?: IGroupedListProps['groups'];
@Input() items: IGroupedListProps['items'];
@Input() listProps?: IGroupedListProps['listProps'];
@Input() selection?: IGroupedListProps['selection'];
@Input() selectionMode?: IGroupedListProps['selectionMode'];
@Input() viewport?: IGroupedListProps['viewport'];
@Input() usePageCache?: IGroupedListProps['usePageCache'];
@Input() shouldVirtualize?: (props: IListProps) => boolean;
@Input() groupProps?: IGroupRenderProps;
@Input()
renderCell: InputRendererOptions<ICellRenderContext>;
@Input() renderCell: InputRendererOptions<ICellRenderContext>;
@Output()
readonly onGroupExpandStateChanged = new EventEmitter<{ isSomeGroupExpanded: boolean }>();
@Output() readonly onGroupExpandStateChanged = new EventEmitter<{ isSomeGroupExpanded: boolean }>();
private _renderCell: JsxRenderFunc<ICellRenderContext>;

Просмотреть файл

@ -38,7 +38,8 @@ import { omit } from '../../utils/omit';
[setInitialFocus]="setInitialFocus"
[openHotKey]="openHotKey"
(onCardVisible)="onCardVisible.emit()"
(onCardHide)="onCardHide.emit()">
(onCardHide)="onCardHide.emit()"
>
<ReactContent><ng-content></ng-content></ReactContent>
</HoverCard>
`,
@ -46,35 +47,21 @@ import { omit } from '../../utils/omit';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabHoverCardComponent extends ReactWrapperComponent<IHoverCardProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IHoverCardProps['componentRef'];
@Input()
setAriaDescribedBy?: IHoverCardProps['setAriaDescribedBy'];
@Input()
cardOpenDelay?: IHoverCardProps['cardOpenDelay'];
@Input()
cardDismissDelay?: IHoverCardProps['cardDismissDelay'];
@Input()
expandedCardOpenDelay?: IHoverCardProps['expandedCardOpenDelay'];
@Input()
sticky?: IHoverCardProps['sticky'];
@Input()
instantOpenOnClick?: IHoverCardProps['instantOpenOnClick'];
@Input()
styles?: IHoverCardProps['styles'];
@Input()
target?: IHoverCardProps['target'];
@Input()
trapFocus?: IHoverCardProps['trapFocus'];
@Input()
shouldBlockHoverCard?: () => boolean; // Workaround for bug in the Fabric React types (() => void)
@Input()
setInitialFocus?: IHoverCardProps['setInitialFocus'];
@Input()
openHotKey?: IHoverCardProps['openHotKey'];
@Input() componentRef?: IHoverCardProps['componentRef'];
@Input() setAriaDescribedBy?: IHoverCardProps['setAriaDescribedBy'];
@Input() cardOpenDelay?: IHoverCardProps['cardOpenDelay'];
@Input() cardDismissDelay?: IHoverCardProps['cardDismissDelay'];
@Input() expandedCardOpenDelay?: IHoverCardProps['expandedCardOpenDelay'];
@Input() sticky?: IHoverCardProps['sticky'];
@Input() instantOpenOnClick?: IHoverCardProps['instantOpenOnClick'];
@Input() styles?: IHoverCardProps['styles'];
@Input() target?: IHoverCardProps['target'];
@Input() trapFocus?: IHoverCardProps['trapFocus'];
@Input() shouldBlockHoverCard?: () => boolean; // Workaround for bug in the Fabric React types (() => void)
@Input() setInitialFocus?: IHoverCardProps['setInitialFocus'];
@Input() openHotKey?: IHoverCardProps['openHotKey'];
@Input()
set expandingCardOptions(value: IExpandingCardOptions) {
this._expandingCardOptions = value;
@ -87,10 +74,8 @@ export class FabHoverCardComponent extends ReactWrapperComponent<IHoverCardProps
return this._expandingCardOptions;
}
@Output()
readonly onCardVisible = new EventEmitter<void>();
@Output()
readonly onCardHide = new EventEmitter<void>();
@Output() readonly onCardVisible = new EventEmitter<void>();
@Output() readonly onCardHide = new EventEmitter<void>();
transformedExpandingCardProps: IExpandingCardProps;
private _expandingCardOptions: IExpandingCardOptions;

Просмотреть файл

@ -24,31 +24,24 @@ import { IIconProps } from 'office-ui-fabric-react/lib/Icon';
[iconType]="iconType"
[imageProps]="imageProps"
[imageErrorAs]="imageErrorAs"
[styles]="styles">
[styles]="styles"
>
</Icon>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabIconComponent extends ReactWrapperComponent<IIconProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IIconProps['componentRef'];
@Input() componentRef?: IIconProps['componentRef'];
@Input()
iconName?: IIconProps['iconName'];
@Input()
ariaLabel?: IIconProps['ariaLabel'];
@Input()
iconType?: IIconProps['iconType'];
@Input()
imageProps?: IIconProps['imageProps'];
@Input()
imageErrorAs?: IIconProps['imageErrorAs'];
@Input()
styles?: IIconProps['styles'];
@Input() iconName?: IIconProps['iconName'];
@Input() ariaLabel?: IIconProps['ariaLabel'];
@Input() iconType?: IIconProps['iconType'];
@Input() imageProps?: IIconProps['imageProps'];
@Input() imageErrorAs?: IIconProps['imageErrorAs'];
@Input() styles?: IIconProps['styles'];
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer, { setHostDisplay: true });

Просмотреть файл

@ -2,82 +2,73 @@
// Licensed under the MIT License.
import { ReactWrapperComponent } from '@angular-react/core';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild } from '@angular/core';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ElementRef,
EventEmitter,
Input,
Output,
Renderer2,
ViewChild,
} from '@angular/core';
import { IImageProps, ImageLoadState } from 'office-ui-fabric-react/lib/Image';
@Component({
selector: 'fab-image',
exportAs: 'fabImage',
template: `
<Image
#reactNode
[alt]="alt"
[crossOrigin]="crossOrigin"
[height]="height"
[sizes]="sizes"
[src]="src"
[srcSet]="srcSet"
[useMap]="useMap"
[width]="width"
[styles]="styles"
[theme]="theme"
[className]="className"
[shouldFadeIn]="shouldFadeIn"
[shouldStartVisible]="shouldStartVisible"
[imageFit]="imageFit"
[errorSrc]="errorSrc"
[maximizeFrame]="maximizeFrame"
(onLoadingStateChange)="onLoadingStateChange.emit($event)"
[coverStyle]="coverStyle">
</Image>
<!-- prettier-ignore -->
<Image
#reactNode
[alt]="alt"
[crossOrigin]="crossOrigin"
[height]="height"
[sizes]="sizes"
[src]="src"
[srcSet]="srcSet"
[useMap]="useMap"
[width]="width"
[styles]="styles"
[theme]="theme"
[className]="className"
[shouldFadeIn]="shouldFadeIn"
[shouldStartVisible]="shouldStartVisible"
[imageFit]="imageFit"
[errorSrc]="errorSrc"
[maximizeFrame]="maximizeFrame"
(onLoadingStateChange)="onLoadingStateChange.emit($event)"
[coverStyle]="coverStyle"
>
</Image>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabImageComponent extends ReactWrapperComponent<IImageProps> {
@Input()
alt?: IImageProps['alt'];
@Input()
crossOrigin?: IImageProps['crossOrigin'];
@Input()
height?: IImageProps['height'];
@Input()
sizes?: IImageProps['sizes'];
@Input()
src?: IImageProps['src'];
@Input()
srcSet?: IImageProps['srcSet'];
@Input()
useMap?: IImageProps['useMap'];
@Input()
width?: IImageProps['width'];
@Input() alt?: IImageProps['alt'];
@Input() crossOrigin?: IImageProps['crossOrigin'];
@Input() height?: IImageProps['height'];
@Input() sizes?: IImageProps['sizes'];
@Input() src?: IImageProps['src'];
@Input() srcSet?: IImageProps['srcSet'];
@Input() useMap?: IImageProps['useMap'];
@Input() width?: IImageProps['width'];
@Input()
styles?: IImageProps['styles'];
@Input()
theme?: IImageProps['theme'];
@Input()
className?: IImageProps['className'];
@Input()
shouldFadeIn?: IImageProps['shouldFadeIn'];
@Input()
shouldStartVisible?: IImageProps['shouldStartVisible'];
@Input()
imageFit?: IImageProps['imageFit'];
@Input()
errorSrc?: IImageProps['errorSrc'];
@Input()
maximizeFrame?: IImageProps['maximizeFrame'];
@Input()
coverStyle?: IImageProps['coverStyle'];
@Input() styles?: IImageProps['styles'];
@Input() theme?: IImageProps['theme'];
@Input() className?: IImageProps['className'];
@Input() shouldFadeIn?: IImageProps['shouldFadeIn'];
@Input() shouldStartVisible?: IImageProps['shouldStartVisible'];
@Input() imageFit?: IImageProps['imageFit'];
@Input() errorSrc?: IImageProps['errorSrc'];
@Input() maximizeFrame?: IImageProps['maximizeFrame'];
@Input() coverStyle?: IImageProps['coverStyle'];
@Output()
readonly onLoadingStateChange = new EventEmitter<ImageLoadState>();
@Output() readonly onLoadingStateChange = new EventEmitter<ImageLoadState>();
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);

Просмотреть файл

@ -2,7 +2,15 @@
// Licensed under the MIT License.
import { ReactWrapperComponent } from '@angular-react/core';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, Renderer2, ViewChild } from '@angular/core';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ElementRef,
Input,
Renderer2,
ViewChild,
} from '@angular/core';
import { ILinkProps, Link } from 'office-ui-fabric-react/lib/Link';
@Component({
@ -10,33 +18,32 @@ import { ILinkProps, Link } from 'office-ui-fabric-react/lib/Link';
exportAs: 'fabLink',
template: `
<Disguise
#reactNode
[disguiseRootAs]="LinkType"
[href]="href"
[type]="type"
[download]="download"
[hrefLang]="hrefLang"
[media]="media"
[rel]="rel"
[target]="target"
[autoFocus]="autoFocus"
[form]="form"
[formAction]="formAction"
[formEncType]="formEncType"
[formMethod]="formMethod"
[formNoValidate]="formNoValidate"
[formTarget]="formTarget"
[name]="name"
[value]="value"
[as]="linkAs"
[componentRef]="componentRef"
[disabled]="disabled"
[styles]="styles"
[theme]="theme"
[keytipProps]="keytipProps">
<ReactContent><ng-content></ng-content></ReactContent>
#reactNode
[disguiseRootAs]="LinkType"
[href]="href"
[type]="type"
[download]="download"
[hrefLang]="hrefLang"
[media]="media"
[rel]="rel"
[target]="target"
[autoFocus]="autoFocus"
[form]="form"
[formAction]="formAction"
[formEncType]="formEncType"
[formMethod]="formMethod"
[formNoValidate]="formNoValidate"
[formTarget]="formTarget"
[name]="name"
[value]="value"
[as]="linkAs"
[componentRef]="componentRef"
[disabled]="disabled"
[styles]="styles"
[theme]="theme"
[keytipProps]="keytipProps"
>
<ReactContent><ng-content></ng-content></ReactContent>
</Disguise>
`,
styles: ['react-renderer'],
@ -45,54 +52,31 @@ import { ILinkProps, Link } from 'office-ui-fabric-react/lib/Link';
export class FabLinkComponent extends ReactWrapperComponent<ILinkProps> {
readonly LinkType: any = Link;
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
href: ILinkProps['href'];
@Input()
type?: ILinkProps['type'];
@Input()
download?: ILinkProps['download'];
@Input()
hrefLang?: ILinkProps['hrefLang'];
@Input()
media?: ILinkProps['media'];
@Input()
rel?: ILinkProps['rel'];
@Input()
target?: ILinkProps['target'];
@Input()
autoFocus?: ILinkProps['autoFocus'];
@Input()
form?: ILinkProps['form'];
@Input()
formAction?: ILinkProps['formAction'];
@Input()
formEncType?: ILinkProps['formEncType'];
@Input()
formMethod?: ILinkProps['formMethod'];
@Input()
formNoValidate?: ILinkProps['formNoValidate'];
@Input()
formTarget?: ILinkProps['formTarget'];
@Input()
name?: ILinkProps['name'];
@Input()
value?: ILinkProps['value'];
@Input() href: ILinkProps['href'];
@Input() type?: ILinkProps['type'];
@Input() download?: ILinkProps['download'];
@Input() hrefLang?: ILinkProps['hrefLang'];
@Input() media?: ILinkProps['media'];
@Input() rel?: ILinkProps['rel'];
@Input() target?: ILinkProps['target'];
@Input() autoFocus?: ILinkProps['autoFocus'];
@Input() form?: ILinkProps['form'];
@Input() formAction?: ILinkProps['formAction'];
@Input() formEncType?: ILinkProps['formEncType'];
@Input() formMethod?: ILinkProps['formMethod'];
@Input() formNoValidate?: ILinkProps['formNoValidate'];
@Input() formTarget?: ILinkProps['formTarget'];
@Input() name?: ILinkProps['name'];
@Input() value?: ILinkProps['value'];
@Input()
componentRef?: ILinkProps['componentRef'];
@Input()
disabled?: ILinkProps['disabled'];
@Input()
styles?: ILinkProps['styles'];
@Input()
theme?: ILinkProps['theme'];
@Input('as')
linkAs?: string | React.ComponentClass | React.StatelessComponent;
@Input()
keytipProps?: ILinkProps['keytipProps'];
@Input() componentRef?: ILinkProps['componentRef'];
@Input() disabled?: ILinkProps['disabled'];
@Input() styles?: ILinkProps['styles'];
@Input() theme?: ILinkProps['theme'];
@Input('as') linkAs?: string | React.ComponentClass | React.StatelessComponent;
@Input() keytipProps?: ILinkProps['keytipProps'];
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);

Просмотреть файл

@ -28,7 +28,8 @@ import { IMarqueeSelectionProps } from 'office-ui-fabric-react/lib/MarqueeSelect
[rootProps]="rootProps"
[styles]="styles"
[theme]="theme"
[ShouldStartSelection]="onShouldStartSelection">
[ShouldStartSelection]="onShouldStartSelection"
>
<ReactContent><ng-content></ng-content></ReactContent>
</MarqueeSelection>
`,
@ -36,27 +37,17 @@ import { IMarqueeSelectionProps } from 'office-ui-fabric-react/lib/MarqueeSelect
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabMarqueeSelectionComponent extends ReactWrapperComponent<IMarqueeSelectionProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IMarqueeSelectionProps['componentRef'];
@Input()
selection: IMarqueeSelectionProps['selection'];
@Input()
rootProps?: IMarqueeSelectionProps['rootProps'];
@Input()
onShouldStartSelection?: (ev: MouseEvent) => boolean;
@Input()
isEnabled?: IMarqueeSelectionProps['isEnabled'];
@Input()
isDraggingConstrainedToRoot?: IMarqueeSelectionProps['isDraggingConstrainedToRoot'];
@Input()
className?: IMarqueeSelectionProps['className'];
@Input()
theme?: IMarqueeSelectionProps['theme'];
@Input()
styles?: IMarqueeSelectionProps['styles'];
@Input() componentRef?: IMarqueeSelectionProps['componentRef'];
@Input() selection: IMarqueeSelectionProps['selection'];
@Input() rootProps?: IMarqueeSelectionProps['rootProps'];
@Input() onShouldStartSelection?: (ev: MouseEvent) => boolean;
@Input() isEnabled?: IMarqueeSelectionProps['isEnabled'];
@Input() isDraggingConstrainedToRoot?: IMarqueeSelectionProps['isDraggingConstrainedToRoot'];
@Input() className?: IMarqueeSelectionProps['className'];
@Input() theme?: IMarqueeSelectionProps['theme'];
@Input() styles?: IMarqueeSelectionProps['styles'];
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, { ngZone, setHostDisplay: true });

Просмотреть файл

@ -34,7 +34,8 @@ import { IMessageBarProps } from 'office-ui-fabric-react/lib/MessageBar';
[theme]="theme"
[styles]="styles"
[Dismiss]="onDismissInternal"
[actions]="actions">
[actions]="actions"
>
<ReactContent><ng-content></ng-content></ReactContent>
</MessageBar>
`,
@ -42,39 +43,25 @@ import { IMessageBarProps } from 'office-ui-fabric-react/lib/MessageBar';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabMessageBarComponent extends ReactWrapperComponent<IMessageBarProps> implements OnInit {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IMessageBarProps['componentRef'];
@Input()
messageBarType?: IMessageBarProps['messageBarType'];
@Input()
ariaLabel?: IMessageBarProps['ariaLabel'];
@Input()
isMultiline?: IMessageBarProps['isMultiline'];
@Input()
dismissButtonAriaLabel?: IMessageBarProps['dismissButtonAriaLabel'];
@Input()
truncated?: IMessageBarProps['truncated'];
@Input()
overflowButtonAriaLabel?: IMessageBarProps['overflowButtonAriaLabel'];
@Input()
className?: IMessageBarProps['className'];
@Input()
theme?: IMessageBarProps['theme'];
@Input()
styles?: IMessageBarProps['styles'];
@Input() componentRef?: IMessageBarProps['componentRef'];
@Input() messageBarType?: IMessageBarProps['messageBarType'];
@Input() ariaLabel?: IMessageBarProps['ariaLabel'];
@Input() isMultiline?: IMessageBarProps['isMultiline'];
@Input() dismissButtonAriaLabel?: IMessageBarProps['dismissButtonAriaLabel'];
@Input() truncated?: IMessageBarProps['truncated'];
@Input() overflowButtonAriaLabel?: IMessageBarProps['overflowButtonAriaLabel'];
@Input() className?: IMessageBarProps['className'];
@Input() theme?: IMessageBarProps['theme'];
@Input() styles?: IMessageBarProps['styles'];
@Input()
renderActions?: InputRendererOptions<{}>;
@Input() renderActions?: InputRendererOptions<{}>;
// Non-React prop, used together with onDismiss to allow it to be an Output EventEmitter.
@Input()
dismissable?: boolean = null;
@Input() dismissable?: boolean = null;
@Output()
readonly onDismiss = new EventEmitter<MouseEvent>();
@Output() readonly onDismiss = new EventEmitter<MouseEvent>();
actions: JSX.Element;

Просмотреть файл

@ -23,16 +23,13 @@ import { IWithResponsiveModeState } from 'office-ui-fabric-react/lib/utilities/d
template: `
<Modal
#reactNode
[responsiveMode]="responsiveMode"
[elementToFocusOnDismiss]="elementToFocusOnDismiss"
[ignoreExternalFocusing]="ignoreExternalFocusing"
[forceFocusInsideTrap]="forceFocusInsideTrap"
[firstFocusableSelector]="firstFocusableSelector"
[closeButtonAriaLabel]="closeButtonAriaLabel"
[isClickableOutsideFocusTrap]="isClickableOutsideFocusTrap"
[componentRef]="componentRef"
[isOpen]="isOpen"
[isDarkOverlay]="isDarkOverlay"
@ -44,7 +41,8 @@ import { IWithResponsiveModeState } from 'office-ui-fabric-react/lib/utilities/d
[subtitleAriaId]="subtitleAriaId"
[Dismiss]="onDismissHandler"
(onLayerDidMount)="onLayerDidMount.emit()"
(onDismissed)="onDismissed.emit()">
(onDismissed)="onDismissed.emit()"
>
<ReactContent><ng-content></ng-content></ReactContent>
</Modal>
`,
@ -53,50 +51,30 @@ import { IWithResponsiveModeState } from 'office-ui-fabric-react/lib/utilities/d
})
export class FabModalComponent extends ReactWrapperComponent<IModalProps>
implements IWithResponsiveModeState, IAccessiblePopupProps {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
responsiveMode?: IModalProps['responsiveMode'];
@Input() responsiveMode?: IModalProps['responsiveMode'];
@Input()
elementToFocusOnDismiss?: IModalProps['elementToFocusOnDismiss'];
@Input()
ignoreExternalFocusing?: IModalProps['ignoreExternalFocusing'];
@Input()
forceFocusInsideTrap?: IModalProps['forceFocusInsideTrap'];
@Input()
firstFocusableSelector?: IModalProps['firstFocusableSelector'];
@Input()
closeButtonAriaLabel?: IModalProps['closeButtonAriaLabel'];
@Input()
isClickableOutsideFocusTrap?: IModalProps['isClickableOutsideFocusTrap'];
@Input() elementToFocusOnDismiss?: IModalProps['elementToFocusOnDismiss'];
@Input() ignoreExternalFocusing?: IModalProps['ignoreExternalFocusing'];
@Input() forceFocusInsideTrap?: IModalProps['forceFocusInsideTrap'];
@Input() firstFocusableSelector?: IModalProps['firstFocusableSelector'];
@Input() closeButtonAriaLabel?: IModalProps['closeButtonAriaLabel'];
@Input() isClickableOutsideFocusTrap?: IModalProps['isClickableOutsideFocusTrap'];
@Input()
componentRef?: IModalProps['componentRef'];
@Input()
isOpen?: IModalProps['isOpen'];
@Input()
isDarkOverlay?: IModalProps['isDarkOverlay'];
@Input()
isBlocking?: IModalProps['isBlocking'];
@Input()
className?: IModalProps['className'];
@Input()
containerClassName?: IModalProps['containerClassName'];
@Input()
scrollableContentClassName?: IModalProps['scrollableContentClassName'];
@Input()
titleAriaId?: IModalProps['titleAriaId'];
@Input()
subtitleAriaId?: IModalProps['subtitleAriaId'];
@Input() componentRef?: IModalProps['componentRef'];
@Input() isOpen?: IModalProps['isOpen'];
@Input() isDarkOverlay?: IModalProps['isDarkOverlay'];
@Input() isBlocking?: IModalProps['isBlocking'];
@Input() className?: IModalProps['className'];
@Input() containerClassName?: IModalProps['containerClassName'];
@Input() scrollableContentClassName?: IModalProps['scrollableContentClassName'];
@Input() titleAriaId?: IModalProps['titleAriaId'];
@Input() subtitleAriaId?: IModalProps['subtitleAriaId'];
@Output()
readonly onLayerDidMount = new EventEmitter<void>();
@Output()
readonly onDismiss = new EventEmitter<MouseEvent>();
@Output()
readonly onDismissed = new EventEmitter<void>();
@Output() readonly onLayerDidMount = new EventEmitter<void>();
@Output() readonly onDismiss = new EventEmitter<MouseEvent>();
@Output() readonly onDismissed = new EventEmitter<void>();
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);

Просмотреть файл

@ -52,79 +52,49 @@ import { IPanelHeaderRenderer, IPanelProps } from 'office-ui-fabric-react/lib/Pa
[RenderFooterContent]="renderFooterContent && onRenderFooterContent"
[Dismiss]="onDismissHandler"
(onDismissed)="onDismissed.emit($event)"
(onLightDismissClick)="onLightDismissClick.emit($event)">
<ReactContent><ng-content></ng-content></ReactContent>
(onLightDismissClick)="onLightDismissClick.emit($event)"
>
<ReactContent><ng-content></ng-content></ReactContent>
</Panel>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabPanelComponent extends ReactWrapperComponent<IPanelProps> implements OnInit {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IPanelProps['componentRef'];
@Input()
isOpen?: IPanelProps['isOpen'];
@Input()
hasCloseButton?: IPanelProps['hasCloseButton'];
@Input()
isLightDismiss?: IPanelProps['isLightDismiss'];
@Input()
isHiddenOnDismiss?: IPanelProps['isHiddenOnDismiss'];
@Input()
isBlocking?: IPanelProps['isBlocking'];
@Input()
isFooterAtBottom?: IPanelProps['isFooterAtBottom'];
@Input()
headerText?: IPanelProps['headerText'];
@Input()
styles?: IPanelProps['styles'];
@Input()
theme?: IPanelProps['theme'];
@Input()
className?: IPanelProps['className'];
@Input()
type?: IPanelProps['type'];
@Input()
customWidth?: IPanelProps['customWidth'];
@Input()
closeButtonAriaLabel?: IPanelProps['closeButtonAriaLabel'];
@Input()
headerClassName?: IPanelProps['headerClassName'];
@Input()
elementToFocusOnDismiss?: IPanelProps['elementToFocusOnDismiss'];
@Input()
ignoreExternalFocusing?: IPanelProps['ignoreExternalFocusing'];
@Input()
forceFocusInsideTrap?: IPanelProps['forceFocusInsideTrap'];
@Input()
firstFocusableSelector?: IPanelProps['firstFocusableSelector'];
@Input()
focusTrapZoneProps?: IPanelProps['focusTrapZoneProps'];
@Input()
layerProps?: IPanelProps['layerProps'];
@Input()
componentId?: IPanelProps['componentId'];
@Input() componentRef?: IPanelProps['componentRef'];
@Input() isOpen?: IPanelProps['isOpen'];
@Input() hasCloseButton?: IPanelProps['hasCloseButton'];
@Input() isLightDismiss?: IPanelProps['isLightDismiss'];
@Input() isHiddenOnDismiss?: IPanelProps['isHiddenOnDismiss'];
@Input() isBlocking?: IPanelProps['isBlocking'];
@Input() isFooterAtBottom?: IPanelProps['isFooterAtBottom'];
@Input() headerText?: IPanelProps['headerText'];
@Input() styles?: IPanelProps['styles'];
@Input() theme?: IPanelProps['theme'];
@Input() className?: IPanelProps['className'];
@Input() type?: IPanelProps['type'];
@Input() customWidth?: IPanelProps['customWidth'];
@Input() closeButtonAriaLabel?: IPanelProps['closeButtonAriaLabel'];
@Input() headerClassName?: IPanelProps['headerClassName'];
@Input() elementToFocusOnDismiss?: IPanelProps['elementToFocusOnDismiss'];
@Input() ignoreExternalFocusing?: IPanelProps['ignoreExternalFocusing'];
@Input() forceFocusInsideTrap?: IPanelProps['forceFocusInsideTrap'];
@Input() firstFocusableSelector?: IPanelProps['firstFocusableSelector'];
@Input() focusTrapZoneProps?: IPanelProps['focusTrapZoneProps'];
@Input() layerProps?: IPanelProps['layerProps'];
@Input() componentId?: IPanelProps['componentId'];
@Input()
renderNavigation?: InputRendererOptions<IPanelProps>;
@Input()
renderHeader?: InputRendererOptions<IPanelHeaderRenderContext>;
@Input()
renderBody?: InputRendererOptions<IPanelProps>;
@Input()
renderFooter?: InputRendererOptions<IPanelProps>;
@Input()
renderFooterContent?: InputRendererOptions<IPanelProps>;
@Input() renderNavigation?: InputRendererOptions<IPanelProps>;
@Input() renderHeader?: InputRendererOptions<IPanelHeaderRenderContext>;
@Input() renderBody?: InputRendererOptions<IPanelProps>;
@Input() renderFooter?: InputRendererOptions<IPanelProps>;
@Input() renderFooterContent?: InputRendererOptions<IPanelProps>;
@Output()
readonly onLightDismissClick = new EventEmitter<void>();
@Output()
readonly onDismiss = new EventEmitter<{ ev?: Event }>();
@Output()
readonly onDismissed = new EventEmitter<void>();
@Output() readonly onLightDismissClick = new EventEmitter<void>();
@Output() readonly onDismiss = new EventEmitter<{ ev?: Event }>();
@Output() readonly onDismissed = new EventEmitter<void>();
private _renderHeader: JsxRenderFunc<IPanelHeaderRenderContext>;
onRenderNavigation: (props?: IPanelProps, defaultRender?: JsxRenderFunc<IPanelProps>) => JSX.Element;

Просмотреть файл

@ -20,50 +20,29 @@ import { IPersonaCoinProps, IPersonaProps, IPersonaSharedProps } from 'office-ui
export abstract class FabPersonaBaseComponent<TProps extends IPersonaSharedProps> extends ReactWrapperComponent<TProps>
implements OnInit {
@Input()
text?: IPersonaProps['text'];
@Input()
size?: IPersonaProps['size'];
@Input()
imageShouldFadeIn?: IPersonaProps['imageShouldFadeIn'];
@Input()
imageShouldStartVisible?: IPersonaProps['imageShouldStartVisible'];
@Input()
imageUrl?: IPersonaProps['imageUrl'];
@Input()
imageAlt?: IPersonaProps['imageAlt'];
@Input()
imageInitials?: IPersonaProps['imageInitials'];
@Input()
allowPhoneInitials?: IPersonaProps['allowPhoneInitials'];
@Input()
initialsColor?: IPersonaProps['initialsColor'];
@Input()
presence?: IPersonaProps['presence'];
@Input()
secondaryText?: IPersonaProps['secondaryText'];
@Input()
tertiaryText?: IPersonaProps['tertiaryText'];
@Input()
optionalText?: IPersonaProps['optionalText'];
@Input()
hidePersonaDetails?: IPersonaProps['hidePersonaDetails'];
@Input()
showUnknownPersonaCoin?: IPersonaProps['showUnknownPersonaCoin'];
@Input()
showInitialsUntilImageLoads?: IPersonaProps['showInitialsUntilImageLoads'];
@Input()
coinSize?: IPersonaProps['coinSize'];
@Input()
theme?: IPersonaProps['theme'];
@Input() text?: IPersonaProps['text'];
@Input() size?: IPersonaProps['size'];
@Input() imageShouldFadeIn?: IPersonaProps['imageShouldFadeIn'];
@Input() imageShouldStartVisible?: IPersonaProps['imageShouldStartVisible'];
@Input() imageUrl?: IPersonaProps['imageUrl'];
@Input() imageAlt?: IPersonaProps['imageAlt'];
@Input() imageInitials?: IPersonaProps['imageInitials'];
@Input() allowPhoneInitials?: IPersonaProps['allowPhoneInitials'];
@Input() initialsColor?: IPersonaProps['initialsColor'];
@Input() presence?: IPersonaProps['presence'];
@Input() secondaryText?: IPersonaProps['secondaryText'];
@Input() tertiaryText?: IPersonaProps['tertiaryText'];
@Input() optionalText?: IPersonaProps['optionalText'];
@Input() hidePersonaDetails?: IPersonaProps['hidePersonaDetails'];
@Input() showUnknownPersonaCoin?: IPersonaProps['showUnknownPersonaCoin'];
@Input() showInitialsUntilImageLoads?: IPersonaProps['showInitialsUntilImageLoads'];
@Input() coinSize?: IPersonaProps['coinSize'];
@Input() theme?: IPersonaProps['theme'];
@Input()
renderCoin?: InputRendererOptions<IPersonaSharedProps>;
@Input()
renderInitials?: InputRendererOptions<IPersonaSharedProps>;
@Input() renderCoin?: InputRendererOptions<IPersonaSharedProps>;
@Input() renderInitials?: InputRendererOptions<IPersonaSharedProps>;
@Output()
readonly onPhotoLoadingStateChange = new EventEmitter<ImageLoadState>();
@Output() readonly onPhotoLoadingStateChange = new EventEmitter<ImageLoadState>();
onRenderCoin: (props?: IPersonaSharedProps, defaultRender?: JsxRenderFunc<IPersonaSharedProps>) => JSX.Element;
onRenderInitials: (props?: IPersonaSharedProps, defaultRender?: JsxRenderFunc<IPersonaSharedProps>) => JSX.Element;
@ -112,33 +91,25 @@ export abstract class FabPersonaBaseComponent<TProps extends IPersonaSharedProps
[RenderSecondaryText]="renderSecondaryText && onRenderSecondaryText"
[RenderTertiaryText]="renderTertiaryText && onRenderTertiaryText"
[RenderOptionalText]="renderOptionalText && onRenderOptionalText"
(onPhotoLoadingStateChange)="onPhotoLoadingStateChange.emit($event)">
(onPhotoLoadingStateChange)="onPhotoLoadingStateChange.emit($event)"
>
</Persona>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabPersonaComponent extends FabPersonaBaseComponent<IPersonaProps> implements OnInit {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IPersonaProps['componentRef'];
@Input()
className?: IPersonaProps['className'];
@Input()
styles?: IPersonaProps['styles'];
@Input()
coinProps?: IPersonaProps['coinProps'];
@Input() componentRef?: IPersonaProps['componentRef'];
@Input() className?: IPersonaProps['className'];
@Input() styles?: IPersonaProps['styles'];
@Input() coinProps?: IPersonaProps['coinProps'];
@Input()
renderPrimaryText?: InputRendererOptions<IPersonaProps>;
@Input()
renderSecondaryText?: InputRendererOptions<IPersonaProps>;
@Input()
renderTertiaryText?: InputRendererOptions<IPersonaProps>;
@Input()
renderOptionalText?: InputRendererOptions<IPersonaProps>;
@Input() renderPrimaryText?: InputRendererOptions<IPersonaProps>;
@Input() renderSecondaryText?: InputRendererOptions<IPersonaProps>;
@Input() renderTertiaryText?: InputRendererOptions<IPersonaProps>;
@Input() renderOptionalText?: InputRendererOptions<IPersonaProps>;
onRenderPrimaryText: (props?: IPersonaProps, defaultRender?: JsxRenderFunc<IPersonaProps>) => JSX.Element;
onRenderSecondaryText: (props?: IPersonaProps, defaultRender?: JsxRenderFunc<IPersonaProps>) => JSX.Element;
@ -188,22 +159,19 @@ export class FabPersonaComponent extends FabPersonaBaseComponent<IPersonaProps>
[className]="className"
[RenderInitials]="renderInitials && onRenderInitials"
[RenderCoin]="renderCoin && onRenderCoin"
(onPhotoLoadingStateChange)="onPhotoLoadingStateChange.emit($event)">
(onPhotoLoadingStateChange)="onPhotoLoadingStateChange.emit($event)"
>
</PersonaCoin>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabPersonaCoinComponent extends FabPersonaBaseComponent<IPersonaCoinProps> implements OnInit {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IPersonaCoinProps['componentRef'];
@Input()
styles?: IPersonaCoinProps['styles'];
@Input()
className?: IPersonaCoinProps['className'];
@Input() componentRef?: IPersonaCoinProps['componentRef'];
@Input() styles?: IPersonaCoinProps['styles'];
@Input() className?: IPersonaCoinProps['className'];
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -15,44 +15,25 @@ import omit from '../../../utils/omit';
export abstract class FabBasePickerComponent<T, TProps extends IBasePickerProps<T>>
extends ReactWrapperComponent<TProps>
implements OnInit {
@Input()
componentRef?: IBasePickerProps<T>['componentRef'];
@Input()
resolveDelay?: IBasePickerProps<T>['resolveDelay'];
@Input()
defaultSelectedItems?: IBasePickerProps<T>['defaultSelectedItems'];
@Input()
getTextFromItem?: IBasePickerProps<T>['getTextFromItem'];
@Input()
className?: IBasePickerProps<T>['className'];
@Input()
searchingText?: IBasePickerProps<T>['searchingText'];
@Input()
disabled?: IBasePickerProps<T>['disabled'];
@Input()
itemLimit?: IBasePickerProps<T>['itemLimit'];
@Input()
createGenericItem?: IBasePickerProps<T>['createGenericItem'];
@Input()
removeButtonAriaLabel?: IBasePickerProps<T>['removeButtonAriaLabel'];
@Input()
selectedItems?: IBasePickerProps<T>['selectedItems'];
@Input()
enableSelectedSuggestionAlert?: IBasePickerProps<T>['enableSelectedSuggestionAlert'];
@Input()
inputProps?: IBasePickerProps<T>['inputProps'];
@Input('itemSelected')
onItemSelected?: (selectedItem?: T) => T | PromiseLike<T> | null;
@Input('inputChange')
onInputChange?: (input: string) => string;
@Input('emptyInputFocus')
onEmptyInputFocus?: IBasePickerProps<T>['onEmptyInputFocus'];
@Input('resolveSuggestions')
onResolveSuggestions: IBasePickerProps<T>['onResolveSuggestions'];
@Input('getMoreResults')
onGetMoreResults?: IBasePickerProps<T>['onGetMoreResults'];
@Input('validateInput')
onValidateInput?: IBasePickerProps<T>['onValidateInput'];
@Input() componentRef?: IBasePickerProps<T>['componentRef'];
@Input() resolveDelay?: IBasePickerProps<T>['resolveDelay'];
@Input() defaultSelectedItems?: IBasePickerProps<T>['defaultSelectedItems'];
@Input() getTextFromItem?: IBasePickerProps<T>['getTextFromItem'];
@Input() className?: IBasePickerProps<T>['className'];
@Input() searchingText?: IBasePickerProps<T>['searchingText'];
@Input() disabled?: IBasePickerProps<T>['disabled'];
@Input() itemLimit?: IBasePickerProps<T>['itemLimit'];
@Input() createGenericItem?: IBasePickerProps<T>['createGenericItem'];
@Input() removeButtonAriaLabel?: IBasePickerProps<T>['removeButtonAriaLabel'];
@Input() selectedItems?: IBasePickerProps<T>['selectedItems'];
@Input() enableSelectedSuggestionAlert?: IBasePickerProps<T>['enableSelectedSuggestionAlert'];
@Input() inputProps?: IBasePickerProps<T>['inputProps'];
@Input('itemSelected') onItemSelected?: (selectedItem?: T) => T | PromiseLike<T> | null;
@Input('inputChange') onInputChange?: (input: string) => string;
@Input('emptyInputFocus') onEmptyInputFocus?: IBasePickerProps<T>['onEmptyInputFocus'];
@Input('resolveSuggestions') onResolveSuggestions: IBasePickerProps<T>['onResolveSuggestions'];
@Input('getMoreResults') onGetMoreResults?: IBasePickerProps<T>['onGetMoreResults'];
@Input('validateInput') onValidateInput?: IBasePickerProps<T>['onValidateInput'];
@Input()
set pickerSuggestionsOptions(value: IBasePickerSuggestionsOptions) {
@ -67,21 +48,14 @@ export abstract class FabBasePickerComponent<T, TProps extends IBasePickerProps<
return this._pickerSuggestionsOptions;
}
@Input()
renderItem?: InputRendererOptions<IPickerItemProps<T>>;
@Input()
renderSuggestionsItem?: InputRendererOptions<IRenderSuggestionItemContext<T>>;
@Input() renderItem?: InputRendererOptions<IPickerItemProps<T>>;
@Input() renderSuggestionsItem?: InputRendererOptions<IRenderSuggestionItemContext<T>>;
@Output()
readonly onChange = new EventEmitter<{ items?: T[] }>();
@Output()
readonly onFocus = new EventEmitter<FocusEvent>();
@Output()
readonly onBlur = new EventEmitter<FocusEvent>();
@Output()
readonly onDismiss = new EventEmitter<{ ev?: any; selectedItem?: T }>();
@Output()
readonly onRemoveSuggestion = new EventEmitter<{ item: IPersonaProps }>();
@Output() readonly onChange = new EventEmitter<{ items?: T[] }>();
@Output() readonly onFocus = new EventEmitter<FocusEvent>();
@Output() readonly onBlur = new EventEmitter<FocusEvent>();
@Output() readonly onDismiss = new EventEmitter<{ ev?: any; selectedItem?: T }>();
@Output() readonly onRemoveSuggestion = new EventEmitter<{ item: IPersonaProps }>();
pickerSuggestionsProps: IBasePickerSuggestionsProps;
onRenderSuggestionsItem: (

Просмотреть файл

@ -19,7 +19,6 @@ import { FabBasePickerComponent } from '../base-picker/base-picker.component';
template: `
<TagPicker
#reactNode
[componentRef]="componentRef"
[resolveDelay]="resolveDelay"
[defaultSelectedItems]="defaultSelectedItems"
@ -40,23 +39,21 @@ import { FabBasePickerComponent } from '../base-picker/base-picker.component';
[ResolveSuggestions]="onResolveSuggestions"
[GetMoreResults]="onGetMoreResults"
[ValidateInput]="onValidateInput"
[RenderItem]="renderItem &&onRenderItem"
[RenderItem]="renderItem && onRenderItem"
[RenderSuggestionsItem]="renderSuggestionsItem && onRenderSuggestionsItem"
[Change]="onChangeHandler"
[Focus]="onFocusHandler"
[Blur]="onBlurHandler"
[Dismiss]="onDismissHandler"
[RemoveSuggestion]="onRemoveSuggestionHandler">
[RemoveSuggestion]="onRemoveSuggestionHandler"
>
</TagPicker>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabTagPickerComponent extends FabBasePickerComponent<ITag, ITagPickerProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
super(elementRef, changeDetectorRef, renderer, ngZone);

Просмотреть файл

@ -34,7 +34,8 @@ import * as React from 'react';
[itemCount]="itemCount"
[itemIcon]="itemIcon"
[keytipProps]="keytipProps"
[RenderItemLink]="renderItemLink && onRenderItemLink">
[RenderItemLink]="renderItemLink && onRenderItemLink"
>
<ReactContent><ng-content></ng-content></ReactContent>
</PivotItem>
`,
@ -42,44 +43,25 @@ import * as React from 'react';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabPivotItemComponent extends ReactWrapperComponent<IPivotItemProps> implements OnInit {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@passProp()
@Input()
componentRef?: IPivotItemProps['componentRef'];
@Input() @passProp() componentRef?: IPivotItemProps['componentRef'];
@passProp()
@Input()
headerText?: IPivotItemProps['headerText'];
@Input() @passProp() headerText?: IPivotItemProps['headerText'];
@passProp()
@Input()
headerButtonProps?: IPivotItemProps['headerButtonProps'];
@Input() @passProp() headerButtonProps?: IPivotItemProps['headerButtonProps'];
@passProp()
@Input()
itemKey?: IPivotItemProps['itemKey'];
@Input() @passProp() itemKey?: IPivotItemProps['itemKey'];
@passProp()
@Input()
ariaLabel?: IPivotItemProps['ariaLabel'];
@Input() @passProp() ariaLabel?: IPivotItemProps['ariaLabel'];
@passProp()
@Input()
itemCount?: IPivotItemProps['itemCount'];
@Input() @passProp() itemCount?: IPivotItemProps['itemCount'];
@passProp()
@Input()
itemIcon?: IPivotItemProps['itemIcon'];
@Input() @passProp() itemIcon?: IPivotItemProps['itemIcon'];
@passProp()
@Input()
keytipProps?: IPivotItemProps['keytipProps'];
@Input() @passProp() keytipProps?: IPivotItemProps['keytipProps'];
@passProp()
@Input()
renderItemLink?: InputRendererOptions<IPivotItemProps>;
@Input() @passProp() renderItemLink?: InputRendererOptions<IPivotItemProps>;
onRenderItemLink: (props?: IPivotItemProps, defaultRender?: JsxRenderFunc<IPivotItemProps>) => JSX.Element;
@ -101,7 +83,6 @@ export class FabPivotItemComponent extends ReactWrapperComponent<IPivotItemProps
[disguiseRootAs]="PivotType"
[disguiseChildrenAs]="PivotItemType"
[ngChildComponents]="pivotItems?.toArray()"
[componentRef]="componentRef"
[styles]="styles"
[theme]="theme"
@ -113,10 +94,9 @@ export class FabPivotItemComponent extends ReactWrapperComponent<IPivotItemProps
[linkFormat]="linkFormat"
[headersOnly]="headersOnly"
[getTabId]="getTabId"
[LinkClick]="onLinkClickHandler">
<ReactContent>
<ng-content select="fab-pivot-item"></ng-content>
</ReactContent>
[LinkClick]="onLinkClickHandler"
>
<ReactContent><ng-content select="fab-pivot-item"></ng-content></ReactContent>
</Disguise>
`,
styles: ['react-renderer'],
@ -126,37 +106,23 @@ export class FabPivotComponent extends ReactWrapperComponent<IPivotProps> {
readonly PivotType = Pivot;
readonly PivotItemType = PivotItem;
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@ContentChildren(FabPivotItemComponent)
pivotItems: QueryList<FabPivotItemComponent>;
@ContentChildren(FabPivotItemComponent) pivotItems: QueryList<FabPivotItemComponent>;
@Input()
componentRef?: IPivotProps['componentRef'];
@Input()
styles?: IPivotProps['styles'];
@Input()
theme?: IPivotProps['theme'];
@Input()
className?: IPivotProps['className'];
@Input()
initialSelectedIndex?: IPivotProps['initialSelectedIndex'];
@Input()
initialSelectedKey?: IPivotProps['initialSelectedKey'];
@Input()
selectedKey?: IPivotProps['selectedKey'];
@Input()
linkSize?: IPivotProps['linkSize'];
@Input()
linkFormat?: IPivotProps['linkFormat'];
@Input()
headersOnly?: IPivotProps['headersOnly'];
@Input()
getTabId?: IPivotProps['getTabId'];
@Input() componentRef?: IPivotProps['componentRef'];
@Input() styles?: IPivotProps['styles'];
@Input() theme?: IPivotProps['theme'];
@Input() className?: IPivotProps['className'];
@Input() initialSelectedIndex?: IPivotProps['initialSelectedIndex'];
@Input() initialSelectedKey?: IPivotProps['initialSelectedKey'];
@Input() selectedKey?: IPivotProps['selectedKey'];
@Input() linkSize?: IPivotProps['linkSize'];
@Input() linkFormat?: IPivotProps['linkFormat'];
@Input() headersOnly?: IPivotProps['headersOnly'];
@Input() getTabId?: IPivotProps['getTabId'];
@Output()
readonly onLinkClick = new EventEmitter<{ item?: PivotItem; ev?: MouseEvent }>();
@Output() readonly onLinkClick = new EventEmitter<{ item?: PivotItem; ev?: MouseEvent }>();
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer, { setHostDisplay: true });

Просмотреть файл

@ -38,34 +38,25 @@ import omit from '../../utils/omit';
[Change]="onChangeHandler"
[Search]="onSearchHandler"
[Clear]="onClearHandler"
[Escape]="onEscapeHandler">
[Escape]="onEscapeHandler"
>
</SearchBox>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabSearchBoxComponent extends ReactWrapperComponent<ISearchBoxProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: ISearchBoxProps['componentRef'];
@Input()
placeholder?: ISearchBoxProps['placeholder'];
@Input()
value?: ISearchBoxProps['value'];
@Input()
className?: ISearchBoxProps['className'];
@Input()
ariaLabel?: ISearchBoxProps['ariaLabel'];
@Input()
underlined?: ISearchBoxProps['underlined'];
@Input()
theme?: ISearchBoxProps['theme'];
@Input()
styles?: ISearchBoxProps['styles'];
@Input()
disableAnimation?: ISearchBoxProps['disableAnimation'];
@Input() componentRef?: ISearchBoxProps['componentRef'];
@Input() placeholder?: ISearchBoxProps['placeholder'];
@Input() value?: ISearchBoxProps['value'];
@Input() className?: ISearchBoxProps['className'];
@Input() ariaLabel?: ISearchBoxProps['ariaLabel'];
@Input() underlined?: ISearchBoxProps['underlined'];
@Input() theme?: ISearchBoxProps['theme'];
@Input() styles?: ISearchBoxProps['styles'];
@Input() disableAnimation?: ISearchBoxProps['disableAnimation'];
@Input()
set clearButtonOptions(value: IButtonOptions) {
this._clearButtonOptions = value;
@ -79,17 +70,12 @@ export class FabSearchBoxComponent extends ReactWrapperComponent<ISearchBoxProps
return this._clearButtonOptions;
}
@Input()
iconProps?: ISearchBoxProps['iconProps'];
@Input() iconProps?: ISearchBoxProps['iconProps'];
@Output()
readonly onChange = new EventEmitter<{ newValue: any }>();
@Output()
readonly onSearch = new EventEmitter<{ newValue: any }>();
@Output()
readonly onClear = new EventEmitter<{ ev?: any }>();
@Output()
readonly onEscape = new EventEmitter<{ ev?: any }>();
@Output() readonly onChange = new EventEmitter<{ newValue: any }>();
@Output() readonly onSearch = new EventEmitter<{ newValue: any }>();
@Output() readonly onClear = new EventEmitter<{ ev?: any }>();
@Output() readonly onEscape = new EventEmitter<{ ev?: any }>();
clearButtonProps: IButtonProps;
@ -168,14 +154,14 @@ export class FabSearchBoxComponent extends ReactWrapperComponent<ISearchBoxProps
export interface IButtonOptions
extends Omit<
IButtonProps,
| 'onRenderIcon'
| 'onRenderText'
| 'onRenderDescription'
| 'onRenderAriaDescription'
| 'onRenderChildren'
| 'onRenderMenuIcon'
> {
IButtonProps,
| 'onRenderIcon'
| 'onRenderText'
| 'onRenderDescription'
| 'onRenderAriaDescription'
| 'onRenderChildren'
| 'onRenderMenuIcon'
> {
readonly renderIcon: InputRendererOptions<IButtonProps>;
readonly renderText: InputRendererOptions<IButtonProps>;
readonly renderDescription: InputRendererOptions<IButtonProps>;

Просмотреть файл

@ -29,7 +29,8 @@ import { IShimmerProps } from 'office-ui-fabric-react/lib/Shimmer';
[styles]="styles"
[className]="className"
[theme]="theme"
[customElementsGroup]="customElementsGroup">
[customElementsGroup]="customElementsGroup"
>
<ReactContent><ng-content></ng-content></ReactContent>
</Shimmer>
`,
@ -37,25 +38,16 @@ import { IShimmerProps } from 'office-ui-fabric-react/lib/Shimmer';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabShimmerComponent extends ReactWrapperComponent<IShimmerProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IShimmerProps['componentRef'];
@Input()
width?: IShimmerProps['width'];
@Input()
isDataLoaded?: IShimmerProps['isDataLoaded'];
@Input()
shimmerElements?: IShimmerProps['shimmerElements'];
@Input()
ariaLabel?: IShimmerProps['ariaLabel'];
@Input()
styles?: IShimmerProps['styles'];
@Input()
className?: IShimmerProps['className'];
@Input()
theme?: IShimmerProps['theme'];
@Input() componentRef?: IShimmerProps['componentRef'];
@Input() width?: IShimmerProps['width'];
@Input() isDataLoaded?: IShimmerProps['isDataLoaded'];
@Input() shimmerElements?: IShimmerProps['shimmerElements'];
@Input() ariaLabel?: IShimmerProps['ariaLabel'];
@Input() styles?: IShimmerProps['styles'];
@Input() className?: IShimmerProps['className'];
@Input() theme?: IShimmerProps['theme'];
@Input()
set renderCustomElementsGroup(value: InputRendererOptions<{}>) {
@ -92,30 +84,22 @@ export class FabShimmerComponent extends ReactWrapperComponent<IShimmerProps> {
[width]="width"
[theme]="theme"
[styles]="styles"
>
>
</ShimmerElementsGroup>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabShimmerElementsGroupComponent extends ReactWrapperComponent<IShimmerElementsGroupProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: IShimmerElementsGroupProps['componentRef'];
@Input()
rowHeight?: IShimmerElementsGroupProps['rowHeight'];
@Input()
shimmerElements?: IShimmerElementsGroupProps['shimmerElements'];
@Input()
flexWrap?: IShimmerElementsGroupProps['flexWrap'];
@Input()
width?: IShimmerElementsGroupProps['width'];
@Input()
theme?: IShimmerElementsGroupProps['theme'];
@Input()
styles?: IShimmerElementsGroupProps['styles'];
@Input() componentRef?: IShimmerElementsGroupProps['componentRef'];
@Input() rowHeight?: IShimmerElementsGroupProps['rowHeight'];
@Input() shimmerElements?: IShimmerElementsGroupProps['shimmerElements'];
@Input() flexWrap?: IShimmerElementsGroupProps['flexWrap'];
@Input() width?: IShimmerElementsGroupProps['width'];
@Input() theme?: IShimmerElementsGroupProps['theme'];
@Input() styles?: IShimmerElementsGroupProps['styles'];
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer, { setHostDisplay: true });

Просмотреть файл

@ -38,53 +38,35 @@ import { ISliderProps } from 'office-ui-fabric-react/lib/Slider';
[className]="className"
[buttonProps]="buttonProps"
[Changed]="onChangedHandler"
(onChange)="onChange.emit($event)">
(onChange)="onChange.emit($event)"
>
</Slider>
`,
styles: ['react-renderer'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabSliderComponent extends ReactWrapperComponent<ISliderProps> {
@ViewChild('reactNode')
protected reactNodeRef: ElementRef;
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
@Input()
componentRef?: ISliderProps['componentRef'];
@Input()
styles?: ISliderProps['styles'];
@Input()
theme?: ISliderProps['theme'];
@Input()
label?: ISliderProps['label'];
@Input()
defaultValue?: ISliderProps['defaultValue'];
@Input()
value?: ISliderProps['value'];
@Input()
min?: ISliderProps['min'];
@Input()
max?: ISliderProps['max'];
@Input()
step?: ISliderProps['step'];
@Input()
showValue?: ISliderProps['showValue'];
@Input()
ariaLabel?: ISliderProps['ariaLabel'];
@Input()
ariaValueText?: ISliderProps['ariaValueText'];
@Input()
vertical?: ISliderProps['vertical'];
@Input()
disabled?: ISliderProps['disabled'];
@Input()
className?: ISliderProps['className'];
@Input()
buttonProps?: ISliderProps['buttonProps'];
@Input() componentRef?: ISliderProps['componentRef'];
@Input() styles?: ISliderProps['styles'];
@Input() theme?: ISliderProps['theme'];
@Input() label?: ISliderProps['label'];
@Input() defaultValue?: ISliderProps['defaultValue'];
@Input() value?: ISliderProps['value'];
@Input() min?: ISliderProps['min'];
@Input() max?: ISliderProps['max'];
@Input() step?: ISliderProps['step'];
@Input() showValue?: ISliderProps['showValue'];
@Input() ariaLabel?: ISliderProps['ariaLabel'];
@Input() ariaValueText?: ISliderProps['ariaValueText'];
@Input() vertical?: ISliderProps['vertical'];
@Input() disabled?: ISliderProps['disabled'];
@Input() className?: ISliderProps['className'];
@Input() buttonProps?: ISliderProps['buttonProps'];
@Output()
readonly onChange = new EventEmitter<number>();
@Output()
readonly onChanged = new EventEmitter<{ event: MouseEvent | TouchEvent; value: number }>();
@Output() readonly onChange = new EventEmitter<number>();
@Output() readonly onChanged = new EventEmitter<{ event: MouseEvent | TouchEvent; value: number }>();
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2) {
super(elementRef, changeDetectorRef, renderer);

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше