Make Client Settings and connections views scrollable, fix regression in unused bookmarks feature (#621)

Makes clientsettings scrollable, adds an option for mainview to wrap the
mainview-content in an OverlayScrollbarsComponent
This commit is contained in:
Evan Simkowitz 2024-04-30 16:05:49 -07:00 committed by GitHub
parent 8c63be4ea0
commit a16e01f73b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 109 additions and 57 deletions

View File

@ -156,7 +156,7 @@
--table-border-color: rgba(241, 246, 243, 0.15); --table-border-color: rgba(241, 246, 243, 0.15);
--table-thead-border-top-color: rgba(250, 250, 250, 0.1); --table-thead-border-top-color: rgba(250, 250, 250, 0.1);
--table-thead-bright-border-color: rgb(204, 204, 204); --table-thead-bright-border-color: rgb(204, 204, 204);
--table-thead-bg-color: rgba(250, 250, 250, 0.02); --table-thead-bg-color: rgb(5, 5, 5);
--table-tr-border-bottom-color: rgba(241, 246, 243, 0.15); --table-tr-border-bottom-color: rgba(241, 246, 243, 0.15);
--table-tr-hover-bg-color: rgba(255, 255, 255, 0.06); --table-tr-hover-bg-color: rgba(255, 255, 255, 0.06);
--table-tr-selected-bg-color: rgb(34, 34, 34); --table-tr-selected-bg-color: rgb(34, 34, 34);

View File

@ -57,6 +57,10 @@
--scrollbar-thumb-hover-color: rgba(0, 0, 0, 0.4); --scrollbar-thumb-hover-color: rgba(0, 0, 0, 0.4);
--scrollbar-thumb-active-color: rgba(0, 0, 0, 0.5); --scrollbar-thumb-active-color: rgba(0, 0, 0, 0.5);
/* table colors */
--table-thead-bg-color: rgb(253, 253, 253);
--table-tr-selected-bg-color: rgb(216, 216, 216);
/* line color */ /* line color */
--line-actions-bg-color: rgba(0, 0, 0, 0.1); --line-actions-bg-color: rgba(0, 0, 0, 0.1);
--line-actions-inactive-color: rgba(0, 0, 0, 0.3); --line-actions-inactive-color: rgba(0, 0, 0, 0.3);

View File

@ -1,6 +1,7 @@
.clientsettings-view { .clientsettings-view {
.content { .content {
padding: 14px 18px 0 30px; padding: 14px 18px 14px 30px;
overflow-y: scroll;
} }
.wave-dropdown { .wave-dropdown {

View File

@ -14,6 +14,7 @@ import * as appconst from "@/app/appconst";
import "./clientsettings.less"; import "./clientsettings.less";
import { MainView } from "../common/elements/mainview"; import { MainView } from "../common/elements/mainview";
import { OverlayScrollbarsComponent } from "overlayscrollbars-react";
class ClientSettingsKeybindings extends React.Component<{}, {}> { class ClientSettingsKeybindings extends React.Component<{}, {}> {
componentDidMount() { componentDidMount() {
@ -251,7 +252,12 @@ class ClientSettingsView extends React.Component<{ model: RemotesModel }, { hove
const curSudoPwClearOnSleep = GlobalModel.getSudoPwClearOnSleep(); const curSudoPwClearOnSleep = GlobalModel.getSudoPwClearOnSleep();
return ( return (
<MainView className="clientsettings-view" title="Client Settings" onClose={this.handleClose}> <MainView
className="clientsettings-view"
title="Client Settings"
onClose={this.handleClose}
scrollable={true}
>
<If condition={!isHidden}> <If condition={!isHidden}>
<ClientSettingsKeybindings></ClientSettingsKeybindings> <ClientSettingsKeybindings></ClientSettingsKeybindings>
</If> </If>

View File

@ -40,7 +40,8 @@
} }
.mainview-content { .mainview-content {
padding-top: 14px; display: flex;
flex-direction: column;
} }
} }

View File

@ -7,6 +7,8 @@ import cn from "classnames";
import { GlobalModel } from "@/models"; import { GlobalModel } from "@/models";
import "./mainview.less"; import "./mainview.less";
import { Choose, If, Otherwise, When } from "tsx-control-statements/components";
import { OverlayScrollbarsComponent } from "overlayscrollbars-react";
@mobxReact.observer @mobxReact.observer
class MainView extends React.Component<{ class MainView extends React.Component<{
@ -14,6 +16,8 @@ class MainView extends React.Component<{
onClose: () => void; onClose: () => void;
children: React.ReactNode; children: React.ReactNode;
className?: string; className?: string;
scrollable?: boolean;
onScrollbarInitialized?: () => void;
}> { }> {
render() { render() {
const sidebarModel = GlobalModel.mainSidebarModel; const sidebarModel = GlobalModel.mainSidebarModel;
@ -31,7 +35,21 @@ class MainView extends React.Component<{
</div> </div>
</header> </header>
</div> </div>
<Choose>
<When condition={this.props.scrollable}>
<OverlayScrollbarsComponent
className="mainview-content"
options={{ scrollbars: { autoHide: "leave" } }}
defer={true}
events={{ initialized: this.props.onScrollbarInitialized }}
>
{this.props.children}
</OverlayScrollbarsComponent>
</When>
<Otherwise>
<div className="mainview-content">{this.props.children}</div> <div className="mainview-content">{this.props.children}</div>
</Otherwise>
</Choose>
</div> </div>
); );
} }

View File

@ -9,10 +9,20 @@
margin: 20px 50px 20px 20px; margin: 20px 50px 20px 20px;
} }
.connections-table-container {
display: flex;
flex-direction: column;
flex-grow: 1;
overflow-y: scroll;
max-height: 85vh;
width: fit-content;
max-width: 970px;
}
.connections-table { .connections-table {
margin: 0px 10px 10px 10px; margin: 0px 10px 10px 10px;
table-layout: fixed; table-layout: fixed;
max-width: 970px; position: relative;
colgroup { colgroup {
.first-col { .first-col {
@ -28,13 +38,16 @@
thead { thead {
border-radius: var(--sizing-2-xs, 4px); border-radius: var(--sizing-2-xs, 4px);
border-bottom: 2px solid var(--table-thead-bright-border-color);
user-select: none; user-select: none;
th { th {
position: sticky;
top: 0;
height: 32px; height: 32px;
padding: 5px 15px 5px 10px; padding: 5px 15px 5px 10px;
color: var(--app-text-color); color: var(--app-text-color);
border-bottom: 2px solid var(--table-thead-bright-border-color);
background: var(--table-thead-bg-color);
} }
} }
@ -78,8 +91,10 @@
footer { footer {
margin-left: 10px; margin-left: 10px;
margin-top: 10px;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
flex-shrink: 0;
gap: 8px; gap: 8px;
} }

View File

@ -13,6 +13,7 @@ import * as util from "@/util/util";
import "./connections.less"; import "./connections.less";
import { MainView } from "../common/elements/mainview"; import { MainView } from "../common/elements/mainview";
import { OverlayScrollbarsComponent } from "overlayscrollbars-react";
class ConnectionsKeybindings extends React.Component<{}, {}> { class ConnectionsKeybindings extends React.Component<{}, {}> {
componentDidMount() { componentDidMount() {
@ -149,6 +150,11 @@ class ConnectionsView extends React.Component<{ model: RemotesModel }, { hovered
<If condition={!isHidden}> <If condition={!isHidden}>
<ConnectionsKeybindings></ConnectionsKeybindings> <ConnectionsKeybindings></ConnectionsKeybindings>
</If> </If>
<OverlayScrollbarsComponent
className="connections-table-container"
options={{ scrollbars: { autoHide: "leave" } }}
defer={true}
>
<table <table
className="connections-table" className="connections-table"
cellSpacing="0" cellSpacing="0"
@ -200,6 +206,7 @@ class ConnectionsView extends React.Component<{ model: RemotesModel }, { hovered
</For> </For>
</tbody> </tbody>
</table> </table>
</OverlayScrollbarsComponent>
<footer> <footer>
<Button <Button
className="secondary" className="secondary"

View File

@ -81,7 +81,7 @@ class BookmarksModel {
mobx.action(() => { mobx.action(() => {
this.reset(); this.reset();
this.globalModel.showSessionView(); this.globalModel.showSessionView();
this.globalModel.inputModel.setCurLine(bm.cmdstr); this.globalModel.inputModel.curLine = bm.cmdstr;
setTimeout(() => this.globalModel.inputModel.giveFocus(), 50); setTimeout(() => this.globalModel.inputModel.giveFocus(), 50);
})(); })();
} }