Compare commits

..

1 Commits

Author SHA1 Message Date
Evan Simkowitz 3a8e08433d save work 2024-03-29 18:25:06 -07:00
78 changed files with 555 additions and 513 deletions
+2 -2
View File
@@ -32,7 +32,7 @@
"electron-updater": "^6.1.8",
"framer-motion": "^10.16.16",
"mobx": "6.12",
"mobx-react": "^9.1.1",
"mobx-preact": "^7.5.0",
"monaco-editor": "^0.44.0",
"mustache": "^4.2.0",
"node-fetch": "^3.2.10",
@@ -105,4 +105,4 @@
"scripts": {
"postinstall": "electron-builder install-app-deps"
}
}
}
+5 -4
View File
@@ -1,8 +1,9 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobxReact from "mobx-react";
import React, { PureComponent } from "preact/compat";
import { createRef, RefObject } from "preact";
import * as mobxReact from "mobx-preact";
import * as mobx from "mobx";
import { boundMethod } from "autobind-decorator";
import { If } from "tsx-control-statements/components";
@@ -28,9 +29,9 @@ import "./app.less";
dayjs.extend(localizedFormat);
@mobxReact.observer
class App extends React.PureComponent<{}, {}> {
class App extends PureComponent<{}, {}> {
dcWait: OV<boolean> = mobx.observable.box(false, { name: "dcWait" });
mainContentRef: React.RefObject<HTMLDivElement> = React.createRef();
mainContentRef: RefObject<HTMLDivElement> = createRef();
constructor(props: {}) {
super(props);
+5 -5
View File
@@ -1,8 +1,8 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobxReact from "mobx-react";
import React, { PureComponent } from "preact/compat";
import * as mobxReact from "mobx-preact";
import * as mobx from "mobx";
import { boundMethod } from "autobind-decorator";
import { If, For } from "tsx-control-statements/components";
@@ -22,7 +22,7 @@ type BookmarkProps = {
bookmark: BookmarkType;
};
class BookmarkKeybindings extends React.PureComponent<{}, {}> {
class BookmarkKeybindings extends PureComponent<{}, {}> {
@boundMethod
componentDidMount(): void {
let keybindManager = GlobalModel.keybindManager;
@@ -76,7 +76,7 @@ class BookmarkKeybindings extends React.PureComponent<{}, {}> {
}
@mobxReact.observer
class Bookmark extends React.PureComponent<BookmarkProps, {}> {
class Bookmark extends PureComponent<BookmarkProps, {}> {
@boundMethod
handleDeleteClick(): void {
let { bookmark } = this.props;
@@ -232,7 +232,7 @@ class Bookmark extends React.PureComponent<BookmarkProps, {}> {
}
@mobxReact.observer
class BookmarksView extends React.PureComponent<{}, {}> {
class BookmarksView extends PureComponent<{}, {}> {
@boundMethod
handleClose() {
GlobalModel.bookmarksModel.closeView();
+4 -4
View File
@@ -1,8 +1,8 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobxReact from "mobx-react";
import React, { PureComponent } from "preact/compat";
import * as mobxReact from "mobx-preact";
import * as mobx from "mobx";
import { boundMethod } from "autobind-decorator";
import { If } from "tsx-control-statements/components";
@@ -14,7 +14,7 @@ import * as appconst from "@/app/appconst";
import "./clientsettings.less";
import { MainView } from "../common/elements/mainview";
class ClientSettingsKeybindings extends React.PureComponent<{}, {}> {
class ClientSettingsKeybindings extends PureComponent<{}, {}> {
componentDidMount() {
let clientSettingsViewModel = GlobalModel.clientSettingsViewModel;
let keybindManager = GlobalModel.keybindManager;
@@ -34,7 +34,7 @@ class ClientSettingsKeybindings extends React.PureComponent<{}, {}> {
}
@mobxReact.observer
class ClientSettingsView extends React.PureComponent<{ model: RemotesModel }, { hoveredItemId: string }> {
class ClientSettingsView extends PureComponent<{ model: RemotesModel }, { hoveredItemId: string }> {
errorMessage: OV<string> = mobx.observable.box(null, { name: "ClientSettings-errorMessage" });
@boundMethod
+6 -6
View File
@@ -1,22 +1,22 @@
import * as React from "react";
import React, { PureComponent, ReactNode, CSSProperties } from "preact/compat";
import { boundMethod } from "autobind-decorator";
import cn from "classnames";
import "./button.less";
interface ButtonProps {
children: React.ReactNode;
children: ReactNode;
onClick?: () => void;
disabled?: boolean;
leftIcon?: React.ReactNode;
rightIcon?: React.ReactNode;
style?: React.CSSProperties;
leftIcon?: ReactNode;
rightIcon?: ReactNode;
style?: CSSProperties;
autoFocus?: boolean;
className?: string;
termInline?: boolean;
}
class Button extends React.PureComponent<ButtonProps> {
class Button extends PureComponent<ButtonProps> {
static defaultProps = {
style: {},
className: "primary",
+3 -4
View File
@@ -1,18 +1,17 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobx from "mobx";
import { PureComponent, ReactNode } from "preact/compat";
import cn from "classnames";
import "./checkbox.less";
class Checkbox extends React.PureComponent<
class Checkbox extends PureComponent<
{
checked?: boolean;
defaultChecked?: boolean;
onChange: (value: boolean) => void;
label: React.ReactNode;
label: ReactNode;
className?: string;
id?: string;
},
+2 -2
View File
@@ -1,7 +1,7 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import React, { PureComponent } from "preact/compat";
import { boundMethod } from "autobind-decorator";
import cn from "classnames";
import { If } from "tsx-control-statements/components";
@@ -11,7 +11,7 @@ import { ReactComponent as CopyIcon } from "@/assets/icons/history/copy.svg";
import "./cmdstrcode.less";
class CmdStrCode extends React.PureComponent<
class CmdStrCode extends PureComponent<
{
cmdstr: string;
onUse: () => void;
+1 -1
View File
@@ -1,7 +1,7 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import React, { PureComponent } from "preact/compat";
function renderCmdText(text: string): any {
return <span>&#x2318;{text}</span>;
+8 -7
View File
@@ -1,4 +1,5 @@
import React, { useState, useEffect, useRef, createRef } from "react";
import { RefObject, FunctionComponent, createRef, Fragment } from "preact";
import { useState, useEffect, useRef, CSSProperties } from "preact/compat";
import * as mobx from "mobx";
import ReactDOM from "react-dom";
import dayjs from "dayjs";
@@ -11,7 +12,7 @@ import { v4 as uuidv4 } from "uuid";
import "./datepicker.less";
interface YearRefs {
[key: number]: React.RefObject<HTMLDivElement>;
[key: number]: RefObject<HTMLDivElement>;
}
type DatePickerProps = {
@@ -20,7 +21,7 @@ type DatePickerProps = {
format?: string;
};
const DatePicker: React.FC<DatePickerProps> = ({ selectedDate, format = "MM/DD/YYYY", onSelectDate }) => {
const DatePicker: FunctionComponent<DatePickerProps> = ({ selectedDate, format = "MM/DD/YYYY", onSelectDate }) => {
const [isOpen, setIsOpen] = useState(false);
const [selDate, setSelDate] = useState(dayjs(selectedDate)); // Initialize with dayjs object
const [showYearAccordion, setShowYearAccordion] = useState(false);
@@ -199,7 +200,7 @@ const DatePicker: React.FC<DatePickerProps> = ({ selectedDate, format = "MM/DD/Y
return days;
};
const calculatePosition = (): React.CSSProperties => {
const calculatePosition = (): CSSProperties => {
if (wrapperRef.current) {
const rect = wrapperRef.current.getBoundingClientRect();
return {
@@ -219,7 +220,7 @@ const DatePicker: React.FC<DatePickerProps> = ({ selectedDate, format = "MM/DD/Y
for (let year = startYear; year <= endYear; year++) {
yearsRange.push(year);
yearRefs.current[year] = React.createRef();
yearRefs.current[year] = createRef();
}
return yearsRange;
@@ -450,7 +451,7 @@ const DatePicker: React.FC<DatePickerProps> = ({ selectedDate, format = "MM/DD/Y
const inputRef = inputRefs.current[part];
return (
<React.Fragment key={part}>
<Fragment key={part}>
{index > 0 && <span>{delimiter}</span>}
<input
readOnly
@@ -466,7 +467,7 @@ const DatePicker: React.FC<DatePickerProps> = ({ selectedDate, format = "MM/DD/Y
className="date-input"
placeholder={part}
/>
</React.Fragment>
</Fragment>
);
})}
<i
+14 -12
View File
@@ -1,8 +1,9 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobxReact from "mobx-react";
import { RefObject, createRef } from "preact";
import React, { PureComponent, ReactNode, TargetedEvent, CSSProperties } from "preact/compat";
import * as mobxReact from "mobx-preact";
import { boundMethod } from "autobind-decorator";
import cn from "classnames";
import { If } from "tsx-control-statements/components";
@@ -13,8 +14,8 @@ import { GlobalModel } from "@/models";
import "./dropdown.less";
interface DropdownDecorationProps {
startDecoration?: React.ReactNode;
endDecoration?: React.ReactNode;
startDecoration?: ReactNode;
endDecoration?: ReactNode;
}
interface DropdownProps {
@@ -36,9 +37,10 @@ interface DropdownState {
isTouched: boolean;
}
class Dropdown extends React.PureComponent<DropdownProps, DropdownState> {
wrapperRef: React.RefObject<HTMLDivElement>;
menuRef: React.RefObject<HTMLDivElement>;
@mobxReact.observer
class Dropdown extends PureComponent<DropdownProps, DropdownState> {
wrapperRef: RefObject<HTMLDivElement>;
menuRef: RefObject<HTMLDivElement>;
timeoutId: any;
curUuid: string;
@@ -50,8 +52,8 @@ class Dropdown extends React.PureComponent<DropdownProps, DropdownState> {
highlightedIndex: -1,
isTouched: false,
};
this.wrapperRef = React.createRef();
this.menuRef = React.createRef();
this.wrapperRef = createRef();
this.menuRef = createRef();
this.curUuid = uuidv4();
}
@@ -181,10 +183,10 @@ class Dropdown extends React.PureComponent<DropdownProps, DropdownState> {
}
@boundMethod
handleKeyDown(event: React.TargetedEvent) {}
handleKeyDown(event) {}
@boundMethod
handleSelect(value: string, event?: React.TargetedEvent) {
handleSelect(value: string, event?: TargetedEvent) {
const { onChange } = this.props;
if (event) {
event.stopPropagation(); // This stops the event from bubbling up to the wrapper
@@ -204,7 +206,7 @@ class Dropdown extends React.PureComponent<DropdownProps, DropdownState> {
}
@boundMethod
calculatePosition(): React.CSSProperties {
calculatePosition(): CSSProperties {
if (this.wrapperRef.current) {
const rect = this.wrapperRef.current.getBoundingClientRect();
return {
@@ -1,8 +1,9 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobxReact from "mobx-react";
import { createRef, RefObject } from "preact";
import React, { PureComponent } from "preact/compat";
import * as mobxReact from "mobx-preact";
import * as mobx from "mobx";
import { boundMethod } from "autobind-decorator";
import cn from "classnames";
@@ -14,7 +15,7 @@ import { v4 as uuidv4 } from "uuid";
import "./inlinesettingstextedit.less";
@mobxReact.observer
class InlineSettingsTextEdit extends React.PureComponent<
class InlineSettingsTextEdit extends PureComponent<
{
text: string;
value: string;
@@ -28,7 +29,7 @@ class InlineSettingsTextEdit extends React.PureComponent<
isEditing: OV<boolean> = mobx.observable.box(false, { name: "inlineedit-isEditing" });
tempText: OV<string>;
shouldFocus: boolean = false;
inputRef: React.RefObject<any> = React.createRef();
inputRef: RefObject<any> = createRef();
curId: string;
componentDidMount(): void {
+4 -4
View File
@@ -1,19 +1,19 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobxReact from "mobx-react";
import { PureComponent, ReactNode } from "preact/compat";
import * as mobxReact from "mobx-preact";
import cn from "classnames";
import "./inputdecoration.less";
interface InputDecorationProps {
position?: "start" | "end";
children: React.ReactNode;
children: ReactNode;
}
@mobxReact.observer
class InputDecoration extends React.PureComponent<InputDecorationProps, {}> {
class InputDecoration extends PureComponent<InputDecorationProps, {}> {
render() {
const { children, position = "end" } = this.props;
return (
+2 -2
View File
@@ -1,7 +1,7 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import React, { PureComponent } from "preact/compat";
import cn from "classnames";
import { ButtonProps } from "./button";
@@ -11,7 +11,7 @@ interface LinkButtonProps extends ButtonProps {
target?: string;
}
class LinkButton extends React.PureComponent<LinkButtonProps> {
class LinkButton extends PureComponent<LinkButtonProps> {
render() {
const { leftIcon, rightIcon, children, className, ...rest } = this.props;
+4 -4
View File
@@ -1,18 +1,18 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobxReact from "mobx-react";
import { PureComponent, ReactNode } from "preact/compat";
import * as mobxReact from "mobx-preact";
import cn from "classnames";
import { GlobalModel } from "@/models";
import "./mainview.less";
@mobxReact.observer
class MainView extends React.PureComponent<{
class MainView extends PureComponent<{
title: string;
onClose: () => void;
children: React.ReactNode;
children: ReactNode;
className?: string;
}> {
render() {
+10 -15
View File
@@ -1,8 +1,9 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobxReact from "mobx-react";
import { createRef, RefObject, JSX } from "preact";
import { PureComponent, ReactNode } from "preact/compat";
import * as mobxReact from "mobx-preact";
import ReactMarkdown from "react-markdown";
import remarkGfm from "remark-gfm";
import cn from "classnames";
@@ -28,23 +29,20 @@ function CodeRenderer(props: any): any {
}
@mobxReact.observer
class CodeBlockMarkdown extends React.PureComponent<
{ children: React.ReactNode; codeSelectSelectedIndex?: number },
{}
> {
class CodeBlockMarkdown extends PureComponent<{ children: ReactNode; codeSelectSelectedIndex?: number }, {}> {
blockIndex: number;
blockRef: React.RefObject<HTMLPreElement>;
blockRef: RefObject<HTMLPreElement>;
constructor(props) {
super(props);
this.blockRef = React.createRef();
this.blockRef = createRef();
this.blockIndex = GlobalModel.inputModel.addCodeBlockToCodeSelect(this.blockRef);
}
render() {
let clickHandler: (e: React.JSX.TargetedMouseEvent<HTMLElement>, blockIndex: number) => void;
let clickHandler: (e: JSX.TargetedMouseEvent<HTMLElement>, blockIndex: number) => void;
let inputModel = GlobalModel.inputModel;
clickHandler = (e: React.JSX.TargetedMouseEvent<HTMLElement>, blockIndex: number) => {
clickHandler = (e: JSX.TargetedMouseEvent<HTMLElement>, blockIndex: number) => {
inputModel.setCodeSelectSelectedCodeBlock(blockIndex);
};
let selected = this.blockIndex == this.props.codeSelectSelectedIndex;
@@ -61,15 +59,12 @@ class CodeBlockMarkdown extends React.PureComponent<
}
@mobxReact.observer
class Markdown extends React.PureComponent<
{ text: string; style?: any; extraClassName?: string; codeSelect?: boolean },
{}
> {
class Markdown extends PureComponent<{ text: string; style?: any; extraClassName?: string; codeSelect?: boolean }, {}> {
CodeBlockRenderer(props: any, codeSelect: boolean, codeSelectIndex: number): any {
if (codeSelect) {
return <CodeBlockMarkdown codeSelectSelectedIndex={codeSelectIndex}>{props.children}</CodeBlockMarkdown>;
} else {
const clickHandler = (e: React.JSX.TargetedMouseEvent<HTMLElement>) => {
const clickHandler = (e: JSX.TargetedMouseEvent<HTMLElement>) => {
let blockText = (e.target as HTMLElement).innerText;
if (blockText) {
blockText = blockText.replace(/\n$/, ""); // remove trailing newline
+9 -9
View File
@@ -1,9 +1,9 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import { FunctionComponent } from "preact";
import { PureComponent, ReactNode, createPortal } from "preact/compat";
import { If } from "tsx-control-statements/components";
import ReactDOM from "react-dom";
import { Button } from "./button";
import { v4 as uuidv4 } from "uuid";
import { GlobalModel } from "@/models";
@@ -17,7 +17,7 @@ interface ModalHeaderProps {
title: string;
}
const ModalHeader: React.FC<ModalHeaderProps> = ({ onClose, keybindings, title }) => (
const ModalHeader: FunctionComponent<ModalHeaderProps> = ({ onClose, keybindings, title }) => (
<div className="wave-modal-header">
<If condition={keybindings && onClose}>
<ModalKeybindings onCancel={onClose}></ModalKeybindings>
@@ -39,7 +39,7 @@ interface ModalFooterProps {
keybindings?: boolean;
}
class ModalKeybindings extends React.PureComponent<{ onOk?: () => void; onCancel?: () => void }, {}> {
class ModalKeybindings extends PureComponent<{ onOk?: () => void; onCancel?: () => void }, {}> {
curId: string;
@boundMethod
@@ -70,12 +70,12 @@ class ModalKeybindings extends React.PureComponent<{ onOk?: () => void; onCancel
GlobalModel.keybindManager.unregisterDomain("modal-" + this.curId);
}
render(): React.ReactNode {
render(): ReactNode {
return null;
}
}
const ModalFooter: React.FC<ModalFooterProps> = ({
const ModalFooter: FunctionComponent<ModalFooterProps> = ({
onCancel,
onOk,
cancelLabel = "Cancel",
@@ -101,11 +101,11 @@ const ModalFooter: React.FC<ModalFooterProps> = ({
interface ModalProps {
className?: string;
children?: React.ReactNode;
children?: ReactNode;
onClickBackdrop?: () => void;
}
class Modal extends React.PureComponent<ModalProps> {
class Modal extends PureComponent<ModalProps> {
static Header = ModalHeader;
static Footer = ModalFooter;
@@ -127,7 +127,7 @@ class Modal extends React.PureComponent<ModalProps> {
}
render() {
return ReactDOM.createPortal(this.renderModal(), document.getElementById("app"));
return createPortal(this.renderModal(), document.getElementById("app"));
}
}
+3 -3
View File
@@ -1,14 +1,14 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import { JSX, cloneElement } from "preact";
import { boundMethod } from "autobind-decorator";
import { TextField } from "./textfield";
class NumberField extends TextField {
@boundMethod
handleInputChange(e: React.ChangeEvent<HTMLInputElement>) {
handleInputChange(e: JSX.TargetedEvent) {
const { required, onChange } = this.props;
const inputValue = (e.target as HTMLInputElement).value;
@@ -32,7 +32,7 @@ class NumberField extends TextField {
render() {
// Use the render method from TextField but add the onKeyDown handler
const renderedTextField = super.render();
return React.cloneElement(renderedTextField);
return cloneElement(renderedTextField);
}
}
+4 -2
View File
@@ -1,7 +1,8 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import { JSX } from "preact";
import * as mobxReact from "mobx-preact";
import { boundMethod } from "autobind-decorator";
import cn from "classnames";
import { If } from "tsx-control-statements/components";
@@ -13,6 +14,7 @@ interface PasswordFieldState extends TextFieldState {
passwordVisible: boolean;
}
@mobxReact.observer
class PasswordField extends TextField {
state: PasswordFieldState;
@@ -34,7 +36,7 @@ class PasswordField extends TextField {
}
@boundMethod
handleInputChange(e: React.ChangeEvent<HTMLInputElement>) {
handleInputChange(e: JSX.TargetedEvent<HTMLInputElement>) {
// Call the parent handleInputChange method
super.handleInputChange(e);
}
+8 -7
View File
@@ -1,28 +1,29 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobxReact from "mobx-react";
import { RefObject, JSX } from "preact";
import React, { PureComponent, ReactNode } from "preact/compat";
import * as mobxReact from "mobx-preact";
import * as mobx from "mobx";
import { boundMethod } from "autobind-decorator";
import cn from "classnames";
import { GlobalCommandRunner, SidebarModel } from "@/models";
import { SidebarModel } from "@/models";
import { MagicLayout } from "@/app/magiclayout";
import "./resizablesidebar.less";
interface ResizableSidebarProps {
parentRef: React.RefObject<HTMLElement>;
parentRef: RefObject<HTMLElement>;
position: "left" | "right";
model: SidebarModel;
enableSnap?: boolean;
className?: string;
children?: (toggleCollapsed: () => void) => React.ReactNode;
children?: (toggleCollapsed: () => void) => ReactNode;
toggleCollapse?: () => void;
}
@mobxReact.observer
class ResizableSidebar extends React.PureComponent<ResizableSidebarProps> {
class ResizableSidebar extends PureComponent<ResizableSidebarProps> {
resizeStartWidth: number = 0;
startX: number = 0;
prevDelta: number = 0;
@@ -30,7 +31,7 @@ class ResizableSidebar extends React.PureComponent<ResizableSidebarProps> {
disposeReaction: any;
@boundMethod
startResizing(event: React.JSX.TargetedMouseEvent<HTMLDivElement>) {
startResizing(event: JSX.TargetedMouseEvent<HTMLDivElement>) {
event.preventDefault();
const { parentRef, position, model } = this.props;
+3 -3
View File
@@ -1,13 +1,13 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobxReact from "mobx-react";
import React, { PureComponent } from "preact/compat";
import * as mobxReact from "mobx-preact";
import * as mobx from "mobx";
import { boundMethod } from "autobind-decorator";
@mobxReact.observer
class SettingsError extends React.PureComponent<{ errorMessage: OV<string> }, {}> {
class SettingsError extends PureComponent<{ errorMessage: OV<string> }, {}> {
@boundMethod
dismissError(): void {
mobx.action(() => {

Some files were not shown because too many files have changed in this diff Show More