瀏覽代碼

refactor code base on reviews

namnguyen 11 月之前
父節點
當前提交
a9d3dd8d01

+ 8 - 8
frontend/taipy-gui/src/components/Taipy/Metric.tsx

@@ -13,11 +13,11 @@
 
 import React, {CSSProperties, lazy, Suspense, useMemo} from 'react';
 import {Data} from "plotly.js";
+import Box from "@mui/material/Box";
+import Skeleton from "@mui/material/Skeleton";
 import {useClassNames, useDynamicJsonProperty, useDynamicProperty} from "../../utils/hooks";
 import {extractPrefix, extractSuffix, sprintfToD3Converter} from "../../utils/formatConversion";
 import {TaipyBaseProps, TaipyHoverProps} from "./utils";
-import Box from "@mui/material/Box";
-import Skeleton from "@mui/material/Skeleton";
 
 const Plot = lazy(() => import("react-plotly.js"));
 
@@ -67,15 +67,15 @@ const Metric = (props: MetricProps) => {
                 type: "indicator",
                 mode: "gauge" + (showValue ? "+number" : "") + (delta !== undefined ? "+delta" : ""),
                 number: {
-                    prefix: extractPrefix(props.format !== undefined ? props.format : ""),
-                    suffix: extractSuffix(props.format !== undefined ? props.format : ""),
-                    valueformat: sprintfToD3Converter(props.format !== undefined ? props.format : ""),
+                    prefix: extractPrefix(props.format),
+                    suffix: extractSuffix(props.format),
+                    valueformat: sprintfToD3Converter(props.format),
                 },
                 delta: {
                     reference: typeof value === 'number' && typeof delta === 'number' ? value - delta : undefined,
-                    prefix: extractPrefix(props.deltaFormat !== undefined ? props.deltaFormat : ""),
-                    suffix: extractSuffix(props.deltaFormat !== undefined ? props.deltaFormat : ""),
-                    valueformat: sprintfToD3Converter(props.deltaFormat !== undefined ? props.deltaFormat : "")
+                    prefix: extractPrefix(props.deltaFormat),
+                    suffix: extractSuffix(props.deltaFormat),
+                    valueformat: sprintfToD3Converter(props.deltaFormat)
                 },
                 gauge: {
                     axis: {

+ 17 - 33
frontend/taipy-gui/src/utils/formatConversion.ts

@@ -20,12 +20,12 @@ const re = {
     placeholder: /^\x25?(?:\.(\d+))?([b-giostuvxX])/, // Matches placeholders
 };
 
-/**
- * Parses a sprintf format string and returns a parse tree.
- * @param fmt The sprintf format string.
- * @returns The parse tree representing the structure of the format string.
- */
-const sprintf_parse = (fmt: string) => {
+const precisionFormat = (precision?: string, specifier?: string): string => {
+    // Default to precision of 2 if not specified
+    return "." + (precision?.slice(1) ?? "2") + specifier;
+}
+
+const sprintfParse = (fmt?: string): (string | { placeholder: string; })[] => {
     let _fmt = fmt;
     let match;
     const parse_tree = [];
@@ -54,18 +54,8 @@ const sprintf_parse = (fmt: string) => {
     return parse_tree;
 }
 
-/**
- * Converts sprintf format string to a D3 format string.
- * @param format The sprintf format string.
- * @returns The D3 format string.
- */
-export const sprintfToD3Converter = (format: string) => {
-    const precisionFormat = (precision: string | undefined, specifier: string) => {
-        // Default to precision of 2 if not specified
-        return "." + (precision?.slice(1) ?? "2") + specifier;
-    }
-
-    const sprintf_fmt_arr = sprintf_parse(format);
+export const sprintfToD3Converter = (fmt?: string): string => {
+    const sprintf_fmt_arr = sprintfParse(fmt);
     const objectIndex = sprintf_fmt_arr.findIndex((element) => typeof element === 'object');
     let placeholderValue;
 
@@ -73,7 +63,11 @@ export const sprintfToD3Converter = (format: string) => {
         placeholderValue = (sprintf_fmt_arr[objectIndex] as { placeholder: string }).placeholder;
     }
 
-    return placeholderValue?.replace(/%([0-9]*)([.][0-9]+)?([bdieufgoxX])/g, (match, width, precision, type) => {
+    if (placeholderValue === undefined) {
+        return "";
+    }
+
+    return placeholderValue.replace(/%([0-9]*)([.][0-9]+)?([bdieufgoxX])/g, (match, width, precision, type) => {
         switch (type) {
             case "b":
             case "d":
@@ -96,24 +90,14 @@ export const sprintfToD3Converter = (format: string) => {
     });
 }
 
-/**
- * Extracts the prefix from a sprintf format string.
- * @param format The sprintf format string.
- * @returns The prefix.
- */
-export const extractPrefix = (format: string) => {
-    const sprintf_fmt_arr = sprintf_parse(format);
+export const extractPrefix = (fmt?: string): string => {
+    const sprintf_fmt_arr = sprintfParse(fmt);
     const objectIndex = sprintf_fmt_arr.findIndex((element) => typeof element === 'object');
     return sprintf_fmt_arr.slice(0, objectIndex).join('');
 }
 
-/**
- * Extracts the suffix from a sprintf format string.
- * @param format The sprintf format string.
- * @returns The suffix.
- */
-export const extractSuffix = (format: string) => {
-    const sprintf_fmt_arr = sprintf_parse(format);
+export const extractSuffix = (fmt?: string): string => {
+    const sprintf_fmt_arr = sprintfParse(fmt);
     const objectIndex = sprintf_fmt_arr.findIndex((element) => typeof element === 'object');
     return sprintf_fmt_arr.slice(objectIndex + 1).join('');
 }

+ 0 - 1
pytest.ini

@@ -9,6 +9,5 @@ filterwarnings =
     ignore::FutureWarning:pyarrow
 markers =
     teste2e:End-to-end tests
-    extension:Taipy GUI Extension tests
     orchestrator_dispatcher:Orchestrator dispatcher tests
     standalone:Tests starting a standalone dispatcher thread

+ 0 - 2
taipy/gui/viselements.json

@@ -899,13 +899,11 @@
                     {
                         "name": "format",
                         "type": "str",
-                        "default_value": "None",
                         "doc": "The format to use when displaying the value.<br/>This uses the <code>printf</code> syntax."
                     },
                     {
                         "name": "delta_format",
                         "type": "str",
-                        "default_value": "None",
                         "doc": "The format to use when displaying the delta value.<br/>This uses the <code>printf</code> syntax."
                     }
                 ]

+ 13 - 13
tests/gui/e2e/test_metric_indicator.py

@@ -64,7 +64,7 @@ def test_show_decrease_delta_value(page: Page, gui: Gui, helpers):
     assert delta_value == "▼−20"
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_show_linear_chart(page: Page, gui: Gui, helpers):
     page_md = """
 <|100|metric|delta=-20|type=linear|>
@@ -78,7 +78,7 @@ def test_show_linear_chart(page: Page, gui: Gui, helpers):
     assert chart.is_visible()
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_show_circular_chart_as_default_type(page: Page, gui: Gui, helpers):
     page_md = """
 <|100|metric|>
@@ -92,7 +92,7 @@ def test_show_circular_chart_as_default_type(page: Page, gui: Gui, helpers):
     assert chart.is_visible()
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_format_converter_integer_to_binary(page: Page, gui: Gui, helpers):
     page_md = """
 <|50|metric|show_value=True|delta=20|format=%b|>
@@ -107,7 +107,7 @@ def test_format_converter_integer_to_binary(page: Page, gui: Gui, helpers):
     assert number.text_content() == "110010"
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_format_converter_integer_to_signed_decimal_d_type(page: Page, gui: Gui, helpers):
     page_md = """
 <|50|metric|show_value=True|delta=20|format=%d|>
@@ -122,7 +122,7 @@ def test_format_converter_integer_to_signed_decimal_d_type(page: Page, gui: Gui,
     assert number.text_content() == "50"
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_format_converter_integer_to_signed_decimal_i_type(page: Page, gui: Gui, helpers):
     page_md = """
 <|50|metric|show_value=True|delta=20|format=%i|>
@@ -137,7 +137,7 @@ def test_format_converter_integer_to_signed_decimal_i_type(page: Page, gui: Gui,
     assert number.text_content() == "50"
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_format_converter_yields_float_using_science_notation(page: Page, gui: Gui, helpers):
     page_md = """
 <|50|metric|show_value=True|delta=20|format=%e|>
@@ -152,7 +152,7 @@ def test_format_converter_yields_float_using_science_notation(page: Page, gui: G
     assert number.text_content() == "5.000000e+1"
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_format_converter_yields_float_using_fixed_point_notation_f_type(page: Page, gui: Gui, helpers):
     page_md = """
 <|99.99|metric|show_value=True|delta=20|format=%.2f|>
@@ -167,7 +167,7 @@ def test_format_converter_yields_float_using_fixed_point_notation_f_type(page: P
     assert number.text_content() == "99.99"
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_format_converter_yields_float_using_fixed_point_notation_g_type(page: Page, gui: Gui, helpers):
     page_md = """
 <|50.555|metric|show_value=True|delta=20|format=%.2g|>
@@ -182,7 +182,7 @@ def test_format_converter_yields_float_using_fixed_point_notation_g_type(page: P
     assert number.text_content() == "51"
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_format_converter_yields_integer_as_octal(page: Page, gui: Gui, helpers):
     page_md = """
 <|50|metric|show_value=True|delta=20|format=%o|>
@@ -197,7 +197,7 @@ def test_format_converter_yields_integer_as_octal(page: Page, gui: Gui, helpers)
     assert number.text_content() == "62"
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_format_converter_yields_integer_as_hexadecimal(page: Page, gui: Gui, helpers):
     page_md = """
 <|50|metric|show_value=True|delta=20|format=%x|>
@@ -212,7 +212,7 @@ def test_format_converter_yields_integer_as_hexadecimal(page: Page, gui: Gui, he
     assert number.text_content() == "32"
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_format_converter_yields_integer_as_uppercase_hexadecimal(page: Page, gui: Gui, helpers):
     page_md = """
 <|50|metric|show_value=True|delta=20|format=%X|>
@@ -227,7 +227,7 @@ def test_format_converter_yields_integer_as_uppercase_hexadecimal(page: Page, gu
     assert number.text_content() == "32"
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_format_converter_yields_integer_as_unsigned_decimal(page: Page, gui: Gui, helpers):
     page_md = """
 <|-50|metric|show_value=True|delta=20|format=%u|>
@@ -242,7 +242,7 @@ def test_format_converter_yields_integer_as_unsigned_decimal(page: Page, gui: Gu
     assert number.text_content() == "(50)"
 
 
-@pytest.mark.extension
+@pytest.mark.teste2e
 def test_format_converter_yields_edge_cases(page: Page, gui: Gui, helpers):
     page_md = """
 <|50|metric|show_value=True|format=a%%b%dc%%d|>