UTI: Move common functions to utils. 19/36719/1
authorTibor Frank <tifrank@cisco.com>
Thu, 21 Jul 2022 11:40:50 +0000 (13:40 +0200)
committerTibor Frank <tifrank@cisco.com>
Thu, 21 Jul 2022 11:40:50 +0000 (13:40 +0200)
Change-Id: Ic390359afcea7855a964f8f9793f6d17a5b9b616
Signed-off-by: Tibor Frank <tifrank@cisco.com>
resources/tools/dash/app/pal/news/layout.py
resources/tools/dash/app/pal/report/graphs.py
resources/tools/dash/app/pal/report/layout.py
resources/tools/dash/app/pal/stats/layout.py
resources/tools/dash/app/pal/trending/graphs.py
resources/tools/dash/app/pal/trending/layout.py
resources/tools/dash/app/pal/utils/utils.py

index c9f2808..6743b5a 100644 (file)
@@ -28,7 +28,7 @@ from copy import deepcopy
 
 from ..data.data import Data
 from ..utils.constants import Constants as C
-from ..utils.utils import classify_anomalies
+from ..utils.utils import classify_anomalies, show_tooltip
 from ..data.data import Data
 from .tables import table_news
 
@@ -389,43 +389,6 @@ class Layout:
                 lst_job[1], lst_job[3], lst_job[4]))
         }
 
