diff --git a/src/widgets/base/Float.tsx b/src/widgets/base/Float.tsx
index 3c6756a26..95a456b99 100644
--- a/src/widgets/base/Float.tsx
+++ b/src/widgets/base/Float.tsx
@@ -1,49 +1,65 @@
-import React, { useContext } from "react";
-import { InputNumber, theme } from "antd";
+import { memo, useCallback, useContext, useMemo } from "react";
+import { InputNumber, InputNumberProps, theme } from "antd";
import Field from "@/common/Field";
import { Float as FloatOoui } from "@gisce/ooui";
import { WidgetProps } from "@/types";
import { FormContext, FormContextType } from "@/context/FormContext";
+import styled from "styled-components";
const { useToken } = theme;
-export const Float = (props: WidgetProps) => {
+const { defaultAlgorithm, defaultSeed } = theme;
+
+const mapToken = defaultAlgorithm(defaultSeed);
+
+const AddonElement = memo(({ content }: { content: string }) => {
+ const { token } = useToken();
+ return
{content}
;
+});
+AddonElement.displayName = "AddonElement";
+
+export const Float = memo((props: WidgetProps) => {
const { ooui } = props;
const { id, decimalDigits, readOnly, required } = ooui as FloatOoui;
- const { token } = useToken();
- const requiredStyle =
- required && !readOnly
- ? { backgroundColor: token.colorPrimaryBg }
- : undefined;
- const formContext = useContext(FormContext) as FormContextType;
- const { elementHasLostFocus } = formContext || {};
+ const { elementHasLostFocus } = useContext(FormContext) as FormContextType;
+
+ const isRequired = useMemo(() => required && !readOnly, [required, readOnly]);
+
+ const Component: React.ComponentType = useMemo(
+ () => (isRequired ? RequiredFloat : InputNumber),
+ [isRequired],
+ );
+
+ const renderAddonElement = useCallback((content?: string) => {
+ return content ? : null;
+ }, []);
+
+ const formatter = useCallback((value: any) => {
+ return `${value}`.replace(/[^0-9.-]+/g, "");
+ }, []);
return (
-
- {ooui.prefix}
- ) : null
- }
- addonAfter={
- ooui.suffix ? (
- {ooui.suffix}
- ) : null
- }
+
+ {
- return `${value}`.replace(/[^0-9.-]+/g, "");
- }}
- decimalSeparator={"."}
+ formatter={formatter}
+ decimalSeparator="."
onBlur={elementHasLostFocus}
wheel={false}
/>
);
-};
+});
+Float.displayName = "Float";
+
+const RequiredFloat = styled(InputNumber)`
+ &.ant-input-number {
+ background-color: ${mapToken.colorPrimaryBg};
+ }
+`;