Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 3174cf2

Browse files
authored
Improve widget buttons behaviour and layout (#8734)
* Improve widet buttons behaviour and layout Relates to element-hq/element-web#20506 See PSC-79 Signed-off-by: Michael Weimann <michaelw@matrix.org> * Add AppTile tests
1 parent 91cbd4d commit 3174cf2

File tree

4 files changed

+94
-45
lines changed

4 files changed

+94
-45
lines changed

res/css/views/rooms/_AppsDrawer.scss

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,8 @@ $MinWidth: 240px;
194194
align-items: center;
195195
justify-content: space-between;
196196
width: 100%;
197-
padding-top: 2px;
198-
padding-bottom: 8px;
197+
padding-top: 3px;
198+
padding-bottom: 6px;
199199
}
200200

201201
.mx_AppTileMenuBarTitle {
@@ -221,39 +221,50 @@ $MinWidth: 240px;
221221
}
222222

223223
.mx_AppTileMenuBar_iconButton {
224-
width: 12px;
225-
height: 12px;
226-
mask-repeat: no-repeat;
227-
mask-position: 0 center;
228-
mask-size: auto 12px;
229-
background-color: $topleftmenu-color;
230-
margin: 0 5px;
224+
height: 24px;
225+
margin: 0 4px;
226+
position: relative;
227+
width: 24px;
228+
229+
&::before {
230+
background-color: $muted-fg-color;
231+
content: '';
232+
height: 24px;
233+
mask-position: center;
234+
mask-repeat: no-repeat;
235+
mask-size: 12px;
236+
position: absolute;
237+
width: 24px;
238+
}
231239

232-
&.mx_AppTileMenuBar_iconButton_close {
233-
mask-size: auto 10px;
234-
mask-image: url("$(res)/img/element-icons/maximise-expand.svg");
235-
background-color: $accent;
240+
&:hover::after {
241+
background-color: $panel-actions;
242+
border-radius: 50%;
243+
content: '';
244+
height: 24px;
245+
left: 0;
246+
position: absolute;
247+
top: 0;
248+
width: 24px;
236249
}
237250

238-
&.mx_AppTileMenuBar_iconButton_maximise {
239-
mask-size: auto 10px;
240-
mask-image: url("$(res)/img/element-icons/maximise-expand.svg");
251+
&.mx_AppTileMenuBar_iconButton_collapse::before {
252+
mask-image: url("$(res)/img/element-icons/minimise-collapse.svg");
241253
}
242254

243-
&.mx_AppTileMenuBar_iconButton_unpin {
244-
mask-image: url("$(res)/img/element-icons/room/pin-upright.svg");
245-
background-color: $accent;
255+
&.mx_AppTileMenuBar_iconButton_maximise::before {
256+
mask-image: url("$(res)/img/element-icons/maximise-expand.svg");
246257
}
247258

248-
&.mx_AppTileMenuBar_iconButton_pin {
249-
mask-image: url("$(res)/img/element-icons/room/pin-upright.svg");
259+
&.mx_AppTileMenuBar_iconButton_minimise::before {
260+
mask-image: url("$(res)/img/element-icons/minus-button.svg");
250261
}
251262

252-
&.mx_AppTileMenuBar_iconButton_popout {
263+
&.mx_AppTileMenuBar_iconButton_popout::before {
253264
mask-image: url('$(res)/img/feather-customised/widget/external-link.svg');
254265
}
255266

256-
&.mx_AppTileMenuBar_iconButton_menu {
267+
&.mx_AppTileMenuBar_iconButton_menu::before {
257268
mask-image: url('$(res)/img/element-icons/room/ellipsis.svg');
258269
}
259270
}

src/components/views/elements/AppTile.tsx

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -512,18 +512,14 @@ export default class AppTile extends React.Component<IProps, IState> {
512512
if (!this.props.room) return; // ignore action - it shouldn't even be visible
513513
const targetContainer =
514514
WidgetLayoutStore.instance.isInContainer(this.props.room, this.props.app, Container.Center)
515-
? Container.Right
515+
? Container.Top
516516
: Container.Center;
517517
WidgetLayoutStore.instance.moveToContainer(this.props.room, this.props.app, targetContainer);
518518
};
519519

520-
private onTogglePinnedClick = (): void => {
520+
private onMinimiseClicked = (): void => {
521521
if (!this.props.room) return; // ignore action - it shouldn't even be visible
522-
const targetContainer =
523-
WidgetLayoutStore.instance.isInContainer(this.props.room, this.props.app, Container.Top)
524-
? Container.Right
525-
: Container.Top;
526-
WidgetLayoutStore.instance.moveToContainer(this.props.room, this.props.app, targetContainer);
522+
WidgetLayoutStore.instance.moveToContainer(this.props.room, this.props.app, Container.Right);
527523
};
528524

529525
private onContextMenuClick = (): void => {
@@ -668,32 +664,23 @@ export default class AppTile extends React.Component<IProps, IState> {
668664
isInContainer(this.props.room, this.props.app, Container.Center);
669665
const maximisedClasses = classNames({
670666
"mx_AppTileMenuBar_iconButton": true,
671-
"mx_AppTileMenuBar_iconButton_close": isMaximised,
667+
"mx_AppTileMenuBar_iconButton_collapse": isMaximised,
672668
"mx_AppTileMenuBar_iconButton_maximise": !isMaximised,
673669
});
674670
layoutButtons.push(<AccessibleButton
675671
key="toggleMaximised"
676672
className={maximisedClasses}
677673
title={
678-
isMaximised ? _t("Close") : _t("Maximise")
674+
isMaximised ? _t("Un-maximise") : _t("Maximise")
679675
}
680676
onClick={this.onToggleMaximisedClick}
681677
/>);
682678

683-
const isPinned = WidgetLayoutStore.instance.
684-
isInContainer(this.props.room, this.props.app, Container.Top);
685-
const pinnedClasses = classNames({
686-
"mx_AppTileMenuBar_iconButton": true,
687-
"mx_AppTileMenuBar_iconButton_unpin": isPinned,
688-
"mx_AppTileMenuBar_iconButton_pin": !isPinned,
689-
});
690679
layoutButtons.push(<AccessibleButton
691-
key="togglePinned"
692-
className={pinnedClasses}
693-
title={
694-
isPinned ? _t("Unpin") : _t("Pin")
695-
}
696-
onClick={this.onTogglePinnedClick}
680+
key="minimise"
681+
className="mx_AppTileMenuBar_iconButton mx_AppTileMenuBar_iconButton_minimise"
682+
title={_t("Minimise")}
683+
onClick={this.onMinimiseClicked}
697684
/>);
698685
}
699686

src/i18n/strings/en_EN.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2251,6 +2251,8 @@
22512251
"Loading...": "Loading...",
22522252
"Error loading Widget": "Error loading Widget",
22532253
"Error - Mixed content": "Error - Mixed content",
2254+
"Un-maximise": "Un-maximise",
2255+
"Minimise": "Minimise",
22542256
"Popout widget": "Popout widget",
22552257
"Copy": "Copy",
22562258
"Share entire screen": "Share entire screen",

test/components/views/elements/AppTile-test.tsx

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import TestRenderer from "react-test-renderer";
1919
import { jest } from "@jest/globals";
2020
import { Room } from "matrix-js-sdk/src/models/room";
2121
import { MatrixWidgetType } from "matrix-widget-api";
22+
import { mount, ReactWrapper } from "enzyme";
23+
import { Optional } from "matrix-events-sdk";
2224

2325
import RightPanel from "../../../../src/components/structures/RightPanel";
2426
import { MatrixClientPeg } from "../../../../src/MatrixClientPeg";
@@ -307,4 +309,51 @@ describe("AppTile", () => {
307309
await RightPanelStore.instance.onNotReady();
308310
jest.restoreAllMocks();
309311
});
312+
313+
describe("for a pinned widget", () => {
314+
let wrapper: ReactWrapper;
315+
let moveToContainerSpy;
316+
317+
beforeEach(() => {
318+
wrapper = mount((
319+
<MatrixClientContext.Provider value={cli}>
320+
<AppTile
321+
key={app1.id}
322+
app={app1}
323+
room={r1}
324+
/>
325+
</MatrixClientContext.Provider>
326+
));
327+
328+
moveToContainerSpy = jest.spyOn(WidgetLayoutStore.instance, 'moveToContainer');
329+
});
330+
331+
it("clicking 'minimise' should send the widget to the right", () => {
332+
const minimiseButton = wrapper.find('.mx_AppTileMenuBar_iconButton_minimise');
333+
minimiseButton.first().simulate('click');
334+
expect(moveToContainerSpy).toHaveBeenCalledWith(r1, app1, Container.Right);
335+
});
336+
337+
it("clicking 'maximise' should send the widget to the center", () => {
338+
const minimiseButton = wrapper.find('.mx_AppTileMenuBar_iconButton_maximise');
339+
minimiseButton.first().simulate('click');
340+
expect(moveToContainerSpy).toHaveBeenCalledWith(r1, app1, Container.Center);
341+
});
342+
343+
describe("for a maximised (centered) widget", () => {
344+
beforeEach(() => {
345+
jest.spyOn(WidgetLayoutStore.instance, 'isInContainer').mockImplementation(
346+
(room: Optional<Room>, widget: IApp, container: Container) => {
347+
return room === r1 && widget === app1 && container === Container.Center;
348+
},
349+
);
350+
});
351+
352+
it("clicking 'un-maximise' should send the widget to the top", () => {
353+
const unMaximiseButton = wrapper.find('.mx_AppTileMenuBar_iconButton_collapse');
354+
unMaximiseButton.first().simulate('click');
355+
expect(moveToContainerSpy).toHaveBeenCalledWith(r1, app1, Container.Top);
356+
});
357+
});
358+
});
310359
});

0 commit comments

Comments
 (0)