-    def _show_tooltip(self, id: str, title: str,
-            clipboard_id: str=None) -> list:
-        """Generate list of elements to display a text (e.g. a title) with a
-        tooltip and optionaly with Copy&Paste icon and the clipboard
-        functionality enabled.
-
-        :param id: Tooltip ID.
-        :param title: A text for which the tooltip will be displayed.
-        :param clipboard_id: If defined, a Copy&Paste icon is displayed and the
-            clipboard functionality is enabled.
-        :type id: str
-        :type title: str
-        :type clipboard_id: str
-        :returns: List of elements to display a text with a tooltip and
-            optionaly with Copy&Paste icon.
-        :rtype: list
-        """
-
-        return [
-            dcc.Clipboard(target_id=clipboard_id, title="Copy URL") \
-                if clipboard_id else str(),
-            f"{title} ",
-            dbc.Badge(
-                id=id,
-                children="?",
-                pill=True,
-                color="white",
-                text_color="info",
-                class_name="border ms-1",
-            ),
-            dbc.Tooltip(
-                children=self._tooltips.get(id, str()),
-                target=id,
-                placement="auto"
-            )
-        ]
-
     def add_content(self):
         """Top level method which generated the web page.
 
@@ -552,7 +515,7 @@ class Layout:
                             children=[
                                 dbc.Label(
                                     class_name="p-0",
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-dut", "Device under Test")
                                 ),
                                 dbc.Row(
@@ -570,7 +533,7 @@ class Layout:
                             children=[
                                 dbc.Label(
                                     class_name="p-0",
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-ttype", "Test Type"),
                                 ),
                                 dbc.RadioItems(
@@ -586,7 +549,7 @@ class Layout:
                             children=[
                                 dbc.Label(
                                     class_name="p-0",
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-cadence", "Cadence"),
                                 ),
                                 dbc.RadioItems(
@@ -602,7 +565,7 @@ class Layout:
                             children=[
                                 dbc.Label(
                                     class_name="p-0",
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-tbed", "Test Bed"),
                                 ),
                                 dbc.Select(
index c5d8f8f..4cd9287 100644 (file)
@@ -21,12 +21,7 @@ import pandas as pd
 from copy import deepcopy
 
 from ..utils.constants import Constants as C
-
-
-def _get_color(idx: int) -> str:
-    """
-    """
-    return C.PLOT_COLORS[idx % len(C.PLOT_COLORS)]
+from ..utils.utils import get_color
 
 
 def get_short_version(version: str, dut_type: str="vpp") -> str:
@@ -146,7 +141,7 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict,
             hoverinfo=u"y+name",
             boxpoints="all",
             jitter=0.3,
-            marker=dict(color=_get_color(idx))
+            marker=dict(color=get_color(idx))
         )
         tput_traces.append(go.Box(**tput_kwargs))
         show_tput = True
@@ -168,7 +163,7 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict,
                 hoverinfo="all",
                 boxpoints="all",
                 jitter=0.3,
-                marker=dict(color=_get_color(idx))
+                marker=dict(color=get_color(idx))
             )
             x_lat.append(idx + 1)
             lat_traces.append(go.Box(**lat_kwargs))
index 164f2d4..7afa0ea 100644 (file)
@@ -28,7 +28,9 @@ from copy import deepcopy
 from ast import literal_eval
 
 from ..utils.constants import Constants as C
-from ..utils.url_processing import url_decode, url_encode
+from ..utils.utils import show_tooltip, label, sync_checklists, list_tests, \
+    gen_new_url
+from ..utils.url_processing import url_decode
 from ..data.data import Data
 from .graphs import graph_iterative, table_comparison, get_short_version
 
@@ -189,32 +191,6 @@ class Layout:
     def layout(self):
         return self._graph_layout
 
-    def label(self, key: str) -> str:
-        return C.LABELS.get(key, key)
-
-    def _show_tooltip(self, id: str, title: str,
-            clipboard_id: str=None) -> list:
-        """
-        """
-        return [
-            dcc.Clipboard(target_id=clipboard_id, title="Copy URL") \
-                if clipboard_id else str(),
-            f"{title} ",
-            dbc.Badge(
-                id=id,
-                children="?",
-                pill=True,
-                color="white",
-                text_color="info",
-                class_name="border ms-1",
-            ),
-            dbc.Tooltip(
-                children=self._tooltips.get(id, str()),
-                target=id,
-                placement="auto"
-            )
-        ]
-
     def add_content(self):
         """
         """
@@ -358,7 +334,7 @@ class Layout:
                         dbc.InputGroup(
                             [
                                 dbc.InputGroupText(
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-release", "CSIT Release")
                                 ),
                                 dbc.Select(
@@ -384,7 +360,7 @@ class Layout:
                         dbc.InputGroup(
                             [
                                 dbc.InputGroupText(
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-dut", "DUT")
                                 ),
                                 dbc.Select(
@@ -405,7 +381,7 @@ class Layout:
                         dbc.InputGroup(
                             [
                                 dbc.InputGroupText(
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-dut-ver", "DUT Version")
                                 ),
                                 dbc.Select(
@@ -427,7 +403,7 @@ class Layout:
                         dbc.InputGroup(
                             [
                                 dbc.InputGroupText(
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-infra", "Infra")
                                 ),
                                 dbc.Select(
@@ -449,7 +425,7 @@ class Layout:
                         dbc.InputGroup(
                             [
                                 dbc.InputGroupText(
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-area", "Area")
                                 ),
                                 dbc.Select(
@@ -469,7 +445,7 @@ class Layout:
                         dbc.InputGroup(
                             [
                                 dbc.InputGroupText(
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-test", "Test")
                                 ),
                                 dbc.Select(
@@ -488,7 +464,7 @@ class Layout:
                     class_name="gy-1",
                     children=[
                         dbc.Label(
-                            children=self._show_tooltip(
+                            children=show_tooltip(self._tooltips,
                                 "help-framesize", "Frame Size"),
                             class_name="p-0"
                         ),
@@ -519,7 +495,7 @@ class Layout:
                     class_name="gy-1",
                     children=[
                         dbc.Label(
-                            children=self._show_tooltip(
+                            children=show_tooltip(self._tooltips,
                                 "help-cores", "Number of Cores"),
                             class_name="p-0"
                         ),
@@ -550,7 +526,7 @@ class Layout:
                     class_name="gy-1",
                     children=[
                         dbc.Label(
-                            children=self._show_tooltip(
+                            children=show_tooltip(self._tooltips,
                                 "help-ttype", "Test Type"),
                             class_name="p-0"
                         ),
@@ -581,7 +557,7 @@ class Layout:
                     class_name="gy-1",
                     children=[
                         dbc.Label(
-                            children=self._show_tooltip(
+                            children=show_tooltip(self._tooltips,
                                 "help-normalize", "Normalize"),
                             class_name="p-0"
                         ),
@@ -731,26 +707,6 @@ class Layout:
         def values(self) -> tuple:
             return tuple(self._panel.values())
 
-    @staticmethod
-    def _sync_checklists(opt: list, sel: list, all: list, id: str) -> tuple:
-        """
-        """
-        options = {v["value"] for v in opt}
-        if id =="all":
-            sel = list(options) if all else list()
-        else:
-            all = ["all", ] if set(sel) == options else list()
-        return sel, all
-
-    @staticmethod
-    def _list_tests(selection: dict) -> list:
-        """Display selected tests with checkboxes
-        """
-        if selection:
-            return [{"label": v["id"], "value": v["id"]} for v in selection]
-        else:
-            return list()
-
     def callbacks(self, app):
 
         def _generate_plotting_area(figs: tuple, table: pd.DataFrame,
@@ -779,7 +735,7 @@ class Layout:
                             dcc.Loading(children=[
                                 dbc.Button(
                                     id="btn-download-data",
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-download", "Download Data"),
                                     class_name="me-1",
                                     color="info"
@@ -796,7 +752,7 @@ class Layout:
                                 children=[
                                     dbc.InputGroupText(
                                         style=C.URL_STYLE,
-                                        children=self._show_tooltip(
+                                        children=show_tooltip(self._tooltips,
                                             "help-url", "URL", "input-url")
                                     ),
                                     dbc.Input(
@@ -901,21 +857,6 @@ class Layout:
             """
             """
 
-            def _gen_new_url(parsed_url: dict, store_sel: list) -> str:
-
-                if parsed_url:
-                    new_url = url_encode({
-                        "scheme": parsed_url["scheme"],
-                        "netloc": parsed_url["netloc"],
-                        "path": parsed_url["path"],
-                        "params": {
-                            "store_sel": store_sel,
-                        }
-                    })
-                else:
-                    new_url = str()
-                return new_url
-
             ctrl_panel = self.ControlPanel(cp_data)
 
             # Parse the url:
@@ -1054,8 +995,7 @@ class Layout:
                     dutver = ctrl_panel.get("dd-dutver-value")
                     phy = self.spec_tbs[rls][dut][dutver][dd_phy]
                     options = sorted(
-                        [{"label": self.label(v), "value": v}
-                            for v in phy.keys()],
+                        [{"label": label(v), "value": v} for v in phy.keys()],
                         key=lambda d: d["label"]
                     )
                     disabled = False
@@ -1143,8 +1083,8 @@ class Layout:
                         "cl-testtype-all-options": C.CL_ALL_ENABLED,
                     })
             elif trigger_id == "cl-ctrl-core":
-                val_sel, val_all = self._sync_checklists(
-                    opt=ctrl_panel.get("cl-core-options"),
+                val_sel, val_all = sync_checklists(
+                    options=ctrl_panel.get("cl-core-options"),
                     sel=cl_core,
                     all=list(),
                     id=""
@@ -1154,8 +1094,8 @@ class Layout:
                     "cl-core-all-value": val_all,
                 })
             elif trigger_id == "cl-ctrl-core-all":
-                val_sel, val_all = self._sync_checklists(
-                    opt = ctrl_panel.get("cl-core-options"),
+                val_sel, val_all = sync_checklists(
+                    options = ctrl_panel.get("cl-core-options"),
                     sel=list(),
                     all=cl_core_all,
                     id="all"
@@ -1165,8 +1105,8 @@ class Layout:
                     "cl-core-all-value": val_all,
                 })
             elif trigger_id == "cl-ctrl-framesize":
-                val_sel, val_all = self._sync_checklists(
-                    opt = ctrl_panel.get("cl-framesize-options"),
+                val_sel, val_all = sync_checklists(
+                    options = ctrl_panel.get("cl-framesize-options"),
                     sel=cl_framesize,
                     all=list(),
                     id=""
@@ -1176,8 +1116,8 @@ class Layout:
                     "cl-framesize-all-value": val_all,
                 })
             elif trigger_id == "cl-ctrl-framesize-all":
-                val_sel, val_all = self._sync_checklists(
-                    opt = ctrl_panel.get("cl-framesize-options"),
+                val_sel, val_all = sync_checklists(
+                    options = ctrl_panel.get("cl-framesize-options"),
                     sel=list(),
                     all=cl_framesize_all,
                     id="all"
@@ -1187,8 +1127,8 @@ class Layout:
                     "cl-framesize-all-value": val_all,
                 })
             elif trigger_id == "cl-ctrl-testtype":
-                val_sel, val_all = self._sync_checklists(
-                    opt = ctrl_panel.get("cl-testtype-options"),
+                val_sel, val_all = sync_checklists(
+                    options = ctrl_panel.get("cl-testtype-options"),
                     sel=cl_testtype,
                     all=list(),
                     id=""
@@ -1198,8 +1138,8 @@ class Layout:
                     "cl-testtype-all-value": val_all,
                 })
             elif trigger_id == "cl-ctrl-testtype-all":
-                val_sel, val_all = self._sync_checklists(
-                    opt = ctrl_panel.get("cl-testtype-options"),
+                val_sel, val_all = sync_checklists(
+                    options = ctrl_panel.get("cl-testtype-options"),
                     sel=list(),
                     all=cl_testtype_all,
                     id="all"
@@ -1252,7 +1192,7 @@ class Layout:
                     if C.CLEAR_ALL_INPUTS:
                         ctrl_panel.set(ctrl_panel.defaults)
                     ctrl_panel.set({
-                        "cl-selected-options": self._list_tests(store_sel)
+                        "cl-selected-options": list_tests(store_sel)
                     })
             elif trigger_id == "btn-sel-remove-all":
                 _ = btn_remove_all
@@ -1294,10 +1234,10 @@ class Layout:
                             table_comparison(
                                 self.data, store_sel, bool(cl_normalize)
                             ),
-                            _gen_new_url(parsed_url, store_sel)
+                            gen_new_url(parsed_url, {"store_sel": store_sel})
                         )
                     ctrl_panel.set({
-                        "cl-selected-options": self._list_tests(store_sel)
+                        "cl-selected-options": list_tests(store_sel)
                     })
                 else:
                     row_fig_tput = C.PLACEHOLDER
index 03707c0..a0920a4 100644 (file)
@@ -29,7 +29,8 @@ from datetime import datetime, timedelta
 from copy import deepcopy
 
 from ..utils.constants import Constants as C
-from ..utils.url_processing import url_decode, url_encode
+from ..utils.utils import show_tooltip, gen_new_url
+from ..utils.url_processing import url_decode
 from ..data.data import Data
 from .graphs import graph_statistics, select_data
 
@@ -261,29 +262,6 @@ class Layout:
                 lst_job[1], lst_job[3], lst_job[4]))
         }
 
-    def _show_tooltip(self, id: str, title: str,
-            clipboard_id: str=None) -> list:
-        """
-        """
-        return [
-            dcc.Clipboard(target_id=clipboard_id, title="Copy URL") \
-                if clipboard_id else str(),
-            f"{title} ",
-            dbc.Badge(
-                id=id,
-                children="?",
-                pill=True,
-                color="white",
-                text_color="info",
-                class_name="border ms-1",
-            ),
-            dbc.Tooltip(
-                children=self._tooltips.get(id, str()),
-                target=id,
-                placement="auto"
-            )
-        ]
-
     def add_content(self):
         """
         """
@@ -408,7 +386,7 @@ class Layout:
                                 dcc.Loading(children=[
                                     dbc.Button(
                                         id="btn-download-data",
-                                        children=self._show_tooltip(
+                                        children=show_tooltip(self._tooltips,
                                             "help-download", "Download Data"),
                                         class_name="me-1",
                                         color="info"
@@ -425,8 +403,11 @@ class Layout:
                                     children=[
                                         dbc.InputGroupText(
                                             style=C.URL_STYLE,
-                                            children=self._show_tooltip(
-                                                "help-url", "URL", "input-url")
+                                            children=show_tooltip(
+                                                self._tooltips,
+                                                "help-url", "URL",
+                                                "input-url"
+                                            )
                                         ),
                                         dbc.Input(
                                             id="input-url",
@@ -460,7 +441,7 @@ class Layout:
                             children=[
                                 dbc.Label(
                                     class_name="p-0",
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-dut", "Device under Test")
                                 ),
                                 dbc.Row(
@@ -478,7 +459,7 @@ class Layout:
                             children=[
                                 dbc.Label(
                                     class_name="p-0",
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-ttype", "Test Type"),
                                 ),
                                 dbc.RadioItems(
@@ -494,7 +475,7 @@ class Layout:
                             children=[
                                 dbc.Label(
                                     class_name="p-0",
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-cadence", "Cadence"),
                                 ),
                                 dbc.RadioItems(
@@ -510,7 +491,7 @@ class Layout:
                             children=[
                                 dbc.Label(
                                     class_name="p-0",
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-tbed", "Test Bed"),
                                 ),
                                 dbc.Select(
@@ -536,7 +517,7 @@ class Layout:
                             children=[
                                 dbc.Label(
                                     class_name="gy-1",
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-time-period", "Time Period"),
                                 ),
                                 dcc.DatePickerRange(
@@ -729,25 +710,18 @@ class Layout:
             fig_passed, fig_duration = graph_statistics(self.data, job,
                 self.layout, start, end)
 
-            if parsed_url:
-                new_url = url_encode({
-                    "scheme": parsed_url["scheme"],
-                    "netloc": parsed_url["netloc"],
-                    "path": parsed_url["path"],
-                    "params": {
-                        "job": job,
-                        "start": start,
-                        "end": end
-                    }
-                })
-            else:
-                new_url = str()
-
             ret_val = [
                 ctrl_panel.panel,
                 fig_passed,
                 fig_duration,
-                new_url
+                gen_new_url(
+                    parsed_url,
+                    {
+                        "job": job,
+                        "start": start,
+                        "end": end
+                    }
+                )
             ]
             ret_val.extend(ctrl_panel.values())
             return ret_val
index 0b49680..4cd8285 100644 (file)
@@ -23,13 +23,7 @@ import hdrh.codec
 from datetime import datetime
 
 from ..utils.constants import Constants as C
-from ..utils.utils import classify_anomalies
-
-
-def _get_color(idx: int) -> str:
-    """
-    """
-    return C.PLOT_COLORS[idx % len(C.PLOT_COLORS)]
+from ..utils.utils import classify_anomalies, get_color
 
 
 def _get_hdrh_latencies(row: pd.Series, name: str) -> dict:
@@ -272,7 +266,7 @@ def graph_trending(data: pd.DataFrame, sel:dict, layout: dict,
         else:
             norm_factor = 1.0
         traces = _generate_trending_traces(
-            itm["testtype"], name, df, start, end, _get_color(idx), norm_factor
+            itm["testtype"], name, df, start, end, get_color(idx), norm_factor
         )
         if traces:
             if not fig_tput:
@@ -281,7 +275,7 @@ def graph_trending(data: pd.DataFrame, sel:dict, layout: dict,
 
         if itm["testtype"] == "pdr":
             traces = _generate_trending_traces(
-                "pdr-lat", name, df, start, end, _get_color(idx), norm_factor
+                "pdr-lat", name, df, start, end, get_color(idx), norm_factor
             )
             if traces:
                 if not fig_lat:
@@ -348,7 +342,7 @@ def graph_hdrh_latency(data: dict, layout: dict) -> go.Figure:
                 legendgroup=C.GRAPH_LAT_HDRH_DESC[lat_name],
                 showlegend=bool(idx % 2),
                 line=dict(
-                    color=_get_color(int(idx/2)),
+                    color=get_color(int(idx/2)),
                     dash="solid",
                     width=1 if idx % 2 else 2
                 ),
index 48a8e54..0fe28eb 100644 (file)
@@ -31,7 +31,9 @@ from json import loads, JSONDecodeError
 from ast import literal_eval
 
 from ..utils.constants import Constants as C
-from ..utils.url_processing import url_decode, url_encode
+from ..utils.utils import show_tooltip, label, sync_checklists, list_tests, \
+    get_date, gen_new_url
+from ..utils.url_processing import url_decode
 from ..data.data import Data
 from .graphs import graph_trending, graph_hdrh_latency, \
     select_trending_data
@@ -197,32 +199,6 @@ class Layout:
     def time_period(self):
         return self._time_period
 
-    def label(self, key: str) -> str:
-        return C.LABELS.get(key, key)
-
-    def _show_tooltip(self, id: str, title: str,
-            clipboard_id: str=None) -> list:
-        """
-        """
-        return [
-            dcc.Clipboard(target_id=clipboard_id, title="Copy URL") \
-                if clipboard_id else str(),
-            f"{title} ",
-            dbc.Badge(
-                id=id,
-                children="?",
-                pill=True,
-                color="white",
-                text_color="info",
-                class_name="border ms-1",
-            ),
-            dbc.Tooltip(
-                children=self._tooltips.get(id, str()),
-                target=id,
-                placement="auto"
-            )
-        ]
-
     def add_content(self):
         """
         """
@@ -356,7 +332,7 @@ class Layout:
                         dbc.InputGroup(
                             [
                                 dbc.InputGroupText(
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-dut", "DUT")
                                 ),
                                 dbc.Select(
@@ -384,7 +360,7 @@ class Layout:
                         dbc.InputGroup(
                             [
                                 dbc.InputGroupText(
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-infra", "Infra")
                                 ),
                                 dbc.Select(
@@ -406,7 +382,7 @@ class Layout:
                         dbc.InputGroup(
                             [
                                 dbc.InputGroupText(
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-area", "Area")
                                 ),
                                 dbc.Select(
@@ -426,7 +402,7 @@ class Layout:
                         dbc.InputGroup(
                             [
                                 dbc.InputGroupText(
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-test", "Test")
                                 ),
                                 dbc.Select(
@@ -445,7 +421,7 @@ class Layout:
                     class_name="gy-1",
                     children=[
                         dbc.Label(
-                            children=self._show_tooltip(
+                            children=show_tooltip(self._tooltips,
                                 "help-framesize", "Frame Size"),
                             class_name="p-0"
                         ),
@@ -476,7 +452,7 @@ class Layout:
                     class_name="gy-1",
                     children=[
                         dbc.Label(
-                            children=self._show_tooltip(
+                            children=show_tooltip(self._tooltips,
                                 "help-cores", "Number of Cores"),
                             class_name="p-0"
                         ),
@@ -507,7 +483,7 @@ class Layout:
                     class_name="gy-1",
                     children=[
                         dbc.Label(
-                            children=self._show_tooltip(
+                            children=show_tooltip(self._tooltips,
                                 "help-ttype", "Test Type"),
                             class_name="p-0"
                         ),
@@ -538,7 +514,7 @@ class Layout:
                     class_name="gy-1",
                     children=[
                         dbc.Label(
-                            children=self._show_tooltip(
+                            children=show_tooltip(self._tooltips,
                                 "help-normalize", "Normalize"),
                             class_name="p-0"
                         ),
@@ -582,7 +558,7 @@ class Layout:
                     children=[
                         dbc.Label(
                             class_name="gy-1",
-                            children=self._show_tooltip(
+                            children=show_tooltip(self._tooltips,
                                 "help-time-period", "Time Period"),
                         ),
                         dcc.DatePickerRange(
@@ -706,30 +682,6 @@ class Layout:
         def values(self) -> tuple:
             return tuple(self._panel.values())
 
-    @staticmethod
-    def _sync_checklists(opt: list, sel: list, all: list, id: str) -> tuple:
-        """
-        """
-        options = {v["value"] for v in opt}
-        if id =="all":
-            sel = list(options) if all else list()
-        else:
-            all = ["all", ] if set(sel) == options else list()
-        return sel, all
-
-    @staticmethod
-    def _list_tests(selection: dict) -> list:
-        """Display selected tests with checkboxes
-        """
-        if selection:
-            return [{"label": v["id"], "value": v["id"]} for v in selection]
-        else:
-            return list()
-
-    @staticmethod
-    def _get_date(s_date: str) -> datetime:
-        return datetime(int(s_date[0:4]), int(s_date[5:7]), int(s_date[8:10]))
-
     def callbacks(self, app):
 
         def _generate_plotting_area(figs: tuple, url: str) -> tuple:
@@ -756,7 +708,7 @@ class Layout:
                             dcc.Loading(children=[
                                 dbc.Button(
                                     id="btn-download-data",
-                                    children=self._show_tooltip(
+                                    children=show_tooltip(self._tooltips,
                                         "help-download", "Download Data"),
                                     class_name="me-1",
                                     color="info"
@@ -773,7 +725,7 @@ class Layout:
                                 children=[
                                     dbc.InputGroupText(
                                         style=C.URL_STYLE,
-                                        children=self._show_tooltip(
+                                        children=show_tooltip(self._tooltips,
                                             "help-url", "URL", "input-url")
                                     ),
                                     dbc.Input(
@@ -861,29 +813,10 @@ class Layout:
             """
             """
 
-            def _gen_new_url(parsed_url: dict, store_sel: list,
-                    start: datetime, end: datetime) -> str:
-
-                if parsed_url:
-                    new_url = url_encode({
-                        "scheme": parsed_url["scheme"],
-                        "netloc": parsed_url["netloc"],
-                        "path": parsed_url["path"],
-                        "params": {
-                            "store_sel": store_sel,
-                            "start": start,
-                            "end": end
-                        }
-                    })
-                else:
-                    new_url = str()
-                return new_url
-
-
             ctrl_panel = self.ControlPanel(cp_data)
 
-            d_start = self._get_date(d_start)
-            d_end = self._get_date(d_end)
+            d_start = get_date(d_start)
+            d_end = get_date(d_end)
 
             # Parse the url:
             parsed_url = url_decode(href)
@@ -936,8 +869,7 @@ class Layout:
                     dut = ctrl_panel.get("dd-ctrl-dut-value")
                     phy = self.spec_tbs[dut][dd_phy]
                     options = sorted(
-                        [{"label": self.label(v), "value": v}
-                            for v in phy.keys()],
+                        [{"label": label(v), "value": v} for v in phy.keys()],
                         key=lambda d: d["label"]
                     )
                     disabled = False
@@ -1030,8 +962,8 @@ class Layout:
                         "cl-ctrl-testtype-all-options": C.CL_ALL_ENABLED,
                     })
             elif trigger_id == "cl-ctrl-core":
-                val_sel, val_all = self._sync_checklists(
-                    opt=ctrl_panel.get("cl-ctrl-core-options"),
+                val_sel, val_all = sync_checklists(
+                    options=ctrl_panel.get("cl-ctrl-core-options"),
                     sel=cl_core,
                     all=list(),
                     id=""
@@ -1041,8 +973,8 @@ class Layout:
                     "cl-ctrl-core-all-value": val_all,
                 })
             elif trigger_id == "cl-ctrl-core-all":
-                val_sel, val_all = self._sync_checklists(
-                    opt = ctrl_panel.get("cl-ctrl-core-options"),
+                val_sel, val_all = sync_checklists(
+                    options = ctrl_panel.get("cl-ctrl-core-options"),
                     sel=list(),
                     all=cl_core_all,
                     id="all"
@@ -1052,8 +984,8 @@ class Layout:
                     "cl-ctrl-core-all-value": val_all,
                 })
             elif trigger_id == "cl-ctrl-framesize":
-                val_sel, val_all = self._sync_checklists(
-                    opt = ctrl_panel.get("cl-ctrl-framesize-options"),
+                val_sel, val_all = sync_checklists(
+                    options = ctrl_panel.get("cl-ctrl-framesize-options"),
                     sel=cl_framesize,
                     all=list(),
                     id=""
@@ -1063,8 +995,8 @@ class Layout:
                     "cl-ctrl-framesize-all-value": val_all,
                 })
             elif trigger_id == "cl-ctrl-framesize-all":
-                val_sel, val_all = self._sync_checklists(
-                    opt = ctrl_panel.get("cl-ctrl-framesize-options"),
+                val_sel, val_all = sync_checklists(
+                    options = ctrl_panel.get("cl-ctrl-framesize-options"),
                     sel=list(),
                     all=cl_framesize_all,
                     id="all"
@@ -1074,8 +1006,8 @@ class Layout:
                     "cl-ctrl-framesize-all-value": val_all,
                 })
             elif trigger_id == "cl-ctrl-testtype":
-                val_sel, val_all = self._sync_checklists(
-                    opt = ctrl_panel.get("cl-ctrl-testtype-options"),
+                val_sel, val_all = sync_checklists(
+                    options = ctrl_panel.get("cl-ctrl-testtype-options"),
                     sel=cl_testtype,
                     all=list(),
                     id=""
@@ -1085,8 +1017,8 @@ class Layout:
                     "cl-ctrl-testtype-all-value": val_all,
                 })
             elif trigger_id == "cl-ctrl-testtype-all":
-                val_sel, val_all = self._sync_checklists(
-                    opt = ctrl_panel.get("cl-ctrl-testtype-options"),
+                val_sel, val_all = sync_checklists(
+                    options = ctrl_panel.get("cl-ctrl-testtype-options"),
                     sel=list(),
                     all=cl_testtype_all,
                     id="all"
@@ -1157,8 +1089,8 @@ class Layout:
                 if url_params:
                     store_sel = literal_eval(
                         url_params.get("store_sel", list())[0])
-                    d_start = self._get_date(url_params.get("start", list())[0])
-                    d_end = self._get_date(url_params.get("end", list())[0])
+                    d_start = get_date(url_params.get("start", list())[0])
+                    d_end = get_date(url_params.get("end", list())[0])
                     if store_sel:
                         row_card_sel_tests = C.STYLE_ENABLED
                         row_btns_sel_tests = C.STYLE_ENABLED
@@ -1170,10 +1102,17 @@ class Layout:
                         _generate_plotting_area(
                             graph_trending(self.data, store_sel, self.layout,
                                 d_start, d_end, bool(cl_normalize)),
-                            _gen_new_url(parsed_url, store_sel, d_start, d_end)
+                            gen_new_url(
+                                parsed_url,
+                                {
+                                    "store_sel": store_sel,
+                                    "start": d_start,
+                                    "end": d_end
+                                }
+                            )
                         )
                     ctrl_panel.set({
-                        "cl-selected-options": self._list_tests(store_sel)
+                        "cl-selected-options": list_tests(store_sel)
                     })
                 else:
                     row_fig_tput = C.PLACEHOLDER
index 63c9c1a..70fb02e 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+"""Function used by Dash applications.
 """
-"""
+
+import dash_bootstrap_components as dbc
 
 from numpy import isnan
