artemis-console-extension/artemis-extension/packages/artemis-console-plugin/src/ArtemisPreferences.tsx (184 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { CardBody, Flex, FlexItem, Form, FormGroup, FormSection, MenuToggle, MenuToggleElement, Select, SelectList, SelectOption, TextInput } from '@patternfly/react-core'
import React, { FormEvent, useState } from 'react'
import { artemisPreferencesService, ArtemisOptions } from './artemis-preferences-service'
import { Icon, Tooltip } from '@patternfly/react-core'
import { HelpIcon } from '@patternfly/react-icons'
export const ArtemisPreferences: React.FunctionComponent = () => (
<CardBody>
<Form isHorizontal>
<ArtemisPreferencesForm />
</Form>
</CardBody>
)
export const TooltipHelpIcon = ({ tooltip }: { tooltip: string }) => (
<Icon size='md'>
<Tooltip content={tooltip}>
<HelpIcon />
</Tooltip>
</Icon>
)
type FormatType = {
id: string;
description: string;
index: number;
}
const ArtemisPreferencesForm: React.FunctionComponent = () => {
const off: FormatType = { id: "off", description: "Off", index: 99 };
const text: FormatType = { id: "text", description: "Text", index: 16 }
const decimal: FormatType = { id: "decimal", description: "Decimal", index: 8 }
const hex: FormatType = { id: "hex", description: "Hex", index: 4 }
const decimaltext: FormatType = { id: "decimaltext", description: "Decimal and Text", index: 2 }
const hexttext: FormatType = { id: "hexttext", description: "Hex and Text", index: 1 }
const formats = [off, text, decimal, hex, decimaltext, hexttext];
const [artemisPreferences, setArtemisPreferences] = useState(artemisPreferencesService.loadArtemisPreferences())
const [isDropdownOpen, setDropdownOpen] = React.useState(false);
const format = formats.find(format => format.index === artemisPreferences.artemisBrowseBytesMessages);
const [selectedFormat, setSelectedFormat] = useState(format ? format.description : off.description);
const [selectedPageSize, setSelectedPageSize] = useState(artemisPreferencesService.loadArtemisPreferences().artemisDefaultPageSize)
const [artemisMaxDiagramAddressSize, setArtemisMaxDiagramAddressSize] = useState(artemisPreferencesService.loadArtemisPreferences().artemisMaxDiagramAddressSize)
const [isPageSizeDropdownOpen, setPageSizeDropdownOpen] = React.useState(false);
const updatePreferences = (value: string | number | boolean, key: keyof ArtemisOptions): void => {
const updatedPreferences = { ...artemisPreferences, ...{ [key]: value } }
artemisPreferencesService.saveArtemisPreferences(updatedPreferences)
setArtemisPreferences(updatedPreferences)
}
const updateStringValueFor = (key: keyof ArtemisOptions): ((event: React.FormEvent<HTMLInputElement>, value: string) => void) => {
return (_event: React.FormEvent<HTMLInputElement>, value: string) => {
if (!value) return
updatePreferences(value, key)
}
}
const handleToggle = () => {
setDropdownOpen(!isDropdownOpen)
}
const handlePageSizeToggle = () => {
setPageSizeDropdownOpen(!isPageSizeDropdownOpen)
}
const handleFormatChange = (event?: React.MouseEvent<Element, MouseEvent>, value?: string | number) => {
setSelectedFormat(value as string);
setDropdownOpen(false);
const format = formats.find(format => format.description === value);
if (format) {
updatePreferences(format?.index, 'artemisBrowseBytesMessages');
}
}
const handlePageSizeChange = (event?: React.MouseEvent<Element, MouseEvent>, value?: string | number) => {
setSelectedPageSize(value as number);
setPageSizeDropdownOpen(false);
updatePreferences(value as number, 'artemisDefaultPageSize');
artemisPreferencesService.resetPageSizes();
}
const handleMaxDiagramAddressSize = (event: FormEvent<HTMLInputElement>, value: string) => {
setArtemisMaxDiagramAddressSize(Number(value));
updatePreferences(Number(value), 'artemisMaxDiagramAddressSize');
}
return (
<FormSection title='Artemis' titleElement='h2'>
<FormGroup
hasNoPaddingTop
label='Dead-letter address regex'
fieldId='artemis-form-artemisDLQ'
labelIcon={
<TooltipHelpIcon tooltip='A regular expression to match one or more dead-letter addresses' />
}
>
<TextInput
id='artemis-input-artemisDLQ'
type='text'
value={artemisPreferences.artemisDLQ}
onChange={updateStringValueFor('artemisDLQ')}
/>
</FormGroup>
<FormGroup
hasNoPaddingTop
label='Expiry address regex'
fieldId='artemis-form-expiry'
labelIcon={<TooltipHelpIcon tooltip='A regular expression to match one or more expiry addresses' />}
>
<TextInput
id='artemis-input-expiry'
type='text'
value={artemisPreferences.artemisExpiryQueue}
onChange={updateStringValueFor('artemisExpiryQueue')}
/>
</FormGroup>
<FormGroup
hasNoPaddingTop
label='Browse Bytes Messages'
fieldId='artemis-form-showJMXView'
labelIcon={
<TooltipHelpIcon tooltip='Format in which a BytesMessage body is shown' />
}>
<Flex>
<FlexItem flex={{ default: 'flexNone', md: 'flex_2' }}>
{' '}
<Select
toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
<MenuToggle isFullWidth role='menu' ref={toggleRef} onClick={handleToggle}>
{selectedFormat}
</MenuToggle>
)}
aria-label='Select Format'
onSelect={handleFormatChange}
selected={selectedFormat}
isOpen={isDropdownOpen}
>
<SelectList>
<SelectOption label={off.id} value={off.description}>{off.description}</SelectOption>
<SelectOption label={text.id} value={text.description}>{text.description}</SelectOption>
<SelectOption label={decimal.id} value={decimal.description}>{decimal.description}</SelectOption>
<SelectOption label={hex.id} value={hex.description}>{hex.description}</SelectOption>
<SelectOption label={decimaltext.id} value={decimaltext.description}>{decimaltext.description}</SelectOption>
<SelectOption label={hexttext.id} value={hexttext.description}>{hexttext.description}</SelectOption>
</SelectList>
</Select>
</FlexItem>
</Flex>
</FormGroup>
<FormGroup
hasNoPaddingTop
label='Default Page Size'
fieldId='artemis-form-default-pagesize'
labelIcon={
<TooltipHelpIcon tooltip='he default page size to use for Artemis table views. This will replace all page sizes to the default' />
}>
<Flex>
<FlexItem flex={{ default: 'flexNone', md: 'flex_2' }}>
{' '}
<Select
toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
<MenuToggle isFullWidth role='menu' ref={toggleRef} onClick={handlePageSizeToggle}>
{selectedPageSize}
</MenuToggle>
)}
aria-label='Select Format'
onSelect={handlePageSizeChange}
selected={selectedPageSize}
isOpen={isPageSizeDropdownOpen}
>
<SelectList>
<SelectOption label={"10"} value={"10"}>{"10"}</SelectOption>
<SelectOption label={"20"} value={"20"}>{"20"}</SelectOption>
<SelectOption label={"50"} value={"50"}>{"50"}</SelectOption>
<SelectOption label={"100"} value={"100"}>{"100"}</SelectOption>
</SelectList>
</Select>
</FlexItem>
</Flex>
</FormGroup>
<FormGroup
hasNoPaddingTop
label='Max Diagram Address Size'
fieldId='artemis-form-diagram'
labelIcon={<TooltipHelpIcon tooltip='How many addresses will be loaded in the broker diagram tab' />}
>
<TextInput
id='artemis-input-diagram'
type='number'
value={artemisMaxDiagramAddressSize}
onChange={handleMaxDiagramAddressSize}
/>
</FormGroup>
</FormSection>
)
}