mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
* Add check for incomplete SelfSubjectRulesReview to fix GKE Signed-off-by: Sebastian Malton <sebastian@malton.name> * Adding namespaced for KubeApiResource Signed-off-by: Sebastian Malton <sebastian@malton.name> * Refactoring of AuthorizationNamespaceReview Signed-off-by: Sebastian Malton <sebastian@malton.name> * Removing dead code Signed-off-by: Sebastian Malton <sebastian@malton.name> * Refactoring ListApiResources Signed-off-by: Sebastian Malton <sebastian@malton.name> * Extract ClusterContext into deps for KubeObjectStore to fix circular import Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix remaining type errors Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix crash in frame by consolidating setup into runnables Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix type errors and remove dead code Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix core resources not showing up Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix namespaces not being shown Signed-off-by: Sebastian Malton <sebastian@malton.name> * Simplify ClusterContext to remove something only NamespaceStore needs Signed-off-by: Sebastian Malton <sebastian@malton.name> * Make sure the public API doesn't change Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix lint Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fixing namespace-select-filter tests Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix other tests requiring overrides Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix kludge in cluster-frame tests Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix remaining test failures Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix integration test due to incorrect casting Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix integration test and kube watches not working at all Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix secret details test Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix lint Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix non-ApplicationBuilder tests by adding overrides Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix crash due to trying to read hostedCluster too soon Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix crash due to timing issues - Make injectable phases more explicit for renderer Signed-off-by: Sebastian Malton <sebastian@malton.name> Signed-off-by: Sebastian Malton <sebastian@malton.name>
112 lines
2.7 KiB
TypeScript
112 lines
2.7 KiB
TypeScript
/**
|
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
*/
|
|
|
|
import "./search-input.scss";
|
|
|
|
import React, { createRef } from "react";
|
|
import { observer } from "mobx-react";
|
|
import { cssNames, autoBind } from "../../utils";
|
|
import { Icon } from "../icon";
|
|
import type { InputProps } from "./input";
|
|
import { Input } from "./input";
|
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
|
import isMacInjectable from "../../../common/vars/is-mac.injectable";
|
|
|
|
export interface SearchInputProps extends InputProps {
|
|
compact?: boolean; // show only search-icon when not focused
|
|
bindGlobalFocusHotkey?: boolean;
|
|
showClearIcon?: boolean;
|
|
onClear?(): void;
|
|
}
|
|
|
|
const defaultProps: Partial<SearchInputProps> = {
|
|
autoFocus: true,
|
|
bindGlobalFocusHotkey: true,
|
|
showClearIcon: true,
|
|
placeholder: "Search...",
|
|
};
|
|
|
|
interface Dependencies {
|
|
isMac: boolean;
|
|
}
|
|
|
|
@observer
|
|
class NonInjectedSearchInput extends React.Component<SearchInputProps & Dependencies> {
|
|
static defaultProps = defaultProps as object;
|
|
|
|
private inputRef = createRef<Input>();
|
|
|
|
constructor(props: SearchInputProps & Dependencies) {
|
|
super(props);
|
|
autoBind(this);
|
|
}
|
|
|
|
componentDidMount() {
|
|
if (!this.props.bindGlobalFocusHotkey) return;
|
|
window.addEventListener("keydown", this.onGlobalKey);
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
window.removeEventListener("keydown", this.onGlobalKey);
|
|
}
|
|
|
|
onGlobalKey(evt: KeyboardEvent) {
|
|
if (evt.key === "f" && (this.props.isMac ? evt.metaKey : evt.ctrlKey)) {
|
|
this.inputRef.current?.focus();
|
|
}
|
|
}
|
|
|
|
onKeyDown(evt: React.KeyboardEvent<any>) {
|
|
this.props.onKeyDown?.(evt);
|
|
|
|
if (evt.nativeEvent.code === "Escape") {
|
|
this.clear();
|
|
evt.stopPropagation();
|
|
}
|
|
}
|
|
|
|
clear() {
|
|
if (this.props.onClear) {
|
|
this.props.onClear();
|
|
} else {
|
|
this.inputRef.current?.setValue("");
|
|
}
|
|
}
|
|
|
|
render() {
|
|
const { className, compact, onClear, showClearIcon, bindGlobalFocusHotkey, value, isMac, ...inputProps } = this.props;
|
|
let rightIcon = <Icon small material="search"/>;
|
|
|
|
if (showClearIcon && value) {
|
|
rightIcon = (
|
|
<Icon
|
|
small
|
|
material="close"
|
|
onClick={this.clear}
|
|
/>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<Input
|
|
{...inputProps}
|
|
className={cssNames("SearchInput", className, { compact })}
|
|
value={value}
|
|
onKeyDown={this.onKeyDown}
|
|
iconRight={rightIcon}
|
|
ref={this.inputRef}
|
|
blurOnEnter={false}
|
|
/>
|
|
);
|
|
}
|
|
}
|
|
|
|
export const SearchInput = withInjectables<Dependencies, SearchInputProps>(NonInjectedSearchInput, {
|
|
getProps: (di, props) => ({
|
|
...props,
|
|
isMac: di.inject(isMacInjectable),
|
|
}),
|
|
});
|