+from dash import dcc
+from datetime import datetime
 
 from ..jumpavg import classify
+from ..utils.constants import Constants as C
+from ..utils.url_processing import url_encode
 
 
 def classify_anomalies(data):
@@ -67,3 +73,136 @@ def classify_anomalies(data):
         stdevs.append(stdv)
         values_left -= 1
     return classification, avgs, stdevs
+
+
+def get_color(idx: int) -> str:
+    """Returns a color from the list defined in Constants.PLOT_COLORS defined by
+    its index.
+
+    :param idx: Index of the color.
+    :type idex: int
+    :returns: Color defined by hex code.
+    :trype: str
+    """
+    return C.PLOT_COLORS[idx % len(C.PLOT_COLORS)]
+
+
+def show_tooltip(tooltips:dict, id: str, title: str,
+        clipboard_id: str=None) -> list:
+    """Generate list of elements to display a text (e.g. a title) with a
+    tooltip and optionaly with Copy&Paste icon and the clipboard
+    functionality enabled.
+
+    :param tooltips: Dictionary with tooltips.
+    :param id: Tooltip ID.
+    :param title: A text for which the tooltip will be displayed.
+    :param clipboard_id: If defined, a Copy&Paste icon is displayed and the
+        clipboard functionality is enabled.
+    :type tooltips: dict
+    :type id: str
+    :type title: str
+    :type clipboard_id: str
+    :returns: List of elements to display a text with a tooltip and
+        optionaly with Copy&Paste icon.
+    :rtype: list
+    """
+
+    return [
+        dcc.Clipboard(target_id=clipboard_id, title="Copy URL") \
+            if clipboard_id else str(),
+        f"{title} ",
+        dbc.Badge(
+            id=id,
+            children="?",
+            pill=True,
+            color="white",
+            text_color="info",
+            class_name="border ms-1",
+        ),
+        dbc.Tooltip(
+            children=tooltips.get(id, str()),
+            target=id,
+            placement="auto"
+        )
+    ]
+
+
+def label(key: str) -> str:
+    """Returns a label for input elements (dropdowns, ...).
+
+    If the label is not defined, the function returns the provided key.
+
+    :param key: The key to the label defined in Constants.LABELS.
+    :type key: str
+    :returns: Label.
+    :rtype: str
+    """
+    return C.LABELS.get(key, key)
+
+
+def sync_checklists(options: list, sel: list, all: list, id: str) -> tuple:
+    """Synchronize a checklist with defined "options" with its "All" checklist.
+
+    :param options: List of options for the cheklist.
+    :param sel: List of selected options.
+    :param all: List of selected option from "All" checklist.
+    :param id: ID of a checklist to be used for synchronization.
+    :returns: Tuple of lists with otions for both checklists.
+    :rtype: tuple of lists
+    """
+    opts = {v["value"] for v in options}
+    if id =="all":
+        sel = list(opts) if all else list()
+    else:
+        all = ["all", ] if set(sel) == opts else list()
+    return sel, all
+
+
+def list_tests(selection: dict) -> list:
+    """Transform list of tests to a list of dictionaries usable by checkboxes.
+
+    :param selection: List of tests to be displayed in "Selected tests" window.
+    :type selection: list
+    :returns: List of dictionaries with "label", "value" pairs for a checkbox.
+    :rtype: list
+    """
+    if selection:
+        return [{"label": v["id"], "value": v["id"]} for v in selection]
+    else:
+        return list()
+
+
+def get_date(s_date: str) -> datetime:
+    """Transform string reprezentation of date to datetime.datetime data type.
+
+    :param s_date: String reprezentation of date.
+    :type s_date: str
+    :returns: Date as datetime.datetime.
+    :rtype: datetime.datetime
+    """
+    return datetime(int(s_date[0:4]), int(s_date[5:7]), int(s_date[8:10]))
+
+
+def gen_new_url(parsed_url: dict, params: dict) -> str:
+    """Generate a new URL with encoded parameters.
+
+    :param parsed_url: Dictionary with URL elements. It should contain "scheme",
+        "netloc" and "path".
+    :param params: URL parameters to be encoded to the URL.
+    :type parsed_url: dict
+    :type params: dict
+    :returns Encoded URL with parameters.
+    :rtype: str
+    """
+
+    if parsed_url:
+        return url_encode(
+            {
+                "scheme": parsed_url.get("scheme", ""),
+                "netloc": parsed_url.get("netloc", ""),
+                "path": parsed_url.get("path", ""),
+                "params": params
+            }
+        )
+    else:
+        return str()