this repo has no description

moonbase: Implement multiline text input for settings

Changed files
+80 -1
packages
core-extensions
src
moonbase
webpackModules
ui
extensions
types
src
coreExtensions
+2 -1
packages/core-extensions/src/moonbase/index.tsx
···
};
export const styles = [
-
".moonbase-settings > :first-child { margin-top: 0px; }"
];
···
};
export const styles = [
+
".moonbase-settings > :first-child { margin-top: 0px; }",
+
"textarea.moonbase-resizeable { resize: vertical }"
];
+26
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/settings.tsx
···
);
}
function Select({ ext, name, setting, disabled }: SettingsProps) {
const { FormItem, FormText, SingleSelect } = CommonComponents;
const { value, displayName, description } = useConfigEntry<string>(
···
[ExtensionSettingType.Boolean]: Boolean,
[ExtensionSettingType.Number]: Number,
[ExtensionSettingType.String]: String,
[ExtensionSettingType.Select]: Select,
[ExtensionSettingType.MultiSelect]: MultiSelect,
[ExtensionSettingType.List]: List,
···
);
}
+
function MultilineTextInput({ ext, name, setting, disabled }: SettingsProps) {
+
const { FormItem, FormText, TextArea } = CommonComponents;
+
const { value, displayName, description } = useConfigEntry<string>(
+
ext.id,
+
name
+
);
+
+
return (
+
<FormItem className={Margins.marginTop20} title={displayName}>
+
{description && (
+
<FormText className={Margins.marginBottom8}>{description}</FormText>
+
)}
+
<TextArea
+
rows={5}
+
value={value ?? ""}
+
className={"moonbase-resizeable"}
+
onChange={(value: string) => {
+
if (disabled) return;
+
MoonbaseSettingsStore.setExtensionConfig(ext.id, name, value);
+
}}
+
/>
+
</FormItem>
+
);
+
}
+
function Select({ ext, name, setting, disabled }: SettingsProps) {
const { FormItem, FormText, SingleSelect } = CommonComponents;
const { value, displayName, description } = useConfigEntry<string>(
···
[ExtensionSettingType.Boolean]: Boolean,
[ExtensionSettingType.Number]: Number,
[ExtensionSettingType.String]: String,
+
[ExtensionSettingType.MultilineTextInput]: MultilineTextInput,
[ExtensionSettingType.Select]: Select,
[ExtensionSettingType.MultiSelect]: MultiSelect,
[ExtensionSettingType.List]: List,
+7
packages/types/src/config.ts
···
Boolean = "boolean",
Number = "number",
String = "string",
Select = "select",
MultiSelect = "multiselect",
List = "list",
···
export type StringSettingType = {
type: ExtensionSettingType.String;
default?: string;
};
···
| BooleanSettingType
| NumberSettingType
| StringSettingType
| SelectSettingType
| MultiSelectSettingType
| ListSettingType
···
Boolean = "boolean",
Number = "number",
String = "string",
+
MultilineTextInput = "multilinetextinput",
Select = "select",
MultiSelect = "multiselect",
List = "list",
···
export type StringSettingType = {
type: ExtensionSettingType.String;
+
default?: string;
+
};
+
+
export type MultilineTextInputSettingType = {
+
type: ExtensionSettingType.MultilineTextInput;
default?: string;
};
···
| BooleanSettingType
| NumberSettingType
| StringSettingType
+
| MultilineTextInputSettingType
| SelectSettingType
| MultiSelectSettingType
| ListSettingType
+45
packages/types/src/coreExtensions/components.ts
···
Sizes: typeof TextInputSizes;
}
export enum FormTextTypes {
DEFAULT = "default",
DESCRIPTION = "description",
···
}>
>;
TextInput: TextInput;
FormDivider: ComponentClass<any>;
FormSection: ComponentClass<
PropsWithChildren<{
···
Sizes: typeof TextInputSizes;
}
+
export enum TextAreaAutoComplete {
+
ON = "on",
+
OFF = "off"
+
}
+
+
export enum TextAreaWrap {
+
HARD = "hard",
+
SOFT = "soft",
+
OFF = "off"
+
}
+
+
interface TextArea
+
extends ComponentClass<
+
PropsWithoutRef<{
+
value?: string;
+
defaultValue?: string;
+
autoComplete?: TextAreaAutoComplete;
+
autoFocus?: boolean;
+
cols?: number;
+
disabled?: boolean;
+
form?: string;
+
maxLength?: number;
+
minLength?: number;
+
name?: string;
+
onChange?: (value: string, name: string) => void;
+
onChangeCapture?: (value: string, name: string) => void;
+
onInput?: (value: string, name: string) => void;
+
onInputCapture?: (value: string, name: string) => void;
+
onInvalid?: (value: string, name: string) => void;
+
onInvalidCapture?: (value: string, name: string) => void;
+
onSelect?: (value: string, name: string) => void;
+
onSelectCapture?: (value: string, name: string) => void;
+
placeholder?: string;
+
readOnly?: boolean;
+
required?: boolean;
+
rows?: number;
+
wrap?: TextAreaWrap;
+
className?: string;
+
}>
+
> {
+
AutoCompletes: typeof TextAreaAutoComplete;
+
Wraps: typeof TextAreaWrap;
+
}
+
export enum FormTextTypes {
DEFAULT = "default",
DESCRIPTION = "description",
···
}>
>;
TextInput: TextInput;
+
TextArea: TextArea;
FormDivider: ComponentClass<any>;
FormSection: ComponentClass<
PropsWithChildren<{