migrate remote detail and alert modal to base modal component

This commit is contained in:
Red J. Adaya 2023-11-29 17:04:56 +08:00
parent 06eb11bf6b
commit 34cbe34ba5
3 changed files with 223 additions and 357 deletions

View File

@ -1066,54 +1066,54 @@
background-color: rgba(21, 23, 21, 0.7);
z-index: 1;
}
}
.wave-modal {
z-index: 2;
.wave-modal {
z-index: 2;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 16px;
border-radius: 10px;
background: #151715;
box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.35), 0px 10px 24px 0px rgba(0, 0, 0, 0.45),
0px 0px 0.5px 0px rgba(255, 255, 255, 0.5) inset, 0px 0.5px 0px 0px rgba(255, 255, 255, 0.2) inset;
.wave-modal-content {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 16px;
border-radius: 10px;
background: #151715;
box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.35), 0px 10px 24px 0px rgba(0, 0, 0, 0.45),
0px 0px 0.5px 0px rgba(255, 255, 255, 0.5) inset, 0px 0.5px 0px 0px rgba(255, 255, 255, 0.2) inset;
align-items: center;
width: 100%;
.wave-modal-content {
display: flex;
flex-direction: column;
align-items: center;
.wave-modal-header {
width: 100%;
display: flex;
align-items: center;
padding: 12px 14px 12px 20px;
justify-content: space-between;
line-height: 20px;
border-bottom: 1px solid rgba(250, 250, 250, 0.1);
.wave-modal-header {
width: 100%;
display: flex;
align-items: center;
padding: 12px 20px;
justify-content: space-between;
line-height: 20px;
border-bottom: 1px solid rgba(250, 250, 250, 0.1);
button {
i {
font-size: 18px;
}
button {
i {
font-size: 18px;
}
}
}
.wave-modal-body {
width: 100%;
padding: 0px 20px;
}
.wave-modal-body {
width: 100%;
padding: 0px 20px;
}
.wave-modal-footer {
display: flex;
justify-content: flex-end;
width: 100%;
padding: 0 20px 20px;
.wave-modal-footer {
display: flex;
justify-content: flex-end;
width: 100%;
padding: 0 20px 20px;
button:first-child {
margin-right: 8px;
}
button:first-child {
margin-right: 8px;
}
}
}

View File

@ -59,22 +59,6 @@
}
}
.modal.alert-modal {
z-index: 205;
footer {
justify-content: center;
.button {
margin-left: 20px;
}
.button:first-child {
margin-left: 0;
}
}
}
.modal.settings-modal {
footer {
justify-content: center;
@ -181,59 +165,6 @@
}
}
.modal.wave-modal {
.wave-modal-content {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 16px;
border-radius: 10px;
background: var(--olive-dark-1, #151715);
box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.35), 0px 10px 24px 0px rgba(0, 0, 0, 0.45),
0px 0px 0.5px 0px rgba(255, 255, 255, 0.5) inset, 0px 0.5px 0px 0px rgba(255, 255, 255, 0.2) inset;
.wave-modal-content-inner {
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
width: 100%;
.wave-modal-header {
width: 100%;
display: flex;
align-items: center;
padding: 12px 20px;
justify-content: space-between;
line-height: 20px;
border-bottom: 1px solid rgba(250, 250, 250, 0.1);
.wave-modal-title {
color: @term-bright-white;
font-style: normal;
line-height: 20px;
font-size: 13px;
}
.wave-modal-close {
display: flex;
padding: 4px;
align-items: center;
gap: 8px;
}
}
.wave-modal-body {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 24px;
width: 87%;
}
}
}
}
.modal.tos-modal {
.modal-content.wave-modal-content {
padding: 32px 48px;
@ -335,7 +266,6 @@
flex-direction: column;
align-items: flex-start;
gap: 24px;
width: 87%;
.about-section {
display: flex;
@ -444,9 +374,6 @@
min-height: 411px;
.wave-modal-content {
width: 452px;
min-height: 411px;
overflow: visible;
gap: 24px;
.wave-modal-body {
@ -458,144 +385,126 @@
align-self: stretch;
width: 100%;
}
}
}
.action-buttons {
display: flex;
button:first-child {
margin-right: 8px;
}
.alert-modal {
.wave-modal-content {
.wave-modal-body {
padding: 40px 20px;
}
}
}
.wave-modal.rconndetail-modal {
.wave-modal-content.rconndetail-wave-modal-content {
width: 631px;
min-height: 565px;
overflow: visible;
.rconndetail-modal {
width: 631px;
min-height: 565px;
.wave-modal-content-inner.rconndetail-wave-modal-content-inner {
.wave-modal-content {
display: flex;
padding-bottom: 0px;
flex-direction: column;
align-items: center;
gap: 20px;
flex-shrink: 0;
.wave-modal-body {
display: flex;
padding: 0px 20px;
align-items: flex-start;
width: 100%;
display: flex;
padding-bottom: 0px;
flex-direction: column;
align-items: center;
gap: 20px;
flex-shrink: 0;
gap: 16px;
align-self: stretch;
.rconndetail-wave-modal-body {
display: flex;
padding: 0px 20px;
align-items: flex-start;
width: 100%;
.name-header-actions-wrapper {
display: flex;
flex-direction: column;
gap: 16px;
align-self: stretch;
align-items: flex-start;
gap: 12px;
.name-header-actions-wrapper {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 12px;
.rconndetail-name {
color: @term-bright-white;
font-size: 15px;
font-weight: 500;
line-height: 20px;
}
.header-actions {
display: flex;
justify-content: flex-end;
align-items: flex-start;
.wave-button {
padding: 4px 15px;
font-size: 11px;
margin-right: 8px;
}
}
.rconndetail-name {
color: @term-bright-white;
font-size: 15px;
font-weight: 500;
line-height: 20px;
}
.remote-detail {
.settings-field {
display: flex;
flex-direction: row;
align-items: center;
.header-actions {
display: flex;
justify-content: flex-end;
align-items: flex-start;
.settings-label {
font-weight: bold;
width: 12em;
display: flex;
flex-direction: row;
align-items: center;
}
.settings-input {
display: flex;
flex-direction: row;
align-items: center;
color: @term-white;
}
}
.settings-field:not(:first-child) {
margin-top: 4px;
}
.status {
display: flex;
height: 30px;
padding: 3px 8px;
align-items: center;
gap: 8px;
align-self: stretch;
border-radius: 6px;
background: rgba(241, 246, 243, 0.08);
}
.terminal-wrapper {
width: 100%;
margin-top: 5px;
.terminal-connectelem {
height: 163px !important; // Needed to override plugin height
.xterm-viewport {
display: flex;
padding: 6px 10px;
gap: 8px;
align-items: flex-start;
align-self: stretch;
border-radius: 6px;
border: 1px solid var(--element-separator, rgba(241, 246, 243, 0.15));
background: #080a08;
height: 163px !important; // Needed to override plugin height
}
.xterm-screen {
padding: 10px;
width: 541px !important; // Needed to override plugin width
}
}
.wave-button {
padding: 4px 15px;
font-size: 11px;
margin-right: 8px;
}
}
}
}
.rconndetail-wave-modal-footer {
display: flex;
justify-content: flex-end;
width: 100%;
padding: 0 20px 20px;
.remote-detail {
.settings-field {
display: flex;
flex-direction: row;
align-items: center;
.action-buttons {
display: flex;
.settings-label {
font-weight: bold;
width: 12em;
display: flex;
flex-direction: row;
align-items: center;
}
button:first-child {
margin-right: 8px;
.settings-input {
display: flex;
flex-direction: row;
align-items: center;
color: @term-white;
}
}
.settings-field:not(:first-child) {
margin-top: 4px;
}
.status {
display: flex;
height: 30px;
padding: 3px 8px;
align-items: center;
gap: 8px;
align-self: stretch;
border-radius: 6px;
background: rgba(241, 246, 243, 0.08);
}
.terminal-wrapper {
width: 100%;
margin-top: 5px;
.terminal-connectelem {
height: 163px !important; // Needed to override plugin height
.xterm-viewport {
display: flex;
padding: 6px 10px;
gap: 8px;
align-items: flex-start;
align-self: stretch;
border-radius: 6px;
border: 1px solid var(--element-separator, rgba(241, 246, 243, 0.15));
background: #080a08;
height: 163px !important; // Needed to override plugin height
}
.xterm-screen {
padding: 10px;
width: 541px !important; // Needed to override plugin width
}
}
}
}
}

View File

@ -201,47 +201,19 @@ class AlertModal extends React.Component<{ onOk?: () => void }, {}> {
render() {
let message = GlobalModel.alertMessage.get();
let title = message?.title ?? (message?.confirm ? "Confirm" : "Alert");
let isConfirm = message?.confirm;
return (
<div className="modal prompt-modal is-active alert-modal">
<div className="modal-background" />
<div className="modal-content">
<header>
<p className="modal-title">
<WarningIcon className="icon" />
{title}
</p>
<div className="close-icon hoverEffect" title="Close (Escape)" onClick={this.closeModal}>
<XmarkIcon />
</div>
</header>
<Modal onClose={this.closeModal} onOk={this.handleOK} title={title} className="alert-modal">
<Modal.Header />
<Modal.Body>
<If condition={message?.markdown}>
<Markdown text={message?.message ?? ""} extraClassName="inner-content" />
<Markdown text={message?.message ?? ""} />
</If>
<If condition={!message?.markdown}>
<div className="inner-content content">
<p>{message?.message}</p>
</div>
</If>
<footer>
<If condition={isConfirm}>
<div onClick={this.closeModal} className="button is-prompt-cancel is-outlined is-small">
Cancel
</div>
<div onClick={this.handleOK} className="button is-prompt-green is-outlined is-small">
OK
</div>
</If>
<If condition={!isConfirm}>
<div onClick={this.handleOK} className="button is-prompt-green is-small">
OK
</div>
</If>
</footer>
</div>
</div>
<If condition={!message?.markdown}>{message?.message}</If>
</Modal.Body>
<Modal.Footer />
</Modal>
);
}
}
@ -1058,103 +1030,88 @@ class ViewRemoteConnDetailModal extends React.Component<{ remotesModel?: Remotes
let remoteAliasText = util.isBlank(remote.remotealias) ? "(none)" : remote.remotealias;
return (
<div className={cn("modal wave-modal rconndetail-modal is-active")}>
<div className="modal-background wave-modal-background" />
<div className="modal-content wave-modal-content rconndetail-wave-modal-content">
<div className="wave-modal-content-inner rconndetail-wave-modal-content-inner">
<header className="wave-modal-header rconndetail-wave-modal-header">
<div className="wave-modal-title rconndetail-wave-modal-title">Connection</div>
<div className="wave-modal-close rconndetail-wave-modal-close" onClick={model.closeModal}>
<img src={close} alt="Close (Escape)" />
</div>
</header>
<div className="wave-modal-body rconndetail-wave-modal-body">
<div className="name-header-actions-wrapper">
<div className="name text-primary">{getName(remote)}</div>
<div className="header-actions">{this.renderHeaderBtns(remote)}</div>
</div>
<div className="remote-detail" style={{ overflow: "hidden" }}>
<div className="settings-field">
<div className="settings-label">Conn Id</div>
<div className="settings-input">{remote.remoteid}</div>
</div>
<div className="settings-field">
<div className="settings-label">Type</div>
<div className="settings-input">{this.getRemoteTypeStr(remote)}</div>
</div>
<div className="settings-field">
<div className="settings-label">Canonical Name</div>
<div className="settings-input">
{remote.remotecanonicalname}
<If
condition={
!util.isBlank(remote.remotevars.port) && remote.remotevars.port != "22"
}
>
<span style={{ marginLeft: 5 }}>(port {remote.remotevars.port})</span>
</If>
</div>
</div>
<div className="settings-field" style={{ minHeight: 24 }}>
<div className="settings-label">Alias</div>
<div className="settings-input">{remoteAliasText}</div>
</div>
<div className="settings-field">
<div className="settings-label">Auth Type</div>
<div className="settings-input">
<If condition={!remote.local}>{remote.authtype}</If>
<If condition={remote.local}>local</If>
</div>
</div>
<div className="settings-field">
<div className="settings-label">Connect Mode</div>
<div className="settings-input">{remote.connectmode}</div>
</div>
{this.renderInstallStatus(remote)}
<div className="flex-spacer" style={{ minHeight: 20 }} />
<div className="status">
<Status status={this.getStatus(remote.status)} text={this.getMessage(remote)} />
</div>
<div
key="term"
className={cn(
"terminal-wrapper",
{ focus: isTermFocused },
remote != null ? "status-" + remote.status : null
)}
>
<If condition={!isTermFocused}>
<div key="termblock" className="term-block" onClick={this.clickTermBlock}></div>
</If>
<If condition={model.showNoInputMsg.get()}>
<div key="termtag" className="term-tag">
input is only allowed while status is 'connecting'
</div>
</If>
<div
key="terminal"
className="terminal-connectelem"
ref={this.termRef}
data-remoteid={remote.remoteid}
style={{
height: textmeasure.termHeightFromRows(RemotePtyRows, termFontSize),
width: termWidth,
}}
></div>
</div>
<Modal
onClose={this.model.closeModal}
onOk={this.model.closeModal}
title="Connection"
okLabel="Done"
className="rconndetail-modal"
>
<Modal.Header />
<Modal.Body>
<div className="name-header-actions-wrapper">
<div className="name text-primary">{getName(remote)}</div>
<div className="header-actions">{this.renderHeaderBtns(remote)}</div>
</div>
<div className="remote-detail" style={{ overflow: "hidden" }}>
<div className="settings-field">
<div className="settings-label">Conn Id</div>
<div className="settings-input">{remote.remoteid}</div>
</div>
<div className="settings-field">
<div className="settings-label">Type</div>
<div className="settings-input">{this.getRemoteTypeStr(remote)}</div>
</div>
<div className="settings-field">
<div className="settings-label">Canonical Name</div>
<div className="settings-input">
{remote.remotecanonicalname}
<If condition={!util.isBlank(remote.remotevars.port) && remote.remotevars.port != "22"}>
<span style={{ marginLeft: 5 }}>(port {remote.remotevars.port})</span>
</If>
</div>
</div>
<footer className="wave-modal-footer rconndetail-wave-modal-footer">
<div className="action-buttons">
<Button theme="secondary" onClick={model.closeModal}>
Cancel
</Button>
<Button onClick={model.closeModal}>Done</Button>
<div className="settings-field" style={{ minHeight: 24 }}>
<div className="settings-label">Alias</div>
<div className="settings-input">{remoteAliasText}</div>
</div>
<div className="settings-field">
<div className="settings-label">Auth Type</div>
<div className="settings-input">
<If condition={!remote.local}>{remote.authtype}</If>
<If condition={remote.local}>local</If>
</div>
</footer>
</div>
<div className="settings-field">
<div className="settings-label">Connect Mode</div>
<div className="settings-input">{remote.connectmode}</div>
</div>
{this.renderInstallStatus(remote)}
<div className="flex-spacer" style={{ minHeight: 20 }} />
<div className="status">
<Status status={this.getStatus(remote.status)} text={this.getMessage(remote)} />
</div>
<div
key="term"
className={cn(
"terminal-wrapper",
{ focus: isTermFocused },
remote != null ? "status-" + remote.status : null
)}
>
<If condition={!isTermFocused}>
<div key="termblock" className="term-block" onClick={this.clickTermBlock}></div>
</If>
<If condition={model.showNoInputMsg.get()}>
<div key="termtag" className="term-tag">
input is only allowed while status is 'connecting'
</div>
</If>
<div
key="terminal"
className="terminal-connectelem"
ref={this.termRef}
data-remoteid={remote.remoteid}
style={{
height: textmeasure.termHeightFromRows(RemotePtyRows, termFontSize),
width: termWidth,
}}
></div>
</div>
</div>
</div>
</div>
</Modal.Body>
<Modal.Footer />
</Modal>
);
}
}