Skip to content

Commit 7c60c14

Browse files
committed
Some UI changes
1 parent a154897 commit 7c60c14

File tree

4 files changed

+56
-23
lines changed

4 files changed

+56
-23
lines changed

src/extensions/myFavourites/components/MyFavourites.module.scss

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,15 @@ html[dir='rtl'] .ccStatus {
104104
.ccButton:hover, .ccTopBarButton:hover, .ccDialogButton:hover{
105105
background-color: $themeSecondary;
106106
}
107+
.ccButton:disabled, .ccDialogButton:disabled{
108+
background-color: $themeTertiary;
109+
}
107110
.ccTopBarButton, .ccDialogButton{
108111
margin-right: 10px;
109112
background-color: $themePrimary;
110113
color: $themeLight;
114+
}
115+
.ccDeleteBubbleButton, .ccDeleteBubbleButton span {
116+
background-color: $themeLight !important;
117+
color: $themePrimary !important;
111118
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { IMyFavouriteItem } from "../../../interfaces/IMyFavouriteItem";
22

33
export interface IMyFavouritesTopBarState {
4+
loading: boolean;
45
showPanel: boolean;
56
showDialog: boolean;
67
dialogTitle: string;
78
myFavouriteItems: IMyFavouriteItem[];
89
itemInContext: IMyFavouriteItem;
910
isEdit: boolean;
1011
status: JSX.Element;
11-
disableButtons: boolean;
12+
disableSave: boolean;
13+
disableCancel: boolean;
1214
}

src/extensions/myFavourites/components/MyFavouritesTopBar/MyFavouritesTopBar.tsx

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@ export default class MyFavouritesTopBar extends React.Component<IMyFavouritesTop
1919
private _self = this;
2020
private _MyFavouritesServiceInstance: MyFavouritesService;
2121
private _MyFavouriteItems: IMyFavouriteItem[] =[];
22+
private _EmptyMessageBarText: string = "";
23+
private _AnimationClass: string = "ms-slideDownIn20";
2224
constructor(props: IMyFavouritesTopBarProps) {
2325
super(props);
2426
this.state = {
27+
loading: true,
2528
showPanel: false,
2629
showDialog: false,
2730
dialogTitle: "",
@@ -33,7 +36,8 @@ export default class MyFavouritesTopBar extends React.Component<IMyFavouritesTop
3336
},
3437
isEdit: false,
3538
status: <Spinner size={SpinnerSize.large} label="Loading..." />,
36-
disableButtons: false
39+
disableSave: true,
40+
disableCancel: false
3741
};
3842

3943
this._MyFavouritesServiceInstance = new MyFavouritesService(this.props);
@@ -67,23 +71,26 @@ export default class MyFavouritesTopBar extends React.Component<IMyFavouritesTop
6771
isLightDismiss={ true }
6872
>
6973
<div data-id="menuPanel">
70-
<TextField placeholder="Filter favourites..."
71-
iconProps={ { iconName: "Filter" } }
72-
onBeforeChange={ this._onFilterChanged.bind(this) } />
74+
<TextField placeholder="Filter favourites..."
75+
iconProps={ { iconName: "Filter" } }
76+
onBeforeChange={ this._onFilterChanged.bind(this) } />
7377
<div>
7478
{this.state.status}
7579
</div>
7680
<FocusZone direction={ FocusZoneDirection.vertical }>
77-
{ this.state.myFavouriteItems.length > 0 ?
81+
{ this.state.myFavouriteItems.length > 0 ?
7882
<List
7983
items = { this.state.myFavouriteItems }
8084
onRenderCell={ this._onRenderCell.bind(this) }
8185
/> :
86+
!this.state.loading ?
8287
<MessageBar
88+
className={this._AnimationClass}
8389
messageBarType={ MessageBarType.warning }
8490
isMultiline={ false }>
85-
You do not have any favourites.
86-
</MessageBar>
91+
{this._EmptyMessageBarText}
92+
</MessageBar> :
93+
null
8794
}
8895
</FocusZone>
8996
</div>
@@ -107,18 +114,19 @@ export default class MyFavouritesTopBar extends React.Component<IMyFavouritesTop
107114
</div>
108115
<TextField label="Title"
109116
onChanged={this._setTitle.bind(this)}
110-
value={this.state.itemInContext.Title} />
117+
value={this.state.itemInContext.Title}
118+
required={ true } />
111119
<TextField label="Description"
112120
multiline rows={4}
113121
onChanged={this._setDescription.bind(this)}
114122
value={this.state.itemInContext.Description} />
115123
<DialogFooter>
116124
<PrimaryButton onClick={this._saveMyFavourite.bind(this)}
117-
disabled={this.state.disableButtons}
125+
disabled={this.state.disableSave}
118126
text="Save" iconProps={{ iconName: "Save" }}
119127
className={styles.ccDialogButton}/>
120128
<DefaultButton onClick={this._hideDialog.bind(this)}
121-
disabled={this.state.disableButtons}
129+
disabled={this.state.disableCancel}
122130
text="Cancel"
123131
iconProps={{ iconName: "Cancel" }} />
124132
</DialogFooter>
@@ -139,23 +147,30 @@ export default class MyFavouritesTopBar extends React.Component<IMyFavouritesTop
139147
console.log(favouriteItem);
140148
let status: JSX.Element = <span></span>;
141149
let dialogTitle: string = "Edit favourite";
142-
this.setState({ ...this.state, showPanel: false, itemInContext: favouriteItem, isEdit: true, showDialog: true, dialogTitle, status });
150+
this.setState({ ...this.state, showPanel: false, itemInContext: favouriteItem, isEdit: true, showDialog: true, dialogTitle, status, disableSave: false });
143151
}
144152

145153
private async _getMyFavourites(): Promise<void> {
146154
let status: JSX.Element = <Spinner size={SpinnerSize.large} label='Loading...' />;
147-
this.setState({ ...this.state, status });
155+
let loading: boolean = true;
156+
this.setState({ ...this.state, status, loading });
148157

149158
const myFavouriteItems: IMyFavouriteItem[] = await this._MyFavouritesServiceInstance.getMyFavourites(true);
150159
this._MyFavouriteItems = myFavouriteItems;
151160
status = <span></span>;
152-
this.setState({ ...this.state, myFavouriteItems, status });
161+
loading = false;
162+
if(myFavouriteItems.length === 0) {
163+
this._EmptyMessageBarText = "You do not have any favourites";
164+
}
165+
this.setState({ ...this.state, myFavouriteItems, status, loading });
153166
}
154167

155168
private async _saveMyFavourite(): Promise<void> {
156-
let status: JSX.Element = <Spinner size={SpinnerSize.large} label='Loading...' />;
157-
let disableButtons: boolean = true;
158-
this.setState({ ...this.state, status, disableButtons });
169+
let loadingText: string = this.state.isEdit ? "Updating..." : "Adding...";
170+
let status: JSX.Element = <Spinner size={SpinnerSize.large} label={loadingText} />;
171+
let disableSave: boolean = true;
172+
let disableCancel: boolean = true;
173+
this.setState({ ...this.state, status, disableSave, disableCancel });
159174
let itemToSave: IMyFavouriteItem = {
160175
Title: this.state.itemInContext.Title,
161176
Description: this.state.itemInContext.Description
@@ -175,8 +190,8 @@ export default class MyFavouritesTopBar extends React.Component<IMyFavouritesTop
175190
There was an error!
176191
</MessageBar>;
177192
}
178-
disableButtons = false;
179-
this.setState({ ...this.state, status, disableButtons });
193+
disableSave = disableCancel = false;
194+
this.setState({ ...this.state, status, disableSave, disableCancel });
180195
}
181196
//#endregion
182197

@@ -199,17 +214,17 @@ export default class MyFavouritesTopBar extends React.Component<IMyFavouritesTop
199214
let isEdit: boolean = false;
200215
let status: JSX.Element = <span></span>;
201216
let dialogTitle: string = "Add to my favourites";
202-
this.setState({ ...this.state, itemInContext, isEdit, showDialog: true, dialogTitle, status });
217+
let disableSave: boolean = true;
218+
this.setState({ ...this.state, itemInContext, isEdit, showDialog: true, dialogTitle, status, disableSave });
203219
}
204220

205221
private _hideDialog(): void {
206222
this.setState({ showDialog: false });
207223
}
208224

209225
private _onRenderCell(myFavouriteItem: IMyFavouriteItem, index: number | undefined): JSX.Element {
210-
let animationClass: string = `ms-slideDownIn20`;
211226
return (
212-
<div className={`${animationClass} ${styles.ccitemCell}`} data-is-focusable={ true }>
227+
<div className={`${this._AnimationClass} ${styles.ccitemCell}`} data-is-focusable={ true }>
213228
<MyFavoutiteDisplayItem
214229
displayItem={myFavouriteItem}
215230
deleteFavourite={this.deleteFavourite.bind(this)}
@@ -220,6 +235,7 @@ export default class MyFavouritesTopBar extends React.Component<IMyFavouritesTop
220235

221236
private _onFilterChanged(text: string): void {
222237
let items: IMyFavouriteItem[] = this._MyFavouriteItems;
238+
this._EmptyMessageBarText = "There are no favourites which match the search text.";
223239
this.setState({
224240
myFavouriteItems: text ?
225241
items.filter(item => item.Title.toLowerCase().indexOf(text.toLowerCase()) >= 0) :
@@ -232,7 +248,11 @@ export default class MyFavouritesTopBar extends React.Component<IMyFavouritesTop
232248
private _setTitle(value: string): void {
233249
let itemInContext: IMyFavouriteItem = this.state.itemInContext;
234250
itemInContext.Title = value;
235-
this.setState({ ...this.state, itemInContext });
251+
let disableSave: boolean = true;
252+
if(value.length > 0) {
253+
disableSave = false;
254+
}
255+
this.setState({ ...this.state, itemInContext, disableSave });
236256
}
237257

238258
private _setDescription(value: string): void {

src/extensions/myFavourites/components/MyFavoutiteDisplayItem/MyFavoutiteDisplayItem.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@ export default class MyFavoutiteDisplayItem extends React.Component<IMyFavoutite
2525
let { isDeleteBubbleVisible } = this.state;
2626
let deleteButtonProps: IButtonProps = {
2727
children: 'Yes',
28+
iconProps: { iconName: 'Accept' },
29+
className: styles.ccDeleteBubbleButton,
2830
onClick: this._deleteFavourite.bind(this)
2931
};
3032
let deleteCancelButtonProps: IButtonProps = {
3133
children: 'No',
34+
className: styles.ccDeleteBubbleButton,
35+
iconProps: { iconName: 'Cancel' },
3236
onClick: this._onBubbleDismiss.bind(this)
3337
};
3438
return (

0 commit comments

Comments
 (0)