Skip to content

Commit bbd5da4

Browse files
authored
feat: typed events (#1981)
* feat: typed events adds typings to events Changes the package use to generate the custom-elements.json file used to build React components and tell Storybook about the web-components definitions mgt- prefix from story component names to correct the connection to the data in custom-elements.json set code pane content on agenda disable ArgsTable on docs pages by default show ArgsTable on base agenda stories BREAKING CHANGE: moves agenda eventClick event from a property of e.detail to be the value of e.detail BREAKING CHANGE: all events for mgt-task now emit a CustomEvent<ITask>
1 parent 42c7be8 commit bbd5da4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+468
-413
lines changed

.storybook/preview.js

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,30 @@
88
/* global window */
99

1010
import { addParameters, setCustomElements } from '@storybook/web-components';
11-
1211
import '../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js';
1312
import customElements from '../custom-elements.json';
13+
import { versionInfo } from './versionInfo';
14+
import { noArgsDocsPage } from './story-elements/noArgsDocsPage.js';
15+
16+
const setCustomElementsManifestWithOptions = (customElements, options) => {
17+
let { privateFields = true } = options;
18+
if (!privateFields) {
19+
customElements?.modules?.forEach(module => {
20+
module?.declarations?.forEach(declaration => {
21+
Object.keys(declaration).forEach(key => {
22+
if (Array.isArray(declaration[key])) {
23+
declaration[key] = declaration[key].filter(
24+
member => !member.privacy?.includes('private') && !member.privacy?.includes('protected')
25+
);
26+
}
27+
});
28+
});
29+
});
30+
}
31+
return setCustomElements(customElements);
32+
};
1433

15-
setCustomElements(customElements);
34+
setCustomElementsManifestWithOptions(customElements, { privateFields: false });
1635

1736
addParameters({
1837
previewTabs: {
@@ -22,8 +41,10 @@ addParameters({
2241
},
2342
docs: {
2443
iframeHeight: '400px',
25-
inlineStories: false
26-
}
44+
inlineStories: false,
45+
page: noArgsDocsPage
46+
},
47+
version: versionInfo
2748
});
2849

2950
const req = require.context('../stories', true, /\.(js|mdx)$/);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React from 'react';
2+
3+
import { Title, Subtitle, Description, Primary, ArgsTable, Stories, PRIMARY_STORY } from '@storybook/addon-docs';
4+
5+
export const defaultDocsPage = () => (
6+
<>
7+
<Title />
8+
<Subtitle />
9+
<Description />
10+
<Primary />
11+
<ArgsTable story={PRIMARY_STORY} />
12+
<Stories />
13+
</>
14+
);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import React from 'react';
2+
3+
import { Title, Subtitle, Description, Primary, ArgsTable, Stories, PRIMARY_STORY } from '@storybook/addon-docs';
4+
5+
export const noArgsDocsPage = () => (
6+
<>
7+
<Title />
8+
<Subtitle />
9+
<Description />
10+
<Primary />
11+
<Stories />
12+
</>
13+
);
File renamed without changes.

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
]
2222
},
2323
"scripts": {
24+
"analyze": "custom-elements-manifest analyze --litelement --globs \"./packages/*/src/**/*.ts\"",
2425
"build": "npm run prettier:check && npm run clean && lerna run build --scope @microsoft/*",
2526
"build:compile": "npm run prettier:check && npm run clean && lerna run build:compile --scope @microsoft/*",
2627
"build:mgt": "cd ./packages/mgt && npm run build",
@@ -51,7 +52,7 @@
5152
"prettier:check": "npm run prettier:base -- --check \"packages/**/*.{ts,tsx}\"",
5253
"prettier:write": "npm run prettier:base -- --write \"packages/**/*.{ts,tsx}\"",
5354
"storybook": "start-storybook -p 6006 -s assets",
54-
"storybook:dev": "npm run build:compile && wca analyze packages --format json --outFile custom-elements.json",
55+
"storybook:dev": "npm run build:compile && npm run analyze",
5556
"storybook:watch": "npm-run-all --parallel watch storybook:bundle:watch storybook",
5657
"storybook:bundle": "rollup -c ./.storybook/rollup.config.js",
5758
"storybook:bundle:watch": "rollup -c ./.storybook/rollup.config.js --watch",
@@ -74,6 +75,7 @@
7475
"@babel/preset-env": "^7.12.7",
7576
"@babel/preset-react": "^7.12.7",
7677
"@babel/preset-typescript": "^7.12.7",
78+
"@custom-elements-manifest/analyzer": "^0.6.6",
7779
"@octokit/rest": "^18.5.3",
7880
"@open-wc/testing-helpers": "^2.1.4",
7981
"@storybook/addon-a11y": "^6.4.4",

packages/mgt-components/src/components/mgt-agenda/mgt-agenda.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { MgtPeople } from '../mgt-people/mgt-people';
3030
* @class MgtAgenda
3131
* @extends {MgtTemplatedComponent}
3232
*
33-
* @fires eventClick - Fired when user click an event
33+
* @fires {CustomEvent<MicrosoftGraph.Event>} eventClick - Fired when user click an event
3434
*
3535
* @cssprop --event-box-shadow - {String} Event box shadow color and size
3636
* @cssprop --event-margin - {String} Event margin
@@ -538,7 +538,7 @@ export class MgtAgenda extends MgtTemplatedComponent {
538538
}
539539

540540
private eventClicked(event: MicrosoftGraph.Event) {
541-
this.fireCustomEvent('eventClick', { event });
541+
this.fireCustomEvent('eventClick', event);
542542
}
543543

544544
private getEventTimeString(event: MicrosoftGraph.Event) {

packages/mgt-components/src/components/mgt-file-list/mgt-file-list.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,14 @@ registerFluentComponents(fluentProgressRing, fluentDesignSystemProvider);
5151

5252
/**
5353
* The File List component displays a list of multiple folders and files by
54-
* using the file/folder name, an icon, and other properties specicified by the developer.
54+
* using the file/folder name, an icon, and other properties specified by the developer.
5555
* This component uses the mgt-file component.
5656
*
5757
* @export
5858
* @class MgtFileList
5959
* @extends {MgtTemplatedComponent}
6060
*
61-
* @fires itemClick - Fired when user click a file. Returns the file (DriveItem) details.
61+
* @fires {CustomEvent<MicrosoftGraph.DriveItem>} itemClick - Fired when user click a file. Returns the file (DriveItem) details.
6262
* @cssprop --file-upload-border- {String} File upload border top style
6363
* @cssprop --file-upload-background-color - {Color} File upload background color with opacity style
6464
* @cssprop --file-upload-button-float - {string} Upload button float position
@@ -712,7 +712,7 @@ export class MgtFileList extends MgtTemplatedComponent {
712712
*/
713713
private onFileListKeyDown(event: KeyboardEvent): void {
714714
const fileList = this.renderRoot.querySelector('.file-list');
715-
let focusedItem;
715+
let focusedItem: Element;
716716

717717
if (!fileList || !fileList.children.length) {
718718
return;
@@ -736,7 +736,7 @@ export class MgtFileList extends MgtTemplatedComponent {
736736
if (event.code === 'Enter' || event.code === 'Space') {
737737
focusedItem = fileList.children[this._focusedItemIndex];
738738

739-
const file = focusedItem.children[0] as any;
739+
const file = focusedItem.children[0] as MgtFile;
740740
event.preventDefault();
741741
this.fireCustomEvent('itemClick', file.fileDetails);
742742

packages/mgt-components/src/components/mgt-get/mgt-get.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,20 @@ const getResponseInvalidationTime = (currentInvalidationPeriod: number): number
6565
const getIsResponseCacheEnabled = (): boolean =>
6666
CacheService.config.response.isEnabled && CacheService.config.isEnabled;
6767

68+
/**
69+
* Holder type emitted with the dataChange event
70+
*/
71+
export type DataChangedDetail = {
72+
// tslint:disable: completed-docs
73+
response?: any;
74+
error?: any;
75+
// tslint:enable: completed-docs
76+
};
77+
6878
/**
6979
* Custom element for making Microsoft Graph get queries
7080
*
71-
* @fires dataChange - Fired when data changes
81+
* @fires {CustomEvent<DataChangedDetail>} dataChange - Fired when data changes
7282
*
7383
* @export
7484
* @class mgt-get

packages/mgt-components/src/components/mgt-login/mgt-login.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ type PersonViewConfig = {
5555
* @class MgtLogin
5656
* @extends {MgtBaseComponent}
5757
*
58-
* @fires loginInitiated - Fired when login is initiated by the user
59-
* @fires loginCompleted - Fired when login completes
60-
* @fires loginFailed - Fired when login fails
61-
* @fires logoutInitiated - Fired when logout is initiated by the user
62-
* @fires logoutCompleted - Fired when logout completed
58+
* @fires {CustomEvent<undefined>} loginInitiated - Fired when login is initiated by the user
59+
* @fires {CustomEvent<undefined>} loginCompleted - Fired when login completes
60+
* @fires {CustomEvent<undefined>} loginFailed - Fired when login fails
61+
* @fires {CustomEvent<undefined>} logoutInitiated - Fired when logout is initiated by the user
62+
* @fires {CustomEvent<undefined>} logoutCompleted - Fired when logout completed
6363
*
6464
* @template signed-in-button-content (dataContext: {personDetails, personImage})
6565
* @template signed-out-button-content (dataContext: null)

packages/mgt-components/src/components/mgt-people-picker/mgt-people-picker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ interface IFocusable {
6868
* @class MgtPicker
6969
* @extends {MgtTemplatedComponent}
7070
*
71-
* @fires selectionChanged - Fired when selection changes
71+
* @fires {CustomEvent<IDynamicPerson[]>} selectionChanged - Fired when set of selected people changes
7272
*
7373
* @cssprop --color - {Color} Default font color
7474
*

0 commit comments

Comments
 (0)